Skip to content

Instantly share code, notes, and snippets.

@ravy101
Created March 25, 2019 01:15
Show Gist options
  • Save ravy101/6d3280f79d9e7fb0f14c1d120209ca57 to your computer and use it in GitHub Desktop.
Save ravy101/6d3280f79d9e7fb0f14c1d120209ca57 to your computer and use it in GitHub Desktop.
Created on Cognitive Class Labs
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Data Science Capstone Project - Week 3\n",
"First import required libraries."
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Collecting package metadata: done\n",
"Solving environment: done\n",
"\n",
"## Package Plan ##\n",
"\n",
" environment location: /home/jupyterlab/conda\n",
"\n",
" added / updated specs:\n",
" - geocoder\n",
"\n",
"\n",
"The following packages will be downloaded:\n",
"\n",
" package | build\n",
" ---------------------------|-----------------\n",
" geocoder-1.38.1 | py_0 52 KB conda-forge\n",
" orderedset-2.0 | py36_0 231 KB conda-forge\n",
" ratelim-0.1.6 | py36_0 5 KB conda-forge\n",
" ------------------------------------------------------------\n",
" Total: 288 KB\n",
"\n",
"The following NEW packages will be INSTALLED:\n",
"\n",
" geocoder conda-forge/noarch::geocoder-1.38.1-py_0\n",
" orderedset conda-forge/linux-64::orderedset-2.0-py36_0\n",
" ratelim conda-forge/linux-64::ratelim-0.1.6-py36_0\n",
"\n",
"\n",
"\n",
"Downloading and Extracting Packages\n",
"orderedset-2.0 | 231 KB | ##################################### | 100% \n",
"geocoder-1.38.1 | 52 KB | ##################################### | 100% \n",
"ratelim-0.1.6 | 5 KB | ##################################### | 100% \n",
"Preparing transaction: done\n",
"Verifying transaction: done\n",
"Executing transaction: done\n"
]
}
],
"source": [
"import pandas as pd\n",
"import numpy as np\n",
"from geopy.geocoders import Nominatim # convert an address into latitude and longitude values\n",
"import requests # library to handle requests\n",
"from pandas.io.json import json_normalize # tranform JSON file into a pandas dataframe\n",
"!conda install -c conda-forge geocoder --yes\n",
"import geocoder\n",
"from sklearn.cluster import KMeans\n",
"\n",
"import folium \n",
"import matplotlib.cm as cm\n",
"import matplotlib.colors as colors"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Part 1 - Parse and Clean the Postcode Data\n",
"Get the wikipedia page to be scraped."
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Data downloaded!\n"
]
}
],
"source": [
"!wget -q -O 'toronto_data.html' https://en.wikipedia.org/wiki/List_of_postal_codes_of_Canada:_M\n",
"print('Data downloaded!')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Open the HTML file and read the postcodes table using pandas. Pandas has a read_html function to parse tables from HTML content into a list of DataFrames."
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"with open('toronto_data.html', 'r') as myfile:\n",
" html_data = myfile.read()\n",
"dfs = pd.read_html(html_data)\n",
"df = dfs[0]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now we will remove the not assigned boroughs and replace the not assigned neighbourhoods with the borough name. We will also join neighbourhoods with the same postcode."
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/home/jupyterlab/conda/lib/python3.6/site-packages/pandas/core/indexing.py:190: 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/indexing.html#indexing-view-versus-copy\n",
" self._setitem_with_indexer(indexer, value)\n",
"/home/jupyterlab/conda/lib/python3.6/site-packages/ipykernel_launcher.py:2: 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/indexing.html#indexing-view-versus-copy\n",
" \n"
]
}
],
"source": [
"df = df[df['Borough'] != 'Not assigned']\n",
"df.loc[df['Neighbourhood'] == 'Not assigned', 'Neighbourhood'] = df.Borough\n",
"df_grp = pd.DataFrame(df.groupby(['Postcode', 'Borough'])['Neighbourhood'].apply(lambda x: \"%s\" % ', '.join(x))).reset_index()"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Postcode</th>\n",
" <th>Borough</th>\n",
" <th>Neighbourhood</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>M1B</td>\n",
" <td>Scarborough</td>\n",
" <td>Rouge, Malvern</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>M1C</td>\n",
" <td>Scarborough</td>\n",
" <td>Highland Creek, Rouge Hill, Port Union</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>M1E</td>\n",
" <td>Scarborough</td>\n",
" <td>Guildwood, Morningside, West Hill</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>M1G</td>\n",
" <td>Scarborough</td>\n",
" <td>Woburn</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>M1H</td>\n",
" <td>Scarborough</td>\n",
" <td>Cedarbrae</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Postcode Borough Neighbourhood\n",
"0 M1B Scarborough Rouge, Malvern\n",
"1 M1C Scarborough Highland Creek, Rouge Hill, Port Union\n",
"2 M1E Scarborough Guildwood, Morningside, West Hill\n",
"3 M1G Scarborough Woburn\n",
"4 M1H Scarborough Cedarbrae"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_grp.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Part 2 - Add Longitude and Latitude"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"First we will define a function that will take a post code and iterate until coordinates can be returned."
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [],
"source": [
"def get_toronto_coords(postal_code):\n",
" lat_lng_coords = None\n",
" while(lat_lng_coords is None):\n",
" g = geocoder.google('{}, Toronto, Ontario'.format(postal_code))\n",
" lat_lng_coords = g.latlng\n",
"\n",
" return lat_lng_coords"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [],
"source": [
"#get_toronto_coords('M1B')\n",
"#get_toronto_coords('M1H')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Geocoder is not responding at all so we will use the CSV instead. Starting with downloading the file."
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Coords downloaded!\n"
]
}
],
"source": [
"!wget -q -O 'toronto_coords.csv' https://cocl.us/Geospatial_data\n",
"print('Coords downloaded!')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now we will join our grouped dataframe with the corresponding coordinates."
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Postcode</th>\n",
" <th>Borough</th>\n",
" <th>Neighbourhood</th>\n",
" <th>Latitude</th>\n",
" <th>Longitude</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>M1B</td>\n",
" <td>Scarborough</td>\n",
" <td>Rouge, Malvern</td>\n",
" <td>43.806686</td>\n",
" <td>-79.194353</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>M1C</td>\n",
" <td>Scarborough</td>\n",
" <td>Highland Creek, Rouge Hill, Port Union</td>\n",
" <td>43.784535</td>\n",
" <td>-79.160497</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>M1E</td>\n",
" <td>Scarborough</td>\n",
" <td>Guildwood, Morningside, West Hill</td>\n",
" <td>43.763573</td>\n",
" <td>-79.188711</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>M1G</td>\n",
" <td>Scarborough</td>\n",
" <td>Woburn</td>\n",
" <td>43.770992</td>\n",
" <td>-79.216917</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>M1H</td>\n",
" <td>Scarborough</td>\n",
" <td>Cedarbrae</td>\n",
" <td>43.773136</td>\n",
" <td>-79.239476</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Postcode Borough Neighbourhood Latitude \\\n",
"0 M1B Scarborough Rouge, Malvern 43.806686 \n",
"1 M1C Scarborough Highland Creek, Rouge Hill, Port Union 43.784535 \n",
"2 M1E Scarborough Guildwood, Morningside, West Hill 43.763573 \n",
"3 M1G Scarborough Woburn 43.770992 \n",
"4 M1H Scarborough Cedarbrae 43.773136 \n",
"\n",
" Longitude \n",
"0 -79.194353 \n",
"1 -79.160497 \n",
"2 -79.188711 \n",
"3 -79.216917 \n",
"4 -79.239476 "
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"coord_df = pd.read_csv('toronto_coords.csv')\n",
"df_full = df_grp.join(coord_df.set_index('Postal Code'), on='Postcode', how='left')\n",
"df_full.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Part 3 - Analysis\n",
"Now we will make FourSquare API calls to gather venue information for our neighbourhoods and apply cluster analysis. We will modify and use some code from the previous labs."
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [],
"source": [
"CLIENT_ID = 'CDT0MXT105OIT4ZYRPA4L1S4LLKISDCMVOTUO0WKZEYPLTNW' # your Foursquare ID\n",
"CLIENT_SECRET = 'WMP22XO4QNE4R5BFJVRBBTOJXHJ0QB4JZSHGE5DX4CQUGXZE' # your Foursquare Secret\n",
"VERSION = '20180605' # Foursquare API version\n",
"LIMIT = 500\n",
"radius = 500\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Reuse the functions defined in the lab that process FourSquare API responses with some minor changes. This time our coordinates are for the postcode rather than the neighborhood."
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [],
"source": [
"def get_category_type(row):\n",
" try:\n",
" categories_list = row['categories']\n",
" except:\n",
" categories_list = row['venue.categories']\n",
" \n",
" if len(categories_list) == 0:\n",
" return None\n",
" else:\n",
" return categories_list[0]['name']\n",
"\n",
"def getNearbyVenues(names, latitudes, longitudes, LIMIT = 500, radius=750):\n",
" \n",
" venues_list=[]\n",
" for name, lat, lng in zip(names, latitudes, longitudes):\n",
" \n",
" # create the API request URL\n",
" url = 'https://api.foursquare.com/v2/venues/explore?&client_id={}&client_secret={}&v={}&ll={},{}&radius={}&limit={}'.format(\n",
" CLIENT_ID, \n",
" CLIENT_SECRET, \n",
" VERSION, \n",
" lat, \n",
" lng, \n",
" radius, \n",
" LIMIT)\n",
" \n",
" # make the GET request\n",
" results = requests.get(url).json()[\"response\"]['groups'][0]['items']\n",
" \n",
" # return only relevant information for each nearby venue\n",
" venues_list.append([(\n",
" name, \n",
" lat, \n",
" lng, \n",
" v['venue']['name'], \n",
" v['venue']['location']['lat'], \n",
" v['venue']['location']['lng'], \n",
" v['venue']['categories'][0]['name']) for v in results])\n",
"\n",
" nearby_venues = pd.DataFrame([item for venue_list in venues_list for item in venue_list])\n",
" nearby_venues.columns = ['Postcode', \n",
" 'Postcode Latitude', \n",
" 'Postcode Longitude', \n",
" 'Venue', \n",
" 'Venue Latitude', \n",
" 'Venue Longitude', \n",
" 'Venue Category']\n",
" \n",
" return(nearby_venues)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Invoke the FourSquare API with our Toronto postcodes and coordinates."
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Postcode</th>\n",
" <th>Postcode Latitude</th>\n",
" <th>Postcode Longitude</th>\n",
" <th>Venue</th>\n",
" <th>Venue Latitude</th>\n",
" <th>Venue Longitude</th>\n",
" <th>Venue Category</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>M1B</td>\n",
" <td>43.806686</td>\n",
" <td>-79.194353</td>\n",
" <td>Images Salon &amp; Spa</td>\n",
" <td>43.802283</td>\n",
" <td>-79.198565</td>\n",
" <td>Spa</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>M1B</td>\n",
" <td>43.806686</td>\n",
" <td>-79.194353</td>\n",
" <td>Wendy's</td>\n",
" <td>43.807448</td>\n",
" <td>-79.199056</td>\n",
" <td>Fast Food Restaurant</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>M1B</td>\n",
" <td>43.806686</td>\n",
" <td>-79.194353</td>\n",
" <td>Wendy's</td>\n",
" <td>43.802008</td>\n",
" <td>-79.198080</td>\n",
" <td>Fast Food Restaurant</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>M1B</td>\n",
" <td>43.806686</td>\n",
" <td>-79.194353</td>\n",
" <td>Staples Morningside</td>\n",
" <td>43.800285</td>\n",
" <td>-79.196607</td>\n",
" <td>Paper / Office Supplies Store</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>M1B</td>\n",
" <td>43.806686</td>\n",
" <td>-79.194353</td>\n",
" <td>Tim Hortons</td>\n",
" <td>43.802000</td>\n",
" <td>-79.198169</td>\n",
" <td>Coffee Shop</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Postcode Postcode Latitude Postcode Longitude Venue \\\n",
"0 M1B 43.806686 -79.194353 Images Salon & Spa \n",
"1 M1B 43.806686 -79.194353 Wendy's \n",
"2 M1B 43.806686 -79.194353 Wendy's \n",
"3 M1B 43.806686 -79.194353 Staples Morningside \n",
"4 M1B 43.806686 -79.194353 Tim Hortons \n",
"\n",
" Venue Latitude Venue Longitude Venue Category \n",
"0 43.802283 -79.198565 Spa \n",
"1 43.807448 -79.199056 Fast Food Restaurant \n",
"2 43.802008 -79.198080 Fast Food Restaurant \n",
"3 43.800285 -79.196607 Paper / Office Supplies Store \n",
"4 43.802000 -79.198169 Coffee Shop "
]
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"toronto_venues = getNearbyVenues(names=df_full['Postcode'], latitudes=df_full['Latitude'], longitudes=df_full['Longitude'])\n",
"\n",
"toronto_venues.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We will one-hot encode our venue data and re-add the postcode column for grouping."
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Accessories Store</th>\n",
" <th>Adult Boutique</th>\n",
" <th>Afghan Restaurant</th>\n",
" <th>African Restaurant</th>\n",
" <th>Airport</th>\n",
" <th>Airport Food Court</th>\n",
" <th>Airport Gate</th>\n",
" <th>Airport Lounge</th>\n",
" <th>Airport Service</th>\n",
" <th>Airport Terminal</th>\n",
" <th>...</th>\n",
" <th>Video Game Store</th>\n",
" <th>Video Store</th>\n",
" <th>Vietnamese Restaurant</th>\n",
" <th>Warehouse Store</th>\n",
" <th>Wine Bar</th>\n",
" <th>Wine Shop</th>\n",
" <th>Wings Joint</th>\n",
" <th>Women's Store</th>\n",
" <th>Yoga Studio</th>\n",
" <th>Postcode</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>...</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>M1B</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>...</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>M1B</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>...</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>M1B</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>...</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>M1B</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>...</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>M1B</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>5 rows × 322 columns</p>\n",
"</div>"
],
"text/plain": [
" Accessories Store Adult Boutique Afghan Restaurant African Restaurant \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" Airport Airport Food Court Airport Gate Airport Lounge Airport Service \\\n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 0 0 0 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 0 \n",
"\n",
" Airport Terminal ... Video Game Store Video Store \\\n",
"0 0 ... 0 0 \n",
"1 0 ... 0 0 \n",
"2 0 ... 0 0 \n",
"3 0 ... 0 0 \n",
"4 0 ... 0 0 \n",
"\n",
" Vietnamese Restaurant Warehouse Store Wine Bar Wine Shop Wings Joint \\\n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 0 0 0 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 0 \n",
"\n",
" Women's Store Yoga Studio Postcode \n",
"0 0 0 M1B \n",
"1 0 0 M1B \n",
"2 0 0 M1B \n",
"3 0 0 M1B \n",
"4 0 0 M1B \n",
"\n",
"[5 rows x 322 columns]"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"toronto_onehot = pd.get_dummies(toronto_venues[['Venue Category']], prefix=\"\", prefix_sep=\"\")\n",
"toronto_onehot['Postcode'] = toronto_venues['Postcode'] \n",
"\n",
"toronto_onehot.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We will group our venue information in 2 ways for cluster analysis:\n",
"* **sum** - Venue type columns will record the total number of venues in the neighborhood of this type. This will give us an idea of what is available nearby and consider the number of venues of each type.\n",
"* **mean** - Venue type columns will record the proportion of venues in the neighborhood that are of this type. This will de-prioritize the total number of venues in order to prevent our clustering from simply representing the overall development/density of the area.\n"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Postcode</th>\n",
" <th>Accessories Store</th>\n",
" <th>Adult Boutique</th>\n",
" <th>Afghan Restaurant</th>\n",
" <th>African Restaurant</th>\n",
" <th>Airport</th>\n",
" <th>Airport Food Court</th>\n",
" <th>Airport Gate</th>\n",
" <th>Airport Lounge</th>\n",
" <th>Airport Service</th>\n",
" <th>...</th>\n",
" <th>Vegetarian / Vegan Restaurant</th>\n",
" <th>Video Game Store</th>\n",
" <th>Video Store</th>\n",
" <th>Vietnamese Restaurant</th>\n",
" <th>Warehouse Store</th>\n",
" <th>Wine Bar</th>\n",
" <th>Wine Shop</th>\n",
" <th>Wings Joint</th>\n",
" <th>Women's Store</th>\n",
" <th>Yoga Studio</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>M1B</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>...</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>M1C</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>...</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>M1E</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>...</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>M1G</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>...</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>M1H</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>...</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>5 rows × 322 columns</p>\n",
"</div>"
],
"text/plain": [
" Postcode Accessories Store Adult Boutique Afghan Restaurant \\\n",
"0 M1B 0 0 0 \n",
"1 M1C 0 0 0 \n",
"2 M1E 0 0 0 \n",
"3 M1G 0 0 0 \n",
"4 M1H 0 0 0 \n",
"\n",
" African Restaurant Airport Airport Food Court Airport Gate \\\n",
"0 1 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" Airport Lounge Airport Service ... Vegetarian / Vegan Restaurant \\\n",
"0 0 0 ... 0 \n",
"1 0 0 ... 0 \n",
"2 0 0 ... 0 \n",
"3 0 0 ... 0 \n",
"4 0 0 ... 0 \n",
"\n",
" Video Game Store Video Store Vietnamese Restaurant Warehouse Store \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" Wine Bar Wine Shop Wings Joint Women's Store Yoga Studio \n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 0 0 0 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 1 \n",
"\n",
"[5 rows x 322 columns]"
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"toronto_grouped_sum = toronto_onehot.groupby('Postcode').sum().reset_index()\n",
"toronto_grouped_mean = toronto_onehot.groupby('Postcode').mean().reset_index()\n",
"toronto_grouped_sum.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now we will apply our clustering to both sets of grouped data."
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1,\n",
" 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 4, 0, 4,\n",
" 4, 4, 1, 4, 1, 4, 1, 1, 1, 1, 2, 2, 1, 2, 2, 2, 2, 4, 4, 4, 1, 1,\n",
" 0, 4, 2, 2, 4, 4, 4, 4, 4, 4, 0, 1, 4, 4, 4, 0, 0, 1, 1, 4, 4, 4,\n",
" 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4], dtype=int32)"
]
},
"execution_count": 16,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"kclusters = 5\n",
"post_temp = toronto_grouped_sum['Postcode']\n",
"toronto_grouped_clustering_sum = toronto_grouped_sum.drop('Postcode', 1)\n",
"toronto_grouped_clustering_mean = toronto_grouped_mean.drop('Postcode', 1)\n",
"# run k-means clustering\n",
"kmeans_sum = KMeans(n_clusters=kclusters, random_state=10).fit(toronto_grouped_clustering_sum)\n",
"kmeans_mean = KMeans(n_clusters=kclusters, random_state=10).fit(toronto_grouped_clustering_mean)\n",
"# check cluster labels generated for each row in the dataframe\n",
"kmeans_sum.labels_[0:100] "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We will record the clustering labels and store in a new data frame with the postcode data."
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Cluster Sum</th>\n",
" <th>Cluster Mean</th>\n",
" </tr>\n",
" <tr>\n",
" <th>Postcode</th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>M1B</th>\n",
" <td>4</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>M1C</th>\n",
" <td>4</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>M1E</th>\n",
" <td>4</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>M1G</th>\n",
" <td>4</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <th>M1H</th>\n",
" <td>4</td>\n",
" <td>1</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Cluster Sum Cluster Mean\n",
"Postcode \n",
"M1B 4 1\n",
"M1C 4 1\n",
"M1E 4 0\n",
"M1G 4 3\n",
"M1H 4 1"
]
},
"execution_count": 17,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_clust = pd.DataFrame({'Cluster Sum': kmeans_sum.labels_, 'Cluster Mean': kmeans_mean.labels_})\n",
"df_clust.index = post_temp\n",
"df_clust.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now the cluster results are joined back to the consolidated full data frame."
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Postcode</th>\n",
" <th>Borough</th>\n",
" <th>Neighbourhood</th>\n",
" <th>Latitude</th>\n",
" <th>Longitude</th>\n",
" <th>Cluster Sum</th>\n",
" <th>Cluster Mean</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>M1B</td>\n",
" <td>Scarborough</td>\n",
" <td>Rouge, Malvern</td>\n",
" <td>43.806686</td>\n",
" <td>-79.194353</td>\n",
" <td>4</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>M1C</td>\n",
" <td>Scarborough</td>\n",
" <td>Highland Creek, Rouge Hill, Port Union</td>\n",
" <td>43.784535</td>\n",
" <td>-79.160497</td>\n",
" <td>4</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>M1E</td>\n",
" <td>Scarborough</td>\n",
" <td>Guildwood, Morningside, West Hill</td>\n",
" <td>43.763573</td>\n",
" <td>-79.188711</td>\n",
" <td>4</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>M1G</td>\n",
" <td>Scarborough</td>\n",
" <td>Woburn</td>\n",
" <td>43.770992</td>\n",
" <td>-79.216917</td>\n",
" <td>4</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>M1H</td>\n",
" <td>Scarborough</td>\n",
" <td>Cedarbrae</td>\n",
" <td>43.773136</td>\n",
" <td>-79.239476</td>\n",
" <td>4</td>\n",
" <td>1</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Postcode Borough Neighbourhood Latitude \\\n",
"0 M1B Scarborough Rouge, Malvern 43.806686 \n",
"1 M1C Scarborough Highland Creek, Rouge Hill, Port Union 43.784535 \n",
"2 M1E Scarborough Guildwood, Morningside, West Hill 43.763573 \n",
"3 M1G Scarborough Woburn 43.770992 \n",
"4 M1H Scarborough Cedarbrae 43.773136 \n",
"\n",
" Longitude Cluster Sum Cluster Mean \n",
"0 -79.194353 4 1 \n",
"1 -79.160497 4 1 \n",
"2 -79.188711 4 0 \n",
"3 -79.216917 4 3 \n",
"4 -79.239476 4 1 "
]
},
"execution_count": 18,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_full_clust = df_full.join(df_clust, on='Postcode', how='inner')\n",
"df_full_clust.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We will first use the sum based clustering to colour our postcodes on a folium map."
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div style=\"width:100%;\"><div style=\"position:relative;width:100%;height:0;padding-bottom:60%;\"><iframe src=\"data:text/html;charset=utf-8;base64,PCFET0NUWVBFIGh0bWw+CjxoZWFkPiAgICAKICAgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPgogICAgPHNjcmlwdD5MX1BSRUZFUl9DQU5WQVMgPSBmYWxzZTsgTF9OT19UT1VDSCA9IGZhbHNlOyBMX0RJU0FCTEVfM0QgPSBmYWxzZTs8L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2FqYXguZ29vZ2xlYXBpcy5jb20vYWpheC9saWJzL2pxdWVyeS8xLjExLjEvanF1ZXJ5Lm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvanMvYm9vdHN0cmFwLm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvTGVhZmxldC5hd2Vzb21lLW1hcmtlcnMvMi4wLjIvbGVhZmxldC5hd2Vzb21lLW1hcmtlcnMuanMiPjwvc2NyaXB0PgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9jc3MvYm9vdHN0cmFwLm1pbi5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvY3NzL2Jvb3RzdHJhcC10aGVtZS5taW4uY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vbWF4Y2RuLmJvb3RzdHJhcGNkbi5jb20vZm9udC1hd2Vzb21lLzQuNi4zL2Nzcy9mb250LWF3ZXNvbWUubWluLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9MZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy8yLjAuMi9sZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9yYXdnaXQuY29tL3B5dGhvbi12aXN1YWxpemF0aW9uL2ZvbGl1bS9tYXN0ZXIvZm9saXVtL3RlbXBsYXRlcy9sZWFmbGV0LmF3ZXNvbWUucm90YXRlLmNzcyIvPgogICAgPHN0eWxlPmh0bWwsIGJvZHkge3dpZHRoOiAxMDAlO2hlaWdodDogMTAwJTttYXJnaW46IDA7cGFkZGluZzogMDt9PC9zdHlsZT4KICAgIDxzdHlsZT4jbWFwIHtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtyaWdodDowO2xlZnQ6MDt9PC9zdHlsZT4KICAgIAogICAgICAgICAgICA8c3R5bGU+ICNtYXBfYjI2ZWIwYzQ5ZGVjNDEyNDgwZGZlMzFiYTcyNjVkZDUgewogICAgICAgICAgICAgICAgcG9zaXRpb24gOiByZWxhdGl2ZTsKICAgICAgICAgICAgICAgIHdpZHRoIDogMTAwLjAlOwogICAgICAgICAgICAgICAgaGVpZ2h0OiAxMDAuMCU7CiAgICAgICAgICAgICAgICBsZWZ0OiAwLjAlOwogICAgICAgICAgICAgICAgdG9wOiAwLjAlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICA8L3N0eWxlPgogICAgICAgIAo8L2hlYWQ+Cjxib2R5PiAgICAKICAgIAogICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb2xpdW0tbWFwIiBpZD0ibWFwX2IyNmViMGM0OWRlYzQxMjQ4MGRmZTMxYmE3MjY1ZGQ1IiA+PC9kaXY+CiAgICAgICAgCjwvYm9keT4KPHNjcmlwdD4gICAgCiAgICAKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGJvdW5kcyA9IG51bGw7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcF9iMjZlYjBjNDlkZWM0MTI0ODBkZmUzMWJhNzI2NWRkNSA9IEwubWFwKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21hcF9iMjZlYjBjNDlkZWM0MTI0ODBkZmUzMWJhNzI2NWRkNScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y2VudGVyOiBbNDMuNywtNzkuNF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6b29tOiAxMC41LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4Qm91bmRzOiBib3VuZHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXllcnM6IFtdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ybGRDb3B5SnVtcDogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcnM6IEwuQ1JTLkVQU0czODU3CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgdGlsZV9sYXllcl81ZWZkNjhiMGI2ZjI0NmMzYjE0NmIyZmQ2Nzc1ODljZCA9IEwudGlsZUxheWVyKAogICAgICAgICAgICAgICAgJ2h0dHBzOi8ve3N9LnRpbGUub3BlbnN0cmVldG1hcC5vcmcve3p9L3t4fS97eX0ucG5nJywKICAgICAgICAgICAgICAgIHsKICAiYXR0cmlidXRpb24iOiBudWxsLAogICJkZXRlY3RSZXRpbmEiOiBmYWxzZSwKICAibWF4Wm9vbSI6IDE4LAogICJtaW5ab29tIjogMSwKICAibm9XcmFwIjogZmFsc2UsCiAgInN1YmRvbWFpbnMiOiAiYWJjIgp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9iMjZlYjBjNDlkZWM0MTI0ODBkZmUzMWJhNzI2NWRkNSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNWYyYmU3ZGJkMmEyNGU2MmE2NmI1NWE2MGM1ZTA5ZWYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My44MDY2ODYyOTk5OTk5OTYsLTc5LjE5NDM1MzQwMDAwMDAxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImdyZWVuIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiZ3JlZW4iLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYjI2ZWIwYzQ5ZGVjNDEyNDgwZGZlMzFiYTcyNjVkZDUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMGUwNjA1ZjU3ZjY0NGMwZjk5NzViMTg5NzE4NWYxZGIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMDc3NjUxZDNkYzZmNDhiMGI4OGU3NWJhNTAzZGI2NWYgPSAkKCc8ZGl2IGlkPSJodG1sXzA3NzY1MWQzZGM2ZjQ4YjBiODhlNzViYTUwM2RiNjVmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Sb3VnZSwgTWFsdmVybiBDbHVzdGVyIDQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzBlMDYwNWY1N2Y2NDRjMGY5OTc1YjE4OTcxODVmMWRiLnNldENvbnRlbnQoaHRtbF8wNzc2NTFkM2RjNmY0OGIwYjg4ZTc1YmE1MDNkYjY1Zik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81ZjJiZTdkYmQyYTI0ZTYyYTY2YjU1YTYwYzVlMDllZi5iaW5kUG9wdXAocG9wdXBfMGUwNjA1ZjU3ZjY0NGMwZjk5NzViMTg5NzE4NWYxZGIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZDU5NmMxY2UyZjFiNDRiNmE0MjVmODNlZjExMGI5MGEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43ODQ1MzUxLC03OS4xNjA0OTcwOTk5OTk5OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJncmVlbiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImdyZWVuIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2IyNmViMGM0OWRlYzQxMjQ4MGRmZTMxYmE3MjY1ZGQ1KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2I1MTZjYTUzMmI5YTRhY2ViNjAzY2MzY2JhZDI2OWFlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzkzOWFhNDkxMTIyNjQ5MGY4MTYzMjAzNDFkNTY3MzFiID0gJCgnPGRpdiBpZD0iaHRtbF85MzlhYTQ5MTEyMjY0OTBmODE2MzIwMzQxZDU2NzMxYiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+SGlnaGxhbmQgQ3JlZWssIFJvdWdlIEhpbGwsIFBvcnQgVW5pb24gQ2x1c3RlciA0PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iNTE2Y2E1MzJiOWE0YWNlYjYwM2NjM2NiYWQyNjlhZS5zZXRDb250ZW50KGh0bWxfOTM5YWE0OTExMjI2NDkwZjgxNjMyMDM0MWQ1NjczMWIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZDU5NmMxY2UyZjFiNDRiNmE0MjVmODNlZjExMGI5MGEuYmluZFBvcHVwKHBvcHVwX2I1MTZjYTUzMmI5YTRhY2ViNjAzY2MzY2JhZDI2OWFlKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzQ1YzRmZjVlZDYwYjQ4ZGY5Y2Q0OTU1OTllNmEwM2U4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzYzNTcyNiwtNzkuMTg4NzExNV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJncmVlbiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImdyZWVuIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2IyNmViMGM0OWRlYzQxMjQ4MGRmZTMxYmE3MjY1ZGQ1KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzVhYzUxN2ZmMWU5ZTQxNDBiMmVkNTZlZWRhY2QzMmJjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzEwNzBlNmQxNDA0NjRjOTE5MDJjMDAxZDhhNDc5MGNlID0gJCgnPGRpdiBpZD0iaHRtbF8xMDcwZTZkMTQwNDY0YzkxOTAyYzAwMWQ4YTQ3OTBjZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+R3VpbGR3b29kLCBNb3JuaW5nc2lkZSwgV2VzdCBIaWxsIENsdXN0ZXIgNDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNWFjNTE3ZmYxZTllNDE0MGIyZWQ1NmVlZGFjZDMyYmMuc2V0Q29udGVudChodG1sXzEwNzBlNmQxNDA0NjRjOTE5MDJjMDAxZDhhNDc5MGNlKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzQ1YzRmZjVlZDYwYjQ4ZGY5Y2Q0OTU1OTllNmEwM2U4LmJpbmRQb3B1cChwb3B1cF81YWM1MTdmZjFlOWU0MTQwYjJlZDU2ZWVkYWNkMzJiYyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl84MzIwZjdhNjQ1ZDE0ODVjOTZhYjFlYThkMWIwZmRiZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjc3MDk5MjEsLTc5LjIxNjkxNzQwMDAwMDAxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImdyZWVuIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiZ3JlZW4iLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYjI2ZWIwYzQ5ZGVjNDEyNDgwZGZlMzFiYTcyNjVkZDUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNDNiMjlmYjUxNDJiNDMyYzkyZDJhMjM5NzhhMzI4MGQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYTlmYjFlMmIyNGU0NDU5ZjllYjY5OGFhZmIxN2JhOWEgPSAkKCc8ZGl2IGlkPSJodG1sX2E5ZmIxZTJiMjRlNDQ1OWY5ZWI2OThhYWZiMTdiYTlhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Xb2J1cm4gQ2x1c3RlciA0PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80M2IyOWZiNTE0MmI0MzJjOTJkMmEyMzk3OGEzMjgwZC5zZXRDb250ZW50KGh0bWxfYTlmYjFlMmIyNGU0NDU5ZjllYjY5OGFhZmIxN2JhOWEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfODMyMGY3YTY0NWQxNDg1Yzk2YWIxZWE4ZDFiMGZkYmQuYmluZFBvcHVwKHBvcHVwXzQzYjI5ZmI1MTQyYjQzMmM5MmQyYTIzOTc4YTMyODBkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2ExN2VlMGE2OGY1NjRmYjRiOTNhMDYyZTNjNDE0MGIyID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzczMTM2LC03OS4yMzk0NzYwOTk5OTk5OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJncmVlbiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImdyZWVuIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2IyNmViMGM0OWRlYzQxMjQ4MGRmZTMxYmE3MjY1ZGQ1KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2Y5NzcxYWQ3ZjJiNTRmYmVhYWY1MDkyMmY0ODVjZWEzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzU4ZDAyOTg2ODAzYjQ5MmZiNTcwYzQxNmZiNjgyM2EwID0gJCgnPGRpdiBpZD0iaHRtbF81OGQwMjk4NjgwM2I0OTJmYjU3MGM0MTZmYjY4MjNhMCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q2VkYXJicmFlIENsdXN0ZXIgNDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZjk3NzFhZDdmMmI1NGZiZWFhZjUwOTIyZjQ4NWNlYTMuc2V0Q29udGVudChodG1sXzU4ZDAyOTg2ODAzYjQ5MmZiNTcwYzQxNmZiNjgyM2EwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2ExN2VlMGE2OGY1NjRmYjRiOTNhMDYyZTNjNDE0MGIyLmJpbmRQb3B1cChwb3B1cF9mOTc3MWFkN2YyYjU0ZmJlYWFmNTA5MjJmNDg1Y2VhMyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9hM2NjNGY2NzNlNDI0NzRjOWJiN2U4Mjg2MGY1ZThjNiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjc0NDczNDIsLTc5LjIzOTQ3NjA5OTk5OTk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImdyZWVuIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiZ3JlZW4iLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYjI2ZWIwYzQ5ZGVjNDEyNDgwZGZlMzFiYTcyNjVkZDUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNWE4ODgxMmNhMTI4NDE1NGIxMjZhMjc2M2Q5Y2ZmZjkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYzgzOWQ4MzFjMjFmNGVhZjg1ZThkOWQ3ZjM2MDY1NWEgPSAkKCc8ZGl2IGlkPSJodG1sX2M4MzlkODMxYzIxZjRlYWY4NWU4ZDlkN2YzNjA2NTVhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5TY2FyYm9yb3VnaCBWaWxsYWdlIENsdXN0ZXIgNDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNWE4ODgxMmNhMTI4NDE1NGIxMjZhMjc2M2Q5Y2ZmZjkuc2V0Q29udGVudChodG1sX2M4MzlkODMxYzIxZjRlYWY4NWU4ZDlkN2YzNjA2NTVhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2EzY2M0ZjY3M2U0MjQ3NGM5YmI3ZTgyODYwZjVlOGM2LmJpbmRQb3B1cChwb3B1cF81YTg4ODEyY2ExMjg0MTU0YjEyNmEyNzYzZDljZmZmOSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl80ZGJlMjdlZWRhODM0MzIxOTcyZjJjZTY1NTcwMzBkNiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjcyNzkyOTIsLTc5LjI2MjAyOTQwMDAwMDAyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImdyZWVuIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiZ3JlZW4iLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYjI2ZWIwYzQ5ZGVjNDEyNDgwZGZlMzFiYTcyNjVkZDUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfY2E2NzZkZmJmOWZjNDJmMDgyMWQyZWNkMGQ3YTMyYzUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfODJmMGIxYWU4ZjAxNDM0Nzk2NDNmNTQ2ZTE2OTAxMzMgPSAkKCc8ZGl2IGlkPSJodG1sXzgyZjBiMWFlOGYwMTQzNDc5NjQzZjU0NmUxNjkwMTMzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5FYXN0IEJpcmNobW91bnQgUGFyaywgSW9udmlldywgS2VubmVkeSBQYXJrIENsdXN0ZXIgNDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfY2E2NzZkZmJmOWZjNDJmMDgyMWQyZWNkMGQ3YTMyYzUuc2V0Q29udGVudChodG1sXzgyZjBiMWFlOGYwMTQzNDc5NjQzZjU0NmUxNjkwMTMzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzRkYmUyN2VlZGE4MzQzMjE5NzJmMmNlNjU1NzAzMGQ2LmJpbmRQb3B1cChwb3B1cF9jYTY3NmRmYmY5ZmM0MmYwODIxZDJlY2QwZDdhMzJjNSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl80MmJiYjNlODNhYWY0MDI4YmIxYzA3MTcwNWI4NWM4ZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjcxMTExMTcwMDAwMDAwNCwtNzkuMjg0NTc3Ml0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJncmVlbiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImdyZWVuIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2IyNmViMGM0OWRlYzQxMjQ4MGRmZTMxYmE3MjY1ZGQ1KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzhlOGJkNmIwZTNiYTRiNGZhNmM1ZDUxZTFlZDkyMzg4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2VhYTc4MzY3OTM4MDQ2N2NiOTNlNmI5NzJlYTViZDM3ID0gJCgnPGRpdiBpZD0iaHRtbF9lYWE3ODM2NzkzODA0NjdjYjkzZTZiOTcyZWE1YmQzNyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q2xhaXJsZWEsIEdvbGRlbiBNaWxlLCBPYWtyaWRnZSBDbHVzdGVyIDQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzhlOGJkNmIwZTNiYTRiNGZhNmM1ZDUxZTFlZDkyMzg4LnNldENvbnRlbnQoaHRtbF9lYWE3ODM2NzkzODA0NjdjYjkzZTZiOTcyZWE1YmQzNyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl80MmJiYjNlODNhYWY0MDI4YmIxYzA3MTcwNWI4NWM4ZS5iaW5kUG9wdXAocG9wdXBfOGU4YmQ2YjBlM2JhNGI0ZmE2YzVkNTFlMWVkOTIzODgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMGUzNjljZTc2YTRiNDJmYzhlODcwZDQ2Y2ZiNjk5NjMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43MTYzMTYsLTc5LjIzOTQ3NjA5OTk5OTk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImdyZWVuIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiZ3JlZW4iLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYjI2ZWIwYzQ5ZGVjNDEyNDgwZGZlMzFiYTcyNjVkZDUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNGY5NWUxMDMxZGZkNDJkMDliNDI1ODgwMzAwOTYwZjcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYTQ3NjRiZmRlNTY2NDQzNmIxZjBhZmRhMWNlMTQzZjggPSAkKCc8ZGl2IGlkPSJodG1sX2E0NzY0YmZkZTU2NjQ0MzZiMWYwYWZkYTFjZTE0M2Y4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DbGlmZmNyZXN0LCBDbGlmZnNpZGUsIFNjYXJib3JvdWdoIFZpbGxhZ2UgV2VzdCBDbHVzdGVyIDQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzRmOTVlMTAzMWRmZDQyZDA5YjQyNTg4MDMwMDk2MGY3LnNldENvbnRlbnQoaHRtbF9hNDc2NGJmZGU1NjY0NDM2YjFmMGFmZGExY2UxNDNmOCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8wZTM2OWNlNzZhNGI0MmZjOGU4NzBkNDZjZmI2OTk2My5iaW5kUG9wdXAocG9wdXBfNGY5NWUxMDMxZGZkNDJkMDliNDI1ODgwMzAwOTYwZjcpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMGUwMGIyNzExMjQwNDRhZDhjMzk3ZmU1Y2UzNzI1ZDIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42OTI2NTcwMDAwMDAwMDQsLTc5LjI2NDg0ODFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiZ3JlZW4iLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJncmVlbiIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9iMjZlYjBjNDlkZWM0MTI0ODBkZmUzMWJhNzI2NWRkNSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iZDlmOGYyNWUyYzU0ZDk2YWYwZGZhODZmZGYxZDQ4YSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xNzNmMWFhYWRmNGU0NTJhODQzYmM1Y2NiMDFjMjNiNiA9ICQoJzxkaXYgaWQ9Imh0bWxfMTczZjFhYWFkZjRlNDUyYTg0M2JjNWNjYjAxYzIzYjYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkJpcmNoIENsaWZmLCBDbGlmZnNpZGUgV2VzdCBDbHVzdGVyIDQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2JkOWY4ZjI1ZTJjNTRkOTZhZjBkZmE4NmZkZjFkNDhhLnNldENvbnRlbnQoaHRtbF8xNzNmMWFhYWRmNGU0NTJhODQzYmM1Y2NiMDFjMjNiNik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8wZTAwYjI3MTEyNDA0NGFkOGMzOTdmZTVjZTM3MjVkMi5iaW5kUG9wdXAocG9wdXBfYmQ5ZjhmMjVlMmM1NGQ5NmFmMGRmYTg2ZmRmMWQ0OGEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNzI1NjY1NDczYWQ5NDAxMzg3Y2ExMmYyMjQwZTIxYjMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43NTc0MDk2LC03OS4yNzMzMDQwMDAwMDAwMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJncmVlbiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImdyZWVuIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2IyNmViMGM0OWRlYzQxMjQ4MGRmZTMxYmE3MjY1ZGQ1KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzFlZWY5NDViZDM4ODRmMTk4N2IwZWZkMjdmNDkzY2Y1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2Y2NDUzNGNmZjUxNDQ2ZjU4NWNjYjdhNTdlZjRjNDRiID0gJCgnPGRpdiBpZD0iaHRtbF9mNjQ1MzRjZmY1MTQ0NmY1ODVjY2I3YTU3ZWY0YzQ0YiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RG9yc2V0IFBhcmssIFNjYXJib3JvdWdoIFRvd24gQ2VudHJlLCBXZXhmb3JkIEhlaWdodHMgQ2x1c3RlciA0PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xZWVmOTQ1YmQzODg0ZjE5ODdiMGVmZDI3ZjQ5M2NmNS5zZXRDb250ZW50KGh0bWxfZjY0NTM0Y2ZmNTE0NDZmNTg1Y2NiN2E1N2VmNGM0NGIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNzI1NjY1NDczYWQ5NDAxMzg3Y2ExMmYyMjQwZTIxYjMuYmluZFBvcHVwKHBvcHVwXzFlZWY5NDViZDM4ODRmMTk4N2IwZWZkMjdmNDkzY2Y1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2MzNTc1OTU1MWZlZjQxZDU4NmE0NzJlYzViMGE1ZDc1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzUwMDcxNTAwMDAwMDA0LC03OS4yOTU4NDkxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImdyZWVuIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiZ3JlZW4iLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYjI2ZWIwYzQ5ZGVjNDEyNDgwZGZlMzFiYTcyNjVkZDUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNGFjZTBhNjk2YjMwNDI2MTlmODhiNzUxNGVmYmZkZTcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNjA4Njk5ZjgzNDkyNGRjMmI4ZjIyOWUzZDExNjkyNTMgPSAkKCc8ZGl2IGlkPSJodG1sXzYwODY5OWY4MzQ5MjRkYzJiOGYyMjllM2QxMTY5MjUzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NYXJ5dmFsZSwgV2V4Zm9yZCBDbHVzdGVyIDQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzRhY2UwYTY5NmIzMDQyNjE5Zjg4Yjc1MTRlZmJmZGU3LnNldENvbnRlbnQoaHRtbF82MDg2OTlmODM0OTI0ZGMyYjhmMjI5ZTNkMTE2OTI1Myk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9jMzU3NTk1NTFmZWY0MWQ1ODZhNDcyZWM1YjBhNWQ3NS5iaW5kUG9wdXAocG9wdXBfNGFjZTBhNjk2YjMwNDI2MTlmODhiNzUxNGVmYmZkZTcpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZTI2ZjBkNWZkODdmNGQ0NWIxNGIxNWEwM2M0ZTllNTcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43OTQyMDAzLC03OS4yNjIwMjk0MDAwMDAwMl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJncmVlbiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImdyZWVuIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2IyNmViMGM0OWRlYzQxMjQ4MGRmZTMxYmE3MjY1ZGQ1KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzA3MDFlODcwYTM2ZTQxODc4OGUyMzRhZTgyOGIxOWE0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2Q3OTdhZmQ3MzY5NTRmN2JhNGQxYTAxZTkzN2EwZjFkID0gJCgnPGRpdiBpZD0iaHRtbF9kNzk3YWZkNzM2OTU0ZjdiYTRkMWEwMWU5MzdhMGYxZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QWdpbmNvdXJ0IENsdXN0ZXIgNDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMDcwMWU4NzBhMzZlNDE4Nzg4ZTIzNGFlODI4YjE5YTQuc2V0Q29udGVudChodG1sX2Q3OTdhZmQ3MzY5NTRmN2JhNGQxYTAxZTkzN2EwZjFkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2UyNmYwZDVmZDg3ZjRkNDViMTRiMTVhMDNjNGU5ZTU3LmJpbmRQb3B1cChwb3B1cF8wNzAxZTg3MGEzNmU0MTg3ODhlMjM0YWU4MjhiMTlhNCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl82YjdlOGUxNzcwNWE0MzkwYjc1ODdmYmM2MmRjYTM3ZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjc4MTYzNzUsLTc5LjMwNDMwMjFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiZ3JlZW4iLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJncmVlbiIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9iMjZlYjBjNDlkZWM0MTI0ODBkZmUzMWJhNzI2NWRkNSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hMDllYTAyZjM5NWE0ZTY1YjYzN2Q2YzZmMmNiYjIwNCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8yNDg3MzczYzg5OTI0ZjU2YTFhOTBiYzU4Mzg3NDE4ZSA9ICQoJzxkaXYgaWQ9Imh0bWxfMjQ4NzM3M2M4OTkyNGY1NmExYTkwYmM1ODM4NzQxOGUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNsYXJrcyBDb3JuZXJzLCBTdWxsaXZhbiwgVGFtIE8mIzM5O1NoYW50ZXIgQ2x1c3RlciA0PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hMDllYTAyZjM5NWE0ZTY1YjYzN2Q2YzZmMmNiYjIwNC5zZXRDb250ZW50KGh0bWxfMjQ4NzM3M2M4OTkyNGY1NmExYTkwYmM1ODM4NzQxOGUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNmI3ZThlMTc3MDVhNDM5MGI3NTg3ZmJjNjJkY2EzN2UuYmluZFBvcHVwKHBvcHVwX2EwOWVhMDJmMzk1YTRlNjViNjM3ZDZjNmYyY2JiMjA0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzk3MjQyYWI1NGViNDQ0NjU5YjU4ZWJlN2Y4Mzg2MGU2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuODE1MjUyMiwtNzkuMjg0NTc3Ml0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJncmVlbiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImdyZWVuIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2IyNmViMGM0OWRlYzQxMjQ4MGRmZTMxYmE3MjY1ZGQ1KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzA2NmNlMzQxNzczODRjOGY4OGQ5ZmI4MmQ1MjIyODNkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2U5YzdmMGEyOGNlMTQ4YTViODQyZDhkNjU0MTRjODQwID0gJCgnPGRpdiBpZD0iaHRtbF9lOWM3ZjBhMjhjZTE0OGE1Yjg0MmQ4ZDY1NDE0Yzg0MCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QWdpbmNvdXJ0IE5vcnRoLCBMJiMzOTtBbW9yZWF1eCBFYXN0LCBNaWxsaWtlbiwgU3RlZWxlcyBFYXN0IENsdXN0ZXIgNDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMDY2Y2UzNDE3NzM4NGM4Zjg4ZDlmYjgyZDUyMjI4M2Quc2V0Q29udGVudChodG1sX2U5YzdmMGEyOGNlMTQ4YTViODQyZDhkNjU0MTRjODQwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzk3MjQyYWI1NGViNDQ0NjU5YjU4ZWJlN2Y4Mzg2MGU2LmJpbmRQb3B1cChwb3B1cF8wNjZjZTM0MTc3Mzg0YzhmODhkOWZiODJkNTIyMjgzZCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9iYWQ5YzVkYzVjZTI0MmZkOTFjZTI1ZTM3ZTk3OWZjYyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjc5OTUyNTIwMDAwMDAwNSwtNzkuMzE4Mzg4N10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJncmVlbiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImdyZWVuIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2IyNmViMGM0OWRlYzQxMjQ4MGRmZTMxYmE3MjY1ZGQ1KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzJhNTc2NGFlY2ZhMTQyYzE4Yzg3ODYyY2MyMjFmOWEyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2VkNWFkNjZmZmJmYjQ3ZDRhYmFhN2IzYTY5YjRlY2RhID0gJCgnPGRpdiBpZD0iaHRtbF9lZDVhZDY2ZmZiZmI0N2Q0YWJhYTdiM2E2OWI0ZWNkYSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TCYjMzk7QW1vcmVhdXggV2VzdCwgU3RlZWxlcyBXZXN0IENsdXN0ZXIgNDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMmE1NzY0YWVjZmExNDJjMThjODc4NjJjYzIyMWY5YTIuc2V0Q29udGVudChodG1sX2VkNWFkNjZmZmJmYjQ3ZDRhYmFhN2IzYTY5YjRlY2RhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2JhZDljNWRjNWNlMjQyZmQ5MWNlMjVlMzdlOTc5ZmNjLmJpbmRQb3B1cChwb3B1cF8yYTU3NjRhZWNmYTE0MmMxOGM4Nzg2MmNjMjIxZjlhMik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jMzBlOTE1NjdkMTk0OTlhYmYxOGZhNjJmNDE0MjZlMCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjgwMzc2MjIsLTc5LjM2MzQ1MTddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiZ3JlZW4iLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJncmVlbiIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9iMjZlYjBjNDlkZWM0MTI0ODBkZmUzMWJhNzI2NWRkNSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82NWY3ZDcwZjY3ZGY0NGU2OTNlOWI2ZTNiYzhjMWY0NyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zOTY4ZWY2Nzg0NzA0NWNhYjY3ZDRmZTk5YTBhOGQ5ZSA9ICQoJzxkaXYgaWQ9Imh0bWxfMzk2OGVmNjc4NDcwNDVjYWI2N2Q0ZmU5OWEwYThkOWUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkhpbGxjcmVzdCBWaWxsYWdlIENsdXN0ZXIgNDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNjVmN2Q3MGY2N2RmNDRlNjkzZTliNmUzYmM4YzFmNDcuc2V0Q29udGVudChodG1sXzM5NjhlZjY3ODQ3MDQ1Y2FiNjdkNGZlOTlhMGE4ZDllKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2MzMGU5MTU2N2QxOTQ5OWFiZjE4ZmE2MmY0MTQyNmUwLmJpbmRQb3B1cChwb3B1cF82NWY3ZDcwZjY3ZGY0NGU2OTNlOWI2ZTNiYzhjMWY0Nyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl82MDQ3YWJkYTA0MmE0MzkwYTNkNzBmNmM2NDI4MjUyYiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjc3ODUxNzUsLTc5LjM0NjU1NTddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiZ3JlZW4iLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJncmVlbiIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9iMjZlYjBjNDlkZWM0MTI0ODBkZmUzMWJhNzI2NWRkNSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF84YTA2YTg5ZDhhZjE0NWY0YjIzNGViNjRkMzE1MGM5NSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83YTAzYzk4ZjI0ODk0NTQ2YTYwOGQ2YTE2YWZkMjYxYSA9ICQoJzxkaXYgaWQ9Imh0bWxfN2EwM2M5OGYyNDg5NDU0NmE2MDhkNmExNmFmZDI2MWEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkZhaXJ2aWV3LCBIZW5yeSBGYXJtLCBPcmlvbGUgQ2x1c3RlciA0PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84YTA2YTg5ZDhhZjE0NWY0YjIzNGViNjRkMzE1MGM5NS5zZXRDb250ZW50KGh0bWxfN2EwM2M5OGYyNDg5NDU0NmE2MDhkNmExNmFmZDI2MWEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNjA0N2FiZGEwNDJhNDM5MGEzZDcwZjZjNjQyODI1MmIuYmluZFBvcHVwKHBvcHVwXzhhMDZhODlkOGFmMTQ1ZjRiMjM0ZWI2NGQzMTUwYzk1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2EyNDliYzk1YmZmMDQ0ZDQ5M2NlYmZlYzhmM2RjNzZjID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzg2OTQ3MywtNzkuMzg1OTc1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImdyZWVuIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiZ3JlZW4iLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYjI2ZWIwYzQ5ZGVjNDEyNDgwZGZlMzFiYTcyNjVkZDUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNDIzN2IxZjY0ZmNhNDNmMzg0MTg2MzU1M2ViMTNkMzcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMGFiZWFkODgxNWJmNDFlZDk3MDA1MTRiZTIwZDNhNjUgPSAkKCc8ZGl2IGlkPSJodG1sXzBhYmVhZDg4MTViZjQxZWQ5NzAwNTE0YmUyMGQzYTY1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5CYXl2aWV3IFZpbGxhZ2UgQ2x1c3RlciA0PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80MjM3YjFmNjRmY2E0M2YzODQxODYzNTUzZWIxM2QzNy5zZXRDb250ZW50KGh0bWxfMGFiZWFkODgxNWJmNDFlZDk3MDA1MTRiZTIwZDNhNjUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYTI0OWJjOTViZmYwNDRkNDkzY2ViZmVjOGYzZGM3NmMuYmluZFBvcHVwKHBvcHVwXzQyMzdiMWY2NGZjYTQzZjM4NDE4NjM1NTNlYjEzZDM3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzE1N2ExYmQ3ODUxNzQ4YmNhNzExZWEyNmEwMWU2YTJhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzU3NDkwMiwtNzkuMzc0NzE0MDk5OTk5OTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiZ3JlZW4iLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJncmVlbiIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9iMjZlYjBjNDlkZWM0MTI0ODBkZmUzMWJhNzI2NWRkNSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF83MDMxZjU3MjhmMDY0NDE4OTc3NGVlNWJmMmZjMjVmZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mM2NlMjVjZDU0MWI0ZDAxOWNkNmNiZGNjOGEzNmQ0ZSA9ICQoJzxkaXYgaWQ9Imh0bWxfZjNjZTI1Y2Q1NDFiNGQwMTljZDZjYmRjYzhhMzZkNGUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlNpbHZlciBIaWxscywgWW9yayBNaWxscyBDbHVzdGVyIDQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzcwMzFmNTcyOGYwNjQ0MTg5Nzc0ZWU1YmYyZmMyNWZmLnNldENvbnRlbnQoaHRtbF9mM2NlMjVjZDU0MWI0ZDAxOWNkNmNiZGNjOGEzNmQ0ZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8xNTdhMWJkNzg1MTc0OGJjYTcxMWVhMjZhMDFlNmEyYS5iaW5kUG9wdXAocG9wdXBfNzAzMWY1NzI4ZjA2NDQxODk3NzRlZTViZjJmYzI1ZmYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNjM1N2JmOGFlNjBhNDQ4OWEyMjE4ZjNmZDA5ZjcwOWQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43ODkwNTMsLTc5LjQwODQ5Mjc5OTk5OTk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImdyZWVuIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiZ3JlZW4iLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYjI2ZWIwYzQ5ZGVjNDEyNDgwZGZlMzFiYTcyNjVkZDUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfODVjYjlkMmVhZjY1NDU4MDljNzAwZDNmZjFkZWU4NGQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMGNiODYyYjE1YzY3NDM2Nzk2NjQ2ODY4NjJlY2E5M2QgPSAkKCc8ZGl2IGlkPSJodG1sXzBjYjg2MmIxNWM2NzQzNjc5NjY0Njg2ODYyZWNhOTNkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5OZXd0b25icm9vaywgV2lsbG93ZGFsZSBDbHVzdGVyIDQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzg1Y2I5ZDJlYWY2NTQ1ODA5YzcwMGQzZmYxZGVlODRkLnNldENvbnRlbnQoaHRtbF8wY2I4NjJiMTVjNjc0MzY3OTY2NDY4Njg2MmVjYTkzZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl82MzU3YmY4YWU2MGE0NDg5YTIyMThmM2ZkMDlmNzA5ZC5iaW5kUG9wdXAocG9wdXBfODVjYjlkMmVhZjY1NDU4MDljNzAwZDNmZjFkZWU4NGQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNzY5NjBhN2E5MDY5NDc1NGIyMzI3ODc0MjQyYWQ4NjggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43NzAxMTk5LC03OS40MDg0OTI3OTk5OTk5OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJyZWQiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJyZWQiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYjI2ZWIwYzQ5ZGVjNDEyNDgwZGZlMzFiYTcyNjVkZDUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYzBhMjI1YmYxMDJlNDhkYTg3MjM1ZGRkZDZhOTA2OTAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOGMxN2M5ZWQwZTM5NDlkZmEwNGQzODhmYTQ4MWRhNDggPSAkKCc8ZGl2IGlkPSJodG1sXzhjMTdjOWVkMGUzOTQ5ZGZhMDRkMzg4ZmE0ODFkYTQ4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5XaWxsb3dkYWxlIFNvdXRoIENsdXN0ZXIgMTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYzBhMjI1YmYxMDJlNDhkYTg3MjM1ZGRkZDZhOTA2OTAuc2V0Q29udGVudChodG1sXzhjMTdjOWVkMGUzOTQ5ZGZhMDRkMzg4ZmE0ODFkYTQ4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzc2OTYwYTdhOTA2OTQ3NTRiMjMyNzg3NDI0MmFkODY4LmJpbmRQb3B1cChwb3B1cF9jMGEyMjViZjEwMmU0OGRhODcyMzVkZGRkNmE5MDY5MCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl83MDE5ZGY2OGQyNTE0NzlmOTAyYzNjMTgwZGQ4ZjFiMSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjc1Mjc1ODI5OTk5OTk5NiwtNzkuNDAwMDQ5M10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJncmVlbiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImdyZWVuIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2IyNmViMGM0OWRlYzQxMjQ4MGRmZTMxYmE3MjY1ZGQ1KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzcxNTIzMzNlNzM4ZDRhZjU4ZDEyMDE2NzRiYzBlMGI3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzViZDM2N2EzM2MyZDQ4YWFiNWNiYmNlMzhiMWE3MGZmID0gJCgnPGRpdiBpZD0iaHRtbF81YmQzNjdhMzNjMmQ0OGFhYjVjYmJjZTM4YjFhNzBmZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WW9yayBNaWxscyBXZXN0IENsdXN0ZXIgNDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNzE1MjMzM2U3MzhkNGFmNThkMTIwMTY3NGJjMGUwYjcuc2V0Q29udGVudChodG1sXzViZDM2N2EzM2MyZDQ4YWFiNWNiYmNlMzhiMWE3MGZmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzcwMTlkZjY4ZDI1MTQ3OWY5MDJjM2MxODBkZDhmMWIxLmJpbmRQb3B1cChwb3B1cF83MTUyMzMzZTczOGQ0YWY1OGQxMjAxNjc0YmMwZTBiNyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mYWEzZTNkMGNjYWE0ZjFkOGExM2MzYTMyOWU5YTZlMyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjc4MjczNjQsLTc5LjQ0MjI1OTNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiZ3JlZW4iLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJncmVlbiIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9iMjZlYjBjNDlkZWM0MTI0ODBkZmUzMWJhNzI2NWRkNSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zMmM4N2NmZmFlNDI0ZjM0ODg2NGZmYzNiZjQ2MGJjNiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF81OTZlNzNhYTNmMDA0YTNjOGJkZjVmNWVmMTUzNDUzMCA9ICQoJzxkaXYgaWQ9Imh0bWxfNTk2ZTczYWEzZjAwNGEzYzhiZGY1ZjVlZjE1MzQ1MzAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPldpbGxvd2RhbGUgV2VzdCBDbHVzdGVyIDQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzMyYzg3Y2ZmYWU0MjRmMzQ4ODY0ZmZjM2JmNDYwYmM2LnNldENvbnRlbnQoaHRtbF81OTZlNzNhYTNmMDA0YTNjOGJkZjVmNWVmMTUzNDUzMCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9mYWEzZTNkMGNjYWE0ZjFkOGExM2MzYTMyOWU5YTZlMy5iaW5kUG9wdXAocG9wdXBfMzJjODdjZmZhZTQyNGYzNDg4NjRmZmMzYmY0NjBiYzYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYjNkMDRhZmY2ODc1NGQ2OWI3NTA2NzFjZTY3MTk0ZTcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43NTMyNTg2LC03OS4zMjk2NTY1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImdyZWVuIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiZ3JlZW4iLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYjI2ZWIwYzQ5ZGVjNDEyNDgwZGZlMzFiYTcyNjVkZDUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMmRmYTUxZWY5MWRiNDQ5YmJjODQxMDA3YTE3YWUwY2MgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOGRmNWMxZDY3Nzc4NDUzYmJkOTAwMGM4MzIyNWZkNjkgPSAkKCc8ZGl2IGlkPSJodG1sXzhkZjVjMWQ2Nzc3ODQ1M2JiZDkwMDBjODMyMjVmZDY5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5QYXJrd29vZHMgQ2x1c3RlciA0PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yZGZhNTFlZjkxZGI0NDliYmM4NDEwMDdhMTdhZTBjYy5zZXRDb250ZW50KGh0bWxfOGRmNWMxZDY3Nzc4NDUzYmJkOTAwMGM4MzIyNWZkNjkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYjNkMDRhZmY2ODc1NGQ2OWI3NTA2NzFjZTY3MTk0ZTcuYmluZFBvcHVwKHBvcHVwXzJkZmE1MWVmOTFkYjQ0OWJiYzg0MTAwN2ExN2FlMGNjKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzMxMTBkNzhiOWM4NzQ1ODFiMTk0OTVkZGQ0M2ZhNDIxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzQ1OTA1Nzk5OTk5OTk2LC03OS4zNTIxODhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiZ3JlZW4iLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJncmVlbiIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9iMjZlYjBjNDlkZWM0MTI0ODBkZmUzMWJhNzI2NWRkNSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wZjBiYmIyNzgxNDQ0NGRmOTE1YzBmMGRlNDE0NGViNSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wZGU5ZTIxNzI2YTE0ZDhiOTBmN2IyMDE5ZGI4YWNkNiA9ICQoJzxkaXYgaWQ9Imh0bWxfMGRlOWUyMTcyNmExNGQ4YjkwZjdiMjAxOWRiOGFjZDYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkRvbiBNaWxscyBOb3J0aCBDbHVzdGVyIDQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzBmMGJiYjI3ODE0NDQ0ZGY5MTVjMGYwZGU0MTQ0ZWI1LnNldENvbnRlbnQoaHRtbF8wZGU5ZTIxNzI2YTE0ZDhiOTBmN2IyMDE5ZGI4YWNkNik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8zMTEwZDc4YjljODc0NTgxYjE5NDk1ZGRkNDNmYTQyMS5iaW5kUG9wdXAocG9wdXBfMGYwYmJiMjc4MTQ0NDRkZjkxNWMwZjBkZTQxNDRlYjUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYjE5MDFjYTc3MTdjNDBiNWFlNzI5MjI2YTk2N2FkYjcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43MjU4OTk3MDAwMDAwMSwtNzkuMzQwOTIzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImdyZWVuIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiZ3JlZW4iLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYjI2ZWIwYzQ5ZGVjNDEyNDgwZGZlMzFiYTcyNjVkZDUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYjVhOGI1NDQyZThhNGRmMWE4ZTZkY2FmOTI3MzEwNjAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMTdiNDQzYThiZTAzNGI5YTlhNmZhZDYxODBhZDFjNjAgPSAkKCc8ZGl2IGlkPSJodG1sXzE3YjQ0M2E4YmUwMzRiOWE5YTZmYWQ2MTgwYWQxYzYwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5GbGVtaW5nZG9uIFBhcmssIERvbiBNaWxscyBTb3V0aCBDbHVzdGVyIDQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2I1YThiNTQ0MmU4YTRkZjFhOGU2ZGNhZjkyNzMxMDYwLnNldENvbnRlbnQoaHRtbF8xN2I0NDNhOGJlMDM0YjlhOWE2ZmFkNjE4MGFkMWM2MCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9iMTkwMWNhNzcxN2M0MGI1YWU3MjkyMjZhOTY3YWRiNy5iaW5kUG9wdXAocG9wdXBfYjVhOGI1NDQyZThhNGRmMWE4ZTZkY2FmOTI3MzEwNjApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYjYzYTdlMTYzNmNmNDEyZDgxZjA4YmU2Yjg3NzBjMzEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43NTQzMjgzLC03OS40NDIyNTkzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImdyZWVuIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiZ3JlZW4iLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYjI2ZWIwYzQ5ZGVjNDEyNDgwZGZlMzFiYTcyNjVkZDUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZDk0MzZhMjg1ZTYxNDg5ZWE4NzI3YmE5OTg4NTM1MTAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZDNiNjNjM2M2ZjE3NDlhNGEyNDI1ZjBkZGIwM2YyYzEgPSAkKCc8ZGl2IGlkPSJodG1sX2QzYjYzYzNjNmYxNzQ5YTRhMjQyNWYwZGRiMDNmMmMxIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5CYXRodXJzdCBNYW5vciwgRG93bnN2aWV3IE5vcnRoLCBXaWxzb24gSGVpZ2h0cyBDbHVzdGVyIDQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2Q5NDM2YTI4NWU2MTQ4OWVhODcyN2JhOTk4ODUzNTEwLnNldENvbnRlbnQoaHRtbF9kM2I2M2MzYzZmMTc0OWE0YTI0MjVmMGRkYjAzZjJjMSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9iNjNhN2UxNjM2Y2Y0MTJkODFmMDhiZTZiODc3MGMzMS5iaW5kUG9wdXAocG9wdXBfZDk0MzZhMjg1ZTYxNDg5ZWE4NzI3YmE5OTg4NTM1MTApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNGQ4NzE3N2FiY2MyNGY3ZjkxYzQ4MTExNjgwNDZmZjMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43Njc5ODAzLC03OS40ODcyNjE5MDAwMDAwMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJncmVlbiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImdyZWVuIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2IyNmViMGM0OWRlYzQxMjQ4MGRmZTMxYmE3MjY1ZGQ1KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzg5NGU4NGM0NzYwMTQ0OWQ4NzEwM2UxMjgwNDFhNjNiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzlhYzJmMGMyNTE3YjQ2ZmFhNTU4ZDVhMzgzNGY2NTNkID0gJCgnPGRpdiBpZD0iaHRtbF85YWMyZjBjMjUxN2I0NmZhYTU1OGQ1YTM4MzRmNjUzZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Tm9ydGh3b29kIFBhcmssIFlvcmsgVW5pdmVyc2l0eSBDbHVzdGVyIDQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzg5NGU4NGM0NzYwMTQ0OWQ4NzEwM2UxMjgwNDFhNjNiLnNldENvbnRlbnQoaHRtbF85YWMyZjBjMjUxN2I0NmZhYTU1OGQ1YTM4MzRmNjUzZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl80ZDg3MTc3YWJjYzI0ZjdmOTFjNDgxMTE2ODA0NmZmMy5iaW5kUG9wdXAocG9wdXBfODk0ZTg0YzQ3NjAxNDQ5ZDg3MTAzZTEyODA0MWE2M2IpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMWFlMjI1M2I1YTk4NDdhMmI5ZmMyNzQ1ZWE3NDU3Y2IgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43Mzc0NzMyMDAwMDAwMDQsLTc5LjQ2NDc2MzI5OTk5OTk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImdyZWVuIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiZ3JlZW4iLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYjI2ZWIwYzQ5ZGVjNDEyNDgwZGZlMzFiYTcyNjVkZDUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZDZmYzZmMGI3ZDM0NDc5YWI1ODkyYjk0YzY0MzJkMWYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNmY4ODFiZGIzOTQyNDA3Yjk0ZWMxNjUyYzNhZmUzOTAgPSAkKCc8ZGl2IGlkPSJodG1sXzZmODgxYmRiMzk0MjQwN2I5NGVjMTY1MmMzYWZlMzkwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DRkIgVG9yb250bywgRG93bnN2aWV3IEVhc3QgQ2x1c3RlciA0PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kNmZjNmYwYjdkMzQ0NzlhYjU4OTJiOTRjNjQzMmQxZi5zZXRDb250ZW50KGh0bWxfNmY4ODFiZGIzOTQyNDA3Yjk0ZWMxNjUyYzNhZmUzOTApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMWFlMjI1M2I1YTk4NDdhMmI5ZmMyNzQ1ZWE3NDU3Y2IuYmluZFBvcHVwKHBvcHVwX2Q2ZmM2ZjBiN2QzNDQ3OWFiNTg5MmI5NGM2NDMyZDFmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2QwYjg3OGJlZmMxMDQzYWU4MjRlMWQ2ZmMzNjNiM2Y3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzM5MDE0NiwtNzkuNTA2OTQzNl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJncmVlbiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImdyZWVuIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2IyNmViMGM0OWRlYzQxMjQ4MGRmZTMxYmE3MjY1ZGQ1KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzBmZDE3OWQ4MjgzZjRhNzBhNTNjNWE4NGE0Yzc0YjNlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzc3MTNhMWJmYjA4OTQ0N2NhMGI4ZjNlNWU5OGViOThhID0gJCgnPGRpdiBpZD0iaHRtbF83NzEzYTFiZmIwODk0NDdjYTBiOGYzZTVlOThlYjk4YSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RG93bnN2aWV3IFdlc3QgQ2x1c3RlciA0PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wZmQxNzlkODI4M2Y0YTcwYTUzYzVhODRhNGM3NGIzZS5zZXRDb250ZW50KGh0bWxfNzcxM2ExYmZiMDg5NDQ3Y2EwYjhmM2U1ZTk4ZWI5OGEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZDBiODc4YmVmYzEwNDNhZTgyNGUxZDZmYzM2M2IzZjcuYmluZFBvcHVwKHBvcHVwXzBmZDE3OWQ4MjgzZjRhNzBhNTNjNWE4NGE0Yzc0YjNlKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzUxMDc5MjAyNmU4NTRiNjNiYjJlMWQ5NTVmZmNiY2M1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzI4NDk2NCwtNzkuNDk1Njk3NDAwMDAwMDFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiZ3JlZW4iLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJncmVlbiIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9iMjZlYjBjNDlkZWM0MTI0ODBkZmUzMWJhNzI2NWRkNSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mN2JkYTAwMGU4YWU0MzgzYjg0OTc3YWNjYjkzMWYwMyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wNTNmMjAyYjhjZDA0ODhlYWU2MzI3ZjFmZjc0ZWI3NiA9ICQoJzxkaXYgaWQ9Imh0bWxfMDUzZjIwMmI4Y2QwNDg4ZWFlNjMyN2YxZmY3NGViNzYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkRvd25zdmlldyBDZW50cmFsIENsdXN0ZXIgNDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZjdiZGEwMDBlOGFlNDM4M2I4NDk3N2FjY2I5MzFmMDMuc2V0Q29udGVudChodG1sXzA1M2YyMDJiOGNkMDQ4OGVhZTYzMjdmMWZmNzRlYjc2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzUxMDc5MjAyNmU4NTRiNjNiYjJlMWQ5NTVmZmNiY2M1LmJpbmRQb3B1cChwb3B1cF9mN2JkYTAwMGU4YWU0MzgzYjg0OTc3YWNjYjkzMWYwMyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lMmNmODkxM2VmMDQ0MjRjYTdlZGUwZDJmZDYxMjRhYSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjc2MTYzMTMsLTc5LjUyMDk5OTQwMDAwMDAxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImdyZWVuIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiZ3JlZW4iLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYjI2ZWIwYzQ5ZGVjNDEyNDgwZGZlMzFiYTcyNjVkZDUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNDRhZjM2YmI5NjJiNDNkZTg5NTRkOWE0N2E4N2FkMzcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYmY1NDcxNmE0MzY3NGE4ZmEwZDRiNzJlYzQ1MTI1OTQgPSAkKCc8ZGl2IGlkPSJodG1sX2JmNTQ3MTZhNDM2NzRhOGZhMGQ0YjcyZWM0NTEyNTk0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Eb3duc3ZpZXcgTm9ydGh3ZXN0IENsdXN0ZXIgNDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNDRhZjM2YmI5NjJiNDNkZTg5NTRkOWE0N2E4N2FkMzcuc2V0Q29udGVudChodG1sX2JmNTQ3MTZhNDM2NzRhOGZhMGQ0YjcyZWM0NTEyNTk0KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2UyY2Y4OTEzZWYwNDQyNGNhN2VkZTBkMmZkNjEyNGFhLmJpbmRQb3B1cChwb3B1cF80NGFmMzZiYjk2MmI0M2RlODk1NGQ5YTQ3YTg3YWQzNyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85ZmRkNjkxMjhkYjA0NDBkOGZiM2VkMzlhYmFjZTNjYiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjcyNTg4MjI5OTk5OTk5NSwtNzkuMzE1NTcxNTk5OTk5OThdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiZ3JlZW4iLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJncmVlbiIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9iMjZlYjBjNDlkZWM0MTI0ODBkZmUzMWJhNzI2NWRkNSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iODU0MWI4NzNkNDY0ZjJhODQyZThhNDJhMzk2ZmEwOSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wNDcxOWM2MGY4M2E0OTQ5OWQ4MWQxYTdhY2JmYjBiYiA9ICQoJzxkaXYgaWQ9Imh0bWxfMDQ3MTljNjBmODNhNDk0OTlkODFkMWE3YWNiZmIwYmIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlZpY3RvcmlhIFZpbGxhZ2UgQ2x1c3RlciA0PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iODU0MWI4NzNkNDY0ZjJhODQyZThhNDJhMzk2ZmEwOS5zZXRDb250ZW50KGh0bWxfMDQ3MTljNjBmODNhNDk0OTlkODFkMWE3YWNiZmIwYmIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOWZkZDY5MTI4ZGIwNDQwZDhmYjNlZDM5YWJhY2UzY2IuYmluZFBvcHVwKHBvcHVwX2I4NTQxYjg3M2Q0NjRmMmE4NDJlOGE0MmEzOTZmYTA5KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzE4ZDU4ZTA4N2VkZDRhM2Y4M2I3ZTlhNGUwMzQ0OTA2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzA2Mzk3MiwtNzkuMzA5OTM3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImdyZWVuIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiZ3JlZW4iLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYjI2ZWIwYzQ5ZGVjNDEyNDgwZGZlMzFiYTcyNjVkZDUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOGU5MjI3NDkzYTkxNGE2MzkzNWMwOTIyNGZiYWJjZjggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMWExMjc4MTIzMWJkNDVkNTliODQ3NGRmMzI0ZWNlOGMgPSAkKCc8ZGl2IGlkPSJodG1sXzFhMTI3ODEyMzFiZDQ1ZDU5Yjg0NzRkZjMyNGVjZThjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Xb29kYmluZSBHYXJkZW5zLCBQYXJrdmlldyBIaWxsIENsdXN0ZXIgNDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOGU5MjI3NDkzYTkxNGE2MzkzNWMwOTIyNGZiYWJjZjguc2V0Q29udGVudChodG1sXzFhMTI3ODEyMzFiZDQ1ZDU5Yjg0NzRkZjMyNGVjZThjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzE4ZDU4ZTA4N2VkZDRhM2Y4M2I3ZTlhNGUwMzQ0OTA2LmJpbmRQb3B1cChwb3B1cF84ZTkyMjc0OTNhOTE0YTYzOTM1YzA5MjI0ZmJhYmNmOCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl83ZTY0YzdmMmYzMmE0ZTU4OWQ2MWY4M2JmY2ExY2FhZiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY5NTM0MzkwMDAwMDAwNSwtNzkuMzE4Mzg4N10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJncmVlbiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImdyZWVuIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2IyNmViMGM0OWRlYzQxMjQ4MGRmZTMxYmE3MjY1ZGQ1KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzJmMzU5MDdmYjkzNTRiNGY5ZTkxMDdmNDQwMmJiNTkxID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2U3MGQxZjkxMjlhOTQ0ZWJiNDE3YTAzNWI4ODY5ZGFhID0gJCgnPGRpdiBpZD0iaHRtbF9lNzBkMWY5MTI5YTk0NGViYjQxN2EwMzViODg2OWRhYSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+V29vZGJpbmUgSGVpZ2h0cyBDbHVzdGVyIDQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzJmMzU5MDdmYjkzNTRiNGY5ZTkxMDdmNDQwMmJiNTkxLnNldENvbnRlbnQoaHRtbF9lNzBkMWY5MTI5YTk0NGViYjQxN2EwMzViODg2OWRhYSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl83ZTY0YzdmMmYzMmE0ZTU4OWQ2MWY4M2JmY2ExY2FhZi5iaW5kUG9wdXAocG9wdXBfMmYzNTkwN2ZiOTM1NGI0ZjllOTEwN2Y0NDAyYmI1OTEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZjE0YTdhNmFmOGIwNDg0OGE4NzcyZTZkYWE5MzVhOGMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42NzYzNTczOTk5OTk5OSwtNzkuMjkzMDMxMl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJncmVlbiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImdyZWVuIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2IyNmViMGM0OWRlYzQxMjQ4MGRmZTMxYmE3MjY1ZGQ1KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzVjMThhMDRkMzc3NzQ3ZDFiYjA5MTk5ZDc0MzE4NDlmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzc0ZmZkOTJmZjQ2ZjRiYjliNDU5NTIxOTVlODU0YzgyID0gJCgnPGRpdiBpZD0iaHRtbF83NGZmZDkyZmY0NmY0YmI5YjQ1OTUyMTk1ZTg1NGM4MiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+VGhlIEJlYWNoZXMgQ2x1c3RlciA0PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81YzE4YTA0ZDM3Nzc0N2QxYmIwOTE5OWQ3NDMxODQ5Zi5zZXRDb250ZW50KGh0bWxfNzRmZmQ5MmZmNDZmNGJiOWI0NTk1MjE5NWU4NTRjODIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZjE0YTdhNmFmOGIwNDg0OGE4NzcyZTZkYWE5MzVhOGMuYmluZFBvcHVwKHBvcHVwXzVjMThhMDRkMzc3NzQ3ZDFiYjA5MTk5ZDc0MzE4NDlmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2RkOTdiZmUzMmEwNzRjM2E4OGM0ODE2MzNlMWE4Y2NhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzA5MDYwNCwtNzkuMzYzNDUxN10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJncmVlbiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImdyZWVuIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2IyNmViMGM0OWRlYzQxMjQ4MGRmZTMxYmE3MjY1ZGQ1KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2ExYzY0YTA2MzA0NjRjZTliZmIxMmQ5ODRkN2JmMGRhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzQ0MzgwNmQ2ZTc1ZTQxYjdiNzJhOWRlYzllZDQwNjMxID0gJCgnPGRpdiBpZD0iaHRtbF80NDM4MDZkNmU3NWU0MWI3YjcyYTlkZWM5ZWQ0MDYzMSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TGVhc2lkZSBDbHVzdGVyIDQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2ExYzY0YTA2MzA0NjRjZTliZmIxMmQ5ODRkN2JmMGRhLnNldENvbnRlbnQoaHRtbF80NDM4MDZkNmU3NWU0MWI3YjcyYTlkZWM5ZWQ0MDYzMSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9kZDk3YmZlMzJhMDc0YzNhODhjNDgxNjMzZTFhOGNjYS5iaW5kUG9wdXAocG9wdXBfYTFjNjRhMDYzMDQ2NGNlOWJmYjEyZDk4NGQ3YmYwZGEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMjRiMTM4YmJjOTgyNDAwMWFiY2NiM2E4YmRmMDk1ZWUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43MDUzNjg5LC03OS4zNDkzNzE5MDAwMDAwMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJncmVlbiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImdyZWVuIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2IyNmViMGM0OWRlYzQxMjQ4MGRmZTMxYmE3MjY1ZGQ1KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2E5ZGMzMWU5OWZlMTQ2MmRiYTgxYTVlMjg1NTQ3OGE3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzI2ZWY2YjJhYWZlOTQ5MzU5MjE4MzMzYjJmZTcyYTgzID0gJCgnPGRpdiBpZD0iaHRtbF8yNmVmNmIyYWFmZTk0OTM1OTIxODMzM2IyZmU3MmE4MyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+VGhvcm5jbGlmZmUgUGFyayBDbHVzdGVyIDQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2E5ZGMzMWU5OWZlMTQ2MmRiYTgxYTVlMjg1NTQ3OGE3LnNldENvbnRlbnQoaHRtbF8yNmVmNmIyYWFmZTk0OTM1OTIxODMzM2IyZmU3MmE4Myk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8yNGIxMzhiYmM5ODI0MDAxYWJjY2IzYThiZGYwOTVlZS5iaW5kUG9wdXAocG9wdXBfYTlkYzMxZTk5ZmUxNDYyZGJhODFhNWUyODU1NDc4YTcpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZTEzNzgxOWZjZjNjNDNlNzg1YTU2MzMwZWRlZWRlMDEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42ODUzNDcsLTc5LjMzODEwNjVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiZ3JlZW4iLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJncmVlbiIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9iMjZlYjBjNDlkZWM0MTI0ODBkZmUzMWJhNzI2NWRkNSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85ZWYzMTMyYWE5Y2M0MzExOTM0ZWQzNDU1YmQyZWRhZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xMzM4ZTJlMzNjNTI0MTc1YTQyMGVmODZlMDg3NzM4ZCA9ICQoJzxkaXYgaWQ9Imh0bWxfMTMzOGUyZTMzYzUyNDE3NWE0MjBlZjg2ZTA4NzczOGQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkVhc3QgVG9yb250byBDbHVzdGVyIDQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzllZjMxMzJhYTljYzQzMTE5MzRlZDM0NTViZDJlZGFmLnNldENvbnRlbnQoaHRtbF8xMzM4ZTJlMzNjNTI0MTc1YTQyMGVmODZlMDg3NzM4ZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9lMTM3ODE5ZmNmM2M0M2U3ODVhNTYzMzBlZGVlZGUwMS5iaW5kUG9wdXAocG9wdXBfOWVmMzEzMmFhOWNjNDMxMTkzNGVkMzQ1NWJkMmVkYWYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZDkyMThlNjdkNjUxNDVjYmJiNmNjYjA5ZmUwZmZlMjkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42Nzk1NTcxLC03OS4zNTIxODhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAieWVsbG93IiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2IyNmViMGM0OWRlYzQxMjQ4MGRmZTMxYmE3MjY1ZGQ1KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzJjZGM0M2Y0OWE0ZTQ3NWVhMjQxNGZkNmEwMzI2MTgyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzliNWMyODJjYzhlYzQzOTg4NGIzYzRkNjJhMmM5MGU5ID0gJCgnPGRpdiBpZD0iaHRtbF85YjVjMjgyY2M4ZWM0Mzk4ODRiM2M0ZDYyYTJjOTBlOSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+VGhlIERhbmZvcnRoIFdlc3QsIFJpdmVyZGFsZSBDbHVzdGVyIDM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzJjZGM0M2Y0OWE0ZTQ3NWVhMjQxNGZkNmEwMzI2MTgyLnNldENvbnRlbnQoaHRtbF85YjVjMjgyY2M4ZWM0Mzk4ODRiM2M0ZDYyYTJjOTBlOSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9kOTIxOGU2N2Q2NTE0NWNiYmI2Y2NiMDlmZTBmZmUyOS5iaW5kUG9wdXAocG9wdXBfMmNkYzQzZjQ5YTRlNDc1ZWEyNDE0ZmQ2YTAzMjYxODIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZDIzMGEwNjNjNWJjNDJjMjg5MzA1ZWE5ZmUwNThiZTkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42Njg5OTg1LC03OS4zMTU1NzE1OTk5OTk5OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJncmVlbiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImdyZWVuIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2IyNmViMGM0OWRlYzQxMjQ4MGRmZTMxYmE3MjY1ZGQ1KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzllMTI2ZjdiYjg1OTQwMThhYTFkY2U5MjNlMjIyYzZjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2UwNGJmYTBmY2IwNDQzYmRiMzhhYzFmYjE4MTUxMmEwID0gJCgnPGRpdiBpZD0iaHRtbF9lMDRiZmEwZmNiMDQ0M2JkYjM4YWMxZmIxODE1MTJhMCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+VGhlIEJlYWNoZXMgV2VzdCwgSW5kaWEgQmF6YWFyIENsdXN0ZXIgNDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOWUxMjZmN2JiODU5NDAxOGFhMWRjZTkyM2UyMjJjNmMuc2V0Q29udGVudChodG1sX2UwNGJmYTBmY2IwNDQzYmRiMzhhYzFmYjE4MTUxMmEwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2QyMzBhMDYzYzViYzQyYzI4OTMwNWVhOWZlMDU4YmU5LmJpbmRQb3B1cChwb3B1cF85ZTEyNmY3YmI4NTk0MDE4YWExZGNlOTIzZTIyMmM2Yyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jZmYyNzQ2ZDAxMDE0Yjc4OTM4MWM4MzlmNjhlYWM4MCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY1OTUyNTUsLTc5LjM0MDkyM10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJvcmFuZ2UiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJvcmFuZ2UiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYjI2ZWIwYzQ5ZGVjNDEyNDgwZGZlMzFiYTcyNjVkZDUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNmQ2MjUyMjI0ZTQ0NGI4ODg0MjAzNWQzYjNiM2M1MDggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYzQ4OWJlNmE3MDA0NDc3Y2I4ZGE5YWVkZjJmZmI4OWMgPSAkKCc8ZGl2IGlkPSJodG1sX2M0ODliZTZhNzAwNDQ3N2NiOGRhOWFlZGYyZmZiODljIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5TdHVkaW8gRGlzdHJpY3QgQ2x1c3RlciAwPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82ZDYyNTIyMjRlNDQ0Yjg4ODQyMDM1ZDNiM2IzYzUwOC5zZXRDb250ZW50KGh0bWxfYzQ4OWJlNmE3MDA0NDc3Y2I4ZGE5YWVkZjJmZmI4OWMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfY2ZmMjc0NmQwMTAxNGI3ODkzODFjODM5ZjY4ZWFjODAuYmluZFBvcHVwKHBvcHVwXzZkNjI1MjIyNGU0NDRiODg4NDIwMzVkM2IzYjNjNTA4KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzE1NGYwNGRlNjI3ZTRmN2ZiMjQ0OWI3MmQwYzBkZjE1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzI4MDIwNSwtNzkuMzg4NzkwMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJncmVlbiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImdyZWVuIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2IyNmViMGM0OWRlYzQxMjQ4MGRmZTMxYmE3MjY1ZGQ1KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzBlZDY1MzkzMDRkYjRiMmI5ODE0NTIxMjcxY2MzMTkxID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzRkNDA5NGNlYjBjNjQ4OTNhYzVjMWRkODcxOWI0OTllID0gJCgnPGRpdiBpZD0iaHRtbF80ZDQwOTRjZWIwYzY0ODkzYWM1YzFkZDg3MTliNDk5ZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TGF3cmVuY2UgUGFyayBDbHVzdGVyIDQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzBlZDY1MzkzMDRkYjRiMmI5ODE0NTIxMjcxY2MzMTkxLnNldENvbnRlbnQoaHRtbF80ZDQwOTRjZWIwYzY0ODkzYWM1YzFkZDg3MTliNDk5ZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8xNTRmMDRkZTYyN2U0ZjdmYjI0NDliNzJkMGMwZGYxNS5iaW5kUG9wdXAocG9wdXBfMGVkNjUzOTMwNGRiNGIyYjk4MTQ1MjEyNzFjYzMxOTEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYmE1Mzc2Zjg1NjM4NGRjNDhjODlkNGUwNzZlNjMzMDcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43MTI3NTExLC03OS4zOTAxOTc1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImdyZWVuIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiZ3JlZW4iLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYjI2ZWIwYzQ5ZGVjNDEyNDgwZGZlMzFiYTcyNjVkZDUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYTQwYTBhZTU3ZmY2NDQ1ZmE4MjUyMmRiZjIyYjk1YTMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMjJjZDIzZDFhZWU4NDAwY2I1NGYyMWYwNzVhZDM0YTIgPSAkKCc8ZGl2IGlkPSJodG1sXzIyY2QyM2QxYWVlODQwMGNiNTRmMjFmMDc1YWQzNGEyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5EYXZpc3ZpbGxlIE5vcnRoIENsdXN0ZXIgNDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYTQwYTBhZTU3ZmY2NDQ1ZmE4MjUyMmRiZjIyYjk1YTMuc2V0Q29udGVudChodG1sXzIyY2QyM2QxYWVlODQwMGNiNTRmMjFmMDc1YWQzNGEyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2JhNTM3NmY4NTYzODRkYzQ4Yzg5ZDRlMDc2ZTYzMzA3LmJpbmRQb3B1cChwb3B1cF9hNDBhMGFlNTdmZjY0NDVmYTgyNTIyZGJmMjJiOTVhMyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mMGM0OGRiNjg4NTk0Y2Q1OWI0ZjE0ZGU0ODhkZDU3ZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjcxNTM4MzQsLTc5LjQwNTY3ODQwMDAwMDAxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImdyZWVuIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiZ3JlZW4iLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYjI2ZWIwYzQ5ZGVjNDEyNDgwZGZlMzFiYTcyNjVkZDUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfODhjNmEwYzNjNzBiNGZlODkxYWU2ODVkNWFmZmExNzQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNGQ5MTIwYzBkYjU2NDcwYmJiNDU5MmJkZjUwYjM2ZTcgPSAkKCc8ZGl2IGlkPSJodG1sXzRkOTEyMGMwZGI1NjQ3MGJiYjQ1OTJiZGY1MGIzNmU3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Ob3J0aCBUb3JvbnRvIFdlc3QgQ2x1c3RlciA0PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84OGM2YTBjM2M3MGI0ZmU4OTFhZTY4NWQ1YWZmYTE3NC5zZXRDb250ZW50KGh0bWxfNGQ5MTIwYzBkYjU2NDcwYmJiNDU5MmJkZjUwYjM2ZTcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZjBjNDhkYjY4ODU5NGNkNTliNGYxNGRlNDg4ZGQ1N2UuYmluZFBvcHVwKHBvcHVwXzg4YzZhMGMzYzcwYjRmZTg5MWFlNjg1ZDVhZmZhMTc0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzk2ZTVhMDRiYjVkYjQxMTVhYzYzNzFkMDY4NDQ5YmIwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzA0MzI0NCwtNzkuMzg4NzkwMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJyZWQiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJyZWQiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYjI2ZWIwYzQ5ZGVjNDEyNDgwZGZlMzFiYTcyNjVkZDUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZDkxNWZmZTY3MGRiNDE2NmI3NmIwMGM2MzE1OGZjYTAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMmJkMmMwNzRiMzdkNDU2ODg1ZDliZTlkNWI5ODM4MmYgPSAkKCc8ZGl2IGlkPSJodG1sXzJiZDJjMDc0YjM3ZDQ1Njg4NWQ5YmU5ZDViOTgzODJmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5EYXZpc3ZpbGxlIENsdXN0ZXIgMTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZDkxNWZmZTY3MGRiNDE2NmI3NmIwMGM2MzE1OGZjYTAuc2V0Q29udGVudChodG1sXzJiZDJjMDc0YjM3ZDQ1Njg4NWQ5YmU5ZDViOTgzODJmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzk2ZTVhMDRiYjVkYjQxMTVhYzYzNzFkMDY4NDQ5YmIwLmJpbmRQb3B1cChwb3B1cF9kOTE1ZmZlNjcwZGI0MTY2Yjc2YjAwYzYzMTU4ZmNhMCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81ZTNlNDU0ZDk2NmU0YWIzYjU5NzkwZGNiZDMzNWM2MCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY4OTU3NDMsLTc5LjM4MzE1OTkwMDAwMDAxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImdyZWVuIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiZ3JlZW4iLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYjI2ZWIwYzQ5ZGVjNDEyNDgwZGZlMzFiYTcyNjVkZDUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMWM2ZTc1MzVhNDlmNDVkNTlmZmQ3MDg4MDA2YWQ3ZDYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfN2VjNjIxODA2MTgwNDZjMGE3MDU2MTFlYWY4N2I4NjEgPSAkKCc8ZGl2IGlkPSJodG1sXzdlYzYyMTgwNjE4MDQ2YzBhNzA1NjExZWFmODdiODYxIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Nb29yZSBQYXJrLCBTdW1tZXJoaWxsIEVhc3QgQ2x1c3RlciA0PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xYzZlNzUzNWE0OWY0NWQ1OWZmZDcwODgwMDZhZDdkNi5zZXRDb250ZW50KGh0bWxfN2VjNjIxODA2MTgwNDZjMGE3MDU2MTFlYWY4N2I4NjEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNWUzZTQ1NGQ5NjZlNGFiM2I1OTc5MGRjYmQzMzVjNjAuYmluZFBvcHVwKHBvcHVwXzFjNmU3NTM1YTQ5ZjQ1ZDU5ZmZkNzA4ODAwNmFkN2Q2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzk2ZjBmMzAwNWJmNzQ1MzZhODRhZjI4ZWY3MmNlZDI4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjg2NDEyMjk5OTk5OTksLTc5LjQwMDA0OTNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAicmVkIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAicmVkIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2IyNmViMGM0OWRlYzQxMjQ4MGRmZTMxYmE3MjY1ZGQ1KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2M1MmYxNjQzY2RjYzQ5ZTBiODYxZjNjZjBhODVlOGYwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzVkZTY1ZGZhYjQwNzQ4YjBhMDU4MjBmZTVlZGI2NWZmID0gJCgnPGRpdiBpZD0iaHRtbF81ZGU2NWRmYWI0MDc0OGIwYTA1ODIwZmU1ZWRiNjVmZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RGVlciBQYXJrLCBGb3Jlc3QgSGlsbCBTRSwgUmF0aG5lbGx5LCBTb3V0aCBIaWxsLCBTdW1tZXJoaWxsIFdlc3QgQ2x1c3RlciAxPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jNTJmMTY0M2NkY2M0OWUwYjg2MWYzY2YwYTg1ZThmMC5zZXRDb250ZW50KGh0bWxfNWRlNjVkZmFiNDA3NDhiMGEwNTgyMGZlNWVkYjY1ZmYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOTZmMGYzMDA1YmY3NDUzNmE4NGFmMjhlZjcyY2VkMjguYmluZFBvcHVwKHBvcHVwX2M1MmYxNjQzY2RjYzQ5ZTBiODYxZjNjZjBhODVlOGYwKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2FkNDU1OTA0OWUzZjQ1MjM4NzU2NTgzZDIzMjkzNmFjID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjc5NTYyNiwtNzkuMzc3NTI5NDAwMDAwMDFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiZ3JlZW4iLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJncmVlbiIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9iMjZlYjBjNDlkZWM0MTI0ODBkZmUzMWJhNzI2NWRkNSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF84MDkzMzk1MDdkN2E0ZGI4YWM0MDNjYTY4MjI5MzA0NCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kNjRlNWNlMDliMzU0ODhjOTNlNWQ1Mjg5ZmE5YWI2NiA9ICQoJzxkaXYgaWQ9Imh0bWxfZDY0ZTVjZTA5YjM1NDg4YzkzZTVkNTI4OWZhOWFiNjYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlJvc2VkYWxlIENsdXN0ZXIgNDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfODA5MzM5NTA3ZDdhNGRiOGFjNDAzY2E2ODIyOTMwNDQuc2V0Q29udGVudChodG1sX2Q2NGU1Y2UwOWIzNTQ4OGM5M2U1ZDUyODlmYTlhYjY2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2FkNDU1OTA0OWUzZjQ1MjM4NzU2NTgzZDIzMjkzNmFjLmJpbmRQb3B1cChwb3B1cF84MDkzMzk1MDdkN2E0ZGI4YWM0MDNjYTY4MjI5MzA0NCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9iZjMwYTNlZGI4NmM0YWZkYWE4Y2NmZDM3YjFiMjk3OCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY2Nzk2NywtNzkuMzY3Njc1M10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJyZWQiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJyZWQiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYjI2ZWIwYzQ5ZGVjNDEyNDgwZGZlMzFiYTcyNjVkZDUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYmMyNjliOWNkNjhhNGM3MGIyOGE3ODkxYzA0ODI1ZjIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOGJmZDZkZTBmNGU4NDk2YTg4ZmNjNjY4NDQwNmRiNzUgPSAkKCc8ZGl2IGlkPSJodG1sXzhiZmQ2ZGUwZjRlODQ5NmE4OGZjYzY2ODQ0MDZkYjc1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DYWJiYWdldG93biwgU3QuIEphbWVzIFRvd24gQ2x1c3RlciAxPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iYzI2OWI5Y2Q2OGE0YzcwYjI4YTc4OTFjMDQ4MjVmMi5zZXRDb250ZW50KGh0bWxfOGJmZDZkZTBmNGU4NDk2YTg4ZmNjNjY4NDQwNmRiNzUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYmYzMGEzZWRiODZjNGFmZGFhOGNjZmQzN2IxYjI5NzguYmluZFBvcHVwKHBvcHVwX2JjMjY5YjljZDY4YTRjNzBiMjhhNzg5MWMwNDgyNWYyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2NiYzAzNzZjYTA3MTQ1MDk5NmZmNzY1NzA2MmExZTU3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjY1ODU5OSwtNzkuMzgzMTU5OTAwMDAwMDFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAicmVkIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAicmVkIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2IyNmViMGM0OWRlYzQxMjQ4MGRmZTMxYmE3MjY1ZGQ1KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzFjYzJmYTA4YmE0NzQ3ODQ5OTQ0ZGQyZDNjYWFkMjczID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzI1ZDAzMGY3NzlkZTQ2MTU4YWJkNTM3MGEwOTUyZmYwID0gJCgnPGRpdiBpZD0iaHRtbF8yNWQwMzBmNzc5ZGU0NjE1OGFiZDUzNzBhMDk1MmZmMCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q2h1cmNoIGFuZCBXZWxsZXNsZXkgQ2x1c3RlciAxPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xY2MyZmEwOGJhNDc0Nzg0OTk0NGRkMmQzY2FhZDI3My5zZXRDb250ZW50KGh0bWxfMjVkMDMwZjc3OWRlNDYxNThhYmQ1MzcwYTA5NTJmZjApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfY2JjMDM3NmNhMDcxNDUwOTk2ZmY3NjU3MDYyYTFlNTcuYmluZFBvcHVwKHBvcHVwXzFjYzJmYTA4YmE0NzQ3ODQ5OTQ0ZGQyZDNjYWFkMjczKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzQwZTQwNmNlODMzOTRiODNiMmUyMTdhNTQ4MzUyNjExID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjU0MjU5OSwtNzkuMzYwNjM1OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJyZWQiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJyZWQiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYjI2ZWIwYzQ5ZGVjNDEyNDgwZGZlMzFiYTcyNjVkZDUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOTI2MGE3Njk3MzgyNGI2MDkyYmIwNzMzMWQ4NGI5NWEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYzBlNjE4ODI0ZGM5NDgzZWIxZjZjMWI5MjdhNzMyZTUgPSAkKCc8ZGl2IGlkPSJodG1sX2MwZTYxODgyNGRjOTQ4M2ViMWY2YzFiOTI3YTczMmU1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5IYXJib3VyZnJvbnQsIFJlZ2VudCBQYXJrIENsdXN0ZXIgMTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOTI2MGE3Njk3MzgyNGI2MDkyYmIwNzMzMWQ4NGI5NWEuc2V0Q29udGVudChodG1sX2MwZTYxODgyNGRjOTQ4M2ViMWY2YzFiOTI3YTczMmU1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzQwZTQwNmNlODMzOTRiODNiMmUyMTdhNTQ4MzUyNjExLmJpbmRQb3B1cChwb3B1cF85MjYwYTc2OTczODI0YjYwOTJiYjA3MzMxZDg0Yjk1YSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mNWIzOTQxZjhiNzA0YTQzYWJkMzM5M2JiODAxN2U2MSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY1NzE2MTgsLTc5LjM3ODkzNzA5OTk5OTk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInJlZCIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogInJlZCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9iMjZlYjBjNDlkZWM0MTI0ODBkZmUzMWJhNzI2NWRkNSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hMzRlZjJiN2EyOGQ0MzM3YWE4NzdkNjc3NTgyMjkxMiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82OTA5MTM3NjNhMGQ0NDU1ODM5MWYzYWQzNmM0OTcxMSA9ICQoJzxkaXYgaWQ9Imh0bWxfNjkwOTEzNzYzYTBkNDQ1NTgzOTFmM2FkMzZjNDk3MTEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlJ5ZXJzb24sIEdhcmRlbiBEaXN0cmljdCBDbHVzdGVyIDE8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2EzNGVmMmI3YTI4ZDQzMzdhYTg3N2Q2Nzc1ODIyOTEyLnNldENvbnRlbnQoaHRtbF82OTA5MTM3NjNhMGQ0NDU1ODM5MWYzYWQzNmM0OTcxMSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9mNWIzOTQxZjhiNzA0YTQzYWJkMzM5M2JiODAxN2U2MS5iaW5kUG9wdXAocG9wdXBfYTM0ZWYyYjdhMjhkNDMzN2FhODc3ZDY3NzU4MjI5MTIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYzU0ZWEyOTMyMTIxNGU1NjhiYTcxM2NlZTQwNWUyMWIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42NTE0OTM5LC03OS4zNzU0MTc5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2IyNmViMGM0OWRlYzQxMjQ4MGRmZTMxYmE3MjY1ZGQ1KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzQ5NTA0OTlmMjA4NjQ4NjE5NjliZjAzNWFiZTM3OTliID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzJkOTU5MWU1MTMzYjQ5YTA4M2YxNjQ4NmEwODdkMmE0ID0gJCgnPGRpdiBpZD0iaHRtbF8yZDk1OTFlNTEzM2I0OWEwODNmMTY0ODZhMDg3ZDJhNCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U3QuIEphbWVzIFRvd24gQ2x1c3RlciAyPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80OTUwNDk5ZjIwODY0ODYxOTY5YmYwMzVhYmUzNzk5Yi5zZXRDb250ZW50KGh0bWxfMmQ5NTkxZTUxMzNiNDlhMDgzZjE2NDg2YTA4N2QyYTQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYzU0ZWEyOTMyMTIxNGU1NjhiYTcxM2NlZTQwNWUyMWIuYmluZFBvcHVwKHBvcHVwXzQ5NTA0OTlmMjA4NjQ4NjE5NjliZjAzNWFiZTM3OTliKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzc2NjNjZTBlYTExNDQ2OTQ5ZjMxNzJmNDhkZWNmODEyID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjQ0NzcwNzk5OTk5OTk2LC03OS4zNzMzMDY0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2IyNmViMGM0OWRlYzQxMjQ4MGRmZTMxYmE3MjY1ZGQ1KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzBhMDI3N2NmZDM3NTQ0ZjlhZTU1OTY5NWJiYWMwYTU4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzU4M2YwMGIxZTFlOTQyN2Q5ZmRjMGY0M2YwNzIzZjlhID0gJCgnPGRpdiBpZD0iaHRtbF81ODNmMDBiMWUxZTk0MjdkOWZkYzBmNDNmMDcyM2Y5YSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QmVyY3p5IFBhcmsgQ2x1c3RlciAyPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wYTAyNzdjZmQzNzU0NGY5YWU1NTk2OTViYmFjMGE1OC5zZXRDb250ZW50KGh0bWxfNTgzZjAwYjFlMWU5NDI3ZDlmZGMwZjQzZjA3MjNmOWEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNzY2M2NlMGVhMTE0NDY5NDlmMzE3MmY0OGRlY2Y4MTIuYmluZFBvcHVwKHBvcHVwXzBhMDI3N2NmZDM3NTQ0ZjlhZTU1OTY5NWJiYWMwYTU4KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzllNWFhZTcxZjZmYTRkZGQ5M2Y1MWY5NjY4MTQ2ZjE5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjU3OTUyNCwtNzkuMzg3MzgyNl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJyZWQiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJyZWQiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYjI2ZWIwYzQ5ZGVjNDEyNDgwZGZlMzFiYTcyNjVkZDUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYzRhMmE2ZGFiNWU1NDE4M2JmZjg1MGVlNjk4OWYyYjUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMjRlNWYyZGM1ZWQ5NGFhZDhlZWRkNGQ5NDg2YzdhNmEgPSAkKCc8ZGl2IGlkPSJodG1sXzI0ZTVmMmRjNWVkOTRhYWQ4ZWVkZDRkOTQ4NmM3YTZhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DZW50cmFsIEJheSBTdHJlZXQgQ2x1c3RlciAxPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jNGEyYTZkYWI1ZTU0MTgzYmZmODUwZWU2OTg5ZjJiNS5zZXRDb250ZW50KGh0bWxfMjRlNWYyZGM1ZWQ5NGFhZDhlZWRkNGQ5NDg2YzdhNmEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOWU1YWFlNzFmNmZhNGRkZDkzZjUxZjk2NjgxNDZmMTkuYmluZFBvcHVwKHBvcHVwX2M0YTJhNmRhYjVlNTQxODNiZmY4NTBlZTY5ODlmMmI1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzMwNzU3OGZlN2MzYTRkNGQ5NTViOTYwNjdjZjVjMTI4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjUwNTcxMjAwMDAwMDEsLTc5LjM4NDU2NzVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYjI2ZWIwYzQ5ZGVjNDEyNDgwZGZlMzFiYTcyNjVkZDUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNjBkNjkxN2Q3YjZmNDYzNWFkNDA4ZWU1NGZhNjk4NTcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOTE0MTY2OGU4NjFlNGJhM2JkYjcxZmFkMmRkMDFiYTMgPSAkKCc8ZGl2IGlkPSJodG1sXzkxNDE2NjhlODYxZTRiYTNiZGI3MWZhZDJkZDAxYmEzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5BZGVsYWlkZSwgS2luZywgUmljaG1vbmQgQ2x1c3RlciAyPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82MGQ2OTE3ZDdiNmY0NjM1YWQ0MDhlZTU0ZmE2OTg1Ny5zZXRDb250ZW50KGh0bWxfOTE0MTY2OGU4NjFlNGJhM2JkYjcxZmFkMmRkMDFiYTMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMzA3NTc4ZmU3YzNhNGQ0ZDk1NWI5NjA2N2NmNWMxMjguYmluZFBvcHVwKHBvcHVwXzYwZDY5MTdkN2I2ZjQ2MzVhZDQwOGVlNTRmYTY5ODU3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2IzYzE2YWEyYjcwYTRlOTY5MWY2NWYxMzY1NzJmMjVmID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjQwODE1NywtNzkuMzgxNzUyMjk5OTk5OTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYjI2ZWIwYzQ5ZGVjNDEyNDgwZGZlMzFiYTcyNjVkZDUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOWJkOTE0N2RmOWIzNGFhOWFhYmMxZjA2ODg2YTExOGIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYTI0NGRhZmVjODhkNDU3YThiMDZmYzliYWZmZGY5YTUgPSAkKCc8ZGl2IGlkPSJodG1sX2EyNDRkYWZlYzg4ZDQ1N2E4YjA2ZmM5YmFmZmRmOWE1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5IYXJib3VyZnJvbnQgRWFzdCwgVG9yb250byBJc2xhbmRzLCBVbmlvbiBTdGF0aW9uIENsdXN0ZXIgMjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOWJkOTE0N2RmOWIzNGFhOWFhYmMxZjA2ODg2YTExOGIuc2V0Q29udGVudChodG1sX2EyNDRkYWZlYzg4ZDQ1N2E4YjA2ZmM5YmFmZmRmOWE1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2IzYzE2YWEyYjcwYTRlOTY5MWY2NWYxMzY1NzJmMjVmLmJpbmRQb3B1cChwb3B1cF85YmQ5MTQ3ZGY5YjM0YWE5YWFiYzFmMDY4ODZhMTE4Yik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85M2QzMjBlZWViNzk0NTY0OTViMDA2YmE4ZTVmZTc3NyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY0NzE3NjgsLTc5LjM4MTU3NjQwMDAwMDAxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2IyNmViMGM0OWRlYzQxMjQ4MGRmZTMxYmE3MjY1ZGQ1KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2NlZWE2N2ZiMjI1ZjRkYWViMzQ5ZjM1NTYxZThlMzE0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzc5NzMxOGMwMWY0ODRmOTg5YjVhMDVlN2Q4MjAxOWRiID0gJCgnPGRpdiBpZD0iaHRtbF83OTczMThjMDFmNDg0Zjk4OWI1YTA1ZTdkODIwMTlkYiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RGVzaWduIEV4Y2hhbmdlLCBUb3JvbnRvIERvbWluaW9uIENlbnRyZSBDbHVzdGVyIDI8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2NlZWE2N2ZiMjI1ZjRkYWViMzQ5ZjM1NTYxZThlMzE0LnNldENvbnRlbnQoaHRtbF83OTczMThjMDFmNDg0Zjk4OWI1YTA1ZTdkODIwMTlkYik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl85M2QzMjBlZWViNzk0NTY0OTViMDA2YmE4ZTVmZTc3Ny5iaW5kUG9wdXAocG9wdXBfY2VlYTY3ZmIyMjVmNGRhZWIzNDlmMzU1NjFlOGUzMTQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMzNiMzVlMjMyZTA3NDY3NDlkNGM3MTc3ZjhkZGRkODUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42NDgxOTg1LC03OS4zNzk4MTY5MDAwMDAwMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9iMjZlYjBjNDlkZWM0MTI0ODBkZmUzMWJhNzI2NWRkNSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wNmU0MTI5YmQyNmM0ZDExYjM1NDRiNDA5ZWY4NzgxYyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kM2RiYTkyZTU1YTM0Yzk3OTA3MDFmNDUyZjA1YjE5YSA9ICQoJzxkaXYgaWQ9Imh0bWxfZDNkYmE5MmU1NWEzNGM5NzkwNzAxZjQ1MmYwNWIxOWEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNvbW1lcmNlIENvdXJ0LCBWaWN0b3JpYSBIb3RlbCBDbHVzdGVyIDI8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzA2ZTQxMjliZDI2YzRkMTFiMzU0NGI0MDllZjg3ODFjLnNldENvbnRlbnQoaHRtbF9kM2RiYTkyZTU1YTM0Yzk3OTA3MDFmNDUyZjA1YjE5YSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8zM2IzNWUyMzJlMDc0Njc0OWQ0YzcxNzdmOGRkZGQ4NS5iaW5kUG9wdXAocG9wdXBfMDZlNDEyOWJkMjZjNGQxMWIzNTQ0YjQwOWVmODc4MWMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMTY1N2Y0ZjRlMmE5NGIxYjgzOGIzMTkwYzc3YWQxNTEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43MzMyODI1LC03OS40MTk3NDk3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImdyZWVuIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiZ3JlZW4iLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYjI2ZWIwYzQ5ZGVjNDEyNDgwZGZlMzFiYTcyNjVkZDUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMmE0YzNiODQ1ODFkNDBmYjlmZWIzODJjNmRlNjRlYjAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMGM0MDhiNTQ2MDExNGY3MWE3NDZhOTZjZDU5N2M2MTEgPSAkKCc8ZGl2IGlkPSJodG1sXzBjNDA4YjU0NjAxMTRmNzFhNzQ2YTk2Y2Q1OTdjNjExIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5CZWRmb3JkIFBhcmssIExhd3JlbmNlIE1hbm9yIEVhc3QgQ2x1c3RlciA0PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yYTRjM2I4NDU4MWQ0MGZiOWZlYjM4MmM2ZGU2NGViMC5zZXRDb250ZW50KGh0bWxfMGM0MDhiNTQ2MDExNGY3MWE3NDZhOTZjZDU5N2M2MTEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMTY1N2Y0ZjRlMmE5NGIxYjgzOGIzMTkwYzc3YWQxNTEuYmluZFBvcHVwKHBvcHVwXzJhNGMzYjg0NTgxZDQwZmI5ZmViMzgyYzZkZTY0ZWIwKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzYwOWU2YmM4Mzk3ZDQxZjZhOGJhMTBmYTM0MDQ3OWQ2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzExNjk0OCwtNzkuNDE2OTM1NTk5OTk5OTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiZ3JlZW4iLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJncmVlbiIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9iMjZlYjBjNDlkZWM0MTI0ODBkZmUzMWJhNzI2NWRkNSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iMjkyYWM3NmY5OWM0NjQ1OGM1NTlmNWU4MDllYzk3NyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hZGE0ZDk1MTE3MDA0MTY2ODMxZWRiODgzYWZiYzAxOSA9ICQoJzxkaXYgaWQ9Imh0bWxfYWRhNGQ5NTExNzAwNDE2NjgzMWVkYjg4M2FmYmMwMTkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlJvc2VsYXduIENsdXN0ZXIgNDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYjI5MmFjNzZmOTljNDY0NThjNTU5ZjVlODA5ZWM5Nzcuc2V0Q29udGVudChodG1sX2FkYTRkOTUxMTcwMDQxNjY4MzFlZGI4ODNhZmJjMDE5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzYwOWU2YmM4Mzk3ZDQxZjZhOGJhMTBmYTM0MDQ3OWQ2LmJpbmRQb3B1cChwb3B1cF9iMjkyYWM3NmY5OWM0NjQ1OGM1NTlmNWU4MDllYzk3Nyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9iNTczMWVkNGJlMzg0NGRiYjI0ZDljNDQ3OWVmOGRkNyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY5Njk0NzYsLTc5LjQxMTMwNzIwMDAwMDAxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImdyZWVuIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiZ3JlZW4iLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYjI2ZWIwYzQ5ZGVjNDEyNDgwZGZlMzFiYTcyNjVkZDUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNTIwMjEwY2M1MDFjNDAxZTk3NDc2Y2E4OWRjMzFhMGMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOWJiMWI5ODk1ODY5NDFjODk4ZDVmOTczNmI2ZjdmZjEgPSAkKCc8ZGl2IGlkPSJodG1sXzliYjFiOTg5NTg2OTQxYzg5OGQ1Zjk3MzZiNmY3ZmYxIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Gb3Jlc3QgSGlsbCBOb3J0aCwgRm9yZXN0IEhpbGwgV2VzdCBDbHVzdGVyIDQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzUyMDIxMGNjNTAxYzQwMWU5NzQ3NmNhODlkYzMxYTBjLnNldENvbnRlbnQoaHRtbF85YmIxYjk4OTU4Njk0MWM4OThkNWY5NzM2YjZmN2ZmMSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9iNTczMWVkNGJlMzg0NGRiYjI0ZDljNDQ3OWVmOGRkNy5iaW5kUG9wdXAocG9wdXBfNTIwMjEwY2M1MDFjNDAxZTk3NDc2Y2E4OWRjMzFhMGMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMWVmMzY3ZGY4MDVmNGNlYWE2YWI5NDlhMTkxYWMzOTYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42NzI3MDk3LC03OS40MDU2Nzg0MDAwMDAwMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJyZWQiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJyZWQiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYjI2ZWIwYzQ5ZGVjNDEyNDgwZGZlMzFiYTcyNjVkZDUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYTBiOTUxYTlhMDZiNDljZjg1NDgwMTU2MDhjMzBlM2UgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfN2FkNWRkNDUwNzBjNDYzMjgyMTljZjBkMWJhNTY1Y2UgPSAkKCc8ZGl2IGlkPSJodG1sXzdhZDVkZDQ1MDcwYzQ2MzI4MjE5Y2YwZDFiYTU2NWNlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5UaGUgQW5uZXgsIE5vcnRoIE1pZHRvd24sIFlvcmt2aWxsZSBDbHVzdGVyIDE8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2EwYjk1MWE5YTA2YjQ5Y2Y4NTQ4MDE1NjA4YzMwZTNlLnNldENvbnRlbnQoaHRtbF83YWQ1ZGQ0NTA3MGM0NjMyODIxOWNmMGQxYmE1NjVjZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8xZWYzNjdkZjgwNWY0Y2VhYTZhYjk0OWExOTFhYzM5Ni5iaW5kUG9wdXAocG9wdXBfYTBiOTUxYTlhMDZiNDljZjg1NDgwMTU2MDhjMzBlM2UpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOTJjYWY2NTdmMDJlNDA2NjgyZGFjNDdjYWQ0ODkxYmQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42NjI2OTU2LC03OS40MDAwNDkzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInJlZCIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogInJlZCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9iMjZlYjBjNDlkZWM0MTI0ODBkZmUzMWJhNzI2NWRkNSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9kZGJkNTRhMWUwMGM0N2Y5ODU0YzZjZmQ4YmY5YjI3NCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF84MDVkMGM2NGRmZTg0OGY1OTI3Yzk2Y2I5Y2JhMjc1MyA9ICQoJzxkaXYgaWQ9Imh0bWxfODA1ZDBjNjRkZmU4NDhmNTkyN2M5NmNiOWNiYTI3NTMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkhhcmJvcmQsIFVuaXZlcnNpdHkgb2YgVG9yb250byBDbHVzdGVyIDE8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2RkYmQ1NGExZTAwYzQ3Zjk4NTRjNmNmZDhiZjliMjc0LnNldENvbnRlbnQoaHRtbF84MDVkMGM2NGRmZTg0OGY1OTI3Yzk2Y2I5Y2JhMjc1Myk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl85MmNhZjY1N2YwMmU0MDY2ODJkYWM0N2NhZDQ4OTFiZC5iaW5kUG9wdXAocG9wdXBfZGRiZDU0YTFlMDBjNDdmOTg1NGM2Y2ZkOGJmOWIyNzQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNTIyNDBlOGFiNGI4NDNhOGI4N2IwYjczNGFiMWI4NzYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42NTMyMDU3LC03OS40MDAwNDkzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIm9yYW5nZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIm9yYW5nZSIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9iMjZlYjBjNDlkZWM0MTI0ODBkZmUzMWJhNzI2NWRkNSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85N2U2YjJlZTg3ZTk0MWIwOThkYjM5YzNhYjExYjY3NSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF81OGRhNzE3NzIxZTY0YTAxOGExNTZkYWRlYzQ5ZmY0YyA9ICQoJzxkaXYgaWQ9Imh0bWxfNThkYTcxNzcyMWU2NGEwMThhMTU2ZGFkZWM0OWZmNGMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNoaW5hdG93biwgR3JhbmdlIFBhcmssIEtlbnNpbmd0b24gTWFya2V0IENsdXN0ZXIgMDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOTdlNmIyZWU4N2U5NDFiMDk4ZGIzOWMzYWIxMWI2NzUuc2V0Q29udGVudChodG1sXzU4ZGE3MTc3MjFlNjRhMDE4YTE1NmRhZGVjNDlmZjRjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzUyMjQwZThhYjRiODQzYThiODdiMGI3MzRhYjFiODc2LmJpbmRQb3B1cChwb3B1cF85N2U2YjJlZTg3ZTk0MWIwOThkYjM5YzNhYjExYjY3NSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9kMDBiYjI3NWVmZWI0MDBmYTkzYjRkODQ2NDQ0MDZmNCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjYyODk0NjcsLTc5LjM5NDQxOTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiZ3JlZW4iLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJncmVlbiIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9iMjZlYjBjNDlkZWM0MTI0ODBkZmUzMWJhNzI2NWRkNSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF84ZjQ4YWQ3NjkyZTU0NWM3ODRjMjYwMGEyZThhOTk2ZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wZTE4ZjA2ZWEzZWE0NjE0YmE0ZDFhYjE1YTBjNDBiMyA9ICQoJzxkaXYgaWQ9Imh0bWxfMGUxOGYwNmVhM2VhNDYxNGJhNGQxYWIxNWEwYzQwYjMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNOIFRvd2VyLCBCYXRodXJzdCBRdWF5LCBJc2xhbmQgYWlycG9ydCwgSGFyYm91cmZyb250IFdlc3QsIEtpbmcgYW5kIFNwYWRpbmEsIFJhaWx3YXkgTGFuZHMsIFNvdXRoIE5pYWdhcmEgQ2x1c3RlciA0PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84ZjQ4YWQ3NjkyZTU0NWM3ODRjMjYwMGEyZThhOTk2ZC5zZXRDb250ZW50KGh0bWxfMGUxOGYwNmVhM2VhNDYxNGJhNGQxYWIxNWEwYzQwYjMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZDAwYmIyNzVlZmViNDAwZmE5M2I0ZDg0NjQ0NDA2ZjQuYmluZFBvcHVwKHBvcHVwXzhmNDhhZDc2OTJlNTQ1Yzc4NGMyNjAwYTJlOGE5OTZkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2U0YWRiMmFjODFmZTQ1ZTJiYTAwYzYzZmI4YjNlOWNlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjQ2NDM1MiwtNzkuMzc0ODQ1OTk5OTk5OTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYjI2ZWIwYzQ5ZGVjNDEyNDgwZGZlMzFiYTcyNjVkZDUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYTA2ZWZkZmY2NTNlNDE1MTkwNjQ5ODlmNzNjYzkxMzEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYzgyNDIxMmFiODY1NDU1ZDkxYzMxYjBmZDE4N2I4NGMgPSAkKCc8ZGl2IGlkPSJodG1sX2M4MjQyMTJhYjg2NTQ1NWQ5MWMzMWIwZmQxODdiODRjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5TdG4gQSBQTyBCb3hlcyAyNSBUaGUgRXNwbGFuYWRlIENsdXN0ZXIgMjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYTA2ZWZkZmY2NTNlNDE1MTkwNjQ5ODlmNzNjYzkxMzEuc2V0Q29udGVudChodG1sX2M4MjQyMTJhYjg2NTQ1NWQ5MWMzMWIwZmQxODdiODRjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2U0YWRiMmFjODFmZTQ1ZTJiYTAwYzYzZmI4YjNlOWNlLmJpbmRQb3B1cChwb3B1cF9hMDZlZmRmZjY1M2U0MTUxOTA2NDk4OWY3M2NjOTEzMSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9hZWRiYWQ5ZTAzNTY0NjQ5YThiMDg4ZDM0NGE0OGFmZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY0ODQyOTIsLTc5LjM4MjI4MDJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYjI2ZWIwYzQ5ZGVjNDEyNDgwZGZlMzFiYTcyNjVkZDUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZDY1MWY1OTZmMzU0NGE2YmJiOWI3MGQwYmQwNGI5MWIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYzY1YjMxZmIwZDhhNDY5NjgwMzU2ZjU4MTkxNWNmY2EgPSAkKCc8ZGl2IGlkPSJodG1sX2M2NWIzMWZiMGQ4YTQ2OTY4MDM1NmY1ODE5MTVjZmNhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5GaXJzdCBDYW5hZGlhbiBQbGFjZSwgVW5kZXJncm91bmQgY2l0eSBDbHVzdGVyIDI8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2Q2NTFmNTk2ZjM1NDRhNmJiYjliNzBkMGJkMDRiOTFiLnNldENvbnRlbnQoaHRtbF9jNjViMzFmYjBkOGE0Njk2ODAzNTZmNTgxOTE1Y2ZjYSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9hZWRiYWQ5ZTAzNTY0NjQ5YThiMDg4ZDM0NGE0OGFmZC5iaW5kUG9wdXAocG9wdXBfZDY1MWY1OTZmMzU0NGE2YmJiOWI3MGQwYmQwNGI5MWIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMzU1YjVkNzZmNTA1NDQwNjgyZTExMDUzZWRiMDMwMDMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43MTg1MTc5OTk5OTk5OTYsLTc5LjQ2NDc2MzI5OTk5OTk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImdyZWVuIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiZ3JlZW4iLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYjI2ZWIwYzQ5ZGVjNDEyNDgwZGZlMzFiYTcyNjVkZDUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYmRjMmVhNzEyNGM4NDdjNTk3Y2FjNjhmOTBmMWIxYTAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNDFhY2VhZDBhYTc4NDA3YThjYTZlMzlmODI0MWVjYWYgPSAkKCc8ZGl2IGlkPSJodG1sXzQxYWNlYWQwYWE3ODQwN2E4Y2E2ZTM5ZjgyNDFlY2FmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5MYXdyZW5jZSBIZWlnaHRzLCBMYXdyZW5jZSBNYW5vciBDbHVzdGVyIDQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2JkYzJlYTcxMjRjODQ3YzU5N2NhYzY4ZjkwZjFiMWEwLnNldENvbnRlbnQoaHRtbF80MWFjZWFkMGFhNzg0MDdhOGNhNmUzOWY4MjQxZWNhZik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8zNTViNWQ3NmY1MDU0NDA2ODJlMTEwNTNlZGIwMzAwMy5iaW5kUG9wdXAocG9wdXBfYmRjMmVhNzEyNGM4NDdjNTk3Y2FjNjhmOTBmMWIxYTApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZTZiMzI2YjRlYTViNDVkYTk2NjlhZTUxZDdlMGE0NzggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43MDk1NzcsLTc5LjQ0NTA3MjU5OTk5OTk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImdyZWVuIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiZ3JlZW4iLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYjI2ZWIwYzQ5ZGVjNDEyNDgwZGZlMzFiYTcyNjVkZDUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfODQ5YTk0OTQ3N2M0NDlhNzg0NzBkMmE5Zjk5YTZkZWEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfM2FjZmI1OGQwMmFiNDE2MmJmMWE2MTEzYzMwMGYzZjUgPSAkKCc8ZGl2IGlkPSJodG1sXzNhY2ZiNThkMDJhYjQxNjJiZjFhNjExM2MzMDBmM2Y1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5HbGVuY2Fpcm4gQ2x1c3RlciA0PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84NDlhOTQ5NDc3YzQ0OWE3ODQ3MGQyYTlmOTlhNmRlYS5zZXRDb250ZW50KGh0bWxfM2FjZmI1OGQwMmFiNDE2MmJmMWE2MTEzYzMwMGYzZjUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZTZiMzI2YjRlYTViNDVkYTk2NjlhZTUxZDdlMGE0NzguYmluZFBvcHVwKHBvcHVwXzg0OWE5NDk0NzdjNDQ5YTc4NDcwZDJhOWY5OWE2ZGVhKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzVjNWM3ZWI4NmFkNDQ2MmNhMmFjNzhkMDhkMzI1MGQ4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjkzNzgxMywtNzkuNDI4MTkxNDAwMDAwMDJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiZ3JlZW4iLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJncmVlbiIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9iMjZlYjBjNDlkZWM0MTI0ODBkZmUzMWJhNzI2NWRkNSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lMWU0MmU1OWFhMTQ0ZGY0ODQ4YmI1NDc0ZGNmNWE1YSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zZmJiMjAyMzhkMDI0NmU1YjU1OGRiMmUwYTY4ZWMwOSA9ICQoJzxkaXYgaWQ9Imh0bWxfM2ZiYjIwMjM4ZDAyNDZlNWI1NThkYjJlMGE2OGVjMDkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkh1bWV3b29kLUNlZGFydmFsZSBDbHVzdGVyIDQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2UxZTQyZTU5YWExNDRkZjQ4NDhiYjU0NzRkY2Y1YTVhLnNldENvbnRlbnQoaHRtbF8zZmJiMjAyMzhkMDI0NmU1YjU1OGRiMmUwYTY4ZWMwOSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81YzVjN2ViODZhZDQ0NjJjYTJhYzc4ZDA4ZDMyNTBkOC5iaW5kUG9wdXAocG9wdXBfZTFlNDJlNTlhYTE0NGRmNDg0OGJiNTQ3NGRjZjVhNWEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNmY0M2ZhYTA0YjNlNDVmMjgzMGJhNmVhMjEyOGJiZmYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42ODkwMjU2LC03OS40NTM1MTJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiZ3JlZW4iLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJncmVlbiIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9iMjZlYjBjNDlkZWM0MTI0ODBkZmUzMWJhNzI2NWRkNSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82YjVhN2E3ZDEwZDU0OGJlYmI4ZTEwMDg5NTUyMzIwNyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lMWJhMWUyNGVlYjM0ZmE2OWI3ZWU5NWJlNmQzZjZkMSA9ICQoJzxkaXYgaWQ9Imh0bWxfZTFiYTFlMjRlZWIzNGZhNjliN2VlOTViZTZkM2Y2ZDEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNhbGVkb25pYS1GYWlyYmFua3MgQ2x1c3RlciA0PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82YjVhN2E3ZDEwZDU0OGJlYmI4ZTEwMDg5NTUyMzIwNy5zZXRDb250ZW50KGh0bWxfZTFiYTFlMjRlZWIzNGZhNjliN2VlOTViZTZkM2Y2ZDEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNmY0M2ZhYTA0YjNlNDVmMjgzMGJhNmVhMjEyOGJiZmYuYmluZFBvcHVwKHBvcHVwXzZiNWE3YTdkMTBkNTQ4YmViYjhlMTAwODk1NTIzMjA3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzZkMzYzNWM3MDlkYzQwMGJhZjIzNjRkODRhZGZiNjljID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjY5NTQyLC03OS40MjI1NjM3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImdyZWVuIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiZ3JlZW4iLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYjI2ZWIwYzQ5ZGVjNDEyNDgwZGZlMzFiYTcyNjVkZDUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNTgxMGNlZWIxNjFjNDM1Mjk5MjM5ZWQyMDY5MDExYWIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOTdjMGZiN2I1MjVlNDlkOTkzZTlkMjFlYWYzYjgxMjEgPSAkKCc8ZGl2IGlkPSJodG1sXzk3YzBmYjdiNTI1ZTQ5ZDk5M2U5ZDIxZWFmM2I4MTIxIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DaHJpc3RpZSBDbHVzdGVyIDQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzU4MTBjZWViMTYxYzQzNTI5OTIzOWVkMjA2OTAxMWFiLnNldENvbnRlbnQoaHRtbF85N2MwZmI3YjUyNWU0OWQ5OTNlOWQyMWVhZjNiODEyMSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl82ZDM2MzVjNzA5ZGM0MDBiYWYyMzY0ZDg0YWRmYjY5Yy5iaW5kUG9wdXAocG9wdXBfNTgxMGNlZWIxNjFjNDM1Mjk5MjM5ZWQyMDY5MDExYWIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNmIzY2RhODc3YWVjNDc3MGEzZDU1OWU2NTQ1Y2I5YTEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42NjkwMDUxMDAwMDAwMSwtNzkuNDQyMjU5M10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJncmVlbiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImdyZWVuIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2IyNmViMGM0OWRlYzQxMjQ4MGRmZTMxYmE3MjY1ZGQ1KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzAwMGM2ZmQ5MmIyNTRiNGFhOTllYjg1ZjI1ZjUwMDAxID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzBlODAxOGUzODI2YTRjOGJhZjA3ZmZlOGYyYTdiYmFhID0gJCgnPGRpdiBpZD0iaHRtbF8wZTgwMThlMzgyNmE0YzhiYWYwN2ZmZThmMmE3YmJhYSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RG92ZXJjb3VydCBWaWxsYWdlLCBEdWZmZXJpbiBDbHVzdGVyIDQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzAwMGM2ZmQ5MmIyNTRiNGFhOTllYjg1ZjI1ZjUwMDAxLnNldENvbnRlbnQoaHRtbF8wZTgwMThlMzgyNmE0YzhiYWYwN2ZmZThmMmE3YmJhYSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl82YjNjZGE4NzdhZWM0NzcwYTNkNTU5ZTY1NDVjYjlhMS5iaW5kUG9wdXAocG9wdXBfMDAwYzZmZDkyYjI1NGI0YWE5OWViODVmMjVmNTAwMDEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfM2NjNWEwZTQwNmNhNDY3Mjk0ZWQzMjdlYjg5NmQ4OGIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42NDc5MjY3MDAwMDAwMDYsLTc5LjQxOTc0OTddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAib3JhbmdlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAib3JhbmdlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2IyNmViMGM0OWRlYzQxMjQ4MGRmZTMxYmE3MjY1ZGQ1KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzhkZTJlMzQxODdmNDQ2NTBiYjYzNTMwYWQzMzI4N2NiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2I1MjYwMzNjZDRiMTQ4NjY5OTE0ZDliZmNiNDE3NTAwID0gJCgnPGRpdiBpZD0iaHRtbF9iNTI2MDMzY2Q0YjE0ODY2OTkxNGQ5YmZjYjQxNzUwMCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TGl0dGxlIFBvcnR1Z2FsLCBUcmluaXR5IENsdXN0ZXIgMDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOGRlMmUzNDE4N2Y0NDY1MGJiNjM1MzBhZDMzMjg3Y2Iuc2V0Q29udGVudChodG1sX2I1MjYwMzNjZDRiMTQ4NjY5OTE0ZDliZmNiNDE3NTAwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzNjYzVhMGU0MDZjYTQ2NzI5NGVkMzI3ZWI4OTZkODhiLmJpbmRQb3B1cChwb3B1cF84ZGUyZTM0MTg3ZjQ0NjUwYmI2MzUzMGFkMzMyODdjYik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lNDEwMmMyM2JlMDY0MjcwYmY1ZjhmYzVmZTVkODgzYSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjYzNjg0NzIsLTc5LjQyODE5MTQwMDAwMDAyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInJlZCIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogInJlZCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9iMjZlYjBjNDlkZWM0MTI0ODBkZmUzMWJhNzI2NWRkNSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9kMTA2NzA3OWEyYTY0OWRmOTkzZTNlMDhiMDFjYjUyNyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hYjg3MTNiY2Q2YTc0ZGU2OTc5Y2ZhNWZmNGU4NTQ4MiA9ICQoJzxkaXYgaWQ9Imh0bWxfYWI4NzEzYmNkNmE3NGRlNjk3OWNmYTVmZjRlODU0ODIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkJyb2NrdG9uLCBFeGhpYml0aW9uIFBsYWNlLCBQYXJrZGFsZSBWaWxsYWdlIENsdXN0ZXIgMTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZDEwNjcwNzlhMmE2NDlkZjk5M2UzZTA4YjAxY2I1Mjcuc2V0Q29udGVudChodG1sX2FiODcxM2JjZDZhNzRkZTY5NzljZmE1ZmY0ZTg1NDgyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2U0MTAyYzIzYmUwNjQyNzBiZjVmOGZjNWZlNWQ4ODNhLmJpbmRQb3B1cChwb3B1cF9kMTA2NzA3OWEyYTY0OWRmOTkzZTNlMDhiMDFjYjUyNyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl83MTUzNjc5NGU3MTY0Y2U2YTRmZjM3ZmJhNjc4NWY0NiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjcxMzc1NjIwMDAwMDAwNiwtNzkuNDkwMDczOF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJncmVlbiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImdyZWVuIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2IyNmViMGM0OWRlYzQxMjQ4MGRmZTMxYmE3MjY1ZGQ1KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2FlOTZlZDNmYmUyZTRlMDJiM2I3ODNkZTRmZjIwZjkzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzBhNmU2M2M1MmE5MDRlYTc4Zjg2ZDMyZGQyYTI5NmZmID0gJCgnPGRpdiBpZD0iaHRtbF8wYTZlNjNjNTJhOTA0ZWE3OGY4NmQzMmRkMmEyOTZmZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TWFwbGUgTGVhZiBQYXJrLCBOb3J0aCBQYXJrLCBVcHdvb2QgUGFyayBDbHVzdGVyIDQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2FlOTZlZDNmYmUyZTRlMDJiM2I3ODNkZTRmZjIwZjkzLnNldENvbnRlbnQoaHRtbF8wYTZlNjNjNTJhOTA0ZWE3OGY4NmQzMmRkMmEyOTZmZik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl83MTUzNjc5NGU3MTY0Y2U2YTRmZjM3ZmJhNjc4NWY0Ni5iaW5kUG9wdXAocG9wdXBfYWU5NmVkM2ZiZTJlNGUwMmIzYjc4M2RlNGZmMjBmOTMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNDhiZjEyNmU5Zjc0NGMwNjg3YzQ1NjQ4OTIxZmE1ZWYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42OTExMTU4LC03OS40NzYwMTMyOTk5OTk5OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJncmVlbiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImdyZWVuIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2IyNmViMGM0OWRlYzQxMjQ4MGRmZTMxYmE3MjY1ZGQ1KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzhmYjA5M2EzNWJjMjQ5NmI5OGZmOTNmNDMzNmRhNWYzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2M5YzVkYzg1NzZiZDQ5MTc4OTYwY2Y2MzY4Nzg3NDNkID0gJCgnPGRpdiBpZD0iaHRtbF9jOWM1ZGM4NTc2YmQ0OTE3ODk2MGNmNjM2ODc4NzQzZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RGVsIFJheSwgS2VlbGVzZGFsZSwgTW91bnQgRGVubmlzLCBTaWx2ZXJ0aG9ybiBDbHVzdGVyIDQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzhmYjA5M2EzNWJjMjQ5NmI5OGZmOTNmNDMzNmRhNWYzLnNldENvbnRlbnQoaHRtbF9jOWM1ZGM4NTc2YmQ0OTE3ODk2MGNmNjM2ODc4NzQzZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl80OGJmMTI2ZTlmNzQ0YzA2ODdjNDU2NDg5MjFmYTVlZi5iaW5kUG9wdXAocG9wdXBfOGZiMDkzYTM1YmMyNDk2Yjk4ZmY5M2Y0MzM2ZGE1ZjMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZDVhMWU1NjRiZmMxNGEyMjliOTllZmMyNzE4NzQ0YmEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42NzMxODUyOTk5OTk5OSwtNzkuNDg3MjYxOTAwMDAwMDFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiZ3JlZW4iLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJncmVlbiIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9iMjZlYjBjNDlkZWM0MTI0ODBkZmUzMWJhNzI2NWRkNSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF84OGIyZThlMzQ1ZGU0MzMxOGQ0NTllYWQ0Y2M5MjAzOSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lOTgyNzFkMGIxOWY0YTg2OThkMmJmZWFhYWQzNGQxYiA9ICQoJzxkaXYgaWQ9Imh0bWxfZTk4MjcxZDBiMTlmNGE4Njk4ZDJiZmVhYWFkMzRkMWIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlRoZSBKdW5jdGlvbiBOb3J0aCwgUnVubnltZWRlIENsdXN0ZXIgNDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfODhiMmU4ZTM0NWRlNDMzMThkNDU5ZWFkNGNjOTIwMzkuc2V0Q29udGVudChodG1sX2U5ODI3MWQwYjE5ZjRhODY5OGQyYmZlYWFhZDM0ZDFiKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2Q1YTFlNTY0YmZjMTRhMjI5Yjk5ZWZjMjcxODc0NGJhLmJpbmRQb3B1cChwb3B1cF84OGIyZThlMzQ1ZGU0MzMxOGQ0NTllYWQ0Y2M5MjAzOSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8wMjZjODM4NThkZDM0NmYzOTU0ODBkYTRlMmQ3NDhjYSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY2MTYwODMsLTc5LjQ2NDc2MzI5OTk5OTk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIm9yYW5nZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIm9yYW5nZSIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9iMjZlYjBjNDlkZWM0MTI0ODBkZmUzMWJhNzI2NWRkNSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF84ODE4NzQxYTVlMzI0N2ViOTk3MDQzOWU4YTUwNDU3OCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hMTZmY2JhMWE4MzY0OGRhOTlmMTU3ODA2ZTZmZTdiNyA9ICQoJzxkaXYgaWQ9Imh0bWxfYTE2ZmNiYTFhODM2NDhkYTk5ZjE1NzgwNmU2ZmU3YjciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkhpZ2ggUGFyaywgVGhlIEp1bmN0aW9uIFNvdXRoIENsdXN0ZXIgMDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfODgxODc0MWE1ZTMyNDdlYjk5NzA0MzllOGE1MDQ1Nzguc2V0Q29udGVudChodG1sX2ExNmZjYmExYTgzNjQ4ZGE5OWYxNTc4MDZlNmZlN2I3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzAyNmM4Mzg1OGRkMzQ2ZjM5NTQ4MGRhNGUyZDc0OGNhLmJpbmRQb3B1cChwb3B1cF84ODE4NzQxYTVlMzI0N2ViOTk3MDQzOWU4YTUwNDU3OCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9kMmQ0MWE4ZGMzNzk0ZTQ1ODFjYWY4ODMyMGYyYzU2ZiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY0ODk1OTcsLTc5LjQ1NjMyNV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJvcmFuZ2UiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJvcmFuZ2UiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYjI2ZWIwYzQ5ZGVjNDEyNDgwZGZlMzFiYTcyNjVkZDUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMjhiNmJhOGYxMjAyNDA2MTkxNmQ3OGZlNTI3YjJlNGUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMzJkMWNjZWMxNWE3NGU2MTlhMjEyZWM5MTkwZDczZjggPSAkKCc8ZGl2IGlkPSJodG1sXzMyZDFjY2VjMTVhNzRlNjE5YTIxMmVjOTE5MGQ3M2Y4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5QYXJrZGFsZSwgUm9uY2VzdmFsbGVzIENsdXN0ZXIgMDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMjhiNmJhOGYxMjAyNDA2MTkxNmQ3OGZlNTI3YjJlNGUuc2V0Q29udGVudChodG1sXzMyZDFjY2VjMTVhNzRlNjE5YTIxMmVjOTE5MGQ3M2Y4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2QyZDQxYThkYzM3OTRlNDU4MWNhZjg4MzIwZjJjNTZmLmJpbmRQb3B1cChwb3B1cF8yOGI2YmE4ZjEyMDI0MDYxOTE2ZDc4ZmU1MjdiMmU0ZSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8zZWY2MGU0NzNjMGI0YmFiYmI2ZTMwNGM1ODgyOTQyYSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY1MTU3MDYsLTc5LjQ4NDQ0OTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAicmVkIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAicmVkIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2IyNmViMGM0OWRlYzQxMjQ4MGRmZTMxYmE3MjY1ZGQ1KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzA0ZjZmZjI3NmI1ZDRmMGRhNTgxNGFlMWUxNDM2ZjZiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2M1Yjc3ZWY3YzM0NDRiMDQ4ZDNjYjcwZDkxZjgwNTM0ID0gJCgnPGRpdiBpZD0iaHRtbF9jNWI3N2VmN2MzNDQ0YjA0OGQzY2I3MGQ5MWY4MDUzNCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UnVubnltZWRlLCBTd2Fuc2VhIENsdXN0ZXIgMTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMDRmNmZmMjc2YjVkNGYwZGE1ODE0YWUxZTE0MzZmNmIuc2V0Q29udGVudChodG1sX2M1Yjc3ZWY3YzM0NDRiMDQ4ZDNjYjcwZDkxZjgwNTM0KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzNlZjYwZTQ3M2MwYjRiYWJiYjZlMzA0YzU4ODI5NDJhLmJpbmRQb3B1cChwb3B1cF8wNGY2ZmYyNzZiNWQ0ZjBkYTU4MTRhZTFlMTQzNmY2Yik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl82NDNiNDAwNGFjMDg0MzE3Yjk4MDA5MGY2NGE5MzhjOCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY2MjMwMTUsLTc5LjM4OTQ5MzhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAicmVkIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAicmVkIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2IyNmViMGM0OWRlYzQxMjQ4MGRmZTMxYmE3MjY1ZGQ1KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2EyNGVmZTc1ZmNmODQ4NGRiODhmNmZjNzc3NjA0NThiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2Q3ZGM5OTZkZTg5OTRjNzU5YWI2NjMyZDhmZDMzNWU1ID0gJCgnPGRpdiBpZD0iaHRtbF9kN2RjOTk2ZGU4OTk0Yzc1OWFiNjYzMmQ4ZmQzMzVlNSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UXVlZW4mIzM5O3MgUGFyayBDbHVzdGVyIDE8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2EyNGVmZTc1ZmNmODQ4NGRiODhmNmZjNzc3NjA0NThiLnNldENvbnRlbnQoaHRtbF9kN2RjOTk2ZGU4OTk0Yzc1OWFiNjYzMmQ4ZmQzMzVlNSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl82NDNiNDAwNGFjMDg0MzE3Yjk4MDA5MGY2NGE5MzhjOC5iaW5kUG9wdXAocG9wdXBfYTI0ZWZlNzVmY2Y4NDg0ZGI4OGY2ZmM3Nzc2MDQ1OGIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYjkxOGNhNGU0YjUyNDkyZDk3ZjA3ZWI3ZjM2YTRkMGQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42MzY5NjU2LC03OS42MTU4MTg5OTk5OTk5OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJncmVlbiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImdyZWVuIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2IyNmViMGM0OWRlYzQxMjQ4MGRmZTMxYmE3MjY1ZGQ1KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzgyNGI0M2ZiMjY1ODQxZjQ4Y2YwMTE3OWQwZmQwMmVhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2VhODNkZWIyZmFiMzRiNDViOTU3ODAxYWY1Njg3Y2MxID0gJCgnPGRpdiBpZD0iaHRtbF9lYTgzZGViMmZhYjM0YjQ1Yjk1NzgwMWFmNTY4N2NjMSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q2FuYWRhIFBvc3QgR2F0ZXdheSBQcm9jZXNzaW5nIENlbnRyZSBDbHVzdGVyIDQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzgyNGI0M2ZiMjY1ODQxZjQ4Y2YwMTE3OWQwZmQwMmVhLnNldENvbnRlbnQoaHRtbF9lYTgzZGViMmZhYjM0YjQ1Yjk1NzgwMWFmNTY4N2NjMSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9iOTE4Y2E0ZTRiNTI0OTJkOTdmMDdlYjdmMzZhNGQwZC5iaW5kUG9wdXAocG9wdXBfODI0YjQzZmIyNjU4NDFmNDhjZjAxMTc5ZDBmZDAyZWEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMjUyNWQ3NTViMmM0NGQ4ODhlMGY0YjA5Mzk2NWI1OGUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42NjI3NDM5LC03OS4zMjE1NThdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiZ3JlZW4iLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJncmVlbiIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9iMjZlYjBjNDlkZWM0MTI0ODBkZmUzMWJhNzI2NWRkNSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82NDFhZmY4MWIzNjQ0MmU4OGQzOTNiMGE3M2FiODI1NyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zYWQzMGNhNTVmNmM0ZjJiODI5YjdiODZlOGE1NjkyZSA9ICQoJzxkaXYgaWQ9Imh0bWxfM2FkMzBjYTU1ZjZjNGYyYjgyOWI3Yjg2ZThhNTY5MmUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkJ1c2luZXNzIFJlcGx5IE1haWwgUHJvY2Vzc2luZyBDZW50cmUgOTY5IEVhc3Rlcm4gQ2x1c3RlciA0PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82NDFhZmY4MWIzNjQ0MmU4OGQzOTNiMGE3M2FiODI1Ny5zZXRDb250ZW50KGh0bWxfM2FkMzBjYTU1ZjZjNGYyYjgyOWI3Yjg2ZThhNTY5MmUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMjUyNWQ3NTViMmM0NGQ4ODhlMGY0YjA5Mzk2NWI1OGUuYmluZFBvcHVwKHBvcHVwXzY0MWFmZjgxYjM2NDQyZTg4ZDM5M2IwYTczYWI4MjU3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzYwMWIyZTZkNzRjMjQyYTdhY2UxOWQwNGE0NmZmYTk5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjA1NjQ2NiwtNzkuNTAxMzIwNzAwMDAwMDFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiZ3JlZW4iLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJncmVlbiIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9iMjZlYjBjNDlkZWM0MTI0ODBkZmUzMWJhNzI2NWRkNSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8yMDc2Njc2ZThlMDg0NTRmYWFmNDA4OWU1MzE3YWI5MyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iZmE0M2EzN2Q4MTY0MzlkOTYzZTkzNjFhY2UwNzE3ZCA9ICQoJzxkaXYgaWQ9Imh0bWxfYmZhNDNhMzdkODE2NDM5ZDk2M2U5MzYxYWNlMDcxN2QiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkh1bWJlciBCYXkgU2hvcmVzLCBNaW1pY28gU291dGgsIE5ldyBUb3JvbnRvIENsdXN0ZXIgNDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMjA3NjY3NmU4ZTA4NDU0ZmFhZjQwODllNTMxN2FiOTMuc2V0Q29udGVudChodG1sX2JmYTQzYTM3ZDgxNjQzOWQ5NjNlOTM2MWFjZTA3MTdkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzYwMWIyZTZkNzRjMjQyYTdhY2UxOWQwNGE0NmZmYTk5LmJpbmRQb3B1cChwb3B1cF8yMDc2Njc2ZThlMDg0NTRmYWFmNDA4OWU1MzE3YWI5Myk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8wMGU3MDMxMmZmNDk0N2MwYTAxYmUyMTIxNmQwNTc3ZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjYwMjQxMzcwMDAwMDAxLC03OS41NDM0ODQwOTk5OTk5OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJncmVlbiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImdyZWVuIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2IyNmViMGM0OWRlYzQxMjQ4MGRmZTMxYmE3MjY1ZGQ1KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2FjNDZhMjA1MzE2MDQ2MGI4YzA4ZDg2ZTE5NGM0OGFmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2Y0YzBiY2IwN2Y1MDQ0YmZhNWYyMmUwZTAxYzFkNmQ0ID0gJCgnPGRpdiBpZD0iaHRtbF9mNGMwYmNiMDdmNTA0NGJmYTVmMjJlMGUwMWMxZDZkNCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QWxkZXJ3b29kLCBMb25nIEJyYW5jaCBDbHVzdGVyIDQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2FjNDZhMjA1MzE2MDQ2MGI4YzA4ZDg2ZTE5NGM0OGFmLnNldENvbnRlbnQoaHRtbF9mNGMwYmNiMDdmNTA0NGJmYTVmMjJlMGUwMWMxZDZkNCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8wMGU3MDMxMmZmNDk0N2MwYTAxYmUyMTIxNmQwNTc3ZC5iaW5kUG9wdXAocG9wdXBfYWM0NmEyMDUzMTYwNDYwYjhjMDhkODZlMTk0YzQ4YWYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMmJhZTZmZWIyMzU4NDc4NDliYmRjOGYyOGFhNGFmNjIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42NTM2NTM2MDAwMDAwMDUsLTc5LjUwNjk0MzZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiZ3JlZW4iLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJncmVlbiIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9iMjZlYjBjNDlkZWM0MTI0ODBkZmUzMWJhNzI2NWRkNSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xZGRhMzEzNjY1MDU0ZjFiOTQzNWQwZjQ1YjlmOGMzMiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mNmU5NWFlYWM2MmI0ZjRmODE4ZWNhNjgyNjI3NGQ3MyA9ICQoJzxkaXYgaWQ9Imh0bWxfZjZlOTVhZWFjNjJiNGY0ZjgxOGVjYTY4MjYyNzRkNzMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlRoZSBLaW5nc3dheSwgTW9udGdvbWVyeSBSb2FkLCBPbGQgTWlsbCBOb3J0aCBDbHVzdGVyIDQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzFkZGEzMTM2NjUwNTRmMWI5NDM1ZDBmNDViOWY4YzMyLnNldENvbnRlbnQoaHRtbF9mNmU5NWFlYWM2MmI0ZjRmODE4ZWNhNjgyNjI3NGQ3Myk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8yYmFlNmZlYjIzNTg0Nzg0OWJiZGM4ZjI4YWE0YWY2Mi5iaW5kUG9wdXAocG9wdXBfMWRkYTMxMzY2NTA1NGYxYjk0MzVkMGY0NWI5ZjhjMzIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNmI4MDgyODllOGY5NDZlM2EwODJiMjU3N2IwYjFmZGIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42MzYyNTc5LC03OS40OTg1MDkwOTk5OTk5OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJncmVlbiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImdyZWVuIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2IyNmViMGM0OWRlYzQxMjQ4MGRmZTMxYmE3MjY1ZGQ1KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2JkYjVlYTE2ZGM5MDQwNGJiMDM5ZTI5OWU5ZjgzMjNiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzNiNTEyYzA4YzBiZjQzMGM4NDcyYjhlZGJmN2Y0OWQzID0gJCgnPGRpdiBpZD0iaHRtbF8zYjUxMmMwOGMwYmY0MzBjODQ3MmI4ZWRiZjdmNDlkMyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+SHVtYmVyIEJheSwgS2luZyYjMzk7cyBNaWxsIFBhcmssIEtpbmdzd2F5IFBhcmsgU291dGggRWFzdCwgTWltaWNvIE5FLCBPbGQgTWlsbCBTb3V0aCwgVGhlIFF1ZWVuc3dheSBFYXN0LCBSb3lhbCBZb3JrIFNvdXRoIEVhc3QsIFN1bm55bGVhIENsdXN0ZXIgNDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYmRiNWVhMTZkYzkwNDA0YmIwMzllMjk5ZTlmODMyM2Iuc2V0Q29udGVudChodG1sXzNiNTEyYzA4YzBiZjQzMGM4NDcyYjhlZGJmN2Y0OWQzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzZiODA4Mjg5ZThmOTQ2ZTNhMDgyYjI1NzdiMGIxZmRiLmJpbmRQb3B1cChwb3B1cF9iZGI1ZWExNmRjOTA0MDRiYjAzOWUyOTllOWY4MzIzYik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9kN2M5YzY2MzA3MzU0MjA4YjIwMTAzNDZkZjY2MDdiNCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjYyODg0MDgsLTc5LjUyMDk5OTQwMDAwMDAxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImdyZWVuIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiZ3JlZW4iLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYjI2ZWIwYzQ5ZGVjNDEyNDgwZGZlMzFiYTcyNjVkZDUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYmE0ODRkOTNmNzIxNDExYmFiMTE1YzdiYjg4NTRmNGQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYWRiYTg5MDlhOTMxNDFiMWJmN2IwOTZmODQ2Zjc1MDQgPSAkKCc8ZGl2IGlkPSJodG1sX2FkYmE4OTA5YTkzMTQxYjFiZjdiMDk2Zjg0NmY3NTA0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5LaW5nc3dheSBQYXJrIFNvdXRoIFdlc3QsIE1pbWljbyBOVywgVGhlIFF1ZWVuc3dheSBXZXN0LCBSb3lhbCBZb3JrIFNvdXRoIFdlc3QsIFNvdXRoIG9mIEJsb29yIENsdXN0ZXIgNDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYmE0ODRkOTNmNzIxNDExYmFiMTE1YzdiYjg4NTRmNGQuc2V0Q29udGVudChodG1sX2FkYmE4OTA5YTkzMTQxYjFiZjdiMDk2Zjg0NmY3NTA0KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2Q3YzljNjYzMDczNTQyMDhiMjAxMDM0NmRmNjYwN2I0LmJpbmRQb3B1cChwb3B1cF9iYTQ4NGQ5M2Y3MjE0MTFiYWIxMTVjN2JiODg1NGY0ZCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lZTRhZDdkNWE5Mjk0NDM1YWJhZmM2Mzg3ZjRiN2UzMCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY2Nzg1NTYsLTc5LjUzMjI0MjQwMDAwMDAyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImdyZWVuIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiZ3JlZW4iLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYjI2ZWIwYzQ5ZGVjNDEyNDgwZGZlMzFiYTcyNjVkZDUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfODM0NmJhNzk0N2M5NDY4Njg3MjM4NjY5NWQyY2YwMTIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYmZmN2FmMjFkOGU2NDhjYjhmMzI0ZTdmOWExZjJkZjMgPSAkKCc8ZGl2IGlkPSJodG1sX2JmZjdhZjIxZDhlNjQ4Y2I4ZjMyNGU3ZjlhMWYyZGYzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Jc2xpbmd0b24gQXZlbnVlIENsdXN0ZXIgNDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfODM0NmJhNzk0N2M5NDY4Njg3MjM4NjY5NWQyY2YwMTIuc2V0Q29udGVudChodG1sX2JmZjdhZjIxZDhlNjQ4Y2I4ZjMyNGU3ZjlhMWYyZGYzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2VlNGFkN2Q1YTkyOTQ0MzVhYmFmYzYzODdmNGI3ZTMwLmJpbmRQb3B1cChwb3B1cF84MzQ2YmE3OTQ3Yzk0Njg2ODcyMzg2Njk1ZDJjZjAxMik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9kZDQ1NjQwYTc0MDU0NjJjOGMxYzk2NTc4OWQ4NWY2MyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY1MDk0MzIsLTc5LjU1NDcyNDQwMDAwMDAxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImdyZWVuIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiZ3JlZW4iLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYjI2ZWIwYzQ5ZGVjNDEyNDgwZGZlMzFiYTcyNjVkZDUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYzZlODE4NmYyMGJlNGNhMGE3YjlkZjI5N2YzNGE5ZjkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfY2E5ZjZlMGMxZmUwNGNlZThkZGMxOGRiNmUxZGY4OTAgPSAkKCc8ZGl2IGlkPSJodG1sX2NhOWY2ZTBjMWZlMDRjZWU4ZGRjMThkYjZlMWRmODkwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DbG92ZXJkYWxlLCBJc2xpbmd0b24sIE1hcnRpbiBHcm92ZSwgUHJpbmNlc3MgR2FyZGVucywgV2VzdCBEZWFuZSBQYXJrIENsdXN0ZXIgNDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYzZlODE4NmYyMGJlNGNhMGE3YjlkZjI5N2YzNGE5Zjkuc2V0Q29udGVudChodG1sX2NhOWY2ZTBjMWZlMDRjZWU4ZGRjMThkYjZlMWRmODkwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2RkNDU2NDBhNzQwNTQ2MmM4YzFjOTY1Nzg5ZDg1ZjYzLmJpbmRQb3B1cChwb3B1cF9jNmU4MTg2ZjIwYmU0Y2EwYTdiOWRmMjk3ZjM0YTlmOSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jNGYyMzk3NGY2YTg0OTMyYTE2MTJlZTgzMmFlMWNiOSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY0MzUxNTIsLTc5LjU3NzIwMDc5OTk5OTk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImdyZWVuIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiZ3JlZW4iLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYjI2ZWIwYzQ5ZGVjNDEyNDgwZGZlMzFiYTcyNjVkZDUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZWIyMDI0YzU4M2M1NGJjZmIxZWJjYjdjZGFlZTI5YjIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNjgwMjgzMjI4ZWRhNDBlMDlmOTZkZTljZGM0YmFmZjQgPSAkKCc8ZGl2IGlkPSJodG1sXzY4MDI4MzIyOGVkYTQwZTA5Zjk2ZGU5Y2RjNGJhZmY0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5CbG9vcmRhbGUgR2FyZGVucywgRXJpbmdhdGUsIE1hcmtsYW5kIFdvb2QsIE9sZCBCdXJuaGFtdGhvcnBlIENsdXN0ZXIgNDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZWIyMDI0YzU4M2M1NGJjZmIxZWJjYjdjZGFlZTI5YjIuc2V0Q29udGVudChodG1sXzY4MDI4MzIyOGVkYTQwZTA5Zjk2ZGU5Y2RjNGJhZmY0KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2M0ZjIzOTc0ZjZhODQ5MzJhMTYxMmVlODMyYWUxY2I5LmJpbmRQb3B1cChwb3B1cF9lYjIwMjRjNTgzYzU0YmNmYjFlYmNiN2NkYWVlMjliMik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl80NWIxYjRhOWJkMGE0NDJkYjU0NDA2Y2MwZmNlZGJhYiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjc1NjMwMzMsLTc5LjU2NTk2MzI5OTk5OTk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImdyZWVuIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiZ3JlZW4iLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYjI2ZWIwYzQ5ZGVjNDEyNDgwZGZlMzFiYTcyNjVkZDUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMWQxNGRkNDNjMjhhNDk0ZWE3MTBlZWIzOWZlOTY0OTYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYTk5ZGU5N2ExMjNlNDI3ZmFjNjFhNWQxMDQ1ZDc1MDAgPSAkKCc8ZGl2IGlkPSJodG1sX2E5OWRlOTdhMTIzZTQyN2ZhYzYxYTVkMTA0NWQ3NTAwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5IdW1iZXIgU3VtbWl0IENsdXN0ZXIgNDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMWQxNGRkNDNjMjhhNDk0ZWE3MTBlZWIzOWZlOTY0OTYuc2V0Q29udGVudChodG1sX2E5OWRlOTdhMTIzZTQyN2ZhYzYxYTVkMTA0NWQ3NTAwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzQ1YjFiNGE5YmQwYTQ0MmRiNTQ0MDZjYzBmY2VkYmFiLmJpbmRQb3B1cChwb3B1cF8xZDE0ZGQ0M2MyOGE0OTRlYTcxMGVlYjM5ZmU5NjQ5Nik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8zYmYyNDc4ODk5NTA0Mzc1ODQxOTM0MzFkZmVhOGNmOCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjcyNDc2NTksLTc5LjUzMjI0MjQwMDAwMDAyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImdyZWVuIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiZ3JlZW4iLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYjI2ZWIwYzQ5ZGVjNDEyNDgwZGZlMzFiYTcyNjVkZDUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNDY5ZDYyMjgxNzYxNDQwYzg4MjdmNmM1ZTU2YjZiMGMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOTJhZGUxYmU2MGM5NGU5MzhmYWFhMWIwZDAwNjliZTYgPSAkKCc8ZGl2IGlkPSJodG1sXzkyYWRlMWJlNjBjOTRlOTM4ZmFhYTFiMGQwMDY5YmU2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5FbWVyeSwgSHVtYmVybGVhIENsdXN0ZXIgNDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNDY5ZDYyMjgxNzYxNDQwYzg4MjdmNmM1ZTU2YjZiMGMuc2V0Q29udGVudChodG1sXzkyYWRlMWJlNjBjOTRlOTM4ZmFhYTFiMGQwMDY5YmU2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzNiZjI0Nzg4OTk1MDQzNzU4NDE5MzQzMWRmZWE4Y2Y4LmJpbmRQb3B1cChwb3B1cF80NjlkNjIyODE3NjE0NDBjODgyN2Y2YzVlNTZiNmIwYyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl82Zjk2ZjhhM2U2OTQ0NmNjYjAxOTA3YzIxZTYxMDhhYSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjcwNjg3NiwtNzkuNTE4MTg4NDAwMDAwMDFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiZ3JlZW4iLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJncmVlbiIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9iMjZlYjBjNDlkZWM0MTI0ODBkZmUzMWJhNzI2NWRkNSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8yMzk5MzBjYzgyOTc0MTQxYmZjMGUwYzVhMTdlYWZmMiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF81ZTRmZGZkY2FlYjY0YzM2YWU1MjI1YTRhMjQwZDJjYSA9ICQoJzxkaXYgaWQ9Imh0bWxfNWU0ZmRmZGNhZWI2NGMzNmFlNTIyNWE0YTI0MGQyY2EiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPldlc3RvbiBDbHVzdGVyIDQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzIzOTkzMGNjODI5NzQxNDFiZmMwZTBjNWExN2VhZmYyLnNldENvbnRlbnQoaHRtbF81ZTRmZGZkY2FlYjY0YzM2YWU1MjI1YTRhMjQwZDJjYSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl82Zjk2ZjhhM2U2OTQ0NmNjYjAxOTA3YzIxZTYxMDhhYS5iaW5kUG9wdXAocG9wdXBfMjM5OTMwY2M4Mjk3NDE0MWJmYzBlMGM1YTE3ZWFmZjIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYjhjMDkwY2Q4MTMxNGQ2NWEwZGU5ZjllMDZiYzI3MDggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42OTYzMTksLTc5LjUzMjI0MjQwMDAwMDAyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImdyZWVuIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiZ3JlZW4iLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYjI2ZWIwYzQ5ZGVjNDEyNDgwZGZlMzFiYTcyNjVkZDUpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNGFlZmIyZTg5ZGY0NDdlNjgyMzg2ZDQ0NzExMTUyZDEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMTZjM2JlNDdmZjgwNDA2NWJkODcwOTdlNTdiZTczYzYgPSAkKCc8ZGl2IGlkPSJodG1sXzE2YzNiZTQ3ZmY4MDQwNjViZDg3MDk3ZTU3YmU3M2M2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5XZXN0bW91bnQgQ2x1c3RlciA0PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80YWVmYjJlODlkZjQ0N2U2ODIzODZkNDQ3MTExNTJkMS5zZXRDb250ZW50KGh0bWxfMTZjM2JlNDdmZjgwNDA2NWJkODcwOTdlNTdiZTczYzYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYjhjMDkwY2Q4MTMxNGQ2NWEwZGU5ZjllMDZiYzI3MDguYmluZFBvcHVwKHBvcHVwXzRhZWZiMmU4OWRmNDQ3ZTY4MjM4NmQ0NDcxMTE1MmQxKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2E2MjE4ZTAxYjVlMzRkNjM4ZGNkNTI3YmVmZTNkMzlhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjg4OTA1NCwtNzkuNTU0NzI0NDAwMDAwMDFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiZ3JlZW4iLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJncmVlbiIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9iMjZlYjBjNDlkZWM0MTI0ODBkZmUzMWJhNzI2NWRkNSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF83M2U3OWExMTBiNjQ0NjFjYTQyN2ZkOWE0ZjUzMTkwMyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hMzg1MjBkNDllNTk0OTVmODA1MGU2YzM2Y2EzYzIxOSA9ICQoJzxkaXYgaWQ9Imh0bWxfYTM4NTIwZDQ5ZTU5NDk1ZjgwNTBlNmMzNmNhM2MyMTkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPktpbmdzdmlldyBWaWxsYWdlLCBNYXJ0aW4gR3JvdmUgR2FyZGVucywgUmljaHZpZXcgR2FyZGVucywgU3QuIFBoaWxsaXBzIENsdXN0ZXIgNDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNzNlNzlhMTEwYjY0NDYxY2E0MjdmZDlhNGY1MzE5MDMuc2V0Q29udGVudChodG1sX2EzODUyMGQ0OWU1OTQ5NWY4MDUwZTZjMzZjYTNjMjE5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2E2MjE4ZTAxYjVlMzRkNjM4ZGNkNTI3YmVmZTNkMzlhLmJpbmRQb3B1cChwb3B1cF83M2U3OWExMTBiNjQ0NjFjYTQyN2ZkOWE0ZjUzMTkwMyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xOWM4MjEyMzY5YWY0Zjk2YjA5ZTYwNmVkNGFlMjgwMyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjczOTQxNjM5OTk5OTk5NiwtNzkuNTg4NDM2OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJncmVlbiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImdyZWVuIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2IyNmViMGM0OWRlYzQxMjQ4MGRmZTMxYmE3MjY1ZGQ1KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzI0NzEyNzY0MjY5YjQ0MzA4YjViOWY4Yzc5MTljMzBhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzlmODliM2Y4YTU0MzRmZDg5NTAwYWU1OWE3MzcxMTZkID0gJCgnPGRpdiBpZD0iaHRtbF85Zjg5YjNmOGE1NDM0ZmQ4OTUwMGFlNTlhNzM3MTE2ZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QWxiaW9uIEdhcmRlbnMsIEJlYXVtb25kIEhlaWdodHMsIEh1bWJlcmdhdGUsIEphbWVzdG93biwgTW91bnQgT2xpdmUsIFNpbHZlcnN0b25lLCBTb3V0aCBTdGVlbGVzLCBUaGlzdGxldG93biBDbHVzdGVyIDQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzI0NzEyNzY0MjY5YjQ0MzA4YjViOWY4Yzc5MTljMzBhLnNldENvbnRlbnQoaHRtbF85Zjg5YjNmOGE1NDM0ZmQ4OTUwMGFlNTlhNzM3MTE2ZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8xOWM4MjEyMzY5YWY0Zjk2YjA5ZTYwNmVkNGFlMjgwMy5iaW5kUG9wdXAocG9wdXBfMjQ3MTI3NjQyNjliNDQzMDhiNWI5ZjhjNzkxOWMzMGEpOwoKICAgICAgICAgICAgCiAgICAgICAgCjwvc2NyaXB0Pg==\" style=\"position:absolute;width:100%;height:100%;left:0;top:0;border:none !important;\" allowfullscreen webkitallowfullscreen mozallowfullscreen></iframe></div></div>"
],
"text/plain": [
"<folium.folium.Map at 0x7f83fe7e8390>"
]
},
"execution_count": 25,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# set color scheme for the clusters\n",
"x = np.arange(kclusters)\n",
"#ys = [i + x + (i*x)**2 for i in range(kclusters)]\n",
"#colors_array = cm.rainbow(np.linspace(0, 1, len(ys)))\n",
"#rainbow = [colors.rgb2hex(i) for i in colors_array]\n",
"\n",
"rainbow = ['red','blue','yellow','green','orange']\n",
"# create map\n",
"map_clusters = folium.Map(location=[43.7,-79.4], zoom_start=10.5)\n",
"\n",
"# add markers to the map\n",
"markers_colors = []\n",
"for lat, lon, poi, cluster in zip(df_full_clust['Latitude'], df_full_clust['Longitude'], df_full_clust['Neighbourhood'], df_full_clust['Cluster Sum']):\n",
" label = folium.Popup(str(poi) + ' Cluster ' + str(cluster), parse_html=True)\n",
" folium.CircleMarker(\n",
" [lat, lon],\n",
" radius=5,\n",
" popup=label,\n",
" color=rainbow[cluster-1],\n",
" fill=True,\n",
" fill_color=rainbow[cluster-1],\n",
" fill_opacity=0.7).add_to(map_clusters)\n",
" \n",
"map_clusters"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The sum based clustering seems to be significantly influenced by proximity to the city center but does provide some information. Lets examine the areas of different clusters to see what we might find in each cluster. We start by grouping our postcodes by cluster membership and taking the average number of each venue type."
]
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"---- Average Area in red Cluster Contains ----\n",
"Bar: 6.0\n",
"Café: 4.8\n",
"Coffee Shop: 3.8\n",
"Bakery: 3.6\n",
"Italian Restaurant: 2.6\n",
"---- Average Area in blue Cluster Contains ----\n",
"Coffee Shop: 7.769230769230769\n",
"Café: 4.230769230769231\n",
"Restaurant: 2.769230769230769\n",
"Italian Restaurant: 2.6923076923076925\n",
"Pizza Place: 2.6923076923076925\n",
"---- Average Area in yellow Cluster Contains ----\n",
"Coffee Shop: 9.125\n",
"Hotel: 6.25\n",
"Café: 6.0\n",
"Restaurant: 3.625\n",
"Gastropub: 2.375\n",
"---- Average Area in green Cluster Contains ----\n",
"Greek Restaurant: 12.0\n",
"Coffee Shop: 7.0\n",
"Pub: 5.0\n",
"Café: 4.0\n",
"Fast Food Restaurant: 3.0\n",
"---- Average Area in orange Cluster Contains ----\n",
"Coffee Shop: 1.1756756756756757\n",
"Pizza Place: 0.7567567567567568\n",
"Park: 0.6216216216216216\n",
"Fast Food Restaurant: 0.6081081081081081\n",
"Sandwich Place: 0.5135135135135135\n"
]
}
],
"source": [
"toronto_grouped_clustering_sum['Cluster'] = kmeans_sum.labels_\n",
"sum_cluster_means = toronto_grouped_clustering_sum.groupby('Cluster').mean()\n",
"sum_cluster_means.index = rainbow \n",
"num_top_venues = 5\n",
"\n",
"for c in sum_cluster_means.index:\n",
" print(\"---- Average Area in \"+c+\" Cluster Contains ----\")\n",
" temp = sum_cluster_means[sum_cluster_means.index==c]\n",
" for _ in range(num_top_venues):\n",
" ven_type = temp.idxmax(axis=1)[0]\n",
" print('{}: {}'.format(ven_type, temp.loc[c, ven_type]))\n",
" temp = temp.drop(temp.idxmax(axis=1), axis=1)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now lets visualise the mean based clustering."
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div style=\"width:100%;\"><div style=\"position:relative;width:100%;height:0;padding-bottom:60%;\"><iframe src=\"data:text/html;charset=utf-8;base64,PCFET0NUWVBFIGh0bWw+CjxoZWFkPiAgICAKICAgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPgogICAgPHNjcmlwdD5MX1BSRUZFUl9DQU5WQVMgPSBmYWxzZTsgTF9OT19UT1VDSCA9IGZhbHNlOyBMX0RJU0FCTEVfM0QgPSBmYWxzZTs8L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2FqYXguZ29vZ2xlYXBpcy5jb20vYWpheC9saWJzL2pxdWVyeS8xLjExLjEvanF1ZXJ5Lm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvanMvYm9vdHN0cmFwLm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvTGVhZmxldC5hd2Vzb21lLW1hcmtlcnMvMi4wLjIvbGVhZmxldC5hd2Vzb21lLW1hcmtlcnMuanMiPjwvc2NyaXB0PgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9jc3MvYm9vdHN0cmFwLm1pbi5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvY3NzL2Jvb3RzdHJhcC10aGVtZS5taW4uY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vbWF4Y2RuLmJvb3RzdHJhcGNkbi5jb20vZm9udC1hd2Vzb21lLzQuNi4zL2Nzcy9mb250LWF3ZXNvbWUubWluLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9MZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy8yLjAuMi9sZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9yYXdnaXQuY29tL3B5dGhvbi12aXN1YWxpemF0aW9uL2ZvbGl1bS9tYXN0ZXIvZm9saXVtL3RlbXBsYXRlcy9sZWFmbGV0LmF3ZXNvbWUucm90YXRlLmNzcyIvPgogICAgPHN0eWxlPmh0bWwsIGJvZHkge3dpZHRoOiAxMDAlO2hlaWdodDogMTAwJTttYXJnaW46IDA7cGFkZGluZzogMDt9PC9zdHlsZT4KICAgIDxzdHlsZT4jbWFwIHtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtyaWdodDowO2xlZnQ6MDt9PC9zdHlsZT4KICAgIAogICAgICAgICAgICA8c3R5bGU+ICNtYXBfMTk4OGVmYjlmNDkzNDU1NDlhZGM4MmUyMWZhMmExNTIgewogICAgICAgICAgICAgICAgcG9zaXRpb24gOiByZWxhdGl2ZTsKICAgICAgICAgICAgICAgIHdpZHRoIDogMTAwLjAlOwogICAgICAgICAgICAgICAgaGVpZ2h0OiAxMDAuMCU7CiAgICAgICAgICAgICAgICBsZWZ0OiAwLjAlOwogICAgICAgICAgICAgICAgdG9wOiAwLjAlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICA8L3N0eWxlPgogICAgICAgIAo8L2hlYWQ+Cjxib2R5PiAgICAKICAgIAogICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb2xpdW0tbWFwIiBpZD0ibWFwXzE5ODhlZmI5ZjQ5MzQ1NTQ5YWRjODJlMjFmYTJhMTUyIiA+PC9kaXY+CiAgICAgICAgCjwvYm9keT4KPHNjcmlwdD4gICAgCiAgICAKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGJvdW5kcyA9IG51bGw7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcF8xOTg4ZWZiOWY0OTM0NTU0OWFkYzgyZTIxZmEyYTE1MiA9IEwubWFwKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21hcF8xOTg4ZWZiOWY0OTM0NTU0OWFkYzgyZTIxZmEyYTE1MicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y2VudGVyOiBbNDMuNywtNzkuNF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6b29tOiAxMC41LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4Qm91bmRzOiBib3VuZHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXllcnM6IFtdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ybGRDb3B5SnVtcDogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcnM6IEwuQ1JTLkVQU0czODU3CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgdGlsZV9sYXllcl9lMGRmMGJkODYwODI0MWFlYmY3MWU5MGY4YWYyMzQ2MiA9IEwudGlsZUxheWVyKAogICAgICAgICAgICAgICAgJ2h0dHBzOi8ve3N9LnRpbGUub3BlbnN0cmVldG1hcC5vcmcve3p9L3t4fS97eX0ucG5nJywKICAgICAgICAgICAgICAgIHsKICAiYXR0cmlidXRpb24iOiBudWxsLAogICJkZXRlY3RSZXRpbmEiOiBmYWxzZSwKICAibWF4Wm9vbSI6IDE4LAogICJtaW5ab29tIjogMSwKICAibm9XcmFwIjogZmFsc2UsCiAgInN1YmRvbWFpbnMiOiAiYWJjIgp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8xOTg4ZWZiOWY0OTM0NTU0OWFkYzgyZTIxZmEyYTE1Mik7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMzI2MjBjOGExOTJjNDZlYmEwNTJjNWIwYjBkMmE0YmYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My44MDY2ODYyOTk5OTk5OTYsLTc5LjE5NDM1MzQwMDAwMDAxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInJlZCIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogInJlZCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8xOTg4ZWZiOWY0OTM0NTU0OWFkYzgyZTIxZmEyYTE1Mik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zMjMwYmFlMmE2Njg0MzFkOTJiODFjMmQ3NjRiNDA1ZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mODk2YTZjY2I5YWI0NDI4OGYzNWMwNGJmMzJkNDdkNiA9ICQoJzxkaXYgaWQ9Imh0bWxfZjg5NmE2Y2NiOWFiNDQyODhmMzVjMDRiZjMyZDQ3ZDYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlJvdWdlLCBNYWx2ZXJuIENsdXN0ZXIgMTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMzIzMGJhZTJhNjY4NDMxZDkyYjgxYzJkNzY0YjQwNWYuc2V0Q29udGVudChodG1sX2Y4OTZhNmNjYjlhYjQ0Mjg4ZjM1YzA0YmYzMmQ0N2Q2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzMyNjIwYzhhMTkyYzQ2ZWJhMDUyYzViMGIwZDJhNGJmLmJpbmRQb3B1cChwb3B1cF8zMjMwYmFlMmE2Njg0MzFkOTJiODFjMmQ3NjRiNDA1Zik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl82NjQ0N2E5MWIyMTA0MGQ1YmZjOWRhNGQ5MWFmOGE3NSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjc4NDUzNTEsLTc5LjE2MDQ5NzA5OTk5OTk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInJlZCIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogInJlZCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8xOTg4ZWZiOWY0OTM0NTU0OWFkYzgyZTIxZmEyYTE1Mik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF80NTVkZTNhNGQyM2M0NmI1OTdlZGNkNzkzZWYzNzFjOCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kMTc4YTBiMDNjMWQ0ZmU2OGFlNTBkYzYxNTk4NWIzZSA9ICQoJzxkaXYgaWQ9Imh0bWxfZDE3OGEwYjAzYzFkNGZlNjhhZTUwZGM2MTU5ODViM2UiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkhpZ2hsYW5kIENyZWVrLCBSb3VnZSBIaWxsLCBQb3J0IFVuaW9uIENsdXN0ZXIgMTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNDU1ZGUzYTRkMjNjNDZiNTk3ZWRjZDc5M2VmMzcxYzguc2V0Q29udGVudChodG1sX2QxNzhhMGIwM2MxZDRmZTY4YWU1MGRjNjE1OTg1YjNlKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzY2NDQ3YTkxYjIxMDQwZDViZmM5ZGE0ZDkxYWY4YTc1LmJpbmRQb3B1cChwb3B1cF80NTVkZTNhNGQyM2M0NmI1OTdlZGNkNzkzZWYzNzFjOCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9hOTQ5ZDcxZmZiNzg0ZjI3OWEzNTkzMGUyNjg2NDU3YyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjc2MzU3MjYsLTc5LjE4ODcxMTVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAib3JhbmdlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAib3JhbmdlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzE5ODhlZmI5ZjQ5MzQ1NTQ5YWRjODJlMjFmYTJhMTUyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2YxYzU0MGQyYzJmMjQwNDg5MTQ5MDRiYmRkY2M3OWYxID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzlmZDQ1Nzk5YjIxOTQ5NmU5Yjk4ZTQxOWQ3MzE4ZWM0ID0gJCgnPGRpdiBpZD0iaHRtbF85ZmQ0NTc5OWIyMTk0OTZlOWI5OGU0MTlkNzMxOGVjNCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+R3VpbGR3b29kLCBNb3JuaW5nc2lkZSwgV2VzdCBIaWxsIENsdXN0ZXIgMDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZjFjNTQwZDJjMmYyNDA0ODkxNDkwNGJiZGRjYzc5ZjEuc2V0Q29udGVudChodG1sXzlmZDQ1Nzk5YjIxOTQ5NmU5Yjk4ZTQxOWQ3MzE4ZWM0KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2E5NDlkNzFmZmI3ODRmMjc5YTM1OTMwZTI2ODY0NTdjLmJpbmRQb3B1cChwb3B1cF9mMWM1NDBkMmMyZjI0MDQ4OTE0OTA0YmJkZGNjNzlmMSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81MDE3ZWIxMDFhMmY0ZGFkYWJiZjM4YTQ4NjIwMGQ2ZiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjc3MDk5MjEsLTc5LjIxNjkxNzQwMDAwMDAxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogInllbGxvdyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8xOTg4ZWZiOWY0OTM0NTU0OWFkYzgyZTIxZmEyYTE1Mik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85M2Y2YmJmM2E4ZTQ0MDY3OWIyY2ZkMDJiYTY2YjA2ZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zNjgwZWRlYmUyMDY0YWJlYTI3ODk1NWYyMWU0ZTk1ZCA9ICQoJzxkaXYgaWQ9Imh0bWxfMzY4MGVkZWJlMjA2NGFiZWEyNzg5NTVmMjFlNGU5NWQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPldvYnVybiBDbHVzdGVyIDM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzkzZjZiYmYzYThlNDQwNjc5YjJjZmQwMmJhNjZiMDZkLnNldENvbnRlbnQoaHRtbF8zNjgwZWRlYmUyMDY0YWJlYTI3ODk1NWYyMWU0ZTk1ZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81MDE3ZWIxMDFhMmY0ZGFkYWJiZjM4YTQ4NjIwMGQ2Zi5iaW5kUG9wdXAocG9wdXBfOTNmNmJiZjNhOGU0NDA2NzliMmNmZDAyYmE2NmIwNmQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNGM5MGUzODRjYmFkNDkyMGFkODk0NTk4YTE1MjAyN2IgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43NzMxMzYsLTc5LjIzOTQ3NjA5OTk5OTk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInJlZCIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogInJlZCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8xOTg4ZWZiOWY0OTM0NTU0OWFkYzgyZTIxZmEyYTE1Mik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mNmUzOGY5YmFlZDI0MWM2OGU4OWUyMDM3YjQyMzA1NyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kNDg4MzhkOTRmYzk0MzhmYjExZmMxNzc1MTViZTA2NyA9ICQoJzxkaXYgaWQ9Imh0bWxfZDQ4ODM4ZDk0ZmM5NDM4ZmIxMWZjMTc3NTE1YmUwNjciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNlZGFyYnJhZSBDbHVzdGVyIDE8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2Y2ZTM4ZjliYWVkMjQxYzY4ZTg5ZTIwMzdiNDIzMDU3LnNldENvbnRlbnQoaHRtbF9kNDg4MzhkOTRmYzk0MzhmYjExZmMxNzc1MTViZTA2Nyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl80YzkwZTM4NGNiYWQ0OTIwYWQ4OTQ1OThhMTUyMDI3Yi5iaW5kUG9wdXAocG9wdXBfZjZlMzhmOWJhZWQyNDFjNjhlODllMjAzN2I0MjMwNTcpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNThlNWI5ODJlYWMxNDlhZDhmMzA4MjJmN2E4YTdmMjggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43NDQ3MzQyLC03OS4yMzk0NzYwOTk5OTk5OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJyZWQiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJyZWQiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMTk4OGVmYjlmNDkzNDU1NDlhZGM4MmUyMWZhMmExNTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOThiNTMwNjA5YTJmNDhkMmI1YzE1ZTJhZmViNWQ1NzYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNjYwZjc3ODQ4OWQ5NGU1NThiODE1MDc1YjI3YjlhMTAgPSAkKCc8ZGl2IGlkPSJodG1sXzY2MGY3Nzg0ODlkOTRlNTU4YjgxNTA3NWIyN2I5YTEwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5TY2FyYm9yb3VnaCBWaWxsYWdlIENsdXN0ZXIgMTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOThiNTMwNjA5YTJmNDhkMmI1YzE1ZTJhZmViNWQ1NzYuc2V0Q29udGVudChodG1sXzY2MGY3Nzg0ODlkOTRlNTU4YjgxNTA3NWIyN2I5YTEwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzU4ZTViOTgyZWFjMTQ5YWQ4ZjMwODIyZjdhOGE3ZjI4LmJpbmRQb3B1cChwb3B1cF85OGI1MzA2MDlhMmY0OGQyYjVjMTVlMmFmZWI1ZDU3Nik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9iMWQxOGY4ZTkwMTk0N2JjOTQ0YzgyNTg0YzcyMzZkMCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjcyNzkyOTIsLTc5LjI2MjAyOTQwMDAwMDAyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInJlZCIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogInJlZCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8xOTg4ZWZiOWY0OTM0NTU0OWFkYzgyZTIxZmEyYTE1Mik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85ZWVjNWJkMjIyMGU0ZDA3YmRmYjdkNDhkNTEzM2VkMyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kY2RkM2VkZmMyNmY0Y2E3YjJjOTNmN2M4ZTY2MDhlMSA9ICQoJzxkaXYgaWQ9Imh0bWxfZGNkZDNlZGZjMjZmNGNhN2IyYzkzZjdjOGU2NjA4ZTEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkVhc3QgQmlyY2htb3VudCBQYXJrLCBJb252aWV3LCBLZW5uZWR5IFBhcmsgQ2x1c3RlciAxPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85ZWVjNWJkMjIyMGU0ZDA3YmRmYjdkNDhkNTEzM2VkMy5zZXRDb250ZW50KGh0bWxfZGNkZDNlZGZjMjZmNGNhN2IyYzkzZjdjOGU2NjA4ZTEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYjFkMThmOGU5MDE5NDdiYzk0NGM4MjU4NGM3MjM2ZDAuYmluZFBvcHVwKHBvcHVwXzllZWM1YmQyMjIwZTRkMDdiZGZiN2Q0OGQ1MTMzZWQzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2I1ZjE5YjA3NGQ5MjRlYjBiMWJhYjY5NzE2Y2NhODQ1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzExMTExNzAwMDAwMDA0LC03OS4yODQ1NzcyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInJlZCIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogInJlZCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8xOTg4ZWZiOWY0OTM0NTU0OWFkYzgyZTIxZmEyYTE1Mik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82MThmMzA1Nzc3MTg0Yzg4YmRlNTQ2NTQzYzFjZGM2MyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF85MjkyMmE0ODBmYTg0N2FhOWNmZDE0NjNiM2MwNjdlOCA9ICQoJzxkaXYgaWQ9Imh0bWxfOTI5MjJhNDgwZmE4NDdhYTljZmQxNDYzYjNjMDY3ZTgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNsYWlybGVhLCBHb2xkZW4gTWlsZSwgT2FrcmlkZ2UgQ2x1c3RlciAxPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82MThmMzA1Nzc3MTg0Yzg4YmRlNTQ2NTQzYzFjZGM2My5zZXRDb250ZW50KGh0bWxfOTI5MjJhNDgwZmE4NDdhYTljZmQxNDYzYjNjMDY3ZTgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYjVmMTliMDc0ZDkyNGViMGIxYmFiNjk3MTZjY2E4NDUuYmluZFBvcHVwKHBvcHVwXzYxOGYzMDU3NzcxODRjODhiZGU1NDY1NDNjMWNkYzYzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzFhYWRiMGExYzRkNzQwNmNiOGE1NjI2NGE5ZTljY2U5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzE2MzE2LC03OS4yMzk0NzYwOTk5OTk5OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJvcmFuZ2UiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJvcmFuZ2UiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMTk4OGVmYjlmNDkzNDU1NDlhZGM4MmUyMWZhMmExNTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfM2M2NDIzNGFhYjllNDRmMDhiMTJlMGJiMTA2NzNhNTkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZGIxMWUzNzI5NGY4NDk5NTlhNDZiNzk4NzdkZTIyOGEgPSAkKCc8ZGl2IGlkPSJodG1sX2RiMTFlMzcyOTRmODQ5OTU5YTQ2Yjc5ODc3ZGUyMjhhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DbGlmZmNyZXN0LCBDbGlmZnNpZGUsIFNjYXJib3JvdWdoIFZpbGxhZ2UgV2VzdCBDbHVzdGVyIDA8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzNjNjQyMzRhYWI5ZTQ0ZjA4YjEyZTBiYjEwNjczYTU5LnNldENvbnRlbnQoaHRtbF9kYjExZTM3Mjk0Zjg0OTk1OWE0NmI3OTg3N2RlMjI4YSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8xYWFkYjBhMWM0ZDc0MDZjYjhhNTYyNjRhOWU5Y2NlOS5iaW5kUG9wdXAocG9wdXBfM2M2NDIzNGFhYjllNDRmMDhiMTJlMGJiMTA2NzNhNTkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYzZjNWI1YmVkYmJlNDJiYTliY2QxZWQxYWYwMmI2YWEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42OTI2NTcwMDAwMDAwMDQsLTc5LjI2NDg0ODFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAieWVsbG93IiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzE5ODhlZmI5ZjQ5MzQ1NTQ5YWRjODJlMjFmYTJhMTUyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzBlMDY4MmVhMjI0ODRjN2E4YWNiNGMxMDhkNTY0M2JmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzg0MTY1ZjdjNTQ2MzRjYjA4YzhkZGMzMjFhMmUzNzNjID0gJCgnPGRpdiBpZD0iaHRtbF84NDE2NWY3YzU0NjM0Y2IwOGM4ZGRjMzIxYTJlMzczYyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QmlyY2ggQ2xpZmYsIENsaWZmc2lkZSBXZXN0IENsdXN0ZXIgMzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMGUwNjgyZWEyMjQ4NGM3YThhY2I0YzEwOGQ1NjQzYmYuc2V0Q29udGVudChodG1sXzg0MTY1ZjdjNTQ2MzRjYjA4YzhkZGMzMjFhMmUzNzNjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2M2YzViNWJlZGJiZTQyYmE5YmNkMWVkMWFmMDJiNmFhLmJpbmRQb3B1cChwb3B1cF8wZTA2ODJlYTIyNDg0YzdhOGFjYjRjMTA4ZDU2NDNiZik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9hOWM2MmYyMzgwMTU0YzEwYmI4NzhhZDExNTExNTMwZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjc1NzQwOTYsLTc5LjI3MzMwNDAwMDAwMDAxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInJlZCIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogInJlZCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8xOTg4ZWZiOWY0OTM0NTU0OWFkYzgyZTIxZmEyYTE1Mik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF81OTFkZTUzM2RlODk0MzFmODMxYTI4NmJhODc5NzliYSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82ODQ2MmY3OTVmOTI0Mzg2YmEwMDViN2MzZWI3OWNhZiA9ICQoJzxkaXYgaWQ9Imh0bWxfNjg0NjJmNzk1ZjkyNDM4NmJhMDA1YjdjM2ViNzljYWYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkRvcnNldCBQYXJrLCBTY2FyYm9yb3VnaCBUb3duIENlbnRyZSwgV2V4Zm9yZCBIZWlnaHRzIENsdXN0ZXIgMTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNTkxZGU1MzNkZTg5NDMxZjgzMWEyODZiYTg3OTc5YmEuc2V0Q29udGVudChodG1sXzY4NDYyZjc5NWY5MjQzODZiYTAwNWI3YzNlYjc5Y2FmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2E5YzYyZjIzODAxNTRjMTBiYjg3OGFkMTE1MTE1MzBlLmJpbmRQb3B1cChwb3B1cF81OTFkZTUzM2RlODk0MzFmODMxYTI4NmJhODc5NzliYSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8wYzJiOWUwZmNhMDY0ZTUzOWI3NWZlZjM2OTBmNDhmMSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjc1MDA3MTUwMDAwMDAwNCwtNzkuMjk1ODQ5MV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJvcmFuZ2UiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJvcmFuZ2UiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMTk4OGVmYjlmNDkzNDU1NDlhZGM4MmUyMWZhMmExNTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZTk4NmNmYWVlODUxNDhhNWE0ZjNhOTM0YWFmMGEzNWEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNGUzOWY2OGM0MjdhNDM1YmE5ZjNjMjE1OGJiMmI3ODggPSAkKCc8ZGl2IGlkPSJodG1sXzRlMzlmNjhjNDI3YTQzNWJhOWYzYzIxNThiYjJiNzg4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NYXJ5dmFsZSwgV2V4Zm9yZCBDbHVzdGVyIDA8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2U5ODZjZmFlZTg1MTQ4YTVhNGYzYTkzNGFhZjBhMzVhLnNldENvbnRlbnQoaHRtbF80ZTM5ZjY4YzQyN2E0MzViYTlmM2MyMTU4YmIyYjc4OCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8wYzJiOWUwZmNhMDY0ZTUzOWI3NWZlZjM2OTBmNDhmMS5iaW5kUG9wdXAocG9wdXBfZTk4NmNmYWVlODUxNDhhNWE0ZjNhOTM0YWFmMGEzNWEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOWRhZjM1YmUzY2VhNDYzNzllOWIzMTVjZGE5NzM4ZTggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43OTQyMDAzLC03OS4yNjIwMjk0MDAwMDAwMl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJyZWQiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJyZWQiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMTk4OGVmYjlmNDkzNDU1NDlhZGM4MmUyMWZhMmExNTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfODRiYjcyMGJjYmNmNGFlMDlkZDVjZWIzOWM2YmI2ODUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfM2FhMzAzMmYzYjRiNDNmMmJmNzNiZjlhOWRhN2Q3OGIgPSAkKCc8ZGl2IGlkPSJodG1sXzNhYTMwMzJmM2I0YjQzZjJiZjczYmY5YTlkYTdkNzhiIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5BZ2luY291cnQgQ2x1c3RlciAxPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84NGJiNzIwYmNiY2Y0YWUwOWRkNWNlYjM5YzZiYjY4NS5zZXRDb250ZW50KGh0bWxfM2FhMzAzMmYzYjRiNDNmMmJmNzNiZjlhOWRhN2Q3OGIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOWRhZjM1YmUzY2VhNDYzNzllOWIzMTVjZGE5NzM4ZTguYmluZFBvcHVwKHBvcHVwXzg0YmI3MjBiY2JjZjRhZTA5ZGQ1Y2ViMzljNmJiNjg1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2EwOWM2NTFhMTY0MDQyZmJhOGZlZGE1MjM5ZWQxYTVhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzgxNjM3NSwtNzkuMzA0MzAyMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJyZWQiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJyZWQiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMTk4OGVmYjlmNDkzNDU1NDlhZGM4MmUyMWZhMmExNTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNTA0ZmZlZjBiMzYxNDAwYjliYTA5MzcwNDk1MjBlMGMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZjc5OWU3ZTYxOTdlNDE3ZTlhNWRmYmQwMjRiMzZiZTYgPSAkKCc8ZGl2IGlkPSJodG1sX2Y3OTllN2U2MTk3ZTQxN2U5YTVkZmJkMDI0YjM2YmU2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DbGFya3MgQ29ybmVycywgU3VsbGl2YW4sIFRhbSBPJiMzOTtTaGFudGVyIENsdXN0ZXIgMTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNTA0ZmZlZjBiMzYxNDAwYjliYTA5MzcwNDk1MjBlMGMuc2V0Q29udGVudChodG1sX2Y3OTllN2U2MTk3ZTQxN2U5YTVkZmJkMDI0YjM2YmU2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2EwOWM2NTFhMTY0MDQyZmJhOGZlZGE1MjM5ZWQxYTVhLmJpbmRQb3B1cChwb3B1cF81MDRmZmVmMGIzNjE0MDBiOWJhMDkzNzA0OTUyMGUwYyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jYTRmMDhkNWE3Zjk0ODkxYjBlODhlZDhlYTIwNmIxMSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjgxNTI1MjIsLTc5LjI4NDU3NzJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAicmVkIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAicmVkIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzE5ODhlZmI5ZjQ5MzQ1NTQ5YWRjODJlMjFmYTJhMTUyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzYwNTE5ZTlhNzlkNTRmMWJhODIzMjI3YzQwNzQxY2JhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzAzNWUzM2UxZjI1MzQ2OTE4Y2FhNTRjN2Q2ZDc4OTU1ID0gJCgnPGRpdiBpZD0iaHRtbF8wMzVlMzNlMWYyNTM0NjkxOGNhYTU0YzdkNmQ3ODk1NSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QWdpbmNvdXJ0IE5vcnRoLCBMJiMzOTtBbW9yZWF1eCBFYXN0LCBNaWxsaWtlbiwgU3RlZWxlcyBFYXN0IENsdXN0ZXIgMTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNjA1MTllOWE3OWQ1NGYxYmE4MjMyMjdjNDA3NDFjYmEuc2V0Q29udGVudChodG1sXzAzNWUzM2UxZjI1MzQ2OTE4Y2FhNTRjN2Q2ZDc4OTU1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2NhNGYwOGQ1YTdmOTQ4OTFiMGU4OGVkOGVhMjA2YjExLmJpbmRQb3B1cChwb3B1cF82MDUxOWU5YTc5ZDU0ZjFiYTgyMzIyN2M0MDc0MWNiYSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl83NDZkZjkzZDNiMWE0MzQ4YmUwYzY0ZTVhZjM2ZmI4MyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjc5OTUyNTIwMDAwMDAwNSwtNzkuMzE4Mzg4N10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJyZWQiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJyZWQiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMTk4OGVmYjlmNDkzNDU1NDlhZGM4MmUyMWZhMmExNTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZWI2NmUwMWZjYmZkNGU4NGIyYTMzZjAxM2MyZDA5ZDYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMjUzMTg2MWVhOTlmNGMzNGE1YTM4MWMzNGVmNTVlNWMgPSAkKCc8ZGl2IGlkPSJodG1sXzI1MzE4NjFlYTk5ZjRjMzRhNWEzODFjMzRlZjU1ZTVjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5MJiMzOTtBbW9yZWF1eCBXZXN0LCBTdGVlbGVzIFdlc3QgQ2x1c3RlciAxPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lYjY2ZTAxZmNiZmQ0ZTg0YjJhMzNmMDEzYzJkMDlkNi5zZXRDb250ZW50KGh0bWxfMjUzMTg2MWVhOTlmNGMzNGE1YTM4MWMzNGVmNTVlNWMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNzQ2ZGY5M2QzYjFhNDM0OGJlMGM2NGU1YWYzNmZiODMuYmluZFBvcHVwKHBvcHVwX2ViNjZlMDFmY2JmZDRlODRiMmEzM2YwMTNjMmQwOWQ2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzdhNDY0ODUxNTJjZDQ4NWQ5MWUxNTQwMmVjNTZiZWYyID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuODAzNzYyMiwtNzkuMzYzNDUxN10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJyZWQiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJyZWQiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMTk4OGVmYjlmNDkzNDU1NDlhZGM4MmUyMWZhMmExNTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYTI2NGZhYWI5OWMzNDg3ZmE5YzU1ZDA1MGViNmNlODEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYWFmMDlmNTlkODVlNDVjNWJkNDlmMmEwMGNhMDA0YjEgPSAkKCc8ZGl2IGlkPSJodG1sX2FhZjA5ZjU5ZDg1ZTQ1YzViZDQ5ZjJhMDBjYTAwNGIxIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5IaWxsY3Jlc3QgVmlsbGFnZSBDbHVzdGVyIDE8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2EyNjRmYWFiOTljMzQ4N2ZhOWM1NWQwNTBlYjZjZTgxLnNldENvbnRlbnQoaHRtbF9hYWYwOWY1OWQ4NWU0NWM1YmQ0OWYyYTAwY2EwMDRiMSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl83YTQ2NDg1MTUyY2Q0ODVkOTFlMTU0MDJlYzU2YmVmMi5iaW5kUG9wdXAocG9wdXBfYTI2NGZhYWI5OWMzNDg3ZmE5YzU1ZDA1MGViNmNlODEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOGJmNzE3ZjJlYTk2NDc1ZjlmMDg3OGU5NzEyNDY3YjkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43Nzg1MTc1LC03OS4zNDY1NTU3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInJlZCIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogInJlZCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8xOTg4ZWZiOWY0OTM0NTU0OWFkYzgyZTIxZmEyYTE1Mik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF84ZWFjYjQ0YTFjNDU0MzQ2YjQ1M2U3N2ZiZWI0Nzc3MSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jNjA2MTE4YTBmY2E0ZjdmOTg4ZTc5YzZkNzViN2NlMSA9ICQoJzxkaXYgaWQ9Imh0bWxfYzYwNjExOGEwZmNhNGY3Zjk4OGU3OWM2ZDc1YjdjZTEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkZhaXJ2aWV3LCBIZW5yeSBGYXJtLCBPcmlvbGUgQ2x1c3RlciAxPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84ZWFjYjQ0YTFjNDU0MzQ2YjQ1M2U3N2ZiZWI0Nzc3MS5zZXRDb250ZW50KGh0bWxfYzYwNjExOGEwZmNhNGY3Zjk4OGU3OWM2ZDc1YjdjZTEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOGJmNzE3ZjJlYTk2NDc1ZjlmMDg3OGU5NzEyNDY3YjkuYmluZFBvcHVwKHBvcHVwXzhlYWNiNDRhMWM0NTQzNDZiNDUzZTc3ZmJlYjQ3NzcxKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2E5NmJlYTQyNWEzOTQ3MWM5NWM1ZWMzNzcyYTlmMjI4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzg2OTQ3MywtNzkuMzg1OTc1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInJlZCIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogInJlZCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8xOTg4ZWZiOWY0OTM0NTU0OWFkYzgyZTIxZmEyYTE1Mik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9kYmVlYTgwMWU2Zjg0MTI1YWJhNzVlNDljMDBiYmQ0YiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF84Y2QwYzY5MTY3NjQ0MDY0YTg5NmNmMzRjMmRkN2Q4NSA9ICQoJzxkaXYgaWQ9Imh0bWxfOGNkMGM2OTE2NzY0NDA2NGE4OTZjZjM0YzJkZDdkODUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkJheXZpZXcgVmlsbGFnZSBDbHVzdGVyIDE8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2RiZWVhODAxZTZmODQxMjVhYmE3NWU0OWMwMGJiZDRiLnNldENvbnRlbnQoaHRtbF84Y2QwYzY5MTY3NjQ0MDY0YTg5NmNmMzRjMmRkN2Q4NSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9hOTZiZWE0MjVhMzk0NzFjOTVjNWVjMzc3MmE5ZjIyOC5iaW5kUG9wdXAocG9wdXBfZGJlZWE4MDFlNmY4NDEyNWFiYTc1ZTQ5YzAwYmJkNGIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYzVjNjA1ZGE3YjBhNGU2ZTkyZmIwZmY2NzU2MjZjNTYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43NTc0OTAyLC03OS4zNzQ3MTQwOTk5OTk5OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJyZWQiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJyZWQiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMTk4OGVmYjlmNDkzNDU1NDlhZGM4MmUyMWZhMmExNTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNjI0YWU0YmM0OThjNGQyMTg3NzQzMDZiMzkzMDA5ZTAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNTE2NTdjMDk1ODZkNDgyMWIyMjg0ZjZmZjhmOTYxOWEgPSAkKCc8ZGl2IGlkPSJodG1sXzUxNjU3YzA5NTg2ZDQ4MjFiMjI4NGY2ZmY4Zjk2MTlhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5TaWx2ZXIgSGlsbHMsIFlvcmsgTWlsbHMgQ2x1c3RlciAxPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82MjRhZTRiYzQ5OGM0ZDIxODc3NDMwNmIzOTMwMDllMC5zZXRDb250ZW50KGh0bWxfNTE2NTdjMDk1ODZkNDgyMWIyMjg0ZjZmZjhmOTYxOWEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYzVjNjA1ZGE3YjBhNGU2ZTkyZmIwZmY2NzU2MjZjNTYuYmluZFBvcHVwKHBvcHVwXzYyNGFlNGJjNDk4YzRkMjE4Nzc0MzA2YjM5MzAwOWUwKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2VjNDk2OGRmMjc5YjRkNjk4Zjc0OTQwMzNmMjgwNWFhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzg5MDUzLC03OS40MDg0OTI3OTk5OTk5OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJyZWQiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJyZWQiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMTk4OGVmYjlmNDkzNDU1NDlhZGM4MmUyMWZhMmExNTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOTkwMjBlZDVhOGIwNGEzZmI2ODNmMWE4MjlkODY4YTQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNjc3N2Y5OWMyZDhjNDRjMmI4ZWUzZjg5NzE2MTgyMTcgPSAkKCc8ZGl2IGlkPSJodG1sXzY3NzdmOTljMmQ4YzQ0YzJiOGVlM2Y4OTcxNjE4MjE3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5OZXd0b25icm9vaywgV2lsbG93ZGFsZSBDbHVzdGVyIDE8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzk5MDIwZWQ1YThiMDRhM2ZiNjgzZjFhODI5ZDg2OGE0LnNldENvbnRlbnQoaHRtbF82Nzc3Zjk5YzJkOGM0NGMyYjhlZTNmODk3MTYxODIxNyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9lYzQ5NjhkZjI3OWI0ZDY5OGY3NDk0MDMzZjI4MDVhYS5iaW5kUG9wdXAocG9wdXBfOTkwMjBlZDVhOGIwNGEzZmI2ODNmMWE4MjlkODY4YTQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYzNjMTdjMTY2NTBlNDZhZThiY2UwN2IxNmNmMzY1YjAgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43NzAxMTk5LC03OS40MDg0OTI3OTk5OTk5OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJyZWQiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJyZWQiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMTk4OGVmYjlmNDkzNDU1NDlhZGM4MmUyMWZhMmExNTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNTZkMTQ1MDMwOWE5NDUyNjk1NGIwODdkZDFmMDFjMmQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYWJjZWQ0NjEzNjM0NDk2YjkyOWIzZjk1OGRkNDkwYmEgPSAkKCc8ZGl2IGlkPSJodG1sX2FiY2VkNDYxMzYzNDQ5NmI5MjliM2Y5NThkZDQ5MGJhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5XaWxsb3dkYWxlIFNvdXRoIENsdXN0ZXIgMTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNTZkMTQ1MDMwOWE5NDUyNjk1NGIwODdkZDFmMDFjMmQuc2V0Q29udGVudChodG1sX2FiY2VkNDYxMzYzNDQ5NmI5MjliM2Y5NThkZDQ5MGJhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2MzYzE3YzE2NjUwZTQ2YWU4YmNlMDdiMTZjZjM2NWIwLmJpbmRQb3B1cChwb3B1cF81NmQxNDUwMzA5YTk0NTI2OTU0YjA4N2RkMWYwMWMyZCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8zODVlYTQ0OTBiZDI0N2RkOGUyOGMwODExZDNlZTFmOSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjc1Mjc1ODI5OTk5OTk5NiwtNzkuNDAwMDQ5M10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJ5ZWxsb3ciLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMTk4OGVmYjlmNDkzNDU1NDlhZGM4MmUyMWZhMmExNTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZTNjZGQzOGYxZGU2NDVlNmFhOTZhNmZhYTk1NzEwMzQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYjQ3ZjExODg1Mjc2NDZiMjgzNDAzY2ZkMjBlYWJiNDkgPSAkKCc8ZGl2IGlkPSJodG1sX2I0N2YxMTg4NTI3NjQ2YjI4MzQwM2NmZDIwZWFiYjQ5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Zb3JrIE1pbGxzIFdlc3QgQ2x1c3RlciAzPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lM2NkZDM4ZjFkZTY0NWU2YWE5NmE2ZmFhOTU3MTAzNC5zZXRDb250ZW50KGh0bWxfYjQ3ZjExODg1Mjc2NDZiMjgzNDAzY2ZkMjBlYWJiNDkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMzg1ZWE0NDkwYmQyNDdkZDhlMjhjMDgxMWQzZWUxZjkuYmluZFBvcHVwKHBvcHVwX2UzY2RkMzhmMWRlNjQ1ZTZhYTk2YTZmYWE5NTcxMDM0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzM2MGU4NWMzZmMzNTQzYWFhYTU0MzIzOTU2ZDdiOGYyID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzgyNzM2NCwtNzkuNDQyMjU5M10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJvcmFuZ2UiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJvcmFuZ2UiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMTk4OGVmYjlmNDkzNDU1NDlhZGM4MmUyMWZhMmExNTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMDM0ZWNiZmE5NGU4NDBlYmFhNDdlZjQ3ZTlmMDI2ZmEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZDAzNDYwZTEyNTg4NDdhMDg3NmFlNGYxYzk0MmNkNzAgPSAkKCc8ZGl2IGlkPSJodG1sX2QwMzQ2MGUxMjU4ODQ3YTA4NzZhZTRmMWM5NDJjZDcwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5XaWxsb3dkYWxlIFdlc3QgQ2x1c3RlciAwPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wMzRlY2JmYTk0ZTg0MGViYWE0N2VmNDdlOWYwMjZmYS5zZXRDb250ZW50KGh0bWxfZDAzNDYwZTEyNTg4NDdhMDg3NmFlNGYxYzk0MmNkNzApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMzYwZTg1YzNmYzM1NDNhYWFhNTQzMjM5NTZkN2I4ZjIuYmluZFBvcHVwKHBvcHVwXzAzNGVjYmZhOTRlODQwZWJhYTQ3ZWY0N2U5ZjAyNmZhKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2E1MzI0YjZlYWZjMDQ4MDg5MDkzNzU2OThlYWFjYzMzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzUzMjU4NiwtNzkuMzI5NjU2NV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJ5ZWxsb3ciLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMTk4OGVmYjlmNDkzNDU1NDlhZGM4MmUyMWZhMmExNTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOTQwMjIyZmFmODc4NDIzYmJlY2MwMDE3Nzg0MDhjYmEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMDllYThkZDJhY2YyNGFlMWE0Njg3OTBlYWI3YjRjZWEgPSAkKCc8ZGl2IGlkPSJodG1sXzA5ZWE4ZGQyYWNmMjRhZTFhNDY4NzkwZWFiN2I0Y2VhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5QYXJrd29vZHMgQ2x1c3RlciAzPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85NDAyMjJmYWY4Nzg0MjNiYmVjYzAwMTc3ODQwOGNiYS5zZXRDb250ZW50KGh0bWxfMDllYThkZDJhY2YyNGFlMWE0Njg3OTBlYWI3YjRjZWEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYTUzMjRiNmVhZmMwNDgwODkwOTM3NTY5OGVhYWNjMzMuYmluZFBvcHVwKHBvcHVwXzk0MDIyMmZhZjg3ODQyM2JiZWNjMDAxNzc4NDA4Y2JhKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2YyYWMxMjFkMjdhNDQ2MWJhNzM0MDYwNzNhYzAyNjE2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzQ1OTA1Nzk5OTk5OTk2LC03OS4zNTIxODhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAicmVkIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAicmVkIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzE5ODhlZmI5ZjQ5MzQ1NTQ5YWRjODJlMjFmYTJhMTUyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzg4YzFjOWVkZGM0NDRhYzY5OWJjODg3MDVjMmM5YmRkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2MyYTIwZGI1NGM3ZTQ4YzZhNTZhODFlZjQzN2M4OWQ5ID0gJCgnPGRpdiBpZD0iaHRtbF9jMmEyMGRiNTRjN2U0OGM2YTU2YTgxZWY0MzdjODlkOSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RG9uIE1pbGxzIE5vcnRoIENsdXN0ZXIgMTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfODhjMWM5ZWRkYzQ0NGFjNjk5YmM4ODcwNWMyYzliZGQuc2V0Q29udGVudChodG1sX2MyYTIwZGI1NGM3ZTQ4YzZhNTZhODFlZjQzN2M4OWQ5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2YyYWMxMjFkMjdhNDQ2MWJhNzM0MDYwNzNhYzAyNjE2LmJpbmRQb3B1cChwb3B1cF84OGMxYzllZGRjNDQ0YWM2OTliYzg4NzA1YzJjOWJkZCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9kY2I1YmEzNGIzNmY0Zjc1YWM4ZDMxY2YwZDc4YmM2YSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjcyNTg5OTcwMDAwMDAxLC03OS4zNDA5MjNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAicmVkIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAicmVkIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzE5ODhlZmI5ZjQ5MzQ1NTQ5YWRjODJlMjFmYTJhMTUyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2I0YjAxNjNhYTY5ODRhNzJiMWE4ODk1NTQ1ZDUwOGUzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzlhNWQxZTc1M2IyNTRhOTk4ZjkyNGU4ZDRiMzlmMzNlID0gJCgnPGRpdiBpZD0iaHRtbF85YTVkMWU3NTNiMjU0YTk5OGY5MjRlOGQ0YjM5ZjMzZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RmxlbWluZ2RvbiBQYXJrLCBEb24gTWlsbHMgU291dGggQ2x1c3RlciAxPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iNGIwMTYzYWE2OTg0YTcyYjFhODg5NTU0NWQ1MDhlMy5zZXRDb250ZW50KGh0bWxfOWE1ZDFlNzUzYjI1NGE5OThmOTI0ZThkNGIzOWYzM2UpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZGNiNWJhMzRiMzZmNGY3NWFjOGQzMWNmMGQ3OGJjNmEuYmluZFBvcHVwKHBvcHVwX2I0YjAxNjNhYTY5ODRhNzJiMWE4ODk1NTQ1ZDUwOGUzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzM2MjBiMTI0OTQ3MzQ3NjhiZTFhZmJlMTI4ZGMzNWRkID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzU0MzI4MywtNzkuNDQyMjU5M10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJyZWQiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJyZWQiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMTk4OGVmYjlmNDkzNDU1NDlhZGM4MmUyMWZhMmExNTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYjUxODI5ODA4MDRjNDU4NjhkYTBjMTgyMjFhODhjOWIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYTNiZWI4MzYxNTU3NGQ4ZTgzNzBiZGVkODA2ZmUzM2YgPSAkKCc8ZGl2IGlkPSJodG1sX2EzYmViODM2MTU1NzRkOGU4MzcwYmRlZDgwNmZlMzNmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5CYXRodXJzdCBNYW5vciwgRG93bnN2aWV3IE5vcnRoLCBXaWxzb24gSGVpZ2h0cyBDbHVzdGVyIDE8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2I1MTgyOTgwODA0YzQ1ODY4ZGEwYzE4MjIxYTg4YzliLnNldENvbnRlbnQoaHRtbF9hM2JlYjgzNjE1NTc0ZDhlODM3MGJkZWQ4MDZmZTMzZik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8zNjIwYjEyNDk0NzM0NzY4YmUxYWZiZTEyOGRjMzVkZC5iaW5kUG9wdXAocG9wdXBfYjUxODI5ODA4MDRjNDU4NjhkYTBjMTgyMjFhODhjOWIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMjUyN2ZhYTRiZmVmNGM0Zjk4YmIxM2YzODhjNTI1OWYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43Njc5ODAzLC03OS40ODcyNjE5MDAwMDAwMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJyZWQiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJyZWQiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMTk4OGVmYjlmNDkzNDU1NDlhZGM4MmUyMWZhMmExNTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfN2NhNzQ4YmZhNTUxNDczZmI3ZDU1MTJkMzQwOTljNmMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNjQwYzZmNDhlZDdhNDI5MmFkN2JlMDc3YjhlY2JlNzEgPSAkKCc8ZGl2IGlkPSJodG1sXzY0MGM2ZjQ4ZWQ3YTQyOTJhZDdiZTA3N2I4ZWNiZTcxIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Ob3J0aHdvb2QgUGFyaywgWW9yayBVbml2ZXJzaXR5IENsdXN0ZXIgMTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfN2NhNzQ4YmZhNTUxNDczZmI3ZDU1MTJkMzQwOTljNmMuc2V0Q29udGVudChodG1sXzY0MGM2ZjQ4ZWQ3YTQyOTJhZDdiZTA3N2I4ZWNiZTcxKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzI1MjdmYWE0YmZlZjRjNGY5OGJiMTNmMzg4YzUyNTlmLmJpbmRQb3B1cChwb3B1cF83Y2E3NDhiZmE1NTE0NzNmYjdkNTUxMmQzNDA5OWM2Yyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jMjg4NTc4OTFmMzM0NWRkODJhZmQwZTZmMjZlYjJiNSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjczNzQ3MzIwMDAwMDAwNCwtNzkuNDY0NzYzMjk5OTk5OTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAicmVkIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAicmVkIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzE5ODhlZmI5ZjQ5MzQ1NTQ5YWRjODJlMjFmYTJhMTUyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzIyYmZmZmQ0MjVkMDRmZWFiMzBiNzU1MzdlM2VhNWQ0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzNhNzQ1ZDAxYzM1NTQyMjE5ZWZlMzU5Y2NjMWY5YjU3ID0gJCgnPGRpdiBpZD0iaHRtbF8zYTc0NWQwMWMzNTU0MjIxOWVmZTM1OWNjYzFmOWI1NyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q0ZCIFRvcm9udG8sIERvd25zdmlldyBFYXN0IENsdXN0ZXIgMTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMjJiZmZmZDQyNWQwNGZlYWIzMGI3NTUzN2UzZWE1ZDQuc2V0Q29udGVudChodG1sXzNhNzQ1ZDAxYzM1NTQyMjE5ZWZlMzU5Y2NjMWY5YjU3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2MyODg1Nzg5MWYzMzQ1ZGQ4MmFmZDBlNmYyNmViMmI1LmJpbmRQb3B1cChwb3B1cF8yMmJmZmZkNDI1ZDA0ZmVhYjMwYjc1NTM3ZTNlYTVkNCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl82MzcxYThkM2RlNDQ0YzllOTc3YWY3NzU2NzRkNDg0NiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjczOTAxNDYsLTc5LjUwNjk0MzZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAib3JhbmdlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAib3JhbmdlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzE5ODhlZmI5ZjQ5MzQ1NTQ5YWRjODJlMjFmYTJhMTUyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzEyZTRkOTA0MzU0OTRjM2M5NGNhOTQ2OGUyMzA2ZDgyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzRjMGYwOTE2NGVkMjRhYjZhNTgyMGExOTYwNDVjYTBkID0gJCgnPGRpdiBpZD0iaHRtbF80YzBmMDkxNjRlZDI0YWI2YTU4MjBhMTk2MDQ1Y2EwZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RG93bnN2aWV3IFdlc3QgQ2x1c3RlciAwPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xMmU0ZDkwNDM1NDk0YzNjOTRjYTk0NjhlMjMwNmQ4Mi5zZXRDb250ZW50KGh0bWxfNGMwZjA5MTY0ZWQyNGFiNmE1ODIwYTE5NjA0NWNhMGQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNjM3MWE4ZDNkZTQ0NGM5ZTk3N2FmNzc1Njc0ZDQ4NDYuYmluZFBvcHVwKHBvcHVwXzEyZTRkOTA0MzU0OTRjM2M5NGNhOTQ2OGUyMzA2ZDgyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2JlYTJhMWVhOWUxZTQ3YjhiN2Y1Y2UyY2EzNTcwNDc5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzI4NDk2NCwtNzkuNDk1Njk3NDAwMDAwMDFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiZ3JlZW4iLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJncmVlbiIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8xOTg4ZWZiOWY0OTM0NTU0OWFkYzgyZTIxZmEyYTE1Mik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lNGVhYWI0NGFiMzI0OTBhYTljYzc1NTg3YTk4OGU5MCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mODI2MDFhMWZjZWM0Nzk1YWU5OTJmYTI2MWY2NTk5YSA9ICQoJzxkaXYgaWQ9Imh0bWxfZjgyNjAxYTFmY2VjNDc5NWFlOTkyZmEyNjFmNjU5OWEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkRvd25zdmlldyBDZW50cmFsIENsdXN0ZXIgNDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZTRlYWFiNDRhYjMyNDkwYWE5Y2M3NTU4N2E5ODhlOTAuc2V0Q29udGVudChodG1sX2Y4MjYwMWExZmNlYzQ3OTVhZTk5MmZhMjYxZjY1OTlhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2JlYTJhMWVhOWUxZTQ3YjhiN2Y1Y2UyY2EzNTcwNDc5LmJpbmRQb3B1cChwb3B1cF9lNGVhYWI0NGFiMzI0OTBhYTljYzc1NTg3YTk4OGU5MCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xYWFiZWQ1OTU2NDA0MmU0YWM3MjdiNTE5MGEwM2FlYyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjc2MTYzMTMsLTc5LjUyMDk5OTQwMDAwMDAxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIm9yYW5nZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIm9yYW5nZSIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8xOTg4ZWZiOWY0OTM0NTU0OWFkYzgyZTIxZmEyYTE1Mik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85YWYwMzkwM2M4OWU0MWM1YWJjNjAwOGUxZDhmNmNmZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kYmUyOWFiYjdlZDU0MjU5ODM4MTU5MzJlZWI3YjFkYSA9ICQoJzxkaXYgaWQ9Imh0bWxfZGJlMjlhYmI3ZWQ1NDI1OTgzODE1OTMyZWViN2IxZGEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkRvd25zdmlldyBOb3J0aHdlc3QgQ2x1c3RlciAwPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85YWYwMzkwM2M4OWU0MWM1YWJjNjAwOGUxZDhmNmNmZi5zZXRDb250ZW50KGh0bWxfZGJlMjlhYmI3ZWQ1NDI1OTgzODE1OTMyZWViN2IxZGEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMWFhYmVkNTk1NjQwNDJlNGFjNzI3YjUxOTBhMDNhZWMuYmluZFBvcHVwKHBvcHVwXzlhZjAzOTAzYzg5ZTQxYzVhYmM2MDA4ZTFkOGY2Y2ZmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2FlZmNhOGZlMWZlMTRiOGFhMDdlY2I5MWU4MzQ1MjVlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzI1ODgyMjk5OTk5OTk1LC03OS4zMTU1NzE1OTk5OTk5OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJyZWQiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJyZWQiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMTk4OGVmYjlmNDkzNDU1NDlhZGM4MmUyMWZhMmExNTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMGE4OWViYTRlMjJiNDA5NmI4MWE3NWM5MTlmMDQxZmMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZmUxMzFhNGNlZWExNDhkMzkzYWQ5OTg0M2JhMzI0MWUgPSAkKCc8ZGl2IGlkPSJodG1sX2ZlMTMxYTRjZWVhMTQ4ZDM5M2FkOTk4NDNiYTMyNDFlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5WaWN0b3JpYSBWaWxsYWdlIENsdXN0ZXIgMTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMGE4OWViYTRlMjJiNDA5NmI4MWE3NWM5MTlmMDQxZmMuc2V0Q29udGVudChodG1sX2ZlMTMxYTRjZWVhMTQ4ZDM5M2FkOTk4NDNiYTMyNDFlKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2FlZmNhOGZlMWZlMTRiOGFhMDdlY2I5MWU4MzQ1MjVlLmJpbmRQb3B1cChwb3B1cF8wYTg5ZWJhNGUyMmI0MDk2YjgxYTc1YzkxOWYwNDFmYyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9iYzkxNDE3OThjYjA0NWQ1OTlhYzYyYTgwZTFlNGM2NCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjcwNjM5NzIsLTc5LjMwOTkzN10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJyZWQiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJyZWQiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMTk4OGVmYjlmNDkzNDU1NDlhZGM4MmUyMWZhMmExNTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMDgyZmIyMGI5ZDBhNDYxNzgyYWU4MzZjYTk3Y2M1YjcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZTZhNTM1YjQ5MjE5NDY5MWI4YjJhMDZkNzFlOWI1MDYgPSAkKCc8ZGl2IGlkPSJodG1sX2U2YTUzNWI0OTIxOTQ2OTFiOGIyYTA2ZDcxZTliNTA2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Xb29kYmluZSBHYXJkZW5zLCBQYXJrdmlldyBIaWxsIENsdXN0ZXIgMTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMDgyZmIyMGI5ZDBhNDYxNzgyYWU4MzZjYTk3Y2M1Yjcuc2V0Q29udGVudChodG1sX2U2YTUzNWI0OTIxOTQ2OTFiOGIyYTA2ZDcxZTliNTA2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2JjOTE0MTc5OGNiMDQ1ZDU5OWFjNjJhODBlMWU0YzY0LmJpbmRQb3B1cChwb3B1cF8wODJmYjIwYjlkMGE0NjE3ODJhZTgzNmNhOTdjYzViNyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mMTU0NGQ1MTQ4OTA0N2M3YTAyNzkxZGNlNDRhNjcxOSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY5NTM0MzkwMDAwMDAwNSwtNzkuMzE4Mzg4N10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJyZWQiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJyZWQiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMTk4OGVmYjlmNDkzNDU1NDlhZGM4MmUyMWZhMmExNTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNmY5MGRmMGM0YTVlNDFkMTgwNmIyZjI2OTBmYjQ0ODUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYmY4NzI1NjY0OWIwNDQ1ZmFiZDUwOWU1MjU3Y2E4ZjMgPSAkKCc8ZGl2IGlkPSJodG1sX2JmODcyNTY2NDliMDQ0NWZhYmQ1MDllNTI1N2NhOGYzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Xb29kYmluZSBIZWlnaHRzIENsdXN0ZXIgMTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNmY5MGRmMGM0YTVlNDFkMTgwNmIyZjI2OTBmYjQ0ODUuc2V0Q29udGVudChodG1sX2JmODcyNTY2NDliMDQ0NWZhYmQ1MDllNTI1N2NhOGYzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2YxNTQ0ZDUxNDg5MDQ3YzdhMDI3OTFkY2U0NGE2NzE5LmJpbmRQb3B1cChwb3B1cF82ZjkwZGYwYzRhNWU0MWQxODA2YjJmMjY5MGZiNDQ4NSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xZWU0YjVhY2VlYjk0ZTA1YmM3NjE0NzAzYzY1OWJkYSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY3NjM1NzM5OTk5OTk5LC03OS4yOTMwMzEyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInJlZCIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogInJlZCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8xOTg4ZWZiOWY0OTM0NTU0OWFkYzgyZTIxZmEyYTE1Mik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9jM2YyYmJjZDcyMjI0YzM4YjliYjQyYjNmZmY1ZTBjYiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zZmNhZDNjNWQwYTM0NmQ3YmNhZDhlNzZkMWNjZjVkOCA9ICQoJzxkaXYgaWQ9Imh0bWxfM2ZjYWQzYzVkMGEzNDZkN2JjYWQ4ZTc2ZDFjY2Y1ZDgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlRoZSBCZWFjaGVzIENsdXN0ZXIgMTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYzNmMmJiY2Q3MjIyNGMzOGI5YmI0MmIzZmZmNWUwY2Iuc2V0Q29udGVudChodG1sXzNmY2FkM2M1ZDBhMzQ2ZDdiY2FkOGU3NmQxY2NmNWQ4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzFlZTRiNWFjZWViOTRlMDViYzc2MTQ3MDNjNjU5YmRhLmJpbmRQb3B1cChwb3B1cF9jM2YyYmJjZDcyMjI0YzM4YjliYjQyYjNmZmY1ZTBjYik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9kY2QxYzY5ZmJjMjQ0NDdmODEyNDRmMzJiOWI2OTIzMCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjcwOTA2MDQsLTc5LjM2MzQ1MTddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAicmVkIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAicmVkIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzE5ODhlZmI5ZjQ5MzQ1NTQ5YWRjODJlMjFmYTJhMTUyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzMyMjk2N2RiOWFlMjQ5MzVhYWIwMDllYmQyMjdhOTJiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2NjYTY3ZTZkMTNmMTQxNTBhMWYzNzVmYzc5YTFkM2M0ID0gJCgnPGRpdiBpZD0iaHRtbF9jY2E2N2U2ZDEzZjE0MTUwYTFmMzc1ZmM3OWExZDNjNCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TGVhc2lkZSBDbHVzdGVyIDE8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzMyMjk2N2RiOWFlMjQ5MzVhYWIwMDllYmQyMjdhOTJiLnNldENvbnRlbnQoaHRtbF9jY2E2N2U2ZDEzZjE0MTUwYTFmMzc1ZmM3OWExZDNjNCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9kY2QxYzY5ZmJjMjQ0NDdmODEyNDRmMzJiOWI2OTIzMC5iaW5kUG9wdXAocG9wdXBfMzIyOTY3ZGI5YWUyNDkzNWFhYjAwOWViZDIyN2E5MmIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOWMzNmU4Y2Q3YmI2NDA1YTg3YWRjNzQ5OTc5NjlmZmEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43MDUzNjg5LC03OS4zNDkzNzE5MDAwMDAwMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJyZWQiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJyZWQiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMTk4OGVmYjlmNDkzNDU1NDlhZGM4MmUyMWZhMmExNTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMmIwZmNhNjJiMjMwNDRlMGJlMGU2ZTRlNzA5N2Q1YTggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfM2E1NGI2OGE1MGM3NGViMTg5MWQ0ZWY4NjIwM2I0MGIgPSAkKCc8ZGl2IGlkPSJodG1sXzNhNTRiNjhhNTBjNzRlYjE4OTFkNGVmODYyMDNiNDBiIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5UaG9ybmNsaWZmZSBQYXJrIENsdXN0ZXIgMTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMmIwZmNhNjJiMjMwNDRlMGJlMGU2ZTRlNzA5N2Q1YTguc2V0Q29udGVudChodG1sXzNhNTRiNjhhNTBjNzRlYjE4OTFkNGVmODYyMDNiNDBiKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzljMzZlOGNkN2JiNjQwNWE4N2FkYzc0OTk3OTY5ZmZhLmJpbmRQb3B1cChwb3B1cF8yYjBmY2E2MmIyMzA0NGUwYmUwZTZlNGU3MDk3ZDVhOCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9kZjkxYWM1ZTIxNWE0MzRiOTEyNGZjYmM3M2E4NTkxNSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY4NTM0NywtNzkuMzM4MTA2NV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJyZWQiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJyZWQiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMTk4OGVmYjlmNDkzNDU1NDlhZGM4MmUyMWZhMmExNTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMzE0ZDNjMGQzMDZkNGE0MGJhZTQ5Y2RjYjVmODY3MGIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMTU3MDNiMDYwMzZlNGFhOWE1M2U0N2MxZGZiYTM1MjMgPSAkKCc8ZGl2IGlkPSJodG1sXzE1NzAzYjA2MDM2ZTRhYTlhNTNlNDdjMWRmYmEzNTIzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5FYXN0IFRvcm9udG8gQ2x1c3RlciAxPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zMTRkM2MwZDMwNmQ0YTQwYmFlNDljZGNiNWY4NjcwYi5zZXRDb250ZW50KGh0bWxfMTU3MDNiMDYwMzZlNGFhOWE1M2U0N2MxZGZiYTM1MjMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZGY5MWFjNWUyMTVhNDM0YjkxMjRmY2JjNzNhODU5MTUuYmluZFBvcHVwKHBvcHVwXzMxNGQzYzBkMzA2ZDRhNDBiYWU0OWNkY2I1Zjg2NzBiKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzZiNmI3MTlhNDBlZTRiOTM5ZGIzNWJmYjUwNDJmYjU4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjc5NTU3MSwtNzkuMzUyMTg4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInJlZCIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogInJlZCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8xOTg4ZWZiOWY0OTM0NTU0OWFkYzgyZTIxZmEyYTE1Mik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF81MzUwN2QxNjlkOTU0MjU3OGJkMGJkOWFlNmYwODY1MiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF81NWNiMzI0MzIwNzM0ZDdlOWE5ZDJiOGVhMzEzMzgxZiA9ICQoJzxkaXYgaWQ9Imh0bWxfNTVjYjMyNDMyMDczNGQ3ZTlhOWQyYjhlYTMxMzM4MWYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlRoZSBEYW5mb3J0aCBXZXN0LCBSaXZlcmRhbGUgQ2x1c3RlciAxPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81MzUwN2QxNjlkOTU0MjU3OGJkMGJkOWFlNmYwODY1Mi5zZXRDb250ZW50KGh0bWxfNTVjYjMyNDMyMDczNGQ3ZTlhOWQyYjhlYTMxMzM4MWYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNmI2YjcxOWE0MGVlNGI5MzlkYjM1YmZiNTA0MmZiNTguYmluZFBvcHVwKHBvcHVwXzUzNTA3ZDE2OWQ5NTQyNTc4YmQwYmQ5YWU2ZjA4NjUyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2QwZmYzYWU4ODMxZjRkOTk4YjBkYmU1NDFmM2VjYWJhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjY4OTk4NSwtNzkuMzE1NTcxNTk5OTk5OThdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAicmVkIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAicmVkIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzE5ODhlZmI5ZjQ5MzQ1NTQ5YWRjODJlMjFmYTJhMTUyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzYwNDg0Y2Q1YzAzODRiODQ4ODRhZjYxM2FjOTY4YzIzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2RkZDY3ZGIzYTNkODQ1MzdiZjI0ZGZmNzY0YzY0ZWRkID0gJCgnPGRpdiBpZD0iaHRtbF9kZGQ2N2RiM2EzZDg0NTM3YmYyNGRmZjc2NGM2NGVkZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+VGhlIEJlYWNoZXMgV2VzdCwgSW5kaWEgQmF6YWFyIENsdXN0ZXIgMTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNjA0ODRjZDVjMDM4NGI4NDg4NGFmNjEzYWM5NjhjMjMuc2V0Q29udGVudChodG1sX2RkZDY3ZGIzYTNkODQ1MzdiZjI0ZGZmNzY0YzY0ZWRkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2QwZmYzYWU4ODMxZjRkOTk4YjBkYmU1NDFmM2VjYWJhLmJpbmRQb3B1cChwb3B1cF82MDQ4NGNkNWMwMzg0Yjg0ODg0YWY2MTNhYzk2OGMyMyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8yMTQ1YTcwMTliNzQ0ZWY1OWFhNGJiM2FjYmNlYWE2OSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY1OTUyNTUsLTc5LjM0MDkyM10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJyZWQiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJyZWQiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMTk4OGVmYjlmNDkzNDU1NDlhZGM4MmUyMWZhMmExNTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMWM5MzUzYTM3MzczNDlkYThiOGY4NjM0M2RlMjBkYTAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZjNlMzE3MTIzZTcyNDBjNDhmYTg5Zjk2MTYyZWFmZGIgPSAkKCc8ZGl2IGlkPSJodG1sX2YzZTMxNzEyM2U3MjQwYzQ4ZmE4OWY5NjE2MmVhZmRiIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5TdHVkaW8gRGlzdHJpY3QgQ2x1c3RlciAxPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xYzkzNTNhMzczNzM0OWRhOGI4Zjg2MzQzZGUyMGRhMC5zZXRDb250ZW50KGh0bWxfZjNlMzE3MTIzZTcyNDBjNDhmYTg5Zjk2MTYyZWFmZGIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMjE0NWE3MDE5Yjc0NGVmNTlhYTRiYjNhY2JjZWFhNjkuYmluZFBvcHVwKHBvcHVwXzFjOTM1M2EzNzM3MzQ5ZGE4YjhmODYzNDNkZTIwZGEwKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzMyMTNlZDYwMzIyODQ1NjhhYjFjZDY5ZGZiOTg3YTNkID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzI4MDIwNSwtNzkuMzg4NzkwMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJyZWQiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJyZWQiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMTk4OGVmYjlmNDkzNDU1NDlhZGM4MmUyMWZhMmExNTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfODBiYWU3ZDFiMmI3NDM0N2EzM2U2YWRmZjVjNDljZWIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNjA4MjNmMTU5MDU1NGI2ZWJjODBmNjIwNDcwZjkwMWIgPSAkKCc8ZGl2IGlkPSJodG1sXzYwODIzZjE1OTA1NTRiNmViYzgwZjYyMDQ3MGY5MDFiIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5MYXdyZW5jZSBQYXJrIENsdXN0ZXIgMTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfODBiYWU3ZDFiMmI3NDM0N2EzM2U2YWRmZjVjNDljZWIuc2V0Q29udGVudChodG1sXzYwODIzZjE1OTA1NTRiNmViYzgwZjYyMDQ3MGY5MDFiKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzMyMTNlZDYwMzIyODQ1NjhhYjFjZDY5ZGZiOTg3YTNkLmJpbmRQb3B1cChwb3B1cF84MGJhZTdkMWIyYjc0MzQ3YTMzZTZhZGZmNWM0OWNlYik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl83OTNiMWUyNGNjZGU0ODc5OGJmODIxMjA0YTRhOGJjMiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjcxMjc1MTEsLTc5LjM5MDE5NzVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAicmVkIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAicmVkIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzE5ODhlZmI5ZjQ5MzQ1NTQ5YWRjODJlMjFmYTJhMTUyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzc0ZGE5M2JiOGMyMzQ5Y2ZiOTE1NWVkOGZiOGRjZGI3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2E5Y2U2ZWYyMTgyMjRkMzg4MmIzZDliMTdjMjczNGRlID0gJCgnPGRpdiBpZD0iaHRtbF9hOWNlNmVmMjE4MjI0ZDM4ODJiM2Q5YjE3YzI3MzRkZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RGF2aXN2aWxsZSBOb3J0aCBDbHVzdGVyIDE8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzc0ZGE5M2JiOGMyMzQ5Y2ZiOTE1NWVkOGZiOGRjZGI3LnNldENvbnRlbnQoaHRtbF9hOWNlNmVmMjE4MjI0ZDM4ODJiM2Q5YjE3YzI3MzRkZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl83OTNiMWUyNGNjZGU0ODc5OGJmODIxMjA0YTRhOGJjMi5iaW5kUG9wdXAocG9wdXBfNzRkYTkzYmI4YzIzNDljZmI5MTU1ZWQ4ZmI4ZGNkYjcpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYzRlZTI5ZTE5NjY3NGY1NGI1M2NjOTk1ZDk1ODI2NDcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43MTUzODM0LC03OS40MDU2Nzg0MDAwMDAwMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJyZWQiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJyZWQiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMTk4OGVmYjlmNDkzNDU1NDlhZGM4MmUyMWZhMmExNTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNjMyOTY0MTBiZTdlNGQ1NjliNmYyOWIyMWUwOTFlOWQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZmYzMjM0MWQ4NzMyNDYzMzlmYzcxNjNiODRmNTk3NzYgPSAkKCc8ZGl2IGlkPSJodG1sX2ZmMzIzNDFkODczMjQ2MzM5ZmM3MTYzYjg0ZjU5Nzc2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Ob3J0aCBUb3JvbnRvIFdlc3QgQ2x1c3RlciAxPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82MzI5NjQxMGJlN2U0ZDU2OWI2ZjI5YjIxZTA5MWU5ZC5zZXRDb250ZW50KGh0bWxfZmYzMjM0MWQ4NzMyNDYzMzlmYzcxNjNiODRmNTk3NzYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYzRlZTI5ZTE5NjY3NGY1NGI1M2NjOTk1ZDk1ODI2NDcuYmluZFBvcHVwKHBvcHVwXzYzMjk2NDEwYmU3ZTRkNTY5YjZmMjliMjFlMDkxZTlkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzY3NjM2MjEyNjQ4MTQ0ZGM4NTk2MzQ4NDMxN2IxYWIxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzA0MzI0NCwtNzkuMzg4NzkwMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJyZWQiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJyZWQiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMTk4OGVmYjlmNDkzNDU1NDlhZGM4MmUyMWZhMmExNTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOWZjYzVjY2JmNDY0NDFjOThmNjNiNTFjZTEzMTQwYjAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYzIxYWJmMTBkNGY5NDM5MmIyYjQyZTAyY2FkYmI5OGMgPSAkKCc8ZGl2IGlkPSJodG1sX2MyMWFiZjEwZDRmOTQzOTJiMmI0MmUwMmNhZGJiOThjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5EYXZpc3ZpbGxlIENsdXN0ZXIgMTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOWZjYzVjY2JmNDY0NDFjOThmNjNiNTFjZTEzMTQwYjAuc2V0Q29udGVudChodG1sX2MyMWFiZjEwZDRmOTQzOTJiMmI0MmUwMmNhZGJiOThjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzY3NjM2MjEyNjQ4MTQ0ZGM4NTk2MzQ4NDMxN2IxYWIxLmJpbmRQb3B1cChwb3B1cF85ZmNjNWNjYmY0NjQ0MWM5OGY2M2I1MWNlMTMxNDBiMCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl83NzI0MTk0Y2NjYjE0MDcwODVmZjRmYzlkNzRiNTJjYSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY4OTU3NDMsLTc5LjM4MzE1OTkwMDAwMDAxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogInllbGxvdyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8xOTg4ZWZiOWY0OTM0NTU0OWFkYzgyZTIxZmEyYTE1Mik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8yNzkzZjJlZmQ1ZDU0Mzc4OTIxNzM3NzRmMGNiZTMyOCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF85Yzg2MWEzNTIyMzE0ZjJkODI5MzkxZTc3N2ExN2JlNiA9ICQoJzxkaXYgaWQ9Imh0bWxfOWM4NjFhMzUyMjMxNGYyZDgyOTM5MWU3NzdhMTdiZTYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk1vb3JlIFBhcmssIFN1bW1lcmhpbGwgRWFzdCBDbHVzdGVyIDM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzI3OTNmMmVmZDVkNTQzNzg5MjE3Mzc3NGYwY2JlMzI4LnNldENvbnRlbnQoaHRtbF85Yzg2MWEzNTIyMzE0ZjJkODI5MzkxZTc3N2ExN2JlNik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl83NzI0MTk0Y2NjYjE0MDcwODVmZjRmYzlkNzRiNTJjYS5iaW5kUG9wdXAocG9wdXBfMjc5M2YyZWZkNWQ1NDM3ODkyMTczNzc0ZjBjYmUzMjgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZTVlNGYxN2YwMWUwNDA4NDlmZDU3Y2E5MDAxY2JjYzEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42ODY0MTIyOTk5OTk5OSwtNzkuNDAwMDQ5M10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJyZWQiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJyZWQiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMTk4OGVmYjlmNDkzNDU1NDlhZGM4MmUyMWZhMmExNTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMTBjNGRiYmMxNzQ2NDEwODk0YTM2ZDZhNmI0ODAyNjAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZWNiODQ1NDZlOTA3NGI2N2I1OGIyZDY5M2VmYWI0NTAgPSAkKCc8ZGl2IGlkPSJodG1sX2VjYjg0NTQ2ZTkwNzRiNjdiNThiMmQ2OTNlZmFiNDUwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5EZWVyIFBhcmssIEZvcmVzdCBIaWxsIFNFLCBSYXRobmVsbHksIFNvdXRoIEhpbGwsIFN1bW1lcmhpbGwgV2VzdCBDbHVzdGVyIDE8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzEwYzRkYmJjMTc0NjQxMDg5NGEzNmQ2YTZiNDgwMjYwLnNldENvbnRlbnQoaHRtbF9lY2I4NDU0NmU5MDc0YjY3YjU4YjJkNjkzZWZhYjQ1MCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9lNWU0ZjE3ZjAxZTA0MDg0OWZkNTdjYTkwMDFjYmNjMS5iaW5kUG9wdXAocG9wdXBfMTBjNGRiYmMxNzQ2NDEwODk0YTM2ZDZhNmI0ODAyNjApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMzQzMTg3N2YzYmZhNGU5MmFhZDA5MThkMWRkYTkzZTYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42Nzk1NjI2LC03OS4zNzc1Mjk0MDAwMDAwMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJ5ZWxsb3ciLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMTk4OGVmYjlmNDkzNDU1NDlhZGM4MmUyMWZhMmExNTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOTQzYmI2OTJkNTVlNGNlZmI5MTExNWQ1ZWE5ZGNkYTAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYmI2ZjEyZDM3MTFhNDQyMWExZWNhMWE3OGFmMTY4MDYgPSAkKCc8ZGl2IGlkPSJodG1sX2JiNmYxMmQzNzExYTQ0MjFhMWVjYTFhNzhhZjE2ODA2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Sb3NlZGFsZSBDbHVzdGVyIDM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzk0M2JiNjkyZDU1ZTRjZWZiOTExMTVkNWVhOWRjZGEwLnNldENvbnRlbnQoaHRtbF9iYjZmMTJkMzcxMWE0NDIxYTFlY2ExYTc4YWYxNjgwNik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8zNDMxODc3ZjNiZmE0ZTkyYWFkMDkxOGQxZGRhOTNlNi5iaW5kUG9wdXAocG9wdXBfOTQzYmI2OTJkNTVlNGNlZmI5MTExNWQ1ZWE5ZGNkYTApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMTZmYWQ2NWI1NGU3NDIzMzhiNTAwYWMzNDJhZWY4MTIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42Njc5NjcsLTc5LjM2NzY3NTNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAicmVkIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAicmVkIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzE5ODhlZmI5ZjQ5MzQ1NTQ5YWRjODJlMjFmYTJhMTUyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzNhNjVhZDUxYjkxYTQ3Yzk5MmFjNmEwODUzYjk3YWQwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzBmZTM4YTZiZDgwOTRkNTk5OGM2MjkwYTc3NmIxMTk4ID0gJCgnPGRpdiBpZD0iaHRtbF8wZmUzOGE2YmQ4MDk0ZDU5OThjNjI5MGE3NzZiMTE5OCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q2FiYmFnZXRvd24sIFN0LiBKYW1lcyBUb3duIENsdXN0ZXIgMTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfM2E2NWFkNTFiOTFhNDdjOTkyYWM2YTA4NTNiOTdhZDAuc2V0Q29udGVudChodG1sXzBmZTM4YTZiZDgwOTRkNTk5OGM2MjkwYTc3NmIxMTk4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzE2ZmFkNjViNTRlNzQyMzM4YjUwMGFjMzQyYWVmODEyLmJpbmRQb3B1cChwb3B1cF8zYTY1YWQ1MWI5MWE0N2M5OTJhYzZhMDg1M2I5N2FkMCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl84M2JhMDRjYWI3MWE0ODU4ODczNGEwNjM5ZDdiOTJlOSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY2NTg1OTksLTc5LjM4MzE1OTkwMDAwMDAxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInJlZCIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogInJlZCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8xOTg4ZWZiOWY0OTM0NTU0OWFkYzgyZTIxZmEyYTE1Mik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xNjg0NGI4NGU2NTY0YjVhODRmMGM5ZThkMGEzYjZhYyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8yMTgyMmQyNWIwMTQ0OWY3OTMzYmU1ZmEwYzdjY2RlNyA9ICQoJzxkaXYgaWQ9Imh0bWxfMjE4MjJkMjViMDE0NDlmNzkzM2JlNWZhMGM3Y2NkZTciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNodXJjaCBhbmQgV2VsbGVzbGV5IENsdXN0ZXIgMTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMTY4NDRiODRlNjU2NGI1YTg0ZjBjOWU4ZDBhM2I2YWMuc2V0Q29udGVudChodG1sXzIxODIyZDI1YjAxNDQ5Zjc5MzNiZTVmYTBjN2NjZGU3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzgzYmEwNGNhYjcxYTQ4NTg4NzM0YTA2MzlkN2I5MmU5LmJpbmRQb3B1cChwb3B1cF8xNjg0NGI4NGU2NTY0YjVhODRmMGM5ZThkMGEzYjZhYyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81YTFjYzNjYzUwZTI0OWI3YjhmZTRjMWE4NjY0MWIzMyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY1NDI1OTksLTc5LjM2MDYzNTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAicmVkIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAicmVkIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzE5ODhlZmI5ZjQ5MzQ1NTQ5YWRjODJlMjFmYTJhMTUyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzNlN2E4YmNmMzZkYTQ4MWZiZDczNjVjMGVlMDkyODY0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzg2Yzg3ZjI5NjM0MzQxODlhYzg3ZTU3ODFjYTI1NTNiID0gJCgnPGRpdiBpZD0iaHRtbF84NmM4N2YyOTYzNDM0MTg5YWM4N2U1NzgxY2EyNTUzYiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+SGFyYm91cmZyb250LCBSZWdlbnQgUGFyayBDbHVzdGVyIDE8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzNlN2E4YmNmMzZkYTQ4MWZiZDczNjVjMGVlMDkyODY0LnNldENvbnRlbnQoaHRtbF84NmM4N2YyOTYzNDM0MTg5YWM4N2U1NzgxY2EyNTUzYik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81YTFjYzNjYzUwZTI0OWI3YjhmZTRjMWE4NjY0MWIzMy5iaW5kUG9wdXAocG9wdXBfM2U3YThiY2YzNmRhNDgxZmJkNzM2NWMwZWUwOTI4NjQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZTRhNjQ5M2I5NTkxNDM3ZTgxMDRmNTIzMTQ0MTUzZDIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42NTcxNjE4LC03OS4zNzg5MzcwOTk5OTk5OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJyZWQiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJyZWQiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMTk4OGVmYjlmNDkzNDU1NDlhZGM4MmUyMWZhMmExNTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMjljZTAzNjZmMzhkNDJhOWFmZWNiNzNkYjg4MWUyMjMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNmE3ZDgwYTQzZWNiNGI3ZTllNDQ0ZDZiZDNmYzMyODAgPSAkKCc8ZGl2IGlkPSJodG1sXzZhN2Q4MGE0M2VjYjRiN2U5ZTQ0NGQ2YmQzZmMzMjgwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5SeWVyc29uLCBHYXJkZW4gRGlzdHJpY3QgQ2x1c3RlciAxPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yOWNlMDM2NmYzOGQ0MmE5YWZlY2I3M2RiODgxZTIyMy5zZXRDb250ZW50KGh0bWxfNmE3ZDgwYTQzZWNiNGI3ZTllNDQ0ZDZiZDNmYzMyODApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZTRhNjQ5M2I5NTkxNDM3ZTgxMDRmNTIzMTQ0MTUzZDIuYmluZFBvcHVwKHBvcHVwXzI5Y2UwMzY2ZjM4ZDQyYTlhZmVjYjczZGI4ODFlMjIzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2RiOTEyZjYyYTc3NjQ4OTNhOWE1OWExMjU0N2Y0ZmY3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjUxNDkzOSwtNzkuMzc1NDE3OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJyZWQiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJyZWQiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMTk4OGVmYjlmNDkzNDU1NDlhZGM4MmUyMWZhMmExNTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfODY5NWVjNTE1N2IzNGM4M2E1MDJkZGZiMGVkNWNmNDYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYTZlY2U4MjhmYzkxNGFlMTljODA4MDFhZTQ1ZjZlMTggPSAkKCc8ZGl2IGlkPSJodG1sX2E2ZWNlODI4ZmM5MTRhZTE5YzgwODAxYWU0NWY2ZTE4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5TdC4gSmFtZXMgVG93biBDbHVzdGVyIDE8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzg2OTVlYzUxNTdiMzRjODNhNTAyZGRmYjBlZDVjZjQ2LnNldENvbnRlbnQoaHRtbF9hNmVjZTgyOGZjOTE0YWUxOWM4MDgwMWFlNDVmNmUxOCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9kYjkxMmY2MmE3NzY0ODkzYTlhNTlhMTI1NDdmNGZmNy5iaW5kUG9wdXAocG9wdXBfODY5NWVjNTE1N2IzNGM4M2E1MDJkZGZiMGVkNWNmNDYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMjk5NDNjZDhkYzk2NDE1Mjg5NjRkZmEwZjY5ZTE2MmMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42NDQ3NzA3OTk5OTk5OTYsLTc5LjM3MzMwNjRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAicmVkIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAicmVkIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzE5ODhlZmI5ZjQ5MzQ1NTQ5YWRjODJlMjFmYTJhMTUyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzkwNzMwZjVmOWY4ZDQwYWJhZGEyYTdlZWVkNTVlY2U0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2JiNmQ3MjE0YTM0MjRlZDdhNjFkYWY1ZDdlNjU1MmIyID0gJCgnPGRpdiBpZD0iaHRtbF9iYjZkNzIxNGEzNDI0ZWQ3YTYxZGFmNWQ3ZTY1NTJiMiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QmVyY3p5IFBhcmsgQ2x1c3RlciAxPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85MDczMGY1ZjlmOGQ0MGFiYWRhMmE3ZWVlZDU1ZWNlNC5zZXRDb250ZW50KGh0bWxfYmI2ZDcyMTRhMzQyNGVkN2E2MWRhZjVkN2U2NTUyYjIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMjk5NDNjZDhkYzk2NDE1Mjg5NjRkZmEwZjY5ZTE2MmMuYmluZFBvcHVwKHBvcHVwXzkwNzMwZjVmOWY4ZDQwYWJhZGEyYTdlZWVkNTVlY2U0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2Q4Njc5MTAyNjQyYjQzNWViYzM4NmQwNGFiOWJiYjQwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjU3OTUyNCwtNzkuMzg3MzgyNl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJyZWQiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJyZWQiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMTk4OGVmYjlmNDkzNDU1NDlhZGM4MmUyMWZhMmExNTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYzViZTJhOGI2ZmFmNDQ2MWE4ZGRiZWYwZmQ0ZjdkYzUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZTRjOWM3MDE0N2Y4NGMzMmIxOTM1YTViMWMxZWZlNWEgPSAkKCc8ZGl2IGlkPSJodG1sX2U0YzljNzAxNDdmODRjMzJiMTkzNWE1YjFjMWVmZTVhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DZW50cmFsIEJheSBTdHJlZXQgQ2x1c3RlciAxPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jNWJlMmE4YjZmYWY0NDYxYThkZGJlZjBmZDRmN2RjNS5zZXRDb250ZW50KGh0bWxfZTRjOWM3MDE0N2Y4NGMzMmIxOTM1YTViMWMxZWZlNWEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZDg2NzkxMDI2NDJiNDM1ZWJjMzg2ZDA0YWI5YmJiNDAuYmluZFBvcHVwKHBvcHVwX2M1YmUyYThiNmZhZjQ0NjFhOGRkYmVmMGZkNGY3ZGM1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzRjZDlkZWNhMGIxMTQyOTE4ZGM1MmM4N2VhMGUwMDI2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjUwNTcxMjAwMDAwMDEsLTc5LjM4NDU2NzVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAicmVkIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAicmVkIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzE5ODhlZmI5ZjQ5MzQ1NTQ5YWRjODJlMjFmYTJhMTUyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzc0NjY4NjU1ZThkODQ2MjNhMTEzZDc2NGQwNTNkMDMxID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzA3YWYwZGRhNDQxNjQ3NTVhYTlmMzZlZTQxNWYzOTJkID0gJCgnPGRpdiBpZD0iaHRtbF8wN2FmMGRkYTQ0MTY0NzU1YWE5ZjM2ZWU0MTVmMzkyZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QWRlbGFpZGUsIEtpbmcsIFJpY2htb25kIENsdXN0ZXIgMTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNzQ2Njg2NTVlOGQ4NDYyM2ExMTNkNzY0ZDA1M2QwMzEuc2V0Q29udGVudChodG1sXzA3YWYwZGRhNDQxNjQ3NTVhYTlmMzZlZTQxNWYzOTJkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzRjZDlkZWNhMGIxMTQyOTE4ZGM1MmM4N2VhMGUwMDI2LmJpbmRQb3B1cChwb3B1cF83NDY2ODY1NWU4ZDg0NjIzYTExM2Q3NjRkMDUzZDAzMSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8yNDk0NmQ3YzE5ZTA0NmU5YmI3MWNiNWIxNTE5Y2IwZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY0MDgxNTcsLTc5LjM4MTc1MjI5OTk5OTk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInJlZCIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogInJlZCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8xOTg4ZWZiOWY0OTM0NTU0OWFkYzgyZTIxZmEyYTE1Mik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9kMDViY2ZjYWE2OGU0ZGM1OGIxMDJmNTE2NWM5YjZjZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8yNDk3MmRjZTY2YjA0NWRlYWUyZWNkMDNlOWM0NWQ1OCA9ICQoJzxkaXYgaWQ9Imh0bWxfMjQ5NzJkY2U2NmIwNDVkZWFlMmVjZDAzZTljNDVkNTgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkhhcmJvdXJmcm9udCBFYXN0LCBUb3JvbnRvIElzbGFuZHMsIFVuaW9uIFN0YXRpb24gQ2x1c3RlciAxPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kMDViY2ZjYWE2OGU0ZGM1OGIxMDJmNTE2NWM5YjZjZi5zZXRDb250ZW50KGh0bWxfMjQ5NzJkY2U2NmIwNDVkZWFlMmVjZDAzZTljNDVkNTgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMjQ5NDZkN2MxOWUwNDZlOWJiNzFjYjViMTUxOWNiMGUuYmluZFBvcHVwKHBvcHVwX2QwNWJjZmNhYTY4ZTRkYzU4YjEwMmY1MTY1YzliNmNmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2M4YWM3ZThiMDJkMDRhMGM4N2ZiZjZjOWNkNjdhNzgwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjQ3MTc2OCwtNzkuMzgxNTc2NDAwMDAwMDFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAicmVkIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAicmVkIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzE5ODhlZmI5ZjQ5MzQ1NTQ5YWRjODJlMjFmYTJhMTUyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2FhMjdlNmJlYTZmMjRjMTQ5NTJjMDMwNzZlM2Q0YzVjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzNkMzRiNTAyMmVhOTQwYjFiN2EyNzQ2MDc4YTgyZTA2ID0gJCgnPGRpdiBpZD0iaHRtbF8zZDM0YjUwMjJlYTk0MGIxYjdhMjc0NjA3OGE4MmUwNiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RGVzaWduIEV4Y2hhbmdlLCBUb3JvbnRvIERvbWluaW9uIENlbnRyZSBDbHVzdGVyIDE8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2FhMjdlNmJlYTZmMjRjMTQ5NTJjMDMwNzZlM2Q0YzVjLnNldENvbnRlbnQoaHRtbF8zZDM0YjUwMjJlYTk0MGIxYjdhMjc0NjA3OGE4MmUwNik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9jOGFjN2U4YjAyZDA0YTBjODdmYmY2YzljZDY3YTc4MC5iaW5kUG9wdXAocG9wdXBfYWEyN2U2YmVhNmYyNGMxNDk1MmMwMzA3NmUzZDRjNWMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMzhkNDhjMjNlMGE4NGNiOWFjZmY2MGI1YjIyZTUxYjYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42NDgxOTg1LC03OS4zNzk4MTY5MDAwMDAwMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJyZWQiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJyZWQiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMTk4OGVmYjlmNDkzNDU1NDlhZGM4MmUyMWZhMmExNTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZGM1ZTE4YzMxZGUwNDRjNjgwMzJiYmRkYTY1ZWNkNjcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMGU0MzExOTg3YmY2NDVjZTlkZDQ5YTcyZWVhMjYzMzkgPSAkKCc8ZGl2IGlkPSJodG1sXzBlNDMxMTk4N2JmNjQ1Y2U5ZGQ0OWE3MmVlYTI2MzM5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Db21tZXJjZSBDb3VydCwgVmljdG9yaWEgSG90ZWwgQ2x1c3RlciAxPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kYzVlMThjMzFkZTA0NGM2ODAzMmJiZGRhNjVlY2Q2Ny5zZXRDb250ZW50KGh0bWxfMGU0MzExOTg3YmY2NDVjZTlkZDQ5YTcyZWVhMjYzMzkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMzhkNDhjMjNlMGE4NGNiOWFjZmY2MGI1YjIyZTUxYjYuYmluZFBvcHVwKHBvcHVwX2RjNWUxOGMzMWRlMDQ0YzY4MDMyYmJkZGE2NWVjZDY3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2JkMmMwNjRlZTZmNzQ1NGRhZDcyNzVlYjY4NDA3YjUwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzMzMjgyNSwtNzkuNDE5NzQ5N10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJyZWQiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJyZWQiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMTk4OGVmYjlmNDkzNDU1NDlhZGM4MmUyMWZhMmExNTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYWI2YWY0N2EzZjIzNDQzZWE3MTU2YTBkNzc4NjRmMDggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYzdhNjAxYTc5ZmY0NDIwM2FhNDM5YTFkNzE0MjNlM2EgPSAkKCc8ZGl2IGlkPSJodG1sX2M3YTYwMWE3OWZmNDQyMDNhYTQzOWExZDcxNDIzZTNhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5CZWRmb3JkIFBhcmssIExhd3JlbmNlIE1hbm9yIEVhc3QgQ2x1c3RlciAxPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hYjZhZjQ3YTNmMjM0NDNlYTcxNTZhMGQ3Nzg2NGYwOC5zZXRDb250ZW50KGh0bWxfYzdhNjAxYTc5ZmY0NDIwM2FhNDM5YTFkNzE0MjNlM2EpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYmQyYzA2NGVlNmY3NDU0ZGFkNzI3NWViNjg0MDdiNTAuYmluZFBvcHVwKHBvcHVwX2FiNmFmNDdhM2YyMzQ0M2VhNzE1NmEwZDc3ODY0ZjA4KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzVjNTBkYTY5ODE0YzQ2YWY4MjNhOWZiZjJmNzBhODIzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzExNjk0OCwtNzkuNDE2OTM1NTk5OTk5OTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAieWVsbG93IiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzE5ODhlZmI5ZjQ5MzQ1NTQ5YWRjODJlMjFmYTJhMTUyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzM0MzUxYzE2M2MzNjQ3YzdiZjY0NzM4YmRjMzEzMjk5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzI5YzU2OTI3Y2I2YjQ3MWQ4OTI5OTY5OGYzMzhiMTVhID0gJCgnPGRpdiBpZD0iaHRtbF8yOWM1NjkyN2NiNmI0NzFkODkyOTk2OThmMzM4YjE1YSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Um9zZWxhd24gQ2x1c3RlciAzPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zNDM1MWMxNjNjMzY0N2M3YmY2NDczOGJkYzMxMzI5OS5zZXRDb250ZW50KGh0bWxfMjljNTY5MjdjYjZiNDcxZDg5Mjk5Njk4ZjMzOGIxNWEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNWM1MGRhNjk4MTRjNDZhZjgyM2E5ZmJmMmY3MGE4MjMuYmluZFBvcHVwKHBvcHVwXzM0MzUxYzE2M2MzNjQ3YzdiZjY0NzM4YmRjMzEzMjk5KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzBkOTNkYWU4NDk2ZDRlYzJhN2QxNDNmYTE1NGUyYTM4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjk2OTQ3NiwtNzkuNDExMzA3MjAwMDAwMDFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAieWVsbG93IiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzE5ODhlZmI5ZjQ5MzQ1NTQ5YWRjODJlMjFmYTJhMTUyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2VjYzFhMGFhOWIzNDRiNmRhZmQ3ZWMxYTM1MDVjZjg5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2VmMDgzNGFmOTg0ZjQyZTlhMDU0MzUzMmE2YTllYWVmID0gJCgnPGRpdiBpZD0iaHRtbF9lZjA4MzRhZjk4NGY0MmU5YTA1NDM1MzJhNmE5ZWFlZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Rm9yZXN0IEhpbGwgTm9ydGgsIEZvcmVzdCBIaWxsIFdlc3QgQ2x1c3RlciAzPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lY2MxYTBhYTliMzQ0YjZkYWZkN2VjMWEzNTA1Y2Y4OS5zZXRDb250ZW50KGh0bWxfZWYwODM0YWY5ODRmNDJlOWEwNTQzNTMyYTZhOWVhZWYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMGQ5M2RhZTg0OTZkNGVjMmE3ZDE0M2ZhMTU0ZTJhMzguYmluZFBvcHVwKHBvcHVwX2VjYzFhMGFhOWIzNDRiNmRhZmQ3ZWMxYTM1MDVjZjg5KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzUxY2EzY2UwN2JlZjQ1MDBiOWI0N2YwMDM0NDEzOTFkID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjcyNzA5NywtNzkuNDA1Njc4NDAwMDAwMDFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAicmVkIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAicmVkIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzE5ODhlZmI5ZjQ5MzQ1NTQ5YWRjODJlMjFmYTJhMTUyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzc0MGFkMmRiNTJkNjQ5NWI4MjRhZTk0MDc2MjBiMjQ1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzdhOTk2ZmY1ZmE5NTQ0NDJhMjkxMTY3OWM3ZTJhOWJmID0gJCgnPGRpdiBpZD0iaHRtbF83YTk5NmZmNWZhOTU0NDQyYTI5MTE2NzljN2UyYTliZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+VGhlIEFubmV4LCBOb3J0aCBNaWR0b3duLCBZb3JrdmlsbGUgQ2x1c3RlciAxPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83NDBhZDJkYjUyZDY0OTViODI0YWU5NDA3NjIwYjI0NS5zZXRDb250ZW50KGh0bWxfN2E5OTZmZjVmYTk1NDQ0MmEyOTExNjc5YzdlMmE5YmYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNTFjYTNjZTA3YmVmNDUwMGI5YjQ3ZjAwMzQ0MTM5MWQuYmluZFBvcHVwKHBvcHVwXzc0MGFkMmRiNTJkNjQ5NWI4MjRhZTk0MDc2MjBiMjQ1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzJkNGMwZWM0ZTFhZjQyYTdhOTUwNmY1OWNkYzYyODljID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjYyNjk1NiwtNzkuNDAwMDQ5M10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJyZWQiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJyZWQiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMTk4OGVmYjlmNDkzNDU1NDlhZGM4MmUyMWZhMmExNTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZWRjN2ViMTFmYzA0NGI2M2E1ODNjZTA1MGI4MGVkN2MgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNTk1MmFmYzMwODk4NGM2ZTgzMDZmY2MyNWY0MmE2NTIgPSAkKCc8ZGl2IGlkPSJodG1sXzU5NTJhZmMzMDg5ODRjNmU4MzA2ZmNjMjVmNDJhNjUyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5IYXJib3JkLCBVbml2ZXJzaXR5IG9mIFRvcm9udG8gQ2x1c3RlciAxPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lZGM3ZWIxMWZjMDQ0YjYzYTU4M2NlMDUwYjgwZWQ3Yy5zZXRDb250ZW50KGh0bWxfNTk1MmFmYzMwODk4NGM2ZTgzMDZmY2MyNWY0MmE2NTIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMmQ0YzBlYzRlMWFmNDJhN2E5NTA2ZjU5Y2RjNjI4OWMuYmluZFBvcHVwKHBvcHVwX2VkYzdlYjExZmMwNDRiNjNhNTgzY2UwNTBiODBlZDdjKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzQ5YWUzNWEzZTEwYzRhNWM4YThlNjJlZGJmMDQ5ODFiID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjUzMjA1NywtNzkuNDAwMDQ5M10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJyZWQiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJyZWQiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMTk4OGVmYjlmNDkzNDU1NDlhZGM4MmUyMWZhMmExNTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMTdjYTA3MjdiZmQxNDM0NmEyOTI3MzdjMWMxY2Y5ZTYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMTNkODhhNTBhYzVhNGVhYWFjMjBmMGNkYzc3NzM0NzcgPSAkKCc8ZGl2IGlkPSJodG1sXzEzZDg4YTUwYWM1YTRlYWFhYzIwZjBjZGM3NzczNDc3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DaGluYXRvd24sIEdyYW5nZSBQYXJrLCBLZW5zaW5ndG9uIE1hcmtldCBDbHVzdGVyIDE8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzE3Y2EwNzI3YmZkMTQzNDZhMjkyNzM3YzFjMWNmOWU2LnNldENvbnRlbnQoaHRtbF8xM2Q4OGE1MGFjNWE0ZWFhYWMyMGYwY2RjNzc3MzQ3Nyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl80OWFlMzVhM2UxMGM0YTVjOGE4ZTYyZWRiZjA0OTgxYi5iaW5kUG9wdXAocG9wdXBfMTdjYTA3MjdiZmQxNDM0NmEyOTI3MzdjMWMxY2Y5ZTYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNTMwZWU1M2JkMmNlNGUyZDk0NWU0NDFlYjJjNTdkM2IgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42Mjg5NDY3LC03OS4zOTQ0MTk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInJlZCIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogInJlZCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8xOTg4ZWZiOWY0OTM0NTU0OWFkYzgyZTIxZmEyYTE1Mik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xZTIzMTU1MzcyYjk0ZjE1OGRlZjRhNjE2MmI4OTEwMSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF85OGZhNDE3YmZmMGI0N2JmYTY1NjkxOGQ3YTE2YjZmNyA9ICQoJzxkaXYgaWQ9Imh0bWxfOThmYTQxN2JmZjBiNDdiZmE2NTY5MThkN2ExNmI2ZjciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNOIFRvd2VyLCBCYXRodXJzdCBRdWF5LCBJc2xhbmQgYWlycG9ydCwgSGFyYm91cmZyb250IFdlc3QsIEtpbmcgYW5kIFNwYWRpbmEsIFJhaWx3YXkgTGFuZHMsIFNvdXRoIE5pYWdhcmEgQ2x1c3RlciAxPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xZTIzMTU1MzcyYjk0ZjE1OGRlZjRhNjE2MmI4OTEwMS5zZXRDb250ZW50KGh0bWxfOThmYTQxN2JmZjBiNDdiZmE2NTY5MThkN2ExNmI2ZjcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNTMwZWU1M2JkMmNlNGUyZDk0NWU0NDFlYjJjNTdkM2IuYmluZFBvcHVwKHBvcHVwXzFlMjMxNTUzNzJiOTRmMTU4ZGVmNGE2MTYyYjg5MTAxKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzEzYWI0ODhiMDM3MTQ1NTBiZDg1ZGVjMzVjMjJlNmZhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjQ2NDM1MiwtNzkuMzc0ODQ1OTk5OTk5OTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAicmVkIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAicmVkIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzE5ODhlZmI5ZjQ5MzQ1NTQ5YWRjODJlMjFmYTJhMTUyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2UzZGY5YzBlMTM1MTQ4YTlhMGRiNzQ4YmNhOTQxMThmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzlmY2JkNDU0YzU3YjQxZDQ4ZjQ5ZTRhZDM4YmU4NzA5ID0gJCgnPGRpdiBpZD0iaHRtbF85ZmNiZDQ1NGM1N2I0MWQ0OGY0OWU0YWQzOGJlODcwOSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U3RuIEEgUE8gQm94ZXMgMjUgVGhlIEVzcGxhbmFkZSBDbHVzdGVyIDE8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2UzZGY5YzBlMTM1MTQ4YTlhMGRiNzQ4YmNhOTQxMThmLnNldENvbnRlbnQoaHRtbF85ZmNiZDQ1NGM1N2I0MWQ0OGY0OWU0YWQzOGJlODcwOSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8xM2FiNDg4YjAzNzE0NTUwYmQ4NWRlYzM1YzIyZTZmYS5iaW5kUG9wdXAocG9wdXBfZTNkZjljMGUxMzUxNDhhOWEwZGI3NDhiY2E5NDExOGYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMDBjZDExNzVhNTlkNGQ5YTg2MmM5NDdkN2E5ZmEwYmUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42NDg0MjkyLC03OS4zODIyODAyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInJlZCIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogInJlZCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8xOTg4ZWZiOWY0OTM0NTU0OWFkYzgyZTIxZmEyYTE1Mik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mYzhlMTBhODI4ZTc0ZjE4OTU1MDI3OGVjZTI0ZjkxNSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83ZGJkMjkwMGZmNGE0OGRmOWE3NDc0ZmYzYzkzZGUzNiA9ICQoJzxkaXYgaWQ9Imh0bWxfN2RiZDI5MDBmZjRhNDhkZjlhNzQ3NGZmM2M5M2RlMzYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkZpcnN0IENhbmFkaWFuIFBsYWNlLCBVbmRlcmdyb3VuZCBjaXR5IENsdXN0ZXIgMTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZmM4ZTEwYTgyOGU3NGYxODk1NTAyNzhlY2UyNGY5MTUuc2V0Q29udGVudChodG1sXzdkYmQyOTAwZmY0YTQ4ZGY5YTc0NzRmZjNjOTNkZTM2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzAwY2QxMTc1YTU5ZDRkOWE4NjJjOTQ3ZDdhOWZhMGJlLmJpbmRQb3B1cChwb3B1cF9mYzhlMTBhODI4ZTc0ZjE4OTU1MDI3OGVjZTI0ZjkxNSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85M2ZmNzdhMzg4NGM0NzY2YWEyODc3ZWYxYTA3NGQ1YiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjcxODUxNzk5OTk5OTk5NiwtNzkuNDY0NzYzMjk5OTk5OTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAicmVkIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAicmVkIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzE5ODhlZmI5ZjQ5MzQ1NTQ5YWRjODJlMjFmYTJhMTUyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzRiOWJjNjc1YzUwYzQ0NzBiNTIzYTA2MWQ5NzhkOGQyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2NmMTk2NzkwMTFhZDQzZTdhNmRmZTI2MjMxNWE5OGNkID0gJCgnPGRpdiBpZD0iaHRtbF9jZjE5Njc5MDExYWQ0M2U3YTZkZmUyNjIzMTVhOThjZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TGF3cmVuY2UgSGVpZ2h0cywgTGF3cmVuY2UgTWFub3IgQ2x1c3RlciAxPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80YjliYzY3NWM1MGM0NDcwYjUyM2EwNjFkOTc4ZDhkMi5zZXRDb250ZW50KGh0bWxfY2YxOTY3OTAxMWFkNDNlN2E2ZGZlMjYyMzE1YTk4Y2QpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOTNmZjc3YTM4ODRjNDc2NmFhMjg3N2VmMWEwNzRkNWIuYmluZFBvcHVwKHBvcHVwXzRiOWJjNjc1YzUwYzQ0NzBiNTIzYTA2MWQ5NzhkOGQyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2E3ODE4Mjc4MTIyNjRlOGU4ZWJhY2U5YmU3MjhiOGU5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzA5NTc3LC03OS40NDUwNzI1OTk5OTk5OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJvcmFuZ2UiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJvcmFuZ2UiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMTk4OGVmYjlmNDkzNDU1NDlhZGM4MmUyMWZhMmExNTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfY2RjY2E5MzI0YTg5NDA0NmI1OGM1NjE3YzI3NGZlNmEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYjk0ZGFjZDE3ZWZlNDYzNjg4YmUwNmY0ZDM1Mzg0MjYgPSAkKCc8ZGl2IGlkPSJodG1sX2I5NGRhY2QxN2VmZTQ2MzY4OGJlMDZmNGQzNTM4NDI2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5HbGVuY2Fpcm4gQ2x1c3RlciAwPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jZGNjYTkzMjRhODk0MDQ2YjU4YzU2MTdjMjc0ZmU2YS5zZXRDb250ZW50KGh0bWxfYjk0ZGFjZDE3ZWZlNDYzNjg4YmUwNmY0ZDM1Mzg0MjYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYTc4MTgyNzgxMjI2NGU4ZThlYmFjZTliZTcyOGI4ZTkuYmluZFBvcHVwKHBvcHVwX2NkY2NhOTMyNGE4OTQwNDZiNThjNTYxN2MyNzRmZTZhKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2JlMDVmMTk0N2E0MjQ3MTk5YTNhYWIxYzljNjc0NzE3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjkzNzgxMywtNzkuNDI4MTkxNDAwMDAwMDJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAicmVkIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAicmVkIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzE5ODhlZmI5ZjQ5MzQ1NTQ5YWRjODJlMjFmYTJhMTUyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzBmNTE2OGRhMzBmNTQ3M2Q5MzNmY2VmNTE4MjU3ZDQ3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2JlYWQ2NDAyZGMzODQ1MjY4MTMzN2IzMDkxZTBhYjRmID0gJCgnPGRpdiBpZD0iaHRtbF9iZWFkNjQwMmRjMzg0NTI2ODEzMzdiMzA5MWUwYWI0ZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+SHVtZXdvb2QtQ2VkYXJ2YWxlIENsdXN0ZXIgMTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMGY1MTY4ZGEzMGY1NDczZDkzM2ZjZWY1MTgyNTdkNDcuc2V0Q29udGVudChodG1sX2JlYWQ2NDAyZGMzODQ1MjY4MTMzN2IzMDkxZTBhYjRmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2JlMDVmMTk0N2E0MjQ3MTk5YTNhYWIxYzljNjc0NzE3LmJpbmRQb3B1cChwb3B1cF8wZjUxNjhkYTMwZjU0NzNkOTMzZmNlZjUxODI1N2Q0Nyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mOGI2NmY0Y2Q3MGQ0Y2Y2YTJmMzFmMzIzMTg1MDBlZiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY4OTAyNTYsLTc5LjQ1MzUxMl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJyZWQiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJyZWQiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMTk4OGVmYjlmNDkzNDU1NDlhZGM4MmUyMWZhMmExNTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOTFlZWE4MzA0YWU3NDE0NGIxNjIwZDNlYzRlMDlhNzIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZWZiYTcwZTA5ZTM3NDUyZmJmNmQyYjliOWRlYmNiNWEgPSAkKCc8ZGl2IGlkPSJodG1sX2VmYmE3MGUwOWUzNzQ1MmZiZjZkMmI5YjlkZWJjYjVhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DYWxlZG9uaWEtRmFpcmJhbmtzIENsdXN0ZXIgMTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOTFlZWE4MzA0YWU3NDE0NGIxNjIwZDNlYzRlMDlhNzIuc2V0Q29udGVudChodG1sX2VmYmE3MGUwOWUzNzQ1MmZiZjZkMmI5YjlkZWJjYjVhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2Y4YjY2ZjRjZDcwZDRjZjZhMmYzMWYzMjMxODUwMGVmLmJpbmRQb3B1cChwb3B1cF85MWVlYTgzMDRhZTc0MTQ0YjE2MjBkM2VjNGUwOWE3Mik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl82ZGFlYzFjYmJlMzk0ZTg2YWUyZDJlMzkxYjRhZTU2MSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY2OTU0MiwtNzkuNDIyNTYzN10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJyZWQiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJyZWQiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMTk4OGVmYjlmNDkzNDU1NDlhZGM4MmUyMWZhMmExNTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZDllMzI5N2JjMzc1NGZiM2I3ZDkxYjkwOGZkNDlhYWYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMDdhMzNmYmU5OTQwNDEyOWE5MmFhZDFmZTA5OTJjMWQgPSAkKCc8ZGl2IGlkPSJodG1sXzA3YTMzZmJlOTk0MDQxMjlhOTJhYWQxZmUwOTkyYzFkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DaHJpc3RpZSBDbHVzdGVyIDE8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2Q5ZTMyOTdiYzM3NTRmYjNiN2Q5MWI5MDhmZDQ5YWFmLnNldENvbnRlbnQoaHRtbF8wN2EzM2ZiZTk5NDA0MTI5YTkyYWFkMWZlMDk5MmMxZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl82ZGFlYzFjYmJlMzk0ZTg2YWUyZDJlMzkxYjRhZTU2MS5iaW5kUG9wdXAocG9wdXBfZDllMzI5N2JjMzc1NGZiM2I3ZDkxYjkwOGZkNDlhYWYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMTljNjBlZGM1ZGEzNGZhZmJkYmJmYjhlNjVhNDczNmEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42NjkwMDUxMDAwMDAwMSwtNzkuNDQyMjU5M10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJyZWQiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJyZWQiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMTk4OGVmYjlmNDkzNDU1NDlhZGM4MmUyMWZhMmExNTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYjgyYTJjYTk4N2ExNGVkNmE0ZmYwMGY1MzUwMWMwNmEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfODk4MDhjNTJiOGVjNDc3ZmE2YWZiYzdhMWY4YjdiZDQgPSAkKCc8ZGl2IGlkPSJodG1sXzg5ODA4YzUyYjhlYzQ3N2ZhNmFmYmM3YTFmOGI3YmQ0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Eb3ZlcmNvdXJ0IFZpbGxhZ2UsIER1ZmZlcmluIENsdXN0ZXIgMTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYjgyYTJjYTk4N2ExNGVkNmE0ZmYwMGY1MzUwMWMwNmEuc2V0Q29udGVudChodG1sXzg5ODA4YzUyYjhlYzQ3N2ZhNmFmYmM3YTFmOGI3YmQ0KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzE5YzYwZWRjNWRhMzRmYWZiZGJiZmI4ZTY1YTQ3MzZhLmJpbmRQb3B1cChwb3B1cF9iODJhMmNhOTg3YTE0ZWQ2YTRmZjAwZjUzNTAxYzA2YSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jZjMwMjYwNjQ1M2I0N2ZkODU2NDdiMGJhYWUzZjhlZiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY0NzkyNjcwMDAwMDAwNiwtNzkuNDE5NzQ5N10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJyZWQiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJyZWQiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMTk4OGVmYjlmNDkzNDU1NDlhZGM4MmUyMWZhMmExNTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNjhiOGRlYzVmYmIxNGNjYThiZGI2MThhNGVmOTU5YTMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMGZjODdiMzFlYTEyNGM5NTgyYzBmY2JmZjU0MTFkNDIgPSAkKCc8ZGl2IGlkPSJodG1sXzBmYzg3YjMxZWExMjRjOTU4MmMwZmNiZmY1NDExZDQyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5MaXR0bGUgUG9ydHVnYWwsIFRyaW5pdHkgQ2x1c3RlciAxPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82OGI4ZGVjNWZiYjE0Y2NhOGJkYjYxOGE0ZWY5NTlhMy5zZXRDb250ZW50KGh0bWxfMGZjODdiMzFlYTEyNGM5NTgyYzBmY2JmZjU0MTFkNDIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfY2YzMDI2MDY0NTNiNDdmZDg1NjQ3YjBiYWFlM2Y4ZWYuYmluZFBvcHVwKHBvcHVwXzY4YjhkZWM1ZmJiMTRjY2E4YmRiNjE4YTRlZjk1OWEzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzc3ZjlmZWE5OGQzNTRiMjk4Y2JjNGZiNTlmNWQ1Y2I2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjM2ODQ3MiwtNzkuNDI4MTkxNDAwMDAwMDJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAicmVkIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAicmVkIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzE5ODhlZmI5ZjQ5MzQ1NTQ5YWRjODJlMjFmYTJhMTUyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2NiN2IyYWNkMWUwYTQ4NWQ5Nzc0NzVmZDUwOGE3NmVmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzhiMTBiZTEyZWFmMTQ4NTRiNTY0NGY1NzNiYzVjOWYxID0gJCgnPGRpdiBpZD0iaHRtbF84YjEwYmUxMmVhZjE0ODU0YjU2NDRmNTczYmM1YzlmMSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QnJvY2t0b24sIEV4aGliaXRpb24gUGxhY2UsIFBhcmtkYWxlIFZpbGxhZ2UgQ2x1c3RlciAxPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jYjdiMmFjZDFlMGE0ODVkOTc3NDc1ZmQ1MDhhNzZlZi5zZXRDb250ZW50KGh0bWxfOGIxMGJlMTJlYWYxNDg1NGI1NjQ0ZjU3M2JjNWM5ZjEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNzdmOWZlYTk4ZDM1NGIyOThjYmM0ZmI1OWY1ZDVjYjYuYmluZFBvcHVwKHBvcHVwX2NiN2IyYWNkMWUwYTQ4NWQ5Nzc0NzVmZDUwOGE3NmVmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzQ4MmNiNjU0MTlkZjRiNTU5Y2E0N2ExYjBlNzI4MGIxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzEzNzU2MjAwMDAwMDA2LC03OS40OTAwNzM4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImdyZWVuIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiZ3JlZW4iLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMTk4OGVmYjlmNDkzNDU1NDlhZGM4MmUyMWZhMmExNTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNGI5ZjU4ZTk5N2FmNDM1Yjg1MjRiMTdlYjIyYjBiYmIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZDY3YjM5MGEzYTdlNDRmZmI3ZjkxNWY5OTc3NmI0ZmMgPSAkKCc8ZGl2IGlkPSJodG1sX2Q2N2IzOTBhM2E3ZTQ0ZmZiN2Y5MTVmOTk3NzZiNGZjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NYXBsZSBMZWFmIFBhcmssIE5vcnRoIFBhcmssIFVwd29vZCBQYXJrIENsdXN0ZXIgNDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNGI5ZjU4ZTk5N2FmNDM1Yjg1MjRiMTdlYjIyYjBiYmIuc2V0Q29udGVudChodG1sX2Q2N2IzOTBhM2E3ZTQ0ZmZiN2Y5MTVmOTk3NzZiNGZjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzQ4MmNiNjU0MTlkZjRiNTU5Y2E0N2ExYjBlNzI4MGIxLmJpbmRQb3B1cChwb3B1cF80YjlmNThlOTk3YWY0MzViODUyNGIxN2ViMjJiMGJiYik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8zZmNkOTI2MDc2MzU0ZWUxYmIwNzNkZjUzYmI2ZDI1ZiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY5MTExNTgsLTc5LjQ3NjAxMzI5OTk5OTk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInJlZCIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogInJlZCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8xOTg4ZWZiOWY0OTM0NTU0OWFkYzgyZTIxZmEyYTE1Mik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85Nzg1Mzg1Njk4ZDc0NGUyYjE2N2NlM2Y0MWZkNDU1YSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF84OGNjNDNiYmYzNjg0YTk4YTQyM2UxMDMwNDhiODk5ZCA9ICQoJzxkaXYgaWQ9Imh0bWxfODhjYzQzYmJmMzY4NGE5OGE0MjNlMTAzMDQ4Yjg5OWQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkRlbCBSYXksIEtlZWxlc2RhbGUsIE1vdW50IERlbm5pcywgU2lsdmVydGhvcm4gQ2x1c3RlciAxPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85Nzg1Mzg1Njk4ZDc0NGUyYjE2N2NlM2Y0MWZkNDU1YS5zZXRDb250ZW50KGh0bWxfODhjYzQzYmJmMzY4NGE5OGE0MjNlMTAzMDQ4Yjg5OWQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfM2ZjZDkyNjA3NjM1NGVlMWJiMDczZGY1M2JiNmQyNWYuYmluZFBvcHVwKHBvcHVwXzk3ODUzODU2OThkNzQ0ZTJiMTY3Y2UzZjQxZmQ0NTVhKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2MzNTQxNzkzMzU1ZDQzNjQ4ZjMxZjVmZjhjNTQ0NTkzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjczMTg1Mjk5OTk5OTksLTc5LjQ4NzI2MTkwMDAwMDAxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInJlZCIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogInJlZCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8xOTg4ZWZiOWY0OTM0NTU0OWFkYzgyZTIxZmEyYTE1Mik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hOTg3NWY3ZGFjMzQ0NTgyODM5ODMxY2IxY2YyNjMzMiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83OTYxM2M2NTk1N2E0YjNlODJkMDM4Yzg3MjIxNGJkZiA9ICQoJzxkaXYgaWQ9Imh0bWxfNzk2MTNjNjU5NTdhNGIzZTgyZDAzOGM4NzIyMTRiZGYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlRoZSBKdW5jdGlvbiBOb3J0aCwgUnVubnltZWRlIENsdXN0ZXIgMTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYTk4NzVmN2RhYzM0NDU4MjgzOTgzMWNiMWNmMjYzMzIuc2V0Q29udGVudChodG1sXzc5NjEzYzY1OTU3YTRiM2U4MmQwMzhjODcyMjE0YmRmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2MzNTQxNzkzMzU1ZDQzNjQ4ZjMxZjVmZjhjNTQ0NTkzLmJpbmRQb3B1cChwb3B1cF9hOTg3NWY3ZGFjMzQ0NTgyODM5ODMxY2IxY2YyNjMzMik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85NGQ4MzdmM2ViNWY0NDkxYTAwYThkNmVhZTIwYjk1YiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY2MTYwODMsLTc5LjQ2NDc2MzI5OTk5OTk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInJlZCIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogInJlZCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8xOTg4ZWZiOWY0OTM0NTU0OWFkYzgyZTIxZmEyYTE1Mik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hYjIyZGU0OWE4YTA0ZTA2ODU1MTg2NmM1OGI4NDFjMiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xMGJiNmJlNjU5YWE0YTU2OGI4YWM5ZGFlMjM5Nzc2NSA9ICQoJzxkaXYgaWQ9Imh0bWxfMTBiYjZiZTY1OWFhNGE1NjhiOGFjOWRhZTIzOTc3NjUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkhpZ2ggUGFyaywgVGhlIEp1bmN0aW9uIFNvdXRoIENsdXN0ZXIgMTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYWIyMmRlNDlhOGEwNGUwNjg1NTE4NjZjNThiODQxYzIuc2V0Q29udGVudChodG1sXzEwYmI2YmU2NTlhYTRhNTY4YjhhYzlkYWUyMzk3NzY1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzk0ZDgzN2YzZWI1ZjQ0OTFhMDBhOGQ2ZWFlMjBiOTViLmJpbmRQb3B1cChwb3B1cF9hYjIyZGU0OWE4YTA0ZTA2ODU1MTg2NmM1OGI4NDFjMik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mNDA3NmM4ZmU0NzE0Nzk5Yjk2MzFjODhkODBjNTcyNSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY0ODk1OTcsLTc5LjQ1NjMyNV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJyZWQiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJyZWQiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMTk4OGVmYjlmNDkzNDU1NDlhZGM4MmUyMWZhMmExNTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNzk5M2MxMTE1OTU5NGZmZTg3M2FjYTZiMmViZDZiOTggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNzA2M2IxMzYxNzY3NDc5YWFiY2ExMDdlODNhMWRlMTAgPSAkKCc8ZGl2IGlkPSJodG1sXzcwNjNiMTM2MTc2NzQ3OWFhYmNhMTA3ZTgzYTFkZTEwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5QYXJrZGFsZSwgUm9uY2VzdmFsbGVzIENsdXN0ZXIgMTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNzk5M2MxMTE1OTU5NGZmZTg3M2FjYTZiMmViZDZiOTguc2V0Q29udGVudChodG1sXzcwNjNiMTM2MTc2NzQ3OWFhYmNhMTA3ZTgzYTFkZTEwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2Y0MDc2YzhmZTQ3MTQ3OTliOTYzMWM4OGQ4MGM1NzI1LmJpbmRQb3B1cChwb3B1cF83OTkzYzExMTU5NTk0ZmZlODczYWNhNmIyZWJkNmI5OCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9iMDhiMmY2MDlkNWE0OTE3YmExZDk5ZjRhY2U3YjU3ZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY1MTU3MDYsLTc5LjQ4NDQ0OTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAicmVkIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAicmVkIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzE5ODhlZmI5ZjQ5MzQ1NTQ5YWRjODJlMjFmYTJhMTUyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2JlMzAyNzhlNGI1YjQ2ZDc5NmEwYmU2ODc4OTJiZDIzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzU5MTQ4ZjMwYjVkNTQ3YzA4MjhhMDcwMzVhYTJhNTg1ID0gJCgnPGRpdiBpZD0iaHRtbF81OTE0OGYzMGI1ZDU0N2MwODI4YTA3MDM1YWEyYTU4NSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UnVubnltZWRlLCBTd2Fuc2VhIENsdXN0ZXIgMTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYmUzMDI3OGU0YjViNDZkNzk2YTBiZTY4Nzg5MmJkMjMuc2V0Q29udGVudChodG1sXzU5MTQ4ZjMwYjVkNTQ3YzA4MjhhMDcwMzVhYTJhNTg1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2IwOGIyZjYwOWQ1YTQ5MTdiYTFkOTlmNGFjZTdiNTdkLmJpbmRQb3B1cChwb3B1cF9iZTMwMjc4ZTRiNWI0NmQ3OTZhMGJlNjg3ODkyYmQyMyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xY2Y5NzgyODFhODA0ZmRkYWQxMGI5YjRkMDlhN2EzMCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY2MjMwMTUsLTc5LjM4OTQ5MzhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAicmVkIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAicmVkIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzE5ODhlZmI5ZjQ5MzQ1NTQ5YWRjODJlMjFmYTJhMTUyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzNiZjYxMDVkNDBiNTRiMGFhMmZmYmRjNjlkYzI1MDE0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2YxMjg1MDFkMWE5ZDQzNmI4MTJlNDUwNGU1NWMyNjllID0gJCgnPGRpdiBpZD0iaHRtbF9mMTI4NTAxZDFhOWQ0MzZiODEyZTQ1MDRlNTVjMjY5ZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UXVlZW4mIzM5O3MgUGFyayBDbHVzdGVyIDE8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzNiZjYxMDVkNDBiNTRiMGFhMmZmYmRjNjlkYzI1MDE0LnNldENvbnRlbnQoaHRtbF9mMTI4NTAxZDFhOWQ0MzZiODEyZTQ1MDRlNTVjMjY5ZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8xY2Y5NzgyODFhODA0ZmRkYWQxMGI5YjRkMDlhN2EzMC5iaW5kUG9wdXAocG9wdXBfM2JmNjEwNWQ0MGI1NGIwYWEyZmZiZGM2OWRjMjUwMTQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZDM4MmNiODM1MjdhNGIwYzkwNmJiZmEwZGMzMWM4NDAgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42MzY5NjU2LC03OS42MTU4MTg5OTk5OTk5OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJyZWQiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJyZWQiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMTk4OGVmYjlmNDkzNDU1NDlhZGM4MmUyMWZhMmExNTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfY2M3ZTE1OTY1MTE5NDVjMmI1OTljNzUxNDQ0Y2E0YTQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZjMxNGI1OGRhY2RiNGE4Mzg3ZTcyY2Y5ODAyOTE2MzYgPSAkKCc8ZGl2IGlkPSJodG1sX2YzMTRiNThkYWNkYjRhODM4N2U3MmNmOTgwMjkxNjM2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DYW5hZGEgUG9zdCBHYXRld2F5IFByb2Nlc3NpbmcgQ2VudHJlIENsdXN0ZXIgMTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfY2M3ZTE1OTY1MTE5NDVjMmI1OTljNzUxNDQ0Y2E0YTQuc2V0Q29udGVudChodG1sX2YzMTRiNThkYWNkYjRhODM4N2U3MmNmOTgwMjkxNjM2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2QzODJjYjgzNTI3YTRiMGM5MDZiYmZhMGRjMzFjODQwLmJpbmRQb3B1cChwb3B1cF9jYzdlMTU5NjUxMTk0NWMyYjU5OWM3NTE0NDRjYTRhNCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9kMDQ1ZGJkNzNjNjg0NDY2ODgxZjQzNGRiZTFlOTNiZiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY2Mjc0MzksLTc5LjMyMTU1OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJyZWQiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJyZWQiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMTk4OGVmYjlmNDkzNDU1NDlhZGM4MmUyMWZhMmExNTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYTAwMzJkZmJmMTJkNDI2ZGE3MWZmMWMzMDc1MjA0YjUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZjlhYjY3YWNkMjc3NDdkMTgwOWIyM2UzNjNiOTBkMzUgPSAkKCc8ZGl2IGlkPSJodG1sX2Y5YWI2N2FjZDI3NzQ3ZDE4MDliMjNlMzYzYjkwZDM1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5CdXNpbmVzcyBSZXBseSBNYWlsIFByb2Nlc3NpbmcgQ2VudHJlIDk2OSBFYXN0ZXJuIENsdXN0ZXIgMTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYTAwMzJkZmJmMTJkNDI2ZGE3MWZmMWMzMDc1MjA0YjUuc2V0Q29udGVudChodG1sX2Y5YWI2N2FjZDI3NzQ3ZDE4MDliMjNlMzYzYjkwZDM1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2QwNDVkYmQ3M2M2ODQ0NjY4ODFmNDM0ZGJlMWU5M2JmLmJpbmRQb3B1cChwb3B1cF9hMDAzMmRmYmYxMmQ0MjZkYTcxZmYxYzMwNzUyMDRiNSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9iYzM1YjdhYTMyMGU0MDM4YTRmYTcwMGZiNzljYTVmZiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjYwNTY0NjYsLTc5LjUwMTMyMDcwMDAwMDAxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInJlZCIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogInJlZCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8xOTg4ZWZiOWY0OTM0NTU0OWFkYzgyZTIxZmEyYTE1Mik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82NDdjOGZkYTM0ODc0NmRmYmIxZTFjNGY2YTljMDg3NSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kM2ZkOWUwMmVjZTI0N2M0ODgzYTE0MjE1ZDQyNzFkNiA9ICQoJzxkaXYgaWQ9Imh0bWxfZDNmZDllMDJlY2UyNDdjNDg4M2ExNDIxNWQ0MjcxZDYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkh1bWJlciBCYXkgU2hvcmVzLCBNaW1pY28gU291dGgsIE5ldyBUb3JvbnRvIENsdXN0ZXIgMTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNjQ3YzhmZGEzNDg3NDZkZmJiMWUxYzRmNmE5YzA4NzUuc2V0Q29udGVudChodG1sX2QzZmQ5ZTAyZWNlMjQ3YzQ4ODNhMTQyMTVkNDI3MWQ2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2JjMzViN2FhMzIwZTQwMzhhNGZhNzAwZmI3OWNhNWZmLmJpbmRQb3B1cChwb3B1cF82NDdjOGZkYTM0ODc0NmRmYmIxZTFjNGY2YTljMDg3NSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9hZmY0OWEyMWQyMjQ0OWMxYTU5MmVkMWEzZGUzODMwMCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjYwMjQxMzcwMDAwMDAxLC03OS41NDM0ODQwOTk5OTk5OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJyZWQiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJyZWQiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMTk4OGVmYjlmNDkzNDU1NDlhZGM4MmUyMWZhMmExNTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNGJhYjc5YWViNzQ4NDUzYjg5YTU3ZDYwODk1NDMzNjIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZDBhYTNhN2YzOGVlNGY1YzhhNTYyNDdjODkwY2Q2YjMgPSAkKCc8ZGl2IGlkPSJodG1sX2QwYWEzYTdmMzhlZTRmNWM4YTU2MjQ3Yzg5MGNkNmIzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5BbGRlcndvb2QsIExvbmcgQnJhbmNoIENsdXN0ZXIgMTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNGJhYjc5YWViNzQ4NDUzYjg5YTU3ZDYwODk1NDMzNjIuc2V0Q29udGVudChodG1sX2QwYWEzYTdmMzhlZTRmNWM4YTU2MjQ3Yzg5MGNkNmIzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2FmZjQ5YTIxZDIyNDQ5YzFhNTkyZWQxYTNkZTM4MzAwLmJpbmRQb3B1cChwb3B1cF80YmFiNzlhZWI3NDg0NTNiODlhNTdkNjA4OTU0MzM2Mik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81OGQ1MWUxNjU1Yzk0OWNlOThkM2M1MzAzZmYyNGQzZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY1MzY1MzYwMDAwMDAwNSwtNzkuNTA2OTQzNl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJyZWQiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJyZWQiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMTk4OGVmYjlmNDkzNDU1NDlhZGM4MmUyMWZhMmExNTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYzc3YTllYzRlMDk4NDQ0NmI4Mzg0N2JlMDI5ZmVlZjUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNzE3Mjg4YzAyM2MzNDdhNzliOWQyYmUzZjFiNjRhYjUgPSAkKCc8ZGl2IGlkPSJodG1sXzcxNzI4OGMwMjNjMzQ3YTc5YjlkMmJlM2YxYjY0YWI1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5UaGUgS2luZ3N3YXksIE1vbnRnb21lcnkgUm9hZCwgT2xkIE1pbGwgTm9ydGggQ2x1c3RlciAxPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jNzdhOWVjNGUwOTg0NDQ2YjgzODQ3YmUwMjlmZWVmNS5zZXRDb250ZW50KGh0bWxfNzE3Mjg4YzAyM2MzNDdhNzliOWQyYmUzZjFiNjRhYjUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNThkNTFlMTY1NWM5NDljZTk4ZDNjNTMwM2ZmMjRkM2UuYmluZFBvcHVwKHBvcHVwX2M3N2E5ZWM0ZTA5ODQ0NDZiODM4NDdiZTAyOWZlZWY1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzg2MGEzZjA4ODhjNTQzNjlhNjhiYmI5MzAyODBmY2MyID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjM2MjU3OSwtNzkuNDk4NTA5MDk5OTk5OTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAieWVsbG93IiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzE5ODhlZmI5ZjQ5MzQ1NTQ5YWRjODJlMjFmYTJhMTUyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzA4ZDU2ZDY0ZWIwNDRiN2Q4MWNlYmYxNmI1MGQyOTZkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2RmOWNmMTE4NzQwMjQzOTc5OTBkZjQzN2QyYjAyMDVjID0gJCgnPGRpdiBpZD0iaHRtbF9kZjljZjExODc0MDI0Mzk3OTkwZGY0MzdkMmIwMjA1YyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+SHVtYmVyIEJheSwgS2luZyYjMzk7cyBNaWxsIFBhcmssIEtpbmdzd2F5IFBhcmsgU291dGggRWFzdCwgTWltaWNvIE5FLCBPbGQgTWlsbCBTb3V0aCwgVGhlIFF1ZWVuc3dheSBFYXN0LCBSb3lhbCBZb3JrIFNvdXRoIEVhc3QsIFN1bm55bGVhIENsdXN0ZXIgMzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMDhkNTZkNjRlYjA0NGI3ZDgxY2ViZjE2YjUwZDI5NmQuc2V0Q29udGVudChodG1sX2RmOWNmMTE4NzQwMjQzOTc5OTBkZjQzN2QyYjAyMDVjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzg2MGEzZjA4ODhjNTQzNjlhNjhiYmI5MzAyODBmY2MyLmJpbmRQb3B1cChwb3B1cF8wOGQ1NmQ2NGViMDQ0YjdkODFjZWJmMTZiNTBkMjk2ZCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl82OTUwMDVlYTkxNGY0ZWU2YjNjNjFhNzg4MWE3NmQ0ZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjYyODg0MDgsLTc5LjUyMDk5OTQwMDAwMDAxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInJlZCIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogInJlZCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8xOTg4ZWZiOWY0OTM0NTU0OWFkYzgyZTIxZmEyYTE1Mik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iNWFkOTExNGFmMjg0NGJkYWQ2MWVmY2M2ZDY5ZjU3OCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83MTkwY2NkZGVlMmQ0ODc5ODY3ZGYxODU0MmZlNmM5OCA9ICQoJzxkaXYgaWQ9Imh0bWxfNzE5MGNjZGRlZTJkNDg3OTg2N2RmMTg1NDJmZTZjOTgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPktpbmdzd2F5IFBhcmsgU291dGggV2VzdCwgTWltaWNvIE5XLCBUaGUgUXVlZW5zd2F5IFdlc3QsIFJveWFsIFlvcmsgU291dGggV2VzdCwgU291dGggb2YgQmxvb3IgQ2x1c3RlciAxPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iNWFkOTExNGFmMjg0NGJkYWQ2MWVmY2M2ZDY5ZjU3OC5zZXRDb250ZW50KGh0bWxfNzE5MGNjZGRlZTJkNDg3OTg2N2RmMTg1NDJmZTZjOTgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNjk1MDA1ZWE5MTRmNGVlNmIzYzYxYTc4ODFhNzZkNGQuYmluZFBvcHVwKHBvcHVwX2I1YWQ5MTE0YWYyODQ0YmRhZDYxZWZjYzZkNjlmNTc4KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzE1ODg2ZWFiODVkMzRmNDk4MjdkOGRkYzAzYTUyZDYxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjY3ODU1NiwtNzkuNTMyMjQyNDAwMDAwMDJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAieWVsbG93IiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzE5ODhlZmI5ZjQ5MzQ1NTQ5YWRjODJlMjFmYTJhMTUyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2EyOTk3NTA1NTZjNDRlNWRhOWZkYjQwODhiNWU1OTA5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2JhZjkzNjEwMTdhMDRhNzc5MDkzZGU2MTNlMmE5NmMwID0gJCgnPGRpdiBpZD0iaHRtbF9iYWY5MzYxMDE3YTA0YTc3OTA5M2RlNjEzZTJhOTZjMCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+SXNsaW5ndG9uIEF2ZW51ZSBDbHVzdGVyIDM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2EyOTk3NTA1NTZjNDRlNWRhOWZkYjQwODhiNWU1OTA5LnNldENvbnRlbnQoaHRtbF9iYWY5MzYxMDE3YTA0YTc3OTA5M2RlNjEzZTJhOTZjMCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8xNTg4NmVhYjg1ZDM0ZjQ5ODI3ZDhkZGMwM2E1MmQ2MS5iaW5kUG9wdXAocG9wdXBfYTI5OTc1MDU1NmM0NGU1ZGE5ZmRiNDA4OGI1ZTU5MDkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNGUwZTA1ZTYzNjY3NGZlZWFkNDZiNmNmNWM4ZTRiMDUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42NTA5NDMyLC03OS41NTQ3MjQ0MDAwMDAwMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJyZWQiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJyZWQiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMTk4OGVmYjlmNDkzNDU1NDlhZGM4MmUyMWZhMmExNTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZGJjMDFiYjY4OTEzNGMzMWE3NTA1MTE4ZTgxZjJmYTUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMjc5NGJkOWU5NmEwNDRlNDk2ZDI3NzI3ZDljM2ExODkgPSAkKCc8ZGl2IGlkPSJodG1sXzI3OTRiZDllOTZhMDQ0ZTQ5NmQyNzcyN2Q5YzNhMTg5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DbG92ZXJkYWxlLCBJc2xpbmd0b24sIE1hcnRpbiBHcm92ZSwgUHJpbmNlc3MgR2FyZGVucywgV2VzdCBEZWFuZSBQYXJrIENsdXN0ZXIgMTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZGJjMDFiYjY4OTEzNGMzMWE3NTA1MTE4ZTgxZjJmYTUuc2V0Q29udGVudChodG1sXzI3OTRiZDllOTZhMDQ0ZTQ5NmQyNzcyN2Q5YzNhMTg5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzRlMGUwNWU2MzY2NzRmZWVhZDQ2YjZjZjVjOGU0YjA1LmJpbmRQb3B1cChwb3B1cF9kYmMwMWJiNjg5MTM0YzMxYTc1MDUxMThlODFmMmZhNSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lYmU4NGUxOWM2NzA0YWRlYmU2OGRjOWViM2IyMDMyOCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY0MzUxNTIsLTc5LjU3NzIwMDc5OTk5OTk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInJlZCIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogInJlZCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8xOTg4ZWZiOWY0OTM0NTU0OWFkYzgyZTIxZmEyYTE1Mik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hZDY4MmM4NzM0MWE0NmJmOWYxMzFjZmM0ODc3Y2I0MCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mYWVmZmE2YzU5ZDE0OGQxODkyNDdkMDY2MWQ1MzQ2ZCA9ICQoJzxkaXYgaWQ9Imh0bWxfZmFlZmZhNmM1OWQxNDhkMTg5MjQ3ZDA2NjFkNTM0NmQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkJsb29yZGFsZSBHYXJkZW5zLCBFcmluZ2F0ZSwgTWFya2xhbmQgV29vZCwgT2xkIEJ1cm5oYW10aG9ycGUgQ2x1c3RlciAxPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hZDY4MmM4NzM0MWE0NmJmOWYxMzFjZmM0ODc3Y2I0MC5zZXRDb250ZW50KGh0bWxfZmFlZmZhNmM1OWQxNDhkMTg5MjQ3ZDA2NjFkNTM0NmQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZWJlODRlMTljNjcwNGFkZWJlNjhkYzllYjNiMjAzMjguYmluZFBvcHVwKHBvcHVwX2FkNjgyYzg3MzQxYTQ2YmY5ZjEzMWNmYzQ4NzdjYjQwKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzExOTEyMGZlMzU5MTRhMjFhNmYxNzQ4MjE2OTdhNDMzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzU2MzAzMywtNzkuNTY1OTYzMjk5OTk5OTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMTk4OGVmYjlmNDkzNDU1NDlhZGM4MmUyMWZhMmExNTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYTg5OTk3NDI0YzZlNDM2ZDhhMDA4ZjczNzdmYmI4ZWEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNTc1OTc4ZjE2NzZjNGYwNDhkMTAzMjg1ZWZhYzQxZTEgPSAkKCc8ZGl2IGlkPSJodG1sXzU3NTk3OGYxNjc2YzRmMDQ4ZDEwMzI4NWVmYWM0MWUxIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5IdW1iZXIgU3VtbWl0IENsdXN0ZXIgMjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYTg5OTk3NDI0YzZlNDM2ZDhhMDA4ZjczNzdmYmI4ZWEuc2V0Q29udGVudChodG1sXzU3NTk3OGYxNjc2YzRmMDQ4ZDEwMzI4NWVmYWM0MWUxKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzExOTEyMGZlMzU5MTRhMjFhNmYxNzQ4MjE2OTdhNDMzLmJpbmRQb3B1cChwb3B1cF9hODk5OTc0MjRjNmU0MzZkOGEwMDhmNzM3N2ZiYjhlYSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl82NGI2ODczMzQ5MjU0OThiYTE2N2FhYzVlOTdiOTk0NCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjcyNDc2NTksLTc5LjUzMjI0MjQwMDAwMDAyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInJlZCIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogInJlZCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8xOTg4ZWZiOWY0OTM0NTU0OWFkYzgyZTIxZmEyYTE1Mik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF81Y2FmMjcxMmU0MzE0YTkwYjFiY2FjMzFkZjg1MTY5NCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF85ZDkyNDA4NDVhOGM0MjNjOGM0YjFlMTZiNjRmYWM4OCA9ICQoJzxkaXYgaWQ9Imh0bWxfOWQ5MjQwODQ1YThjNDIzYzhjNGIxZTE2YjY0ZmFjODgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkVtZXJ5LCBIdW1iZXJsZWEgQ2x1c3RlciAxPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81Y2FmMjcxMmU0MzE0YTkwYjFiY2FjMzFkZjg1MTY5NC5zZXRDb250ZW50KGh0bWxfOWQ5MjQwODQ1YThjNDIzYzhjNGIxZTE2YjY0ZmFjODgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNjRiNjg3MzM0OTI1NDk4YmExNjdhYWM1ZTk3Yjk5NDQuYmluZFBvcHVwKHBvcHVwXzVjYWYyNzEyZTQzMTRhOTBiMWJjYWMzMWRmODUxNjk0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2M1ODA4MGYzMTc0MzQ4MzliYWY2YjY3YzRmYTkyMTQ0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzA2ODc2LC03OS41MTgxODg0MDAwMDAwMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJvcmFuZ2UiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJvcmFuZ2UiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMTk4OGVmYjlmNDkzNDU1NDlhZGM4MmUyMWZhMmExNTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYzVkMDQyMjAzY2ViNDg5M2IyM2EyYzc5N2E4ZTllNTggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYTQxMGE3Nzk0N2VkNDgwMThjNzAyMDIyMzliNTg1MTQgPSAkKCc8ZGl2IGlkPSJodG1sX2E0MTBhNzc5NDdlZDQ4MDE4YzcwMjAyMjM5YjU4NTE0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5XZXN0b24gQ2x1c3RlciAwPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jNWQwNDIyMDNjZWI0ODkzYjIzYTJjNzk3YThlOWU1OC5zZXRDb250ZW50KGh0bWxfYTQxMGE3Nzk0N2VkNDgwMThjNzAyMDIyMzliNTg1MTQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYzU4MDgwZjMxNzQzNDgzOWJhZjZiNjdjNGZhOTIxNDQuYmluZFBvcHVwKHBvcHVwX2M1ZDA0MjIwM2NlYjQ4OTNiMjNhMmM3OTdhOGU5ZTU4KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2FkOTA4YmMwOGFkOTQ3MTRiOTUyZDQ2MDE1MTNlYjM4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjk2MzE5LC03OS41MzIyNDI0MDAwMDAwMl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJyZWQiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJyZWQiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMTk4OGVmYjlmNDkzNDU1NDlhZGM4MmUyMWZhMmExNTIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfY2RjZjZlYmQzNDNhNDQ5YmJkMGJiZjVkN2M0ZTZhYzYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNjBkNDJlNDA5YTAyNDJjNzg3NzMxOGI0MzE2YjU0NzggPSAkKCc8ZGl2IGlkPSJodG1sXzYwZDQyZTQwOWEwMjQyYzc4NzczMThiNDMxNmI1NDc4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5XZXN0bW91bnQgQ2x1c3RlciAxPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jZGNmNmViZDM0M2E0NDliYmQwYmJmNWQ3YzRlNmFjNi5zZXRDb250ZW50KGh0bWxfNjBkNDJlNDA5YTAyNDJjNzg3NzMxOGI0MzE2YjU0NzgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYWQ5MDhiYzA4YWQ5NDcxNGI5NTJkNDYwMTUxM2ViMzguYmluZFBvcHVwKHBvcHVwX2NkY2Y2ZWJkMzQzYTQ0OWJiZDBiYmY1ZDdjNGU2YWM2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzQwYWM3MTk0MDIwMjRjYTg5MGUxYTI1MGZkZjE4N2M5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjg4OTA1NCwtNzkuNTU0NzI0NDAwMDAwMDFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAicmVkIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAicmVkIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzE5ODhlZmI5ZjQ5MzQ1NTQ5YWRjODJlMjFmYTJhMTUyKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2JmY2UzMzUxZTEwYjRmYmFiMzFkODdlMjc4NDU1MzBmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzM2ODRkMWVhNWE5YjQxNTk4OWVkZjQ0Njk4ZjM1NWM5ID0gJCgnPGRpdiBpZD0iaHRtbF8zNjg0ZDFlYTVhOWI0MTU5ODllZGY0NDY5OGYzNTVjOSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+S2luZ3N2aWV3IFZpbGxhZ2UsIE1hcnRpbiBHcm92ZSBHYXJkZW5zLCBSaWNodmlldyBHYXJkZW5zLCBTdC4gUGhpbGxpcHMgQ2x1c3RlciAxPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iZmNlMzM1MWUxMGI0ZmJhYjMxZDg3ZTI3ODQ1NTMwZi5zZXRDb250ZW50KGh0bWxfMzY4NGQxZWE1YTliNDE1OTg5ZWRmNDQ2OThmMzU1YzkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNDBhYzcxOTQwMjAyNGNhODkwZTFhMjUwZmRmMTg3YzkuYmluZFBvcHVwKHBvcHVwX2JmY2UzMzUxZTEwYjRmYmFiMzFkODdlMjc4NDU1MzBmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzUzYTMwNjFmYmY0NzQ5M2U4MjNmZTBjNThiODllZGE0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzM5NDE2Mzk5OTk5OTk2LC03OS41ODg0MzY5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIm9yYW5nZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIm9yYW5nZSIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8xOTg4ZWZiOWY0OTM0NTU0OWFkYzgyZTIxZmEyYTE1Mik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF83ZDhjMTExOTIwMTA0ZGY2OWQ0NTdjNzkyNGM1NGQ1MiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iNGNjMTZjYTRiZDA0YWJkYTcyYzFjMmRlMTBjN2ExNyA9ICQoJzxkaXYgaWQ9Imh0bWxfYjRjYzE2Y2E0YmQwNGFiZGE3MmMxYzJkZTEwYzdhMTciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkFsYmlvbiBHYXJkZW5zLCBCZWF1bW9uZCBIZWlnaHRzLCBIdW1iZXJnYXRlLCBKYW1lc3Rvd24sIE1vdW50IE9saXZlLCBTaWx2ZXJzdG9uZSwgU291dGggU3RlZWxlcywgVGhpc3RsZXRvd24gQ2x1c3RlciAwPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83ZDhjMTExOTIwMTA0ZGY2OWQ0NTdjNzkyNGM1NGQ1Mi5zZXRDb250ZW50KGh0bWxfYjRjYzE2Y2E0YmQwNGFiZGE3MmMxYzJkZTEwYzdhMTcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNTNhMzA2MWZiZjQ3NDkzZTgyM2ZlMGM1OGI4OWVkYTQuYmluZFBvcHVwKHBvcHVwXzdkOGMxMTE5MjAxMDRkZjY5ZDQ1N2M3OTI0YzU0ZDUyKTsKCiAgICAgICAgICAgIAogICAgICAgIAo8L3NjcmlwdD4=\" style=\"position:absolute;width:100%;height:100%;left:0;top:0;border:none !important;\" allowfullscreen webkitallowfullscreen mozallowfullscreen></iframe></div></div>"
],
"text/plain": [
"<folium.folium.Map at 0x7f842c1797f0>"
]
},
"execution_count": 26,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"map_clusters_mean = folium.Map(location=[43.7,-79.4], zoom_start=10.5)\n",
"\n",
"# add markers to the map\n",
"markers_colors = []\n",
"for lat, lon, poi, cluster in zip(df_full_clust['Latitude'], df_full_clust['Longitude'], df_full_clust['Neighbourhood'], df_full_clust['Cluster Mean']):\n",
" label = folium.Popup(str(poi) + ' Cluster ' + str(cluster), parse_html=True)\n",
" folium.CircleMarker(\n",
" [lat, lon],\n",
" radius=5,\n",
" popup=label,\n",
" color=rainbow[cluster-1],\n",
" fill=True,\n",
" fill_color=rainbow[cluster-1],\n",
" fill_opacity=0.7).add_to(map_clusters_mean)\n",
" \n",
"map_clusters_mean"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The mean based clustering is, as expected, less sensitive to the highly developed city center and provides some interesting distinctions between areas. Lets examine the cluster centers to see what venues are underlying this clustering."
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"---- Average Area in red Cluster Contains ----\n",
"Pizza Place: 0.16406371406371406\n",
"Grocery Store: 0.12463092463092464\n",
"Coffee Shop: 0.0704998704998705\n",
"Pharmacy: 0.06225071225071225\n",
"Fast Food Restaurant: 0.049119399119399124\n",
"---- Average Area in blue Cluster Contains ----\n",
"Coffee Shop: 0.07749833920188944\n",
"Pizza Place: 0.037358320729786176\n",
"Café: 0.033658561226974595\n",
"Sandwich Place: 0.03005853238822756\n",
"Fast Food Restaurant: 0.028875273299247304\n",
"---- Average Area in yellow Cluster Contains ----\n",
"Bakery: 0.5\n",
"Empanada Restaurant: 0.25\n",
"Pizza Place: 0.25\n",
"Accessories Store: 0.0\n",
"Adult Boutique: 0.0\n",
"---- Average Area in green Cluster Contains ----\n",
"Park: 0.20305555555555554\n",
"Playground: 0.10527777777777778\n",
"Bank: 0.061388888888888896\n",
"Trail: 0.05\n",
"Business Service: 0.041666666666666664\n",
"---- Average Area in orange Cluster Contains ----\n",
"Home Service: 0.35\n",
"Bakery: 0.125\n",
"Construction & Landscaping: 0.125\n",
"Baseball Field: 0.1\n",
"Market: 0.1\n"
]
}
],
"source": [
"toronto_grouped_clustering_mean['Cluster'] = kmeans_mean.labels_\n",
"mean_cluster_means = toronto_grouped_clustering_mean.groupby('Cluster').mean()\n",
"mean_cluster_means.index = rainbow \n",
"num_top_venues = 5\n",
"\n",
"for c in mean_cluster_means.index:\n",
" print(\"---- Average Area in \"+c+\" Cluster Contains ----\")\n",
" temp = mean_cluster_means[mean_cluster_means.index==c]\n",
" for _ in range(num_top_venues):\n",
" ven_type = temp.idxmax(axis=1)[0]\n",
" print('{}: {}'.format(ven_type, temp.loc[c, ven_type]))\n",
" temp = temp.drop(temp.idxmax(axis=1), axis=1)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.8"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment