Skip to content

Instantly share code, notes, and snippets.

@SonerYldrm
Created April 15, 2019 12:41
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save SonerYldrm/b5adcc6ddc51dcc15fcf32833dffc00e to your computer and use it in GitHub Desktop.
Save SonerYldrm/b5adcc6ddc51dcc15fcf32833dffc00e to your computer and use it in GitHub Desktop.
Created on Cognitive Class Labs
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"#import required libraries\n",
"import requests\n",
"import lxml.html as lh\n",
"import pandas as pd"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"url='https://en.wikipedia.org/wiki/List_of_postal_codes_of_Canada:_M'\n",
"#Create a handle, page, to handle the contents of the website\n",
"page = requests.get(url)\n",
"#Store the contents of the website under doc\n",
"doc = lh.fromstring(page.content)\n",
"#Parse data that are stored between <tr>..</tr> of HTML\n",
"tr_elements = doc.xpath('//tr')"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3]"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"#Check the length of the first 12 rows\n",
"[len(T) for T in tr_elements[:12]]"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"1:\"Postcode\"\n",
"2:\"Borough\"\n",
"3:\"Neighbourhood\n",
"\"\n"
]
}
],
"source": [
"tr_elements = doc.xpath('//tr')\n",
"#Create empty list\n",
"col=[]\n",
"i=0\n",
"#For each row, store each first element (header) and an empty list\n",
"for t in tr_elements[0]:\n",
" i+=1\n",
" name=t.text_content()\n",
" print('%d:\"%s\"'%(i,name))\n",
" col.append((name,[]))"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"294"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"len(tr_elements)"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [],
"source": [
"#Since out first row is the header, data is stored on the second row onwards\n",
"for j in range(1,len(tr_elements)):\n",
" #T is our j'th row\n",
" T=tr_elements[j]\n",
" \n",
" #If row is not of size 3, the //tr data is not from our table \n",
" if len(T)!=3:\n",
" break\n",
" \n",
" #i is the index of our column\n",
" i=0\n",
" \n",
" #Iterate through each element of the row\n",
" for t in T.iterchildren():\n",
" data=t.text_content() \n",
" #Check if row is empty\n",
"\n",
" #Append the data to the empty list of the i'th column\n",
" col[i][1].append(data)\n",
" #Increment i for the next column\n",
" i+=1"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[288, 288, 288]"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"[len(C) for (title,C) in col]"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [],
"source": [
"#Create a dataframe with exported data\n",
"Dict={title:column for (title,column) in col}\n",
"df=pd.DataFrame(Dict)"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Postcode</th>\n",
" <th>Borough</th>\n",
" <th>Neighbourhood</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>M1A</td>\n",
" <td>Not assigned</td>\n",
" <td>Not assigned\\n</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>M2A</td>\n",
" <td>Not assigned</td>\n",
" <td>Not assigned\\n</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>M3A</td>\n",
" <td>North York</td>\n",
" <td>Parkwoods\\n</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>M4A</td>\n",
" <td>North York</td>\n",
" <td>Victoria Village\\n</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>M5A</td>\n",
" <td>Downtown Toronto</td>\n",
" <td>Harbourfront\\n</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>M5A</td>\n",
" <td>Downtown Toronto</td>\n",
" <td>Regent Park\\n</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>M6A</td>\n",
" <td>North York</td>\n",
" <td>Lawrence Heights\\n</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>M6A</td>\n",
" <td>North York</td>\n",
" <td>Lawrence Manor\\n</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>M7A</td>\n",
" <td>Queen's Park</td>\n",
" <td>Not assigned\\n</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>M8A</td>\n",
" <td>Not assigned</td>\n",
" <td>Not assigned\\n</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Postcode Borough Neighbourhood\\n\n",
"0 M1A Not assigned Not assigned\\n\n",
"1 M2A Not assigned Not assigned\\n\n",
"2 M3A North York Parkwoods\\n\n",
"3 M4A North York Victoria Village\\n\n",
"4 M5A Downtown Toronto Harbourfront\\n\n",
"5 M5A Downtown Toronto Regent Park\\n\n",
"6 M6A North York Lawrence Heights\\n\n",
"7 M6A North York Lawrence Manor\\n\n",
"8 M7A Queen's Park Not assigned\\n\n",
"9 M8A Not assigned Not assigned\\n"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df.head(10)"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(288, 3)"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df.shape"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [],
"source": [
"# Ignore cells with a borough that is Not assigned.\n",
"df_1 = df[df['Borough'] != 'Not assigned'].reset_index()"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>index</th>\n",
" <th>Postcode</th>\n",
" <th>Borough</th>\n",
" <th>Neighbourhood</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>2</td>\n",
" <td>M3A</td>\n",
" <td>North York</td>\n",
" <td>Parkwoods\\n</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>3</td>\n",
" <td>M4A</td>\n",
" <td>North York</td>\n",
" <td>Victoria Village\\n</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>4</td>\n",
" <td>M5A</td>\n",
" <td>Downtown Toronto</td>\n",
" <td>Harbourfront\\n</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>5</td>\n",
" <td>M5A</td>\n",
" <td>Downtown Toronto</td>\n",
" <td>Regent Park\\n</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>6</td>\n",
" <td>M6A</td>\n",
" <td>North York</td>\n",
" <td>Lawrence Heights\\n</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>7</td>\n",
" <td>M6A</td>\n",
" <td>North York</td>\n",
" <td>Lawrence Manor\\n</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>8</td>\n",
" <td>M7A</td>\n",
" <td>Queen's Park</td>\n",
" <td>Not assigned\\n</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>10</td>\n",
" <td>M9A</td>\n",
" <td>Etobicoke</td>\n",
" <td>Islington Avenue\\n</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>11</td>\n",
" <td>M1B</td>\n",
" <td>Scarborough</td>\n",
" <td>Rouge\\n</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>12</td>\n",
" <td>M1B</td>\n",
" <td>Scarborough</td>\n",
" <td>Malvern\\n</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" index Postcode Borough Neighbourhood\\n\n",
"0 2 M3A North York Parkwoods\\n\n",
"1 3 M4A North York Victoria Village\\n\n",
"2 4 M5A Downtown Toronto Harbourfront\\n\n",
"3 5 M5A Downtown Toronto Regent Park\\n\n",
"4 6 M6A North York Lawrence Heights\\n\n",
"5 7 M6A North York Lawrence Manor\\n\n",
"6 8 M7A Queen's Park Not assigned\\n\n",
"7 10 M9A Etobicoke Islington Avenue\\n\n",
"8 11 M1B Scarborough Rouge\\n\n",
"9 12 M1B Scarborough Malvern\\n"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_1.head(10)"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"103"
]
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_1['Postcode'].unique().size"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [],
"source": [
"df_1.columns = ['Drop','Postcode', 'Borough', 'Neighborhood']"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Drop</th>\n",
" <th>Postcode</th>\n",
" <th>Borough</th>\n",
" <th>Neighborhood</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>2</td>\n",
" <td>M3A</td>\n",
" <td>North York</td>\n",
" <td>Parkwoods\\n</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>3</td>\n",
" <td>M4A</td>\n",
" <td>North York</td>\n",
" <td>Victoria Village\\n</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>4</td>\n",
" <td>M5A</td>\n",
" <td>Downtown Toronto</td>\n",
" <td>Harbourfront\\n</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>5</td>\n",
" <td>M5A</td>\n",
" <td>Downtown Toronto</td>\n",
" <td>Regent Park\\n</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>6</td>\n",
" <td>M6A</td>\n",
" <td>North York</td>\n",
" <td>Lawrence Heights\\n</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Drop Postcode Borough Neighborhood\n",
"0 2 M3A North York Parkwoods\\n\n",
"1 3 M4A North York Victoria Village\\n\n",
"2 4 M5A Downtown Toronto Harbourfront\\n\n",
"3 5 M5A Downtown Toronto Regent Park\\n\n",
"4 6 M6A North York Lawrence Heights\\n"
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_1.head()"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [],
"source": [
"df_2 = df_1[['Postcode','Borough','Neighborhood']]"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Postcode</th>\n",
" <th>Borough</th>\n",
" <th>Neighborhood</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>M3A</td>\n",
" <td>North York</td>\n",
" <td>Parkwoods\\n</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>M4A</td>\n",
" <td>North York</td>\n",
" <td>Victoria Village\\n</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>M5A</td>\n",
" <td>Downtown Toronto</td>\n",
" <td>Harbourfront\\n</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>M5A</td>\n",
" <td>Downtown Toronto</td>\n",
" <td>Regent Park\\n</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>M6A</td>\n",
" <td>North York</td>\n",
" <td>Lawrence Heights\\n</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Postcode Borough Neighborhood\n",
"0 M3A North York Parkwoods\\n\n",
"1 M4A North York Victoria Village\\n\n",
"2 M5A Downtown Toronto Harbourfront\\n\n",
"3 M5A Downtown Toronto Regent Park\\n\n",
"4 M6A North York Lawrence Heights\\n"
]
},
"execution_count": 17,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_2.head()"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [],
"source": [
"df_2 = df_2.groupby(['Postcode','Borough'])['Neighborhood'].apply(', '.join).reset_index()"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Postcode</th>\n",
" <th>Borough</th>\n",
" <th>Neighborhood</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>M1B</td>\n",
" <td>Scarborough</td>\n",
" <td>Rouge\\n, Malvern\\n</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>M1C</td>\n",
" <td>Scarborough</td>\n",
" <td>Highland Creek\\n, Rouge Hill\\n, Port Union\\n</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>M1E</td>\n",
" <td>Scarborough</td>\n",
" <td>Guildwood\\n, Morningside\\n, West Hill\\n</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>M1G</td>\n",
" <td>Scarborough</td>\n",
" <td>Woburn\\n</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>M1H</td>\n",
" <td>Scarborough</td>\n",
" <td>Cedarbrae\\n</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>M1J</td>\n",
" <td>Scarborough</td>\n",
" <td>Scarborough Village\\n</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>M1K</td>\n",
" <td>Scarborough</td>\n",
" <td>East Birchmount Park\\n, Ionview\\n, Kennedy Park\\n</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>M1L</td>\n",
" <td>Scarborough</td>\n",
" <td>Clairlea\\n, Golden Mile\\n, Oakridge\\n</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>M1M</td>\n",
" <td>Scarborough</td>\n",
" <td>Cliffcrest\\n, Cliffside\\n, Scarborough Village...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>M1N</td>\n",
" <td>Scarborough</td>\n",
" <td>Birch Cliff\\n, Cliffside West\\n</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Postcode Borough Neighborhood\n",
"0 M1B Scarborough Rouge\\n, Malvern\\n\n",
"1 M1C Scarborough Highland Creek\\n, Rouge Hill\\n, Port Union\\n\n",
"2 M1E Scarborough Guildwood\\n, Morningside\\n, West Hill\\n\n",
"3 M1G Scarborough Woburn\\n\n",
"4 M1H Scarborough Cedarbrae\\n\n",
"5 M1J Scarborough Scarborough Village\\n\n",
"6 M1K Scarborough East Birchmount Park\\n, Ionview\\n, Kennedy Park\\n\n",
"7 M1L Scarborough Clairlea\\n, Golden Mile\\n, Oakridge\\n\n",
"8 M1M Scarborough Cliffcrest\\n, Cliffside\\n, Scarborough Village...\n",
"9 M1N Scarborough Birch Cliff\\n, Cliffside West\\n"
]
},
"execution_count": 19,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_2.head(10)"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(103, 3)"
]
},
"execution_count": 20,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_2.shape"
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {},
"outputs": [],
"source": [
"#Create a dataframe including lotitude and longitude data\n",
"url_coordinates = 'http://cocl.us/Geospatial_data'\n",
"coordinates = pd.read_csv(url_coordinates)"
]
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Postal Code</th>\n",
" <th>Latitude</th>\n",
" <th>Longitude</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>M1B</td>\n",
" <td>43.806686</td>\n",
" <td>-79.194353</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>M1C</td>\n",
" <td>43.784535</td>\n",
" <td>-79.160497</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>M1E</td>\n",
" <td>43.763573</td>\n",
" <td>-79.188711</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>M1G</td>\n",
" <td>43.770992</td>\n",
" <td>-79.216917</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>M1H</td>\n",
" <td>43.773136</td>\n",
" <td>-79.239476</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Postal Code Latitude Longitude\n",
"0 M1B 43.806686 -79.194353\n",
"1 M1C 43.784535 -79.160497\n",
"2 M1E 43.763573 -79.188711\n",
"3 M1G 43.770992 -79.216917\n",
"4 M1H 43.773136 -79.239476"
]
},
"execution_count": 27,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"coordinates.head()"
]
},
{
"cell_type": "code",
"execution_count": 30,
"metadata": {},
"outputs": [],
"source": [
"#Change the name of column in order to merge with other dataframe\n",
"coordinates.rename(columns={\"Postal Code\":\"Postcode\"}, inplace=True)"
]
},
{
"cell_type": "code",
"execution_count": 31,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Postcode</th>\n",
" <th>Latitude</th>\n",
" <th>Longitude</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>M1B</td>\n",
" <td>43.806686</td>\n",
" <td>-79.194353</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>M1C</td>\n",
" <td>43.784535</td>\n",
" <td>-79.160497</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>M1E</td>\n",
" <td>43.763573</td>\n",
" <td>-79.188711</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>M1G</td>\n",
" <td>43.770992</td>\n",
" <td>-79.216917</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>M1H</td>\n",
" <td>43.773136</td>\n",
" <td>-79.239476</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Postcode Latitude Longitude\n",
"0 M1B 43.806686 -79.194353\n",
"1 M1C 43.784535 -79.160497\n",
"2 M1E 43.763573 -79.188711\n",
"3 M1G 43.770992 -79.216917\n",
"4 M1H 43.773136 -79.239476"
]
},
"execution_count": 31,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"coordinates.head()"
]
},
{
"cell_type": "code",
"execution_count": 32,
"metadata": {},
"outputs": [],
"source": [
"df_merged = pd.merge(df_2, coordinates, on='Postcode') # Merge two dataframes on Postcode"
]
},
{
"cell_type": "code",
"execution_count": 33,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Postcode</th>\n",
" <th>Borough</th>\n",
" <th>Neighborhood</th>\n",
" <th>Latitude</th>\n",
" <th>Longitude</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>M1B</td>\n",
" <td>Scarborough</td>\n",
" <td>Rouge\\n, Malvern\\n</td>\n",
" <td>43.806686</td>\n",
" <td>-79.194353</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>M1C</td>\n",
" <td>Scarborough</td>\n",
" <td>Highland Creek\\n, Rouge Hill\\n, Port Union\\n</td>\n",
" <td>43.784535</td>\n",
" <td>-79.160497</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>M1E</td>\n",
" <td>Scarborough</td>\n",
" <td>Guildwood\\n, Morningside\\n, West Hill\\n</td>\n",
" <td>43.763573</td>\n",
" <td>-79.188711</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>M1G</td>\n",
" <td>Scarborough</td>\n",
" <td>Woburn\\n</td>\n",
" <td>43.770992</td>\n",
" <td>-79.216917</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>M1H</td>\n",
" <td>Scarborough</td>\n",
" <td>Cedarbrae\\n</td>\n",
" <td>43.773136</td>\n",
" <td>-79.239476</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Postcode Borough Neighborhood \\\n",
"0 M1B Scarborough Rouge\\n, Malvern\\n \n",
"1 M1C Scarborough Highland Creek\\n, Rouge Hill\\n, Port Union\\n \n",
"2 M1E Scarborough Guildwood\\n, Morningside\\n, West Hill\\n \n",
"3 M1G Scarborough Woburn\\n \n",
"4 M1H Scarborough Cedarbrae\\n \n",
"\n",
" Latitude Longitude \n",
"0 43.806686 -79.194353 \n",
"1 43.784535 -79.160497 \n",
"2 43.763573 -79.188711 \n",
"3 43.770992 -79.216917 \n",
"4 43.773136 -79.239476 "
]
},
"execution_count": 33,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_merged.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Before we start exploring, let's download all the dependencies that we will need."
]
},
{
"cell_type": "code",
"execution_count": 34,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Libraries imported.\n"
]
}
],
"source": [
"import numpy as np # library to handle data in a vectorized manner\n",
"\n",
"import pandas as pd # library for data analsysis\n",
"pd.set_option('display.max_columns', None)\n",
"pd.set_option('display.max_rows', None)\n",
"\n",
"import json # library to handle JSON files\n",
"\n",
"#!conda install -c conda-forge geopy --yes # uncomment this line if you haven't completed the Foursquare API lab\n",
"from geopy.geocoders import Nominatim # convert an address into latitude and longitude values\n",
"\n",
"import requests # library to handle requests\n",
"from pandas.io.json import json_normalize # tranform JSON file into a pandas dataframe\n",
"\n",
"# Matplotlib and associated plotting modules\n",
"import matplotlib.cm as cm\n",
"import matplotlib.colors as colors\n",
"\n",
"# import k-means from clustering stage\n",
"from sklearn.cluster import KMeans\n",
"\n",
"#!conda install -c conda-forge folium=0.5.0 --yes # uncomment this line if you haven't completed the Foursquare API lab\n",
"import folium # map rendering library\n",
"\n",
"print('Libraries imported.')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Use geopy library to get the latitude and longitude values of New York City"
]
},
{
"cell_type": "code",
"execution_count": 36,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"The geograpical coordinate of Toronto are 43.653963, -79.387207.\n"
]
}
],
"source": [
"address = 'Toronto, CA'\n",
"\n",
"geolocator = Nominatim(user_agent=\"toronto_explorer\")\n",
"location = geolocator.geocode(address)\n",
"latitude = location.latitude\n",
"longitude = location.longitude\n",
"print('The geograpical coordinate of Toronto are {}, {}.'.format(latitude, longitude))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Create a map of New York with neighborhoods superimposed on top."
]
},
{
"cell_type": "code",
"execution_count": 37,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div style=\"width:100%;\"><div style=\"position:relative;width:100%;height:0;padding-bottom:60%;\"><iframe src=\"data:text/html;charset=utf-8;base64,PCFET0NUWVBFIGh0bWw+CjxoZWFkPiAgICAKICAgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPgogICAgPHNjcmlwdD5MX1BSRUZFUl9DQU5WQVMgPSBmYWxzZTsgTF9OT19UT1VDSCA9IGZhbHNlOyBMX0RJU0FCTEVfM0QgPSBmYWxzZTs8L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2FqYXguZ29vZ2xlYXBpcy5jb20vYWpheC9saWJzL2pxdWVyeS8xLjExLjEvanF1ZXJ5Lm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvanMvYm9vdHN0cmFwLm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvTGVhZmxldC5hd2Vzb21lLW1hcmtlcnMvMi4wLjIvbGVhZmxldC5hd2Vzb21lLW1hcmtlcnMuanMiPjwvc2NyaXB0PgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9jc3MvYm9vdHN0cmFwLm1pbi5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvY3NzL2Jvb3RzdHJhcC10aGVtZS5taW4uY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vbWF4Y2RuLmJvb3RzdHJhcGNkbi5jb20vZm9udC1hd2Vzb21lLzQuNi4zL2Nzcy9mb250LWF3ZXNvbWUubWluLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9MZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy8yLjAuMi9sZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9yYXdnaXQuY29tL3B5dGhvbi12aXN1YWxpemF0aW9uL2ZvbGl1bS9tYXN0ZXIvZm9saXVtL3RlbXBsYXRlcy9sZWFmbGV0LmF3ZXNvbWUucm90YXRlLmNzcyIvPgogICAgPHN0eWxlPmh0bWwsIGJvZHkge3dpZHRoOiAxMDAlO2hlaWdodDogMTAwJTttYXJnaW46IDA7cGFkZGluZzogMDt9PC9zdHlsZT4KICAgIDxzdHlsZT4jbWFwIHtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtyaWdodDowO2xlZnQ6MDt9PC9zdHlsZT4KICAgIAogICAgICAgICAgICA8c3R5bGU+ICNtYXBfNjU2OGY0OGRhY2JjNGQ0N2IxOTZkYjBlODA3ODA0ZmIgewogICAgICAgICAgICAgICAgcG9zaXRpb24gOiByZWxhdGl2ZTsKICAgICAgICAgICAgICAgIHdpZHRoIDogMTAwLjAlOwogICAgICAgICAgICAgICAgaGVpZ2h0OiAxMDAuMCU7CiAgICAgICAgICAgICAgICBsZWZ0OiAwLjAlOwogICAgICAgICAgICAgICAgdG9wOiAwLjAlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICA8L3N0eWxlPgogICAgICAgIAo8L2hlYWQ+Cjxib2R5PiAgICAKICAgIAogICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb2xpdW0tbWFwIiBpZD0ibWFwXzY1NjhmNDhkYWNiYzRkNDdiMTk2ZGIwZTgwNzgwNGZiIiA+PC9kaXY+CiAgICAgICAgCjwvYm9keT4KPHNjcmlwdD4gICAgCiAgICAKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGJvdW5kcyA9IG51bGw7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcF82NTY4ZjQ4ZGFjYmM0ZDQ3YjE5NmRiMGU4MDc4MDRmYiA9IEwubWFwKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21hcF82NTY4ZjQ4ZGFjYmM0ZDQ3YjE5NmRiMGU4MDc4MDRmYicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y2VudGVyOiBbNDMuNjUzOTYzLC03OS4zODcyMDddLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgem9vbTogMTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhCb3VuZHM6IGJvdW5kcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyczogW10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JsZENvcHlKdW1wOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyczogTC5DUlMuRVBTRzM4NTcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciB0aWxlX2xheWVyX2FiNzFiYmE1ZmY4ODQzMWY5YjM1Y2IzMTdmNTNmMjM1ID0gTC50aWxlTGF5ZXIoCiAgICAgICAgICAgICAgICAnaHR0cHM6Ly97c30udGlsZS5vcGVuc3RyZWV0bWFwLm9yZy97en0ve3h9L3t5fS5wbmcnLAogICAgICAgICAgICAgICAgewogICJhdHRyaWJ1dGlvbiI6IG51bGwsCiAgImRldGVjdFJldGluYSI6IGZhbHNlLAogICJtYXhab29tIjogMTgsCiAgIm1pblpvb20iOiAxLAogICJub1dyYXAiOiBmYWxzZSwKICAic3ViZG9tYWlucyI6ICJhYmMiCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzY1NjhmNDhkYWNiYzRkNDdiMTk2ZGIwZTgwNzgwNGZiKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mNDNiYzhjNzBhZjQ0NjEyYWM4M2UzODAyOTVhZDIzYSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjgwNjY4NjI5OTk5OTk5NiwtNzkuMTk0MzUzNDAwMDAwMDFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNjU2OGY0OGRhY2JjNGQ0N2IxOTZkYjBlODA3ODA0ZmIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOGE5NjU0NmM3YWU2NDc2Zjk3ZDhkYzNiMmVmOGRmYzkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNzRkNmI0ZWQzM2Y5NGE2MzgwNzM0MzdlOGNhZTNlOTAgPSAkKCc8ZGl2IGlkPSJodG1sXzc0ZDZiNGVkMzNmOTRhNjM4MDczNDM3ZThjYWUzZTkwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Sb3VnZSAsIE1hbHZlcm4gLCBTY2FyYm9yb3VnaDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOGE5NjU0NmM3YWU2NDc2Zjk3ZDhkYzNiMmVmOGRmYzkuc2V0Q29udGVudChodG1sXzc0ZDZiNGVkMzNmOTRhNjM4MDczNDM3ZThjYWUzZTkwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2Y0M2JjOGM3MGFmNDQ2MTJhYzgzZTM4MDI5NWFkMjNhLmJpbmRQb3B1cChwb3B1cF84YTk2NTQ2YzdhZTY0NzZmOTdkOGRjM2IyZWY4ZGZjOSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mMWM0ZjMwNzBjNzk0ZWNhYTlmYWU3OTNlYTllNWZkMiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjc4NDUzNTEsLTc5LjE2MDQ5NzA5OTk5OTk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzY1NjhmNDhkYWNiYzRkNDdiMTk2ZGIwZTgwNzgwNGZiKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzQ0MzMyMWM3M2ZhMTRlZmU4ZGRkMzVjYWQ0YjY5OGNkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzY2YzQ1OWRjNGU3MTRhYjk5MjJjNzA4OTU5OWQxMGFiID0gJCgnPGRpdiBpZD0iaHRtbF82NmM0NTlkYzRlNzE0YWI5OTIyYzcwODk1OTlkMTBhYiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+SGlnaGxhbmQgQ3JlZWsgLCBSb3VnZSBIaWxsICwgUG9ydCBVbmlvbiAsIFNjYXJib3JvdWdoPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80NDMzMjFjNzNmYTE0ZWZlOGRkZDM1Y2FkNGI2OThjZC5zZXRDb250ZW50KGh0bWxfNjZjNDU5ZGM0ZTcxNGFiOTkyMmM3MDg5NTk5ZDEwYWIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZjFjNGYzMDcwYzc5NGVjYWE5ZmFlNzkzZWE5ZTVmZDIuYmluZFBvcHVwKHBvcHVwXzQ0MzMyMWM3M2ZhMTRlZmU4ZGRkMzVjYWQ0YjY5OGNkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzRkZDk4N2M1NWZmMDQyY2ViY2UwNmM5Y2VjMGUyMWZjID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzYzNTcyNiwtNzkuMTg4NzExNV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF82NTY4ZjQ4ZGFjYmM0ZDQ3YjE5NmRiMGU4MDc4MDRmYik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF81OTMzZDNmZmNjNWQ0YzE2YmM1MDU0Y2ZjMmFiMDdjZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mYWQ2ZmE5MmZlOGE0YjRhOTg2YTczY2U5NjM2NDkwOSA9ICQoJzxkaXYgaWQ9Imh0bWxfZmFkNmZhOTJmZThhNGI0YTk4NmE3M2NlOTYzNjQ5MDkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkd1aWxkd29vZCAsIE1vcm5pbmdzaWRlICwgV2VzdCBIaWxsICwgU2NhcmJvcm91Z2g8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzU5MzNkM2ZmY2M1ZDRjMTZiYzUwNTRjZmMyYWIwN2NmLnNldENvbnRlbnQoaHRtbF9mYWQ2ZmE5MmZlOGE0YjRhOTg2YTczY2U5NjM2NDkwOSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl80ZGQ5ODdjNTVmZjA0MmNlYmNlMDZjOWNlYzBlMjFmYy5iaW5kUG9wdXAocG9wdXBfNTkzM2QzZmZjYzVkNGMxNmJjNTA1NGNmYzJhYjA3Y2YpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZDU3YWU5ODc2YjExNDI4ZTkzZmQ2Yjk4MzhmMTg5NmMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43NzA5OTIxLC03OS4yMTY5MTc0MDAwMDAwMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF82NTY4ZjQ4ZGFjYmM0ZDQ3YjE5NmRiMGU4MDc4MDRmYik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wMDc2ZTY4YWVhMzk0NTQ0YTMzYzZhMmUzMGQyMGQ4YyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zODViM2VlZjIwODc0MWEyOTYyMmJkNzIzZjVhZjFhMSA9ICQoJzxkaXYgaWQ9Imh0bWxfMzg1YjNlZWYyMDg3NDFhMjk2MjJiZDcyM2Y1YWYxYTEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPldvYnVybiAsIFNjYXJib3JvdWdoPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wMDc2ZTY4YWVhMzk0NTQ0YTMzYzZhMmUzMGQyMGQ4Yy5zZXRDb250ZW50KGh0bWxfMzg1YjNlZWYyMDg3NDFhMjk2MjJiZDcyM2Y1YWYxYTEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZDU3YWU5ODc2YjExNDI4ZTkzZmQ2Yjk4MzhmMTg5NmMuYmluZFBvcHVwKHBvcHVwXzAwNzZlNjhhZWEzOTQ1NDRhMzNjNmEyZTMwZDIwZDhjKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzQ4YTQzZThkNzY3NDQ2ODA5NmQ0ZDNiOWYzNzVjMGFiID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzczMTM2LC03OS4yMzk0NzYwOTk5OTk5OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF82NTY4ZjQ4ZGFjYmM0ZDQ3YjE5NmRiMGU4MDc4MDRmYik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mNzE1NTgwOWM2ZWY0ZGMwODgyZjQ3MTFhODEyZWQ1YiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8yZWEwYTRiOGZhOWI0NDc4OGNhOTNmMjhhYzZhZjQ4OCA9ICQoJzxkaXYgaWQ9Imh0bWxfMmVhMGE0YjhmYTliNDQ3ODhjYTkzZjI4YWM2YWY0ODgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNlZGFyYnJhZSAsIFNjYXJib3JvdWdoPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mNzE1NTgwOWM2ZWY0ZGMwODgyZjQ3MTFhODEyZWQ1Yi5zZXRDb250ZW50KGh0bWxfMmVhMGE0YjhmYTliNDQ3ODhjYTkzZjI4YWM2YWY0ODgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNDhhNDNlOGQ3Njc0NDY4MDk2ZDRkM2I5ZjM3NWMwYWIuYmluZFBvcHVwKHBvcHVwX2Y3MTU1ODA5YzZlZjRkYzA4ODJmNDcxMWE4MTJlZDViKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2I1ZDdmMjk1ZDBiODQ1Y2I4MGM0MGZhOWU5ZDE3YmI3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzQ0NzM0MiwtNzkuMjM5NDc2MDk5OTk5OTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNjU2OGY0OGRhY2JjNGQ0N2IxOTZkYjBlODA3ODA0ZmIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZmNjMTQxMjY1MTRjNDgxMDk5ZjVjN2MxZDE4NjY3ZWEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfODRlMzIyZDQ4ZjQyNGYxYzg2MzU4N2NmMTdiMTM3ZmYgPSAkKCc8ZGl2IGlkPSJodG1sXzg0ZTMyMmQ0OGY0MjRmMWM4NjM1ODdjZjE3YjEzN2ZmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5TY2FyYm9yb3VnaCBWaWxsYWdlICwgU2NhcmJvcm91Z2g8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2ZjYzE0MTI2NTE0YzQ4MTA5OWY1YzdjMWQxODY2N2VhLnNldENvbnRlbnQoaHRtbF84NGUzMjJkNDhmNDI0ZjFjODYzNTg3Y2YxN2IxMzdmZik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9iNWQ3ZjI5NWQwYjg0NWNiODBjNDBmYTllOWQxN2JiNy5iaW5kUG9wdXAocG9wdXBfZmNjMTQxMjY1MTRjNDgxMDk5ZjVjN2MxZDE4NjY3ZWEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZTVkYTg5ZWY3ZjgyNDM1OGIyMzc3MmRjYjhjYWYwMWUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43Mjc5MjkyLC03OS4yNjIwMjk0MDAwMDAwMl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF82NTY4ZjQ4ZGFjYmM0ZDQ3YjE5NmRiMGU4MDc4MDRmYik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF80ZTZkZjlmMmQ1OWI0NjFlODA1NjdmMGM5M2MxNDNhMSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kYmU4YzYzN2NiY2I0ZGM1OGIxOWFiMjNhYzdjNWViOSA9ICQoJzxkaXYgaWQ9Imh0bWxfZGJlOGM2MzdjYmNiNGRjNThiMTlhYjIzYWM3YzVlYjkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkVhc3QgQmlyY2htb3VudCBQYXJrICwgSW9udmlldyAsIEtlbm5lZHkgUGFyayAsIFNjYXJib3JvdWdoPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80ZTZkZjlmMmQ1OWI0NjFlODA1NjdmMGM5M2MxNDNhMS5zZXRDb250ZW50KGh0bWxfZGJlOGM2MzdjYmNiNGRjNThiMTlhYjIzYWM3YzVlYjkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZTVkYTg5ZWY3ZjgyNDM1OGIyMzc3MmRjYjhjYWYwMWUuYmluZFBvcHVwKHBvcHVwXzRlNmRmOWYyZDU5YjQ2MWU4MDU2N2YwYzkzYzE0M2ExKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2E5YWEwNzEwMGI5YzRiMDM5MjAyYjBkNzc4ZDFlNjYyID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzExMTExNzAwMDAwMDA0LC03OS4yODQ1NzcyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzY1NjhmNDhkYWNiYzRkNDdiMTk2ZGIwZTgwNzgwNGZiKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzgyMjNjMzgxYTEzNzRiMzc4MDc1ZDkwMDI5NWEzMjBjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzc5M2M2ZmFjZmQ3NTRmYWM5MDk2ZjU2YjJhZWM4OGQ2ID0gJCgnPGRpdiBpZD0iaHRtbF83OTNjNmZhY2ZkNzU0ZmFjOTA5NmY1NmIyYWVjODhkNiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q2xhaXJsZWEgLCBHb2xkZW4gTWlsZSAsIE9ha3JpZGdlICwgU2NhcmJvcm91Z2g8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzgyMjNjMzgxYTEzNzRiMzc4MDc1ZDkwMDI5NWEzMjBjLnNldENvbnRlbnQoaHRtbF83OTNjNmZhY2ZkNzU0ZmFjOTA5NmY1NmIyYWVjODhkNik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9hOWFhMDcxMDBiOWM0YjAzOTIwMmIwZDc3OGQxZTY2Mi5iaW5kUG9wdXAocG9wdXBfODIyM2MzODFhMTM3NGIzNzgwNzVkOTAwMjk1YTMyMGMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYmZlYjkxMjQzYmE5NDdiYmE4MzAzOWY3MmM3Zjk2MTIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43MTYzMTYsLTc5LjIzOTQ3NjA5OTk5OTk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzY1NjhmNDhkYWNiYzRkNDdiMTk2ZGIwZTgwNzgwNGZiKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2VkODVkZGZmNGJkZjQ4Y2M4YzFmYTQwZWZmNmJkMWIzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2IyN2U5YjNlOGY3NzQ2NDQ5ZDVlY2MzMTAwYmVlYmU5ID0gJCgnPGRpdiBpZD0iaHRtbF9iMjdlOWIzZThmNzc0NjQ0OWQ1ZWNjMzEwMGJlZWJlOSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q2xpZmZjcmVzdCAsIENsaWZmc2lkZSAsIFNjYXJib3JvdWdoIFZpbGxhZ2UgV2VzdCAsIFNjYXJib3JvdWdoPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lZDg1ZGRmZjRiZGY0OGNjOGMxZmE0MGVmZjZiZDFiMy5zZXRDb250ZW50KGh0bWxfYjI3ZTliM2U4Zjc3NDY0NDlkNWVjYzMxMDBiZWViZTkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYmZlYjkxMjQzYmE5NDdiYmE4MzAzOWY3MmM3Zjk2MTIuYmluZFBvcHVwKHBvcHVwX2VkODVkZGZmNGJkZjQ4Y2M4YzFmYTQwZWZmNmJkMWIzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzZlYjBhMmRmOTg1NzRhZjJhMmFlMTE3ODllODA1YTQ1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjkyNjU3MDAwMDAwMDA0LC03OS4yNjQ4NDgxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzY1NjhmNDhkYWNiYzRkNDdiMTk2ZGIwZTgwNzgwNGZiKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzcxOWQwNjEwOWNjOTQ0OTE4ODJiODRmNWVmZmUyNmU4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzJlMjNlNTU2ZWQ0NTQ0ZjlhZjQ4YTEzM2I5YjY5ZDQ5ID0gJCgnPGRpdiBpZD0iaHRtbF8yZTIzZTU1NmVkNDU0NGY5YWY0OGExMzNiOWI2OWQ0OSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QmlyY2ggQ2xpZmYgLCBDbGlmZnNpZGUgV2VzdCAsIFNjYXJib3JvdWdoPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83MTlkMDYxMDljYzk0NDkxODgyYjg0ZjVlZmZlMjZlOC5zZXRDb250ZW50KGh0bWxfMmUyM2U1NTZlZDQ1NDRmOWFmNDhhMTMzYjliNjlkNDkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNmViMGEyZGY5ODU3NGFmMmEyYWUxMTc4OWU4MDVhNDUuYmluZFBvcHVwKHBvcHVwXzcxOWQwNjEwOWNjOTQ0OTE4ODJiODRmNWVmZmUyNmU4KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2NlNGM4NjYzMTNiOTQ4MzM5MjYxMTUxZjM4ODAxYzFjID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzU3NDA5NiwtNzkuMjczMzA0MDAwMDAwMDFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNjU2OGY0OGRhY2JjNGQ0N2IxOTZkYjBlODA3ODA0ZmIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZTM0ZjAzZmY3MzIyNDQwYzk1NjI0OTY0YmRjYzlhYzQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOThiZmM0YjMxYmEyNDczZTgzZjZmNGJjOWE2ZjExZjEgPSAkKCc8ZGl2IGlkPSJodG1sXzk4YmZjNGIzMWJhMjQ3M2U4M2Y2ZjRiYzlhNmYxMWYxIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Eb3JzZXQgUGFyayAsIFNjYXJib3JvdWdoIFRvd24gQ2VudHJlICwgV2V4Zm9yZCBIZWlnaHRzICwgU2NhcmJvcm91Z2g8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2UzNGYwM2ZmNzMyMjQ0MGM5NTYyNDk2NGJkY2M5YWM0LnNldENvbnRlbnQoaHRtbF85OGJmYzRiMzFiYTI0NzNlODNmNmY0YmM5YTZmMTFmMSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9jZTRjODY2MzEzYjk0ODMzOTI2MTE1MWYzODgwMWMxYy5iaW5kUG9wdXAocG9wdXBfZTM0ZjAzZmY3MzIyNDQwYzk1NjI0OTY0YmRjYzlhYzQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfODU1NjU5YzY4MGE2NDBjNmIzZmFjMzg0NjMyZDczMjkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43NTAwNzE1MDAwMDAwMDQsLTc5LjI5NTg0OTFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNjU2OGY0OGRhY2JjNGQ0N2IxOTZkYjBlODA3ODA0ZmIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNTBlYWEwMWJlMDdhNDY5NTljZmYzYzk2NGQ1NTViOWQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNzQyYTYwNTg3NDc1NGRlZGEwNjE4OWYwN2M4ODI2NTggPSAkKCc8ZGl2IGlkPSJodG1sXzc0MmE2MDU4NzQ3NTRkZWRhMDYxODlmMDdjODgyNjU4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NYXJ5dmFsZSAsIFdleGZvcmQgLCBTY2FyYm9yb3VnaDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNTBlYWEwMWJlMDdhNDY5NTljZmYzYzk2NGQ1NTViOWQuc2V0Q29udGVudChodG1sXzc0MmE2MDU4NzQ3NTRkZWRhMDYxODlmMDdjODgyNjU4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzg1NTY1OWM2ODBhNjQwYzZiM2ZhYzM4NDYzMmQ3MzI5LmJpbmRQb3B1cChwb3B1cF81MGVhYTAxYmUwN2E0Njk1OWNmZjNjOTY0ZDU1NWI5ZCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9iOTFmNjhiMTZlMzM0YzJiYmYwMWVlMWI3MjRiYWUxMSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjc5NDIwMDMsLTc5LjI2MjAyOTQwMDAwMDAyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzY1NjhmNDhkYWNiYzRkNDdiMTk2ZGIwZTgwNzgwNGZiKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2IyM2E2Mzg4MTE2YzRkNGI4NmVkNjZkZjZjNmI2YmU0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzk5NzI0NzkyMzcxYzRlYmI4ODc0ZTA0NmM5YmJkMWI1ID0gJCgnPGRpdiBpZD0iaHRtbF85OTcyNDc5MjM3MWM0ZWJiODg3NGUwNDZjOWJiZDFiNSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QWdpbmNvdXJ0ICwgU2NhcmJvcm91Z2g8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2IyM2E2Mzg4MTE2YzRkNGI4NmVkNjZkZjZjNmI2YmU0LnNldENvbnRlbnQoaHRtbF85OTcyNDc5MjM3MWM0ZWJiODg3NGUwNDZjOWJiZDFiNSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9iOTFmNjhiMTZlMzM0YzJiYmYwMWVlMWI3MjRiYWUxMS5iaW5kUG9wdXAocG9wdXBfYjIzYTYzODgxMTZjNGQ0Yjg2ZWQ2NmRmNmM2YjZiZTQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMDg3ZGU3NTYxZWQ4NDM2YzgzNTdmMjBhMTdkZmQ1YzcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43ODE2Mzc1LC03OS4zMDQzMDIxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzY1NjhmNDhkYWNiYzRkNDdiMTk2ZGIwZTgwNzgwNGZiKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2E1ZjA3ZmM3ODgxZTRkZTRiMTQ1ZGEyOThhZTIxMDNhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzAzMzg5MzcxMDc3YjQ4NWVhYjJmZmZkYTFmODFlZGNmID0gJCgnPGRpdiBpZD0iaHRtbF8wMzM4OTM3MTA3N2I0ODVlYWIyZmZmZGExZjgxZWRjZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q2xhcmtzIENvcm5lcnMgLCBTdWxsaXZhbiAsIFRhbSBPJiMzOTtTaGFudGVyICwgU2NhcmJvcm91Z2g8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2E1ZjA3ZmM3ODgxZTRkZTRiMTQ1ZGEyOThhZTIxMDNhLnNldENvbnRlbnQoaHRtbF8wMzM4OTM3MTA3N2I0ODVlYWIyZmZmZGExZjgxZWRjZik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8wODdkZTc1NjFlZDg0MzZjODM1N2YyMGExN2RmZDVjNy5iaW5kUG9wdXAocG9wdXBfYTVmMDdmYzc4ODFlNGRlNGIxNDVkYTI5OGFlMjEwM2EpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNDc3YTBiM2ZjYWUyNGViMTljYzAzNGRhMDRhOGZkYjMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My44MTUyNTIyLC03OS4yODQ1NzcyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzY1NjhmNDhkYWNiYzRkNDdiMTk2ZGIwZTgwNzgwNGZiKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2FiMjg4YzM5NmY0ODRlYjA5Yzc0MzA0ZmFkNzM4MDUyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2YzZWNiMmQxZjNhZTRiNWQ5YjNmMzA2NjlmMzhiZjc1ID0gJCgnPGRpdiBpZD0iaHRtbF9mM2VjYjJkMWYzYWU0YjVkOWIzZjMwNjY5ZjM4YmY3NSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QWdpbmNvdXJ0IE5vcnRoICwgTCYjMzk7QW1vcmVhdXggRWFzdCAsIE1pbGxpa2VuICwgU3RlZWxlcyBFYXN0ICwgU2NhcmJvcm91Z2g8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2FiMjg4YzM5NmY0ODRlYjA5Yzc0MzA0ZmFkNzM4MDUyLnNldENvbnRlbnQoaHRtbF9mM2VjYjJkMWYzYWU0YjVkOWIzZjMwNjY5ZjM4YmY3NSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl80NzdhMGIzZmNhZTI0ZWIxOWNjMDM0ZGEwNGE4ZmRiMy5iaW5kUG9wdXAocG9wdXBfYWIyODhjMzk2ZjQ4NGViMDljNzQzMDRmYWQ3MzgwNTIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNTg2MDk1YjZhNGQ3NDU3NzkxYTlkMWVjYjhiZDdmOWIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43OTk1MjUyMDAwMDAwMDUsLTc5LjMxODM4ODddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNjU2OGY0OGRhY2JjNGQ0N2IxOTZkYjBlODA3ODA0ZmIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMTY0MjQyYWYwMjRiNDllM2ExYzUxYmJjNDgxNDE0ZmUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfN2M1N2NkZWEyMWUzNGI0N2FkMDU1ZDg5NTZkM2UyMjggPSAkKCc8ZGl2IGlkPSJodG1sXzdjNTdjZGVhMjFlMzRiNDdhZDA1NWQ4OTU2ZDNlMjI4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5MJiMzOTtBbW9yZWF1eCBXZXN0ICwgU2NhcmJvcm91Z2g8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzE2NDI0MmFmMDI0YjQ5ZTNhMWM1MWJiYzQ4MTQxNGZlLnNldENvbnRlbnQoaHRtbF83YzU3Y2RlYTIxZTM0YjQ3YWQwNTVkODk1NmQzZTIyOCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81ODYwOTViNmE0ZDc0NTc3OTFhOWQxZWNiOGJkN2Y5Yi5iaW5kUG9wdXAocG9wdXBfMTY0MjQyYWYwMjRiNDllM2ExYzUxYmJjNDgxNDE0ZmUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMDNkYmY5NDZmZGMyNDNjM2E5ODdkNTk3N2NjODRiYmUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My44MzYxMjQ3MDAwMDAwMDYsLTc5LjIwNTYzNjA5OTk5OTk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzY1NjhmNDhkYWNiYzRkNDdiMTk2ZGIwZTgwNzgwNGZiKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzU3ZmU5NDQ5YmNlNjQxMjFhYjU5NDU1Njk0YzQzYTFhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzNlNDgxYzFhNDVhMTQxMTk4ODA5ZmJmOTlmMjhhNDgyID0gJCgnPGRpdiBpZD0iaHRtbF8zZTQ4MWMxYTQ1YTE0MTE5ODgwOWZiZjk5ZjI4YTQ4MiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+VXBwZXIgUm91Z2UgLCBTY2FyYm9yb3VnaDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNTdmZTk0NDliY2U2NDEyMWFiNTk0NTU2OTRjNDNhMWEuc2V0Q29udGVudChodG1sXzNlNDgxYzFhNDVhMTQxMTk4ODA5ZmJmOTlmMjhhNDgyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzAzZGJmOTQ2ZmRjMjQzYzNhOTg3ZDU5NzdjYzg0YmJlLmJpbmRQb3B1cChwb3B1cF81N2ZlOTQ0OWJjZTY0MTIxYWI1OTQ1NTY5NGM0M2ExYSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81OGQ3MmQ3ZWU2MmY0YzAxYjQzYzcyODQwMDk0YzA0MiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjgwMzc2MjIsLTc5LjM2MzQ1MTddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNjU2OGY0OGRhY2JjNGQ0N2IxOTZkYjBlODA3ODA0ZmIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYjZhODhmZjY4Yzk3NDRkOGJiMjI5MGQ2YzU1NTY4NGMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMjcxYWJhMTIxNGFmNDVlYWJmNTk0M2EzNmE5ODkzZDkgPSAkKCc8ZGl2IGlkPSJodG1sXzI3MWFiYTEyMTRhZjQ1ZWFiZjU5NDNhMzZhOTg5M2Q5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5IaWxsY3Jlc3QgVmlsbGFnZSAsIE5vcnRoIFlvcms8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2I2YTg4ZmY2OGM5NzQ0ZDhiYjIyOTBkNmM1NTU2ODRjLnNldENvbnRlbnQoaHRtbF8yNzFhYmExMjE0YWY0NWVhYmY1OTQzYTM2YTk4OTNkOSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81OGQ3MmQ3ZWU2MmY0YzAxYjQzYzcyODQwMDk0YzA0Mi5iaW5kUG9wdXAocG9wdXBfYjZhODhmZjY4Yzk3NDRkOGJiMjI5MGQ2YzU1NTY4NGMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNWJmMWQ5Yjk4Y2Y0NDA4ZWFlNjAyYmI5MDAzNzU4NWMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43Nzg1MTc1LC03OS4zNDY1NTU3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzY1NjhmNDhkYWNiYzRkNDdiMTk2ZGIwZTgwNzgwNGZiKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzdjYmFhNDE4ZGNmMTRiYTViNmM2MmMxZGFiZGM0MTk4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2Y2N2YzMTJmYzNmNDRmYzRhNjRiNjUzNzdmYWQ1OGEzID0gJCgnPGRpdiBpZD0iaHRtbF9mNjdmMzEyZmMzZjQ0ZmM0YTY0YjY1Mzc3ZmFkNThhMyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RmFpcnZpZXcgLCBIZW5yeSBGYXJtICwgT3Jpb2xlICwgTm9ydGggWW9yazwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfN2NiYWE0MThkY2YxNGJhNWI2YzYyYzFkYWJkYzQxOTguc2V0Q29udGVudChodG1sX2Y2N2YzMTJmYzNmNDRmYzRhNjRiNjUzNzdmYWQ1OGEzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzViZjFkOWI5OGNmNDQwOGVhZTYwMmJiOTAwMzc1ODVjLmJpbmRQb3B1cChwb3B1cF83Y2JhYTQxOGRjZjE0YmE1YjZjNjJjMWRhYmRjNDE5OCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81MmY2Mjk1OWM2MjI0ZmQ0YTllNDZmYmE0YTRhMDA4YyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjc4Njk0NzMsLTc5LjM4NTk3NV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF82NTY4ZjQ4ZGFjYmM0ZDQ3YjE5NmRiMGU4MDc4MDRmYik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mYmVkYWRmODA2NWQ0NzdmYjNiMjNlZGI5YjVkZTA4NiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mMTkyZDA4NDU5OWY0ODllOGVmY2NlZWU2NzVhYzEzNCA9ICQoJzxkaXYgaWQ9Imh0bWxfZjE5MmQwODQ1OTlmNDg5ZThlZmNjZWVlNjc1YWMxMzQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkJheXZpZXcgVmlsbGFnZSAsIE5vcnRoIFlvcms8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2ZiZWRhZGY4MDY1ZDQ3N2ZiM2IyM2VkYjliNWRlMDg2LnNldENvbnRlbnQoaHRtbF9mMTkyZDA4NDU5OWY0ODllOGVmY2NlZWU2NzVhYzEzNCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81MmY2Mjk1OWM2MjI0ZmQ0YTllNDZmYmE0YTRhMDA4Yy5iaW5kUG9wdXAocG9wdXBfZmJlZGFkZjgwNjVkNDc3ZmIzYjIzZWRiOWI1ZGUwODYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZmE5MDQ3ODhhOWMzNDAxZGFmOWE0OWY1MDFmZDhiMjggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43NTc0OTAyLC03OS4zNzQ3MTQwOTk5OTk5OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF82NTY4ZjQ4ZGFjYmM0ZDQ3YjE5NmRiMGU4MDc4MDRmYik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hMDg0YWFkNjVkNzQ0ODlmYjU1YTA0NGM3YzBiNzBlYSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hZjQzYTYyMDYwMTY0ZWE2Yjk5NGRhNWY5MGVjMTkzYyA9ICQoJzxkaXYgaWQ9Imh0bWxfYWY0M2E2MjA2MDE2NGVhNmI5OTRkYTVmOTBlYzE5M2MiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlNpbHZlciBIaWxscyAsIFlvcmsgTWlsbHMgLCBOb3J0aCBZb3JrPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hMDg0YWFkNjVkNzQ0ODlmYjU1YTA0NGM3YzBiNzBlYS5zZXRDb250ZW50KGh0bWxfYWY0M2E2MjA2MDE2NGVhNmI5OTRkYTVmOTBlYzE5M2MpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZmE5MDQ3ODhhOWMzNDAxZGFmOWE0OWY1MDFmZDhiMjguYmluZFBvcHVwKHBvcHVwX2EwODRhYWQ2NWQ3NDQ4OWZiNTVhMDQ0YzdjMGI3MGVhKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2FlMGExY2FlZDI4ZjQ5MTQ4Mjc1ZjA0YjExMzlhNTlmID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzg5MDUzLC03OS40MDg0OTI3OTk5OTk5OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF82NTY4ZjQ4ZGFjYmM0ZDQ3YjE5NmRiMGU4MDc4MDRmYik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hZWZkMDkwYWRlZmY0MGJhOWNlYzRlMGFkODc0ZDkwZSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mNjgyY2ZiNDNmODU0OTQzOGE3NmIwNWQ2NGU1OGQ2YyA9ICQoJzxkaXYgaWQ9Imh0bWxfZjY4MmNmYjQzZjg1NDk0MzhhNzZiMDVkNjRlNThkNmMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk5ld3RvbmJyb29rICwgV2lsbG93ZGFsZSAsIE5vcnRoIFlvcms8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2FlZmQwOTBhZGVmZjQwYmE5Y2VjNGUwYWQ4NzRkOTBlLnNldENvbnRlbnQoaHRtbF9mNjgyY2ZiNDNmODU0OTQzOGE3NmIwNWQ2NGU1OGQ2Yyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9hZTBhMWNhZWQyOGY0OTE0ODI3NWYwNGIxMTM5YTU5Zi5iaW5kUG9wdXAocG9wdXBfYWVmZDA5MGFkZWZmNDBiYTljZWM0ZTBhZDg3NGQ5MGUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZTBkYzY3YjJjYTA0NDMzYzlkMjBlMWJlMWQ2OWM5YWQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43NzAxMTk5LC03OS40MDg0OTI3OTk5OTk5OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF82NTY4ZjQ4ZGFjYmM0ZDQ3YjE5NmRiMGU4MDc4MDRmYik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lOGViYWJhNmI1OGM0ODk0OTFkMTE1ODFkMjlkNzJkZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82YjQzN2Q0NDI3ZDk0ZTNlOGI3NWI1MDlkNmQ3NjlkYSA9ICQoJzxkaXYgaWQ9Imh0bWxfNmI0MzdkNDQyN2Q5NGUzZThiNzViNTA5ZDZkNzY5ZGEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPldpbGxvd2RhbGUgU291dGggLCBOb3J0aCBZb3JrPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lOGViYWJhNmI1OGM0ODk0OTFkMTE1ODFkMjlkNzJkZC5zZXRDb250ZW50KGh0bWxfNmI0MzdkNDQyN2Q5NGUzZThiNzViNTA5ZDZkNzY5ZGEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZTBkYzY3YjJjYTA0NDMzYzlkMjBlMWJlMWQ2OWM5YWQuYmluZFBvcHVwKHBvcHVwX2U4ZWJhYmE2YjU4YzQ4OTQ5MWQxMTU4MWQyOWQ3MmRkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzBhZWZlOGYxZjcwNDRkOThiNGJmMzhkYTJmZTBjYzI2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzUyNzU4Mjk5OTk5OTk2LC03OS40MDAwNDkzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzY1NjhmNDhkYWNiYzRkNDdiMTk2ZGIwZTgwNzgwNGZiKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2M1ZmE1NzNlYmY4NzRkYTJhYWRhMTQ2MmY2ZmMyOWM0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2QxZWUwZmM4MjAzYTQ3N2FhYjcwZTY1NTNkOTExOWQyID0gJCgnPGRpdiBpZD0iaHRtbF9kMWVlMGZjODIwM2E0NzdhYWI3MGU2NTUzZDkxMTlkMiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WW9yayBNaWxscyBXZXN0ICwgTm9ydGggWW9yazwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYzVmYTU3M2ViZjg3NGRhMmFhZGExNDYyZjZmYzI5YzQuc2V0Q29udGVudChodG1sX2QxZWUwZmM4MjAzYTQ3N2FhYjcwZTY1NTNkOTExOWQyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzBhZWZlOGYxZjcwNDRkOThiNGJmMzhkYTJmZTBjYzI2LmJpbmRQb3B1cChwb3B1cF9jNWZhNTczZWJmODc0ZGEyYWFkYTE0NjJmNmZjMjljNCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mZWIzMDFkNjc1NmI0ZDViYjM3ZjQyYTQ5ZTYxOWM3MiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjc4MjczNjQsLTc5LjQ0MjI1OTNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNjU2OGY0OGRhY2JjNGQ0N2IxOTZkYjBlODA3ODA0ZmIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMzIwYzllNmVkOTBmNDg4ZTlkZWYxMGZjM2Q2ZDQ3ZDMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMDUxYTBkZjE1MzAxNGQyZThjNzQxMzg5ZTg2M2I2NDIgPSAkKCc8ZGl2IGlkPSJodG1sXzA1MWEwZGYxNTMwMTRkMmU4Yzc0MTM4OWU4NjNiNjQyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5XaWxsb3dkYWxlIFdlc3QgLCBOb3J0aCBZb3JrPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zMjBjOWU2ZWQ5MGY0ODhlOWRlZjEwZmMzZDZkNDdkMy5zZXRDb250ZW50KGh0bWxfMDUxYTBkZjE1MzAxNGQyZThjNzQxMzg5ZTg2M2I2NDIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZmViMzAxZDY3NTZiNGQ1YmIzN2Y0MmE0OWU2MTljNzIuYmluZFBvcHVwKHBvcHVwXzMyMGM5ZTZlZDkwZjQ4OGU5ZGVmMTBmYzNkNmQ0N2QzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzEwNmQ5ZTdjOTM0MzRjMmU5MDRkYjFmMmY0ZDkxMzQzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzUzMjU4NiwtNzkuMzI5NjU2NV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF82NTY4ZjQ4ZGFjYmM0ZDQ3YjE5NmRiMGU4MDc4MDRmYik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iMzBjMDEyMGI5MjY0N2RjYWY3YThhYTYyZWQ0N2RiNCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8yZDU5NWVjY2NiOWQ0NjdjYWZhYjcwZDU2MjgwOTg2OSA9ICQoJzxkaXYgaWQ9Imh0bWxfMmQ1OTVlY2NjYjlkNDY3Y2FmYWI3MGQ1NjI4MDk4NjkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlBhcmt3b29kcyAsIE5vcnRoIFlvcms8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2IzMGMwMTIwYjkyNjQ3ZGNhZjdhOGFhNjJlZDQ3ZGI0LnNldENvbnRlbnQoaHRtbF8yZDU5NWVjY2NiOWQ0NjdjYWZhYjcwZDU2MjgwOTg2OSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8xMDZkOWU3YzkzNDM0YzJlOTA0ZGIxZjJmNGQ5MTM0My5iaW5kUG9wdXAocG9wdXBfYjMwYzAxMjBiOTI2NDdkY2FmN2E4YWE2MmVkNDdkYjQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNzhlZjQ3MjM5MzQ3NGYyMzlkYTkyM2I1YTA4MzM2YzcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43NDU5MDU3OTk5OTk5OTYsLTc5LjM1MjE4OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF82NTY4ZjQ4ZGFjYmM0ZDQ3YjE5NmRiMGU4MDc4MDRmYik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9jMjdkZjg2ZWQ3NGM0YmVlOWYyMDA2NDhmNDQ0MWVjMiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wMDliMzQ1ZWJiZjY0MjAwODhhYzc2OTM1ZDA0NDg3MCA9ICQoJzxkaXYgaWQ9Imh0bWxfMDA5YjM0NWViYmY2NDIwMDg4YWM3NjkzNWQwNDQ4NzAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkRvbiBNaWxscyBOb3J0aCAsIE5vcnRoIFlvcms8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2MyN2RmODZlZDc0YzRiZWU5ZjIwMDY0OGY0NDQxZWMyLnNldENvbnRlbnQoaHRtbF8wMDliMzQ1ZWJiZjY0MjAwODhhYzc2OTM1ZDA0NDg3MCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl83OGVmNDcyMzkzNDc0ZjIzOWRhOTIzYjVhMDgzMzZjNy5iaW5kUG9wdXAocG9wdXBfYzI3ZGY4NmVkNzRjNGJlZTlmMjAwNjQ4ZjQ0NDFlYzIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYzU1OTlkMGI3ODg3NGQ5NGE1YzdlNjc4ZGE1YWE5YTYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43MjU4OTk3MDAwMDAwMSwtNzkuMzQwOTIzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzY1NjhmNDhkYWNiYzRkNDdiMTk2ZGIwZTgwNzgwNGZiKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzgyZmExMzM5MDBhNzQxOGViNjk4N2I2YWE1ZDg1ZmM0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2UwMDgwNmE2MTYyNjRkM2I4NWZmNzVjMzYwNTg4NDg5ID0gJCgnPGRpdiBpZD0iaHRtbF9lMDA4MDZhNjE2MjY0ZDNiODVmZjc1YzM2MDU4ODQ4OSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RmxlbWluZ2RvbiBQYXJrICwgRG9uIE1pbGxzIFNvdXRoICwgTm9ydGggWW9yazwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfODJmYTEzMzkwMGE3NDE4ZWI2OTg3YjZhYTVkODVmYzQuc2V0Q29udGVudChodG1sX2UwMDgwNmE2MTYyNjRkM2I4NWZmNzVjMzYwNTg4NDg5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2M1NTk5ZDBiNzg4NzRkOTRhNWM3ZTY3OGRhNWFhOWE2LmJpbmRQb3B1cChwb3B1cF84MmZhMTMzOTAwYTc0MThlYjY5ODdiNmFhNWQ4NWZjNCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xYzdlYWZkY2M5MGU0OGVkYjY2OWU1NmY0NWI5YmE4MyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjc1NDMyODMsLTc5LjQ0MjI1OTNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNjU2OGY0OGRhY2JjNGQ0N2IxOTZkYjBlODA3ODA0ZmIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZmEzMmU4ZDFiZGQxNGI2NTkxY2U2YWY0YzFmZGI4MDggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMWFmOTY2MTlkM2Y0NDZkMGI4MjU3Yzc0NTM2OTY2ZTQgPSAkKCc8ZGl2IGlkPSJodG1sXzFhZjk2NjE5ZDNmNDQ2ZDBiODI1N2M3NDUzNjk2NmU0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5CYXRodXJzdCBNYW5vciAsIERvd25zdmlldyBOb3J0aCAsIFdpbHNvbiBIZWlnaHRzICwgTm9ydGggWW9yazwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZmEzMmU4ZDFiZGQxNGI2NTkxY2U2YWY0YzFmZGI4MDguc2V0Q29udGVudChodG1sXzFhZjk2NjE5ZDNmNDQ2ZDBiODI1N2M3NDUzNjk2NmU0KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzFjN2VhZmRjYzkwZTQ4ZWRiNjY5ZTU2ZjQ1YjliYTgzLmJpbmRQb3B1cChwb3B1cF9mYTMyZThkMWJkZDE0YjY1OTFjZTZhZjRjMWZkYjgwOCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8zMmUyMTY5NzQ3YzE0NDljYmFjYTNmZjk5OWJiYTI0ZiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjc2Nzk4MDMsLTc5LjQ4NzI2MTkwMDAwMDAxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzY1NjhmNDhkYWNiYzRkNDdiMTk2ZGIwZTgwNzgwNGZiKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2FkMDYzZWFkNWJhYzQ4NWU5ZDJhM2M2ZWI0MTUxYzUxID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2U3ZTEwY2RlNWJiOTQ1ZmQ5M2UwOGIyYzc5NDYyY2UwID0gJCgnPGRpdiBpZD0iaHRtbF9lN2UxMGNkZTViYjk0NWZkOTNlMDhiMmM3OTQ2MmNlMCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Tm9ydGh3b29kIFBhcmsgLCBZb3JrIFVuaXZlcnNpdHkgLCBOb3J0aCBZb3JrPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hZDA2M2VhZDViYWM0ODVlOWQyYTNjNmViNDE1MWM1MS5zZXRDb250ZW50KGh0bWxfZTdlMTBjZGU1YmI5NDVmZDkzZTA4YjJjNzk0NjJjZTApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMzJlMjE2OTc0N2MxNDQ5Y2JhY2EzZmY5OTliYmEyNGYuYmluZFBvcHVwKHBvcHVwX2FkMDYzZWFkNWJhYzQ4NWU5ZDJhM2M2ZWI0MTUxYzUxKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzRlMWIxYmU4YWJjMjRhYzdhYTE3MGUzZWE3MDg0N2VkID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzM3NDczMjAwMDAwMDA0LC03OS40NjQ3NjMyOTk5OTk5OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF82NTY4ZjQ4ZGFjYmM0ZDQ3YjE5NmRiMGU4MDc4MDRmYik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iNjU4MGJmMGMzOGY0ODViOTI3OGZjY2FkNmY0MzRjNiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iM2U2YzAzOWQyM2Y0Mjg5ODA1OTU1ZGNiYzUwOTNlYyA9ICQoJzxkaXYgaWQ9Imh0bWxfYjNlNmMwMzlkMjNmNDI4OTgwNTk1NWRjYmM1MDkzZWMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNGQiBUb3JvbnRvICwgRG93bnN2aWV3IEVhc3QgLCBOb3J0aCBZb3JrPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iNjU4MGJmMGMzOGY0ODViOTI3OGZjY2FkNmY0MzRjNi5zZXRDb250ZW50KGh0bWxfYjNlNmMwMzlkMjNmNDI4OTgwNTk1NWRjYmM1MDkzZWMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNGUxYjFiZThhYmMyNGFjN2FhMTcwZTNlYTcwODQ3ZWQuYmluZFBvcHVwKHBvcHVwX2I2NTgwYmYwYzM4ZjQ4NWI5Mjc4ZmNjYWQ2ZjQzNGM2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzIzMzk4NjJjYTYxODRmMzg5YWQwYzg2OGVkYTRjZDcxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzM5MDE0NiwtNzkuNTA2OTQzNl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF82NTY4ZjQ4ZGFjYmM0ZDQ3YjE5NmRiMGU4MDc4MDRmYik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lMGU3ZjgxZjZiNmM0ZmEzYjc2NDJiNmIzMGE5YmQ4NyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF85MDk0NGQ2MThhZjA0MjMxYWJiOGEzODM2NThlZGJkYyA9ICQoJzxkaXYgaWQ9Imh0bWxfOTA5NDRkNjE4YWYwNDIzMWFiYjhhMzgzNjU4ZWRiZGMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkRvd25zdmlldyBXZXN0ICwgTm9ydGggWW9yazwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZTBlN2Y4MWY2YjZjNGZhM2I3NjQyYjZiMzBhOWJkODcuc2V0Q29udGVudChodG1sXzkwOTQ0ZDYxOGFmMDQyMzFhYmI4YTM4MzY1OGVkYmRjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzIzMzk4NjJjYTYxODRmMzg5YWQwYzg2OGVkYTRjZDcxLmJpbmRQb3B1cChwb3B1cF9lMGU3ZjgxZjZiNmM0ZmEzYjc2NDJiNmIzMGE5YmQ4Nyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8zNzhjODVlZTNkZDM0ZTYyOGZiMmNhMWJkMjM1MmYxMSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjcyODQ5NjQsLTc5LjQ5NTY5NzQwMDAwMDAxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzY1NjhmNDhkYWNiYzRkNDdiMTk2ZGIwZTgwNzgwNGZiKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzdkOTZjZTExOGFjNjQ3MWNiYmY0NWQ5OWUxNGQzMTUzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzQ2N2NhMTE3YzJiZDQ2NGJhYjZmYjkyY2EzOWQ1YzRmID0gJCgnPGRpdiBpZD0iaHRtbF80NjdjYTExN2MyYmQ0NjRiYWI2ZmI5MmNhMzlkNWM0ZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RG93bnN2aWV3IENlbnRyYWwgLCBOb3J0aCBZb3JrPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83ZDk2Y2UxMThhYzY0NzFjYmJmNDVkOTllMTRkMzE1My5zZXRDb250ZW50KGh0bWxfNDY3Y2ExMTdjMmJkNDY0YmFiNmZiOTJjYTM5ZDVjNGYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMzc4Yzg1ZWUzZGQzNGU2MjhmYjJjYTFiZDIzNTJmMTEuYmluZFBvcHVwKHBvcHVwXzdkOTZjZTExOGFjNjQ3MWNiYmY0NWQ5OWUxNGQzMTUzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzFkNmUyYmE3ZDc0YTQ2M2Y5ODU5ZmUwOTI3Zjg2ODlmID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzYxNjMxMywtNzkuNTIwOTk5NDAwMDAwMDFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNjU2OGY0OGRhY2JjNGQ0N2IxOTZkYjBlODA3ODA0ZmIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYWFjOGIwMGEzYjAyNGM2MzkxNDAwZmI2Njk0ZTViNTIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMzBhNDhiODZmNzVjNGQzNGJiNWJlYzAwNWY0MzUxZTYgPSAkKCc8ZGl2IGlkPSJodG1sXzMwYTQ4Yjg2Zjc1YzRkMzRiYjViZWMwMDVmNDM1MWU2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Eb3duc3ZpZXcgTm9ydGh3ZXN0ICwgTm9ydGggWW9yazwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYWFjOGIwMGEzYjAyNGM2MzkxNDAwZmI2Njk0ZTViNTIuc2V0Q29udGVudChodG1sXzMwYTQ4Yjg2Zjc1YzRkMzRiYjViZWMwMDVmNDM1MWU2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzFkNmUyYmE3ZDc0YTQ2M2Y5ODU5ZmUwOTI3Zjg2ODlmLmJpbmRQb3B1cChwb3B1cF9hYWM4YjAwYTNiMDI0YzYzOTE0MDBmYjY2OTRlNWI1Mik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9iOTkxYzM1ZTY4YmU0ZjkxOWNkYjRiNTk1NGRiZmFiMCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjcyNTg4MjI5OTk5OTk5NSwtNzkuMzE1NTcxNTk5OTk5OThdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNjU2OGY0OGRhY2JjNGQ0N2IxOTZkYjBlODA3ODA0ZmIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNThjYmIzZDFiY2M3NGMxMmJiM2RkYzQ5Y2RjNWE0NTUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYjQ1YmQ4ZDM2MWIzNDQ4ZTg4YTY4NDFlNzU2ZTAwZDIgPSAkKCc8ZGl2IGlkPSJodG1sX2I0NWJkOGQzNjFiMzQ0OGU4OGE2ODQxZTc1NmUwMGQyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5WaWN0b3JpYSBWaWxsYWdlICwgTm9ydGggWW9yazwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNThjYmIzZDFiY2M3NGMxMmJiM2RkYzQ5Y2RjNWE0NTUuc2V0Q29udGVudChodG1sX2I0NWJkOGQzNjFiMzQ0OGU4OGE2ODQxZTc1NmUwMGQyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2I5OTFjMzVlNjhiZTRmOTE5Y2RiNGI1OTU0ZGJmYWIwLmJpbmRQb3B1cChwb3B1cF81OGNiYjNkMWJjYzc0YzEyYmIzZGRjNDljZGM1YTQ1NSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl84MzhjZGQyZTE0ZmQ0MDMzYTMxZDE4MmQxYTJjNzc5MiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjcwNjM5NzIsLTc5LjMwOTkzN10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF82NTY4ZjQ4ZGFjYmM0ZDQ3YjE5NmRiMGU4MDc4MDRmYik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iODBmODRhODA4ZjE0NTJlOWZjMzlkMzcxYjU0NDY4MCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jYTNkMDk5NTU0OTM0ZDFjYTM1MjRiNzY5MGVkYTczOCA9ICQoJzxkaXYgaWQ9Imh0bWxfY2EzZDA5OTU1NDkzNGQxY2EzNTI0Yjc2OTBlZGE3MzgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPldvb2RiaW5lIEdhcmRlbnMgLCBQYXJrdmlldyBIaWxsICwgRWFzdCBZb3JrPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iODBmODRhODA4ZjE0NTJlOWZjMzlkMzcxYjU0NDY4MC5zZXRDb250ZW50KGh0bWxfY2EzZDA5OTU1NDkzNGQxY2EzNTI0Yjc2OTBlZGE3MzgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfODM4Y2RkMmUxNGZkNDAzM2EzMWQxODJkMWEyYzc3OTIuYmluZFBvcHVwKHBvcHVwX2I4MGY4NGE4MDhmMTQ1MmU5ZmMzOWQzNzFiNTQ0NjgwKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2EyNTYxMDVhYmVhZjQ1NGRhYzg0ZGRlYzQ1ZDM1NDU3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjk1MzQzOTAwMDAwMDA1LC03OS4zMTgzODg3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzY1NjhmNDhkYWNiYzRkNDdiMTk2ZGIwZTgwNzgwNGZiKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2M5NjJjNjg2ZTk3YzRiYTQ5ZTExMmI4MGE5NDk2N2RiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzc3YzE4NmU3MTVlZTRiNzc4ZjRjNjhiMzU1NTMxNjE2ID0gJCgnPGRpdiBpZD0iaHRtbF83N2MxODZlNzE1ZWU0Yjc3OGY0YzY4YjM1NTUzMTYxNiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+V29vZGJpbmUgSGVpZ2h0cyAsIEVhc3QgWW9yazwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYzk2MmM2ODZlOTdjNGJhNDllMTEyYjgwYTk0OTY3ZGIuc2V0Q29udGVudChodG1sXzc3YzE4NmU3MTVlZTRiNzc4ZjRjNjhiMzU1NTMxNjE2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2EyNTYxMDVhYmVhZjQ1NGRhYzg0ZGRlYzQ1ZDM1NDU3LmJpbmRQb3B1cChwb3B1cF9jOTYyYzY4NmU5N2M0YmE0OWUxMTJiODBhOTQ5NjdkYik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lYjAzYTFkMzU1NWY0OTY4ODE3MDI0MWU0N2MzZTE0NiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY3NjM1NzM5OTk5OTk5LC03OS4yOTMwMzEyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzY1NjhmNDhkYWNiYzRkNDdiMTk2ZGIwZTgwNzgwNGZiKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2I4OTU5MzQ1N2NiNDQ3OWY4MGZiMjc5N2E5MTliNTNiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzdmZTlhMGQwYTUxMjRlZjRhMWE3OGZlNDY1NzJiYmY4ID0gJCgnPGRpdiBpZD0iaHRtbF83ZmU5YTBkMGE1MTI0ZWY0YTFhNzhmZTQ2NTcyYmJmOCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+VGhlIEJlYWNoZXMgLCBFYXN0IFRvcm9udG88L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2I4OTU5MzQ1N2NiNDQ3OWY4MGZiMjc5N2E5MTliNTNiLnNldENvbnRlbnQoaHRtbF83ZmU5YTBkMGE1MTI0ZWY0YTFhNzhmZTQ2NTcyYmJmOCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9lYjAzYTFkMzU1NWY0OTY4ODE3MDI0MWU0N2MzZTE0Ni5iaW5kUG9wdXAocG9wdXBfYjg5NTkzNDU3Y2I0NDc5ZjgwZmIyNzk3YTkxOWI1M2IpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZGZjM2QwYzIzYzQwNDBmYjlhOGEwMDA1MmE2NjQyMDkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43MDkwNjA0LC03OS4zNjM0NTE3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzY1NjhmNDhkYWNiYzRkNDdiMTk2ZGIwZTgwNzgwNGZiKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzdjYzdjMWNkNTY1NDQyOGI4YzA0N2Y3YmM1ZWUxMDNkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzY5YWE5Y2NkNDVmMzQ5NjliZWRhMjE0YzlhMzYzMzg4ID0gJCgnPGRpdiBpZD0iaHRtbF82OWFhOWNjZDQ1ZjM0OTY5YmVkYTIxNGM5YTM2MzM4OCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TGVhc2lkZSAsIEVhc3QgWW9yazwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfN2NjN2MxY2Q1NjU0NDI4YjhjMDQ3ZjdiYzVlZTEwM2Quc2V0Q29udGVudChodG1sXzY5YWE5Y2NkNDVmMzQ5NjliZWRhMjE0YzlhMzYzMzg4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2RmYzNkMGMyM2M0MDQwZmI5YThhMDAwNTJhNjY0MjA5LmJpbmRQb3B1cChwb3B1cF83Y2M3YzFjZDU2NTQ0MjhiOGMwNDdmN2JjNWVlMTAzZCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8yMmExNWY4ZTc1NjM0NTliYWZiZDMzMjJjNTQ3NDU1YSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjcwNTM2ODksLTc5LjM0OTM3MTkwMDAwMDAxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzY1NjhmNDhkYWNiYzRkNDdiMTk2ZGIwZTgwNzgwNGZiKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzU1Y2U5OGI4YjczMDRkYTE5ZTk4NTBiMjQwMDk1NzY1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzI2N2U4Y2IyMDhmMjQ5ZDg4ZTM1NTM3MWRiMTIxZDA2ID0gJCgnPGRpdiBpZD0iaHRtbF8yNjdlOGNiMjA4ZjI0OWQ4OGUzNTUzNzFkYjEyMWQwNiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+VGhvcm5jbGlmZmUgUGFyayAsIEVhc3QgWW9yazwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNTVjZTk4YjhiNzMwNGRhMTllOTg1MGIyNDAwOTU3NjUuc2V0Q29udGVudChodG1sXzI2N2U4Y2IyMDhmMjQ5ZDg4ZTM1NTM3MWRiMTIxZDA2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzIyYTE1ZjhlNzU2MzQ1OWJhZmJkMzMyMmM1NDc0NTVhLmJpbmRQb3B1cChwb3B1cF81NWNlOThiOGI3MzA0ZGExOWU5ODUwYjI0MDA5NTc2NSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81ZTkzYzhjODY5YmQ0MWJiODBiNTFlMmNkN2IyYzFmNyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY4NTM0NywtNzkuMzM4MTA2NV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF82NTY4ZjQ4ZGFjYmM0ZDQ3YjE5NmRiMGU4MDc4MDRmYik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82YWM4Nzc3ZmMzODc0YzA0OTMwZTEwMTkzY2ZjYjc3YiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8yODI5NDJkNzMwYzE0MzBlYmU5MmFkNzQ2ODk4MjBiMiA9ICQoJzxkaXYgaWQ9Imh0bWxfMjgyOTQyZDczMGMxNDMwZWJlOTJhZDc0Njg5ODIwYjIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkVhc3QgVG9yb250byAsIEVhc3QgWW9yazwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNmFjODc3N2ZjMzg3NGMwNDkzMGUxMDE5M2NmY2I3N2Iuc2V0Q29udGVudChodG1sXzI4Mjk0MmQ3MzBjMTQzMGViZTkyYWQ3NDY4OTgyMGIyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzVlOTNjOGM4NjliZDQxYmI4MGI1MWUyY2Q3YjJjMWY3LmJpbmRQb3B1cChwb3B1cF82YWM4Nzc3ZmMzODc0YzA0OTMwZTEwMTkzY2ZjYjc3Yik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8wNTlkYWZhNmY3NDA0YjhmYWNjNWZhM2ZiMDQ2YjQ5NSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY3OTU1NzEsLTc5LjM1MjE4OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF82NTY4ZjQ4ZGFjYmM0ZDQ3YjE5NmRiMGU4MDc4MDRmYik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xYzdjOWFlNzI1ZTQ0YzcwYTFjMmE0M2I0YWRlZTQyMiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kZmM1NGNlMWI2YmQ0Y2VjYTM2YWMxM2FhNjU5NDQ3MiA9ICQoJzxkaXYgaWQ9Imh0bWxfZGZjNTRjZTFiNmJkNGNlY2EzNmFjMTNhYTY1OTQ0NzIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlRoZSBEYW5mb3J0aCBXZXN0ICwgUml2ZXJkYWxlICwgRWFzdCBUb3JvbnRvPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xYzdjOWFlNzI1ZTQ0YzcwYTFjMmE0M2I0YWRlZTQyMi5zZXRDb250ZW50KGh0bWxfZGZjNTRjZTFiNmJkNGNlY2EzNmFjMTNhYTY1OTQ0NzIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMDU5ZGFmYTZmNzQwNGI4ZmFjYzVmYTNmYjA0NmI0OTUuYmluZFBvcHVwKHBvcHVwXzFjN2M5YWU3MjVlNDRjNzBhMWMyYTQzYjRhZGVlNDIyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzBkOTRlOWRjNmJiMDQ1MmFiNjY2NTY1ZWRjNGIwMzg5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjY4OTk4NSwtNzkuMzE1NTcxNTk5OTk5OThdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNjU2OGY0OGRhY2JjNGQ0N2IxOTZkYjBlODA3ODA0ZmIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYjMxOWJiMzliNmUyNDY4N2E0OGUwZGNiMzI0ZGY1ZTcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfM2VmYjk5NzhjNjRhNGQxZDlhZmViYjcwMDVlOTU4ZGEgPSAkKCc8ZGl2IGlkPSJodG1sXzNlZmI5OTc4YzY0YTRkMWQ5YWZlYmI3MDA1ZTk1OGRhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5UaGUgQmVhY2hlcyBXZXN0ICwgSW5kaWEgQmF6YWFyICwgRWFzdCBUb3JvbnRvPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iMzE5YmIzOWI2ZTI0Njg3YTQ4ZTBkY2IzMjRkZjVlNy5zZXRDb250ZW50KGh0bWxfM2VmYjk5NzhjNjRhNGQxZDlhZmViYjcwMDVlOTU4ZGEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMGQ5NGU5ZGM2YmIwNDUyYWI2NjY1NjVlZGM0YjAzODkuYmluZFBvcHVwKHBvcHVwX2IzMTliYjM5YjZlMjQ2ODdhNDhlMGRjYjMyNGRmNWU3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2Q0NTAwZTAwMmIwNjRjMTVhYjcyMTVmNzQzMzM2MDNhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjU5NTI1NSwtNzkuMzQwOTIzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzY1NjhmNDhkYWNiYzRkNDdiMTk2ZGIwZTgwNzgwNGZiKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzMzOTllMjI5OTRlNzRlYWFhNTg3MjQ3NGE0Y2ViZTE3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2VhMzlkMTI4ZDE5NjQzZDU5N2JmMjU5MDdmMDgyNzNiID0gJCgnPGRpdiBpZD0iaHRtbF9lYTM5ZDEyOGQxOTY0M2Q1OTdiZjI1OTA3ZjA4MjczYiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U3R1ZGlvIERpc3RyaWN0ICwgRWFzdCBUb3JvbnRvPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zMzk5ZTIyOTk0ZTc0ZWFhYTU4NzI0NzRhNGNlYmUxNy5zZXRDb250ZW50KGh0bWxfZWEzOWQxMjhkMTk2NDNkNTk3YmYyNTkwN2YwODI3M2IpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZDQ1MDBlMDAyYjA2NGMxNWFiNzIxNWY3NDMzMzYwM2EuYmluZFBvcHVwKHBvcHVwXzMzOTllMjI5OTRlNzRlYWFhNTg3MjQ3NGE0Y2ViZTE3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2E2OWY5MTgxOGJmODQ0MzFiMTUzODU2ODhkYWQ2MDhlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzI4MDIwNSwtNzkuMzg4NzkwMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF82NTY4ZjQ4ZGFjYmM0ZDQ3YjE5NmRiMGU4MDc4MDRmYik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mNWYzYjI2MGNkYjE0NDdiOGRiZGRkODIwOTQ0MWI0MCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zMzZlZjQ0NGZlZDI0MmViYmY3ZWUyZmU3OTcwYjFmMiA9ICQoJzxkaXYgaWQ9Imh0bWxfMzM2ZWY0NDRmZWQyNDJlYmJmN2VlMmZlNzk3MGIxZjIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkxhd3JlbmNlIFBhcmsgLCBDZW50cmFsIFRvcm9udG88L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2Y1ZjNiMjYwY2RiMTQ0N2I4ZGJkZGQ4MjA5NDQxYjQwLnNldENvbnRlbnQoaHRtbF8zMzZlZjQ0NGZlZDI0MmViYmY3ZWUyZmU3OTcwYjFmMik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9hNjlmOTE4MThiZjg0NDMxYjE1Mzg1Njg4ZGFkNjA4ZS5iaW5kUG9wdXAocG9wdXBfZjVmM2IyNjBjZGIxNDQ3YjhkYmRkZDgyMDk0NDFiNDApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNThhYjQ5NzRjYzQ1NGU2NWIwMjYxOTM5M2NjZjRjNGIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43MTI3NTExLC03OS4zOTAxOTc1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzY1NjhmNDhkYWNiYzRkNDdiMTk2ZGIwZTgwNzgwNGZiKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2ZjNDI3NjVlZjBjMjQ0NDZhMjI0NGMxOWQ5ZDYwZjM0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzE4MzU2M2IwMzc5ZjRiOWQ5YWQ2NjA4YWVmNDRlZmE2ID0gJCgnPGRpdiBpZD0iaHRtbF8xODM1NjNiMDM3OWY0YjlkOWFkNjYwOGFlZjQ0ZWZhNiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RGF2aXN2aWxsZSBOb3J0aCAsIENlbnRyYWwgVG9yb250bzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZmM0Mjc2NWVmMGMyNDQ0NmEyMjQ0YzE5ZDlkNjBmMzQuc2V0Q29udGVudChodG1sXzE4MzU2M2IwMzc5ZjRiOWQ5YWQ2NjA4YWVmNDRlZmE2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzU4YWI0OTc0Y2M0NTRlNjViMDI2MTkzOTNjY2Y0YzRiLmJpbmRQb3B1cChwb3B1cF9mYzQyNzY1ZWYwYzI0NDQ2YTIyNDRjMTlkOWQ2MGYzNCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl82ZDk5MGJkMjYyYzQ0MDBmYWMzMjY1N2EyN2ExZGI0YiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjcxNTM4MzQsLTc5LjQwNTY3ODQwMDAwMDAxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzY1NjhmNDhkYWNiYzRkNDdiMTk2ZGIwZTgwNzgwNGZiKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2IyMTM5NDYxMTU2MzQ1OTg5MTRjNTVhY2FmYzgzMTc0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2JkNmVhNWMxYWUwNDQ4NjU4NTgwYTgxOGYyNTJkYzgxID0gJCgnPGRpdiBpZD0iaHRtbF9iZDZlYTVjMWFlMDQ0ODY1ODU4MGE4MThmMjUyZGM4MSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Tm9ydGggVG9yb250byBXZXN0ICwgQ2VudHJhbCBUb3JvbnRvPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iMjEzOTQ2MTE1NjM0NTk4OTE0YzU1YWNhZmM4MzE3NC5zZXRDb250ZW50KGh0bWxfYmQ2ZWE1YzFhZTA0NDg2NTg1ODBhODE4ZjI1MmRjODEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNmQ5OTBiZDI2MmM0NDAwZmFjMzI2NTdhMjdhMWRiNGIuYmluZFBvcHVwKHBvcHVwX2IyMTM5NDYxMTU2MzQ1OTg5MTRjNTVhY2FmYzgzMTc0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzViNzY3NzE5MWJlZjQ2MzdiYjQ2MjdjMWE3MWEyNWNjID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzA0MzI0NCwtNzkuMzg4NzkwMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF82NTY4ZjQ4ZGFjYmM0ZDQ3YjE5NmRiMGU4MDc4MDRmYik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hMjU0NGM1Y2IwZGM0N2E4YmYzNGJlODc4M2M3MDU4YSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8yYmM4NmM1ZWI0YzU0ZjNkYjEyNGQ5NzQ5YTZkNmZhOSA9ICQoJzxkaXYgaWQ9Imh0bWxfMmJjODZjNWViNGM1NGYzZGIxMjRkOTc0OWE2ZDZmYTkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkRhdmlzdmlsbGUgLCBDZW50cmFsIFRvcm9udG88L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2EyNTQ0YzVjYjBkYzQ3YThiZjM0YmU4NzgzYzcwNThhLnNldENvbnRlbnQoaHRtbF8yYmM4NmM1ZWI0YzU0ZjNkYjEyNGQ5NzQ5YTZkNmZhOSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81Yjc2NzcxOTFiZWY0NjM3YmI0NjI3YzFhNzFhMjVjYy5iaW5kUG9wdXAocG9wdXBfYTI1NDRjNWNiMGRjNDdhOGJmMzRiZTg3ODNjNzA1OGEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNmU2MWNiYjdmZjI0NDE4ZmFiYjFjNzMzM2QwOTE1OTQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42ODk1NzQzLC03OS4zODMxNTk5MDAwMDAwMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF82NTY4ZjQ4ZGFjYmM0ZDQ3YjE5NmRiMGU4MDc4MDRmYik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF81ZTU5NDFkY2JhMGQ0Y2EwOTg4NTQzMWU2YzNmYzE5NiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kNzgyMjdkMWExOTI0ZWZkYWI2YjRlYzAwMmQxYzQwNSA9ICQoJzxkaXYgaWQ9Imh0bWxfZDc4MjI3ZDFhMTkyNGVmZGFiNmI0ZWMwMDJkMWM0MDUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk1vb3JlIFBhcmsgLCBTdW1tZXJoaWxsIEVhc3QgLCBDZW50cmFsIFRvcm9udG88L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzVlNTk0MWRjYmEwZDRjYTA5ODg1NDMxZTZjM2ZjMTk2LnNldENvbnRlbnQoaHRtbF9kNzgyMjdkMWExOTI0ZWZkYWI2YjRlYzAwMmQxYzQwNSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl82ZTYxY2JiN2ZmMjQ0MThmYWJiMWM3MzMzZDA5MTU5NC5iaW5kUG9wdXAocG9wdXBfNWU1OTQxZGNiYTBkNGNhMDk4ODU0MzFlNmMzZmMxOTYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMmQ2NTc5NjNhMjE1NGI4M2FlNmM3YTBhNTZlYTIyMTAgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42ODY0MTIyOTk5OTk5OSwtNzkuNDAwMDQ5M10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF82NTY4ZjQ4ZGFjYmM0ZDQ3YjE5NmRiMGU4MDc4MDRmYik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF84MWUyOTA1M2Y5YTU0YTdjYTI1M2JlMmI3MTI5OWExOCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xZTc5MTA4MjdhMjg0MjNlYjI1MDU0MzMzZTQ5MmI3ZCA9ICQoJzxkaXYgaWQ9Imh0bWxfMWU3OTEwODI3YTI4NDIzZWIyNTA1NDMzM2U0OTJiN2QiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkRlZXIgUGFyayAsIEZvcmVzdCBIaWxsIFNFICwgUmF0aG5lbGx5ICwgU291dGggSGlsbCAsIFN1bW1lcmhpbGwgV2VzdCAsIENlbnRyYWwgVG9yb250bzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfODFlMjkwNTNmOWE1NGE3Y2EyNTNiZTJiNzEyOTlhMTguc2V0Q29udGVudChodG1sXzFlNzkxMDgyN2EyODQyM2ViMjUwNTQzMzNlNDkyYjdkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzJkNjU3OTYzYTIxNTRiODNhZTZjN2EwYTU2ZWEyMjEwLmJpbmRQb3B1cChwb3B1cF84MWUyOTA1M2Y5YTU0YTdjYTI1M2JlMmI3MTI5OWExOCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl80MTk2MDk5MzIxMWY0NDA4YTA0MDU2MDJjOGYzNzQzOCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY3OTU2MjYsLTc5LjM3NzUyOTQwMDAwMDAxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzY1NjhmNDhkYWNiYzRkNDdiMTk2ZGIwZTgwNzgwNGZiKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2YxNDM2ZTU3NWViZjQ2ZDQ5OWUxNDk0YTc3MmI5N2NhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzc3YzgyMjc4ZjYzODQ5Njg4NjVhYWNlOWI4YTIxMGE5ID0gJCgnPGRpdiBpZD0iaHRtbF83N2M4MjI3OGY2Mzg0OTY4ODY1YWFjZTliOGEyMTBhOSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Um9zZWRhbGUgLCBEb3dudG93biBUb3JvbnRvPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mMTQzNmU1NzVlYmY0NmQ0OTllMTQ5NGE3NzJiOTdjYS5zZXRDb250ZW50KGh0bWxfNzdjODIyNzhmNjM4NDk2ODg2NWFhY2U5YjhhMjEwYTkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNDE5NjA5OTMyMTFmNDQwOGEwNDA1NjAyYzhmMzc0MzguYmluZFBvcHVwKHBvcHVwX2YxNDM2ZTU3NWViZjQ2ZDQ5OWUxNDk0YTc3MmI5N2NhKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzlhZWQwZmJjOTBlMDRkYzE5N2M4YjRkNzhlMmRkNTYxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjY3OTY3LC03OS4zNjc2NzUzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzY1NjhmNDhkYWNiYzRkNDdiMTk2ZGIwZTgwNzgwNGZiKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2FlNDhmNzJjYzE5MjQ5NDRhZTJiNDVkYmQ3N2FiY2M0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzEzNmQ5MWNhZThhNTQ2MjZiY2UyNGMxOTBmYzA4MjZhID0gJCgnPGRpdiBpZD0iaHRtbF8xMzZkOTFjYWU4YTU0NjI2YmNlMjRjMTkwZmMwODI2YSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q2FiYmFnZXRvd24gLCBTdC4gSmFtZXMgVG93biAsIERvd250b3duIFRvcm9udG88L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2FlNDhmNzJjYzE5MjQ5NDRhZTJiNDVkYmQ3N2FiY2M0LnNldENvbnRlbnQoaHRtbF8xMzZkOTFjYWU4YTU0NjI2YmNlMjRjMTkwZmMwODI2YSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl85YWVkMGZiYzkwZTA0ZGMxOTdjOGI0ZDc4ZTJkZDU2MS5iaW5kUG9wdXAocG9wdXBfYWU0OGY3MmNjMTkyNDk0NGFlMmI0NWRiZDc3YWJjYzQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMTZlN2EyMmNmMWRkNDljNDg4MTM0MWNmNmZhNWNmZTYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42NjU4NTk5LC03OS4zODMxNTk5MDAwMDAwMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF82NTY4ZjQ4ZGFjYmM0ZDQ3YjE5NmRiMGU4MDc4MDRmYik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85ZTRmNGUxODhmOTQ0NzBmODA3MjZkMGU2ODQxZDM2YSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kNTE0MDk0MTNmOWU0MDZlODZjMDRjN2U2ZDUwYzIxZCA9ICQoJzxkaXYgaWQ9Imh0bWxfZDUxNDA5NDEzZjllNDA2ZTg2YzA0YzdlNmQ1MGMyMWQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNodXJjaCBhbmQgV2VsbGVzbGV5ICwgRG93bnRvd24gVG9yb250bzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOWU0ZjRlMTg4Zjk0NDcwZjgwNzI2ZDBlNjg0MWQzNmEuc2V0Q29udGVudChodG1sX2Q1MTQwOTQxM2Y5ZTQwNmU4NmMwNGM3ZTZkNTBjMjFkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzE2ZTdhMjJjZjFkZDQ5YzQ4ODEzNDFjZjZmYTVjZmU2LmJpbmRQb3B1cChwb3B1cF85ZTRmNGUxODhmOTQ0NzBmODA3MjZkMGU2ODQxZDM2YSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl80M2M4YzEwZGVjNDE0ZDBmYTY4YmRiOTdiMDc2MDMzOCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY1NDI1OTksLTc5LjM2MDYzNTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNjU2OGY0OGRhY2JjNGQ0N2IxOTZkYjBlODA3ODA0ZmIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNThlMDNiMTUwMjQyNDA1ZGE5NWE3ZGViNGRlOGYzZmUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNzBjMzI3NjVhZmJjNDBkZmEzZWViODg5YWZmZDdjOGMgPSAkKCc8ZGl2IGlkPSJodG1sXzcwYzMyNzY1YWZiYzQwZGZhM2VlYjg4OWFmZmQ3YzhjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5IYXJib3VyZnJvbnQgLCBSZWdlbnQgUGFyayAsIERvd250b3duIFRvcm9udG88L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzU4ZTAzYjE1MDI0MjQwNWRhOTVhN2RlYjRkZThmM2ZlLnNldENvbnRlbnQoaHRtbF83MGMzMjc2NWFmYmM0MGRmYTNlZWI4ODlhZmZkN2M4Yyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl80M2M4YzEwZGVjNDE0ZDBmYTY4YmRiOTdiMDc2MDMzOC5iaW5kUG9wdXAocG9wdXBfNThlMDNiMTUwMjQyNDA1ZGE5NWE3ZGViNGRlOGYzZmUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZDJkODk1ZWMzZDFmNGIyOWIzMmZjYWE0YWRjM2Q5M2YgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42NTcxNjE4LC03OS4zNzg5MzcwOTk5OTk5OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF82NTY4ZjQ4ZGFjYmM0ZDQ3YjE5NmRiMGU4MDc4MDRmYik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zYTQxOWU1YTcwY2E0YmMyYWE4NTE2Yjc5ZjJhOTkyMSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF85MWZiMTFiOTBiNTg0NTAzOTM3MTA1ODM0YTMyZDRiMyA9ICQoJzxkaXYgaWQ9Imh0bWxfOTFmYjExYjkwYjU4NDUwMzkzNzEwNTgzNGEzMmQ0YjMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlJ5ZXJzb24gLCBHYXJkZW4gRGlzdHJpY3QgLCBEb3dudG93biBUb3JvbnRvPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zYTQxOWU1YTcwY2E0YmMyYWE4NTE2Yjc5ZjJhOTkyMS5zZXRDb250ZW50KGh0bWxfOTFmYjExYjkwYjU4NDUwMzkzNzEwNTgzNGEzMmQ0YjMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZDJkODk1ZWMzZDFmNGIyOWIzMmZjYWE0YWRjM2Q5M2YuYmluZFBvcHVwKHBvcHVwXzNhNDE5ZTVhNzBjYTRiYzJhYTg1MTZiNzlmMmE5OTIxKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2IwNTQyNDExMzk2ODRjMDJiZWMwMjMxYmFmYmU5Y2E3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjUxNDkzOSwtNzkuMzc1NDE3OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF82NTY4ZjQ4ZGFjYmM0ZDQ3YjE5NmRiMGU4MDc4MDRmYik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85NWEzNTQ5Nzc5OTc0YzgzYTFkODM4Y2IyMjYxMTZlNyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lMTAyMDZmMTFkZTY0YzYxOTM1M2Q1MDlhZjIwZjJhNyA9ICQoJzxkaXYgaWQ9Imh0bWxfZTEwMjA2ZjExZGU2NGM2MTkzNTNkNTA5YWYyMGYyYTciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlN0LiBKYW1lcyBUb3duICwgRG93bnRvd24gVG9yb250bzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOTVhMzU0OTc3OTk3NGM4M2ExZDgzOGNiMjI2MTE2ZTcuc2V0Q29udGVudChodG1sX2UxMDIwNmYxMWRlNjRjNjE5MzUzZDUwOWFmMjBmMmE3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2IwNTQyNDExMzk2ODRjMDJiZWMwMjMxYmFmYmU5Y2E3LmJpbmRQb3B1cChwb3B1cF85NWEzNTQ5Nzc5OTc0YzgzYTFkODM4Y2IyMjYxMTZlNyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl82NTU0ZjI3Nzg4MjY0OGIzYTQ5ZWYxOWUyMjgzZjA2OCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY0NDc3MDc5OTk5OTk5NiwtNzkuMzczMzA2NF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF82NTY4ZjQ4ZGFjYmM0ZDQ3YjE5NmRiMGU4MDc4MDRmYik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mNTVjYjhjZWNkYjQ0ZjUzOTJkYzZiYjY3NDRlYTQ4ZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kMTZkZGFlZjg1NDE0YWNmYTJmNmNmZDgwOWViNTdlMSA9ICQoJzxkaXYgaWQ9Imh0bWxfZDE2ZGRhZWY4NTQxNGFjZmEyZjZjZmQ4MDllYjU3ZTEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkJlcmN6eSBQYXJrICwgRG93bnRvd24gVG9yb250bzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZjU1Y2I4Y2VjZGI0NGY1MzkyZGM2YmI2NzQ0ZWE0OGQuc2V0Q29udGVudChodG1sX2QxNmRkYWVmODU0MTRhY2ZhMmY2Y2ZkODA5ZWI1N2UxKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzY1NTRmMjc3ODgyNjQ4YjNhNDllZjE5ZTIyODNmMDY4LmJpbmRQb3B1cChwb3B1cF9mNTVjYjhjZWNkYjQ0ZjUzOTJkYzZiYjY3NDRlYTQ4ZCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9kMzJjY2RiNTJkMDM0ZDhmOGRmZjQyZjVjYzUzZmQ5NyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY1Nzk1MjQsLTc5LjM4NzM4MjZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNjU2OGY0OGRhY2JjNGQ0N2IxOTZkYjBlODA3ODA0ZmIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfM2I4ZmVkMzUyM2NkNDdlYTk0NWQzMmQ1YmMwMzlmOGMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNGYxYWYxY2MwNTdjNGYzMmE5YmZlY2VkZGExNWI0MWEgPSAkKCc8ZGl2IGlkPSJodG1sXzRmMWFmMWNjMDU3YzRmMzJhOWJmZWNlZGRhMTViNDFhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DZW50cmFsIEJheSBTdHJlZXQgLCBEb3dudG93biBUb3JvbnRvPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zYjhmZWQzNTIzY2Q0N2VhOTQ1ZDMyZDViYzAzOWY4Yy5zZXRDb250ZW50KGh0bWxfNGYxYWYxY2MwNTdjNGYzMmE5YmZlY2VkZGExNWI0MWEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZDMyY2NkYjUyZDAzNGQ4ZjhkZmY0MmY1Y2M1M2ZkOTcuYmluZFBvcHVwKHBvcHVwXzNiOGZlZDM1MjNjZDQ3ZWE5NDVkMzJkNWJjMDM5ZjhjKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzAyYTYzZDNhOGVhYjRkNzY4MWIyZDkzNzhjYzg5NGU0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjUwNTcxMjAwMDAwMDEsLTc5LjM4NDU2NzVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNjU2OGY0OGRhY2JjNGQ0N2IxOTZkYjBlODA3ODA0ZmIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNWFlMTVkOWM4NTc4NDExMWI5NTE2M2I4MmVmMDFjYzAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfODdkYjMwZDJlM2QzNDQ1MTk3NDQ5NTVjZWI3ZGZhNzkgPSAkKCc8ZGl2IGlkPSJodG1sXzg3ZGIzMGQyZTNkMzQ0NTE5NzQ0OTU1Y2ViN2RmYTc5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5BZGVsYWlkZSAsIEtpbmcgLCBSaWNobW9uZCAsIERvd250b3duIFRvcm9udG88L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzVhZTE1ZDljODU3ODQxMTFiOTUxNjNiODJlZjAxY2MwLnNldENvbnRlbnQoaHRtbF84N2RiMzBkMmUzZDM0NDUxOTc0NDk1NWNlYjdkZmE3OSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8wMmE2M2QzYThlYWI0ZDc2ODFiMmQ5Mzc4Y2M4OTRlNC5iaW5kUG9wdXAocG9wdXBfNWFlMTVkOWM4NTc4NDExMWI5NTE2M2I4MmVmMDFjYzApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMjY3ZTc0NDI2MjYyNDRjNThhNDA2MmM2MzRlYWFmMWYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42NDA4MTU3LC03OS4zODE3NTIyOTk5OTk5OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF82NTY4ZjQ4ZGFjYmM0ZDQ3YjE5NmRiMGU4MDc4MDRmYik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9kZWZlYjNkZWFmNWE0MTIyODUzMzYzOTRmYWQzYTU0OCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF80YmY0OGFkOGYxMDU0YTM4OTAzODViMjExNzNlNDA0OSA9ICQoJzxkaXYgaWQ9Imh0bWxfNGJmNDhhZDhmMTA1NGEzODkwMzg1YjIxMTczZTQwNDkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkhhcmJvdXJmcm9udCBFYXN0ICwgVG9yb250byBJc2xhbmRzICwgVW5pb24gU3RhdGlvbiAsIERvd250b3duIFRvcm9udG88L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2RlZmViM2RlYWY1YTQxMjI4NTMzNjM5NGZhZDNhNTQ4LnNldENvbnRlbnQoaHRtbF80YmY0OGFkOGYxMDU0YTM4OTAzODViMjExNzNlNDA0OSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8yNjdlNzQ0MjYyNjI0NGM1OGE0MDYyYzYzNGVhYWYxZi5iaW5kUG9wdXAocG9wdXBfZGVmZWIzZGVhZjVhNDEyMjg1MzM2Mzk0ZmFkM2E1NDgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMWU1YzUzOTVjZjZhNDA4NWFkNDgwZmNlOGFjYzQ3ZGUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42NDcxNzY4LC03OS4zODE1NzY0MDAwMDAwMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF82NTY4ZjQ4ZGFjYmM0ZDQ3YjE5NmRiMGU4MDc4MDRmYik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF80OGIzMDY2NjZmNWM0NWM1OTM3YzE4Y2Q5Y2I5YjM3NyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83YjM3ZjM5NzZjMTk0YmYxYWMwZTljNzA1YWZmZjFkMSA9ICQoJzxkaXYgaWQ9Imh0bWxfN2IzN2YzOTc2YzE5NGJmMWFjMGU5YzcwNWFmZmYxZDEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkRlc2lnbiBFeGNoYW5nZSAsIFRvcm9udG8gRG9taW5pb24gQ2VudHJlICwgRG93bnRvd24gVG9yb250bzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNDhiMzA2NjY2ZjVjNDVjNTkzN2MxOGNkOWNiOWIzNzcuc2V0Q29udGVudChodG1sXzdiMzdmMzk3NmMxOTRiZjFhYzBlOWM3MDVhZmZmMWQxKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzFlNWM1Mzk1Y2Y2YTQwODVhZDQ4MGZjZThhY2M0N2RlLmJpbmRQb3B1cChwb3B1cF80OGIzMDY2NjZmNWM0NWM1OTM3YzE4Y2Q5Y2I5YjM3Nyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jZDlkOTBkNTYyZjA0Y2NhYTMzYWM4YWJlMDY3N2QyNiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY0ODE5ODUsLTc5LjM3OTgxNjkwMDAwMDAxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzY1NjhmNDhkYWNiYzRkNDdiMTk2ZGIwZTgwNzgwNGZiKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzAwMTA0MmUzOWNmMTQ1OWM4Nzk3MDkyMzI0MmUzOGRlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzk4MjY3ZWYxODA5YTQ0NWRiOTk2ZGEwZGE5ZGRlZTRiID0gJCgnPGRpdiBpZD0iaHRtbF85ODI2N2VmMTgwOWE0NDVkYjk5NmRhMGRhOWRkZWU0YiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q29tbWVyY2UgQ291cnQgLCBWaWN0b3JpYSBIb3RlbCAsIERvd250b3duIFRvcm9udG88L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzAwMTA0MmUzOWNmMTQ1OWM4Nzk3MDkyMzI0MmUzOGRlLnNldENvbnRlbnQoaHRtbF85ODI2N2VmMTgwOWE0NDVkYjk5NmRhMGRhOWRkZWU0Yik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9jZDlkOTBkNTYyZjA0Y2NhYTMzYWM4YWJlMDY3N2QyNi5iaW5kUG9wdXAocG9wdXBfMDAxMDQyZTM5Y2YxNDU5Yzg3OTcwOTIzMjQyZTM4ZGUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOWFmY2E4NzVjNzQxNGI1ZjgwM2UzMmU3YzMxNmY3NDQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43MzMyODI1LC03OS40MTk3NDk3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzY1NjhmNDhkYWNiYzRkNDdiMTk2ZGIwZTgwNzgwNGZiKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2E0OWM1Y2MxODYwNTRkNDg4ZDA5ZTViZDJjOTRiYTcyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2RmMDc2MDM1Y2I3NTQ5ZjRhN2Q2NDA0ZTBmNGI4YWUyID0gJCgnPGRpdiBpZD0iaHRtbF9kZjA3NjAzNWNiNzU0OWY0YTdkNjQwNGUwZjRiOGFlMiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QmVkZm9yZCBQYXJrICwgTGF3cmVuY2UgTWFub3IgRWFzdCAsIE5vcnRoIFlvcms8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2E0OWM1Y2MxODYwNTRkNDg4ZDA5ZTViZDJjOTRiYTcyLnNldENvbnRlbnQoaHRtbF9kZjA3NjAzNWNiNzU0OWY0YTdkNjQwNGUwZjRiOGFlMik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl85YWZjYTg3NWM3NDE0YjVmODAzZTMyZTdjMzE2Zjc0NC5iaW5kUG9wdXAocG9wdXBfYTQ5YzVjYzE4NjA1NGQ0ODhkMDllNWJkMmM5NGJhNzIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMjE3YWY4ZDQwZDBiNGRhM2I3ZGYzYTllZmYzZjRkZTggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43MTE2OTQ4LC03OS40MTY5MzU1OTk5OTk5OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF82NTY4ZjQ4ZGFjYmM0ZDQ3YjE5NmRiMGU4MDc4MDRmYik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82YjgyYTZmMTUwMjI0NzM4OWU5YjM2ZWU4NTI4NzNiOSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jNjhjMTA4ZjYyMTE0YmExYWQ0N2M5MzZhODA4ODc3YiA9ICQoJzxkaXYgaWQ9Imh0bWxfYzY4YzEwOGY2MjExNGJhMWFkNDdjOTM2YTgwODg3N2IiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlJvc2VsYXduICwgQ2VudHJhbCBUb3JvbnRvPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82YjgyYTZmMTUwMjI0NzM4OWU5YjM2ZWU4NTI4NzNiOS5zZXRDb250ZW50KGh0bWxfYzY4YzEwOGY2MjExNGJhMWFkNDdjOTM2YTgwODg3N2IpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMjE3YWY4ZDQwZDBiNGRhM2I3ZGYzYTllZmYzZjRkZTguYmluZFBvcHVwKHBvcHVwXzZiODJhNmYxNTAyMjQ3Mzg5ZTliMzZlZTg1Mjg3M2I5KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2UwNmNhYzZiNmRiNzRhZDg5YWMyZjc2ODlkYmUyODAzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjk2OTQ3NiwtNzkuNDExMzA3MjAwMDAwMDFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNjU2OGY0OGRhY2JjNGQ0N2IxOTZkYjBlODA3ODA0ZmIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMTliY2Y2MTViNzMwNDUyMWI2NWI4MjAzYjVkMWFmN2MgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNzIzYTE4MzJlNDllNDk5ZjliY2JlNGZlYWFkYWUzZDMgPSAkKCc8ZGl2IGlkPSJodG1sXzcyM2ExODMyZTQ5ZTQ5OWY5YmNiZTRmZWFhZGFlM2QzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Gb3Jlc3QgSGlsbCBOb3J0aCAsIEZvcmVzdCBIaWxsIFdlc3QgLCBDZW50cmFsIFRvcm9udG88L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzE5YmNmNjE1YjczMDQ1MjFiNjViODIwM2I1ZDFhZjdjLnNldENvbnRlbnQoaHRtbF83MjNhMTgzMmU0OWU0OTlmOWJjYmU0ZmVhYWRhZTNkMyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9lMDZjYWM2YjZkYjc0YWQ4OWFjMmY3Njg5ZGJlMjgwMy5iaW5kUG9wdXAocG9wdXBfMTliY2Y2MTViNzMwNDUyMWI2NWI4MjAzYjVkMWFmN2MpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZjk2NGUzYjhkMzdlNDFlMTg3ZTQ0ZDMxMDBhMWY4ZGEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42NzI3MDk3LC03OS40MDU2Nzg0MDAwMDAwMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF82NTY4ZjQ4ZGFjYmM0ZDQ3YjE5NmRiMGU4MDc4MDRmYik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF83NzI1Yzg5ZWQyNTQ0MWM1YjUwMGY2YTE0Yzc5ZGEwZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF80YjAzMDdiMWE2ZTY0YWFjYTE5NmVmMGM3MjY0MzQ4YSA9ICQoJzxkaXYgaWQ9Imh0bWxfNGIwMzA3YjFhNmU2NGFhY2ExOTZlZjBjNzI2NDM0OGEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlRoZSBBbm5leCAsIE5vcnRoIE1pZHRvd24gLCBZb3JrdmlsbGUgLCBDZW50cmFsIFRvcm9udG88L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzc3MjVjODllZDI1NDQxYzViNTAwZjZhMTRjNzlkYTBmLnNldENvbnRlbnQoaHRtbF80YjAzMDdiMWE2ZTY0YWFjYTE5NmVmMGM3MjY0MzQ4YSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9mOTY0ZTNiOGQzN2U0MWUxODdlNDRkMzEwMGExZjhkYS5iaW5kUG9wdXAocG9wdXBfNzcyNWM4OWVkMjU0NDFjNWI1MDBmNmExNGM3OWRhMGYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZGRiZWJkMTY5ZjE1NGFmZDlkMzhlMWViNDgzYjZmNmMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42NjI2OTU2LC03OS40MDAwNDkzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzY1NjhmNDhkYWNiYzRkNDdiMTk2ZGIwZTgwNzgwNGZiKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzljOTg5NTNkYThkZjQwOWNhM2Y3ZjM1Y2U3NjY0YjgyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2UwZTI2NTcwNmYzMDQwMTRhMjA2OWI2M2Y0ZDMzMTdiID0gJCgnPGRpdiBpZD0iaHRtbF9lMGUyNjU3MDZmMzA0MDE0YTIwNjliNjNmNGQzMzE3YiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+SGFyYm9yZCAsIFVuaXZlcnNpdHkgb2YgVG9yb250byAsIERvd250b3duIFRvcm9udG88L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzljOTg5NTNkYThkZjQwOWNhM2Y3ZjM1Y2U3NjY0YjgyLnNldENvbnRlbnQoaHRtbF9lMGUyNjU3MDZmMzA0MDE0YTIwNjliNjNmNGQzMzE3Yik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9kZGJlYmQxNjlmMTU0YWZkOWQzOGUxZWI0ODNiNmY2Yy5iaW5kUG9wdXAocG9wdXBfOWM5ODk1M2RhOGRmNDA5Y2EzZjdmMzVjZTc2NjRiODIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNWEyODJiNjEwYzM4NGZkYWI4ODYyZTA5OTJjMmRjMWUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42NTMyMDU3LC03OS40MDAwNDkzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzY1NjhmNDhkYWNiYzRkNDdiMTk2ZGIwZTgwNzgwNGZiKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2M1N2NmYTg3MDVhYzQzNWFhZDY0ZTEwNjMyNjY3MjBhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2UwNWI2MmVkNWI0YzQzNjc5NWYwOTMwZWI4NzhhNjM4ID0gJCgnPGRpdiBpZD0iaHRtbF9lMDViNjJlZDViNGM0MzY3OTVmMDkzMGViODc4YTYzOCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q2hpbmF0b3duICwgR3JhbmdlIFBhcmsgLCBLZW5zaW5ndG9uIE1hcmtldCAsIERvd250b3duIFRvcm9udG88L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2M1N2NmYTg3MDVhYzQzNWFhZDY0ZTEwNjMyNjY3MjBhLnNldENvbnRlbnQoaHRtbF9lMDViNjJlZDViNGM0MzY3OTVmMDkzMGViODc4YTYzOCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81YTI4MmI2MTBjMzg0ZmRhYjg4NjJlMDk5MmMyZGMxZS5iaW5kUG9wdXAocG9wdXBfYzU3Y2ZhODcwNWFjNDM1YWFkNjRlMTA2MzI2NjcyMGEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYjZkMTMwNGNlYjgxNDhkNWJmMDE2MGM1MmQxZjIyMWQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42Mjg5NDY3LC03OS4zOTQ0MTk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzY1NjhmNDhkYWNiYzRkNDdiMTk2ZGIwZTgwNzgwNGZiKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzUwNTFhYjRmZDUyZDRmZmE5OGVjZmI1MWJhYzFhOWE3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzg2OTk1NDE2YzJjNjRlMGJhMzA5N2FiMzAxNmQ4NzMzID0gJCgnPGRpdiBpZD0iaHRtbF84Njk5NTQxNmMyYzY0ZTBiYTMwOTdhYjMwMTZkODczMyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q04gVG93ZXIgLCBCYXRodXJzdCBRdWF5ICwgSXNsYW5kIGFpcnBvcnQgLCBIYXJib3VyZnJvbnQgV2VzdCAsIEtpbmcgYW5kIFNwYWRpbmEgLCBSYWlsd2F5IExhbmRzICwgU291dGggTmlhZ2FyYSAsIERvd250b3duIFRvcm9udG88L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzUwNTFhYjRmZDUyZDRmZmE5OGVjZmI1MWJhYzFhOWE3LnNldENvbnRlbnQoaHRtbF84Njk5NTQxNmMyYzY0ZTBiYTMwOTdhYjMwMTZkODczMyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9iNmQxMzA0Y2ViODE0OGQ1YmYwMTYwYzUyZDFmMjIxZC5iaW5kUG9wdXAocG9wdXBfNTA1MWFiNGZkNTJkNGZmYTk4ZWNmYjUxYmFjMWE5YTcpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNTQzNzBiY2FmMmNhNDAxMzlmODcxZDkyNGJmNjdkYzAgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42NDY0MzUyLC03OS4zNzQ4NDU5OTk5OTk5OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF82NTY4ZjQ4ZGFjYmM0ZDQ3YjE5NmRiMGU4MDc4MDRmYik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85YzkwNDEyMmI0ODg0MmJhOTdjOWRjMGYzZGFmZDVjYyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kNWJkNjlhNzJhMzY0NzA4ODIzNWE2YWMxYWUzOGU0MiA9ICQoJzxkaXYgaWQ9Imh0bWxfZDViZDY5YTcyYTM2NDcwODgyMzVhNmFjMWFlMzhlNDIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlN0biBBIFBPIEJveGVzIDI1IFRoZSBFc3BsYW5hZGUgLCBEb3dudG93biBUb3JvbnRvPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85YzkwNDEyMmI0ODg0MmJhOTdjOWRjMGYzZGFmZDVjYy5zZXRDb250ZW50KGh0bWxfZDViZDY5YTcyYTM2NDcwODgyMzVhNmFjMWFlMzhlNDIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNTQzNzBiY2FmMmNhNDAxMzlmODcxZDkyNGJmNjdkYzAuYmluZFBvcHVwKHBvcHVwXzljOTA0MTIyYjQ4ODQyYmE5N2M5ZGMwZjNkYWZkNWNjKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzBhMTVjYWI0MTE2NzQ3NzA5Mjc1NzAxNzNjMzdiMWZjID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjQ4NDI5MiwtNzkuMzgyMjgwMl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF82NTY4ZjQ4ZGFjYmM0ZDQ3YjE5NmRiMGU4MDc4MDRmYik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9kZjhmNDkzMmNjZmQ0NDcyYjQ0ZjdlNWVkMDNjY2ZiOSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kZjE5YjJjZmE0ZTI0ZGVjODg0MTNhNjIyNzQzNjMzNyA9ICQoJzxkaXYgaWQ9Imh0bWxfZGYxOWIyY2ZhNGUyNGRlYzg4NDEzYTYyMjc0MzYzMzciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkZpcnN0IENhbmFkaWFuIFBsYWNlICwgVW5kZXJncm91bmQgY2l0eSAsIERvd250b3duIFRvcm9udG88L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2RmOGY0OTMyY2NmZDQ0NzJiNDRmN2U1ZWQwM2NjZmI5LnNldENvbnRlbnQoaHRtbF9kZjE5YjJjZmE0ZTI0ZGVjODg0MTNhNjIyNzQzNjMzNyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8wYTE1Y2FiNDExNjc0NzcwOTI3NTcwMTczYzM3YjFmYy5iaW5kUG9wdXAocG9wdXBfZGY4ZjQ5MzJjY2ZkNDQ3MmI0NGY3ZTVlZDAzY2NmYjkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMmZjZDYyZGRhMzRmNDJmYmIwY2ExNDhjZWMwNjM5ZjAgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My43MTg1MTc5OTk5OTk5OTYsLTc5LjQ2NDc2MzI5OTk5OTk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzY1NjhmNDhkYWNiYzRkNDdiMTk2ZGIwZTgwNzgwNGZiKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzI2ZjFlMmQyOWQ4YzRjYTM4MjQ4NTA4Mzg4OTExOGFmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2I3OTIyMmFlNDhmNjQ4Nzg4NzlmNThhMjg0MTdiNThiID0gJCgnPGRpdiBpZD0iaHRtbF9iNzkyMjJhZTQ4ZjY0ODc4ODc5ZjU4YTI4NDE3YjU4YiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TGF3cmVuY2UgSGVpZ2h0cyAsIExhd3JlbmNlIE1hbm9yICwgTm9ydGggWW9yazwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMjZmMWUyZDI5ZDhjNGNhMzgyNDg1MDgzODg5MTE4YWYuc2V0Q29udGVudChodG1sX2I3OTIyMmFlNDhmNjQ4Nzg4NzlmNThhMjg0MTdiNThiKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzJmY2Q2MmRkYTM0ZjQyZmJiMGNhMTQ4Y2VjMDYzOWYwLmJpbmRQb3B1cChwb3B1cF8yNmYxZTJkMjlkOGM0Y2EzODI0ODUwODM4ODkxMThhZik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl82ZWU0MTM1YjU1NTE0NTFmOWIyNjQ1N2MyNjZlMWY0OSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjcwOTU3NywtNzkuNDQ1MDcyNTk5OTk5OTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNjU2OGY0OGRhY2JjNGQ0N2IxOTZkYjBlODA3ODA0ZmIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOGJiMTM3YzZiNjRjNDA1YjhmNTU1YzkyOTg3MGNjYzIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNTM3OWVhM2EyZTllNDc0Nzg3MGMxYTI1MTMwZTc1NTggPSAkKCc8ZGl2IGlkPSJodG1sXzUzNzllYTNhMmU5ZTQ3NDc4NzBjMWEyNTEzMGU3NTU4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5HbGVuY2Fpcm4gLCBOb3J0aCBZb3JrPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84YmIxMzdjNmI2NGM0MDViOGY1NTVjOTI5ODcwY2NjMi5zZXRDb250ZW50KGh0bWxfNTM3OWVhM2EyZTllNDc0Nzg3MGMxYTI1MTMwZTc1NTgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNmVlNDEzNWI1NTUxNDUxZjliMjY0NTdjMjY2ZTFmNDkuYmluZFBvcHVwKHBvcHVwXzhiYjEzN2M2YjY0YzQwNWI4ZjU1NWM5Mjk4NzBjY2MyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2I5YTAzYmE3ZTA3OTRjMmNiZDdhY2RlYmUwMzY1NWQ1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjkzNzgxMywtNzkuNDI4MTkxNDAwMDAwMDJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNjU2OGY0OGRhY2JjNGQ0N2IxOTZkYjBlODA3ODA0ZmIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNjEyMTUxNDJlMzRlNDEyY2FiYzJlYjY2OTRhMDUzYmEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNTY2ZTNkMjVhMDM5NDAxZDg4NDQ5OTFhZWIxMDFjN2QgPSAkKCc8ZGl2IGlkPSJodG1sXzU2NmUzZDI1YTAzOTQwMWQ4ODQ0OTkxYWViMTAxYzdkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5IdW1ld29vZC1DZWRhcnZhbGUgLCBZb3JrPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82MTIxNTE0MmUzNGU0MTJjYWJjMmViNjY5NGEwNTNiYS5zZXRDb250ZW50KGh0bWxfNTY2ZTNkMjVhMDM5NDAxZDg4NDQ5OTFhZWIxMDFjN2QpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYjlhMDNiYTdlMDc5NGMyY2JkN2FjZGViZTAzNjU1ZDUuYmluZFBvcHVwKHBvcHVwXzYxMjE1MTQyZTM0ZTQxMmNhYmMyZWI2Njk0YTA1M2JhKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2I1ZDkwM2EyMmMxNjQ3MmY5YzNjYjQ4MjA5YTdiYWM2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjg5MDI1NiwtNzkuNDUzNTEyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzY1NjhmNDhkYWNiYzRkNDdiMTk2ZGIwZTgwNzgwNGZiKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzJiNzhjZjQxOGEzNzQxODdhNTRkYjY2NmQ3YzYzOWJmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2U4MDI2NWI3MTBlYjQxNmY4ZTVhNThmNjljYzRiMTFhID0gJCgnPGRpdiBpZD0iaHRtbF9lODAyNjViNzEwZWI0MTZmOGU1YTU4ZjY5Y2M0YjExYSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q2FsZWRvbmlhLUZhaXJiYW5rcyAsIFlvcms8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzJiNzhjZjQxOGEzNzQxODdhNTRkYjY2NmQ3YzYzOWJmLnNldENvbnRlbnQoaHRtbF9lODAyNjViNzEwZWI0MTZmOGU1YTU4ZjY5Y2M0YjExYSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9iNWQ5MDNhMjJjMTY0NzJmOWMzY2I0ODIwOWE3YmFjNi5iaW5kUG9wdXAocG9wdXBfMmI3OGNmNDE4YTM3NDE4N2E1NGRiNjY2ZDdjNjM5YmYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYjM0MjIyYzg1NjEzNGRiNjlmMmIwZGI4MTdkZmE5ZDQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42Njk1NDIsLTc5LjQyMjU2MzddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNjU2OGY0OGRhY2JjNGQ0N2IxOTZkYjBlODA3ODA0ZmIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZTgwNjM4ZWZkNDllNGE0Yzk3MzE3YzE5YzE4NzM0ODkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZTE0OTUyYmQ2YmJmNDNjMzgwMzQ5Nzg5MjE3NDFiYTkgPSAkKCc8ZGl2IGlkPSJodG1sX2UxNDk1MmJkNmJiZjQzYzM4MDM0OTc4OTIxNzQxYmE5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DaHJpc3RpZSAsIERvd250b3duIFRvcm9udG88L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2U4MDYzOGVmZDQ5ZTRhNGM5NzMxN2MxOWMxODczNDg5LnNldENvbnRlbnQoaHRtbF9lMTQ5NTJiZDZiYmY0M2MzODAzNDk3ODkyMTc0MWJhOSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9iMzQyMjJjODU2MTM0ZGI2OWYyYjBkYjgxN2RmYTlkNC5iaW5kUG9wdXAocG9wdXBfZTgwNjM4ZWZkNDllNGE0Yzk3MzE3YzE5YzE4NzM0ODkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMDA4ZGNhYzMyODFiNGJmYmI2NDUyNGE0NjU4MDE5MzQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42NjkwMDUxMDAwMDAwMSwtNzkuNDQyMjU5M10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF82NTY4ZjQ4ZGFjYmM0ZDQ3YjE5NmRiMGU4MDc4MDRmYik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF84MzQ4ZDMzOWFhZTM0MGU0OTYyMDIxOGI4Mzc4ZTczMCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8yNDgyZmMyYThhOTQ0OTViYjhjNzM1YzdmMzRhMTRkMiA9ICQoJzxkaXYgaWQ9Imh0bWxfMjQ4MmZjMmE4YTk0NDk1YmI4YzczNWM3ZjM0YTE0ZDIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkRvdmVyY291cnQgVmlsbGFnZSAsIER1ZmZlcmluICwgV2VzdCBUb3JvbnRvPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84MzQ4ZDMzOWFhZTM0MGU0OTYyMDIxOGI4Mzc4ZTczMC5zZXRDb250ZW50KGh0bWxfMjQ4MmZjMmE4YTk0NDk1YmI4YzczNWM3ZjM0YTE0ZDIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMDA4ZGNhYzMyODFiNGJmYmI2NDUyNGE0NjU4MDE5MzQuYmluZFBvcHVwKHBvcHVwXzgzNDhkMzM5YWFlMzQwZTQ5NjIwMjE4YjgzNzhlNzMwKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzA5Yjg4ODJiMTc2YTQ1MjJiMGQ0OTBmYWU5YzdhNzMwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjQ3OTI2NzAwMDAwMDA2LC03OS40MTk3NDk3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzY1NjhmNDhkYWNiYzRkNDdiMTk2ZGIwZTgwNzgwNGZiKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzgxMTQ2NDUwZDZhMzQ5YmQ5NDdhY2RmZDNjNWI3OTg0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzZhMjM2ZTlkNzY2ZTRkNDBhZmIyZGJmOTdkMGU4YmMyID0gJCgnPGRpdiBpZD0iaHRtbF82YTIzNmU5ZDc2NmU0ZDQwYWZiMmRiZjk3ZDBlOGJjMiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TGl0dGxlIFBvcnR1Z2FsICwgVHJpbml0eSAsIFdlc3QgVG9yb250bzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfODExNDY0NTBkNmEzNDliZDk0N2FjZGZkM2M1Yjc5ODQuc2V0Q29udGVudChodG1sXzZhMjM2ZTlkNzY2ZTRkNDBhZmIyZGJmOTdkMGU4YmMyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzA5Yjg4ODJiMTc2YTQ1MjJiMGQ0OTBmYWU5YzdhNzMwLmJpbmRQb3B1cChwb3B1cF84MTE0NjQ1MGQ2YTM0OWJkOTQ3YWNkZmQzYzViNzk4NCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8yNDBhNjY5ZjBiZWY0Nzc2ODg4YmU2MjI3OWJkOTc5OCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjYzNjg0NzIsLTc5LjQyODE5MTQwMDAwMDAyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzY1NjhmNDhkYWNiYzRkNDdiMTk2ZGIwZTgwNzgwNGZiKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzQxODNmYjdiMmY3MzQ0NGQ5ZjhhMzFiN2NhMjA0Zjk4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2Y2N2FhYmVlOWU4NDQxNzk5OTUxODhiYmEyOTJiYmU0ID0gJCgnPGRpdiBpZD0iaHRtbF9mNjdhYWJlZTllODQ0MTc5OTk1MTg4YmJhMjkyYmJlNCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QnJvY2t0b24gLCBFeGhpYml0aW9uIFBsYWNlICwgUGFya2RhbGUgVmlsbGFnZSAsIFdlc3QgVG9yb250bzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNDE4M2ZiN2IyZjczNDQ0ZDlmOGEzMWI3Y2EyMDRmOTguc2V0Q29udGVudChodG1sX2Y2N2FhYmVlOWU4NDQxNzk5OTUxODhiYmEyOTJiYmU0KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzI0MGE2NjlmMGJlZjQ3NzY4ODhiZTYyMjc5YmQ5Nzk4LmJpbmRQb3B1cChwb3B1cF80MTgzZmI3YjJmNzM0NDRkOWY4YTMxYjdjYTIwNGY5OCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl82ODc1NTY5Y2FiZjk0ZmFhYmQ5YTI0MDgxNDMxNTA5YyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjcxMzc1NjIwMDAwMDAwNiwtNzkuNDkwMDczOF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF82NTY4ZjQ4ZGFjYmM0ZDQ3YjE5NmRiMGU4MDc4MDRmYik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wOTk5OTQ4ODg3MzQ0YTQzODgyNGIxZjE0Y2Q4ZGNhZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82N2NkMzU3Y2NmYWQ0ZWM0YmI1MDM5MzJkZGU2NzA2OCA9ICQoJzxkaXYgaWQ9Imh0bWxfNjdjZDM1N2NjZmFkNGVjNGJiNTAzOTMyZGRlNjcwNjgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkRvd25zdmlldyAsIE5vcnRoIFBhcmsgLCBVcHdvb2QgUGFyayAsIE5vcnRoIFlvcms8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzA5OTk5NDg4ODczNDRhNDM4ODI0YjFmMTRjZDhkY2FmLnNldENvbnRlbnQoaHRtbF82N2NkMzU3Y2NmYWQ0ZWM0YmI1MDM5MzJkZGU2NzA2OCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl82ODc1NTY5Y2FiZjk0ZmFhYmQ5YTI0MDgxNDMxNTA5Yy5iaW5kUG9wdXAocG9wdXBfMDk5OTk0ODg4NzM0NGE0Mzg4MjRiMWYxNGNkOGRjYWYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNzkwOGVmYmE0MTA5NDhkNWFjMTUwYTU0NzJhYWJkZTUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42OTExMTU4LC03OS40NzYwMTMyOTk5OTk5OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF82NTY4ZjQ4ZGFjYmM0ZDQ3YjE5NmRiMGU4MDc4MDRmYik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iZjkzZmZmMzFhMzA0ODJmYTZhMDY4OTQ3Njk3YTYwZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xZWEzNTBmZjgyMWE0OGU2YmVhOTQ4NDhjYWU3ZDgyZiA9ICQoJzxkaXYgaWQ9Imh0bWxfMWVhMzUwZmY4MjFhNDhlNmJlYTk0ODQ4Y2FlN2Q4MmYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkRlbCBSYXkgLCBLZWVsZXNkYWxlICwgTW91bnQgRGVubmlzICwgU2lsdmVydGhvcm4gLCBZb3JrPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iZjkzZmZmMzFhMzA0ODJmYTZhMDY4OTQ3Njk3YTYwZC5zZXRDb250ZW50KGh0bWxfMWVhMzUwZmY4MjFhNDhlNmJlYTk0ODQ4Y2FlN2Q4MmYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNzkwOGVmYmE0MTA5NDhkNWFjMTUwYTU0NzJhYWJkZTUuYmluZFBvcHVwKHBvcHVwX2JmOTNmZmYzMWEzMDQ4MmZhNmEwNjg5NDc2OTdhNjBkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzg5MjFiMTljNTk0ZjQ0ZTNiMTA5ZDkwZmI5YzY1YTljID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjczMTg1Mjk5OTk5OTksLTc5LjQ4NzI2MTkwMDAwMDAxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzY1NjhmNDhkYWNiYzRkNDdiMTk2ZGIwZTgwNzgwNGZiKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzVmZDQ5MTE0NWQxNTQyNjc4OGE5NTFlZjE5ZGEzMjRkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzI1NGFlNzc5YWYyMDRhYWI5M2ZiZTg1NDZiNmQwNWVmID0gJCgnPGRpdiBpZD0iaHRtbF8yNTRhZTc3OWFmMjA0YWFiOTNmYmU4NTQ2YjZkMDVlZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+VGhlIEp1bmN0aW9uIE5vcnRoICwgUnVubnltZWRlICwgWW9yazwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNWZkNDkxMTQ1ZDE1NDI2Nzg4YTk1MWVmMTlkYTMyNGQuc2V0Q29udGVudChodG1sXzI1NGFlNzc5YWYyMDRhYWI5M2ZiZTg1NDZiNmQwNWVmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzg5MjFiMTljNTk0ZjQ0ZTNiMTA5ZDkwZmI5YzY1YTljLmJpbmRQb3B1cChwb3B1cF81ZmQ0OTExNDVkMTU0MjY3ODhhOTUxZWYxOWRhMzI0ZCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xNTZhNGE0MDlhMTc0Zjk1OThiYTRmMjdmNTJkYmI1NCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY2MTYwODMsLTc5LjQ2NDc2MzI5OTk5OTk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzY1NjhmNDhkYWNiYzRkNDdiMTk2ZGIwZTgwNzgwNGZiKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2ZhY2JhYjBlNGQ3MTQwYWE5ZDg5OTNiNzlmMTcyMmRiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzY1NDFkZGVmYTdmNTRlN2Y4NTgxNmNjMzVmMjRmNmJjID0gJCgnPGRpdiBpZD0iaHRtbF82NTQxZGRlZmE3ZjU0ZTdmODU4MTZjYzM1ZjI0ZjZiYyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+SGlnaCBQYXJrICwgVGhlIEp1bmN0aW9uIFNvdXRoICwgV2VzdCBUb3JvbnRvPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mYWNiYWIwZTRkNzE0MGFhOWQ4OTkzYjc5ZjE3MjJkYi5zZXRDb250ZW50KGh0bWxfNjU0MWRkZWZhN2Y1NGU3Zjg1ODE2Y2MzNWYyNGY2YmMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMTU2YTRhNDA5YTE3NGY5NTk4YmE0ZjI3ZjUyZGJiNTQuYmluZFBvcHVwKHBvcHVwX2ZhY2JhYjBlNGQ3MTQwYWE5ZDg5OTNiNzlmMTcyMmRiKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzc1NDVjNjQ1ZmU1MjQ0NmNiZTNhNDc0ODBlYmQxMWU0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjQ4OTU5NywtNzkuNDU2MzI1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzY1NjhmNDhkYWNiYzRkNDdiMTk2ZGIwZTgwNzgwNGZiKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2VkZWM3NDdmMzU1YjQyMzQ5NTJmZmMxZjczMzYwZmI0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzY4MDhlMGUxZTYzMjQ5NjI5YzQ2YWZiYTRhOTNkZmZjID0gJCgnPGRpdiBpZD0iaHRtbF82ODA4ZTBlMWU2MzI0OTYyOWM0NmFmYmE0YTkzZGZmYyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UGFya2RhbGUgLCBSb25jZXN2YWxsZXMgLCBXZXN0IFRvcm9udG88L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2VkZWM3NDdmMzU1YjQyMzQ5NTJmZmMxZjczMzYwZmI0LnNldENvbnRlbnQoaHRtbF82ODA4ZTBlMWU2MzI0OTYyOWM0NmFmYmE0YTkzZGZmYyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl83NTQ1YzY0NWZlNTI0NDZjYmUzYTQ3NDgwZWJkMTFlNC5iaW5kUG9wdXAocG9wdXBfZWRlYzc0N2YzNTViNDIzNDk1MmZmYzFmNzMzNjBmYjQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZTZlMGE5ZmZjZTAyNGU1YThiMWJiYWQ5YjcxZDZiM2MgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42NTE1NzA2LC03OS40ODQ0NDk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzY1NjhmNDhkYWNiYzRkNDdiMTk2ZGIwZTgwNzgwNGZiKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzk4N2Q2ZGFiMTRmMTQ3NGFiZmUzY2I2NTNkZDRiM2U3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzU0NGY3ZTkyMGI4ODQ4YjRiY2I1ZGExYjdjZGZkMTVlID0gJCgnPGRpdiBpZD0iaHRtbF81NDRmN2U5MjBiODg0OGI0YmNiNWRhMWI3Y2RmZDE1ZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UnVubnltZWRlICwgU3dhbnNlYSAsIFdlc3QgVG9yb250bzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOTg3ZDZkYWIxNGYxNDc0YWJmZTNjYjY1M2RkNGIzZTcuc2V0Q29udGVudChodG1sXzU0NGY3ZTkyMGI4ODQ4YjRiY2I1ZGExYjdjZGZkMTVlKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2U2ZTBhOWZmY2UwMjRlNWE4YjFiYmFkOWI3MWQ2YjNjLmJpbmRQb3B1cChwb3B1cF85ODdkNmRhYjE0ZjE0NzRhYmZlM2NiNjUzZGQ0YjNlNyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl83MWFhZTcwMWJhMWQ0Yzg4YjA0NmI4MjQ5OGE0ZTdmMyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjY2MjMwMTUsLTc5LjM4OTQ5MzhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNjU2OGY0OGRhY2JjNGQ0N2IxOTZkYjBlODA3ODA0ZmIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMzdmYjFlMjYzMmI5NDJiYmI5NWU0MDBhZGZjMGM5ZmIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNjUxMGUzZmIyNTMxNGU3Yzg3ZjJiYjQ1ODJmYzEwOTYgPSAkKCc8ZGl2IGlkPSJodG1sXzY1MTBlM2ZiMjUzMTRlN2M4N2YyYmI0NTgyZmMxMDk2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Ob3QgYXNzaWduZWQgLCBRdWVlbiYjMzk7cyBQYXJrPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zN2ZiMWUyNjMyYjk0MmJiYjk1ZTQwMGFkZmMwYzlmYi5zZXRDb250ZW50KGh0bWxfNjUxMGUzZmIyNTMxNGU3Yzg3ZjJiYjQ1ODJmYzEwOTYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNzFhYWU3MDFiYTFkNGM4OGIwNDZiODI0OThhNGU3ZjMuYmluZFBvcHVwKHBvcHVwXzM3ZmIxZTI2MzJiOTQyYmJiOTVlNDAwYWRmYzBjOWZiKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2YxYjI4ZDE1ZjIxNDQ0YjRhMGJlNzk0ZTAwZTUxMmRkID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjM2OTY1NiwtNzkuNjE1ODE4OTk5OTk5OTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNjU2OGY0OGRhY2JjNGQ0N2IxOTZkYjBlODA3ODA0ZmIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNzM2OTQ3ODViYjA2NGQwYTgwMWY4MTY2OTcwMzg4NjEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMDk1OTgwZDNmZTExNDQxZGJkNDFhMzI3NDAzMDhlY2YgPSAkKCc8ZGl2IGlkPSJodG1sXzA5NTk4MGQzZmUxMTQ0MWRiZDQxYTMyNzQwMzA4ZWNmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DYW5hZGEgUG9zdCBHYXRld2F5IFByb2Nlc3NpbmcgQ2VudHJlICwgTWlzc2lzc2F1Z2E8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzczNjk0Nzg1YmIwNjRkMGE4MDFmODE2Njk3MDM4ODYxLnNldENvbnRlbnQoaHRtbF8wOTU5ODBkM2ZlMTE0NDFkYmQ0MWEzMjc0MDMwOGVjZik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9mMWIyOGQxNWYyMTQ0NGI0YTBiZTc5NGUwMGU1MTJkZC5iaW5kUG9wdXAocG9wdXBfNzM2OTQ3ODViYjA2NGQwYTgwMWY4MTY2OTcwMzg4NjEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMGJkNjlmMWU0MjNmNGJjMDg0YzA0NjdkZThiZmQzOGIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42NjI3NDM5LC03OS4zMjE1NThdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNjU2OGY0OGRhY2JjNGQ0N2IxOTZkYjBlODA3ODA0ZmIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNDE3MWU2MTk5YjRkNDRkOWJmZTY5MTc5NTE4OWZlOWQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMTc0MjNkYmYwZmExNDE1ODg1NTA5YmZhODdhZDI0YTIgPSAkKCc8ZGl2IGlkPSJodG1sXzE3NDIzZGJmMGZhMTQxNTg4NTUwOWJmYTg3YWQyNGEyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5CdXNpbmVzcyBSZXBseSBNYWlsIFByb2Nlc3NpbmcgQ2VudHJlIDk2OSBFYXN0ZXJuICwgRWFzdCBUb3JvbnRvPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80MTcxZTYxOTliNGQ0NGQ5YmZlNjkxNzk1MTg5ZmU5ZC5zZXRDb250ZW50KGh0bWxfMTc0MjNkYmYwZmExNDE1ODg1NTA5YmZhODdhZDI0YTIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMGJkNjlmMWU0MjNmNGJjMDg0YzA0NjdkZThiZmQzOGIuYmluZFBvcHVwKHBvcHVwXzQxNzFlNjE5OWI0ZDQ0ZDliZmU2OTE3OTUxODlmZTlkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzgwZmE2OGU3Mzc4YzQ5OGNiMWMwNGQyNzc2NjNmZTlmID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjA1NjQ2NiwtNzkuNTAxMzIwNzAwMDAwMDFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNjU2OGY0OGRhY2JjNGQ0N2IxOTZkYjBlODA3ODA0ZmIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZTBiOTA4NGY5NDAzNDE0OGFjOGM5ODA4MDQxNmFjNGEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNGNjMmJmNjJjZjVhNDYxYWE1M2Q3YjYxZDczZmY1NjMgPSAkKCc8ZGl2IGlkPSJodG1sXzRjYzJiZjYyY2Y1YTQ2MWFhNTNkN2I2MWQ3M2ZmNTYzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5IdW1iZXIgQmF5IFNob3JlcyAsIE1pbWljbyBTb3V0aCAsIE5ldyBUb3JvbnRvICwgRXRvYmljb2tlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lMGI5MDg0Zjk0MDM0MTQ4YWM4Yzk4MDgwNDE2YWM0YS5zZXRDb250ZW50KGh0bWxfNGNjMmJmNjJjZjVhNDYxYWE1M2Q3YjYxZDczZmY1NjMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfODBmYTY4ZTczNzhjNDk4Y2IxYzA0ZDI3NzY2M2ZlOWYuYmluZFBvcHVwKHBvcHVwX2UwYjkwODRmOTQwMzQxNDhhYzhjOTgwODA0MTZhYzRhKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzU3MTU0MWExNTMzNjQzNDI5NjAzZDY4Y2NlMWM5YThkID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjAyNDEzNzAwMDAwMDEsLTc5LjU0MzQ4NDA5OTk5OTk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzY1NjhmNDhkYWNiYzRkNDdiMTk2ZGIwZTgwNzgwNGZiKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzU2YmFjNzdlNzY0YTQwOGQ5YTE2NDFmMmQxMzRiNWM4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzBmYTUxZDNhMjBkZTQyY2I4NzNmODhmODNkODEzYzRlID0gJCgnPGRpdiBpZD0iaHRtbF8wZmE1MWQzYTIwZGU0MmNiODczZjg4ZjgzZDgxM2M0ZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QWxkZXJ3b29kICwgTG9uZyBCcmFuY2ggLCBFdG9iaWNva2U8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzU2YmFjNzdlNzY0YTQwOGQ5YTE2NDFmMmQxMzRiNWM4LnNldENvbnRlbnQoaHRtbF8wZmE1MWQzYTIwZGU0MmNiODczZjg4ZjgzZDgxM2M0ZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81NzE1NDFhMTUzMzY0MzQyOTYwM2Q2OGNjZTFjOWE4ZC5iaW5kUG9wdXAocG9wdXBfNTZiYWM3N2U3NjRhNDA4ZDlhMTY0MWYyZDEzNGI1YzgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMTA0NjcwMjI5MmVlNGNhM2FhNGZjMTcyNDliM2Q1NDkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42NTM2NTM2MDAwMDAwMDUsLTc5LjUwNjk0MzZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNjU2OGY0OGRhY2JjNGQ0N2IxOTZkYjBlODA3ODA0ZmIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMzBlNTYyNzZkMTIzNDYwMWIwNjFlNmJiOTMwM2EyOWQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMWVhNzhjMTA0YTBiNDczMDhhNTNkZDU1MDA5MmNiMmEgPSAkKCc8ZGl2IGlkPSJodG1sXzFlYTc4YzEwNGEwYjQ3MzA4YTUzZGQ1NTAwOTJjYjJhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5UaGUgS2luZ3N3YXkgLCBNb250Z29tZXJ5IFJvYWQgLCBPbGQgTWlsbCBOb3J0aCAsIEV0b2JpY29rZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMzBlNTYyNzZkMTIzNDYwMWIwNjFlNmJiOTMwM2EyOWQuc2V0Q29udGVudChodG1sXzFlYTc4YzEwNGEwYjQ3MzA4YTUzZGQ1NTAwOTJjYjJhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzEwNDY3MDIyOTJlZTRjYTNhYTRmYzE3MjQ5YjNkNTQ5LmJpbmRQb3B1cChwb3B1cF8zMGU1NjI3NmQxMjM0NjAxYjA2MWU2YmI5MzAzYTI5ZCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl84MjExZDM0YzUzMDk0ZmM3YTM5ZTQ4MWU5NTgxMTJhOCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjYzNjI1NzksLTc5LjQ5ODUwOTA5OTk5OTk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzY1NjhmNDhkYWNiYzRkNDdiMTk2ZGIwZTgwNzgwNGZiKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2ZmMzk3OWQwZGY0NDQzODQ4MDUzNjgxNjFkMDgwMzZiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzIxMjA1NTNkNTk2MTQzNzFhMmU4NDMyNzhjNjQ2YTNmID0gJCgnPGRpdiBpZD0iaHRtbF8yMTIwNTUzZDU5NjE0MzcxYTJlODQzMjc4YzY0NmEzZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+SHVtYmVyIEJheSAsIEtpbmcmIzM5O3MgTWlsbCBQYXJrICwgS2luZ3N3YXkgUGFyayBTb3V0aCBFYXN0ICwgTWltaWNvIE5FICwgT2xkIE1pbGwgU291dGggLCBUaGUgUXVlZW5zd2F5IEVhc3QgLCBSb3lhbCBZb3JrIFNvdXRoIEVhc3QgLCBTdW5ueWxlYSAsIEV0b2JpY29rZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZmYzOTc5ZDBkZjQ0NDM4NDgwNTM2ODE2MWQwODAzNmIuc2V0Q29udGVudChodG1sXzIxMjA1NTNkNTk2MTQzNzFhMmU4NDMyNzhjNjQ2YTNmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzgyMTFkMzRjNTMwOTRmYzdhMzllNDgxZTk1ODExMmE4LmJpbmRQb3B1cChwb3B1cF9mZjM5NzlkMGRmNDQ0Mzg0ODA1MzY4MTYxZDA4MDM2Yik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81OTJhMGU5OWZjZWU0ZGQ0YWNiNzE5M2U5NWUzNzVhYiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjYyODg0MDgsLTc5LjUyMDk5OTQwMDAwMDAxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzY1NjhmNDhkYWNiYzRkNDdiMTk2ZGIwZTgwNzgwNGZiKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2QyNTYxNjZiNWE1YzQwNzM4YTAxNjE1OTYwYmQ4ZWE1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzFjMzM0YzcwZWU0YTQ0YTFhOTA3N2FmYjUxMDMzYzMwID0gJCgnPGRpdiBpZD0iaHRtbF8xYzMzNGM3MGVlNGE0NGExYTkwNzdhZmI1MTAzM2MzMCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+S2luZ3N3YXkgUGFyayBTb3V0aCBXZXN0ICwgTWltaWNvIE5XICwgVGhlIFF1ZWVuc3dheSBXZXN0ICwgUm95YWwgWW9yayBTb3V0aCBXZXN0ICwgU291dGggb2YgQmxvb3IgLCBFdG9iaWNva2U8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2QyNTYxNjZiNWE1YzQwNzM4YTAxNjE1OTYwYmQ4ZWE1LnNldENvbnRlbnQoaHRtbF8xYzMzNGM3MGVlNGE0NGExYTkwNzdhZmI1MTAzM2MzMCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81OTJhMGU5OWZjZWU0ZGQ0YWNiNzE5M2U5NWUzNzVhYi5iaW5kUG9wdXAocG9wdXBfZDI1NjE2NmI1YTVjNDA3MzhhMDE2MTU5NjBiZDhlYTUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZDZlNDE5OTJmY2I2NGFhYTgyOGE3ZWU4OWFjNDE5Y2YgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42Njc4NTU2LC03OS41MzIyNDI0MDAwMDAwMl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF82NTY4ZjQ4ZGFjYmM0ZDQ3YjE5NmRiMGU4MDc4MDRmYik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF84OTI1YWFmYjE5OTE0ZGM5Yjg3Y2Y5MDQ3MzIyNjlhYiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kZjIxYzU2ZDA4NmM0N2Y5YjUwNzI0ZWNhMGQ2MmFhMSA9ICQoJzxkaXYgaWQ9Imh0bWxfZGYyMWM1NmQwODZjNDdmOWI1MDcyNGVjYTBkNjJhYTEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPklzbGluZ3RvbiBBdmVudWUgLCBFdG9iaWNva2U8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzg5MjVhYWZiMTk5MTRkYzliODdjZjkwNDczMjI2OWFiLnNldENvbnRlbnQoaHRtbF9kZjIxYzU2ZDA4NmM0N2Y5YjUwNzI0ZWNhMGQ2MmFhMSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9kNmU0MTk5MmZjYjY0YWFhODI4YTdlZTg5YWM0MTljZi5iaW5kUG9wdXAocG9wdXBfODkyNWFhZmIxOTkxNGRjOWI4N2NmOTA0NzMyMjY5YWIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMWJkZjkyOTc4MzljNGQ4MGI4ZTNlZTU3NGY2ODFhOWMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42NTA5NDMyLC03OS41NTQ3MjQ0MDAwMDAwMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF82NTY4ZjQ4ZGFjYmM0ZDQ3YjE5NmRiMGU4MDc4MDRmYik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8yNTZkNGM3YzI1MzE0ZGRhOWM1M2E4ZGVhNDRhYTUxNiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF85YmY1NTY0MjJiYjQ0NzRkYjkwZTNlYzZhZjE4OWUxOCA9ICQoJzxkaXYgaWQ9Imh0bWxfOWJmNTU2NDIyYmI0NDc0ZGI5MGUzZWM2YWYxODllMTgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNsb3ZlcmRhbGUgLCBJc2xpbmd0b24gLCBNYXJ0aW4gR3JvdmUgLCBQcmluY2VzcyBHYXJkZW5zICwgV2VzdCBEZWFuZSBQYXJrICwgRXRvYmljb2tlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yNTZkNGM3YzI1MzE0ZGRhOWM1M2E4ZGVhNDRhYTUxNi5zZXRDb250ZW50KGh0bWxfOWJmNTU2NDIyYmI0NDc0ZGI5MGUzZWM2YWYxODllMTgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMWJkZjkyOTc4MzljNGQ4MGI4ZTNlZTU3NGY2ODFhOWMuYmluZFBvcHVwKHBvcHVwXzI1NmQ0YzdjMjUzMTRkZGE5YzUzYThkZWE0NGFhNTE2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzExMzA2OTNhZjkyYjQyMzM4OTkwYzgxNjIwMmQ0NzI2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjQzNTE1MiwtNzkuNTc3MjAwNzk5OTk5OTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNjU2OGY0OGRhY2JjNGQ0N2IxOTZkYjBlODA3ODA0ZmIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNzdhZTg4YzMzYmQ1NGY0NGI3NWY2MjQwMjk5OGQxNTQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNzM3MmU2OTE0NTBlNGY5YmJjNDk3ZWRjZWI3OWUzZjQgPSAkKCc8ZGl2IGlkPSJodG1sXzczNzJlNjkxNDUwZTRmOWJiYzQ5N2VkY2ViNzllM2Y0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5CbG9vcmRhbGUgR2FyZGVucyAsIEVyaW5nYXRlICwgTWFya2xhbmQgV29vZCAsIE9sZCBCdXJuaGFtdGhvcnBlICwgRXRvYmljb2tlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83N2FlODhjMzNiZDU0ZjQ0Yjc1ZjYyNDAyOTk4ZDE1NC5zZXRDb250ZW50KGh0bWxfNzM3MmU2OTE0NTBlNGY5YmJjNDk3ZWRjZWI3OWUzZjQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMTEzMDY5M2FmOTJiNDIzMzg5OTBjODE2MjAyZDQ3MjYuYmluZFBvcHVwKHBvcHVwXzc3YWU4OGMzM2JkNTRmNDRiNzVmNjI0MDI5OThkMTU0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzI0NDQ3YjM1YWYzYjRhM2Q4MmQzNDM3OTZlNGYwYjU1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzU2MzAzMywtNzkuNTY1OTYzMjk5OTk5OTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNjU2OGY0OGRhY2JjNGQ0N2IxOTZkYjBlODA3ODA0ZmIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZDZmMGY4MTY2OGI5NGY5MmJmNGQ1ZjJmODFjY2FkZTYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMjk2Zjk2MWI1ZTAxNDNjNGEwOTQ1OGQ5MmRlMWNlOTggPSAkKCc8ZGl2IGlkPSJodG1sXzI5NmY5NjFiNWUwMTQzYzRhMDk0NThkOTJkZTFjZTk4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5IdW1iZXIgU3VtbWl0ICwgTm9ydGggWW9yazwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZDZmMGY4MTY2OGI5NGY5MmJmNGQ1ZjJmODFjY2FkZTYuc2V0Q29udGVudChodG1sXzI5NmY5NjFiNWUwMTQzYzRhMDk0NThkOTJkZTFjZTk4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzI0NDQ3YjM1YWYzYjRhM2Q4MmQzNDM3OTZlNGYwYjU1LmJpbmRQb3B1cChwb3B1cF9kNmYwZjgxNjY4Yjk0ZjkyYmY0ZDVmMmY4MWNjYWRlNik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85Yjc2YzFjZGY0NmQ0NjVhOWJjZmNkMWM2NGFhODgyYSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjcyNDc2NTksLTc5LjUzMjI0MjQwMDAwMDAyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzY1NjhmNDhkYWNiYzRkNDdiMTk2ZGIwZTgwNzgwNGZiKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2M0YWUyYzNlMzlkOTQ1M2NhMjY1ZGY2ZTk2Mzk0MmFkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzM0MjVhYTQ2ZDVkMzRmMjQ5Njg0MmIyYmRiYjU3NGY0ID0gJCgnPGRpdiBpZD0iaHRtbF8zNDI1YWE0NmQ1ZDM0ZjI0OTY4NDJiMmJkYmI1NzRmNCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RW1lcnkgLCBIdW1iZXJsZWEgLCBOb3J0aCBZb3JrPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jNGFlMmMzZTM5ZDk0NTNjYTI2NWRmNmU5NjM5NDJhZC5zZXRDb250ZW50KGh0bWxfMzQyNWFhNDZkNWQzNGYyNDk2ODQyYjJiZGJiNTc0ZjQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOWI3NmMxY2RmNDZkNDY1YTliY2ZjZDFjNjRhYTg4MmEuYmluZFBvcHVwKHBvcHVwX2M0YWUyYzNlMzlkOTQ1M2NhMjY1ZGY2ZTk2Mzk0MmFkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzgyOTVmNTgzM2I0ZjQ4YjFhZTIwYzM2ZTliZjUwMTFlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzA2ODc2LC03OS41MTgxODg0MDAwMDAwMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF82NTY4ZjQ4ZGFjYmM0ZDQ3YjE5NmRiMGU4MDc4MDRmYik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hMjUwNWU4OGQwMTc0MDc0YjY5MGZlNmE3NGMyM2NiMCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xMGE3NDZlYzFiYWE0OWIwODdlYTlhZGNhZDBlZmE3ZSA9ICQoJzxkaXYgaWQ9Imh0bWxfMTBhNzQ2ZWMxYmFhNDliMDg3ZWE5YWRjYWQwZWZhN2UiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPldlc3RvbiAsIFlvcms8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2EyNTA1ZTg4ZDAxNzQwNzRiNjkwZmU2YTc0YzIzY2IwLnNldENvbnRlbnQoaHRtbF8xMGE3NDZlYzFiYWE0OWIwODdlYTlhZGNhZDBlZmE3ZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl84Mjk1ZjU4MzNiNGY0OGIxYWUyMGMzNmU5YmY1MDExZS5iaW5kUG9wdXAocG9wdXBfYTI1MDVlODhkMDE3NDA3NGI2OTBmZTZhNzRjMjNjYjApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOWQ1NjIyYjY4NzE5NGVhMmIzMWU1NzVlNWY3ZjMxMmQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My42OTYzMTksLTc5LjUzMjI0MjQwMDAwMDAyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzY1NjhmNDhkYWNiYzRkNDdiMTk2ZGIwZTgwNzgwNGZiKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2RjODljNjU3MTY1ZDQyN2Y4NGIyMjRmNzU0MDA5MzY2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzgyYjQwYmI5ZmUzMDQ4MDI4ZDZiMjVjM2JjMmE0MmI5ID0gJCgnPGRpdiBpZD0iaHRtbF84MmI0MGJiOWZlMzA0ODAyOGQ2YjI1YzNiYzJhNDJiOSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+V2VzdG1vdW50ICwgRXRvYmljb2tlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kYzg5YzY1NzE2NWQ0MjdmODRiMjI0Zjc1NDAwOTM2Ni5zZXRDb250ZW50KGh0bWxfODJiNDBiYjlmZTMwNDgwMjhkNmIyNWMzYmMyYTQyYjkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOWQ1NjIyYjY4NzE5NGVhMmIzMWU1NzVlNWY3ZjMxMmQuYmluZFBvcHVwKHBvcHVwX2RjODljNjU3MTY1ZDQyN2Y4NGIyMjRmNzU0MDA5MzY2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzU4YmZhZjNiZTNiZDQ5NjZiMDQyODYwNGFkNTAzZWY2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNjg4OTA1NCwtNzkuNTU0NzI0NDAwMDAwMDFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfNjU2OGY0OGRhY2JjNGQ0N2IxOTZkYjBlODA3ODA0ZmIpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZWE5OWNjYWJmNmY1NGIzMWI3ZTc0NGY5Njk5NzE3YzEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMTM1MzIwM2M0MThkNDA4OWE0ZWEzNmI3YjJkMTE3MDEgPSAkKCc8ZGl2IGlkPSJodG1sXzEzNTMyMDNjNDE4ZDQwODlhNGVhMzZiN2IyZDExNzAxIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5LaW5nc3ZpZXcgVmlsbGFnZSAsIE1hcnRpbiBHcm92ZSBHYXJkZW5zICwgUmljaHZpZXcgR2FyZGVucyAsIFN0LiBQaGlsbGlwcyAsIEV0b2JpY29rZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZWE5OWNjYWJmNmY1NGIzMWI3ZTc0NGY5Njk5NzE3YzEuc2V0Q29udGVudChodG1sXzEzNTMyMDNjNDE4ZDQwODlhNGVhMzZiN2IyZDExNzAxKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzU4YmZhZjNiZTNiZDQ5NjZiMDQyODYwNGFkNTAzZWY2LmJpbmRQb3B1cChwb3B1cF9lYTk5Y2NhYmY2ZjU0YjMxYjdlNzQ0Zjk2OTk3MTdjMSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8wMTI2YzRiYzQzZGQ0ODA1YmY5MjUwY2MzOWRmMWM0NSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjczOTQxNjM5OTk5OTk5NiwtNzkuNTg4NDM2OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF82NTY4ZjQ4ZGFjYmM0ZDQ3YjE5NmRiMGU4MDc4MDRmYik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8yYTZkNDM3MjA5YzE0NjNmOTI5ZmFmYmM1YjU2M2M0OCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kNTc3NzkwODA4MGI0ZjA3OWQ4Y2E5MThmYjE2ZGJlMSA9ICQoJzxkaXYgaWQ9Imh0bWxfZDU3Nzc5MDgwODBiNGYwNzlkOGNhOTE4ZmIxNmRiZTEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkFsYmlvbiBHYXJkZW5zICwgQmVhdW1vbmQgSGVpZ2h0cyAsIEh1bWJlcmdhdGUgLCBKYW1lc3Rvd24gLCBNb3VudCBPbGl2ZSAsIFNpbHZlcnN0b25lICwgU291dGggU3RlZWxlcyAsIFRoaXN0bGV0b3duICwgRXRvYmljb2tlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yYTZkNDM3MjA5YzE0NjNmOTI5ZmFmYmM1YjU2M2M0OC5zZXRDb250ZW50KGh0bWxfZDU3Nzc5MDgwODBiNGYwNzlkOGNhOTE4ZmIxNmRiZTEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMDEyNmM0YmM0M2RkNDgwNWJmOTI1MGNjMzlkZjFjNDUuYmluZFBvcHVwKHBvcHVwXzJhNmQ0MzcyMDljMTQ2M2Y5MjlmYWZiYzViNTYzYzQ4KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzk1YmExOTZlMTgwZDQyNjVhYTRhMDk3ZTNlMTU0MWVmID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuNzA2NzQ4Mjk5OTk5OTk0LC03OS41OTQwNTQ0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzY1NjhmNDhkYWNiYzRkNDdiMTk2ZGIwZTgwNzgwNGZiKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzQ1NDE5NjI0YTI3MDQxMjFiMDIwMDIwMjhhNmFmYjhhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2VjNmNlYmU3M2JhMjQ1NDFiMTUxYTEyYTRjOGY1MWVlID0gJCgnPGRpdiBpZD0iaHRtbF9lYzZjZWJlNzNiYTI0NTQxYjE1MWExMmE0YzhmNTFlZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Tm9ydGh3ZXN0ICwgRXRvYmljb2tlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80NTQxOTYyNGEyNzA0MTIxYjAyMDAyMDI4YTZhZmI4YS5zZXRDb250ZW50KGh0bWxfZWM2Y2ViZTczYmEyNDU0MWIxNTFhMTJhNGM4ZjUxZWUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOTViYTE5NmUxODBkNDI2NWFhNGEwOTdlM2UxNTQxZWYuYmluZFBvcHVwKHBvcHVwXzQ1NDE5NjI0YTI3MDQxMjFiMDIwMDIwMjhhNmFmYjhhKTsKCiAgICAgICAgICAgIAogICAgICAgIAo8L3NjcmlwdD4=\" style=\"position:absolute;width:100%;height:100%;left:0;top:0;border:none !important;\" allowfullscreen webkitallowfullscreen mozallowfullscreen></iframe></div></div>"
],
"text/plain": [
"<folium.folium.Map at 0x7f7bc1715b70>"
]
},
"execution_count": 37,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# create map of Toronto using latitude and longitude values\n",
"map_toronto = folium.Map(location=[latitude, longitude], zoom_start=10)\n",
"\n",
"# add markers to map\n",
"for lat, lng, borough, neighborhood in zip(df_merged['Latitude'], df_merged['Longitude'], df_merged['Borough'], df_merged['Neighborhood']):\n",
" label = '{}, {}'.format(neighborhood, borough)\n",
" label = folium.Popup(label, parse_html=True)\n",
" folium.CircleMarker(\n",
" [lat, lng],\n",
" radius=5,\n",
" popup=label,\n",
" color='blue',\n",
" fill=True,\n",
" fill_color='#3186cc',\n",
" fill_opacity=0.7,\n",
" parse_html=False).add_to(map_toronto) \n",
" \n",
"map_toronto"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Define Foursquare credentials and version"
]
},
{
"cell_type": "code",
"execution_count": 40,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Your credentails:\n",
"CLIENT_ID: PA04CRFBNVV4WQU3UFGCK1PJLLR1PTXMDZQ0CMAUFYXKNLYS\n",
"CLIENT_SECRET:T0M2PTV1RT4ROGFBMTATPW042TBGXVEQ23WYNJRUZFFNWWB0\n"
]
}
],
"source": [
"CLIENT_ID = 'PA04CRFBNVV4WQU3UFGCK1PJLLR1PTXMDZQ0CMAUFYXKNLYS' # your Foursquare ID\n",
"CLIENT_SECRET = 'T0M2PTV1RT4ROGFBMTATPW042TBGXVEQ23WYNJRUZFFNWWB0' # your Foursquare Secret\n",
"VERSION = '20180605' # Foursquare API version\n",
"\n",
"print('Your credentails:')\n",
"print('CLIENT_ID: ' + CLIENT_ID)\n",
"print('CLIENT_SECRET:' + CLIENT_SECRET)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's explore the first borough in our dataframe"
]
},
{
"cell_type": "code",
"execution_count": 43,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"'Scarborough'"
]
},
"execution_count": 43,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_merged.loc[0, 'Borough']"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Get the borough's latitude and longitude values."
]
},
{
"cell_type": "code",
"execution_count": 45,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Latitude and longitude values of Scarborough are 43.806686299999996, -79.19435340000001.\n"
]
}
],
"source": [
"borough_latitude = df_merged.loc[0, 'Latitude'] # borough latitude value\n",
"borough_longitude = df_merged.loc[0, 'Longitude'] # borough longitude value\n",
"\n",
"borough_name = df_merged.loc[0, 'Borough'] # borough name\n",
"\n",
"print('Latitude and longitude values of {} are {}, {}.'.format(borough_name, \n",
" borough_latitude, \n",
" borough_longitude))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now, let's get the top 50 venues that are in Marble Hill within a radius of 2000 meters."
]
},
{
"cell_type": "code",
"execution_count": 67,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"'https://api.foursquare.com/v2/venues/explore?&client_id=PA04CRFBNVV4WQU3UFGCK1PJLLR1PTXMDZQ0CMAUFYXKNLYS&client_secret=T0M2PTV1RT4ROGFBMTATPW042TBGXVEQ23WYNJRUZFFNWWB0&v=20180605&ll=43.806686299999996,-79.19435340000001&radius=1000&limit=50'"
]
},
"execution_count": 67,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"LIMIT = 50 # limit of number of venues returned by Foursquare API\n",
"\n",
"radius = 1000 # define radius\n",
"\n",
"# create URL\n",
"url = 'https://api.foursquare.com/v2/venues/explore?&client_id={}&client_secret={}&v={}&ll={},{}&radius={}&limit={}'.format(\n",
" CLIENT_ID, \n",
" CLIENT_SECRET, \n",
" VERSION, \n",
" borough_latitude, \n",
" borough_longitude, \n",
" radius, \n",
" LIMIT)\n",
"url # display URL"
]
},
{
"cell_type": "code",
"execution_count": 68,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"{'meta': {'code': 200, 'requestId': '5cb47661db04f530c743a0ec'},\n",
" 'response': {'suggestedFilters': {'header': 'Tap to show:',\n",
" 'filters': [{'name': 'Open now', 'key': 'openNow'}]},\n",
" 'headerLocation': 'Malvern',\n",
" 'headerFullLocation': 'Malvern, Toronto',\n",
" 'headerLocationGranularity': 'neighborhood',\n",
" 'totalResults': 15,\n",
" 'suggestedBounds': {'ne': {'lat': 43.81568630900001,\n",
" 'lng': -79.18190576146081},\n",
" 'sw': {'lat': 43.797686290999984, 'lng': -79.20680103853921}},\n",
" 'groups': [{'type': 'Recommended Places',\n",
" 'name': 'recommended',\n",
" 'items': [{'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '4d669cba83865481c948fa53',\n",
" 'name': 'Images Salon & Spa',\n",
" 'location': {'address': '8130 Sheppard Ave E',\n",
" 'crossStreet': 'Morningside Ave',\n",
" 'lat': 43.80228301948931,\n",
" 'lng': -79.19856472801668,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 43.80228301948931,\n",
" 'lng': -79.19856472801668}],\n",
" 'distance': 595,\n",
" 'postalCode': 'M1B 3W3',\n",
" 'cc': 'CA',\n",
" 'city': 'Toronto',\n",
" 'state': 'ON',\n",
" 'country': 'Canada',\n",
" 'formattedAddress': ['8130 Sheppard Ave E (Morningside Ave)',\n",
" 'Toronto ON M1B 3W3',\n",
" 'Canada']},\n",
" 'categories': [{'id': '4bf58dd8d48988d1ed941735',\n",
" 'name': 'Spa',\n",
" 'pluralName': 'Spas',\n",
" 'shortName': 'Spa',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/shops/spa_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-4d669cba83865481c948fa53-0'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '4b914562f964a520d4ae33e3',\n",
" 'name': 'Caribbean Wave',\n",
" 'location': {'address': '875 Milner Ave',\n",
" 'crossStreet': 'Milner and Morningside',\n",
" 'lat': 43.798557859976256,\n",
" 'lng': -79.19577725412623,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 43.798557859976256,\n",
" 'lng': -79.19577725412623}],\n",
" 'distance': 912,\n",
" 'postalCode': 'M1B',\n",
" 'cc': 'CA',\n",
" 'city': 'Toronto',\n",
" 'state': 'ON',\n",
" 'country': 'Canada',\n",
" 'formattedAddress': ['875 Milner Ave (Milner and Morningside)',\n",
" 'Toronto ON M1B',\n",
" 'Canada']},\n",
" 'categories': [{'id': '4bf58dd8d48988d144941735',\n",
" 'name': 'Caribbean Restaurant',\n",
" 'pluralName': 'Caribbean Restaurants',\n",
" 'shortName': 'Caribbean',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/food/caribbean_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-4b914562f964a520d4ae33e3-1'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '4b6718c2f964a5203f3a2be3',\n",
" 'name': \"Harvey's\",\n",
" 'location': {'address': '853 Milner Ave',\n",
" 'crossStreet': 'at Morningside Ave',\n",
" 'lat': 43.80010575211872,\n",
" 'lng': -79.19825833589329,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 43.80010575211872,\n",
" 'lng': -79.19825833589329}],\n",
" 'distance': 796,\n",
" 'postalCode': 'M1B 5N6',\n",
" 'cc': 'CA',\n",
" 'city': 'Scarborough',\n",
" 'state': 'ON',\n",
" 'country': 'Canada',\n",
" 'formattedAddress': ['853 Milner Ave (at Morningside Ave)',\n",
" 'Scarborough ON M1B 5N6',\n",
" 'Canada']},\n",
" 'categories': [{'id': '4bf58dd8d48988d16e941735',\n",
" 'name': 'Fast Food Restaurant',\n",
" 'pluralName': 'Fast Food Restaurants',\n",
" 'shortName': 'Fast Food',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/food/fastfood_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-4b6718c2f964a5203f3a2be3-2'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '4bcb612d3740b713f0606265',\n",
" 'name': 'Staples Morningside',\n",
" 'location': {'address': '850 Milner Avenue',\n",
" 'lat': 43.80028467632823,\n",
" 'lng': -79.19660657644272,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 43.80028467632823,\n",
" 'lng': -79.19660657644272}],\n",
" 'distance': 735,\n",
" 'postalCode': 'M1B 5N7',\n",
" 'cc': 'CA',\n",
" 'city': 'Scarborough',\n",
" 'state': 'ON',\n",
" 'country': 'Canada',\n",
" 'formattedAddress': ['850 Milner Avenue',\n",
" 'Scarborough ON M1B 5N7',\n",
" 'Canada']},\n",
" 'categories': [{'id': '4bf58dd8d48988d121951735',\n",
" 'name': 'Paper / Office Supplies Store',\n",
" 'pluralName': 'Paper / Office Supplies Stores',\n",
" 'shortName': 'Office Supplies',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/shops/papergoods_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-4bcb612d3740b713f0606265-3'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '579a91b3498e9bd833afa78a',\n",
" 'name': \"Wendy's\",\n",
" 'location': {'address': '8129 Sheppard Avenue',\n",
" 'lat': 43.8020084,\n",
" 'lng': -79.1980797,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 43.8020084,\n",
" 'lng': -79.1980797}],\n",
" 'distance': 600,\n",
" 'postalCode': 'M1B 6A3',\n",
" 'cc': 'CA',\n",
" 'city': 'Scarborough',\n",
" 'state': 'ON',\n",
" 'country': 'Canada',\n",
" 'formattedAddress': ['8129 Sheppard Avenue',\n",
" 'Scarborough ON M1B 6A3',\n",
" 'Canada']},\n",
" 'categories': [{'id': '4bf58dd8d48988d16e941735',\n",
" 'name': 'Fast Food Restaurant',\n",
" 'pluralName': 'Fast Food Restaurants',\n",
" 'shortName': 'Fast Food',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/food/fastfood_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-579a91b3498e9bd833afa78a-4'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '4bb6b9446edc76b0d771311c',\n",
" 'name': \"Wendy's\",\n",
" 'location': {'crossStreet': 'Morningside & Sheppard',\n",
" 'lat': 43.80744841934756,\n",
" 'lng': -79.19905558052072,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 43.80744841934756,\n",
" 'lng': -79.19905558052072}],\n",
" 'distance': 387,\n",
" 'cc': 'CA',\n",
" 'city': 'Toronto',\n",
" 'state': 'ON',\n",
" 'country': 'Canada',\n",
" 'formattedAddress': ['Toronto ON', 'Canada']},\n",
" 'categories': [{'id': '4bf58dd8d48988d16e941735',\n",
" 'name': 'Fast Food Restaurant',\n",
" 'pluralName': 'Fast Food Restaurants',\n",
" 'shortName': 'Fast Food',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/food/fastfood_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-4bb6b9446edc76b0d771311c-5'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '4b16e23bf964a520edbe23e3',\n",
" 'name': 'Tim Hortons',\n",
" 'location': {'address': '8129 Sheppard Ave',\n",
" 'crossStreet': 'Morningside Ave',\n",
" 'lat': 43.801999861382,\n",
" 'lng': -79.1981689631939,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 43.801999861382,\n",
" 'lng': -79.1981689631939}],\n",
" 'distance': 605,\n",
" 'postalCode': 'M1B 6A3',\n",
" 'cc': 'CA',\n",
" 'city': 'Scarborough',\n",
" 'state': 'ON',\n",
" 'country': 'Canada',\n",
" 'formattedAddress': ['8129 Sheppard Ave (Morningside Ave)',\n",
" 'Scarborough ON M1B 6A3',\n",
" 'Canada']},\n",
" 'categories': [{'id': '4bf58dd8d48988d1e0931735',\n",
" 'name': 'Coffee Shop',\n",
" 'pluralName': 'Coffee Shops',\n",
" 'shortName': 'Coffee Shop',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/food/coffeeshop_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-4b16e23bf964a520edbe23e3-6'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '4bd08ceeb221c9b6cbe8d3d0',\n",
" 'name': 'Lee Valley',\n",
" 'location': {'address': '1275 Morningside',\n",
" 'lat': 43.803161304831846,\n",
" 'lng': -79.19968142252247,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 43.803161304831846,\n",
" 'lng': -79.19968142252247}],\n",
" 'distance': 580,\n",
" 'cc': 'CA',\n",
" 'city': 'Toronto',\n",
" 'state': 'ON',\n",
" 'country': 'Canada',\n",
" 'formattedAddress': ['1275 Morningside', 'Toronto ON', 'Canada']},\n",
" 'categories': [{'id': '4bf58dd8d48988d1fb941735',\n",
" 'name': 'Hobby Shop',\n",
" 'pluralName': 'Hobby Shops',\n",
" 'shortName': 'Hobbies',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/shops/hobbyshop_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-4bd08ceeb221c9b6cbe8d3d0-7'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '4e0b137722713e13018e7117',\n",
" 'name': 'Tim Hortons / Esso',\n",
" 'location': {'address': 'Morningside and sheppard',\n",
" 'lat': 43.801659656390676,\n",
" 'lng': -79.1991327091692,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 43.801659656390676,\n",
" 'lng': -79.1991327091692}],\n",
" 'distance': 678,\n",
" 'cc': 'CA',\n",
" 'city': 'Toronto',\n",
" 'state': 'ON',\n",
" 'country': 'Canada',\n",
" 'formattedAddress': ['Morningside and sheppard',\n",
" 'Toronto ON',\n",
" 'Canada']},\n",
" 'categories': [{'id': '4bf58dd8d48988d1e0931735',\n",
" 'name': 'Coffee Shop',\n",
" 'pluralName': 'Coffee Shops',\n",
" 'shortName': 'Coffee Shop',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/food/coffeeshop_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-4e0b137722713e13018e7117-8'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '4ceaa2f0f8653704f906bec4',\n",
" 'name': 'Mr Jerk',\n",
" 'location': {'address': '1161 Morningside Avenue',\n",
" 'crossStreet': 'Morningside &Sheppard',\n",
" 'lat': 43.801262219554275,\n",
" 'lng': -79.19975818333775,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 43.801262219554275,\n",
" 'lng': -79.19975818333775}],\n",
" 'distance': 743,\n",
" 'cc': 'CA',\n",
" 'city': 'Toronto',\n",
" 'state': 'ON',\n",
" 'country': 'Canada',\n",
" 'formattedAddress': ['1161 Morningside Avenue (Morningside &Sheppard)',\n",
" 'Toronto ON',\n",
" 'Canada']},\n",
" 'categories': [{'id': '4bf58dd8d48988d1c8941735',\n",
" 'name': 'African Restaurant',\n",
" 'pluralName': 'African Restaurants',\n",
" 'shortName': 'African',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/food/african_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-4ceaa2f0f8653704f906bec4-9'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '4c706524df6b8cfab244b84d',\n",
" 'name': \"Charley's Exotic Cuisine\",\n",
" 'location': {'address': '3-1158 Morningside Ave',\n",
" 'crossStreet': 'Sheppard Ave',\n",
" 'lat': 43.80098159718747,\n",
" 'lng': -79.20023292303085,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 43.80098159718747,\n",
" 'lng': -79.20023292303085}],\n",
" 'distance': 791,\n",
" 'postalCode': 'M1B 3A4',\n",
" 'cc': 'CA',\n",
" 'city': 'Toronto',\n",
" 'state': 'ON',\n",
" 'country': 'Canada',\n",
" 'formattedAddress': ['3-1158 Morningside Ave (Sheppard Ave)',\n",
" 'Toronto ON M1B 3A4',\n",
" 'Canada']},\n",
" 'categories': [{'id': '4bf58dd8d48988d145941735',\n",
" 'name': 'Chinese Restaurant',\n",
" 'pluralName': 'Chinese Restaurants',\n",
" 'shortName': 'Chinese',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/food/asian_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-4c706524df6b8cfab244b84d-10'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '539641d9498ee4f723c48089',\n",
" 'name': 'Fusion Supermarket',\n",
" 'location': {'address': '1150 Morningside Ave',\n",
" 'crossStreet': 'Milner',\n",
" 'lat': 43.800527899352915,\n",
" 'lng': -79.2000637571665,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 43.800527899352915,\n",
" 'lng': -79.2000637571665}],\n",
" 'distance': 824,\n",
" 'postalCode': 'M1B 3A4',\n",
" 'cc': 'CA',\n",
" 'city': 'Toronto',\n",
" 'state': 'ON',\n",
" 'country': 'Canada',\n",
" 'formattedAddress': ['1150 Morningside Ave (Milner)',\n",
" 'Toronto ON M1B 3A4',\n",
" 'Canada']},\n",
" 'categories': [{'id': '52f2ab2ebcbc57f1066b8b1c',\n",
" 'name': 'Fruit & Vegetable Store',\n",
" 'pluralName': 'Fruit & Vegetable Stores',\n",
" 'shortName': 'Fruit & Vegetable Store',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/shops/food_grocery_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-539641d9498ee4f723c48089-11'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '55e34982498ea9b7a8027f90',\n",
" 'name': 'Fit4Less',\n",
" 'location': {'address': '855 Milner Ave',\n",
" 'lat': 43.799668506947064,\n",
" 'lng': -79.19820682728174,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 43.799668506947064,\n",
" 'lng': -79.19820682728174}],\n",
" 'distance': 840,\n",
" 'postalCode': 'M1B 5N6',\n",
" 'cc': 'CA',\n",
" 'city': 'Scarborough',\n",
" 'state': 'ON',\n",
" 'country': 'Canada',\n",
" 'formattedAddress': ['855 Milner Ave',\n",
" 'Scarborough ON M1B 5N6',\n",
" 'Canada']},\n",
" 'categories': [{'id': '4bf58dd8d48988d176941735',\n",
" 'name': 'Gym',\n",
" 'pluralName': 'Gyms',\n",
" 'shortName': 'Gym',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/building/gym_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-55e34982498ea9b7a8027f90-12'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '4b89abadf964a520ae4a32e3',\n",
" 'name': 'Quiznos',\n",
" 'location': {'address': '875 Milner Ave',\n",
" 'crossStreet': 'at Morningside Ave',\n",
" 'lat': 43.798773188206816,\n",
" 'lng': -79.19655550872147,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 43.798773188206816,\n",
" 'lng': -79.19655550872147}],\n",
" 'distance': 898,\n",
" 'postalCode': 'M1B 5N6',\n",
" 'cc': 'CA',\n",
" 'city': 'Toronto',\n",
" 'state': 'ON',\n",
" 'country': 'Canada',\n",
" 'formattedAddress': ['875 Milner Ave (at Morningside Ave)',\n",
" 'Toronto ON M1B 5N6',\n",
" 'Canada']},\n",
" 'categories': [{'id': '4bf58dd8d48988d1c5941735',\n",
" 'name': 'Sandwich Place',\n",
" 'pluralName': 'Sandwich Places',\n",
" 'shortName': 'Sandwiches',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/food/deli_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-4b89abadf964a520ae4a32e3-13'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '4fdb659ee4b0fcb93efc18d7',\n",
" 'name': 'joyce trimmer park',\n",
" 'location': {'address': '8450 Sheppard Ave E',\n",
" 'crossStreet': 'Conlins and Sheppard',\n",
" 'lat': 43.80626621064408,\n",
" 'lng': -79.18267533364352,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 43.80626621064408,\n",
" 'lng': -79.18267533364352}],\n",
" 'distance': 939,\n",
" 'cc': 'CA',\n",
" 'city': 'Toronto',\n",
" 'state': 'ON',\n",
" 'country': 'Canada',\n",
" 'formattedAddress': ['8450 Sheppard Ave E (Conlins and Sheppard)',\n",
" 'Toronto ON',\n",
" 'Canada']},\n",
" 'categories': [{'id': '4bf58dd8d48988d163941735',\n",
" 'name': 'Park',\n",
" 'pluralName': 'Parks',\n",
" 'shortName': 'Park',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/parks_outdoors/park_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-4fdb659ee4b0fcb93efc18d7-14'}]}]}}"
]
},
"execution_count": 68,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"#Get the results\n",
"results = requests.get(url).json()\n",
"results"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Clean the json and structure it into a pandas dataframe."
]
},
{
"cell_type": "code",
"execution_count": 69,
"metadata": {},
"outputs": [],
"source": [
"# function that extracts the category of the venue\n",
"def get_category_type(row):\n",
" try:\n",
" categories_list = row['categories']\n",
" except:\n",
" categories_list = row['venue.categories']\n",
" \n",
" if len(categories_list) == 0:\n",
" return None\n",
" else:\n",
" return categories_list[0]['name']"
]
},
{
"cell_type": "code",
"execution_count": 70,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>name</th>\n",
" <th>categories</th>\n",
" <th>lat</th>\n",
" <th>lng</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Images Salon &amp; Spa</td>\n",
" <td>Spa</td>\n",
" <td>43.802283</td>\n",
" <td>-79.198565</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>Caribbean Wave</td>\n",
" <td>Caribbean Restaurant</td>\n",
" <td>43.798558</td>\n",
" <td>-79.195777</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>Harvey's</td>\n",
" <td>Fast Food Restaurant</td>\n",
" <td>43.800106</td>\n",
" <td>-79.198258</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>Staples Morningside</td>\n",
" <td>Paper / Office Supplies Store</td>\n",
" <td>43.800285</td>\n",
" <td>-79.196607</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>Wendy's</td>\n",
" <td>Fast Food Restaurant</td>\n",
" <td>43.802008</td>\n",
" <td>-79.198080</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" name categories lat lng\n",
"0 Images Salon & Spa Spa 43.802283 -79.198565\n",
"1 Caribbean Wave Caribbean Restaurant 43.798558 -79.195777\n",
"2 Harvey's Fast Food Restaurant 43.800106 -79.198258\n",
"3 Staples Morningside Paper / Office Supplies Store 43.800285 -79.196607\n",
"4 Wendy's Fast Food Restaurant 43.802008 -79.198080"
]
},
"execution_count": 70,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"venues = results['response']['groups'][0]['items']\n",
" \n",
"nearby_venues = json_normalize(venues) # flatten JSON\n",
"\n",
"# filter columns\n",
"filtered_columns = ['venue.name', 'venue.categories', 'venue.location.lat', 'venue.location.lng']\n",
"nearby_venues =nearby_venues.loc[:, filtered_columns]\n",
"\n",
"# filter the category for each row\n",
"nearby_venues['venue.categories'] = nearby_venues.apply(get_category_type, axis=1)\n",
"\n",
"# clean columns\n",
"nearby_venues.columns = [col.split(\".\")[-1] for col in nearby_venues.columns]\n",
"\n",
"nearby_venues.head()"
]
},
{
"cell_type": "code",
"execution_count": 71,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"15 venues were returned by Foursquare.\n"
]
}
],
"source": [
"print('{} venues were returned by Foursquare.'.format(nearby_venues.shape[0]))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"create a function to repeat the same process to all boroughs in Toronto"
]
},
{
"cell_type": "code",
"execution_count": 72,
"metadata": {},
"outputs": [],
"source": [
"def getNearbyVenues(names, latitudes, longitudes, radius=1000):\n",
" \n",
" venues_list=[]\n",
" for name, lat, lng in zip(names, latitudes, longitudes):\n",
" print(name)\n",
" \n",
" # create the API request URL\n",
" url = 'https://api.foursquare.com/v2/venues/explore?&client_id={}&client_secret={}&v={}&ll={},{}&radius={}&limit={}'.format(\n",
" CLIENT_ID, \n",
" CLIENT_SECRET, \n",
" VERSION, \n",
" lat, \n",
" lng, \n",
" radius, \n",
" LIMIT)\n",
" \n",
" # make the GET request\n",
" results = requests.get(url).json()[\"response\"]['groups'][0]['items']\n",
" \n",
" # return only relevant information for each nearby venue\n",
" venues_list.append([(\n",
" name, \n",
" lat, \n",
" lng, \n",
" v['venue']['name'], \n",
" v['venue']['location']['lat'], \n",
" v['venue']['location']['lng'], \n",
" v['venue']['categories'][0]['name']) for v in results])\n",
"\n",
" nearby_venues = pd.DataFrame([item for venue_list in venues_list for item in venue_list])\n",
" nearby_venues.columns = ['Borough', \n",
" 'Borough Latitude', \n",
" 'Borough Longitude', \n",
" 'Venue', \n",
" 'Venue Latitude', \n",
" 'Venue Longitude', \n",
" 'Venue Category']\n",
" \n",
" return(nearby_venues)"
]
},
{
"cell_type": "code",
"execution_count": 75,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Scarborough\n",
"Scarborough\n",
"Scarborough\n",
"Scarborough\n",
"Scarborough\n",
"Scarborough\n",
"Scarborough\n",
"Scarborough\n",
"Scarborough\n",
"Scarborough\n",
"Scarborough\n",
"Scarborough\n",
"Scarborough\n",
"Scarborough\n",
"Scarborough\n",
"Scarborough\n",
"Scarborough\n",
"North York\n",
"North York\n",
"North York\n",
"North York\n",
"North York\n",
"North York\n",
"North York\n",
"North York\n",
"North York\n",
"North York\n",
"North York\n",
"North York\n",
"North York\n",
"North York\n",
"North York\n",
"North York\n",
"North York\n",
"North York\n",
"East York\n",
"East York\n",
"East Toronto\n",
"East York\n",
"East York\n",
"East York\n",
"East Toronto\n",
"East Toronto\n",
"East Toronto\n",
"Central Toronto\n",
"Central Toronto\n",
"Central Toronto\n",
"Central Toronto\n",
"Central Toronto\n",
"Central Toronto\n",
"Downtown Toronto\n",
"Downtown Toronto\n",
"Downtown Toronto\n",
"Downtown Toronto\n",
"Downtown Toronto\n",
"Downtown Toronto\n",
"Downtown Toronto\n",
"Downtown Toronto\n",
"Downtown Toronto\n",
"Downtown Toronto\n",
"Downtown Toronto\n",
"Downtown Toronto\n",
"North York\n",
"Central Toronto\n",
"Central Toronto\n",
"Central Toronto\n",
"Downtown Toronto\n",
"Downtown Toronto\n",
"Downtown Toronto\n",
"Downtown Toronto\n",
"Downtown Toronto\n",
"North York\n",
"North York\n",
"York\n",
"York\n",
"Downtown Toronto\n",
"West Toronto\n",
"West Toronto\n",
"West Toronto\n",
"North York\n",
"York\n",
"York\n",
"West Toronto\n",
"West Toronto\n",
"West Toronto\n",
"Queen's Park\n",
"Mississauga\n",
"East Toronto\n",
"Etobicoke\n",
"Etobicoke\n",
"Etobicoke\n",
"Etobicoke\n",
"Etobicoke\n",
"Etobicoke\n",
"Etobicoke\n",
"Etobicoke\n",
"North York\n",
"North York\n",
"York\n",
"Etobicoke\n",
"Etobicoke\n",
"Etobicoke\n",
"Etobicoke\n"
]
}
],
"source": [
"#Toronto venues\n",
"toronto_venues = getNearbyVenues(names=df_merged['Borough'],\n",
" latitudes=df_merged['Latitude'],\n",
" longitudes=df_merged['Longitude']\n",
" )\n"
]
},
{
"cell_type": "code",
"execution_count": 76,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"(3344, 7)\n"
]
},
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Borough</th>\n",
" <th>Borough Latitude</th>\n",
" <th>Borough Longitude</th>\n",
" <th>Venue</th>\n",
" <th>Venue Latitude</th>\n",
" <th>Venue Longitude</th>\n",
" <th>Venue Category</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Scarborough</td>\n",
" <td>43.806686</td>\n",
" <td>-79.194353</td>\n",
" <td>Images Salon &amp; Spa</td>\n",
" <td>43.802283</td>\n",
" <td>-79.198565</td>\n",
" <td>Spa</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>Scarborough</td>\n",
" <td>43.806686</td>\n",
" <td>-79.194353</td>\n",
" <td>Caribbean Wave</td>\n",
" <td>43.798558</td>\n",
" <td>-79.195777</td>\n",
" <td>Caribbean Restaurant</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>Scarborough</td>\n",
" <td>43.806686</td>\n",
" <td>-79.194353</td>\n",
" <td>Harvey's</td>\n",
" <td>43.800106</td>\n",
" <td>-79.198258</td>\n",
" <td>Fast Food Restaurant</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>Scarborough</td>\n",
" <td>43.806686</td>\n",
" <td>-79.194353</td>\n",
" <td>Staples Morningside</td>\n",
" <td>43.800285</td>\n",
" <td>-79.196607</td>\n",
" <td>Paper / Office Supplies Store</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>Scarborough</td>\n",
" <td>43.806686</td>\n",
" <td>-79.194353</td>\n",
" <td>Wendy's</td>\n",
" <td>43.802008</td>\n",
" <td>-79.198080</td>\n",
" <td>Fast Food Restaurant</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Borough Borough Latitude Borough Longitude Venue \\\n",
"0 Scarborough 43.806686 -79.194353 Images Salon & Spa \n",
"1 Scarborough 43.806686 -79.194353 Caribbean Wave \n",
"2 Scarborough 43.806686 -79.194353 Harvey's \n",
"3 Scarborough 43.806686 -79.194353 Staples Morningside \n",
"4 Scarborough 43.806686 -79.194353 Wendy's \n",
"\n",
" Venue Latitude Venue Longitude Venue Category \n",
"0 43.802283 -79.198565 Spa \n",
"1 43.798558 -79.195777 Caribbean Restaurant \n",
"2 43.800106 -79.198258 Fast Food Restaurant \n",
"3 43.800285 -79.196607 Paper / Office Supplies Store \n",
"4 43.802008 -79.198080 Fast Food Restaurant "
]
},
"execution_count": 76,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"print(toronto_venues.shape)\n",
"toronto_venues.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's check how many venues were returned for each borough"
]
},
{
"cell_type": "code",
"execution_count": 77,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Borough Latitude</th>\n",
" <th>Borough Longitude</th>\n",
" <th>Venue</th>\n",
" <th>Venue Latitude</th>\n",
" <th>Venue Longitude</th>\n",
" <th>Venue Category</th>\n",
" </tr>\n",
" <tr>\n",
" <th>Borough</th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>Central Toronto</th>\n",
" <td>366</td>\n",
" <td>366</td>\n",
" <td>366</td>\n",
" <td>366</td>\n",
" <td>366</td>\n",
" <td>366</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Downtown Toronto</th>\n",
" <td>826</td>\n",
" <td>826</td>\n",
" <td>826</td>\n",
" <td>826</td>\n",
" <td>826</td>\n",
" <td>826</td>\n",
" </tr>\n",
" <tr>\n",
" <th>East Toronto</th>\n",
" <td>248</td>\n",
" <td>248</td>\n",
" <td>248</td>\n",
" <td>248</td>\n",
" <td>248</td>\n",
" <td>248</td>\n",
" </tr>\n",
" <tr>\n",
" <th>East York</th>\n",
" <td>193</td>\n",
" <td>193</td>\n",
" <td>193</td>\n",
" <td>193</td>\n",
" <td>193</td>\n",
" <td>193</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Etobicoke</th>\n",
" <td>240</td>\n",
" <td>240</td>\n",
" <td>240</td>\n",
" <td>240</td>\n",
" <td>240</td>\n",
" <td>240</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Mississauga</th>\n",
" <td>50</td>\n",
" <td>50</td>\n",
" <td>50</td>\n",
" <td>50</td>\n",
" <td>50</td>\n",
" <td>50</td>\n",
" </tr>\n",
" <tr>\n",
" <th>North York</th>\n",
" <td>560</td>\n",
" <td>560</td>\n",
" <td>560</td>\n",
" <td>560</td>\n",
" <td>560</td>\n",
" <td>560</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Queen's Park</th>\n",
" <td>50</td>\n",
" <td>50</td>\n",
" <td>50</td>\n",
" <td>50</td>\n",
" <td>50</td>\n",
" <td>50</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Scarborough</th>\n",
" <td>380</td>\n",
" <td>380</td>\n",
" <td>380</td>\n",
" <td>380</td>\n",
" <td>380</td>\n",
" <td>380</td>\n",
" </tr>\n",
" <tr>\n",
" <th>West Toronto</th>\n",
" <td>300</td>\n",
" <td>300</td>\n",
" <td>300</td>\n",
" <td>300</td>\n",
" <td>300</td>\n",
" <td>300</td>\n",
" </tr>\n",
" <tr>\n",
" <th>York</th>\n",
" <td>131</td>\n",
" <td>131</td>\n",
" <td>131</td>\n",
" <td>131</td>\n",
" <td>131</td>\n",
" <td>131</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Borough Latitude Borough Longitude Venue Venue Latitude \\\n",
"Borough \n",
"Central Toronto 366 366 366 366 \n",
"Downtown Toronto 826 826 826 826 \n",
"East Toronto 248 248 248 248 \n",
"East York 193 193 193 193 \n",
"Etobicoke 240 240 240 240 \n",
"Mississauga 50 50 50 50 \n",
"North York 560 560 560 560 \n",
"Queen's Park 50 50 50 50 \n",
"Scarborough 380 380 380 380 \n",
"West Toronto 300 300 300 300 \n",
"York 131 131 131 131 \n",
"\n",
" Venue Longitude Venue Category \n",
"Borough \n",
"Central Toronto 366 366 \n",
"Downtown Toronto 826 826 \n",
"East Toronto 248 248 \n",
"East York 193 193 \n",
"Etobicoke 240 240 \n",
"Mississauga 50 50 \n",
"North York 560 560 \n",
"Queen's Park 50 50 \n",
"Scarborough 380 380 \n",
"West Toronto 300 300 \n",
"York 131 131 "
]
},
"execution_count": 77,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"toronto_venues.groupby('Borough').count()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's find out how many unique categories can be curated from all the returned venues"
]
},
{
"cell_type": "code",
"execution_count": 78,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"There are 313 uniques categories.\n"
]
}
],
"source": [
"print('There are {} uniques categories.'.format(len(toronto_venues['Venue Category'].unique())))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Analyze Each Neighborhood"
]
},
{
"cell_type": "code",
"execution_count": 79,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Borough</th>\n",
" <th>Accessories Store</th>\n",
" <th>Adult Boutique</th>\n",
" <th>Afghan Restaurant</th>\n",
" <th>African Restaurant</th>\n",
" <th>Airport</th>\n",
" <th>Airport Lounge</th>\n",
" <th>American Restaurant</th>\n",
" <th>Amphitheater</th>\n",
" <th>Animal Shelter</th>\n",
" <th>Antique Shop</th>\n",
" <th>Aquarium</th>\n",
" <th>Art Gallery</th>\n",
" <th>Art Museum</th>\n",
" <th>Arts &amp; Crafts Store</th>\n",
" <th>Asian Restaurant</th>\n",
" <th>Athletics &amp; Sports</th>\n",
" <th>Auto Dealership</th>\n",
" <th>Auto Garage</th>\n",
" <th>Automotive Shop</th>\n",
" <th>BBQ Joint</th>\n",
" <th>Baby Store</th>\n",
" <th>Badminton Court</th>\n",
" <th>Bagel Shop</th>\n",
" <th>Bakery</th>\n",
" <th>Bank</th>\n",
" <th>Bar</th>\n",
" <th>Baseball Field</th>\n",
" <th>Baseball Stadium</th>\n",
" <th>Basketball Court</th>\n",
" <th>Basketball Stadium</th>\n",
" <th>Beach</th>\n",
" <th>Beach Bar</th>\n",
" <th>Beer Bar</th>\n",
" <th>Beer Store</th>\n",
" <th>Belgian Restaurant</th>\n",
" <th>Bike Shop</th>\n",
" <th>Bistro</th>\n",
" <th>Bookstore</th>\n",
" <th>Boutique</th>\n",
" <th>Bowling Alley</th>\n",
" <th>Brazilian Restaurant</th>\n",
" <th>Breakfast Spot</th>\n",
" <th>Brewery</th>\n",
" <th>Bridal Shop</th>\n",
" <th>Bridge</th>\n",
" <th>Bubble Tea Shop</th>\n",
" <th>Burger Joint</th>\n",
" <th>Burrito Place</th>\n",
" <th>Bus Line</th>\n",
" <th>Bus Station</th>\n",
" <th>Bus Stop</th>\n",
" <th>Business Service</th>\n",
" <th>Butcher</th>\n",
" <th>Cafeteria</th>\n",
" <th>Café</th>\n",
" <th>Cajun / Creole Restaurant</th>\n",
" <th>Candy Store</th>\n",
" <th>Cantonese Restaurant</th>\n",
" <th>Caribbean Restaurant</th>\n",
" <th>Castle</th>\n",
" <th>Cemetery</th>\n",
" <th>Check Cashing Service</th>\n",
" <th>Cheese Shop</th>\n",
" <th>Chinese Restaurant</th>\n",
" <th>Chiropractor</th>\n",
" <th>Chocolate Shop</th>\n",
" <th>Church</th>\n",
" <th>Churrascaria</th>\n",
" <th>Climbing Gym</th>\n",
" <th>Clothing Store</th>\n",
" <th>Cocktail Bar</th>\n",
" <th>Coffee Shop</th>\n",
" <th>College Gym</th>\n",
" <th>College Quad</th>\n",
" <th>College Rec Center</th>\n",
" <th>College Stadium</th>\n",
" <th>Comedy Club</th>\n",
" <th>Comfort Food Restaurant</th>\n",
" <th>Comic Shop</th>\n",
" <th>Community Center</th>\n",
" <th>Concert Hall</th>\n",
" <th>Construction &amp; Landscaping</th>\n",
" <th>Convenience Store</th>\n",
" <th>Cosmetics Shop</th>\n",
" <th>Coworking Space</th>\n",
" <th>Creperie</th>\n",
" <th>Cuban Restaurant</th>\n",
" <th>Cupcake Shop</th>\n",
" <th>Curling Ice</th>\n",
" <th>Dance Studio</th>\n",
" <th>Deli / Bodega</th>\n",
" <th>Department Store</th>\n",
" <th>Design Studio</th>\n",
" <th>Dessert Shop</th>\n",
" <th>Dim Sum Restaurant</th>\n",
" <th>Diner</th>\n",
" <th>Discount Store</th>\n",
" <th>Dive Bar</th>\n",
" <th>Dog Run</th>\n",
" <th>Doner Restaurant</th>\n",
" <th>Donut Shop</th>\n",
" <th>Dumpling Restaurant</th>\n",
" <th>Eastern European Restaurant</th>\n",
" <th>Electronics Store</th>\n",
" <th>Elementary School</th>\n",
" <th>Empanada Restaurant</th>\n",
" <th>Ethiopian Restaurant</th>\n",
" <th>Event Space</th>\n",
" <th>Falafel Restaurant</th>\n",
" <th>Farm</th>\n",
" <th>Farmers Market</th>\n",
" <th>Fast Food Restaurant</th>\n",
" <th>Field</th>\n",
" <th>Filipino Restaurant</th>\n",
" <th>Fireworks Store</th>\n",
" <th>Fish &amp; Chips Shop</th>\n",
" <th>Fish Market</th>\n",
" <th>Flea Market</th>\n",
" <th>Flower Shop</th>\n",
" <th>Food</th>\n",
" <th>Food &amp; Drink Shop</th>\n",
" <th>Food Court</th>\n",
" <th>Food Truck</th>\n",
" <th>Fountain</th>\n",
" <th>Frame Store</th>\n",
" <th>French Restaurant</th>\n",
" <th>Fried Chicken Joint</th>\n",
" <th>Frozen Yogurt Shop</th>\n",
" <th>Fruit &amp; Vegetable Store</th>\n",
" <th>Furniture / Home Store</th>\n",
" <th>Gaming Cafe</th>\n",
" <th>Garden</th>\n",
" <th>Garden Center</th>\n",
" <th>Gas Station</th>\n",
" <th>Gastropub</th>\n",
" <th>Gay Bar</th>\n",
" <th>General Entertainment</th>\n",
" <th>German Restaurant</th>\n",
" <th>Gift Shop</th>\n",
" <th>Golf Course</th>\n",
" <th>Golf Driving Range</th>\n",
" <th>Gourmet Shop</th>\n",
" <th>Greek Restaurant</th>\n",
" <th>Grocery Store</th>\n",
" <th>Gym</th>\n",
" <th>Gym / Fitness Center</th>\n",
" <th>Gym Pool</th>\n",
" <th>Hakka Restaurant</th>\n",
" <th>Harbor / Marina</th>\n",
" <th>Hardware Store</th>\n",
" <th>Hawaiian Restaurant</th>\n",
" <th>Health Food Store</th>\n",
" <th>Historic Site</th>\n",
" <th>History Museum</th>\n",
" <th>Hobby Shop</th>\n",
" <th>Hockey Arena</th>\n",
" <th>Home Service</th>\n",
" <th>Hong Kong Restaurant</th>\n",
" <th>Hookah Bar</th>\n",
" <th>Hostel</th>\n",
" <th>Hot Dog Joint</th>\n",
" <th>Hotel</th>\n",
" <th>Hotpot Restaurant</th>\n",
" <th>Housing Development</th>\n",
" <th>Ice Cream Shop</th>\n",
" <th>Indian Chinese Restaurant</th>\n",
" <th>Indian Restaurant</th>\n",
" <th>Indie Movie Theater</th>\n",
" <th>Indie Theater</th>\n",
" <th>Indonesian Restaurant</th>\n",
" <th>Intersection</th>\n",
" <th>Italian Restaurant</th>\n",
" <th>Japanese Restaurant</th>\n",
" <th>Jazz Club</th>\n",
" <th>Jewelry Store</th>\n",
" <th>Jewish Restaurant</th>\n",
" <th>Juice Bar</th>\n",
" <th>Kitchen Supply Store</th>\n",
" <th>Korean Restaurant</th>\n",
" <th>Lake</th>\n",
" <th>Latin American Restaurant</th>\n",
" <th>Laundromat</th>\n",
" <th>Laundry Service</th>\n",
" <th>Light Rail Station</th>\n",
" <th>Liquor Store</th>\n",
" <th>Lounge</th>\n",
" <th>Mac &amp; Cheese Joint</th>\n",
" <th>Malay Restaurant</th>\n",
" <th>Market</th>\n",
" <th>Martial Arts Dojo</th>\n",
" <th>Massage Studio</th>\n",
" <th>Mediterranean Restaurant</th>\n",
" <th>Men's Store</th>\n",
" <th>Metro Station</th>\n",
" <th>Mexican Restaurant</th>\n",
" <th>Middle Eastern Restaurant</th>\n",
" <th>Miscellaneous Shop</th>\n",
" <th>Mobile Phone Shop</th>\n",
" <th>Modern European Restaurant</th>\n",
" <th>Monument / Landmark</th>\n",
" <th>Moroccan Restaurant</th>\n",
" <th>Motorcycle Shop</th>\n",
" <th>Movie Theater</th>\n",
" <th>Museum</th>\n",
" <th>Music School</th>\n",
" <th>Music Store</th>\n",
" <th>Music Venue</th>\n",
" <th>Nail Salon</th>\n",
" <th>Neighborhood</th>\n",
" <th>New American Restaurant</th>\n",
" <th>Nightclub</th>\n",
" <th>Noodle House</th>\n",
" <th>Office</th>\n",
" <th>Opera House</th>\n",
" <th>Optical Shop</th>\n",
" <th>Organic Grocery</th>\n",
" <th>Other Great Outdoors</th>\n",
" <th>Other Repair Shop</th>\n",
" <th>Pakistani Restaurant</th>\n",
" <th>Paper / Office Supplies Store</th>\n",
" <th>Park</th>\n",
" <th>Pastry Shop</th>\n",
" <th>Performing Arts Venue</th>\n",
" <th>Persian Restaurant</th>\n",
" <th>Pet Store</th>\n",
" <th>Pharmacy</th>\n",
" <th>Photography Lab</th>\n",
" <th>Pie Shop</th>\n",
" <th>Pilates Studio</th>\n",
" <th>Pizza Place</th>\n",
" <th>Playground</th>\n",
" <th>Plaza</th>\n",
" <th>Poke Place</th>\n",
" <th>Pool</th>\n",
" <th>Pool Hall</th>\n",
" <th>Portuguese Restaurant</th>\n",
" <th>Poutine Place</th>\n",
" <th>Pub</th>\n",
" <th>Ramen Restaurant</th>\n",
" <th>Record Shop</th>\n",
" <th>Recreation Center</th>\n",
" <th>Rental Car Location</th>\n",
" <th>Residential Building (Apartment / Condo)</th>\n",
" <th>Restaurant</th>\n",
" <th>River</th>\n",
" <th>Road</th>\n",
" <th>Rock Climbing Spot</th>\n",
" <th>Rock Club</th>\n",
" <th>Salad Place</th>\n",
" <th>Salon / Barbershop</th>\n",
" <th>Sandwich Place</th>\n",
" <th>Scenic Lookout</th>\n",
" <th>School</th>\n",
" <th>Sculpture Garden</th>\n",
" <th>Seafood Restaurant</th>\n",
" <th>Shanghai Restaurant</th>\n",
" <th>Shoe Store</th>\n",
" <th>Shop &amp; Service</th>\n",
" <th>Shopping Mall</th>\n",
" <th>Skate Park</th>\n",
" <th>Skating Rink</th>\n",
" <th>Ski Area</th>\n",
" <th>Ski Chalet</th>\n",
" <th>Smoke Shop</th>\n",
" <th>Smoothie Shop</th>\n",
" <th>Snack Place</th>\n",
" <th>Soccer Field</th>\n",
" <th>Soccer Stadium</th>\n",
" <th>Social Club</th>\n",
" <th>Soup Place</th>\n",
" <th>South American Restaurant</th>\n",
" <th>Spa</th>\n",
" <th>Spanish Restaurant</th>\n",
" <th>Speakeasy</th>\n",
" <th>Sporting Goods Shop</th>\n",
" <th>Sports Bar</th>\n",
" <th>Sports Club</th>\n",
" <th>Sri Lankan Restaurant</th>\n",
" <th>Stadium</th>\n",
" <th>Stationery Store</th>\n",
" <th>Steakhouse</th>\n",
" <th>Storage Facility</th>\n",
" <th>Supermarket</th>\n",
" <th>Supplement Shop</th>\n",
" <th>Sushi Restaurant</th>\n",
" <th>Taco Place</th>\n",
" <th>Tailor Shop</th>\n",
" <th>Taiwanese Restaurant</th>\n",
" <th>Tanning Salon</th>\n",
" <th>Tapas Restaurant</th>\n",
" <th>Tea Room</th>\n",
" <th>Tech Startup</th>\n",
" <th>Tennis Court</th>\n",
" <th>Thai Restaurant</th>\n",
" <th>Theater</th>\n",
" <th>Theme Restaurant</th>\n",
" <th>Thrift / Vintage Store</th>\n",
" <th>Tibetan Restaurant</th>\n",
" <th>Toy / Game Store</th>\n",
" <th>Track</th>\n",
" <th>Trail</th>\n",
" <th>Train Station</th>\n",
" <th>Turkish Restaurant</th>\n",
" <th>Vegetarian / Vegan Restaurant</th>\n",
" <th>Video Game Store</th>\n",
" <th>Video Store</th>\n",
" <th>Vietnamese Restaurant</th>\n",
" <th>Warehouse Store</th>\n",
" <th>Wine Bar</th>\n",
" <th>Wine Shop</th>\n",
" <th>Wings Joint</th>\n",
" <th>Women's Store</th>\n",
" <th>Yoga Studio</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Scarborough</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>Scarborough</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>Scarborough</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>Scarborough</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>Scarborough</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Borough Accessories Store Adult Boutique Afghan Restaurant \\\n",
"0 Scarborough 0 0 0 \n",
"1 Scarborough 0 0 0 \n",
"2 Scarborough 0 0 0 \n",
"3 Scarborough 0 0 0 \n",
"4 Scarborough 0 0 0 \n",
"\n",
" African Restaurant Airport Airport Lounge American Restaurant \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" Amphitheater Animal Shelter Antique Shop Aquarium Art Gallery \\\n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 0 0 0 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 0 \n",
"\n",
" Art Museum Arts & Crafts Store Asian Restaurant Athletics & Sports \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" Auto Dealership Auto Garage Automotive Shop BBQ Joint Baby Store \\\n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 0 0 0 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 0 \n",
"\n",
" Badminton Court Bagel Shop Bakery Bank Bar Baseball Field \\\n",
"0 0 0 0 0 0 0 \n",
"1 0 0 0 0 0 0 \n",
"2 0 0 0 0 0 0 \n",
"3 0 0 0 0 0 0 \n",
"4 0 0 0 0 0 0 \n",
"\n",
" Baseball Stadium Basketball Court Basketball Stadium Beach Beach Bar \\\n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 0 0 0 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 0 \n",
"\n",
" Beer Bar Beer Store Belgian Restaurant Bike Shop Bistro Bookstore \\\n",
"0 0 0 0 0 0 0 \n",
"1 0 0 0 0 0 0 \n",
"2 0 0 0 0 0 0 \n",
"3 0 0 0 0 0 0 \n",
"4 0 0 0 0 0 0 \n",
"\n",
" Boutique Bowling Alley Brazilian Restaurant Breakfast Spot Brewery \\\n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 0 0 0 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 0 \n",
"\n",
" Bridal Shop Bridge Bubble Tea Shop Burger Joint Burrito Place \\\n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 0 0 0 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 0 \n",
"\n",
" Bus Line Bus Station Bus Stop Business Service Butcher Cafeteria \\\n",
"0 0 0 0 0 0 0 \n",
"1 0 0 0 0 0 0 \n",
"2 0 0 0 0 0 0 \n",
"3 0 0 0 0 0 0 \n",
"4 0 0 0 0 0 0 \n",
"\n",
" Café Cajun / Creole Restaurant Candy Store Cantonese Restaurant \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" Caribbean Restaurant Castle Cemetery Check Cashing Service Cheese Shop \\\n",
"0 0 0 0 0 0 \n",
"1 1 0 0 0 0 \n",
"2 0 0 0 0 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 0 \n",
"\n",
" Chinese Restaurant Chiropractor Chocolate Shop Church Churrascaria \\\n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 0 0 0 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 0 \n",
"\n",
" Climbing Gym Clothing Store Cocktail Bar Coffee Shop College Gym \\\n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 0 0 0 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 0 \n",
"\n",
" College Quad College Rec Center College Stadium Comedy Club \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" Comfort Food Restaurant Comic Shop Community Center Concert Hall \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" Construction & Landscaping Convenience Store Cosmetics Shop \\\n",
"0 0 0 0 \n",
"1 0 0 0 \n",
"2 0 0 0 \n",
"3 0 0 0 \n",
"4 0 0 0 \n",
"\n",
" Coworking Space Creperie Cuban Restaurant Cupcake Shop Curling Ice \\\n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 0 0 0 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 0 \n",
"\n",
" Dance Studio Deli / Bodega Department Store Design Studio Dessert Shop \\\n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 0 0 0 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 0 \n",
"\n",
" Dim Sum Restaurant Diner Discount Store Dive Bar Dog Run \\\n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 0 0 0 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 0 \n",
"\n",
" Doner Restaurant Donut Shop Dumpling Restaurant \\\n",
"0 0 0 0 \n",
"1 0 0 0 \n",
"2 0 0 0 \n",
"3 0 0 0 \n",
"4 0 0 0 \n",
"\n",
" Eastern European Restaurant Electronics Store Elementary School \\\n",
"0 0 0 0 \n",
"1 0 0 0 \n",
"2 0 0 0 \n",
"3 0 0 0 \n",
"4 0 0 0 \n",
"\n",
" Empanada Restaurant Ethiopian Restaurant Event Space Falafel Restaurant \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" Farm Farmers Market Fast Food Restaurant Field Filipino Restaurant \\\n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 0 1 0 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 1 0 0 \n",
"\n",
" Fireworks Store Fish & Chips Shop Fish Market Flea Market Flower Shop \\\n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 0 0 0 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 0 \n",
"\n",
" Food Food & Drink Shop Food Court Food Truck Fountain Frame Store \\\n",
"0 0 0 0 0 0 0 \n",
"1 0 0 0 0 0 0 \n",
"2 0 0 0 0 0 0 \n",
"3 0 0 0 0 0 0 \n",
"4 0 0 0 0 0 0 \n",
"\n",
" French Restaurant Fried Chicken Joint Frozen Yogurt Shop \\\n",
"0 0 0 0 \n",
"1 0 0 0 \n",
"2 0 0 0 \n",
"3 0 0 0 \n",
"4 0 0 0 \n",
"\n",
" Fruit & Vegetable Store Furniture / Home Store Gaming Cafe Garden \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" Garden Center Gas Station Gastropub Gay Bar General Entertainment \\\n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 0 0 0 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 0 \n",
"\n",
" German Restaurant Gift Shop Golf Course Golf Driving Range \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" Gourmet Shop Greek Restaurant Grocery Store Gym Gym / Fitness Center \\\n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 0 0 0 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 0 \n",
"\n",
" Gym Pool Hakka Restaurant Harbor / Marina Hardware Store \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" Hawaiian Restaurant Health Food Store Historic Site History Museum \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" Hobby Shop Hockey Arena Home Service Hong Kong Restaurant Hookah Bar \\\n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 0 0 0 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 0 \n",
"\n",
" Hostel Hot Dog Joint Hotel Hotpot Restaurant Housing Development \\\n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 0 0 0 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 0 \n",
"\n",
" Ice Cream Shop Indian Chinese Restaurant Indian Restaurant \\\n",
"0 0 0 0 \n",
"1 0 0 0 \n",
"2 0 0 0 \n",
"3 0 0 0 \n",
"4 0 0 0 \n",
"\n",
" Indie Movie Theater Indie Theater Indonesian Restaurant Intersection \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" Italian Restaurant Japanese Restaurant Jazz Club Jewelry Store \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" Jewish Restaurant Juice Bar Kitchen Supply Store Korean Restaurant \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" Lake Latin American Restaurant Laundromat Laundry Service \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" Light Rail Station Liquor Store Lounge Mac & Cheese Joint \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" Malay Restaurant Market Martial Arts Dojo Massage Studio \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" Mediterranean Restaurant Men's Store Metro Station Mexican Restaurant \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" Middle Eastern Restaurant Miscellaneous Shop Mobile Phone Shop \\\n",
"0 0 0 0 \n",
"1 0 0 0 \n",
"2 0 0 0 \n",
"3 0 0 0 \n",
"4 0 0 0 \n",
"\n",
" Modern European Restaurant Monument / Landmark Moroccan Restaurant \\\n",
"0 0 0 0 \n",
"1 0 0 0 \n",
"2 0 0 0 \n",
"3 0 0 0 \n",
"4 0 0 0 \n",
"\n",
" Motorcycle Shop Movie Theater Museum Music School Music Store \\\n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 0 0 0 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 0 \n",
"\n",
" Music Venue Nail Salon Neighborhood New American Restaurant Nightclub \\\n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 0 0 0 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 0 \n",
"\n",
" Noodle House Office Opera House Optical Shop Organic Grocery \\\n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 0 0 0 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 0 \n",
"\n",
" Other Great Outdoors Other Repair Shop Pakistani Restaurant \\\n",
"0 0 0 0 \n",
"1 0 0 0 \n",
"2 0 0 0 \n",
"3 0 0 0 \n",
"4 0 0 0 \n",
"\n",
" Paper / Office Supplies Store Park Pastry Shop Performing Arts Venue \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 1 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" Persian Restaurant Pet Store Pharmacy Photography Lab Pie Shop \\\n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 0 0 0 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 0 \n",
"\n",
" Pilates Studio Pizza Place Playground Plaza Poke Place Pool \\\n",
"0 0 0 0 0 0 0 \n",
"1 0 0 0 0 0 0 \n",
"2 0 0 0 0 0 0 \n",
"3 0 0 0 0 0 0 \n",
"4 0 0 0 0 0 0 \n",
"\n",
" Pool Hall Portuguese Restaurant Poutine Place Pub Ramen Restaurant \\\n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 0 0 0 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 0 \n",
"\n",
" Record Shop Recreation Center Rental Car Location \\\n",
"0 0 0 0 \n",
"1 0 0 0 \n",
"2 0 0 0 \n",
"3 0 0 0 \n",
"4 0 0 0 \n",
"\n",
" Residential Building (Apartment / Condo) Restaurant River Road \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" Rock Climbing Spot Rock Club Salad Place Salon / Barbershop \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" Sandwich Place Scenic Lookout School Sculpture Garden \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" Seafood Restaurant Shanghai Restaurant Shoe Store Shop & Service \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" Shopping Mall Skate Park Skating Rink Ski Area Ski Chalet Smoke Shop \\\n",
"0 0 0 0 0 0 0 \n",
"1 0 0 0 0 0 0 \n",
"2 0 0 0 0 0 0 \n",
"3 0 0 0 0 0 0 \n",
"4 0 0 0 0 0 0 \n",
"\n",
" Smoothie Shop Snack Place Soccer Field Soccer Stadium Social Club \\\n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 0 0 0 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 0 \n",
"\n",
" Soup Place South American Restaurant Spa Spanish Restaurant Speakeasy \\\n",
"0 0 0 1 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 0 0 0 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 0 \n",
"\n",
" Sporting Goods Shop Sports Bar Sports Club Sri Lankan Restaurant \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" Stadium Stationery Store Steakhouse Storage Facility Supermarket \\\n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 0 0 0 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 0 \n",
"\n",
" Supplement Shop Sushi Restaurant Taco Place Tailor Shop \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" Taiwanese Restaurant Tanning Salon Tapas Restaurant Tea Room \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" Tech Startup Tennis Court Thai Restaurant Theater Theme Restaurant \\\n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 0 0 0 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 0 \n",
"\n",
" Thrift / Vintage Store Tibetan Restaurant Toy / Game Store Track Trail \\\n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 0 0 0 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 0 \n",
"\n",
" Train Station Turkish Restaurant Vegetarian / Vegan Restaurant \\\n",
"0 0 0 0 \n",
"1 0 0 0 \n",
"2 0 0 0 \n",
"3 0 0 0 \n",
"4 0 0 0 \n",
"\n",
" Video Game Store Video Store Vietnamese Restaurant Warehouse Store \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" Wine Bar Wine Shop Wings Joint Women's Store Yoga Studio \n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 0 0 0 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 0 "
]
},
"execution_count": 79,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# one hot encoding\n",
"toronto_onehot = pd.get_dummies(toronto_venues[['Venue Category']], prefix=\"\", prefix_sep=\"\")\n",
"\n",
"# add neighborhood column back to dataframe\n",
"toronto_onehot['Borough'] = toronto_venues['Borough'] \n",
"\n",
"# move neighborhood column to the first column\n",
"fixed_columns = [toronto_onehot.columns[-1]] + list(toronto_onehot.columns[:-1])\n",
"toronto_onehot = toronto_onehot[fixed_columns]\n",
"\n",
"toronto_onehot.head()"
]
},
{
"cell_type": "code",
"execution_count": 80,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(3344, 314)"
]
},
"execution_count": 80,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"toronto_onehot.shape"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Next, let's group rows by neighborhood and by taking the mean of the frequency of occurrence of each category"
]
},
{
"cell_type": "code",
"execution_count": 81,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Borough</th>\n",
" <th>Accessories Store</th>\n",
" <th>Adult Boutique</th>\n",
" <th>Afghan Restaurant</th>\n",
" <th>African Restaurant</th>\n",
" <th>Airport</th>\n",
" <th>Airport Lounge</th>\n",
" <th>American Restaurant</th>\n",
" <th>Amphitheater</th>\n",
" <th>Animal Shelter</th>\n",
" <th>Antique Shop</th>\n",
" <th>Aquarium</th>\n",
" <th>Art Gallery</th>\n",
" <th>Art Museum</th>\n",
" <th>Arts &amp; Crafts Store</th>\n",
" <th>Asian Restaurant</th>\n",
" <th>Athletics &amp; Sports</th>\n",
" <th>Auto Dealership</th>\n",
" <th>Auto Garage</th>\n",
" <th>Automotive Shop</th>\n",
" <th>BBQ Joint</th>\n",
" <th>Baby Store</th>\n",
" <th>Badminton Court</th>\n",
" <th>Bagel Shop</th>\n",
" <th>Bakery</th>\n",
" <th>Bank</th>\n",
" <th>Bar</th>\n",
" <th>Baseball Field</th>\n",
" <th>Baseball Stadium</th>\n",
" <th>Basketball Court</th>\n",
" <th>Basketball Stadium</th>\n",
" <th>Beach</th>\n",
" <th>Beach Bar</th>\n",
" <th>Beer Bar</th>\n",
" <th>Beer Store</th>\n",
" <th>Belgian Restaurant</th>\n",
" <th>Bike Shop</th>\n",
" <th>Bistro</th>\n",
" <th>Bookstore</th>\n",
" <th>Boutique</th>\n",
" <th>Bowling Alley</th>\n",
" <th>Brazilian Restaurant</th>\n",
" <th>Breakfast Spot</th>\n",
" <th>Brewery</th>\n",
" <th>Bridal Shop</th>\n",
" <th>Bridge</th>\n",
" <th>Bubble Tea Shop</th>\n",
" <th>Burger Joint</th>\n",
" <th>Burrito Place</th>\n",
" <th>Bus Line</th>\n",
" <th>Bus Station</th>\n",
" <th>Bus Stop</th>\n",
" <th>Business Service</th>\n",
" <th>Butcher</th>\n",
" <th>Cafeteria</th>\n",
" <th>Café</th>\n",
" <th>Cajun / Creole Restaurant</th>\n",
" <th>Candy Store</th>\n",
" <th>Cantonese Restaurant</th>\n",
" <th>Caribbean Restaurant</th>\n",
" <th>Castle</th>\n",
" <th>Cemetery</th>\n",
" <th>Check Cashing Service</th>\n",
" <th>Cheese Shop</th>\n",
" <th>Chinese Restaurant</th>\n",
" <th>Chiropractor</th>\n",
" <th>Chocolate Shop</th>\n",
" <th>Church</th>\n",
" <th>Churrascaria</th>\n",
" <th>Climbing Gym</th>\n",
" <th>Clothing Store</th>\n",
" <th>Cocktail Bar</th>\n",
" <th>Coffee Shop</th>\n",
" <th>College Gym</th>\n",
" <th>College Quad</th>\n",
" <th>College Rec Center</th>\n",
" <th>College Stadium</th>\n",
" <th>Comedy Club</th>\n",
" <th>Comfort Food Restaurant</th>\n",
" <th>Comic Shop</th>\n",
" <th>Community Center</th>\n",
" <th>Concert Hall</th>\n",
" <th>Construction &amp; Landscaping</th>\n",
" <th>Convenience Store</th>\n",
" <th>Cosmetics Shop</th>\n",
" <th>Coworking Space</th>\n",
" <th>Creperie</th>\n",
" <th>Cuban Restaurant</th>\n",
" <th>Cupcake Shop</th>\n",
" <th>Curling Ice</th>\n",
" <th>Dance Studio</th>\n",
" <th>Deli / Bodega</th>\n",
" <th>Department Store</th>\n",
" <th>Design Studio</th>\n",
" <th>Dessert Shop</th>\n",
" <th>Dim Sum Restaurant</th>\n",
" <th>Diner</th>\n",
" <th>Discount Store</th>\n",
" <th>Dive Bar</th>\n",
" <th>Dog Run</th>\n",
" <th>Doner Restaurant</th>\n",
" <th>Donut Shop</th>\n",
" <th>Dumpling Restaurant</th>\n",
" <th>Eastern European Restaurant</th>\n",
" <th>Electronics Store</th>\n",
" <th>Elementary School</th>\n",
" <th>Empanada Restaurant</th>\n",
" <th>Ethiopian Restaurant</th>\n",
" <th>Event Space</th>\n",
" <th>Falafel Restaurant</th>\n",
" <th>Farm</th>\n",
" <th>Farmers Market</th>\n",
" <th>Fast Food Restaurant</th>\n",
" <th>Field</th>\n",
" <th>Filipino Restaurant</th>\n",
" <th>Fireworks Store</th>\n",
" <th>Fish &amp; Chips Shop</th>\n",
" <th>Fish Market</th>\n",
" <th>Flea Market</th>\n",
" <th>Flower Shop</th>\n",
" <th>Food</th>\n",
" <th>Food &amp; Drink Shop</th>\n",
" <th>Food Court</th>\n",
" <th>Food Truck</th>\n",
" <th>Fountain</th>\n",
" <th>Frame Store</th>\n",
" <th>French Restaurant</th>\n",
" <th>Fried Chicken Joint</th>\n",
" <th>Frozen Yogurt Shop</th>\n",
" <th>Fruit &amp; Vegetable Store</th>\n",
" <th>Furniture / Home Store</th>\n",
" <th>Gaming Cafe</th>\n",
" <th>Garden</th>\n",
" <th>Garden Center</th>\n",
" <th>Gas Station</th>\n",
" <th>Gastropub</th>\n",
" <th>Gay Bar</th>\n",
" <th>General Entertainment</th>\n",
" <th>German Restaurant</th>\n",
" <th>Gift Shop</th>\n",
" <th>Golf Course</th>\n",
" <th>Golf Driving Range</th>\n",
" <th>Gourmet Shop</th>\n",
" <th>Greek Restaurant</th>\n",
" <th>Grocery Store</th>\n",
" <th>Gym</th>\n",
" <th>Gym / Fitness Center</th>\n",
" <th>Gym Pool</th>\n",
" <th>Hakka Restaurant</th>\n",
" <th>Harbor / Marina</th>\n",
" <th>Hardware Store</th>\n",
" <th>Hawaiian Restaurant</th>\n",
" <th>Health Food Store</th>\n",
" <th>Historic Site</th>\n",
" <th>History Museum</th>\n",
" <th>Hobby Shop</th>\n",
" <th>Hockey Arena</th>\n",
" <th>Home Service</th>\n",
" <th>Hong Kong Restaurant</th>\n",
" <th>Hookah Bar</th>\n",
" <th>Hostel</th>\n",
" <th>Hot Dog Joint</th>\n",
" <th>Hotel</th>\n",
" <th>Hotpot Restaurant</th>\n",
" <th>Housing Development</th>\n",
" <th>Ice Cream Shop</th>\n",
" <th>Indian Chinese Restaurant</th>\n",
" <th>Indian Restaurant</th>\n",
" <th>Indie Movie Theater</th>\n",
" <th>Indie Theater</th>\n",
" <th>Indonesian Restaurant</th>\n",
" <th>Intersection</th>\n",
" <th>Italian Restaurant</th>\n",
" <th>Japanese Restaurant</th>\n",
" <th>Jazz Club</th>\n",
" <th>Jewelry Store</th>\n",
" <th>Jewish Restaurant</th>\n",
" <th>Juice Bar</th>\n",
" <th>Kitchen Supply Store</th>\n",
" <th>Korean Restaurant</th>\n",
" <th>Lake</th>\n",
" <th>Latin American Restaurant</th>\n",
" <th>Laundromat</th>\n",
" <th>Laundry Service</th>\n",
" <th>Light Rail Station</th>\n",
" <th>Liquor Store</th>\n",
" <th>Lounge</th>\n",
" <th>Mac &amp; Cheese Joint</th>\n",
" <th>Malay Restaurant</th>\n",
" <th>Market</th>\n",
" <th>Martial Arts Dojo</th>\n",
" <th>Massage Studio</th>\n",
" <th>Mediterranean Restaurant</th>\n",
" <th>Men's Store</th>\n",
" <th>Metro Station</th>\n",
" <th>Mexican Restaurant</th>\n",
" <th>Middle Eastern Restaurant</th>\n",
" <th>Miscellaneous Shop</th>\n",
" <th>Mobile Phone Shop</th>\n",
" <th>Modern European Restaurant</th>\n",
" <th>Monument / Landmark</th>\n",
" <th>Moroccan Restaurant</th>\n",
" <th>Motorcycle Shop</th>\n",
" <th>Movie Theater</th>\n",
" <th>Museum</th>\n",
" <th>Music School</th>\n",
" <th>Music Store</th>\n",
" <th>Music Venue</th>\n",
" <th>Nail Salon</th>\n",
" <th>Neighborhood</th>\n",
" <th>New American Restaurant</th>\n",
" <th>Nightclub</th>\n",
" <th>Noodle House</th>\n",
" <th>Office</th>\n",
" <th>Opera House</th>\n",
" <th>Optical Shop</th>\n",
" <th>Organic Grocery</th>\n",
" <th>Other Great Outdoors</th>\n",
" <th>Other Repair Shop</th>\n",
" <th>Pakistani Restaurant</th>\n",
" <th>Paper / Office Supplies Store</th>\n",
" <th>Park</th>\n",
" <th>Pastry Shop</th>\n",
" <th>Performing Arts Venue</th>\n",
" <th>Persian Restaurant</th>\n",
" <th>Pet Store</th>\n",
" <th>Pharmacy</th>\n",
" <th>Photography Lab</th>\n",
" <th>Pie Shop</th>\n",
" <th>Pilates Studio</th>\n",
" <th>Pizza Place</th>\n",
" <th>Playground</th>\n",
" <th>Plaza</th>\n",
" <th>Poke Place</th>\n",
" <th>Pool</th>\n",
" <th>Pool Hall</th>\n",
" <th>Portuguese Restaurant</th>\n",
" <th>Poutine Place</th>\n",
" <th>Pub</th>\n",
" <th>Ramen Restaurant</th>\n",
" <th>Record Shop</th>\n",
" <th>Recreation Center</th>\n",
" <th>Rental Car Location</th>\n",
" <th>Residential Building (Apartment / Condo)</th>\n",
" <th>Restaurant</th>\n",
" <th>River</th>\n",
" <th>Road</th>\n",
" <th>Rock Climbing Spot</th>\n",
" <th>Rock Club</th>\n",
" <th>Salad Place</th>\n",
" <th>Salon / Barbershop</th>\n",
" <th>Sandwich Place</th>\n",
" <th>Scenic Lookout</th>\n",
" <th>School</th>\n",
" <th>Sculpture Garden</th>\n",
" <th>Seafood Restaurant</th>\n",
" <th>Shanghai Restaurant</th>\n",
" <th>Shoe Store</th>\n",
" <th>Shop &amp; Service</th>\n",
" <th>Shopping Mall</th>\n",
" <th>Skate Park</th>\n",
" <th>Skating Rink</th>\n",
" <th>Ski Area</th>\n",
" <th>Ski Chalet</th>\n",
" <th>Smoke Shop</th>\n",
" <th>Smoothie Shop</th>\n",
" <th>Snack Place</th>\n",
" <th>Soccer Field</th>\n",
" <th>Soccer Stadium</th>\n",
" <th>Social Club</th>\n",
" <th>Soup Place</th>\n",
" <th>South American Restaurant</th>\n",
" <th>Spa</th>\n",
" <th>Spanish Restaurant</th>\n",
" <th>Speakeasy</th>\n",
" <th>Sporting Goods Shop</th>\n",
" <th>Sports Bar</th>\n",
" <th>Sports Club</th>\n",
" <th>Sri Lankan Restaurant</th>\n",
" <th>Stadium</th>\n",
" <th>Stationery Store</th>\n",
" <th>Steakhouse</th>\n",
" <th>Storage Facility</th>\n",
" <th>Supermarket</th>\n",
" <th>Supplement Shop</th>\n",
" <th>Sushi Restaurant</th>\n",
" <th>Taco Place</th>\n",
" <th>Tailor Shop</th>\n",
" <th>Taiwanese Restaurant</th>\n",
" <th>Tanning Salon</th>\n",
" <th>Tapas Restaurant</th>\n",
" <th>Tea Room</th>\n",
" <th>Tech Startup</th>\n",
" <th>Tennis Court</th>\n",
" <th>Thai Restaurant</th>\n",
" <th>Theater</th>\n",
" <th>Theme Restaurant</th>\n",
" <th>Thrift / Vintage Store</th>\n",
" <th>Tibetan Restaurant</th>\n",
" <th>Toy / Game Store</th>\n",
" <th>Track</th>\n",
" <th>Trail</th>\n",
" <th>Train Station</th>\n",
" <th>Turkish Restaurant</th>\n",
" <th>Vegetarian / Vegan Restaurant</th>\n",
" <th>Video Game Store</th>\n",
" <th>Video Store</th>\n",
" <th>Vietnamese Restaurant</th>\n",
" <th>Warehouse Store</th>\n",
" <th>Wine Bar</th>\n",
" <th>Wine Shop</th>\n",
" <th>Wings Joint</th>\n",
" <th>Women's Store</th>\n",
" <th>Yoga Studio</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Central Toronto</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.008197</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.002732</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.002732</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.005464</td>\n",
" <td>0.021858</td>\n",
" <td>0.016393</td>\n",
" <td>0.000000</td>\n",
" <td>0.002732</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.016393</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.008197</td>\n",
" <td>0.005464</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.016393</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.057377</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.005464</td>\n",
" <td>0.000000</td>\n",
" <td>0.002732</td>\n",
" <td>0.002732</td>\n",
" <td>0.000000</td>\n",
" <td>0.002732</td>\n",
" <td>0.000000</td>\n",
" <td>0.005464</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.005464</td>\n",
" <td>0.000000</td>\n",
" <td>0.002732</td>\n",
" <td>0.000000</td>\n",
" <td>0.073770</td>\n",
" <td>0.002732</td>\n",
" <td>0.002732</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.002732</td>\n",
" <td>0.000000</td>\n",
" <td>0.002732</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.016393</td>\n",
" <td>0.000000</td>\n",
" <td>0.002732</td>\n",
" <td>0.013661</td>\n",
" <td>0.000000</td>\n",
" <td>0.010929</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.002732</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.002732</td>\n",
" <td>0.005464</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.005464</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.002732</td>\n",
" <td>0.000000</td>\n",
" <td>0.005464</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.005464</td>\n",
" <td>0.002732</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.002732</td>\n",
" <td>0.000000</td>\n",
" <td>0.005464</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.010929</td>\n",
" <td>0.000000</td>\n",
" <td>0.002732</td>\n",
" <td>0.005464</td>\n",
" <td>0.002732</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.002732</td>\n",
" <td>0.019126</td>\n",
" <td>0.027322</td>\n",
" <td>0.013661</td>\n",
" <td>0.005464</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.002732</td>\n",
" <td>0.002732</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.002732</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.010929</td>\n",
" <td>0.000000</td>\n",
" <td>0.013661</td>\n",
" <td>0.002732</td>\n",
" <td>0.000000</td>\n",
" <td>0.002732</td>\n",
" <td>0.000000</td>\n",
" <td>0.071038</td>\n",
" <td>0.019126</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.005464</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.002732</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.005464</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.010929</td>\n",
" <td>0.005464</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.005464</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.005464</td>\n",
" <td>0.002732</td>\n",
" <td>0.002732</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.002732</td>\n",
" <td>0.000000</td>\n",
" <td>0.00</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.043716</td>\n",
" <td>0.002732</td>\n",
" <td>0.000000</td>\n",
" <td>0.002732</td>\n",
" <td>0.000000</td>\n",
" <td>0.013661</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.002732</td>\n",
" <td>0.030055</td>\n",
" <td>0.000000</td>\n",
" <td>0.005464</td>\n",
" <td>0.000000</td>\n",
" <td>0.005464</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.013661</td>\n",
" <td>0.005464</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.019126</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.002732</td>\n",
" <td>0.002732</td>\n",
" <td>0.016393</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.002732</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.010929</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.010929</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.008197</td>\n",
" <td>0.002732</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.002732</td>\n",
" <td>0.000000</td>\n",
" <td>0.008197</td>\n",
" <td>0.000000</td>\n",
" <td>0.043716</td>\n",
" <td>0.005464</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.005464</td>\n",
" <td>0.013661</td>\n",
" <td>0.000000</td>\n",
" <td>0.002732</td>\n",
" <td>0.019126</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.005464</td>\n",
" <td>0.008197</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.019126</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.008197</td>\n",
" <td>0.000000</td>\n",
" <td>0.008197</td>\n",
" <td>0.000000</td>\n",
" <td>0.002732</td>\n",
" <td>0.000000</td>\n",
" <td>0.016393</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>Downtown Toronto</td>\n",
" <td>0.000000</td>\n",
" <td>0.001211</td>\n",
" <td>0.001211</td>\n",
" <td>0.000000</td>\n",
" <td>0.001211</td>\n",
" <td>0.001211</td>\n",
" <td>0.018160</td>\n",
" <td>0.000000</td>\n",
" <td>0.001211</td>\n",
" <td>0.000000</td>\n",
" <td>0.003632</td>\n",
" <td>0.012107</td>\n",
" <td>0.001211</td>\n",
" <td>0.003632</td>\n",
" <td>0.004843</td>\n",
" <td>0.001211</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.002421</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.001211</td>\n",
" <td>0.024213</td>\n",
" <td>0.002421</td>\n",
" <td>0.012107</td>\n",
" <td>0.000000</td>\n",
" <td>0.002421</td>\n",
" <td>0.000000</td>\n",
" <td>0.004843</td>\n",
" <td>0.001211</td>\n",
" <td>0.000000</td>\n",
" <td>0.014528</td>\n",
" <td>0.000000</td>\n",
" <td>0.002421</td>\n",
" <td>0.000000</td>\n",
" <td>0.003632</td>\n",
" <td>0.006053</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.001211</td>\n",
" <td>0.009685</td>\n",
" <td>0.002421</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.007264</td>\n",
" <td>0.006053</td>\n",
" <td>0.003632</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.072639</td>\n",
" <td>0.000000</td>\n",
" <td>0.001211</td>\n",
" <td>0.000000</td>\n",
" <td>0.003632</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.002421</td>\n",
" <td>0.004843</td>\n",
" <td>0.000000</td>\n",
" <td>0.001211</td>\n",
" <td>0.002421</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.004843</td>\n",
" <td>0.013317</td>\n",
" <td>0.078692</td>\n",
" <td>0.001211</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.002421</td>\n",
" <td>0.003632</td>\n",
" <td>0.002421</td>\n",
" <td>0.000000</td>\n",
" <td>0.012107</td>\n",
" <td>0.000000</td>\n",
" <td>0.001211</td>\n",
" <td>0.006053</td>\n",
" <td>0.000000</td>\n",
" <td>0.006053</td>\n",
" <td>0.000000</td>\n",
" <td>0.001211</td>\n",
" <td>0.000000</td>\n",
" <td>0.006053</td>\n",
" <td>0.012107</td>\n",
" <td>0.004843</td>\n",
" <td>0.001211</td>\n",
" <td>0.004843</td>\n",
" <td>0.000000</td>\n",
" <td>0.007264</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.001211</td>\n",
" <td>0.002421</td>\n",
" <td>0.000000</td>\n",
" <td>0.002421</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.002421</td>\n",
" <td>0.002421</td>\n",
" <td>0.000000</td>\n",
" <td>0.001211</td>\n",
" <td>0.009685</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.002421</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.001211</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.003632</td>\n",
" <td>0.004843</td>\n",
" <td>0.001211</td>\n",
" <td>0.000000</td>\n",
" <td>0.006053</td>\n",
" <td>0.002421</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.002421</td>\n",
" <td>0.002421</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.026634</td>\n",
" <td>0.002421</td>\n",
" <td>0.002421</td>\n",
" <td>0.000000</td>\n",
" <td>0.003632</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.001211</td>\n",
" <td>0.006053</td>\n",
" <td>0.008475</td>\n",
" <td>0.013317</td>\n",
" <td>0.006053</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.002421</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.001211</td>\n",
" <td>0.002421</td>\n",
" <td>0.001211</td>\n",
" <td>0.001211</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.003632</td>\n",
" <td>0.000000</td>\n",
" <td>0.027845</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.007264</td>\n",
" <td>0.000000</td>\n",
" <td>0.003632</td>\n",
" <td>0.001211</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.021792</td>\n",
" <td>0.021792</td>\n",
" <td>0.004843</td>\n",
" <td>0.001211</td>\n",
" <td>0.000000</td>\n",
" <td>0.001211</td>\n",
" <td>0.000000</td>\n",
" <td>0.006053</td>\n",
" <td>0.001211</td>\n",
" <td>0.002421</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.003632</td>\n",
" <td>0.003632</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.001211</td>\n",
" <td>0.000000</td>\n",
" <td>0.003632</td>\n",
" <td>0.002421</td>\n",
" <td>0.001211</td>\n",
" <td>0.010896</td>\n",
" <td>0.002421</td>\n",
" <td>0.002421</td>\n",
" <td>0.000000</td>\n",
" <td>0.002421</td>\n",
" <td>0.003632</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.001211</td>\n",
" <td>0.008475</td>\n",
" <td>0.001211</td>\n",
" <td>0.001211</td>\n",
" <td>0.001211</td>\n",
" <td>0.000000</td>\n",
" <td>0.003632</td>\n",
" <td>0.006053</td>\n",
" <td>0.00</td>\n",
" <td>0.003632</td>\n",
" <td>0.002421</td>\n",
" <td>0.001211</td>\n",
" <td>0.000000</td>\n",
" <td>0.001211</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.024213</td>\n",
" <td>0.001211</td>\n",
" <td>0.004843</td>\n",
" <td>0.000000</td>\n",
" <td>0.001211</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.002421</td>\n",
" <td>0.000000</td>\n",
" <td>0.015738</td>\n",
" <td>0.002421</td>\n",
" <td>0.007264</td>\n",
" <td>0.001211</td>\n",
" <td>0.002421</td>\n",
" <td>0.000000</td>\n",
" <td>0.001211</td>\n",
" <td>0.000000</td>\n",
" <td>0.014528</td>\n",
" <td>0.006053</td>\n",
" <td>0.001211</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.030266</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.001211</td>\n",
" <td>0.002421</td>\n",
" <td>0.001211</td>\n",
" <td>0.006053</td>\n",
" <td>0.002421</td>\n",
" <td>0.001211</td>\n",
" <td>0.001211</td>\n",
" <td>0.013317</td>\n",
" <td>0.000000</td>\n",
" <td>0.001211</td>\n",
" <td>0.000000</td>\n",
" <td>0.001211</td>\n",
" <td>0.000000</td>\n",
" <td>0.001211</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.002421</td>\n",
" <td>0.002421</td>\n",
" <td>0.001211</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.001211</td>\n",
" <td>0.006053</td>\n",
" <td>0.001211</td>\n",
" <td>0.003632</td>\n",
" <td>0.004843</td>\n",
" <td>0.002421</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.018160</td>\n",
" <td>0.000000</td>\n",
" <td>0.004843</td>\n",
" <td>0.000000</td>\n",
" <td>0.004843</td>\n",
" <td>0.001211</td>\n",
" <td>0.002421</td>\n",
" <td>0.001211</td>\n",
" <td>0.000000</td>\n",
" <td>0.001211</td>\n",
" <td>0.010896</td>\n",
" <td>0.001211</td>\n",
" <td>0.000000</td>\n",
" <td>0.014528</td>\n",
" <td>0.012107</td>\n",
" <td>0.001211</td>\n",
" <td>0.001211</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.001211</td>\n",
" <td>0.001211</td>\n",
" <td>0.004843</td>\n",
" <td>0.000000</td>\n",
" <td>0.014528</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.003632</td>\n",
" <td>0.000000</td>\n",
" <td>0.003632</td>\n",
" <td>0.000000</td>\n",
" <td>0.001211</td>\n",
" <td>0.000000</td>\n",
" <td>0.003632</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>East Toronto</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.016129</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.004032</td>\n",
" <td>0.008065</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.012097</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.004032</td>\n",
" <td>0.040323</td>\n",
" <td>0.000000</td>\n",
" <td>0.024194</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.024194</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.004032</td>\n",
" <td>0.012097</td>\n",
" <td>0.004032</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.016129</td>\n",
" <td>0.024194</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.004032</td>\n",
" <td>0.016129</td>\n",
" <td>0.012097</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.004032</td>\n",
" <td>0.000000</td>\n",
" <td>0.028226</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.012097</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.004032</td>\n",
" <td>0.004032</td>\n",
" <td>0.000000</td>\n",
" <td>0.004032</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.004032</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.064516</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.004032</td>\n",
" <td>0.008065</td>\n",
" <td>0.000000</td>\n",
" <td>0.004032</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.004032</td>\n",
" <td>0.004032</td>\n",
" <td>0.000000</td>\n",
" <td>0.004032</td>\n",
" <td>0.004032</td>\n",
" <td>0.004032</td>\n",
" <td>0.004032</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.004032</td>\n",
" <td>0.000000</td>\n",
" <td>0.016129</td>\n",
" <td>0.000000</td>\n",
" <td>0.004032</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.004032</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.008065</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.008065</td>\n",
" <td>0.008065</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.008065</td>\n",
" <td>0.004032</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.012097</td>\n",
" <td>0.004032</td>\n",
" <td>0.000000</td>\n",
" <td>0.004032</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.004032</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.040323</td>\n",
" <td>0.016129</td>\n",
" <td>0.012097</td>\n",
" <td>0.004032</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.004032</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.004032</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.004032</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.024194</td>\n",
" <td>0.004032</td>\n",
" <td>0.024194</td>\n",
" <td>0.004032</td>\n",
" <td>0.004032</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.032258</td>\n",
" <td>0.012097</td>\n",
" <td>0.004032</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.008065</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.004032</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.012097</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.004032</td>\n",
" <td>0.008065</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.004032</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.004032</td>\n",
" <td>0.004032</td>\n",
" <td>0.004032</td>\n",
" <td>0.00</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.004032</td>\n",
" <td>0.000000</td>\n",
" <td>0.036290</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.012097</td>\n",
" <td>0.004032</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.024194</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.040323</td>\n",
" <td>0.008065</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.016129</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.004032</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.016129</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.004032</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.008065</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.008065</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.004032</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.004032</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.004032</td>\n",
" <td>0.008065</td>\n",
" <td>0.000000</td>\n",
" <td>0.004032</td>\n",
" <td>0.000000</td>\n",
" <td>0.016129</td>\n",
" <td>0.004032</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.004032</td>\n",
" <td>0.008065</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.008065</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.004032</td>\n",
" <td>0.000000</td>\n",
" <td>0.004032</td>\n",
" <td>0.000000</td>\n",
" <td>0.004032</td>\n",
" <td>0.004032</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.004032</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.004032</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>East York</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.010363</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.010363</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.010363</td>\n",
" <td>0.015544</td>\n",
" <td>0.005181</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.015544</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.005181</td>\n",
" <td>0.015544</td>\n",
" <td>0.020725</td>\n",
" <td>0.005181</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.010363</td>\n",
" <td>0.015544</td>\n",
" <td>0.000000</td>\n",
" <td>0.005181</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.010363</td>\n",
" <td>0.031088</td>\n",
" <td>0.000000</td>\n",
" <td>0.005181</td>\n",
" <td>0.000000</td>\n",
" <td>0.025907</td>\n",
" <td>0.000000</td>\n",
" <td>0.005181</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.005181</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.036269</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.005181</td>\n",
" <td>0.000000</td>\n",
" <td>0.088083</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.005181</td>\n",
" <td>0.005181</td>\n",
" <td>0.010363</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.010363</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.005181</td>\n",
" <td>0.000000</td>\n",
" <td>0.015544</td>\n",
" <td>0.005181</td>\n",
" <td>0.005181</td>\n",
" <td>0.005181</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.005181</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.005181</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.010363</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.010363</td>\n",
" <td>0.015544</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.005181</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.005181</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.010363</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.015544</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.005181</td>\n",
" <td>0.025907</td>\n",
" <td>0.020725</td>\n",
" <td>0.010363</td>\n",
" <td>0.005181</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.005181</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.005181</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.005181</td>\n",
" <td>0.000000</td>\n",
" <td>0.020725</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.010363</td>\n",
" <td>0.005181</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.015544</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.005181</td>\n",
" <td>0.005181</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.005181</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.00</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.005181</td>\n",
" <td>0.020725</td>\n",
" <td>0.005181</td>\n",
" <td>0.005181</td>\n",
" <td>0.000000</td>\n",
" <td>0.015544</td>\n",
" <td>0.020725</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.036269</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.010363</td>\n",
" <td>0.000000</td>\n",
" <td>0.010363</td>\n",
" <td>0.005181</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.005181</td>\n",
" <td>0.000000</td>\n",
" <td>0.020725</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.005181</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.025907</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.015544</td>\n",
" <td>0.000000</td>\n",
" <td>0.020725</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.010363</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.005181</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.010363</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.015544</td>\n",
" <td>0.010363</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.015544</td>\n",
" <td>0.000000</td>\n",
" <td>0.005181</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.015544</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.010363</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.005181</td>\n",
" <td>0.000000</td>\n",
" <td>0.005181</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.005181</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>Etobicoke</td>\n",
" <td>0.000000</td>\n",
" <td>0.004167</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.020833</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.004167</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.004167</td>\n",
" <td>0.004167</td>\n",
" <td>0.008333</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.020833</td>\n",
" <td>0.029167</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.012500</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.012500</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.016667</td>\n",
" <td>0.012500</td>\n",
" <td>0.012500</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.020833</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.008333</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.054167</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.004167</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.004167</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.004167</td>\n",
" <td>0.016667</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.004167</td>\n",
" <td>0.000000</td>\n",
" <td>0.004167</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.012500</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.025000</td>\n",
" <td>0.000000</td>\n",
" <td>0.004167</td>\n",
" <td>0.000000</td>\n",
" <td>0.004167</td>\n",
" <td>0.000000</td>\n",
" <td>0.004167</td>\n",
" <td>0.000000</td>\n",
" <td>0.004167</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.004167</td>\n",
" <td>0.012500</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.008333</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.004167</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.008333</td>\n",
" <td>0.008333</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.004167</td>\n",
" <td>0.004167</td>\n",
" <td>0.004167</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.008333</td>\n",
" <td>0.004167</td>\n",
" <td>0.004167</td>\n",
" <td>0.004167</td>\n",
" <td>0.041667</td>\n",
" <td>0.008333</td>\n",
" <td>0.016667</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.004167</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.004167</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.008333</td>\n",
" <td>0.000000</td>\n",
" <td>0.008333</td>\n",
" <td>0.004167</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.012500</td>\n",
" <td>0.025000</td>\n",
" <td>0.004167</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.004167</td>\n",
" <td>0.000000</td>\n",
" <td>0.025000</td>\n",
" <td>0.004167</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.012500</td>\n",
" <td>0.008333</td>\n",
" <td>0.000000</td>\n",
" <td>0.008333</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.004167</td>\n",
" <td>0.000000</td>\n",
" <td>0.004167</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.00</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.066667</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.004167</td>\n",
" <td>0.045833</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.058333</td>\n",
" <td>0.004167</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.004167</td>\n",
" <td>0.004167</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.016667</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.016667</td>\n",
" <td>0.004167</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.029167</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.004167</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.012500</td>\n",
" <td>0.000000</td>\n",
" <td>0.016667</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.004167</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.004167</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.008333</td>\n",
" <td>0.008333</td>\n",
" <td>0.016667</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.004167</td>\n",
" <td>0.004167</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.008333</td>\n",
" <td>0.004167</td>\n",
" <td>0.000000</td>\n",
" <td>0.004167</td>\n",
" <td>0.000000</td>\n",
" <td>0.004167</td>\n",
" <td>0.000000</td>\n",
" <td>0.004167</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.004167</td>\n",
" <td>0.000000</td>\n",
" <td>0.008333</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>Mississauga</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.020000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.040000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.020000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.020000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.020000</td>\n",
" <td>0.000000</td>\n",
" <td>0.020000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.020000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.060000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.100000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.020000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.020000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.020000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.020000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.020000</td>\n",
" <td>0.000000</td>\n",
" <td>0.020000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.040000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.020000</td>\n",
" <td>0.020000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.020000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.020000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.060000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.020000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.020000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.020000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.040000</td>\n",
" <td>0.060000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.02</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.020000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.020000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.040000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.020000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.020000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.020000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.040000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.020000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>North York</td>\n",
" <td>0.003571</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.001786</td>\n",
" <td>0.000000</td>\n",
" <td>0.010714</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.001786</td>\n",
" <td>0.007143</td>\n",
" <td>0.010714</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.001786</td>\n",
" <td>0.000000</td>\n",
" <td>0.001786</td>\n",
" <td>0.016071</td>\n",
" <td>0.025000</td>\n",
" <td>0.005357</td>\n",
" <td>0.003571</td>\n",
" <td>0.000000</td>\n",
" <td>0.001786</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.007143</td>\n",
" <td>0.000000</td>\n",
" <td>0.001786</td>\n",
" <td>0.000000</td>\n",
" <td>0.001786</td>\n",
" <td>0.003571</td>\n",
" <td>0.003571</td>\n",
" <td>0.000000</td>\n",
" <td>0.001786</td>\n",
" <td>0.000000</td>\n",
" <td>0.003571</td>\n",
" <td>0.000000</td>\n",
" <td>0.001786</td>\n",
" <td>0.008929</td>\n",
" <td>0.001786</td>\n",
" <td>0.007143</td>\n",
" <td>0.000000</td>\n",
" <td>0.003571</td>\n",
" <td>0.001786</td>\n",
" <td>0.001786</td>\n",
" <td>0.001786</td>\n",
" <td>0.021429</td>\n",
" <td>0.000000</td>\n",
" <td>0.001786</td>\n",
" <td>0.000000</td>\n",
" <td>0.007143</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.001786</td>\n",
" <td>0.012500</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.019643</td>\n",
" <td>0.000000</td>\n",
" <td>0.075000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.001786</td>\n",
" <td>0.000000</td>\n",
" <td>0.001786</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.016071</td>\n",
" <td>0.003571</td>\n",
" <td>0.000000</td>\n",
" <td>0.001786</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.003571</td>\n",
" <td>0.001786</td>\n",
" <td>0.000000</td>\n",
" <td>0.005357</td>\n",
" <td>0.003571</td>\n",
" <td>0.005357</td>\n",
" <td>0.008929</td>\n",
" <td>0.000000</td>\n",
" <td>0.003571</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.001786</td>\n",
" <td>0.007143</td>\n",
" <td>0.000000</td>\n",
" <td>0.001786</td>\n",
" <td>0.000000</td>\n",
" <td>0.001786</td>\n",
" <td>0.001786</td>\n",
" <td>0.000000</td>\n",
" <td>0.001786</td>\n",
" <td>0.041071</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.001786</td>\n",
" <td>0.001786</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.001786</td>\n",
" <td>0.001786</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.001786</td>\n",
" <td>0.001786</td>\n",
" <td>0.014286</td>\n",
" <td>0.001786</td>\n",
" <td>0.000000</td>\n",
" <td>0.010714</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.001786</td>\n",
" <td>0.000000</td>\n",
" <td>0.001786</td>\n",
" <td>0.005357</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.005357</td>\n",
" <td>0.030357</td>\n",
" <td>0.010714</td>\n",
" <td>0.008929</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.003571</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.001786</td>\n",
" <td>0.000000</td>\n",
" <td>0.001786</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.001786</td>\n",
" <td>0.000000</td>\n",
" <td>0.001786</td>\n",
" <td>0.010714</td>\n",
" <td>0.000000</td>\n",
" <td>0.001786</td>\n",
" <td>0.007143</td>\n",
" <td>0.000000</td>\n",
" <td>0.003571</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.001786</td>\n",
" <td>0.007143</td>\n",
" <td>0.012500</td>\n",
" <td>0.028571</td>\n",
" <td>0.000000</td>\n",
" <td>0.001786</td>\n",
" <td>0.000000</td>\n",
" <td>0.003571</td>\n",
" <td>0.001786</td>\n",
" <td>0.017857</td>\n",
" <td>0.000000</td>\n",
" <td>0.003571</td>\n",
" <td>0.000000</td>\n",
" <td>0.001786</td>\n",
" <td>0.000000</td>\n",
" <td>0.007143</td>\n",
" <td>0.003571</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.001786</td>\n",
" <td>0.003571</td>\n",
" <td>0.001786</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.008929</td>\n",
" <td>0.003571</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.003571</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.00</td>\n",
" <td>0.000000</td>\n",
" <td>0.001786</td>\n",
" <td>0.000000</td>\n",
" <td>0.001786</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.001786</td>\n",
" <td>0.000000</td>\n",
" <td>0.001786</td>\n",
" <td>0.041071</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.008929</td>\n",
" <td>0.023214</td>\n",
" <td>0.001786</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.039286</td>\n",
" <td>0.005357</td>\n",
" <td>0.001786</td>\n",
" <td>0.000000</td>\n",
" <td>0.005357</td>\n",
" <td>0.000000</td>\n",
" <td>0.001786</td>\n",
" <td>0.000000</td>\n",
" <td>0.003571</td>\n",
" <td>0.010714</td>\n",
" <td>0.000000</td>\n",
" <td>0.001786</td>\n",
" <td>0.003571</td>\n",
" <td>0.001786</td>\n",
" <td>0.028571</td>\n",
" <td>0.000000</td>\n",
" <td>0.003571</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.001786</td>\n",
" <td>0.001786</td>\n",
" <td>0.025000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.003571</td>\n",
" <td>0.000000</td>\n",
" <td>0.003571</td>\n",
" <td>0.001786</td>\n",
" <td>0.019643</td>\n",
" <td>0.001786</td>\n",
" <td>0.005357</td>\n",
" <td>0.001786</td>\n",
" <td>0.001786</td>\n",
" <td>0.000000</td>\n",
" <td>0.001786</td>\n",
" <td>0.001786</td>\n",
" <td>0.001786</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.003571</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.007143</td>\n",
" <td>0.003571</td>\n",
" <td>0.001786</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.001786</td>\n",
" <td>0.001786</td>\n",
" <td>0.010714</td>\n",
" <td>0.001786</td>\n",
" <td>0.010714</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.001786</td>\n",
" <td>0.000000</td>\n",
" <td>0.003571</td>\n",
" <td>0.003571</td>\n",
" <td>0.003571</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.001786</td>\n",
" <td>0.000000</td>\n",
" <td>0.003571</td>\n",
" <td>0.001786</td>\n",
" <td>0.003571</td>\n",
" <td>0.000000</td>\n",
" <td>0.001786</td>\n",
" <td>0.003571</td>\n",
" <td>0.014286</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.001786</td>\n",
" <td>0.001786</td>\n",
" <td>0.001786</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>Queen's Park</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.020000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.020000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.040000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.020000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.040000</td>\n",
" <td>0.020000</td>\n",
" <td>0.020000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.020000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.120000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.020000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.020000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.020000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.040000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.020000</td>\n",
" <td>0.000000</td>\n",
" <td>0.020000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.040000</td>\n",
" <td>0.000000</td>\n",
" <td>0.020000</td>\n",
" <td>0.000000</td>\n",
" <td>0.020000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.020000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.020000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.020000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.020000</td>\n",
" <td>0.020000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.020000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.020000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.020000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.02</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.040000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.040000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.020000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.020000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.020000</td>\n",
" <td>0.020000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.020000</td>\n",
" <td>0.000000</td>\n",
" <td>0.020000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.020000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.020000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.020000</td>\n",
" <td>0.000000</td>\n",
" <td>0.020000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>Scarborough</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.002632</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.010526</td>\n",
" <td>0.002632</td>\n",
" <td>0.000000</td>\n",
" <td>0.002632</td>\n",
" <td>0.005263</td>\n",
" <td>0.002632</td>\n",
" <td>0.000000</td>\n",
" <td>0.002632</td>\n",
" <td>0.000000</td>\n",
" <td>0.039474</td>\n",
" <td>0.021053</td>\n",
" <td>0.002632</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.005263</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.007895</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.005263</td>\n",
" <td>0.000000</td>\n",
" <td>0.010526</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.023684</td>\n",
" <td>0.000000</td>\n",
" <td>0.010526</td>\n",
" <td>0.007895</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.002632</td>\n",
" <td>0.002632</td>\n",
" <td>0.000000</td>\n",
" <td>0.005263</td>\n",
" <td>0.015789</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.065789</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.005263</td>\n",
" <td>0.000000</td>\n",
" <td>0.073684</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.002632</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.015789</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.002632</td>\n",
" <td>0.002632</td>\n",
" <td>0.000000</td>\n",
" <td>0.007895</td>\n",
" <td>0.000000</td>\n",
" <td>0.002632</td>\n",
" <td>0.015789</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.010526</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.002632</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.063158</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.002632</td>\n",
" <td>0.002632</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.002632</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.010526</td>\n",
" <td>0.000000</td>\n",
" <td>0.002632</td>\n",
" <td>0.010526</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.005263</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.002632</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.005263</td>\n",
" <td>0.028947</td>\n",
" <td>0.010526</td>\n",
" <td>0.002632</td>\n",
" <td>0.007895</td>\n",
" <td>0.002632</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.010526</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.005263</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.002632</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.018421</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.021053</td>\n",
" <td>0.007895</td>\n",
" <td>0.005263</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.007895</td>\n",
" <td>0.000000</td>\n",
" <td>0.002632</td>\n",
" <td>0.002632</td>\n",
" <td>0.000000</td>\n",
" <td>0.007895</td>\n",
" <td>0.002632</td>\n",
" <td>0.002632</td>\n",
" <td>0.000000</td>\n",
" <td>0.005263</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.002632</td>\n",
" <td>0.000000</td>\n",
" <td>0.005263</td>\n",
" <td>0.002632</td>\n",
" <td>0.007895</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.002632</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.002632</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.00</td>\n",
" <td>0.007895</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.002632</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.002632</td>\n",
" <td>0.036842</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.005263</td>\n",
" <td>0.031579</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.052632</td>\n",
" <td>0.002632</td>\n",
" <td>0.002632</td>\n",
" <td>0.000000</td>\n",
" <td>0.002632</td>\n",
" <td>0.002632</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.002632</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.007895</td>\n",
" <td>0.000000</td>\n",
" <td>0.013158</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.028947</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.007895</td>\n",
" <td>0.002632</td>\n",
" <td>0.000000</td>\n",
" <td>0.002632</td>\n",
" <td>0.015789</td>\n",
" <td>0.000000</td>\n",
" <td>0.002632</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.002632</td>\n",
" <td>0.002632</td>\n",
" <td>0.000000</td>\n",
" <td>0.005263</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.002632</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.002632</td>\n",
" <td>0.005263</td>\n",
" <td>0.000000</td>\n",
" <td>0.002632</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.010526</td>\n",
" <td>0.000000</td>\n",
" <td>0.002632</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.002632</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.002632</td>\n",
" <td>0.007895</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.002632</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.002632</td>\n",
" <td>0.002632</td>\n",
" <td>0.000000</td>\n",
" <td>0.002632</td>\n",
" <td>0.002632</td>\n",
" <td>0.000000</td>\n",
" <td>0.010526</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.005263</td>\n",
" <td>0.000000</td>\n",
" <td>0.002632</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>West Toronto</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.010000</td>\n",
" <td>0.003333</td>\n",
" <td>0.000000</td>\n",
" <td>0.006667</td>\n",
" <td>0.000000</td>\n",
" <td>0.006667</td>\n",
" <td>0.000000</td>\n",
" <td>0.006667</td>\n",
" <td>0.010000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.003333</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.046667</td>\n",
" <td>0.006667</td>\n",
" <td>0.063333</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.003333</td>\n",
" <td>0.006667</td>\n",
" <td>0.003333</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.013333</td>\n",
" <td>0.003333</td>\n",
" <td>0.000000</td>\n",
" <td>0.003333</td>\n",
" <td>0.016667</td>\n",
" <td>0.013333</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.003333</td>\n",
" <td>0.003333</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.003333</td>\n",
" <td>0.000000</td>\n",
" <td>0.086667</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.003333</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.003333</td>\n",
" <td>0.010000</td>\n",
" <td>0.066667</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.003333</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.003333</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.006667</td>\n",
" <td>0.003333</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.003333</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.010000</td>\n",
" <td>0.000000</td>\n",
" <td>0.006667</td>\n",
" <td>0.003333</td>\n",
" <td>0.000000</td>\n",
" <td>0.010000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.006667</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.003333</td>\n",
" <td>0.000000</td>\n",
" <td>0.006667</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.003333</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.003333</td>\n",
" <td>0.003333</td>\n",
" <td>0.006667</td>\n",
" <td>0.003333</td>\n",
" <td>0.003333</td>\n",
" <td>0.003333</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.010000</td>\n",
" <td>0.000000</td>\n",
" <td>0.003333</td>\n",
" <td>0.000000</td>\n",
" <td>0.010000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.013333</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.013333</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.006667</td>\n",
" <td>0.003333</td>\n",
" <td>0.010000</td>\n",
" <td>0.006667</td>\n",
" <td>0.006667</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.003333</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.006667</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.013333</td>\n",
" <td>0.000000</td>\n",
" <td>0.010000</td>\n",
" <td>0.003333</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.033333</td>\n",
" <td>0.006667</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.003333</td>\n",
" <td>0.000000</td>\n",
" <td>0.003333</td>\n",
" <td>0.000000</td>\n",
" <td>0.003333</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.006667</td>\n",
" <td>0.000000</td>\n",
" <td>0.003333</td>\n",
" <td>0.003333</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.003333</td>\n",
" <td>0.003333</td>\n",
" <td>0.000000</td>\n",
" <td>0.013333</td>\n",
" <td>0.003333</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.003333</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.006667</td>\n",
" <td>0.003333</td>\n",
" <td>0.003333</td>\n",
" <td>0.010000</td>\n",
" <td>0.00</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.003333</td>\n",
" <td>0.003333</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.026667</td>\n",
" <td>0.000000</td>\n",
" <td>0.003333</td>\n",
" <td>0.000000</td>\n",
" <td>0.006667</td>\n",
" <td>0.010000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.016667</td>\n",
" <td>0.003333</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.003333</td>\n",
" <td>0.000000</td>\n",
" <td>0.006667</td>\n",
" <td>0.003333</td>\n",
" <td>0.006667</td>\n",
" <td>0.000000</td>\n",
" <td>0.003333</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.020000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.003333</td>\n",
" <td>0.013333</td>\n",
" <td>0.003333</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.006667</td>\n",
" <td>0.000000</td>\n",
" <td>0.003333</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.003333</td>\n",
" <td>0.003333</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.003333</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.003333</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.003333</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.006667</td>\n",
" <td>0.000000</td>\n",
" <td>0.026667</td>\n",
" <td>0.003333</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.010000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.016667</td>\n",
" <td>0.006667</td>\n",
" <td>0.000000</td>\n",
" <td>0.003333</td>\n",
" <td>0.003333</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.006667</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.010000</td>\n",
" <td>0.000000</td>\n",
" <td>0.003333</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.006667</td>\n",
" </tr>\n",
" <tr>\n",
" <th>10</th>\n",
" <td>York</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.015267</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.007634</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.015267</td>\n",
" <td>0.007634</td>\n",
" <td>0.022901</td>\n",
" <td>0.007634</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.015267</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.007634</td>\n",
" <td>0.015267</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.007634</td>\n",
" <td>0.000000</td>\n",
" <td>0.022901</td>\n",
" <td>0.000000</td>\n",
" <td>0.015267</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.015267</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.007634</td>\n",
" <td>0.000000</td>\n",
" <td>0.007634</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.076336</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.038168</td>\n",
" <td>0.007634</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.015267</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.007634</td>\n",
" <td>0.000000</td>\n",
" <td>0.007634</td>\n",
" <td>0.038168</td>\n",
" <td>0.007634</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.007634</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.022901</td>\n",
" <td>0.007634</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.007634</td>\n",
" <td>0.000000</td>\n",
" <td>0.015267</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.015267</td>\n",
" <td>0.007634</td>\n",
" <td>0.000000</td>\n",
" <td>0.038168</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.007634</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.038168</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.007634</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.007634</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.007634</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.022901</td>\n",
" <td>0.007634</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.007634</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.007634</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.007634</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.015267</td>\n",
" <td>0.007634</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.00</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.007634</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.061069</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.030534</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.076336</td>\n",
" <td>0.007634</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.007634</td>\n",
" <td>0.000000</td>\n",
" <td>0.007634</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.038168</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.007634</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.007634</td>\n",
" <td>0.007634</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.007634</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.007634</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.015267</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.007634</td>\n",
" <td>0.015267</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.007634</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.007634</td>\n",
" <td>0.007634</td>\n",
" <td>0.007634</td>\n",
" <td>0.000000</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Borough Accessories Store Adult Boutique Afghan Restaurant \\\n",
"0 Central Toronto 0.000000 0.000000 0.000000 \n",
"1 Downtown Toronto 0.000000 0.001211 0.001211 \n",
"2 East Toronto 0.000000 0.000000 0.000000 \n",
"3 East York 0.000000 0.000000 0.010363 \n",
"4 Etobicoke 0.000000 0.004167 0.000000 \n",
"5 Mississauga 0.000000 0.000000 0.000000 \n",
"6 North York 0.003571 0.000000 0.000000 \n",
"7 Queen's Park 0.000000 0.000000 0.000000 \n",
"8 Scarborough 0.000000 0.000000 0.000000 \n",
"9 West Toronto 0.000000 0.000000 0.000000 \n",
"10 York 0.000000 0.000000 0.000000 \n",
"\n",
" African Restaurant Airport Airport Lounge American Restaurant \\\n",
"0 0.000000 0.000000 0.000000 0.008197 \n",
"1 0.000000 0.001211 0.001211 0.018160 \n",
"2 0.000000 0.000000 0.000000 0.016129 \n",
"3 0.000000 0.000000 0.000000 0.010363 \n",
"4 0.000000 0.000000 0.000000 0.020833 \n",
"5 0.000000 0.000000 0.000000 0.020000 \n",
"6 0.000000 0.001786 0.000000 0.010714 \n",
"7 0.000000 0.000000 0.000000 0.000000 \n",
"8 0.002632 0.000000 0.000000 0.000000 \n",
"9 0.000000 0.000000 0.000000 0.010000 \n",
"10 0.000000 0.000000 0.000000 0.000000 \n",
"\n",
" Amphitheater Animal Shelter Antique Shop Aquarium Art Gallery \\\n",
"0 0.000000 0.000000 0.000000 0.000000 0.000000 \n",
"1 0.000000 0.001211 0.000000 0.003632 0.012107 \n",
"2 0.000000 0.000000 0.000000 0.000000 0.000000 \n",
"3 0.000000 0.000000 0.000000 0.000000 0.000000 \n",
"4 0.000000 0.000000 0.000000 0.000000 0.000000 \n",
"5 0.000000 0.000000 0.000000 0.000000 0.000000 \n",
"6 0.000000 0.000000 0.000000 0.000000 0.000000 \n",
"7 0.000000 0.000000 0.000000 0.000000 0.000000 \n",
"8 0.000000 0.000000 0.000000 0.000000 0.000000 \n",
"9 0.003333 0.000000 0.006667 0.000000 0.006667 \n",
"10 0.000000 0.000000 0.000000 0.000000 0.000000 \n",
"\n",
" Art Museum Arts & Crafts Store Asian Restaurant Athletics & Sports \\\n",
"0 0.000000 0.000000 0.002732 0.000000 \n",
"1 0.001211 0.003632 0.004843 0.001211 \n",
"2 0.000000 0.004032 0.008065 0.000000 \n",
"3 0.000000 0.000000 0.010363 0.015544 \n",
"4 0.000000 0.000000 0.004167 0.000000 \n",
"5 0.000000 0.000000 0.040000 0.000000 \n",
"6 0.000000 0.001786 0.007143 0.010714 \n",
"7 0.000000 0.020000 0.000000 0.000000 \n",
"8 0.000000 0.000000 0.010526 0.002632 \n",
"9 0.000000 0.006667 0.010000 0.000000 \n",
"10 0.000000 0.000000 0.000000 0.015267 \n",
"\n",
" Auto Dealership Auto Garage Automotive Shop BBQ Joint Baby Store \\\n",
"0 0.000000 0.000000 0.000000 0.002732 0.000000 \n",
"1 0.000000 0.000000 0.000000 0.002421 0.000000 \n",
"2 0.000000 0.000000 0.000000 0.012097 0.000000 \n",
"3 0.005181 0.000000 0.000000 0.015544 0.000000 \n",
"4 0.000000 0.004167 0.004167 0.008333 0.000000 \n",
"5 0.000000 0.000000 0.000000 0.000000 0.000000 \n",
"6 0.000000 0.000000 0.000000 0.000000 0.001786 \n",
"7 0.000000 0.000000 0.000000 0.000000 0.000000 \n",
"8 0.000000 0.002632 0.005263 0.002632 0.000000 \n",
"9 0.000000 0.000000 0.000000 0.003333 0.000000 \n",
"10 0.000000 0.000000 0.000000 0.007634 0.000000 \n",
"\n",
" Badminton Court Bagel Shop Bakery Bank Bar Baseball Field \\\n",
"0 0.000000 0.005464 0.021858 0.016393 0.000000 0.002732 \n",
"1 0.000000 0.001211 0.024213 0.002421 0.012107 0.000000 \n",
"2 0.000000 0.004032 0.040323 0.000000 0.024194 0.000000 \n",
"3 0.000000 0.005181 0.015544 0.020725 0.005181 0.000000 \n",
"4 0.000000 0.000000 0.020833 0.029167 0.000000 0.000000 \n",
"5 0.000000 0.000000 0.020000 0.000000 0.000000 0.000000 \n",
"6 0.000000 0.001786 0.016071 0.025000 0.005357 0.003571 \n",
"7 0.000000 0.000000 0.000000 0.000000 0.020000 0.000000 \n",
"8 0.002632 0.000000 0.039474 0.021053 0.002632 0.000000 \n",
"9 0.000000 0.000000 0.046667 0.006667 0.063333 0.000000 \n",
"10 0.000000 0.015267 0.007634 0.022901 0.007634 0.000000 \n",
"\n",
" Baseball Stadium Basketball Court Basketball Stadium Beach \\\n",
"0 0.000000 0.000000 0.000000 0.000000 \n",
"1 0.002421 0.000000 0.004843 0.001211 \n",
"2 0.000000 0.000000 0.000000 0.024194 \n",
"3 0.000000 0.000000 0.000000 0.000000 \n",
"4 0.000000 0.000000 0.000000 0.000000 \n",
"5 0.000000 0.000000 0.000000 0.000000 \n",
"6 0.000000 0.001786 0.000000 0.000000 \n",
"7 0.000000 0.000000 0.000000 0.000000 \n",
"8 0.000000 0.000000 0.000000 0.005263 \n",
"9 0.000000 0.000000 0.000000 0.000000 \n",
"10 0.000000 0.000000 0.000000 0.000000 \n",
"\n",
" Beach Bar Beer Bar Beer Store Belgian Restaurant Bike Shop Bistro \\\n",
"0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 \n",
"1 0.000000 0.014528 0.000000 0.002421 0.000000 0.003632 \n",
"2 0.000000 0.000000 0.000000 0.000000 0.000000 0.004032 \n",
"3 0.000000 0.010363 0.015544 0.000000 0.005181 0.000000 \n",
"4 0.000000 0.000000 0.012500 0.000000 0.000000 0.000000 \n",
"5 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 \n",
"6 0.000000 0.000000 0.007143 0.000000 0.001786 0.000000 \n",
"7 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 \n",
"8 0.000000 0.000000 0.007895 0.000000 0.000000 0.000000 \n",
"9 0.003333 0.006667 0.003333 0.000000 0.000000 0.000000 \n",
"10 0.000000 0.000000 0.015267 0.000000 0.000000 0.000000 \n",
"\n",
" Bookstore Boutique Bowling Alley Brazilian Restaurant Breakfast Spot \\\n",
"0 0.016393 0.000000 0.000000 0.000000 0.008197 \n",
"1 0.006053 0.000000 0.000000 0.001211 0.009685 \n",
"2 0.012097 0.004032 0.000000 0.000000 0.016129 \n",
"3 0.000000 0.000000 0.000000 0.000000 0.010363 \n",
"4 0.000000 0.000000 0.000000 0.000000 0.012500 \n",
"5 0.000000 0.000000 0.000000 0.000000 0.020000 \n",
"6 0.001786 0.003571 0.003571 0.000000 0.001786 \n",
"7 0.040000 0.000000 0.000000 0.000000 0.020000 \n",
"8 0.000000 0.000000 0.005263 0.000000 0.010526 \n",
"9 0.013333 0.003333 0.000000 0.003333 0.016667 \n",
"10 0.000000 0.000000 0.000000 0.000000 0.007634 \n",
"\n",
" Brewery Bridal Shop Bridge Bubble Tea Shop Burger Joint \\\n",
"0 0.005464 0.000000 0.000000 0.000000 0.016393 \n",
"1 0.002421 0.000000 0.000000 0.007264 0.006053 \n",
"2 0.024194 0.000000 0.000000 0.004032 0.016129 \n",
"3 0.031088 0.000000 0.005181 0.000000 0.025907 \n",
"4 0.000000 0.000000 0.000000 0.000000 0.016667 \n",
"5 0.000000 0.000000 0.000000 0.000000 0.000000 \n",
"6 0.000000 0.003571 0.000000 0.001786 0.008929 \n",
"7 0.000000 0.000000 0.000000 0.040000 0.020000 \n",
"8 0.000000 0.000000 0.000000 0.000000 0.023684 \n",
"9 0.013333 0.000000 0.000000 0.000000 0.003333 \n",
"10 0.015267 0.000000 0.000000 0.000000 0.007634 \n",
"\n",
" Burrito Place Bus Line Bus Station Bus Stop Business Service \\\n",
"0 0.000000 0.000000 0.000000 0.000000 0.000000 \n",
"1 0.003632 0.000000 0.000000 0.000000 0.000000 \n",
"2 0.012097 0.000000 0.000000 0.000000 0.000000 \n",
"3 0.000000 0.005181 0.000000 0.000000 0.005181 \n",
"4 0.012500 0.012500 0.000000 0.000000 0.000000 \n",
"5 0.020000 0.000000 0.020000 0.000000 0.000000 \n",
"6 0.001786 0.007143 0.000000 0.003571 0.001786 \n",
"7 0.020000 0.000000 0.000000 0.000000 0.000000 \n",
"8 0.000000 0.010526 0.007895 0.000000 0.000000 \n",
"9 0.003333 0.000000 0.000000 0.000000 0.000000 \n",
"10 0.000000 0.022901 0.000000 0.015267 0.000000 \n",
"\n",
" Butcher Cafeteria Café Cajun / Creole Restaurant Candy Store \\\n",
"0 0.000000 0.000000 0.057377 0.000000 0.000000 \n",
"1 0.000000 0.000000 0.072639 0.000000 0.001211 \n",
"2 0.004032 0.000000 0.028226 0.000000 0.000000 \n",
"3 0.000000 0.000000 0.036269 0.000000 0.000000 \n",
"4 0.000000 0.000000 0.020833 0.000000 0.000000 \n",
"5 0.000000 0.000000 0.000000 0.000000 0.000000 \n",
"6 0.001786 0.001786 0.021429 0.000000 0.001786 \n",
"7 0.000000 0.000000 0.000000 0.000000 0.000000 \n",
"8 0.000000 0.000000 0.002632 0.002632 0.000000 \n",
"9 0.003333 0.000000 0.086667 0.000000 0.000000 \n",
"10 0.000000 0.000000 0.015267 0.000000 0.000000 \n",
"\n",
" Cantonese Restaurant Caribbean Restaurant Castle Cemetery \\\n",
"0 0.005464 0.000000 0.002732 0.002732 \n",
"1 0.000000 0.003632 0.000000 0.000000 \n",
"2 0.000000 0.012097 0.000000 0.000000 \n",
"3 0.000000 0.000000 0.000000 0.000000 \n",
"4 0.000000 0.000000 0.000000 0.000000 \n",
"5 0.000000 0.020000 0.000000 0.000000 \n",
"6 0.000000 0.007143 0.000000 0.000000 \n",
"7 0.000000 0.000000 0.000000 0.000000 \n",
"8 0.005263 0.015789 0.000000 0.000000 \n",
"9 0.000000 0.003333 0.000000 0.000000 \n",
"10 0.000000 0.000000 0.000000 0.000000 \n",
"\n",
" Check Cashing Service Cheese Shop Chinese Restaurant Chiropractor \\\n",
"0 0.000000 0.002732 0.000000 0.005464 \n",
"1 0.000000 0.002421 0.004843 0.000000 \n",
"2 0.000000 0.004032 0.004032 0.000000 \n",
"3 0.000000 0.000000 0.000000 0.000000 \n",
"4 0.000000 0.000000 0.008333 0.000000 \n",
"5 0.000000 0.000000 0.060000 0.000000 \n",
"6 0.000000 0.001786 0.012500 0.000000 \n",
"7 0.000000 0.000000 0.020000 0.000000 \n",
"8 0.000000 0.000000 0.065789 0.000000 \n",
"9 0.000000 0.000000 0.000000 0.000000 \n",
"10 0.007634 0.000000 0.007634 0.000000 \n",
"\n",
" Chocolate Shop Church Churrascaria Climbing Gym Clothing Store \\\n",
"0 0.000000 0.000000 0.005464 0.000000 0.002732 \n",
"1 0.001211 0.002421 0.000000 0.000000 0.004843 \n",
"2 0.004032 0.000000 0.000000 0.004032 0.000000 \n",
"3 0.000000 0.000000 0.000000 0.000000 0.005181 \n",
"4 0.000000 0.000000 0.000000 0.000000 0.000000 \n",
"5 0.000000 0.000000 0.000000 0.000000 0.000000 \n",
"6 0.000000 0.000000 0.000000 0.000000 0.019643 \n",
"7 0.000000 0.000000 0.000000 0.000000 0.000000 \n",
"8 0.000000 0.000000 0.000000 0.000000 0.005263 \n",
"9 0.000000 0.000000 0.000000 0.000000 0.003333 \n",
"10 0.000000 0.000000 0.000000 0.000000 0.000000 \n",
"\n",
" Cocktail Bar Coffee Shop College Gym College Quad College Rec Center \\\n",
"0 0.000000 0.073770 0.002732 0.002732 0.000000 \n",
"1 0.013317 0.078692 0.001211 0.000000 0.000000 \n",
"2 0.000000 0.064516 0.000000 0.000000 0.000000 \n",
"3 0.000000 0.088083 0.000000 0.000000 0.000000 \n",
"4 0.000000 0.054167 0.000000 0.000000 0.004167 \n",
"5 0.000000 0.100000 0.000000 0.000000 0.000000 \n",
"6 0.000000 0.075000 0.000000 0.000000 0.000000 \n",
"7 0.000000 0.120000 0.000000 0.000000 0.000000 \n",
"8 0.000000 0.073684 0.000000 0.000000 0.000000 \n",
"9 0.010000 0.066667 0.000000 0.000000 0.000000 \n",
"10 0.000000 0.076336 0.000000 0.000000 0.000000 \n",
"\n",
" College Stadium Comedy Club Comfort Food Restaurant Comic Shop \\\n",
"0 0.000000 0.000000 0.000000 0.000000 \n",
"1 0.000000 0.002421 0.003632 0.002421 \n",
"2 0.000000 0.000000 0.004032 0.008065 \n",
"3 0.000000 0.000000 0.000000 0.000000 \n",
"4 0.000000 0.000000 0.004167 0.000000 \n",
"5 0.000000 0.020000 0.000000 0.000000 \n",
"6 0.000000 0.000000 0.001786 0.000000 \n",
"7 0.000000 0.000000 0.000000 0.000000 \n",
"8 0.002632 0.000000 0.000000 0.000000 \n",
"9 0.000000 0.000000 0.003333 0.000000 \n",
"10 0.000000 0.000000 0.000000 0.000000 \n",
"\n",
" Community Center Concert Hall Construction & Landscaping \\\n",
"0 0.000000 0.002732 0.000000 \n",
"1 0.000000 0.012107 0.000000 \n",
"2 0.000000 0.004032 0.000000 \n",
"3 0.000000 0.000000 0.005181 \n",
"4 0.000000 0.000000 0.004167 \n",
"5 0.000000 0.000000 0.000000 \n",
"6 0.001786 0.000000 0.000000 \n",
"7 0.000000 0.020000 0.000000 \n",
"8 0.000000 0.000000 0.000000 \n",
"9 0.000000 0.000000 0.000000 \n",
"10 0.000000 0.000000 0.000000 \n",
"\n",
" Convenience Store Cosmetics Shop Coworking Space Creperie \\\n",
"0 0.002732 0.000000 0.000000 0.000000 \n",
"1 0.001211 0.006053 0.000000 0.006053 \n",
"2 0.000000 0.004032 0.004032 0.000000 \n",
"3 0.005181 0.010363 0.000000 0.000000 \n",
"4 0.016667 0.000000 0.000000 0.000000 \n",
"5 0.000000 0.000000 0.000000 0.000000 \n",
"6 0.016071 0.003571 0.000000 0.001786 \n",
"7 0.000000 0.000000 0.000000 0.020000 \n",
"8 0.015789 0.000000 0.000000 0.000000 \n",
"9 0.003333 0.000000 0.000000 0.000000 \n",
"10 0.038168 0.007634 0.000000 0.000000 \n",
"\n",
" Cuban Restaurant Cupcake Shop Curling Ice Dance Studio Deli / Bodega \\\n",
"0 0.000000 0.000000 0.000000 0.000000 0.016393 \n",
"1 0.000000 0.001211 0.000000 0.006053 0.012107 \n",
"2 0.004032 0.004032 0.004032 0.004032 0.000000 \n",
"3 0.000000 0.000000 0.010363 0.000000 0.000000 \n",
"4 0.000000 0.004167 0.000000 0.004167 0.000000 \n",
"5 0.000000 0.000000 0.000000 0.000000 0.000000 \n",
"6 0.000000 0.000000 0.000000 0.000000 0.003571 \n",
"7 0.000000 0.000000 0.000000 0.020000 0.000000 \n",
"8 0.000000 0.000000 0.000000 0.000000 0.002632 \n",
"9 0.006667 0.003333 0.000000 0.000000 0.003333 \n",
"10 0.000000 0.000000 0.000000 0.015267 0.000000 \n",
"\n",
" Department Store Design Studio Dessert Shop Dim Sum Restaurant \\\n",
"0 0.000000 0.002732 0.013661 0.000000 \n",
"1 0.004843 0.001211 0.004843 0.000000 \n",
"2 0.000000 0.000000 0.004032 0.000000 \n",
"3 0.005181 0.000000 0.015544 0.005181 \n",
"4 0.000000 0.000000 0.012500 0.000000 \n",
"5 0.000000 0.000000 0.020000 0.000000 \n",
"6 0.001786 0.000000 0.005357 0.003571 \n",
"7 0.000000 0.000000 0.000000 0.000000 \n",
"8 0.002632 0.000000 0.007895 0.000000 \n",
"9 0.000000 0.000000 0.010000 0.000000 \n",
"10 0.000000 0.000000 0.007634 0.000000 \n",
"\n",
" Diner Discount Store Dive Bar Dog Run Doner Restaurant \\\n",
"0 0.010929 0.000000 0.000000 0.002732 0.000000 \n",
"1 0.007264 0.000000 0.000000 0.001211 0.002421 \n",
"2 0.016129 0.000000 0.004032 0.000000 0.000000 \n",
"3 0.005181 0.005181 0.000000 0.000000 0.000000 \n",
"4 0.000000 0.025000 0.000000 0.004167 0.000000 \n",
"5 0.000000 0.000000 0.000000 0.000000 0.000000 \n",
"6 0.005357 0.008929 0.000000 0.003571 0.000000 \n",
"7 0.040000 0.000000 0.000000 0.000000 0.000000 \n",
"8 0.002632 0.015789 0.000000 0.000000 0.000000 \n",
"9 0.006667 0.003333 0.000000 0.010000 0.000000 \n",
"10 0.007634 0.038168 0.007634 0.000000 0.000000 \n",
"\n",
" Donut Shop Dumpling Restaurant Eastern European Restaurant \\\n",
"0 0.000000 0.000000 0.002732 \n",
"1 0.000000 0.002421 0.000000 \n",
"2 0.004032 0.000000 0.000000 \n",
"3 0.005181 0.000000 0.000000 \n",
"4 0.004167 0.000000 0.004167 \n",
"5 0.000000 0.000000 0.000000 \n",
"6 0.000000 0.000000 0.001786 \n",
"7 0.000000 0.000000 0.000000 \n",
"8 0.000000 0.000000 0.000000 \n",
"9 0.000000 0.000000 0.006667 \n",
"10 0.000000 0.000000 0.000000 \n",
"\n",
" Electronics Store Elementary School Empanada Restaurant \\\n",
"0 0.005464 0.000000 0.000000 \n",
"1 0.000000 0.000000 0.000000 \n",
"2 0.008065 0.000000 0.000000 \n",
"3 0.005181 0.000000 0.000000 \n",
"4 0.000000 0.004167 0.000000 \n",
"5 0.000000 0.000000 0.000000 \n",
"6 0.007143 0.000000 0.001786 \n",
"7 0.000000 0.000000 0.000000 \n",
"8 0.010526 0.000000 0.000000 \n",
"9 0.000000 0.000000 0.000000 \n",
"10 0.000000 0.000000 0.000000 \n",
"\n",
" Ethiopian Restaurant Event Space Falafel Restaurant Farm \\\n",
"0 0.000000 0.000000 0.000000 0.000000 \n",
"1 0.002421 0.002421 0.000000 0.001211 \n",
"2 0.000000 0.000000 0.000000 0.000000 \n",
"3 0.010363 0.000000 0.000000 0.000000 \n",
"4 0.000000 0.000000 0.000000 0.000000 \n",
"5 0.000000 0.000000 0.020000 0.000000 \n",
"6 0.000000 0.001786 0.001786 0.000000 \n",
"7 0.020000 0.000000 0.020000 0.000000 \n",
"8 0.000000 0.002632 0.000000 0.000000 \n",
"9 0.003333 0.000000 0.006667 0.000000 \n",
"10 0.000000 0.000000 0.007634 0.000000 \n",
"\n",
" Farmers Market Fast Food Restaurant Field Filipino Restaurant \\\n",
"0 0.000000 0.005464 0.000000 0.000000 \n",
"1 0.009685 0.000000 0.000000 0.002421 \n",
"2 0.008065 0.008065 0.000000 0.000000 \n",
"3 0.010363 0.015544 0.000000 0.000000 \n",
"4 0.004167 0.012500 0.000000 0.000000 \n",
"5 0.000000 0.020000 0.000000 0.000000 \n",
"6 0.001786 0.041071 0.000000 0.000000 \n",
"7 0.000000 0.000000 0.000000 0.000000 \n",
"8 0.000000 0.063158 0.000000 0.000000 \n",
"9 0.000000 0.003333 0.000000 0.000000 \n",
"10 0.000000 0.022901 0.007634 0.000000 \n",
"\n",
" Fireworks Store Fish & Chips Shop Fish Market Flea Market Flower Shop \\\n",
"0 0.000000 0.000000 0.000000 0.000000 0.002732 \n",
"1 0.000000 0.000000 0.001211 0.000000 0.000000 \n",
"2 0.000000 0.008065 0.004032 0.000000 0.000000 \n",
"3 0.000000 0.005181 0.000000 0.000000 0.000000 \n",
"4 0.000000 0.008333 0.000000 0.000000 0.004167 \n",
"5 0.000000 0.000000 0.000000 0.000000 0.000000 \n",
"6 0.001786 0.001786 0.000000 0.000000 0.000000 \n",
"7 0.000000 0.000000 0.000000 0.000000 0.000000 \n",
"8 0.000000 0.000000 0.002632 0.002632 0.000000 \n",
"9 0.000000 0.003333 0.003333 0.006667 0.003333 \n",
"10 0.000000 0.000000 0.000000 0.000000 0.000000 \n",
"\n",
" Food Food & Drink Shop Food Court Food Truck Fountain \\\n",
"0 0.000000 0.005464 0.000000 0.000000 0.000000 \n",
"1 0.000000 0.000000 0.003632 0.004843 0.001211 \n",
"2 0.000000 0.000000 0.000000 0.000000 0.000000 \n",
"3 0.000000 0.000000 0.000000 0.000000 0.000000 \n",
"4 0.000000 0.000000 0.000000 0.000000 0.000000 \n",
"5 0.020000 0.000000 0.020000 0.000000 0.000000 \n",
"6 0.000000 0.001786 0.001786 0.000000 0.000000 \n",
"7 0.000000 0.000000 0.000000 0.000000 0.000000 \n",
"8 0.000000 0.002632 0.000000 0.000000 0.000000 \n",
"9 0.003333 0.003333 0.000000 0.000000 0.000000 \n",
"10 0.000000 0.007634 0.000000 0.015267 0.000000 \n",
"\n",
" Frame Store French Restaurant Fried Chicken Joint Frozen Yogurt Shop \\\n",
"0 0.000000 0.005464 0.002732 0.000000 \n",
"1 0.000000 0.006053 0.002421 0.000000 \n",
"2 0.000000 0.012097 0.004032 0.000000 \n",
"3 0.000000 0.000000 0.005181 0.000000 \n",
"4 0.000000 0.008333 0.008333 0.000000 \n",
"5 0.000000 0.000000 0.040000 0.000000 \n",
"6 0.001786 0.001786 0.014286 0.001786 \n",
"7 0.000000 0.000000 0.000000 0.000000 \n",
"8 0.000000 0.000000 0.010526 0.000000 \n",
"9 0.000000 0.010000 0.000000 0.003333 \n",
"10 0.000000 0.000000 0.015267 0.007634 \n",
"\n",
" Fruit & Vegetable Store Furniture / Home Store Gaming Cafe Garden \\\n",
"0 0.000000 0.002732 0.000000 0.005464 \n",
"1 0.000000 0.000000 0.002421 0.002421 \n",
"2 0.004032 0.000000 0.000000 0.000000 \n",
"3 0.000000 0.010363 0.000000 0.000000 \n",
"4 0.000000 0.000000 0.000000 0.000000 \n",
"5 0.000000 0.000000 0.000000 0.000000 \n",
"6 0.000000 0.010714 0.000000 0.000000 \n",
"7 0.000000 0.000000 0.000000 0.000000 \n",
"8 0.002632 0.010526 0.000000 0.000000 \n",
"9 0.000000 0.010000 0.000000 0.000000 \n",
"10 0.000000 0.038168 0.000000 0.000000 \n",
"\n",
" Garden Center Gas Station Gastropub Gay Bar General Entertainment \\\n",
"0 0.000000 0.000000 0.010929 0.000000 0.002732 \n",
"1 0.000000 0.000000 0.026634 0.002421 0.002421 \n",
"2 0.000000 0.000000 0.004032 0.000000 0.000000 \n",
"3 0.000000 0.000000 0.015544 0.000000 0.000000 \n",
"4 0.004167 0.004167 0.004167 0.000000 0.000000 \n",
"5 0.000000 0.000000 0.000000 0.000000 0.000000 \n",
"6 0.000000 0.000000 0.000000 0.000000 0.001786 \n",
"7 0.000000 0.000000 0.040000 0.000000 0.020000 \n",
"8 0.000000 0.000000 0.000000 0.000000 0.005263 \n",
"9 0.000000 0.000000 0.013333 0.000000 0.000000 \n",
"10 0.000000 0.000000 0.007634 0.000000 0.000000 \n",
"\n",
" German Restaurant Gift Shop Golf Course Golf Driving Range \\\n",
"0 0.005464 0.002732 0.000000 0.000000 \n",
"1 0.000000 0.003632 0.000000 0.000000 \n",
"2 0.000000 0.000000 0.000000 0.000000 \n",
"3 0.000000 0.000000 0.000000 0.000000 \n",
"4 0.000000 0.000000 0.008333 0.004167 \n",
"5 0.000000 0.000000 0.000000 0.000000 \n",
"6 0.000000 0.001786 0.005357 0.000000 \n",
"7 0.000000 0.020000 0.000000 0.000000 \n",
"8 0.000000 0.000000 0.002632 0.000000 \n",
"9 0.000000 0.013333 0.000000 0.000000 \n",
"10 0.000000 0.000000 0.000000 0.000000 \n",
"\n",
" Gourmet Shop Greek Restaurant Grocery Store Gym \\\n",
"0 0.000000 0.002732 0.019126 0.027322 \n",
"1 0.001211 0.006053 0.008475 0.013317 \n",
"2 0.000000 0.040323 0.016129 0.012097 \n",
"3 0.005181 0.025907 0.020725 0.010363 \n",
"4 0.004167 0.004167 0.041667 0.008333 \n",
"5 0.000000 0.000000 0.000000 0.020000 \n",
"6 0.000000 0.005357 0.030357 0.010714 \n",
"7 0.000000 0.000000 0.000000 0.020000 \n",
"8 0.000000 0.005263 0.028947 0.010526 \n",
"9 0.006667 0.003333 0.010000 0.006667 \n",
"10 0.000000 0.000000 0.038168 0.000000 \n",
"\n",
" Gym / Fitness Center Gym Pool Hakka Restaurant Harbor / Marina \\\n",
"0 0.013661 0.005464 0.000000 0.000000 \n",
"1 0.006053 0.000000 0.000000 0.002421 \n",
"2 0.004032 0.000000 0.000000 0.004032 \n",
"3 0.005181 0.000000 0.000000 0.000000 \n",
"4 0.016667 0.000000 0.000000 0.000000 \n",
"5 0.020000 0.000000 0.000000 0.000000 \n",
"6 0.008929 0.000000 0.000000 0.000000 \n",
"7 0.000000 0.000000 0.000000 0.000000 \n",
"8 0.002632 0.007895 0.002632 0.000000 \n",
"9 0.006667 0.000000 0.000000 0.000000 \n",
"10 0.000000 0.000000 0.000000 0.000000 \n",
"\n",
" Hardware Store Hawaiian Restaurant Health Food Store Historic Site \\\n",
"0 0.000000 0.000000 0.000000 0.002732 \n",
"1 0.000000 0.000000 0.001211 0.002421 \n",
"2 0.000000 0.000000 0.004032 0.000000 \n",
"3 0.000000 0.000000 0.000000 0.000000 \n",
"4 0.004167 0.000000 0.000000 0.000000 \n",
"5 0.000000 0.000000 0.000000 0.000000 \n",
"6 0.003571 0.000000 0.000000 0.000000 \n",
"7 0.000000 0.000000 0.000000 0.000000 \n",
"8 0.000000 0.000000 0.000000 0.000000 \n",
"9 0.000000 0.003333 0.000000 0.000000 \n",
"10 0.007634 0.000000 0.000000 0.000000 \n",
"\n",
" History Museum Hobby Shop Hockey Arena Home Service \\\n",
"0 0.002732 0.000000 0.000000 0.000000 \n",
"1 0.001211 0.001211 0.000000 0.000000 \n",
"2 0.000000 0.000000 0.000000 0.000000 \n",
"3 0.000000 0.000000 0.000000 0.005181 \n",
"4 0.000000 0.000000 0.000000 0.000000 \n",
"5 0.000000 0.020000 0.000000 0.000000 \n",
"6 0.001786 0.000000 0.001786 0.000000 \n",
"7 0.000000 0.020000 0.000000 0.000000 \n",
"8 0.000000 0.010526 0.000000 0.000000 \n",
"9 0.000000 0.000000 0.000000 0.000000 \n",
"10 0.000000 0.000000 0.000000 0.007634 \n",
"\n",
" Hong Kong Restaurant Hookah Bar Hostel Hot Dog Joint Hotel \\\n",
"0 0.000000 0.000000 0.000000 0.000000 0.002732 \n",
"1 0.000000 0.000000 0.003632 0.000000 0.027845 \n",
"2 0.000000 0.000000 0.000000 0.000000 0.004032 \n",
"3 0.000000 0.000000 0.005181 0.000000 0.000000 \n",
"4 0.000000 0.000000 0.000000 0.000000 0.004167 \n",
"5 0.000000 0.020000 0.000000 0.000000 0.060000 \n",
"6 0.000000 0.001786 0.000000 0.001786 0.010714 \n",
"7 0.000000 0.000000 0.000000 0.000000 0.000000 \n",
"8 0.005263 0.000000 0.000000 0.000000 0.000000 \n",
"9 0.000000 0.000000 0.000000 0.000000 0.006667 \n",
"10 0.000000 0.000000 0.000000 0.000000 0.000000 \n",
"\n",
" Hotpot Restaurant Housing Development Ice Cream Shop \\\n",
"0 0.000000 0.000000 0.010929 \n",
"1 0.000000 0.000000 0.007264 \n",
"2 0.000000 0.000000 0.024194 \n",
"3 0.000000 0.000000 0.005181 \n",
"4 0.000000 0.000000 0.008333 \n",
"5 0.000000 0.000000 0.000000 \n",
"6 0.000000 0.001786 0.007143 \n",
"7 0.000000 0.000000 0.020000 \n",
"8 0.002632 0.000000 0.000000 \n",
"9 0.000000 0.000000 0.013333 \n",
"10 0.000000 0.000000 0.000000 \n",
"\n",
" Indian Chinese Restaurant Indian Restaurant Indie Movie Theater \\\n",
"0 0.000000 0.013661 0.002732 \n",
"1 0.000000 0.003632 0.001211 \n",
"2 0.004032 0.024194 0.004032 \n",
"3 0.000000 0.020725 0.000000 \n",
"4 0.000000 0.008333 0.004167 \n",
"5 0.000000 0.020000 0.000000 \n",
"6 0.000000 0.003571 0.000000 \n",
"7 0.000000 0.000000 0.000000 \n",
"8 0.000000 0.018421 0.000000 \n",
"9 0.000000 0.010000 0.003333 \n",
"10 0.000000 0.007634 0.000000 \n",
"\n",
" Indie Theater Indonesian Restaurant Intersection Italian Restaurant \\\n",
"0 0.000000 0.002732 0.000000 0.071038 \n",
"1 0.000000 0.000000 0.000000 0.021792 \n",
"2 0.004032 0.000000 0.000000 0.032258 \n",
"3 0.000000 0.000000 0.010363 0.005181 \n",
"4 0.000000 0.000000 0.012500 0.025000 \n",
"5 0.000000 0.000000 0.000000 0.000000 \n",
"6 0.000000 0.001786 0.007143 0.012500 \n",
"7 0.000000 0.000000 0.000000 0.020000 \n",
"8 0.000000 0.000000 0.021053 0.007895 \n",
"9 0.000000 0.000000 0.000000 0.033333 \n",
"10 0.000000 0.000000 0.000000 0.022901 \n",
"\n",
" Japanese Restaurant Jazz Club Jewelry Store Jewish Restaurant \\\n",
"0 0.019126 0.000000 0.000000 0.005464 \n",
"1 0.021792 0.004843 0.001211 0.000000 \n",
"2 0.012097 0.004032 0.000000 0.000000 \n",
"3 0.000000 0.000000 0.000000 0.000000 \n",
"4 0.004167 0.000000 0.000000 0.000000 \n",
"5 0.020000 0.000000 0.000000 0.000000 \n",
"6 0.028571 0.000000 0.001786 0.000000 \n",
"7 0.020000 0.000000 0.000000 0.000000 \n",
"8 0.005263 0.000000 0.000000 0.000000 \n",
"9 0.006667 0.000000 0.000000 0.000000 \n",
"10 0.007634 0.000000 0.000000 0.000000 \n",
"\n",
" Juice Bar Kitchen Supply Store Korean Restaurant Lake \\\n",
"0 0.000000 0.000000 0.000000 0.000000 \n",
"1 0.001211 0.000000 0.006053 0.001211 \n",
"2 0.008065 0.000000 0.000000 0.000000 \n",
"3 0.000000 0.000000 0.000000 0.000000 \n",
"4 0.000000 0.000000 0.000000 0.000000 \n",
"5 0.020000 0.000000 0.000000 0.000000 \n",
"6 0.003571 0.001786 0.017857 0.000000 \n",
"7 0.020000 0.000000 0.000000 0.000000 \n",
"8 0.000000 0.000000 0.007895 0.000000 \n",
"9 0.003333 0.000000 0.003333 0.000000 \n",
"10 0.000000 0.000000 0.007634 0.000000 \n",
"\n",
" Latin American Restaurant Laundromat Laundry Service \\\n",
"0 0.000000 0.000000 0.000000 \n",
"1 0.002421 0.000000 0.000000 \n",
"2 0.004032 0.000000 0.000000 \n",
"3 0.000000 0.000000 0.000000 \n",
"4 0.000000 0.000000 0.004167 \n",
"5 0.000000 0.000000 0.000000 \n",
"6 0.003571 0.000000 0.001786 \n",
"7 0.000000 0.000000 0.000000 \n",
"8 0.002632 0.002632 0.000000 \n",
"9 0.003333 0.000000 0.000000 \n",
"10 0.000000 0.000000 0.000000 \n",
"\n",
" Light Rail Station Liquor Store Lounge Mac & Cheese Joint \\\n",
"0 0.000000 0.002732 0.000000 0.000000 \n",
"1 0.000000 0.003632 0.003632 0.000000 \n",
"2 0.000000 0.012097 0.000000 0.000000 \n",
"3 0.000000 0.015544 0.000000 0.000000 \n",
"4 0.000000 0.025000 0.004167 0.000000 \n",
"5 0.000000 0.000000 0.000000 0.000000 \n",
"6 0.000000 0.007143 0.003571 0.000000 \n",
"7 0.000000 0.000000 0.000000 0.000000 \n",
"8 0.007895 0.002632 0.002632 0.000000 \n",
"9 0.000000 0.006667 0.000000 0.003333 \n",
"10 0.000000 0.007634 0.000000 0.000000 \n",
"\n",
" Malay Restaurant Market Martial Arts Dojo Massage Studio \\\n",
"0 0.000000 0.000000 0.000000 0.000000 \n",
"1 0.000000 0.000000 0.001211 0.000000 \n",
"2 0.000000 0.000000 0.000000 0.000000 \n",
"3 0.000000 0.000000 0.000000 0.000000 \n",
"4 0.000000 0.000000 0.000000 0.000000 \n",
"5 0.000000 0.000000 0.000000 0.000000 \n",
"6 0.000000 0.000000 0.000000 0.001786 \n",
"7 0.000000 0.000000 0.000000 0.000000 \n",
"8 0.005263 0.000000 0.000000 0.000000 \n",
"9 0.003333 0.000000 0.000000 0.000000 \n",
"10 0.000000 0.007634 0.000000 0.000000 \n",
"\n",
" Mediterranean Restaurant Men's Store Metro Station Mexican Restaurant \\\n",
"0 0.005464 0.000000 0.000000 0.010929 \n",
"1 0.003632 0.002421 0.001211 0.010896 \n",
"2 0.000000 0.000000 0.000000 0.004032 \n",
"3 0.000000 0.000000 0.000000 0.005181 \n",
"4 0.000000 0.000000 0.000000 0.012500 \n",
"5 0.000000 0.000000 0.000000 0.040000 \n",
"6 0.003571 0.001786 0.000000 0.000000 \n",
"7 0.000000 0.000000 0.000000 0.020000 \n",
"8 0.002632 0.000000 0.005263 0.002632 \n",
"9 0.003333 0.003333 0.000000 0.013333 \n",
"10 0.000000 0.000000 0.000000 0.015267 \n",
"\n",
" Middle Eastern Restaurant Miscellaneous Shop Mobile Phone Shop \\\n",
"0 0.005464 0.000000 0.000000 \n",
"1 0.002421 0.002421 0.000000 \n",
"2 0.008065 0.000000 0.000000 \n",
"3 0.005181 0.000000 0.000000 \n",
"4 0.008333 0.000000 0.008333 \n",
"5 0.060000 0.000000 0.000000 \n",
"6 0.008929 0.003571 0.000000 \n",
"7 0.000000 0.000000 0.000000 \n",
"8 0.007895 0.000000 0.000000 \n",
"9 0.003333 0.000000 0.000000 \n",
"10 0.007634 0.000000 0.000000 \n",
"\n",
" Modern European Restaurant Monument / Landmark Moroccan Restaurant \\\n",
"0 0.005464 0.000000 0.000000 \n",
"1 0.002421 0.003632 0.000000 \n",
"2 0.000000 0.000000 0.000000 \n",
"3 0.000000 0.000000 0.000000 \n",
"4 0.000000 0.000000 0.004167 \n",
"5 0.000000 0.000000 0.000000 \n",
"6 0.000000 0.000000 0.000000 \n",
"7 0.000000 0.000000 0.000000 \n",
"8 0.000000 0.000000 0.000000 \n",
"9 0.000000 0.000000 0.000000 \n",
"10 0.000000 0.000000 0.000000 \n",
"\n",
" Motorcycle Shop Movie Theater Museum Music School Music Store \\\n",
"0 0.000000 0.005464 0.002732 0.002732 0.000000 \n",
"1 0.000000 0.001211 0.008475 0.001211 0.001211 \n",
"2 0.000000 0.004032 0.000000 0.000000 0.000000 \n",
"3 0.000000 0.000000 0.000000 0.000000 0.000000 \n",
"4 0.000000 0.004167 0.000000 0.000000 0.000000 \n",
"5 0.000000 0.000000 0.000000 0.000000 0.000000 \n",
"6 0.000000 0.003571 0.000000 0.000000 0.000000 \n",
"7 0.000000 0.000000 0.020000 0.000000 0.000000 \n",
"8 0.002632 0.000000 0.000000 0.000000 0.002632 \n",
"9 0.000000 0.003333 0.000000 0.000000 0.000000 \n",
"10 0.000000 0.000000 0.000000 0.000000 0.000000 \n",
"\n",
" Music Venue Nail Salon Neighborhood New American Restaurant Nightclub \\\n",
"0 0.000000 0.000000 0.002732 0.000000 0.00 \n",
"1 0.001211 0.000000 0.003632 0.006053 0.00 \n",
"2 0.000000 0.004032 0.004032 0.004032 0.00 \n",
"3 0.000000 0.005181 0.000000 0.000000 0.00 \n",
"4 0.000000 0.000000 0.000000 0.000000 0.00 \n",
"5 0.000000 0.000000 0.000000 0.000000 0.02 \n",
"6 0.000000 0.000000 0.000000 0.000000 0.00 \n",
"7 0.000000 0.000000 0.000000 0.000000 0.02 \n",
"8 0.000000 0.000000 0.000000 0.000000 0.00 \n",
"9 0.006667 0.003333 0.003333 0.010000 0.00 \n",
"10 0.000000 0.000000 0.000000 0.000000 0.00 \n",
"\n",
" Noodle House Office Opera House Optical Shop Organic Grocery \\\n",
"0 0.000000 0.000000 0.000000 0.000000 0.000000 \n",
"1 0.003632 0.002421 0.001211 0.000000 0.001211 \n",
"2 0.000000 0.000000 0.000000 0.000000 0.000000 \n",
"3 0.000000 0.000000 0.000000 0.000000 0.000000 \n",
"4 0.000000 0.000000 0.000000 0.000000 0.000000 \n",
"5 0.000000 0.000000 0.000000 0.000000 0.000000 \n",
"6 0.000000 0.001786 0.000000 0.001786 0.000000 \n",
"7 0.000000 0.000000 0.000000 0.000000 0.000000 \n",
"8 0.007895 0.000000 0.000000 0.000000 0.000000 \n",
"9 0.000000 0.000000 0.000000 0.000000 0.003333 \n",
"10 0.000000 0.000000 0.000000 0.007634 0.000000 \n",
"\n",
" Other Great Outdoors Other Repair Shop Pakistani Restaurant \\\n",
"0 0.000000 0.000000 0.000000 \n",
"1 0.000000 0.000000 0.000000 \n",
"2 0.000000 0.000000 0.004032 \n",
"3 0.000000 0.000000 0.000000 \n",
"4 0.000000 0.000000 0.000000 \n",
"5 0.000000 0.000000 0.000000 \n",
"6 0.000000 0.001786 0.000000 \n",
"7 0.000000 0.000000 0.000000 \n",
"8 0.002632 0.000000 0.000000 \n",
"9 0.003333 0.000000 0.000000 \n",
"10 0.000000 0.000000 0.000000 \n",
"\n",
" Paper / Office Supplies Store Park Pastry Shop \\\n",
"0 0.000000 0.043716 0.002732 \n",
"1 0.000000 0.024213 0.001211 \n",
"2 0.000000 0.036290 0.000000 \n",
"3 0.005181 0.020725 0.005181 \n",
"4 0.000000 0.066667 0.000000 \n",
"5 0.020000 0.000000 0.000000 \n",
"6 0.001786 0.041071 0.000000 \n",
"7 0.000000 0.040000 0.000000 \n",
"8 0.002632 0.036842 0.000000 \n",
"9 0.000000 0.026667 0.000000 \n",
"10 0.000000 0.061069 0.000000 \n",
"\n",
" Performing Arts Venue Persian Restaurant Pet Store Pharmacy \\\n",
"0 0.000000 0.002732 0.000000 0.013661 \n",
"1 0.004843 0.000000 0.001211 0.000000 \n",
"2 0.000000 0.000000 0.012097 0.004032 \n",
"3 0.005181 0.000000 0.015544 0.020725 \n",
"4 0.000000 0.000000 0.004167 0.045833 \n",
"5 0.000000 0.000000 0.000000 0.000000 \n",
"6 0.000000 0.000000 0.008929 0.023214 \n",
"7 0.000000 0.000000 0.000000 0.000000 \n",
"8 0.000000 0.000000 0.005263 0.031579 \n",
"9 0.003333 0.000000 0.006667 0.010000 \n",
"10 0.000000 0.000000 0.000000 0.030534 \n",
"\n",
" Photography Lab Pie Shop Pilates Studio Pizza Place Playground \\\n",
"0 0.000000 0.000000 0.002732 0.030055 0.000000 \n",
"1 0.000000 0.002421 0.000000 0.015738 0.002421 \n",
"2 0.000000 0.000000 0.000000 0.024194 0.000000 \n",
"3 0.000000 0.000000 0.000000 0.036269 0.000000 \n",
"4 0.000000 0.000000 0.000000 0.058333 0.004167 \n",
"5 0.000000 0.000000 0.000000 0.020000 0.000000 \n",
"6 0.001786 0.000000 0.000000 0.039286 0.005357 \n",
"7 0.000000 0.000000 0.000000 0.040000 0.000000 \n",
"8 0.000000 0.000000 0.000000 0.052632 0.002632 \n",
"9 0.000000 0.000000 0.000000 0.016667 0.003333 \n",
"10 0.000000 0.000000 0.000000 0.076336 0.007634 \n",
"\n",
" Plaza Poke Place Pool Pool Hall Portuguese Restaurant \\\n",
"0 0.005464 0.000000 0.005464 0.000000 0.000000 \n",
"1 0.007264 0.001211 0.002421 0.000000 0.001211 \n",
"2 0.000000 0.000000 0.000000 0.000000 0.000000 \n",
"3 0.000000 0.000000 0.000000 0.000000 0.010363 \n",
"4 0.000000 0.000000 0.004167 0.004167 0.000000 \n",
"5 0.000000 0.000000 0.000000 0.000000 0.000000 \n",
"6 0.001786 0.000000 0.005357 0.000000 0.001786 \n",
"7 0.000000 0.000000 0.000000 0.000000 0.020000 \n",
"8 0.002632 0.000000 0.002632 0.002632 0.000000 \n",
"9 0.000000 0.000000 0.003333 0.000000 0.006667 \n",
"10 0.000000 0.000000 0.000000 0.000000 0.000000 \n",
"\n",
" Poutine Place Pub Ramen Restaurant Record Shop Recreation Center \\\n",
"0 0.000000 0.013661 0.005464 0.000000 0.000000 \n",
"1 0.000000 0.014528 0.006053 0.001211 0.000000 \n",
"2 0.000000 0.040323 0.008065 0.000000 0.000000 \n",
"3 0.000000 0.010363 0.005181 0.000000 0.000000 \n",
"4 0.000000 0.016667 0.000000 0.000000 0.000000 \n",
"5 0.000000 0.000000 0.000000 0.000000 0.000000 \n",
"6 0.000000 0.003571 0.010714 0.000000 0.001786 \n",
"7 0.000000 0.000000 0.020000 0.000000 0.000000 \n",
"8 0.000000 0.002632 0.000000 0.000000 0.000000 \n",
"9 0.003333 0.006667 0.000000 0.003333 0.000000 \n",
"10 0.000000 0.000000 0.000000 0.000000 0.000000 \n",
"\n",
" Rental Car Location Residential Building (Apartment / Condo) Restaurant \\\n",
"0 0.000000 0.000000 0.019126 \n",
"1 0.000000 0.000000 0.030266 \n",
"2 0.000000 0.000000 0.016129 \n",
"3 0.005181 0.000000 0.020725 \n",
"4 0.000000 0.000000 0.016667 \n",
"5 0.000000 0.000000 0.040000 \n",
"6 0.003571 0.001786 0.028571 \n",
"7 0.000000 0.000000 0.000000 \n",
"8 0.007895 0.000000 0.013158 \n",
"9 0.000000 0.000000 0.020000 \n",
"10 0.007634 0.000000 0.007634 \n",
"\n",
" River Road Rock Climbing Spot Rock Club Salad Place \\\n",
"0 0.000000 0.000000 0.000000 0.000000 0.002732 \n",
"1 0.000000 0.000000 0.000000 0.001211 0.002421 \n",
"2 0.000000 0.000000 0.000000 0.004032 0.000000 \n",
"3 0.000000 0.000000 0.005181 0.000000 0.000000 \n",
"4 0.004167 0.000000 0.000000 0.000000 0.000000 \n",
"5 0.000000 0.000000 0.000000 0.000000 0.000000 \n",
"6 0.000000 0.003571 0.000000 0.000000 0.001786 \n",
"7 0.000000 0.000000 0.000000 0.000000 0.000000 \n",
"8 0.000000 0.000000 0.000000 0.000000 0.000000 \n",
"9 0.000000 0.000000 0.000000 0.000000 0.000000 \n",
"10 0.000000 0.000000 0.000000 0.000000 0.000000 \n",
"\n",
" Salon / Barbershop Sandwich Place Scenic Lookout School \\\n",
"0 0.002732 0.016393 0.000000 0.000000 \n",
"1 0.001211 0.006053 0.002421 0.001211 \n",
"2 0.000000 0.016129 0.000000 0.000000 \n",
"3 0.000000 0.025907 0.000000 0.000000 \n",
"4 0.000000 0.029167 0.000000 0.000000 \n",
"5 0.000000 0.020000 0.000000 0.000000 \n",
"6 0.001786 0.025000 0.000000 0.000000 \n",
"7 0.020000 0.020000 0.000000 0.000000 \n",
"8 0.000000 0.028947 0.000000 0.000000 \n",
"9 0.003333 0.013333 0.003333 0.000000 \n",
"10 0.000000 0.038168 0.000000 0.000000 \n",
"\n",
" Sculpture Garden Seafood Restaurant Shanghai Restaurant Shoe Store \\\n",
"0 0.000000 0.002732 0.000000 0.000000 \n",
"1 0.001211 0.013317 0.000000 0.001211 \n",
"2 0.000000 0.004032 0.000000 0.000000 \n",
"3 0.000000 0.000000 0.000000 0.000000 \n",
"4 0.000000 0.004167 0.000000 0.000000 \n",
"5 0.000000 0.000000 0.000000 0.000000 \n",
"6 0.000000 0.003571 0.000000 0.003571 \n",
"7 0.000000 0.000000 0.000000 0.000000 \n",
"8 0.000000 0.007895 0.002632 0.000000 \n",
"9 0.000000 0.006667 0.000000 0.003333 \n",
"10 0.000000 0.000000 0.000000 0.000000 \n",
"\n",
" Shop & Service Shopping Mall Skate Park Skating Rink Ski Area \\\n",
"0 0.000000 0.000000 0.000000 0.010929 0.000000 \n",
"1 0.000000 0.001211 0.000000 0.001211 0.000000 \n",
"2 0.000000 0.000000 0.008065 0.000000 0.000000 \n",
"3 0.000000 0.015544 0.000000 0.020725 0.000000 \n",
"4 0.000000 0.012500 0.000000 0.016667 0.000000 \n",
"5 0.000000 0.020000 0.000000 0.000000 0.000000 \n",
"6 0.001786 0.019643 0.001786 0.005357 0.001786 \n",
"7 0.000000 0.000000 0.000000 0.000000 0.000000 \n",
"8 0.002632 0.015789 0.000000 0.002632 0.000000 \n",
"9 0.000000 0.000000 0.000000 0.000000 0.000000 \n",
"10 0.000000 0.000000 0.000000 0.007634 0.000000 \n",
"\n",
" Ski Chalet Smoke Shop Smoothie Shop Snack Place Soccer Field \\\n",
"0 0.000000 0.000000 0.000000 0.000000 0.000000 \n",
"1 0.000000 0.002421 0.002421 0.001211 0.000000 \n",
"2 0.000000 0.000000 0.000000 0.008065 0.000000 \n",
"3 0.000000 0.000000 0.010363 0.000000 0.000000 \n",
"4 0.000000 0.000000 0.000000 0.000000 0.000000 \n",
"5 0.000000 0.000000 0.000000 0.000000 0.000000 \n",
"6 0.001786 0.000000 0.001786 0.001786 0.001786 \n",
"7 0.000000 0.000000 0.000000 0.000000 0.000000 \n",
"8 0.000000 0.002632 0.002632 0.000000 0.005263 \n",
"9 0.000000 0.000000 0.003333 0.003333 0.000000 \n",
"10 0.000000 0.000000 0.000000 0.000000 0.007634 \n",
"\n",
" Soccer Stadium Social Club Soup Place South American Restaurant \\\n",
"0 0.000000 0.000000 0.000000 0.000000 \n",
"1 0.000000 0.000000 0.000000 0.001211 \n",
"2 0.000000 0.000000 0.000000 0.000000 \n",
"3 0.005181 0.000000 0.000000 0.000000 \n",
"4 0.000000 0.004167 0.000000 0.000000 \n",
"5 0.000000 0.000000 0.000000 0.000000 \n",
"6 0.000000 0.000000 0.000000 0.000000 \n",
"7 0.000000 0.000000 0.000000 0.000000 \n",
"8 0.000000 0.000000 0.000000 0.000000 \n",
"9 0.000000 0.000000 0.003333 0.000000 \n",
"10 0.007634 0.000000 0.000000 0.000000 \n",
"\n",
" Spa Spanish Restaurant Speakeasy Sporting Goods Shop Sports Bar \\\n",
"0 0.010929 0.000000 0.000000 0.008197 0.002732 \n",
"1 0.006053 0.001211 0.003632 0.004843 0.002421 \n",
"2 0.004032 0.000000 0.000000 0.000000 0.004032 \n",
"3 0.010363 0.000000 0.000000 0.015544 0.010363 \n",
"4 0.004167 0.000000 0.000000 0.000000 0.000000 \n",
"5 0.000000 0.000000 0.000000 0.020000 0.000000 \n",
"6 0.003571 0.000000 0.000000 0.007143 0.003571 \n",
"7 0.000000 0.000000 0.000000 0.000000 0.000000 \n",
"8 0.002632 0.000000 0.000000 0.002632 0.005263 \n",
"9 0.000000 0.000000 0.003333 0.000000 0.000000 \n",
"10 0.000000 0.000000 0.000000 0.007634 0.000000 \n",
"\n",
" Sports Club Sri Lankan Restaurant Stadium Stationery Store \\\n",
"0 0.000000 0.000000 0.000000 0.000000 \n",
"1 0.000000 0.000000 0.000000 0.000000 \n",
"2 0.000000 0.000000 0.000000 0.004032 \n",
"3 0.000000 0.000000 0.000000 0.000000 \n",
"4 0.000000 0.000000 0.000000 0.000000 \n",
"5 0.000000 0.000000 0.000000 0.000000 \n",
"6 0.001786 0.000000 0.000000 0.000000 \n",
"7 0.000000 0.000000 0.000000 0.000000 \n",
"8 0.000000 0.002632 0.000000 0.000000 \n",
"9 0.000000 0.000000 0.003333 0.000000 \n",
"10 0.000000 0.000000 0.000000 0.000000 \n",
"\n",
" Steakhouse Storage Facility Supermarket Supplement Shop \\\n",
"0 0.002732 0.000000 0.008197 0.000000 \n",
"1 0.018160 0.000000 0.004843 0.000000 \n",
"2 0.008065 0.000000 0.004032 0.000000 \n",
"3 0.000000 0.000000 0.015544 0.000000 \n",
"4 0.000000 0.000000 0.008333 0.008333 \n",
"5 0.000000 0.000000 0.000000 0.000000 \n",
"6 0.001786 0.001786 0.010714 0.001786 \n",
"7 0.000000 0.000000 0.020000 0.000000 \n",
"8 0.000000 0.000000 0.010526 0.000000 \n",
"9 0.000000 0.000000 0.006667 0.000000 \n",
"10 0.000000 0.000000 0.007634 0.000000 \n",
"\n",
" Sushi Restaurant Taco Place Tailor Shop Taiwanese Restaurant \\\n",
"0 0.043716 0.005464 0.000000 0.000000 \n",
"1 0.004843 0.001211 0.002421 0.001211 \n",
"2 0.016129 0.004032 0.000000 0.000000 \n",
"3 0.005181 0.000000 0.000000 0.000000 \n",
"4 0.016667 0.000000 0.000000 0.000000 \n",
"5 0.040000 0.000000 0.000000 0.000000 \n",
"6 0.010714 0.000000 0.000000 0.000000 \n",
"7 0.020000 0.000000 0.000000 0.000000 \n",
"8 0.002632 0.000000 0.000000 0.002632 \n",
"9 0.026667 0.003333 0.000000 0.000000 \n",
"10 0.000000 0.000000 0.000000 0.000000 \n",
"\n",
" Tanning Salon Tapas Restaurant Tea Room Tech Startup Tennis Court \\\n",
"0 0.000000 0.005464 0.013661 0.000000 0.002732 \n",
"1 0.000000 0.001211 0.010896 0.001211 0.000000 \n",
"2 0.000000 0.004032 0.008065 0.000000 0.000000 \n",
"3 0.000000 0.000000 0.000000 0.000000 0.000000 \n",
"4 0.004167 0.004167 0.000000 0.000000 0.000000 \n",
"5 0.000000 0.000000 0.000000 0.000000 0.000000 \n",
"6 0.000000 0.000000 0.001786 0.000000 0.003571 \n",
"7 0.000000 0.000000 0.000000 0.000000 0.000000 \n",
"8 0.000000 0.000000 0.000000 0.000000 0.002632 \n",
"9 0.000000 0.000000 0.010000 0.000000 0.000000 \n",
"10 0.000000 0.000000 0.000000 0.000000 0.000000 \n",
"\n",
" Thai Restaurant Theater Theme Restaurant Thrift / Vintage Store \\\n",
"0 0.019126 0.000000 0.000000 0.000000 \n",
"1 0.014528 0.012107 0.001211 0.001211 \n",
"2 0.008065 0.000000 0.000000 0.000000 \n",
"3 0.015544 0.000000 0.000000 0.000000 \n",
"4 0.008333 0.004167 0.000000 0.004167 \n",
"5 0.020000 0.000000 0.000000 0.000000 \n",
"6 0.003571 0.003571 0.000000 0.000000 \n",
"7 0.000000 0.020000 0.000000 0.000000 \n",
"8 0.007895 0.000000 0.000000 0.002632 \n",
"9 0.016667 0.006667 0.000000 0.003333 \n",
"10 0.015267 0.000000 0.000000 0.000000 \n",
"\n",
" Tibetan Restaurant Toy / Game Store Track Trail Train Station \\\n",
"0 0.000000 0.000000 0.005464 0.008197 0.000000 \n",
"1 0.000000 0.000000 0.001211 0.001211 0.004843 \n",
"2 0.000000 0.004032 0.000000 0.004032 0.000000 \n",
"3 0.000000 0.000000 0.000000 0.000000 0.000000 \n",
"4 0.000000 0.004167 0.000000 0.004167 0.000000 \n",
"5 0.000000 0.000000 0.000000 0.000000 0.000000 \n",
"6 0.000000 0.001786 0.000000 0.003571 0.001786 \n",
"7 0.000000 0.000000 0.000000 0.000000 0.000000 \n",
"8 0.000000 0.000000 0.000000 0.002632 0.002632 \n",
"9 0.003333 0.000000 0.000000 0.000000 0.000000 \n",
"10 0.000000 0.000000 0.000000 0.007634 0.015267 \n",
"\n",
" Turkish Restaurant Vegetarian / Vegan Restaurant Video Game Store \\\n",
"0 0.000000 0.019126 0.000000 \n",
"1 0.000000 0.014528 0.000000 \n",
"2 0.004032 0.004032 0.000000 \n",
"3 0.010363 0.000000 0.000000 \n",
"4 0.000000 0.000000 0.000000 \n",
"5 0.000000 0.000000 0.000000 \n",
"6 0.003571 0.000000 0.001786 \n",
"7 0.000000 0.020000 0.000000 \n",
"8 0.000000 0.002632 0.002632 \n",
"9 0.000000 0.006667 0.000000 \n",
"10 0.000000 0.000000 0.007634 \n",
"\n",
" Video Store Vietnamese Restaurant Warehouse Store Wine Bar Wine Shop \\\n",
"0 0.000000 0.008197 0.000000 0.008197 0.000000 \n",
"1 0.000000 0.003632 0.000000 0.003632 0.000000 \n",
"2 0.000000 0.004032 0.000000 0.000000 0.000000 \n",
"3 0.005181 0.000000 0.005181 0.000000 0.000000 \n",
"4 0.000000 0.000000 0.000000 0.000000 0.000000 \n",
"5 0.000000 0.000000 0.000000 0.000000 0.000000 \n",
"6 0.003571 0.014286 0.000000 0.000000 0.000000 \n",
"7 0.000000 0.000000 0.000000 0.000000 0.000000 \n",
"8 0.000000 0.010526 0.000000 0.000000 0.000000 \n",
"9 0.000000 0.010000 0.000000 0.003333 0.000000 \n",
"10 0.000000 0.000000 0.000000 0.000000 0.007634 \n",
"\n",
" Wings Joint Women's Store Yoga Studio \n",
"0 0.002732 0.000000 0.016393 \n",
"1 0.001211 0.000000 0.003632 \n",
"2 0.000000 0.000000 0.004032 \n",
"3 0.000000 0.000000 0.005181 \n",
"4 0.004167 0.000000 0.008333 \n",
"5 0.000000 0.000000 0.000000 \n",
"6 0.001786 0.001786 0.001786 \n",
"7 0.020000 0.000000 0.020000 \n",
"8 0.005263 0.000000 0.002632 \n",
"9 0.000000 0.000000 0.006667 \n",
"10 0.007634 0.007634 0.000000 "
]
},
"execution_count": 81,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"toronto_grouped = toronto_onehot.groupby('Borough').mean().reset_index()\n",
"toronto_grouped"
]
},
{
"cell_type": "code",
"execution_count": 82,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(11, 314)"
]
},
"execution_count": 82,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"toronto_grouped.shape"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's print each neighborhood along with the top 5 most common venues"
]
},
{
"cell_type": "code",
"execution_count": 84,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"----Central Toronto----\n",
" venue freq\n",
"0 Italian Restaurant 0.07\n",
"1 Coffee Shop 0.07\n",
"2 Café 0.06\n",
"3 Park 0.04\n",
"4 Sushi Restaurant 0.04\n",
"\n",
"\n",
"----Downtown Toronto----\n",
" venue freq\n",
"0 Coffee Shop 0.08\n",
"1 Café 0.07\n",
"2 Hotel 0.03\n",
"3 Restaurant 0.03\n",
"4 Gastropub 0.03\n",
"\n",
"\n",
"----East Toronto----\n",
" venue freq\n",
"0 Coffee Shop 0.06\n",
"1 Park 0.04\n",
"2 Pub 0.04\n",
"3 Greek Restaurant 0.04\n",
"4 Bakery 0.04\n",
"\n",
"\n",
"----East York----\n",
" venue freq\n",
"0 Coffee Shop 0.09\n",
"1 Café 0.04\n",
"2 Pizza Place 0.04\n",
"3 Greek Restaurant 0.03\n",
"4 Sandwich Place 0.03\n",
"\n",
"\n",
"----Etobicoke----\n",
" venue freq\n",
"0 Park 0.07\n",
"1 Pizza Place 0.06\n",
"2 Pharmacy 0.05\n",
"3 Coffee Shop 0.05\n",
"4 Grocery Store 0.04\n",
"\n",
"\n",
"----Mississauga----\n",
" venue freq\n",
"0 Coffee Shop 0.10\n",
"1 Middle Eastern Restaurant 0.06\n",
"2 Hotel 0.06\n",
"3 Chinese Restaurant 0.06\n",
"4 Sushi Restaurant 0.04\n",
"\n",
"\n",
"----North York----\n",
" venue freq\n",
"0 Coffee Shop 0.08\n",
"1 Pizza Place 0.04\n",
"2 Fast Food Restaurant 0.04\n",
"3 Park 0.04\n",
"4 Grocery Store 0.03\n",
"\n",
"\n",
"----Queen's Park----\n",
" venue freq\n",
"0 Coffee Shop 0.12\n",
"1 Park 0.04\n",
"2 Bookstore 0.04\n",
"3 Gastropub 0.04\n",
"4 Bubble Tea Shop 0.04\n",
"\n",
"\n",
"----Scarborough----\n",
" venue freq\n",
"0 Coffee Shop 0.07\n",
"1 Chinese Restaurant 0.07\n",
"2 Fast Food Restaurant 0.06\n",
"3 Pizza Place 0.05\n",
"4 Park 0.04\n",
"\n",
"\n",
"----West Toronto----\n",
" venue freq\n",
"0 Café 0.09\n",
"1 Coffee Shop 0.07\n",
"2 Bar 0.06\n",
"3 Bakery 0.05\n",
"4 Sushi Restaurant 0.03\n",
"\n",
"\n",
"----York----\n",
" venue freq\n",
"0 Pizza Place 0.08\n",
"1 Coffee Shop 0.08\n",
"2 Park 0.06\n",
"3 Grocery Store 0.04\n",
"4 Discount Store 0.04\n",
"\n",
"\n"
]
}
],
"source": [
"num_top_venues = 5\n",
"\n",
"for hood in toronto_grouped['Borough']:\n",
" print(\"----\"+hood+\"----\")\n",
" temp = toronto_grouped[toronto_grouped['Borough'] == hood].T.reset_index()\n",
" temp.columns = ['venue','freq']\n",
" temp = temp.iloc[1:]\n",
" temp['freq'] = temp['freq'].astype(float)\n",
" temp = temp.round({'freq': 2})\n",
" print(temp.sort_values('freq', ascending=False).reset_index(drop=True).head(num_top_venues))\n",
" print('\\n')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's put that into a pandas dataframe"
]
},
{
"cell_type": "code",
"execution_count": 85,
"metadata": {},
"outputs": [],
"source": [
"def return_most_common_venues(row, num_top_venues):\n",
" row_categories = row.iloc[1:]\n",
" row_categories_sorted = row_categories.sort_values(ascending=False)\n",
" \n",
" return row_categories_sorted.index.values[0:num_top_venues]"
]
},
{
"cell_type": "code",
"execution_count": 86,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Borough</th>\n",
" <th>1st Most Common Venue</th>\n",
" <th>2nd Most Common Venue</th>\n",
" <th>3rd Most Common Venue</th>\n",
" <th>4th Most Common Venue</th>\n",
" <th>5th Most Common Venue</th>\n",
" <th>6th Most Common Venue</th>\n",
" <th>7th Most Common Venue</th>\n",
" <th>8th Most Common Venue</th>\n",
" <th>9th Most Common Venue</th>\n",
" <th>10th Most Common Venue</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Central Toronto</td>\n",
" <td>Coffee Shop</td>\n",
" <td>Italian Restaurant</td>\n",
" <td>Café</td>\n",
" <td>Sushi Restaurant</td>\n",
" <td>Park</td>\n",
" <td>Pizza Place</td>\n",
" <td>Gym</td>\n",
" <td>Bakery</td>\n",
" <td>Japanese Restaurant</td>\n",
" <td>Grocery Store</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>Downtown Toronto</td>\n",
" <td>Coffee Shop</td>\n",
" <td>Café</td>\n",
" <td>Restaurant</td>\n",
" <td>Hotel</td>\n",
" <td>Gastropub</td>\n",
" <td>Park</td>\n",
" <td>Bakery</td>\n",
" <td>Japanese Restaurant</td>\n",
" <td>Italian Restaurant</td>\n",
" <td>American Restaurant</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>East Toronto</td>\n",
" <td>Coffee Shop</td>\n",
" <td>Bakery</td>\n",
" <td>Pub</td>\n",
" <td>Greek Restaurant</td>\n",
" <td>Park</td>\n",
" <td>Italian Restaurant</td>\n",
" <td>Café</td>\n",
" <td>Beach</td>\n",
" <td>Indian Restaurant</td>\n",
" <td>Pizza Place</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>East York</td>\n",
" <td>Coffee Shop</td>\n",
" <td>Pizza Place</td>\n",
" <td>Café</td>\n",
" <td>Brewery</td>\n",
" <td>Burger Joint</td>\n",
" <td>Greek Restaurant</td>\n",
" <td>Sandwich Place</td>\n",
" <td>Indian Restaurant</td>\n",
" <td>Bank</td>\n",
" <td>Skating Rink</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>Etobicoke</td>\n",
" <td>Park</td>\n",
" <td>Pizza Place</td>\n",
" <td>Coffee Shop</td>\n",
" <td>Pharmacy</td>\n",
" <td>Grocery Store</td>\n",
" <td>Bank</td>\n",
" <td>Sandwich Place</td>\n",
" <td>Italian Restaurant</td>\n",
" <td>Liquor Store</td>\n",
" <td>Discount Store</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Borough 1st Most Common Venue 2nd Most Common Venue \\\n",
"0 Central Toronto Coffee Shop Italian Restaurant \n",
"1 Downtown Toronto Coffee Shop Café \n",
"2 East Toronto Coffee Shop Bakery \n",
"3 East York Coffee Shop Pizza Place \n",
"4 Etobicoke Park Pizza Place \n",
"\n",
" 3rd Most Common Venue 4th Most Common Venue 5th Most Common Venue \\\n",
"0 Café Sushi Restaurant Park \n",
"1 Restaurant Hotel Gastropub \n",
"2 Pub Greek Restaurant Park \n",
"3 Café Brewery Burger Joint \n",
"4 Coffee Shop Pharmacy Grocery Store \n",
"\n",
" 6th Most Common Venue 7th Most Common Venue 8th Most Common Venue \\\n",
"0 Pizza Place Gym Bakery \n",
"1 Park Bakery Japanese Restaurant \n",
"2 Italian Restaurant Café Beach \n",
"3 Greek Restaurant Sandwich Place Indian Restaurant \n",
"4 Bank Sandwich Place Italian Restaurant \n",
"\n",
" 9th Most Common Venue 10th Most Common Venue \n",
"0 Japanese Restaurant Grocery Store \n",
"1 Italian Restaurant American Restaurant \n",
"2 Indian Restaurant Pizza Place \n",
"3 Bank Skating Rink \n",
"4 Liquor Store Discount Store "
]
},
"execution_count": 86,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"num_top_venues = 10\n",
"\n",
"indicators = ['st', 'nd', 'rd']\n",
"\n",
"# create columns according to number of top venues\n",
"columns = ['Borough']\n",
"for ind in np.arange(num_top_venues):\n",
" try:\n",
" columns.append('{}{} Most Common Venue'.format(ind+1, indicators[ind]))\n",
" except:\n",
" columns.append('{}th Most Common Venue'.format(ind+1))\n",
"\n",
"# create a new dataframe\n",
"boroughs_venues_sorted = pd.DataFrame(columns=columns)\n",
"boroughs_venues_sorted['Borough'] = toronto_grouped['Borough']\n",
"\n",
"for ind in np.arange(toronto_grouped.shape[0]):\n",
" boroughs_venues_sorted.iloc[ind, 1:] = return_most_common_venues(toronto_grouped.iloc[ind, :], num_top_venues)\n",
"\n",
"boroughs_venues_sorted.head()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.8"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment