Skip to content

Instantly share code, notes, and snippets.

@jessekafor
Created September 1, 2020 18:11
Show Gist options
  • Save jessekafor/bbe756ffaf7ee2a0e73ff26003e8f3b4 to your computer and use it in GitHub Desktop.
Save jessekafor/bbe756ffaf7ee2a0e73ff26003e8f3b4 to your computer and use it in GitHub Desktop.
Created on Skills Network Labs
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Introduction"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The objective is to look at the different venues between University of Chicago and Georgia Institute of Technology (Georgia Tech) since these are universities people as myself would want to attend for a degree. Both locations have good reputations as public institutions so the problem to solve was to find out what venues are available in the areas that does not require long travel. Many people who decide to stay near a campus ride a bike or use there four legs as a mode of transportation and need close by locations for daily activities and community.\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"To get started, before even running any code first library modules had to be imported."
]
},
{
"cell_type": "code",
"execution_count": 37,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Collecting package metadata (current_repodata.json): done\n",
"Solving environment: done\n",
"\n",
"\n",
"==> WARNING: A newer version of conda exists. <==\n",
" current version: 4.8.3\n",
" latest version: 4.8.4\n",
"\n",
"Please update conda by running\n",
"\n",
" $ conda update -n base -c defaults conda\n",
"\n",
"\n",
"\n",
"# All requested packages already installed.\n",
"\n",
"Collecting package metadata (current_repodata.json): done\n",
"Solving environment: done\n",
"\n",
"\n",
"==> WARNING: A newer version of conda exists. <==\n",
" current version: 4.8.3\n",
" latest version: 4.8.4\n",
"\n",
"Please update conda by running\n",
"\n",
" $ conda update -n base -c defaults conda\n",
"\n",
"\n",
"\n",
"# All requested packages already installed.\n",
"\n",
"Libraries Imported\n"
]
}
],
"source": [
"import pandas as pd\n",
"import numpy as np\n",
"import requests\n",
"\n",
"!conda install -c conda-forge geopy --yes\n",
"import geopy as geopy\n",
"from geopy.geocoders import Nominatim \n",
"\n",
"# Matplotlib and associated plotting modules\n",
"import matplotlib.cm as cm\n",
"import matplotlib.colors as colors\n",
"\n",
"!conda install -c conda-forge folium=0.5.0 --yes\n",
"import folium # map rendering library\n",
"\n",
"print(\"Libraries Imported\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Data Collection"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The data for the venues was retrieved using the Foursquare Places API. The Places API offers real-time access to Foursquare's global database of rich venue data and user content to power your location-based experiences."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Foursquare Credentials"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Credentials:\n",
"CLIENT_ID: MWBMLLHDCHCNOFVSO405PNGLHJP0EW0MAD1MEEO0SKMOFSJX\n",
"CLIENT_SECRET:3J3OZ5F4I5WW5OTRZOOWNMREHZEOANOANIOUC3VG2AN5DIM3\n"
]
}
],
"source": [
"CLIENT_ID = 'MWBMLLHDCHCNOFVSO405PNGLHJP0EW0MAD1MEEO0SKMOFSJX'\n",
"CLIENT_SECRET = '3J3OZ5F4I5WW5OTRZOOWNMREHZEOANOANIOUC3VG2AN5DIM3'\n",
"VERSION = '20200825'\n",
"\n",
"print('Credentials:')\n",
"print('CLIENT_ID: ' + CLIENT_ID)\n",
"print('CLIENT_SECRET:' + CLIENT_SECRET)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Coordinates"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The addresses from both institutions were retrieved from Google Knowledge Graph through search. The Geocoder module was used to get the coordinates for both institutions."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Get nearby venues by Chicago - University of Chicago\n",
"Address: 5801 S Ellis Ave, Chicago, IL 60637"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"The geographical coordinate of University of Chicago are 41.784977, -87.5905237123017.\n"
]
}
],
"source": [
"address = \"5801 S Ellis Ave, Chicago, IL 60637\"\n",
"\n",
"geolocator = Nominatim(user_agent=\"ca_explorer\")\n",
"location = geolocator.geocode(address)\n",
"chi_latitude = location.latitude\n",
"chi_longitude = location.longitude\n",
"print('The geographical coordinate of University of Chicago are {}, {}.'.format(chi_latitude, chi_longitude))"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div style=\"width:100%;\"><div style=\"position:relative;width:100%;height:0;padding-bottom:60%;\"><span style=\"color:#565656\">Make this Notebook Trusted to load map: File -> Trust Notebook</span><iframe src=\"about:blank\" style=\"position:absolute;width:100%;height:100%;left:0;top:0;border:none !important;\" data-html=PCFET0NUWVBFIGh0bWw+CjxoZWFkPiAgICAKICAgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPgogICAgPHNjcmlwdD5MX1BSRUZFUl9DQU5WQVMgPSBmYWxzZTsgTF9OT19UT1VDSCA9IGZhbHNlOyBMX0RJU0FCTEVfM0QgPSBmYWxzZTs8L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2FqYXguZ29vZ2xlYXBpcy5jb20vYWpheC9saWJzL2pxdWVyeS8xLjExLjEvanF1ZXJ5Lm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvanMvYm9vdHN0cmFwLm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvTGVhZmxldC5hd2Vzb21lLW1hcmtlcnMvMi4wLjIvbGVhZmxldC5hd2Vzb21lLW1hcmtlcnMuanMiPjwvc2NyaXB0PgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9jc3MvYm9vdHN0cmFwLm1pbi5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvY3NzL2Jvb3RzdHJhcC10aGVtZS5taW4uY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vbWF4Y2RuLmJvb3RzdHJhcGNkbi5jb20vZm9udC1hd2Vzb21lLzQuNi4zL2Nzcy9mb250LWF3ZXNvbWUubWluLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9MZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy8yLjAuMi9sZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9yYXdnaXQuY29tL3B5dGhvbi12aXN1YWxpemF0aW9uL2ZvbGl1bS9tYXN0ZXIvZm9saXVtL3RlbXBsYXRlcy9sZWFmbGV0LmF3ZXNvbWUucm90YXRlLmNzcyIvPgogICAgPHN0eWxlPmh0bWwsIGJvZHkge3dpZHRoOiAxMDAlO2hlaWdodDogMTAwJTttYXJnaW46IDA7cGFkZGluZzogMDt9PC9zdHlsZT4KICAgIDxzdHlsZT4jbWFwIHtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtyaWdodDowO2xlZnQ6MDt9PC9zdHlsZT4KICAgIAogICAgICAgICAgICA8c3R5bGU+ICNtYXBfNjE2NzU1OTNmMjBiNDJjMWJmYTBhYzBmOTg3YzRhNzQgewogICAgICAgICAgICAgICAgcG9zaXRpb24gOiByZWxhdGl2ZTsKICAgICAgICAgICAgICAgIHdpZHRoIDogMTAwLjAlOwogICAgICAgICAgICAgICAgaGVpZ2h0OiAxMDAuMCU7CiAgICAgICAgICAgICAgICBsZWZ0OiAwLjAlOwogICAgICAgICAgICAgICAgdG9wOiAwLjAlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICA8L3N0eWxlPgogICAgICAgIAo8L2hlYWQ+Cjxib2R5PiAgICAKICAgIAogICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb2xpdW0tbWFwIiBpZD0ibWFwXzYxNjc1NTkzZjIwYjQyYzFiZmEwYWMwZjk4N2M0YTc0IiA+PC9kaXY+CiAgICAgICAgCjwvYm9keT4KPHNjcmlwdD4gICAgCiAgICAKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGJvdW5kcyA9IG51bGw7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcF82MTY3NTU5M2YyMGI0MmMxYmZhMGFjMGY5ODdjNGE3NCA9IEwubWFwKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21hcF82MTY3NTU5M2YyMGI0MmMxYmZhMGFjMGY5ODdjNGE3NCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y2VudGVyOiBbNDEuNzg0OTc3LC04Ny41OTA1MjM3MTIzMDE3XSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpvb206IDEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4Qm91bmRzOiBib3VuZHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXllcnM6IFtdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ybGRDb3B5SnVtcDogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcnM6IEwuQ1JTLkVQU0czODU3CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgdGlsZV9sYXllcl81Yzk1MGQ5MWM3YjA0ZDM2YTFlNWY4NTcwNzdkZjY0YiA9IEwudGlsZUxheWVyKAogICAgICAgICAgICAgICAgJ2h0dHBzOi8ve3N9LnRpbGUub3BlbnN0cmVldG1hcC5vcmcve3p9L3t4fS97eX0ucG5nJywKICAgICAgICAgICAgICAgIHsKICAiYXR0cmlidXRpb24iOiBudWxsLAogICJkZXRlY3RSZXRpbmEiOiBmYWxzZSwKICAibWF4Wm9vbSI6IDE4LAogICJtaW5ab29tIjogMSwKICAibm9XcmFwIjogZmFsc2UsCiAgInN1YmRvbWFpbnMiOiAiYWJjIgp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF82MTY3NTU5M2YyMGI0MmMxYmZhMGFjMGY5ODdjNGE3NCk7CiAgICAgICAgCjwvc2NyaXB0Pg== onload=\"this.contentDocument.open();this.contentDocument.write(atob(this.getAttribute('data-html')));this.contentDocument.close();\" allowfullscreen webkitallowfullscreen mozallowfullscreen></iframe></div></div>"
],
"text/plain": [
"<folium.folium.Map at 0x7fdc7830ccf8>"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"#Map of Chicago using latitude and longitude values\n",
"map_chicago = folium.Map(location=[chi_latitude, chi_longitude], zoom_start=10)\n",
"map_chicago"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Get nearby venues by Atlanta - Georgia Institute of Technology\n",
"Address: North Ave NW, Atlanta, GA 30332"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"The geographical coordinates of Georgia Tech university are 33.7713526, -84.396345.\n"
]
}
],
"source": [
"address = \"North Ave NW, Atlanta, GA 30332\"\n",
"\n",
"geolocator = Nominatim(user_agent=\"ca_explorer\")\n",
"location = geolocator.geocode(address)\n",
"atl_latitude = location.latitude\n",
"atl_longitude = location.longitude\n",
"print('The geographical coordinates of Georgia Tech are {}, {}.'.format(atl_latitude, atl_longitude))"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div style=\"width:100%;\"><div style=\"position:relative;width:100%;height:0;padding-bottom:60%;\"><span style=\"color:#565656\">Make this Notebook Trusted to load map: File -> Trust Notebook</span><iframe src=\"about:blank\" style=\"position:absolute;width:100%;height:100%;left:0;top:0;border:none !important;\" data-html=PCFET0NUWVBFIGh0bWw+CjxoZWFkPiAgICAKICAgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPgogICAgPHNjcmlwdD5MX1BSRUZFUl9DQU5WQVMgPSBmYWxzZTsgTF9OT19UT1VDSCA9IGZhbHNlOyBMX0RJU0FCTEVfM0QgPSBmYWxzZTs8L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2FqYXguZ29vZ2xlYXBpcy5jb20vYWpheC9saWJzL2pxdWVyeS8xLjExLjEvanF1ZXJ5Lm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvanMvYm9vdHN0cmFwLm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvTGVhZmxldC5hd2Vzb21lLW1hcmtlcnMvMi4wLjIvbGVhZmxldC5hd2Vzb21lLW1hcmtlcnMuanMiPjwvc2NyaXB0PgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9jc3MvYm9vdHN0cmFwLm1pbi5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvY3NzL2Jvb3RzdHJhcC10aGVtZS5taW4uY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vbWF4Y2RuLmJvb3RzdHJhcGNkbi5jb20vZm9udC1hd2Vzb21lLzQuNi4zL2Nzcy9mb250LWF3ZXNvbWUubWluLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9MZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy8yLjAuMi9sZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9yYXdnaXQuY29tL3B5dGhvbi12aXN1YWxpemF0aW9uL2ZvbGl1bS9tYXN0ZXIvZm9saXVtL3RlbXBsYXRlcy9sZWFmbGV0LmF3ZXNvbWUucm90YXRlLmNzcyIvPgogICAgPHN0eWxlPmh0bWwsIGJvZHkge3dpZHRoOiAxMDAlO2hlaWdodDogMTAwJTttYXJnaW46IDA7cGFkZGluZzogMDt9PC9zdHlsZT4KICAgIDxzdHlsZT4jbWFwIHtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtyaWdodDowO2xlZnQ6MDt9PC9zdHlsZT4KICAgIAogICAgICAgICAgICA8c3R5bGU+ICNtYXBfNzAyN2VmNWFkZGM3NDc2NDgzY2VmZTZlYWRjNTBmNjQgewogICAgICAgICAgICAgICAgcG9zaXRpb24gOiByZWxhdGl2ZTsKICAgICAgICAgICAgICAgIHdpZHRoIDogMTAwLjAlOwogICAgICAgICAgICAgICAgaGVpZ2h0OiAxMDAuMCU7CiAgICAgICAgICAgICAgICBsZWZ0OiAwLjAlOwogICAgICAgICAgICAgICAgdG9wOiAwLjAlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICA8L3N0eWxlPgogICAgICAgIAo8L2hlYWQ+Cjxib2R5PiAgICAKICAgIAogICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb2xpdW0tbWFwIiBpZD0ibWFwXzcwMjdlZjVhZGRjNzQ3NjQ4M2NlZmU2ZWFkYzUwZjY0IiA+PC9kaXY+CiAgICAgICAgCjwvYm9keT4KPHNjcmlwdD4gICAgCiAgICAKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGJvdW5kcyA9IG51bGw7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcF83MDI3ZWY1YWRkYzc0NzY0ODNjZWZlNmVhZGM1MGY2NCA9IEwubWFwKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21hcF83MDI3ZWY1YWRkYzc0NzY0ODNjZWZlNmVhZGM1MGY2NCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y2VudGVyOiBbMzMuNzcxMzUyNiwtODQuMzk2MzQ1XSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpvb206IDEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4Qm91bmRzOiBib3VuZHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXllcnM6IFtdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ybGRDb3B5SnVtcDogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcnM6IEwuQ1JTLkVQU0czODU3CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgdGlsZV9sYXllcl82ZDc1YmM0NzRiN2Q0NWU0OWE3MGZjMDY2YWYxYzNhYyA9IEwudGlsZUxheWVyKAogICAgICAgICAgICAgICAgJ2h0dHBzOi8ve3N9LnRpbGUub3BlbnN0cmVldG1hcC5vcmcve3p9L3t4fS97eX0ucG5nJywKICAgICAgICAgICAgICAgIHsKICAiYXR0cmlidXRpb24iOiBudWxsLAogICJkZXRlY3RSZXRpbmEiOiBmYWxzZSwKICAibWF4Wm9vbSI6IDE4LAogICJtaW5ab29tIjogMSwKICAibm9XcmFwIjogZmFsc2UsCiAgInN1YmRvbWFpbnMiOiAiYWJjIgp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83MDI3ZWY1YWRkYzc0NzY0ODNjZWZlNmVhZGM1MGY2NCk7CiAgICAgICAgCjwvc2NyaXB0Pg== onload=\"this.contentDocument.open();this.contentDocument.write(atob(this.getAttribute('data-html')));this.contentDocument.close();\" allowfullscreen webkitallowfullscreen mozallowfullscreen></iframe></div></div>"
],
"text/plain": [
"<folium.folium.Map at 0x7f232e05e198>"
]
},
"execution_count": 17,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"#Map of Atlanta using latitude and longitude values\n",
"map_atlanta = folium.Map(location=[atl_latitude, atl_longitude], zoom_start=10)\n",
"map_atlanta"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Explore Venues "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
" At first I reduced the radius and then increased it to 500 in order to generate enough venues nearby the universities. The campus size of University of Chicago is 217 acres and as for Georgia Institute of Technology (Georgia Tech), its almost twice as large with over 400 acres according to Google's Knowledge Graph. I completely forgot how large universities can be so this made sense to extend the radius to an appropriate size (500). Even within a 500 radius of the area there was only 13 venue listings nearby the University of Chicago and 17 nearby Georgia Institute of Technology (Georgia Tech). I did set the limit of venues to 100 although the cap was not necessary after seeing that not many locations were not available from either institution."
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"{'meta': {'code': 200, 'requestId': '5f4e60c482a8164a55496de5'},\n",
" 'response': {'headerLocation': 'Woodlawn',\n",
" 'headerFullLocation': 'Woodlawn, Chicago',\n",
" 'headerLocationGranularity': 'neighborhood',\n",
" 'totalResults': 16,\n",
" 'suggestedBounds': {'ne': {'lat': 41.7894770045, 'lng': -87.58449997727499},\n",
" 'sw': {'lat': 41.780476995499995, 'lng': -87.59654744732842}},\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': '594ac600419a9e72144fd6a7',\n",
" 'name': 'Build Coffee',\n",
" 'location': {'address': '6100 S Blackstone Ave',\n",
" 'lat': 41.78428847865535,\n",
" 'lng': -87.59041927423924,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 41.78428847865535,\n",
" 'lng': -87.59041927423924},\n",
" {'label': 'entrance', 'lat': 41.784157, 'lng': -87.590381}],\n",
" 'distance': 77,\n",
" 'postalCode': '60637',\n",
" 'cc': 'US',\n",
" 'city': 'Chicago',\n",
" 'state': 'IL',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['6100 S Blackstone Ave',\n",
" 'Chicago, IL 60637',\n",
" 'United States']},\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-594ac600419a9e72144fd6a7-0'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '518e7b9a498e001fc1a68809',\n",
" 'name': \"61st Street Farmers' Market\",\n",
" 'location': {'address': '61st between Dorchester and Blackstone',\n",
" 'lat': 41.784296089572855,\n",
" 'lng': -87.59079036498159,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 41.784296089572855,\n",
" 'lng': -87.59079036498159}],\n",
" 'distance': 78,\n",
" 'cc': 'US',\n",
" 'city': 'Chicago',\n",
" 'state': 'IL',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['61st between Dorchester and Blackstone',\n",
" 'Chicago, IL',\n",
" 'United States']},\n",
" 'categories': [{'id': '50be8ee891d4fa8dcc7199a7',\n",
" 'name': 'Market',\n",
" 'pluralName': 'Markets',\n",
" 'shortName': 'Market',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/shops/market_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-518e7b9a498e001fc1a68809-1'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '4c3f6767ce54e21e4301081a',\n",
" 'name': 'Midway Plaisance Park',\n",
" 'location': {'address': '1130 Midway Plaisance',\n",
" 'crossStreet': 'East 59',\n",
" 'lat': 41.786525766685706,\n",
" 'lng': -87.59445752907632,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 41.786525766685706,\n",
" 'lng': -87.59445752907632}],\n",
" 'distance': 369,\n",
" 'postalCode': '60637',\n",
" 'cc': 'US',\n",
" 'city': 'Chicago',\n",
" 'state': 'IL',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['1130 Midway Plaisance (East 59)',\n",
" 'Chicago, IL 60637',\n",
" 'United States']},\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-4c3f6767ce54e21e4301081a-2'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '4f191ac9e4b099f9dc3cfcf0',\n",
" 'name': 'University of Chicago @ Midway Plaisance',\n",
" 'location': {'address': '60th & Dorchester',\n",
" 'lat': 41.787751302023764,\n",
" 'lng': -87.5887820041004,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 41.787751302023764,\n",
" 'lng': -87.5887820041004}],\n",
" 'distance': 340,\n",
" 'postalCode': '60637',\n",
" 'cc': 'US',\n",
" 'city': 'Chicago',\n",
" 'state': 'IL',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['60th & Dorchester',\n",
" 'Chicago, IL 60637',\n",
" 'United States']},\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-4f191ac9e4b099f9dc3cfcf0-3'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '4e67c9ea81dcaba7cca667a2',\n",
" 'name': \"B'Gabs Goodies\",\n",
" 'location': {'address': '6100 S Blackstone Ave',\n",
" 'lat': 41.78424509912927,\n",
" 'lng': -87.5903719551618,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 41.78424509912927,\n",
" 'lng': -87.5903719551618}],\n",
" 'distance': 82,\n",
" 'postalCode': '60637',\n",
" 'cc': 'US',\n",
" 'city': 'Chicago',\n",
" 'state': 'IL',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['6100 S Blackstone Ave',\n",
" 'Chicago, IL 60637',\n",
" 'United States']},\n",
" 'categories': [{'id': '4bf58dd8d48988d1f9941735',\n",
" 'name': 'Food & Drink Shop',\n",
" 'pluralName': 'Food & Drink Shops',\n",
" 'shortName': 'Food & Drink',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/shops/foodanddrink_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-4e67c9ea81dcaba7cca667a2-4'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '4bc5f37ed35d9c74badfe13a',\n",
" 'name': 'Plum Cafe at Chicago Press Building',\n",
" 'location': {'address': '1427 E 60th St',\n",
" 'crossStreet': 'Blackstone',\n",
" 'lat': 41.786028,\n",
" 'lng': -87.59003496666666,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 41.786028,\n",
" 'lng': -87.59003496666666},\n",
" {'label': 'entrance', 'lat': 41.785884, 'lng': -87.590542}],\n",
" 'distance': 123,\n",
" 'postalCode': '60637',\n",
" 'cc': 'US',\n",
" 'city': 'Chicago',\n",
" 'state': 'IL',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['1427 E 60th St (Blackstone)',\n",
" 'Chicago, IL 60637',\n",
" 'United States']},\n",
" 'categories': [{'id': '4bf58dd8d48988d16d941735',\n",
" 'name': 'Café',\n",
" 'pluralName': 'Cafés',\n",
" 'shortName': 'Café',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/food/cafe_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-4bc5f37ed35d9c74badfe13a-5'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '5208e5be498ec4bb24440e34',\n",
" 'name': 'Jackson Towers Fitness',\n",
" 'location': {'address': '60th & Harper',\n",
" 'lat': 41.784878907879474,\n",
" 'lng': -87.58879937037533,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 41.784878907879474,\n",
" 'lng': -87.58879937037533}],\n",
" 'distance': 143,\n",
" 'postalCode': '60637',\n",
" 'cc': 'US',\n",
" 'city': 'Chicago',\n",
" 'state': 'IL',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['60th & Harper',\n",
" 'Chicago, IL 60637',\n",
" 'United States']},\n",
" 'categories': [{'id': '4bf58dd8d48988d175941735',\n",
" 'name': 'Gym / Fitness Center',\n",
" 'pluralName': 'Gyms or Fitness Centers',\n",
" 'shortName': 'Gym / Fitness',\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-5208e5be498ec4bb24440e34-6'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '4b18688df964a5204fd223e3',\n",
" 'name': 'Metra - 59th St (University of Chicago)',\n",
" 'location': {'address': '59th St',\n",
" 'crossStreet': 'at Harper Ave',\n",
" 'lat': 41.787728868561125,\n",
" 'lng': -87.588788713734,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 41.787728868561125,\n",
" 'lng': -87.588788713734}],\n",
" 'distance': 338,\n",
" 'postalCode': '60637',\n",
" 'cc': 'US',\n",
" 'city': 'Chicago',\n",
" 'state': 'IL',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['59th St (at Harper Ave)',\n",
" 'Chicago, IL 60637',\n",
" 'United States']},\n",
" 'categories': [{'id': '4bf58dd8d48988d129951735',\n",
" 'name': 'Train Station',\n",
" 'pluralName': 'Train Stations',\n",
" 'shortName': 'Train Station',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/travel/trainstation_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-4b18688df964a5204fd223e3-7'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '518d83c3498ef47c1a555894',\n",
" 'name': 'Jackson Park Track & Soccer Field',\n",
" 'location': {'address': '6100 S Stony Island Ave',\n",
" 'lat': 41.783367999999996,\n",
" 'lng': -87.58680600000001,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 41.783367999999996,\n",
" 'lng': -87.58680600000001},\n",
" {'label': 'entrance', 'lat': 41.783612, 'lng': -87.586744}],\n",
" 'distance': 356,\n",
" 'postalCode': '60637',\n",
" 'cc': 'US',\n",
" 'city': 'Chicago',\n",
" 'state': 'IL',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['6100 S Stony Island Ave',\n",
" 'Chicago, IL 60637',\n",
" 'United States']},\n",
" 'categories': [{'id': '4cce455aebf7b749d5e191f5',\n",
" 'name': 'Soccer Field',\n",
" 'pluralName': 'Soccer Fields',\n",
" 'shortName': 'Soccer Field',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/arts_entertainment/stadium_soccer_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-518d83c3498ef47c1a555894-8'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '4e5d4dec31519cd0f266871a',\n",
" 'name': 'Tiffin Cafe',\n",
" 'location': {'address': '1414 E 59th St',\n",
" 'lat': 41.7882194519043,\n",
" 'lng': -87.5909652709961,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 41.7882194519043,\n",
" 'lng': -87.5909652709961}],\n",
" 'distance': 362,\n",
" 'postalCode': '60637',\n",
" 'cc': 'US',\n",
" 'city': 'Chicago',\n",
" 'state': 'IL',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['1414 E 59th St',\n",
" 'Chicago, IL 60637',\n",
" 'United States']},\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-4e5d4dec31519cd0f266871a-9'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '504412dd222f63cf8739b2eb',\n",
" 'name': 'International House at the University of Chicago',\n",
" 'location': {'address': '1414 E 59th St',\n",
" 'lat': 41.78824,\n",
" 'lng': -87.590804,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 41.78824,\n",
" 'lng': -87.590804}],\n",
" 'distance': 363,\n",
" 'postalCode': '60637',\n",
" 'cc': 'US',\n",
" 'city': 'Chicago',\n",
" 'state': 'IL',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['1414 E 59th St',\n",
" 'Chicago, IL 60637',\n",
" 'United States']},\n",
" 'categories': [{'id': '5032792091d4c4b30a586d5c',\n",
" 'name': 'Concert Hall',\n",
" 'pluralName': 'Concert Halls',\n",
" 'shortName': 'Concert Hall',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/arts_entertainment/musicvenue_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-504412dd222f63cf8739b2eb-10'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '56439c29cd109915f7fa2fc2',\n",
" 'name': 'Divvy Station',\n",
" 'location': {'address': '1607 E 59th St',\n",
" 'crossStreet': 'Harper Ave & 59th St',\n",
" 'lat': 41.78794281,\n",
" 'lng': -87.58831517,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 41.78794281,\n",
" 'lng': -87.58831517}],\n",
" 'distance': 377,\n",
" 'cc': 'US',\n",
" 'city': 'Chicago',\n",
" 'state': 'IL',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['1607 E 59th St (Harper Ave & 59th St)',\n",
" 'Chicago, IL',\n",
" 'United States']},\n",
" 'categories': [{'id': '4e4c9077bd41f78e849722f9',\n",
" 'name': 'Bike Rental / Bike Share',\n",
" 'pluralName': 'Bike Rentals / Bike Shares',\n",
" 'shortName': 'Bike',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/shops/bikeshop_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-56439c29cd109915f7fa2fc2-11'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '4e52c89962840c1260e1e164',\n",
" 'name': 'Huckleberry Park',\n",
" 'location': {'address': '6200 S Kimbark Ave',\n",
" 'crossStreet': 'at 62nd St.',\n",
" 'lat': 41.78232103190902,\n",
" 'lng': -87.59480953216553,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 41.78232103190902,\n",
" 'lng': -87.59480953216553}],\n",
" 'distance': 462,\n",
" 'postalCode': '60637',\n",
" 'cc': 'US',\n",
" 'city': 'Chicago',\n",
" 'state': 'IL',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['6200 S Kimbark Ave (at 62nd St.)',\n",
" 'Chicago, IL 60637',\n",
" 'United States']},\n",
" 'categories': [{'id': '4bf58dd8d48988d1e7941735',\n",
" 'name': 'Playground',\n",
" 'pluralName': 'Playgrounds',\n",
" 'shortName': 'Playground',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/parks_outdoors/playground_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-4e52c89962840c1260e1e164-12'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '5164a455e4b061c025433e20',\n",
" 'name': 'CTA Bus Stop 1513',\n",
" 'location': {'lat': 41.787987,\n",
" 'lng': -87.58656,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 41.787987,\n",
" 'lng': -87.58656}],\n",
" 'distance': 469,\n",
" 'cc': 'US',\n",
" 'city': 'Chicago',\n",
" 'state': 'IL',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['Chicago, IL', 'United States']},\n",
" 'categories': [{'id': '4bf58dd8d48988d1fe931735',\n",
" 'name': 'Bus Station',\n",
" 'pluralName': 'Bus Stations',\n",
" 'shortName': 'Bus Station',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/travel/busstation_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-5164a455e4b061c025433e20-13'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '5aaff0bac58ed74dce15da95',\n",
" 'name': \"Leon's Barbecue\",\n",
" 'location': {'address': '63rd and Harper',\n",
" 'lat': 41.780854,\n",
" 'lng': -87.588451,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 41.780854,\n",
" 'lng': -87.588451}],\n",
" 'distance': 490,\n",
" 'postalCode': '60637',\n",
" 'cc': 'US',\n",
" 'city': 'Chicago',\n",
" 'state': 'IL',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['63rd and Harper',\n",
" 'Chicago, IL 60637',\n",
" 'United States']},\n",
" 'categories': [{'id': '4bf58dd8d48988d1df931735',\n",
" 'name': 'BBQ Joint',\n",
" 'pluralName': 'BBQ Joints',\n",
" 'shortName': 'BBQ',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/food/bbqalt_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-5aaff0bac58ed74dce15da95-14'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '4f324e9d19836c91c7caceed',\n",
" 'name': 'Tres Original Pancakes',\n",
" 'location': {'address': '1528 E 63rd St',\n",
" 'lat': 41.78086853027344,\n",
" 'lng': -87.58818817138672,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 41.78086853027344,\n",
" 'lng': -87.58818817138672}],\n",
" 'distance': 496,\n",
" 'postalCode': '60637',\n",
" 'cc': 'US',\n",
" 'city': 'Chicago',\n",
" 'state': 'IL',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['1528 E 63rd St',\n",
" 'Chicago, IL 60637',\n",
" 'United States']},\n",
" 'categories': [{'id': '4d4b7105d754a06374d81259',\n",
" 'name': 'Food',\n",
" 'pluralName': 'Food',\n",
" 'shortName': 'Food',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/food/default_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-4f324e9d19836c91c7caceed-15'}]}]}}"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"#Limit 100\n",
"#Radius 500 miles\n",
"\n",
"LIMIT = 100 \n",
"radius = 500\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",
" chi_latitude, \n",
" chi_longitude, \n",
" radius, \n",
" LIMIT)\n",
"\n",
"# get the result to a json file\n",
"chi_results = requests.get(url).json()\n",
"chi_results"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Explore Venues nearby Georgia Institute of Technology"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"{'meta': {'code': 200, 'requestId': '5f4e6119af5b017ac062e1db'},\n",
" 'response': {'suggestedFilters': {'header': 'Tap to show:',\n",
" 'filters': [{'name': 'Open now', 'key': 'openNow'}]},\n",
" 'headerLocation': 'Marietta Street Artery',\n",
" 'headerFullLocation': 'Marietta Street Artery, Atlanta',\n",
" 'headerLocationGranularity': 'neighborhood',\n",
" 'totalResults': 18,\n",
" 'suggestedBounds': {'ne': {'lat': 33.7758526045, 'lng': -84.39094164975738},\n",
" 'sw': {'lat': 33.7668525955, 'lng': -84.40174835024261}},\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': '555639d2498ea5420402bccd',\n",
" 'name': 'Coca-Cola Mainstreet @ AOC',\n",
" 'location': {'address': '1 Coca Cola Plz NW',\n",
" 'lat': 33.7709799841634,\n",
" 'lng': -84.39803676785081,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 33.7709799841634,\n",
" 'lng': -84.39803676785081}],\n",
" 'distance': 161,\n",
" 'postalCode': '30313',\n",
" 'cc': 'US',\n",
" 'city': 'Atlanta',\n",
" 'state': 'GA',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['1 Coca Cola Plz NW',\n",
" 'Atlanta, GA 30313',\n",
" 'United States']},\n",
" 'categories': [{'id': '4bf58dd8d48988d14e941735',\n",
" 'name': 'American Restaurant',\n",
" 'pluralName': 'American Restaurants',\n",
" 'shortName': 'American',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/food/default_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-555639d2498ea5420402bccd-0'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '512e4185e0e26a825ba3c825',\n",
" 'name': 'Highland Bakery',\n",
" 'location': {'address': '225 North Ave NW',\n",
" 'lat': 33.77264610481115,\n",
" 'lng': -84.39458549022675,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 33.77264610481115,\n",
" 'lng': -84.39458549022675}],\n",
" 'distance': 217,\n",
" 'postalCode': '30313',\n",
" 'cc': 'US',\n",
" 'city': 'Atlanta',\n",
" 'state': 'GA',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['225 North Ave NW',\n",
" 'Atlanta, GA 30313',\n",
" 'United States']},\n",
" 'categories': [{'id': '4bf58dd8d48988d16a941735',\n",
" 'name': 'Bakery',\n",
" 'pluralName': 'Bakeries',\n",
" 'shortName': 'Bakery',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/food/bakery_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'delivery': {'id': '1490525',\n",
" 'url': 'https://www.grubhub.com/restaurant/highland-bakery-224-uncle-heinie-way-northwest-atlanta/1490525?affiliate=1131&utm_source=foursquare-affiliate-network&utm_medium=affiliate&utm_campaign=1131&utm_content=1490525',\n",
" 'provider': {'name': 'grubhub',\n",
" 'icon': {'prefix': 'https://fastly.4sqi.net/img/general/cap/',\n",
" 'sizes': [40, 50],\n",
" 'name': '/delivery_provider_grubhub_20180129.png'}}},\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-512e4185e0e26a825ba3c825-1'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '4b6a8415f964a5206ad72be3',\n",
" 'name': 'Ferst Center For The Arts',\n",
" 'location': {'address': '349 North Ave NW',\n",
" 'crossStreet': 'Georgia Tech',\n",
" 'lat': 33.774819876519174,\n",
" 'lng': -84.39919356481722,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 33.774819876519174,\n",
" 'lng': -84.39919356481722}],\n",
" 'distance': 467,\n",
" 'postalCode': '30332',\n",
" 'cc': 'US',\n",
" 'city': 'Atlanta',\n",
" 'state': 'GA',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['349 North Ave NW (Georgia Tech)',\n",
" 'Atlanta, GA 30332',\n",
" 'United States']},\n",
" 'categories': [{'id': '4bf58dd8d48988d1ac941735',\n",
" 'name': 'College Theater',\n",
" 'pluralName': 'College Theaters',\n",
" 'shortName': 'Theater',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/arts_entertainment/performingarts_theater_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-4b6a8415f964a5206ad72be3-2'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '4b9ad39ef964a52097d935e3',\n",
" 'name': 'Hampton Inn by Hilton',\n",
" 'location': {'address': '244 North Ave NW',\n",
" 'lat': 33.77114566253568,\n",
" 'lng': -84.39578511197396,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 33.77114566253568,\n",
" 'lng': -84.39578511197396}],\n",
" 'distance': 56,\n",
" 'postalCode': '30313',\n",
" 'cc': 'US',\n",
" 'city': 'Atlanta',\n",
" 'state': 'GA',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['244 North Ave NW',\n",
" 'Atlanta, GA 30313',\n",
" 'United States']},\n",
" 'categories': [{'id': '4bf58dd8d48988d1fa931735',\n",
" 'name': 'Hotel',\n",
" 'pluralName': 'Hotels',\n",
" 'shortName': 'Hotel',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/travel/hotel_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-4b9ad39ef964a52097d935e3-3'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '4e67acf0bd41e96a148c2889',\n",
" 'name': 'T-Mobile',\n",
" 'location': {'address': '1 Coca Cola Plz NW #CCP1',\n",
" 'lat': 33.77117919921875,\n",
" 'lng': -84.39620208740234,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 33.77117919921875,\n",
" 'lng': -84.39620208740234}],\n",
" 'distance': 23,\n",
" 'postalCode': '30313',\n",
" 'cc': 'US',\n",
" 'city': 'Atlanta',\n",
" 'state': 'GA',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['1 Coca Cola Plz NW #CCP1',\n",
" 'Atlanta, GA 30313',\n",
" 'United States']},\n",
" 'categories': [{'id': '4f04afc02fb6e1c99f3db0bc',\n",
" 'name': 'Mobile Phone Shop',\n",
" 'pluralName': 'Mobile Phone Shops',\n",
" 'shortName': 'Mobile Phones',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/shops/mobilephoneshop_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-4e67acf0bd41e96a148c2889-4'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '4a82e9d7f964a52087f91fe3',\n",
" 'name': 'Wells Fargo',\n",
" 'location': {'address': '645 State St NW',\n",
" 'crossStreet': 'at Tech Pkwy NW',\n",
" 'lat': 33.77254846534218,\n",
" 'lng': -84.39843042541548,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 33.77254846534218,\n",
" 'lng': -84.39843042541548},\n",
" {'label': 'entrance', 'lat': 33.772487, 'lng': -84.398487}],\n",
" 'distance': 234,\n",
" 'postalCode': '30313',\n",
" 'cc': 'US',\n",
" 'city': 'Atlanta',\n",
" 'state': 'GA',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['645 State St NW (at Tech Pkwy NW)',\n",
" 'Atlanta, GA 30313',\n",
" 'United States']},\n",
" 'categories': [{'id': '4bf58dd8d48988d10a951735',\n",
" 'name': 'Bank',\n",
" 'pluralName': 'Banks',\n",
" 'shortName': 'Bank',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/shops/financial_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-4a82e9d7f964a52087f91fe3-5'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '4d922924f5388cfae932c63d',\n",
" 'name': 'Chick-fil-A',\n",
" 'location': {'address': '350 Ferst Dr',\n",
" 'lat': 33.7736732,\n",
" 'lng': -84.3982027,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 33.7736732,\n",
" 'lng': -84.3982027}],\n",
" 'distance': 310,\n",
" 'postalCode': '30332',\n",
" 'cc': 'US',\n",
" 'city': 'Atlanta',\n",
" 'state': 'GA',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['350 Ferst Dr',\n",
" 'Atlanta, GA 30332',\n",
" 'United States']},\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-4d922924f5388cfae932c63d-6'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '4e53a1b218a8c0ad8f70c448',\n",
" 'name': 'Starbucks',\n",
" 'location': {'address': '266 4th St NW',\n",
" 'lat': 33.774261,\n",
" 'lng': -84.396411,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 33.774261,\n",
" 'lng': -84.396411}],\n",
" 'distance': 323,\n",
" 'postalCode': '30332',\n",
" 'cc': 'US',\n",
" 'city': 'Atlanta',\n",
" 'state': 'GA',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['266 4th St NW',\n",
" 'Atlanta, GA 30332',\n",
" 'United States']},\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-4e53a1b218a8c0ad8f70c448-7'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '54beae0c498e8cea02522c8b',\n",
" 'name': 'Panda Express',\n",
" 'location': {'address': '350 Ferst Drive NW',\n",
" 'lat': 33.773779492893055,\n",
" 'lng': -84.39813668981611,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 33.773779492893055,\n",
" 'lng': -84.39813668981611}],\n",
" 'distance': 316,\n",
" 'postalCode': '30332',\n",
" 'cc': 'US',\n",
" 'city': 'Atlanta',\n",
" 'state': 'GA',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['350 Ferst Drive NW',\n",
" 'Atlanta, GA 30332',\n",
" 'United States']},\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-54beae0c498e8cea02522c8b-8'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '4af4e0f5f964a52031f721e3',\n",
" 'name': 'Under The Couch',\n",
" 'location': {'address': 'North Ave NW',\n",
" 'crossStreet': 'at Georgia Tech',\n",
" 'lat': 33.773898208800745,\n",
" 'lng': -84.39886903792853,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 33.773898208800745,\n",
" 'lng': -84.39886903792853}],\n",
" 'distance': 367,\n",
" 'postalCode': '30332',\n",
" 'cc': 'US',\n",
" 'city': 'Atlanta',\n",
" 'state': 'GA',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['North Ave NW (at Georgia Tech)',\n",
" 'Atlanta, GA 30332',\n",
" 'United States']},\n",
" 'categories': [{'id': '4bf58dd8d48988d1e5931735',\n",
" 'name': 'Music Venue',\n",
" 'pluralName': 'Music Venues',\n",
" 'shortName': 'Music Venue',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/arts_entertainment/musicvenue_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-4af4e0f5f964a52031f721e3-9'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '4c239bd9a852c928b2c5e16c',\n",
" 'name': 'Harrison Square',\n",
" 'location': {'address': 'Power Plant Dr NW',\n",
" 'lat': 33.77301871776581,\n",
" 'lng': -84.3952989578247,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 33.77301871776581,\n",
" 'lng': -84.3952989578247}],\n",
" 'distance': 209,\n",
" 'postalCode': '30313',\n",
" 'cc': 'US',\n",
" 'city': 'Atlanta',\n",
" 'state': 'GA',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['Power Plant Dr NW',\n",
" 'Atlanta, GA 30313',\n",
" 'United States']},\n",
" 'categories': [{'id': '4bf58dd8d48988d164941735',\n",
" 'name': 'Plaza',\n",
" 'pluralName': 'Plazas',\n",
" 'shortName': 'Plaza',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/parks_outdoors/plaza_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-4c239bd9a852c928b2c5e16c-10'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '4da46601bf22a14372c6dcf8',\n",
" 'name': 'Taco Bell',\n",
" 'location': {'address': 'North Ave NW',\n",
" 'crossStreet': 'Georgia Tech',\n",
" 'lat': 33.773780184594145,\n",
" 'lng': -84.39820597474531,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 33.773780184594145,\n",
" 'lng': -84.39820597474531}],\n",
" 'distance': 320,\n",
" 'postalCode': '30332',\n",
" 'cc': 'US',\n",
" 'city': 'Atlanta',\n",
" 'state': 'GA',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['North Ave NW (Georgia Tech)',\n",
" 'Atlanta, GA 30332',\n",
" 'United States']},\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-4da46601bf22a14372c6dcf8-11'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '4d7555fafc766a31b9268d1a',\n",
" 'name': \"Burdell's\",\n",
" 'location': {'address': '350 Ferst Drive NW',\n",
" 'crossStreet': 'at Georgia Tech',\n",
" 'lat': 33.77376958442543,\n",
" 'lng': -84.3980832286946,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 33.77376958442543,\n",
" 'lng': -84.3980832286946}],\n",
" 'distance': 313,\n",
" 'postalCode': '30332',\n",
" 'cc': 'US',\n",
" 'city': 'Atlanta',\n",
" 'state': 'GA',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['350 Ferst Drive NW (at Georgia Tech)',\n",
" 'Atlanta, GA 30332',\n",
" 'United States']},\n",
" 'categories': [{'id': '4bf58dd8d48988d1b1941735',\n",
" 'name': 'College Bookstore',\n",
" 'pluralName': 'College Bookstores',\n",
" 'shortName': 'College Bookstore',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/shops/bookstore_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-4d7555fafc766a31b9268d1a-12'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '4e820b5f7ee61ffc04f4c7d3',\n",
" 'name': 'Rooftop Garden',\n",
" 'location': {'address': 'North Ave NW',\n",
" 'crossStreet': 'at Georgia Tech',\n",
" 'lat': 33.7744282899713,\n",
" 'lng': -84.39655184225045,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 33.7744282899713,\n",
" 'lng': -84.39655184225045}],\n",
" 'distance': 342,\n",
" 'postalCode': '30332',\n",
" 'cc': 'US',\n",
" 'city': 'Atlanta',\n",
" 'state': 'GA',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['North Ave NW (at Georgia Tech)',\n",
" 'Atlanta, GA 30332',\n",
" 'United States']},\n",
" 'categories': [{'id': '4bf58dd8d48988d133951735',\n",
" 'name': 'Roof Deck',\n",
" 'pluralName': 'Roof Decks',\n",
" 'shortName': 'Roof Deck',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/travel/hotel_roofdeck_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-4e820b5f7ee61ffc04f4c7d3-13'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '506b929eb0edcdd34cd227c8',\n",
" 'name': 'GT Stinger Stop - Techwood and North Ave',\n",
" 'location': {'address': 'Techwood Dr NW',\n",
" 'crossStreet': 'at North Ave NW',\n",
" 'lat': 33.771245913278335,\n",
" 'lng': -84.3920373916626,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 33.771245913278335,\n",
" 'lng': -84.3920373916626}],\n",
" 'distance': 398,\n",
" 'postalCode': '30332',\n",
" 'cc': 'US',\n",
" 'city': 'Atlanta',\n",
" 'state': 'GA',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['Techwood Dr NW (at North Ave NW)',\n",
" 'Atlanta, GA 30332',\n",
" 'United States']},\n",
" 'categories': [{'id': '52f2ab2ebcbc57f1066b8b4f',\n",
" 'name': 'Bus Stop',\n",
" 'pluralName': 'Bus Stops',\n",
" 'shortName': 'Bus Stop',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/travel/busstation_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-506b929eb0edcdd34cd227c8-14'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '4dadda617abacefe5c8b201e',\n",
" 'name': 'Student Center Food Court',\n",
" 'location': {'address': '350 Ferst Dr NW',\n",
" 'crossStreet': 'at Georgia Tech',\n",
" 'lat': 33.77445091089932,\n",
" 'lng': -84.39890435841951,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 33.77445091089932,\n",
" 'lng': -84.39890435841951}],\n",
" 'distance': 418,\n",
" 'postalCode': '30332',\n",
" 'cc': 'US',\n",
" 'neighborhood': 'Georgia Tech',\n",
" 'city': 'Atlanta',\n",
" 'state': 'GA',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['350 Ferst Dr NW (at Georgia Tech)',\n",
" 'Atlanta, GA 30332',\n",
" 'United States']},\n",
" 'categories': [{'id': '4bf58dd8d48988d120951735',\n",
" 'name': 'Food Court',\n",
" 'pluralName': 'Food Courts',\n",
" 'shortName': 'Food Court',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/shops/food_foodcourt_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-4dadda617abacefe5c8b201e-15'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '4d5bd186fb186dcb8b03f89a',\n",
" 'name': \"Dunkin'\",\n",
" 'location': {'address': 'North Ave NW',\n",
" 'crossStreet': 'at Georgia Tech',\n",
" 'lat': 33.77442791392891,\n",
" 'lng': -84.39880812280745,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 33.77442791392891,\n",
" 'lng': -84.39880812280745}],\n",
" 'distance': 411,\n",
" 'postalCode': '30332',\n",
" 'cc': 'US',\n",
" 'city': 'Atlanta',\n",
" 'state': 'GA',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['North Ave NW (at Georgia Tech)',\n",
" 'Atlanta, GA 30332',\n",
" 'United States']},\n",
" 'categories': [{'id': '4bf58dd8d48988d148941735',\n",
" 'name': 'Donut Shop',\n",
" 'pluralName': 'Donut Shops',\n",
" 'shortName': 'Donuts',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/food/donuts_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-4d5bd186fb186dcb8b03f89a-16'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '5701c802498ef642af8ca74c',\n",
" 'name': 'Einstein Statue',\n",
" 'location': {'lat': 33.77522394551474,\n",
" 'lng': -84.39718993342497,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 33.77522394551474,\n",
" 'lng': -84.39718993342497}],\n",
" 'distance': 437,\n",
" 'cc': 'US',\n",
" 'city': 'Atlanta',\n",
" 'state': 'GA',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['Atlanta, GA', 'United States']},\n",
" 'categories': [{'id': '52e81612bcbc57f1066b79ed',\n",
" 'name': 'Outdoor Sculpture',\n",
" 'pluralName': 'Outdoor Sculptures',\n",
" 'shortName': 'Outdoor Sculpture',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/parks_outdoors/sculpture_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-5701c802498ef642af8ca74c-17'}]}]}}"
]
},
"execution_count": 18,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"#Limit 100\n",
"#Radius 500 miles\n",
"\n",
"LIMIT = 100 \n",
"radius = 500\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",
" atl_latitude, \n",
" atl_longitude, \n",
" radius, \n",
" LIMIT)\n",
"\n",
"# get the result to a json file\n",
"atl_results = requests.get(url).json()\n",
"atl_results"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Data Preparation"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Venues Nearby "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The venues were grouped by categories in Foursquare to know what types are listed and available around each university. Then the venues were order by which are closer to the universities. After previewing the columns available in the JSON response I seen that we did not need all the columns. The name, categories, and coordinates should be efficient data to continue on for further data analysis."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We stored the venue results for University of Chicago and Georgia Institute of Technology (Georgia Tech) in a pandas dataframe."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Since the venues were not many I did not have to run any code to see unique or common categories and venues. There were not many similar category types. "
]
},
{
"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>Name</th>\n",
" <th>Category Type</th>\n",
" <th>Latitude</th>\n",
" <th>Longitude</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Build Coffee</td>\n",
" <td>Coffee Shop</td>\n",
" <td>41.784288</td>\n",
" <td>-87.590419</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>61st Street Farmers' Market</td>\n",
" <td>Market</td>\n",
" <td>41.784296</td>\n",
" <td>-87.590790</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>Midway Plaisance Park</td>\n",
" <td>Park</td>\n",
" <td>41.786526</td>\n",
" <td>-87.594458</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>University of Chicago @ Midway Plaisance</td>\n",
" <td>Park</td>\n",
" <td>41.787751</td>\n",
" <td>-87.588782</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>B'Gabs Goodies</td>\n",
" <td>Food &amp; Drink Shop</td>\n",
" <td>41.784245</td>\n",
" <td>-87.590372</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>Plum Cafe at Chicago Press Building</td>\n",
" <td>Café</td>\n",
" <td>41.786028</td>\n",
" <td>-87.590035</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>Jackson Towers Fitness</td>\n",
" <td>Gym / Fitness Center</td>\n",
" <td>41.784879</td>\n",
" <td>-87.588799</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>Metra - 59th St (University of Chicago)</td>\n",
" <td>Train Station</td>\n",
" <td>41.787729</td>\n",
" <td>-87.588789</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>Jackson Park Track &amp; Soccer Field</td>\n",
" <td>Soccer Field</td>\n",
" <td>41.783368</td>\n",
" <td>-87.586806</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>Tiffin Cafe</td>\n",
" <td>Coffee Shop</td>\n",
" <td>41.788219</td>\n",
" <td>-87.590965</td>\n",
" </tr>\n",
" <tr>\n",
" <th>10</th>\n",
" <td>International House at the University of Chicago</td>\n",
" <td>Concert Hall</td>\n",
" <td>41.788240</td>\n",
" <td>-87.590804</td>\n",
" </tr>\n",
" <tr>\n",
" <th>11</th>\n",
" <td>Divvy Station</td>\n",
" <td>Bike Rental / Bike Share</td>\n",
" <td>41.787943</td>\n",
" <td>-87.588315</td>\n",
" </tr>\n",
" <tr>\n",
" <th>12</th>\n",
" <td>Huckleberry Park</td>\n",
" <td>Playground</td>\n",
" <td>41.782321</td>\n",
" <td>-87.594810</td>\n",
" </tr>\n",
" <tr>\n",
" <th>13</th>\n",
" <td>CTA Bus Stop 1513</td>\n",
" <td>Bus Station</td>\n",
" <td>41.787987</td>\n",
" <td>-87.586560</td>\n",
" </tr>\n",
" <tr>\n",
" <th>14</th>\n",
" <td>Leon's Barbecue</td>\n",
" <td>BBQ Joint</td>\n",
" <td>41.780854</td>\n",
" <td>-87.588451</td>\n",
" </tr>\n",
" <tr>\n",
" <th>15</th>\n",
" <td>Tres Original Pancakes</td>\n",
" <td>Food</td>\n",
" <td>41.780869</td>\n",
" <td>-87.588188</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Name \\\n",
"0 Build Coffee \n",
"1 61st Street Farmers' Market \n",
"2 Midway Plaisance Park \n",
"3 University of Chicago @ Midway Plaisance \n",
"4 B'Gabs Goodies \n",
"5 Plum Cafe at Chicago Press Building \n",
"6 Jackson Towers Fitness \n",
"7 Metra - 59th St (University of Chicago) \n",
"8 Jackson Park Track & Soccer Field \n",
"9 Tiffin Cafe \n",
"10 International House at the University of Chicago \n",
"11 Divvy Station \n",
"12 Huckleberry Park \n",
"13 CTA Bus Stop 1513 \n",
"14 Leon's Barbecue \n",
"15 Tres Original Pancakes \n",
"\n",
" Category Type Latitude Longitude \n",
"0 Coffee Shop 41.784288 -87.590419 \n",
"1 Market 41.784296 -87.590790 \n",
"2 Park 41.786526 -87.594458 \n",
"3 Park 41.787751 -87.588782 \n",
"4 Food & Drink Shop 41.784245 -87.590372 \n",
"5 Café 41.786028 -87.590035 \n",
"6 Gym / Fitness Center 41.784879 -87.588799 \n",
"7 Train Station 41.787729 -87.588789 \n",
"8 Soccer Field 41.783368 -87.586806 \n",
"9 Coffee Shop 41.788219 -87.590965 \n",
"10 Concert Hall 41.788240 -87.590804 \n",
"11 Bike Rental / Bike Share 41.787943 -87.588315 \n",
"12 Playground 41.782321 -87.594810 \n",
"13 Bus Station 41.787987 -87.586560 \n",
"14 BBQ Joint 41.780854 -87.588451 \n",
"15 Food 41.780869 -87.588188 "
]
},
"execution_count": 19,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"chi_venues = chi_results['response']['groups'][0]['items']\n",
"#chi_nearby_venues = pd.json_normalize(chi_venues) #flatten JSON\n",
"\n",
"chi_venues_list = []\n",
"chi_venues_list.append([\n",
" (\n",
" v['venue']['name'], \n",
" v['venue']['categories'][0]['name'],\n",
" v['venue']['location']['lat'], \n",
" v['venue']['location']['lng'] \n",
" ) for v in chi_venues])\n",
"\n",
"chi_df = pd.DataFrame([item for chi_venue_list in chi_venues_list for item in chi_venue_list])\n",
"chi_df.columns = ['Name', 'Category Type', 'Latitude', 'Longitude']\n",
"chi_df\n"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"(16, 4)\n"
]
}
],
"source": [
"print(chi_df.shape)"
]
},
{
"cell_type": "code",
"execution_count": 21,
"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>Latitude</th>\n",
" <th>Longitude</th>\n",
" </tr>\n",
" <tr>\n",
" <th>Category Type</th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>BBQ Joint</th>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Bike Rental / Bike Share</th>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Bus Station</th>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Café</th>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Coffee Shop</th>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Concert Hall</th>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Food</th>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Food &amp; Drink Shop</th>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Gym / Fitness Center</th>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Market</th>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Park</th>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Playground</th>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Soccer Field</th>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Train Station</th>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Name Latitude Longitude\n",
"Category Type \n",
"BBQ Joint 1 1 1\n",
"Bike Rental / Bike Share 1 1 1\n",
"Bus Station 1 1 1\n",
"Café 1 1 1\n",
"Coffee Shop 2 2 2\n",
"Concert Hall 1 1 1\n",
"Food 1 1 1\n",
"Food & Drink Shop 1 1 1\n",
"Gym / Fitness Center 1 1 1\n",
"Market 1 1 1\n",
"Park 2 2 2\n",
"Playground 1 1 1\n",
"Soccer Field 1 1 1\n",
"Train Station 1 1 1"
]
},
"execution_count": 21,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"chi_df.groupby('Category Type').count()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Categories for Venues nearby Georgia Tech"
]
},
{
"cell_type": "code",
"execution_count": 22,
"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>Category Type</th>\n",
" <th>Latitude</th>\n",
" <th>Longitude</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Coca-Cola Mainstreet @ AOC</td>\n",
" <td>American Restaurant</td>\n",
" <td>33.770980</td>\n",
" <td>-84.398037</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>Highland Bakery</td>\n",
" <td>Bakery</td>\n",
" <td>33.772646</td>\n",
" <td>-84.394585</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>Ferst Center For The Arts</td>\n",
" <td>College Theater</td>\n",
" <td>33.774820</td>\n",
" <td>-84.399194</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>Hampton Inn by Hilton</td>\n",
" <td>Hotel</td>\n",
" <td>33.771146</td>\n",
" <td>-84.395785</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>T-Mobile</td>\n",
" <td>Mobile Phone Shop</td>\n",
" <td>33.771179</td>\n",
" <td>-84.396202</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>Wells Fargo</td>\n",
" <td>Bank</td>\n",
" <td>33.772548</td>\n",
" <td>-84.398430</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>Chick-fil-A</td>\n",
" <td>Fast Food Restaurant</td>\n",
" <td>33.773673</td>\n",
" <td>-84.398203</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>Starbucks</td>\n",
" <td>Coffee Shop</td>\n",
" <td>33.774261</td>\n",
" <td>-84.396411</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>Panda Express</td>\n",
" <td>Chinese Restaurant</td>\n",
" <td>33.773779</td>\n",
" <td>-84.398137</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>Under The Couch</td>\n",
" <td>Music Venue</td>\n",
" <td>33.773898</td>\n",
" <td>-84.398869</td>\n",
" </tr>\n",
" <tr>\n",
" <th>10</th>\n",
" <td>Harrison Square</td>\n",
" <td>Plaza</td>\n",
" <td>33.773019</td>\n",
" <td>-84.395299</td>\n",
" </tr>\n",
" <tr>\n",
" <th>11</th>\n",
" <td>Taco Bell</td>\n",
" <td>Fast Food Restaurant</td>\n",
" <td>33.773780</td>\n",
" <td>-84.398206</td>\n",
" </tr>\n",
" <tr>\n",
" <th>12</th>\n",
" <td>Burdell's</td>\n",
" <td>College Bookstore</td>\n",
" <td>33.773770</td>\n",
" <td>-84.398083</td>\n",
" </tr>\n",
" <tr>\n",
" <th>13</th>\n",
" <td>Rooftop Garden</td>\n",
" <td>Roof Deck</td>\n",
" <td>33.774428</td>\n",
" <td>-84.396552</td>\n",
" </tr>\n",
" <tr>\n",
" <th>14</th>\n",
" <td>GT Stinger Stop - Techwood and North Ave</td>\n",
" <td>Bus Stop</td>\n",
" <td>33.771246</td>\n",
" <td>-84.392037</td>\n",
" </tr>\n",
" <tr>\n",
" <th>15</th>\n",
" <td>Student Center Food Court</td>\n",
" <td>Food Court</td>\n",
" <td>33.774451</td>\n",
" <td>-84.398904</td>\n",
" </tr>\n",
" <tr>\n",
" <th>16</th>\n",
" <td>Dunkin'</td>\n",
" <td>Donut Shop</td>\n",
" <td>33.774428</td>\n",
" <td>-84.398808</td>\n",
" </tr>\n",
" <tr>\n",
" <th>17</th>\n",
" <td>Einstein Statue</td>\n",
" <td>Outdoor Sculpture</td>\n",
" <td>33.775224</td>\n",
" <td>-84.397190</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Name Category Type Latitude \\\n",
"0 Coca-Cola Mainstreet @ AOC American Restaurant 33.770980 \n",
"1 Highland Bakery Bakery 33.772646 \n",
"2 Ferst Center For The Arts College Theater 33.774820 \n",
"3 Hampton Inn by Hilton Hotel 33.771146 \n",
"4 T-Mobile Mobile Phone Shop 33.771179 \n",
"5 Wells Fargo Bank 33.772548 \n",
"6 Chick-fil-A Fast Food Restaurant 33.773673 \n",
"7 Starbucks Coffee Shop 33.774261 \n",
"8 Panda Express Chinese Restaurant 33.773779 \n",
"9 Under The Couch Music Venue 33.773898 \n",
"10 Harrison Square Plaza 33.773019 \n",
"11 Taco Bell Fast Food Restaurant 33.773780 \n",
"12 Burdell's College Bookstore 33.773770 \n",
"13 Rooftop Garden Roof Deck 33.774428 \n",
"14 GT Stinger Stop - Techwood and North Ave Bus Stop 33.771246 \n",
"15 Student Center Food Court Food Court 33.774451 \n",
"16 Dunkin' Donut Shop 33.774428 \n",
"17 Einstein Statue Outdoor Sculpture 33.775224 \n",
"\n",
" Longitude \n",
"0 -84.398037 \n",
"1 -84.394585 \n",
"2 -84.399194 \n",
"3 -84.395785 \n",
"4 -84.396202 \n",
"5 -84.398430 \n",
"6 -84.398203 \n",
"7 -84.396411 \n",
"8 -84.398137 \n",
"9 -84.398869 \n",
"10 -84.395299 \n",
"11 -84.398206 \n",
"12 -84.398083 \n",
"13 -84.396552 \n",
"14 -84.392037 \n",
"15 -84.398904 \n",
"16 -84.398808 \n",
"17 -84.397190 "
]
},
"execution_count": 22,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"atl_venues = atl_results['response']['groups'][0]['items']\n",
"\n",
"atl_venues_list = []\n",
"atl_venues_list.append([\n",
" (\n",
" v['venue']['name'], \n",
" v['venue']['categories'][0]['name'],\n",
" v['venue']['location']['lat'], \n",
" v['venue']['location']['lng'] \n",
" ) for v in atl_venues])\n",
"\n",
"atl_df = pd.DataFrame([item for atl_venue_list in atl_venues_list for item in atl_venue_list])\n",
"atl_df.columns = ['Name', 'Category Type', 'Latitude', 'Longitude']\n",
"atl_df"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"(18, 4)\n"
]
}
],
"source": [
"print(atl_df.shape)"
]
},
{
"cell_type": "code",
"execution_count": 24,
"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>Latitude</th>\n",
" <th>Longitude</th>\n",
" </tr>\n",
" <tr>\n",
" <th>Category Type</th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>American Restaurant</th>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Bakery</th>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Bank</th>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Bus Stop</th>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Chinese Restaurant</th>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Coffee Shop</th>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>College Bookstore</th>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>College Theater</th>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Donut Shop</th>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Fast Food Restaurant</th>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Food Court</th>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Hotel</th>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Mobile Phone Shop</th>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Music Venue</th>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Outdoor Sculpture</th>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Plaza</th>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Roof Deck</th>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Name Latitude Longitude\n",
"Category Type \n",
"American Restaurant 1 1 1\n",
"Bakery 1 1 1\n",
"Bank 1 1 1\n",
"Bus Stop 1 1 1\n",
"Chinese Restaurant 1 1 1\n",
"Coffee Shop 1 1 1\n",
"College Bookstore 1 1 1\n",
"College Theater 1 1 1\n",
"Donut Shop 1 1 1\n",
"Fast Food Restaurant 2 2 2\n",
"Food Court 1 1 1\n",
"Hotel 1 1 1\n",
"Mobile Phone Shop 1 1 1\n",
"Music Venue 1 1 1\n",
"Outdoor Sculpture 1 1 1\n",
"Plaza 1 1 1\n",
"Roof Deck 1 1 1"
]
},
"execution_count": 24,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"atl_df.groupby('Category Type').count()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Data Exploration (Results)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The University of Chicago had only two repeated category types which were parks and coffee shops. \n",
"\n",
"There is a nearby bus station at the University of Chicago, so a user does not need a car or uber as much if there is a bus route and a gym, but most universities already have a recreation center that someone could use. If a break is needed a person has the choice of more than one park to walk or go running at. If they do not want to eat coffee shop food and want something more hearty there is a BBQ joint nearby.\n",
"\n",
"At Georgia Institute of Technology (Georgia Tech), they have many different kind of restuarants nearby that are just not inside the college. One of the greatest perks is a music venue so people can probably get to hear local bands and if they do not want to stay at a dorm can have a night at the nearby hotel at the Hampton Inn and not too far from the hotel is a bank. \n",
"\n",
"There could be shopping center in the area."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Data Analysis"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Maps with Markers"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"After looking at the venues for each university, maps were created with markers for each of the venues around each of the universities. We remove the 'Name' and 'Category Type' columns since we only need the coordinates for k-Means cluster labels. The maps will not be ordinary maps with markers, but will have clusters using k-Means with a initial k/clusters of 3. "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"After creating the dataframes with the clusters we can see the clusters were color-coded and of course grouped by distances. The elbow method was not neccessary since the data points are very few. The perfect zoom size at 16 let us see some data points that were like outliers, but as you know they don't exist in k-Means. For instance, based on Google maps Leon's Barbecue takes 19 minutes by car and up to two hours walking distance. This venue is about 6.6 miles away from the University of Chicago. The venue with the farthest distance from Georgia Institute of Technology (Georgia Tech) would be Cocoa Cola Mainstreet at AOC although GT Stinger Shop was close and has it's own cluster group. The location for Coca Cola @ AOC was not easy to locate by name in Google Maps and the address was retrieved for the restaurant through Foursquare. Again, Georgia Tech wins with the farthest distance being less than 1.7 miles with only a 35 minute walk."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"from sklearn.cluster import KMeans\n",
"\n",
"# set number of clusters\n",
"kclusters = 3\n",
"\n",
"chi_df_clustering = chi_df.drop(['Name','Category Type'], 1)\n",
"\n",
"# run k-means clustering\n",
"kmeans = KMeans(n_clusters=kclusters, random_state=0).fit(chi_df_clustering)\n",
"\n",
"# check cluster labels generated for each row in the dataframe\n",
"kmeans.labels_[0:13]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We then need to create a new dataframe with the cluster."
]
},
{
"cell_type": "code",
"execution_count": 66,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Cluster Labels</th>\n",
" <th>Latitude</th>\n",
" <th>Longitude</th>\n",
" <th>Name</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>2</td>\n",
" <td>41.784288</td>\n",
" <td>-87.590419</td>\n",
" <td>Build Coffee</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>2</td>\n",
" <td>41.784296</td>\n",
" <td>-87.590790</td>\n",
" <td>61st Street Farmers' Market</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>0</td>\n",
" <td>41.786526</td>\n",
" <td>-87.594458</td>\n",
" <td>Midway Plaisance Park</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>1</td>\n",
" <td>41.787751</td>\n",
" <td>-87.588782</td>\n",
" <td>University of Chicago @ Midway Plaisance</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>2</td>\n",
" <td>41.784245</td>\n",
" <td>-87.590372</td>\n",
" <td>B'Gabs Goodies</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>1</td>\n",
" <td>41.786028</td>\n",
" <td>-87.590035</td>\n",
" <td>Plum Cafe at Chicago Press Building</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>2</td>\n",
" <td>41.784879</td>\n",
" <td>-87.588799</td>\n",
" <td>Jackson Towers Fitness</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>1</td>\n",
" <td>41.787729</td>\n",
" <td>-87.588789</td>\n",
" <td>Metra - 59th St (University of Chicago)</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>2</td>\n",
" <td>41.783368</td>\n",
" <td>-87.586806</td>\n",
" <td>Jackson Park Track &amp; Soccer Field</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>1</td>\n",
" <td>41.788219</td>\n",
" <td>-87.590965</td>\n",
" <td>Tiffin Cafe</td>\n",
" </tr>\n",
" <tr>\n",
" <th>10</th>\n",
" <td>1</td>\n",
" <td>41.788240</td>\n",
" <td>-87.590804</td>\n",
" <td>International House at the University of Chicago</td>\n",
" </tr>\n",
" <tr>\n",
" <th>11</th>\n",
" <td>1</td>\n",
" <td>41.787943</td>\n",
" <td>-87.588315</td>\n",
" <td>Divvy Station</td>\n",
" </tr>\n",
" <tr>\n",
" <th>12</th>\n",
" <td>0</td>\n",
" <td>41.782321</td>\n",
" <td>-87.594810</td>\n",
" <td>Huckleberry Park</td>\n",
" </tr>\n",
" <tr>\n",
" <th>13</th>\n",
" <td>1</td>\n",
" <td>41.787987</td>\n",
" <td>-87.586560</td>\n",
" <td>CTA Bus Stop 1513</td>\n",
" </tr>\n",
" <tr>\n",
" <th>14</th>\n",
" <td>2</td>\n",
" <td>41.780854</td>\n",
" <td>-87.588451</td>\n",
" <td>Leon's Barbecue</td>\n",
" </tr>\n",
" <tr>\n",
" <th>15</th>\n",
" <td>2</td>\n",
" <td>41.780869</td>\n",
" <td>-87.588188</td>\n",
" <td>Tres Original Pancakes</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Cluster Labels Latitude Longitude \\\n",
"0 2 41.784288 -87.590419 \n",
"1 2 41.784296 -87.590790 \n",
"2 0 41.786526 -87.594458 \n",
"3 1 41.787751 -87.588782 \n",
"4 2 41.784245 -87.590372 \n",
"5 1 41.786028 -87.590035 \n",
"6 2 41.784879 -87.588799 \n",
"7 1 41.787729 -87.588789 \n",
"8 2 41.783368 -87.586806 \n",
"9 1 41.788219 -87.590965 \n",
"10 1 41.788240 -87.590804 \n",
"11 1 41.787943 -87.588315 \n",
"12 0 41.782321 -87.594810 \n",
"13 1 41.787987 -87.586560 \n",
"14 2 41.780854 -87.588451 \n",
"15 2 41.780869 -87.588188 \n",
"\n",
" Name \n",
"0 Build Coffee \n",
"1 61st Street Farmers' Market \n",
"2 Midway Plaisance Park \n",
"3 University of Chicago @ Midway Plaisance \n",
"4 B'Gabs Goodies \n",
"5 Plum Cafe at Chicago Press Building \n",
"6 Jackson Towers Fitness \n",
"7 Metra - 59th St (University of Chicago) \n",
"8 Jackson Park Track & Soccer Field \n",
"9 Tiffin Cafe \n",
"10 International House at the University of Chicago \n",
"11 Divvy Station \n",
"12 Huckleberry Park \n",
"13 CTA Bus Stop 1513 \n",
"14 Leon's Barbecue \n",
"15 Tres Original Pancakes "
]
},
"execution_count": 66,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"chi_df_merged = chi_df_clustering\n",
"chi_df_merged.insert(0, 'Cluster Labels', kmeans.labels_)\n",
"name_column = chi_df['Name']\n",
"chi_df_with_clusters = pd.concat([chi_df_merged,name_column], axis = 1)\n",
"chi_df_with_clusters"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"One of the most distance locations are two restuarants in one cluster group (green). Many woud have though the bus station may have been closer to the University of Chicago. Midway Plaisance Park is the closest data point to the college while the Huckleberry Park is one of the farthest."
]
},
{
"cell_type": "code",
"execution_count": 67,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div style=\"width:100%;\"><div style=\"position:relative;width:100%;height:0;padding-bottom:60%;\"><span style=\"color:#565656\">Make this Notebook Trusted to load map: File -> Trust Notebook</span><iframe src=\"about:blank\" style=\"position:absolute;width:100%;height:100%;left:0;top:0;border:none !important;\" data-html=PCFET0NUWVBFIGh0bWw+CjxoZWFkPiAgICAKICAgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPgogICAgPHNjcmlwdD5MX1BSRUZFUl9DQU5WQVMgPSBmYWxzZTsgTF9OT19UT1VDSCA9IGZhbHNlOyBMX0RJU0FCTEVfM0QgPSBmYWxzZTs8L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2FqYXguZ29vZ2xlYXBpcy5jb20vYWpheC9saWJzL2pxdWVyeS8xLjExLjEvanF1ZXJ5Lm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvanMvYm9vdHN0cmFwLm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvTGVhZmxldC5hd2Vzb21lLW1hcmtlcnMvMi4wLjIvbGVhZmxldC5hd2Vzb21lLW1hcmtlcnMuanMiPjwvc2NyaXB0PgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9jc3MvYm9vdHN0cmFwLm1pbi5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvY3NzL2Jvb3RzdHJhcC10aGVtZS5taW4uY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vbWF4Y2RuLmJvb3RzdHJhcGNkbi5jb20vZm9udC1hd2Vzb21lLzQuNi4zL2Nzcy9mb250LWF3ZXNvbWUubWluLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9MZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy8yLjAuMi9sZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9yYXdnaXQuY29tL3B5dGhvbi12aXN1YWxpemF0aW9uL2ZvbGl1bS9tYXN0ZXIvZm9saXVtL3RlbXBsYXRlcy9sZWFmbGV0LmF3ZXNvbWUucm90YXRlLmNzcyIvPgogICAgPHN0eWxlPmh0bWwsIGJvZHkge3dpZHRoOiAxMDAlO2hlaWdodDogMTAwJTttYXJnaW46IDA7cGFkZGluZzogMDt9PC9zdHlsZT4KICAgIDxzdHlsZT4jbWFwIHtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtyaWdodDowO2xlZnQ6MDt9PC9zdHlsZT4KICAgIAogICAgICAgICAgICA8c3R5bGU+ICNtYXBfN2M4MmI0YjgwY2YzNDEwNzhlYTMzODgwMjA1NWYzYmEgewogICAgICAgICAgICAgICAgcG9zaXRpb24gOiByZWxhdGl2ZTsKICAgICAgICAgICAgICAgIHdpZHRoIDogMTAwLjAlOwogICAgICAgICAgICAgICAgaGVpZ2h0OiAxMDAuMCU7CiAgICAgICAgICAgICAgICBsZWZ0OiAwLjAlOwogICAgICAgICAgICAgICAgdG9wOiAwLjAlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICA8L3N0eWxlPgogICAgICAgIAo8L2hlYWQ+Cjxib2R5PiAgICAKICAgIAogICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb2xpdW0tbWFwIiBpZD0ibWFwXzdjODJiNGI4MGNmMzQxMDc4ZWEzMzg4MDIwNTVmM2JhIiA+PC9kaXY+CiAgICAgICAgCjwvYm9keT4KPHNjcmlwdD4gICAgCiAgICAKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGJvdW5kcyA9IG51bGw7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcF83YzgyYjRiODBjZjM0MTA3OGVhMzM4ODAyMDU1ZjNiYSA9IEwubWFwKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21hcF83YzgyYjRiODBjZjM0MTA3OGVhMzM4ODAyMDU1ZjNiYScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y2VudGVyOiBbNDEuNzg0OTc3LC04Ny41OTA1MjM3MTIzMDE3XSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpvb206IDE2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4Qm91bmRzOiBib3VuZHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXllcnM6IFtdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ybGRDb3B5SnVtcDogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcnM6IEwuQ1JTLkVQU0czODU3CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgdGlsZV9sYXllcl8wMzBmNTA0NGYwMTg0Mzg2OWJkZDJkYzY1ZTZmMTVmMyA9IEwudGlsZUxheWVyKAogICAgICAgICAgICAgICAgJ2h0dHBzOi8ve3N9LnRpbGUub3BlbnN0cmVldG1hcC5vcmcve3p9L3t4fS97eX0ucG5nJywKICAgICAgICAgICAgICAgIHsKICAiYXR0cmlidXRpb24iOiBudWxsLAogICJkZXRlY3RSZXRpbmEiOiBmYWxzZSwKICAibWF4Wm9vbSI6IDE4LAogICJtaW5ab29tIjogMSwKICAibm9XcmFwIjogZmFsc2UsCiAgInN1YmRvbWFpbnMiOiAiYWJjIgp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83YzgyYjRiODBjZjM0MTA3OGVhMzM4ODAyMDU1ZjNiYSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMWQwN2QzOTgwNzdjNGIyYmE1NGUzYjkzZTRiOWY3OTcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MS43ODQyODg0Nzg2NTUzNSwtODcuNTkwNDE5Mjc0MjM5MjRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzgwZmZiNCIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiM4MGZmYjQiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfN2M4MmI0YjgwY2YzNDEwNzhlYTMzODgwMjA1NWYzYmEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNmVmNzQzZTE0YzA3NDU4ZDkxZjA2ZGFhZjk0MTk0YzYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMTE2ZDA2MTUyNDE3NDMyYzhhODczN2M2NDQwZmJkNTUgPSAkKCc8ZGl2IGlkPSJodG1sXzExNmQwNjE1MjQxNzQzMmM4YTg3MzdjNjQ0MGZiZDU1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5CdWlsZCBDb2ZmZWUgQ2x1c3RlciAyPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82ZWY3NDNlMTRjMDc0NThkOTFmMDZkYWFmOTQxOTRjNi5zZXRDb250ZW50KGh0bWxfMTE2ZDA2MTUyNDE3NDMyYzhhODczN2M2NDQwZmJkNTUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMWQwN2QzOTgwNzdjNGIyYmE1NGUzYjkzZTRiOWY3OTcuYmluZFBvcHVwKHBvcHVwXzZlZjc0M2UxNGMwNzQ1OGQ5MWYwNmRhYWY5NDE5NGM2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzg5M2E3MDA1Y2YwZTQyZjVhNWI0YjljNmE1ODVjZTVkID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDEuNzg0Mjk2MDg5NTcyODU1LC04Ny41OTA3OTAzNjQ5ODE1OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjODBmZmI0IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzgwZmZiNCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83YzgyYjRiODBjZjM0MTA3OGVhMzM4ODAyMDU1ZjNiYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85NDg1NDAyMDQ3ODQ0NzdiYjg5MmIyNDcyYTJhZjdmNiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kMGU5NTVkZjJmMzg0ODE0OTFjMjU4NmIyYmIzMzg5MiA9ICQoJzxkaXYgaWQ9Imh0bWxfZDBlOTU1ZGYyZjM4NDgxNDkxYzI1ODZiMmJiMzM4OTIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPjYxc3QgU3RyZWV0IEZhcm1lcnMmIzM5OyBNYXJrZXQgQ2x1c3RlciAyPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85NDg1NDAyMDQ3ODQ0NzdiYjg5MmIyNDcyYTJhZjdmNi5zZXRDb250ZW50KGh0bWxfZDBlOTU1ZGYyZjM4NDgxNDkxYzI1ODZiMmJiMzM4OTIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfODkzYTcwMDVjZjBlNDJmNWE1YjRiOWM2YTU4NWNlNWQuYmluZFBvcHVwKHBvcHVwXzk0ODU0MDIwNDc4NDQ3N2JiODkyYjI0NzJhMmFmN2Y2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2M0ZTkwMzE4ZDViMDQwZmQ4MDA3ZGQ0MmQ1MDlhODBlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDEuNzg2NTI1NzY2Njg1NzA2LC04Ny41OTQ0NTc1MjkwNzYzMl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjZmYwMDAwIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiI2ZmMDAwMCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83YzgyYjRiODBjZjM0MTA3OGVhMzM4ODAyMDU1ZjNiYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wNTg5ZDBlNTAxOWY0MmI0YWQ3NmMxYzA2OTVmODQyZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jNWE4YzlmYWU5OTA0YzE2YjgyOThiOWNhOTE4ZjE4YSA9ICQoJzxkaXYgaWQ9Imh0bWxfYzVhOGM5ZmFlOTkwNGMxNmI4Mjk4YjljYTkxOGYxOGEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk1pZHdheSBQbGFpc2FuY2UgUGFyayBDbHVzdGVyIDA8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzA1ODlkMGU1MDE5ZjQyYjRhZDc2YzFjMDY5NWY4NDJkLnNldENvbnRlbnQoaHRtbF9jNWE4YzlmYWU5OTA0YzE2YjgyOThiOWNhOTE4ZjE4YSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9jNGU5MDMxOGQ1YjA0MGZkODAwN2RkNDJkNTA5YTgwZS5iaW5kUG9wdXAocG9wdXBfMDU4OWQwZTUwMTlmNDJiNGFkNzZjMWMwNjk1Zjg0MmQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMzI5NGQ1Mjg3NDc5NDE4Zjk5N2JjNmIwZGUwNmQ1ODYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MS43ODc3NTEzMDIwMjM3NjQsLTg3LjU4ODc4MjAwNDEwMDRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzgwMDBmZiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiM4MDAwZmYiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfN2M4MmI0YjgwY2YzNDEwNzhlYTMzODgwMjA1NWYzYmEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZWQ5MmEyZTQxMTZlNDRlNzljNjE3ZWI3OGY5MGNkNjIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYWMyMWJjZTBkZTJkNDVlZjg4OTVjZjIwMTk4MjY3NGMgPSAkKCc8ZGl2IGlkPSJodG1sX2FjMjFiY2UwZGUyZDQ1ZWY4ODk1Y2YyMDE5ODI2NzRjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Vbml2ZXJzaXR5IG9mIENoaWNhZ28gQCBNaWR3YXkgUGxhaXNhbmNlIENsdXN0ZXIgMTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZWQ5MmEyZTQxMTZlNDRlNzljNjE3ZWI3OGY5MGNkNjIuc2V0Q29udGVudChodG1sX2FjMjFiY2UwZGUyZDQ1ZWY4ODk1Y2YyMDE5ODI2NzRjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzMyOTRkNTI4NzQ3OTQxOGY5OTdiYzZiMGRlMDZkNTg2LmJpbmRQb3B1cChwb3B1cF9lZDkyYTJlNDExNmU0NGU3OWM2MTdlYjc4ZjkwY2Q2Mik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8zYzJkMWIyNDg3Njc0MzUzYjhjZDFhNzc0ZmYzMWE1NyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQxLjc4NDI0NTA5OTEyOTI3LC04Ny41OTAzNzE5NTUxNjE4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiM4MGZmYjQiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjODBmZmI0IiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzdjODJiNGI4MGNmMzQxMDc4ZWEzMzg4MDIwNTVmM2JhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2M2YjkxMTViM2ZkNTQyZjM5MmQ1NzZiNWNlZWM1ZGE4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2NhYmJiMGFiOTQ5MzRiMDQ4ZjMyNDM4NDNjMTZjY2FiID0gJCgnPGRpdiBpZD0iaHRtbF9jYWJiYjBhYjk0OTM0YjA0OGYzMjQzODQzYzE2Y2NhYiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QiYjMzk7R2FicyBHb29kaWVzIENsdXN0ZXIgMjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYzZiOTExNWIzZmQ1NDJmMzkyZDU3NmI1Y2VlYzVkYTguc2V0Q29udGVudChodG1sX2NhYmJiMGFiOTQ5MzRiMDQ4ZjMyNDM4NDNjMTZjY2FiKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzNjMmQxYjI0ODc2NzQzNTNiOGNkMWE3NzRmZjMxYTU3LmJpbmRQb3B1cChwb3B1cF9jNmI5MTE1YjNmZDU0MmYzOTJkNTc2YjVjZWVjNWRhOCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lMWY3NDJiZGEzNDk0MGVjYTlhMWVjYjhjMjAyOTViZiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQxLjc4NjAyOCwtODcuNTkwMDM0OTY2NjY2NjZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzgwMDBmZiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiM4MDAwZmYiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfN2M4MmI0YjgwY2YzNDEwNzhlYTMzODgwMjA1NWYzYmEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYThiZDZlYmYzMjlhNDc5Njk4YjFkNjU5YzA0ZmRhNGQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNDk0OGY2ODkxNmVkNGQ2OTkwZGEzZDI5NmMzNmFkYTggPSAkKCc8ZGl2IGlkPSJodG1sXzQ5NDhmNjg5MTZlZDRkNjk5MGRhM2QyOTZjMzZhZGE4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5QbHVtIENhZmUgYXQgQ2hpY2FnbyBQcmVzcyBCdWlsZGluZyBDbHVzdGVyIDE8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2E4YmQ2ZWJmMzI5YTQ3OTY5OGIxZDY1OWMwNGZkYTRkLnNldENvbnRlbnQoaHRtbF80OTQ4ZjY4OTE2ZWQ0ZDY5OTBkYTNkMjk2YzM2YWRhOCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9lMWY3NDJiZGEzNDk0MGVjYTlhMWVjYjhjMjAyOTViZi5iaW5kUG9wdXAocG9wdXBfYThiZDZlYmYzMjlhNDc5Njk4YjFkNjU5YzA0ZmRhNGQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMWU0Mjg3MWMwZjUzNGE1MGI0OWIzNmQ0M2I4OGUzNzYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MS43ODQ4Nzg5MDc4Nzk0NzQsLTg3LjU4ODc5OTM3MDM3NTMzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiM4MGZmYjQiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjODBmZmI0IiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzdjODJiNGI4MGNmMzQxMDc4ZWEzMzg4MDIwNTVmM2JhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2U0M2UyZDQ0Y2Y3NTQ3MmI4ODk5YmU4OWJiOGEyN2ZjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzYyMmI2YTY3YmVjODRlMDNiN2MyMTMyMGIxMWIxZjE0ID0gJCgnPGRpdiBpZD0iaHRtbF82MjJiNmE2N2JlYzg0ZTAzYjdjMjEzMjBiMTFiMWYxNCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+SmFja3NvbiBUb3dlcnMgRml0bmVzcyBDbHVzdGVyIDI8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2U0M2UyZDQ0Y2Y3NTQ3MmI4ODk5YmU4OWJiOGEyN2ZjLnNldENvbnRlbnQoaHRtbF82MjJiNmE2N2JlYzg0ZTAzYjdjMjEzMjBiMTFiMWYxNCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8xZTQyODcxYzBmNTM0YTUwYjQ5YjM2ZDQzYjg4ZTM3Ni5iaW5kUG9wdXAocG9wdXBfZTQzZTJkNDRjZjc1NDcyYjg4OTliZTg5YmI4YTI3ZmMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOTRjNzZkYjM3MTVhNGJmNGFhZDQ5N2JkMWI0NDBiN2YgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MS43ODc3Mjg4Njg1NjExMjUsLTg3LjU4ODc4ODcxMzczNF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjODAwMGZmIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzgwMDBmZiIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83YzgyYjRiODBjZjM0MTA3OGVhMzM4ODAyMDU1ZjNiYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9kYzE4M2Q3YzdhMzQ0NjEyOGE0ZjlhZTc2OTliZWU5ZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zNjg0OGEyNzljODU0NGUyOWIxNjYxZDZlYzJkODIxYSA9ICQoJzxkaXYgaWQ9Imh0bWxfMzY4NDhhMjc5Yzg1NDRlMjliMTY2MWQ2ZWMyZDgyMWEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk1ldHJhIC0gNTl0aCBTdCAoVW5pdmVyc2l0eSBvZiBDaGljYWdvKSBDbHVzdGVyIDE8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2RjMTgzZDdjN2EzNDQ2MTI4YTRmOWFlNzY5OWJlZTlkLnNldENvbnRlbnQoaHRtbF8zNjg0OGEyNzljODU0NGUyOWIxNjYxZDZlYzJkODIxYSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl85NGM3NmRiMzcxNWE0YmY0YWFkNDk3YmQxYjQ0MGI3Zi5iaW5kUG9wdXAocG9wdXBfZGMxODNkN2M3YTM0NDYxMjhhNGY5YWU3Njk5YmVlOWQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZGQ2YWQyMzU0YzIyNGM3Mzg5ZmNmOGEyZTJiMDYxZDAgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MS43ODMzNjc5OTk5OTk5OTYsLTg3LjU4NjgwNjAwMDAwMDAxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiM4MGZmYjQiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjODBmZmI0IiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzdjODJiNGI4MGNmMzQxMDc4ZWEzMzg4MDIwNTVmM2JhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzlhNzE1Njc1NDdiMzRkZTZiMDA1YWViOTkwNWMxMGZiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2Q2NDFiYzVhZDYxNjRmNGJiODIzMGUzYmE5ZmJkNGNjID0gJCgnPGRpdiBpZD0iaHRtbF9kNjQxYmM1YWQ2MTY0ZjRiYjgyMzBlM2JhOWZiZDRjYyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+SmFja3NvbiBQYXJrIFRyYWNrICZhbXA7IFNvY2NlciBGaWVsZCBDbHVzdGVyIDI8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzlhNzE1Njc1NDdiMzRkZTZiMDA1YWViOTkwNWMxMGZiLnNldENvbnRlbnQoaHRtbF9kNjQxYmM1YWQ2MTY0ZjRiYjgyMzBlM2JhOWZiZDRjYyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9kZDZhZDIzNTRjMjI0YzczODlmY2Y4YTJlMmIwNjFkMC5iaW5kUG9wdXAocG9wdXBfOWE3MTU2NzU0N2IzNGRlNmIwMDVhZWI5OTA1YzEwZmIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNDI2MmQ5OTM0N2Q5NGNhNmI2NWI4ZWUyMTAxMmVmYmMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MS43ODgyMTk0NTE5MDQzLC04Ny41OTA5NjUyNzA5OTYxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiM4MDAwZmYiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjODAwMGZmIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzdjODJiNGI4MGNmMzQxMDc4ZWEzMzg4MDIwNTVmM2JhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzA2MzA2ZjEyNGEyZTQ0ZjA4N2Y5NjQ2ZDU3ZjEyYTJkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2NlNDg4OGI3Nzg0ZDRiM2U5MjAzNzE2YWIyM2NjYmM1ID0gJCgnPGRpdiBpZD0iaHRtbF9jZTQ4ODhiNzc4NGQ0YjNlOTIwMzcxNmFiMjNjY2JjNSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+VGlmZmluIENhZmUgQ2x1c3RlciAxPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wNjMwNmYxMjRhMmU0NGYwODdmOTY0NmQ1N2YxMmEyZC5zZXRDb250ZW50KGh0bWxfY2U0ODg4Yjc3ODRkNGIzZTkyMDM3MTZhYjIzY2NiYzUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNDI2MmQ5OTM0N2Q5NGNhNmI2NWI4ZWUyMTAxMmVmYmMuYmluZFBvcHVwKHBvcHVwXzA2MzA2ZjEyNGEyZTQ0ZjA4N2Y5NjQ2ZDU3ZjEyYTJkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzkzZjUyNzI4ZmQ4NDQ1YzdiMWMzNWY2Y2U2YzE2NTIxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDEuNzg4MjQsLTg3LjU5MDgwNF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjODAwMGZmIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzgwMDBmZiIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83YzgyYjRiODBjZjM0MTA3OGVhMzM4ODAyMDU1ZjNiYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF83MmRkYTc0YTU3Mjc0YTQ4ODg1YTA4ZDM4OTExMWY0YyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iMzkwN2FkMzUzODk0ODRjOTZjYmJiZDZkYTZjMzlkMSA9ICQoJzxkaXYgaWQ9Imh0bWxfYjM5MDdhZDM1Mzg5NDg0Yzk2Y2JiYmQ2ZGE2YzM5ZDEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkludGVybmF0aW9uYWwgSG91c2UgYXQgdGhlIFVuaXZlcnNpdHkgb2YgQ2hpY2FnbyBDbHVzdGVyIDE8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzcyZGRhNzRhNTcyNzRhNDg4ODVhMDhkMzg5MTExZjRjLnNldENvbnRlbnQoaHRtbF9iMzkwN2FkMzUzODk0ODRjOTZjYmJiZDZkYTZjMzlkMSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl85M2Y1MjcyOGZkODQ0NWM3YjFjMzVmNmNlNmMxNjUyMS5iaW5kUG9wdXAocG9wdXBfNzJkZGE3NGE1NzI3NGE0ODg4NWEwOGQzODkxMTFmNGMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMzRkNmNhNjBiMDc4NGI4Yzk5ZTkyMTExYTEyOTk1MmMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MS43ODc5NDI4MSwtODcuNTg4MzE1MTddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzgwMDBmZiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiM4MDAwZmYiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfN2M4MmI0YjgwY2YzNDEwNzhlYTMzODgwMjA1NWYzYmEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOTJkZjdkMDczZDMxNDAwYmE1YzgyMTczMGI2NDBiZGEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZWE0YWJjNTIzMWMyNDIyOTk4YTIyZjM2YWE2MzQzZTQgPSAkKCc8ZGl2IGlkPSJodG1sX2VhNGFiYzUyMzFjMjQyMjk5OGEyMmYzNmFhNjM0M2U0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5EaXZ2eSBTdGF0aW9uIENsdXN0ZXIgMTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOTJkZjdkMDczZDMxNDAwYmE1YzgyMTczMGI2NDBiZGEuc2V0Q29udGVudChodG1sX2VhNGFiYzUyMzFjMjQyMjk5OGEyMmYzNmFhNjM0M2U0KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzM0ZDZjYTYwYjA3ODRiOGM5OWU5MjExMWExMjk5NTJjLmJpbmRQb3B1cChwb3B1cF85MmRmN2QwNzNkMzE0MDBiYTVjODIxNzMwYjY0MGJkYSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9hZTlhNGJlODJkMmI0OTE0OTE1ZjY0NjBmY2JkOWQyYiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQxLjc4MjMyMTAzMTkwOTAyLC04Ny41OTQ4MDk1MzIxNjU1M10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjZmYwMDAwIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiI2ZmMDAwMCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83YzgyYjRiODBjZjM0MTA3OGVhMzM4ODAyMDU1ZjNiYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hMGY4MWExYWEwN2Q0NWQ4YTJjNDI5Mzg0MjcxM2IwMCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zNGM2ZTQwN2MzYjM0Y2U1YTFhZGQ4YjI4MWNjM2U0ZSA9ICQoJzxkaXYgaWQ9Imh0bWxfMzRjNmU0MDdjM2IzNGNlNWExYWRkOGIyODFjYzNlNGUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkh1Y2tsZWJlcnJ5IFBhcmsgQ2x1c3RlciAwPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hMGY4MWExYWEwN2Q0NWQ4YTJjNDI5Mzg0MjcxM2IwMC5zZXRDb250ZW50KGh0bWxfMzRjNmU0MDdjM2IzNGNlNWExYWRkOGIyODFjYzNlNGUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYWU5YTRiZTgyZDJiNDkxNDkxNWY2NDYwZmNiZDlkMmIuYmluZFBvcHVwKHBvcHVwX2EwZjgxYTFhYTA3ZDQ1ZDhhMmM0MjkzODQyNzEzYjAwKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2Y4NGQyYTU2NzlmMzRhNjRiMWM5ZGQyM2E4MTAxZTE2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDEuNzg3OTg3LC04Ny41ODY1Nl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjODAwMGZmIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzgwMDBmZiIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83YzgyYjRiODBjZjM0MTA3OGVhMzM4ODAyMDU1ZjNiYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF80NDY2NzE4YTNmNmY0MGU1OTIwMDMwNjhiZmU4MmQ4OSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iYmJhYTlmYjlkZGI0YmZkODI0NTNmNzg0ZmU2YzAwMCA9ICQoJzxkaXYgaWQ9Imh0bWxfYmJiYWE5ZmI5ZGRiNGJmZDgyNDUzZjc4NGZlNmMwMDAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNUQSBCdXMgU3RvcCAxNTEzIENsdXN0ZXIgMTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNDQ2NjcxOGEzZjZmNDBlNTkyMDAzMDY4YmZlODJkODkuc2V0Q29udGVudChodG1sX2JiYmFhOWZiOWRkYjRiZmQ4MjQ1M2Y3ODRmZTZjMDAwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2Y4NGQyYTU2NzlmMzRhNjRiMWM5ZGQyM2E4MTAxZTE2LmJpbmRQb3B1cChwb3B1cF80NDY2NzE4YTNmNmY0MGU1OTIwMDMwNjhiZmU4MmQ4OSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9kYzYxNzNjZjE0MTU0MzE3YWUzOWEzYjg5YmI2ZWM4YiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQxLjc4MDg1NCwtODcuNTg4NDUxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiM4MGZmYjQiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjODBmZmI0IiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzdjODJiNGI4MGNmMzQxMDc4ZWEzMzg4MDIwNTVmM2JhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2ViY2RmZDYwMzQwNjRmZjE4ODNkNGNiMTNhNDg0NjBjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzI2MGVhZGQ3MjY4ODRkOGVhZTU2MGNlZDBhMjFjY2Y0ID0gJCgnPGRpdiBpZD0iaHRtbF8yNjBlYWRkNzI2ODg0ZDhlYWU1NjBjZWQwYTIxY2NmNCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TGVvbiYjMzk7cyBCYXJiZWN1ZSBDbHVzdGVyIDI8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2ViY2RmZDYwMzQwNjRmZjE4ODNkNGNiMTNhNDg0NjBjLnNldENvbnRlbnQoaHRtbF8yNjBlYWRkNzI2ODg0ZDhlYWU1NjBjZWQwYTIxY2NmNCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9kYzYxNzNjZjE0MTU0MzE3YWUzOWEzYjg5YmI2ZWM4Yi5iaW5kUG9wdXAocG9wdXBfZWJjZGZkNjAzNDA2NGZmMTg4M2Q0Y2IxM2E0ODQ2MGMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNjZkZGEyYWIyYTBmNDA0NTljYWRhZTZkNWNkYWQ2MDMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MS43ODA4Njg1MzAyNzM0NCwtODcuNTg4MTg4MTcxMzg2NzJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzgwZmZiNCIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiM4MGZmYjQiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfN2M4MmI0YjgwY2YzNDEwNzhlYTMzODgwMjA1NWYzYmEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYjgwNDJjYmFlMWE1NDlmNmFmNWVjZDdjMThjOTUzMTggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYWJkMmMwMzEwMTM4NGI5N2E1MjZhNjAxY2FmNmI1ODIgPSAkKCc8ZGl2IGlkPSJodG1sX2FiZDJjMDMxMDEzODRiOTdhNTI2YTYwMWNhZjZiNTgyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5UcmVzIE9yaWdpbmFsIFBhbmNha2VzIENsdXN0ZXIgMjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYjgwNDJjYmFlMWE1NDlmNmFmNWVjZDdjMThjOTUzMTguc2V0Q29udGVudChodG1sX2FiZDJjMDMxMDEzODRiOTdhNTI2YTYwMWNhZjZiNTgyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzY2ZGRhMmFiMmEwZjQwNDU5Y2FkYWU2ZDVjZGFkNjAzLmJpbmRQb3B1cChwb3B1cF9iODA0MmNiYWUxYTU0OWY2YWY1ZWNkN2MxOGM5NTMxOCk7CgogICAgICAgICAgICAKICAgICAgICAKPC9zY3JpcHQ+ onload=\"this.contentDocument.open();this.contentDocument.write(atob(this.getAttribute('data-html')));this.contentDocument.close();\" allowfullscreen webkitallowfullscreen mozallowfullscreen></iframe></div></div>"
],
"text/plain": [
"<folium.folium.Map at 0x7f22f6b92518>"
]
},
"execution_count": 67,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# create map\n",
"map_clusters = folium.Map(location=[chi_latitude, chi_longitude], zoom_start=16)\n",
"\n",
"# set color scheme for the clusters\n",
"x = np.arange(kclusters)\n",
"ys = [i + x + (i*x)**2 for i in range(kclusters)]\n",
"colors_array = cm.rainbow(np.linspace(0, 1, len(ys)))\n",
"rainbow = [colors.rgb2hex(i) for i in colors_array]\n",
"\n",
"# add markers to the map\n",
"markers_colors = []\n",
"for lat, lon, poi, cluster in zip(chi_df_with_clusters['Latitude'], chi_df_with_clusters['Longitude'], chi_df_with_clusters['Name'], chi_df_with_clusters['Cluster Labels']):\n",
" label = folium.Popup(str(poi) + ' Cluster ' + str(cluster), parse_html=True)\n",
" folium.CircleMarker(\n",
" [lat, lon],\n",
" radius=5,\n",
" popup=label,\n",
" color=rainbow[cluster-1],\n",
" fill=True,\n",
" fill_color=rainbow[cluster-1],\n",
" fill_opacity=0.7).add_to(map_clusters)\n",
" \n",
"map_clusters"
]
},
{
"cell_type": "code",
"execution_count": 50,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([2, 2, 0, 2, 2, 0, 0, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0], dtype=int32)"
]
},
"execution_count": 50,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# set number of clusters\n",
"kclusters = 3\n",
"\n",
"atl_df_clustering = atl_df.drop(['Name','Category Type'], 1)\n",
"\n",
"# run k-means clustering\n",
"kmeans = KMeans(n_clusters=kclusters, random_state=0).fit(atl_df_clustering)\n",
"\n",
"# check cluster labels generated for each row in the dataframe\n",
"kmeans.labels_[0:17]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We then need to create a new dataframe with the clusters."
]
},
{
"cell_type": "code",
"execution_count": 54,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Cluster Labels</th>\n",
" <th>Latitude</th>\n",
" <th>Longitude</th>\n",
" <th>Name</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>2</td>\n",
" <td>33.770980</td>\n",
" <td>-84.398037</td>\n",
" <td>Coca-Cola Mainstreet @ AOC</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>2</td>\n",
" <td>33.772646</td>\n",
" <td>-84.394585</td>\n",
" <td>Highland Bakery</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>0</td>\n",
" <td>33.774820</td>\n",
" <td>-84.399194</td>\n",
" <td>Ferst Center For The Arts</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>2</td>\n",
" <td>33.771146</td>\n",
" <td>-84.395785</td>\n",
" <td>Hampton Inn by Hilton</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>2</td>\n",
" <td>33.771179</td>\n",
" <td>-84.396202</td>\n",
" <td>T-Mobile</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>0</td>\n",
" <td>33.772548</td>\n",
" <td>-84.398430</td>\n",
" <td>Wells Fargo</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>0</td>\n",
" <td>33.773673</td>\n",
" <td>-84.398203</td>\n",
" <td>Chick-fil-A</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>0</td>\n",
" <td>33.774261</td>\n",
" <td>-84.396411</td>\n",
" <td>Starbucks</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>0</td>\n",
" <td>33.773779</td>\n",
" <td>-84.398137</td>\n",
" <td>Panda Express</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>0</td>\n",
" <td>33.773898</td>\n",
" <td>-84.398869</td>\n",
" <td>Under The Couch</td>\n",
" </tr>\n",
" <tr>\n",
" <th>10</th>\n",
" <td>2</td>\n",
" <td>33.773019</td>\n",
" <td>-84.395299</td>\n",
" <td>Harrison Square</td>\n",
" </tr>\n",
" <tr>\n",
" <th>11</th>\n",
" <td>0</td>\n",
" <td>33.773780</td>\n",
" <td>-84.398206</td>\n",
" <td>Taco Bell</td>\n",
" </tr>\n",
" <tr>\n",
" <th>12</th>\n",
" <td>0</td>\n",
" <td>33.773770</td>\n",
" <td>-84.398083</td>\n",
" <td>Burdell's</td>\n",
" </tr>\n",
" <tr>\n",
" <th>13</th>\n",
" <td>0</td>\n",
" <td>33.774428</td>\n",
" <td>-84.396552</td>\n",
" <td>Rooftop Garden</td>\n",
" </tr>\n",
" <tr>\n",
" <th>14</th>\n",
" <td>1</td>\n",
" <td>33.771246</td>\n",
" <td>-84.392037</td>\n",
" <td>GT Stinger Stop - Techwood and North Ave</td>\n",
" </tr>\n",
" <tr>\n",
" <th>15</th>\n",
" <td>0</td>\n",
" <td>33.774451</td>\n",
" <td>-84.398904</td>\n",
" <td>Student Center Food Court</td>\n",
" </tr>\n",
" <tr>\n",
" <th>16</th>\n",
" <td>0</td>\n",
" <td>33.774428</td>\n",
" <td>-84.398808</td>\n",
" <td>Dunkin'</td>\n",
" </tr>\n",
" <tr>\n",
" <th>17</th>\n",
" <td>0</td>\n",
" <td>33.775224</td>\n",
" <td>-84.397190</td>\n",
" <td>Einstein Statue</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Cluster Labels Latitude Longitude \\\n",
"0 2 33.770980 -84.398037 \n",
"1 2 33.772646 -84.394585 \n",
"2 0 33.774820 -84.399194 \n",
"3 2 33.771146 -84.395785 \n",
"4 2 33.771179 -84.396202 \n",
"5 0 33.772548 -84.398430 \n",
"6 0 33.773673 -84.398203 \n",
"7 0 33.774261 -84.396411 \n",
"8 0 33.773779 -84.398137 \n",
"9 0 33.773898 -84.398869 \n",
"10 2 33.773019 -84.395299 \n",
"11 0 33.773780 -84.398206 \n",
"12 0 33.773770 -84.398083 \n",
"13 0 33.774428 -84.396552 \n",
"14 1 33.771246 -84.392037 \n",
"15 0 33.774451 -84.398904 \n",
"16 0 33.774428 -84.398808 \n",
"17 0 33.775224 -84.397190 \n",
"\n",
" Name \n",
"0 Coca-Cola Mainstreet @ AOC \n",
"1 Highland Bakery \n",
"2 Ferst Center For The Arts \n",
"3 Hampton Inn by Hilton \n",
"4 T-Mobile \n",
"5 Wells Fargo \n",
"6 Chick-fil-A \n",
"7 Starbucks \n",
"8 Panda Express \n",
"9 Under The Couch \n",
"10 Harrison Square \n",
"11 Taco Bell \n",
"12 Burdell's \n",
"13 Rooftop Garden \n",
"14 GT Stinger Stop - Techwood and North Ave \n",
"15 Student Center Food Court \n",
"16 Dunkin' \n",
"17 Einstein Statue "
]
},
"execution_count": 54,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"atl_df_merged = atl_df_clustering\n",
"#atl_df_merged.insert(0, 'Cluster Labels', kmeans.labels_)\n",
"name_column = atl_df['Name']\n",
"atl_df_with_clusters = pd.concat([atl_df_merged,name_column], axis = 1)\n",
"atl_df_with_clusters"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"As you can see with the clusters, the prediction was correct that near Georgia Institute of Technology there is shopping enter based on the venues. There was a color coordinated data points and one outlier was present based on the map which is location GT Stringer Shop in its own cluster group as one data point."
]
},
{
"cell_type": "code",
"execution_count": 69,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div style=\"width:100%;\"><div style=\"position:relative;width:100%;height:0;padding-bottom:60%;\"><span style=\"color:#565656\">Make this Notebook Trusted to load map: File -> Trust Notebook</span><iframe src=\"about:blank\" style=\"position:absolute;width:100%;height:100%;left:0;top:0;border:none !important;\" data-html=PCFET0NUWVBFIGh0bWw+CjxoZWFkPiAgICAKICAgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPgogICAgPHNjcmlwdD5MX1BSRUZFUl9DQU5WQVMgPSBmYWxzZTsgTF9OT19UT1VDSCA9IGZhbHNlOyBMX0RJU0FCTEVfM0QgPSBmYWxzZTs8L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2FqYXguZ29vZ2xlYXBpcy5jb20vYWpheC9saWJzL2pxdWVyeS8xLjExLjEvanF1ZXJ5Lm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvanMvYm9vdHN0cmFwLm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvTGVhZmxldC5hd2Vzb21lLW1hcmtlcnMvMi4wLjIvbGVhZmxldC5hd2Vzb21lLW1hcmtlcnMuanMiPjwvc2NyaXB0PgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9jc3MvYm9vdHN0cmFwLm1pbi5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvY3NzL2Jvb3RzdHJhcC10aGVtZS5taW4uY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vbWF4Y2RuLmJvb3RzdHJhcGNkbi5jb20vZm9udC1hd2Vzb21lLzQuNi4zL2Nzcy9mb250LWF3ZXNvbWUubWluLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9MZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy8yLjAuMi9sZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9yYXdnaXQuY29tL3B5dGhvbi12aXN1YWxpemF0aW9uL2ZvbGl1bS9tYXN0ZXIvZm9saXVtL3RlbXBsYXRlcy9sZWFmbGV0LmF3ZXNvbWUucm90YXRlLmNzcyIvPgogICAgPHN0eWxlPmh0bWwsIGJvZHkge3dpZHRoOiAxMDAlO2hlaWdodDogMTAwJTttYXJnaW46IDA7cGFkZGluZzogMDt9PC9zdHlsZT4KICAgIDxzdHlsZT4jbWFwIHtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtyaWdodDowO2xlZnQ6MDt9PC9zdHlsZT4KICAgIAogICAgICAgICAgICA8c3R5bGU+ICNtYXBfYmQ5MDc0YmQ3YWYxNGIzNGI2YTExOTgyYWMwM2NjODkgewogICAgICAgICAgICAgICAgcG9zaXRpb24gOiByZWxhdGl2ZTsKICAgICAgICAgICAgICAgIHdpZHRoIDogMTAwLjAlOwogICAgICAgICAgICAgICAgaGVpZ2h0OiAxMDAuMCU7CiAgICAgICAgICAgICAgICBsZWZ0OiAwLjAlOwogICAgICAgICAgICAgICAgdG9wOiAwLjAlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICA8L3N0eWxlPgogICAgICAgIAo8L2hlYWQ+Cjxib2R5PiAgICAKICAgIAogICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb2xpdW0tbWFwIiBpZD0ibWFwX2JkOTA3NGJkN2FmMTRiMzRiNmExMTk4MmFjMDNjYzg5IiA+PC9kaXY+CiAgICAgICAgCjwvYm9keT4KPHNjcmlwdD4gICAgCiAgICAKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGJvdW5kcyA9IG51bGw7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcF9iZDkwNzRiZDdhZjE0YjM0YjZhMTE5ODJhYzAzY2M4OSA9IEwubWFwKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21hcF9iZDkwNzRiZDdhZjE0YjM0YjZhMTE5ODJhYzAzY2M4OScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y2VudGVyOiBbMzMuNzcxMzUyNiwtODQuMzk2MzQ1XSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpvb206IDE2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4Qm91bmRzOiBib3VuZHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXllcnM6IFtdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ybGRDb3B5SnVtcDogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcnM6IEwuQ1JTLkVQU0czODU3CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgdGlsZV9sYXllcl83ZGFmOWVkNWFiMGU0YTM3OWQyYWEzYjU2NDFkYWQyMyA9IEwudGlsZUxheWVyKAogICAgICAgICAgICAgICAgJ2h0dHBzOi8ve3N9LnRpbGUub3BlbnN0cmVldG1hcC5vcmcve3p9L3t4fS97eX0ucG5nJywKICAgICAgICAgICAgICAgIHsKICAiYXR0cmlidXRpb24iOiBudWxsLAogICJkZXRlY3RSZXRpbmEiOiBmYWxzZSwKICAibWF4Wm9vbSI6IDE4LAogICJtaW5ab29tIjogMSwKICAibm9XcmFwIjogZmFsc2UsCiAgInN1YmRvbWFpbnMiOiAiYWJjIgp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9iZDkwNzRiZDdhZjE0YjM0YjZhMTE5ODJhYzAzY2M4OSk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZWY1ZTU0OGMzMGE5NDdkMWE2NmJiMjg5OTkwODhmMjEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszMy43NzA5Nzk5ODQxNjM0LC04NC4zOTgwMzY3Njc4NTA4MV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjODBmZmI0IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzgwZmZiNCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9iZDkwNzRiZDdhZjE0YjM0YjZhMTE5ODJhYzAzY2M4OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wNzQ5YWE5OTIxODU0NWQ5YTEzZmM4MGVkNWY3MTE0YyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wY2NlMTMzY2VjMTI0NDdjOWI0NmZjNjRmYjVjMDMyNSA9ICQoJzxkaXYgaWQ9Imh0bWxfMGNjZTEzM2NlYzEyNDQ3YzliNDZmYzY0ZmI1YzAzMjUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNvY2EtQ29sYSBNYWluc3RyZWV0IEAgQU9DIENsdXN0ZXIgMjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMDc0OWFhOTkyMTg1NDVkOWExM2ZjODBlZDVmNzExNGMuc2V0Q29udGVudChodG1sXzBjY2UxMzNjZWMxMjQ0N2M5YjQ2ZmM2NGZiNWMwMzI1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2VmNWU1NDhjMzBhOTQ3ZDFhNjZiYjI4OTk5MDg4ZjIxLmJpbmRQb3B1cChwb3B1cF8wNzQ5YWE5OTIxODU0NWQ5YTEzZmM4MGVkNWY3MTE0Yyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl84YTUyZjBhMTA5Yzk0OWMwYjlhY2EyODhlNjA3MmEyNCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzMzLjc3MjY0NjEwNDgxMTE1LC04NC4zOTQ1ODU0OTAyMjY3NV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjODBmZmI0IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzgwZmZiNCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9iZDkwNzRiZDdhZjE0YjM0YjZhMTE5ODJhYzAzY2M4OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xMDY1NDI1ZmUwMGY0MzVjYmUwOTg3NDQwMmUxZWMwNiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lMzRhMGM1ODNhZTQ0MGNlYjkxNDMxMmU0OTI2MmJkYiA9ICQoJzxkaXYgaWQ9Imh0bWxfZTM0YTBjNTgzYWU0NDBjZWI5MTQzMTJlNDkyNjJiZGIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkhpZ2hsYW5kIEJha2VyeSBDbHVzdGVyIDI8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzEwNjU0MjVmZTAwZjQzNWNiZTA5ODc0NDAyZTFlYzA2LnNldENvbnRlbnQoaHRtbF9lMzRhMGM1ODNhZTQ0MGNlYjkxNDMxMmU0OTI2MmJkYik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl84YTUyZjBhMTA5Yzk0OWMwYjlhY2EyODhlNjA3MmEyNC5iaW5kUG9wdXAocG9wdXBfMTA2NTQyNWZlMDBmNDM1Y2JlMDk4NzQ0MDJlMWVjMDYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOWU5ZWQwM2NhNTgwNGMxMDkwZDAwMzI4MWY1MjJmYjkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszMy43NzQ4MTk4NzY1MTkxNzQsLTg0LjM5OTE5MzU2NDgxNzIyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiNmZjAwMDAiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjZmYwMDAwIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2JkOTA3NGJkN2FmMTRiMzRiNmExMTk4MmFjMDNjYzg5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2I0ZTQ3NTMxODFlMjQ4NzM4YWE1NmJkOGMxYTkxYTZlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzIyMGQxZmM0N2UyNTRhMDQ5N2M4YmU1ZWI4OTg3OWFlID0gJCgnPGRpdiBpZD0iaHRtbF8yMjBkMWZjNDdlMjU0YTA0OTdjOGJlNWViODk4NzlhZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RmVyc3QgQ2VudGVyIEZvciBUaGUgQXJ0cyBDbHVzdGVyIDA8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2I0ZTQ3NTMxODFlMjQ4NzM4YWE1NmJkOGMxYTkxYTZlLnNldENvbnRlbnQoaHRtbF8yMjBkMWZjNDdlMjU0YTA0OTdjOGJlNWViODk4NzlhZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl85ZTllZDAzY2E1ODA0YzEwOTBkMDAzMjgxZjUyMmZiOS5iaW5kUG9wdXAocG9wdXBfYjRlNDc1MzE4MWUyNDg3MzhhYTU2YmQ4YzFhOTFhNmUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNDUxYTA0NDE5NjNmNGJkY2E3YmNlNWU3MGE1NzUzNjggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszMy43NzExNDU2NjI1MzU2OCwtODQuMzk1Nzg1MTExOTczOTZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzgwZmZiNCIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiM4MGZmYjQiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYmQ5MDc0YmQ3YWYxNGIzNGI2YTExOTgyYWMwM2NjODkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOTk4MGE0ZDcwYmYyNDg3MDliYzRlNTU5N2JhZGUyODIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZDY0YjE0N2YxMjdkNDQ2MzkwZTNiMTU4MTJjNDE4Y2EgPSAkKCc8ZGl2IGlkPSJodG1sX2Q2NGIxNDdmMTI3ZDQ0NjM5MGUzYjE1ODEyYzQxOGNhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5IYW1wdG9uIElubiBieSBIaWx0b24gQ2x1c3RlciAyPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85OTgwYTRkNzBiZjI0ODcwOWJjNGU1NTk3YmFkZTI4Mi5zZXRDb250ZW50KGh0bWxfZDY0YjE0N2YxMjdkNDQ2MzkwZTNiMTU4MTJjNDE4Y2EpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNDUxYTA0NDE5NjNmNGJkY2E3YmNlNWU3MGE1NzUzNjguYmluZFBvcHVwKHBvcHVwXzk5ODBhNGQ3MGJmMjQ4NzA5YmM0ZTU1OTdiYWRlMjgyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzhlZmRhMTIxOGFiODQ5MDJhMTA1ZWZkMGNjODAwNzJkID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzMuNzcxMTc5MTk5MjE4NzUsLTg0LjM5NjIwMjA4NzQwMjM0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiM4MGZmYjQiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjODBmZmI0IiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2JkOTA3NGJkN2FmMTRiMzRiNmExMTk4MmFjMDNjYzg5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2VlNzczOThhN2RlMzRmMmQ5MmIzNDkyODJiMDZiZmIxID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzFhMWFhMzI2ZmRhNDQ1YjBiOGVhM2UxYjhiZjE4ZTIyID0gJCgnPGRpdiBpZD0iaHRtbF8xYTFhYTMyNmZkYTQ0NWIwYjhlYTNlMWI4YmYxOGUyMiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+VC1Nb2JpbGUgQ2x1c3RlciAyPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lZTc3Mzk4YTdkZTM0ZjJkOTJiMzQ5MjgyYjA2YmZiMS5zZXRDb250ZW50KGh0bWxfMWExYWEzMjZmZGE0NDViMGI4ZWEzZTFiOGJmMThlMjIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOGVmZGExMjE4YWI4NDkwMmExMDVlZmQwY2M4MDA3MmQuYmluZFBvcHVwKHBvcHVwX2VlNzczOThhN2RlMzRmMmQ5MmIzNDkyODJiMDZiZmIxKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzQzZWY4ZDE5MzgyMTQyMjRhZDZmYzM5N2JhNWYwMzk1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzMuNzcyNTQ4NDY1MzQyMTgsLTg0LjM5ODQzMDQyNTQxNTQ4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiNmZjAwMDAiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjZmYwMDAwIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2JkOTA3NGJkN2FmMTRiMzRiNmExMTk4MmFjMDNjYzg5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzA3YTQ0OWY0ZGUxOTRhYjFiYWUzYzhiZjRiMWVkNmEwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzIzM2NmMTI4YzUwYjRhZjJiYzlkMmU1NmM3Yzc1OTM5ID0gJCgnPGRpdiBpZD0iaHRtbF8yMzNjZjEyOGM1MGI0YWYyYmM5ZDJlNTZjN2M3NTkzOSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+V2VsbHMgRmFyZ28gQ2x1c3RlciAwPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wN2E0NDlmNGRlMTk0YWIxYmFlM2M4YmY0YjFlZDZhMC5zZXRDb250ZW50KGh0bWxfMjMzY2YxMjhjNTBiNGFmMmJjOWQyZTU2YzdjNzU5MzkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNDNlZjhkMTkzODIxNDIyNGFkNmZjMzk3YmE1ZjAzOTUuYmluZFBvcHVwKHBvcHVwXzA3YTQ0OWY0ZGUxOTRhYjFiYWUzYzhiZjRiMWVkNmEwKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2QzMTM4NzRjYTJkNzRiNWRhZjRkZjU2Y2NjODc3Y2NlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzMuNzczNjczMiwtODQuMzk4MjAyN10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjZmYwMDAwIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiI2ZmMDAwMCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9iZDkwNzRiZDdhZjE0YjM0YjZhMTE5ODJhYzAzY2M4OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8yODQxNmYxMTczNGQ0MzQ3YjU5M2Q5ZGU0ZTU3NWNhNCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lZDFmNjlmYWMxODc0ZTY0YWFkMGZkODZiMWYwZDIyMCA9ICQoJzxkaXYgaWQ9Imh0bWxfZWQxZjY5ZmFjMTg3NGU2NGFhZDBmZDg2YjFmMGQyMjAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNoaWNrLWZpbC1BIENsdXN0ZXIgMDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMjg0MTZmMTE3MzRkNDM0N2I1OTNkOWRlNGU1NzVjYTQuc2V0Q29udGVudChodG1sX2VkMWY2OWZhYzE4NzRlNjRhYWQwZmQ4NmIxZjBkMjIwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2QzMTM4NzRjYTJkNzRiNWRhZjRkZjU2Y2NjODc3Y2NlLmJpbmRQb3B1cChwb3B1cF8yODQxNmYxMTczNGQ0MzQ3YjU5M2Q5ZGU0ZTU3NWNhNCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8yYWEwZDJlYjE4ZTU0MDVlYjI4Njc4OTBiZjA5Njk4YSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzMzLjc3NDI2MSwtODQuMzk2NDExXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiNmZjAwMDAiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjZmYwMDAwIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2JkOTA3NGJkN2FmMTRiMzRiNmExMTk4MmFjMDNjYzg5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzRlYzZhMmZjZDVlZjRlNzNhOGRlMDg1NDZlY2NiN2E2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2U2ZDc0NTU1YTQ1ZjQxN2FiMDEzNTI1MDAwZWUxYWY1ID0gJCgnPGRpdiBpZD0iaHRtbF9lNmQ3NDU1NWE0NWY0MTdhYjAxMzUyNTAwMGVlMWFmNSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U3RhcmJ1Y2tzIENsdXN0ZXIgMDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNGVjNmEyZmNkNWVmNGU3M2E4ZGUwODU0NmVjY2I3YTYuc2V0Q29udGVudChodG1sX2U2ZDc0NTU1YTQ1ZjQxN2FiMDEzNTI1MDAwZWUxYWY1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzJhYTBkMmViMThlNTQwNWViMjg2Nzg5MGJmMDk2OThhLmJpbmRQb3B1cChwb3B1cF80ZWM2YTJmY2Q1ZWY0ZTczYThkZTA4NTQ2ZWNjYjdhNik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9hZDFkMTZhNDE3NWY0YWUwYmU1MjBhOWE2MmYzOTQ2ZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzMzLjc3Mzc3OTQ5Mjg5MzA1NSwtODQuMzk4MTM2Njg5ODE2MTFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiI2ZmMDAwMCIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiNmZjAwMDAiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYmQ5MDc0YmQ3YWYxNGIzNGI2YTExOTgyYWMwM2NjODkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZGMyYThmOTE3MmRiNDUzOWIxMDBiZjFjODhhOTQ1YTIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMDYzMzMwMzM1NWRjNDMxN2JhZjYzNDQ4M2RjZGZlNTMgPSAkKCc8ZGl2IGlkPSJodG1sXzA2MzMzMDMzNTVkYzQzMTdiYWY2MzQ0ODNkY2RmZTUzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5QYW5kYSBFeHByZXNzIENsdXN0ZXIgMDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZGMyYThmOTE3MmRiNDUzOWIxMDBiZjFjODhhOTQ1YTIuc2V0Q29udGVudChodG1sXzA2MzMzMDMzNTVkYzQzMTdiYWY2MzQ0ODNkY2RmZTUzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2FkMWQxNmE0MTc1ZjRhZTBiZTUyMGE5YTYyZjM5NDZlLmJpbmRQb3B1cChwb3B1cF9kYzJhOGY5MTcyZGI0NTM5YjEwMGJmMWM4OGE5NDVhMik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85ZjNiODk1MDNiNTI0MzMzYjU4NzgxYWNmNGQxN2YxMyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzMzLjc3Mzg5ODIwODgwMDc0NSwtODQuMzk4ODY5MDM3OTI4NTNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiI2ZmMDAwMCIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiNmZjAwMDAiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYmQ5MDc0YmQ3YWYxNGIzNGI2YTExOTgyYWMwM2NjODkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMTE3ZTJmZGY2OTdkNDIwNTkxYmJlZTFiOTYwY2Y5YmIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMTc4YzY0OTA0NWYzNGQ5MmJlMjJkY2Q3OTBjZTVkYTYgPSAkKCc8ZGl2IGlkPSJodG1sXzE3OGM2NDkwNDVmMzRkOTJiZTIyZGNkNzkwY2U1ZGE2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5VbmRlciBUaGUgQ291Y2ggQ2x1c3RlciAwPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xMTdlMmZkZjY5N2Q0MjA1OTFiYmVlMWI5NjBjZjliYi5zZXRDb250ZW50KGh0bWxfMTc4YzY0OTA0NWYzNGQ5MmJlMjJkY2Q3OTBjZTVkYTYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOWYzYjg5NTAzYjUyNDMzM2I1ODc4MWFjZjRkMTdmMTMuYmluZFBvcHVwKHBvcHVwXzExN2UyZmRmNjk3ZDQyMDU5MWJiZWUxYjk2MGNmOWJiKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzhhZjBjNGM1ODNkNDRiMTlhZGVkZDkwYzllYTI3YzlhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzMuNzczMDE4NzE3NzY1ODEsLTg0LjM5NTI5ODk1NzgyNDddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzgwZmZiNCIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiM4MGZmYjQiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYmQ5MDc0YmQ3YWYxNGIzNGI2YTExOTgyYWMwM2NjODkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMzFlYjc1OGQ1NjM3NDg2Yjg1MGNhM2RmZjE5YWYwNTQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOGI0ODc0ZTc2MzA2NDRkNWIwNTljZjNkMjkzMDg5MGQgPSAkKCc8ZGl2IGlkPSJodG1sXzhiNDg3NGU3NjMwNjQ0ZDViMDU5Y2YzZDI5MzA4OTBkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5IYXJyaXNvbiBTcXVhcmUgQ2x1c3RlciAyPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zMWViNzU4ZDU2Mzc0ODZiODUwY2EzZGZmMTlhZjA1NC5zZXRDb250ZW50KGh0bWxfOGI0ODc0ZTc2MzA2NDRkNWIwNTljZjNkMjkzMDg5MGQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOGFmMGM0YzU4M2Q0NGIxOWFkZWRkOTBjOWVhMjdjOWEuYmluZFBvcHVwKHBvcHVwXzMxZWI3NThkNTYzNzQ4NmI4NTBjYTNkZmYxOWFmMDU0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzA1OTQxMmJjMTkyODRjNGJhNGYwODkzMDlmODMxZjA2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzMuNzczNzgwMTg0NTk0MTQ1LC04NC4zOTgyMDU5NzQ3NDUzMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjZmYwMDAwIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiI2ZmMDAwMCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9iZDkwNzRiZDdhZjE0YjM0YjZhMTE5ODJhYzAzY2M4OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF80MjYwYTFlNzYxYTg0YWY1YjllOWRjOWY1OWNkYjIyOSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF80NTE4NWJlYTBkN2I0YjU2YjI1NzE1MzU2ZTlkMTg4MCA9ICQoJzxkaXYgaWQ9Imh0bWxfNDUxODViZWEwZDdiNGI1NmIyNTcxNTM1NmU5ZDE4ODAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlRhY28gQmVsbCBDbHVzdGVyIDA8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzQyNjBhMWU3NjFhODRhZjViOWU5ZGM5ZjU5Y2RiMjI5LnNldENvbnRlbnQoaHRtbF80NTE4NWJlYTBkN2I0YjU2YjI1NzE1MzU2ZTlkMTg4MCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8wNTk0MTJiYzE5Mjg0YzRiYTRmMDg5MzA5ZjgzMWYwNi5iaW5kUG9wdXAocG9wdXBfNDI2MGExZTc2MWE4NGFmNWI5ZTlkYzlmNTljZGIyMjkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfODlmNjE1MmI0ZmFkNGE4MWE5NzY1Mjk4ZDJmNmI1N2UgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszMy43NzM3Njk1ODQ0MjU0MywtODQuMzk4MDgzMjI4Njk0Nl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjZmYwMDAwIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiI2ZmMDAwMCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9iZDkwNzRiZDdhZjE0YjM0YjZhMTE5ODJhYzAzY2M4OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wYzk3YThhMTA1ZDU0MjdhYWY0NzMzMDkxN2RlZjY5MyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kNjc0YjQ4Y2Y5NTM0N2M0OTMyMTBkNjk1MjllMGM0YSA9ICQoJzxkaXYgaWQ9Imh0bWxfZDY3NGI0OGNmOTUzNDdjNDkzMjEwZDY5NTI5ZTBjNGEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkJ1cmRlbGwmIzM5O3MgQ2x1c3RlciAwPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wYzk3YThhMTA1ZDU0MjdhYWY0NzMzMDkxN2RlZjY5My5zZXRDb250ZW50KGh0bWxfZDY3NGI0OGNmOTUzNDdjNDkzMjEwZDY5NTI5ZTBjNGEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfODlmNjE1MmI0ZmFkNGE4MWE5NzY1Mjk4ZDJmNmI1N2UuYmluZFBvcHVwKHBvcHVwXzBjOTdhOGExMDVkNTQyN2FhZjQ3MzMwOTE3ZGVmNjkzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2NkNGI2NGFjM2Y0MTQwM2E5NmFiZjZmNzMyN2ZkMzI4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzMuNzc0NDI4Mjg5OTcxMywtODQuMzk2NTUxODQyMjUwNDVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiI2ZmMDAwMCIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiNmZjAwMDAiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYmQ5MDc0YmQ3YWYxNGIzNGI2YTExOTgyYWMwM2NjODkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNDIwOGQxYTAxYWMwNGYyOGI3MzU2ZmQwNWYyZjA3OGMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOTE3NWJiYjdmNjMwNDU3ZmFjMTk0NjI1NTIxYTM2ZTMgPSAkKCc8ZGl2IGlkPSJodG1sXzkxNzViYmI3ZjYzMDQ1N2ZhYzE5NDYyNTUyMWEzNmUzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Sb29mdG9wIEdhcmRlbiBDbHVzdGVyIDA8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzQyMDhkMWEwMWFjMDRmMjhiNzM1NmZkMDVmMmYwNzhjLnNldENvbnRlbnQoaHRtbF85MTc1YmJiN2Y2MzA0NTdmYWMxOTQ2MjU1MjFhMzZlMyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9jZDRiNjRhYzNmNDE0MDNhOTZhYmY2ZjczMjdmZDMyOC5iaW5kUG9wdXAocG9wdXBfNDIwOGQxYTAxYWMwNGYyOGI3MzU2ZmQwNWYyZjA3OGMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZmUwZTk5ODI0MjFhNDQxNWI2YzUxY2FkY2FlMmVhMmIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszMy43NzEyNDU5MTMyNzgzMzUsLTg0LjM5MjAzNzM5MTY2MjZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiIzgwMDBmZiIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiM4MDAwZmYiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYmQ5MDc0YmQ3YWYxNGIzNGI2YTExOTgyYWMwM2NjODkpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYjdiYTJjZWY2YzNkNGI0MWE3YTNmNzgyNzIxNGVjMGIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZTUyMzU4MTI1MDJlNDZjYmE5ZmEwM2YwNzU0ZWQ3YjAgPSAkKCc8ZGl2IGlkPSJodG1sX2U1MjM1ODEyNTAyZTQ2Y2JhOWZhMDNmMDc1NGVkN2IwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5HVCBTdGluZ2VyIFN0b3AgLSBUZWNod29vZCBhbmQgTm9ydGggQXZlIENsdXN0ZXIgMTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYjdiYTJjZWY2YzNkNGI0MWE3YTNmNzgyNzIxNGVjMGIuc2V0Q29udGVudChodG1sX2U1MjM1ODEyNTAyZTQ2Y2JhOWZhMDNmMDc1NGVkN2IwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2ZlMGU5OTgyNDIxYTQ0MTViNmM1MWNhZGNhZTJlYTJiLmJpbmRQb3B1cChwb3B1cF9iN2JhMmNlZjZjM2Q0YjQxYTdhM2Y3ODI3MjE0ZWMwYik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85NjIzZmJkNzEyYTk0NTVmOGE5OGQ1OTdlZTg5YmRlNCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzMzLjc3NDQ1MDkxMDg5OTMyLC04NC4zOTg5MDQzNTg0MTk1MV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICIjZmYwMDAwIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiI2ZmMDAwMCIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9iZDkwNzRiZDdhZjE0YjM0YjZhMTE5ODJhYzAzY2M4OSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85MTZkZGM4MDJmNzE0ZGIwODBjYTc5NmZiMmU2NTgxNSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hZmRlOGI5MThlYzM0NTlmOTQzN2MyYTM0NTBjN2QxMyA9ICQoJzxkaXYgaWQ9Imh0bWxfYWZkZThiOTE4ZWMzNDU5Zjk0MzdjMmEzNDUwYzdkMTMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlN0dWRlbnQgQ2VudGVyIEZvb2QgQ291cnQgQ2x1c3RlciAwPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85MTZkZGM4MDJmNzE0ZGIwODBjYTc5NmZiMmU2NTgxNS5zZXRDb250ZW50KGh0bWxfYWZkZThiOTE4ZWMzNDU5Zjk0MzdjMmEzNDUwYzdkMTMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOTYyM2ZiZDcxMmE5NDU1ZjhhOThkNTk3ZWU4OWJkZTQuYmluZFBvcHVwKHBvcHVwXzkxNmRkYzgwMmY3MTRkYjA4MGNhNzk2ZmIyZTY1ODE1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2ExZGEwYmQ3Nzg2MTQyNGZhNWFjZWEyMzkyNzQ5YjAzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzMuNzc0NDI3OTEzOTI4OTEsLTg0LjM5ODgwODEyMjgwNzQ1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiNmZjAwMDAiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjZmYwMDAwIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2JkOTA3NGJkN2FmMTRiMzRiNmExMTk4MmFjMDNjYzg5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzM0YzMxMjE0M2VjMzRlMzdiOGVmNDNlOGVhZWFiZDI4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzQ4M2U1OTRiNTY2MzQ2YzE4OTUzODQyM2UzZWYwNzFiID0gJCgnPGRpdiBpZD0iaHRtbF80ODNlNTk0YjU2NjM0NmMxODk1Mzg0MjNlM2VmMDcxYiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RHVua2luJiMzOTsgQ2x1c3RlciAwPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zNGMzMTIxNDNlYzM0ZTM3YjhlZjQzZThlYWVhYmQyOC5zZXRDb250ZW50KGh0bWxfNDgzZTU5NGI1NjYzNDZjMTg5NTM4NDIzZTNlZjA3MWIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYTFkYTBiZDc3ODYxNDI0ZmE1YWNlYTIzOTI3NDliMDMuYmluZFBvcHVwKHBvcHVwXzM0YzMxMjE0M2VjMzRlMzdiOGVmNDNlOGVhZWFiZDI4KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2UwNzU3MTZiOGZjOTQ4MDU5MTVhOTBiZjlmNGExM2ZiID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzMuNzc1MjIzOTQ1NTE0NzQsLTg0LjM5NzE4OTkzMzQyNDk3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogIiNmZjAwMDAiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjZmYwMDAwIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2JkOTA3NGJkN2FmMTRiMzRiNmExMTk4MmFjMDNjYzg5KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzI4OWViODBiNjc2NjQ2ZTdiYTliOWU3OWRlN2Q1ODkwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzgyMjZhYjE4N2RhNDQ0NGQ4YWIwMDgxNzg4OWNmM2FiID0gJCgnPGRpdiBpZD0iaHRtbF84MjI2YWIxODdkYTQ0NDRkOGFiMDA4MTc4ODljZjNhYiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RWluc3RlaW4gU3RhdHVlIENsdXN0ZXIgMDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMjg5ZWI4MGI2NzY2NDZlN2JhOWI5ZTc5ZGU3ZDU4OTAuc2V0Q29udGVudChodG1sXzgyMjZhYjE4N2RhNDQ0NGQ4YWIwMDgxNzg4OWNmM2FiKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2UwNzU3MTZiOGZjOTQ4MDU5MTVhOTBiZjlmNGExM2ZiLmJpbmRQb3B1cChwb3B1cF8yODllYjgwYjY3NjY0NmU3YmE5YjllNzlkZTdkNTg5MCk7CgogICAgICAgICAgICAKICAgICAgICAKPC9zY3JpcHQ+ onload=\"this.contentDocument.open();this.contentDocument.write(atob(this.getAttribute('data-html')));this.contentDocument.close();\" allowfullscreen webkitallowfullscreen mozallowfullscreen></iframe></div></div>"
],
"text/plain": [
"<folium.folium.Map at 0x7f22f6b4eb00>"
]
},
"execution_count": 69,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# create map\n",
"map_clusters = folium.Map(location=[atl_latitude, atl_longitude], zoom_start=16)\n",
"\n",
"# set color scheme for the clusters\n",
"x = np.arange(kclusters)\n",
"ys = [i + x + (i*x)**2 for i in range(kclusters)]\n",
"colors_array = cm.rainbow(np.linspace(0, 1, len(ys)))\n",
"rainbow = [colors.rgb2hex(i) for i in colors_array]\n",
"\n",
"# add markers to the map\n",
"markers_colors = []\n",
"for lat, lon, poi, cluster in zip(atl_df_with_clusters['Latitude'], atl_df_with_clusters['Longitude'], atl_df_with_clusters['Name'], atl_df_with_clusters['Cluster Labels']):\n",
" label = folium.Popup(str(poi) + ' Cluster ' + str(cluster), parse_html=True)\n",
" folium.CircleMarker(\n",
" [lat, lon],\n",
" radius=5,\n",
" popup=label,\n",
" color=rainbow[cluster-1],\n",
" fill=True,\n",
" fill_color=rainbow[cluster-1],\n",
" fill_opacity=0.7).add_to(map_clusters)\n",
" \n",
"map_clusters"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Conclusion"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"After viewing both universities and the only option was to choose one it would due to mobility it would definitely be Georgia Institute of Technology (Georgia Tech) since there is a shopping center that is walking distance from the institution. As a foodie, I would have preferred Chicago, but as you can see two of the nice restuarants are quite far. They do have the Divvy Station and bus route nearby for easy transportation if you do not want to commute by foot.\n",
"\n",
"Many people have different threshold of what is too far to travel without having a bike, vehicle or public transportation. Overall the venues surrounding both institutions (University of Chicago and Georgia Institute of Technology (Georgia Tech)) are good for pedestrians who need commutable distances to get around. "
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python",
"language": "python",
"name": "conda-env-python-py"
},
"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.11"
}
},
"nbformat": 4,
"nbformat_minor": 4
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment