This is a map of Tourist attraction in Paris, France.

Map Layers:

  1. Adam Smith’s Paris Key Interest Points:
    • These are points of interest (POIs) throughout Paris that I’ve included from Adam Smith’s dataset. They likely cover landmarks, museums, historical sites, and other significant locations. I’ve plotted these POIs across the map to highlight areas of cultural or historical importance in the city.
  2. Airbnb Paris WFL1 Lodging Data:
    • This layer represents Airbnb lodgings in Paris, based on the “WFL1” dataset. The accommodations vary in size on the map according to the price per night. I’ve also color-coded these accommodations based on the type of property, which includes categories such as Maison, Loft, Appartement en residence, Bed & Breakfast, and more unique options like Cabane dans les arbres (treehouse), Habitation troglodyte (cave dwelling), and Yourte (yurt).
  3. Paris Top Restaurants 2024:
    • I’ve used the Paris Top Restaurants 2024 dataset from Kaggle and converted the CSV into GeoJSON using Python. These locations are marked on the map with fork and knife icons, making it easy to identify top dining spots across the city.

Interpretation:

This map can be used as a resource for visualizing key areas of interest, accommodations, and dining options in Paris, offering an overview (albeit limited) for visitors or anyone studying the city’s layout.

import requests
import pandas as pd
import geopandas as gpd
from shapely.geometry import Point

# Load the CSV file
file_path = 'top_restaurants_paris.csv'  
data = pd.read_csv(file_path)

# Define  function to geocode an address using the Google Maps API
def geocode_address(address, api_key):
    base_url = "https://maps.googleapis.com/maps/api/geocode/json"
    params = {"address": address, "key": api_key}
    response = requests.get(base_url, params=params)
    if response.status_code == 200:
        results = response.json()['results']
        if results:
            location = results[0]['geometry']['location']
            return location['lat'], location['lng']
    return None, None

# My Google Maps API Key
api_key = "ABCDEFGHIJKLMNOPQRTSTVWXYZ"

# Geocode all addresses in the dataset
data['latitude'], data['longitude'] = zip(*data['address'].apply(lambda x: geocode_address(x, api_key)))

# Drop rows where geocoding failed
data.dropna(subset=['latitude', 'longitude'], inplace=True)

# Create a GeoDataFrame with a specified CRS (Coordinate Reference System)
geometry = [Point(xy) for xy in zip(data['longitude'], data['latitude'])]
geo_df = gpd.GeoDataFrame(data, geometry=geometry, crs="EPSG:4326")  # Use EPSG:4326 for geographic coordinates

# Rename columns to avoid truncation when saving to Shapefile
geo_df.rename(columns={
    'rankingPosition': 'rankPos',
    'description': 'desc',
    'numberOfReviews': 'numReviews'
}, inplace=True)

# Save the GeoDataFrame as a Shapefile (or GeoJSON)
output_shapefile = 'paris.shp' # will not use since not zipping
geo_df.to_file(output_shapefile)

output_geojson = 'paris.geojson'
geo_df.to_file(output_geojson, driver='GeoJSON')
{
  "type": "FeatureCollection",
  "features": [
    {
      "type": "Feature",
      "geometry": {
        "type": "Point",
        "coordinates": [2.379853400000002, 48.8648482]
      },
      "properties": {
        "title": "Le Wagon Paris",
        "address": "16 Villa Gaudelet",
        "marker-size": "large",
        "marker-symbol": "building"
      }
    },
    {
      "type": "Feature",
      "geometry": {
        "type": "Point",
        "coordinates": [2.377524, 48.865542]
      },
      "properties": {
        "name": "L'Alicheur",
        "address": "96 Rue Saint-Maur",
        "description": "Cuisine asiatique sans friture - Plat du jour 8€",
        "marker-symbol": "restaurant"
      }
    },
    {
      "type": "Feature",
      "geometry": {
        "type": "Point",
        "coordinates": [2.378423200000043, 48.8659858]
      },
      "properties": {
        "title": "L'Esprit Tchaï",
        "address": "115 Rue Oberkampf",
        "description": "Produits bio, plats végétariens, gluten-free, plat + entrée ou dessert < 11€",
        "marker-symbol": "restaurant"
      }
    },
    {
      "type": "Feature",
      "geometry": {
        "type": "Point",
        "coordinates": [2.3862538999999288, 48.8685945]
      },
      "properties" : {
        "name": "Dilia",
        "address": "1 rue d'Eupatoria, 75020 Paris",
        "descriptions": "Cuisine gastronomique, trattoria -  Menu à 16-19,5€ le midi (44-60€ le soir)",
        "marker-symbol": "restaurant"
      }
    },
    {
      "type": "Feature",
      "geometry": {
        "type": "Point",
        "coordinates": [2.382024900000033, 48.8654569]
      },
      "properties" : {
        "name": "Le Perchoir",
        "address": "14 Rue Crespin du Gast, 75011 Paris",
        "descriptions": "Rooftop sympa en été, mais un peu cher, cocktails et snacks",
        "marker-symbol": "bar"
      }
    },
    {
      "type": "Feature",
      "geometry": {
        "type": "Point",
        "coordinates": [2.3769905000000335, 48.8653928]
      },
      "properties" : {
        "name": "Mamma Roma",
        "address": "90 rue Oberkampf, 75011 Paris",
        "descriptions": "Pizza 'Al Taglio', petits antipastis et focaccia - Menu autour de 10€)",
        "marker-symbol": "restaurant"
      }
    },
    {
      "type": "Feature",
      "geometry": {
        "type": "Point",
        "coordinates": [2.37537420000001, 48.86466360000001]
      },
      "properties": {
        "title": "B&M",
        "address": "82 avenue Parmentier",
        "description": "Un de meilleurs burgers de Paris selon Konbini, autour de 14€ avec frites et boisson.",
        "marker-symbol": "restaurant"
      }
    },
    {
      "type": "Feature",
      "geometry": {
        "type": "Point",
        "coordinates": [2.3801158999999643, 48.8626856]
      },
      "properties" : {
        "name": "L'Altra",
        "address": "52 rue Saint Maur, 75011 Paris",
        "descriptions": "Pizzéria, antipastis - Formule à 13€)",
        "marker-symbol": "restaurant"
      }
    },
    {
      "type": "Feature",
      "geometry": {
        "type": "Point",
        "coordinates": [2.3663344999999936, 48.8645789]
      },
      "properties" : {
        "name": "Paperboy",
        "address": "137 rue Amelot, 75011 Paris",
        "descriptions": "US healthy, sandwichs, salades, jus - Autour de 13€)",
        "marker-symbol": "restaurant"
      }
    },
    {
      "type": "Feature",
      "geometry": {
        "type": "Point",
        "coordinates": [2.376451299999985, 48.8667905]
      },
      "properties" : {
        "name": "Thank You My Dear",
        "address": "112 rue Saint Maur, 75011 Paris",
        "descriptions": "Gluten Free, sandwichs, salades - Formule à 10€)",
        "marker-symbol": "restaurant"
      }
    },
    {
      "type": "Feature",
      "geometry": {
        "type": "Point",
        "coordinates": [2.376059400000031, 48.8647467]
      },
      "properties" : {
        "name": "Bloodies",
        "address": "58 avenue de la République, 75011 Paris",
        "descriptions": "Spécialité de viande - Formule à 16€ le midi)",
        "marker-symbol": "restaurant"
      }
    },
    {
      "type": "Feature",
      "geometry": {
        "type": "Point",
        "coordinates": [2.37186829999996, 48.8645978]
      },
      "properties" : {
        "name": "Aux Deux Amis",
        "address": "45 rue Oberkampf, 75011 Paris",
        "descriptions": "Bonne franquette, tapas(3-12€) et vin le soir - Menu à 18-22€ le midi)",
        "marker-symbol": "restaurant"
      }
    },
    {
      "type": "Feature",
      "geometry": {
        "type": "Point",
        "coordinates": [2.371793700000012, 48.8643284]
      },
      "properties" : {
        "name": "Epicerie du Verre Volé",
        "address": "54, rue de la Folie Méricourt, 75011 Paris",
        "descriptions": "Epicerie fine, sandwichs à composer ou pas - Sandwich : 5 à 7€)",
        "marker-symbol": "restaurant"
      }
    },
    {
      "type": "Feature",
      "geometry": {
        "type": "Point",
        "coordinates": [2.3792540, 48.8662720]
      },
      "properties" : {
        "name": "L'impasse",
        "address": "4, cité Griset, 75011 Paris",
        "descriptions": "Pour boire un verre dans une ambiance cosy)",
        "marker-symbol": "bar"
      }
    }
  ]
}
Paris Map
Paris Map

Jessica’s Paris Map Link

LS0tDQp0aXRsZTogIlBhcmlzIg0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCg0KVGhpcyBpcyBhIG1hcCBvZiBUb3VyaXN0IGF0dHJhY3Rpb24gaW4gUGFyaXMsIEZyYW5jZS4NCg0KIyMjIE1hcCBMYXllcnM6DQoNCjEuICAqKkFkYW0gU21pdGgncyBQYXJpcyBLZXkgSW50ZXJlc3QgUG9pbnRzKio6DQogICAgLSAgIFRoZXNlIGFyZSBwb2ludHMgb2YgaW50ZXJlc3QgKFBPSXMpIHRocm91Z2hvdXQgUGFyaXMgdGhhdCBJJ3ZlIGluY2x1ZGVkIGZyb20gQWRhbSBTbWl0aCdzIGRhdGFzZXQuIFRoZXkgbGlrZWx5IGNvdmVyIGxhbmRtYXJrcywgbXVzZXVtcywgaGlzdG9yaWNhbCBzaXRlcywgYW5kIG90aGVyIHNpZ25pZmljYW50IGxvY2F0aW9ucy4gSSd2ZSBwbG90dGVkIHRoZXNlIFBPSXMgYWNyb3NzIHRoZSBtYXAgdG8gaGlnaGxpZ2h0IGFyZWFzIG9mIGN1bHR1cmFsIG9yIGhpc3RvcmljYWwgaW1wb3J0YW5jZSBpbiB0aGUgY2l0eS4NCjIuICAqKkFpcmJuYiBQYXJpcyBXRkwxIExvZGdpbmcgRGF0YSoqOg0KICAgIC0gICBUaGlzIGxheWVyIHJlcHJlc2VudHMgQWlyYm5iIGxvZGdpbmdzIGluIFBhcmlzLCBiYXNlZCBvbiB0aGUgIldGTDEiIGRhdGFzZXQuIFRoZSBhY2NvbW1vZGF0aW9ucyB2YXJ5IGluIHNpemUgb24gdGhlIG1hcCBhY2NvcmRpbmcgdG8gdGhlIHByaWNlIHBlciBuaWdodC4gSSd2ZSBhbHNvIGNvbG9yLWNvZGVkIHRoZXNlIGFjY29tbW9kYXRpb25zIGJhc2VkIG9uIHRoZSB0eXBlIG9mIHByb3BlcnR5LCB3aGljaCBpbmNsdWRlcyBjYXRlZ29yaWVzIHN1Y2ggYXMgTWFpc29uLCBMb2Z0LCBBcHBhcnRlbWVudCBlbiByZXNpZGVuY2UsIEJlZCAmIEJyZWFrZmFzdCwgYW5kIG1vcmUgdW5pcXVlIG9wdGlvbnMgbGlrZSBDYWJhbmUgZGFucyBsZXMgYXJicmVzICh0cmVlaG91c2UpLCBIYWJpdGF0aW9uIHRyb2dsb2R5dGUgKGNhdmUgZHdlbGxpbmcpLCBhbmQgWW91cnRlICh5dXJ0KS4NCjMuICAqKlBhcmlzIFRvcCBSZXN0YXVyYW50cyAyMDI0Kio6DQogICAgLSAgIEkndmUgdXNlZCB0aGUgUGFyaXMgVG9wIFJlc3RhdXJhbnRzIDIwMjQgZGF0YXNldCBmcm9tIEthZ2dsZSBhbmQgY29udmVydGVkIHRoZSBDU1YgaW50byBHZW9KU09OIHVzaW5nIFB5dGhvbi4gVGhlc2UgbG9jYXRpb25zIGFyZSBtYXJrZWQgb24gdGhlIG1hcCB3aXRoIGZvcmsgYW5kIGtuaWZlIGljb25zLCBtYWtpbmcgaXQgZWFzeSB0byBpZGVudGlmeSB0b3AgZGluaW5nIHNwb3RzIGFjcm9zcyB0aGUgY2l0eS4NCg0KIyMjIEludGVycHJldGF0aW9uOg0KDQotICAgKipDZW50cmFsIFBhcmlzKio6IFRoZSBtYXAgc2hvd3MgYSBkZW5zZSBjb25jZW50cmF0aW9uIG9mIGtleSBpbnRlcmVzdCBwb2ludHMgYW5kIHRvcCByZXN0YXVyYW50cywgZXNwZWNpYWxseSBpbiBjZW50cmFsIGRpc3RyaWN0cyBsaWtlIHRoZSAxc3QsIDNyZCwgYW5kIDR0aCBhcnJvbmRpc3NlbWVudHMuIFRoaXMgYXJlYSBpcyBrbm93biBmb3IgaXRzIGN1bHR1cmFsIGxhbmRtYXJrcywgbWFraW5nIGl0IGEgcG9wdWxhciBzcG90IGZvciBib3RoIGRpbmluZyBhbmQgc2lnaHRzZWVpbmcuDQoNCi0gICAqKkFpcmJuYiBMb2RnaW5nIERpc3RyaWJ1dGlvbioqOiBUaGUgZGlzdHJpYnV0aW9uIG9mIEFpcmJuYiBsb2RnaW5ncyBpcyBtb3JlIHNwcmVhZCBvdXQsIHdpdGggY29uY2VudHJhdGlvbnMgaW4gYXJlYXMgdGhhdCBhcmUgbGVzcyBjZW50cmFsIGJ1dCBzdGlsbCBwb3B1bGFyIHdpdGggdG91cmlzdHMsIGxpa2UgTW9udG1hcnRyZSBvciBMZSBNYXJhaXMuIFRoZSBzaXplIG9mIHRoZSBtYXJrZXJzIGNvcnJlc3BvbmRzIHRvIHRoZSBwcmljZSBwZXIgbmlnaHQsIHdoaWxlIHRoZSBjb2xvciBjb2RpbmcgaGVscHMgZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIGRpZmZlcmVudCB0eXBlcyBvZiBwcm9wZXJ0aWVzLCByYW5naW5nIGZyb20gdHJhZGl0aW9uYWwgYXBhcnRtZW50cyB0byBtb3JlIHVuaXF1ZSBhY2NvbW1vZGF0aW9ucyBsaWtlIHRyZWVob3VzZXMgYW5kIHl1cnRzLg0KDQotICAgKipDb21iaW5lZCBJbnNpZ2h0cyoqOiBCeSBjb21iaW5pbmcgdGhlc2UgZGF0YXNldHMsIEkndmUgY3JlYXRlZCBhIG1hcCB0aGF0IHByb3ZpZGVzIGEgY29tcHJlaGVuc2l2ZSB2aWV3IG9mIFBhcmlzJ3MgbW9zdCBzaWduaWZpY2FudCBQT0lzLCB0b3AgZGluaW5nIHNwb3RzLCBhbmQgYXZhaWxhYmxlIEFpcmJuYiBsb2RnaW5ncy4gSXQncyBhIHZhbHVhYmxlIHRvb2wgZm9yIHBsYW5uaW5nIGEgdHJpcCB0byB0aGUgY2l0eSwgYWxsb3dpbmcgbWUgKG9yIG90aGVycykgdG8gcXVpY2tseSBzZWUgd2hlcmUgdG8gc3RheSBiYXNlZCBvbiBwcm94aW1pdHkgdG8gYXR0cmFjdGlvbnMsIHByb3BlcnR5IHR5cGUsIGFuZCBwcmljZSByYW5nZS4NCg0KVGhpcyBtYXAgY2FuIGJlIHVzZWQgYXMgYSByZXNvdXJjZSBmb3IgdmlzdWFsaXppbmcga2V5IGFyZWFzIG9mIGludGVyZXN0LCBhY2NvbW1vZGF0aW9ucywgYW5kIGRpbmluZyBvcHRpb25zIGluIFBhcmlzLCBvZmZlcmluZyBhbiBvdmVydmlldyAoYWxiZWl0IGxpbWl0ZWQpIGZvciB2aXNpdG9ycyBvciBhbnlvbmUgc3R1ZHlpbmcgdGhlIGNpdHkncyBsYXlvdXQuDQoNCmBgYHtweXRob259DQppbXBvcnQgcmVxdWVzdHMNCmltcG9ydCBwYW5kYXMgYXMgcGQNCmltcG9ydCBnZW9wYW5kYXMgYXMgZ3BkDQpmcm9tIHNoYXBlbHkuZ2VvbWV0cnkgaW1wb3J0IFBvaW50DQoNCiMgTG9hZCB0aGUgQ1NWIGZpbGUNCmZpbGVfcGF0aCA9ICd0b3BfcmVzdGF1cmFudHNfcGFyaXMuY3N2JyAgDQpkYXRhID0gcGQucmVhZF9jc3YoZmlsZV9wYXRoKQ0KDQojIERlZmluZSAgZnVuY3Rpb24gdG8gZ2VvY29kZSBhbiBhZGRyZXNzIHVzaW5nIHRoZSBHb29nbGUgTWFwcyBBUEkNCmRlZiBnZW9jb2RlX2FkZHJlc3MoYWRkcmVzcywgYXBpX2tleSk6DQogICAgYmFzZV91cmwgPSAiaHR0cHM6Ly9tYXBzLmdvb2dsZWFwaXMuY29tL21hcHMvYXBpL2dlb2NvZGUvanNvbiINCiAgICBwYXJhbXMgPSB7ImFkZHJlc3MiOiBhZGRyZXNzLCAia2V5IjogYXBpX2tleX0NCiAgICByZXNwb25zZSA9IHJlcXVlc3RzLmdldChiYXNlX3VybCwgcGFyYW1zPXBhcmFtcykNCiAgICBpZiByZXNwb25zZS5zdGF0dXNfY29kZSA9PSAyMDA6DQogICAgICAgIHJlc3VsdHMgPSByZXNwb25zZS5qc29uKClbJ3Jlc3VsdHMnXQ0KICAgICAgICBpZiByZXN1bHRzOg0KICAgICAgICAgICAgbG9jYXRpb24gPSByZXN1bHRzWzBdWydnZW9tZXRyeSddWydsb2NhdGlvbiddDQogICAgICAgICAgICByZXR1cm4gbG9jYXRpb25bJ2xhdCddLCBsb2NhdGlvblsnbG5nJ10NCiAgICByZXR1cm4gTm9uZSwgTm9uZQ0KDQojIE15IEdvb2dsZSBNYXBzIEFQSSBLZXkNCmFwaV9rZXkgPSAiQUJDREVGR0hJSktMTU5PUFFSVFNUVldYWVoiDQoNCiMgR2VvY29kZSBhbGwgYWRkcmVzc2VzIGluIHRoZSBkYXRhc2V0DQpkYXRhWydsYXRpdHVkZSddLCBkYXRhWydsb25naXR1ZGUnXSA9IHppcCgqZGF0YVsnYWRkcmVzcyddLmFwcGx5KGxhbWJkYSB4OiBnZW9jb2RlX2FkZHJlc3MoeCwgYXBpX2tleSkpKQ0KDQojIERyb3Agcm93cyB3aGVyZSBnZW9jb2RpbmcgZmFpbGVkDQpkYXRhLmRyb3BuYShzdWJzZXQ9WydsYXRpdHVkZScsICdsb25naXR1ZGUnXSwgaW5wbGFjZT1UcnVlKQ0KDQojIENyZWF0ZSBhIEdlb0RhdGFGcmFtZSB3aXRoIGEgc3BlY2lmaWVkIENSUyAoQ29vcmRpbmF0ZSBSZWZlcmVuY2UgU3lzdGVtKQ0KZ2VvbWV0cnkgPSBbUG9pbnQoeHkpIGZvciB4eSBpbiB6aXAoZGF0YVsnbG9uZ2l0dWRlJ10sIGRhdGFbJ2xhdGl0dWRlJ10pXQ0KZ2VvX2RmID0gZ3BkLkdlb0RhdGFGcmFtZShkYXRhLCBnZW9tZXRyeT1nZW9tZXRyeSwgY3JzPSJFUFNHOjQzMjYiKSAgIyBVc2UgRVBTRzo0MzI2IGZvciBnZW9ncmFwaGljIGNvb3JkaW5hdGVzDQoNCiMgUmVuYW1lIGNvbHVtbnMgdG8gYXZvaWQgdHJ1bmNhdGlvbiB3aGVuIHNhdmluZyB0byBTaGFwZWZpbGUNCmdlb19kZi5yZW5hbWUoY29sdW1ucz17DQogICAgJ3JhbmtpbmdQb3NpdGlvbic6ICdyYW5rUG9zJywNCiAgICAnZGVzY3JpcHRpb24nOiAnZGVzYycsDQogICAgJ251bWJlck9mUmV2aWV3cyc6ICdudW1SZXZpZXdzJw0KfSwgaW5wbGFjZT1UcnVlKQ0KDQojIFNhdmUgdGhlIEdlb0RhdGFGcmFtZSBhcyBhIFNoYXBlZmlsZSAob3IgR2VvSlNPTikNCm91dHB1dF9zaGFwZWZpbGUgPSAncGFyaXMuc2hwJyAjIHdpbGwgbm90IHVzZSBzaW5jZSBub3QgemlwcGluZw0KZ2VvX2RmLnRvX2ZpbGUob3V0cHV0X3NoYXBlZmlsZSkNCg0Kb3V0cHV0X2dlb2pzb24gPSAncGFyaXMuZ2VvanNvbicNCmdlb19kZi50b19maWxlKG91dHB1dF9nZW9qc29uLCBkcml2ZXI9J0dlb0pTT04nKQ0KDQoNCmBgYA0KDQpgYGB7Z2VvanNvbn0NCnsNCiAgInR5cGUiOiAiRmVhdHVyZUNvbGxlY3Rpb24iLA0KICAiZmVhdHVyZXMiOiBbDQogICAgew0KICAgICAgInR5cGUiOiAiRmVhdHVyZSIsDQogICAgICAiZ2VvbWV0cnkiOiB7DQogICAgICAgICJ0eXBlIjogIlBvaW50IiwNCiAgICAgICAgImNvb3JkaW5hdGVzIjogWzIuMzc5ODUzNDAwMDAwMDAyLCA0OC44NjQ4NDgyXQ0KICAgICAgfSwNCiAgICAgICJwcm9wZXJ0aWVzIjogew0KICAgICAgICAidGl0bGUiOiAiTGUgV2Fnb24gUGFyaXMiLA0KICAgICAgICAiYWRkcmVzcyI6ICIxNiBWaWxsYSBHYXVkZWxldCIsDQogICAgICAgICJtYXJrZXItc2l6ZSI6ICJsYXJnZSIsDQogICAgICAgICJtYXJrZXItc3ltYm9sIjogImJ1aWxkaW5nIg0KICAgICAgfQ0KICAgIH0sDQogICAgew0KICAgICAgInR5cGUiOiAiRmVhdHVyZSIsDQogICAgICAiZ2VvbWV0cnkiOiB7DQogICAgICAgICJ0eXBlIjogIlBvaW50IiwNCiAgICAgICAgImNvb3JkaW5hdGVzIjogWzIuMzc3NTI0LCA0OC44NjU1NDJdDQogICAgICB9LA0KICAgICAgInByb3BlcnRpZXMiOiB7DQogICAgICAgICJuYW1lIjogIkwnQWxpY2hldXIiLA0KICAgICAgICAiYWRkcmVzcyI6ICI5NiBSdWUgU2FpbnQtTWF1ciIsDQogICAgICAgICJkZXNjcmlwdGlvbiI6ICJDdWlzaW5lIGFzaWF0aXF1ZSBzYW5zIGZyaXR1cmUgLSBQbGF0IGR1IGpvdXIgOOKCrCIsDQogICAgICAgICJtYXJrZXItc3ltYm9sIjogInJlc3RhdXJhbnQiDQogICAgICB9DQogICAgfSwNCiAgICB7DQogICAgICAidHlwZSI6ICJGZWF0dXJlIiwNCiAgICAgICJnZW9tZXRyeSI6IHsNCiAgICAgICAgInR5cGUiOiAiUG9pbnQiLA0KICAgICAgICAiY29vcmRpbmF0ZXMiOiBbMi4zNzg0MjMyMDAwMDAwNDMsIDQ4Ljg2NTk4NThdDQogICAgICB9LA0KICAgICAgInByb3BlcnRpZXMiOiB7DQogICAgICAgICJ0aXRsZSI6ICJMJ0VzcHJpdCBUY2hhw68iLA0KICAgICAgICAiYWRkcmVzcyI6ICIxMTUgUnVlIE9iZXJrYW1wZiIsDQogICAgICAgICJkZXNjcmlwdGlvbiI6ICJQcm9kdWl0cyBiaW8sIHBsYXRzIHbDqWfDqXRhcmllbnMsIGdsdXRlbi1mcmVlLCBwbGF0ICsgZW50csOpZSBvdSBkZXNzZXJ0IDwgMTHigqwiLA0KICAgICAgICAibWFya2VyLXN5bWJvbCI6ICJyZXN0YXVyYW50Ig0KICAgICAgfQ0KICAgIH0sDQogICAgew0KICAgICAgInR5cGUiOiAiRmVhdHVyZSIsDQogICAgICAiZ2VvbWV0cnkiOiB7DQogICAgICAgICJ0eXBlIjogIlBvaW50IiwNCiAgICAgICAgImNvb3JkaW5hdGVzIjogWzIuMzg2MjUzODk5OTk5OTI4OCwgNDguODY4NTk0NV0NCiAgICAgIH0sDQogICAgICAicHJvcGVydGllcyIgOiB7DQogICAgICAgICJuYW1lIjogIkRpbGlhIiwNCiAgICAgICAgImFkZHJlc3MiOiAiMSBydWUgZCdFdXBhdG9yaWEsIDc1MDIwIFBhcmlzIiwNCiAgICAgICAgImRlc2NyaXB0aW9ucyI6ICJDdWlzaW5lIGdhc3Ryb25vbWlxdWUsIHRyYXR0b3JpYSAtICBNZW51IMOgIDE2LTE5LDXigqwgbGUgbWlkaSAoNDQtNjDigqwgbGUgc29pcikiLA0KICAgICAgICAibWFya2VyLXN5bWJvbCI6ICJyZXN0YXVyYW50Ig0KICAgICAgfQ0KICAgIH0sDQogICAgew0KICAgICAgInR5cGUiOiAiRmVhdHVyZSIsDQogICAgICAiZ2VvbWV0cnkiOiB7DQogICAgICAgICJ0eXBlIjogIlBvaW50IiwNCiAgICAgICAgImNvb3JkaW5hdGVzIjogWzIuMzgyMDI0OTAwMDAwMDMzLCA0OC44NjU0NTY5XQ0KICAgICAgfSwNCiAgICAgICJwcm9wZXJ0aWVzIiA6IHsNCiAgICAgICAgIm5hbWUiOiAiTGUgUGVyY2hvaXIiLA0KICAgICAgICAiYWRkcmVzcyI6ICIxNCBSdWUgQ3Jlc3BpbiBkdSBHYXN0LCA3NTAxMSBQYXJpcyIsDQogICAgICAgICJkZXNjcmlwdGlvbnMiOiAiUm9vZnRvcCBzeW1wYSBlbiDDqXTDqSwgbWFpcyB1biBwZXUgY2hlciwgY29ja3RhaWxzIGV0IHNuYWNrcyIsDQogICAgICAgICJtYXJrZXItc3ltYm9sIjogImJhciINCiAgICAgIH0NCiAgICB9LA0KICAgIHsNCiAgICAgICJ0eXBlIjogIkZlYXR1cmUiLA0KICAgICAgImdlb21ldHJ5Ijogew0KICAgICAgICAidHlwZSI6ICJQb2ludCIsDQogICAgICAgICJjb29yZGluYXRlcyI6IFsyLjM3Njk5MDUwMDAwMDAzMzUsIDQ4Ljg2NTM5MjhdDQogICAgICB9LA0KICAgICAgInByb3BlcnRpZXMiIDogew0KICAgICAgICAibmFtZSI6ICJNYW1tYSBSb21hIiwNCiAgICAgICAgImFkZHJlc3MiOiAiOTAgcnVlIE9iZXJrYW1wZiwgNzUwMTEgUGFyaXMiLA0KICAgICAgICAiZGVzY3JpcHRpb25zIjogIlBpenphICdBbCBUYWdsaW8nLCBwZXRpdHMgYW50aXBhc3RpcyBldCBmb2NhY2NpYSAtIE1lbnUgYXV0b3VyIGRlIDEw4oKsKSIsDQogICAgICAgICJtYXJrZXItc3ltYm9sIjogInJlc3RhdXJhbnQiDQogICAgICB9DQogICAgfSwNCiAgICB7DQogICAgICAidHlwZSI6ICJGZWF0dXJlIiwNCiAgICAgICJnZW9tZXRyeSI6IHsNCiAgICAgICAgInR5cGUiOiAiUG9pbnQiLA0KICAgICAgICAiY29vcmRpbmF0ZXMiOiBbMi4zNzUzNzQyMDAwMDAwMSwgNDguODY0NjYzNjAwMDAwMDFdDQogICAgICB9LA0KICAgICAgInByb3BlcnRpZXMiOiB7DQogICAgICAgICJ0aXRsZSI6ICJCJk0iLA0KICAgICAgICAiYWRkcmVzcyI6ICI4MiBhdmVudWUgUGFybWVudGllciIsDQogICAgICAgICJkZXNjcmlwdGlvbiI6ICJVbiBkZSBtZWlsbGV1cnMgYnVyZ2VycyBkZSBQYXJpcyBzZWxvbiBLb25iaW5pLCBhdXRvdXIgZGUgMTTigqwgYXZlYyBmcml0ZXMgZXQgYm9pc3Nvbi4iLA0KICAgICAgICAibWFya2VyLXN5bWJvbCI6ICJyZXN0YXVyYW50Ig0KICAgICAgfQ0KICAgIH0sDQogICAgew0KICAgICAgInR5cGUiOiAiRmVhdHVyZSIsDQogICAgICAiZ2VvbWV0cnkiOiB7DQogICAgICAgICJ0eXBlIjogIlBvaW50IiwNCiAgICAgICAgImNvb3JkaW5hdGVzIjogWzIuMzgwMTE1ODk5OTk5OTY0MywgNDguODYyNjg1Nl0NCiAgICAgIH0sDQogICAgICAicHJvcGVydGllcyIgOiB7DQogICAgICAgICJuYW1lIjogIkwnQWx0cmEiLA0KICAgICAgICAiYWRkcmVzcyI6ICI1MiBydWUgU2FpbnQgTWF1ciwgNzUwMTEgUGFyaXMiLA0KICAgICAgICAiZGVzY3JpcHRpb25zIjogIlBpenrDqXJpYSwgYW50aXBhc3RpcyAtIEZvcm11bGUgw6AgMTPigqwpIiwNCiAgICAgICAgIm1hcmtlci1zeW1ib2wiOiAicmVzdGF1cmFudCINCiAgICAgIH0NCiAgICB9LA0KICAgIHsNCiAgICAgICJ0eXBlIjogIkZlYXR1cmUiLA0KICAgICAgImdlb21ldHJ5Ijogew0KICAgICAgICAidHlwZSI6ICJQb2ludCIsDQogICAgICAgICJjb29yZGluYXRlcyI6IFsyLjM2NjMzNDQ5OTk5OTk5MzYsIDQ4Ljg2NDU3ODldDQogICAgICB9LA0KICAgICAgInByb3BlcnRpZXMiIDogew0KICAgICAgICAibmFtZSI6ICJQYXBlcmJveSIsDQogICAgICAgICJhZGRyZXNzIjogIjEzNyBydWUgQW1lbG90LCA3NTAxMSBQYXJpcyIsDQogICAgICAgICJkZXNjcmlwdGlvbnMiOiAiVVMgaGVhbHRoeSwgc2FuZHdpY2hzLCBzYWxhZGVzLCBqdXMgLSBBdXRvdXIgZGUgMTPigqwpIiwNCiAgICAgICAgIm1hcmtlci1zeW1ib2wiOiAicmVzdGF1cmFudCINCiAgICAgIH0NCiAgICB9LA0KICAgIHsNCiAgICAgICJ0eXBlIjogIkZlYXR1cmUiLA0KICAgICAgImdlb21ldHJ5Ijogew0KICAgICAgICAidHlwZSI6ICJQb2ludCIsDQogICAgICAgICJjb29yZGluYXRlcyI6IFsyLjM3NjQ1MTI5OTk5OTk4NSwgNDguODY2NzkwNV0NCiAgICAgIH0sDQogICAgICAicHJvcGVydGllcyIgOiB7DQogICAgICAgICJuYW1lIjogIlRoYW5rIFlvdSBNeSBEZWFyIiwNCiAgICAgICAgImFkZHJlc3MiOiAiMTEyIHJ1ZSBTYWludCBNYXVyLCA3NTAxMSBQYXJpcyIsDQogICAgICAgICJkZXNjcmlwdGlvbnMiOiAiR2x1dGVuIEZyZWUsIHNhbmR3aWNocywgc2FsYWRlcyAtIEZvcm11bGUgw6AgMTDigqwpIiwNCiAgICAgICAgIm1hcmtlci1zeW1ib2wiOiAicmVzdGF1cmFudCINCiAgICAgIH0NCiAgICB9LA0KICAgIHsNCiAgICAgICJ0eXBlIjogIkZlYXR1cmUiLA0KICAgICAgImdlb21ldHJ5Ijogew0KICAgICAgICAidHlwZSI6ICJQb2ludCIsDQogICAgICAgICJjb29yZGluYXRlcyI6IFsyLjM3NjA1OTQwMDAwMDAzMSwgNDguODY0NzQ2N10NCiAgICAgIH0sDQogICAgICAicHJvcGVydGllcyIgOiB7DQogICAgICAgICJuYW1lIjogIkJsb29kaWVzIiwNCiAgICAgICAgImFkZHJlc3MiOiAiNTggYXZlbnVlIGRlIGxhIFLDqXB1YmxpcXVlLCA3NTAxMSBQYXJpcyIsDQogICAgICAgICJkZXNjcmlwdGlvbnMiOiAiU3DDqWNpYWxpdMOpIGRlIHZpYW5kZSAtIEZvcm11bGUgw6AgMTbigqwgbGUgbWlkaSkiLA0KICAgICAgICAibWFya2VyLXN5bWJvbCI6ICJyZXN0YXVyYW50Ig0KICAgICAgfQ0KICAgIH0sDQogICAgew0KICAgICAgInR5cGUiOiAiRmVhdHVyZSIsDQogICAgICAiZ2VvbWV0cnkiOiB7DQogICAgICAgICJ0eXBlIjogIlBvaW50IiwNCiAgICAgICAgImNvb3JkaW5hdGVzIjogWzIuMzcxODY4Mjk5OTk5OTYsIDQ4Ljg2NDU5NzhdDQogICAgICB9LA0KICAgICAgInByb3BlcnRpZXMiIDogew0KICAgICAgICAibmFtZSI6ICJBdXggRGV1eCBBbWlzIiwNCiAgICAgICAgImFkZHJlc3MiOiAiNDUgcnVlIE9iZXJrYW1wZiwgNzUwMTEgUGFyaXMiLA0KICAgICAgICAiZGVzY3JpcHRpb25zIjogIkJvbm5lIGZyYW5xdWV0dGUsIHRhcGFzKDMtMTLigqwpIGV0IHZpbiBsZSBzb2lyIC0gTWVudSDDoCAxOC0yMuKCrCBsZSBtaWRpKSIsDQogICAgICAgICJtYXJrZXItc3ltYm9sIjogInJlc3RhdXJhbnQiDQogICAgICB9DQogICAgfSwNCiAgICB7DQogICAgICAidHlwZSI6ICJGZWF0dXJlIiwNCiAgICAgICJnZW9tZXRyeSI6IHsNCiAgICAgICAgInR5cGUiOiAiUG9pbnQiLA0KICAgICAgICAiY29vcmRpbmF0ZXMiOiBbMi4zNzE3OTM3MDAwMDAwMTIsIDQ4Ljg2NDMyODRdDQogICAgICB9LA0KICAgICAgInByb3BlcnRpZXMiIDogew0KICAgICAgICAibmFtZSI6ICJFcGljZXJpZSBkdSBWZXJyZSBWb2zDqSIsDQogICAgICAgICJhZGRyZXNzIjogIjU0LCBydWUgZGUgbGEgRm9saWUgTcOpcmljb3VydCwgNzUwMTEgUGFyaXMiLA0KICAgICAgICAiZGVzY3JpcHRpb25zIjogIkVwaWNlcmllIGZpbmUsIHNhbmR3aWNocyDDoCBjb21wb3NlciBvdSBwYXMgLSBTYW5kd2ljaCA6IDUgw6AgN+KCrCkiLA0KICAgICAgICAibWFya2VyLXN5bWJvbCI6ICJyZXN0YXVyYW50Ig0KICAgICAgfQ0KICAgIH0sDQogICAgew0KICAgICAgInR5cGUiOiAiRmVhdHVyZSIsDQogICAgICAiZ2VvbWV0cnkiOiB7DQogICAgICAgICJ0eXBlIjogIlBvaW50IiwNCiAgICAgICAgImNvb3JkaW5hdGVzIjogWzIuMzc5MjU0MCwgNDguODY2MjcyMF0NCiAgICAgIH0sDQogICAgICAicHJvcGVydGllcyIgOiB7DQogICAgICAgICJuYW1lIjogIkwnaW1wYXNzZSIsDQogICAgICAgICJhZGRyZXNzIjogIjQsIGNpdMOpIEdyaXNldCwgNzUwMTEgUGFyaXMiLA0KICAgICAgICAiZGVzY3JpcHRpb25zIjogIlBvdXIgYm9pcmUgdW4gdmVycmUgZGFucyB1bmUgYW1iaWFuY2UgY29zeSkiLA0KICAgICAgICAibWFya2VyLXN5bWJvbCI6ICJiYXIiDQogICAgICB9DQogICAgfQ0KICBdDQp9DQpgYGANCg0KIVtQYXJpcyBNYXBdKGltYWdlcy9QYXJpcy5wbmcpDQoNCltKZXNzaWNhJ3MgUGFyaXMgTWFwIExpbmtdKGh0dHBzOi8vc211ZGFsbGFzLm1hcHMuYXJjZ2lzLmNvbS9hcHBzL2luc3RhbnQvY2hhcnRzL2luZGV4Lmh0bWw/YXBwaWQ9ZGU0MzY1MGU4NjFmNGJkMWJiYzU5ODFkODFmNGU1ZDApDQo=