In this blog post, we will explore neighborhoods in Toronto, Canada.

First, we will build the code to scrape an HTML table from this Wikipedia page (https://en.wikipedia.org/wiki/List_of_postal_codes_of_Canada:_M) that lists postal codes in Canada.

We will need requests for getting the HTML contents of the website and lxml.html for parsing the relevant fields. We will then store this data on a pandas dataframe.

import requests
import lxml.html as lh
import pandas as pd
import numpy as np

Scrape the HTML table cells.

url = 'https://en.wikipedia.org/wiki/List_of_postal_codes_of_Canada:_M'

# create a handle page to handle the contents of the website
page = requests.get(url)

# store the contents of the website under doc
doc = lh.fromstring(page.content)

# parse data that are stored between <tr>...</tr> of HTML
tr_elements = doc.xpath('//tr')

Ensure that all the rows have the same width. If not, we probably got something more that just the table.

[len(T) for T in tr_elements[:10]]
[3, 3, 3, 3, 3, 3, 3, 3, 3, 3]

This means that there are 3 columns per row.
Now parse the table header.

tr_elements = doc.xpath('//tr')

# create an empty list
col = []
i = 0

# for each row, store each first element (header) and an empty list
for t in tr_elements[0]:
    i+=1
    name = t.text_content()
    print('%d:"%s"'%(i,name))
    col.append((name,[]))
1:"Postcode"
2:"Borough"
3:"Neighbourhood
"

Create pandas dataframe

Each header is appended to a tuple along with an empty list

for j in range(1, len(tr_elements)):
    #T is our j'th row
    T = tr_elements[j]
    
    # if row is not of size 3, the //tr data is not from our table 
    if len(T)!= 3:
        break
    
    # i is the index of our column
    i = 0
    
    # iterate through each element of the row
    for t in T.iterchildren():
        data = t.text_content() 
        # check if row is empty
        if i > 0:
        # convert any numerical value to integers
            try:
                data = int(data)
            except:
                pass
        # append the data to the empty list of the i'th column
        col[i][1].append(data)
        # increment i for the next column
        i+=1

Check the length of each column. Ideally, there should all be the same.

[len(C) for (title, C) in col]
[287, 287, 287]

This shows that each of the columns has exactly 287 rows.

Create the dataframe.

Dict = {title:column for (title, column) in col}
df = pd.DataFrame(Dict)
df.head()
Postcode Borough Neighbourhood\n
0 M1A Not assigned Not assigned\n
1 M2A Not assigned Not assigned\n
2 M3A North York Parkwoods\n
3 M4A North York Victoria Village\n
4 M5A Downtown Toronto Harbourfront\n
df.columns = ['Postcode', 'Borough', 'Neighborhood']
cols = df.columns.tolist()
cols
['Postcode', 'Borough', 'Neighborhood']

Clean the messy string in the Neighborhood column.

df = df.replace('\n', ' ', regex=True)
df.head()
Postcode Borough Neighborhood
0 M1A Not assigned Not assigned
1 M2A Not assigned Not assigned
2 M3A North York Parkwoods
3 M4A North York Victoria Village
4 M5A Downtown Toronto Harbourfront

Drop all cells with a Borough that is "Not assigned".

df.drop(df.index[df['Borough'] == 'Not assigned'], inplace=True)
# reset the index and drop the previous index
df = df.reset_index(drop=True)
df.head(10)
Postcode Borough Neighborhood
0 M3A North York Parkwoods
1 M4A North York Victoria Village
2 M5A Downtown Toronto Harbourfront
3 M6A North York Lawrence Heights
4 M6A North York Lawrence Manor
5 M7A Downtown Toronto Queen's Park
6 M9A Etobicoke Islington Avenue
7 M1B Scarborough Rouge
8 M1B Scarborough Malvern
9 M3B North York Don Mills North

Combine neighborhoods based on similar Postcode and Borough.

df = df.groupby(['Postcode', 'Borough'])['Neighborhood'].apply(','.join).reset_index()
df.columns = ['Postcode', 'Borough', 'Neighborhood']
df.head(10)
Postcode Borough Neighborhood
0 M1B Scarborough Rouge ,Malvern
1 M1C Scarborough Highland Creek ,Rouge Hill ,Port Union
2 M1E Scarborough Guildwood ,Morningside ,West Hill
3 M1G Scarborough Woburn
4 M1H Scarborough Cedarbrae
5 M1J Scarborough Scarborough Village
6 M1K Scarborough East Birchmount Park ,Ionview ,Kennedy Park
7 M1L Scarborough Clairlea ,Golden Mile ,Oakridge
8 M1M Scarborough Cliffcrest ,Cliffside ,Scarborough Village West
9 M1N Scarborough Birch Cliff ,Cliffside West

Remove any spacing at the start of the string.

df['Neighborhood'] = df['Neighborhood'].str.strip()

Assign Borough values to the Neighborhood where value is "Not assigned".

df.loc[df['Neighborhood'] == 'Not assigned', 'Neighborhood'] = df['Borough']
df.shape
(103, 3)
df.to_csv(r'df_can.csv')

Get the coordinates of each neighborhood

Read the geospatial data into a pandas dataframe.

link = 'http://cocl.us/Geospatial_data'
df1 = pd.read_csv(link)
df1.head()
Postal Code Latitude Longitude
0 M1B 43.806686 -79.194353
1 M1C 43.784535 -79.160497
2 M1E 43.763573 -79.188711
3 M1G 43.770992 -79.216917
4 M1H 43.773136 -79.239476
df1.shape
(103, 3)

Change the column name 'Postal code' to 'Postcode' to merge the two data frames together.

df1.columns = ['Postcode', 'Latitude', 'Longitude']

cols = df1.columns.tolist()
cols
['Postcode', 'Latitude', 'Longitude']

Read the csv file saved in the previous assignment.

df = pd.read_csv('df_can.csv', index_col=0)
df.head()
Postcode Borough Neighborhood
0 M1B Scarborough Rouge ,Malvern
1 M1C Scarborough Highland Creek ,Rouge Hill ,Port Union
2 M1E Scarborough Guildwood ,Morningside ,West Hill
3 M1G Scarborough Woburn
4 M1H Scarborough Cedarbrae

Merge the two dataframes togehter based on their Postcode.

df_new = pd.merge(df, df1, on='Postcode')
df_new.head()
Postcode Borough Neighborhood Latitude Longitude
0 M1B Scarborough Rouge ,Malvern 43.806686 -79.194353
1 M1C Scarborough Highland Creek ,Rouge Hill ,Port Union 43.784535 -79.160497
2 M1E Scarborough Guildwood ,Morningside ,West Hill 43.763573 -79.188711
3 M1G Scarborough Woburn 43.770992 -79.216917
4 M1H Scarborough Cedarbrae 43.773136 -79.239476
df_new.to_csv(r'df_final.csv')

Segmentation and Clustering

import numpy as np # library to handle data in a vectorized manner

import pandas as pd # library for data analsysis
pd.set_option('display.max_columns', None)
pd.set_option('display.max_rows', None)

import json # library to handle JSON files

#!conda install -c conda-forge geopy --yes # uncomment this line if you haven't completed the Foursquare API lab
from geopy.geocoders import Nominatim # convert an address into latitude and longitude values

import requests # library to handle requests
from pandas.io.json import json_normalize # tranform JSON file into a pandas dataframe

# Matplotlib and associated plotting modules
import matplotlib.cm as cm
import matplotlib.colors as colors

# import k-means from clustering stage
from sklearn.cluster import KMeans

#!conda install -c conda-forge folium=0.5.0 --yes # uncomment this line if you haven't completed the Foursquare API lab
import folium # map rendering library

print('Libraries imported.')
Libraries imported.
neighborhoods = pd.read_csv('df_final.csv', index_col=0)
neighborhoods.head()
Postcode Borough Neighborhood Latitude Longitude
0 M1B Scarborough Rouge ,Malvern 43.806686 -79.194353
1 M1C Scarborough Highland Creek ,Rouge Hill ,Port Union 43.784535 -79.160497
2 M1E Scarborough Guildwood ,Morningside ,West Hill 43.763573 -79.188711
3 M1G Scarborough Woburn 43.770992 -79.216917
4 M1H Scarborough Cedarbrae 43.773136 -79.239476

Find out how many boroughs and neighborhoods are in the dataset.

print('The dataframe has {} boroughs and {} neighborhoods'.format(
    len(neighborhoods['Borough'].unique()), neighborhoods.shape[0]
))
The dataframe has 10 boroughs and 103 neighborhoods

Use the geopy library to get the latitude and longitude values of Toronto, Canada.

address = 'Toronto, Canada'

geolocator = Nominatim(user_agent='can_explorer')
location = geolocator.geocode(address)
latitude = location.latitude
longitude = location.longitude
print('The geographical coordinates of Toronto are {}, {}'.format(latitude, longitude))
The geographical coordinates of Toronto are 43.653963, -79.387207

Visualize the neighborhoods.

map_toronto = folium.Map(location=[latitude, longitude], zoom_start=10)

# add markers to map
for lat, lng, borough, neighborhood in zip(neighborhoods['Latitude'], neighborhoods['Longitude'], neighborhoods['Borough'], neighborhoods['Neighborhood']):
    label = '{}, {}'.format(neighborhood, borough)
    label = folium.Popup(label, parse_html=True)
    folium.CircleMarker(
        [lat, lng],
        radius=5,
        popup=label,
        color='blue',
        fill=True,
        fill_color='#3186cc',
        fill_opacity=0.7,
        parse_html=False).add_to(map_toronto)  
    
map_toronto
<iframe src="about:blank" style="position:absolute;width:100%;height:100%;left:0;top:0;border:none !important;" data-html=PCFET0NUWVBFIGh0bWw+CjxoZWFkPiAgICAKICAgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPgogICAgPHNjcmlwdD5MX1BSRUZFUl9DQU5WQVMgPSBmYWxzZTsgTF9OT19UT1VDSCA9IGZhbHNlOyBMX0RJU0FCTEVfM0QgPSBmYWxzZTs8L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2FqYXguZ29vZ2xlYXBpcy5jb20vYWpheC9saWJzL2pxdWVyeS8xLjExLjEvanF1ZXJ5Lm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvanMvYm9vdHN0cmFwLm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvTGVhZmxldC5hd2Vzb21lLW1hcmtlcnMvMi4wLjIvbGVhZmxldC5hd2Vzb21lLW1hcmtlcnMuanMiPjwvc2NyaXB0PgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9jc3MvYm9vdHN0cmFwLm1pbi5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvY3NzL2Jvb3RzdHJhcC10aGVtZS5taW4uY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vbWF4Y2RuLmJvb3RzdHJhcGNkbi5jb20vZm9udC1hd2Vzb21lLzQuNi4zL2Nzcy9mb250LWF3ZXNvbWUubWluLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9MZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy8yLjAuMi9sZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9yYXdnaXQuY29tL3B5dGhvbi12aXN1YWxpemF0aW9uL2ZvbGl1bS9tYXN0ZXIvZm9saXVtL3RlbXBsYXRlcy9sZWFmbGV0LmF3ZXNvbWUucm90YXRlLmNzcyIvPgogICAgPHN0eWxlPmh0bWwsIGJvZHkge3dpZHRoOiAxMDAlO2hlaWdodDogMTAwJTttYXJnaW46IDA7cGFkZGluZzogMDt9PC9zdHlsZT4KICAgIDxzdHlsZT4jbWFwIHtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtyaWdodDowO2xlZnQ6MDt9PC9zdHlsZT4KICAgIAogICAgICAgICAgICA8c3R5bGU+ICNtYXBfOTE3YmQxYjg0OTdlNDA2NWJlNmJhZGNhNmNlNTg4MDggewogICAgICAgICAgICAgICAgcG9zaXRpb24gOiByZWxhdGl2ZTsKICAgICAgICAgICAgICAgIHdpZHRoIDogMTAwLjAlOwogICAgICAgICAgICAgICAgaGVpZ2h0OiAxMDAuMCU7CiAgICAgICAgICAgICAgICBsZWZ0OiAwLjAlOwogICAgICAgICAgICAgICAgdG9wOiAwLjAlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICA8L3N0eWxlPgogICAgICAgIAo8L2hlYWQ+Cjxib2R5PiAgICAKICAgIAogICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb2xpdW0tbWFwIiBpZD0ibWFwXzkxN2JkMWI4NDk3ZTQwNjViZTZiYWRjYTZjZTU4ODA4IiA+PC9kaXY+CiAgICAgICAgCjwvYm9keT4KPHNjcmlwdD4gICAgCiAgICAKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGJvdW5kcyA9IG51bGw7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcF85MTdiZDFiODQ5N2U0MDY1YmU2YmFkY2E2Y2U1ODgwOCA9IEwubWFwKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21hcF85MTdiZDFiODQ5N2U0MDY1YmU2YmFkY2E2Y2U1ODgwOCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y2VudGVyOiBbNDMuNjUzOTYzLC03OS4zODcyMDddLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgem9vbTogMTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhCb3VuZHM6IGJvdW5kcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyczogW10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JsZENvcHlKdW1wOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyczogTC5DUlMuRVBTRzM4NTcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciB0aWxlX2xheWVyX2ZjNmUwODkzMzE4NzQxODZiYjM0MDdjNmUyN2U1OGMxID0gTC50aWxlTGF5ZXIoCiAgICAgICAgICAgICAgICAnaHR0cHM6Ly97c30udGlsZS5vcGVuc3RyZWV0bWFwLm9yZy97en0ve3h9L3t5fS5wbmcnLAogICAgICAgICAgICAgICAgewogICJhdHRyaWJ1dGlvbiI6IG51bGwsCiAgImRldGVjdFJldGluYSI6IGZhbHNlLAogICJtYXhab29tIjogMTgsCiAgIm1pblpvb20iOiAxLAogICJub1dyYXAiOiBmYWxzZSwKICAic3ViZG9tYWlucyI6ICJhYmMiCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzkxN2JkMWI4NDk3ZTQwNjViZTZiYWRjYTZjZTU4ODA4KTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lYjE5NzZkYWQzNjA0NTExYWQwZTY1N2E1OWViMWFiMiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjgwNjY4NjMsLTc5LjE5NDM1MzQwMDAwMDAzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzkxN2JkMWI4NDk3ZTQwNjViZTZiYWRjYTZjZTU4ODA4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzNjY2ZiZjZiYzU5NDQ2NzY5MTgwNzVkZTA0ZTM5NzNhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzEyMjk2YWQyYjNlZTQ0NDBiZTAzM2EzM2FiMTk5MTkyID0gJCgnPGRpdiBpZD0iaHRtbF8xMjI5NmFkMmIzZWU0NDQwYmUwMzNhMzNhYjE5OTE5MiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Um91Z2UgLE1hbHZlcm4sIFNjYXJib3JvdWdoPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zY2NmYmY2YmM1OTQ0Njc2OTE4MDc1ZGUwNGUzOTczYS5zZXRDb250ZW50KGh0bWxfMTIyOTZhZDJiM2VlNDQ0MGJlMDMzYTMzYWIxOTkxOTIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZWIxOTc2ZGFkMzYwNDUxMWFkMGU2NTdhNTllYjFhYjIuYmluZFBvcHVwKHBvcHVwXzNjY2ZiZjZiYzU5NDQ2NzY5MTgwNzVkZTA0ZTM5NzNhKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2NiMmRkOGIxYWMyMTQ3ZmE4M2JiZGMxNDBlNmIyNGQwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzg0NTM1MSwtNzkuMTYwNDk3MDk5OTk5OTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTE3YmQxYjg0OTdlNDA2NWJlNmJhZGNhNmNlNTg4MDgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYTRlNmE1MTQ3YjViNDE3OWI1NjVjNDVmYmNmNWQ1OGEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNDJhNDA4NGQ0ZGJjNDgxMGE5YjlmZGEyMWI1YTdhZmUgPSAkKCc8ZGl2IGlkPSJodG1sXzQyYTQwODRkNGRiYzQ4MTBhOWI5ZmRhMjFiNWE3YWZlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5IaWdobGFuZCBDcmVlayAsUm91Z2UgSGlsbCAsUG9ydCBVbmlvbiwgU2NhcmJvcm91Z2g8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2E0ZTZhNTE0N2I1YjQxNzliNTY1YzQ1ZmJjZjVkNThhLnNldENvbnRlbnQoaHRtbF80MmE0MDg0ZDRkYmM0ODEwYTliOWZkYTIxYjVhN2FmZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9jYjJkZDhiMWFjMjE0N2ZhODNiYmRjMTQwZTZiMjRkMC5iaW5kUG9wdXAocG9wdXBfYTRlNmE1MTQ3YjViNDE3OWI1NjVjNDVmYmNmNWQ1OGEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZmNjYmU3ZmQyNWRiNDg2OTkyNmIwYzNjZWE0MzllMzggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43NjM1NzI2LC03OS4xODg3MTE1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzkxN2JkMWI4NDk3ZTQwNjViZTZiYWRjYTZjZTU4ODA4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzczZDJkNTFlMWY3OTQ4MTg5MjMyN2Y0NDczZDIyZDc0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzBkNDRiMDk4NWFhMzQ1ZWM4NDFlZWY0ZTgyOTJhMWVkID0gJCgnPGRpdiBpZD0iaHRtbF8wZDQ0YjA5ODVhYTM0NWVjODQxZWVmNGU4MjkyYTFlZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+R3VpbGR3b29kICxNb3JuaW5nc2lkZSAsV2VzdCBIaWxsLCBTY2FyYm9yb3VnaDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNzNkMmQ1MWUxZjc5NDgxODkyMzI3ZjQ0NzNkMjJkNzQuc2V0Q29udGVudChodG1sXzBkNDRiMDk4NWFhMzQ1ZWM4NDFlZWY0ZTgyOTJhMWVkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2ZjY2JlN2ZkMjVkYjQ4Njk5MjZiMGMzY2VhNDM5ZTM4LmJpbmRQb3B1cChwb3B1cF83M2QyZDUxZTFmNzk0ODE4OTIzMjdmNDQ3M2QyMmQ3NCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mNjc5NmQyNWMzMGM0YjAyOTAwNjY5M2JlMGRhYzdjOCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjc3MDk5MjEsLTc5LjIxNjkxNzQwMDAwMDAxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzkxN2JkMWI4NDk3ZTQwNjViZTZiYWRjYTZjZTU4ODA4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2VmYzEwOTkyODlmNTQzMmI4MWE1YjlmOWRlY2YzMTg5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzM1MWQ5YTAyYmZlZTRkZDFhN2EzODYyOGViNGE0NDI0ID0gJCgnPGRpdiBpZD0iaHRtbF8zNTFkOWEwMmJmZWU0ZGQxYTdhMzg2MjhlYjRhNDQyNCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+V29idXJuLCBTY2FyYm9yb3VnaDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZWZjMTA5OTI4OWY1NDMyYjgxYTViOWY5ZGVjZjMxODkuc2V0Q29udGVudChodG1sXzM1MWQ5YTAyYmZlZTRkZDFhN2EzODYyOGViNGE0NDI0KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2Y2Nzk2ZDI1YzMwYzRiMDI5MDA2NjkzYmUwZGFjN2M4LmJpbmRQb3B1cChwb3B1cF9lZmMxMDk5Mjg5ZjU0MzJiODFhNWI5ZjlkZWNmMzE4OSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl80OTVkZjU0MjUwOGQ0Nzg5YTE5Y2UxNGUyNmU3YzgzMCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjc3MzEzNiwtNzkuMjM5NDc2MDk5OTk5OThdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTE3YmQxYjg0OTdlNDA2NWJlNmJhZGNhNmNlNTg4MDgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfY2U2NDVjZjNmMzFhNDc0NzhjYzE3NWUxZjI1YjdjYmYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZWI1MDM1NDViNzZlNGY2NDkxZjI5MmQ4OGQ2YTg4OWQgPSAkKCc8ZGl2IGlkPSJodG1sX2ViNTAzNTQ1Yjc2ZTRmNjQ5MWYyOTJkODhkNmE4ODlkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DZWRhcmJyYWUsIFNjYXJib3JvdWdoPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jZTY0NWNmM2YzMWE0NzQ3OGNjMTc1ZTFmMjViN2NiZi5zZXRDb250ZW50KGh0bWxfZWI1MDM1NDViNzZlNGY2NDkxZjI5MmQ4OGQ2YTg4OWQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNDk1ZGY1NDI1MDhkNDc4OWExOWNlMTRlMjZlN2M4MzAuYmluZFBvcHVwKHBvcHVwX2NlNjQ1Y2YzZjMxYTQ3NDc4Y2MxNzVlMWYyNWI3Y2JmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2IzYTNlZTQwYWZkYzQ0NDdiODJkOTM2MWQ0MzJmYWE1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzQ0NzM0MiwtNzkuMjM5NDc2MDk5OTk5OThdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTE3YmQxYjg0OTdlNDA2NWJlNmJhZGNhNmNlNTg4MDgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZDNmNWE4ODUzYTRhNGYzZjk4NzAxNjQxYTlhZmRjMmEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZTkzMWQwNjJmMjYwNDg1NGIzMmFjMjFhNjFhMzA2ZjcgPSAkKCc8ZGl2IGlkPSJodG1sX2U5MzFkMDYyZjI2MDQ4NTRiMzJhYzIxYTYxYTMwNmY3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5TY2FyYm9yb3VnaCBWaWxsYWdlLCBTY2FyYm9yb3VnaDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZDNmNWE4ODUzYTRhNGYzZjk4NzAxNjQxYTlhZmRjMmEuc2V0Q29udGVudChodG1sX2U5MzFkMDYyZjI2MDQ4NTRiMzJhYzIxYTYxYTMwNmY3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2IzYTNlZTQwYWZkYzQ0NDdiODJkOTM2MWQ0MzJmYWE1LmJpbmRQb3B1cChwb3B1cF9kM2Y1YTg4NTNhNGE0ZjNmOTg3MDE2NDFhOWFmZGMyYSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85NWU3MzljNzNjMzM0NjlmOWViNTJjNjZkMjE0N2VmZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjcyNzkyOTIsLTc5LjI2MjAyOTQwMDAwMDAyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzkxN2JkMWI4NDk3ZTQwNjViZTZiYWRjYTZjZTU4ODA4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2NlN2Y1NjNmMDJkODQzZmRiNDI0ODQwODVmZDg5ODgzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzU0NjM0MGE2YzA5MjQ1ZTE4OWNjNjdkYmE3MGM3OWVmID0gJCgnPGRpdiBpZD0iaHRtbF81NDYzNDBhNmMwOTI0NWUxODljYzY3ZGJhNzBjNzllZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RWFzdCBCaXJjaG1vdW50IFBhcmsgLElvbnZpZXcgLEtlbm5lZHkgUGFyaywgU2NhcmJvcm91Z2g8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2NlN2Y1NjNmMDJkODQzZmRiNDI0ODQwODVmZDg5ODgzLnNldENvbnRlbnQoaHRtbF81NDYzNDBhNmMwOTI0NWUxODljYzY3ZGJhNzBjNzllZik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl85NWU3MzljNzNjMzM0NjlmOWViNTJjNjZkMjE0N2VmZC5iaW5kUG9wdXAocG9wdXBfY2U3ZjU2M2YwMmQ4NDNmZGI0MjQ4NDA4NWZkODk4ODMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNTYxNTY2NGFjMjc2NGQ1YTgyMzgzNTZmYWY3M2RjYTQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43MTExMTE3LC03OS4yODQ1NzcyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzkxN2JkMWI4NDk3ZTQwNjViZTZiYWRjYTZjZTU4ODA4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzQzYjVhZDQ5ZWRlNjRkNGM4NWIzMjFhZDc1ZjBkNWE1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzdmZTIxYjI2M2U3ZDQ2MTBhYzU2NTk0YjhiNjhlMTE1ID0gJCgnPGRpdiBpZD0iaHRtbF83ZmUyMWIyNjNlN2Q0NjEwYWM1NjU5NGI4YjY4ZTExNSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q2xhaXJsZWEgLEdvbGRlbiBNaWxlICxPYWtyaWRnZSwgU2NhcmJvcm91Z2g8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzQzYjVhZDQ5ZWRlNjRkNGM4NWIzMjFhZDc1ZjBkNWE1LnNldENvbnRlbnQoaHRtbF83ZmUyMWIyNjNlN2Q0NjEwYWM1NjU5NGI4YjY4ZTExNSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81NjE1NjY0YWMyNzY0ZDVhODIzODM1NmZhZjczZGNhNC5iaW5kUG9wdXAocG9wdXBfNDNiNWFkNDllZGU2NGQ0Yzg1YjMyMWFkNzVmMGQ1YTUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfY2E5OTExNjVlZTk1NDk3YTgwZTZkNDczMmE3NjQ0NGIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43MTYzMTYsLTc5LjIzOTQ3NjA5OTk5OTk4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzkxN2JkMWI4NDk3ZTQwNjViZTZiYWRjYTZjZTU4ODA4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2RhODUzMGNlNTc3OTQ3MGQ5ZTNjN2Q1N2JkZDI2MmIyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzIyMzY4YTlhMGNhNDRlYTI4NDExMTYwZjIxOGVlYzQ1ID0gJCgnPGRpdiBpZD0iaHRtbF8yMjM2OGE5YTBjYTQ0ZWEyODQxMTE2MGYyMThlZWM0NSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q2xpZmZjcmVzdCAsQ2xpZmZzaWRlICxTY2FyYm9yb3VnaCBWaWxsYWdlIFdlc3QsIFNjYXJib3JvdWdoPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kYTg1MzBjZTU3Nzk0NzBkOWUzYzdkNTdiZGQyNjJiMi5zZXRDb250ZW50KGh0bWxfMjIzNjhhOWEwY2E0NGVhMjg0MTExNjBmMjE4ZWVjNDUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfY2E5OTExNjVlZTk1NDk3YTgwZTZkNDczMmE3NjQ0NGIuYmluZFBvcHVwKHBvcHVwX2RhODUzMGNlNTc3OTQ3MGQ5ZTNjN2Q1N2JkZDI2MmIyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2Y4ZGZmYzA2OWE0ODQ3YzA4MjFjNjBkNjVjMTg4ZWU1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjkyNjU3LC03OS4yNjQ4NDgxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzkxN2JkMWI4NDk3ZTQwNjViZTZiYWRjYTZjZTU4ODA4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzNjYTc4YTg5NzM0NjQyYjM5NWMzNDNkYTljMzc4ZWMzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzQ0ZmE0ZTZhNWQ3ZjRlZjA4ZjNjYzAwZTZkYmUwZjU3ID0gJCgnPGRpdiBpZD0iaHRtbF80NGZhNGU2YTVkN2Y0ZWYwOGYzY2MwMGU2ZGJlMGY1NyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QmlyY2ggQ2xpZmYgLENsaWZmc2lkZSBXZXN0LCBTY2FyYm9yb3VnaDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfM2NhNzhhODk3MzQ2NDJiMzk1YzM0M2RhOWMzNzhlYzMuc2V0Q29udGVudChodG1sXzQ0ZmE0ZTZhNWQ3ZjRlZjA4ZjNjYzAwZTZkYmUwZjU3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2Y4ZGZmYzA2OWE0ODQ3YzA4MjFjNjBkNjVjMTg4ZWU1LmJpbmRQb3B1cChwb3B1cF8zY2E3OGE4OTczNDY0MmIzOTVjMzQzZGE5YzM3OGVjMyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl80ODg2YTdlNzZmN2M0ZThmYmZhZmFhMDFlMDZjNjhmZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjc1NzQwOTYsLTc5LjI3MzMwNDAwMDAwMDAyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzkxN2JkMWI4NDk3ZTQwNjViZTZiYWRjYTZjZTU4ODA4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzI0YWI5NTliYTE3YTQyMWE5OGVjNDQyNmExNWM0ZTg1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2QwMjMzYjhhMWZmYzRhOWY4NTdhMzIyZDYzZjkxYjUyID0gJCgnPGRpdiBpZD0iaHRtbF9kMDIzM2I4YTFmZmM0YTlmODU3YTMyMmQ2M2Y5MWI1MiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RG9yc2V0IFBhcmsgLFNjYXJib3JvdWdoIFRvd24gQ2VudHJlICxXZXhmb3JkIEhlaWdodHMsIFNjYXJib3JvdWdoPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yNGFiOTU5YmExN2E0MjFhOThlYzQ0MjZhMTVjNGU4NS5zZXRDb250ZW50KGh0bWxfZDAyMzNiOGExZmZjNGE5Zjg1N2EzMjJkNjNmOTFiNTIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNDg4NmE3ZTc2ZjdjNGU4ZmJmYWZhYTAxZTA2YzY4ZmUuYmluZFBvcHVwKHBvcHVwXzI0YWI5NTliYTE3YTQyMWE5OGVjNDQyNmExNWM0ZTg1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2QyYWEyNWVkZmVjNTRmOTRiYjJiOTNhODVlNjAzMzBiID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzUwMDcxNSwtNzkuMjk1ODQ5MV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85MTdiZDFiODQ5N2U0MDY1YmU2YmFkY2E2Y2U1ODgwOCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF80YjgzNTE2NzljMDU0NzdhOGVlYWZlZjUwN2JlYjNmZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82YzMwZjEwZWZlZGI0NmFiODdhYjEwYTU5NWZjZGM2ZiA9ICQoJzxkaXYgaWQ9Imh0bWxfNmMzMGYxMGVmZWRiNDZhYjg3YWIxMGE1OTVmY2RjNmYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk1hcnl2YWxlICxXZXhmb3JkLCBTY2FyYm9yb3VnaDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNGI4MzUxNjc5YzA1NDc3YThlZWFmZWY1MDdiZWIzZmYuc2V0Q29udGVudChodG1sXzZjMzBmMTBlZmVkYjQ2YWI4N2FiMTBhNTk1ZmNkYzZmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2QyYWEyNWVkZmVjNTRmOTRiYjJiOTNhODVlNjAzMzBiLmJpbmRQb3B1cChwb3B1cF80YjgzNTE2NzljMDU0NzdhOGVlYWZlZjUwN2JlYjNmZik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9iNzM5ZTYzOTY4OTY0ODg3YWJlZWQ4OWU3ZjI0MDI1NyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjc5NDIwMDMsLTc5LjI2MjAyOTQwMDAwMDAyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzkxN2JkMWI4NDk3ZTQwNjViZTZiYWRjYTZjZTU4ODA4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzVhYTUyZjk1ZTAyMjRkNGJhZDU3YjE2M2JiNGU1ZWQ3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzJlZDIwMTIyMzMwZjQ4MWRiMmNlNmZmNjA0YTNlZDA5ID0gJCgnPGRpdiBpZD0iaHRtbF8yZWQyMDEyMjMzMGY0ODFkYjJjZTZmZjYwNGEzZWQwOSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QWdpbmNvdXJ0LCBTY2FyYm9yb3VnaDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNWFhNTJmOTVlMDIyNGQ0YmFkNTdiMTYzYmI0ZTVlZDcuc2V0Q29udGVudChodG1sXzJlZDIwMTIyMzMwZjQ4MWRiMmNlNmZmNjA0YTNlZDA5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2I3MzllNjM5Njg5NjQ4ODdhYmVlZDg5ZTdmMjQwMjU3LmJpbmRQb3B1cChwb3B1cF81YWE1MmY5NWUwMjI0ZDRiYWQ1N2IxNjNiYjRlNWVkNyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9kNjdlM2VjZmRhNzY0OGE5YmIyYjY1NzY4ZDk1MTRhMiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjc4MTYzNzUsLTc5LjMwNDMwMjFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTE3YmQxYjg0OTdlNDA2NWJlNmJhZGNhNmNlNTg4MDgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfN2M5NTc2YjE1MDlhNDc2Nzk1ZTdhZGYwMTk1M2RhZmQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOGE0NjYyMGVkYjJiNDE1Mjk3ZGU5NGNlZmQ1NDQ4YzEgPSAkKCc8ZGl2IGlkPSJodG1sXzhhNDY2MjBlZGIyYjQxNTI5N2RlOTRjZWZkNTQ0OGMxIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DbGFya3MgQ29ybmVycyAsU3VsbGl2YW4gLFRhbSBPJiMzOTtTaGFudGVyLCBTY2FyYm9yb3VnaDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfN2M5NTc2YjE1MDlhNDc2Nzk1ZTdhZGYwMTk1M2RhZmQuc2V0Q29udGVudChodG1sXzhhNDY2MjBlZGIyYjQxNTI5N2RlOTRjZWZkNTQ0OGMxKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2Q2N2UzZWNmZGE3NjQ4YTliYjJiNjU3NjhkOTUxNGEyLmJpbmRQb3B1cChwb3B1cF83Yzk1NzZiMTUwOWE0NzY3OTVlN2FkZjAxOTUzZGFmZCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8yZTYzYjlkMjhhZWE0YmI2OGFlZjIyNmZlODM4ZTI0MyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjgxNTI1MjIsLTc5LjI4NDU3NzJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTE3YmQxYjg0OTdlNDA2NWJlNmJhZGNhNmNlNTg4MDgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOTQzNGI4ZjQwM2I4NDUzODgzNDBmYmU1ZGRkNzA4NjkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNWE2OTlkNDg4M2UyNDFjYzg0NDhkNDhhNDAwZTdlZDMgPSAkKCc8ZGl2IGlkPSJodG1sXzVhNjk5ZDQ4ODNlMjQxY2M4NDQ4ZDQ4YTQwMGU3ZWQzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5BZ2luY291cnQgTm9ydGggLEwmIzM5O0Ftb3JlYXV4IEVhc3QgLE1pbGxpa2VuICxTdGVlbGVzIEVhc3QsIFNjYXJib3JvdWdoPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85NDM0YjhmNDAzYjg0NTM4ODM0MGZiZTVkZGQ3MDg2OS5zZXRDb250ZW50KGh0bWxfNWE2OTlkNDg4M2UyNDFjYzg0NDhkNDhhNDAwZTdlZDMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMmU2M2I5ZDI4YWVhNGJiNjhhZWYyMjZmZTgzOGUyNDMuYmluZFBvcHVwKHBvcHVwXzk0MzRiOGY0MDNiODQ1Mzg4MzQwZmJlNWRkZDcwODY5KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2YzOTU1MDg2ZjljNjQ2YmFiNTA0ZWRhNTg0ZjRkZjQzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzk5NTI1MjAwMDAwMDEsLTc5LjMxODM4ODddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTE3YmQxYjg0OTdlNDA2NWJlNmJhZGNhNmNlNTg4MDgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfODg4NjliZDExYjY1NDA1OWE3ODUwMTM3ZTlkZjY2NTEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZGM2YjMwZDIwZWM3NDI4Y2IyMzFmMWFmOTk3YTE2MDAgPSAkKCc8ZGl2IGlkPSJodG1sX2RjNmIzMGQyMGVjNzQyOGNiMjMxZjFhZjk5N2ExNjAwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5MJiMzOTtBbW9yZWF1eCBXZXN0LCBTY2FyYm9yb3VnaDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfODg4NjliZDExYjY1NDA1OWE3ODUwMTM3ZTlkZjY2NTEuc2V0Q29udGVudChodG1sX2RjNmIzMGQyMGVjNzQyOGNiMjMxZjFhZjk5N2ExNjAwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2YzOTU1MDg2ZjljNjQ2YmFiNTA0ZWRhNTg0ZjRkZjQzLmJpbmRQb3B1cChwb3B1cF84ODg2OWJkMTFiNjU0MDU5YTc4NTAxMzdlOWRmNjY1MSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jYjVlYzE5NjcxMzM0OWRlOWEyNTZhY2Q4Yzg1NmYzNSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjgzNjEyNDcwMDAwMDAwNiwtNzkuMjA1NjM2MDk5OTk5OThdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTE3YmQxYjg0OTdlNDA2NWJlNmJhZGNhNmNlNTg4MDgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfM2E3ZTNlMzUwNDQ3NDIxOWI1ZGUzN2M2YmE5ODQ3MTcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNTZjY2ViOGEyMWU2NDBkOWFjYmY0ZmEyNjk5ZWNmNDMgPSAkKCc8ZGl2IGlkPSJodG1sXzU2Y2NlYjhhMjFlNjQwZDlhY2JmNGZhMjY5OWVjZjQzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5VcHBlciBSb3VnZSwgU2NhcmJvcm91Z2g8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzNhN2UzZTM1MDQ0NzQyMTliNWRlMzdjNmJhOTg0NzE3LnNldENvbnRlbnQoaHRtbF81NmNjZWI4YTIxZTY0MGQ5YWNiZjRmYTI2OTllY2Y0Myk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9jYjVlYzE5NjcxMzM0OWRlOWEyNTZhY2Q4Yzg1NmYzNS5iaW5kUG9wdXAocG9wdXBfM2E3ZTNlMzUwNDQ3NDIxOWI1ZGUzN2M2YmE5ODQ3MTcpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNmYxYjhiNWE2ZWRmNGVjMTlhNjU1NWExNDkxZmQ4MzkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My44MDM3NjIyLC03OS4zNjM0NTE3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzkxN2JkMWI4NDk3ZTQwNjViZTZiYWRjYTZjZTU4ODA4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzU3NDBhMDY1MTM3NTRmMzZiMTJjM2YzYWU1MjJlOTA4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzAyYTkxNTkwZmEzZDRkNjBiMWJjZTlkOWE0NDgyNWI3ID0gJCgnPGRpdiBpZD0iaHRtbF8wMmE5MTU5MGZhM2Q0ZDYwYjFiY2U5ZDlhNDQ4MjViNyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+SGlsbGNyZXN0IFZpbGxhZ2UsIE5vcnRoIFlvcms8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzU3NDBhMDY1MTM3NTRmMzZiMTJjM2YzYWU1MjJlOTA4LnNldENvbnRlbnQoaHRtbF8wMmE5MTU5MGZhM2Q0ZDYwYjFiY2U5ZDlhNDQ4MjViNyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl82ZjFiOGI1YTZlZGY0ZWMxOWE2NTU1YTE0OTFmZDgzOS5iaW5kUG9wdXAocG9wdXBfNTc0MGEwNjUxMzc1NGYzNmIxMmMzZjNhZTUyMmU5MDgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZTYwYTEwNTU1NTM3NDNlMjgyYWZlNzliNzM0Y2JiMjcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43Nzg1MTc1LC03OS4zNDY1NTU3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzkxN2JkMWI4NDk3ZTQwNjViZTZiYWRjYTZjZTU4ODA4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzE4MzZiMmI4YWMwNjRlMmJhNTc1MzU3ZWE5ZjllZTRkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2MyMTIxY2Y5MDkwYTQ4ZjFhZjRiZGEyODM0OTQwZDg5ID0gJCgnPGRpdiBpZD0iaHRtbF9jMjEyMWNmOTA5MGE0OGYxYWY0YmRhMjgzNDk0MGQ4OSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RmFpcnZpZXcgLEhlbnJ5IEZhcm0gLE9yaW9sZSwgTm9ydGggWW9yazwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMTgzNmIyYjhhYzA2NGUyYmE1NzUzNTdlYTlmOWVlNGQuc2V0Q29udGVudChodG1sX2MyMTIxY2Y5MDkwYTQ4ZjFhZjRiZGEyODM0OTQwZDg5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2U2MGExMDU1NTUzNzQzZTI4MmFmZTc5YjczNGNiYjI3LmJpbmRQb3B1cChwb3B1cF8xODM2YjJiOGFjMDY0ZTJiYTU3NTM1N2VhOWY5ZWU0ZCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85ODVkYTE3NmM1MGM0YWVmOTZhMjJmMzIzMzgzNjczZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjc4Njk0NzMsLTc5LjM4NTk3NV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85MTdiZDFiODQ5N2U0MDY1YmU2YmFkY2E2Y2U1ODgwOCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lNmU0ODdmNzg1ZGI0ZDQwOTY2ZmE3N2I2MGE4NTBhMyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hNmVlMTFlNWNiNTc0ZmYwYTA4Yzg1NWM3ZTFiODU2ZCA9ICQoJzxkaXYgaWQ9Imh0bWxfYTZlZTExZTVjYjU3NGZmMGEwOGM4NTVjN2UxYjg1NmQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkJheXZpZXcgVmlsbGFnZSwgTm9ydGggWW9yazwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZTZlNDg3Zjc4NWRiNGQ0MDk2NmZhNzdiNjBhODUwYTMuc2V0Q29udGVudChodG1sX2E2ZWUxMWU1Y2I1NzRmZjBhMDhjODU1YzdlMWI4NTZkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzk4NWRhMTc2YzUwYzRhZWY5NmEyMmYzMjMzODM2NzNlLmJpbmRQb3B1cChwb3B1cF9lNmU0ODdmNzg1ZGI0ZDQwOTY2ZmE3N2I2MGE4NTBhMyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8wZGRlZTU3NjhmODc0YTExYWU1N2VhMDgyNWQ5OGJmOCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjc1NzQ5MDIsLTc5LjM3NDcxNDA5OTk5OTk4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzkxN2JkMWI4NDk3ZTQwNjViZTZiYWRjYTZjZTU4ODA4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzIyMWVjNzFiOThhMTQ1ODM4ZWNiYzMzZjQzZmI2NDQ2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2VkNjQ0NWQ2YTI2ZjQ5MDE5MjRkMGY4ZjMwZjRhMWI2ID0gJCgnPGRpdiBpZD0iaHRtbF9lZDY0NDVkNmEyNmY0OTAxOTI0ZDBmOGYzMGY0YTFiNiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U2lsdmVyIEhpbGxzICxZb3JrIE1pbGxzLCBOb3J0aCBZb3JrPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yMjFlYzcxYjk4YTE0NTgzOGVjYmMzM2Y0M2ZiNjQ0Ni5zZXRDb250ZW50KGh0bWxfZWQ2NDQ1ZDZhMjZmNDkwMTkyNGQwZjhmMzBmNGExYjYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMGRkZWU1NzY4Zjg3NGExMWFlNTdlYTA4MjVkOThiZjguYmluZFBvcHVwKHBvcHVwXzIyMWVjNzFiOThhMTQ1ODM4ZWNiYzMzZjQzZmI2NDQ2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2I2ZDAxMmViYWNjMzQ3ZjRiMzVlZDFmNmFlMmJlOTExID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzg5MDUzLC03OS40MDg0OTI3OTk5OTk5OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85MTdiZDFiODQ5N2U0MDY1YmU2YmFkY2E2Y2U1ODgwOCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9kMGNlODg0NGVlMjE0YWJmOGViM2QwOTcwNzYzZDM3MCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zMjE5NTVjNDM5YzA0MzAwYjJkYzhmYmZjNGRkN2Y2NyA9ICQoJzxkaXYgaWQ9Imh0bWxfMzIxOTU1YzQzOWMwNDMwMGIyZGM4ZmJmYzRkZDdmNjciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk5ld3RvbmJyb29rICxXaWxsb3dkYWxlLCBOb3J0aCBZb3JrPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kMGNlODg0NGVlMjE0YWJmOGViM2QwOTcwNzYzZDM3MC5zZXRDb250ZW50KGh0bWxfMzIxOTU1YzQzOWMwNDMwMGIyZGM4ZmJmYzRkZDdmNjcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYjZkMDEyZWJhY2MzNDdmNGIzNWVkMWY2YWUyYmU5MTEuYmluZFBvcHVwKHBvcHVwX2QwY2U4ODQ0ZWUyMTRhYmY4ZWIzZDA5NzA3NjNkMzcwKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2Q0YzExNzc0NWU4YTQ2NGI5M2MzYzBkYWRiNmJiMDJlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzcwMTE5OSwtNzkuNDA4NDkyNzk5OTk5OThdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTE3YmQxYjg0OTdlNDA2NWJlNmJhZGNhNmNlNTg4MDgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZmNkNGJmMzc2ZTFhNDg2MmE1ZTI0YmIyNThkZjI1ZjkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZjc4NGIzN2RlZjc4NDQyM2E0NWYzNzA3NjhjYWIxNDIgPSAkKCc8ZGl2IGlkPSJodG1sX2Y3ODRiMzdkZWY3ODQ0MjNhNDVmMzcwNzY4Y2FiMTQyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5XaWxsb3dkYWxlIFNvdXRoLCBOb3J0aCBZb3JrPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mY2Q0YmYzNzZlMWE0ODYyYTVlMjRiYjI1OGRmMjVmOS5zZXRDb250ZW50KGh0bWxfZjc4NGIzN2RlZjc4NDQyM2E0NWYzNzA3NjhjYWIxNDIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZDRjMTE3NzQ1ZThhNDY0YjkzYzNjMGRhZGI2YmIwMmUuYmluZFBvcHVwKHBvcHVwX2ZjZDRiZjM3NmUxYTQ4NjJhNWUyNGJiMjU4ZGYyNWY5KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2YxNzg0YjFjNjhlYjQxYmVhODg5Y2MwYmY3NWNmMjUxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzUyNzU4MywtNzkuNDAwMDQ5M10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85MTdiZDFiODQ5N2U0MDY1YmU2YmFkY2E2Y2U1ODgwOCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iNDZkNWY1MGMwZjE0NjVlYWZhMjcxMDhiNWIwNGMwYiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wZDdlNmM1ZWEwOGU0Njk4ODE3MWQ4NjMzMjE5NzYyMCA9ICQoJzxkaXYgaWQ9Imh0bWxfMGQ3ZTZjNWVhMDhlNDY5ODgxNzFkODYzMzIxOTc2MjAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPllvcmsgTWlsbHMgV2VzdCwgTm9ydGggWW9yazwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYjQ2ZDVmNTBjMGYxNDY1ZWFmYTI3MTA4YjViMDRjMGIuc2V0Q29udGVudChodG1sXzBkN2U2YzVlYTA4ZTQ2OTg4MTcxZDg2MzMyMTk3NjIwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2YxNzg0YjFjNjhlYjQxYmVhODg5Y2MwYmY3NWNmMjUxLmJpbmRQb3B1cChwb3B1cF9iNDZkNWY1MGMwZjE0NjVlYWZhMjcxMDhiNWIwNGMwYik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9iODU5MWM1YmY3MDg0YjMwYjVmZWE1YTMwNzg0NjkzNSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjc4MjczNjQsLTc5LjQ0MjI1OTNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTE3YmQxYjg0OTdlNDA2NWJlNmJhZGNhNmNlNTg4MDgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZjQyYzAzODkyZDU0NDU3NTk5Mzc2NTMxODNjNzE1MGEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYTNiOTM5ODY2MmFjNGNmZmE5MmQ0NTczYWI2YzFlYzQgPSAkKCc8ZGl2IGlkPSJodG1sX2EzYjkzOTg2NjJhYzRjZmZhOTJkNDU3M2FiNmMxZWM0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5XaWxsb3dkYWxlIFdlc3QsIE5vcnRoIFlvcms8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2Y0MmMwMzg5MmQ1NDQ1NzU5OTM3NjUzMTgzYzcxNTBhLnNldENvbnRlbnQoaHRtbF9hM2I5Mzk4NjYyYWM0Y2ZmYTkyZDQ1NzNhYjZjMWVjNCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9iODU5MWM1YmY3MDg0YjMwYjVmZWE1YTMwNzg0NjkzNS5iaW5kUG9wdXAocG9wdXBfZjQyYzAzODkyZDU0NDU3NTk5Mzc2NTMxODNjNzE1MGEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMTc5ODM3YTVkYmZjNGFlZGFlZmFiNzdjMjljZWE1MTkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43NTMyNTg2LC03OS4zMjk2NTY1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzkxN2JkMWI4NDk3ZTQwNjViZTZiYWRjYTZjZTU4ODA4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzViOTE3Yzc2OGYwZjQ0N2Y4ODViYTgwMTVjNTY2NjE0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzM4ZjRjZjJkZGQ3ZTQ0MjNiNDIzMWYxZGI4N2VkOGM4ID0gJCgnPGRpdiBpZD0iaHRtbF8zOGY0Y2YyZGRkN2U0NDIzYjQyMzFmMWRiODdlZDhjOCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UGFya3dvb2RzLCBOb3J0aCBZb3JrPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81YjkxN2M3NjhmMGY0NDdmODg1YmE4MDE1YzU2NjYxNC5zZXRDb250ZW50KGh0bWxfMzhmNGNmMmRkZDdlNDQyM2I0MjMxZjFkYjg3ZWQ4YzgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMTc5ODM3YTVkYmZjNGFlZGFlZmFiNzdjMjljZWE1MTkuYmluZFBvcHVwKHBvcHVwXzViOTE3Yzc2OGYwZjQ0N2Y4ODViYTgwMTVjNTY2NjE0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzAyNWI3ZjAzYjgzYjQ3MDRiZmE2MWIxMTVhNjExODU0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzQ1OTA1OCwtNzkuMzUyMTg4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzkxN2JkMWI4NDk3ZTQwNjViZTZiYWRjYTZjZTU4ODA4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2ViMGE2YjA5ZWYxNTQxZTFhNTMzMmU0MWI0Y2IwODBlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzhiNDNjZTMwMzE1ZDQ4MTVhMGYzMTE0Y2Y1YzgxOGExID0gJCgnPGRpdiBpZD0iaHRtbF84YjQzY2UzMDMxNWQ0ODE1YTBmMzExNGNmNWM4MThhMSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RG9uIE1pbGxzIE5vcnRoLCBOb3J0aCBZb3JrPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lYjBhNmIwOWVmMTU0MWUxYTUzMzJlNDFiNGNiMDgwZS5zZXRDb250ZW50KGh0bWxfOGI0M2NlMzAzMTVkNDgxNWEwZjMxMTRjZjVjODE4YTEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMDI1YjdmMDNiODNiNDcwNGJmYTYxYjExNWE2MTE4NTQuYmluZFBvcHVwKHBvcHVwX2ViMGE2YjA5ZWYxNTQxZTFhNTMzMmU0MWI0Y2IwODBlKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzY4YmZiZDI5MGI2NzQ5OTFiZWQ5NDI5OTc1NDBjZmI0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzI1ODk5NzAwMDAwMDEsLTc5LjM0MDkyM10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85MTdiZDFiODQ5N2U0MDY1YmU2YmFkY2E2Y2U1ODgwOCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9kYzI4ZjhiNDYwOTQ0ZjA3OGMwNGI4NjRjMWQ5MDRiZSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kMDAzNTk5YTA3NWY0NTlkYTkxN2YwNTcxODIyNjNiYiA9ICQoJzxkaXYgaWQ9Imh0bWxfZDAwMzU5OWEwNzVmNDU5ZGE5MTdmMDU3MTgyMjYzYmIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkZsZW1pbmdkb24gUGFyayAsRG9uIE1pbGxzIFNvdXRoLCBOb3J0aCBZb3JrPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kYzI4ZjhiNDYwOTQ0ZjA3OGMwNGI4NjRjMWQ5MDRiZS5zZXRDb250ZW50KGh0bWxfZDAwMzU5OWEwNzVmNDU5ZGE5MTdmMDU3MTgyMjYzYmIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNjhiZmJkMjkwYjY3NDk5MWJlZDk0Mjk5NzU0MGNmYjQuYmluZFBvcHVwKHBvcHVwX2RjMjhmOGI0NjA5NDRmMDc4YzA0Yjg2NGMxZDkwNGJlKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2MzMzVmOWYxNDM4NzRjODliMzJlMjdiM2ZjNzgwNDU4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzU0MzI4MywtNzkuNDQyMjU5M10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85MTdiZDFiODQ5N2U0MDY1YmU2YmFkY2E2Y2U1ODgwOCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82MzlkNzkwYWFkM2I0NTBhOGYwYzBlZmUzODYwZWI0OCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF84OGEzMmI2MDMwNDM0OTdhYjVhZjZmYzBlYjc3MmM3NCA9ICQoJzxkaXYgaWQ9Imh0bWxfODhhMzJiNjAzMDQzNDk3YWI1YWY2ZmMwZWI3NzJjNzQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkJhdGh1cnN0IE1hbm9yICxEb3duc3ZpZXcgTm9ydGggLFdpbHNvbiBIZWlnaHRzLCBOb3J0aCBZb3JrPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82MzlkNzkwYWFkM2I0NTBhOGYwYzBlZmUzODYwZWI0OC5zZXRDb250ZW50KGh0bWxfODhhMzJiNjAzMDQzNDk3YWI1YWY2ZmMwZWI3NzJjNzQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYzMzNWY5ZjE0Mzg3NGM4OWIzMmUyN2IzZmM3ODA0NTguYmluZFBvcHVwKHBvcHVwXzYzOWQ3OTBhYWQzYjQ1MGE4ZjBjMGVmZTM4NjBlYjQ4KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzE1YjY3OTVkYjc5OTQyYjY4MTg4N2YxZDVhZDAwZmM5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzY3OTgwMywtNzkuNDg3MjYxOTAwMDAwMDJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTE3YmQxYjg0OTdlNDA2NWJlNmJhZGNhNmNlNTg4MDgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMDdhNzJmZWIzNjJmNDhiZTkyMzdhYjQyMmY3YTYzZjIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYWQyYWNhNmY1NzVkNDIyNjhlN2FmNzFlZTY1ZDZkNWUgPSAkKCc8ZGl2IGlkPSJodG1sX2FkMmFjYTZmNTc1ZDQyMjY4ZTdhZjcxZWU2NWQ2ZDVlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Ob3J0aHdvb2QgUGFyayAsWW9yayBVbml2ZXJzaXR5LCBOb3J0aCBZb3JrPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wN2E3MmZlYjM2MmY0OGJlOTIzN2FiNDIyZjdhNjNmMi5zZXRDb250ZW50KGh0bWxfYWQyYWNhNmY1NzVkNDIyNjhlN2FmNzFlZTY1ZDZkNWUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMTViNjc5NWRiNzk5NDJiNjgxODg3ZjFkNWFkMDBmYzkuYmluZFBvcHVwKHBvcHVwXzA3YTcyZmViMzYyZjQ4YmU5MjM3YWI0MjJmN2E2M2YyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2ZhMTFhMjIzZjlkNTQzMWQ4ZjAzZjY1ZTZhMWFmMzYxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzM3NDczMiwtNzkuNDY0NzYzMjk5OTk5OTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTE3YmQxYjg0OTdlNDA2NWJlNmJhZGNhNmNlNTg4MDgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMGI0MzA4MWFlMzkwNDdjOTgwODlhODkxNDc4NGE3YzUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZTk4YjVjN2YyYjY1NGFlYmIxYmU5NzlhOTRkZWM5NzMgPSAkKCc8ZGl2IGlkPSJodG1sX2U5OGI1YzdmMmI2NTRhZWJiMWJlOTc5YTk0ZGVjOTczIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DRkIgVG9yb250byAsRG93bnN2aWV3IEVhc3QsIE5vcnRoIFlvcms8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzBiNDMwODFhZTM5MDQ3Yzk4MDg5YTg5MTQ3ODRhN2M1LnNldENvbnRlbnQoaHRtbF9lOThiNWM3ZjJiNjU0YWViYjFiZTk3OWE5NGRlYzk3Myk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9mYTExYTIyM2Y5ZDU0MzFkOGYwM2Y2NWU2YTFhZjM2MS5iaW5kUG9wdXAocG9wdXBfMGI0MzA4MWFlMzkwNDdjOTgwODlhODkxNDc4NGE3YzUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYWYyYTkwMmU1MzY4NGM2ZGJkNTQwYzQ1MjhjNTRmYTIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43MzkwMTQ2LC03OS41MDY5NDM2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzkxN2JkMWI4NDk3ZTQwNjViZTZiYWRjYTZjZTU4ODA4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzZkOTY3YmM5ZTg0ZDRiNzA4MDBmNjU2NjVkNDUwMTMyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzEwOTQyNzhkMTBhZjQ0OThiNzA3ZjU2YTQ4OTBiZTBjID0gJCgnPGRpdiBpZD0iaHRtbF8xMDk0Mjc4ZDEwYWY0NDk4YjcwN2Y1NmE0ODkwYmUwYyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RG93bnN2aWV3IFdlc3QsIE5vcnRoIFlvcms8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzZkOTY3YmM5ZTg0ZDRiNzA4MDBmNjU2NjVkNDUwMTMyLnNldENvbnRlbnQoaHRtbF8xMDk0Mjc4ZDEwYWY0NDk4YjcwN2Y1NmE0ODkwYmUwYyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9hZjJhOTAyZTUzNjg0YzZkYmQ1NDBjNDUyOGM1NGZhMi5iaW5kUG9wdXAocG9wdXBfNmQ5NjdiYzllODRkNGI3MDgwMGY2NTY2NWQ0NTAxMzIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMzYxMTg5OGQ2NzNhNGZlY2EyYWIwY2ZjMTMwZWE3OTggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43Mjg0OTY0LC03OS40OTU2OTc0MDAwMDAwM10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85MTdiZDFiODQ5N2U0MDY1YmU2YmFkY2E2Y2U1ODgwOCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hMzdkZjU2NTE1NTM0MzkzOTE0YThhNjAwZjEwNDkwZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mNzU2ZDAxZmExZGY0MWIzOTllOTM0MDZhYmNkYmNkMiA9ICQoJzxkaXYgaWQ9Imh0bWxfZjc1NmQwMWZhMWRmNDFiMzk5ZTkzNDA2YWJjZGJjZDIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkRvd25zdmlldyBDZW50cmFsLCBOb3J0aCBZb3JrPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hMzdkZjU2NTE1NTM0MzkzOTE0YThhNjAwZjEwNDkwZC5zZXRDb250ZW50KGh0bWxfZjc1NmQwMWZhMWRmNDFiMzk5ZTkzNDA2YWJjZGJjZDIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMzYxMTg5OGQ2NzNhNGZlY2EyYWIwY2ZjMTMwZWE3OTguYmluZFBvcHVwKHBvcHVwX2EzN2RmNTY1MTU1MzQzOTM5MTRhOGE2MDBmMTA0OTBkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzUzNTYwMTFiNzI5NjQ5ODI4ZDFjODk0ZDRhYzY2YTY2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzYxNjMxMywtNzkuNTIwOTk5NDAwMDAwMDJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTE3YmQxYjg0OTdlNDA2NWJlNmJhZGNhNmNlNTg4MDgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYjZhNTk5OThiYTNjNDllYmI5ZWYzNTdhZWZmNjMwY2EgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfM2VmY2UxN2IwMDAxNGQ5MWExNDMwZWRiODVmOTEyYzkgPSAkKCc8ZGl2IGlkPSJodG1sXzNlZmNlMTdiMDAwMTRkOTFhMTQzMGVkYjg1ZjkxMmM5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Eb3duc3ZpZXcgTm9ydGh3ZXN0LCBOb3J0aCBZb3JrPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iNmE1OTk5OGJhM2M0OWViYjllZjM1N2FlZmY2MzBjYS5zZXRDb250ZW50KGh0bWxfM2VmY2UxN2IwMDAxNGQ5MWExNDMwZWRiODVmOTEyYzkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNTM1NjAxMWI3Mjk2NDk4MjhkMWM4OTRkNGFjNjZhNjYuYmluZFBvcHVwKHBvcHVwX2I2YTU5OTk4YmEzYzQ5ZWJiOWVmMzU3YWVmZjYzMGNhKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzJmZTAxNWJmZTEyNzQ0YzliNjRhMDg4NDgyZGMyY2Q5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzI1ODgyMywtNzkuMzE1NTcxNTk5OTk5OThdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTE3YmQxYjg0OTdlNDA2NWJlNmJhZGNhNmNlNTg4MDgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYWQ3ZjFjZmE3YjI1NGZlN2I1NGI3ZmJhYjNkMGEzY2IgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfM2EwOTE5NjQwZjcxNDQxZmEyNzY0ZGZlMjViZWYwNjIgPSAkKCc8ZGl2IGlkPSJodG1sXzNhMDkxOTY0MGY3MTQ0MWZhMjc2NGRmZTI1YmVmMDYyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5WaWN0b3JpYSBWaWxsYWdlLCBOb3J0aCBZb3JrPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hZDdmMWNmYTdiMjU0ZmU3YjU0YjdmYmFiM2QwYTNjYi5zZXRDb250ZW50KGh0bWxfM2EwOTE5NjQwZjcxNDQxZmEyNzY0ZGZlMjViZWYwNjIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMmZlMDE1YmZlMTI3NDRjOWI2NGEwODg0ODJkYzJjZDkuYmluZFBvcHVwKHBvcHVwX2FkN2YxY2ZhN2IyNTRmZTdiNTRiN2ZiYWIzZDBhM2NiKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzE4Njk1YTFiNmQ3ODRhODg5MTdjOGQ4YWI0N2JjNTIxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzA2Mzk3MiwtNzkuMzA5OTM3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzkxN2JkMWI4NDk3ZTQwNjViZTZiYWRjYTZjZTU4ODA4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzU0ZTkyMDJkMjU4MDQzZjM4MzUyMGI4MDk5MTk5MzZmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzExMTkyOGQ2ODhiNTRjMDA5MWJhYzBkNWExZWUwMjlhID0gJCgnPGRpdiBpZD0iaHRtbF8xMTE5MjhkNjg4YjU0YzAwOTFiYWMwZDVhMWVlMDI5YSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+V29vZGJpbmUgR2FyZGVucyAsUGFya3ZpZXcgSGlsbCwgRWFzdCBZb3JrPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81NGU5MjAyZDI1ODA0M2YzODM1MjBiODA5OTE5OTM2Zi5zZXRDb250ZW50KGh0bWxfMTExOTI4ZDY4OGI1NGMwMDkxYmFjMGQ1YTFlZTAyOWEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMTg2OTVhMWI2ZDc4NGE4ODkxN2M4ZDhhYjQ3YmM1MjEuYmluZFBvcHVwKHBvcHVwXzU0ZTkyMDJkMjU4MDQzZjM4MzUyMGI4MDk5MTk5MzZmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2M3ZWIxYTAzOTBiMzQyM2I5ZDdiMGRmMzYyNjQ0ZmZjID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjk1MzQzOTAwMDAwMDEsLTc5LjMxODM4ODddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTE3YmQxYjg0OTdlNDA2NWJlNmJhZGNhNmNlNTg4MDgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNTgyMDNhZDIxMTU2NDA5ZTg3ZTVjYzNhZDFhMDhlMmYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYTRlYzk2ODI1NDRlNDI1YWJhOGQ3ODVhZTRjODQzZmYgPSAkKCc8ZGl2IGlkPSJodG1sX2E0ZWM5NjgyNTQ0ZTQyNWFiYThkNzg1YWU0Yzg0M2ZmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Xb29kYmluZSBIZWlnaHRzLCBFYXN0IFlvcms8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzU4MjAzYWQyMTE1NjQwOWU4N2U1Y2MzYWQxYTA4ZTJmLnNldENvbnRlbnQoaHRtbF9hNGVjOTY4MjU0NGU0MjVhYmE4ZDc4NWFlNGM4NDNmZik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9jN2ViMWEwMzkwYjM0MjNiOWQ3YjBkZjM2MjY0NGZmYy5iaW5kUG9wdXAocG9wdXBfNTgyMDNhZDIxMTU2NDA5ZTg3ZTVjYzNhZDFhMDhlMmYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYTVjZDA3NmY0ZTE5NDcxMmI3MzRjMDM3NjQ2YTdjNjcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42NzYzNTczOTk5OTk5OSwtNzkuMjkzMDMxMl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85MTdiZDFiODQ5N2U0MDY1YmU2YmFkY2E2Y2U1ODgwOCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8yNzk1ZDA0YzQ4Nzc0Yjg3ODM1MjFlMzZkMGVjMzQ2NyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mYjNmMDUyMmRlNWY0YTZkYmE4YmUzMjZkMzhlNzk1MCA9ICQoJzxkaXYgaWQ9Imh0bWxfZmIzZjA1MjJkZTVmNGE2ZGJhOGJlMzI2ZDM4ZTc5NTAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlRoZSBCZWFjaGVzLCBFYXN0IFRvcm9udG88L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzI3OTVkMDRjNDg3NzRiODc4MzUyMWUzNmQwZWMzNDY3LnNldENvbnRlbnQoaHRtbF9mYjNmMDUyMmRlNWY0YTZkYmE4YmUzMjZkMzhlNzk1MCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9hNWNkMDc2ZjRlMTk0NzEyYjczNGMwMzc2NDZhN2M2Ny5iaW5kUG9wdXAocG9wdXBfMjc5NWQwNGM0ODc3NGI4NzgzNTIxZTM2ZDBlYzM0NjcpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZGQwYjBiYmJiNzdkNDNjMWFkOGFkNmRjNTRhZGJiZjggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43MDkwNjA0LC03OS4zNjM0NTE3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzkxN2JkMWI4NDk3ZTQwNjViZTZiYWRjYTZjZTU4ODA4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzdiOGM2NzIzZDVmOTQ0NjVhNjc3OWE5MmZjZTI5YjYxID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzJhNzdjYjYwZjhmODQ2NTFiYWJiMjk4ZDExZDE3OGNiID0gJCgnPGRpdiBpZD0iaHRtbF8yYTc3Y2I2MGY4Zjg0NjUxYmFiYjI5OGQxMWQxNzhjYiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TGVhc2lkZSwgRWFzdCBZb3JrPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83YjhjNjcyM2Q1Zjk0NDY1YTY3NzlhOTJmY2UyOWI2MS5zZXRDb250ZW50KGh0bWxfMmE3N2NiNjBmOGY4NDY1MWJhYmIyOThkMTFkMTc4Y2IpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZGQwYjBiYmJiNzdkNDNjMWFkOGFkNmRjNTRhZGJiZjguYmluZFBvcHVwKHBvcHVwXzdiOGM2NzIzZDVmOTQ0NjVhNjc3OWE5MmZjZTI5YjYxKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzE5ZGYyYjZiYmVlNDQwZThhZTFhMGNhMTQzMDViOTI0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzA1MzY4OSwtNzkuMzQ5MzcxOTAwMDAwMDJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTE3YmQxYjg0OTdlNDA2NWJlNmJhZGNhNmNlNTg4MDgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOTFkNTNjOTZjOWVhNGEzNmI1NjkwMmY3ZmQzNDM3ZDQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMzU0MWNkYjc5ZmY1NDg4NWJkYjE3NmNjOWUwNzkwMGQgPSAkKCc8ZGl2IGlkPSJodG1sXzM1NDFjZGI3OWZmNTQ4ODViZGIxNzZjYzllMDc5MDBkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5UaG9ybmNsaWZmZSBQYXJrLCBFYXN0IFlvcms8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzkxZDUzYzk2YzllYTRhMzZiNTY5MDJmN2ZkMzQzN2Q0LnNldENvbnRlbnQoaHRtbF8zNTQxY2RiNzlmZjU0ODg1YmRiMTc2Y2M5ZTA3OTAwZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8xOWRmMmI2YmJlZTQ0MGU4YWUxYTBjYTE0MzA1YjkyNC5iaW5kUG9wdXAocG9wdXBfOTFkNTNjOTZjOWVhNGEzNmI1NjkwMmY3ZmQzNDM3ZDQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMTQ2ZWViNmFlMTQwNDFmZjkyMmIyYmIxZDg4YjI3MzUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42ODUzNDcsLTc5LjMzODEwNjVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTE3YmQxYjg0OTdlNDA2NWJlNmJhZGNhNmNlNTg4MDgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNzliMThkMjkxMTQ1NDBlOWFjMmJjM2E3ZTU2YjU5ODggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZTIyNWE0OWVjOTI4NDFmNGE5YTA1MmEwYzcxODVmN2MgPSAkKCc8ZGl2IGlkPSJodG1sX2UyMjVhNDllYzkyODQxZjRhOWEwNTJhMGM3MTg1ZjdjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5FYXN0IFRvcm9udG8sIEVhc3QgWW9yazwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNzliMThkMjkxMTQ1NDBlOWFjMmJjM2E3ZTU2YjU5ODguc2V0Q29udGVudChodG1sX2UyMjVhNDllYzkyODQxZjRhOWEwNTJhMGM3MTg1ZjdjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzE0NmVlYjZhZTE0MDQxZmY5MjJiMmJiMWQ4OGIyNzM1LmJpbmRQb3B1cChwb3B1cF83OWIxOGQyOTExNDU0MGU5YWMyYmMzYTdlNTZiNTk4OCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl80OGIxMTk0Njc1NjE0ZDhmYWJhYTYyOTMyNmZkNjYyYiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY3OTU1NzEsLTc5LjM1MjE4OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85MTdiZDFiODQ5N2U0MDY1YmU2YmFkY2E2Y2U1ODgwOCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zOTQwMWQyOTk4ODg0Nzc0OGM0YWU3ZWZiNjUwOGU0MCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zNzdmZjk3NWE1MGM0OWU5ODkzODI2MzljNTE3MDRiMiA9ICQoJzxkaXYgaWQ9Imh0bWxfMzc3ZmY5NzVhNTBjNDllOTg5MzgyNjM5YzUxNzA0YjIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlRoZSBEYW5mb3J0aCBXZXN0ICxSaXZlcmRhbGUsIEVhc3QgVG9yb250bzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMzk0MDFkMjk5ODg4NDc3NDhjNGFlN2VmYjY1MDhlNDAuc2V0Q29udGVudChodG1sXzM3N2ZmOTc1YTUwYzQ5ZTk4OTM4MjYzOWM1MTcwNGIyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzQ4YjExOTQ2NzU2MTRkOGZhYmFhNjI5MzI2ZmQ2NjJiLmJpbmRQb3B1cChwb3B1cF8zOTQwMWQyOTk4ODg0Nzc0OGM0YWU3ZWZiNjUwOGU0MCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xMDlkMTBlMjlkODE0MzNkOGQxMGY3OTkxYmNkMmY4OSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY2ODk5ODUsLTc5LjMxNTU3MTU5OTk5OTk4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzkxN2JkMWI4NDk3ZTQwNjViZTZiYWRjYTZjZTU4ODA4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2U0NTc5MzI3ZWU3ZjQ2YTU4ZDc0MjFjZTdkZDYxOGUzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2I2NDcyYWVhNmY4OTQ1ZDQ4YmM1ZTBiYjg3NmQyYWI3ID0gJCgnPGRpdiBpZD0iaHRtbF9iNjQ3MmFlYTZmODk0NWQ0OGJjNWUwYmI4NzZkMmFiNyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+VGhlIEJlYWNoZXMgV2VzdCAsSW5kaWEgQmF6YWFyLCBFYXN0IFRvcm9udG88L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2U0NTc5MzI3ZWU3ZjQ2YTU4ZDc0MjFjZTdkZDYxOGUzLnNldENvbnRlbnQoaHRtbF9iNjQ3MmFlYTZmODk0NWQ0OGJjNWUwYmI4NzZkMmFiNyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8xMDlkMTBlMjlkODE0MzNkOGQxMGY3OTkxYmNkMmY4OS5iaW5kUG9wdXAocG9wdXBfZTQ1NzkzMjdlZTdmNDZhNThkNzQyMWNlN2RkNjE4ZTMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNWFjZTlhMTNiYmNlNGU0ZGFjMzhiMWNjMGU0YTIxMWIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42NTk1MjU1LC03OS4zNDA5MjNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTE3YmQxYjg0OTdlNDA2NWJlNmJhZGNhNmNlNTg4MDgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZWMxNDAwNmRjYzYyNDZkNWFhMGY3OTFjNjAyMTQ2YTMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfN2FhYzg1NDBkNGI1NDYwMDgyNjg5NzRmZGVhNmFjODIgPSAkKCc8ZGl2IGlkPSJodG1sXzdhYWM4NTQwZDRiNTQ2MDA4MjY4OTc0ZmRlYTZhYzgyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5TdHVkaW8gRGlzdHJpY3QsIEVhc3QgVG9yb250bzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZWMxNDAwNmRjYzYyNDZkNWFhMGY3OTFjNjAyMTQ2YTMuc2V0Q29udGVudChodG1sXzdhYWM4NTQwZDRiNTQ2MDA4MjY4OTc0ZmRlYTZhYzgyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzVhY2U5YTEzYmJjZTRlNGRhYzM4YjFjYzBlNGEyMTFiLmJpbmRQb3B1cChwb3B1cF9lYzE0MDA2ZGNjNjI0NmQ1YWEwZjc5MWM2MDIxNDZhMyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jOTRmOGVmYTU4YjA0MmI5ODQ3ZTkzZmQ1N2YyOWI3NyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjcyODAyMDUsLTc5LjM4ODc5MDFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTE3YmQxYjg0OTdlNDA2NWJlNmJhZGNhNmNlNTg4MDgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNmY4NTkxZjI5ZWRiNDk4ZWIzN2VkYTA0YjdmODYxNDAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfODg2M2M0OTFmYjA2NDNkYzhkOWQ5MmI5NmI5NjU4NTcgPSAkKCc8ZGl2IGlkPSJodG1sXzg4NjNjNDkxZmIwNjQzZGM4ZDlkOTJiOTZiOTY1ODU3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5MYXdyZW5jZSBQYXJrLCBDZW50cmFsIFRvcm9udG88L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzZmODU5MWYyOWVkYjQ5OGViMzdlZGEwNGI3Zjg2MTQwLnNldENvbnRlbnQoaHRtbF84ODYzYzQ5MWZiMDY0M2RjOGQ5ZDkyYjk2Yjk2NTg1Nyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9jOTRmOGVmYTU4YjA0MmI5ODQ3ZTkzZmQ1N2YyOWI3Ny5iaW5kUG9wdXAocG9wdXBfNmY4NTkxZjI5ZWRiNDk4ZWIzN2VkYTA0YjdmODYxNDApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMjIxMThiMzEzMTA1NDBkMjk3YjU2OTZmZGEyMWFiNjcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43MTI3NTExLC03OS4zOTAxOTc1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzkxN2JkMWI4NDk3ZTQwNjViZTZiYWRjYTZjZTU4ODA4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2FhYjFlMzc2YjI2YzQ0ZDM4M2I1MjRjOTUyNTYxNzQ1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2Q5MzQ2OTliYjFiZDRlNDVhNDczZGYyMjRmMTkxMzhjID0gJCgnPGRpdiBpZD0iaHRtbF9kOTM0Njk5YmIxYmQ0ZTQ1YTQ3M2RmMjI0ZjE5MTM4YyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RGF2aXN2aWxsZSBOb3J0aCwgQ2VudHJhbCBUb3JvbnRvPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hYWIxZTM3NmIyNmM0NGQzODNiNTI0Yzk1MjU2MTc0NS5zZXRDb250ZW50KGh0bWxfZDkzNDY5OWJiMWJkNGU0NWE0NzNkZjIyNGYxOTEzOGMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMjIxMThiMzEzMTA1NDBkMjk3YjU2OTZmZGEyMWFiNjcuYmluZFBvcHVwKHBvcHVwX2FhYjFlMzc2YjI2YzQ0ZDM4M2I1MjRjOTUyNTYxNzQ1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2NiZjUyYjU2YzVjZDQwYjE4NGRiZmVkYmRmMjcwYTBjID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzE1MzgzNCwtNzkuNDA1Njc4NDAwMDAwMDFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTE3YmQxYjg0OTdlNDA2NWJlNmJhZGNhNmNlNTg4MDgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMmUzYjQ3ZTE5Nzc2NDExYTlmYzA1MWQ0NWUyZDYyNWQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNDU1NmFlZjRiMmM2NDA5Yjg2MThkZDI1MTRlZmRmZWUgPSAkKCc8ZGl2IGlkPSJodG1sXzQ1NTZhZWY0YjJjNjQwOWI4NjE4ZGQyNTE0ZWZkZmVlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Ob3J0aCBUb3JvbnRvIFdlc3QsIENlbnRyYWwgVG9yb250bzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMmUzYjQ3ZTE5Nzc2NDExYTlmYzA1MWQ0NWUyZDYyNWQuc2V0Q29udGVudChodG1sXzQ1NTZhZWY0YjJjNjQwOWI4NjE4ZGQyNTE0ZWZkZmVlKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2NiZjUyYjU2YzVjZDQwYjE4NGRiZmVkYmRmMjcwYTBjLmJpbmRQb3B1cChwb3B1cF8yZTNiNDdlMTk3NzY0MTFhOWZjMDUxZDQ1ZTJkNjI1ZCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9iM2JkZThkOWE3NmQ0Y2ZmOGRmOGE0YzQ5YzJjOGE5OCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjcwNDMyNDQsLTc5LjM4ODc5MDFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTE3YmQxYjg0OTdlNDA2NWJlNmJhZGNhNmNlNTg4MDgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMzVjMjkwMjRkMjg4NDJlYmE5NjkyOWYzODRlZjJlODMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOGQxYTMzNTdiZTllNGZmMjliYjMyN2Q3YzYwODBhOWIgPSAkKCc8ZGl2IGlkPSJodG1sXzhkMWEzMzU3YmU5ZTRmZjI5YmIzMjdkN2M2MDgwYTliIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5EYXZpc3ZpbGxlLCBDZW50cmFsIFRvcm9udG88L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzM1YzI5MDI0ZDI4ODQyZWJhOTY5MjlmMzg0ZWYyZTgzLnNldENvbnRlbnQoaHRtbF84ZDFhMzM1N2JlOWU0ZmYyOWJiMzI3ZDdjNjA4MGE5Yik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9iM2JkZThkOWE3NmQ0Y2ZmOGRmOGE0YzQ5YzJjOGE5OC5iaW5kUG9wdXAocG9wdXBfMzVjMjkwMjRkMjg4NDJlYmE5NjkyOWYzODRlZjJlODMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMjdmMzYxMjk5MWE0NDU0ZDlmZGZiZjkwYzFmYmU2YWMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42ODk1NzQzLC03OS4zODMxNTk5MDAwMDAwMl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85MTdiZDFiODQ5N2U0MDY1YmU2YmFkY2E2Y2U1ODgwOCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF81NmIzMjBkMGFkMzU0N2E3OTc3NmE1YmIxNmQxY2RlMyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF81NzkxZjM3NGVkNjQ0ZTAwODAxMGM0Mzg2MzBkN2Q0MiA9ICQoJzxkaXYgaWQ9Imh0bWxfNTc5MWYzNzRlZDY0NGUwMDgwMTBjNDM4NjMwZDdkNDIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk1vb3JlIFBhcmsgLFN1bW1lcmhpbGwgRWFzdCwgQ2VudHJhbCBUb3JvbnRvPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81NmIzMjBkMGFkMzU0N2E3OTc3NmE1YmIxNmQxY2RlMy5zZXRDb250ZW50KGh0bWxfNTc5MWYzNzRlZDY0NGUwMDgwMTBjNDM4NjMwZDdkNDIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMjdmMzYxMjk5MWE0NDU0ZDlmZGZiZjkwYzFmYmU2YWMuYmluZFBvcHVwKHBvcHVwXzU2YjMyMGQwYWQzNTQ3YTc5Nzc2YTViYjE2ZDFjZGUzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzMwOGViNGQ1YjI1NTRkOGE5MWNlYTk2NzNkZGRhYzFiID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjg2NDEyMjk5OTk5OTksLTc5LjQwMDA0OTNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTE3YmQxYjg0OTdlNDA2NWJlNmJhZGNhNmNlNTg4MDgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNzYxMGFmOWJhOTQ4NDE5MzhlMjc0M2UwNjkyNTQ3M2YgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYTk2NzIwYzZhYzRkNDZkMThlMmMzZjliNjEyMzBhMmEgPSAkKCc8ZGl2IGlkPSJodG1sX2E5NjcyMGM2YWM0ZDQ2ZDE4ZTJjM2Y5YjYxMjMwYTJhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5EZWVyIFBhcmsgLEZvcmVzdCBIaWxsIFNFICxSYXRobmVsbHkgLFNvdXRoIEhpbGwgLFN1bW1lcmhpbGwgV2VzdCwgQ2VudHJhbCBUb3JvbnRvPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83NjEwYWY5YmE5NDg0MTkzOGUyNzQzZTA2OTI1NDczZi5zZXRDb250ZW50KGh0bWxfYTk2NzIwYzZhYzRkNDZkMThlMmMzZjliNjEyMzBhMmEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMzA4ZWI0ZDViMjU1NGQ4YTkxY2VhOTY3M2RkZGFjMWIuYmluZFBvcHVwKHBvcHVwXzc2MTBhZjliYTk0ODQxOTM4ZTI3NDNlMDY5MjU0NzNmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2IzYzdlZDg3MDJiNDQ4OWU5ZTM3ZTY3ODkxZWM5NDMxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjc5NTYyNiwtNzkuMzc3NTI5NDAwMDAwMDFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTE3YmQxYjg0OTdlNDA2NWJlNmJhZGNhNmNlNTg4MDgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZGUxNGQ3MjE0NmQ1NDNlMDliNTIxNjZmYmU0MTNhN2YgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNmM1MjBmNGRkZDRkNDBkZGIyMGI5NTI2Njg5MGYzNmQgPSAkKCc8ZGl2IGlkPSJodG1sXzZjNTIwZjRkZGQ0ZDQwZGRiMjBiOTUyNjY4OTBmMzZkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Sb3NlZGFsZSwgRG93bnRvd24gVG9yb250bzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZGUxNGQ3MjE0NmQ1NDNlMDliNTIxNjZmYmU0MTNhN2Yuc2V0Q29udGVudChodG1sXzZjNTIwZjRkZGQ0ZDQwZGRiMjBiOTUyNjY4OTBmMzZkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2IzYzdlZDg3MDJiNDQ4OWU5ZTM3ZTY3ODkxZWM5NDMxLmJpbmRQb3B1cChwb3B1cF9kZTE0ZDcyMTQ2ZDU0M2UwOWI1MjE2NmZiZTQxM2E3Zik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81YjQ2NWRlMDY0ZTU0NjYxYTg0NWJhZGYyODgxMDM3MyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY2Nzk2NywtNzkuMzY3Njc1M10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85MTdiZDFiODQ5N2U0MDY1YmU2YmFkY2E2Y2U1ODgwOCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mOGYxZDBiNWMxMTU0NDRmYjYyZWQ5MDJlYWMwMmIzYiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kMjJjYmI2MzY5M2Y0MWE2OGFkNWRhM2RlNjBlYWIyYiA9ICQoJzxkaXYgaWQ9Imh0bWxfZDIyY2JiNjM2OTNmNDFhNjhhZDVkYTNkZTYwZWFiMmIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNhYmJhZ2V0b3duICxTdC4gSmFtZXMgVG93biwgRG93bnRvd24gVG9yb250bzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZjhmMWQwYjVjMTE1NDQ0ZmI2MmVkOTAyZWFjMDJiM2Iuc2V0Q29udGVudChodG1sX2QyMmNiYjYzNjkzZjQxYTY4YWQ1ZGEzZGU2MGVhYjJiKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzViNDY1ZGUwNjRlNTQ2NjFhODQ1YmFkZjI4ODEwMzczLmJpbmRQb3B1cChwb3B1cF9mOGYxZDBiNWMxMTU0NDRmYjYyZWQ5MDJlYWMwMmIzYik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9iZTAwZGEwYTdhN2U0MDMxYTg1OWIwN2Y3NDVlZTE0MyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY2NTg1OTksLTc5LjM4MzE1OTkwMDAwMDAyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzkxN2JkMWI4NDk3ZTQwNjViZTZiYWRjYTZjZTU4ODA4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2JiZmU4NWZjZTZiMTRhYTJhY2VkNDFkM2MwZDQ3MWYyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzRhZDc5MWUwNDhiYjRhYTc4NzA2NDU1YTczMmQ3Y2QyID0gJCgnPGRpdiBpZD0iaHRtbF80YWQ3OTFlMDQ4YmI0YWE3ODcwNjQ1NWE3MzJkN2NkMiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q2h1cmNoIGFuZCBXZWxsZXNsZXksIERvd250b3duIFRvcm9udG88L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2JiZmU4NWZjZTZiMTRhYTJhY2VkNDFkM2MwZDQ3MWYyLnNldENvbnRlbnQoaHRtbF80YWQ3OTFlMDQ4YmI0YWE3ODcwNjQ1NWE3MzJkN2NkMik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9iZTAwZGEwYTdhN2U0MDMxYTg1OWIwN2Y3NDVlZTE0My5iaW5kUG9wdXAocG9wdXBfYmJmZTg1ZmNlNmIxNGFhMmFjZWQ0MWQzYzBkNDcxZjIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNmVhMGQ4MDliZDA4NDNkZWIwZmMzOTk3OTYyZjVhY2MgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42NTQyNTk5LC03OS4zNjA2MzU5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzkxN2JkMWI4NDk3ZTQwNjViZTZiYWRjYTZjZTU4ODA4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzFlNWU3MDk3ZjNhMjRmYWZiMzI1MDcxMTMwZDkwZDUxID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzAyZWY1OTQzNDg3YjQyMDZhNWU5MjMyM2QwNGFmNmJkID0gJCgnPGRpdiBpZD0iaHRtbF8wMmVmNTk0MzQ4N2I0MjA2YTVlOTIzMjNkMDRhZjZiZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+SGFyYm91cmZyb250LCBEb3dudG93biBUb3JvbnRvPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xZTVlNzA5N2YzYTI0ZmFmYjMyNTA3MTEzMGQ5MGQ1MS5zZXRDb250ZW50KGh0bWxfMDJlZjU5NDM0ODdiNDIwNmE1ZTkyMzIzZDA0YWY2YmQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNmVhMGQ4MDliZDA4NDNkZWIwZmMzOTk3OTYyZjVhY2MuYmluZFBvcHVwKHBvcHVwXzFlNWU3MDk3ZjNhMjRmYWZiMzI1MDcxMTMwZDkwZDUxKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2Y5MGExOGU2OGFhOTQzNmM4YzU3ZGQzNDUxYzJiNjVjID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjU3MTYxOCwtNzkuMzc4OTM3MDk5OTk5OTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTE3YmQxYjg0OTdlNDA2NWJlNmJhZGNhNmNlNTg4MDgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOTNlNzIwNjM1MjliNDNhNDlhOWI2YTY1ZDM1MDFkYzYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfN2Q2OTcwM2ZiOTM4NGViYjhlOWI4MWM3YjEwMzE3NzAgPSAkKCc8ZGl2IGlkPSJodG1sXzdkNjk3MDNmYjkzODRlYmI4ZTliODFjN2IxMDMxNzcwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5SeWVyc29uICxHYXJkZW4gRGlzdHJpY3QsIERvd250b3duIFRvcm9udG88L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzkzZTcyMDYzNTI5YjQzYTQ5YTliNmE2NWQzNTAxZGM2LnNldENvbnRlbnQoaHRtbF83ZDY5NzAzZmI5Mzg0ZWJiOGU5YjgxYzdiMTAzMTc3MCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9mOTBhMThlNjhhYTk0MzZjOGM1N2RkMzQ1MWMyYjY1Yy5iaW5kUG9wdXAocG9wdXBfOTNlNzIwNjM1MjliNDNhNDlhOWI2YTY1ZDM1MDFkYzYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfY2JiNTQyNWM3ZDU5NDZkYThlOTNiNmM0YzRlYjRkZWYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42NTE0OTM5LC03OS4zNzU0MTc5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzkxN2JkMWI4NDk3ZTQwNjViZTZiYWRjYTZjZTU4ODA4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2IwZjAwZWVlYzRhYjRlMjA5NjY5MGY5NGM3MjNiOTkzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzYzYWY5YmU5ZDcxMzQ4MGZhNzQzMzcxMDJmOWQzYzdlID0gJCgnPGRpdiBpZD0iaHRtbF82M2FmOWJlOWQ3MTM0ODBmYTc0MzM3MTAyZjlkM2M3ZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U3QuIEphbWVzIFRvd24sIERvd250b3duIFRvcm9udG88L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2IwZjAwZWVlYzRhYjRlMjA5NjY5MGY5NGM3MjNiOTkzLnNldENvbnRlbnQoaHRtbF82M2FmOWJlOWQ3MTM0ODBmYTc0MzM3MTAyZjlkM2M3ZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9jYmI1NDI1YzdkNTk0NmRhOGU5M2I2YzRjNGViNGRlZi5iaW5kUG9wdXAocG9wdXBfYjBmMDBlZWVjNGFiNGUyMDk2NjkwZjk0YzcyM2I5OTMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMWFhN2Y5ZWIxNzJkNGY2NjhiYjkzYTFmM2YyZTNiYzEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42NDQ3NzA4LC03OS4zNzMzMDY0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzkxN2JkMWI4NDk3ZTQwNjViZTZiYWRjYTZjZTU4ODA4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzQzYThlNWQ1ZTdiYTRkODM4YzNiMGM0YTM4Mjc1YjM3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzQxZGYyMzg2OGM2NDQ2NzNiMjM4ZDI3OTNmNmRjNjBkID0gJCgnPGRpdiBpZD0iaHRtbF80MWRmMjM4NjhjNjQ0NjczYjIzOGQyNzkzZjZkYzYwZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QmVyY3p5IFBhcmssIERvd250b3duIFRvcm9udG88L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzQzYThlNWQ1ZTdiYTRkODM4YzNiMGM0YTM4Mjc1YjM3LnNldENvbnRlbnQoaHRtbF80MWRmMjM4NjhjNjQ0NjczYjIzOGQyNzkzZjZkYzYwZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8xYWE3ZjllYjE3MmQ0ZjY2OGJiOTNhMWYzZjJlM2JjMS5iaW5kUG9wdXAocG9wdXBfNDNhOGU1ZDVlN2JhNGQ4MzhjM2IwYzRhMzgyNzViMzcpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYzdhMDQ4ZTAyNDllNDcxNjk5MTY4ZTY5MTViMmYwYjYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42NTc5NTI0LC03OS4zODczODI2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzkxN2JkMWI4NDk3ZTQwNjViZTZiYWRjYTZjZTU4ODA4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2UwMDYzMDBhNDA0ZTRjMzBiOTA4ZjcyYzIzNDA3MjhlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzE1MTczYzM5NDU4ZTRiMGFiNmJiZDdmMWQzOTRiMDFmID0gJCgnPGRpdiBpZD0iaHRtbF8xNTE3M2MzOTQ1OGU0YjBhYjZiYmQ3ZjFkMzk0YjAxZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q2VudHJhbCBCYXkgU3RyZWV0LCBEb3dudG93biBUb3JvbnRvPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lMDA2MzAwYTQwNGU0YzMwYjkwOGY3MmMyMzQwNzI4ZS5zZXRDb250ZW50KGh0bWxfMTUxNzNjMzk0NThlNGIwYWI2YmJkN2YxZDM5NGIwMWYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYzdhMDQ4ZTAyNDllNDcxNjk5MTY4ZTY5MTViMmYwYjYuYmluZFBvcHVwKHBvcHVwX2UwMDYzMDBhNDA0ZTRjMzBiOTA4ZjcyYzIzNDA3MjhlKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2Y0ZTM5MzhhMjE5MDRlZGRiMjRkMzc4MjYyODRiZmFiID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjUwNTcxMjAwMDAwMDEsLTc5LjM4NDU2NzVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTE3YmQxYjg0OTdlNDA2NWJlNmJhZGNhNmNlNTg4MDgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMTBiNzk2ZTk2YWFkNDM0YThhY2Q4ZTk3OGQ4MGU2ODAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOTc0NGQ1NmYzY2U3NGMxNTgxMGE5OTNmNWMxNmQwNTIgPSAkKCc8ZGl2IGlkPSJodG1sXzk3NDRkNTZmM2NlNzRjMTU4MTBhOTkzZjVjMTZkMDUyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5BZGVsYWlkZSAsS2luZyAsUmljaG1vbmQsIERvd250b3duIFRvcm9udG88L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzEwYjc5NmU5NmFhZDQzNGE4YWNkOGU5NzhkODBlNjgwLnNldENvbnRlbnQoaHRtbF85NzQ0ZDU2ZjNjZTc0YzE1ODEwYTk5M2Y1YzE2ZDA1Mik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9mNGUzOTM4YTIxOTA0ZWRkYjI0ZDM3ODI2Mjg0YmZhYi5iaW5kUG9wdXAocG9wdXBfMTBiNzk2ZTk2YWFkNDM0YThhY2Q4ZTk3OGQ4MGU2ODApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMmYzOWMxZWNjYjRhNDU2MTgxNzYyZjMwZjIxMWU3YTQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42NDA4MTU3LC03OS4zODE3NTIyOTk5OTk5N10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85MTdiZDFiODQ5N2U0MDY1YmU2YmFkY2E2Y2U1ODgwOCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF83ZDU2NmJhY2I0MTE0OTVlYjFmNzBjMTg1ZWRhNjAzMyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zOTQ2MzZmNzYxNTc0NWFiYjIwZmY3ZjZkZTNkZTQ5NCA9ICQoJzxkaXYgaWQ9Imh0bWxfMzk0NjM2Zjc2MTU3NDVhYmIyMGZmN2Y2ZGUzZGU0OTQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkhhcmJvdXJmcm9udCBFYXN0ICxUb3JvbnRvIElzbGFuZHMgLFVuaW9uIFN0YXRpb24sIERvd250b3duIFRvcm9udG88L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzdkNTY2YmFjYjQxMTQ5NWViMWY3MGMxODVlZGE2MDMzLnNldENvbnRlbnQoaHRtbF8zOTQ2MzZmNzYxNTc0NWFiYjIwZmY3ZjZkZTNkZTQ5NCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8yZjM5YzFlY2NiNGE0NTYxODE3NjJmMzBmMjExZTdhNC5iaW5kUG9wdXAocG9wdXBfN2Q1NjZiYWNiNDExNDk1ZWIxZjcwYzE4NWVkYTYwMzMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNDJjMWU3YzllMDRlNGM2MTljYTkwNzhhNTFjZWFjZGEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42NDcxNzY4LC03OS4zODE1NzY0MDAwMDAwMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85MTdiZDFiODQ5N2U0MDY1YmU2YmFkY2E2Y2U1ODgwOCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hOGQ5NzYwOGQ2YTM0ZjQyYTE5Y2VmZjYxMDg5MGJmYiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF84MTFkMjc3OTM4NTk0ZDUwODUzZGVkNGRjYjQ5MDRhYiA9ICQoJzxkaXYgaWQ9Imh0bWxfODExZDI3NzkzODU5NGQ1MDg1M2RlZDRkY2I0OTA0YWIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkRlc2lnbiBFeGNoYW5nZSAsVG9yb250byBEb21pbmlvbiBDZW50cmUsIERvd250b3duIFRvcm9udG88L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2E4ZDk3NjA4ZDZhMzRmNDJhMTljZWZmNjEwODkwYmZiLnNldENvbnRlbnQoaHRtbF84MTFkMjc3OTM4NTk0ZDUwODUzZGVkNGRjYjQ5MDRhYik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl80MmMxZTdjOWUwNGU0YzYxOWNhOTA3OGE1MWNlYWNkYS5iaW5kUG9wdXAocG9wdXBfYThkOTc2MDhkNmEzNGY0MmExOWNlZmY2MTA4OTBiZmIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZjYxNzM2MDE3NGIwNGFlMDg2MzZkYjMzMTg3ZTE4MDIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42NDgxOTg1LC03OS4zNzk4MTY5MDAwMDAwMl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85MTdiZDFiODQ5N2U0MDY1YmU2YmFkY2E2Y2U1ODgwOCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF81ZjUxMGJkOTAxYzc0NGYzOWQ5ZWYzZDkyZTkwZTExYyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83ZmI0NjJiMjU1ZjE0YjE3OTQ5MDljZTJmNjg4YTIxOCA9ICQoJzxkaXYgaWQ9Imh0bWxfN2ZiNDYyYjI1NWYxNGIxNzk0OTA5Y2UyZjY4OGEyMTgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNvbW1lcmNlIENvdXJ0ICxWaWN0b3JpYSBIb3RlbCwgRG93bnRvd24gVG9yb250bzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNWY1MTBiZDkwMWM3NDRmMzlkOWVmM2Q5MmU5MGUxMWMuc2V0Q29udGVudChodG1sXzdmYjQ2MmIyNTVmMTRiMTc5NDkwOWNlMmY2ODhhMjE4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2Y2MTczNjAxNzRiMDRhZTA4NjM2ZGIzMzE4N2UxODAyLmJpbmRQb3B1cChwb3B1cF81ZjUxMGJkOTAxYzc0NGYzOWQ5ZWYzZDkyZTkwZTExYyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9hM2M0MjQ4ZjgzY2E0MGEwYTQxMWVmZGMzOGY3MDBjNyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjczMzI4MjUsLTc5LjQxOTc0OTddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTE3YmQxYjg0OTdlNDA2NWJlNmJhZGNhNmNlNTg4MDgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNzllYzhlMmM0ZTk3NDkxNTk1ZmE3NWM2MjY2NDc3YWMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNWM1NWU1YTViZmJiNDlkM2JkNGRlMmE0Zjk4MGMwNTYgPSAkKCc8ZGl2IGlkPSJodG1sXzVjNTVlNWE1YmZiYjQ5ZDNiZDRkZTJhNGY5ODBjMDU2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5CZWRmb3JkIFBhcmsgLExhd3JlbmNlIE1hbm9yIEVhc3QsIE5vcnRoIFlvcms8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzc5ZWM4ZTJjNGU5NzQ5MTU5NWZhNzVjNjI2NjQ3N2FjLnNldENvbnRlbnQoaHRtbF81YzU1ZTVhNWJmYmI0OWQzYmQ0ZGUyYTRmOTgwYzA1Nik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9hM2M0MjQ4ZjgzY2E0MGEwYTQxMWVmZGMzOGY3MDBjNy5iaW5kUG9wdXAocG9wdXBfNzllYzhlMmM0ZTk3NDkxNTk1ZmE3NWM2MjY2NDc3YWMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZTdjYmJjNDkzMmE2NDBmY2E4NGYyMmMyNTg3N2YzOGYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43MTE2OTQ4LC03OS40MTY5MzU1OTk5OTk5OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85MTdiZDFiODQ5N2U0MDY1YmU2YmFkY2E2Y2U1ODgwOCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mZmQ1NDg4ZWVmNmI0MjRlOTQxMjRmOTMyMTdlMmY5ZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zZWNiYzEzYzIyMWQ0MDI2ODQ0OWFiMmI3ZGM2ZjFiOSA9ICQoJzxkaXYgaWQ9Imh0bWxfM2VjYmMxM2MyMjFkNDAyNjg0NDlhYjJiN2RjNmYxYjkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlJvc2VsYXduLCBDZW50cmFsIFRvcm9udG88L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2ZmZDU0ODhlZWY2YjQyNGU5NDEyNGY5MzIxN2UyZjlkLnNldENvbnRlbnQoaHRtbF8zZWNiYzEzYzIyMWQ0MDI2ODQ0OWFiMmI3ZGM2ZjFiOSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9lN2NiYmM0OTMyYTY0MGZjYTg0ZjIyYzI1ODc3ZjM4Zi5iaW5kUG9wdXAocG9wdXBfZmZkNTQ4OGVlZjZiNDI0ZTk0MTI0ZjkzMjE3ZTJmOWQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYjk0Nzc0ZDY0Y2Q4NDhjOGI3NTE2NjQzNjI5ZTNlOGMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42OTY5NDc2LC03OS40MTEzMDcyMDAwMDAwMl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85MTdiZDFiODQ5N2U0MDY1YmU2YmFkY2E2Y2U1ODgwOCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mNDM1MGQxNThiNTk0ZDg2OWY1ZjI3MjA2ZTYzMzNlZSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83NTYwZGVlYjlhZGU0Mjg0OTAyZGRhMmVkNjFhZDEzMCA9ICQoJzxkaXYgaWQ9Imh0bWxfNzU2MGRlZWI5YWRlNDI4NDkwMmRkYTJlZDYxYWQxMzAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkZvcmVzdCBIaWxsIE5vcnRoICxGb3Jlc3QgSGlsbCBXZXN0LCBDZW50cmFsIFRvcm9udG88L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2Y0MzUwZDE1OGI1OTRkODY5ZjVmMjcyMDZlNjMzM2VlLnNldENvbnRlbnQoaHRtbF83NTYwZGVlYjlhZGU0Mjg0OTAyZGRhMmVkNjFhZDEzMCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9iOTQ3NzRkNjRjZDg0OGM4Yjc1MTY2NDM2MjllM2U4Yy5iaW5kUG9wdXAocG9wdXBfZjQzNTBkMTU4YjU5NGQ4NjlmNWYyNzIwNmU2MzMzZWUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMDQ3NThhMmMwNmNkNDEwN2EwYWU5OGQzYjMyZGZiNzQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42NzI3MDk3LC03OS40MDU2Nzg0MDAwMDAwMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85MTdiZDFiODQ5N2U0MDY1YmU2YmFkY2E2Y2U1ODgwOCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hMjFjNzJjZTcyYmU0ZjgyYjI5NmJlNDJmYTMyMGU1MCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83ZGU1ZmFlZmFmYjI0NmI4ODBiZDk5YmU1M2U3OGQzZiA9ICQoJzxkaXYgaWQ9Imh0bWxfN2RlNWZhZWZhZmIyNDZiODgwYmQ5OWJlNTNlNzhkM2YiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlRoZSBBbm5leCAsTm9ydGggTWlkdG93biAsWW9ya3ZpbGxlLCBDZW50cmFsIFRvcm9udG88L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2EyMWM3MmNlNzJiZTRmODJiMjk2YmU0MmZhMzIwZTUwLnNldENvbnRlbnQoaHRtbF83ZGU1ZmFlZmFmYjI0NmI4ODBiZDk5YmU1M2U3OGQzZik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8wNDc1OGEyYzA2Y2Q0MTA3YTBhZTk4ZDNiMzJkZmI3NC5iaW5kUG9wdXAocG9wdXBfYTIxYzcyY2U3MmJlNGY4MmIyOTZiZTQyZmEzMjBlNTApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMDhiNGE0NjIxMzE3NDc4NDk2OWIwNWJkMzlkOWFkMWYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42NjI2OTU2LC03OS40MDAwNDkzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzkxN2JkMWI4NDk3ZTQwNjViZTZiYWRjYTZjZTU4ODA4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzc1NDA1YjY2YmViNDQ4NDhhNTI2ZTdlOGYxM2UwNDhmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzNmYjQwZjNhNTRiMjQ5MDk5NGM5ODk0NjczYWE3MWE3ID0gJCgnPGRpdiBpZD0iaHRtbF8zZmI0MGYzYTU0YjI0OTA5OTRjOTg5NDY3M2FhNzFhNyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+SGFyYm9yZCAsVW5pdmVyc2l0eSBvZiBUb3JvbnRvLCBEb3dudG93biBUb3JvbnRvPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83NTQwNWI2NmJlYjQ0ODQ4YTUyNmU3ZThmMTNlMDQ4Zi5zZXRDb250ZW50KGh0bWxfM2ZiNDBmM2E1NGIyNDkwOTk0Yzk4OTQ2NzNhYTcxYTcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMDhiNGE0NjIxMzE3NDc4NDk2OWIwNWJkMzlkOWFkMWYuYmluZFBvcHVwKHBvcHVwXzc1NDA1YjY2YmViNDQ4NDhhNTI2ZTdlOGYxM2UwNDhmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzg2OTViZGI3ZGU0ODRjYmZiYTM0N2IxNTMwMzU3YWQyID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjUzMjA1NywtNzkuNDAwMDQ5M10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85MTdiZDFiODQ5N2U0MDY1YmU2YmFkY2E2Y2U1ODgwOCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85NDhmODBhOWE5MDk0ODA2YWYwN2VmZmM3NzA0YmY1MSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF80NjU0ZTFmMTAwYjA0YTEzOTY0MjVjM2M4MTA3OTQ5NCA9ICQoJzxkaXYgaWQ9Imh0bWxfNDY1NGUxZjEwMGIwNGExMzk2NDI1YzNjODEwNzk0OTQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNoaW5hdG93biAsR3JhbmdlIFBhcmsgLEtlbnNpbmd0b24gTWFya2V0LCBEb3dudG93biBUb3JvbnRvPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85NDhmODBhOWE5MDk0ODA2YWYwN2VmZmM3NzA0YmY1MS5zZXRDb250ZW50KGh0bWxfNDY1NGUxZjEwMGIwNGExMzk2NDI1YzNjODEwNzk0OTQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfODY5NWJkYjdkZTQ4NGNiZmJhMzQ3YjE1MzAzNTdhZDIuYmluZFBvcHVwKHBvcHVwXzk0OGY4MGE5YTkwOTQ4MDZhZjA3ZWZmYzc3MDRiZjUxKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2Q2MGM2NTYzMTBiOTRjMjViM2RjNThhNjY0MDc1MmFjID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjI4OTQ2NywtNzkuMzk0NDE5OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85MTdiZDFiODQ5N2U0MDY1YmU2YmFkY2E2Y2U1ODgwOCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mMTE3NDQwOGY2NGI0NDNiYTlhYmMzNzA5YmVmYTJkYiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zZGIxMTU1Y2Y0NzY0NGExODIzZWY1YzgwNDAzZGYwOCA9ICQoJzxkaXYgaWQ9Imh0bWxfM2RiMTE1NWNmNDc2NDRhMTgyM2VmNWM4MDQwM2RmMDgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNOIFRvd2VyICxCYXRodXJzdCBRdWF5ICxJc2xhbmQgYWlycG9ydCAsSGFyYm91cmZyb250IFdlc3QgLEtpbmcgYW5kIFNwYWRpbmEgLFJhaWx3YXkgTGFuZHMgLFNvdXRoIE5pYWdhcmEsIERvd250b3duIFRvcm9udG88L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2YxMTc0NDA4ZjY0YjQ0M2JhOWFiYzM3MDliZWZhMmRiLnNldENvbnRlbnQoaHRtbF8zZGIxMTU1Y2Y0NzY0NGExODIzZWY1YzgwNDAzZGYwOCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9kNjBjNjU2MzEwYjk0YzI1YjNkYzU4YTY2NDA3NTJhYy5iaW5kUG9wdXAocG9wdXBfZjExNzQ0MDhmNjRiNDQzYmE5YWJjMzcwOWJlZmEyZGIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMzdiYmFjNGRjOTI5NDY2ODliZGE2NTJmMWU1OWJkNDkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42NDY0MzUyLC03OS4zNzQ4NDU5OTk5OTk5OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85MTdiZDFiODQ5N2U0MDY1YmU2YmFkY2E2Y2U1ODgwOCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82YjNkN2NiM2FiMWI0YTU2YTQ4MTY3OGZiYTRlODUxNyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xM2IyYTJmOTJmMjY0MTA2YjFmYzc1NDc2MTdiZDQ2OCA9ICQoJzxkaXYgaWQ9Imh0bWxfMTNiMmEyZjkyZjI2NDEwNmIxZmM3NTQ3NjE3YmQ0NjgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlN0biBBIFBPIEJveGVzIDI1IFRoZSBFc3BsYW5hZGUsIERvd250b3duIFRvcm9udG88L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzZiM2Q3Y2IzYWIxYjRhNTZhNDgxNjc4ZmJhNGU4NTE3LnNldENvbnRlbnQoaHRtbF8xM2IyYTJmOTJmMjY0MTA2YjFmYzc1NDc2MTdiZDQ2OCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8zN2JiYWM0ZGM5Mjk0NjY4OWJkYTY1MmYxZTU5YmQ0OS5iaW5kUG9wdXAocG9wdXBfNmIzZDdjYjNhYjFiNGE1NmE0ODE2NzhmYmE0ZTg1MTcpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNjgyYTBmMWVjZjljNGQyNmFkNDcxOTRlOGY3ZDliNjMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42NDg0MjkyLC03OS4zODIyODAyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzkxN2JkMWI4NDk3ZTQwNjViZTZiYWRjYTZjZTU4ODA4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzM0YzRlZWJmN2QzYzQwNjhhNGFlYWQ0NzZjM2JmMTMyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzIxNjI4NzdhZWFmMzQ3ZjY5MGEwYzk3MGNhZTRkNzM1ID0gJCgnPGRpdiBpZD0iaHRtbF8yMTYyODc3YWVhZjM0N2Y2OTBhMGM5NzBjYWU0ZDczNSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Rmlyc3QgQ2FuYWRpYW4gUGxhY2UgLFVuZGVyZ3JvdW5kIGNpdHksIERvd250b3duIFRvcm9udG88L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzM0YzRlZWJmN2QzYzQwNjhhNGFlYWQ0NzZjM2JmMTMyLnNldENvbnRlbnQoaHRtbF8yMTYyODc3YWVhZjM0N2Y2OTBhMGM5NzBjYWU0ZDczNSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl82ODJhMGYxZWNmOWM0ZDI2YWQ0NzE5NGU4ZjdkOWI2My5iaW5kUG9wdXAocG9wdXBfMzRjNGVlYmY3ZDNjNDA2OGE0YWVhZDQ3NmMzYmYxMzIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNWVhNTllZjIxM2EzNDJjZjhmMzU1MTcyNzk3MWM0YWYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43MTg1MTgsLTc5LjQ2NDc2MzI5OTk5OTk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzkxN2JkMWI4NDk3ZTQwNjViZTZiYWRjYTZjZTU4ODA4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzY1ZWMyOGQ2YWIxYzRhNDE4OGJiNjBjOGM3NWNmMTg4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzliNTBhOTkzMzM1NTRjM2FhNmE0NzNkZmZlYTViMWYxID0gJCgnPGRpdiBpZD0iaHRtbF85YjUwYTk5MzMzNTU0YzNhYTZhNDczZGZmZWE1YjFmMSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TGF3cmVuY2UgSGVpZ2h0cyAsTGF3cmVuY2UgTWFub3IsIE5vcnRoIFlvcms8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzY1ZWMyOGQ2YWIxYzRhNDE4OGJiNjBjOGM3NWNmMTg4LnNldENvbnRlbnQoaHRtbF85YjUwYTk5MzMzNTU0YzNhYTZhNDczZGZmZWE1YjFmMSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81ZWE1OWVmMjEzYTM0MmNmOGYzNTUxNzI3OTcxYzRhZi5iaW5kUG9wdXAocG9wdXBfNjVlYzI4ZDZhYjFjNGE0MTg4YmI2MGM4Yzc1Y2YxODgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZTE4OWQ3M2Q1ZWU0NGYwNzk1MDQ4ZjU0YWVlMmExYTYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43MDk1NzcsLTc5LjQ0NTA3MjU5OTk5OTk3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzkxN2JkMWI4NDk3ZTQwNjViZTZiYWRjYTZjZTU4ODA4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzBiZjMwNTc4Y2I0ZDQxZjFhNThiZjQxNzdjMTE3NjgzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2UyODgwMzM5YzlhNTQ1Nzk5NjE2ODM5ZGQ0MWExM2VhID0gJCgnPGRpdiBpZD0iaHRtbF9lMjg4MDMzOWM5YTU0NTc5OTYxNjgzOWRkNDFhMTNlYSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+R2xlbmNhaXJuLCBOb3J0aCBZb3JrPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wYmYzMDU3OGNiNGQ0MWYxYTU4YmY0MTc3YzExNzY4My5zZXRDb250ZW50KGh0bWxfZTI4ODAzMzljOWE1NDU3OTk2MTY4MzlkZDQxYTEzZWEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZTE4OWQ3M2Q1ZWU0NGYwNzk1MDQ4ZjU0YWVlMmExYTYuYmluZFBvcHVwKHBvcHVwXzBiZjMwNTc4Y2I0ZDQxZjFhNThiZjQxNzdjMTE3NjgzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2EwZGU0Yjk4Yjg4NzQ3YWRhNWVmODdkNzY3NzNlZTA0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjkzNzgxMywtNzkuNDI4MTkxNDAwMDAwMDJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTE3YmQxYjg0OTdlNDA2NWJlNmJhZGNhNmNlNTg4MDgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYTdlZDJmYTNmNTA4NDcxYTk0YjNjMDliNmIwNzA0MzEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMzVlYWQ4Y2RkZjU2NDc1YWExMjE1ZjA2NmYxNDljNDUgPSAkKCc8ZGl2IGlkPSJodG1sXzM1ZWFkOGNkZGY1NjQ3NWFhMTIxNWYwNjZmMTQ5YzQ1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5IdW1ld29vZC1DZWRhcnZhbGUsIFlvcms8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2E3ZWQyZmEzZjUwODQ3MWE5NGIzYzA5YjZiMDcwNDMxLnNldENvbnRlbnQoaHRtbF8zNWVhZDhjZGRmNTY0NzVhYTEyMTVmMDY2ZjE0OWM0NSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9hMGRlNGI5OGI4ODc0N2FkYTVlZjg3ZDc2NzczZWUwNC5iaW5kUG9wdXAocG9wdXBfYTdlZDJmYTNmNTA4NDcxYTk0YjNjMDliNmIwNzA0MzEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYWNlZGQ3NmM3MmUyNDc0ZTkyNTNmZmE1M2U2YzY2Y2YgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42ODkwMjU2LC03OS40NTM1MTJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTE3YmQxYjg0OTdlNDA2NWJlNmJhZGNhNmNlNTg4MDgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMGY0ZDk4MTNhYmVkNDkwOGIxZTgwMTYyZjUwM2IzZmQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYTg4NDQxYzRiZDU2NDkwNGI3NGNjNzdlMDA4NTc2MmEgPSAkKCc8ZGl2IGlkPSJodG1sX2E4ODQ0MWM0YmQ1NjQ5MDRiNzRjYzc3ZTAwODU3NjJhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DYWxlZG9uaWEtRmFpcmJhbmtzLCBZb3JrPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wZjRkOTgxM2FiZWQ0OTA4YjFlODAxNjJmNTAzYjNmZC5zZXRDb250ZW50KGh0bWxfYTg4NDQxYzRiZDU2NDkwNGI3NGNjNzdlMDA4NTc2MmEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYWNlZGQ3NmM3MmUyNDc0ZTkyNTNmZmE1M2U2YzY2Y2YuYmluZFBvcHVwKHBvcHVwXzBmNGQ5ODEzYWJlZDQ5MDhiMWU4MDE2MmY1MDNiM2ZkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzc1OTkzMmM4NmFkMDQwMzFhNzY1MDE5OGU2NmE3ZWUzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjY5NTQyLC03OS40MjI1NjM3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzkxN2JkMWI4NDk3ZTQwNjViZTZiYWRjYTZjZTU4ODA4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzAxMTk1NzlhNDQ0MzQ4ZmVhMWNmOWJlNzZkNGQ0YWY5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzExYmI4MTAzN2I0MTQyYjZhOThiMTQ2MjU5MGZlYWEzID0gJCgnPGRpdiBpZD0iaHRtbF8xMWJiODEwMzdiNDE0MmI2YTk4YjE0NjI1OTBmZWFhMyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q2hyaXN0aWUsIERvd250b3duIFRvcm9udG88L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzAxMTk1NzlhNDQ0MzQ4ZmVhMWNmOWJlNzZkNGQ0YWY5LnNldENvbnRlbnQoaHRtbF8xMWJiODEwMzdiNDE0MmI2YTk4YjE0NjI1OTBmZWFhMyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl83NTk5MzJjODZhZDA0MDMxYTc2NTAxOThlNjZhN2VlMy5iaW5kUG9wdXAocG9wdXBfMDExOTU3OWE0NDQzNDhmZWExY2Y5YmU3NmQ0ZDRhZjkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfY2U3YjYyNDhjODI2NDYzNWE2MmEzYTkzYTI3ZGE4OGUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42NjkwMDUxMDAwMDAwMSwtNzkuNDQyMjU5M10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85MTdiZDFiODQ5N2U0MDY1YmU2YmFkY2E2Y2U1ODgwOCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82YWJlZmUxZjM4NTM0ODlkYTUyYjQzMjNhNzUzMmI2NiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hY2Y4NzQ1NDk2ZTE0ZWRiOGI1YzA3MjQ2MGM3YTJlOSA9ICQoJzxkaXYgaWQ9Imh0bWxfYWNmODc0NTQ5NmUxNGVkYjhiNWMwNzI0NjBjN2EyZTkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkRvdmVyY291cnQgVmlsbGFnZSAsRHVmZmVyaW4sIFdlc3QgVG9yb250bzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNmFiZWZlMWYzODUzNDg5ZGE1MmI0MzIzYTc1MzJiNjYuc2V0Q29udGVudChodG1sX2FjZjg3NDU0OTZlMTRlZGI4YjVjMDcyNDYwYzdhMmU5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2NlN2I2MjQ4YzgyNjQ2MzVhNjJhM2E5M2EyN2RhODhlLmJpbmRQb3B1cChwb3B1cF82YWJlZmUxZjM4NTM0ODlkYTUyYjQzMjNhNzUzMmI2Nik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lYTJlMDIxMTU4M2Y0OWIwOGRhNTBlMDE3ZjQ4OWIzZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY0NzkyNjcwMDAwMDAwNiwtNzkuNDE5NzQ5N10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85MTdiZDFiODQ5N2U0MDY1YmU2YmFkY2E2Y2U1ODgwOCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wMGE1ZjQ0YjVjOGI0MTc4YTViYmJlOWUwNGJlOWEzMiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83MTdkNGFmNjQzZmY0ZjZjOWViNjk1NWI3OWIxYmQ1MiA9ICQoJzxkaXYgaWQ9Imh0bWxfNzE3ZDRhZjY0M2ZmNGY2YzllYjY5NTViNzliMWJkNTIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkxpdHRsZSBQb3J0dWdhbCAsVHJpbml0eSwgV2VzdCBUb3JvbnRvPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wMGE1ZjQ0YjVjOGI0MTc4YTViYmJlOWUwNGJlOWEzMi5zZXRDb250ZW50KGh0bWxfNzE3ZDRhZjY0M2ZmNGY2YzllYjY5NTViNzliMWJkNTIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZWEyZTAyMTE1ODNmNDliMDhkYTUwZTAxN2Y0ODliM2UuYmluZFBvcHVwKHBvcHVwXzAwYTVmNDRiNWM4YjQxNzhhNWJiYmU5ZTA0YmU5YTMyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzcwNGY0OWU3YjJkMTRlZmI5MzA5ZDVlZjQyYWRlM2E4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjM2ODQ3MiwtNzkuNDI4MTkxNDAwMDAwMDJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTE3YmQxYjg0OTdlNDA2NWJlNmJhZGNhNmNlNTg4MDgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfN2IzMTQ0MmY2NDJhNGZiODllYWI4YzAyNzJiYjgwMzUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYTQ0MjA1ZDBhNDc0NGMxYTkyYTQ1MTkyOTI5ZDVmZGYgPSAkKCc8ZGl2IGlkPSJodG1sX2E0NDIwNWQwYTQ3NDRjMWE5MmE0NTE5MjkyOWQ1ZmRmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Ccm9ja3RvbiAsRXhoaWJpdGlvbiBQbGFjZSAsUGFya2RhbGUgVmlsbGFnZSwgV2VzdCBUb3JvbnRvPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83YjMxNDQyZjY0MmE0ZmI4OWVhYjhjMDI3MmJiODAzNS5zZXRDb250ZW50KGh0bWxfYTQ0MjA1ZDBhNDc0NGMxYTkyYTQ1MTkyOTI5ZDVmZGYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNzA0ZjQ5ZTdiMmQxNGVmYjkzMDlkNWVmNDJhZGUzYTguYmluZFBvcHVwKHBvcHVwXzdiMzE0NDJmNjQyYTRmYjg5ZWFiOGMwMjcyYmI4MDM1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzAxNzAyMzRjZDJlNzQzMDI4OWUzYzI2MzczZjU5ODc1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzEzNzU2MjAwMDAwMDEsLTc5LjQ5MDA3MzhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTE3YmQxYjg0OTdlNDA2NWJlNmJhZGNhNmNlNTg4MDgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNGQ0YzFjODYyMTU3NGFkMThjYmFlN2NmYWI5ZTgyOWIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZWNiMzQ4OThkYTVlNDMyNWJiNWRkODNmZjhmMjUwMDYgPSAkKCc8ZGl2IGlkPSJodG1sX2VjYjM0ODk4ZGE1ZTQzMjViYjVkZDgzZmY4ZjI1MDA2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Eb3duc3ZpZXcgLE5vcnRoIFBhcmsgLFVwd29vZCBQYXJrLCBOb3J0aCBZb3JrPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80ZDRjMWM4NjIxNTc0YWQxOGNiYWU3Y2ZhYjllODI5Yi5zZXRDb250ZW50KGh0bWxfZWNiMzQ4OThkYTVlNDMyNWJiNWRkODNmZjhmMjUwMDYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMDE3MDIzNGNkMmU3NDMwMjg5ZTNjMjYzNzNmNTk4NzUuYmluZFBvcHVwKHBvcHVwXzRkNGMxYzg2MjE1NzRhZDE4Y2JhZTdjZmFiOWU4MjliKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzE1ODhiNGIwNDYyNDRkYTJiNWU4OGExMjM2ZDI4MTllID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjkxMTE1OCwtNzkuNDc2MDEzMjk5OTk5OThdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTE3YmQxYjg0OTdlNDA2NWJlNmJhZGNhNmNlNTg4MDgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfY2RjMmQ4NDJiZmMzNDU0NWE2ZTJkNjlmZWM0MGJkOWYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMTc2Mzc1YzcwODQxNDZhYWI3NTM5YjNhYTQwM2U5N2UgPSAkKCc8ZGl2IGlkPSJodG1sXzE3NjM3NWM3MDg0MTQ2YWFiNzUzOWIzYWE0MDNlOTdlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5EZWwgUmF5ICxLZWVsZXNkYWxlICxNb3VudCBEZW5uaXMgLFNpbHZlcnRob3JuLCBZb3JrPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jZGMyZDg0MmJmYzM0NTQ1YTZlMmQ2OWZlYzQwYmQ5Zi5zZXRDb250ZW50KGh0bWxfMTc2Mzc1YzcwODQxNDZhYWI3NTM5YjNhYTQwM2U5N2UpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMTU4OGI0YjA0NjI0NGRhMmI1ZTg4YTEyMzZkMjgxOWUuYmluZFBvcHVwKHBvcHVwX2NkYzJkODQyYmZjMzQ1NDVhNmUyZDY5ZmVjNDBiZDlmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzNmYjcyYzZhZDA1NDQ1OWRhZDQ5ZjgzMTZjYjNjMGQwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjczMTg1Mjk5OTk5OTksLTc5LjQ4NzI2MTkwMDAwMDAyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzkxN2JkMWI4NDk3ZTQwNjViZTZiYWRjYTZjZTU4ODA4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzUwYWQ2ZDk3ZGFkNzQ3OGJiMjY0MGQ0MjdkMGJlMThjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzRkMzFhNmVmYjA4NzQwYzA5NzE5YzEwNTBjYjkxZTE1ID0gJCgnPGRpdiBpZD0iaHRtbF80ZDMxYTZlZmIwODc0MGMwOTcxOWMxMDUwY2I5MWUxNSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+VGhlIEp1bmN0aW9uIE5vcnRoICxSdW5ueW1lZGUsIFlvcms8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzUwYWQ2ZDk3ZGFkNzQ3OGJiMjY0MGQ0MjdkMGJlMThjLnNldENvbnRlbnQoaHRtbF80ZDMxYTZlZmIwODc0MGMwOTcxOWMxMDUwY2I5MWUxNSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8zZmI3MmM2YWQwNTQ0NTlkYWQ0OWY4MzE2Y2IzYzBkMC5iaW5kUG9wdXAocG9wdXBfNTBhZDZkOTdkYWQ3NDc4YmIyNjQwZDQyN2QwYmUxOGMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMTE1NDI5YTJmMzY2NDIyZWJhYWEwMzUxZTRmMDFhZTMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42NjE2MDgzLC03OS40NjQ3NjMyOTk5OTk5OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85MTdiZDFiODQ5N2U0MDY1YmU2YmFkY2E2Y2U1ODgwOCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82ZTRmY2Y3MDZhODA0ZDFhOTk4NzA1OWQxNGZmYTkxMiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wODFkNDRkZjk4ZmQ0OTJhYWZiOTkyNGU3MmFlODc3OCA9ICQoJzxkaXYgaWQ9Imh0bWxfMDgxZDQ0ZGY5OGZkNDkyYWFmYjk5MjRlNzJhZTg3NzgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkhpZ2ggUGFyayAsVGhlIEp1bmN0aW9uIFNvdXRoLCBXZXN0IFRvcm9udG88L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzZlNGZjZjcwNmE4MDRkMWE5OTg3MDU5ZDE0ZmZhOTEyLnNldENvbnRlbnQoaHRtbF8wODFkNDRkZjk4ZmQ0OTJhYWZiOTkyNGU3MmFlODc3OCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8xMTU0MjlhMmYzNjY0MjJlYmFhYTAzNTFlNGYwMWFlMy5iaW5kUG9wdXAocG9wdXBfNmU0ZmNmNzA2YTgwNGQxYTk5ODcwNTlkMTRmZmE5MTIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNDE1NzNjZWViMDVlNGU3NmI3MjZhYmQyOTdmNjI3ODggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42NDg5NTk3LC03OS40NTYzMjVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTE3YmQxYjg0OTdlNDA2NWJlNmJhZGNhNmNlNTg4MDgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMThhNzQwYWM2YmU2NGQ3YmFiN2FiNmQ0OGIwZjQzMTcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNjYzODJiMmU3NjRjNDRlOGEwYTczNDk5YjgzZDhkNjcgPSAkKCc8ZGl2IGlkPSJodG1sXzY2MzgyYjJlNzY0YzQ0ZThhMGE3MzQ5OWI4M2Q4ZDY3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5QYXJrZGFsZSAsUm9uY2VzdmFsbGVzLCBXZXN0IFRvcm9udG88L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzE4YTc0MGFjNmJlNjRkN2JhYjdhYjZkNDhiMGY0MzE3LnNldENvbnRlbnQoaHRtbF82NjM4MmIyZTc2NGM0NGU4YTBhNzM0OTliODNkOGQ2Nyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl80MTU3M2NlZWIwNWU0ZTc2YjcyNmFiZDI5N2Y2Mjc4OC5iaW5kUG9wdXAocG9wdXBfMThhNzQwYWM2YmU2NGQ3YmFiN2FiNmQ0OGIwZjQzMTcpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfODBjODE2Mjk4ZWRlNGVlYjhlODcwODAzMzExNjRjZWIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42NTE1NzA2LC03OS40ODQ0NDk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzkxN2JkMWI4NDk3ZTQwNjViZTZiYWRjYTZjZTU4ODA4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzBiOGQwNzcyZTY4NjQ4YmZiMzJiNDMyYTBmNDY0OTU1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzJjYWUwN2Y3Y2NjMzRiOGViMzgwNTAwYWY5YTJmODI4ID0gJCgnPGRpdiBpZD0iaHRtbF8yY2FlMDdmN2NjYzM0YjhlYjM4MDUwMGFmOWEyZjgyOCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UnVubnltZWRlICxTd2Fuc2VhLCBXZXN0IFRvcm9udG88L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzBiOGQwNzcyZTY4NjQ4YmZiMzJiNDMyYTBmNDY0OTU1LnNldENvbnRlbnQoaHRtbF8yY2FlMDdmN2NjYzM0YjhlYjM4MDUwMGFmOWEyZjgyOCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl84MGM4MTYyOThlZGU0ZWViOGU4NzA4MDMzMTE2NGNlYi5iaW5kUG9wdXAocG9wdXBfMGI4ZDA3NzJlNjg2NDhiZmIzMmI0MzJhMGY0NjQ5NTUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMjgyMGRiNzg0NzljNDU4M2JmZWYyYTlhZjZkN2M3YTIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42NjIzMDE1LC03OS4zODk0OTM4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzkxN2JkMWI4NDk3ZTQwNjViZTZiYWRjYTZjZTU4ODA4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzVmZTFjNjkwNjRmODQxOTg4ZjgwZTZmNDYwMzJmMjg4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzk3ZmI4Yzc1OTVjZDQ2NWM5NWMzZjQxODU1OWUyMGIwID0gJCgnPGRpdiBpZD0iaHRtbF85N2ZiOGM3NTk1Y2Q0NjVjOTVjM2Y0MTg1NTllMjBiMCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UXVlZW4mIzM5O3MgUGFyaywgRG93bnRvd24gVG9yb250bzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNWZlMWM2OTA2NGY4NDE5ODhmODBlNmY0NjAzMmYyODguc2V0Q29udGVudChodG1sXzk3ZmI4Yzc1OTVjZDQ2NWM5NWMzZjQxODU1OWUyMGIwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzI4MjBkYjc4NDc5YzQ1ODNiZmVmMmE5YWY2ZDdjN2EyLmJpbmRQb3B1cChwb3B1cF81ZmUxYzY5MDY0Zjg0MTk4OGY4MGU2ZjQ2MDMyZjI4OCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl83YTA5MjU5MDNmOTU0MmYwYjdjOTE2ZGRhMzk4ZjZjZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjYzNjk2NTYsLTc5LjYxNTgxODk5OTk5OTk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzkxN2JkMWI4NDk3ZTQwNjViZTZiYWRjYTZjZTU4ODA4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzA0Y2ZiYjNmYzdkNDRkNTZiNGNmNThmMjgzNGRiOTJlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzY2OTJiYmFkYTFkMzQxZjg4MzQzYzkzMGIwMzk1YTUwID0gJCgnPGRpdiBpZD0iaHRtbF82NjkyYmJhZGExZDM0MWY4ODM0M2M5MzBiMDM5NWE1MCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q2FuYWRhIFBvc3QgR2F0ZXdheSBQcm9jZXNzaW5nIENlbnRyZSwgTWlzc2lzc2F1Z2E8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzA0Y2ZiYjNmYzdkNDRkNTZiNGNmNThmMjgzNGRiOTJlLnNldENvbnRlbnQoaHRtbF82NjkyYmJhZGExZDM0MWY4ODM0M2M5MzBiMDM5NWE1MCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl83YTA5MjU5MDNmOTU0MmYwYjdjOTE2ZGRhMzk4ZjZjZC5iaW5kUG9wdXAocG9wdXBfMDRjZmJiM2ZjN2Q0NGQ1NmI0Y2Y1OGYyODM0ZGI5MmUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNWFmYjkwYmNlODkyNGMzZjgyZmYwYTgxMGJlYmUyODQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42NjI3NDM5LC03OS4zMjE1NThdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTE3YmQxYjg0OTdlNDA2NWJlNmJhZGNhNmNlNTg4MDgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfY2IzM2RjZTQ0YjcyNDMzZDgzNzI1ZDRkOGY3MGIxMjUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfY2Y0Yzk5Mzg0N2EzNDU5ZGIxNzg2OGVjOWI5ZDJhYzkgPSAkKCc8ZGl2IGlkPSJodG1sX2NmNGM5OTM4NDdhMzQ1OWRiMTc4NjhlYzliOWQyYWM5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5CdXNpbmVzcyBSZXBseSBNYWlsIFByb2Nlc3NpbmcgQ2VudHJlIDk2OSBFYXN0ZXJuLCBFYXN0IFRvcm9udG88L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2NiMzNkY2U0NGI3MjQzM2Q4MzcyNWQ0ZDhmNzBiMTI1LnNldENvbnRlbnQoaHRtbF9jZjRjOTkzODQ3YTM0NTlkYjE3ODY4ZWM5YjlkMmFjOSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81YWZiOTBiY2U4OTI0YzNmODJmZjBhODEwYmViZTI4NC5iaW5kUG9wdXAocG9wdXBfY2IzM2RjZTQ0YjcyNDMzZDgzNzI1ZDRkOGY3MGIxMjUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfODgzMWRlOTJlZWIzNGI2MzljOTZjM2IzZTMzZmY5ZWYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42MDU2NDY2LC03OS41MDEzMjA3MDAwMDAwMl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85MTdiZDFiODQ5N2U0MDY1YmU2YmFkY2E2Y2U1ODgwOCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF80NDk0N2M1ZjU3ZGY0ODdhYjY4MWQ1YTAwM2Y0MGNiMSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jMDQ2NzRjYWRlNTA0ZjZmYWJjMjZjYjgyNzRkMWRmNiA9ICQoJzxkaXYgaWQ9Imh0bWxfYzA0Njc0Y2FkZTUwNGY2ZmFiYzI2Y2I4Mjc0ZDFkZjYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkh1bWJlciBCYXkgU2hvcmVzICxNaW1pY28gU291dGggLE5ldyBUb3JvbnRvLCBFdG9iaWNva2U8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzQ0OTQ3YzVmNTdkZjQ4N2FiNjgxZDVhMDAzZjQwY2IxLnNldENvbnRlbnQoaHRtbF9jMDQ2NzRjYWRlNTA0ZjZmYWJjMjZjYjgyNzRkMWRmNik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl84ODMxZGU5MmVlYjM0YjYzOWM5NmMzYjNlMzNmZjllZi5iaW5kUG9wdXAocG9wdXBfNDQ5NDdjNWY1N2RmNDg3YWI2ODFkNWEwMDNmNDBjYjEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZWZiYjBiNTZhNjk5NDExNjg5ZTJmZmJhZTdiODkzMzYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42MDI0MTM3MDAwMDAwMSwtNzkuNTQzNDg0MDk5OTk5OTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTE3YmQxYjg0OTdlNDA2NWJlNmJhZGNhNmNlNTg4MDgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMjZmYzQzYmQxYmNiNDUxYzg3NDAzNmI1YmIzODc3MDMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMWY5MTEzYmEwZWZlNGY4MzkwZDExZjdkY2I0NTRiODYgPSAkKCc8ZGl2IGlkPSJodG1sXzFmOTExM2JhMGVmZTRmODM5MGQxMWY3ZGNiNDU0Yjg2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5BbGRlcndvb2QgLExvbmcgQnJhbmNoLCBFdG9iaWNva2U8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzI2ZmM0M2JkMWJjYjQ1MWM4NzQwMzZiNWJiMzg3NzAzLnNldENvbnRlbnQoaHRtbF8xZjkxMTNiYTBlZmU0ZjgzOTBkMTFmN2RjYjQ1NGI4Nik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9lZmJiMGI1NmE2OTk0MTE2ODllMmZmYmFlN2I4OTMzNi5iaW5kUG9wdXAocG9wdXBfMjZmYzQzYmQxYmNiNDUxYzg3NDAzNmI1YmIzODc3MDMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYjY3YzQwZjI2OTg0NDNiMmI5MDNmMzdiMDFlZjYyYTUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42NTM2NTM2MDAwMDAwMSwtNzkuNTA2OTQzNl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85MTdiZDFiODQ5N2U0MDY1YmU2YmFkY2E2Y2U1ODgwOCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF84MjQwMDJjZGUyY2M0MDE0ODdlZWZiNzJmMmM5ZGI3YyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lZTY4ZWNjZTQ2ZDA0YWM4YTgyMWM4NTVkMDAyNzI4NyA9ICQoJzxkaXYgaWQ9Imh0bWxfZWU2OGVjY2U0NmQwNGFjOGE4MjFjODU1ZDAwMjcyODciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlRoZSBLaW5nc3dheSAsTW9udGdvbWVyeSBSb2FkICxPbGQgTWlsbCBOb3J0aCwgRXRvYmljb2tlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84MjQwMDJjZGUyY2M0MDE0ODdlZWZiNzJmMmM5ZGI3Yy5zZXRDb250ZW50KGh0bWxfZWU2OGVjY2U0NmQwNGFjOGE4MjFjODU1ZDAwMjcyODcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYjY3YzQwZjI2OTg0NDNiMmI5MDNmMzdiMDFlZjYyYTUuYmluZFBvcHVwKHBvcHVwXzgyNDAwMmNkZTJjYzQwMTQ4N2VlZmI3MmYyYzlkYjdjKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2M1M2E4OThhNzg2MTQzZGRhOGMzZTA0ODBjMTFjZTdjID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjM2MjU3OSwtNzkuNDk4NTA5MDk5OTk5OThdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTE3YmQxYjg0OTdlNDA2NWJlNmJhZGNhNmNlNTg4MDgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYzBjZTMzOGRkMTU1NDgzMzkyYjgzYzc5ZGNhYzVmNjcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYWJjZGNiNWU4YzY4NDE5YTg3M2JiNjZjYmJmMmE1ZDcgPSAkKCc8ZGl2IGlkPSJodG1sX2FiY2RjYjVlOGM2ODQxOWE4NzNiYjY2Y2JiZjJhNWQ3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5IdW1iZXIgQmF5ICxLaW5nJiMzOTtzIE1pbGwgUGFyayAsS2luZ3N3YXkgUGFyayBTb3V0aCBFYXN0ICxNaW1pY28gTkUgLE9sZCBNaWxsIFNvdXRoICxUaGUgUXVlZW5zd2F5IEVhc3QgLFJveWFsIFlvcmsgU291dGggRWFzdCAsU3VubnlsZWEsIEV0b2JpY29rZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYzBjZTMzOGRkMTU1NDgzMzkyYjgzYzc5ZGNhYzVmNjcuc2V0Q29udGVudChodG1sX2FiY2RjYjVlOGM2ODQxOWE4NzNiYjY2Y2JiZjJhNWQ3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2M1M2E4OThhNzg2MTQzZGRhOGMzZTA0ODBjMTFjZTdjLmJpbmRQb3B1cChwb3B1cF9jMGNlMzM4ZGQxNTU0ODMzOTJiODNjNzlkY2FjNWY2Nyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85NjNjYTFlZmEwZjY0YTcyODViZDY5MzYwNjNmM2ZjZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjYyODg0MDgsLTc5LjUyMDk5OTQwMDAwMDAyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzkxN2JkMWI4NDk3ZTQwNjViZTZiYWRjYTZjZTU4ODA4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzhhNTc5Yjc0YmQ1MDRlNzM4M2U2ODVjYjYyZTJhZTlmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2MzNWI0MGY5MzE2YzQxMzBhNzU0YzViMTkwMGNmODMzID0gJCgnPGRpdiBpZD0iaHRtbF9jMzViNDBmOTMxNmM0MTMwYTc1NGM1YjE5MDBjZjgzMyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+S2luZ3N3YXkgUGFyayBTb3V0aCBXZXN0ICxNaW1pY28gTlcgLFRoZSBRdWVlbnN3YXkgV2VzdCAsUm95YWwgWW9yayBTb3V0aCBXZXN0ICxTb3V0aCBvZiBCbG9vciwgRXRvYmljb2tlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84YTU3OWI3NGJkNTA0ZTczODNlNjg1Y2I2MmUyYWU5Zi5zZXRDb250ZW50KGh0bWxfYzM1YjQwZjkzMTZjNDEzMGE3NTRjNWIxOTAwY2Y4MzMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOTYzY2ExZWZhMGY2NGE3Mjg1YmQ2OTM2MDYzZjNmY2UuYmluZFBvcHVwKHBvcHVwXzhhNTc5Yjc0YmQ1MDRlNzM4M2U2ODVjYjYyZTJhZTlmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2E0NTY0YzlhODExNjQ1NjJiOWFmY2UzYmEyNDFhNTZkID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjY3ODU1NiwtNzkuNTMyMjQyNDAwMDAwMDJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTE3YmQxYjg0OTdlNDA2NWJlNmJhZGNhNmNlNTg4MDgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMWEzMTgzZGI2YmQ5NDliOGJiN2RjNWEwYzdkMDNkZjkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfODBkOTFkYjk1NTY5NDYxNTg3YTRjZDEzNTM1NThmMmUgPSAkKCc8ZGl2IGlkPSJodG1sXzgwZDkxZGI5NTU2OTQ2MTU4N2E0Y2QxMzUzNTU4ZjJlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Jc2xpbmd0b24gQXZlbnVlLCBFdG9iaWNva2U8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzFhMzE4M2RiNmJkOTQ5YjhiYjdkYzVhMGM3ZDAzZGY5LnNldENvbnRlbnQoaHRtbF84MGQ5MWRiOTU1Njk0NjE1ODdhNGNkMTM1MzU1OGYyZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9hNDU2NGM5YTgxMTY0NTYyYjlhZmNlM2JhMjQxYTU2ZC5iaW5kUG9wdXAocG9wdXBfMWEzMTgzZGI2YmQ5NDliOGJiN2RjNWEwYzdkMDNkZjkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMWU0MjMxNjZjM2YxNGQxN2IxZWM3ZmVjY2IwN2ZjNDkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42NTA5NDMyLC03OS41NTQ3MjQ0MDAwMDAwMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85MTdiZDFiODQ5N2U0MDY1YmU2YmFkY2E2Y2U1ODgwOCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85YmZkYjM1MjhjMzM0ZmYyOTBiZmQ5M2Q3ZTBkMmJkMSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF85MDkzYTE2YjRjMmM0ODAzOTEzNWI3NDRiZWUyNTcyYSA9ICQoJzxkaXYgaWQ9Imh0bWxfOTA5M2ExNmI0YzJjNDgwMzkxMzViNzQ0YmVlMjU3MmEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNsb3ZlcmRhbGUgLElzbGluZ3RvbiAsTWFydGluIEdyb3ZlICxQcmluY2VzcyBHYXJkZW5zICxXZXN0IERlYW5lIFBhcmssIEV0b2JpY29rZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOWJmZGIzNTI4YzMzNGZmMjkwYmZkOTNkN2UwZDJiZDEuc2V0Q29udGVudChodG1sXzkwOTNhMTZiNGMyYzQ4MDM5MTM1Yjc0NGJlZTI1NzJhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzFlNDIzMTY2YzNmMTRkMTdiMWVjN2ZlY2NiMDdmYzQ5LmJpbmRQb3B1cChwb3B1cF85YmZkYjM1MjhjMzM0ZmYyOTBiZmQ5M2Q3ZTBkMmJkMSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xNzdkZTkxNTk4Y2Y0Y2MyOTJhYjIzNTRhMmM0YWQxNSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY0MzUxNTIsLTc5LjU3NzIwMDc5OTk5OTk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzkxN2JkMWI4NDk3ZTQwNjViZTZiYWRjYTZjZTU4ODA4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzQ0ZmJkNzFhOWI3YzRiM2NhNzc4OGJjMzg0ZDg2YTQwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2I2MDk0MDA1MWQ1ZDQ3YmRiNzZiMDNkNTBiNTc5MzBjID0gJCgnPGRpdiBpZD0iaHRtbF9iNjA5NDAwNTFkNWQ0N2JkYjc2YjAzZDUwYjU3OTMwYyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Qmxvb3JkYWxlIEdhcmRlbnMgLEVyaW5nYXRlICxNYXJrbGFuZCBXb29kICxPbGQgQnVybmhhbXRob3JwZSwgRXRvYmljb2tlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80NGZiZDcxYTliN2M0YjNjYTc3ODhiYzM4NGQ4NmE0MC5zZXRDb250ZW50KGh0bWxfYjYwOTQwMDUxZDVkNDdiZGI3NmIwM2Q1MGI1NzkzMGMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMTc3ZGU5MTU5OGNmNGNjMjkyYWIyMzU0YTJjNGFkMTUuYmluZFBvcHVwKHBvcHVwXzQ0ZmJkNzFhOWI3YzRiM2NhNzc4OGJjMzg0ZDg2YTQwKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2VjZDlkN2I0MDY1NjQ3OGQ5MzNiYzE1OGJhMmJjYjE0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzU2MzAzMywtNzkuNTY1OTYzMjk5OTk5OThdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTE3YmQxYjg0OTdlNDA2NWJlNmJhZGNhNmNlNTg4MDgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOTU0MTM4NTliYTY0NDlhZWJiMDQyNGQ2Y2FiMWYzNDkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMWIxNzJjZjcxMjM0NGYxYzlhYjhiOGQ3NzUwZTIxZDUgPSAkKCc8ZGl2IGlkPSJodG1sXzFiMTcyY2Y3MTIzNDRmMWM5YWI4YjhkNzc1MGUyMWQ1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5IdW1iZXIgU3VtbWl0LCBOb3J0aCBZb3JrPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85NTQxMzg1OWJhNjQ0OWFlYmIwNDI0ZDZjYWIxZjM0OS5zZXRDb250ZW50KGh0bWxfMWIxNzJjZjcxMjM0NGYxYzlhYjhiOGQ3NzUwZTIxZDUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZWNkOWQ3YjQwNjU2NDc4ZDkzM2JjMTU4YmEyYmNiMTQuYmluZFBvcHVwKHBvcHVwXzk1NDEzODU5YmE2NDQ5YWViYjA0MjRkNmNhYjFmMzQ5KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzVlZTE4MGVmMDU0MTRjNzQ5ZWJjYWIxYTk1NGNmYWE3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzI0NzY1OSwtNzkuNTMyMjQyNDAwMDAwMDJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTE3YmQxYjg0OTdlNDA2NWJlNmJhZGNhNmNlNTg4MDgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfY2FjMDA2YTIyZDJkNGYyODllZDAyMWZhOTQwOGY2YTIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNjk2MDYyODc2MGFjNDljOThhYWUzMjEwMDU5ZjUwMjEgPSAkKCc8ZGl2IGlkPSJodG1sXzY5NjA2Mjg3NjBhYzQ5Yzk4YWFlMzIxMDA1OWY1MDIxIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5FbWVyeSAsSHVtYmVybGVhLCBOb3J0aCBZb3JrPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jYWMwMDZhMjJkMmQ0ZjI4OWVkMDIxZmE5NDA4ZjZhMi5zZXRDb250ZW50KGh0bWxfNjk2MDYyODc2MGFjNDljOThhYWUzMjEwMDU5ZjUwMjEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNWVlMTgwZWYwNTQxNGM3NDllYmNhYjFhOTU0Y2ZhYTcuYmluZFBvcHVwKHBvcHVwX2NhYzAwNmEyMmQyZDRmMjg5ZWQwMjFmYTk0MDhmNmEyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2QzYzdjMTkyY2QzYzQ1ZTQ4MmQ0N2JmNWRmMTY3MTMwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzA2ODc2LC03OS41MTgxODg0MDAwMDAwMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85MTdiZDFiODQ5N2U0MDY1YmU2YmFkY2E2Y2U1ODgwOCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wNzI5MmUzYTRlZGM0YmJjOWVkNThlM2VlNDMzMGUyOCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82OTRjNjk4NzFmZWE0YmFjOTg3MjFkOTM2NzU5YThjZCA9ICQoJzxkaXYgaWQ9Imh0bWxfNjk0YzY5ODcxZmVhNGJhYzk4NzIxZDkzNjc1OWE4Y2QiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPldlc3RvbiwgWW9yazwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMDcyOTJlM2E0ZWRjNGJiYzllZDU4ZTNlZTQzMzBlMjguc2V0Q29udGVudChodG1sXzY5NGM2OTg3MWZlYTRiYWM5ODcyMWQ5MzY3NTlhOGNkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2QzYzdjMTkyY2QzYzQ1ZTQ4MmQ0N2JmNWRmMTY3MTMwLmJpbmRQb3B1cChwb3B1cF8wNzI5MmUzYTRlZGM0YmJjOWVkNThlM2VlNDMzMGUyOCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl83ZDUzNjY3MmNlNTg0OGU0OTA2ZjYzNmRmOGMwYjBmZiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY5NjMxOSwtNzkuNTMyMjQyNDAwMDAwMDJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTE3YmQxYjg0OTdlNDA2NWJlNmJhZGNhNmNlNTg4MDgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYzhjMjRhZWIwMDM4NDc5MmIyM2Y0MTM4OTQyY2FkMTIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfM2M0N2JjODkwZmI0NGNjOThlNDkzZTZjZjBiMjdhMDMgPSAkKCc8ZGl2IGlkPSJodG1sXzNjNDdiYzg5MGZiNDRjYzk4ZTQ5M2U2Y2YwYjI3YTAzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5XZXN0bW91bnQsIEV0b2JpY29rZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYzhjMjRhZWIwMDM4NDc5MmIyM2Y0MTM4OTQyY2FkMTIuc2V0Q29udGVudChodG1sXzNjNDdiYzg5MGZiNDRjYzk4ZTQ5M2U2Y2YwYjI3YTAzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzdkNTM2NjcyY2U1ODQ4ZTQ5MDZmNjM2ZGY4YzBiMGZmLmJpbmRQb3B1cChwb3B1cF9jOGMyNGFlYjAwMzg0NzkyYjIzZjQxMzg5NDJjYWQxMik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl83Y2JlNDhjZWQ1NDU0YmJkYjJjNDA3Mzk2NzNkYzEwZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY4ODkwNTQsLTc5LjU1NDcyNDQwMDAwMDAxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzkxN2JkMWI4NDk3ZTQwNjViZTZiYWRjYTZjZTU4ODA4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzEyYzAyZjY3MWFmNDQ3NTZiZTRlYTI3OTYzOThmZTA4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzllODkzMjY3ZGJmMTRkOTQ5YTg2YTNiOWQzNDQzMWFlID0gJCgnPGRpdiBpZD0iaHRtbF85ZTg5MzI2N2RiZjE0ZDk0OWE4NmEzYjlkMzQ0MzFhZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+S2luZ3N2aWV3IFZpbGxhZ2UgLE1hcnRpbiBHcm92ZSBHYXJkZW5zICxSaWNodmlldyBHYXJkZW5zICxTdC4gUGhpbGxpcHMsIEV0b2JpY29rZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMTJjMDJmNjcxYWY0NDc1NmJlNGVhMjc5NjM5OGZlMDguc2V0Q29udGVudChodG1sXzllODkzMjY3ZGJmMTRkOTQ5YTg2YTNiOWQzNDQzMWFlKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzdjYmU0OGNlZDU0NTRiYmRiMmM0MDczOTY3M2RjMTBlLmJpbmRQb3B1cChwb3B1cF8xMmMwMmY2NzFhZjQ0NzU2YmU0ZWEyNzk2Mzk4ZmUwOCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lYjllM2M5M2YzMzY0OGMzOTllNzY5MTNlYmRhMjFhYyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjczOTQxNjQsLTc5LjU4ODQzNjldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfOTE3YmQxYjg0OTdlNDA2NWJlNmJhZGNhNmNlNTg4MDgpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZmMyOTVkNzAyNTA2NGE2OWJhYjQ3NzUxNGU1ZDY3NjIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMzYzMjg5OTcwYWFiNDlhMmEwNjhjYTc0Y2FlYWM4YmEgPSAkKCc8ZGl2IGlkPSJodG1sXzM2MzI4OTk3MGFhYjQ5YTJhMDY4Y2E3NGNhZWFjOGJhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5BbGJpb24gR2FyZGVucyAsQmVhdW1vbmQgSGVpZ2h0cyAsSHVtYmVyZ2F0ZSAsSmFtZXN0b3duICxNb3VudCBPbGl2ZSAsU2lsdmVyc3RvbmUgLFNvdXRoIFN0ZWVsZXMgLFRoaXN0bGV0b3duLCBFdG9iaWNva2U8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2ZjMjk1ZDcwMjUwNjRhNjliYWI0Nzc1MTRlNWQ2NzYyLnNldENvbnRlbnQoaHRtbF8zNjMyODk5NzBhYWI0OWEyYTA2OGNhNzRjYWVhYzhiYSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9lYjllM2M5M2YzMzY0OGMzOTllNzY5MTNlYmRhMjFhYy5iaW5kUG9wdXAocG9wdXBfZmMyOTVkNzAyNTA2NGE2OWJhYjQ3NzUxNGU1ZDY3NjIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNjY1Njg1NGE2NjFjNGEwYzgxZjQwMmM4MjEwMjBmNTAgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43MDY3NDgzLC03OS41OTQwNTQ0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzkxN2JkMWI4NDk3ZTQwNjViZTZiYWRjYTZjZTU4ODA4KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2VkZWNkYjE0ZTE0YzQ3ZDc5Njg4MjIyYWNiNzE1Y2RkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzM5NTgzY2U3YjJhZTQ3ODA5ZjUzYzcyMjNmNDBjMzdhID0gJCgnPGRpdiBpZD0iaHRtbF8zOTU4M2NlN2IyYWU0NzgwOWY1M2M3MjIzZjQwYzM3YSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Tm9ydGh3ZXN0LCBFdG9iaWNva2U8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2VkZWNkYjE0ZTE0YzQ3ZDc5Njg4MjIyYWNiNzE1Y2RkLnNldENvbnRlbnQoaHRtbF8zOTU4M2NlN2IyYWU0NzgwOWY1M2M3MjIzZjQwYzM3YSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl82NjU2ODU0YTY2MWM0YTBjODFmNDAyYzgyMTAyMGY1MC5iaW5kUG9wdXAocG9wdXBfZWRlY2RiMTRlMTRjNDdkNzk2ODgyMjJhY2I3MTVjZGQpOwoKICAgICAgICAgICAgCiAgICAgICAgCjwvc2NyaXB0Pg== onload="this.contentDocument.open();this.contentDocument.write(atob(this.getAttribute('data-html')));this.contentDocument.close();" allowfullscreen webkitallowfullscreen mozallowfullscreen></iframe>

Utilize the Foursquare API to explore the neighborhoods and segment them.

LIMIT = 100

# define Foursquare Credentials
CLIENT_ID = 'XXXX' 
CLIENT_SECRET = 'XXXX'
VERSION = '20191219'

Explore neighborhoods in Toronto

Let's create a function to repeat the same process to all the neighborhoods in Toronto.

def getNearbyVenues(names, latitudes, longitudes, radius=500):
    
    venues_list=[]
    for name, lat, lng in zip(names, latitudes, longitudes):
        print(name)
            
        # create the API request URL
        url = 'https://api.foursquare.com/v2/venues/explore?&client_id={}&client_secret={}&v={}&ll={},{}&radius={}&limit={}'.format(
            CLIENT_ID, 
            CLIENT_SECRET, 
            VERSION, 
            lat, 
            lng, 
            radius, 
            LIMIT)
            
        # make the GET request
        results = requests.get(url).json()["response"]['groups'][0]['items']
        
        # return only relevant information for each nearby venue
        venues_list.append([(
            name, 
            lat, 
            lng, 
            v['venue']['name'], 
            v['venue']['location']['lat'], 
            v['venue']['location']['lng'],  
            v['venue']['categories'][0]['name']) for v in results])

    nearby_venues = pd.DataFrame([item for venue_list in venues_list for item in venue_list])
    nearby_venues.columns = ['Neighborhood', 
                  'Neighborhood Latitude', 
                  'Neighborhood Longitude', 
                  'Venue', 
                  'Venue Latitude', 
                  'Venue Longitude', 
                  'Venue Category']
    
    return(nearby_venues)

Run the above function on each neighborhood and create a new dataframe called toronto_venues.

toronto_venues = getNearbyVenues(names=neighborhoods['Neighborhood'],
                                 latitudes=neighborhoods['Latitude'],
                                 longitudes=neighborhoods['Longitude'])

Rouge ,Malvern
Highland Creek ,Rouge Hill ,Port Union
Guildwood ,Morningside ,West Hill
Woburn
Cedarbrae
Scarborough Village
East Birchmount Park ,Ionview ,Kennedy Park
Clairlea ,Golden Mile ,Oakridge
Cliffcrest ,Cliffside ,Scarborough Village West
Birch Cliff ,Cliffside West
Dorset Park ,Scarborough Town Centre ,Wexford Heights
Maryvale ,Wexford
Agincourt
Clarks Corners ,Sullivan ,Tam O'Shanter
Agincourt North ,L'Amoreaux East ,Milliken ,Steeles East
L'Amoreaux West
Upper Rouge
Hillcrest Village
Fairview ,Henry Farm ,Oriole
Bayview Village
Silver Hills ,York Mills
Newtonbrook ,Willowdale
Willowdale South
York Mills West
Willowdale West
Parkwoods
Don Mills North
Flemingdon Park ,Don Mills South
Bathurst Manor ,Downsview North ,Wilson Heights
Northwood Park ,York University
CFB Toronto ,Downsview East
Downsview West
Downsview Central
Downsview Northwest
Victoria Village
Woodbine Gardens ,Parkview Hill
Woodbine Heights
The Beaches
Leaside
Thorncliffe Park
East Toronto
The Danforth West ,Riverdale
The Beaches West ,India Bazaar
Studio District
Lawrence Park
Davisville North
North Toronto West
Davisville
Moore Park ,Summerhill East
Deer Park ,Forest Hill SE ,Rathnelly ,South Hill ,Summerhill West
Rosedale
Cabbagetown ,St. James Town
Church and Wellesley
Harbourfront
Ryerson ,Garden District
St. James Town
Berczy Park
Central Bay Street
Adelaide ,King ,Richmond
Harbourfront East ,Toronto Islands ,Union Station
Design Exchange ,Toronto Dominion Centre
Commerce Court ,Victoria Hotel
Bedford Park ,Lawrence Manor East
Roselawn
Forest Hill North ,Forest Hill West
The Annex ,North Midtown ,Yorkville
Harbord ,University of Toronto
Chinatown ,Grange Park ,Kensington Market
CN Tower ,Bathurst Quay ,Island airport ,Harbourfront West ,King and Spadina ,Railway Lands ,South Niagara
Stn A PO Boxes 25 The Esplanade
First Canadian Place ,Underground city
Lawrence Heights ,Lawrence Manor
Glencairn
Humewood-Cedarvale
Caledonia-Fairbanks
Christie
Dovercourt Village ,Dufferin
Little Portugal ,Trinity
Brockton ,Exhibition Place ,Parkdale Village
Downsview ,North Park ,Upwood Park
Del Ray ,Keelesdale ,Mount Dennis ,Silverthorn
The Junction North ,Runnymede
High Park ,The Junction South
Parkdale ,Roncesvalles
Runnymede ,Swansea
Queen's Park
Canada Post Gateway Processing Centre
Business Reply Mail Processing Centre 969 Eastern
Humber Bay Shores ,Mimico South ,New Toronto
Alderwood ,Long Branch
The Kingsway ,Montgomery Road ,Old Mill North
Humber Bay ,King's Mill Park ,Kingsway Park South East ,Mimico NE ,Old Mill South ,The Queensway East ,Royal York South East ,Sunnylea
Kingsway Park South West ,Mimico NW ,The Queensway West ,Royal York South West ,South of Bloor
Islington Avenue
Cloverdale ,Islington ,Martin Grove ,Princess Gardens ,West Deane Park
Bloordale Gardens ,Eringate ,Markland Wood ,Old Burnhamthorpe
Humber Summit
Emery ,Humberlea
Weston
Westmount
Kingsview Village ,Martin Grove Gardens ,Richview Gardens ,St. Phillips
Albion Gardens ,Beaumond Heights ,Humbergate ,Jamestown ,Mount Olive ,Silverstone ,South Steeles ,Thistletown
Northwest
toronto_venues.head()
Neighborhood Neighborhood Latitude Neighborhood Longitude Venue Venue Latitude Venue Longitude Venue Category
0 Rouge ,Malvern 43.806686 -79.194353 Wendy's 43.807448 -79.199056 Fast Food Restaurant
1 Rouge ,Malvern 43.806686 -79.194353 Interprovincial Group 43.805630 -79.200378 Print Shop
2 Highland Creek ,Rouge Hill ,Port Union 43.784535 -79.160497 Royal Canadian Legion 43.782533 -79.163085 Bar
3 Guildwood ,Morningside ,West Hill 43.763573 -79.188711 G & G Electronics 43.765309 -79.191537 Electronics Store
4 Guildwood ,Morningside ,West Hill 43.763573 -79.188711 Marina Spa 43.766000 -79.191000 Spa
toronto_venues.shape
(2214, 7)

Let's check how many venues were returned for each neighborhood.

toronto_venues.groupby('Neighborhood').count()

Neighborhood Latitude Neighborhood Longitude Venue Venue Latitude Venue Longitude Venue Category
Neighborhood
Adelaide ,King ,Richmond 100 100 100 100 100 100
Agincourt 4 4 4 4 4 4
Agincourt North ,L'Amoreaux East ,Milliken ,Steeles East 3 3 3 3 3 3
Albion Gardens ,Beaumond Heights ,Humbergate ,Jamestown ,Mount Olive ,Silverstone ,South Steeles ,Thistletown 12 12 12 12 12 12
Alderwood ,Long Branch 10 10 10 10 10 10
Bathurst Manor ,Downsview North ,Wilson Heights 19 19 19 19 19 19
Bayview Village 4 4 4 4 4 4
Bedford Park ,Lawrence Manor East 25 25 25 25 25 25
Berczy Park 55 55 55 55 55 55
Birch Cliff ,Cliffside West 4 4 4 4 4 4
Bloordale Gardens ,Eringate ,Markland Wood ,Old Burnhamthorpe 8 8 8 8 8 8
Brockton ,Exhibition Place ,Parkdale Village 22 22 22 22 22 22
Business Reply Mail Processing Centre 969 Eastern 15 15 15 15 15 15
CFB Toronto ,Downsview East 2 2 2 2 2 2
CN Tower ,Bathurst Quay ,Island airport ,Harbourfront West ,King and Spadina ,Railway Lands ,South Niagara 17 17 17 17 17 17
Cabbagetown ,St. James Town 42 42 42 42 42 42
Caledonia-Fairbanks 4 4 4 4 4 4
Canada Post Gateway Processing Centre 12 12 12 12 12 12
Cedarbrae 8 8 8 8 8 8
Central Bay Street 79 79 79 79 79 79
Chinatown ,Grange Park ,Kensington Market 88 88 88 88 88 88
Christie 18 18 18 18 18 18
Church and Wellesley 86 86 86 86 86 86
Clairlea ,Golden Mile ,Oakridge 10 10 10 10 10 10
Clarks Corners ,Sullivan ,Tam O'Shanter 12 12 12 12 12 12
Cliffcrest ,Cliffside ,Scarborough Village West 4 4 4 4 4 4
Cloverdale ,Islington ,Martin Grove ,Princess Gardens ,West Deane Park 1 1 1 1 1 1
Commerce Court ,Victoria Hotel 100 100 100 100 100 100
Davisville 33 33 33 33 33 33
Davisville North 9 9 9 9 9 9
Deer Park ,Forest Hill SE ,Rathnelly ,South Hill ,Summerhill West 14 14 14 14 14 14
Del Ray ,Keelesdale ,Mount Dennis ,Silverthorn 4 4 4 4 4 4
Design Exchange ,Toronto Dominion Centre 100 100 100 100 100 100
Don Mills North 4 4 4 4 4 4
Dorset Park ,Scarborough Town Centre ,Wexford Heights 7 7 7 7 7 7
Dovercourt Village ,Dufferin 15 15 15 15 15 15
Downsview ,North Park ,Upwood Park 4 4 4 4 4 4
Downsview Central 4 4 4 4 4 4
Downsview Northwest 4 4 4 4 4 4
Downsview West 6 6 6 6 6 6
East Birchmount Park ,Ionview ,Kennedy Park 4 4 4 4 4 4
East Toronto 4 4 4 4 4 4
Emery ,Humberlea 3 3 3 3 3 3
Fairview ,Henry Farm ,Oriole 63 63 63 63 63 63
First Canadian Place ,Underground city 100 100 100 100 100 100
Flemingdon Park ,Don Mills South 22 22 22 22 22 22
Forest Hill North ,Forest Hill West 4 4 4 4 4 4
Glencairn 6 6 6 6 6 6
Guildwood ,Morningside ,West Hill 7 7 7 7 7 7
Harbord ,University of Toronto 35 35 35 35 35 35
Harbourfront 47 47 47 47 47 47
Harbourfront East ,Toronto Islands ,Union Station 100 100 100 100 100 100
High Park ,The Junction South 23 23 23 23 23 23
Highland Creek ,Rouge Hill ,Port Union 1 1 1 1 1 1
Hillcrest Village 4 4 4 4 4 4
Humber Bay ,King's Mill Park ,Kingsway Park South East ,Mimico NE ,Old Mill South ,The Queensway East ,Royal York South East ,Sunnylea 1 1 1 1 1 1
Humber Bay Shores ,Mimico South ,New Toronto 12 12 12 12 12 12
Humber Summit 1 1 1 1 1 1
Humewood-Cedarvale 3 3 3 3 3 3
Kingsview Village ,Martin Grove Gardens ,Richview Gardens ,St. Phillips 4 4 4 4 4 4
Kingsway Park South West ,Mimico NW ,The Queensway West ,Royal York South West ,South of Bloor 13 13 13 13 13 13
L'Amoreaux West 15 15 15 15 15 15
Lawrence Heights ,Lawrence Manor 13 13 13 13 13 13
Lawrence Park 3 3 3 3 3 3
Leaside 32 32 32 32 32 32
Little Portugal ,Trinity 55 55 55 55 55 55
Maryvale ,Wexford 4 4 4 4 4 4
Moore Park ,Summerhill East 3 3 3 3 3 3
Newtonbrook ,Willowdale 1 1 1 1 1 1
North Toronto West 20 20 20 20 20 20
Northwest 3 3 3 3 3 3
Northwood Park ,York University 6 6 6 6 6 6
Parkdale ,Roncesvalles 13 13 13 13 13 13
Parkwoods 3 3 3 3 3 3
Queen's Park 39 39 39 39 39 39
Rosedale 4 4 4 4 4 4
Roselawn 2 2 2 2 2 2
Rouge ,Malvern 2 2 2 2 2 2
Runnymede ,Swansea 38 38 38 38 38 38
Ryerson ,Garden District 100 100 100 100 100 100
Scarborough Village 2 2 2 2 2 2
Silver Hills ,York Mills 2 2 2 2 2 2
St. James Town 100 100 100 100 100 100
Stn A PO Boxes 25 The Esplanade 94 94 94 94 94 94
Studio District 41 41 41 41 41 41
The Annex ,North Midtown ,Yorkville 23 23 23 23 23 23
The Beaches 5 5 5 5 5 5
The Beaches West ,India Bazaar 19 19 19 19 19 19
The Danforth West ,Riverdale 41 41 41 41 41 41
The Junction North ,Runnymede 4 4 4 4 4 4
The Kingsway ,Montgomery Road ,Old Mill North 2 2 2 2 2 2
Thorncliffe Park 19 19 19 19 19 19
Victoria Village 4 4 4 4 4 4
Westmount 8 8 8 8 8 8
Weston 2 2 2 2 2 2
Willowdale South 34 34 34 34 34 34
Willowdale West 6 6 6 6 6 6
Woburn 4 4 4 4 4 4
Woodbine Gardens ,Parkview Hill 11 11 11 11 11 11
Woodbine Heights 8 8 8 8 8 8
York Mills West 4 4 4 4 4 4

Let's find out how many unique categories can be curated from all the returned venues.

toronto_onehot = pd.get_dummies(toronto_venues[['Venue Category']], prefix='', prefix_sep='')

# add neighborhood column back to the dataframe
toronto_onehot['Neighborhood'] = toronto_venues['Neighborhood']

# move neighborhood column to the first column
fixed_columns = [toronto_onehot.columns[-1]] + list(toronto_onehot.columns[:-1])
toronto_onehot = toronto_onehot[fixed_columns]

toronto_onehot.head()
Yoga Studio Accessories Store Afghan Restaurant Airport Airport Food Court Airport Gate Airport Lounge Airport Service Airport Terminal American Restaurant Antique Shop Aquarium Art Gallery Arts & Crafts Store Asian Restaurant Athletics & Sports Auto Workshop BBQ Joint Baby Store Bagel Shop Bakery Bank Bar Baseball Field Baseball Stadium Basketball Court Basketball Stadium Beach Bed & Breakfast Beer Bar Beer Store Belgian Restaurant Bike Shop Bistro Boat or Ferry Bookstore Boutique Brazilian Restaurant Breakfast Spot Brewery Bridal Shop Bubble Tea Shop Building Burger Joint Burrito Place Bus Line Bus Station Bus Stop Business Service Butcher Cafeteria Café Cajun / Creole Restaurant Camera Store Candy Store Caribbean Restaurant Cheese Shop Chinese Restaurant Chocolate Shop Church Climbing Gym Clothing Store Cocktail Bar Coffee Shop College Arts Building College Auditorium College Gym College Rec Center College Stadium Colombian Restaurant Comfort Food Restaurant Comic Shop Concert Hall Construction & Landscaping Convenience Store Cosmetics Shop Coworking Space Creperie Cuban Restaurant Cupcake Shop Curling Ice Dance Studio Deli / Bodega Department Store Dessert Shop Dim Sum Restaurant Diner Discount Store Distribution Center Dog Run Doner Restaurant Donut Shop Drugstore Dumpling Restaurant Eastern European Restaurant Electronics Store Empanada Restaurant Ethiopian Restaurant Event Space Fabric Shop Falafel Restaurant Farmers Market Fast Food Restaurant Field Filipino Restaurant Fish & Chips Shop Fish Market Flea Market Flower Shop Food Food & Drink Shop Food Court Food Truck Fountain French Restaurant Fried Chicken Joint Frozen Yogurt Shop Fruit & Vegetable Store Furniture / Home Store Gaming Cafe Garden Garden Center Gas Station Gastropub Gay Bar General Entertainment General Travel German Restaurant Gift Shop Gluten-free Restaurant Golf Course Gourmet Shop Greek Restaurant Grocery Store Gym Gym / Fitness Center Hakka Restaurant Harbor / Marina Hardware Store Health & Beauty Service Health Food Store Historic Site History Museum Hobby Shop Hockey Arena Home Service Hospital Hostel Hotel Hotel Bar Hotpot Restaurant IT Services Ice Cream Shop Indian Restaurant Indie Movie Theater Indonesian Restaurant Intersection Irish Pub Italian Restaurant Japanese Restaurant Jazz Club Jewelry Store Juice Bar Korean Restaurant Lake Latin American Restaurant Light Rail Station Lingerie Store Liquor Store Lounge Luggage Store Mac & Cheese Joint Market Massage Studio Medical Center Mediterranean Restaurant Men's Store Metro Station Mexican Restaurant Middle Eastern Restaurant Miscellaneous Shop Mobile Phone Shop Modern European Restaurant Molecular Gastronomy Restaurant Monument / Landmark Motel Movie Theater Museum Music Venue Neighborhood New American Restaurant Nightclub Noodle House Office Opera House Optical Shop Organic Grocery Other Great Outdoors Park Performing Arts Venue Pet Store Pharmacy Piano Bar Pizza Place Playground Plaza Poke Place Pool Portuguese Restaurant Poutine Place Print Shop Pub Ramen Restaurant Record Shop Recording Studio Rental Car Location Restaurant River Roof Deck Sake Bar Salad Place Salon / Barbershop Sandwich Place Scenic Lookout Sculpture Garden Seafood Restaurant Shoe Store Shopping Mall Shopping Plaza Skate Park Skating Rink Smoke Shop Snack Place Soccer Field Spa Speakeasy Sporting Goods Shop Sports Bar Stadium Stationery Store Steakhouse Strip Club Supermarket Supplement Shop Sushi Restaurant Swim School Tailor Shop Taiwanese Restaurant Tanning Salon Tea Room Tennis Court Thai Restaurant Theater Theme Restaurant Thrift / Vintage Store Toy / Game Store Trail Train Station Vegetarian / Vegan Restaurant Video Game Store Video Store Vietnamese Restaurant Warehouse Store Wine Bar Wine Shop Wings Joint Women's Store
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 Rouge ,Malvern 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 Rouge ,Malvern 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 Highland Creek ,Rouge Hill ,Port Union 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 Guildwood ,Morningside ,West Hill 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 Guildwood ,Morningside ,West Hill 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
toronto_onehot.shape
(2214, 267)

Let's group rows by neighborhood by taking the mean of the frequency of occurence of each category.

toronto_grouped = toronto_onehot.groupby('Neighborhood').mean().reset_index()
toronto_grouped

Neighborhood Yoga Studio Accessories Store Afghan Restaurant Airport Airport Food Court Airport Gate Airport Lounge Airport Service Airport Terminal American Restaurant Antique Shop Aquarium Art Gallery Arts & Crafts Store Asian Restaurant Athletics & Sports Auto Workshop BBQ Joint Baby Store Bagel Shop Bakery Bank Bar Baseball Field Baseball Stadium Basketball Court Basketball Stadium Beach Bed & Breakfast Beer Bar Beer Store Belgian Restaurant Bike Shop Bistro Boat or Ferry Bookstore Boutique Brazilian Restaurant Breakfast Spot Brewery Bridal Shop Bubble Tea Shop Building Burger Joint Burrito Place Bus Line Bus Station Bus Stop Business Service Butcher Cafeteria Café Cajun / Creole Restaurant Camera Store Candy Store Caribbean Restaurant Cheese Shop Chinese Restaurant Chocolate Shop Church Climbing Gym Clothing Store Cocktail Bar Coffee Shop College Arts Building College Auditorium College Gym College Rec Center College Stadium Colombian Restaurant Comfort Food Restaurant Comic Shop Concert Hall Construction & Landscaping Convenience Store Cosmetics Shop Coworking Space Creperie Cuban Restaurant Cupcake Shop Curling Ice Dance Studio Deli / Bodega Department Store Dessert Shop Dim Sum Restaurant Diner Discount Store Distribution Center Dog Run Doner Restaurant Donut Shop Drugstore Dumpling Restaurant Eastern European Restaurant Electronics Store Empanada Restaurant Ethiopian Restaurant Event Space Fabric Shop Falafel Restaurant Farmers Market Fast Food Restaurant Field Filipino Restaurant Fish & Chips Shop Fish Market Flea Market Flower Shop Food Food & Drink Shop Food Court Food Truck Fountain French Restaurant Fried Chicken Joint Frozen Yogurt Shop Fruit & Vegetable Store Furniture / Home Store Gaming Cafe Garden Garden Center Gas Station Gastropub Gay Bar General Entertainment General Travel German Restaurant Gift Shop Gluten-free Restaurant Golf Course Gourmet Shop Greek Restaurant Grocery Store Gym Gym / Fitness Center Hakka Restaurant Harbor / Marina Hardware Store Health & Beauty Service Health Food Store Historic Site History Museum Hobby Shop Hockey Arena Home Service Hospital Hostel Hotel Hotel Bar Hotpot Restaurant IT Services Ice Cream Shop Indian Restaurant Indie Movie Theater Indonesian Restaurant Intersection Irish Pub Italian Restaurant Japanese Restaurant Jazz Club Jewelry Store Juice Bar Korean Restaurant Lake Latin American Restaurant Light Rail Station Lingerie Store Liquor Store Lounge Luggage Store Mac & Cheese Joint Market Massage Studio Medical Center Mediterranean Restaurant Men's Store Metro Station Mexican Restaurant Middle Eastern Restaurant Miscellaneous Shop Mobile Phone Shop Modern European Restaurant Molecular Gastronomy Restaurant Monument / Landmark Motel Movie Theater Museum Music Venue New American Restaurant Nightclub Noodle House Office Opera House Optical Shop Organic Grocery Other Great Outdoors Park Performing Arts Venue Pet Store Pharmacy Piano Bar Pizza Place Playground Plaza Poke Place Pool Portuguese Restaurant Poutine Place Print Shop Pub Ramen Restaurant Record Shop Recording Studio Rental Car Location Restaurant River Roof Deck Sake Bar Salad Place Salon / Barbershop Sandwich Place Scenic Lookout Sculpture Garden Seafood Restaurant Shoe Store Shopping Mall Shopping Plaza Skate Park Skating Rink Smoke Shop Snack Place Soccer Field Spa Speakeasy Sporting Goods Shop Sports Bar Stadium Stationery Store Steakhouse Strip Club Supermarket Supplement Shop Sushi Restaurant Swim School Tailor Shop Taiwanese Restaurant Tanning Salon Tea Room Tennis Court Thai Restaurant Theater Theme Restaurant Thrift / Vintage Store Toy / Game Store Trail Train Station Vegetarian / Vegan Restaurant Video Game Store Video Store Vietnamese Restaurant Warehouse Store Wine Bar Wine Shop Wings Joint Women's Store
0 Adelaide ,King ,Richmond 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.020000 0.000000 0.00 0.000000 0.000000 0.020000 0.000000 0.000000 0.000000 0.000000 0.000000 0.020000 0.000000 0.030000 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.020000 0.000000 0.01 0.020000 0.000000 0.000000 0.000000 0.01 0.010000 0.010000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.040000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.010000 0.000000 0.070000 0.000000 0.000000 0.000000 0.00 0.00 0.01 0.000000 0.000000 0.020000 0.00 0.000000 0.020000 0.00000 0.000000 0.000000 0.000000 0.000 0.000000 0.010000 0.010000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.010000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.010000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.010000 0.000000 0.000000 0.000000 0.000000 0.020000 0.000000 0.000000 0.01 0.00 0.010000 0.01 0.00 0.000000 0.010000 0.000000 0.020000 0.010000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.020000 0.000000 0.000000 0.00 0.010000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.010000 0.010000 0.00000 0.010000 0.000000 0.00 0.010000 0.000000 0.01 0.000000 0.020000 0.000000 0.000000 0.00000 0.000000 0.000000 0.010000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.010000 0.000000 0.01 0.0 0.000000 0.000000 0.000000 0.010000 0.000000 0.010000 0.010000 0.01 0.000000 0.000000 0.00 0.010000 0.000000 0.000000 0.000000 0.0 0.020000 0.000000 0.010000 0.010000 0.000000 0.000000 0.000000 0.0 0.000000 0.010000 0.010000 0.000000 0.000000 0.050000 0.0 0.00 0.000000 0.010000 0.010000 0.010000 0.00 0.000000 0.020000 0.000000 0.000000 0.000 0.000000 0.000 0.010000 0.00000 0.0 0.000000 0.010000 0.000000 0.000000 0.000000 0.00000 0.030000 0.000000 0.000000 0.000000 0.030000 0.000000 0.000000 0.00000 0.00 0.000000 0.000000 0.040000 0.010000 0.000000 0.000000 0.000000 0.000000 0.00 0.020000 0.000000 0.000000 0.000000 0.000000 0.010000 0.000000 0.000000 0.010000
1 Agincourt 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.250000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.250000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.00 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.00 0.250000 0.000000 0.00 0.000000 0.250000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.00 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000 0.000000 0.000 0.000000 0.00000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
2 Agincourt North ,L'Amoreaux East ,Milliken ,St... 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.333333 0.000000 0.000000 0.000000 0.00 0.00 0.00 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.333333 0.000000 0.000000 0.000000 0.0 0.000000 0.333333 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.00 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000 0.000000 0.000 0.000000 0.00000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
3 Albion Gardens ,Beaumond Heights ,Humbergate ,... 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.083333 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.00 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.083333 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.083333 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.083333 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.00 0.00 0.000000 0.000000 0.166667 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.083333 0.000000 0.00000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.083333 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.083333 0.0 0.166667 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.00 0.000000 0.000000 0.000000 0.083333 0.00 0.000000 0.000000 0.000000 0.000000 0.000 0.000000 0.000 0.000000 0.00000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
4 Alderwood ,Long Branch 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.100000 0.000000 0.000000 0.000000 0.00 0.00 0.00 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000 0.100000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.100000 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.100000 0.0 0.200000 0.000000 0.000000 0.000000 0.100000 0.000000 0.000000 0.0 0.100000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.00 0.000000 0.000000 0.000000 0.100000 0.00 0.000000 0.000000 0.000000 0.000000 0.000 0.000000 0.100 0.000000 0.00000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
5 Bathurst Manor ,Downsview North ,Wilson Heights 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.052632 0.000000 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.052632 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.105263 0.000000 0.000000 0.000000 0.00 0.00 0.00 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000 0.000000 0.052632 0.000000 0.000000 0.000000 0.052632 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.052632 0.052632 0.00000 0.000000 0.000000 0.000000 0.000000 0.052632 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.052632 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.052632 0.000000 0.000000 0.000000 0.000000 0.00 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.052632 0.0 0.052632 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.052632 0.0 0.00 0.000000 0.000000 0.000000 0.052632 0.00 0.000000 0.000000 0.000000 0.052632 0.000 0.000000 0.000 0.000000 0.00000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.052632 0.000000 0.052632 0.000000 0.000000 0.00000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.052632 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
6 Bayview Village 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.250000 0.000000 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.250000 0.000000 0.00 0.000000 0.000000 0.000000 0.250000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.00 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.250000 0.000000 0.00000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.00 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000 0.000000 0.000 0.000000 0.00000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
7 Bedford Park ,Lawrence Manor East 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.040000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.040000 0.0 0.040000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.080000 0.000000 0.000000 0.000000 0.00 0.00 0.00 0.040000 0.000000 0.000000 0.00 0.000000 0.000000 0.00000 0.000000 0.000000 0.040000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.040000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.00 0.00 0.000000 0.040000 0.040000 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.040000 0.000000 0.000000 0.000000 0.000000 0.080000 0.000000 0.000000 0.00000 0.040000 0.000000 0.00 0.000000 0.000000 0.00 0.040000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.040000 0.0 0.040000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.040000 0.000000 0.000000 0.000000 0.000000 0.080000 0.0 0.00 0.000000 0.000000 0.000000 0.080000 0.00 0.000000 0.000000 0.000000 0.000000 0.000 0.000000 0.000 0.000000 0.00000 0.0 0.040000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.040000 0.000000 0.000000 0.00000 0.00 0.000000 0.000000 0.040000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
8 Berczy Park 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.018182 0.000000 0.000000 0.000000 0.000000 0.018182 0.000000 0.018182 0.036364 0.000000 0.000000 0.000000 0.00 0.00 0.018182 0.018182 0.000000 0.036364 0.000000 0.000000 0.000000 0.018182 0.000000 0.000000 0.000000 0.00 0.018182 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.018182 0.0 0.036364 0.000000 0.00 0.000000 0.000000 0.036364 0.000000 0.000000 0.000000 0.000000 0.000000 0.054545 0.090909 0.000000 0.000000 0.000000 0.00 0.00 0.00 0.018182 0.000000 0.018182 0.00 0.000000 0.000000 0.00000 0.018182 0.000000 0.000000 0.000 0.000000 0.000000 0.018182 0.000000 0.000000 0.018182 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.018182 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.036364 0.000000 0.000000 0.000000 0.000000 0.018182 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.018182 0.018182 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.00 0.00 0.018182 0.018182 0.000000 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.018182 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.018182 0.000000 0.018182 0.018182 0.00000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.018182 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.0 0.000000 0.018182 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.018182 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.018182 0.000000 0.000000 0.000000 0.000000 0.036364 0.0 0.00 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.036364 0.000000 0.018182 0.000 0.000000 0.000 0.000000 0.00000 0.0 0.000000 0.000000 0.018182 0.000000 0.000000 0.00000 0.018182 0.000000 0.000000 0.000000 0.000000 0.000000 0.018182 0.00000 0.00 0.000000 0.000000 0.018182 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.018182 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
9 Birch Cliff ,Cliffside West 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.250000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.25 0.00 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.250000 0.00 0.00 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.00 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000 0.000000 0.250 0.000000 0.00000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
10 Bloordale Gardens ,Eringate ,Markland Wood ,Ol... 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.125000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.125000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.125000 0.000000 0.000000 0.000000 0.00 0.00 0.00 0.000000 0.000000 0.000000 0.00 0.125000 0.125000 0.00000 0.000000 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.125000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.0 0.125000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.00 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.125 0.000000 0.000 0.000000 0.00000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
11 Brockton ,Exhibition Place ,Parkdale Village 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.045455 0.000000 0.045455 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.090909 0.000000 0.000000 0.000000 0.00 0.000000 0.045455 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.136364 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.045455 0.000000 0.000000 0.090909 0.000000 0.000000 0.000000 0.00 0.00 0.00 0.000000 0.000000 0.000000 0.00 0.045455 0.000000 0.00000 0.000000 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.045455 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.00 0.00 0.000000 0.000000 0.045455 0.045455 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.045455 0.000000 0.045455 0.045455 0.000000 0.00000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.000000 0.045455 0.045455 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.045455 0.0 0.00 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000 0.000000 0.000 0.000000 0.00000 0.0 0.000000 0.000000 0.000000 0.000000 0.045455 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
12 Business Reply Mail Processing Centre 969 Eastern 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.066667 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.066667 0.000000 0.000000 0.00 0.000000 0.066667 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.00 0.000000 0.066667 0.000000 0.00 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.066667 0.066667 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.066667 0.066667 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.066667 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.00 0.000000 0.066667 0.00 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.066667 0.000000 0.000000 0.000000 0.0 0.066667 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.066667 0.000000 0.066667 0.0 0.00 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000 0.066667 0.000 0.000000 0.00000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
13 CFB Toronto ,Downsview East 0.000000 0.000000 0.000000 0.500000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.00 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.500000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.00 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000 0.000000 0.000 0.000000 0.00000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
14 CN Tower ,Bathurst Quay ,Island airport ,Harbo... 0.000000 0.000000 0.000000 0.058824 0.058824 0.058824 0.117647 0.176471 0.117647 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.058824 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.058824 0.000000 0.058824 0.00 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.058824 0.000000 0.000000 0.000000 0.00 0.00 0.00 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000 0.058824 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.058824 0.000000 0.0 0.00 0.000000 0.000000 0.000000 0.000000 0.00 0.058824 0.000000 0.000000 0.000000 0.000 0.000000 0.000 0.000000 0.00000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
15 Cabbagetown ,St. James Town 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.047619 0.023810 0.000000 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.023810 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.023810 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.023810 0.0 0.047619 0.000000 0.00 0.000000 0.023810 0.000000 0.023810 0.000000 0.000000 0.000000 0.000000 0.000000 0.071429 0.000000 0.000000 0.000000 0.00 0.00 0.00 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000 0.000000 0.023810 0.000000 0.000000 0.000000 0.023810 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.023810 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.023810 0.000000 0.023810 0.00 0.00 0.023810 0.00 0.00 0.000000 0.000000 0.023810 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.023810 0.000000 0.000000 0.000000 0.000000 0.047619 0.023810 0.000000 0.02381 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.023810 0.000000 0.000000 0.000000 0.02381 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.023810 0.000000 0.023810 0.023810 0.0 0.047619 0.023810 0.023810 0.000000 0.000000 0.000000 0.000000 0.0 0.047619 0.000000 0.000000 0.000000 0.000000 0.047619 0.0 0.00 0.000000 0.000000 0.000000 0.023810 0.00 0.000000 0.000000 0.000000 0.000000 0.000 0.000000 0.000 0.000000 0.02381 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.02381 0.00 0.000000 0.000000 0.023810 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
16 Caledonia-Fairbanks 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.00 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.25000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.500000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.00 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000 0.000000 0.000 0.000000 0.00000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.250000
17 Canada Post Gateway Processing Centre 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.083333 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.083333 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.166667 0.000000 0.000000 0.000000 0.00 0.00 0.00 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.083333 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.083333 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.166667 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.166667 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.083333 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.00 0.000000 0.000000 0.000000 0.083333 0.00 0.000000 0.000000 0.000000 0.000000 0.000 0.000000 0.000 0.000000 0.00000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
18 Cedarbrae 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.125000 0.000000 0.000000 0.000000 0.000000 0.125000 0.125000 0.000000 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.00 0.000000 0.125000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.00 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.125000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.125000 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.125 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.00 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000 0.000000 0.000 0.000000 0.00000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.00 0.000000 0.000000 0.125000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
19 Central Bay Street 0.012658 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.012658 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.012658 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.012658 0.000000 0.00 0.000000 0.000000 0.000000 0.025316 0.00 0.037975 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.037975 0.000000 0.00 0.000000 0.000000 0.000000 0.037975 0.000000 0.000000 0.000000 0.000000 0.000000 0.164557 0.000000 0.000000 0.000000 0.00 0.00 0.00 0.000000 0.012658 0.000000 0.00 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000 0.000000 0.000000 0.025316 0.012658 0.000000 0.012658 0.012658 0.000000 0.000000 0.000000 0.012658 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.012658 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.012658 0.012658 0.000000 0.00000 0.012658 0.000000 0.000000 0.000000 0.000000 0.012658 0.000000 0.000000 0.00 0.00 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.012658 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.012658 0.000000 0.000000 0.00 0.037975 0.012658 0.000000 0.000000 0.000000 0.000000 0.050633 0.037975 0.000000 0.00000 0.037975 0.012658 0.00 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.012658 0.012658 0.000000 0.012658 0.000000 0.00 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.012658 0.00 0.000000 0.000000 0.00 0.012658 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.012658 0.000000 0.012658 0.000000 0.0 0.000000 0.012658 0.000000 0.000000 0.000000 0.012658 0.0 0.00 0.000000 0.025316 0.000000 0.037975 0.00 0.000000 0.012658 0.000000 0.000000 0.000 0.000000 0.000 0.000000 0.00000 0.0 0.012658 0.000000 0.000000 0.000000 0.000000 0.00000 0.012658 0.000000 0.000000 0.000000 0.012658 0.000000 0.000000 0.00000 0.00 0.000000 0.000000 0.025316 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.012658 0.000000 0.000000 0.000000 0.000000 0.012658 0.000000 0.000000 0.000000
20 Chinatown ,Grange Park ,Kensington Market 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.011364 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.045455 0.000000 0.068182 0.000000 0.00 0.00 0.000000 0.000000 0.011364 0.011364 0.000000 0.011364 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.011364 0.011364 0.000000 0.011364 0.00 0.022727 0.011364 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.056818 0.000000 0.00 0.000000 0.011364 0.011364 0.045455 0.000000 0.000000 0.000000 0.000000 0.022727 0.045455 0.000000 0.000000 0.000000 0.00 0.00 0.00 0.022727 0.000000 0.000000 0.00 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.022727 0.011364 0.000000 0.000000 0.000000 0.000000 0.011364 0.011364 0.000000 0.034091 0.000000 0.000000 0.011364 0.000000 0.000000 0.000000 0.000000 0.022727 0.000000 0.000000 0.011364 0.000000 0.011364 0.000000 0.000000 0.000000 0.000000 0.011364 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.011364 0.011364 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.00 0.00 0.011364 0.000000 0.022727 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.011364 0.000000 0.000000 0.011364 0.011364 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.011364 0.000000 0.00000 0.011364 0.000000 0.00 0.000000 0.000000 0.00 0.011364 0.000000 0.000000 0.000000 0.00000 0.011364 0.000000 0.000000 0.000000 0.0 0.034091 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.011364 0.000000 0.00 0.000000 0.011364 0.00 0.022727 0.000000 0.000000 0.011364 0.0 0.022727 0.000000 0.000000 0.000000 0.000000 0.000000 0.011364 0.0 0.000000 0.011364 0.011364 0.000000 0.000000 0.000000 0.0 0.00 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000 0.000000 0.000 0.000000 0.00000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.00 0.011364 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.034091 0.000000 0.000000 0.056818 0.000000 0.011364 0.000000 0.000000 0.000000
21 Christie 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.055556 0.000000 0.000000 0.055556 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.166667 0.000000 0.00 0.055556 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.055556 0.000000 0.000000 0.000000 0.00 0.00 0.00 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.055556 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.055556 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.00 0.00 0.000000 0.000000 0.222222 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.055556 0.000000 0.000000 0.00000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.0 0.000000 0.000000 0.000000 0.000000 0.055556 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.111111 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.055556 0.0 0.00 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000 0.000000 0.000 0.000000 0.00000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
22 Church and Wellesley 0.011628 0.000000 0.011628 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.011628 0.000000 0.00 0.000000 0.011628 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.011628 0.000000 0.000000 0.000000 0.000000 0.000000 0.011628 0.000000 0.00 0.011628 0.000000 0.000000 0.023256 0.00 0.023256 0.011628 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.023256 0.000000 0.00 0.000000 0.011628 0.000000 0.011628 0.000000 0.000000 0.000000 0.011628 0.000000 0.081395 0.000000 0.000000 0.000000 0.00 0.00 0.00 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00000 0.011628 0.000000 0.000000 0.000 0.023256 0.000000 0.000000 0.011628 0.000000 0.011628 0.000000 0.011628 0.011628 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.011628 0.000000 0.000000 0.000000 0.000000 0.023256 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.011628 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.023256 0.034884 0.011628 0.00 0.00 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.011628 0.000000 0.000 0.000000 0.000000 0.011628 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.023256 0.000000 0.000000 0.00 0.011628 0.011628 0.000000 0.000000 0.000000 0.000000 0.011628 0.069767 0.000000 0.00000 0.011628 0.000000 0.00 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.023256 0.023256 0.0 0.011628 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.0 0.000000 0.000000 0.000000 0.000000 0.011628 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.011628 0.000000 0.000000 0.000000 0.0 0.011628 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.023256 0.011628 0.000000 0.000000 0.000000 0.034884 0.0 0.00 0.011628 0.000000 0.011628 0.000000 0.00 0.011628 0.011628 0.000000 0.000000 0.000 0.000000 0.000 0.011628 0.00000 0.0 0.000000 0.000000 0.000000 0.011628 0.000000 0.00000 0.011628 0.011628 0.000000 0.000000 0.034884 0.000000 0.000000 0.00000 0.00 0.000000 0.000000 0.011628 0.011628 0.011628 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.011628 0.000000 0.000000 0.011628 0.011628 0.000000
23 Clairlea ,Golden Mile ,Oakridge 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.200000 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.200000 0.100000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.00 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.100000 0.000000 0.000000 0.000000 0.100000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.1 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.100000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.00 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000 0.000000 0.000 0.000000 0.00000 0.1 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
24 Clarks Corners ,Sullivan ,Tam O'Shanter 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.083333 0.000000 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.083333 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.00 0.000000 0.000000 0.000000 0.00 0.083333 0.000000 0.00000 0.000000 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.083333 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.083333 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.083333 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.083333 0.000000 0.000000 0.00000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.083333 0.000000 0.00 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.083333 0.0 0.166667 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.00 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000 0.000000 0.000 0.000000 0.00000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.00 0.000000 0.000000 0.083333 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
25 Cliffcrest ,Cliffside ,Scarborough Village West 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.250000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.00 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.5 0.250000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.00 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000 0.000000 0.000 0.000000 0.00000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
26 Cloverdale ,Islington ,Martin Grove ,Princess ... 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.00 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.00 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000 0.000000 0.000 0.000000 0.00000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
27 Commerce Court ,Victoria Hotel 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.040000 0.000000 0.00 0.010000 0.000000 0.010000 0.000000 0.000000 0.000000 0.000000 0.000000 0.020000 0.000000 0.020000 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.020000 0.000000 0.000000 0.000000 0.000000 0.000000 0.010000 0.000000 0.00 0.010000 0.000000 0.000000 0.000000 0.01 0.010000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.070000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.010000 0.100000 0.000000 0.000000 0.000000 0.00 0.00 0.00 0.000000 0.000000 0.010000 0.00 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000 0.000000 0.030000 0.010000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.010000 0.010000 0.010000 0.010000 0.010000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.030000 0.000000 0.000000 0.01 0.00 0.010000 0.01 0.00 0.000000 0.010000 0.000000 0.040000 0.010000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.060000 0.000000 0.000000 0.00 0.010000 0.000000 0.000000 0.000000 0.000000 0.010000 0.030000 0.030000 0.000000 0.00000 0.000000 0.000000 0.00 0.010000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.01 0.0 0.000000 0.010000 0.000000 0.010000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.010000 0.000000 0.000000 0.000000 0.0 0.010000 0.000000 0.000000 0.010000 0.000000 0.000000 0.000000 0.0 0.010000 0.000000 0.000000 0.000000 0.000000 0.070000 0.0 0.00 0.000000 0.010000 0.000000 0.010000 0.00 0.000000 0.030000 0.000000 0.010000 0.000 0.000000 0.000 0.000000 0.00000 0.0 0.000000 0.000000 0.010000 0.000000 0.000000 0.00000 0.010000 0.000000 0.000000 0.000000 0.000000 0.000000 0.010000 0.00000 0.00 0.010000 0.000000 0.020000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.020000 0.000000 0.000000 0.000000 0.000000 0.010000 0.000000 0.000000 0.000000
28 Davisville 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.030303 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.060606 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.060606 0.000000 0.000000 0.000000 0.00 0.00 0.00 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.090909 0.000000 0.030303 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.030303 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.030303 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.00 0.00 0.030303 0.030303 0.000000 0.060606 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.030303 0.000000 0.000000 0.000000 0.000000 0.060606 0.030303 0.000000 0.00000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.030303 0.000000 0.000000 0.030303 0.0 0.090909 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.030303 0.0 0.00 0.000000 0.000000 0.000000 0.090909 0.00 0.000000 0.030303 0.000000 0.000000 0.000 0.000000 0.000 0.000000 0.00000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.060606 0.000000 0.000000 0.00000 0.00 0.000000 0.000000 0.030303 0.000000 0.000000 0.000000 0.030303 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
29 Davisville North 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.111111 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.00 0.000000 0.000000 0.000000 0.00 0.111111 0.000000 0.00000 0.000000 0.000000 0.000000 0.000 0.111111 0.000000 0.111111 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.111111 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.111111 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.111111 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.111111 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.00 0.000000 0.000000 0.000000 0.111111 0.00 0.000000 0.000000 0.000000 0.000000 0.000 0.000000 0.000 0.000000 0.00000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
30 Deer Park ,Forest Hill SE ,Rathnelly ,South Hi... 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.071429 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.142857 0.000000 0.000000 0.000000 0.00 0.00 0.00 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.071429 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.00 0.000000 0.071429 0.00 0.071429 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.0 0.071429 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.142857 0.000000 0.000000 0.000000 0.000000 0.071429 0.0 0.00 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000 0.000000 0.000 0.000000 0.00000 0.0 0.000000 0.000000 0.000000 0.071429 0.000000 0.00000 0.000000 0.000000 0.071429 0.000000 0.071429 0.000000 0.000000 0.00000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.071429 0.000000 0.000000 0.000000 0.000000 0.000000
31 Del Ray ,Keelesdale ,Mount Dennis ,Silverthorn 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.00 0.000000 0.000000 0.000000 0.00 0.250000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.250000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.250000 0.0 0.00 0.000000 0.000000 0.000000 0.250000 0.00 0.000000 0.000000 0.000000 0.000000 0.000 0.000000 0.000 0.000000 0.00000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
32 Design Exchange ,Toronto Dominion Centre 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.030000 0.000000 0.00 0.010000 0.000000 0.010000 0.000000 0.000000 0.000000 0.000000 0.000000 0.020000 0.000000 0.030000 0.000000 0.00 0.00 0.010000 0.000000 0.000000 0.020000 0.000000 0.000000 0.000000 0.000000 0.000000 0.010000 0.000000 0.00 0.010000 0.000000 0.000000 0.000000 0.00 0.010000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.080000 0.000000 0.00 0.000000 0.000000 0.000000 0.010000 0.000000 0.000000 0.000000 0.000000 0.000000 0.130000 0.000000 0.000000 0.000000 0.00 0.00 0.00 0.000000 0.000000 0.010000 0.00 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000 0.000000 0.020000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.010000 0.000000 0.000000 0.010000 0.010000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.030000 0.000000 0.000000 0.01 0.00 0.010000 0.00 0.00 0.000000 0.010000 0.000000 0.010000 0.010000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.050000 0.000000 0.000000 0.00 0.010000 0.000000 0.000000 0.000000 0.000000 0.000000 0.040000 0.030000 0.000000 0.00000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.000000 0.020000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.0 0.010000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.0 0.000000 0.010000 0.000000 0.010000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.0 0.020000 0.000000 0.010000 0.000000 0.000000 0.000000 0.000000 0.0 0.010000 0.000000 0.000000 0.000000 0.000000 0.060000 0.0 0.00 0.000000 0.020000 0.000000 0.010000 0.00 0.000000 0.030000 0.000000 0.010000 0.000 0.000000 0.000 0.000000 0.00000 0.0 0.010000 0.010000 0.010000 0.000000 0.000000 0.00000 0.020000 0.000000 0.000000 0.000000 0.010000 0.000000 0.010000 0.00000 0.00 0.020000 0.000000 0.000000 0.010000 0.000000 0.000000 0.000000 0.000000 0.01 0.010000 0.000000 0.000000 0.000000 0.000000 0.010000 0.000000 0.000000 0.000000
33 Don Mills North 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.250000 0.000000 0.00 0.000000 0.250000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.00 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.250000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.250000 0.000000 0.00000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.00 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000 0.000000 0.000 0.000000 0.00000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
34 Dorset Park ,Scarborough Town Centre ,Wexford ... 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.142857 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.142857 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.00 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.285714 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.00 0.000000 0.142857 0.00 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.000000 0.000000 0.142857 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.00 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000 0.000000 0.000 0.000000 0.00000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.142857 0.000000 0.000000 0.000000 0.000000 0.000000
35 Dovercourt Village ,Dufferin 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.133333 0.066667 0.066667 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.066667 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.066667 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.00 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.00 0.00 0.000000 0.000000 0.066667 0.000000 0.066667 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.066667 0.000000 0.000000 0.000000 0.000000 0.00 0.0 0.000000 0.000000 0.066667 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.066667 0.000000 0.000000 0.133333 0.0 0.000000 0.000000 0.000000 0.000000 0.066667 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.00 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000 0.000000 0.000 0.000000 0.00000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.066667 0.000000 0.000000 0.000000 0.000000 0.00000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
36 Downsview ,North Park ,Upwood Park 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.250000 0.000000 0.000000 0.000000 0.00 0.25 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.00 0.000000 0.000000 0.000000 0.25 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.250000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.00 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000 0.000000 0.000 0.000000 0.00000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
37 Downsview Central 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.250000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.250000 0.000000 0.0 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.00 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.250000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.250000 0.00 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.00 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000 0.000000 0.000 0.000000 0.00000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
38 Downsview Northwest 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.250000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.00 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.00 0.00 0.000000 0.000000 0.250000 0.000000 0.250000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.250000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.00 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000 0.000000 0.000 0.000000 0.00000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
39 Downsview West 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.166667 0.000000 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.00 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.00 0.00 0.000000 0.000000 0.333333 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.166667 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.166667 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.00 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.166667 0.000 0.000000 0.000 0.000000 0.00000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
40 East Birchmount Park ,Ionview ,Kennedy Park 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.250000 0.000000 0.000000 0.000000 0.00 0.00 0.00 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000 0.000000 0.000000 0.250000 0.000000 0.000000 0.000000 0.250000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.25 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.00 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000 0.000000 0.000 0.000000 0.00000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
41 East Toronto 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.250000 0.000000 0.000000 0.000000 0.00 0.00 0.00 0.000000 0.000000 0.000000 0.00 0.250000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.500000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.00 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000 0.000000 0.000 0.000000 0.00000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
42 Emery ,Humberlea 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.333333 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.00 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.333333 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.333333 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.00 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000 0.000000 0.000 0.000000 0.00000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
43 Fairview ,Henry Farm ,Oriole 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.015873 0.000000 0.00 0.000000 0.000000 0.015873 0.000000 0.000000 0.000000 0.000000 0.000000 0.031746 0.015873 0.015873 0.015873 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.015873 0.00 0.000000 0.000000 0.000000 0.000000 0.00 0.015873 0.015873 0.000000 0.015873 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.015873 0.000000 0.000000 0.142857 0.000000 0.079365 0.000000 0.000000 0.000000 0.00 0.00 0.00 0.000000 0.000000 0.000000 0.00 0.000000 0.031746 0.00000 0.000000 0.000000 0.000000 0.000 0.000000 0.015873 0.015873 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.015873 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.063492 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.015873 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.015873 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.047619 0.000000 0.00000 0.031746 0.000000 0.00 0.000000 0.000000 0.00 0.015873 0.000000 0.015873 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.015873 0.000000 0.000000 0.00 0.0 0.015873 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.015873 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.015873 0.000000 0.015873 0.015873 0.0 0.00 0.000000 0.000000 0.015873 0.000000 0.00 0.000000 0.000000 0.000000 0.015873 0.000 0.000000 0.000 0.000000 0.00000 0.0 0.015873 0.000000 0.015873 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.015873 0.000000 0.000000 0.000000 0.00000 0.00 0.031746 0.000000 0.015873 0.015873 0.000000 0.000000 0.015873 0.000000 0.00 0.000000 0.015873 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.031746
44 First Canadian Place ,Underground city 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.030000 0.000000 0.00 0.010000 0.000000 0.030000 0.000000 0.000000 0.000000 0.000000 0.000000 0.020000 0.000000 0.020000 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.020000 0.000000 0.000000 0.000000 0.000000 0.000000 0.010000 0.000000 0.01 0.000000 0.000000 0.000000 0.000000 0.01 0.010000 0.010000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.070000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.120000 0.000000 0.000000 0.000000 0.00 0.00 0.01 0.000000 0.000000 0.020000 0.00 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000 0.000000 0.020000 0.010000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.010000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.010000 0.000000 0.000000 0.000000 0.010000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.030000 0.000000 0.000000 0.01 0.00 0.010000 0.01 0.00 0.000000 0.010000 0.000000 0.030000 0.010000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.030000 0.000000 0.000000 0.00 0.010000 0.000000 0.000000 0.000000 0.000000 0.000000 0.010000 0.030000 0.000000 0.00000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.000000 0.010000 0.000000 0.000000 0.00000 0.000000 0.000000 0.010000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.01 0.0 0.000000 0.010000 0.000000 0.010000 0.000000 0.010000 0.000000 0.01 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.0 0.020000 0.000000 0.010000 0.000000 0.000000 0.000000 0.000000 0.0 0.010000 0.000000 0.000000 0.000000 0.000000 0.060000 0.0 0.00 0.000000 0.010000 0.000000 0.010000 0.00 0.000000 0.030000 0.000000 0.000000 0.000 0.000000 0.000 0.000000 0.00000 0.0 0.000000 0.010000 0.000000 0.000000 0.000000 0.00000 0.030000 0.000000 0.000000 0.000000 0.010000 0.000000 0.000000 0.00000 0.00 0.020000 0.000000 0.020000 0.010000 0.000000 0.000000 0.000000 0.000000 0.01 0.010000 0.000000 0.000000 0.000000 0.000000 0.010000 0.000000 0.000000 0.000000
45 Flemingdon Park ,Don Mills South 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.090909 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.090909 0.000000 0.045455 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.045455 0.000000 0.00 0.000000 0.000000 0.000000 0.045455 0.000000 0.000000 0.000000 0.045455 0.000000 0.090909 0.000000 0.000000 0.000000 0.00 0.00 0.00 0.000000 0.000000 0.045455 0.00 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.045455 0.000000 0.045455 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.090909 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.045455 0.045455 0.000000 0.00000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.090909 0.0 0.00 0.000000 0.000000 0.000000 0.045455 0.00 0.000000 0.000000 0.000000 0.000000 0.000 0.000000 0.000 0.000000 0.00000 0.0 0.000000 0.000000 0.045455 0.000000 0.000000 0.00000 0.000000 0.000000 0.045455 0.000000 0.000000 0.000000 0.000000 0.00000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
46 Forest Hill North ,Forest Hill West 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.00 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.25000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.250000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.00 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000 0.000000 0.000 0.000000 0.00000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.250000 0.000000 0.000000 0.00000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.250000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
47 Glencairn 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.00 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.166667 0.000000 0.00000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.166667 0.000000 0.000000 0.000000 0.0 0.333333 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.166667 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.00 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000 0.000000 0.000 0.000000 0.00000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.166667 0.000000 0.000000 0.00000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
48 Guildwood ,Morningside ,West Hill 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.142857 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.00 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.142857 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.142857 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.142857 0.000000 0.000000 0.0 0.142857 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.142857 0.000000 0.0 0.00 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000 0.000000 0.000 0.000000 0.00000 0.0 0.142857 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
49 Harbord ,University of Toronto 0.028571 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.057143 0.000000 0.057143 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.028571 0.028571 0.000000 0.000000 0.000000 0.000000 0.057143 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.142857 0.000000 0.00 0.000000 0.000000 0.000000 0.028571 0.000000 0.000000 0.000000 0.000000 0.000000 0.028571 0.028571 0.000000 0.028571 0.00 0.00 0.00 0.028571 0.000000 0.000000 0.00 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.028571 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.028571 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.028571 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.057143 0.057143 0.000000 0.00000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.0 0.000000 0.000000 0.000000 0.000000 0.028571 0.028571 0.000000 0.00 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.028571 0.000000 0.000000 0.000000 0.000000 0.057143 0.0 0.00 0.000000 0.000000 0.000000 0.028571 0.00 0.000000 0.000000 0.000000 0.000000 0.000 0.000000 0.000 0.000000 0.00000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.028571 0.000000 0.000000 0.00000 0.00 0.000000 0.000000 0.000000 0.028571 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.028571 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
50 Harbourfront 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.021277 0.00 0.021277 0.000000 0.021277 0.000000 0.000000 0.000000 0.000000 0.000000 0.063830 0.021277 0.000000 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.021277 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.042553 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.063830 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.021277 0.000000 0.000000 0.000000 0.000000 0.148936 0.000000 0.000000 0.000000 0.00 0.00 0.00 0.000000 0.000000 0.000000 0.00 0.000000 0.021277 0.00000 0.000000 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.021277 0.000000 0.000000 0.000000 0.021277 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.021277 0.000000 0.000000 0.021277 0.000000 0.000000 0.021277 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.021277 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.021277 0.021277 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.021277 0.000000 0.000000 0.00 0.021277 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.0 0.042553 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.063830 0.021277 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.063830 0.000000 0.000000 0.000000 0.000000 0.042553 0.0 0.00 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.021277 0.000000 0.000 0.000000 0.000 0.000000 0.00000 0.0 0.021277 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.00 0.000000 0.000000 0.000000 0.042553 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
51 Harbourfront East ,Toronto Islands ,Union Station 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.05 0.010000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.020000 0.000000 0.020000 0.000000 0.02 0.00 0.010000 0.000000 0.000000 0.010000 0.000000 0.000000 0.000000 0.010000 0.000000 0.000000 0.000000 0.00 0.000000 0.030000 0.000000 0.010000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.040000 0.000000 0.00 0.000000 0.000000 0.000000 0.010000 0.000000 0.000000 0.000000 0.000000 0.000000 0.120000 0.000000 0.000000 0.000000 0.00 0.00 0.00 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000 0.010000 0.010000 0.010000 0.010000 0.000000 0.000000 0.010000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.010000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.030000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.020000 0.00 0.000000 0.000000 0.000000 0.000000 0.040000 0.010000 0.000000 0.01 0.010000 0.010000 0.000000 0.000000 0.000000 0.000000 0.040000 0.010000 0.000000 0.00000 0.010000 0.000000 0.01 0.000000 0.000000 0.00 0.000000 0.010000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.0 0.010000 0.000000 0.000000 0.000000 0.000000 0.000000 0.01 0.0 0.000000 0.000000 0.020000 0.010000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.020000 0.010000 0.000000 0.000000 0.0 0.020000 0.000000 0.020000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.030000 0.0 0.01 0.000000 0.010000 0.000000 0.010000 0.03 0.000000 0.010000 0.000000 0.000000 0.000 0.000000 0.010 0.000000 0.00000 0.0 0.000000 0.000000 0.030000 0.020000 0.000000 0.00000 0.010000 0.000000 0.010000 0.000000 0.010000 0.000000 0.000000 0.00000 0.00 0.010000 0.000000 0.000000 0.010000 0.000000 0.000000 0.000000 0.000000 0.01 0.010000 0.000000 0.000000 0.000000 0.000000 0.010000 0.000000 0.000000 0.000000
52 High Park ,The Junction South 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.043478 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.043478 0.000000 0.086957 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.043478 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.086957 0.043478 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.00 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.043478 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.043478 0.000000 0.000000 0.000000 0.000000 0.043478 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.043478 0.000000 0.00000 0.043478 0.000000 0.000000 0.000000 0.000000 0.043478 0.000000 0.000000 0.00 0.00 0.000000 0.00 0.00 0.000000 0.000000 0.043478 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.043478 0.000000 0.000000 0.00000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.0 0.086957 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.0 0.000000 0.000000 0.043478 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.043478 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.00 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000 0.000000 0.000 0.000000 0.00000 0.0 0.000000 0.043478 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.00 0.000000 0.000000 0.086957 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
53 Highland Creek ,Rouge Hill ,Port Union 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.00 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.00 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000 0.000000 0.000 0.000000 0.00000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
54 Hillcrest Village 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.00 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.250000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.00 0.25 0.000000 0.000000 0.000000 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.250000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.250000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.00 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000 0.000000 0.000 0.000000 0.00000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
55 Humber Bay ,King's Mill Park ,Kingsway Park So... 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 1.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.00 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.00 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000 0.000000 0.000 0.000000 0.00000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
56 Humber Bay Shores ,Mimico South ,New Toronto 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.083333 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.083333 0.000000 0.0 0.166667 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.083333 0.000000 0.000000 0.000000 0.00 0.00 0.00 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.083333 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.083333 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.083333 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.083333 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.083333 0.0 0.083333 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.083333 0.0 0.00 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000 0.000000 0.000 0.000000 0.00000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
57 Humber Summit 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.00 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.0 1.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.00 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000 0.000000 0.000 0.000000 0.00000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
58 Humewood-Cedarvale 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.00 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.333333 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.333333 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.00 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000 0.000000 0.000 0.000000 0.00000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.333333 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
59 Kingsview Village ,Martin Grove Gardens ,Richv... 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.250000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.00 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.250000 0.000000 0.000000 0.00 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.0 0.250000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.00 0.000000 0.000000 0.000000 0.250000 0.00 0.000000 0.000000 0.000000 0.000000 0.000 0.000000 0.000 0.000000 0.00000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
60 Kingsway Park South West ,Mimico NW ,The Queen... 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.076923 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.00 0.076923 0.076923 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.00 0.000000 0.000000 0.000000 0.00 0.076923 0.000000 0.00000 0.000000 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.076923 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.076923 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.00 0.00 0.000000 0.000000 0.076923 0.076923 0.000000 0.000 0.000000 0.076923 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.00 0.000000 0.000000 0.000000 0.076923 0.00 0.000000 0.000000 0.000000 0.000000 0.000 0.000000 0.000 0.000000 0.00000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.076923 0.000000 0.000000 0.000000 0.00000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.076923 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.076923 0.000000
61 L'Amoreaux West 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.066667 0.000000 0.000000 0.066667 0.00 0.066667 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.133333 0.000000 0.000000 0.000000 0.000000 0.000000 0.066667 0.000000 0.000000 0.000000 0.00 0.00 0.00 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.066667 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.200000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.00 0.00 0.000000 0.000000 0.066667 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.066667 0.0 0.066667 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.00 0.000000 0.000000 0.000000 0.066667 0.00 0.000000 0.000000 0.000000 0.000000 0.000 0.000000 0.000 0.000000 0.00000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.066667 0.000000 0.000000 0.000000 0.000000 0.00000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
62 Lawrence Heights ,Lawrence Manor 0.000000 0.076923 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.076923 0.00 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.153846 0.000000 0.076923 0.000000 0.000000 0.000000 0.00 0.00 0.00 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.076923 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.153846 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.076923 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.076923 0.000000 0.000000 0.000000 0.00 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.00 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000 0.000000 0.000 0.000000 0.00000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.076923 0.000000 0.000000 0.000000 0.000000 0.153846
63 Lawrence Park 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.333333 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.00 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.333333 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.00 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000 0.000000 0.000 0.000000 0.00000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.333333 0.000000 0.00000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
64 Leaside 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.031250 0.000000 0.031250 0.000000 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.031250 0.000000 0.031250 0.000000 0.000000 0.000000 0.000000 0.00 0.031250 0.031250 0.000000 0.000000 0.00 0.062500 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.093750 0.000000 0.000000 0.000000 0.00 0.00 0.00 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000 0.000000 0.000000 0.031250 0.031250 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.031250 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.031250 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.062500 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.00 0.00 0.000000 0.000000 0.031250 0.031250 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.031250 0.000000 0.00 0.000000 0.000000 0.00 0.031250 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.0 0.031250 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.000000 0.000000 0.031250 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.031250 0.0 0.00 0.000000 0.000000 0.000000 0.031250 0.00 0.000000 0.000000 0.000000 0.031250 0.000 0.000000 0.000 0.000000 0.00000 0.0 0.000000 0.000000 0.093750 0.031250 0.000000 0.00000 0.000000 0.000000 0.031250 0.000000 0.031250 0.000000 0.000000 0.00000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
65 Little Portugal ,Trinity 0.018182 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.018182 0.000000 0.054545 0.000000 0.000000 0.000000 0.000000 0.000000 0.036364 0.000000 0.127273 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.018182 0.000000 0.000000 0.018182 0.000000 0.000000 0.000000 0.00 0.000000 0.018182 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.036364 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.018182 0.072727 0.000000 0.000000 0.000000 0.00 0.00 0.00 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00000 0.000000 0.018182 0.018182 0.000 0.000000 0.018182 0.000000 0.000000 0.000000 0.018182 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.018182 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.018182 0.00 0.00 0.000000 0.018182 0.000000 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.018182 0.000000 0.000000 0.000000 0.000000 0.000000 0.018182 0.000000 0.000000 0.00000 0.018182 0.018182 0.00 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.018182 0.00000 0.000000 0.000000 0.000000 0.036364 0.0 0.000000 0.000000 0.018182 0.000000 0.000000 0.000000 0.00 0.0 0.000000 0.000000 0.018182 0.018182 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.018182 0.000000 0.000000 0.000000 0.0 0.036364 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.018182 0.000000 0.000000 0.054545 0.0 0.00 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000 0.000000 0.000 0.000000 0.00000 0.0 0.000000 0.000000 0.000000 0.018182 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.00 0.000000 0.000000 0.000000 0.018182 0.000000 0.000000 0.000000 0.000000 0.00 0.018182 0.000000 0.000000 0.036364 0.000000 0.036364 0.000000 0.000000 0.000000
66 Maryvale ,Wexford 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.250000 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.250000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.00 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.250000 0.000000 0.000000 0.000000 0.000000 0.00 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.00 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000 0.000000 0.000 0.250000 0.00000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
67 Moore Park ,Summerhill East 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.00 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.333333 0.000000 0.000000 0.000000 0.0 0.000000 0.333333 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.00 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000 0.000000 0.000 0.000000 0.00000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.00 0.000000 0.333333 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
68 Newtonbrook ,Willowdale 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.00 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 1.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.00 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000 0.000000 0.000 0.000000 0.00000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
69 North Toronto West 0.050000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.050000 0.000000 0.00 0.000000 0.000000 0.000000 0.050000 0.000000 0.000000 0.000000 0.150000 0.000000 0.100000 0.000000 0.000000 0.000000 0.00 0.00 0.00 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.050000 0.000000 0.050000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.050000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.050000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.0 0.050000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.050000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.050000 0.050000 0.0 0.00 0.000000 0.000000 0.050000 0.000000 0.00 0.000000 0.050000 0.000000 0.000000 0.000 0.000000 0.000 0.000000 0.00000 0.0 0.050000 0.000000 0.050000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
70 Northwest 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.333333 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.00 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.333333 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.333333 0.000000 0.0 0.00 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000 0.000000 0.000 0.000000 0.00000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
71 Northwood Park ,York University 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.166667 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.00 0.000000 0.166667 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.166667 0.000000 0.000000 0.000000 0.00 0.00 0.00 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.166667 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.00000 0.166667 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.166667 0.000000 0.000000 0.000000 0.00 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.00 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000 0.000000 0.000 0.000000 0.00000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
72 Parkdale ,Roncesvalles 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.076923 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.076923 0.000000 0.00 0.076923 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.076923 0.000000 0.000000 0.000000 0.00 0.00 0.00 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00000 0.000000 0.076923 0.000000 0.000 0.000000 0.000000 0.000000 0.076923 0.000000 0.000000 0.000000 0.000000 0.076923 0.000000 0.000000 0.000000 0.000000 0.076923 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.153846 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.076923 0.000000 0.000000 0.00000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.0 0.076923 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.076923 0.0 0.00 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000 0.000000 0.000 0.000000 0.00000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
73 Parkwoods 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.333333 0.000000 0.000000 0.0 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.00 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.333333 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.333333 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.00 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000 0.000000 0.000 0.000000 0.00000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
74 Queen's Park 0.025641 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.025641 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.025641 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.025641 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.00 0.025641 0.025641 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.025641 0.000000 0.00 0.000000 0.000000 0.000000 0.025641 0.000000 0.000000 0.000000 0.000000 0.000000 0.230769 0.000000 0.025641 0.000000 0.00 0.00 0.00 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00000 0.025641 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.025641 0.025641 0.025641 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.025641 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.025641 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.025641 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.025641 0.025641 0.000000 0.00000 0.025641 0.000000 0.00 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.0 0.025641 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.0 0.000000 0.000000 0.000000 0.000000 0.025641 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.051282 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.025641 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.00 0.000000 0.000000 0.000000 0.025641 0.00 0.000000 0.025641 0.000000 0.000000 0.000 0.000000 0.000 0.000000 0.00000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.025641 0.000000 0.000000 0.00000 0.00 0.000000 0.000000 0.000000 0.025641 0.000000 0.000000 0.000000 0.000000 0.00 0.025641 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.025641 0.000000
75 Rosedale 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.00 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.500000 0.000000 0.000000 0.000000 0.0 0.000000 0.250000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.00 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000 0.000000 0.000 0.000000 0.00000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.250000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
76 Roselawn 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.00 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.500000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.500000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.00 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000 0.000000 0.000 0.000000 0.00000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
77 Rouge ,Malvern 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.00 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.500000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.5 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.00 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000 0.000000 0.000 0.000000 0.00000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
78 Runnymede ,Swansea 0.026316 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.026316 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.026316 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.026316 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.078947 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.078947 0.000000 0.000000 0.000000 0.00 0.00 0.00 0.000000 0.000000 0.000000 0.00 0.000000 0.026316 0.00000 0.000000 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.026316 0.000000 0.026316 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.026316 0.000000 0.000000 0.000000 0.000000 0.026316 0.000000 0.000000 0.000000 0.026316 0.000000 0.000000 0.000000 0.000000 0.026316 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.026316 0.000000 0.000000 0.00 0.00 0.000000 0.00 0.00 0.026316 0.000000 0.026316 0.026316 0.000000 0.000 0.000000 0.000000 0.000000 0.026316 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.026316 0.000000 0.000000 0.000000 0.052632 0.000000 0.000000 0.00000 0.026316 0.000000 0.00 0.026316 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.0 0.052632 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.026316 0.000000 0.000000 0.000000 0.000000 0.026316 0.0 0.00 0.000000 0.000000 0.000000 0.026316 0.00 0.000000 0.000000 0.000000 0.000000 0.000 0.000000 0.000 0.000000 0.00000 0.0 0.026316 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.052632 0.000000 0.000000 0.00000 0.00 0.026316 0.026316 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.026316 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
79 Ryerson ,Garden District 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.010000 0.000000 0.00 0.010000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.010000 0.010000 0.010000 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.010000 0.000000 0.000000 0.000000 0.000000 0.000000 0.020000 0.000000 0.00 0.000000 0.000000 0.000000 0.020000 0.00 0.020000 0.010000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.030000 0.000000 0.00 0.000000 0.000000 0.000000 0.010000 0.000000 0.000000 0.000000 0.080000 0.000000 0.100000 0.000000 0.000000 0.000000 0.01 0.00 0.00 0.000000 0.010000 0.000000 0.00 0.000000 0.020000 0.00000 0.000000 0.000000 0.000000 0.000 0.000000 0.000000 0.010000 0.010000 0.000000 0.020000 0.000000 0.010000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.020000 0.000000 0.010000 0.000000 0.000000 0.000000 0.000000 0.010000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.010000 0.000000 0.000000 0.000000 0.000000 0.010000 0.000000 0.000000 0.00 0.00 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.010000 0.010000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.010000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.020000 0.030000 0.000000 0.00000 0.010000 0.000000 0.01 0.000000 0.000000 0.02 0.000000 0.010000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.0 0.010000 0.030000 0.010000 0.000000 0.010000 0.000000 0.00 0.0 0.010000 0.000000 0.010000 0.000000 0.000000 0.000000 0.010000 0.00 0.000000 0.000000 0.01 0.000000 0.000000 0.000000 0.000000 0.0 0.020000 0.000000 0.020000 0.000000 0.000000 0.000000 0.010000 0.0 0.010000 0.020000 0.000000 0.000000 0.000000 0.020000 0.0 0.00 0.000000 0.000000 0.000000 0.010000 0.00 0.000000 0.010000 0.010000 0.010000 0.000 0.000000 0.000 0.000000 0.00000 0.0 0.010000 0.000000 0.010000 0.000000 0.000000 0.00000 0.010000 0.000000 0.000000 0.000000 0.010000 0.000000 0.000000 0.00000 0.01 0.010000 0.000000 0.010000 0.020000 0.000000 0.000000 0.010000 0.000000 0.00 0.000000 0.010000 0.000000 0.010000 0.000000 0.010000 0.000000 0.000000 0.000000
80 Scarborough Village 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.00 0.000000 0.000000 0.000000 0.00 0.500000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.500000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.00 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000 0.000000 0.000 0.000000 0.00000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
81 Silver Hills ,York Mills 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.5 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.00 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.500000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.00 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000 0.000000 0.000 0.000000 0.00000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
82 St. James Town 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.020000 0.000000 0.00 0.010000 0.000000 0.000000 0.000000 0.000000 0.020000 0.000000 0.010000 0.030000 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.030000 0.000000 0.000000 0.000000 0.000000 0.000000 0.010000 0.000000 0.00 0.030000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.010000 0.0 0.060000 0.000000 0.01 0.000000 0.000000 0.010000 0.000000 0.000000 0.010000 0.000000 0.030000 0.020000 0.070000 0.000000 0.000000 0.000000 0.00 0.00 0.00 0.010000 0.000000 0.000000 0.00 0.000000 0.030000 0.00000 0.020000 0.000000 0.000000 0.000 0.000000 0.000000 0.010000 0.000000 0.000000 0.020000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.020000 0.000000 0.000000 0.000000 0.000000 0.010000 0.000000 0.000000 0.000000 0.010000 0.000000 0.010000 0.010000 0.010000 0.000000 0.000000 0.00000 0.010000 0.000000 0.000000 0.000000 0.000000 0.020000 0.000000 0.000000 0.00 0.01 0.000000 0.00 0.00 0.000000 0.000000 0.010000 0.020000 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.010000 0.040000 0.000000 0.000000 0.00 0.010000 0.000000 0.000000 0.000000 0.000000 0.000000 0.040000 0.020000 0.000000 0.00000 0.000000 0.000000 0.00 0.010000 0.000000 0.02 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.010000 0.000000 0.000000 0.000000 0.000000 0.00 0.0 0.010000 0.000000 0.000000 0.010000 0.000000 0.000000 0.010000 0.00 0.000000 0.000000 0.00 0.020000 0.010000 0.000000 0.010000 0.0 0.000000 0.000000 0.000000 0.010000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.050000 0.0 0.00 0.000000 0.000000 0.010000 0.000000 0.00 0.000000 0.020000 0.000000 0.000000 0.000 0.000000 0.000 0.000000 0.00000 0.0 0.000000 0.010000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.010000 0.00000 0.00 0.000000 0.000000 0.020000 0.010000 0.000000 0.000000 0.000000 0.000000 0.00 0.010000 0.000000 0.000000 0.000000 0.000000 0.010000 0.000000 0.000000 0.000000
83 Stn A PO Boxes 25 The Esplanade 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.010638 0.010638 0.00 0.021277 0.000000 0.000000 0.000000 0.000000 0.010638 0.000000 0.010638 0.021277 0.000000 0.000000 0.000000 0.00 0.00 0.010638 0.000000 0.000000 0.031915 0.000000 0.000000 0.000000 0.010638 0.000000 0.010638 0.000000 0.00 0.021277 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.010638 0.0 0.042553 0.000000 0.00 0.000000 0.000000 0.021277 0.000000 0.000000 0.010638 0.000000 0.000000 0.031915 0.117021 0.000000 0.000000 0.000000 0.00 0.00 0.00 0.010638 0.000000 0.010638 0.00 0.000000 0.010638 0.00000 0.021277 0.000000 0.000000 0.000 0.000000 0.010638 0.010638 0.000000 0.000000 0.010638 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.010638 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.021277 0.000000 0.000000 0.000000 0.000000 0.010638 0.000000 0.000000 0.000000 0.000000 0.000000 0.010638 0.010638 0.010638 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.010638 0.000000 0.000000 0.00 0.00 0.000000 0.00 0.00 0.010638 0.000000 0.000000 0.021277 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.010638 0.031915 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.010638 0.021277 0.031915 0.010638 0.00000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.010638 0.021277 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.010638 0.00 0.0 0.010638 0.010638 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.010638 0.000000 0.00 0.021277 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.010638 0.000000 0.000000 0.000000 0.0 0.021277 0.000000 0.000000 0.000000 0.000000 0.042553 0.0 0.00 0.000000 0.000000 0.000000 0.010638 0.00 0.000000 0.031915 0.000000 0.010638 0.000 0.000000 0.000 0.000000 0.00000 0.0 0.000000 0.000000 0.010638 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.010638 0.00000 0.00 0.010638 0.000000 0.010638 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.010638 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
84 Studio District 0.024390 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.048780 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.048780 0.024390 0.024390 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.024390 0.000000 0.00 0.000000 0.048780 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.097561 0.000000 0.00 0.000000 0.000000 0.024390 0.000000 0.000000 0.000000 0.000000 0.024390 0.000000 0.073171 0.000000 0.000000 0.000000 0.00 0.00 0.00 0.024390 0.000000 0.000000 0.00 0.024390 0.000000 0.02439 0.000000 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.024390 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.024390 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.024390 0.024390 0.000000 0.00 0.00 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.024390 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.024390 0.000000 0.000000 0.000000 0.000000 0.000000 0.048780 0.000000 0.000000 0.00000 0.000000 0.000000 0.00 0.024390 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.024390 0.000000 0.000000 0.000000 0.000000 0.00 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.024390 0.000000 0.024390 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.00 0.000000 0.000000 0.000000 0.024390 0.00 0.000000 0.024390 0.000000 0.000000 0.000 0.000000 0.000 0.000000 0.00000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.02439 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.00 0.000000 0.000000 0.024390 0.000000 0.000000 0.024390 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.024390 0.000000 0.000000 0.000000
85 The Annex ,North Midtown ,Yorkville 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.043478 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.043478 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.00 0.043478 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.130435 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.086957 0.000000 0.000000 0.000000 0.00 0.00 0.00 0.000000 0.000000 0.000000 0.00 0.000000 0.043478 0.00000 0.000000 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.043478 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.043478 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.043478 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.043478 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.043478 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.043478 0.000000 0.000000 0.000000 0.000000 0.00 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.043478 0.000000 0.000000 0.043478 0.0 0.043478 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.043478 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.00 0.000000 0.000000 0.000000 0.130435 0.00 0.000000 0.000000 0.000000 0.000000 0.000 0.000000 0.000 0.000000 0.00000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.043478 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
86 The Beaches 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.200000 0.000000 0.000000 0.000000 0.00 0.00 0.00 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.200000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.200000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.00 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000 0.000000 0.000 0.000000 0.00000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.200000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
87 The Beaches West ,India Bazaar 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.052632 0.000000 0.000000 0.00 0.000000 0.052632 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.00 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.052632 0.000000 0.000000 0.052632 0.000000 0.000000 0.000000 0.000000 0.052632 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.052632 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.052632 0.000000 0.000000 0.000000 0.000000 0.000000 0.052632 0.000000 0.000000 0.00000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.052632 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.0 0.052632 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.105263 0.000000 0.052632 0.000000 0.0 0.052632 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.052632 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.00 0.000000 0.000000 0.000000 0.105263 0.00 0.000000 0.000000 0.000000 0.000000 0.000 0.000000 0.000 0.000000 0.00000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.052632 0.000000 0.000000 0.000000 0.052632 0.000000 0.000000 0.00000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
88 The Danforth West ,Riverdale 0.024390 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.024390 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.024390 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.024390 0.000000 0.00 0.000000 0.024390 0.000000 0.024390 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.024390 0.000000 0.00 0.000000 0.024390 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.097561 0.000000 0.000000 0.000000 0.00 0.00 0.00 0.000000 0.000000 0.000000 0.00 0.000000 0.024390 0.00000 0.000000 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.024390 0.000000 0.024390 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.024390 0.02439 0.048780 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.00 0.00 0.000000 0.195122 0.024390 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.048780 0.000000 0.000000 0.000000 0.000000 0.000000 0.073171 0.000000 0.000000 0.00000 0.024390 0.000000 0.00 0.000000 0.000000 0.00 0.024390 0.024390 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.0 0.024390 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.024390 0.000000 0.000000 0.000000 0.000000 0.024390 0.0 0.00 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000 0.000000 0.000 0.000000 0.00000 0.0 0.024390 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.024390 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
89 The Junction North ,Runnymede 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.250000 0.000000 0.000000 0.00 0.000000 0.000000 0.250000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.00 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.00 0.00 0.000000 0.000000 0.250000 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.0 0.250000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.00 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000 0.000000 0.000 0.000000 0.00000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
90 The Kingsway ,Montgomery Road ,Old Mill North 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.00 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.500000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.5 0.00 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000 0.000000 0.000 0.000000 0.00000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
91 Thorncliffe Park 0.052632 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.052632 0.000000 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.00 0.052632 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.052632 0.000000 0.000000 0.000000 0.00 0.00 0.00 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.052632 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.052632 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.00 0.00 0.000000 0.000000 0.052632 0.052632 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.105263 0.000000 0.000000 0.052632 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.052632 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.052632 0.000000 0.000000 0.052632 0.0 0.052632 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.052632 0.0 0.00 0.000000 0.000000 0.000000 0.052632 0.00 0.000000 0.000000 0.000000 0.000000 0.000 0.000000 0.000 0.000000 0.00000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.052632 0.000000 0.000000 0.000000 0.000000 0.00000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.052632 0.000000 0.000000 0.000000 0.000000
92 Victoria Village 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.250000 0.000000 0.000000 0.000000 0.00 0.00 0.00 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.250000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.250000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.250000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.00 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000 0.000000 0.000 0.000000 0.00000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
93 Westmount 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.125000 0.000000 0.000000 0.000000 0.000000 0.000000 0.125000 0.000000 0.000000 0.000000 0.00 0.00 0.00 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.125000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.125000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.125000 0.000000 0.000000 0.000000 0.000000 0.00 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.0 0.250000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.00 0.000000 0.000000 0.000000 0.125000 0.00 0.000000 0.000000 0.000000 0.000000 0.000 0.000000 0.000 0.000000 0.00000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
94 Weston 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.00 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 1.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.00 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000 0.000000 0.000 0.000000 0.00000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
95 Willowdale South 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.029412 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.029412 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.058824 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.058824 0.000000 0.000000 0.000000 0.00 0.00 0.00 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.029412 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.029412 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.029412 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.00 0.00 0.000000 0.000000 0.029412 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.029412 0.000000 0.000000 0.00 0.029412 0.000000 0.000000 0.029412 0.000000 0.000000 0.000000 0.029412 0.000000 0.00000 0.029412 0.000000 0.00 0.000000 0.000000 0.00 0.000000 0.029412 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.029412 0.000000 0.000000 0.000000 0.000000 0.00 0.0 0.029412 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.000000 0.000000 0.029412 0.000000 0.0 0.058824 0.000000 0.029412 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.088235 0.000000 0.000000 0.000000 0.029412 0.0 0.00 0.000000 0.000000 0.000000 0.058824 0.00 0.000000 0.000000 0.000000 0.058824 0.000 0.000000 0.000 0.000000 0.00000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.029412 0.000000 0.000000 0.000000 0.058824 0.000000 0.000000 0.00000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.029412 0.000000 0.000000 0.000000 0.000000 0.000000
96 Willowdale West 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.166667 0.000000 0.000000 0.000000 0.00 0.00 0.00 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.166667 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.00 0.00 0.000000 0.000000 0.166667 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.166667 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.166667 0.0 0.166667 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.00 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000 0.000000 0.000 0.000000 0.00000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
97 Woburn 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.500000 0.000000 0.000000 0.000000 0.00 0.00 0.00 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.250000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.250000 0.00 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.00 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000 0.000000 0.000 0.000000 0.00000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
98 Woodbine Gardens ,Parkview Hill 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.090909 0.000000 0.000000 0.000000 0.000000 0.000000 0.090909 0.000000 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.090909 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.00 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.090909 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.090909 0.000000 0.000000 0.00 0.00 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.090909 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.090909 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.000000 0.000000 0.090909 0.090909 0.0 0.181818 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.00 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000 0.000000 0.000 0.000000 0.00000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
99 Woodbine Heights 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.125000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.125000 0.000000 0.000000 0.0 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.00 0.000000 0.000000 0.000000 0.00 0.000000 0.125000 0.00000 0.000000 0.000000 0.000000 0.125 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.125000 0.000000 0.000000 0.125000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.00 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000 0.000000 0.125 0.000000 0.00000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.125000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
100 York Mills West 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.250000 0.000000 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.00 0.000000 0.000000 0.000000 0.00 0.250000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.00 0.000000 0.00 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.00 0.500000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 0.00 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000 0.000000 0.000 0.000000 0.00000 0.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.00 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
toronto_grouped.shape
(101, 267)

Let's print the top 5 most common venues for each neighborhood.

num_top_venues = 5

for hood in toronto_grouped['Neighborhood']:
    print("----"+hood+"----")
    temp = toronto_grouped[toronto_grouped['Neighborhood'] == hood].T.reset_index()
    temp.columns = ['venue','freq']
    temp = temp.iloc[1:]
    temp['freq'] = temp['freq'].astype(float)
    temp = temp.round({'freq': 2})
    print(temp.sort_values('freq', ascending=False).reset_index(drop=True).head(num_top_venues))
    print('\n')

----Adelaide ,King ,Richmond----
              venue  freq
0       Coffee Shop  0.07
1        Restaurant  0.05
2              Café  0.04
3   Thai Restaurant  0.04
4  Sushi Restaurant  0.03


----Agincourt----
                       venue  freq
0                     Lounge  0.25
1  Latin American Restaurant  0.25
2             Breakfast Spot  0.25
3             Clothing Store  0.25
4              Metro Station  0.00


----Agincourt North ,L'Amoreaux East ,Milliken ,Steeles East----
         venue  freq
0         Park  0.33
1   Playground  0.33
2  Coffee Shop  0.33
3  Yoga Studio  0.00
4  Men's Store  0.00


----Albion Gardens ,Beaumond Heights ,Humbergate ,Jamestown ,Mount Olive ,Silverstone ,South Steeles ,Thistletown----
                 venue  freq
0        Grocery Store  0.17
1          Pizza Place  0.17
2           Beer Store  0.08
3  Fried Chicken Joint  0.08
4  Japanese Restaurant  0.08


----Alderwood ,Long Branch----
            venue  freq
0     Pizza Place   0.2
1        Pharmacy   0.1
2     Coffee Shop   0.1
3  Sandwich Place   0.1
4    Dance Studio   0.1


----Bathurst Manor ,Downsview North ,Wilson Heights----
                 venue  freq
0          Coffee Shop  0.11
1          Bridal Shop  0.05
2  Fried Chicken Joint  0.05
3     Sushi Restaurant  0.05
4   Frozen Yogurt Shop  0.05


----Bayview Village----
                 venue  freq
0                 Café  0.25
1                 Bank  0.25
2   Chinese Restaurant  0.25
3  Japanese Restaurant  0.25
4  Monument / Landmark  0.00


----Bedford Park ,Lawrence Manor East----
                venue  freq
0      Sandwich Place  0.08
1  Italian Restaurant  0.08
2          Restaurant  0.08
3         Coffee Shop  0.08
4       Grocery Store  0.04


----Berczy Park----
          venue  freq
0   Coffee Shop  0.09
1  Cocktail Bar  0.05
2   Cheese Shop  0.04
3      Beer Bar  0.04
4        Bakery  0.04


----Birch Cliff ,Cliffside West----
                   venue  freq
0        College Stadium  0.25
1           Skating Rink  0.25
2                   Café  0.25
3  General Entertainment  0.25
4     Mac & Cheese Joint  0.00


----Bloordale Gardens ,Eringate ,Markland Wood ,Old Burnhamthorpe----
            venue  freq
0     Pizza Place  0.12
1  Cosmetics Shop  0.12
2      Beer Store  0.12
3     Coffee Shop  0.12
4  Shopping Plaza  0.12


----Brockton ,Exhibition Place ,Parkdale Village----
            venue  freq
0            Café  0.14
1     Coffee Shop  0.09
2  Breakfast Spot  0.09
3   Grocery Store  0.05
4    Intersection  0.05


----Business Reply Mail Processing Centre 969 Eastern----
                  venue  freq
0  Fast Food Restaurant  0.07
1         Auto Workshop  0.07
2           Pizza Place  0.07
3      Recording Studio  0.07
4            Restaurant  0.07


----CFB Toronto ,Downsview East----
                      venue  freq
0                   Airport   0.5
1                      Park   0.5
2               Yoga Studio   0.0
3  Mediterranean Restaurant   0.0
4         Mobile Phone Shop   0.0


----CN Tower ,Bathurst Quay ,Island airport ,Harbourfront West ,King and Spadina ,Railway Lands ,South Niagara----
              venue  freq
0   Airport Service  0.18
1    Airport Lounge  0.12
2  Airport Terminal  0.12
3   Harbor / Marina  0.06
4     Boat or Ferry  0.06


----Cabbagetown ,St. James Town----
                venue  freq
0         Coffee Shop  0.07
1  Italian Restaurant  0.05
2         Pizza Place  0.05
3              Bakery  0.05
4                 Pub  0.05


----Caledonia-Fairbanks----
                      venue  freq
0                      Park  0.50
1             Women's Store  0.25
2                    Market  0.25
3  Mediterranean Restaurant  0.00
4        Miscellaneous Shop  0.00


----Canada Post Gateway Processing Centre----
            venue  freq
0     Coffee Shop  0.17
1    Intersection  0.17
2           Hotel  0.17
3             Gym  0.08
4  Sandwich Place  0.08


----Cedarbrae----
                  venue  freq
0  Caribbean Restaurant  0.12
1           Gas Station  0.12
2                Bakery  0.12
3       Thai Restaurant  0.12
4   Fried Chicken Joint  0.12


----Central Bay Street----
                 venue  freq
0          Coffee Shop  0.16
1   Italian Restaurant  0.05
2         Burger Joint  0.04
3            Juice Bar  0.04
4  Japanese Restaurant  0.04


----Chinatown ,Grange Park ,Kensington Market----
                   venue  freq
0                    Bar  0.07
1                   Café  0.06
2  Vietnamese Restaurant  0.06
3     Chinese Restaurant  0.05
4            Coffee Shop  0.05


----Christie----
                venue  freq
0       Grocery Store  0.22
1                Café  0.17
2                Park  0.11
3           Nightclub  0.06
4  Italian Restaurant  0.06


----Church and Wellesley----
                 venue  freq
0          Coffee Shop  0.08
1  Japanese Restaurant  0.07
2           Restaurant  0.03
3     Sushi Restaurant  0.03
4              Gay Bar  0.03


----Clairlea ,Golden Mile ,Oakridge----
            venue  freq
0          Bakery   0.2
1        Bus Line   0.2
2  Ice Cream Shop   0.1
3    Intersection   0.1
4     Bus Station   0.1


----Clarks Corners ,Sullivan ,Tam O'Shanter----
                venue  freq
0         Pizza Place  0.17
1            Pharmacy  0.08
2        Noodle House  0.08
3  Italian Restaurant  0.08
4     Thai Restaurant  0.08


----Cliffcrest ,Cliffside ,Scarborough Village West----
                        venue  freq
0                       Motel  0.50
1         American Restaurant  0.25
2               Movie Theater  0.25
3  Modern European Restaurant  0.00
4          Miscellaneous Shop  0.00


----Cloverdale ,Islington ,Martin Grove ,Princess Gardens ,West Deane Park----
                venue  freq
0        Home Service   1.0
1         Yoga Studio   0.0
2         Men's Store   0.0
3   Mobile Phone Shop   0.0
4  Miscellaneous Shop   0.0


----Commerce Court ,Victoria Hotel----
                 venue  freq
0          Coffee Shop  0.10
1           Restaurant  0.07
2                 Café  0.07
3                Hotel  0.06
4  American Restaurant  0.04


----Davisville----
            venue  freq
0    Dessert Shop  0.09
1  Sandwich Place  0.09
2     Pizza Place  0.09
3             Gym  0.06
4            Café  0.06


----Davisville North----
               venue  freq
0               Park  0.11
1  Food & Drink Shop  0.11
2                Gym  0.11
3     Breakfast Spot  0.11
4  Convenience Store  0.11


----Deer Park ,Forest Hill SE ,Rathnelly ,South Hill ,Summerhill West----
                 venue  freq
0          Coffee Shop  0.14
1                  Pub  0.14
2           Restaurant  0.07
3   Light Rail Station  0.07
4  Fried Chicken Joint  0.07


----Del Ray ,Keelesdale ,Mount Dennis ,Silverthorn----
               venue  freq
0         Restaurant  0.25
1     Discount Store  0.25
2     Sandwich Place  0.25
3  Convenience Store  0.25
4        Men's Store  0.00


----Design Exchange ,Toronto Dominion Centre----
                venue  freq
0         Coffee Shop  0.13
1                Café  0.08
2          Restaurant  0.06
3               Hotel  0.05
4  Italian Restaurant  0.04


----Don Mills North----
                  venue  freq
0  Gym / Fitness Center  0.25
1  Caribbean Restaurant  0.25
2   Japanese Restaurant  0.25
3                  Café  0.25
4  Other Great Outdoors  0.00


----Dorset Park ,Scarborough Town Centre ,Wexford Heights----
                venue  freq
0   Indian Restaurant  0.29
1  Chinese Restaurant  0.14
2           Pet Store  0.14
3  Light Rail Station  0.14
4             Brewery  0.14


----Dovercourt Village ,Dufferin----
                       venue  freq
0                     Bakery  0.13
1                   Pharmacy  0.13
2              Grocery Store  0.07
3  Middle Eastern Restaurant  0.07
4                Music Venue  0.07


----Downsview ,North Park ,Upwood Park----
                        venue  freq
0                      Bakery  0.25
1                        Park  0.25
2  Construction & Landscaping  0.25
3            Basketball Court  0.25
4                 Men's Store  0.00


----Downsview Central----
               venue  freq
0   Business Service  0.25
1  Korean Restaurant  0.25
2     Baseball Field  0.25
3       Home Service  0.25
4        Yoga Studio  0.00


----Downsview Northwest----
                  venue  freq
0         Grocery Store  0.25
1    Athletics & Sports  0.25
2          Liquor Store  0.25
3  Gym / Fitness Center  0.25
4              Wine Bar  0.00


----Downsview West----
           venue  freq
0  Grocery Store  0.33
1           Park  0.17
2           Bank  0.17
3          Hotel  0.17
4  Shopping Mall  0.17


----East Birchmount Park ,Ionview ,Kennedy Park----
              venue  freq
0  Department Store  0.25
1    Discount Store  0.25
2       Coffee Shop  0.25
3        Hobby Shop  0.25
4     Metro Station  0.00


----East Toronto----
               venue  freq
0               Park  0.50
1        Coffee Shop  0.25
2  Convenience Store  0.25
3        Yoga Studio  0.00
4        Men's Store  0.00


----Emery ,Humberlea----
                    venue  freq
0             Fabric Shop  0.33
1          Baseball Field  0.33
2  Furniture / Home Store  0.33
3           Luggage Store  0.00
4      Mac & Cheese Joint  0.00


----Fairview ,Henry Farm ,Oriole----
                  venue  freq
0        Clothing Store  0.14
1           Coffee Shop  0.08
2  Fast Food Restaurant  0.06
3   Japanese Restaurant  0.05
4         Women's Store  0.03


----First Canadian Place ,Underground city----
         venue  freq
0  Coffee Shop  0.12
1         Café  0.07
2   Restaurant  0.06
3        Hotel  0.03
4   Steakhouse  0.03


----Flemingdon Park ,Don Mills South----
              venue  freq
0        Restaurant  0.09
1               Gym  0.09
2        Beer Store  0.09
3  Asian Restaurant  0.09
4       Coffee Shop  0.09


----Forest Hill North ,Forest Hill West----
                      venue  freq
0                      Park  0.25
1             Jewelry Store  0.25
2          Sushi Restaurant  0.25
3                     Trail  0.25
4  Mediterranean Restaurant  0.00


----Glencairn----
                 venue  freq
0          Pizza Place  0.33
1                 Park  0.17
2     Sushi Restaurant  0.17
3                  Pub  0.17
4  Japanese Restaurant  0.17


----Guildwood ,Morningside ,West Hill----
                 venue  freq
0       Medical Center  0.14
1                  Spa  0.14
2       Breakfast Spot  0.14
3  Rental Car Location  0.14
4   Mexican Restaurant  0.14


----Harbord ,University of Toronto----
                 venue  freq
0                 Café  0.14
1           Restaurant  0.06
2               Bakery  0.06
3   Italian Restaurant  0.06
4  Japanese Restaurant  0.06


----Harbourfront----
         venue  freq
0  Coffee Shop  0.15
1         Park  0.06
2          Pub  0.06
3         Café  0.06
4       Bakery  0.06


----Harbourfront East ,Toronto Islands ,Union Station----
                venue  freq
0         Coffee Shop  0.12
1            Aquarium  0.05
2               Hotel  0.04
3  Italian Restaurant  0.04
4                Café  0.04


----High Park ,The Junction South----
                venue  freq
0     Thai Restaurant  0.09
1                Café  0.09
2  Mexican Restaurant  0.09
3                 Bar  0.09
4       Grocery Store  0.04


----Highland Creek ,Rouge Hill ,Port Union----
                venue  freq
0                 Bar   1.0
1         Yoga Studio   0.0
2         Men's Store   0.0
3   Mobile Phone Shop   0.0
4  Miscellaneous Shop   0.0


----Hillcrest Village----
                      venue  freq
0  Mediterranean Restaurant  0.25
1               Golf Course  0.25
2                   Dog Run  0.25
3                      Pool  0.25
4               Yoga Studio  0.00


----Humber Bay ,King's Mill Park ,Kingsway Park South East ,Mimico NE ,Old Mill South ,The Queensway East ,Royal York South East ,Sunnylea----
                venue  freq
0      Baseball Field   1.0
1         Yoga Studio   0.0
2         Men's Store   0.0
3   Mobile Phone Shop   0.0
4  Miscellaneous Shop   0.0


----Humber Bay Shores ,Mimico South ,New Toronto----
         venue  freq
0         Café  0.17
1  Pizza Place  0.08
2       Bakery  0.08
3  Coffee Shop  0.08
4   Restaurant  0.08


----Humber Summit----
                      venue  freq
0               Pizza Place   1.0
1               Yoga Studio   0.0
2  Mediterranean Restaurant   0.0
3         Mobile Phone Shop   0.0
4        Miscellaneous Shop   0.0


----Humewood-Cedarvale----
                venue  freq
0        Hockey Arena  0.33
1               Field  0.33
2               Trail  0.33
3         Yoga Studio  0.00
4  Miscellaneous Shop  0.00


----Kingsview Village ,Martin Grove Gardens ,Richview Gardens ,St. Phillips----
               venue  freq
0  Mobile Phone Shop  0.25
1        Pizza Place  0.25
2     Sandwich Place  0.25
3           Bus Line  0.25
4        Men's Store  0.00


----Kingsway Park South West ,Mimico NW ,The Queensway West ,Royal York South West ,South of Bloor----
                    venue  freq
0           Grocery Store  0.08
1  Thrift / Vintage Store  0.08
2                     Gym  0.08
3    Fast Food Restaurant  0.08
4          Discount Store  0.08


----L'Amoreaux West----
                  venue  freq
0  Fast Food Restaurant  0.20
1    Chinese Restaurant  0.13
2         Grocery Store  0.07
3           Supermarket  0.07
4           Pizza Place  0.07


----Lawrence Heights ,Lawrence Manor----
                    venue  freq
0           Women's Store  0.15
1  Furniture / Home Store  0.15
2          Clothing Store  0.15
3               Gift Shop  0.08
4             Event Space  0.08


----Lawrence Park----
                      venue  freq
0                      Park  0.33
1               Swim School  0.33
2                  Bus Line  0.33
3               Yoga Studio  0.00
4  Mediterranean Restaurant  0.00


----Leaside----
                    venue  freq
0             Coffee Shop  0.09
1     Sporting Goods Shop  0.09
2            Burger Joint  0.06
3  Furniture / Home Store  0.06
4           Grocery Store  0.03


----Little Portugal ,Trinity----
              venue  freq
0               Bar  0.13
1       Coffee Shop  0.07
2  Asian Restaurant  0.05
3        Restaurant  0.05
4       Men's Store  0.04


----Maryvale ,Wexford----
                       venue  freq
0                 Smoke Shop  0.25
1             Breakfast Spot  0.25
2                     Bakery  0.25
3  Middle Eastern Restaurant  0.25
4                Yoga Studio  0.00


----Moore Park ,Summerhill East----
               venue  freq
0               Park  0.33
1         Playground  0.33
2       Tennis Court  0.33
3    Organic Grocery  0.00
4  Mobile Phone Shop  0.00


----Newtonbrook ,Willowdale----
                      venue  freq
0                 Piano Bar   1.0
1               Yoga Studio   0.0
2  Mediterranean Restaurant   0.0
3         Mobile Phone Shop   0.0
4        Miscellaneous Shop   0.0


----North Toronto West----
                 venue  freq
0       Clothing Store  0.15
1          Coffee Shop  0.10
2          Yoga Studio  0.05
3  Sporting Goods Shop  0.05
4         Dessert Shop  0.05


----Northwest----
                 venue  freq
0            Drugstore  0.33
1  Rental Car Location  0.33
2                  Bar  0.33
3          Men's Store  0.00
4   Miscellaneous Shop  0.00


----Northwood Park ,York University----
                  venue  freq
0    Falafel Restaurant  0.17
1                   Bar  0.17
2  Caribbean Restaurant  0.17
3        Massage Studio  0.17
4           Coffee Shop  0.17


----Parkdale ,Roncesvalles----
                         venue  freq
0                    Gift Shop  0.15
1                    Bookstore  0.08
2  Eastern European Restaurant  0.08
3                      Dog Run  0.08
4                          Bar  0.08


----Parkwoods----
                      venue  freq
0                      Park  0.33
1                  Bus Stop  0.33
2         Food & Drink Shop  0.33
3               Yoga Studio  0.00
4  Mediterranean Restaurant  0.00


----Queen's Park----
                 venue  freq
0          Coffee Shop  0.23
1                 Park  0.05
2  Fried Chicken Joint  0.03
3                  Bar  0.03
4   Seafood Restaurant  0.03


----Rosedale----
                      venue  freq
0                      Park  0.50
1                Playground  0.25
2                     Trail  0.25
3  Mediterranean Restaurant  0.00
4        Miscellaneous Shop  0.00


----Roselawn----
                venue  freq
0      Ice Cream Shop   0.5
1              Garden   0.5
2         Men's Store   0.0
3   Mobile Phone Shop   0.0
4  Miscellaneous Shop   0.0


----Rouge ,Malvern----
                      venue  freq
0      Fast Food Restaurant   0.5
1                Print Shop   0.5
2               Yoga Studio   0.0
3  Mediterranean Restaurant   0.0
4        Miscellaneous Shop   0.0


----Runnymede ,Swansea----
                venue  freq
0                Café  0.08
1         Coffee Shop  0.08
2    Sushi Restaurant  0.05
3         Pizza Place  0.05
4  Italian Restaurant  0.05


----Ryerson ,Garden District----
                       venue  freq
0                Coffee Shop  0.10
1             Clothing Store  0.08
2                       Café  0.03
3        Japanese Restaurant  0.03
4  Middle Eastern Restaurant  0.03


----Scarborough Village----
                      venue  freq
0         Convenience Store   0.5
1                Playground   0.5
2  Mediterranean Restaurant   0.0
3         Mobile Phone Shop   0.0
4        Miscellaneous Shop   0.0


----Silver Hills ,York Mills----
                        venue  freq
0                        Park   0.5
1                   Cafeteria   0.5
2                 Yoga Studio   0.0
3               Metro Station   0.0
4  Modern European Restaurant   0.0


----St. James Town----
                venue  freq
0         Coffee Shop  0.07
1                Café  0.06
2          Restaurant  0.05
3  Italian Restaurant  0.04
4               Hotel  0.04


----Stn A PO Boxes 25 The Esplanade----
                 venue  freq
0          Coffee Shop  0.12
1                 Café  0.04
2           Restaurant  0.04
3  Japanese Restaurant  0.03
4                Hotel  0.03


----Studio District----
                 venue  freq
0                 Café  0.10
1          Coffee Shop  0.07
2               Bakery  0.05
3              Brewery  0.05
4  American Restaurant  0.05


----The Annex ,North Midtown ,Yorkville----
                           venue  freq
0                           Café  0.13
1                 Sandwich Place  0.13
2                    Coffee Shop  0.09
3                 Cosmetics Shop  0.04
4  Vegetarian / Vegan Restaurant  0.04


----The Beaches----
               venue  freq
0              Trail   0.2
1        Coffee Shop   0.2
2  Health Food Store   0.2
3                Pub   0.2
4        Yoga Studio   0.0


----The Beaches West ,India Bazaar----
            venue  freq
0            Park  0.11
1  Sandwich Place  0.11
2  Ice Cream Shop  0.05
3       Pet Store  0.05
4     Pizza Place  0.05


----The Danforth West ,Riverdale----
                    venue  freq
0        Greek Restaurant  0.20
1             Coffee Shop  0.10
2      Italian Restaurant  0.07
3  Furniture / Home Store  0.05
4          Ice Cream Shop  0.05


----The Junction North ,Runnymede----
           venue  freq
0  Grocery Store  0.25
1    Pizza Place  0.25
2        Brewery  0.25
3       Bus Line  0.25
4    Men's Store  0.00


----The Kingsway ,Montgomery Road ,Old Mill North----
               venue  freq
0               Park   0.5
1              River   0.5
2        Yoga Studio   0.0
3        Men's Store   0.0
4  Mobile Phone Shop   0.0


----Thorncliffe Park----
                  venue  freq
0     Indian Restaurant  0.11
1           Yoga Studio  0.05
2          Liquor Store  0.05
3           Coffee Shop  0.05
4  Fast Food Restaurant  0.05


----Victoria Village----
                   venue  freq
0           Hockey Arena  0.25
1           Intersection  0.25
2            Coffee Shop  0.25
3  Portuguese Restaurant  0.25
4            Yoga Studio  0.00


----Westmount----
                       venue  freq
0                Pizza Place  0.25
1  Middle Eastern Restaurant  0.12
2               Intersection  0.12
3             Discount Store  0.12
4                Coffee Shop  0.12


----Weston----
                       venue  freq
0                       Park   1.0
1                Yoga Studio   0.0
2             Medical Center   0.0
3         Miscellaneous Shop   0.0
4  Middle Eastern Restaurant   0.0


----Willowdale South----
              venue  freq
0  Ramen Restaurant  0.09
1       Pizza Place  0.06
2     Shopping Mall  0.06
3    Sandwich Place  0.06
4              Café  0.06


----Willowdale West----
            venue  freq
0   Grocery Store  0.17
1     Coffee Shop  0.17
2    Home Service  0.17
3  Discount Store  0.17
4     Pizza Place  0.17


----Woburn----
                        venue  freq
0                 Coffee Shop  0.50
1           Indian Restaurant  0.25
2           Korean Restaurant  0.25
3               Metro Station  0.00
4  Modern European Restaurant  0.00


----Woodbine Gardens ,Parkview Hill----
                  venue  freq
0           Pizza Place  0.18
1  Gym / Fitness Center  0.09
2             Gastropub  0.09
3              Pharmacy  0.09
4              Bus Line  0.09


----Woodbine Heights----
            venue  freq
0            Park  0.12
1        Pharmacy  0.12
2    Skating Rink  0.12
3  Cosmetics Shop  0.12
4     Video Store  0.12


----York Mills West----
                      venue  freq
0                      Park  0.50
1                      Bank  0.25
2         Convenience Store  0.25
3               Yoga Studio  0.00
4  Mediterranean Restaurant  0.00


Let's put this data into a pandas dataframe.
First, write a function to sort the venues in descending order.

def return_most_common_venues(row, num_top_venues):
    row_categories = row.iloc[1:]
    row_categories_sorted = row_categories.sort_values(ascending=False)

    return row_categories_sorted.index.values[0:num_top_venues]

Let's create the new dataframe and display the top 10 venues for each neighborhood.

num_top_venues = 10

indicators = ['st', 'nd', 'rd']

# create columns according to the number of top venues
columns = ['Neighborhood']
for ind in np.arange(num_top_venues):
    try:
        columns.append('{}{} Most Common Venue'.format(ind+1, indicators[ind]))
    except:
        columns.append('{}th Most Common Venue'.format(ind+1))

# create a new dataframe
neighborhoods_venues_sorted = pd.DataFrame(columns=columns)
neighborhoods_venues_sorted['Neighborhood'] = toronto_grouped['Neighborhood']

for ind in np.arange(toronto_grouped.shape[0]):
    neighborhoods_venues_sorted.iloc[ind, 1:] = return_most_common_venues(toronto_grouped.iloc[ind, :], num_top_venues)

neighborhoods_venues_sorted.head()
Neighborhood 1st Most Common Venue 2nd Most Common Venue 3rd Most Common Venue 4th Most Common Venue 5th Most Common Venue 6th Most Common Venue 7th Most Common Venue 8th Most Common Venue 9th Most Common Venue 10th Most Common Venue
0 Adelaide ,King ,Richmond Coffee Shop Restaurant Café Thai Restaurant Steakhouse Sushi Restaurant Bar Seafood Restaurant Lounge Cosmetics Shop
1 Agincourt Latin American Restaurant Lounge Breakfast Spot Clothing Store Donut Shop Diner Discount Store Distribution Center Dog Run Doner Restaurant
2 Agincourt North ,L'Amoreaux East ,Milliken ,St... Park Coffee Shop Playground Dog Run Department Store Dessert Shop Dim Sum Restaurant Diner Discount Store Distribution Center
3 Albion Gardens ,Beaumond Heights ,Humbergate ,... Grocery Store Pizza Place Japanese Restaurant Liquor Store Pharmacy Discount Store Beer Store Fried Chicken Joint Sandwich Place Fast Food Restaurant
4 Alderwood ,Long Branch Pizza Place Coffee Shop Pharmacy Skating Rink Pub Pool Sandwich Place Dance Studio Gym Distribution Center

Cluster the neighborhoods

Run the k-means algorithm to cluster the neighborhood into 5 clusters.

kclusters = 5

toronto_grouped_clustering = toronto_grouped.drop('Neighborhood', 1)

# rin k-means clustering
kmeans = KMeans(n_clusters=kclusters, random_state=0).fit(toronto_grouped_clustering)

# check cluster labels generated for each row in the dataframe
kmeans.labels_[0:10]
array([0, 0, 1, 2, 0, 0, 0, 0, 0, 0])

Let's create a new dataframe that includes the cluster as well as the top 10 venues for each neighborhood.

neighborhoods_venues_sorted.insert(0, 'Cluster Labels', kmeans.labels_)

toronto_merged = neighborhoods

# merge toronto_grouped with toronto_data to add latitude/longitude for each neighborhood
toronto_merged = toronto_merged.join(neighborhoods_venues_sorted.set_index('Neighborhood'), on='Neighborhood')

toronto_merged.head()
Postcode Borough Neighborhood Latitude Longitude Cluster Labels 1st Most Common Venue 2nd Most Common Venue 3rd Most Common Venue 4th Most Common Venue 5th Most Common Venue 6th Most Common Venue 7th Most Common Venue 8th Most Common Venue 9th Most Common Venue 10th Most Common Venue
0 M1B Scarborough Rouge ,Malvern 43.806686 -79.194353 0.0 Fast Food Restaurant Print Shop Women's Store Dog Run Dessert Shop Dim Sum Restaurant Diner Discount Store Distribution Center Doner Restaurant
1 M1C Scarborough Highland Creek ,Rouge Hill ,Port Union 43.784535 -79.160497 2.0 Bar Women's Store Doner Restaurant Dim Sum Restaurant Diner Discount Store Distribution Center Dog Run Donut Shop Fabric Shop
2 M1E Scarborough Guildwood ,Morningside ,West Hill 43.763573 -79.188711 0.0 Intersection Breakfast Spot Mexican Restaurant Medical Center Rental Car Location Electronics Store Spa Donut Shop Doner Restaurant Dog Run
3 M1G Scarborough Woburn 43.770992 -79.216917 0.0 Coffee Shop Korean Restaurant Indian Restaurant Women's Store Doner Restaurant Diner Discount Store Distribution Center Dog Run Drugstore
4 M1H Scarborough Cedarbrae 43.773136 -79.239476 2.0 Fried Chicken Joint Bakery Athletics & Sports Thai Restaurant Caribbean Restaurant Gas Station Hakka Restaurant Bank Dumpling Restaurant Drugstore

Let's visualize the clusters.

map_clusters = folium.Map(location=[latitude, longitude], zoom_start=11)

# set color scheme for the clusters
x = np.arange(kclusters)
ys = [i + x + (i*x)**2 for i in range(kclusters)]
colors_array = cm.rainbow(np.linspace(0, 1, len(ys)))
rainbow = [colors.rgb2hex(i) for i in colors_array]

# add markers to the map
markers_colors = []
for lat, lon, poi, cluster in zip(toronto_merged['Latitude'], toronto_merged['Longitude'], toronto_merged['Neighborhood'], toronto_merged['Cluster Labels']):
    label = folium.Popup(str(poi) + ' Cluster ' + str(cluster), parse_html=True)
    folium.CircleMarker(
        [lat, lon],
        radius=5,
        popup=label,
        fill=True,
        fill_opacity=0.7).add_to(map_clusters)
       
map_clusters
<iframe src="about:blank" style="position:absolute;width:100%;height:100%;left:0;top:0;border:none !important;" data-html=PCFET0NUWVBFIGh0bWw+CjxoZWFkPiAgICAKICAgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPgogICAgPHNjcmlwdD5MX1BSRUZFUl9DQU5WQVMgPSBmYWxzZTsgTF9OT19UT1VDSCA9IGZhbHNlOyBMX0RJU0FCTEVfM0QgPSBmYWxzZTs8L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2FqYXguZ29vZ2xlYXBpcy5jb20vYWpheC9saWJzL2pxdWVyeS8xLjExLjEvanF1ZXJ5Lm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvanMvYm9vdHN0cmFwLm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvTGVhZmxldC5hd2Vzb21lLW1hcmtlcnMvMi4wLjIvbGVhZmxldC5hd2Vzb21lLW1hcmtlcnMuanMiPjwvc2NyaXB0PgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9jc3MvYm9vdHN0cmFwLm1pbi5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvY3NzL2Jvb3RzdHJhcC10aGVtZS5taW4uY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vbWF4Y2RuLmJvb3RzdHJhcGNkbi5jb20vZm9udC1hd2Vzb21lLzQuNi4zL2Nzcy9mb250LWF3ZXNvbWUubWluLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9MZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy8yLjAuMi9sZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9yYXdnaXQuY29tL3B5dGhvbi12aXN1YWxpemF0aW9uL2ZvbGl1bS9tYXN0ZXIvZm9saXVtL3RlbXBsYXRlcy9sZWFmbGV0LmF3ZXNvbWUucm90YXRlLmNzcyIvPgogICAgPHN0eWxlPmh0bWwsIGJvZHkge3dpZHRoOiAxMDAlO2hlaWdodDogMTAwJTttYXJnaW46IDA7cGFkZGluZzogMDt9PC9zdHlsZT4KICAgIDxzdHlsZT4jbWFwIHtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtyaWdodDowO2xlZnQ6MDt9PC9zdHlsZT4KICAgIAogICAgICAgICAgICA8c3R5bGU+ICNtYXBfMmU3ODZkZTY5ZGExNGQ4MzhkZmMyYjU5ODM3OGJhN2MgewogICAgICAgICAgICAgICAgcG9zaXRpb24gOiByZWxhdGl2ZTsKICAgICAgICAgICAgICAgIHdpZHRoIDogMTAwLjAlOwogICAgICAgICAgICAgICAgaGVpZ2h0OiAxMDAuMCU7CiAgICAgICAgICAgICAgICBsZWZ0OiAwLjAlOwogICAgICAgICAgICAgICAgdG9wOiAwLjAlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICA8L3N0eWxlPgogICAgICAgIAo8L2hlYWQ+Cjxib2R5PiAgICAKICAgIAogICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb2xpdW0tbWFwIiBpZD0ibWFwXzJlNzg2ZGU2OWRhMTRkODM4ZGZjMmI1OTgzNzhiYTdjIiA+PC9kaXY+CiAgICAgICAgCjwvYm9keT4KPHNjcmlwdD4gICAgCiAgICAKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGJvdW5kcyA9IG51bGw7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcF8yZTc4NmRlNjlkYTE0ZDgzOGRmYzJiNTk4Mzc4YmE3YyA9IEwubWFwKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21hcF8yZTc4NmRlNjlkYTE0ZDgzOGRmYzJiNTk4Mzc4YmE3YycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y2VudGVyOiBbNDMuNjUzOTYzLC03OS4zODcyMDddLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgem9vbTogMTEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhCb3VuZHM6IGJvdW5kcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyczogW10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JsZENvcHlKdW1wOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyczogTC5DUlMuRVBTRzM4NTcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciB0aWxlX2xheWVyXzk5OTAwODQ4Yjk0MDQzOGFhMDQ4ZDQyYzkxNDgxNGVhID0gTC50aWxlTGF5ZXIoCiAgICAgICAgICAgICAgICAnaHR0cHM6Ly97c30udGlsZS5vcGVuc3RyZWV0bWFwLm9yZy97en0ve3h9L3t5fS5wbmcnLAogICAgICAgICAgICAgICAgewogICJhdHRyaWJ1dGlvbiI6IG51bGwsCiAgImRldGVjdFJldGluYSI6IGZhbHNlLAogICJtYXhab29tIjogMTgsCiAgIm1pblpvb20iOiAxLAogICJub1dyYXAiOiBmYWxzZSwKICAic3ViZG9tYWlucyI6ICJhYmMiCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzJlNzg2ZGU2OWRhMTRkODM4ZGZjMmI1OTgzNzhiYTdjKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8yZjk2OTY5NThjMTg0YThhYjQ5MDMzNjg5ZTEzZjMyMCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjgwNjY4NjMsLTc5LjE5NDM1MzQwMDAwMDAzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiMzMzg4ZmYiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzM4OGZmIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzJlNzg2ZGU2OWRhMTRkODM4ZGZjMmI1OTgzNzhiYTdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2VkMTM3NzBkOWIyOTRmYTBhNDRjZDQwOTJmM2M1YjlhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2NmYjkyZDVmZDYxNjQ0ZWFhZWE5ZmZmYmI1YTM1ZTE1ID0gJCgnPGRpdiBpZD0iaHRtbF9jZmI5MmQ1ZmQ2MTY0NGVhYWVhOWZmZmJiNWEzNWUxNSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Um91Z2UgLE1hbHZlcm4gQ2x1c3RlciAwLjA8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2VkMTM3NzBkOWIyOTRmYTBhNDRjZDQwOTJmM2M1YjlhLnNldENvbnRlbnQoaHRtbF9jZmI5MmQ1ZmQ2MTY0NGVhYWVhOWZmZmJiNWEzNWUxNSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8yZjk2OTY5NThjMTg0YThhYjQ5MDMzNjg5ZTEzZjMyMC5iaW5kUG9wdXAocG9wdXBfZWQxMzc3MGQ5YjI5NGZhMGE0NGNkNDA5MmYzYzViOWEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOGZiYTIzMWQzMDdkNDg1YmE2MWQ3NzE5YWY1OGVkOTYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43ODQ1MzUxLC03OS4xNjA0OTcwOTk5OTk5OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjMzM4OGZmIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMzODhmZiIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8yZTc4NmRlNjlkYTE0ZDgzOGRmYzJiNTk4Mzc4YmE3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xMzkxN2ZmOTNiNTY0MDc2YmVmZTEwMWExMzcxZTAxMyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kOWFlYzVjMzE4NDE0MDYxOGQ2NjJiNTM1OWFiOTNmYiA9ICQoJzxkaXYgaWQ9Imh0bWxfZDlhZWM1YzMxODQxNDA2MThkNjYyYjUzNTlhYjkzZmIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkhpZ2hsYW5kIENyZWVrICxSb3VnZSBIaWxsICxQb3J0IFVuaW9uIENsdXN0ZXIgMi4wPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xMzkxN2ZmOTNiNTY0MDc2YmVmZTEwMWExMzcxZTAxMy5zZXRDb250ZW50KGh0bWxfZDlhZWM1YzMxODQxNDA2MThkNjYyYjUzNTlhYjkzZmIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOGZiYTIzMWQzMDdkNDg1YmE2MWQ3NzE5YWY1OGVkOTYuYmluZFBvcHVwKHBvcHVwXzEzOTE3ZmY5M2I1NjQwNzZiZWZlMTAxYTEzNzFlMDEzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2Q1MWI2MmUxN2RhZDQyZTJiOGQ1YzkyODA1ZjUwYmRiID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzYzNTcyNiwtNzkuMTg4NzExNV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjMzM4OGZmIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMzODhmZiIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8yZTc4NmRlNjlkYTE0ZDgzOGRmYzJiNTk4Mzc4YmE3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82MGEwODM2ZmMwODM0YTNjYjZlNTE2NzgzNzUwNDViYyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF80MDgzYTRjNTU4OTI0NTkyODk0MWVkODRhYzczNGFjZiA9ICQoJzxkaXYgaWQ9Imh0bWxfNDA4M2E0YzU1ODkyNDU5Mjg5NDFlZDg0YWM3MzRhY2YiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkd1aWxkd29vZCAsTW9ybmluZ3NpZGUgLFdlc3QgSGlsbCBDbHVzdGVyIDAuMDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNjBhMDgzNmZjMDgzNGEzY2I2ZTUxNjc4Mzc1MDQ1YmMuc2V0Q29udGVudChodG1sXzQwODNhNGM1NTg5MjQ1OTI4OTQxZWQ4NGFjNzM0YWNmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2Q1MWI2MmUxN2RhZDQyZTJiOGQ1YzkyODA1ZjUwYmRiLmJpbmRQb3B1cChwb3B1cF82MGEwODM2ZmMwODM0YTNjYjZlNTE2NzgzNzUwNDViYyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8zMDRiZGJhY2VhY2U0ZjA5OTRiNjhjYmViYjAyZTVmYyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjc3MDk5MjEsLTc5LjIxNjkxNzQwMDAwMDAxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiMzMzg4ZmYiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzM4OGZmIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzJlNzg2ZGU2OWRhMTRkODM4ZGZjMmI1OTgzNzhiYTdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzI3M2U5MzU5YzIxMzQ3Y2VhZTU1ODgwOGQ5ZTFhNGRmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2M1M2U3NzBlMGEyOTRhZTc4YTFmNjY5ZDhhZjgwZmUxID0gJCgnPGRpdiBpZD0iaHRtbF9jNTNlNzcwZTBhMjk0YWU3OGExZjY2OWQ4YWY4MGZlMSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+V29idXJuIENsdXN0ZXIgMC4wPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yNzNlOTM1OWMyMTM0N2NlYWU1NTg4MDhkOWUxYTRkZi5zZXRDb250ZW50KGh0bWxfYzUzZTc3MGUwYTI5NGFlNzhhMWY2NjlkOGFmODBmZTEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMzA0YmRiYWNlYWNlNGYwOTk0YjY4Y2JlYmIwMmU1ZmMuYmluZFBvcHVwKHBvcHVwXzI3M2U5MzU5YzIxMzQ3Y2VhZTU1ODgwOGQ5ZTFhNGRmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2RlZTA0Y2VhNDMzMjQ1NWViNDFmY2YwN2QzOTNkNjQ4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzczMTM2LC03OS4yMzk0NzYwOTk5OTk5OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjMzM4OGZmIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMzODhmZiIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8yZTc4NmRlNjlkYTE0ZDgzOGRmYzJiNTk4Mzc4YmE3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xNzQ2ZTI1NzdhMWE0MzBlYTg1OGM5OWZmN2RhOGQ5ZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mYzQ1ZDcwMjRmMjA0NjBkYTdjNzMzNjVmNTU2OWM4ZCA9ICQoJzxkaXYgaWQ9Imh0bWxfZmM0NWQ3MDI0ZjIwNDYwZGE3YzczMzY1ZjU1NjljOGQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNlZGFyYnJhZSBDbHVzdGVyIDIuMDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMTc0NmUyNTc3YTFhNDMwZWE4NThjOTlmZjdkYThkOWQuc2V0Q29udGVudChodG1sX2ZjNDVkNzAyNGYyMDQ2MGRhN2M3MzM2NWY1NTY5YzhkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2RlZTA0Y2VhNDMzMjQ1NWViNDFmY2YwN2QzOTNkNjQ4LmJpbmRQb3B1cChwb3B1cF8xNzQ2ZTI1NzdhMWE0MzBlYTg1OGM5OWZmN2RhOGQ5ZCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jYWY5OWQzYTQ0M2I0NTk2OWU5MjZiNWM3NGE5Y2M3NCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjc0NDczNDIsLTc5LjIzOTQ3NjA5OTk5OTk4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiMzMzg4ZmYiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzM4OGZmIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzJlNzg2ZGU2OWRhMTRkODM4ZGZjMmI1OTgzNzhiYTdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzA2YjY1NmI4OGRjYjRmM2ZiZWM0YWRhMzA3YjlkODM0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2JmMTM2ZTdmNjM1ZjQ0M2M4YWRkMzYwNGQ1YmIwMTM4ID0gJCgnPGRpdiBpZD0iaHRtbF9iZjEzNmU3ZjYzNWY0NDNjOGFkZDM2MDRkNWJiMDEzOCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U2NhcmJvcm91Z2ggVmlsbGFnZSBDbHVzdGVyIDAuMDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMDZiNjU2Yjg4ZGNiNGYzZmJlYzRhZGEzMDdiOWQ4MzQuc2V0Q29udGVudChodG1sX2JmMTM2ZTdmNjM1ZjQ0M2M4YWRkMzYwNGQ1YmIwMTM4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2NhZjk5ZDNhNDQzYjQ1OTY5ZTkyNmI1Yzc0YTljYzc0LmJpbmRQb3B1cChwb3B1cF8wNmI2NTZiODhkY2I0ZjNmYmVjNGFkYTMwN2I5ZDgzNCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mMmM2OGZmYzBhNzA0MWFhYmY5YzlmNGRlNTg1MmZlMCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjcyNzkyOTIsLTc5LjI2MjAyOTQwMDAwMDAyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiMzMzg4ZmYiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzM4OGZmIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzJlNzg2ZGU2OWRhMTRkODM4ZGZjMmI1OTgzNzhiYTdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzQxNjM5YTM3NWRjMDQ0YjU5MTIyOWRiN2M0MmZjMzJhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzNlZDEyYTQ1NGVjMTQwMmU4NmNkM2Y2YzgzOGQ3ZjFkID0gJCgnPGRpdiBpZD0iaHRtbF8zZWQxMmE0NTRlYzE0MDJlODZjZDNmNmM4MzhkN2YxZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RWFzdCBCaXJjaG1vdW50IFBhcmsgLElvbnZpZXcgLEtlbm5lZHkgUGFyayBDbHVzdGVyIDAuMDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNDE2MzlhMzc1ZGMwNDRiNTkxMjI5ZGI3YzQyZmMzMmEuc2V0Q29udGVudChodG1sXzNlZDEyYTQ1NGVjMTQwMmU4NmNkM2Y2YzgzOGQ3ZjFkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2YyYzY4ZmZjMGE3MDQxYWFiZjljOWY0ZGU1ODUyZmUwLmJpbmRQb3B1cChwb3B1cF80MTYzOWEzNzVkYzA0NGI1OTEyMjlkYjdjNDJmYzMyYSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mMDRiY2ViOTcyODA0NmU1OTY3YzBjODI1MWFkYmE4YSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjcxMTExMTcsLTc5LjI4NDU3NzJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzMzODhmZiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMzg4ZmYiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMmU3ODZkZTY5ZGExNGQ4MzhkZmMyYjU5ODM3OGJhN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNzdmMWU4ZDA1M2Q2NDgyNmJhZGUwMDhjMjg0ODg1OWQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNGNmMGZjMWZkMzNkNDVhMGJmYmEzZjY3MzllZjJlOTUgPSAkKCc8ZGl2IGlkPSJodG1sXzRjZjBmYzFmZDMzZDQ1YTBiZmJhM2Y2NzM5ZWYyZTk1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DbGFpcmxlYSAsR29sZGVuIE1pbGUgLE9ha3JpZGdlIENsdXN0ZXIgMi4wPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83N2YxZThkMDUzZDY0ODI2YmFkZTAwOGMyODQ4ODU5ZC5zZXRDb250ZW50KGh0bWxfNGNmMGZjMWZkMzNkNDVhMGJmYmEzZjY3MzllZjJlOTUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZjA0YmNlYjk3MjgwNDZlNTk2N2MwYzgyNTFhZGJhOGEuYmluZFBvcHVwKHBvcHVwXzc3ZjFlOGQwNTNkNjQ4MjZiYWRlMDA4YzI4NDg4NTlkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2U1NDIxNmQ5YTZhOTQ5Y2Y5MTFkMmVhOGM5NDMyMmI5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzE2MzE2LC03OS4yMzk0NzYwOTk5OTk5OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjMzM4OGZmIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMzODhmZiIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8yZTc4NmRlNjlkYTE0ZDgzOGRmYzJiNTk4Mzc4YmE3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85ODI0ODM4YTUyNmY0YWZkOTNhYzU5Yzk1MDJkMGI3NSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF80YzJiYTkwMjlmMDA0ZjFhYjBiM2RiMDRkOWEyMmYzNSA9ICQoJzxkaXYgaWQ9Imh0bWxfNGMyYmE5MDI5ZjAwNGYxYWIwYjNkYjA0ZDlhMjJmMzUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNsaWZmY3Jlc3QgLENsaWZmc2lkZSAsU2NhcmJvcm91Z2ggVmlsbGFnZSBXZXN0IENsdXN0ZXIgMC4wPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85ODI0ODM4YTUyNmY0YWZkOTNhYzU5Yzk1MDJkMGI3NS5zZXRDb250ZW50KGh0bWxfNGMyYmE5MDI5ZjAwNGYxYWIwYjNkYjA0ZDlhMjJmMzUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZTU0MjE2ZDlhNmE5NDljZjkxMWQyZWE4Yzk0MzIyYjkuYmluZFBvcHVwKHBvcHVwXzk4MjQ4MzhhNTI2ZjRhZmQ5M2FjNTljOTUwMmQwYjc1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2M1YjUwMDY3NTZkNDRhNzBiZmU5ZjM2NDFmZmNhMTYzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjkyNjU3LC03OS4yNjQ4NDgxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiMzMzg4ZmYiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzM4OGZmIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzJlNzg2ZGU2OWRhMTRkODM4ZGZjMmI1OTgzNzhiYTdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzY0MDM5ZTk1ZTg2YTRmYmRhNzljMzEyY2JiNzlkNGVkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzFhNThkNWIzMmQ2MzRhNTg5YzU5ZWE0NmU4ZjM3Mjk3ID0gJCgnPGRpdiBpZD0iaHRtbF8xYTU4ZDViMzJkNjM0YTU4OWM1OWVhNDZlOGYzNzI5NyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QmlyY2ggQ2xpZmYgLENsaWZmc2lkZSBXZXN0IENsdXN0ZXIgMC4wPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82NDAzOWU5NWU4NmE0ZmJkYTc5YzMxMmNiYjc5ZDRlZC5zZXRDb250ZW50KGh0bWxfMWE1OGQ1YjMyZDYzNGE1ODljNTllYTQ2ZThmMzcyOTcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYzViNTAwNjc1NmQ0NGE3MGJmZTlmMzY0MWZmY2ExNjMuYmluZFBvcHVwKHBvcHVwXzY0MDM5ZTk1ZTg2YTRmYmRhNzljMzEyY2JiNzlkNGVkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzliYzEzN2ZkNzdkNDQ0NmM5MGQ4Zjk3ZWNlNzU1ZjAwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzU3NDA5NiwtNzkuMjczMzA0MDAwMDAwMDJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzMzODhmZiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMzg4ZmYiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMmU3ODZkZTY5ZGExNGQ4MzhkZmMyYjU5ODM3OGJhN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNWUzZjc3NmJkOWM3NGM2MjgzMzEyODM1YzA3MWIzZjggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNDE2MWZmYWI1ZTdkNDU5N2EyOWNmZjNhNzUyY2FjYjEgPSAkKCc8ZGl2IGlkPSJodG1sXzQxNjFmZmFiNWU3ZDQ1OTdhMjljZmYzYTc1MmNhY2IxIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Eb3JzZXQgUGFyayAsU2NhcmJvcm91Z2ggVG93biBDZW50cmUgLFdleGZvcmQgSGVpZ2h0cyBDbHVzdGVyIDAuMDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNWUzZjc3NmJkOWM3NGM2MjgzMzEyODM1YzA3MWIzZjguc2V0Q29udGVudChodG1sXzQxNjFmZmFiNWU3ZDQ1OTdhMjljZmYzYTc1MmNhY2IxKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzliYzEzN2ZkNzdkNDQ0NmM5MGQ4Zjk3ZWNlNzU1ZjAwLmJpbmRQb3B1cChwb3B1cF81ZTNmNzc2YmQ5Yzc0YzYyODMzMTI4MzVjMDcxYjNmOCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl83MTY1ODg0OTY1YjY0MzYwYTE3YzNjNDE4YzgyYjg2ZiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjc1MDA3MTUsLTc5LjI5NTg0OTFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzMzODhmZiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMzg4ZmYiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMmU3ODZkZTY5ZGExNGQ4MzhkZmMyYjU5ODM3OGJhN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYTBmYjA4OWQ5MThkNGM2OGJkMTRkODJlYTM3ZDA5MzIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNjc0NDdmOWMyZjE2NGExNDgyYWQzOTQxYmU3ZWM1Y2EgPSAkKCc8ZGl2IGlkPSJodG1sXzY3NDQ3ZjljMmYxNjRhMTQ4MmFkMzk0MWJlN2VjNWNhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NYXJ5dmFsZSAsV2V4Zm9yZCBDbHVzdGVyIDIuMDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYTBmYjA4OWQ5MThkNGM2OGJkMTRkODJlYTM3ZDA5MzIuc2V0Q29udGVudChodG1sXzY3NDQ3ZjljMmYxNjRhMTQ4MmFkMzk0MWJlN2VjNWNhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzcxNjU4ODQ5NjViNjQzNjBhMTdjM2M0MThjODJiODZmLmJpbmRQb3B1cChwb3B1cF9hMGZiMDg5ZDkxOGQ0YzY4YmQxNGQ4MmVhMzdkMDkzMik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8wZTRjZWMxMjA2YjI0NmM2YWJiM2Q2OTY4YTE2MThjMSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjc5NDIwMDMsLTc5LjI2MjAyOTQwMDAwMDAyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiMzMzg4ZmYiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzM4OGZmIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzJlNzg2ZGU2OWRhMTRkODM4ZGZjMmI1OTgzNzhiYTdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2UwMTI0NTAzZjY4OTQxMTJhOGI2YmZkYTljZWIyMjM2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzVjOTk2N2Y2NTU1NzQ3MmRiMjlhNzg5ZDhiODNkMDJlID0gJCgnPGRpdiBpZD0iaHRtbF81Yzk5NjdmNjU1NTc0NzJkYjI5YTc4OWQ4YjgzZDAyZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QWdpbmNvdXJ0IENsdXN0ZXIgMC4wPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lMDEyNDUwM2Y2ODk0MTEyYThiNmJmZGE5Y2ViMjIzNi5zZXRDb250ZW50KGh0bWxfNWM5OTY3ZjY1NTU3NDcyZGIyOWE3ODlkOGI4M2QwMmUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMGU0Y2VjMTIwNmIyNDZjNmFiYjNkNjk2OGExNjE4YzEuYmluZFBvcHVwKHBvcHVwX2UwMTI0NTAzZjY4OTQxMTJhOGI2YmZkYTljZWIyMjM2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzZhZDE1MmZjMTA2NjRhNjE4ZjQ1ODJjMzg4MzA2NzBhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzgxNjM3NSwtNzkuMzA0MzAyMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjMzM4OGZmIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMzODhmZiIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8yZTc4NmRlNjlkYTE0ZDgzOGRmYzJiNTk4Mzc4YmE3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iNTIyOGM5YTc3MDU0NTRjOWJmMDNjZjViNDRiMDI2OSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8yYTgxZmZhNGMzMjk0Y2M2YWZlYWQwMmQ5ZWY5ODE1MyA9ICQoJzxkaXYgaWQ9Imh0bWxfMmE4MWZmYTRjMzI5NGNjNmFmZWFkMDJkOWVmOTgxNTMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNsYXJrcyBDb3JuZXJzICxTdWxsaXZhbiAsVGFtIE8mIzM5O1NoYW50ZXIgQ2x1c3RlciAwLjA8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2I1MjI4YzlhNzcwNTQ1NGM5YmYwM2NmNWI0NGIwMjY5LnNldENvbnRlbnQoaHRtbF8yYTgxZmZhNGMzMjk0Y2M2YWZlYWQwMmQ5ZWY5ODE1Myk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl82YWQxNTJmYzEwNjY0YTYxOGY0NTgyYzM4ODMwNjcwYS5iaW5kUG9wdXAocG9wdXBfYjUyMjhjOWE3NzA1NDU0YzliZjAzY2Y1YjQ0YjAyNjkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYjZjMWYxZjQzMjJhNGNlMjkxZmM5YjU4ZjZlYTVkYTIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My44MTUyNTIyLC03OS4yODQ1NzcyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiMzMzg4ZmYiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzM4OGZmIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzJlNzg2ZGU2OWRhMTRkODM4ZGZjMmI1OTgzNzhiYTdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzU1Mjk1NTkwOGFlYTQ3N2I5N2Y1YzU1ZDJlMzRkOTliID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2IxZWI2NDFlZTIzYjRkNzlhNDljNmEyNGNiMjEyZWY3ID0gJCgnPGRpdiBpZD0iaHRtbF9iMWViNjQxZWUyM2I0ZDc5YTQ5YzZhMjRjYjIxMmVmNyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QWdpbmNvdXJ0IE5vcnRoICxMJiMzOTtBbW9yZWF1eCBFYXN0ICxNaWxsaWtlbiAsU3RlZWxlcyBFYXN0IENsdXN0ZXIgMS4wPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81NTI5NTU5MDhhZWE0NzdiOTdmNWM1NWQyZTM0ZDk5Yi5zZXRDb250ZW50KGh0bWxfYjFlYjY0MWVlMjNiNGQ3OWE0OWM2YTI0Y2IyMTJlZjcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYjZjMWYxZjQzMjJhNGNlMjkxZmM5YjU4ZjZlYTVkYTIuYmluZFBvcHVwKHBvcHVwXzU1Mjk1NTkwOGFlYTQ3N2I5N2Y1YzU1ZDJlMzRkOTliKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzg3NGRiNDUyZGM0NzQxYzk5NTA0M2JmZmUxMTIxY2RiID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzk5NTI1MjAwMDAwMDEsLTc5LjMxODM4ODddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzMzODhmZiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMzg4ZmYiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMmU3ODZkZTY5ZGExNGQ4MzhkZmMyYjU5ODM3OGJhN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNjlhZTIyZmE4NTM3NGFjNjljZjYxMzdmOTQyODk2MTIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZGExZjZjODlkMGQ4NGU3ZmJkNDQzOGNkZjA3MTUxMmUgPSAkKCc8ZGl2IGlkPSJodG1sX2RhMWY2Yzg5ZDBkODRlN2ZiZDQ0MzhjZGYwNzE1MTJlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5MJiMzOTtBbW9yZWF1eCBXZXN0IENsdXN0ZXIgMC4wPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82OWFlMjJmYTg1Mzc0YWM2OWNmNjEzN2Y5NDI4OTYxMi5zZXRDb250ZW50KGh0bWxfZGExZjZjODlkMGQ4NGU3ZmJkNDQzOGNkZjA3MTUxMmUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfODc0ZGI0NTJkYzQ3NDFjOTk1MDQzYmZmZTExMjFjZGIuYmluZFBvcHVwKHBvcHVwXzY5YWUyMmZhODUzNzRhYzY5Y2Y2MTM3Zjk0Mjg5NjEyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzA4MWEyMzQ2MDc3MjRkYjY4YjlmYzUyOWVkYTAyYzIyID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuODM2MTI0NzAwMDAwMDA2LC03OS4yMDU2MzYwOTk5OTk5OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjMzM4OGZmIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMzODhmZiIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8yZTc4NmRlNjlkYTE0ZDgzOGRmYzJiNTk4Mzc4YmE3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xZTIyODI1YmNhZjc0OWMwOWFjYmU3OGE3ZGQ1MTA3ZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iNDBkODM3OTZhZjA0YmNkYTIyYjQ1MTk4Nzk3MzczYyA9ICQoJzxkaXYgaWQ9Imh0bWxfYjQwZDgzNzk2YWYwNGJjZGEyMmI0NTE5ODc5NzM3M2MiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlVwcGVyIFJvdWdlIENsdXN0ZXIgbmFuPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xZTIyODI1YmNhZjc0OWMwOWFjYmU3OGE3ZGQ1MTA3Zi5zZXRDb250ZW50KGh0bWxfYjQwZDgzNzk2YWYwNGJjZGEyMmI0NTE5ODc5NzM3M2MpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMDgxYTIzNDYwNzcyNGRiNjhiOWZjNTI5ZWRhMDJjMjIuYmluZFBvcHVwKHBvcHVwXzFlMjI4MjViY2FmNzQ5YzA5YWNiZTc4YTdkZDUxMDdmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2MxZDhlYTA3NjY2MjQ3NjI5YmNhNzA0ZDIzMTFiYmM3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuODAzNzYyMiwtNzkuMzYzNDUxN10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjMzM4OGZmIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMzODhmZiIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8yZTc4NmRlNjlkYTE0ZDgzOGRmYzJiNTk4Mzc4YmE3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85NDg4YTVlNmRjYWE0ZjYzYjUxYzNkNTkxOWFiNDRiOSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wOGZkNzI2Mzg3ZWM0ODQ3YWM2NTNkN2ZjMzgwMmZmNiA9ICQoJzxkaXYgaWQ9Imh0bWxfMDhmZDcyNjM4N2VjNDg0N2FjNjUzZDdmYzM4MDJmZjYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkhpbGxjcmVzdCBWaWxsYWdlIENsdXN0ZXIgMi4wPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85NDg4YTVlNmRjYWE0ZjYzYjUxYzNkNTkxOWFiNDRiOS5zZXRDb250ZW50KGh0bWxfMDhmZDcyNjM4N2VjNDg0N2FjNjUzZDdmYzM4MDJmZjYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYzFkOGVhMDc2NjYyNDc2MjliY2E3MDRkMjMxMWJiYzcuYmluZFBvcHVwKHBvcHVwXzk0ODhhNWU2ZGNhYTRmNjNiNTFjM2Q1OTE5YWI0NGI5KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzExNDJkMTZkM2E3NzRjZmViYjhlYjcyY2FkZDE2YmJlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzc4NTE3NSwtNzkuMzQ2NTU1N10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjMzM4OGZmIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMzODhmZiIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8yZTc4NmRlNjlkYTE0ZDgzOGRmYzJiNTk4Mzc4YmE3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zM2ExNjZjMTVkM2Q0MzI1YWQzZWY0ZDc2OWE5NmFmNSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zYzM4OWIxZTNhYTM0MDYzOWJkNTg4Mjk3NTlmOWI4YiA9ICQoJzxkaXYgaWQ9Imh0bWxfM2MzODliMWUzYWEzNDA2MzliZDU4ODI5NzU5ZjliOGIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkZhaXJ2aWV3ICxIZW5yeSBGYXJtICxPcmlvbGUgQ2x1c3RlciAwLjA8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzMzYTE2NmMxNWQzZDQzMjVhZDNlZjRkNzY5YTk2YWY1LnNldENvbnRlbnQoaHRtbF8zYzM4OWIxZTNhYTM0MDYzOWJkNTg4Mjk3NTlmOWI4Yik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8xMTQyZDE2ZDNhNzc0Y2ZlYmI4ZWI3MmNhZGQxNmJiZS5iaW5kUG9wdXAocG9wdXBfMzNhMTY2YzE1ZDNkNDMyNWFkM2VmNGQ3NjlhOTZhZjUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZmY3YjJjOWM4YjJiNGU3ZThiYjQ3NDgyMzAyNTk0Y2UgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43ODY5NDczLC03OS4zODU5NzVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzMzODhmZiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMzg4ZmYiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMmU3ODZkZTY5ZGExNGQ4MzhkZmMyYjU5ODM3OGJhN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOWU3MzRmNTFjNzg0NDBlZDk0ZWI1ZTg0MDEyYmQ5ZGIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZThhYzQ4OGI0NmJlNGIwYmEzMDYwODFiYmIxNGZmMDIgPSAkKCc8ZGl2IGlkPSJodG1sX2U4YWM0ODhiNDZiZTRiMGJhMzA2MDgxYmJiMTRmZjAyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5CYXl2aWV3IFZpbGxhZ2UgQ2x1c3RlciAwLjA8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzllNzM0ZjUxYzc4NDQwZWQ5NGViNWU4NDAxMmJkOWRiLnNldENvbnRlbnQoaHRtbF9lOGFjNDg4YjQ2YmU0YjBiYTMwNjA4MWJiYjE0ZmYwMik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9mZjdiMmM5YzhiMmI0ZTdlOGJiNDc0ODIzMDI1OTRjZS5iaW5kUG9wdXAocG9wdXBfOWU3MzRmNTFjNzg0NDBlZDk0ZWI1ZTg0MDEyYmQ5ZGIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZDE2YmE3MDZmMzkyNGI1ZjgxMDIxNTBhMWQ1YmQ0NjUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43NTc0OTAyLC03OS4zNzQ3MTQwOTk5OTk5OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjMzM4OGZmIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMzODhmZiIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8yZTc4NmRlNjlkYTE0ZDgzOGRmYzJiNTk4Mzc4YmE3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iMDZhNzVhMjhhYzk0YWRjODI1YWE3YTdmNzRlMjc2MyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zMTA5YzNjNTNiZDM0Mjk1YmJhNDgxM2RhOTdmNWI1ZSA9ICQoJzxkaXYgaWQ9Imh0bWxfMzEwOWMzYzUzYmQzNDI5NWJiYTQ4MTNkYTk3ZjViNWUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlNpbHZlciBIaWxscyAsWW9yayBNaWxscyBDbHVzdGVyIDEuMDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYjA2YTc1YTI4YWM5NGFkYzgyNWFhN2E3Zjc0ZTI3NjMuc2V0Q29udGVudChodG1sXzMxMDljM2M1M2JkMzQyOTViYmE0ODEzZGE5N2Y1YjVlKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2QxNmJhNzA2ZjM5MjRiNWY4MTAyMTUwYTFkNWJkNDY1LmJpbmRQb3B1cChwb3B1cF9iMDZhNzVhMjhhYzk0YWRjODI1YWE3YTdmNzRlMjc2Myk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9kMzk0NzdlNmE0OTc0NzQ5ODYwM2Q1YzE4MjY0ZjEzZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjc4OTA1MywtNzkuNDA4NDkyNzk5OTk5OThdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzMzODhmZiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMzg4ZmYiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMmU3ODZkZTY5ZGExNGQ4MzhkZmMyYjU5ODM3OGJhN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZTcyZGQ0NDFkMzJjNGViYWI4NjYzMjQ5NTA3NDA5NDcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfY2UzY2JkZTUwNGViNDAyYWEzZjgyY2QwODIzZGRhZWEgPSAkKCc8ZGl2IGlkPSJodG1sX2NlM2NiZGU1MDRlYjQwMmFhM2Y4MmNkMDgyM2RkYWVhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5OZXd0b25icm9vayAsV2lsbG93ZGFsZSBDbHVzdGVyIDAuMDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZTcyZGQ0NDFkMzJjNGViYWI4NjYzMjQ5NTA3NDA5NDcuc2V0Q29udGVudChodG1sX2NlM2NiZGU1MDRlYjQwMmFhM2Y4MmNkMDgyM2RkYWVhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2QzOTQ3N2U2YTQ5NzQ3NDk4NjAzZDVjMTgyNjRmMTNlLmJpbmRQb3B1cChwb3B1cF9lNzJkZDQ0MWQzMmM0ZWJhYjg2NjMyNDk1MDc0MDk0Nyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81ODczYmZhMWIzNTU0NDY5OTEwMTRmNzU0YTc3OTdiMCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjc3MDExOTksLTc5LjQwODQ5Mjc5OTk5OTk4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiMzMzg4ZmYiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzM4OGZmIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzJlNzg2ZGU2OWRhMTRkODM4ZGZjMmI1OTgzNzhiYTdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2M1ZWU3ODY2YzAwNDRhMTA4YjdjNGVjYzhiNDAzYTNhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2IxNjFlZGQxZGNlNzQzZTQ4YzAwM2FmN2UyODUwNDk4ID0gJCgnPGRpdiBpZD0iaHRtbF9iMTYxZWRkMWRjZTc0M2U0OGMwMDNhZjdlMjg1MDQ5OCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+V2lsbG93ZGFsZSBTb3V0aCBDbHVzdGVyIDAuMDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYzVlZTc4NjZjMDA0NGExMDhiN2M0ZWNjOGI0MDNhM2Euc2V0Q29udGVudChodG1sX2IxNjFlZGQxZGNlNzQzZTQ4YzAwM2FmN2UyODUwNDk4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzU4NzNiZmExYjM1NTQ0Njk5MTAxNGY3NTRhNzc5N2IwLmJpbmRQb3B1cChwb3B1cF9jNWVlNzg2NmMwMDQ0YTEwOGI3YzRlY2M4YjQwM2EzYSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl83MjA1NjNmZmNiYTY0NTNkOWQ4MDM1OTBhZWUzY2Q0MiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjc1Mjc1ODMsLTc5LjQwMDA0OTNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzMzODhmZiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMzg4ZmYiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMmU3ODZkZTY5ZGExNGQ4MzhkZmMyYjU5ODM3OGJhN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYjcyNzczM2NjYjhmNGU2NGIxMzBiM2ViNzQ4NDYwYWQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMWU0MTM1OWFhNTIwNDkwNTk2Mzc4ODEyNWUxODdkYTcgPSAkKCc8ZGl2IGlkPSJodG1sXzFlNDEzNTlhYTUyMDQ5MDU5NjM3ODgxMjVlMTg3ZGE3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Zb3JrIE1pbGxzIFdlc3QgQ2x1c3RlciAxLjA8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2I3Mjc3MzNjY2I4ZjRlNjRiMTMwYjNlYjc0ODQ2MGFkLnNldENvbnRlbnQoaHRtbF8xZTQxMzU5YWE1MjA0OTA1OTYzNzg4MTI1ZTE4N2RhNyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl83MjA1NjNmZmNiYTY0NTNkOWQ4MDM1OTBhZWUzY2Q0Mi5iaW5kUG9wdXAocG9wdXBfYjcyNzczM2NjYjhmNGU2NGIxMzBiM2ViNzQ4NDYwYWQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMTY3ZDBlZDE3YTU3NGEzMjk0YTY4MzFkNzhlMDBkMDkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43ODI3MzY0LC03OS40NDIyNTkzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiMzMzg4ZmYiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzM4OGZmIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzJlNzg2ZGU2OWRhMTRkODM4ZGZjMmI1OTgzNzhiYTdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzZkMjhhZTNiMjAyYjQ0YzY5ZTQxYTNiNmY0Mzc4MDNhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2ExNWFhMzZhZGU2ZDRkOWZiZjc1MDZlNDIxOGM3YjYxID0gJCgnPGRpdiBpZD0iaHRtbF9hMTVhYTM2YWRlNmQ0ZDlmYmY3NTA2ZTQyMThjN2I2MSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+V2lsbG93ZGFsZSBXZXN0IENsdXN0ZXIgMC4wPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82ZDI4YWUzYjIwMmI0NGM2OWU0MWEzYjZmNDM3ODAzYS5zZXRDb250ZW50KGh0bWxfYTE1YWEzNmFkZTZkNGQ5ZmJmNzUwNmU0MjE4YzdiNjEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMTY3ZDBlZDE3YTU3NGEzMjk0YTY4MzFkNzhlMDBkMDkuYmluZFBvcHVwKHBvcHVwXzZkMjhhZTNiMjAyYjQ0YzY5ZTQxYTNiNmY0Mzc4MDNhKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2ZmZTBlZGRiNzM5ODQ4OGRiM2Q5ODgzODk5MzhjMTYxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzUzMjU4NiwtNzkuMzI5NjU2NV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjMzM4OGZmIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMzODhmZiIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8yZTc4NmRlNjlkYTE0ZDgzOGRmYzJiNTk4Mzc4YmE3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF84ZWFhODhmYTYxODA0MjE3OTA2M2RmYjUwYTMzM2I0ZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF81MzNiMGFkODA2NDI0NDAyYjJlYjcxODMxMmM1YzM4ZCA9ICQoJzxkaXYgaWQ9Imh0bWxfNTMzYjBhZDgwNjQyNDQwMmIyZWI3MTgzMTJjNWMzOGQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlBhcmt3b29kcyBDbHVzdGVyIDEuMDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOGVhYTg4ZmE2MTgwNDIxNzkwNjNkZmI1MGEzMzNiNGQuc2V0Q29udGVudChodG1sXzUzM2IwYWQ4MDY0MjQ0MDJiMmViNzE4MzEyYzVjMzhkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2ZmZTBlZGRiNzM5ODQ4OGRiM2Q5ODgzODk5MzhjMTYxLmJpbmRQb3B1cChwb3B1cF84ZWFhODhmYTYxODA0MjE3OTA2M2RmYjUwYTMzM2I0ZCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xMzc5YjhjMGMwYmY0YTVlOGY4NDY0NWMxMWM2ZjJkOCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjc0NTkwNTgsLTc5LjM1MjE4OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjMzM4OGZmIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMzODhmZiIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8yZTc4NmRlNjlkYTE0ZDgzOGRmYzJiNTk4Mzc4YmE3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zNmRiMjUyOWEwYTI0M2E1OGRmMzllNzFlYmMwNzIwMiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wYWMxNzJjM2QwYTU0ZWFiOGUwM2IyNTQxODZhYThkNCA9ICQoJzxkaXYgaWQ9Imh0bWxfMGFjMTcyYzNkMGE1NGVhYjhlMDNiMjU0MTg2YWE4ZDQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkRvbiBNaWxscyBOb3J0aCBDbHVzdGVyIDIuMDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMzZkYjI1MjlhMGEyNDNhNThkZjM5ZTcxZWJjMDcyMDIuc2V0Q29udGVudChodG1sXzBhYzE3MmMzZDBhNTRlYWI4ZTAzYjI1NDE4NmFhOGQ0KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzEzNzliOGMwYzBiZjRhNWU4Zjg0NjQ1YzExYzZmMmQ4LmJpbmRQb3B1cChwb3B1cF8zNmRiMjUyOWEwYTI0M2E1OGRmMzllNzFlYmMwNzIwMik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lN2I3MjBhMWQyOWQ0MTQ2OWZlZTQ2MWU5ZWU2MTFkMSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjcyNTg5OTcwMDAwMDAxLC03OS4zNDA5MjNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzMzODhmZiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMzg4ZmYiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMmU3ODZkZTY5ZGExNGQ4MzhkZmMyYjU5ODM3OGJhN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNDE2MTdkYTZhY2Y4NDVmYjhhZGNhOGU1ZTVkODM4OWYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNTBmMWE0NDNkMGY5NDhhOGI4Y2M2NjBlNzg1MjA3NGMgPSAkKCc8ZGl2IGlkPSJodG1sXzUwZjFhNDQzZDBmOTQ4YThiOGNjNjYwZTc4NTIwNzRjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5GbGVtaW5nZG9uIFBhcmsgLERvbiBNaWxscyBTb3V0aCBDbHVzdGVyIDAuMDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNDE2MTdkYTZhY2Y4NDVmYjhhZGNhOGU1ZTVkODM4OWYuc2V0Q29udGVudChodG1sXzUwZjFhNDQzZDBmOTQ4YThiOGNjNjYwZTc4NTIwNzRjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2U3YjcyMGExZDI5ZDQxNDY5ZmVlNDYxZTllZTYxMWQxLmJpbmRQb3B1cChwb3B1cF80MTYxN2RhNmFjZjg0NWZiOGFkY2E4ZTVlNWQ4Mzg5Zik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9iMWYxN2QyNzBmMGM0OTE2OWYyYjZmNDJkOWQxMzU2NSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjc1NDMyODMsLTc5LjQ0MjI1OTNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzMzODhmZiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMzg4ZmYiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMmU3ODZkZTY5ZGExNGQ4MzhkZmMyYjU5ODM3OGJhN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMGRlODNlZjc2OTYzNGRmZjkxOWU5NDI0MWFjMzY2YmYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMDdmMzFhNmU1NmIzNGM3M2E0Yzk4OGQ1NjJmZmYyODQgPSAkKCc8ZGl2IGlkPSJodG1sXzA3ZjMxYTZlNTZiMzRjNzNhNGM5ODhkNTYyZmZmMjg0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5CYXRodXJzdCBNYW5vciAsRG93bnN2aWV3IE5vcnRoICxXaWxzb24gSGVpZ2h0cyBDbHVzdGVyIDAuMDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMGRlODNlZjc2OTYzNGRmZjkxOWU5NDI0MWFjMzY2YmYuc2V0Q29udGVudChodG1sXzA3ZjMxYTZlNTZiMzRjNzNhNGM5ODhkNTYyZmZmMjg0KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2IxZjE3ZDI3MGYwYzQ5MTY5ZjJiNmY0MmQ5ZDEzNTY1LmJpbmRQb3B1cChwb3B1cF8wZGU4M2VmNzY5NjM0ZGZmOTE5ZTk0MjQxYWMzNjZiZik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xMjc0NTBlOTUyNWQ0ZWFlYjI3MjkyOGM3MjA0NjY3OSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjc2Nzk4MDMsLTc5LjQ4NzI2MTkwMDAwMDAyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiMzMzg4ZmYiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzM4OGZmIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzJlNzg2ZGU2OWRhMTRkODM4ZGZjMmI1OTgzNzhiYTdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzM2ZTE1ZTdiNGZhMDQxZTE4NzRhZTkyZjZlMjdhYzU2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzgyMzc0YmQ1MDc4MTQzZTM4MzYzYWY5MzMwZTRmOGMzID0gJCgnPGRpdiBpZD0iaHRtbF84MjM3NGJkNTA3ODE0M2UzODM2M2FmOTMzMGU0ZjhjMyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Tm9ydGh3b29kIFBhcmsgLFlvcmsgVW5pdmVyc2l0eSBDbHVzdGVyIDAuMDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMzZlMTVlN2I0ZmEwNDFlMTg3NGFlOTJmNmUyN2FjNTYuc2V0Q29udGVudChodG1sXzgyMzc0YmQ1MDc4MTQzZTM4MzYzYWY5MzMwZTRmOGMzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzEyNzQ1MGU5NTI1ZDRlYWViMjcyOTI4YzcyMDQ2Njc5LmJpbmRQb3B1cChwb3B1cF8zNmUxNWU3YjRmYTA0MWUxODc0YWU5MmY2ZTI3YWM1Nik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9iYWEyN2VlMDUwODA0ZDg2ODhkOTQxNDZmNWMwOTIzMSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjczNzQ3MzIsLTc5LjQ2NDc2MzI5OTk5OTk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiMzMzg4ZmYiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzM4OGZmIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzJlNzg2ZGU2OWRhMTRkODM4ZGZjMmI1OTgzNzhiYTdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2YwOWRkZTRjMjY3MzQ5NzQ5YmE2ZThjYTZiMjhkODJkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2EwYjNjODgyOGU5ZDRlNGViNDhjM2MwNTQ3YWRhZjM4ID0gJCgnPGRpdiBpZD0iaHRtbF9hMGIzYzg4MjhlOWQ0ZTRlYjQ4YzNjMDU0N2FkYWYzOCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q0ZCIFRvcm9udG8gLERvd25zdmlldyBFYXN0IENsdXN0ZXIgMS4wPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mMDlkZGU0YzI2NzM0OTc0OWJhNmU4Y2E2YjI4ZDgyZC5zZXRDb250ZW50KGh0bWxfYTBiM2M4ODI4ZTlkNGU0ZWI0OGMzYzA1NDdhZGFmMzgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYmFhMjdlZTA1MDgwNGQ4Njg4ZDk0MTQ2ZjVjMDkyMzEuYmluZFBvcHVwKHBvcHVwX2YwOWRkZTRjMjY3MzQ5NzQ5YmE2ZThjYTZiMjhkODJkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzQ2MWJhZTk2MjlhNjQwNzBhZGMyMDIwMzRhYWU2ZDUxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzM5MDE0NiwtNzkuNTA2OTQzNl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjMzM4OGZmIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMzODhmZiIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8yZTc4NmRlNjlkYTE0ZDgzOGRmYzJiNTk4Mzc4YmE3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iNTg4ODc1NmViZjc0MjQ5YjJkNjkyNjMyYzdjZWQyNCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zODQyMTgwNzBhNDY0NzQ0OTQ3MDU0ZTcyNmExYWJjNCA9ICQoJzxkaXYgaWQ9Imh0bWxfMzg0MjE4MDcwYTQ2NDc0NDk0NzA1NGU3MjZhMWFiYzQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkRvd25zdmlldyBXZXN0IENsdXN0ZXIgMi4wPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iNTg4ODc1NmViZjc0MjQ5YjJkNjkyNjMyYzdjZWQyNC5zZXRDb250ZW50KGh0bWxfMzg0MjE4MDcwYTQ2NDc0NDk0NzA1NGU3MjZhMWFiYzQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNDYxYmFlOTYyOWE2NDA3MGFkYzIwMjAzNGFhZTZkNTEuYmluZFBvcHVwKHBvcHVwX2I1ODg4NzU2ZWJmNzQyNDliMmQ2OTI2MzJjN2NlZDI0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzNkYWJhMDU5ODk0ODRmNzlhMTczOTlhNjdkOGE2OTk1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzI4NDk2NCwtNzkuNDk1Njk3NDAwMDAwMDNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzMzODhmZiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMzg4ZmYiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMmU3ODZkZTY5ZGExNGQ4MzhkZmMyYjU5ODM3OGJhN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMTc2MGU0NDU2NTVjNDcxOGJlN2ZhMjc1MmVmZmEwMjEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMWVkODYxODY1MmE5NGJiY2EzODZiOWE0ZmNmOTM4ZTAgPSAkKCc8ZGl2IGlkPSJodG1sXzFlZDg2MTg2NTJhOTRiYmNhMzg2YjlhNGZjZjkzOGUwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Eb3duc3ZpZXcgQ2VudHJhbCBDbHVzdGVyIDAuMDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMTc2MGU0NDU2NTVjNDcxOGJlN2ZhMjc1MmVmZmEwMjEuc2V0Q29udGVudChodG1sXzFlZDg2MTg2NTJhOTRiYmNhMzg2YjlhNGZjZjkzOGUwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzNkYWJhMDU5ODk0ODRmNzlhMTczOTlhNjdkOGE2OTk1LmJpbmRQb3B1cChwb3B1cF8xNzYwZTQ0NTY1NWM0NzE4YmU3ZmEyNzUyZWZmYTAyMSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9hMDJjNzgxMTgxNzc0OTUwYTk2YTQxNTIyYjMwZDYwZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjc2MTYzMTMsLTc5LjUyMDk5OTQwMDAwMDAyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiMzMzg4ZmYiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzM4OGZmIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzJlNzg2ZGU2OWRhMTRkODM4ZGZjMmI1OTgzNzhiYTdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2Q0ZmNmZmUyYjlkNzRkMmNiYTk2NjNlODU4OWQxYTVjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzNkZjkyZTIxNTE0YjRmZTdiNDFkMzgyOWJkMDhiYmJiID0gJCgnPGRpdiBpZD0iaHRtbF8zZGY5MmUyMTUxNGI0ZmU3YjQxZDM4MjliZDA4YmJiYiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RG93bnN2aWV3IE5vcnRod2VzdCBDbHVzdGVyIDIuMDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZDRmY2ZmZTJiOWQ3NGQyY2JhOTY2M2U4NTg5ZDFhNWMuc2V0Q29udGVudChodG1sXzNkZjkyZTIxNTE0YjRmZTdiNDFkMzgyOWJkMDhiYmJiKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2EwMmM3ODExODE3NzQ5NTBhOTZhNDE1MjJiMzBkNjBkLmJpbmRQb3B1cChwb3B1cF9kNGZjZmZlMmI5ZDc0ZDJjYmE5NjYzZTg1ODlkMWE1Yyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl84MmUzNGQ4MmMxNjI0NGZjOWMzODAyMzA2NGNjNDA4ZiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjcyNTg4MjMsLTc5LjMxNTU3MTU5OTk5OTk4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiMzMzg4ZmYiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzM4OGZmIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzJlNzg2ZGU2OWRhMTRkODM4ZGZjMmI1OTgzNzhiYTdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2VmNzIxN2FhNTk4ZTQxZjNhNDEyNmNlZmQ3MDUyNGYzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzk4OTJlM2UzNDBkNTRmYzlhMjUwYTM2ODhmNDhlNjI1ID0gJCgnPGRpdiBpZD0iaHRtbF85ODkyZTNlMzQwZDU0ZmM5YTI1MGEzNjg4ZjQ4ZTYyNSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+VmljdG9yaWEgVmlsbGFnZSBDbHVzdGVyIDAuMDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZWY3MjE3YWE1OThlNDFmM2E0MTI2Y2VmZDcwNTI0ZjMuc2V0Q29udGVudChodG1sXzk4OTJlM2UzNDBkNTRmYzlhMjUwYTM2ODhmNDhlNjI1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzgyZTM0ZDgyYzE2MjQ0ZmM5YzM4MDIzMDY0Y2M0MDhmLmJpbmRQb3B1cChwb3B1cF9lZjcyMTdhYTU5OGU0MWYzYTQxMjZjZWZkNzA1MjRmMyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81Y2FhZGI3NGE0MTE0MzY2YjBiZWEyMWFiYTUyOGE1NSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjcwNjM5NzIsLTc5LjMwOTkzN10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjMzM4OGZmIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMzODhmZiIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8yZTc4NmRlNjlkYTE0ZDgzOGRmYzJiNTk4Mzc4YmE3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xMDU3ZDVmMDY2MTE0ZGRlYTJlNDQ3ZjYxYzZkODBkMiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jZTljMTc4ZmVhMjg0NDNkOWM0NmVlMjJlZmU0ZWQ1NiA9ICQoJzxkaXYgaWQ9Imh0bWxfY2U5YzE3OGZlYTI4NDQzZDljNDZlZTIyZWZlNGVkNTYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPldvb2RiaW5lIEdhcmRlbnMgLFBhcmt2aWV3IEhpbGwgQ2x1c3RlciAyLjA8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzEwNTdkNWYwNjYxMTRkZGVhMmU0NDdmNjFjNmQ4MGQyLnNldENvbnRlbnQoaHRtbF9jZTljMTc4ZmVhMjg0NDNkOWM0NmVlMjJlZmU0ZWQ1Nik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81Y2FhZGI3NGE0MTE0MzY2YjBiZWEyMWFiYTUyOGE1NS5iaW5kUG9wdXAocG9wdXBfMTA1N2Q1ZjA2NjExNGRkZWEyZTQ0N2Y2MWM2ZDgwZDIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZTA2ZWU5M2Q3MzA1NDhmYjlmMDM4NTZkYzY4ZmJjYzkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42OTUzNDM5MDAwMDAwMSwtNzkuMzE4Mzg4N10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjMzM4OGZmIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMzODhmZiIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8yZTc4NmRlNjlkYTE0ZDgzOGRmYzJiNTk4Mzc4YmE3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iZWIzMjQ1Nzc4NTM0NzUyYWVlOGYwMmJiZmY0MDUzYSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wMzY1ZDA4NzcwMTU0MzNmYTk5NDNmOWFiZjFmMThiMSA9ICQoJzxkaXYgaWQ9Imh0bWxfMDM2NWQwODc3MDE1NDMzZmE5OTQzZjlhYmYxZjE4YjEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPldvb2RiaW5lIEhlaWdodHMgQ2x1c3RlciAwLjA8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2JlYjMyNDU3Nzg1MzQ3NTJhZWU4ZjAyYmJmZjQwNTNhLnNldENvbnRlbnQoaHRtbF8wMzY1ZDA4NzcwMTU0MzNmYTk5NDNmOWFiZjFmMThiMSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9lMDZlZTkzZDczMDU0OGZiOWYwMzg1NmRjNjhmYmNjOS5iaW5kUG9wdXAocG9wdXBfYmViMzI0NTc3ODUzNDc1MmFlZThmMDJiYmZmNDA1M2EpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNTk3YjdjZGQ4N2Q0NDQ2Y2I5NTk1OGEzMjgzNGQwZWUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42NzYzNTczOTk5OTk5OSwtNzkuMjkzMDMxMl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjMzM4OGZmIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMzODhmZiIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8yZTc4NmRlNjlkYTE0ZDgzOGRmYzJiNTk4Mzc4YmE3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9kYTE1NmEyYzlkYjA0Nzc0ODQ1NzVlNzk0YzRhYzRmZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF85YjBmMzlhNjBmNTY0M2M1OGFlZDFmYmI2OWYxMjEzYSA9ICQoJzxkaXYgaWQ9Imh0bWxfOWIwZjM5YTYwZjU2NDNjNThhZWQxZmJiNjlmMTIxM2EiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlRoZSBCZWFjaGVzIENsdXN0ZXIgMC4wPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kYTE1NmEyYzlkYjA0Nzc0ODQ1NzVlNzk0YzRhYzRmZC5zZXRDb250ZW50KGh0bWxfOWIwZjM5YTYwZjU2NDNjNThhZWQxZmJiNjlmMTIxM2EpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNTk3YjdjZGQ4N2Q0NDQ2Y2I5NTk1OGEzMjgzNGQwZWUuYmluZFBvcHVwKHBvcHVwX2RhMTU2YTJjOWRiMDQ3NzQ4NDU3NWU3OTRjNGFjNGZkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzhjZWQzZmU1ZjA2ZjRiNzliYjI1YTUwZGNlYzU2NzkzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzA5MDYwNCwtNzkuMzYzNDUxN10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjMzM4OGZmIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMzODhmZiIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8yZTc4NmRlNjlkYTE0ZDgzOGRmYzJiNTk4Mzc4YmE3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9jOWQ1ZjYwYWFkZTA0OTYwOWRmOWVlNTJiOWVkYWIzMyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hYWI2MjUxODQwYzg0OGZhYTAzZDNhYWRmNzhlMzMxMCA9ICQoJzxkaXYgaWQ9Imh0bWxfYWFiNjI1MTg0MGM4NDhmYWEwM2QzYWFkZjc4ZTMzMTAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkxlYXNpZGUgQ2x1c3RlciAwLjA8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2M5ZDVmNjBhYWRlMDQ5NjA5ZGY5ZWU1MmI5ZWRhYjMzLnNldENvbnRlbnQoaHRtbF9hYWI2MjUxODQwYzg0OGZhYTAzZDNhYWRmNzhlMzMxMCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl84Y2VkM2ZlNWYwNmY0Yjc5YmIyNWE1MGRjZWM1Njc5My5iaW5kUG9wdXAocG9wdXBfYzlkNWY2MGFhZGUwNDk2MDlkZjllZTUyYjllZGFiMzMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZTJkYTRlMjc3ODFlNDI1MmFjODdhZTVlZDM4OTVhYzUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43MDUzNjg5LC03OS4zNDkzNzE5MDAwMDAwMl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjMzM4OGZmIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMzODhmZiIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8yZTc4NmRlNjlkYTE0ZDgzOGRmYzJiNTk4Mzc4YmE3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF80NjgwNWM2YmNlZGM0YTk3YmFkZGE1ZTY4OWMyODZhOCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF81ZTQwNTgyM2QyMTM0NzdkOWRiOWMwNGEyNjMxYzE3NyA9ICQoJzxkaXYgaWQ9Imh0bWxfNWU0MDU4MjNkMjEzNDc3ZDlkYjljMDRhMjYzMWMxNzciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlRob3JuY2xpZmZlIFBhcmsgQ2x1c3RlciAwLjA8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzQ2ODA1YzZiY2VkYzRhOTdiYWRkYTVlNjg5YzI4NmE4LnNldENvbnRlbnQoaHRtbF81ZTQwNTgyM2QyMTM0NzdkOWRiOWMwNGEyNjMxYzE3Nyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9lMmRhNGUyNzc4MWU0MjUyYWM4N2FlNWVkMzg5NWFjNS5iaW5kUG9wdXAocG9wdXBfNDY4MDVjNmJjZWRjNGE5N2JhZGRhNWU2ODljMjg2YTgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMzBlMzk2ZTZlNzY5NDdkZWFlYjAyNDcwMzJmNGQwNGYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42ODUzNDcsLTc5LjMzODEwNjVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzMzODhmZiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMzg4ZmYiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMmU3ODZkZTY5ZGExNGQ4MzhkZmMyYjU5ODM3OGJhN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNjhiYzc5ZGNlOTUwNGQyNTgyODc0YTE3MWFkYzI2YjQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMTIxOGVmMzM3YTEwNDVjM2JhYjYyMmE0YTQwY2M1MWEgPSAkKCc8ZGl2IGlkPSJodG1sXzEyMThlZjMzN2ExMDQ1YzNiYWI2MjJhNGE0MGNjNTFhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5FYXN0IFRvcm9udG8gQ2x1c3RlciAxLjA8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzY4YmM3OWRjZTk1MDRkMjU4Mjg3NGExNzFhZGMyNmI0LnNldENvbnRlbnQoaHRtbF8xMjE4ZWYzMzdhMTA0NWMzYmFiNjIyYTRhNDBjYzUxYSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8zMGUzOTZlNmU3Njk0N2RlYWViMDI0NzAzMmY0ZDA0Zi5iaW5kUG9wdXAocG9wdXBfNjhiYzc5ZGNlOTUwNGQyNTgyODc0YTE3MWFkYzI2YjQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZTFmNDM3MTAyMDE2NGRmNGIwNTE0YTE5M2Y2YWNlZTQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42Nzk1NTcxLC03OS4zNTIxODhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzMzODhmZiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMzg4ZmYiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMmU3ODZkZTY5ZGExNGQ4MzhkZmMyYjU5ODM3OGJhN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNjU4Y2YyOWY5ZDk5NGUzZWJmNzI4ZmJkMDcwZTFmYjIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNTAwNDllMTQ1YTA4NDE0MWExNDhjNzY1OGJlNDcyMjMgPSAkKCc8ZGl2IGlkPSJodG1sXzUwMDQ5ZTE0NWEwODQxNDFhMTQ4Yzc2NThiZTQ3MjIzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5UaGUgRGFuZm9ydGggV2VzdCAsUml2ZXJkYWxlIENsdXN0ZXIgMC4wPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82NThjZjI5ZjlkOTk0ZTNlYmY3MjhmYmQwNzBlMWZiMi5zZXRDb250ZW50KGh0bWxfNTAwNDllMTQ1YTA4NDE0MWExNDhjNzY1OGJlNDcyMjMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZTFmNDM3MTAyMDE2NGRmNGIwNTE0YTE5M2Y2YWNlZTQuYmluZFBvcHVwKHBvcHVwXzY1OGNmMjlmOWQ5OTRlM2ViZjcyOGZiZDA3MGUxZmIyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2NlZTE5NmYzMWEzNzQxZmViYTcwNGZmMDMyNThlNTI5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjY4OTk4NSwtNzkuMzE1NTcxNTk5OTk5OThdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzMzODhmZiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMzg4ZmYiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMmU3ODZkZTY5ZGExNGQ4MzhkZmMyYjU5ODM3OGJhN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNGNhZGU1MzE2NjM1NGFjMTkzZDg2ZmQ1NWM1M2QwMDcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZDFiNzBmZmM0MDQzNDE5Y2FhNjFkZTczMjlmNTlhOTIgPSAkKCc8ZGl2IGlkPSJodG1sX2QxYjcwZmZjNDA0MzQxOWNhYTYxZGU3MzI5ZjU5YTkyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5UaGUgQmVhY2hlcyBXZXN0ICxJbmRpYSBCYXphYXIgQ2x1c3RlciAwLjA8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzRjYWRlNTMxNjYzNTRhYzE5M2Q4NmZkNTVjNTNkMDA3LnNldENvbnRlbnQoaHRtbF9kMWI3MGZmYzQwNDM0MTljYWE2MWRlNzMyOWY1OWE5Mik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9jZWUxOTZmMzFhMzc0MWZlYmE3MDRmZjAzMjU4ZTUyOS5iaW5kUG9wdXAocG9wdXBfNGNhZGU1MzE2NjM1NGFjMTkzZDg2ZmQ1NWM1M2QwMDcpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZWMxOWRjMDk3ODBmNDI0Mzk2ZjA3Nzg1ZTA5ZmJjOTEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42NTk1MjU1LC03OS4zNDA5MjNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzMzODhmZiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMzg4ZmYiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMmU3ODZkZTY5ZGExNGQ4MzhkZmMyYjU5ODM3OGJhN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOGUwMWYyNmVkNzRlNGYzOThjMzJkNzNiNDA5ZDIwYWQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMGI3ODBmOGM1MWJhNDgzYjgyNWQ3NzZjNDM0NGI5OGQgPSAkKCc8ZGl2IGlkPSJodG1sXzBiNzgwZjhjNTFiYTQ4M2I4MjVkNzc2YzQzNDRiOThkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5TdHVkaW8gRGlzdHJpY3QgQ2x1c3RlciAwLjA8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzhlMDFmMjZlZDc0ZTRmMzk4YzMyZDczYjQwOWQyMGFkLnNldENvbnRlbnQoaHRtbF8wYjc4MGY4YzUxYmE0ODNiODI1ZDc3NmM0MzQ0Yjk4ZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9lYzE5ZGMwOTc4MGY0MjQzOTZmMDc3ODVlMDlmYmM5MS5iaW5kUG9wdXAocG9wdXBfOGUwMWYyNmVkNzRlNGYzOThjMzJkNzNiNDA5ZDIwYWQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNjFlNGJhZmI2ZTYwNDY4YTlhYzBjMmNiZTQzN2Q3NzUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43MjgwMjA1LC03OS4zODg3OTAxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiMzMzg4ZmYiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzM4OGZmIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzJlNzg2ZGU2OWRhMTRkODM4ZGZjMmI1OTgzNzhiYTdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzY5YWRmMDE5YTE5MjQzNzg5YzE0ZWU5YTI3YTcwZTMyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2Q0YzMzZGUzZDU0OTQzNjU4Mjc4OTlmYTkwYmFjMzRlID0gJCgnPGRpdiBpZD0iaHRtbF9kNGMzM2RlM2Q1NDk0MzY1ODI3ODk5ZmE5MGJhYzM0ZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TGF3cmVuY2UgUGFyayBDbHVzdGVyIDEuMDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNjlhZGYwMTlhMTkyNDM3ODljMTRlZTlhMjdhNzBlMzIuc2V0Q29udGVudChodG1sX2Q0YzMzZGUzZDU0OTQzNjU4Mjc4OTlmYTkwYmFjMzRlKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzYxZTRiYWZiNmU2MDQ2OGE5YWMwYzJjYmU0MzdkNzc1LmJpbmRQb3B1cChwb3B1cF82OWFkZjAxOWExOTI0Mzc4OWMxNGVlOWEyN2E3MGUzMik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl83N2IwOWE4YTg1N2Y0ODA4YmY2YTg0ZmYyOWFjN2Y5ZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjcxMjc1MTEsLTc5LjM5MDE5NzVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzMzODhmZiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMzg4ZmYiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMmU3ODZkZTY5ZGExNGQ4MzhkZmMyYjU5ODM3OGJhN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYzM4ZThiOTEwMGQwNDUzZmFlOWM3MDFhMzBmZTAzMDAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMjMyM2Q2MjJlMjFlNDQ0NDkwODJjN2Q3NTdjMmZmZmMgPSAkKCc8ZGl2IGlkPSJodG1sXzIzMjNkNjIyZTIxZTQ0NDQ5MDgyYzdkNzU3YzJmZmZjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5EYXZpc3ZpbGxlIE5vcnRoIENsdXN0ZXIgMC4wPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jMzhlOGI5MTAwZDA0NTNmYWU5YzcwMWEzMGZlMDMwMC5zZXRDb250ZW50KGh0bWxfMjMyM2Q2MjJlMjFlNDQ0NDkwODJjN2Q3NTdjMmZmZmMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNzdiMDlhOGE4NTdmNDgwOGJmNmE4NGZmMjlhYzdmOWQuYmluZFBvcHVwKHBvcHVwX2MzOGU4YjkxMDBkMDQ1M2ZhZTljNzAxYTMwZmUwMzAwKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2YxOGIxZDZlMjg5YzRlNGVhMzYwODRiNTNlZTBhMTljID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzE1MzgzNCwtNzkuNDA1Njc4NDAwMDAwMDFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzMzODhmZiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMzg4ZmYiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMmU3ODZkZTY5ZGExNGQ4MzhkZmMyYjU5ODM3OGJhN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYTI4MWU0MWY3Yzc4NDkxNTkyOTZkM2Q3YzZkMjFlMzYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYjM4ODA0YmE4YjhlNDJhZmFmODg0YTA2MWVmZjg0NTAgPSAkKCc8ZGl2IGlkPSJodG1sX2IzODgwNGJhOGI4ZTQyYWZhZjg4NGEwNjFlZmY4NDUwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Ob3J0aCBUb3JvbnRvIFdlc3QgQ2x1c3RlciAwLjA8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2EyODFlNDFmN2M3ODQ5MTU5Mjk2ZDNkN2M2ZDIxZTM2LnNldENvbnRlbnQoaHRtbF9iMzg4MDRiYThiOGU0MmFmYWY4ODRhMDYxZWZmODQ1MCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9mMThiMWQ2ZTI4OWM0ZTRlYTM2MDg0YjUzZWUwYTE5Yy5iaW5kUG9wdXAocG9wdXBfYTI4MWU0MWY3Yzc4NDkxNTkyOTZkM2Q3YzZkMjFlMzYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfN2YyZTNmZGNmMDRiNDBiMGI1OGM1MmYzNDcwNjk2NjIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43MDQzMjQ0LC03OS4zODg3OTAxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiMzMzg4ZmYiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzM4OGZmIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzJlNzg2ZGU2OWRhMTRkODM4ZGZjMmI1OTgzNzhiYTdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzZiMWFkNjY2YWUwODQ5NmQ5ZTYwMmIyZGMyOGIyOGY5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzA1MGVlZjA4NmQ2MjQ4NjE5OWZkNTIwNGNhY2IzMjA3ID0gJCgnPGRpdiBpZD0iaHRtbF8wNTBlZWYwODZkNjI0ODYxOTlmZDUyMDRjYWNiMzIwNyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RGF2aXN2aWxsZSBDbHVzdGVyIDAuMDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNmIxYWQ2NjZhZTA4NDk2ZDllNjAyYjJkYzI4YjI4Zjkuc2V0Q29udGVudChodG1sXzA1MGVlZjA4NmQ2MjQ4NjE5OWZkNTIwNGNhY2IzMjA3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzdmMmUzZmRjZjA0YjQwYjBiNThjNTJmMzQ3MDY5NjYyLmJpbmRQb3B1cChwb3B1cF82YjFhZDY2NmFlMDg0OTZkOWU2MDJiMmRjMjhiMjhmOSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jYjY0NzAyNjFkNWQ0NjRjYTdlZDY3MGY2YTJiNDlmYSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY4OTU3NDMsLTc5LjM4MzE1OTkwMDAwMDAyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiMzMzg4ZmYiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzM4OGZmIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzJlNzg2ZGU2OWRhMTRkODM4ZGZjMmI1OTgzNzhiYTdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2Y0NDUwNmYzNDZiZjQ5ODA4ODRlZjY4NWMxZjBkODUyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2Y2Y2IxOWQ0NzQ0OTRiZWI4YzY2MzFmNGVlOGY4NjM5ID0gJCgnPGRpdiBpZD0iaHRtbF9mNmNiMTlkNDc0NDk0YmViOGM2NjMxZjRlZThmODYzOSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TW9vcmUgUGFyayAsU3VtbWVyaGlsbCBFYXN0IENsdXN0ZXIgMS4wPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mNDQ1MDZmMzQ2YmY0OTgwODg0ZWY2ODVjMWYwZDg1Mi5zZXRDb250ZW50KGh0bWxfZjZjYjE5ZDQ3NDQ5NGJlYjhjNjYzMWY0ZWU4Zjg2MzkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfY2I2NDcwMjYxZDVkNDY0Y2E3ZWQ2NzBmNmEyYjQ5ZmEuYmluZFBvcHVwKHBvcHVwX2Y0NDUwNmYzNDZiZjQ5ODA4ODRlZjY4NWMxZjBkODUyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzg3YThjNDMzYTZlZTRjNzU5ZDRlMDJhNGQ5Y2FkZTVmID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjg2NDEyMjk5OTk5OTksLTc5LjQwMDA0OTNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzMzODhmZiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMzg4ZmYiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMmU3ODZkZTY5ZGExNGQ4MzhkZmMyYjU5ODM3OGJhN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNzVjMTQzNzA4NDBhNDQ2Yjg0MjhhNTY1MGZlZmQxNDQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMWE5ZTM0NGJkZDBmNDUyMmI1NTA4YjU2ZGE4MmFhMTUgPSAkKCc8ZGl2IGlkPSJodG1sXzFhOWUzNDRiZGQwZjQ1MjJiNTUwOGI1NmRhODJhYTE1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5EZWVyIFBhcmsgLEZvcmVzdCBIaWxsIFNFICxSYXRobmVsbHkgLFNvdXRoIEhpbGwgLFN1bW1lcmhpbGwgV2VzdCBDbHVzdGVyIDAuMDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNzVjMTQzNzA4NDBhNDQ2Yjg0MjhhNTY1MGZlZmQxNDQuc2V0Q29udGVudChodG1sXzFhOWUzNDRiZGQwZjQ1MjJiNTUwOGI1NmRhODJhYTE1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzg3YThjNDMzYTZlZTRjNzU5ZDRlMDJhNGQ5Y2FkZTVmLmJpbmRQb3B1cChwb3B1cF83NWMxNDM3MDg0MGE0NDZiODQyOGE1NjUwZmVmZDE0NCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jMzlmMTMzODgxZDc0M2FiOGQ1NmIwZWVkMDM1YTVlYiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY3OTU2MjYsLTc5LjM3NzUyOTQwMDAwMDAxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiMzMzg4ZmYiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzM4OGZmIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzJlNzg2ZGU2OWRhMTRkODM4ZGZjMmI1OTgzNzhiYTdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2M1MmZiYjA4ODNjZDRjMmM5NTZkNjYwNTY2ZDU4ZWUwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzM1ZTRhZmE3MDYxNTRhYjY4MTgyN2I2NTUzYzkwMTAxID0gJCgnPGRpdiBpZD0iaHRtbF8zNWU0YWZhNzA2MTU0YWI2ODE4MjdiNjU1M2M5MDEwMSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Um9zZWRhbGUgQ2x1c3RlciAxLjA8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2M1MmZiYjA4ODNjZDRjMmM5NTZkNjYwNTY2ZDU4ZWUwLnNldENvbnRlbnQoaHRtbF8zNWU0YWZhNzA2MTU0YWI2ODE4MjdiNjU1M2M5MDEwMSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9jMzlmMTMzODgxZDc0M2FiOGQ1NmIwZWVkMDM1YTVlYi5iaW5kUG9wdXAocG9wdXBfYzUyZmJiMDg4M2NkNGMyYzk1NmQ2NjA1NjZkNThlZTApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNGQ0YmQ4ZGUyNWE3NDBlOWI0MDU3NjhiNzFhMGRlMDYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42Njc5NjcsLTc5LjM2NzY3NTNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzMzODhmZiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMzg4ZmYiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMmU3ODZkZTY5ZGExNGQ4MzhkZmMyYjU5ODM3OGJhN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMDAyOThhOGI0MjM5NDVmMmI1NzgyN2NlMzM4ZDhlMWMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZDhhNTgwMTE0YWJmNGJlN2I1YmZiMWY4NmQ5ZDA3OWIgPSAkKCc8ZGl2IGlkPSJodG1sX2Q4YTU4MDExNGFiZjRiZTdiNWJmYjFmODZkOWQwNzliIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DYWJiYWdldG93biAsU3QuIEphbWVzIFRvd24gQ2x1c3RlciAwLjA8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzAwMjk4YThiNDIzOTQ1ZjJiNTc4MjdjZTMzOGQ4ZTFjLnNldENvbnRlbnQoaHRtbF9kOGE1ODAxMTRhYmY0YmU3YjViZmIxZjg2ZDlkMDc5Yik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl80ZDRiZDhkZTI1YTc0MGU5YjQwNTc2OGI3MWEwZGUwNi5iaW5kUG9wdXAocG9wdXBfMDAyOThhOGI0MjM5NDVmMmI1NzgyN2NlMzM4ZDhlMWMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfODIyM2MzMmJmOGIwNDEzMDhhYThkMzU1ZDFmNTA2ODAgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42NjU4NTk5LC03OS4zODMxNTk5MDAwMDAwMl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjMzM4OGZmIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMzODhmZiIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8yZTc4NmRlNjlkYTE0ZDgzOGRmYzJiNTk4Mzc4YmE3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xNDRhZTA5ZDAyNjM0MzFlYTU3NGE3ZmI0NGM5Y2E1ZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zMTkxNjY0YTNmNjM0OTU0Yjk0OTQ3NmQzZmMzMzVhMCA9ICQoJzxkaXYgaWQ9Imh0bWxfMzE5MTY2NGEzZjYzNDk1NGI5NDk0NzZkM2ZjMzM1YTAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNodXJjaCBhbmQgV2VsbGVzbGV5IENsdXN0ZXIgMC4wPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xNDRhZTA5ZDAyNjM0MzFlYTU3NGE3ZmI0NGM5Y2E1Zi5zZXRDb250ZW50KGh0bWxfMzE5MTY2NGEzZjYzNDk1NGI5NDk0NzZkM2ZjMzM1YTApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfODIyM2MzMmJmOGIwNDEzMDhhYThkMzU1ZDFmNTA2ODAuYmluZFBvcHVwKHBvcHVwXzE0NGFlMDlkMDI2MzQzMWVhNTc0YTdmYjQ0YzljYTVmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzU0MDllNmNhODY1NTQ4Yzk5NWMwNDhmZTM3MDMzMDU3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjU0MjU5OSwtNzkuMzYwNjM1OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjMzM4OGZmIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMzODhmZiIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8yZTc4NmRlNjlkYTE0ZDgzOGRmYzJiNTk4Mzc4YmE3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xZTQ3ZjAxNmIyY2E0MTkxOThjZWEyNDI0MDcxOGM0NiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF85YTc5ZTI5Njc2ODI0ZWU2YjQ4ZDhmNmNmNTM3ZjI0MiA9ICQoJzxkaXYgaWQ9Imh0bWxfOWE3OWUyOTY3NjgyNGVlNmI0OGQ4ZjZjZjUzN2YyNDIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkhhcmJvdXJmcm9udCBDbHVzdGVyIDAuMDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMWU0N2YwMTZiMmNhNDE5MTk4Y2VhMjQyNDA3MThjNDYuc2V0Q29udGVudChodG1sXzlhNzllMjk2NzY4MjRlZTZiNDhkOGY2Y2Y1MzdmMjQyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzU0MDllNmNhODY1NTQ4Yzk5NWMwNDhmZTM3MDMzMDU3LmJpbmRQb3B1cChwb3B1cF8xZTQ3ZjAxNmIyY2E0MTkxOThjZWEyNDI0MDcxOGM0Nik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lZGEyMmMxYTNkNGM0OTRkYjNkMTIyYzQ5NDU5ZGY2ZiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY1NzE2MTgsLTc5LjM3ODkzNzA5OTk5OTk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiMzMzg4ZmYiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzM4OGZmIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzJlNzg2ZGU2OWRhMTRkODM4ZGZjMmI1OTgzNzhiYTdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzk0YzdiMjczOWZjYTRkZWRhMzViNTRiMGQ4ZTkzNWEwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzUxMGZjYzViMjU5OTRkMTY5NzIwZDlkZGQzMzQ4OGU0ID0gJCgnPGRpdiBpZD0iaHRtbF81MTBmY2M1YjI1OTk0ZDE2OTcyMGQ5ZGRkMzM0ODhlNCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UnllcnNvbiAsR2FyZGVuIERpc3RyaWN0IENsdXN0ZXIgMC4wPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85NGM3YjI3MzlmY2E0ZGVkYTM1YjU0YjBkOGU5MzVhMC5zZXRDb250ZW50KGh0bWxfNTEwZmNjNWIyNTk5NGQxNjk3MjBkOWRkZDMzNDg4ZTQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZWRhMjJjMWEzZDRjNDk0ZGIzZDEyMmM0OTQ1OWRmNmYuYmluZFBvcHVwKHBvcHVwXzk0YzdiMjczOWZjYTRkZWRhMzViNTRiMGQ4ZTkzNWEwKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzUwZTk1MDk1ZDRlNzRhMTM4NTJiYTUyZTYwZWFkNGUzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjUxNDkzOSwtNzkuMzc1NDE3OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjMzM4OGZmIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMzODhmZiIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8yZTc4NmRlNjlkYTE0ZDgzOGRmYzJiNTk4Mzc4YmE3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8yZGE0ZmIxMTRlYzE0YzdlOWY4MmViODE4NDhhMDFiNiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wMGMwZWVmODZlYWU0OWQzODAxNDM5Y2M4NWVlN2U3YSA9ICQoJzxkaXYgaWQ9Imh0bWxfMDBjMGVlZjg2ZWFlNDlkMzgwMTQzOWNjODVlZTdlN2EiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlN0LiBKYW1lcyBUb3duIENsdXN0ZXIgMC4wPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yZGE0ZmIxMTRlYzE0YzdlOWY4MmViODE4NDhhMDFiNi5zZXRDb250ZW50KGh0bWxfMDBjMGVlZjg2ZWFlNDlkMzgwMTQzOWNjODVlZTdlN2EpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNTBlOTUwOTVkNGU3NGExMzg1MmJhNTJlNjBlYWQ0ZTMuYmluZFBvcHVwKHBvcHVwXzJkYTRmYjExNGVjMTRjN2U5ZjgyZWI4MTg0OGEwMWI2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2IxNDFkMGQ3MDEwOTQ1YTc4MzZkMWViN2VjZWU4MjM1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjQ0NzcwOCwtNzkuMzczMzA2NF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjMzM4OGZmIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMzODhmZiIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8yZTc4NmRlNjlkYTE0ZDgzOGRmYzJiNTk4Mzc4YmE3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zOTY4MDllYTA5YTc0ZDZiYjU2OTk0NTU3OTM1ZDZjMCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82NDY0YTM5YzhlODY0M2JjODljNWMzNGY4Njk1ZGFmNiA9ICQoJzxkaXYgaWQ9Imh0bWxfNjQ2NGEzOWM4ZTg2NDNiYzg5YzVjMzRmODY5NWRhZjYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkJlcmN6eSBQYXJrIENsdXN0ZXIgMC4wPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zOTY4MDllYTA5YTc0ZDZiYjU2OTk0NTU3OTM1ZDZjMC5zZXRDb250ZW50KGh0bWxfNjQ2NGEzOWM4ZTg2NDNiYzg5YzVjMzRmODY5NWRhZjYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYjE0MWQwZDcwMTA5NDVhNzgzNmQxZWI3ZWNlZTgyMzUuYmluZFBvcHVwKHBvcHVwXzM5NjgwOWVhMDlhNzRkNmJiNTY5OTQ1NTc5MzVkNmMwKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzJjY2YxNDY5NGEwMTRlZmRhM2NkYTU1NThlMGIyYTY4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjU3OTUyNCwtNzkuMzg3MzgyNl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjMzM4OGZmIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMzODhmZiIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8yZTc4NmRlNjlkYTE0ZDgzOGRmYzJiNTk4Mzc4YmE3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hZGI2NDRjZTQ4MzU0NzAxYTdmODE3ZGNmNTkyMTNkNiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kMDU1NmEzOTU0YmQ0ZjQ2YTEwZjE4ZDdiZmRjMDAwOSA9ICQoJzxkaXYgaWQ9Imh0bWxfZDA1NTZhMzk1NGJkNGY0NmExMGYxOGQ3YmZkYzAwMDkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNlbnRyYWwgQmF5IFN0cmVldCBDbHVzdGVyIDAuMDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYWRiNjQ0Y2U0ODM1NDcwMWE3ZjgxN2RjZjU5MjEzZDYuc2V0Q29udGVudChodG1sX2QwNTU2YTM5NTRiZDRmNDZhMTBmMThkN2JmZGMwMDA5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzJjY2YxNDY5NGEwMTRlZmRhM2NkYTU1NThlMGIyYTY4LmJpbmRQb3B1cChwb3B1cF9hZGI2NDRjZTQ4MzU0NzAxYTdmODE3ZGNmNTkyMTNkNik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lYWI1OTJkYzk3YjQ0YjQ1OTdiOTliM2Y4MTVhNjQxMSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY1MDU3MTIwMDAwMDAxLC03OS4zODQ1Njc1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiMzMzg4ZmYiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzM4OGZmIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzJlNzg2ZGU2OWRhMTRkODM4ZGZjMmI1OTgzNzhiYTdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2VmMWY3NDNjZWNmMDQzMWI5ZWY3YzdlNmU1MjAxZmI3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2Y5MjBlZDFkNTdjNzRlN2FhNTA1MjQ0ZWNkMmJjMWRhID0gJCgnPGRpdiBpZD0iaHRtbF9mOTIwZWQxZDU3Yzc0ZTdhYTUwNTI0NGVjZDJiYzFkYSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QWRlbGFpZGUgLEtpbmcgLFJpY2htb25kIENsdXN0ZXIgMC4wPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lZjFmNzQzY2VjZjA0MzFiOWVmN2M3ZTZlNTIwMWZiNy5zZXRDb250ZW50KGh0bWxfZjkyMGVkMWQ1N2M3NGU3YWE1MDUyNDRlY2QyYmMxZGEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZWFiNTkyZGM5N2I0NGI0NTk3Yjk5YjNmODE1YTY0MTEuYmluZFBvcHVwKHBvcHVwX2VmMWY3NDNjZWNmMDQzMWI5ZWY3YzdlNmU1MjAxZmI3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzdlZmIxNmIyMjdkYzQ1OGFhODI3NGIyZWY1MWI5MTZhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjQwODE1NywtNzkuMzgxNzUyMjk5OTk5OTddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzMzODhmZiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMzg4ZmYiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMmU3ODZkZTY5ZGExNGQ4MzhkZmMyYjU5ODM3OGJhN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNmFkNWIyNTkwNDNhNGMwMGFhYTg4NWE0N2NmMzM2ZDIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNmI0MzM1MmEwYzFjNDI5OGI5NGUzNzI4MzYyMWJmZDYgPSAkKCc8ZGl2IGlkPSJodG1sXzZiNDMzNTJhMGMxYzQyOThiOTRlMzcyODM2MjFiZmQ2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5IYXJib3VyZnJvbnQgRWFzdCAsVG9yb250byBJc2xhbmRzICxVbmlvbiBTdGF0aW9uIENsdXN0ZXIgMC4wPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82YWQ1YjI1OTA0M2E0YzAwYWFhODg1YTQ3Y2YzMzZkMi5zZXRDb250ZW50KGh0bWxfNmI0MzM1MmEwYzFjNDI5OGI5NGUzNzI4MzYyMWJmZDYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfN2VmYjE2YjIyN2RjNDU4YWE4Mjc0YjJlZjUxYjkxNmEuYmluZFBvcHVwKHBvcHVwXzZhZDViMjU5MDQzYTRjMDBhYWE4ODVhNDdjZjMzNmQyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2E5ZmE5ODlhN2Q3MjQyZjFiYjA5NmM2NGJhNjlmZWYwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjQ3MTc2OCwtNzkuMzgxNTc2NDAwMDAwMDFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzMzODhmZiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMzg4ZmYiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMmU3ODZkZTY5ZGExNGQ4MzhkZmMyYjU5ODM3OGJhN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZjZjMjVjNzdiZjgxNGRhZTkwZjIwNThhNDNhNjAyNDcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMjE2NWM3ZmY1ZGEyNDBmNmEwMGEzYWRhYjg0ZGJiNmQgPSAkKCc8ZGl2IGlkPSJodG1sXzIxNjVjN2ZmNWRhMjQwZjZhMDBhM2FkYWI4NGRiYjZkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5EZXNpZ24gRXhjaGFuZ2UgLFRvcm9udG8gRG9taW5pb24gQ2VudHJlIENsdXN0ZXIgMC4wPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mNmMyNWM3N2JmODE0ZGFlOTBmMjA1OGE0M2E2MDI0Ny5zZXRDb250ZW50KGh0bWxfMjE2NWM3ZmY1ZGEyNDBmNmEwMGEzYWRhYjg0ZGJiNmQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYTlmYTk4OWE3ZDcyNDJmMWJiMDk2YzY0YmE2OWZlZjAuYmluZFBvcHVwKHBvcHVwX2Y2YzI1Yzc3YmY4MTRkYWU5MGYyMDU4YTQzYTYwMjQ3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2ViZWQyZWVjZmU1OTRiMjk4MWY2MzYwNTBlMTMzYjY3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjQ4MTk4NSwtNzkuMzc5ODE2OTAwMDAwMDJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzMzODhmZiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMzg4ZmYiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMmU3ODZkZTY5ZGExNGQ4MzhkZmMyYjU5ODM3OGJhN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZThiOGFjZGM1N2Q3NDFmM2I2NDFlOWMwOTBhZWQ5MTUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMWViNTUyNDlhZmU0NGQwNGE1NTUyMjIzOTQ2NjE2YWUgPSAkKCc8ZGl2IGlkPSJodG1sXzFlYjU1MjQ5YWZlNDRkMDRhNTU1MjIyMzk0NjYxNmFlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Db21tZXJjZSBDb3VydCAsVmljdG9yaWEgSG90ZWwgQ2x1c3RlciAwLjA8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2U4YjhhY2RjNTdkNzQxZjNiNjQxZTljMDkwYWVkOTE1LnNldENvbnRlbnQoaHRtbF8xZWI1NTI0OWFmZTQ0ZDA0YTU1NTIyMjM5NDY2MTZhZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9lYmVkMmVlY2ZlNTk0YjI5ODFmNjM2MDUwZTEzM2I2Ny5iaW5kUG9wdXAocG9wdXBfZThiOGFjZGM1N2Q3NDFmM2I2NDFlOWMwOTBhZWQ5MTUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMzhjYzEzY2Q2ZTMyNDJkNzlmMTQxODk5ODNmMWY2MmQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43MzMyODI1LC03OS40MTk3NDk3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiMzMzg4ZmYiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzM4OGZmIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzJlNzg2ZGU2OWRhMTRkODM4ZGZjMmI1OTgzNzhiYTdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzNmYjdlNzk3NzEwNDQ3ZDY4YzdmMzBlMTgxNTllODliID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzc0N2RiOGZlOTIzMTRlMGRiNWFjNjRkNWI2Y2EyZGNlID0gJCgnPGRpdiBpZD0iaHRtbF83NDdkYjhmZTkyMzE0ZTBkYjVhYzY0ZDViNmNhMmRjZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QmVkZm9yZCBQYXJrICxMYXdyZW5jZSBNYW5vciBFYXN0IENsdXN0ZXIgMC4wPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zZmI3ZTc5NzcxMDQ0N2Q2OGM3ZjMwZTE4MTU5ZTg5Yi5zZXRDb250ZW50KGh0bWxfNzQ3ZGI4ZmU5MjMxNGUwZGI1YWM2NGQ1YjZjYTJkY2UpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMzhjYzEzY2Q2ZTMyNDJkNzlmMTQxODk5ODNmMWY2MmQuYmluZFBvcHVwKHBvcHVwXzNmYjdlNzk3NzEwNDQ3ZDY4YzdmMzBlMTgxNTllODliKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzBjNDY4YWE3Y2JmNTQ1MWRiMGExYWIyMDJmYTBjYTJjID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzExNjk0OCwtNzkuNDE2OTM1NTk5OTk5OTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzMzODhmZiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMzg4ZmYiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMmU3ODZkZTY5ZGExNGQ4MzhkZmMyYjU5ODM3OGJhN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNjVkYmFjZmMyNDg0NDMyMTg5YjU5YjdkMDQ1ODUyMTAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNjc3MGE1NzViYjEyNDU0NDk5MDM2NDZjNGEwZjI4MGIgPSAkKCc8ZGl2IGlkPSJodG1sXzY3NzBhNTc1YmIxMjQ1NDQ5OTAzNjQ2YzRhMGYyODBiIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Sb3NlbGF3biBDbHVzdGVyIDAuMDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNjVkYmFjZmMyNDg0NDMyMTg5YjU5YjdkMDQ1ODUyMTAuc2V0Q29udGVudChodG1sXzY3NzBhNTc1YmIxMjQ1NDQ5OTAzNjQ2YzRhMGYyODBiKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzBjNDY4YWE3Y2JmNTQ1MWRiMGExYWIyMDJmYTBjYTJjLmJpbmRQb3B1cChwb3B1cF82NWRiYWNmYzI0ODQ0MzIxODliNTliN2QwNDU4NTIxMCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8yZmJjYzhiNTk3MWY0NGM4OGFmZWQyMzg3NDM1N2NiYSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY5Njk0NzYsLTc5LjQxMTMwNzIwMDAwMDAyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiMzMzg4ZmYiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzM4OGZmIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzJlNzg2ZGU2OWRhMTRkODM4ZGZjMmI1OTgzNzhiYTdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzg3Nzc3NTE1OTAxNzQ3ZTJiZTE3YmI3MzBjNWVlZTcxID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzQ0OTA1ZWZhY2U2NTQzZjM5NmFkMGUwY2JmMzljMTBiID0gJCgnPGRpdiBpZD0iaHRtbF80NDkwNWVmYWNlNjU0M2YzOTZhZDBlMGNiZjM5YzEwYiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Rm9yZXN0IEhpbGwgTm9ydGggLEZvcmVzdCBIaWxsIFdlc3QgQ2x1c3RlciAxLjA8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzg3Nzc3NTE1OTAxNzQ3ZTJiZTE3YmI3MzBjNWVlZTcxLnNldENvbnRlbnQoaHRtbF80NDkwNWVmYWNlNjU0M2YzOTZhZDBlMGNiZjM5YzEwYik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8yZmJjYzhiNTk3MWY0NGM4OGFmZWQyMzg3NDM1N2NiYS5iaW5kUG9wdXAocG9wdXBfODc3Nzc1MTU5MDE3NDdlMmJlMTdiYjczMGM1ZWVlNzEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfM2UzYjBlMmJmODI4NGMzYzlhY2IzZmQ5MDUxZTg0MGYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42NzI3MDk3LC03OS40MDU2Nzg0MDAwMDAwMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjMzM4OGZmIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMzODhmZiIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8yZTc4NmRlNjlkYTE0ZDgzOGRmYzJiNTk4Mzc4YmE3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wY2ZiYmVhNjYwNWM0Mjk1YjUxMzFlYTNmYzVjOWYxZSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83ZDlkMmUzZWRmZTI0MmMyOTc4YmQzZTc3MDJmYmM1YiA9ICQoJzxkaXYgaWQ9Imh0bWxfN2Q5ZDJlM2VkZmUyNDJjMjk3OGJkM2U3NzAyZmJjNWIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlRoZSBBbm5leCAsTm9ydGggTWlkdG93biAsWW9ya3ZpbGxlIENsdXN0ZXIgMC4wPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wY2ZiYmVhNjYwNWM0Mjk1YjUxMzFlYTNmYzVjOWYxZS5zZXRDb250ZW50KGh0bWxfN2Q5ZDJlM2VkZmUyNDJjMjk3OGJkM2U3NzAyZmJjNWIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfM2UzYjBlMmJmODI4NGMzYzlhY2IzZmQ5MDUxZTg0MGYuYmluZFBvcHVwKHBvcHVwXzBjZmJiZWE2NjA1YzQyOTViNTEzMWVhM2ZjNWM5ZjFlKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzg4MDNmN2YyZGM3MDQ2ODJhZWZlZTI2Y2JkYmU5Nzg3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjYyNjk1NiwtNzkuNDAwMDQ5M10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjMzM4OGZmIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMzODhmZiIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8yZTc4NmRlNjlkYTE0ZDgzOGRmYzJiNTk4Mzc4YmE3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hMDkwNzI0ZDNiNWQ0MzZmYTdmNTI2NjE1YTUwNTFhMSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lZDY2M2EwNzNjN2Q0N2Q2YTgxMjY2NDNkYjI0ZTYyMyA9ICQoJzxkaXYgaWQ9Imh0bWxfZWQ2NjNhMDczYzdkNDdkNmE4MTI2NjQzZGIyNGU2MjMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkhhcmJvcmQgLFVuaXZlcnNpdHkgb2YgVG9yb250byBDbHVzdGVyIDAuMDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYTA5MDcyNGQzYjVkNDM2ZmE3ZjUyNjYxNWE1MDUxYTEuc2V0Q29udGVudChodG1sX2VkNjYzYTA3M2M3ZDQ3ZDZhODEyNjY0M2RiMjRlNjIzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzg4MDNmN2YyZGM3MDQ2ODJhZWZlZTI2Y2JkYmU5Nzg3LmJpbmRQb3B1cChwb3B1cF9hMDkwNzI0ZDNiNWQ0MzZmYTdmNTI2NjE1YTUwNTFhMSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81YzgzNDdiMmEzNTc0ODAzYTg1YzRmNWNkZjI0YWFlMSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY1MzIwNTcsLTc5LjQwMDA0OTNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzMzODhmZiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMzg4ZmYiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMmU3ODZkZTY5ZGExNGQ4MzhkZmMyYjU5ODM3OGJhN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNzc1YTg5M2Q1ZDdlNDJjZDk4OWFhOWRmNjBmNjlmNDUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZTI4ZTMzNjgwMTdjNDFkOGI0NzlmMGFmMTE1YTA1OTEgPSAkKCc8ZGl2IGlkPSJodG1sX2UyOGUzMzY4MDE3YzQxZDhiNDc5ZjBhZjExNWEwNTkxIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DaGluYXRvd24gLEdyYW5nZSBQYXJrICxLZW5zaW5ndG9uIE1hcmtldCBDbHVzdGVyIDAuMDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNzc1YTg5M2Q1ZDdlNDJjZDk4OWFhOWRmNjBmNjlmNDUuc2V0Q29udGVudChodG1sX2UyOGUzMzY4MDE3YzQxZDhiNDc5ZjBhZjExNWEwNTkxKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzVjODM0N2IyYTM1NzQ4MDNhODVjNGY1Y2RmMjRhYWUxLmJpbmRQb3B1cChwb3B1cF83NzVhODkzZDVkN2U0MmNkOTg5YWE5ZGY2MGY2OWY0NSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jYTYzNTlmMzlkZmU0MDZjOTE1NGMyNGVlYTZkYmFhYSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjYyODk0NjcsLTc5LjM5NDQxOTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzMzODhmZiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMzg4ZmYiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMmU3ODZkZTY5ZGExNGQ4MzhkZmMyYjU5ODM3OGJhN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNGYzZTYxMWY3ODAzNDBjYWE0ZjVhOTk5OGM3MGE2MjYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYTI0YTZhMDJhYzkwNGJlNzhmYjc1OTUyOTBkNGVlNGEgPSAkKCc8ZGl2IGlkPSJodG1sX2EyNGE2YTAyYWM5MDRiZTc4ZmI3NTk1MjkwZDRlZTRhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DTiBUb3dlciAsQmF0aHVyc3QgUXVheSAsSXNsYW5kIGFpcnBvcnQgLEhhcmJvdXJmcm9udCBXZXN0ICxLaW5nIGFuZCBTcGFkaW5hICxSYWlsd2F5IExhbmRzICxTb3V0aCBOaWFnYXJhIENsdXN0ZXIgMC4wPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80ZjNlNjExZjc4MDM0MGNhYTRmNWE5OTk4YzcwYTYyNi5zZXRDb250ZW50KGh0bWxfYTI0YTZhMDJhYzkwNGJlNzhmYjc1OTUyOTBkNGVlNGEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfY2E2MzU5ZjM5ZGZlNDA2YzkxNTRjMjRlZWE2ZGJhYWEuYmluZFBvcHVwKHBvcHVwXzRmM2U2MTFmNzgwMzQwY2FhNGY1YTk5OThjNzBhNjI2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2JjMjBmMTQ3NmU1OTRhN2Y4MWVlODkzYTcyNjJjYjVjID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjQ2NDM1MiwtNzkuMzc0ODQ1OTk5OTk5OThdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzMzODhmZiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMzg4ZmYiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMmU3ODZkZTY5ZGExNGQ4MzhkZmMyYjU5ODM3OGJhN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMmM3NjE0MmNmYTVjNDkwZDk2Zjg5YmFjNDg0NTVmNzIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZTViOTY1OTFjNDg1NGM1ZGE3ZTEyMDliOTgwMmI4MzMgPSAkKCc8ZGl2IGlkPSJodG1sX2U1Yjk2NTkxYzQ4NTRjNWRhN2UxMjA5Yjk4MDJiODMzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5TdG4gQSBQTyBCb3hlcyAyNSBUaGUgRXNwbGFuYWRlIENsdXN0ZXIgMC4wPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yYzc2MTQyY2ZhNWM0OTBkOTZmODliYWM0ODQ1NWY3Mi5zZXRDb250ZW50KGh0bWxfZTViOTY1OTFjNDg1NGM1ZGE3ZTEyMDliOTgwMmI4MzMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYmMyMGYxNDc2ZTU5NGE3ZjgxZWU4OTNhNzI2MmNiNWMuYmluZFBvcHVwKHBvcHVwXzJjNzYxNDJjZmE1YzQ5MGQ5NmY4OWJhYzQ4NDU1ZjcyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2QzNjY2NGYwMDZkMTRmZTZiZWQyZmRkNjYxMjljOTcxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjQ4NDI5MiwtNzkuMzgyMjgwMl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjMzM4OGZmIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMzODhmZiIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8yZTc4NmRlNjlkYTE0ZDgzOGRmYzJiNTk4Mzc4YmE3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lODA0NWY5YTIwODg0ZTUxOGQwNzFlZDQyMGQwZmYyMyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF85NjdiY2Q5ODViYTY0ZTViOTA5MTM5YjU4MTMzMWI2NCA9ICQoJzxkaXYgaWQ9Imh0bWxfOTY3YmNkOTg1YmE2NGU1YjkwOTEzOWI1ODEzMzFiNjQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkZpcnN0IENhbmFkaWFuIFBsYWNlICxVbmRlcmdyb3VuZCBjaXR5IENsdXN0ZXIgMC4wPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lODA0NWY5YTIwODg0ZTUxOGQwNzFlZDQyMGQwZmYyMy5zZXRDb250ZW50KGh0bWxfOTY3YmNkOTg1YmE2NGU1YjkwOTEzOWI1ODEzMzFiNjQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZDM2NjY0ZjAwNmQxNGZlNmJlZDJmZGQ2NjEyOWM5NzEuYmluZFBvcHVwKHBvcHVwX2U4MDQ1ZjlhMjA4ODRlNTE4ZDA3MWVkNDIwZDBmZjIzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzQ0Y2Y2YmUwM2UxMzQ2M2FiOGU1MjIxZGU2MDVmYjliID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzE4NTE4LC03OS40NjQ3NjMyOTk5OTk5OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjMzM4OGZmIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMzODhmZiIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8yZTc4NmRlNjlkYTE0ZDgzOGRmYzJiNTk4Mzc4YmE3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF83YzE3ZmUwMTc1NTI0ZDE2YjA2M2NiNThiMWM3MDA5ZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xNDNmZTEwYjFhZDU0ZTNiOTJmZjg3NTMxYzBhNmY1NCA9ICQoJzxkaXYgaWQ9Imh0bWxfMTQzZmUxMGIxYWQ1NGUzYjkyZmY4NzUzMWMwYTZmNTQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkxhd3JlbmNlIEhlaWdodHMgLExhd3JlbmNlIE1hbm9yIENsdXN0ZXIgMC4wPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83YzE3ZmUwMTc1NTI0ZDE2YjA2M2NiNThiMWM3MDA5Zi5zZXRDb250ZW50KGh0bWxfMTQzZmUxMGIxYWQ1NGUzYjkyZmY4NzUzMWMwYTZmNTQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNDRjZjZiZTAzZTEzNDYzYWI4ZTUyMjFkZTYwNWZiOWIuYmluZFBvcHVwKHBvcHVwXzdjMTdmZTAxNzU1MjRkMTZiMDYzY2I1OGIxYzcwMDlmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2NkZmY0NDBhMjFhMDRmZTM4ZGE1NDBkNmQ2ODBiNzkxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzA5NTc3LC03OS40NDUwNzI1OTk5OTk5N10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjMzM4OGZmIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMzODhmZiIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8yZTc4NmRlNjlkYTE0ZDgzOGRmYzJiNTk4Mzc4YmE3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wYmViMjc1Yjc4YzM0OTI3OWI4OWJkMjhhOGU2NDA2YyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mYTVkNmM0YWIxZTY0YTViOTkwZjg1NjFhYjk2MDgyZiA9ICQoJzxkaXYgaWQ9Imh0bWxfZmE1ZDZjNGFiMWU2NGE1Yjk5MGY4NTYxYWI5NjA4MmYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkdsZW5jYWlybiBDbHVzdGVyIDAuMDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMGJlYjI3NWI3OGMzNDkyNzliODliZDI4YThlNjQwNmMuc2V0Q29udGVudChodG1sX2ZhNWQ2YzRhYjFlNjRhNWI5OTBmODU2MWFiOTYwODJmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2NkZmY0NDBhMjFhMDRmZTM4ZGE1NDBkNmQ2ODBiNzkxLmJpbmRQb3B1cChwb3B1cF8wYmViMjc1Yjc4YzM0OTI3OWI4OWJkMjhhOGU2NDA2Yyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl84MDY4MTQ4ZmZhY2E0YWEzYTczZDU4MDhkN2RjODRiYSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY5Mzc4MTMsLTc5LjQyODE5MTQwMDAwMDAyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiMzMzg4ZmYiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzM4OGZmIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzJlNzg2ZGU2OWRhMTRkODM4ZGZjMmI1OTgzNzhiYTdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzdkMDk4Y2VlYjMxMjRkNGE4ZDRiMTc1Y2E1MzIzMzMwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzhiZWY2YTdiODdlMzQwMTNhYTk4NzNmZThhODNjZjEyID0gJCgnPGRpdiBpZD0iaHRtbF84YmVmNmE3Yjg3ZTM0MDEzYWE5ODczZmU4YTgzY2YxMiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+SHVtZXdvb2QtQ2VkYXJ2YWxlIENsdXN0ZXIgMC4wPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83ZDA5OGNlZWIzMTI0ZDRhOGQ0YjE3NWNhNTMyMzMzMC5zZXRDb250ZW50KGh0bWxfOGJlZjZhN2I4N2UzNDAxM2FhOTg3M2ZlOGE4M2NmMTIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfODA2ODE0OGZmYWNhNGFhM2E3M2Q1ODA4ZDdkYzg0YmEuYmluZFBvcHVwKHBvcHVwXzdkMDk4Y2VlYjMxMjRkNGE4ZDRiMTc1Y2E1MzIzMzMwKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzkwNTNiNGFjN2E2NTRjMWQ4ODU2Y2ZjM2E5ZTY0Y2Y1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjg5MDI1NiwtNzkuNDUzNTEyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiMzMzg4ZmYiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzM4OGZmIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzJlNzg2ZGU2OWRhMTRkODM4ZGZjMmI1OTgzNzhiYTdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzVlNzU3NjY1YmM4ZDRkNjE5ZGVjOWQ5MjQ4ZTNkMzVjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzZiNGIzMzYxYzE5NzRhYTQ5ODE0OGM1Y2NjYjg3NTQwID0gJCgnPGRpdiBpZD0iaHRtbF82YjRiMzM2MWMxOTc0YWE0OTgxNDhjNWNjY2I4NzU0MCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q2FsZWRvbmlhLUZhaXJiYW5rcyBDbHVzdGVyIDEuMDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNWU3NTc2NjViYzhkNGQ2MTlkZWM5ZDkyNDhlM2QzNWMuc2V0Q29udGVudChodG1sXzZiNGIzMzYxYzE5NzRhYTQ5ODE0OGM1Y2NjYjg3NTQwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzkwNTNiNGFjN2E2NTRjMWQ4ODU2Y2ZjM2E5ZTY0Y2Y1LmJpbmRQb3B1cChwb3B1cF81ZTc1NzY2NWJjOGQ0ZDYxOWRlYzlkOTI0OGUzZDM1Yyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xNmRkM2ZhNGNjZDQ0Y2Y1YjA4Yjc5MDkwZjA4NTU5YyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY2OTU0MiwtNzkuNDIyNTYzN10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjMzM4OGZmIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMzODhmZiIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8yZTc4NmRlNjlkYTE0ZDgzOGRmYzJiNTk4Mzc4YmE3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF83NTUxYzkyNDc4NDI0Nzg5YjkxMGUzYzMyYmJjMTc2MiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kYjZjNGM4NjNiNjQ0MzEwYmNhNDNiNjM4ZDNhYTljOCA9ICQoJzxkaXYgaWQ9Imh0bWxfZGI2YzRjODYzYjY0NDMxMGJjYTQzYjYzOGQzYWE5YzgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNocmlzdGllIENsdXN0ZXIgMC4wPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83NTUxYzkyNDc4NDI0Nzg5YjkxMGUzYzMyYmJjMTc2Mi5zZXRDb250ZW50KGh0bWxfZGI2YzRjODYzYjY0NDMxMGJjYTQzYjYzOGQzYWE5YzgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMTZkZDNmYTRjY2Q0NGNmNWIwOGI3OTA5MGYwODU1OWMuYmluZFBvcHVwKHBvcHVwXzc1NTFjOTI0Nzg0MjQ3ODliOTEwZTNjMzJiYmMxNzYyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2FkZmVhMmI2YWUxMDQzZmViZjQ5ZjcxZDIzZjM1ZmFkID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjY5MDA1MTAwMDAwMDEsLTc5LjQ0MjI1OTNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzMzODhmZiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMzg4ZmYiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMmU3ODZkZTY5ZGExNGQ4MzhkZmMyYjU5ODM3OGJhN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMTI4NjE4NmFhNTE4NDIwZmExZWI1NTZiYzAxYTExMDYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZDcyMDhlMWMxOWMzNGNiYmI5MTUxNjgyNDgwMTA1NjQgPSAkKCc8ZGl2IGlkPSJodG1sX2Q3MjA4ZTFjMTljMzRjYmJiOTE1MTY4MjQ4MDEwNTY0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Eb3ZlcmNvdXJ0IFZpbGxhZ2UgLER1ZmZlcmluIENsdXN0ZXIgMi4wPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xMjg2MTg2YWE1MTg0MjBmYTFlYjU1NmJjMDFhMTEwNi5zZXRDb250ZW50KGh0bWxfZDcyMDhlMWMxOWMzNGNiYmI5MTUxNjgyNDgwMTA1NjQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYWRmZWEyYjZhZTEwNDNmZWJmNDlmNzFkMjNmMzVmYWQuYmluZFBvcHVwKHBvcHVwXzEyODYxODZhYTUxODQyMGZhMWViNTU2YmMwMWExMTA2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2I0MjYyNDEzYzk4NTQxOGZiOTAzYTAzOWUxYTk3YWM3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjQ3OTI2NzAwMDAwMDA2LC03OS40MTk3NDk3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiMzMzg4ZmYiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzM4OGZmIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzJlNzg2ZGU2OWRhMTRkODM4ZGZjMmI1OTgzNzhiYTdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzdkNmM1ZTdmODUyOTQ5OWNhMmUxOWFjZmQyNGVjYTg3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzZjMzdkODM4OTk2OTQ2OTE4MWVkNTlkNjNiMzlmMDczID0gJCgnPGRpdiBpZD0iaHRtbF82YzM3ZDgzODk5Njk0NjkxODFlZDU5ZDYzYjM5ZjA3MyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TGl0dGxlIFBvcnR1Z2FsICxUcmluaXR5IENsdXN0ZXIgMC4wPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83ZDZjNWU3Zjg1Mjk0OTljYTJlMTlhY2ZkMjRlY2E4Ny5zZXRDb250ZW50KGh0bWxfNmMzN2Q4Mzg5OTY5NDY5MTgxZWQ1OWQ2M2IzOWYwNzMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYjQyNjI0MTNjOTg1NDE4ZmI5MDNhMDM5ZTFhOTdhYzcuYmluZFBvcHVwKHBvcHVwXzdkNmM1ZTdmODUyOTQ5OWNhMmUxOWFjZmQyNGVjYTg3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzAxNDM0ZWYxMjYzMDQ2MzFiYWZhYWM1YmMwODIzZTQ4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjM2ODQ3MiwtNzkuNDI4MTkxNDAwMDAwMDJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzMzODhmZiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMzg4ZmYiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMmU3ODZkZTY5ZGExNGQ4MzhkZmMyYjU5ODM3OGJhN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYmE5ZGMwYTVlY2Q1NDM5ZDk3YTI3ZDQ3YTk5MjMxNzggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZWY1OTZlYTZiYzhhNDBmZGI1ODNiMzI3ZDZmYTA2NTMgPSAkKCc8ZGl2IGlkPSJodG1sX2VmNTk2ZWE2YmM4YTQwZmRiNTgzYjMyN2Q2ZmEwNjUzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Ccm9ja3RvbiAsRXhoaWJpdGlvbiBQbGFjZSAsUGFya2RhbGUgVmlsbGFnZSBDbHVzdGVyIDAuMDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYmE5ZGMwYTVlY2Q1NDM5ZDk3YTI3ZDQ3YTk5MjMxNzguc2V0Q29udGVudChodG1sX2VmNTk2ZWE2YmM4YTQwZmRiNTgzYjMyN2Q2ZmEwNjUzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzAxNDM0ZWYxMjYzMDQ2MzFiYWZhYWM1YmMwODIzZTQ4LmJpbmRQb3B1cChwb3B1cF9iYTlkYzBhNWVjZDU0MzlkOTdhMjdkNDdhOTkyMzE3OCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8zOTE5Nzc0OTEwYjA0OWMyOTFmMmQzYTMwZTI1MGFhMiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjcxMzc1NjIwMDAwMDAxLC03OS40OTAwNzM4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiMzMzg4ZmYiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzM4OGZmIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzJlNzg2ZGU2OWRhMTRkODM4ZGZjMmI1OTgzNzhiYTdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2JkYzhmNjliMjNmNTQxMzE5YzRhNDNkOGM4OTU2MDA0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2FjOWY4MDBlYmRkYTQwMTRhYjMxZWJhZDAxMWNiMGVjID0gJCgnPGRpdiBpZD0iaHRtbF9hYzlmODAwZWJkZGE0MDE0YWIzMWViYWQwMTFjYjBlYyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RG93bnN2aWV3ICxOb3J0aCBQYXJrICxVcHdvb2QgUGFyayBDbHVzdGVyIDIuMDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYmRjOGY2OWIyM2Y1NDEzMTljNGE0M2Q4Yzg5NTYwMDQuc2V0Q29udGVudChodG1sX2FjOWY4MDBlYmRkYTQwMTRhYjMxZWJhZDAxMWNiMGVjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzM5MTk3NzQ5MTBiMDQ5YzI5MWYyZDNhMzBlMjUwYWEyLmJpbmRQb3B1cChwb3B1cF9iZGM4ZjY5YjIzZjU0MTMxOWM0YTQzZDhjODk1NjAwNCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8zZWVhN2Q3NzljZTg0ZGVkODg5NTc3ZGUxMjQ4NjE3MiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY5MTExNTgsLTc5LjQ3NjAxMzI5OTk5OTk4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiMzMzg4ZmYiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzM4OGZmIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzJlNzg2ZGU2OWRhMTRkODM4ZGZjMmI1OTgzNzhiYTdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzI2OTg0ZWRhNjYzZjRkODRiMzZmMzU2MDMzNmVhZGE4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2U4MTdhMjVkN2ZlODRkZGQ4ODcxNWJkYjI4Y2NjOTNjID0gJCgnPGRpdiBpZD0iaHRtbF9lODE3YTI1ZDdmZTg0ZGRkODg3MTViZGIyOGNjYzkzYyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RGVsIFJheSAsS2VlbGVzZGFsZSAsTW91bnQgRGVubmlzICxTaWx2ZXJ0aG9ybiBDbHVzdGVyIDAuMDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMjY5ODRlZGE2NjNmNGQ4NGIzNmYzNTYwMzM2ZWFkYTguc2V0Q29udGVudChodG1sX2U4MTdhMjVkN2ZlODRkZGQ4ODcxNWJkYjI4Y2NjOTNjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzNlZWE3ZDc3OWNlODRkZWQ4ODk1NzdkZTEyNDg2MTcyLmJpbmRQb3B1cChwb3B1cF8yNjk4NGVkYTY2M2Y0ZDg0YjM2ZjM1NjAzMzZlYWRhOCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mN2QxOTkxNzQ1YzQ0YzRiODgyZjY4ZTQyYmVhMTgzMyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY3MzE4NTI5OTk5OTk5LC03OS40ODcyNjE5MDAwMDAwMl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjMzM4OGZmIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMzODhmZiIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8yZTc4NmRlNjlkYTE0ZDgzOGRmYzJiNTk4Mzc4YmE3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF81YzRhZjUyMDRmYjU0NjhiOTJlMTdkMGJlMTUxNDI3OCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mNDhiM2MwODJkNzY0Y2M3YTM2ZjU4YTRkZmRjOTM1MSA9ICQoJzxkaXYgaWQ9Imh0bWxfZjQ4YjNjMDgyZDc2NGNjN2EzNmY1OGE0ZGZkYzkzNTEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlRoZSBKdW5jdGlvbiBOb3J0aCAsUnVubnltZWRlIENsdXN0ZXIgMi4wPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81YzRhZjUyMDRmYjU0NjhiOTJlMTdkMGJlMTUxNDI3OC5zZXRDb250ZW50KGh0bWxfZjQ4YjNjMDgyZDc2NGNjN2EzNmY1OGE0ZGZkYzkzNTEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZjdkMTk5MTc0NWM0NGM0Yjg4MmY2OGU0MmJlYTE4MzMuYmluZFBvcHVwKHBvcHVwXzVjNGFmNTIwNGZiNTQ2OGI5MmUxN2QwYmUxNTE0Mjc4KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzFkMmFlMjAxNjBkOTRjZGZhMmRkMGI5MWQzMzgyYTM5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjYxNjA4MywtNzkuNDY0NzYzMjk5OTk5OTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzMzODhmZiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMzg4ZmYiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMmU3ODZkZTY5ZGExNGQ4MzhkZmMyYjU5ODM3OGJhN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMDY1ZmI0NzBhNmNkNDk0MmJlZTFhYzNmODBiZjliMTEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNGZlNzY5NjY4YjNlNDI1YmFhNmFkYjQwNjdmMmVjODQgPSAkKCc8ZGl2IGlkPSJodG1sXzRmZTc2OTY2OGIzZTQyNWJhYTZhZGI0MDY3ZjJlYzg0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5IaWdoIFBhcmsgLFRoZSBKdW5jdGlvbiBTb3V0aCBDbHVzdGVyIDAuMDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMDY1ZmI0NzBhNmNkNDk0MmJlZTFhYzNmODBiZjliMTEuc2V0Q29udGVudChodG1sXzRmZTc2OTY2OGIzZTQyNWJhYTZhZGI0MDY3ZjJlYzg0KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzFkMmFlMjAxNjBkOTRjZGZhMmRkMGI5MWQzMzgyYTM5LmJpbmRQb3B1cChwb3B1cF8wNjVmYjQ3MGE2Y2Q0OTQyYmVlMWFjM2Y4MGJmOWIxMSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl82Njg1ZWNlYTI3NzQ0OTFjYjk2M2E3NGU2NWIwM2M2MSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY0ODk1OTcsLTc5LjQ1NjMyNV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjMzM4OGZmIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMzODhmZiIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8yZTc4NmRlNjlkYTE0ZDgzOGRmYzJiNTk4Mzc4YmE3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xYjMzMGM2ZDgxZGE0ZDU5YjQzN2UxMzlhOTdiZjNlNCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF85MzM4MWMzNWI5OGE0NDc5YWU1N2Y0YzQ5ZWQxZmMyMSA9ICQoJzxkaXYgaWQ9Imh0bWxfOTMzODFjMzViOThhNDQ3OWFlNTdmNGM0OWVkMWZjMjEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlBhcmtkYWxlICxSb25jZXN2YWxsZXMgQ2x1c3RlciAwLjA8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzFiMzMwYzZkODFkYTRkNTliNDM3ZTEzOWE5N2JmM2U0LnNldENvbnRlbnQoaHRtbF85MzM4MWMzNWI5OGE0NDc5YWU1N2Y0YzQ5ZWQxZmMyMSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl82Njg1ZWNlYTI3NzQ0OTFjYjk2M2E3NGU2NWIwM2M2MS5iaW5kUG9wdXAocG9wdXBfMWIzMzBjNmQ4MWRhNGQ1OWI0MzdlMTM5YTk3YmYzZTQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNmE4ZTc3MDk4MzA2NGRlYzkyYmMzOTFhZGViMzQwZGIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42NTE1NzA2LC03OS40ODQ0NDk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiMzMzg4ZmYiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzM4OGZmIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzJlNzg2ZGU2OWRhMTRkODM4ZGZjMmI1OTgzNzhiYTdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2E3MTUxOGFlZGViNTQzNTVhOWJiZDU2YzIwNWI5YmYxID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzAxMmQzOTA1OTE5NDRhZDI4NzIzYjg2MGEwOTA2ZjAzID0gJCgnPGRpdiBpZD0iaHRtbF8wMTJkMzkwNTkxOTQ0YWQyODcyM2I4NjBhMDkwNmYwMyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UnVubnltZWRlICxTd2Fuc2VhIENsdXN0ZXIgMC4wPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hNzE1MThhZWRlYjU0MzU1YTliYmQ1NmMyMDViOWJmMS5zZXRDb250ZW50KGh0bWxfMDEyZDM5MDU5MTk0NGFkMjg3MjNiODYwYTA5MDZmMDMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNmE4ZTc3MDk4MzA2NGRlYzkyYmMzOTFhZGViMzQwZGIuYmluZFBvcHVwKHBvcHVwX2E3MTUxOGFlZGViNTQzNTVhOWJiZDU2YzIwNWI5YmYxKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2NiYjg4OGUwNGJlNTRmODZhNmRiNjk1OGVkOGMyOGIxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjYyMzAxNSwtNzkuMzg5NDkzOF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjMzM4OGZmIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMzODhmZiIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8yZTc4NmRlNjlkYTE0ZDgzOGRmYzJiNTk4Mzc4YmE3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85MzExMTdhNWZmYTU0Y2YzYWYwY2ZmNmE4ZDE1NDNkYyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iYTI3MzAyM2ZhMmY0MDliYmJlNGUyNjJiYzQ3NThkNiA9ICQoJzxkaXYgaWQ9Imh0bWxfYmEyNzMwMjNmYTJmNDA5YmJiZTRlMjYyYmM0NzU4ZDYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlF1ZWVuJiMzOTtzIFBhcmsgQ2x1c3RlciAwLjA8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzkzMTExN2E1ZmZhNTRjZjNhZjBjZmY2YThkMTU0M2RjLnNldENvbnRlbnQoaHRtbF9iYTI3MzAyM2ZhMmY0MDliYmJlNGUyNjJiYzQ3NThkNik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9jYmI4ODhlMDRiZTU0Zjg2YTZkYjY5NThlZDhjMjhiMS5iaW5kUG9wdXAocG9wdXBfOTMxMTE3YTVmZmE1NGNmM2FmMGNmZjZhOGQxNTQzZGMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYTkxOTEzNjg1ZjhjNGUxMTg5NmY2ZjI4MTYwMGM5MzQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42MzY5NjU2LC03OS42MTU4MTg5OTk5OTk5OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjMzM4OGZmIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMzODhmZiIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8yZTc4NmRlNjlkYTE0ZDgzOGRmYzJiNTk4Mzc4YmE3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xMTcwYzExMTQ3MTk0NzY4YmUzM2FiMjA1ODYxOGJiOCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mNTNjZWJkNDk3NzI0YTYxYmM3NTgzMjQ4OWI5NmY5OCA9ICQoJzxkaXYgaWQ9Imh0bWxfZjUzY2ViZDQ5NzcyNGE2MWJjNzU4MzI0ODliOTZmOTgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNhbmFkYSBQb3N0IEdhdGV3YXkgUHJvY2Vzc2luZyBDZW50cmUgQ2x1c3RlciAwLjA8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzExNzBjMTExNDcxOTQ3NjhiZTMzYWIyMDU4NjE4YmI4LnNldENvbnRlbnQoaHRtbF9mNTNjZWJkNDk3NzI0YTYxYmM3NTgzMjQ4OWI5NmY5OCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9hOTE5MTM2ODVmOGM0ZTExODk2ZjZmMjgxNjAwYzkzNC5iaW5kUG9wdXAocG9wdXBfMTE3MGMxMTE0NzE5NDc2OGJlMzNhYjIwNTg2MThiYjgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNjNiNDJkOGE0ODg3NGQ1NjllZjFlZjViNzExYzkxOTMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42NjI3NDM5LC03OS4zMjE1NThdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzMzODhmZiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMzg4ZmYiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMmU3ODZkZTY5ZGExNGQ4MzhkZmMyYjU5ODM3OGJhN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfM2U1ZDU4N2U3MWEyNGZiYWI3NWNmZGExMzBiN2I2YTMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMjY3YzZiMjllMDVjNDY1YmI4ODRjMGU0ZjdjYmIzNTcgPSAkKCc8ZGl2IGlkPSJodG1sXzI2N2M2YjI5ZTA1YzQ2NWJiODg0YzBlNGY3Y2JiMzU3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5CdXNpbmVzcyBSZXBseSBNYWlsIFByb2Nlc3NpbmcgQ2VudHJlIDk2OSBFYXN0ZXJuIENsdXN0ZXIgMC4wPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zZTVkNTg3ZTcxYTI0ZmJhYjc1Y2ZkYTEzMGI3YjZhMy5zZXRDb250ZW50KGh0bWxfMjY3YzZiMjllMDVjNDY1YmI4ODRjMGU0ZjdjYmIzNTcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNjNiNDJkOGE0ODg3NGQ1NjllZjFlZjViNzExYzkxOTMuYmluZFBvcHVwKHBvcHVwXzNlNWQ1ODdlNzFhMjRmYmFiNzVjZmRhMTMwYjdiNmEzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzA5N2I5ZmMzNWNhYTQzMmRiZjRhYmZjYWY1OGExMDU2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjA1NjQ2NiwtNzkuNTAxMzIwNzAwMDAwMDJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzMzODhmZiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMzg4ZmYiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMmU3ODZkZTY5ZGExNGQ4MzhkZmMyYjU5ODM3OGJhN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfODcxMWY1MGMzZTNmNGI0ZTlmMzBiNzRjNGIxNjc1YTAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMDQ2ZWZjMTczZmNkNDdjOTk3MTlmNWUxNjA1ZDFiYzggPSAkKCc8ZGl2IGlkPSJodG1sXzA0NmVmYzE3M2ZjZDQ3Yzk5NzE5ZjVlMTYwNWQxYmM4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5IdW1iZXIgQmF5IFNob3JlcyAsTWltaWNvIFNvdXRoICxOZXcgVG9yb250byBDbHVzdGVyIDAuMDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfODcxMWY1MGMzZTNmNGI0ZTlmMzBiNzRjNGIxNjc1YTAuc2V0Q29udGVudChodG1sXzA0NmVmYzE3M2ZjZDQ3Yzk5NzE5ZjVlMTYwNWQxYmM4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzA5N2I5ZmMzNWNhYTQzMmRiZjRhYmZjYWY1OGExMDU2LmJpbmRQb3B1cChwb3B1cF84NzExZjUwYzNlM2Y0YjRlOWYzMGI3NGM0YjE2NzVhMCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lMjFlYzNmNGFlMDI0ZGY2OTJkZWJmMGY3MDg0MjQ0NyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjYwMjQxMzcwMDAwMDAxLC03OS41NDM0ODQwOTk5OTk5OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjMzM4OGZmIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMzODhmZiIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8yZTc4NmRlNjlkYTE0ZDgzOGRmYzJiNTk4Mzc4YmE3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mYmFlNjUyYzE4MjI0YWJmYmUyMjE1YWJjZWE2YmY5MCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iYWM1NWY3NDY0NjM0MDU5OTIxMGFjODE3MWVmNjVmZiA9ICQoJzxkaXYgaWQ9Imh0bWxfYmFjNTVmNzQ2NDYzNDA1OTkyMTBhYzgxNzFlZjY1ZmYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkFsZGVyd29vZCAsTG9uZyBCcmFuY2ggQ2x1c3RlciAwLjA8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2ZiYWU2NTJjMTgyMjRhYmZiZTIyMTVhYmNlYTZiZjkwLnNldENvbnRlbnQoaHRtbF9iYWM1NWY3NDY0NjM0MDU5OTIxMGFjODE3MWVmNjVmZik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9lMjFlYzNmNGFlMDI0ZGY2OTJkZWJmMGY3MDg0MjQ0Ny5iaW5kUG9wdXAocG9wdXBfZmJhZTY1MmMxODIyNGFiZmJlMjIxNWFiY2VhNmJmOTApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZjYwN2M0N2NkNjgyNGU0M2E4ODFkNDY0Y2E3YzlkNDggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42NTM2NTM2MDAwMDAwMSwtNzkuNTA2OTQzNl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjMzM4OGZmIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMzODhmZiIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8yZTc4NmRlNjlkYTE0ZDgzOGRmYzJiNTk4Mzc4YmE3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zYThhZDFjMTc1ZDk0OTM4YWZlNmYwNDg0Y2VjOTcwYyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8yMmU4YjM4YmVkZTk0MjdiODRkYjI1OGZiMWI3ZjAwOSA9ICQoJzxkaXYgaWQ9Imh0bWxfMjJlOGIzOGJlZGU5NDI3Yjg0ZGIyNThmYjFiN2YwMDkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlRoZSBLaW5nc3dheSAsTW9udGdvbWVyeSBSb2FkICxPbGQgTWlsbCBOb3J0aCBDbHVzdGVyIDEuMDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfM2E4YWQxYzE3NWQ5NDkzOGFmZTZmMDQ4NGNlYzk3MGMuc2V0Q29udGVudChodG1sXzIyZThiMzhiZWRlOTQyN2I4NGRiMjU4ZmIxYjdmMDA5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2Y2MDdjNDdjZDY4MjRlNDNhODgxZDQ2NGNhN2M5ZDQ4LmJpbmRQb3B1cChwb3B1cF8zYThhZDFjMTc1ZDk0OTM4YWZlNmYwNDg0Y2VjOTcwYyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jYjMxZjRkZTM3YjU0NTAzODU3YTcxNjcwNmIyY2NjMyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjYzNjI1NzksLTc5LjQ5ODUwOTA5OTk5OTk4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiMzMzg4ZmYiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzM4OGZmIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzJlNzg2ZGU2OWRhMTRkODM4ZGZjMmI1OTgzNzhiYTdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2QwN2ZhYzU2MzBhMzQ0MWNhYTliZGFiYzkyZThkYmQzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2ZjMmVkYWRkNWU1MTRmNzdhZWY3ZDM2YjE4NWExZjNjID0gJCgnPGRpdiBpZD0iaHRtbF9mYzJlZGFkZDVlNTE0Zjc3YWVmN2QzNmIxODVhMWYzYyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+SHVtYmVyIEJheSAsS2luZyYjMzk7cyBNaWxsIFBhcmsgLEtpbmdzd2F5IFBhcmsgU291dGggRWFzdCAsTWltaWNvIE5FICxPbGQgTWlsbCBTb3V0aCAsVGhlIFF1ZWVuc3dheSBFYXN0ICxSb3lhbCBZb3JrIFNvdXRoIEVhc3QgLFN1bm55bGVhIENsdXN0ZXIgMC4wPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kMDdmYWM1NjMwYTM0NDFjYWE5YmRhYmM5MmU4ZGJkMy5zZXRDb250ZW50KGh0bWxfZmMyZWRhZGQ1ZTUxNGY3N2FlZjdkMzZiMTg1YTFmM2MpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfY2IzMWY0ZGUzN2I1NDUwMzg1N2E3MTY3MDZiMmNjYzMuYmluZFBvcHVwKHBvcHVwX2QwN2ZhYzU2MzBhMzQ0MWNhYTliZGFiYzkyZThkYmQzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2QyM2JmMjM4Mjc1NDQ2NzU5MWM5NGRiYzQwODFlNTVhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjI4ODQwOCwtNzkuNTIwOTk5NDAwMDAwMDJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzMzODhmZiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMzg4ZmYiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMmU3ODZkZTY5ZGExNGQ4MzhkZmMyYjU5ODM3OGJhN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYTdlNTgxMTliNzk5NDJhN2E5NDFkOWRiZjliN2JhMmYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOGMwMDcxOWMzNjJkNDE3YzhmODRkM2RkZjc5NzljOWMgPSAkKCc8ZGl2IGlkPSJodG1sXzhjMDA3MTljMzYyZDQxN2M4Zjg0ZDNkZGY3OTc5YzljIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5LaW5nc3dheSBQYXJrIFNvdXRoIFdlc3QgLE1pbWljbyBOVyAsVGhlIFF1ZWVuc3dheSBXZXN0ICxSb3lhbCBZb3JrIFNvdXRoIFdlc3QgLFNvdXRoIG9mIEJsb29yIENsdXN0ZXIgMC4wPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hN2U1ODExOWI3OTk0MmE3YTk0MWQ5ZGJmOWI3YmEyZi5zZXRDb250ZW50KGh0bWxfOGMwMDcxOWMzNjJkNDE3YzhmODRkM2RkZjc5NzljOWMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZDIzYmYyMzgyNzU0NDY3NTkxYzk0ZGJjNDA4MWU1NWEuYmluZFBvcHVwKHBvcHVwX2E3ZTU4MTE5Yjc5OTQyYTdhOTQxZDlkYmY5YjdiYTJmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzA4NTAyOWFkMDY2OTQ2NmI5MDc1MjcyZThkNjAzYTk5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjY3ODU1NiwtNzkuNTMyMjQyNDAwMDAwMDJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzMzODhmZiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMzg4ZmYiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMmU3ODZkZTY5ZGExNGQ4MzhkZmMyYjU5ODM3OGJhN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMGU1Njc4ZTJkMTE4NDQ0NGE3OTVmZmNmYzc1NThlZmYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYTBjNjY4ODI1MWE1NGZkZmJkOTg2NGY2M2M5ZGI0NjYgPSAkKCc8ZGl2IGlkPSJodG1sX2EwYzY2ODgyNTFhNTRmZGZiZDk4NjRmNjNjOWRiNDY2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Jc2xpbmd0b24gQXZlbnVlIENsdXN0ZXIgbmFuPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wZTU2NzhlMmQxMTg0NDQ0YTc5NWZmY2ZjNzU1OGVmZi5zZXRDb250ZW50KGh0bWxfYTBjNjY4ODI1MWE1NGZkZmJkOTg2NGY2M2M5ZGI0NjYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMDg1MDI5YWQwNjY5NDY2YjkwNzUyNzJlOGQ2MDNhOTkuYmluZFBvcHVwKHBvcHVwXzBlNTY3OGUyZDExODQ0NDRhNzk1ZmZjZmM3NTU4ZWZmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzhhZmNjYzQzZGFiNTRlZDk5MjMxYjk3MGY1ZjkxMzlhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjUwOTQzMiwtNzkuNTU0NzI0NDAwMDAwMDFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzMzODhmZiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMzg4ZmYiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMmU3ODZkZTY5ZGExNGQ4MzhkZmMyYjU5ODM3OGJhN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYzQ3ZTRjMDNkZDQwNDVjNmJlMzM5MmQxODc1ZjY5ZTUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNzg0NjMzMzY3MDMwNDc1MWFhY2ZmZjkzYzNiZTQ3ZjIgPSAkKCc8ZGl2IGlkPSJodG1sXzc4NDYzMzM2NzAzMDQ3NTFhYWNmZmY5M2MzYmU0N2YyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DbG92ZXJkYWxlICxJc2xpbmd0b24gLE1hcnRpbiBHcm92ZSAsUHJpbmNlc3MgR2FyZGVucyAsV2VzdCBEZWFuZSBQYXJrIENsdXN0ZXIgMy4wPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jNDdlNGMwM2RkNDA0NWM2YmUzMzkyZDE4NzVmNjllNS5zZXRDb250ZW50KGh0bWxfNzg0NjMzMzY3MDMwNDc1MWFhY2ZmZjkzYzNiZTQ3ZjIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOGFmY2NjNDNkYWI1NGVkOTkyMzFiOTcwZjVmOTEzOWEuYmluZFBvcHVwKHBvcHVwX2M0N2U0YzAzZGQ0MDQ1YzZiZTMzOTJkMTg3NWY2OWU1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2IzMTg0ZTRjMWViMTQ2YmQ5ODc0YzVkMTY3OTgwMzMyID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjQzNTE1MiwtNzkuNTc3MjAwNzk5OTk5OTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzMzODhmZiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMzg4ZmYiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMmU3ODZkZTY5ZGExNGQ4MzhkZmMyYjU5ODM3OGJhN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYzg3ZjkzZTY0NmM5NGFiMDkxMzlhNjdkM2U0MmI1YWEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMDEwZDA4MjBiMzU5NGY4MzgzNmRhNjM3YmEwM2YyYjMgPSAkKCc8ZGl2IGlkPSJodG1sXzAxMGQwODIwYjM1OTRmODM4MzZkYTYzN2JhMDNmMmIzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5CbG9vcmRhbGUgR2FyZGVucyAsRXJpbmdhdGUgLE1hcmtsYW5kIFdvb2QgLE9sZCBCdXJuaGFtdGhvcnBlIENsdXN0ZXIgMC4wPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jODdmOTNlNjQ2Yzk0YWIwOTEzOWE2N2QzZTQyYjVhYS5zZXRDb250ZW50KGh0bWxfMDEwZDA4MjBiMzU5NGY4MzgzNmRhNjM3YmEwM2YyYjMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYjMxODRlNGMxZWIxNDZiZDk4NzRjNWQxNjc5ODAzMzIuYmluZFBvcHVwKHBvcHVwX2M4N2Y5M2U2NDZjOTRhYjA5MTM5YTY3ZDNlNDJiNWFhKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzNkYWU0N2Y1YmQ5YzQwMjNhOTE2ZTM1OTJlZWRjNTcwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzU2MzAzMywtNzkuNTY1OTYzMjk5OTk5OThdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzMzODhmZiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMzg4ZmYiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMmU3ODZkZTY5ZGExNGQ4MzhkZmMyYjU5ODM3OGJhN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZGFhNjAxMTBkNjhjNDYxODllNWM4OWI2ZmM3YWY5YjMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOTc5MjJlYzlmNTFiNDIwMzlmMjJjM2QwZTQ4ZWE4ZDcgPSAkKCc8ZGl2IGlkPSJodG1sXzk3OTIyZWM5ZjUxYjQyMDM5ZjIyYzNkMGU0OGVhOGQ3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5IdW1iZXIgU3VtbWl0IENsdXN0ZXIgNC4wPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kYWE2MDExMGQ2OGM0NjE4OWU1Yzg5YjZmYzdhZjliMy5zZXRDb250ZW50KGh0bWxfOTc5MjJlYzlmNTFiNDIwMzlmMjJjM2QwZTQ4ZWE4ZDcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfM2RhZTQ3ZjViZDljNDAyM2E5MTZlMzU5MmVlZGM1NzAuYmluZFBvcHVwKHBvcHVwX2RhYTYwMTEwZDY4YzQ2MTg5ZTVjODliNmZjN2FmOWIzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzE1MTg2MjUzNTZmNzQ4YWVhOTJmZmY1OWU3MGUyMjkyID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzI0NzY1OSwtNzkuNTMyMjQyNDAwMDAwMDJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzMzODhmZiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMzg4ZmYiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMmU3ODZkZTY5ZGExNGQ4MzhkZmMyYjU5ODM3OGJhN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOGRlYTQzZmFkMThmNDhjZTljNDA5OTI2MTY3NTFlZjMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMzU4ZGY5ZGIyMDdiNDRkNGIzMzc1MGM4ZTk3Yzc4YWQgPSAkKCc8ZGl2IGlkPSJodG1sXzM1OGRmOWRiMjA3YjQ0ZDRiMzM3NTBjOGU5N2M3OGFkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5FbWVyeSAsSHVtYmVybGVhIENsdXN0ZXIgMC4wPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84ZGVhNDNmYWQxOGY0OGNlOWM0MDk5MjYxNjc1MWVmMy5zZXRDb250ZW50KGh0bWxfMzU4ZGY5ZGIyMDdiNDRkNGIzMzc1MGM4ZTk3Yzc4YWQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMTUxODYyNTM1NmY3NDhhZWE5MmZmZjU5ZTcwZTIyOTIuYmluZFBvcHVwKHBvcHVwXzhkZWE0M2ZhZDE4ZjQ4Y2U5YzQwOTkyNjE2NzUxZWYzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2FjOTY4ZGQ5NzE2ODQ5NTg4YzBkN2Q2ZmEwNWNkOTBhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzA2ODc2LC03OS41MTgxODg0MDAwMDAwMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjMzM4OGZmIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMzODhmZiIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8yZTc4NmRlNjlkYTE0ZDgzOGRmYzJiNTk4Mzc4YmE3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF81ZmNlOThlODBhZWU0N2UwYjExN2UyZWQ1OWIzY2VkOCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xYTQ0NmVhZDBmYTU0NGI0OGQ0N2UxYzgzMzI3ZDQ0MCA9ICQoJzxkaXYgaWQ9Imh0bWxfMWE0NDZlYWQwZmE1NDRiNDhkNDdlMWM4MzMyN2Q0NDAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPldlc3RvbiBDbHVzdGVyIDEuMDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNWZjZTk4ZTgwYWVlNDdlMGIxMTdlMmVkNTliM2NlZDguc2V0Q29udGVudChodG1sXzFhNDQ2ZWFkMGZhNTQ0YjQ4ZDQ3ZTFjODMzMjdkNDQwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2FjOTY4ZGQ5NzE2ODQ5NTg4YzBkN2Q2ZmEwNWNkOTBhLmJpbmRQb3B1cChwb3B1cF81ZmNlOThlODBhZWU0N2UwYjExN2UyZWQ1OWIzY2VkOCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lMzg3NzkwMWUxOTI0YTIwYTFkMTdhNGVmYjU2M2ExMCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY5NjMxOSwtNzkuNTMyMjQyNDAwMDAwMDJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzMzODhmZiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMzg4ZmYiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMmU3ODZkZTY5ZGExNGQ4MzhkZmMyYjU5ODM3OGJhN2MpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfM2U3YmY4OTMyMDQyNDcyZjhhZThhYTM2ODAxMTQ4YzEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNTI0ODc3ZWU4YWFhNDJkNmE3NTc5ZGI0ZWJmZTM1ZGUgPSAkKCc8ZGl2IGlkPSJodG1sXzUyNDg3N2VlOGFhYTQyZDZhNzU3OWRiNGViZmUzNWRlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5XZXN0bW91bnQgQ2x1c3RlciAwLjA8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzNlN2JmODkzMjA0MjQ3MmY4YWU4YWEzNjgwMTE0OGMxLnNldENvbnRlbnQoaHRtbF81MjQ4NzdlZThhYWE0MmQ2YTc1NzlkYjRlYmZlMzVkZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9lMzg3NzkwMWUxOTI0YTIwYTFkMTdhNGVmYjU2M2ExMC5iaW5kUG9wdXAocG9wdXBfM2U3YmY4OTMyMDQyNDcyZjhhZThhYTM2ODAxMTQ4YzEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZjZiNWEzMWY3Mzk4NDJlNmFkY2YyNTAxMTdlNzk3Y2QgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42ODg5MDU0LC03OS41NTQ3MjQ0MDAwMDAwMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjMzM4OGZmIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMzODhmZiIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8yZTc4NmRlNjlkYTE0ZDgzOGRmYzJiNTk4Mzc4YmE3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF84OGViZmY1Y2Q1YjM0ZTUwOGVhMDFkZjg5NWNiMTY1ZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xMGE0NjA5MDhmNGI0M2NhYjRmNWQ3NWI4NTgwYmQ1YiA9ICQoJzxkaXYgaWQ9Imh0bWxfMTBhNDYwOTA4ZjRiNDNjYWI0ZjVkNzViODU4MGJkNWIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPktpbmdzdmlldyBWaWxsYWdlICxNYXJ0aW4gR3JvdmUgR2FyZGVucyAsUmljaHZpZXcgR2FyZGVucyAsU3QuIFBoaWxsaXBzIENsdXN0ZXIgMC4wPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84OGViZmY1Y2Q1YjM0ZTUwOGVhMDFkZjg5NWNiMTY1ZC5zZXRDb250ZW50KGh0bWxfMTBhNDYwOTA4ZjRiNDNjYWI0ZjVkNzViODU4MGJkNWIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZjZiNWEzMWY3Mzk4NDJlNmFkY2YyNTAxMTdlNzk3Y2QuYmluZFBvcHVwKHBvcHVwXzg4ZWJmZjVjZDViMzRlNTA4ZWEwMWRmODk1Y2IxNjVkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzA4YmI2YWU3Mjg4NjQ0ZDdiNzY3Y2M5N2NiNTdmYmFmID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzM5NDE2NCwtNzkuNTg4NDM2OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjMzM4OGZmIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMzODhmZiIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8yZTc4NmRlNjlkYTE0ZDgzOGRmYzJiNTk4Mzc4YmE3Yyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85MDVkMWJhZDE3NDU0N2M0YWY0MmNhYzgzM2MzY2NkZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mY2M3MjYzMGY1NDg0YTc3YTM1NDI2YzIwMDY3NWY1NiA9ICQoJzxkaXYgaWQ9Imh0bWxfZmNjNzI2MzBmNTQ4NGE3N2EzNTQyNmMyMDA2NzVmNTYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkFsYmlvbiBHYXJkZW5zICxCZWF1bW9uZCBIZWlnaHRzICxIdW1iZXJnYXRlICxKYW1lc3Rvd24gLE1vdW50IE9saXZlICxTaWx2ZXJzdG9uZSAsU291dGggU3RlZWxlcyAsVGhpc3RsZXRvd24gQ2x1c3RlciAyLjA8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzkwNWQxYmFkMTc0NTQ3YzRhZjQyY2FjODMzYzNjY2RkLnNldENvbnRlbnQoaHRtbF9mY2M3MjYzMGY1NDg0YTc3YTM1NDI2YzIwMDY3NWY1Nik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8wOGJiNmFlNzI4ODY0NGQ3Yjc2N2NjOTdjYjU3ZmJhZi5iaW5kUG9wdXAocG9wdXBfOTA1ZDFiYWQxNzQ1NDdjNGFmNDJjYWM4MzNjM2NjZGQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNDk5NDJiOWQzYjRmNGYwNWIyY2JhZDAwNzg2MzQ5MDggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43MDY3NDgzLC03OS41OTQwNTQ0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiMzMzg4ZmYiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzM4OGZmIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzJlNzg2ZGU2OWRhMTRkODM4ZGZjMmI1OTgzNzhiYTdjKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzRmMGVhNGRmYTRhODRkYmJiNjE4NDFjN2NlMjBjMmUyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2M3OTI5MTY2YjI3YzQ5YTNiOGVlMDgwYzkxNmVjZjE4ID0gJCgnPGRpdiBpZD0iaHRtbF9jNzkyOTE2NmIyN2M0OWEzYjhlZTA4MGM5MTZlY2YxOCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Tm9ydGh3ZXN0IENsdXN0ZXIgMi4wPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80ZjBlYTRkZmE0YTg0ZGJiYjYxODQxYzdjZTIwYzJlMi5zZXRDb250ZW50KGh0bWxfYzc5MjkxNjZiMjdjNDlhM2I4ZWUwODBjOTE2ZWNmMTgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNDk5NDJiOWQzYjRmNGYwNWIyY2JhZDAwNzg2MzQ5MDguYmluZFBvcHVwKHBvcHVwXzRmMGVhNGRmYTRhODRkYmJiNjE4NDFjN2NlMjBjMmUyKTsKCiAgICAgICAgICAgIAogICAgICAgIAo8L3NjcmlwdD4= onload="this.contentDocument.open();this.contentDocument.write(atob(this.getAttribute('data-html')));this.contentDocument.close();" allowfullscreen webkitallowfullscreen mozallowfullscreen></iframe>

Examine the clusters

You can examine and determine the discriminating venue categories that distinguish each cluster. Based on the defining categories, you can assign a name to each cluster.

Cluster 1

toronto_merged.loc[toronto_merged['Cluster Labels'] == 0, toronto_merged.columns[[1] + list(range(5, toronto_merged.shape[1]))]]
Borough Cluster Labels 1st Most Common Venue 2nd Most Common Venue 3rd Most Common Venue 4th Most Common Venue 5th Most Common Venue 6th Most Common Venue 7th Most Common Venue 8th Most Common Venue 9th Most Common Venue 10th Most Common Venue
0 Scarborough 0.0 Fast Food Restaurant Print Shop Women's Store Dog Run Dessert Shop Dim Sum Restaurant Diner Discount Store Distribution Center Doner Restaurant
2 Scarborough 0.0 Intersection Breakfast Spot Mexican Restaurant Medical Center Rental Car Location Electronics Store Spa Donut Shop Doner Restaurant Dog Run
3 Scarborough 0.0 Coffee Shop Korean Restaurant Indian Restaurant Women's Store Doner Restaurant Diner Discount Store Distribution Center Dog Run Drugstore
5 Scarborough 0.0 Playground Convenience Store Women's Store Dog Run Dessert Shop Dim Sum Restaurant Diner Discount Store Distribution Center Doner Restaurant
6 Scarborough 0.0 Department Store Coffee Shop Discount Store Hobby Shop Dog Run Dessert Shop Dim Sum Restaurant Diner Distribution Center Women's Store
8 Scarborough 0.0 Motel Movie Theater American Restaurant Women's Store Department Store Dim Sum Restaurant Diner Discount Store Distribution Center Dog Run
9 Scarborough 0.0 College Stadium Skating Rink Café General Entertainment Women's Store Dog Run Dim Sum Restaurant Diner Discount Store Distribution Center
10 Scarborough 0.0 Indian Restaurant Light Rail Station Chinese Restaurant Pet Store Vietnamese Restaurant Brewery Dim Sum Restaurant Diner Discount Store Distribution Center
12 Scarborough 0.0 Latin American Restaurant Lounge Breakfast Spot Clothing Store Donut Shop Diner Discount Store Distribution Center Dog Run Doner Restaurant
13 Scarborough 0.0 Pizza Place Italian Restaurant Noodle House Pharmacy Gas Station Fast Food Restaurant Bank Chinese Restaurant Convenience Store Fried Chicken Joint
15 Scarborough 0.0 Fast Food Restaurant Chinese Restaurant Electronics Store Pharmacy Supermarket Burger Joint Sandwich Place Pizza Place Bubble Tea Shop Coffee Shop
18 North York 0.0 Clothing Store Coffee Shop Fast Food Restaurant Japanese Restaurant Women's Store Juice Bar Tea Room Cosmetics Shop Bakery Movie Theater
19 North York 0.0 Chinese Restaurant Café Bank Japanese Restaurant Women's Store Diner Discount Store Distribution Center Dog Run Doner Restaurant
21 North York 0.0 Piano Bar Women's Store Dog Run Department Store Dessert Shop Dim Sum Restaurant Diner Discount Store Distribution Center Doner Restaurant
22 North York 0.0 Ramen Restaurant Shopping Mall Sandwich Place Coffee Shop Pizza Place Café Sushi Restaurant Steakhouse Hotel Ice Cream Shop
24 North York 0.0 Grocery Store Coffee Shop Pharmacy Pizza Place Home Service Discount Store Women's Store Distribution Center Department Store Dessert Shop
27 North York 0.0 Coffee Shop Beer Store Restaurant Gym Asian Restaurant Discount Store Café Sporting Goods Shop Chinese Restaurant Supermarket
28 North York 0.0 Coffee Shop Fried Chicken Joint Frozen Yogurt Shop Supermarket Deli / Bodega Sushi Restaurant Ice Cream Shop Middle Eastern Restaurant Restaurant Pizza Place
29 North York 0.0 Miscellaneous Shop Falafel Restaurant Coffee Shop Bar Caribbean Restaurant Massage Studio Dog Run Dim Sum Restaurant Diner Discount Store
32 North York 0.0 Korean Restaurant Business Service Home Service Baseball Field Women's Store Dog Run Diner Discount Store Distribution Center Doner Restaurant
34 North York 0.0 Portuguese Restaurant Coffee Shop Hockey Arena Intersection Women's Store Dessert Shop Dim Sum Restaurant Diner Discount Store Distribution Center
36 East York 0.0 Park Skating Rink Pharmacy Video Store Beer Store Curling Ice Bus Stop Cosmetics Shop Women's Store Distribution Center
37 East Toronto 0.0 Health Food Store Trail Coffee Shop Pub Dessert Shop Dim Sum Restaurant Diner Discount Store Distribution Center Dog Run
38 East York 0.0 Coffee Shop Sporting Goods Shop Burger Joint Furniture / Home Store Bike Shop Supermarket Dessert Shop Fish & Chips Shop Sports Bar Liquor Store
39 East York 0.0 Indian Restaurant Yoga Studio Park Bank Fast Food Restaurant Restaurant Intersection Pizza Place Pharmacy Burger Joint
41 East Toronto 0.0 Greek Restaurant Coffee Shop Italian Restaurant Ice Cream Shop Furniture / Home Store Frozen Yogurt Shop Pub Pizza Place Lounge Liquor Store
42 East Toronto 0.0 Sandwich Place Park Brewery Italian Restaurant Fish & Chips Shop Sushi Restaurant Pub Fast Food Restaurant Ice Cream Shop Food & Drink Shop
43 East Toronto 0.0 Café Coffee Shop Bakery Italian Restaurant Brewery American Restaurant Yoga Studio Bookstore Seafood Restaurant Sandwich Place
45 Central Toronto 0.0 Park Convenience Store Breakfast Spot Sandwich Place Food & Drink Shop Department Store Dance Studio Hotel Gym Construction & Landscaping
46 Central Toronto 0.0 Clothing Store Coffee Shop Yoga Studio Sporting Goods Shop Gym / Fitness Center Fast Food Restaurant Diner Dessert Shop Mexican Restaurant Chinese Restaurant
47 Central Toronto 0.0 Dessert Shop Sandwich Place Pizza Place Coffee Shop Italian Restaurant Gym Café Sushi Restaurant Greek Restaurant Pharmacy
49 Central Toronto 0.0 Coffee Shop Pub American Restaurant Pizza Place Supermarket Restaurant Sports Bar Fried Chicken Joint Sushi Restaurant Liquor Store
51 Downtown Toronto 0.0 Coffee Shop Café Pub Pizza Place Bakery Restaurant Italian Restaurant Breakfast Spot Diner Indian Restaurant
52 Downtown Toronto 0.0 Coffee Shop Japanese Restaurant Restaurant Gay Bar Sushi Restaurant Hotel Burger Joint Mediterranean Restaurant Dance Studio Café
53 Downtown Toronto 0.0 Coffee Shop Pub Bakery Café Park Theater Breakfast Spot Mexican Restaurant Restaurant Hotel
54 Downtown Toronto 0.0 Coffee Shop Clothing Store Café Middle Eastern Restaurant Japanese Restaurant Electronics Store Italian Restaurant Cosmetics Shop Burger Joint Bubble Tea Shop
55 Downtown Toronto 0.0 Coffee Shop Café Restaurant Italian Restaurant Hotel Cosmetics Shop Bakery Breakfast Spot Clothing Store Beer Bar
56 Downtown Toronto 0.0 Coffee Shop Cocktail Bar Seafood Restaurant Beer Bar Café Bakery Cheese Shop Farmers Market Restaurant Irish Pub
57 Downtown Toronto 0.0 Coffee Shop Italian Restaurant Café Japanese Restaurant Sandwich Place Burger Joint Juice Bar Ice Cream Shop Chinese Restaurant Salad Place
58 Downtown Toronto 0.0 Coffee Shop Restaurant Café Thai Restaurant Steakhouse Sushi Restaurant Bar Seafood Restaurant Lounge Cosmetics Shop
59 Downtown Toronto 0.0 Coffee Shop Aquarium Italian Restaurant Hotel Café Fried Chicken Joint Restaurant Sporting Goods Shop Brewery Scenic Lookout
60 Downtown Toronto 0.0 Coffee Shop Café Restaurant Hotel Italian Restaurant Bar Japanese Restaurant American Restaurant Seafood Restaurant Gastropub
61 Downtown Toronto 0.0 Coffee Shop Café Restaurant Hotel Gym American Restaurant Italian Restaurant Seafood Restaurant Gastropub Deli / Bodega
62 North York 0.0 Coffee Shop Restaurant Sandwich Place Italian Restaurant Greek Restaurant Fast Food Restaurant Café Cupcake Shop Spa Butcher
63 Central Toronto 0.0 Ice Cream Shop Garden Women's Store Dog Run Dim Sum Restaurant Diner Discount Store Distribution Center Doner Restaurant Department Store
65 Central Toronto 0.0 Café Sandwich Place Coffee Shop American Restaurant Pub Flower Shop Indian Restaurant BBQ Joint Middle Eastern Restaurant History Museum
66 Downtown Toronto 0.0 Café Bookstore Bar Italian Restaurant Japanese Restaurant Restaurant Bakery Chinese Restaurant Coffee Shop Sushi Restaurant
67 Downtown Toronto 0.0 Bar Café Vietnamese Restaurant Bakery Chinese Restaurant Coffee Shop Dumpling Restaurant Mexican Restaurant Vegetarian / Vegan Restaurant Park
68 Downtown Toronto 0.0 Airport Service Airport Terminal Airport Lounge Rental Car Location Coffee Shop Boat or Ferry Sculpture Garden Boutique Harbor / Marina Airport Gate
69 Downtown Toronto 0.0 Coffee Shop Café Restaurant Japanese Restaurant Hotel Seafood Restaurant Beer Bar Cocktail Bar Italian Restaurant Pub
70 Downtown Toronto 0.0 Coffee Shop Café Restaurant Hotel Gastropub Steakhouse Seafood Restaurant Japanese Restaurant Gym Asian Restaurant
71 North York 0.0 Women's Store Furniture / Home Store Clothing Store Coffee Shop Event Space Miscellaneous Shop Boutique Vietnamese Restaurant Accessories Store Gift Shop
72 North York 0.0 Pizza Place Park Sushi Restaurant Pub Japanese Restaurant Discount Store Department Store Dessert Shop Dim Sum Restaurant Diner
73 York 0.0 Trail Hockey Arena Field Women's Store Dim Sum Restaurant Diner Discount Store Distribution Center Dog Run Doner Restaurant
75 Downtown Toronto 0.0 Grocery Store Café Park Italian Restaurant Restaurant Candy Store Athletics & Sports Diner Baby Store Gas Station
77 West Toronto 0.0 Bar Coffee Shop Asian Restaurant Restaurant Men's Store Pizza Place Wine Bar Vietnamese Restaurant Bakery Café
78 West Toronto 0.0 Café Coffee Shop Breakfast Spot Stadium Intersection Grocery Store Gym Convenience Store Performing Arts Venue Pet Store
80 York 0.0 Convenience Store Discount Store Sandwich Place Restaurant Women's Store Dessert Shop Dim Sum Restaurant Diner Distribution Center Dog Run
82 West Toronto 0.0 Mexican Restaurant Café Bar Thai Restaurant Arts & Crafts Store Bookstore Italian Restaurant Diner Fast Food Restaurant Speakeasy
83 West Toronto 0.0 Gift Shop Italian Restaurant Movie Theater Dessert Shop Bookstore Bar Dog Run Cuban Restaurant Restaurant Eastern European Restaurant
84 West Toronto 0.0 Coffee Shop Café Sushi Restaurant Pizza Place Italian Restaurant Dessert Shop Latin American Restaurant Fish & Chips Shop Bar Spa
85 Downtown Toronto 0.0 Coffee Shop Park Yoga Studio Discount Store Beer Bar Japanese Restaurant Seafood Restaurant Sandwich Place Juice Bar Burger Joint
86 Mississauga 0.0 Hotel Coffee Shop Intersection American Restaurant Burrito Place Gym Fried Chicken Joint Mediterranean Restaurant Sandwich Place Diner
87 East Toronto 0.0 Park Garden Restaurant Light Rail Station Auto Workshop Fast Food Restaurant Farmers Market Burrito Place Recording Studio Pizza Place
88 Etobicoke 0.0 Café Coffee Shop Liquor Store Gym Restaurant Pharmacy Business Service Pizza Place Bakery Fast Food Restaurant
89 Etobicoke 0.0 Pizza Place Coffee Shop Pharmacy Skating Rink Pub Pool Sandwich Place Dance Studio Gym Distribution Center
91 Etobicoke 0.0 Baseball Field Women's Store Doner Restaurant Dim Sum Restaurant Diner Discount Store Distribution Center Dog Run Donut Shop Fabric Shop
92 Etobicoke 0.0 Convenience Store Hardware Store Discount Store Burrito Place Burger Joint Thrift / Vintage Store Supplement Shop Fast Food Restaurant Bakery Sandwich Place
95 Etobicoke 0.0 Cosmetics Shop Coffee Shop Shopping Plaza Beer Store Pizza Place Liquor Store Convenience Store Café Doner Restaurant Diner
97 North York 0.0 Fabric Shop Furniture / Home Store Baseball Field Department Store Dim Sum Restaurant Diner Discount Store Distribution Center Dog Run Doner Restaurant
99 Etobicoke 0.0 Pizza Place Intersection Coffee Shop Discount Store Sandwich Place Middle Eastern Restaurant Chinese Restaurant Women's Store Dessert Shop Dim Sum Restaurant
100 Etobicoke 0.0 Mobile Phone Shop Bus Line Pizza Place Sandwich Place Women's Store Discount Store Dessert Shop Dim Sum Restaurant Diner Distribution Center

Cluster 2

toronto_merged.loc[toronto_merged['Cluster Labels'] == 1, toronto_merged.columns[[1] + list(range(5, toronto_merged.shape[1]))]]
Borough Cluster Labels 1st Most Common Venue 2nd Most Common Venue 3rd Most Common Venue 4th Most Common Venue 5th Most Common Venue 6th Most Common Venue 7th Most Common Venue 8th Most Common Venue 9th Most Common Venue 10th Most Common Venue
14 Scarborough 1.0 Park Coffee Shop Playground Dog Run Department Store Dessert Shop Dim Sum Restaurant Diner Discount Store Distribution Center
20 North York 1.0 Park Cafeteria College Rec Center Deli / Bodega Electronics Store Eastern European Restaurant Dumpling Restaurant Drugstore Donut Shop Doner Restaurant
23 North York 1.0 Park Convenience Store Bank Dim Sum Restaurant Diner Discount Store Distribution Center Dog Run Doner Restaurant Department Store
25 North York 1.0 Park Bus Stop Food & Drink Shop Distribution Center Dessert Shop Dim Sum Restaurant Diner Discount Store Dog Run Ethiopian Restaurant
30 North York 1.0 Park Airport Doner Restaurant Dessert Shop Dim Sum Restaurant Diner Discount Store Distribution Center Dog Run Donut Shop
40 East York 1.0 Park Coffee Shop Convenience Store Dog Run Dessert Shop Dim Sum Restaurant Diner Discount Store Distribution Center Doner Restaurant
44 Central Toronto 1.0 Park Swim School Bus Line Dog Run Dim Sum Restaurant Diner Discount Store Distribution Center Doner Restaurant Department Store
48 Central Toronto 1.0 Park Tennis Court Playground Distribution Center Department Store Dessert Shop Dim Sum Restaurant Diner Discount Store Dog Run
50 Downtown Toronto 1.0 Park Trail Playground Department Store Dessert Shop Dim Sum Restaurant Diner Discount Store Distribution Center Dog Run
64 Central Toronto 1.0 Park Trail Jewelry Store Sushi Restaurant Dessert Shop Dim Sum Restaurant Diner Discount Store Distribution Center Dog Run
74 York 1.0 Park Market Women's Store Gift Shop German Restaurant Eastern European Restaurant Dumpling Restaurant Drugstore Donut Shop Gluten-free Restaurant
90 Etobicoke 1.0 Park River Empanada Restaurant Electronics Store Eastern European Restaurant Dumpling Restaurant Drugstore Donut Shop Ethiopian Restaurant Dog Run
98 York 1.0 Park Deli / Bodega Empanada Restaurant Electronics Store Eastern European Restaurant Dumpling Restaurant Drugstore Donut Shop Doner Restaurant Dog Run

Cluster 3

toronto_merged.loc[toronto_merged['Cluster Labels'] == 2, toronto_merged.columns[[1] + list(range(5, toronto_merged.shape[1]))]]
Borough Cluster Labels 1st Most Common Venue 2nd Most Common Venue 3rd Most Common Venue 4th Most Common Venue 5th Most Common Venue 6th Most Common Venue 7th Most Common Venue 8th Most Common Venue 9th Most Common Venue 10th Most Common Venue
1 Scarborough 2.0 Bar Women's Store Doner Restaurant Dim Sum Restaurant Diner Discount Store Distribution Center Dog Run Donut Shop Fabric Shop
4 Scarborough 2.0 Fried Chicken Joint Bakery Athletics & Sports Thai Restaurant Caribbean Restaurant Gas Station Hakka Restaurant Bank Dumpling Restaurant Drugstore
7 Scarborough 2.0 Bakery Bus Line Intersection Park Soccer Field Ice Cream Shop Bus Station Metro Station Women's Store Diner
11 Scarborough 2.0 Middle Eastern Restaurant Bakery Breakfast Spot Smoke Shop Dog Run Dim Sum Restaurant Diner Discount Store Distribution Center Donut Shop
17 North York 2.0 Golf Course Dog Run Mediterranean Restaurant Pool Dumpling Restaurant Drugstore Donut Shop Doner Restaurant Deli / Bodega Eastern European Restaurant
26 North York 2.0 Café Gym / Fitness Center Caribbean Restaurant Japanese Restaurant Doner Restaurant Dim Sum Restaurant Diner Discount Store Distribution Center Dog Run
31 North York 2.0 Grocery Store Park Bank Shopping Mall Hotel Colombian Restaurant Dessert Shop Electronics Store College Rec Center Eastern European Restaurant
33 North York 2.0 Grocery Store Gym / Fitness Center Liquor Store Athletics & Sports Women's Store Doner Restaurant Dim Sum Restaurant Diner Discount Store Distribution Center
35 East York 2.0 Pizza Place Intersection Pet Store Gym / Fitness Center Pharmacy Gastropub Bank Fast Food Restaurant Athletics & Sports Bus Line
76 West Toronto 2.0 Pharmacy Bakery Park Bank Café Middle Eastern Restaurant Pool Supermarket Bar Gym / Fitness Center
79 North York 2.0 Basketball Court Park Bakery Construction & Landscaping Women's Store Diner Discount Store Distribution Center Dog Run Doner Restaurant
81 York 2.0 Grocery Store Pizza Place Brewery Bus Line Women's Store Dog Run Dim Sum Restaurant Diner Discount Store Distribution Center
101 Etobicoke 2.0 Grocery Store Pizza Place Japanese Restaurant Liquor Store Pharmacy Discount Store Beer Store Fried Chicken Joint Sandwich Place Fast Food Restaurant
102 Etobicoke 2.0 Rental Car Location Drugstore Bar Dog Run Dessert Shop Dim Sum Restaurant Diner Discount Store Distribution Center Women's Store

Cluster 4

toronto_merged.loc[toronto_merged['Cluster Labels'] == 3, toronto_merged.columns[[1] + list(range(5, toronto_merged.shape[1]))]]
Borough Cluster Labels 1st Most Common Venue 2nd Most Common Venue 3rd Most Common Venue 4th Most Common Venue 5th Most Common Venue 6th Most Common Venue 7th Most Common Venue 8th Most Common Venue 9th Most Common Venue 10th Most Common Venue
94 Etobicoke 3.0 Home Service Women's Store Dog Run Dessert Shop Dim Sum Restaurant Diner Discount Store Distribution Center Doner Restaurant Deli / Bodega

Cluster 5

toronto_merged.loc[toronto_merged['Cluster Labels'] == 4, toronto_merged.columns[[1] + list(range(5, toronto_merged.shape[1]))]]
Borough Cluster Labels 1st Most Common Venue 2nd Most Common Venue 3rd Most Common Venue 4th Most Common Venue 5th Most Common Venue 6th Most Common Venue 7th Most Common Venue 8th Most Common Venue 9th Most Common Venue 10th Most Common Venue
96 North York 4.0 Pizza Place Women's Store Dog Run Department Store Dessert Shop Dim Sum Restaurant Diner Discount Store Distribution Center Doner Restaurant

Cluster 1 is the biggest. Clusters 4 and 5 have just one neighborhood each.