Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save rquintel/a9f7c44d3754bc50d3a580c85d405916 to your computer and use it in GitHub Desktop.
Save rquintel/a9f7c44d3754bc50d3a580c85d405916 to your computer and use it in GitHub Desktop.
Created on Cognitive Class Labs
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<a href=\"https://cognitiveclass.ai\"><img src = \"https://ibm.box.com/shared/static/9gegpsmnsoo25ikkbl4qzlvlyjbgxs5x.png\" width = 400> </a>\n",
"\n",
"<h1 align=center><font size = 5>Segmenting and Clustering Neighborhoods in New York City</font></h1>"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Introduction\n",
"\n",
"In this lab, you will learn how to convert addresses into their equivalent latitude and longitude values. Also, you will use the Foursquare API to explore neighborhoods in New York City. You will use the **explore** function to get the most common venue categories in each neighborhood, and then use this feature to group the neighborhoods into clusters. You will use the *k*-means clustering algorithm to complete this task. Finally, you will use the Folium library to visualize the neighborhoods in New York City and their emerging clusters."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Table of Contents\n",
"\n",
"<div class=\"alert alert-block alert-info\" style=\"margin-top: 20px\">\n",
"\n",
"<font size = 3>\n",
"\n",
"1. <a href=\"#item1\">Download and Explore Dataset</a>\n",
"\n",
"2. <a href=\"#item2\">Explore Neighborhoods in New York City</a>\n",
"\n",
"3. <a href=\"#item3\">Analyze Each Neighborhood</a>\n",
"\n",
"4. <a href=\"#item4\">Cluster Neighborhoods</a>\n",
"\n",
"5. <a href=\"#item5\">Examine Clusters</a> \n",
"</font>\n",
"</div>"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Before we get the data and start exploring it, let's download all the dependencies that we will need."
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": false,
"jupyter": {
"outputs_hidden": false
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Libraries imported.\n"
]
}
],
"source": [
"import numpy as np # library to handle data in a vectorized manner\n",
"\n",
"import pandas as pd # library for data analsysis\n",
"pd.set_option('display.max_columns', None)\n",
"pd.set_option('display.max_rows', None)\n",
"\n",
"import json # library to handle JSON files\n",
"\n",
"#!conda install -c conda-forge geopy --yes # uncomment this line if you haven't completed the Foursquare API lab\n",
"from geopy.geocoders import Nominatim # convert an address into latitude and longitude values\n",
"\n",
"import requests # library to handle requests\n",
"from pandas.io.json import json_normalize # tranform JSON file into a pandas dataframe\n",
"\n",
"# Matplotlib and associated plotting modules\n",
"import matplotlib.cm as cm\n",
"import matplotlib.colors as colors\n",
"\n",
"# import k-means from clustering stage\n",
"from sklearn.cluster import KMeans\n",
"\n",
"#!conda install -c conda-forge folium=0.5.0 --yes # uncomment this line if you haven't completed the Foursquare API lab\n",
"import folium # map rendering library\n",
"\n",
"print('Libraries imported.')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<a id='item1'></a>"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 1. Download and Explore Dataset"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Neighborhood has a total of 5 boroughs and 306 neighborhoods. In order to segement the neighborhoods and explore them, we will essentially need a dataset that contains the 5 boroughs and the neighborhoods that exist in each borough as well as the the latitude and logitude coordinates of each neighborhood. \n",
"\n",
"Luckily, this dataset exists for free on the web. Feel free to try to find this dataset on your own, but here is the link to the dataset: https://geo.nyu.edu/catalog/nyu_2451_34572"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"For your convenience, I downloaded the files and placed it on the server, so you can simply run a `wget` command and access the data. So let's go ahead and do that."
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": false,
"jupyter": {
"outputs_hidden": false
},
"scrolled": true
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Data downloaded!\n"
]
}
],
"source": [
"!wget -q -O 'newyork_data.json' https://cocl.us/new_york_dataset\n",
"print('Data downloaded!')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Load and explore the data"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Next, let's load the data."
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": false,
"jupyter": {
"outputs_hidden": false
}
},
"outputs": [],
"source": [
"with open('newyork_data.json') as json_data:\n",
" newyork_data = json.load(json_data)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's take a quick look at the data."
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"collapsed": false,
"jupyter": {
"outputs_hidden": false
}
},
"outputs": [
{
"data": {
"text/plain": [
"{'type': 'FeatureCollection',\n",
" 'totalFeatures': 306,\n",
" 'features': [{'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.1',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.84720052054902, 40.89470517661]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Wakefield',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Wakefield',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.84720052054902,\n",
" 40.89470517661,\n",
" -73.84720052054902,\n",
" 40.89470517661]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.2',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.82993910812398, 40.87429419303012]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Co-op City',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Co-op',\n",
" 'annoline2': 'City',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.82993910812398,\n",
" 40.87429419303012,\n",
" -73.82993910812398,\n",
" 40.87429419303012]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.3',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.82780644716412, 40.887555677350775]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Eastchester',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Eastchester',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.82780644716412,\n",
" 40.887555677350775,\n",
" -73.82780644716412,\n",
" 40.887555677350775]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.4',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.90564259591682, 40.89543742690383]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Fieldston',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Fieldston',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.90564259591682,\n",
" 40.89543742690383,\n",
" -73.90564259591682,\n",
" 40.89543742690383]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.5',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.9125854610857, 40.890834493891305]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Riverdale',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Riverdale',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.9125854610857,\n",
" 40.890834493891305,\n",
" -73.9125854610857,\n",
" 40.890834493891305]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.6',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.90281798724604, 40.88168737120521]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Kingsbridge',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Kingsbridge',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.90281798724604,\n",
" 40.88168737120521,\n",
" -73.90281798724604,\n",
" 40.88168737120521]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.7',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.91065965862981, 40.87655077879964]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Marble Hill',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Marble',\n",
" 'annoline2': 'Hill',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.91065965862981,\n",
" 40.87655077879964,\n",
" -73.91065965862981,\n",
" 40.87655077879964]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.8',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.86731496814176, 40.89827261213805]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Woodlawn',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Woodlawn',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.86731496814176,\n",
" 40.89827261213805,\n",
" -73.86731496814176,\n",
" 40.89827261213805]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.9',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.8793907395681, 40.87722415599446]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Norwood',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Norwood',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.8793907395681,\n",
" 40.87722415599446,\n",
" -73.8793907395681,\n",
" 40.87722415599446]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.10',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.85744642974207, 40.88103887819211]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Williamsbridge',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Williamsbridge',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.85744642974207,\n",
" 40.88103887819211,\n",
" -73.85744642974207,\n",
" 40.88103887819211]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.11',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.83579759808117, 40.866858107252696]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Baychester',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Baychester',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.83579759808117,\n",
" 40.866858107252696,\n",
" -73.83579759808117,\n",
" 40.866858107252696]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.12',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.85475564017999, 40.85741349808865]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Pelham Parkway',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Pelham Parkway',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.85475564017999,\n",
" 40.85741349808865,\n",
" -73.85475564017999,\n",
" 40.85741349808865]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.13',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.78648845267413, 40.84724670491813]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'City Island',\n",
" 'stacked': 2,\n",
" 'annoline1': 'City',\n",
" 'annoline2': 'Island',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.78648845267413,\n",
" 40.84724670491813,\n",
" -73.78648845267413,\n",
" 40.84724670491813]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.14',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.8855121841913, 40.870185164975325]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Bedford Park',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Bedford',\n",
" 'annoline2': 'Park',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.8855121841913,\n",
" 40.870185164975325,\n",
" -73.8855121841913,\n",
" 40.870185164975325]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.15',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.9104159619131, 40.85572707719664]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'University Heights',\n",
" 'stacked': 2,\n",
" 'annoline1': 'University',\n",
" 'annoline2': 'Heights',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.9104159619131,\n",
" 40.85572707719664,\n",
" -73.9104159619131,\n",
" 40.85572707719664]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.16',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.91967159119565, 40.84789792606271]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Morris Heights',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Morris',\n",
" 'annoline2': 'Heights',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.91967159119565,\n",
" 40.84789792606271,\n",
" -73.91967159119565,\n",
" 40.84789792606271]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.17',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.89642655981623, 40.86099679638654]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Fordham',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Fordham',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.89642655981623,\n",
" 40.86099679638654,\n",
" -73.89642655981623,\n",
" 40.86099679638654]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.18',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.88735617532338, 40.84269615786053]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'East Tremont',\n",
" 'stacked': 2,\n",
" 'annoline1': 'East',\n",
" 'annoline2': 'Tremont',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.88735617532338,\n",
" 40.84269615786053,\n",
" -73.88735617532338,\n",
" 40.84269615786053]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.19',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.87774474910545, 40.83947505672653]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'West Farms',\n",
" 'stacked': 2,\n",
" 'annoline1': 'West',\n",
" 'annoline2': 'Farms',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.87774474910545,\n",
" 40.83947505672653,\n",
" -73.87774474910545,\n",
" 40.83947505672653]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.20',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.9261020935813, 40.836623010706056]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'High Bridge',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Highbridge',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.9261020935813,\n",
" 40.836623010706056,\n",
" -73.9261020935813,\n",
" 40.836623010706056]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.21',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.90942160757436, 40.819754370594936]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Melrose',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Melrose',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.90942160757436,\n",
" 40.819754370594936,\n",
" -73.90942160757436,\n",
" 40.819754370594936]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.22',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.91609987487575, 40.80623874935177]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Mott Haven',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Mott Haven',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.91609987487575,\n",
" 40.80623874935177,\n",
" -73.91609987487575,\n",
" 40.80623874935177]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.23',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.91322139386135, 40.801663627756206]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Port Morris',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Port',\n",
" 'annoline2': 'Morris',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.91322139386135,\n",
" 40.801663627756206,\n",
" -73.91322139386135,\n",
" 40.801663627756206]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.24',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.8957882009446, 40.81509904545822]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Longwood',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Longwood',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.8957882009446,\n",
" 40.81509904545822,\n",
" -73.8957882009446,\n",
" 40.81509904545822]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.25',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.88331505955291, 40.80972987938709]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Hunts Point',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Hunts',\n",
" 'annoline2': 'Point',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.88331505955291,\n",
" 40.80972987938709,\n",
" -73.88331505955291,\n",
" 40.80972987938709]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.26',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.90150648943059, 40.82359198585534]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Morrisania',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Morrisania',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.90150648943059,\n",
" 40.82359198585534,\n",
" -73.90150648943059,\n",
" 40.82359198585534]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.27',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.86574609554924, 40.821012197914015]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Soundview',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Soundview',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.86574609554924,\n",
" 40.821012197914015,\n",
" -73.86574609554924,\n",
" 40.821012197914015]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.28',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.85414416189266, 40.80655112003589]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Clason Point',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Clason',\n",
" 'annoline2': 'Point',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.85414416189266,\n",
" 40.80655112003589,\n",
" -73.85414416189266,\n",
" 40.80655112003589]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.29',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.81635002158441, 40.81510925804005]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Throgs Neck',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Throgs Neck',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.81635002158441,\n",
" 40.81510925804005,\n",
" -73.81635002158441,\n",
" 40.81510925804005]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.30',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.8240992675385, 40.844245936947374]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Country Club',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Country',\n",
" 'annoline2': 'Club',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.8240992675385,\n",
" 40.844245936947374,\n",
" -73.8240992675385,\n",
" 40.844245936947374]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.31',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.85600310535783, 40.837937822267286]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Parkchester',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Parkchester',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.85600310535783,\n",
" 40.837937822267286,\n",
" -73.85600310535783,\n",
" 40.837937822267286]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.32',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.84219407604444, 40.8406194964327]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Westchester Square',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Westchester',\n",
" 'annoline2': 'Square',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.84219407604444,\n",
" 40.8406194964327,\n",
" -73.84219407604444,\n",
" 40.8406194964327]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.33',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.8662991807561, 40.84360847124718]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Van Nest',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Van',\n",
" 'annoline2': 'Nest',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.8662991807561,\n",
" 40.84360847124718,\n",
" -73.8662991807561,\n",
" 40.84360847124718]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.34',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.85040178030421, 40.847549063536334]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Morris Park',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Morris Park',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.85040178030421,\n",
" 40.847549063536334,\n",
" -73.85040178030421,\n",
" 40.847549063536334]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.35',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.88845196134804, 40.85727710073895]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Belmont',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Belmont',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.88845196134804,\n",
" 40.85727710073895,\n",
" -73.88845196134804,\n",
" 40.85727710073895]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.36',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.91719048210393, 40.88139497727086]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Spuyten Duyvil',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Spuyten',\n",
" 'annoline2': 'Duyvil',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.91719048210393,\n",
" 40.88139497727086,\n",
" -73.91719048210393,\n",
" 40.88139497727086]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.37',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.90453054908927, 40.90854282950666]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'North Riverdale',\n",
" 'stacked': 2,\n",
" 'annoline1': 'North',\n",
" 'annoline2': 'Riverdale',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.90453054908927,\n",
" 40.90854282950666,\n",
" -73.90453054908927,\n",
" 40.90854282950666]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.38',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.8320737824047, 40.85064140940335]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Pelham Bay',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Pelham',\n",
" 'annoline2': 'Bay',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.8320737824047,\n",
" 40.85064140940335,\n",
" -73.8320737824047,\n",
" 40.85064140940335]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.39',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.82620275994073, 40.82657951686922]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Schuylerville',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Schuylerville',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.82620275994073,\n",
" 40.82657951686922,\n",
" -73.82620275994073,\n",
" 40.82657951686922]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.40',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.81388514428619, 40.821986118163494]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Edgewater Park',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Edgewater',\n",
" 'annoline2': 'Park',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.81388514428619,\n",
" 40.821986118163494,\n",
" -73.81388514428619,\n",
" 40.821986118163494]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.41',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.84802729582735, 40.819014376988314]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Castle Hill',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Castle',\n",
" 'annoline2': 'Hill',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.84802729582735,\n",
" 40.819014376988314,\n",
" -73.84802729582735,\n",
" 40.819014376988314]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.42',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.86332361652777, 40.87137078192371]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Olinville',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Olinville',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.86332361652777,\n",
" 40.87137078192371,\n",
" -73.86332361652777,\n",
" 40.87137078192371]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.43',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.84161194831223, 40.86296562477998]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Pelham Gardens',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Pelham',\n",
" 'annoline2': 'Gardens',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.84161194831223,\n",
" 40.86296562477998,\n",
" -73.84161194831223,\n",
" 40.86296562477998]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.44',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.91558941773444, 40.83428380733851]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Concourse',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Concourse',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.91558941773444,\n",
" 40.83428380733851,\n",
" -73.91558941773444,\n",
" 40.83428380733851]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.45',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.85053524451935, 40.82977429787161]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Unionport',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Unionport',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.85053524451935,\n",
" 40.82977429787161,\n",
" -73.85053524451935,\n",
" 40.82977429787161]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.46',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.84808271877168, 40.88456130303732]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Edenwald',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Edenwald',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.84808271877168,\n",
" 40.88456130303732,\n",
" -73.84808271877168,\n",
" 40.88456130303732]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.47',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.03062069353813, 40.625801065010656]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Bay Ridge',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Bay Ridge',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-74.03062069353813,\n",
" 40.625801065010656,\n",
" -74.03062069353813,\n",
" 40.625801065010656]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.48',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.99517998380729, 40.61100890202044]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Bensonhurst',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Bensonhurst',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.99517998380729,\n",
" 40.61100890202044,\n",
" -73.99517998380729,\n",
" 40.61100890202044]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.49',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.01031618527784, 40.64510294925429]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Sunset Park',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Sunset',\n",
" 'annoline2': 'Park',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-74.01031618527784,\n",
" 40.64510294925429,\n",
" -74.01031618527784,\n",
" 40.64510294925429]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.50',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.95424093127393, 40.7302009848647]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Greenpoint',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Greenpoint',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.95424093127393,\n",
" 40.7302009848647,\n",
" -73.95424093127393,\n",
" 40.7302009848647]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.51',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.97347087708445, 40.59526001306593]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Gravesend',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Gravesend',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.97347087708445,\n",
" 40.59526001306593,\n",
" -73.97347087708445,\n",
" 40.59526001306593]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.52',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.96509448785336, 40.57682506566604]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Brighton Beach',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Brighton',\n",
" 'annoline2': 'Beach',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.96509448785336,\n",
" 40.57682506566604,\n",
" -73.96509448785336,\n",
" 40.57682506566604]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.53',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.94318640482979, 40.58689012678384]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Sheepshead Bay',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Sheepshead',\n",
" 'annoline2': 'Bay',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.94318640482979,\n",
" 40.58689012678384,\n",
" -73.94318640482979,\n",
" 40.58689012678384]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.54',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.95743840559939, 40.61443251335098]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Manhattan Terrace',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Manhattan',\n",
" 'annoline2': 'Terrace',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.95743840559939,\n",
" 40.61443251335098,\n",
" -73.95743840559939,\n",
" 40.61443251335098]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.55',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.95840106533903, 40.63632589026677]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Flatbush',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Flatbush',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.95840106533903,\n",
" 40.63632589026677,\n",
" -73.95840106533903,\n",
" 40.63632589026677]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.56',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.94329119073582, 40.67082917695294]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Crown Heights',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Crown',\n",
" 'annoline2': 'Heights',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.94329119073582,\n",
" 40.67082917695294,\n",
" -73.94329119073582,\n",
" 40.67082917695294]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.57',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.93610256185836, 40.64171776668961]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'East Flatbush',\n",
" 'stacked': 1,\n",
" 'annoline1': 'East Flatbush',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.93610256185836,\n",
" 40.64171776668961,\n",
" -73.93610256185836,\n",
" 40.64171776668961]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.58',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.98042110559474, 40.642381958003526]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Kensington',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Kensington',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.98042110559474,\n",
" 40.642381958003526,\n",
" -73.98042110559474,\n",
" 40.642381958003526]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.59',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.98007340430172, 40.65694583575104]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Windsor Terrace',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Windsor',\n",
" 'annoline2': 'Terrace',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.98007340430172,\n",
" 40.65694583575104,\n",
" -73.98007340430172,\n",
" 40.65694583575104]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.60',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.9648592426269, 40.676822262254724]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Prospect Heights',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Prospect',\n",
" 'annoline2': 'Heights',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.9648592426269,\n",
" 40.676822262254724,\n",
" -73.9648592426269,\n",
" 40.676822262254724]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.61',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.91023536176607, 40.66394994339755]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Brownsville',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Brownsville',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.91023536176607,\n",
" 40.66394994339755,\n",
" -73.91023536176607,\n",
" 40.66394994339755]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.62',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.95811529220927, 40.70714439344251]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Williamsburg',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Williamsburg',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.95811529220927,\n",
" 40.70714439344251,\n",
" -73.95811529220927,\n",
" 40.70714439344251]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.63',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.92525797487045, 40.69811611017901]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Bushwick',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Bushwick',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.92525797487045,\n",
" 40.69811611017901,\n",
" -73.92525797487045,\n",
" 40.69811611017901]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.64',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.94178488690297, 40.687231607720456]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Bedford Stuyvesant',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Bedford Stuyvesant',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.94178488690297,\n",
" 40.687231607720456,\n",
" -73.94178488690297,\n",
" 40.687231607720456]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.65',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.99378225496424, 40.695863722724084]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Brooklyn Heights',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Brooklyn',\n",
" 'annoline2': 'Heights',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.99378225496424,\n",
" 40.695863722724084,\n",
" -73.99378225496424,\n",
" 40.695863722724084]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.66',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.99856139218463, 40.687919722485574]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Cobble Hill',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Cobble',\n",
" 'annoline2': 'Hill',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.99856139218463,\n",
" 40.687919722485574,\n",
" -73.99856139218463,\n",
" 40.687919722485574]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.67',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.99465372828006, 40.680540231076485]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Carroll Gardens',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Carroll',\n",
" 'annoline2': 'Gardens',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.99465372828006,\n",
" 40.680540231076485,\n",
" -73.99465372828006,\n",
" 40.680540231076485]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.68',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.0127589747356, 40.676253230250886]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Red Hook',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Red',\n",
" 'annoline2': 'Hook',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-74.0127589747356,\n",
" 40.676253230250886,\n",
" -74.0127589747356,\n",
" 40.676253230250886]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.69',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.99444087145339, 40.673931143187154]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Gowanus',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Gowanus',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.99444087145339,\n",
" 40.673931143187154,\n",
" -73.99444087145339,\n",
" 40.673931143187154]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.70',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.97290574369092, 40.68852726018977]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Fort Greene',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Fort',\n",
" 'annoline2': 'Greene',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.97290574369092,\n",
" 40.68852726018977,\n",
" -73.97290574369092,\n",
" 40.68852726018977]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.71',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.97705030183924, 40.67232052268197]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Park Slope',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Park',\n",
" 'annoline2': 'Slope',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.97705030183924,\n",
" 40.67232052268197,\n",
" -73.97705030183924,\n",
" 40.67232052268197]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.72',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.87661596457296, 40.68239101144211]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Cypress Hills',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Cypress',\n",
" 'annoline2': 'Hills',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.87661596457296,\n",
" 40.68239101144211,\n",
" -73.87661596457296,\n",
" 40.68239101144211]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.73',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.88069863917366, 40.669925700847045]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'East New York',\n",
" 'stacked': 1,\n",
" 'annoline1': 'East New York',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.88069863917366,\n",
" 40.669925700847045,\n",
" -73.88069863917366,\n",
" 40.669925700847045]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.74',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.87936970045875, 40.64758905230874]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Starrett City',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Starrett',\n",
" 'annoline2': 'City',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.87936970045875,\n",
" 40.64758905230874,\n",
" -73.87936970045875,\n",
" 40.64758905230874]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.75',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.90209269778966, 40.63556432797428]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Canarsie',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Canarsie',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.90209269778966,\n",
" 40.63556432797428,\n",
" -73.90209269778966,\n",
" 40.63556432797428]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.76',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.92911302644674, 40.630446043757466]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Flatlands',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Flatlands',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.92911302644674,\n",
" 40.630446043757466,\n",
" -73.92911302644674,\n",
" 40.630446043757466]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.77',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.90818571777423, 40.606336421685626]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Mill Island',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Mill',\n",
" 'annoline2': 'Island',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.90818571777423,\n",
" 40.606336421685626,\n",
" -73.90818571777423,\n",
" 40.606336421685626]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.78',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.94353722891886, 40.57791350308657]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Manhattan Beach',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Manhattan',\n",
" 'annoline2': 'Beach',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.94353722891886,\n",
" 40.57791350308657,\n",
" -73.94353722891886,\n",
" 40.57791350308657]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.79',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.98868295821637, 40.57429256471601]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Coney Island',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Coney Island',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.98868295821637,\n",
" 40.57429256471601,\n",
" -73.98868295821637,\n",
" 40.57429256471601]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.80',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.99875221443519, 40.59951870282238]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Bath Beach',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Bath',\n",
" 'annoline2': 'Beach',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.99875221443519,\n",
" 40.59951870282238,\n",
" -73.99875221443519,\n",
" 40.59951870282238]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.81',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.99049823044811, 40.633130512758015]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Borough Park',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Borough',\n",
" 'annoline2': 'Park',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.99049823044811,\n",
" 40.633130512758015,\n",
" -73.99049823044811,\n",
" 40.633130512758015]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.82',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.01931375636022, 40.619219457722636]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Dyker Heights',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Dyker',\n",
" 'annoline2': 'Heights',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-74.01931375636022,\n",
" 40.619219457722636,\n",
" -74.01931375636022,\n",
" 40.619219457722636]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.83',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.93010170691196, 40.590848433902046]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Gerritsen Beach',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Gerritsen',\n",
" 'annoline2': 'Beach',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.93010170691196,\n",
" 40.590848433902046,\n",
" -73.93010170691196,\n",
" 40.590848433902046]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.84',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.93134404108497, 40.609747779894604]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Marine Park',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Marine Park',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.93134404108497,\n",
" 40.609747779894604,\n",
" -73.93134404108497,\n",
" 40.609747779894604]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.85',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.96784306216367, 40.693229421881504]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Clinton Hill',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Clinton',\n",
" 'annoline2': 'Hill',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.96784306216367,\n",
" 40.693229421881504,\n",
" -73.96784306216367,\n",
" 40.693229421881504]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.86',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.0078731120024, 40.57637537890224]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Sea Gate',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Sea',\n",
" 'annoline2': 'Gate',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-74.0078731120024,\n",
" 40.57637537890224,\n",
" -74.0078731120024,\n",
" 40.57637537890224]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.87',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.98346337431099, 40.69084402109802]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Downtown',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Downtown',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.98346337431099,\n",
" 40.69084402109802,\n",
" -73.98346337431099,\n",
" 40.69084402109802]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.88',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.98374824115798, 40.685682912091444]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Boerum Hill',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Boerum',\n",
" 'annoline2': 'Hill',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.98374824115798,\n",
" 40.685682912091444,\n",
" -73.98374824115798,\n",
" 40.685682912091444]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.89',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.95489867077713, 40.658420017469815]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Prospect Lefferts Gardens',\n",
" 'stacked': 3,\n",
" 'annoline1': 'Prospect',\n",
" 'annoline2': 'Lefferts',\n",
" 'annoline3': 'Gardens',\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.95489867077713,\n",
" 40.658420017469815,\n",
" -73.95489867077713,\n",
" 40.658420017469815]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.90',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.91306831787395, 40.678402554795355]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Ocean Hill',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Ocean',\n",
" 'annoline2': 'Hill',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.91306831787395,\n",
" 40.678402554795355,\n",
" -73.91306831787395,\n",
" 40.678402554795355]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.91',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.86797598081334, 40.67856995727479]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'City Line',\n",
" 'stacked': 2,\n",
" 'annoline1': 'City',\n",
" 'annoline2': 'Line',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.86797598081334,\n",
" 40.67856995727479,\n",
" -73.86797598081334,\n",
" 40.67856995727479]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.92',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.89855633630317, 40.61514955045308]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Bergen Beach',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Bergen',\n",
" 'annoline2': 'Beach',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.89855633630317,\n",
" 40.61514955045308,\n",
" -73.89855633630317,\n",
" 40.61514955045308]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.93',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.95759523489838, 40.62559589869843]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Midwood',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Midwood',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.95759523489838,\n",
" 40.62559589869843,\n",
" -73.95759523489838,\n",
" 40.62559589869843]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.94',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.96261316716048, 40.647008603185185]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Prospect Park South',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Prospect',\n",
" 'annoline2': 'Park South',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.96261316716048,\n",
" 40.647008603185185,\n",
" -73.96261316716048,\n",
" 40.647008603185185]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.95',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.91607483951324, 40.62384524478419]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Georgetown',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Georgetown',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.91607483951324,\n",
" 40.62384524478419,\n",
" -73.91607483951324,\n",
" 40.62384524478419]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.96',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.93885815269195, 40.70849241041548]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'East Williamsburg',\n",
" 'stacked': 2,\n",
" 'annoline1': 'East',\n",
" 'annoline2': 'Williamsburg',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.93885815269195,\n",
" 40.70849241041548,\n",
" -73.93885815269195,\n",
" 40.70849241041548]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.97',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.95880857587582, 40.714822906532014]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'North Side',\n",
" 'stacked': 1,\n",
" 'annoline1': 'North Side',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.95880857587582,\n",
" 40.714822906532014,\n",
" -73.95880857587582,\n",
" 40.714822906532014]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.98',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.95800095153331, 40.71086147265064]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'South Side',\n",
" 'stacked': 1,\n",
" 'annoline1': 'South Side',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.95800095153331,\n",
" 40.71086147265064,\n",
" -73.95800095153331,\n",
" 40.71086147265064]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.99',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.96836678035541, 40.61305976667942]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Ocean Parkway',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Ocean',\n",
" 'annoline2': 'Parkway',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.96836678035541,\n",
" 40.61305976667942,\n",
" -73.96836678035541,\n",
" 40.61305976667942]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.100',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.03197914537984, 40.61476812694226]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Fort Hamilton',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Fort',\n",
" 'annoline2': 'Hamilton',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-74.03197914537984,\n",
" 40.61476812694226,\n",
" -74.03197914537984,\n",
" 40.61476812694226]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.101',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.99427936255978, 40.71561842231432]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Chinatown',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Chinatown',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.99427936255978,\n",
" 40.71561842231432,\n",
" -73.99427936255978,\n",
" 40.71561842231432]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.102',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.93690027985234, 40.85190252555305]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Washington Heights',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Washington',\n",
" 'annoline2': 'Heights',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.93690027985234,\n",
" 40.85190252555305,\n",
" -73.93690027985234,\n",
" 40.85190252555305]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.103',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.92121042203897, 40.86768396449915]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Inwood',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Inwood',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.92121042203897,\n",
" 40.86768396449915,\n",
" -73.92121042203897,\n",
" 40.86768396449915]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.104',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.94968791883366, 40.823604284811935]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Hamilton Heights',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Hamilton',\n",
" 'annoline2': 'Heights',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.94968791883366,\n",
" 40.823604284811935,\n",
" -73.94968791883366,\n",
" 40.823604284811935]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.105',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.9573853935188, 40.8169344294978]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Manhattanville',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Manhattanville',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.9573853935188,\n",
" 40.8169344294978,\n",
" -73.9573853935188,\n",
" 40.8169344294978]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.106',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.94321112603905, 40.81597606742414]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Central Harlem',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Central',\n",
" 'annoline2': 'Harlem',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.94321112603905,\n",
" 40.81597606742414,\n",
" -73.94321112603905,\n",
" 40.81597606742414]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.107',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.94418223148524, 40.79224946663033]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'East Harlem',\n",
" 'stacked': 2,\n",
" 'annoline1': 'East',\n",
" 'annoline2': 'Harlem',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.94418223148524,\n",
" 40.79224946663033,\n",
" -73.94418223148524,\n",
" 40.79224946663033]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.108',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.96050763135, 40.775638573301805]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Upper East Side',\n",
" 'stacked': 3,\n",
" 'annoline1': 'Upper',\n",
" 'annoline2': 'East',\n",
" 'annoline3': 'Side',\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.96050763135,\n",
" 40.775638573301805,\n",
" -73.96050763135,\n",
" 40.775638573301805]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.109',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.94711784471826, 40.775929849884875]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Yorkville',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Yorkville',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.94711784471826,\n",
" 40.775929849884875,\n",
" -73.94711784471826,\n",
" 40.775929849884875]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.110',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.9588596881376, 40.76811265828733]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Lenox Hill',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Lenox',\n",
" 'annoline2': 'Hill',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.9588596881376,\n",
" 40.76811265828733,\n",
" -73.9588596881376,\n",
" 40.76811265828733]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.111',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.94916769227953, 40.76215960576283]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Roosevelt Island',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Roosevelt Island',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 56,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.94916769227953,\n",
" 40.76215960576283,\n",
" -73.94916769227953,\n",
" 40.76215960576283]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.112',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.97705923630603, 40.787657998534854]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Upper West Side',\n",
" 'stacked': 3,\n",
" 'annoline1': 'Upper',\n",
" 'annoline2': 'West',\n",
" 'annoline3': 'Side',\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.97705923630603,\n",
" 40.787657998534854,\n",
" -73.97705923630603,\n",
" 40.787657998534854]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.113',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.98533777001262, 40.77352888942166]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Lincoln Square',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Lincoln',\n",
" 'annoline2': 'Square',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.98533777001262,\n",
" 40.77352888942166,\n",
" -73.98533777001262,\n",
" 40.77352888942166]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.114',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.99611936309479, 40.75910089146212]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Clinton',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Clinton',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.99611936309479,\n",
" 40.75910089146212,\n",
" -73.99611936309479,\n",
" 40.75910089146212]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.115',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.98166882730304, 40.75469110270623]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Midtown',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Midtown',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.98166882730304,\n",
" 40.75469110270623,\n",
" -73.98166882730304,\n",
" 40.75469110270623]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.116',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.97833207924127, 40.748303077252174]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Murray Hill',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Murray',\n",
" 'annoline2': 'Hill',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.97833207924127,\n",
" 40.748303077252174,\n",
" -73.97833207924127,\n",
" 40.748303077252174]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.117',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.00311633472813, 40.744034706747975]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Chelsea',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Chelsea',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-74.00311633472813,\n",
" 40.744034706747975,\n",
" -74.00311633472813,\n",
" 40.744034706747975]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.118',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.99991402945902, 40.72693288536128]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Greenwich Village',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Greenwich',\n",
" 'annoline2': 'Village',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.99991402945902,\n",
" 40.72693288536128,\n",
" -73.99991402945902,\n",
" 40.72693288536128]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.119',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.98222616506416, 40.727846777270244]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'East Village',\n",
" 'stacked': 2,\n",
" 'annoline1': 'East',\n",
" 'annoline2': 'Village',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.98222616506416,\n",
" 40.727846777270244,\n",
" -73.98222616506416,\n",
" 40.727846777270244]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.120',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.98089031999291, 40.71780674892765]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Lower East Side',\n",
" 'stacked': 3,\n",
" 'annoline1': 'Lower',\n",
" 'annoline2': 'East',\n",
" 'annoline3': 'Side',\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.98089031999291,\n",
" 40.71780674892765,\n",
" -73.98089031999291,\n",
" 40.71780674892765]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.121',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.01068328559087, 40.721521967443216]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Tribeca',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Tribeca',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-74.01068328559087,\n",
" 40.721521967443216,\n",
" -74.01068328559087,\n",
" 40.721521967443216]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.122',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.99730467208073, 40.71932379395907]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Little Italy',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Little',\n",
" 'annoline2': 'Italy',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.99730467208073,\n",
" 40.71932379395907,\n",
" -73.99730467208073,\n",
" 40.71932379395907]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.123',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.00065666959759, 40.72218384131794]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Soho',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Soho',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-74.00065666959759,\n",
" 40.72218384131794,\n",
" -74.00065666959759,\n",
" 40.72218384131794]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.124',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.00617998126812, 40.73443393572434]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'West Village',\n",
" 'stacked': 2,\n",
" 'annoline1': 'West',\n",
" 'annoline2': 'Village',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-74.00617998126812,\n",
" 40.73443393572434,\n",
" -74.00617998126812,\n",
" 40.73443393572434]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.125',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.96428617740655, 40.797307041702865]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Manhattan Valley',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Manhattan',\n",
" 'annoline2': 'Valley',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.96428617740655,\n",
" 40.797307041702865,\n",
" -73.96428617740655,\n",
" 40.797307041702865]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.126',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.96389627905332, 40.807999738165826]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Morningside Heights',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Morningside',\n",
" 'annoline2': 'Heights',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.96389627905332,\n",
" 40.807999738165826,\n",
" -73.96389627905332,\n",
" 40.807999738165826]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.127',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.98137594833541, 40.737209832715]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Gramercy',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Gramercy',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.98137594833541,\n",
" 40.737209832715,\n",
" -73.98137594833541,\n",
" 40.737209832715]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.128',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.01686930508617, 40.71193198394565]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Battery Park City',\n",
" 'stacked': 3,\n",
" 'annoline1': 'Battery',\n",
" 'annoline2': 'Park',\n",
" 'annoline3': 'City',\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-74.01686930508617,\n",
" 40.71193198394565,\n",
" -74.01686930508617,\n",
" 40.71193198394565]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.129',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.0106654452127, 40.70710710727048]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Financial District',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Financial',\n",
" 'annoline2': 'District',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-74.0106654452127,\n",
" 40.70710710727048,\n",
" -74.0106654452127,\n",
" 40.70710710727048]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.130',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.91565374304234, 40.76850859335492]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Astoria',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Astoria',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.91565374304234,\n",
" 40.76850859335492,\n",
" -73.91565374304234,\n",
" 40.76850859335492]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.131',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.90184166838284, 40.74634908860222]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Woodside',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Woodside',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.90184166838284,\n",
" 40.74634908860222,\n",
" -73.90184166838284,\n",
" 40.74634908860222]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.132',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.88282109164365, 40.75198138007367]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Jackson Heights',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Jackson',\n",
" 'annoline2': 'Heights',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.88282109164365,\n",
" 40.75198138007367,\n",
" -73.88282109164365,\n",
" 40.75198138007367]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.133',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.88165622288388, 40.744048505122024]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Elmhurst',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Elmhurst',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.88165622288388,\n",
" 40.744048505122024,\n",
" -73.88165622288388,\n",
" 40.744048505122024]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.134',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.8381376460028, 40.65422527738487]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Howard Beach',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Howard',\n",
" 'annoline2': 'Beach',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.8381376460028,\n",
" 40.65422527738487,\n",
" -73.8381376460028,\n",
" 40.65422527738487]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.135',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.85682497345258, 40.74238175015667]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Corona',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Corona',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.85682497345258,\n",
" 40.74238175015667,\n",
" -73.85682497345258,\n",
" 40.74238175015667]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.136',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.84447500788983, 40.72526378216503]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Forest Hills',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Forest',\n",
" 'annoline2': 'Hills',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.84447500788983,\n",
" 40.72526378216503,\n",
" -73.84447500788983,\n",
" 40.72526378216503]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.137',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.82981905825703, 40.7051790354148]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Kew Gardens',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Kew',\n",
" 'annoline2': 'Gardens',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.82981905825703,\n",
" 40.7051790354148,\n",
" -73.82981905825703,\n",
" 40.7051790354148]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.138',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.83183321446887, 40.69794731471763]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Richmond Hill',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Richmond',\n",
" 'annoline2': 'Hill',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.83183321446887,\n",
" 40.69794731471763,\n",
" -73.83183321446887,\n",
" 40.69794731471763]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.139',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.83177300329582, 40.76445419697846]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Flushing',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Flushing',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.83177300329582,\n",
" 40.76445419697846,\n",
" -73.83177300329582,\n",
" 40.76445419697846]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.140',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.93920223915505, 40.75021734610528]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Long Island City',\n",
" 'stacked': 3,\n",
" 'annoline1': 'Long',\n",
" 'annoline2': 'Island',\n",
" 'annoline3': 'City',\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.93920223915505,\n",
" 40.75021734610528,\n",
" -73.93920223915505,\n",
" 40.75021734610528]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.141',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.92691617561577, 40.74017628351924]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Sunnyside',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Sunnyside',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.92691617561577,\n",
" 40.74017628351924,\n",
" -73.92691617561577,\n",
" 40.74017628351924]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.142',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.86704147658772, 40.76407323883091]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'East Elmhurst',\n",
" 'stacked': 2,\n",
" 'annoline1': 'East',\n",
" 'annoline2': 'Elmhurst',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.86704147658772,\n",
" 40.76407323883091,\n",
" -73.86704147658772,\n",
" 40.76407323883091]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.143',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.89621713626859, 40.725427374093606]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Maspeth',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Maspeth',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.89621713626859,\n",
" 40.725427374093606,\n",
" -73.89621713626859,\n",
" 40.725427374093606]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.144',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.90143517559589, 40.70832315613858]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Ridgewood',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Ridgewood',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.90143517559589,\n",
" 40.70832315613858,\n",
" -73.90143517559589,\n",
" 40.70832315613858]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.145',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.87074167435605, 40.70276242967838]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Glendale',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Glendale',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.87074167435605,\n",
" 40.70276242967838,\n",
" -73.87074167435605,\n",
" 40.70276242967838]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.146',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.8578268690537, 40.72897409480735]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Rego Park',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Rego Park',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.8578268690537,\n",
" 40.72897409480735,\n",
" -73.8578268690537,\n",
" 40.72897409480735]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.147',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.8581104655432, 40.68988687915789]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Woodhaven',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Woodhaven',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.8581104655432,\n",
" 40.68988687915789,\n",
" -73.8581104655432,\n",
" 40.68988687915789]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.148',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.84320266173447, 40.680708468265415]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Ozone Park',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Ozone Park',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.84320266173447,\n",
" 40.680708468265415,\n",
" -73.84320266173447,\n",
" 40.680708468265415]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.149',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.80986478649041, 40.66854957767195]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'South Ozone Park',\n",
" 'stacked': 2,\n",
" 'annoline1': 'South',\n",
" 'annoline2': 'Ozone Park',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.80986478649041,\n",
" 40.66854957767195,\n",
" -73.80986478649041,\n",
" 40.66854957767195]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.150',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.84304528896125, 40.784902749260205]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'College Point',\n",
" 'stacked': 2,\n",
" 'annoline1': 'College',\n",
" 'annoline2': 'Point',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.84304528896125,\n",
" 40.784902749260205,\n",
" -73.84304528896125,\n",
" 40.784902749260205]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.151',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.81420216610863, 40.78129076602694]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Whitestone',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Whitestone',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.81420216610863,\n",
" 40.78129076602694,\n",
" -73.81420216610863,\n",
" 40.78129076602694]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.152',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.7742736306867, 40.76604063281064]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Bayside',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Bayside',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.7742736306867,\n",
" 40.76604063281064,\n",
" -73.7742736306867,\n",
" 40.76604063281064]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.153',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.79176243728061, 40.76172954903262]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Auburndale',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Auburndale',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.79176243728061,\n",
" 40.76172954903262,\n",
" -73.79176243728061,\n",
" 40.76172954903262]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.154',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.7388977558074, 40.7708261928267]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Little Neck',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Little',\n",
" 'annoline2': 'Neck',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.7388977558074,\n",
" 40.7708261928267,\n",
" -73.7388977558074,\n",
" 40.7708261928267]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.155',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.7424982072733, 40.76684609790763]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Douglaston',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Douglaston',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.7424982072733,\n",
" 40.76684609790763,\n",
" -73.7424982072733,\n",
" 40.76684609790763]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.156',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.71548118999145, 40.74944079974332]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Glen Oaks',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Glen',\n",
" 'annoline2': 'Oaks',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.71548118999145,\n",
" 40.74944079974332,\n",
" -73.71548118999145,\n",
" 40.74944079974332]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.157',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.72012814826903, 40.72857318176675]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Bellerose',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Bellerose',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.72012814826903,\n",
" 40.72857318176675,\n",
" -73.72012814826903,\n",
" 40.72857318176675]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.158',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.82087764933566, 40.722578244228046]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Kew Gardens Hills',\n",
" 'stacked': 3,\n",
" 'annoline1': 'Kew',\n",
" 'annoline2': 'Gardens',\n",
" 'annoline3': 'Hills',\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.82087764933566,\n",
" 40.722578244228046,\n",
" -73.82087764933566,\n",
" 40.722578244228046]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.159',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.78271337003264, 40.7343944653313]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Fresh Meadows',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Fresh',\n",
" 'annoline2': 'Meadows',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.78271337003264,\n",
" 40.7343944653313,\n",
" -73.78271337003264,\n",
" 40.7343944653313]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.160',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.81174822458634, 40.71093547252271]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Briarwood',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Briarwood',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.81174822458634,\n",
" 40.71093547252271,\n",
" -73.81174822458634,\n",
" 40.71093547252271]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.161',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.79690165888289, 40.70465736068717]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Jamaica Center',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Jamaica',\n",
" 'annoline2': 'Center',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.79690165888289,\n",
" 40.70465736068717,\n",
" -73.79690165888289,\n",
" 40.70465736068717]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.162',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.75494976234332, 40.74561857141855]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Oakland Gardens',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Oakland',\n",
" 'annoline2': 'Gardens',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.75494976234332,\n",
" 40.74561857141855,\n",
" -73.75494976234332,\n",
" 40.74561857141855]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.163',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.73871484578424, 40.718893092167356]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Queens Village',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Queens',\n",
" 'annoline2': 'Village',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.73871484578424,\n",
" 40.718893092167356,\n",
" -73.73871484578424,\n",
" 40.718893092167356]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.164',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.75925009335594, 40.71124344191904]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Hollis',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Hollis',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.75925009335594,\n",
" 40.71124344191904,\n",
" -73.75925009335594,\n",
" 40.71124344191904]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.165',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.7904261313554, 40.696911253789885]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'South Jamaica',\n",
" 'stacked': 1,\n",
" 'annoline1': 'South Jamaica',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.7904261313554,\n",
" 40.696911253789885,\n",
" -73.7904261313554,\n",
" 40.696911253789885]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.166',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.75867603727717, 40.69444538522359]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'St. Albans',\n",
" 'stacked': 1,\n",
" 'annoline1': 'St. Albans',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.75867603727717,\n",
" 40.69444538522359,\n",
" -73.75867603727717,\n",
" 40.69444538522359]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.167',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.77258787620906, 40.67521139591733]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Rochdale',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Rochdale',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.77258787620906,\n",
" 40.67521139591733,\n",
" -73.77258787620906,\n",
" 40.67521139591733]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.168',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.76042092682287, 40.666230490368584]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Springfield Gardens',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Springfield',\n",
" 'annoline2': 'Gardens',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.76042092682287,\n",
" 40.666230490368584,\n",
" -73.76042092682287,\n",
" 40.666230490368584]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.169',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.73526873708026, 40.692774639160845]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Cambria Heights',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Cambria',\n",
" 'annoline2': 'Heights',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.73526873708026,\n",
" 40.692774639160845,\n",
" -73.73526873708026,\n",
" 40.692774639160845]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.170',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.73526079428278, 40.659816433428084]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Rosedale',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Rosedale',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.73526079428278,\n",
" 40.659816433428084,\n",
" -73.73526079428278,\n",
" 40.659816433428084]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.171',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.75497968043872, 40.603134432500894]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Far Rockaway',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Far Rockaway',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.75497968043872,\n",
" 40.603134432500894,\n",
" -73.75497968043872,\n",
" 40.603134432500894]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.172',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.8200548911032, 40.60302658351238]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Broad Channel',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Broad',\n",
" 'annoline2': 'Channel',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.8200548911032,\n",
" 40.60302658351238,\n",
" -73.8200548911032,\n",
" 40.60302658351238]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.173',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.92551196994168, 40.55740128845452]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Breezy Point',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Breezy',\n",
" 'annoline2': 'Point',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.92551196994168,\n",
" 40.55740128845452,\n",
" -73.92551196994168,\n",
" 40.55740128845452]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.174',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.90228960391673, 40.775923015642896]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Steinway',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Steinway',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.90228960391673,\n",
" 40.775923015642896,\n",
" -73.90228960391673,\n",
" 40.775923015642896]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.175',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.80436451720988, 40.79278140360048]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Beechhurst',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Beechhurst',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.80436451720988,\n",
" 40.79278140360048,\n",
" -73.80436451720988,\n",
" 40.79278140360048]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.176',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.7768022262158, 40.782842806245554]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Bay Terrace',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Bay',\n",
" 'annoline2': 'Terrace',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.7768022262158,\n",
" 40.782842806245554,\n",
" -73.7768022262158,\n",
" 40.782842806245554]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.177',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.77613282391705, 40.595641807368494]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Edgemere',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Edgemere',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.77613282391705,\n",
" 40.595641807368494,\n",
" -73.77613282391705,\n",
" 40.595641807368494]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.178',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.79199233136943, 40.58914394372971]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Arverne',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Arverne',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.79199233136943,\n",
" 40.58914394372971,\n",
" -73.79199233136943,\n",
" 40.58914394372971]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.179',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.82236121088751, 40.582801696845586]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Rockaway Beach',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Rockaway',\n",
" 'annoline2': 'Beach',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.82236121088751,\n",
" 40.582801696845586,\n",
" -73.82236121088751,\n",
" 40.582801696845586]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.180',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.85754672410827, 40.572036730217015]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Neponsit',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Neponsit',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.85754672410827,\n",
" 40.572036730217015,\n",
" -73.85754672410827,\n",
" 40.572036730217015]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.181',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.81276269135866, 40.764126122614066]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Murray Hill',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Murray',\n",
" 'annoline2': 'Hill',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.81276269135866,\n",
" 40.764126122614066,\n",
" -73.81276269135866,\n",
" 40.764126122614066]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.182',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.70884705889246, 40.741378421945434]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Floral Park',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Floral Park',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.70884705889246,\n",
" 40.741378421945434,\n",
" -73.70884705889246,\n",
" 40.741378421945434]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.183',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.76714166714729, 40.7209572076444]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Holliswood',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Holliswood',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.76714166714729,\n",
" 40.7209572076444,\n",
" -73.76714166714729,\n",
" 40.7209572076444]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.184',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.7872269693666, 40.71680483014613]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Jamaica Estates',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Jamaica',\n",
" 'annoline2': 'Estates',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.7872269693666,\n",
" 40.71680483014613,\n",
" -73.7872269693666,\n",
" 40.71680483014613]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.185',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.82580915110559, 40.7445723092867]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Queensboro Hill',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Queensboro',\n",
" 'annoline2': 'Hill',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.82580915110559,\n",
" 40.7445723092867,\n",
" -73.82580915110559,\n",
" 40.7445723092867]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.186',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.79760300912672, 40.723824901829204]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Hillcrest',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Hillcrest',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.79760300912672,\n",
" 40.723824901829204,\n",
" -73.79760300912672,\n",
" 40.723824901829204]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.187',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.93157506072878, 40.761704526054146]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Ravenswood',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Ravenswood',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.93157506072878,\n",
" 40.761704526054146,\n",
" -73.93157506072878,\n",
" 40.761704526054146]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.188',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.84963782402441, 40.66391841925139]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Lindenwood',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Lindenwood',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.84963782402441,\n",
" 40.66391841925139,\n",
" -73.84963782402441,\n",
" 40.66391841925139]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.189',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.74025607989822, 40.66788389660247]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Laurelton',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Laurelton',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.74025607989822,\n",
" 40.66788389660247,\n",
" -73.74025607989822,\n",
" 40.66788389660247]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.190',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.8625247141374, 40.736074570830795]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Lefrak City',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Lefrak',\n",
" 'annoline2': 'City',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.8625247141374,\n",
" 40.736074570830795,\n",
" -73.8625247141374,\n",
" 40.736074570830795]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.191',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.8540175039252, 40.57615556543109]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Belle Harbor',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Belle Harbor',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.8540175039252,\n",
" 40.57615556543109,\n",
" -73.8540175039252,\n",
" 40.57615556543109]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.192',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.84153370226186, 40.58034295646131]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Rockaway Park',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Rockaway Park',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.84153370226186,\n",
" 40.58034295646131,\n",
" -73.84153370226186,\n",
" 40.58034295646131]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.193',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.79664750844047, 40.59771061565768]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Somerville',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Somerville',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.79664750844047,\n",
" 40.59771061565768,\n",
" -73.79664750844047,\n",
" 40.59771061565768]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.194',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.75175310731153, 40.66000322733613]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Brookville',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Brookville',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.75175310731153,\n",
" 40.66000322733613,\n",
" -73.75175310731153,\n",
" 40.66000322733613]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.195',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.73889198912481, 40.73301404027834]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Bellaire',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Bellaire',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.73889198912481,\n",
" 40.73301404027834,\n",
" -73.73889198912481,\n",
" 40.73301404027834]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.196',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.85751790676447, 40.7540709990489]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'North Corona',\n",
" 'stacked': 2,\n",
" 'annoline1': 'North',\n",
" 'annoline2': 'Corona',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.85751790676447,\n",
" 40.7540709990489,\n",
" -73.85751790676447,\n",
" 40.7540709990489]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.197',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.8410221123401, 40.7146110815117]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Forest Hills Gardens',\n",
" 'stacked': 3,\n",
" 'annoline1': 'Forest',\n",
" 'annoline2': 'Hills',\n",
" 'annoline3': 'Gardens',\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.8410221123401,\n",
" 40.7146110815117,\n",
" -73.8410221123401,\n",
" 40.7146110815117]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.198',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.07935312512797, 40.6449815710044]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'St. George',\n",
" 'stacked': 2,\n",
" 'annoline1': 'St.',\n",
" 'annoline2': 'George',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.07935312512797,\n",
" 40.6449815710044,\n",
" -74.07935312512797,\n",
" 40.6449815710044]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.199',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.08701650516625, 40.64061455913511]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'New Brighton',\n",
" 'stacked': 2,\n",
" 'annoline1': 'New',\n",
" 'annoline2': 'Brighton',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.08701650516625,\n",
" 40.64061455913511,\n",
" -74.08701650516625,\n",
" 40.64061455913511]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.200',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.07790192660066, 40.62692762538176]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Stapleton',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Stapleton',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.07790192660066,\n",
" 40.62692762538176,\n",
" -74.07790192660066,\n",
" 40.62692762538176]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.201',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.06980526716141, 40.61530494652761]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Rosebank',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Rosebank',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.06980526716141,\n",
" 40.61530494652761,\n",
" -74.06980526716141,\n",
" 40.61530494652761]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.202',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.1071817826561, 40.63187892654607]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'West Brighton',\n",
" 'stacked': 2,\n",
" 'annoline1': 'West',\n",
" 'annoline2': 'Brighton',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.1071817826561,\n",
" 40.63187892654607,\n",
" -74.1071817826561,\n",
" 40.63187892654607]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.203',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.08724819983729, 40.624184791313006]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Grymes Hill',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Grymes',\n",
" 'annoline2': 'Hill',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.08724819983729,\n",
" 40.624184791313006,\n",
" -74.08724819983729,\n",
" 40.624184791313006]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.204',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.1113288180088, 40.59706851814673]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Todt Hill',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Todt',\n",
" 'annoline2': 'Hill',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.1113288180088,\n",
" 40.59706851814673,\n",
" -74.1113288180088,\n",
" 40.59706851814673]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.205',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.0795529253982, 40.58024741350956]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'South Beach',\n",
" 'stacked': 2,\n",
" 'annoline1': 'South',\n",
" 'annoline2': 'Beach',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.0795529253982,\n",
" 40.58024741350956,\n",
" -74.0795529253982,\n",
" 40.58024741350956]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.206',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.12943426797008, 40.63366930554365]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Port Richmond',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Port',\n",
" 'annoline2': 'Richmond',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.12943426797008,\n",
" 40.63366930554365,\n",
" -74.12943426797008,\n",
" 40.63366930554365]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.207',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.15008537046981, 40.632546390481124]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': \"Mariner's Harbor\",\n",
" 'stacked': 2,\n",
" 'annoline1': \"Mariner's\",\n",
" 'annoline2': 'Harbor',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.15008537046981,\n",
" 40.632546390481124,\n",
" -74.15008537046981,\n",
" 40.632546390481124]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.208',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.17464532993542, 40.63968297845542]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Port Ivory',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Port',\n",
" 'annoline2': 'Ivory',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.17464532993542,\n",
" 40.63968297845542,\n",
" -74.17464532993542,\n",
" 40.63968297845542]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.209',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.11918058534842, 40.61333593766742]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Castleton Corners',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Castleton',\n",
" 'annoline2': 'Corners',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.11918058534842,\n",
" 40.61333593766742,\n",
" -74.11918058534842,\n",
" 40.61333593766742]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.210',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.16496031329827, 40.594252379161695]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'New Springville',\n",
" 'stacked': 2,\n",
" 'annoline1': 'New',\n",
" 'annoline2': 'Springville',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.16496031329827,\n",
" 40.594252379161695,\n",
" -74.16496031329827,\n",
" 40.594252379161695]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.211',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.19073717538116, 40.58631375103281]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Travis',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Travis',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.19073717538116,\n",
" 40.58631375103281,\n",
" -74.19073717538116,\n",
" 40.58631375103281]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.212',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.1164794360638, 40.57257231820632]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'New Dorp',\n",
" 'stacked': 2,\n",
" 'annoline1': 'New',\n",
" 'annoline2': 'Dorp',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.1164794360638,\n",
" 40.57257231820632,\n",
" -74.1164794360638,\n",
" 40.57257231820632]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.213',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.12156593771896, 40.5584622432888]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Oakwood',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Oakwood',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.12156593771896,\n",
" 40.5584622432888,\n",
" -74.12156593771896,\n",
" 40.5584622432888]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.214',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.14932381490992, 40.549480228713605]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Great Kills',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Great',\n",
" 'annoline2': 'Kills',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.14932381490992,\n",
" 40.549480228713605,\n",
" -74.14932381490992,\n",
" 40.549480228713605]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.215',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.1643308041936, 40.542230747450745]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Eltingville',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Eltingville',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.1643308041936,\n",
" 40.542230747450745,\n",
" -74.1643308041936,\n",
" 40.542230747450745]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.216',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.17854866165878, 40.53811417474507]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Annadale',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Annadale',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.17854866165878,\n",
" 40.53811417474507,\n",
" -74.17854866165878,\n",
" 40.53811417474507]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.217',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.20524582480326, 40.541967622888755]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Woodrow',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Woodrow',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.20524582480326,\n",
" 40.541967622888755,\n",
" -74.20524582480326,\n",
" 40.541967622888755]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.218',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.24656934235283, 40.50533376115642]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Tottenville',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Tottenville',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.24656934235283,\n",
" 40.50533376115642,\n",
" -74.24656934235283,\n",
" 40.50533376115642]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.219',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.08055351790115, 40.637316067110326]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Tompkinsville',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Tompkinsville',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.08055351790115,\n",
" 40.637316067110326,\n",
" -74.08055351790115,\n",
" 40.637316067110326]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.220',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.09629029235458, 40.61919310792676]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Silver Lake',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Silver',\n",
" 'annoline2': 'Lake',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.09629029235458,\n",
" 40.61919310792676,\n",
" -74.09629029235458,\n",
" 40.61919310792676]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.221',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.0971255217853, 40.61276015756489]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Sunnyside',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Sunnyside',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.0971255217853,\n",
" 40.61276015756489,\n",
" -74.0971255217853,\n",
" 40.61276015756489]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.222',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.96101312466779, 40.643675183340974]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Ditmas Park',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Ditmas',\n",
" 'annoline2': 'Park',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.96101312466779,\n",
" 40.643675183340974,\n",
" -73.96101312466779,\n",
" 40.643675183340974]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.223',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.93718680559314, 40.66094656188111]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Wingate',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Wingate',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.93718680559314,\n",
" 40.66094656188111,\n",
" -73.93718680559314,\n",
" 40.66094656188111]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.224',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.92688212616955, 40.655572313280764]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Rugby',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Rugby',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.92688212616955,\n",
" 40.655572313280764,\n",
" -73.92688212616955,\n",
" 40.655572313280764]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.225',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.08015734936296, 40.60919044434558]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Park Hill',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Park',\n",
" 'annoline2': 'Hill',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.08015734936296,\n",
" 40.60919044434558,\n",
" -74.08015734936296,\n",
" 40.60919044434558]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.226',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.13304143951704, 40.62109047275409]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Westerleigh',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Westerleigh',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.13304143951704,\n",
" 40.62109047275409,\n",
" -74.13304143951704,\n",
" 40.62109047275409]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.227',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.15315246387762, 40.620171512231884]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Graniteville',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Graniteville',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.15315246387762,\n",
" 40.620171512231884,\n",
" -74.15315246387762,\n",
" 40.620171512231884]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.228',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.16510420241124, 40.63532509911492]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Arlington',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Arlington',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.16510420241124,\n",
" 40.63532509911492,\n",
" -74.16510420241124,\n",
" 40.63532509911492]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.229',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.06712363225574, 40.596312571276734]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Arrochar',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Arrochar',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.06712363225574,\n",
" 40.596312571276734,\n",
" -74.06712363225574,\n",
" 40.596312571276734]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.230',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.0766743627905, 40.59826835959991]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Grasmere',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Grasmere',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.0766743627905,\n",
" 40.59826835959991,\n",
" -74.0766743627905,\n",
" 40.59826835959991]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.231',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.08751118005578, 40.59632891379513]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Old Town',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Old',\n",
" 'annoline2': 'Town',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.08751118005578,\n",
" 40.59632891379513,\n",
" -74.08751118005578,\n",
" 40.59632891379513]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.232',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.09639905312521, 40.588672948199275]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Dongan Hills',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Dongan',\n",
" 'annoline2': 'Hills',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.09639905312521,\n",
" 40.588672948199275,\n",
" -74.09639905312521,\n",
" 40.588672948199275]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.233',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.09348266303591, 40.57352690574283]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Midland Beach',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Midland',\n",
" 'annoline2': 'Beach',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.09348266303591,\n",
" 40.57352690574283,\n",
" -74.09348266303591,\n",
" 40.57352690574283]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.234',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.10585598545434, 40.57621558711788]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Grant City',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Grant',\n",
" 'annoline2': 'City',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.10585598545434,\n",
" 40.57621558711788,\n",
" -74.10585598545434,\n",
" 40.57621558711788]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.235',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.10432707469124, 40.56425549307335]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'New Dorp Beach',\n",
" 'stacked': 3,\n",
" 'annoline1': 'New',\n",
" 'annoline2': 'Dorp',\n",
" 'annoline3': 'Beach',\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.10432707469124,\n",
" 40.56425549307335,\n",
" -74.10432707469124,\n",
" 40.56425549307335]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.236',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.13916622175768, 40.55398800858462]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Bay Terrace',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Bay',\n",
" 'annoline2': 'Terrace',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.13916622175768,\n",
" 40.55398800858462,\n",
" -74.13916622175768,\n",
" 40.55398800858462]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.237',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.19174105747814, 40.531911920489605]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Huguenot',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Huguenot',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.19174105747814,\n",
" 40.531911920489605,\n",
" -74.19174105747814,\n",
" 40.531911920489605]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.238',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.21983106616777, 40.524699376118136]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Pleasant Plains',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Pleasant',\n",
" 'annoline2': 'Plains',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.21983106616777,\n",
" 40.524699376118136,\n",
" -74.21983106616777,\n",
" 40.524699376118136]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.239',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.22950350260027, 40.50608165346305]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Butler Manor',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Butler',\n",
" 'annoline2': 'Manor',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.22950350260027,\n",
" 40.50608165346305,\n",
" -74.22950350260027,\n",
" 40.50608165346305]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.240',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.23215775896526, 40.53053148283314]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Charleston',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Charleston',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.23215775896526,\n",
" 40.53053148283314,\n",
" -74.23215775896526,\n",
" 40.53053148283314]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.241',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.21572851113952, 40.54940400650072]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Rossville',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Rossville',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.21572851113952,\n",
" 40.54940400650072,\n",
" -74.21572851113952,\n",
" 40.54940400650072]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.242',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.18588674583893, 40.54928582278321]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Arden Heights',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Arden',\n",
" 'annoline2': 'Heights',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.18588674583893,\n",
" 40.54928582278321,\n",
" -74.18588674583893,\n",
" 40.54928582278321]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.243',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.17079414786092, 40.555295236173194]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Greenridge',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Greenridge',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.17079414786092,\n",
" 40.555295236173194,\n",
" -74.17079414786092,\n",
" 40.555295236173194]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.244',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.15902208156601, 40.58913894875281]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Heartland Village',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Heartland',\n",
" 'annoline2': 'Village',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.15902208156601,\n",
" 40.58913894875281,\n",
" -74.15902208156601,\n",
" 40.58913894875281]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.245',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.1895604551969, 40.59472602746295]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Chelsea',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Chelsea',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.1895604551969,\n",
" 40.59472602746295,\n",
" -74.1895604551969,\n",
" 40.59472602746295]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.246',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.18725638381567, 40.60577868452358]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Bloomfield',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Bloomfield',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.18725638381567,\n",
" 40.60577868452358,\n",
" -74.18725638381567,\n",
" 40.60577868452358]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.247',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.15940948657122, 40.6095918004203]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Bulls Head',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Bulls',\n",
" 'annoline2': 'Head',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.15940948657122,\n",
" 40.6095918004203,\n",
" -74.15940948657122,\n",
" 40.6095918004203]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.248',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.95325646837112, 40.7826825671257]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Carnegie Hill',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Carnegie',\n",
" 'annoline2': 'Hill',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.95325646837112,\n",
" 40.7826825671257,\n",
" -73.95325646837112,\n",
" 40.7826825671257]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.249',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.98843368023597, 40.72325901885768]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Noho',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Noho',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.98843368023597,\n",
" 40.72325901885768,\n",
" -73.98843368023597,\n",
" 40.72325901885768]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.250',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.00541529873355, 40.71522892046282]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Civic Center',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Civic',\n",
" 'annoline2': 'Center',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-74.00541529873355,\n",
" 40.71522892046282,\n",
" -74.00541529873355,\n",
" 40.71522892046282]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.251',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.98871313285247, 40.7485096643122]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Midtown South',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Midtown',\n",
" 'annoline2': 'South',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.98871313285247,\n",
" 40.7485096643122,\n",
" -73.98871313285247,\n",
" 40.7485096643122]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.252',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.1340572986257, 40.56960594275505]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Richmond Town',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Richmond',\n",
" 'annoline2': 'Town',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.1340572986257,\n",
" 40.56960594275505,\n",
" -74.1340572986257,\n",
" 40.56960594275505]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.253',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.06667766061771, 40.60971934079284]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Shore Acres',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Shore',\n",
" 'annoline2': 'Acres',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.06667766061771,\n",
" 40.60971934079284,\n",
" -74.06667766061771,\n",
" 40.60971934079284]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.254',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.072642445484, 40.61917845202843]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Clifton',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Clifton',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.072642445484,\n",
" 40.61917845202843,\n",
" -74.072642445484,\n",
" 40.61917845202843]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.255',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.08402364740358, 40.6044731896879]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Concord',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Concord',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.08402364740358,\n",
" 40.6044731896879,\n",
" -74.08402364740358,\n",
" 40.6044731896879]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.256',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.09776206972522, 40.606794394801]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Emerson Hill',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Emerson',\n",
" 'annoline2': 'Hill',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.09776206972522,\n",
" 40.606794394801,\n",
" -74.09776206972522,\n",
" 40.606794394801]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.257',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.09805062373887, 40.63563000681151]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Randall Manor',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Randall',\n",
" 'annoline2': 'Manor',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.09805062373887,\n",
" 40.63563000681151,\n",
" -74.09805062373887,\n",
" 40.63563000681151]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.258',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.18622331749823, 40.63843283794795]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Howland Hook',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Howland',\n",
" 'annoline2': 'Hook',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.18622331749823,\n",
" 40.63843283794795,\n",
" -74.18622331749823,\n",
" 40.63843283794795]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.259',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.1418167896889, 40.630146741193826]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Elm Park',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Elm',\n",
" 'annoline2': 'Park',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.1418167896889,\n",
" 40.630146741193826,\n",
" -74.1418167896889,\n",
" 40.630146741193826]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.260',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.91665331978048, 40.652117451793494]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Remsen Village',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Remsen',\n",
" 'annoline2': 'Village',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.91665331978048,\n",
" 40.652117451793494,\n",
" -73.91665331978048,\n",
" 40.652117451793494]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.261',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.88511776379292, 40.6627442796966]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'New Lots',\n",
" 'stacked': 2,\n",
" 'annoline1': 'New',\n",
" 'annoline2': 'Lots',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.88511776379292,\n",
" 40.6627442796966,\n",
" -73.88511776379292,\n",
" 40.6627442796966]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.262',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.90233474295836, 40.63131755039667]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Paerdegat Basin',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Paerdegat',\n",
" 'annoline2': 'Basin',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.90233474295836,\n",
" 40.63131755039667,\n",
" -73.90233474295836,\n",
" 40.63131755039667]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.263',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.91515391550404, 40.61597423962336]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Mill Basin',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Mill',\n",
" 'annoline2': 'Basin',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.91515391550404,\n",
" 40.61597423962336,\n",
" -73.91515391550404,\n",
" 40.61597423962336]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.264',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.79646462081593, 40.71145964370482]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Jamaica Hills',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Jamaica',\n",
" 'annoline2': 'Hills',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.79646462081593,\n",
" 40.71145964370482,\n",
" -73.79646462081593,\n",
" 40.71145964370482]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.265',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.79671678028349, 40.73350025429757]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Utopia',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Utopia',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.79671678028349,\n",
" 40.73350025429757,\n",
" -73.79671678028349,\n",
" 40.73350025429757]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.266',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.80486120040537, 40.73493618075478]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Pomonok',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Pomonok',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.80486120040537,\n",
" 40.73493618075478,\n",
" -73.80486120040537,\n",
" 40.73493618075478]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.267',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.89467996270574, 40.7703173929982]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Astoria Heights',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Astoria',\n",
" 'annoline2': 'Heights',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.89467996270574,\n",
" 40.7703173929982,\n",
" -73.89467996270574,\n",
" 40.7703173929982]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.268',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.90119903387667, 40.83142834161548]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Claremont Village',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Claremont',\n",
" 'annoline2': 'Village',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.90119903387667,\n",
" 40.83142834161548,\n",
" -73.90119903387667,\n",
" 40.83142834161548]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.269',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.91584652759009, 40.824780490842905]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Concourse Village',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Concourse',\n",
" 'annoline2': 'Village',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.91584652759009,\n",
" 40.824780490842905,\n",
" -73.91584652759009,\n",
" 40.824780490842905]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.270',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.91655551964419, 40.84382617671654]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Mount Eden',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Mount',\n",
" 'annoline2': 'Eden',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.91655551964419,\n",
" 40.84382617671654,\n",
" -73.91655551964419,\n",
" 40.84382617671654]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.271',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.90829930881988, 40.84884160724665]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Mount Hope',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Mount',\n",
" 'annoline2': 'Hope',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.90829930881988,\n",
" 40.84884160724665,\n",
" -73.90829930881988,\n",
" 40.84884160724665]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.272',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.96355614094303, 40.76028033131374]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Sutton Place',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Sutton',\n",
" 'annoline2': 'Place',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.96355614094303,\n",
" 40.76028033131374,\n",
" -73.96355614094303,\n",
" 40.76028033131374]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.273',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.95386782130745, 40.743414090073536]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Hunters Point',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Hunters',\n",
" 'annoline2': 'Point',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.95386782130745,\n",
" 40.743414090073536,\n",
" -73.95386782130745,\n",
" 40.743414090073536]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.274',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.96770824581834, 40.75204236950722]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Turtle Bay',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Turtle',\n",
" 'annoline2': 'Bay',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.96770824581834,\n",
" 40.75204236950722,\n",
" -73.96770824581834,\n",
" 40.75204236950722]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.275',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.97121928722265, 40.746917410740195]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Tudor City',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Tudor',\n",
" 'annoline2': 'City',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.97121928722265,\n",
" 40.746917410740195,\n",
" -73.97121928722265,\n",
" 40.746917410740195]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.276',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.97405170469203, 40.73099955477061]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Stuyvesant Town',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Stuyvesant',\n",
" 'annoline2': 'Town',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.97405170469203,\n",
" 40.73099955477061,\n",
" -73.97405170469203,\n",
" 40.73099955477061]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.277',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.9909471052826, 40.739673047638426]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Flatiron',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Flatiron',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-73.9909471052826,\n",
" 40.739673047638426,\n",
" -73.9909471052826,\n",
" 40.739673047638426]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.278',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.91819286431682, 40.74565180608076]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Sunnyside Gardens',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Sunnyside',\n",
" 'annoline2': 'Gardens',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.91819286431682,\n",
" 40.74565180608076,\n",
" -73.91819286431682,\n",
" 40.74565180608076]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.279',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.93244235260178, 40.73725071694497]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Blissville',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Blissville',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.93244235260178,\n",
" 40.73725071694497,\n",
" -73.93244235260178,\n",
" 40.73725071694497]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.280',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.99550751888415, 40.70328109093014]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Fulton Ferry',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Fulton',\n",
" 'annoline2': 'Ferry',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.99550751888415,\n",
" 40.70328109093014,\n",
" -73.99550751888415,\n",
" 40.70328109093014]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.281',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.98111603592393, 40.70332149882874]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Vinegar Hill',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Vinegar',\n",
" 'annoline2': 'Hill',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.98111603592393,\n",
" 40.70332149882874,\n",
" -73.98111603592393,\n",
" 40.70332149882874]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.282',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.93053108817338, 40.67503986503237]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Weeksville',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Weeksville',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.93053108817338,\n",
" 40.67503986503237,\n",
" -73.93053108817338,\n",
" 40.67503986503237]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.283',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.90331684852599, 40.67786104769531]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Broadway Junction',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Broadway',\n",
" 'annoline2': 'Junction',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.90331684852599,\n",
" 40.67786104769531,\n",
" -73.90331684852599,\n",
" 40.67786104769531]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.284',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.9887528074504, 40.70317632822692]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Dumbo',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Dumbo',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.9887528074504,\n",
" 40.70317632822692,\n",
" -73.9887528074504,\n",
" 40.70317632822692]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.285',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.12059399718001, 40.60180957631444]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Manor Heights',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Manor',\n",
" 'annoline2': 'Heights',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.12059399718001,\n",
" 40.60180957631444,\n",
" -74.12059399718001,\n",
" 40.60180957631444]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.286',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.13208447484298, 40.60370692627371]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Willowbrook',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Willowbrook',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.13208447484298,\n",
" 40.60370692627371,\n",
" -74.13208447484298,\n",
" 40.60370692627371]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.287',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.21776636068567, 40.541139922091766]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Sandy Ground',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Sandy',\n",
" 'annoline2': 'Ground',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.21776636068567,\n",
" 40.541139922091766,\n",
" -74.21776636068567,\n",
" 40.541139922091766]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.288',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.12727240604946, 40.579118742961214]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Egbertville',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Egbertville',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.12727240604946,\n",
" 40.579118742961214,\n",
" -74.12727240604946,\n",
" 40.579118742961214]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.289',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.89213760232822, 40.56737588957032]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Roxbury',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Roxbury',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.89213760232822,\n",
" 40.56737588957032,\n",
" -73.89213760232822,\n",
" 40.56737588957032]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.290',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.95918459428702, 40.598525095137255]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Homecrest',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Homecrest',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.95918459428702,\n",
" 40.598525095137255,\n",
" -73.95918459428702,\n",
" 40.598525095137255]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.291',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.88114319200604, 40.716414511158185]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Middle Village',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Middle',\n",
" 'annoline2': 'Village',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.88114319200604,\n",
" 40.716414511158185,\n",
" -73.88114319200604,\n",
" 40.716414511158185]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.292',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.20152556457658, 40.52626406734812]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': \"Prince's Bay\",\n",
" 'stacked': 2,\n",
" 'annoline1': \"Prince's\",\n",
" 'annoline2': 'Bay',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.20152556457658,\n",
" 40.52626406734812,\n",
" -74.20152556457658,\n",
" 40.52626406734812]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.293',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.13792663771568, 40.57650629379489]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Lighthouse Hill',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Lighthouse',\n",
" 'annoline2': 'Hill',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.13792663771568,\n",
" 40.57650629379489,\n",
" -74.13792663771568,\n",
" 40.57650629379489]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.294',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.22957080626941, 40.51954145748909]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Richmond Valley',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Richmond',\n",
" 'annoline2': 'Valley',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.22957080626941,\n",
" 40.51954145748909,\n",
" -74.22957080626941,\n",
" 40.51954145748909]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.295',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.82667757138641, 40.79060155670148]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Malba',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Malba',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.82667757138641,\n",
" 40.79060155670148,\n",
" -73.82667757138641,\n",
" 40.79060155670148]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.296',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.890345709872, 40.6819989345173]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Highland Park',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Highland',\n",
" 'annoline2': 'Park',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.890345709872,\n",
" 40.6819989345173,\n",
" -73.890345709872,\n",
" 40.6819989345173]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.297',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.94841515328893, 40.60937770113766]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Madison',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Madison',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.94841515328893,\n",
" 40.60937770113766,\n",
" -73.94841515328893,\n",
" 40.60937770113766]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.298',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.86172577555115, 40.85272297633017]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Bronxdale',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Bronxdale',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.86172577555115,\n",
" 40.85272297633017,\n",
" -73.86172577555115,\n",
" 40.85272297633017]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.299',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.85931863221647, 40.86578787802982]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Allerton',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Allerton',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.85931863221647,\n",
" 40.86578787802982,\n",
" -73.85931863221647,\n",
" 40.86578787802982]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.300',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.90152264513144, 40.8703923914147]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Kingsbridge Heights',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Kingsbridge',\n",
" 'annoline2': 'Heights',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.90152264513144,\n",
" 40.8703923914147,\n",
" -73.90152264513144,\n",
" 40.8703923914147]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.301',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.94817709920184, 40.64692606658579]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Erasmus',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Erasmus',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Brooklyn',\n",
" 'bbox': [-73.94817709920184,\n",
" 40.64692606658579,\n",
" -73.94817709920184,\n",
" 40.64692606658579]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.302',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.00011136202637, 40.75665808227519]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Hudson Yards',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Hudson',\n",
" 'annoline2': 'Yards',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Manhattan',\n",
" 'bbox': [-74.00011136202637,\n",
" 40.75665808227519,\n",
" -74.00011136202637,\n",
" 40.75665808227519]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.303',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.80553002968718, 40.58733774018741]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Hammels',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Hammels',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.80553002968718,\n",
" 40.58733774018741,\n",
" -73.80553002968718,\n",
" 40.58733774018741]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.304',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.76596781445627, 40.611321691283834]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Bayswater',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Bayswater',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.76596781445627,\n",
" 40.611321691283834,\n",
" -73.76596781445627,\n",
" 40.611321691283834]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.305',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.94563070334091, 40.756091297094706]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Queensbridge',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Queensbridge',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Queens',\n",
" 'bbox': [-73.94563070334091,\n",
" 40.756091297094706,\n",
" -73.94563070334091,\n",
" 40.756091297094706]}},\n",
" {'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.306',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-74.08173992211962, 40.61731079252983]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Fox Hills',\n",
" 'stacked': 2,\n",
" 'annoline1': 'Fox',\n",
" 'annoline2': 'Hills',\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Staten Island',\n",
" 'bbox': [-74.08173992211962,\n",
" 40.61731079252983,\n",
" -74.08173992211962,\n",
" 40.61731079252983]}}],\n",
" 'crs': {'type': 'name', 'properties': {'name': 'urn:ogc:def:crs:EPSG::4326'}},\n",
" 'bbox': [-74.2492599487305,\n",
" 40.5033187866211,\n",
" -73.7061614990234,\n",
" 40.9105606079102]}"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"newyork_data"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Notice how all the relevant data is in the *features* key, which is basically a list of the neighborhoods. So, let's define a new variable that includes this data."
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"neighborhoods_data = newyork_data['features']"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's take a look at the first item in this list."
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"collapsed": false,
"jupyter": {
"outputs_hidden": false
}
},
"outputs": [
{
"data": {
"text/plain": [
"{'type': 'Feature',\n",
" 'id': 'nyu_2451_34572.1',\n",
" 'geometry': {'type': 'Point',\n",
" 'coordinates': [-73.84720052054902, 40.89470517661]},\n",
" 'geometry_name': 'geom',\n",
" 'properties': {'name': 'Wakefield',\n",
" 'stacked': 1,\n",
" 'annoline1': 'Wakefield',\n",
" 'annoline2': None,\n",
" 'annoline3': None,\n",
" 'annoangle': 0.0,\n",
" 'borough': 'Bronx',\n",
" 'bbox': [-73.84720052054902,\n",
" 40.89470517661,\n",
" -73.84720052054902,\n",
" 40.89470517661]}}"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"neighborhoods_data[0]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Tranform the data into a *pandas* dataframe"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The next task is essentially transforming this data of nested Python dictionaries into a *pandas* dataframe. So let's start by creating an empty dataframe."
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [],
"source": [
"# define the dataframe columns\n",
"column_names = ['Borough', 'Neighborhood', 'Latitude', 'Longitude'] \n",
"\n",
"# instantiate the dataframe\n",
"neighborhoods = pd.DataFrame(columns=column_names)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Take a look at the empty dataframe to confirm that the columns are as intended."
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"collapsed": false,
"jupyter": {
"outputs_hidden": false
}
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Borough</th>\n",
" <th>Neighborhood</th>\n",
" <th>Latitude</th>\n",
" <th>Longitude</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
"Empty DataFrame\n",
"Columns: [Borough, Neighborhood, Latitude, Longitude]\n",
"Index: []"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"neighborhoods"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Then let's loop through the data and fill the dataframe one row at a time."
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"collapsed": false,
"jupyter": {
"outputs_hidden": false
}
},
"outputs": [],
"source": [
"for data in neighborhoods_data:\n",
" borough = neighborhood_name = data['properties']['borough'] \n",
" neighborhood_name = data['properties']['name']\n",
" \n",
" neighborhood_latlon = data['geometry']['coordinates']\n",
" neighborhood_lat = neighborhood_latlon[1]\n",
" neighborhood_lon = neighborhood_latlon[0]\n",
" \n",
" neighborhoods = neighborhoods.append({'Borough': borough,\n",
" 'Neighborhood': neighborhood_name,\n",
" 'Latitude': neighborhood_lat,\n",
" 'Longitude': neighborhood_lon}, ignore_index=True)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Quickly examine the resulting dataframe."
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {
"collapsed": false,
"jupyter": {
"outputs_hidden": false
},
"scrolled": true
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Borough</th>\n",
" <th>Neighborhood</th>\n",
" <th>Latitude</th>\n",
" <th>Longitude</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Bronx</td>\n",
" <td>Wakefield</td>\n",
" <td>40.894705</td>\n",
" <td>-73.847201</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>Bronx</td>\n",
" <td>Co-op City</td>\n",
" <td>40.874294</td>\n",
" <td>-73.829939</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>Bronx</td>\n",
" <td>Eastchester</td>\n",
" <td>40.887556</td>\n",
" <td>-73.827806</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>Bronx</td>\n",
" <td>Fieldston</td>\n",
" <td>40.895437</td>\n",
" <td>-73.905643</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>Bronx</td>\n",
" <td>Riverdale</td>\n",
" <td>40.890834</td>\n",
" <td>-73.912585</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Borough Neighborhood Latitude Longitude\n",
"0 Bronx Wakefield 40.894705 -73.847201\n",
"1 Bronx Co-op City 40.874294 -73.829939\n",
"2 Bronx Eastchester 40.887556 -73.827806\n",
"3 Bronx Fieldston 40.895437 -73.905643\n",
"4 Bronx Riverdale 40.890834 -73.912585"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"neighborhoods.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"And make sure that the dataset has all 5 boroughs and 306 neighborhoods."
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {
"collapsed": false,
"jupyter": {
"outputs_hidden": false
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"The dataframe has 5 boroughs and 306 neighborhoods.\n"
]
}
],
"source": [
"print('The dataframe has {} boroughs and {} neighborhoods.'.format(\n",
" len(neighborhoods['Borough'].unique()),\n",
" neighborhoods.shape[0]\n",
" )\n",
")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Use geopy library to get the latitude and longitude values of New York City."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"In order to define an instance of the geocoder, we need to define a user_agent. We will name our agent <em>ny_explorer</em>, as shown below."
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {
"collapsed": false,
"jupyter": {
"outputs_hidden": false
},
"scrolled": true
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"The geograpical coordinate of New York City are 40.7127281, -74.0060152.\n"
]
}
],
"source": [
"address = 'New York City, NY'\n",
"\n",
"geolocator = Nominatim(user_agent=\"ny_explorer\")\n",
"location = geolocator.geocode(address)\n",
"latitude = location.latitude\n",
"longitude = location.longitude\n",
"print('The geograpical coordinate of New York City are {}, {}.'.format(latitude, longitude))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Create a map of New York with neighborhoods superimposed on top."
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {
"collapsed": false,
"jupyter": {
"outputs_hidden": false
}
},
"outputs": [
{
"data": {
"text/html": [
"<div style=\"width:100%;\"><div style=\"position:relative;width:100%;height:0;padding-bottom:60%;\"><iframe src=\"data:text/html;charset=utf-8;base64,PCFET0NUWVBFIGh0bWw+CjxoZWFkPiAgICAKICAgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPgogICAgPHNjcmlwdD5MX1BSRUZFUl9DQU5WQVMgPSBmYWxzZTsgTF9OT19UT1VDSCA9IGZhbHNlOyBMX0RJU0FCTEVfM0QgPSBmYWxzZTs8L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2FqYXguZ29vZ2xlYXBpcy5jb20vYWpheC9saWJzL2pxdWVyeS8xLjExLjEvanF1ZXJ5Lm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvanMvYm9vdHN0cmFwLm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvTGVhZmxldC5hd2Vzb21lLW1hcmtlcnMvMi4wLjIvbGVhZmxldC5hd2Vzb21lLW1hcmtlcnMuanMiPjwvc2NyaXB0PgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9jc3MvYm9vdHN0cmFwLm1pbi5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvY3NzL2Jvb3RzdHJhcC10aGVtZS5taW4uY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vbWF4Y2RuLmJvb3RzdHJhcGNkbi5jb20vZm9udC1hd2Vzb21lLzQuNi4zL2Nzcy9mb250LWF3ZXNvbWUubWluLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9MZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy8yLjAuMi9sZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9yYXdnaXQuY29tL3B5dGhvbi12aXN1YWxpemF0aW9uL2ZvbGl1bS9tYXN0ZXIvZm9saXVtL3RlbXBsYXRlcy9sZWFmbGV0LmF3ZXNvbWUucm90YXRlLmNzcyIvPgogICAgPHN0eWxlPmh0bWwsIGJvZHkge3dpZHRoOiAxMDAlO2hlaWdodDogMTAwJTttYXJnaW46IDA7cGFkZGluZzogMDt9PC9zdHlsZT4KICAgIDxzdHlsZT4jbWFwIHtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtyaWdodDowO2xlZnQ6MDt9PC9zdHlsZT4KICAgIAogICAgICAgICAgICA8c3R5bGU+ICNtYXBfN2FhODI5ZThhMThlNGEwYTgzOWMyNTYzODQ0NThiMzQgewogICAgICAgICAgICAgICAgcG9zaXRpb24gOiByZWxhdGl2ZTsKICAgICAgICAgICAgICAgIHdpZHRoIDogMTAwLjAlOwogICAgICAgICAgICAgICAgaGVpZ2h0OiAxMDAuMCU7CiAgICAgICAgICAgICAgICBsZWZ0OiAwLjAlOwogICAgICAgICAgICAgICAgdG9wOiAwLjAlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICA8L3N0eWxlPgogICAgICAgIAo8L2hlYWQ+Cjxib2R5PiAgICAKICAgIAogICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb2xpdW0tbWFwIiBpZD0ibWFwXzdhYTgyOWU4YTE4ZTRhMGE4MzljMjU2Mzg0NDU4YjM0IiA+PC9kaXY+CiAgICAgICAgCjwvYm9keT4KPHNjcmlwdD4gICAgCiAgICAKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGJvdW5kcyA9IG51bGw7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcF83YWE4MjllOGExOGU0YTBhODM5YzI1NjM4NDQ1OGIzNCA9IEwubWFwKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21hcF83YWE4MjllOGExOGU0YTBhODM5YzI1NjM4NDQ1OGIzNCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y2VudGVyOiBbNDAuNzEyNzI4MSwtNzQuMDA2MDE1Ml0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6b29tOiAxMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heEJvdW5kczogYm91bmRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXJzOiBbXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmxkQ29weUp1bXA6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JzOiBMLkNSUy5FUFNHMzg1NwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHRpbGVfbGF5ZXJfZTkwODU5ZDlhNjUyNDY3MmJhOTYzMWMzMjUyNGE4M2IgPSBMLnRpbGVMYXllcigKICAgICAgICAgICAgICAgICdodHRwczovL3tzfS50aWxlLm9wZW5zdHJlZXRtYXAub3JnL3t6fS97eH0ve3l9LnBuZycsCiAgICAgICAgICAgICAgICB7CiAgImF0dHJpYnV0aW9uIjogbnVsbCwKICAiZGV0ZWN0UmV0aW5hIjogZmFsc2UsCiAgIm1heFpvb20iOiAxOCwKICAibWluWm9vbSI6IDEsCiAgIm5vV3JhcCI6IGZhbHNlLAogICJzdWJkb21haW5zIjogImFiYyIKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfN2FhODI5ZThhMThlNGEwYTgzOWMyNTYzODQ0NThiMzQpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzVmYzlkMDFlMGEwMjQ0ZThhMzllNWYwNWIyMzEzNjNkID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODk0NzA1MTc2NjEsLTczLjg0NzIwMDUyMDU0OTAyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzdhYTgyOWU4YTE4ZTRhMGE4MzljMjU2Mzg0NDU4YjM0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzI0MzhhMzY5YTY3NjRhZGQ5YzFmMDEzNzU0NTkwNzJmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2QzNzc2MDNiMjk5ZjRiYTdhNWIyNzQ4NzM0ODJmMTEzID0gJCgnPGRpdiBpZD0iaHRtbF9kMzc3NjAzYjI5OWY0YmE3YTViMjc0ODczNDgyZjExMyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+V2FrZWZpZWxkLCBCcm9ueDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMjQzOGEzNjlhNjc2NGFkZDljMWYwMTM3NTQ1OTA3MmYuc2V0Q29udGVudChodG1sX2QzNzc2MDNiMjk5ZjRiYTdhNWIyNzQ4NzM0ODJmMTEzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzVmYzlkMDFlMGEwMjQ0ZThhMzllNWYwNWIyMzEzNjNkLmJpbmRQb3B1cChwb3B1cF8yNDM4YTM2OWE2NzY0YWRkOWMxZjAxMzc1NDU5MDcyZik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl84OTI3ZWVlNzk1ZGY0NGEwYTRhMjViNTlkZjUxNjM0NyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjg3NDI5NDE5MzAzMDEyLC03My44Mjk5MzkxMDgxMjM5OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83YWE4MjllOGExOGU0YTBhODM5YzI1NjM4NDQ1OGIzNCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wNzBjNDJkYWY5MjI0M2YxODFjY2ZjOTRmZWUzOTkwMyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8yMjM1YzZjZGQ1YmM0N2UwYjNjYWI4Y2RmMjMzZGNlOSA9ICQoJzxkaXYgaWQ9Imh0bWxfMjIzNWM2Y2RkNWJjNDdlMGIzY2FiOGNkZjIzM2RjZTkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNvLW9wIENpdHksIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wNzBjNDJkYWY5MjI0M2YxODFjY2ZjOTRmZWUzOTkwMy5zZXRDb250ZW50KGh0bWxfMjIzNWM2Y2RkNWJjNDdlMGIzY2FiOGNkZjIzM2RjZTkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfODkyN2VlZTc5NWRmNDRhMGE0YTI1YjU5ZGY1MTYzNDcuYmluZFBvcHVwKHBvcHVwXzA3MGM0MmRhZjkyMjQzZjE4MWNjZmM5NGZlZTM5OTAzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2E5OTg0MDkwMTE0MDQzYzc5NzFkNWE0NzQwZmJiNWVlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODg3NTU1Njc3MzUwNzc1LC03My44Mjc4MDY0NDcxNjQxMl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83YWE4MjllOGExOGU0YTBhODM5YzI1NjM4NDQ1OGIzNCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hNjEyNTQ4NzM2N2U0NzgyODUxYTBmMmFmYWE5YTQ2NiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iMGMxZDM2ZmFhYWE0Y2Q1OGFmYzUwN2Q5YTgzZmEyYyA9ICQoJzxkaXYgaWQ9Imh0bWxfYjBjMWQzNmZhYWFhNGNkNThhZmM1MDdkOWE4M2ZhMmMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkVhc3RjaGVzdGVyLCBCcm9ueDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYTYxMjU0ODczNjdlNDc4Mjg1MWEwZjJhZmFhOWE0NjYuc2V0Q29udGVudChodG1sX2IwYzFkMzZmYWFhYTRjZDU4YWZjNTA3ZDlhODNmYTJjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2E5OTg0MDkwMTE0MDQzYzc5NzFkNWE0NzQwZmJiNWVlLmJpbmRQb3B1cChwb3B1cF9hNjEyNTQ4NzM2N2U0NzgyODUxYTBmMmFmYWE5YTQ2Nik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mMjNiMGY3ZDQyNzU0ZjIzOGUyYmUyNDNmZTY5ZjQwMCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjg5NTQzNzQyNjkwMzgzLC03My45MDU2NDI1OTU5MTY4Ml0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83YWE4MjllOGExOGU0YTBhODM5YzI1NjM4NDQ1OGIzNCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mZjAyMzc2ZDIwYWY0NmEzYTQ3NzFjNzJiMDg5YTcwZSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zMGQzOWNkODdhMzQ0NjgxOTc4ZjQzNzEwMTc2YWYzYSA9ICQoJzxkaXYgaWQ9Imh0bWxfMzBkMzljZDg3YTM0NDY4MTk3OGY0MzcxMDE3NmFmM2EiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkZpZWxkc3RvbiwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2ZmMDIzNzZkMjBhZjQ2YTNhNDc3MWM3MmIwODlhNzBlLnNldENvbnRlbnQoaHRtbF8zMGQzOWNkODdhMzQ0NjgxOTc4ZjQzNzEwMTc2YWYzYSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9mMjNiMGY3ZDQyNzU0ZjIzOGUyYmUyNDNmZTY5ZjQwMC5iaW5kUG9wdXAocG9wdXBfZmYwMjM3NmQyMGFmNDZhM2E0NzcxYzcyYjA4OWE3MGUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOWNlOGU3MDc4ZDM3NGRiNmI4NmVlODkzZGUzMzI1OGYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44OTA4MzQ0OTM4OTEzMDUsLTczLjkxMjU4NTQ2MTA4NTddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfN2FhODI5ZThhMThlNGEwYTgzOWMyNTYzODQ0NThiMzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNDU2NGQzMTcyNTZiNGVmZmE1NDk0YzJkZjYwZmQzN2EgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMzk1ZjRlMWJkMmM0NDAxNjljOGUwZjdjN2JjNTMxZDIgPSAkKCc8ZGl2IGlkPSJodG1sXzM5NWY0ZTFiZDJjNDQwMTY5YzhlMGY3YzdiYzUzMWQyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5SaXZlcmRhbGUsIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80NTY0ZDMxNzI1NmI0ZWZmYTU0OTRjMmRmNjBmZDM3YS5zZXRDb250ZW50KGh0bWxfMzk1ZjRlMWJkMmM0NDAxNjljOGUwZjdjN2JjNTMxZDIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOWNlOGU3MDc4ZDM3NGRiNmI4NmVlODkzZGUzMzI1OGYuYmluZFBvcHVwKHBvcHVwXzQ1NjRkMzE3MjU2YjRlZmZhNTQ5NGMyZGY2MGZkMzdhKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2RmOWEyMjJhMWZjNDQ3ZGNhMDIxNzNlZjBmNGUyOTdlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODgxNjg3MzcxMjA1MjEsLTczLjkwMjgxNzk4NzI0NjA0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzdhYTgyOWU4YTE4ZTRhMGE4MzljMjU2Mzg0NDU4YjM0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzk3N2NlMDFmNzM3MDRiMzI4YjA1MTI0NmJiYTE5ZGY1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2IwOWE3NzY5M2U4NzRjNGM5NGEyOGU1ZTY0YjJkMmFiID0gJCgnPGRpdiBpZD0iaHRtbF9iMDlhNzc2OTNlODc0YzRjOTRhMjhlNWU2NGIyZDJhYiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+S2luZ3NicmlkZ2UsIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85NzdjZTAxZjczNzA0YjMyOGIwNTEyNDZiYmExOWRmNS5zZXRDb250ZW50KGh0bWxfYjA5YTc3NjkzZTg3NGM0Yzk0YTI4ZTVlNjRiMmQyYWIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZGY5YTIyMmExZmM0NDdkY2EwMjE3M2VmMGY0ZTI5N2UuYmluZFBvcHVwKHBvcHVwXzk3N2NlMDFmNzM3MDRiMzI4YjA1MTI0NmJiYTE5ZGY1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2JkZGY1ZWY5Yzg5MDRjOWU5M2MwYTE5YjcwMzE2NGJlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODc2NTUwNzc4Nzk5NjQsLTczLjkxMDY1OTY1ODYyOTgxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzdhYTgyOWU4YTE4ZTRhMGE4MzljMjU2Mzg0NDU4YjM0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzc2YTc2Nzk1YTdmNTQwZWM5NzcyZGY5ZTY3ZGZhZWYyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2U4YzM4ZGE2MTgwMzQ4YmU5ZjQxNjY1MGUyZmUwZDkwID0gJCgnPGRpdiBpZD0iaHRtbF9lOGMzOGRhNjE4MDM0OGJlOWY0MTY2NTBlMmZlMGQ5MCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TWFyYmxlIEhpbGwsIE1hbmhhdHRhbjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNzZhNzY3OTVhN2Y1NDBlYzk3NzJkZjllNjdkZmFlZjIuc2V0Q29udGVudChodG1sX2U4YzM4ZGE2MTgwMzQ4YmU5ZjQxNjY1MGUyZmUwZDkwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2JkZGY1ZWY5Yzg5MDRjOWU5M2MwYTE5YjcwMzE2NGJlLmJpbmRQb3B1cChwb3B1cF83NmE3Njc5NWE3ZjU0MGVjOTc3MmRmOWU2N2RmYWVmMik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lYWE0NDE0NmYyNDc0NTU4ODI4OWVkMGQ0YjdjMjIwMiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjg5ODI3MjYxMjEzODA1LC03My44NjczMTQ5NjgxNDE3Nl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83YWE4MjllOGExOGU0YTBhODM5YzI1NjM4NDQ1OGIzNCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hZjViODBhYTMzZDU0MWQzOTAyMDE0ZjUzZTJkNGEyMCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF81M2M5ZDQyMGFiOGM0NjRjYjdlMmFhNDQxOWU5OWFiZiA9ICQoJzxkaXYgaWQ9Imh0bWxfNTNjOWQ0MjBhYjhjNDY0Y2I3ZTJhYTQ0MTllOTlhYmYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPldvb2RsYXduLCBCcm9ueDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYWY1YjgwYWEzM2Q1NDFkMzkwMjAxNGY1M2UyZDRhMjAuc2V0Q29udGVudChodG1sXzUzYzlkNDIwYWI4YzQ2NGNiN2UyYWE0NDE5ZTk5YWJmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2VhYTQ0MTQ2ZjI0NzQ1NTg4Mjg5ZWQwZDRiN2MyMjAyLmJpbmRQb3B1cChwb3B1cF9hZjViODBhYTMzZDU0MWQzOTAyMDE0ZjUzZTJkNGEyMCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lNTU4MzNiMzA2ODY0N2UyYjY4ZTIyNjg4MDU4ZmI2YiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjg3NzIyNDE1NTk5NDQ2LC03My44NzkzOTA3Mzk1NjgxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzdhYTgyOWU4YTE4ZTRhMGE4MzljMjU2Mzg0NDU4YjM0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzhmZWYyZDMwMjMxOTQzNzQ5MWVkMjc0N2YwM2U2ZGI4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzA0MTgwYTI1ZjhlMjQ4OTg5ZTgyYzVlNDFkYWM1MmVmID0gJCgnPGRpdiBpZD0iaHRtbF8wNDE4MGEyNWY4ZTI0ODk4OWU4MmM1ZTQxZGFjNTJlZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Tm9yd29vZCwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzhmZWYyZDMwMjMxOTQzNzQ5MWVkMjc0N2YwM2U2ZGI4LnNldENvbnRlbnQoaHRtbF8wNDE4MGEyNWY4ZTI0ODk4OWU4MmM1ZTQxZGFjNTJlZik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9lNTU4MzNiMzA2ODY0N2UyYjY4ZTIyNjg4MDU4ZmI2Yi5iaW5kUG9wdXAocG9wdXBfOGZlZjJkMzAyMzE5NDM3NDkxZWQyNzQ3ZjAzZTZkYjgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOWIxZjQ3N2E5NTU5NDMzYTljMzRmMzZiMDRlNjQzNDMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44ODEwMzg4NzgxOTIxMSwtNzMuODU3NDQ2NDI5NzQyMDddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfN2FhODI5ZThhMThlNGEwYTgzOWMyNTYzODQ0NThiMzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfN2ZlZDE1YTQ5MmMyNGU5ZWJmNDAyNGUwYzAyNjI0NGUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNjVmYTgwYTAyN2IyNDk4ZjlmNmYxMWU1NmNlY2M1ZDAgPSAkKCc8ZGl2IGlkPSJodG1sXzY1ZmE4MGEwMjdiMjQ5OGY5ZjZmMTFlNTZjZWNjNWQwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5XaWxsaWFtc2JyaWRnZSwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzdmZWQxNWE0OTJjMjRlOWViZjQwMjRlMGMwMjYyNDRlLnNldENvbnRlbnQoaHRtbF82NWZhODBhMDI3YjI0OThmOWY2ZjExZTU2Y2VjYzVkMCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl85YjFmNDc3YTk1NTk0MzNhOWMzNGYzNmIwNGU2NDM0My5iaW5kUG9wdXAocG9wdXBfN2ZlZDE1YTQ5MmMyNGU5ZWJmNDAyNGUwYzAyNjI0NGUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYTI1NDJmZTVlN2JhNDA0ODlmZjBmNjNmYzlhZTQxNTIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44NjY4NTgxMDcyNTI2OTYsLTczLjgzNTc5NzU5ODA4MTE3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzdhYTgyOWU4YTE4ZTRhMGE4MzljMjU2Mzg0NDU4YjM0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzQwMjQyNDA2ZTE4YjQ0NTRhNTcxNGM1MTFlNmU4NjZiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzgzNjFhMmI4ZDIzYzQ5ZjFhNjIwYzU0ZmM3YjYxOTlkID0gJCgnPGRpdiBpZD0iaHRtbF84MzYxYTJiOGQyM2M0OWYxYTYyMGM1NGZjN2I2MTk5ZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QmF5Y2hlc3RlciwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzQwMjQyNDA2ZTE4YjQ0NTRhNTcxNGM1MTFlNmU4NjZiLnNldENvbnRlbnQoaHRtbF84MzYxYTJiOGQyM2M0OWYxYTYyMGM1NGZjN2I2MTk5ZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9hMjU0MmZlNWU3YmE0MDQ4OWZmMGY2M2ZjOWFlNDE1Mi5iaW5kUG9wdXAocG9wdXBfNDAyNDI0MDZlMThiNDQ1NGE1NzE0YzUxMWU2ZTg2NmIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNjdiZjU4NzNiMGNmNGY3MjhiZWMwNmM5Y2EwODMwZmMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44NTc0MTM0OTgwODg2NSwtNzMuODU0NzU1NjQwMTc5OTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfN2FhODI5ZThhMThlNGEwYTgzOWMyNTYzODQ0NThiMzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYjRjNzgzNDFjMmUxNDMzMGE5OGNhOWUyM2VlYjU5MTggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfODVjYWVjNWQ4ZjBhNDczNjgxODg1OWZiOWRlM2EzYjIgPSAkKCc8ZGl2IGlkPSJodG1sXzg1Y2FlYzVkOGYwYTQ3MzY4MTg4NTlmYjlkZTNhM2IyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5QZWxoYW0gUGFya3dheSwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2I0Yzc4MzQxYzJlMTQzMzBhOThjYTllMjNlZWI1OTE4LnNldENvbnRlbnQoaHRtbF84NWNhZWM1ZDhmMGE0NzM2ODE4ODU5ZmI5ZGUzYTNiMik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl82N2JmNTg3M2IwY2Y0ZjcyOGJlYzA2YzljYTA4MzBmYy5iaW5kUG9wdXAocG9wdXBfYjRjNzgzNDFjMmUxNDMzMGE5OGNhOWUyM2VlYjU5MTgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOWU0OGU0MDE4NDJiNDA2M2E3ZmI4NTIzMTk0ZDFhZDggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44NDcyNDY3MDQ5MTgxMywtNzMuNzg2NDg4NDUyNjc0MTNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfN2FhODI5ZThhMThlNGEwYTgzOWMyNTYzODQ0NThiMzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNWFmZWRiOWY0YTBmNDExNGFhNTgyNmMzYjEzNDRjY2EgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZTFjMjI4Yjc3ZmY3NGY5MmE4MmNiNDM2NjNkMzkwYWMgPSAkKCc8ZGl2IGlkPSJodG1sX2UxYzIyOGI3N2ZmNzRmOTJhODJjYjQzNjYzZDM5MGFjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DaXR5IElzbGFuZCwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzVhZmVkYjlmNGEwZjQxMTRhYTU4MjZjM2IxMzQ0Y2NhLnNldENvbnRlbnQoaHRtbF9lMWMyMjhiNzdmZjc0ZjkyYTgyY2I0MzY2M2QzOTBhYyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl85ZTQ4ZTQwMTg0MmI0MDYzYTdmYjg1MjMxOTRkMWFkOC5iaW5kUG9wdXAocG9wdXBfNWFmZWRiOWY0YTBmNDExNGFhNTgyNmMzYjEzNDRjY2EpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNzZkZjMyZGVjMmIxNGQ0OGEwYWVkMjZkZmU2MjViZGQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44NzAxODUxNjQ5NzUzMjUsLTczLjg4NTUxMjE4NDE5MTNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfN2FhODI5ZThhMThlNGEwYTgzOWMyNTYzODQ0NThiMzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZTU0NDVjYTNlNzA4NDE1Yzk1YTBjMmNhMGY3N2MzMjEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZTFkYmU3YjRiOTU4NDcyYzg5Mzg4M2JkYWY0MzAyOGEgPSAkKCc8ZGl2IGlkPSJodG1sX2UxZGJlN2I0Yjk1ODQ3MmM4OTM4ODNiZGFmNDMwMjhhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5CZWRmb3JkIFBhcmssIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lNTQ0NWNhM2U3MDg0MTVjOTVhMGMyY2EwZjc3YzMyMS5zZXRDb250ZW50KGh0bWxfZTFkYmU3YjRiOTU4NDcyYzg5Mzg4M2JkYWY0MzAyOGEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNzZkZjMyZGVjMmIxNGQ0OGEwYWVkMjZkZmU2MjViZGQuYmluZFBvcHVwKHBvcHVwX2U1NDQ1Y2EzZTcwODQxNWM5NWEwYzJjYTBmNzdjMzIxKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2RiNWI1YjY2NjZjMjQ3ZTA5ZGE1ZmMxOTE3Nzc3MmEyID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODU1NzI3MDc3MTk2NjQsLTczLjkxMDQxNTk2MTkxMzFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfN2FhODI5ZThhMThlNGEwYTgzOWMyNTYzODQ0NThiMzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfODNhYWUzZThmNzU0NDRlZWI4MDQzNGJmZmE2OTRjMTQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNDI4NmJkMDY5NjA1NDFlMjkxOGE2ZWUxMWM3ZDllODkgPSAkKCc8ZGl2IGlkPSJodG1sXzQyODZiZDA2OTYwNTQxZTI5MThhNmVlMTFjN2Q5ZTg5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Vbml2ZXJzaXR5IEhlaWdodHMsIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84M2FhZTNlOGY3NTQ0NGVlYjgwNDM0YmZmYTY5NGMxNC5zZXRDb250ZW50KGh0bWxfNDI4NmJkMDY5NjA1NDFlMjkxOGE2ZWUxMWM3ZDllODkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZGI1YjViNjY2NmMyNDdlMDlkYTVmYzE5MTc3NzcyYTIuYmluZFBvcHVwKHBvcHVwXzgzYWFlM2U4Zjc1NDQ0ZWViODA0MzRiZmZhNjk0YzE0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2VlMjM5NDQ0M2MzMjRkNjU4NDI4M2ZkNTExZWM3Y2UzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODQ3ODk3OTI2MDYyNzEsLTczLjkxOTY3MTU5MTE5NTY1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzdhYTgyOWU4YTE4ZTRhMGE4MzljMjU2Mzg0NDU4YjM0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzdkNWZhYmYyZmU0ODRhYmZhYjliM2RlOGRkMGY3NDBiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2U1ZjkwMjM0ZmYxODQwMTJiNTYyZjNkNmIyNDZmNjk2ID0gJCgnPGRpdiBpZD0iaHRtbF9lNWY5MDIzNGZmMTg0MDEyYjU2MmYzZDZiMjQ2ZjY5NiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TW9ycmlzIEhlaWdodHMsIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83ZDVmYWJmMmZlNDg0YWJmYWI5YjNkZThkZDBmNzQwYi5zZXRDb250ZW50KGh0bWxfZTVmOTAyMzRmZjE4NDAxMmI1NjJmM2Q2YjI0NmY2OTYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZWUyMzk0NDQzYzMyNGQ2NTg0MjgzZmQ1MTFlYzdjZTMuYmluZFBvcHVwKHBvcHVwXzdkNWZhYmYyZmU0ODRhYmZhYjliM2RlOGRkMGY3NDBiKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzM2ZjNhYjljMGU0ODQ0YWQ4OTI1OGU2MzRlOTYzNzIyID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODYwOTk2Nzk2Mzg2NTQsLTczLjg5NjQyNjU1OTgxNjIzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzdhYTgyOWU4YTE4ZTRhMGE4MzljMjU2Mzg0NDU4YjM0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzQzYWFhOWFhNzhkZjRjYmFiZGZmMmVmODY5MGQzNzkzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzg0YWUyNzY1NGM5OTRjZTRiYjNhZGUzMzZiYmJjNmMxID0gJCgnPGRpdiBpZD0iaHRtbF84NGFlMjc2NTRjOTk0Y2U0YmIzYWRlMzM2YmJiYzZjMSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Rm9yZGhhbSwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzQzYWFhOWFhNzhkZjRjYmFiZGZmMmVmODY5MGQzNzkzLnNldENvbnRlbnQoaHRtbF84NGFlMjc2NTRjOTk0Y2U0YmIzYWRlMzM2YmJiYzZjMSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8zNmYzYWI5YzBlNDg0NGFkODkyNThlNjM0ZTk2MzcyMi5iaW5kUG9wdXAocG9wdXBfNDNhYWE5YWE3OGRmNGNiYWJkZmYyZWY4NjkwZDM3OTMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZGJiYTE1NmYwMmQ2NGVhMzk3ZWQyZGUzNzFmYWQ0MDQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44NDI2OTYxNTc4NjA1MywtNzMuODg3MzU2MTc1MzIzMzhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfN2FhODI5ZThhMThlNGEwYTgzOWMyNTYzODQ0NThiMzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOGI0YWUzZGVkNWVhNGVmMjhhNGI2MWVjOTMxNGZjZjIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfM2U3NDdjNjIzNDEzNGRiMjk2ZWRkZmIwN2Y0YTk4NTQgPSAkKCc8ZGl2IGlkPSJodG1sXzNlNzQ3YzYyMzQxMzRkYjI5NmVkZGZiMDdmNGE5ODU0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5FYXN0IFRyZW1vbnQsIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84YjRhZTNkZWQ1ZWE0ZWYyOGE0YjYxZWM5MzE0ZmNmMi5zZXRDb250ZW50KGh0bWxfM2U3NDdjNjIzNDEzNGRiMjk2ZWRkZmIwN2Y0YTk4NTQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZGJiYTE1NmYwMmQ2NGVhMzk3ZWQyZGUzNzFmYWQ0MDQuYmluZFBvcHVwKHBvcHVwXzhiNGFlM2RlZDVlYTRlZjI4YTRiNjFlYzkzMTRmY2YyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2JhMDQ1OTQ0ZTc1NjQ4ZTM5MjZhNGFkM2ViYmEzNTQ0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODM5NDc1MDU2NzI2NTMsLTczLjg3Nzc0NDc0OTEwNTQ1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzdhYTgyOWU4YTE4ZTRhMGE4MzljMjU2Mzg0NDU4YjM0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzBkMTdjNmJjODdlNjRlNDFiZDRkZTBkN2U5ZGY0ODU3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2M3ZThiNjA0ZWVmOTRjMDA5YmY1MmFiMTcxNzMyYzk3ID0gJCgnPGRpdiBpZD0iaHRtbF9jN2U4YjYwNGVlZjk0YzAwOWJmNTJhYjE3MTczMmM5NyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+V2VzdCBGYXJtcywgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzBkMTdjNmJjODdlNjRlNDFiZDRkZTBkN2U5ZGY0ODU3LnNldENvbnRlbnQoaHRtbF9jN2U4YjYwNGVlZjk0YzAwOWJmNTJhYjE3MTczMmM5Nyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9iYTA0NTk0NGU3NTY0OGUzOTI2YTRhZDNlYmJhMzU0NC5iaW5kUG9wdXAocG9wdXBfMGQxN2M2YmM4N2U2NGU0MWJkNGRlMGQ3ZTlkZjQ4NTcpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOWY3YmIzMzczYjAzNGRmOGE1NzAwOTFmOGM3OGMxYTYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44MzY2MjMwMTA3MDYwNTYsLTczLjkyNjEwMjA5MzU4MTNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfN2FhODI5ZThhMThlNGEwYTgzOWMyNTYzODQ0NThiMzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOWQ4ZDcwNjM5ZDI5NDRjMjhmMjEwNDVmZTE2NzY3NGMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZGQwMjMwODMwNzUwNDBlNWI5NzI1ZmFkNjE0MmZiMjkgPSAkKCc8ZGl2IGlkPSJodG1sX2RkMDIzMDgzMDc1MDQwZTViOTcyNWZhZDYxNDJmYjI5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5IaWdoICBCcmlkZ2UsIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85ZDhkNzA2MzlkMjk0NGMyOGYyMTA0NWZlMTY3Njc0Yy5zZXRDb250ZW50KGh0bWxfZGQwMjMwODMwNzUwNDBlNWI5NzI1ZmFkNjE0MmZiMjkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOWY3YmIzMzczYjAzNGRmOGE1NzAwOTFmOGM3OGMxYTYuYmluZFBvcHVwKHBvcHVwXzlkOGQ3MDYzOWQyOTQ0YzI4ZjIxMDQ1ZmUxNjc2NzRjKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzlmYTQ3MmU1NjdhNDQ0NGI4OWQ3YzY5ZmU4MmZmNjU5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODE5NzU0MzcwNTk0OTM2LC03My45MDk0MjE2MDc1NzQzNl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83YWE4MjllOGExOGU0YTBhODM5YzI1NjM4NDQ1OGIzNCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iMGQzYWFjNmQ5NTk0OGVhOWMxNmYxZmI0MmM0ZDE3OSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83MjlkNjkzZDc3MDA0ZTY3OWU3Mjc0MDkwMWQwYjQwZCA9ICQoJzxkaXYgaWQ9Imh0bWxfNzI5ZDY5M2Q3NzAwNGU2NzllNzI3NDA5MDFkMGI0MGQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk1lbHJvc2UsIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iMGQzYWFjNmQ5NTk0OGVhOWMxNmYxZmI0MmM0ZDE3OS5zZXRDb250ZW50KGh0bWxfNzI5ZDY5M2Q3NzAwNGU2NzllNzI3NDA5MDFkMGI0MGQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOWZhNDcyZTU2N2E0NDQ0Yjg5ZDdjNjlmZTgyZmY2NTkuYmluZFBvcHVwKHBvcHVwX2IwZDNhYWM2ZDk1OTQ4ZWE5YzE2ZjFmYjQyYzRkMTc5KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2RhN2E2Zjg4MjViYzQ3YTk4ODQzNDA0ZjQ4OGY0MTkzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODA2MjM4NzQ5MzUxNzcsLTczLjkxNjA5OTg3NDg3NTc1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzdhYTgyOWU4YTE4ZTRhMGE4MzljMjU2Mzg0NDU4YjM0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2MzNTQyNDUyNjMwNjRlZjlhZDVkNzRlZWM3OWQ2YzVkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzQ5OWZlYmFmOGE3OTRlODhhYmNiMDcwYzczMjc3NzdiID0gJCgnPGRpdiBpZD0iaHRtbF80OTlmZWJhZjhhNzk0ZTg4YWJjYjA3MGM3MzI3Nzc3YiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TW90dCBIYXZlbiwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2MzNTQyNDUyNjMwNjRlZjlhZDVkNzRlZWM3OWQ2YzVkLnNldENvbnRlbnQoaHRtbF80OTlmZWJhZjhhNzk0ZTg4YWJjYjA3MGM3MzI3Nzc3Yik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9kYTdhNmY4ODI1YmM0N2E5ODg0MzQwNGY0ODhmNDE5My5iaW5kUG9wdXAocG9wdXBfYzM1NDI0NTI2MzA2NGVmOWFkNWQ3NGVlYzc5ZDZjNWQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYjdjOGZmMmQ4MTFkNGQwNGI4ZGZiMjk1YTNmMDI0YWUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44MDE2NjM2Mjc3NTYyMDYsLTczLjkxMzIyMTM5Mzg2MTM1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzdhYTgyOWU4YTE4ZTRhMGE4MzljMjU2Mzg0NDU4YjM0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzg5YTIyN2EwNzU5OTQzYTE5NDRlMTM0ZmY0NDM1MjExID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2M0MGJjNTAwYzM5YzQyMTQ4MTg2ODFkMTAyOGE1MDBiID0gJCgnPGRpdiBpZD0iaHRtbF9jNDBiYzUwMGMzOWM0MjE0ODE4NjgxZDEwMjhhNTAwYiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UG9ydCBNb3JyaXMsIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84OWEyMjdhMDc1OTk0M2ExOTQ0ZTEzNGZmNDQzNTIxMS5zZXRDb250ZW50KGh0bWxfYzQwYmM1MDBjMzljNDIxNDgxODY4MWQxMDI4YTUwMGIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYjdjOGZmMmQ4MTFkNGQwNGI4ZGZiMjk1YTNmMDI0YWUuYmluZFBvcHVwKHBvcHVwXzg5YTIyN2EwNzU5OTQzYTE5NDRlMTM0ZmY0NDM1MjExKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2ExNTc1MTMwMWFkYzQ2MTVhNmRjYTY0OGRlZTkwYTUyID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODE1MDk5MDQ1NDU4MjIsLTczLjg5NTc4ODIwMDk0NDZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfN2FhODI5ZThhMThlNGEwYTgzOWMyNTYzODQ0NThiMzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOTI2YjgxNzQwNDA1NDkxOGE0NDQwMzM1ZWZhM2ViZWQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMzNkMTAzZGFhNzQwNGRiNzk4MmI4YWY2OTk2OGI1MDAgPSAkKCc8ZGl2IGlkPSJodG1sXzMzZDEwM2RhYTc0MDRkYjc5ODJiOGFmNjk5NjhiNTAwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Mb25nd29vZCwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzkyNmI4MTc0MDQwNTQ5MThhNDQ0MDMzNWVmYTNlYmVkLnNldENvbnRlbnQoaHRtbF8zM2QxMDNkYWE3NDA0ZGI3OTgyYjhhZjY5OTY4YjUwMCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9hMTU3NTEzMDFhZGM0NjE1YTZkY2E2NDhkZWU5MGE1Mi5iaW5kUG9wdXAocG9wdXBfOTI2YjgxNzQwNDA1NDkxOGE0NDQwMzM1ZWZhM2ViZWQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZDFkNTJjOWJmODY3NDg4YTliYzU2OGRlMmQ1NzI3ODAgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44MDk3Mjk4NzkzODcwOSwtNzMuODgzMzE1MDU5NTUyOTFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfN2FhODI5ZThhMThlNGEwYTgzOWMyNTYzODQ0NThiMzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOTNjYmQ3Nzg0NTRlNGRiZmE4YjYzMjU5ZjgwZDkwYzcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMDZjZDViODY4ZTFiNDczY2I5MmM0NzliMGI4NmYwNjQgPSAkKCc8ZGl2IGlkPSJodG1sXzA2Y2Q1Yjg2OGUxYjQ3M2NiOTJjNDc5YjBiODZmMDY0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5IdW50cyBQb2ludCwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzkzY2JkNzc4NDU0ZTRkYmZhOGI2MzI1OWY4MGQ5MGM3LnNldENvbnRlbnQoaHRtbF8wNmNkNWI4NjhlMWI0NzNjYjkyYzQ3OWIwYjg2ZjA2NCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9kMWQ1MmM5YmY4Njc0ODhhOWJjNTY4ZGUyZDU3Mjc4MC5iaW5kUG9wdXAocG9wdXBfOTNjYmQ3Nzg0NTRlNGRiZmE4YjYzMjU5ZjgwZDkwYzcpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZDUzNGMwZGY3NDVjNDAwNGFkODJlM2Q3ODIxMTQ5NWQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44MjM1OTE5ODU4NTUzNCwtNzMuOTAxNTA2NDg5NDMwNTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfN2FhODI5ZThhMThlNGEwYTgzOWMyNTYzODQ0NThiMzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYWExM2I3NzhjODYwNDI5YzgxN2NiNDk1MDlmNTkwZjcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMjhkMDNlZjJiZTNlNDY3ZTljOTdmZDFhNTgzOWI0YzAgPSAkKCc8ZGl2IGlkPSJodG1sXzI4ZDAzZWYyYmUzZTQ2N2U5Yzk3ZmQxYTU4MzliNGMwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Nb3JyaXNhbmlhLCBCcm9ueDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYWExM2I3NzhjODYwNDI5YzgxN2NiNDk1MDlmNTkwZjcuc2V0Q29udGVudChodG1sXzI4ZDAzZWYyYmUzZTQ2N2U5Yzk3ZmQxYTU4MzliNGMwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2Q1MzRjMGRmNzQ1YzQwMDRhZDgyZTNkNzgyMTE0OTVkLmJpbmRQb3B1cChwb3B1cF9hYTEzYjc3OGM4NjA0MjljODE3Y2I0OTUwOWY1OTBmNyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8wMGE5OTliNTA3NGM0YWRhYWJjOWEzNDYxMmFiOGM2MSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjgyMTAxMjE5NzkxNDAxNSwtNzMuODY1NzQ2MDk1NTQ5MjRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfN2FhODI5ZThhMThlNGEwYTgzOWMyNTYzODQ0NThiMzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYjA4Yzk5ZDA0ZTQwNGYwZmJkZmExMWVhMjQwOTcxNTkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMDNhZmQ2OTBhODVkNDE5MGFiOWFhOTRhNGQ1NTU0NGIgPSAkKCc8ZGl2IGlkPSJodG1sXzAzYWZkNjkwYTg1ZDQxOTBhYjlhYTk0YTRkNTU1NDRiIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Tb3VuZHZpZXcsIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iMDhjOTlkMDRlNDA0ZjBmYmRmYTExZWEyNDA5NzE1OS5zZXRDb250ZW50KGh0bWxfMDNhZmQ2OTBhODVkNDE5MGFiOWFhOTRhNGQ1NTU0NGIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMDBhOTk5YjUwNzRjNGFkYWFiYzlhMzQ2MTJhYjhjNjEuYmluZFBvcHVwKHBvcHVwX2IwOGM5OWQwNGU0MDRmMGZiZGZhMTFlYTI0MDk3MTU5KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2VhNTYyZmM2NGM3MTRjYjZhNWRjMGExOTIwZWJjNmE3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODA2NTUxMTIwMDM1ODksLTczLjg1NDE0NDE2MTg5MjY2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzdhYTgyOWU4YTE4ZTRhMGE4MzljMjU2Mzg0NDU4YjM0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzgwMzhmMDM5Mjc5OTQxZDk5NDZiZGQ2Y2U1Y2ZkYjc5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2ZiN2JjMzdmNjY2MDRiYmE4MTEzOTFjMTRkOWQzMDdmID0gJCgnPGRpdiBpZD0iaHRtbF9mYjdiYzM3ZjY2NjA0YmJhODExMzkxYzE0ZDlkMzA3ZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q2xhc29uIFBvaW50LCBCcm9ueDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfODAzOGYwMzkyNzk5NDFkOTk0NmJkZDZjZTVjZmRiNzkuc2V0Q29udGVudChodG1sX2ZiN2JjMzdmNjY2MDRiYmE4MTEzOTFjMTRkOWQzMDdmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2VhNTYyZmM2NGM3MTRjYjZhNWRjMGExOTIwZWJjNmE3LmJpbmRQb3B1cChwb3B1cF84MDM4ZjAzOTI3OTk0MWQ5OTQ2YmRkNmNlNWNmZGI3OSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xY2U2MGE3ZGJmM2Q0OTg2OGJiZGJkNTQwMGRlZGNhMCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjgxNTEwOTI1ODA0MDA1LC03My44MTYzNTAwMjE1ODQ0MV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83YWE4MjllOGExOGU0YTBhODM5YzI1NjM4NDQ1OGIzNCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xMDNmNDhkODgzMDY0NjYxODcyOWM3ZTU0ZWE0MTlhZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8yODY1N2VkYTBkZjY0YmJmODRiMzIxMzRjNmNiYzU1MiA9ICQoJzxkaXYgaWQ9Imh0bWxfMjg2NTdlZGEwZGY2NGJiZjg0YjMyMTM0YzZjYmM1NTIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlRocm9ncyBOZWNrLCBCcm9ueDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMTAzZjQ4ZDg4MzA2NDY2MTg3MjljN2U1NGVhNDE5YWQuc2V0Q29udGVudChodG1sXzI4NjU3ZWRhMGRmNjRiYmY4NGIzMjEzNGM2Y2JjNTUyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzFjZTYwYTdkYmYzZDQ5ODY4YmJkYmQ1NDAwZGVkY2EwLmJpbmRQb3B1cChwb3B1cF8xMDNmNDhkODgzMDY0NjYxODcyOWM3ZTU0ZWE0MTlhZCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81NjQxOTE5ZTc5NGQ0ZWJkYWFmYzA5ODgyYTYwZTc1NSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjg0NDI0NTkzNjk0NzM3NCwtNzMuODI0MDk5MjY3NTM4NV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83YWE4MjllOGExOGU0YTBhODM5YzI1NjM4NDQ1OGIzNCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wN2YyZDUyMTgxZGE0OThmYWI2MmVkZDc2YWM5Y2QwMyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wOGY3YjcwNGExOTI0YTliYmI0MjBiMTliZWQ1YmU0NiA9ICQoJzxkaXYgaWQ9Imh0bWxfMDhmN2I3MDRhMTkyNGE5YmJiNDIwYjE5YmVkNWJlNDYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNvdW50cnkgQ2x1YiwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzA3ZjJkNTIxODFkYTQ5OGZhYjYyZWRkNzZhYzljZDAzLnNldENvbnRlbnQoaHRtbF8wOGY3YjcwNGExOTI0YTliYmI0MjBiMTliZWQ1YmU0Nik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81NjQxOTE5ZTc5NGQ0ZWJkYWFmYzA5ODgyYTYwZTc1NS5iaW5kUG9wdXAocG9wdXBfMDdmMmQ1MjE4MWRhNDk4ZmFiNjJlZGQ3NmFjOWNkMDMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNjFkOTdkOGNmNjE5NGIzMGJmMzJkODRkNDY2NTdiMjkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44Mzc5Mzc4MjIyNjcyODYsLTczLjg1NjAwMzEwNTM1NzgzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzdhYTgyOWU4YTE4ZTRhMGE4MzljMjU2Mzg0NDU4YjM0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzE5Njg1ZDMyMDBlMzRlMDdiNTExOTM2NTcxMjkxNmYyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzJhMWM5MWVkMGZjMTQ1ZTI5ZGQxYmVjYTUzM2NhNDU1ID0gJCgnPGRpdiBpZD0iaHRtbF8yYTFjOTFlZDBmYzE0NWUyOWRkMWJlY2E1MzNjYTQ1NSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UGFya2NoZXN0ZXIsIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xOTY4NWQzMjAwZTM0ZTA3YjUxMTkzNjU3MTI5MTZmMi5zZXRDb250ZW50KGh0bWxfMmExYzkxZWQwZmMxNDVlMjlkZDFiZWNhNTMzY2E0NTUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNjFkOTdkOGNmNjE5NGIzMGJmMzJkODRkNDY2NTdiMjkuYmluZFBvcHVwKHBvcHVwXzE5Njg1ZDMyMDBlMzRlMDdiNTExOTM2NTcxMjkxNmYyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzlkMTM3MTNjNGRkMjQ1MTRiZWU3ZGU1M2RmNzg2N2E2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODQwNjE5NDk2NDMyNywtNzMuODQyMTk0MDc2MDQ0NDRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfN2FhODI5ZThhMThlNGEwYTgzOWMyNTYzODQ0NThiMzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNzRkNWM2ODljNDI0NDBhNmFjOGJjZWQzZDQ1ODc4YTEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNjliMmY5MTY2YmVlNGM5YTg3ODc4ZjZiZDQ3MTZjYzMgPSAkKCc8ZGl2IGlkPSJodG1sXzY5YjJmOTE2NmJlZTRjOWE4Nzg3OGY2YmQ0NzE2Y2MzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5XZXN0Y2hlc3RlciBTcXVhcmUsIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83NGQ1YzY4OWM0MjQ0MGE2YWM4YmNlZDNkNDU4NzhhMS5zZXRDb250ZW50KGh0bWxfNjliMmY5MTY2YmVlNGM5YTg3ODc4ZjZiZDQ3MTZjYzMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOWQxMzcxM2M0ZGQyNDUxNGJlZTdkZTUzZGY3ODY3YTYuYmluZFBvcHVwKHBvcHVwXzc0ZDVjNjg5YzQyNDQwYTZhYzhiY2VkM2Q0NTg3OGExKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzgxNDcwOThiZWZjZDQ1MzZhMThiMjUzYjExZWU1MmU1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODQzNjA4NDcxMjQ3MTgsLTczLjg2NjI5OTE4MDc1NjFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfN2FhODI5ZThhMThlNGEwYTgzOWMyNTYzODQ0NThiMzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfY2RjZWI3Y2E5ZjJkNGRmYzg5YzlkMGUwNzIzOGFmNjkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNTA4MDc2YWEwMTcyNGZjOGI0ZDA2ZDg0MDdhMGZhOWMgPSAkKCc8ZGl2IGlkPSJodG1sXzUwODA3NmFhMDE3MjRmYzhiNGQwNmQ4NDA3YTBmYTljIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5WYW4gTmVzdCwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2NkY2ViN2NhOWYyZDRkZmM4OWM5ZDBlMDcyMzhhZjY5LnNldENvbnRlbnQoaHRtbF81MDgwNzZhYTAxNzI0ZmM4YjRkMDZkODQwN2EwZmE5Yyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl84MTQ3MDk4YmVmY2Q0NTM2YTE4YjI1M2IxMWVlNTJlNS5iaW5kUG9wdXAocG9wdXBfY2RjZWI3Y2E5ZjJkNGRmYzg5YzlkMGUwNzIzOGFmNjkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMDc4Yjk5NWFhMzU0NGMwYWFlZWY3ZjE1NzAwZmNjZTcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44NDc1NDkwNjM1MzYzMzQsLTczLjg1MDQwMTc4MDMwNDIxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzdhYTgyOWU4YTE4ZTRhMGE4MzljMjU2Mzg0NDU4YjM0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzQxNGU3ODU1MzhjNDQxMjA5YTVmZmQ5MDVkOTBiZWMyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2Y4ODRjNWExZWFjMTRkOTE5NjIzZGY3Y2I3NTJkOTQ2ID0gJCgnPGRpdiBpZD0iaHRtbF9mODg0YzVhMWVhYzE0ZDkxOTYyM2RmN2NiNzUyZDk0NiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TW9ycmlzIFBhcmssIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80MTRlNzg1NTM4YzQ0MTIwOWE1ZmZkOTA1ZDkwYmVjMi5zZXRDb250ZW50KGh0bWxfZjg4NGM1YTFlYWMxNGQ5MTk2MjNkZjdjYjc1MmQ5NDYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMDc4Yjk5NWFhMzU0NGMwYWFlZWY3ZjE1NzAwZmNjZTcuYmluZFBvcHVwKHBvcHVwXzQxNGU3ODU1MzhjNDQxMjA5YTVmZmQ5MDVkOTBiZWMyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2VmNmRiMTNmODVjZTQ5Y2U4NGViNzQzYjRkYzEyN2YzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODU3Mjc3MTAwNzM4OTUsLTczLjg4ODQ1MTk2MTM0ODA0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzdhYTgyOWU4YTE4ZTRhMGE4MzljMjU2Mzg0NDU4YjM0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzVhNDcwODNiZmJkYTRhNjA4OTIyNjA5ZjZiNDgwZTEzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzY4Y2Y3YzU3NDllMTQ5MzVhYzU3MmI5ZGJhNzNjZjUwID0gJCgnPGRpdiBpZD0iaHRtbF82OGNmN2M1NzQ5ZTE0OTM1YWM1NzJiOWRiYTczY2Y1MCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QmVsbW9udCwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzVhNDcwODNiZmJkYTRhNjA4OTIyNjA5ZjZiNDgwZTEzLnNldENvbnRlbnQoaHRtbF82OGNmN2M1NzQ5ZTE0OTM1YWM1NzJiOWRiYTczY2Y1MCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9lZjZkYjEzZjg1Y2U0OWNlODRlYjc0M2I0ZGMxMjdmMy5iaW5kUG9wdXAocG9wdXBfNWE0NzA4M2JmYmRhNGE2MDg5MjI2MDlmNmI0ODBlMTMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMzE1M2UwMTU0NmYzNDNkOThhNTQ1NWNkYjE3ODQzYzcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44ODEzOTQ5NzcyNzA4NiwtNzMuOTE3MTkwNDgyMTAzOTNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfN2FhODI5ZThhMThlNGEwYTgzOWMyNTYzODQ0NThiMzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMDMyYjZjMjg4ZGFkNDc3YWE5NmZhMzY0OGViNGM4ZDQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMDVkOTU5Yzg2YTgzNDcwNGE0NWYyM2FkNjVkOWYxNWIgPSAkKCc8ZGl2IGlkPSJodG1sXzA1ZDk1OWM4NmE4MzQ3MDRhNDVmMjNhZDY1ZDlmMTViIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5TcHV5dGVuIER1eXZpbCwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzAzMmI2YzI4OGRhZDQ3N2FhOTZmYTM2NDhlYjRjOGQ0LnNldENvbnRlbnQoaHRtbF8wNWQ5NTljODZhODM0NzA0YTQ1ZjIzYWQ2NWQ5ZjE1Yik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8zMTUzZTAxNTQ2ZjM0M2Q5OGE1NDU1Y2RiMTc4NDNjNy5iaW5kUG9wdXAocG9wdXBfMDMyYjZjMjg4ZGFkNDc3YWE5NmZhMzY0OGViNGM4ZDQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMTliNjAyZWU5MDkxNGJmNzgwMWQzNmIzNDE3M2Y0YzEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC45MDg1NDI4Mjk1MDY2NiwtNzMuOTA0NTMwNTQ5MDg5MjddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfN2FhODI5ZThhMThlNGEwYTgzOWMyNTYzODQ0NThiMzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYWFkMjQ1N2U3Yjg4NGRkMzgyOTEwMWEzMjhlZGEyN2MgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNWU3NTY4MDM1NzZjNDcwYjk1N2E0OTc1NTZkMmNkNTQgPSAkKCc8ZGl2IGlkPSJodG1sXzVlNzU2ODAzNTc2YzQ3MGI5NTdhNDk3NTU2ZDJjZDU0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Ob3J0aCBSaXZlcmRhbGUsIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hYWQyNDU3ZTdiODg0ZGQzODI5MTAxYTMyOGVkYTI3Yy5zZXRDb250ZW50KGh0bWxfNWU3NTY4MDM1NzZjNDcwYjk1N2E0OTc1NTZkMmNkNTQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMTliNjAyZWU5MDkxNGJmNzgwMWQzNmIzNDE3M2Y0YzEuYmluZFBvcHVwKHBvcHVwX2FhZDI0NTdlN2I4ODRkZDM4MjkxMDFhMzI4ZWRhMjdjKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2NlMWNmNmFhNGZjYzRlYzU4ZDI2MDkyYzBjOGY2YTFlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODUwNjQxNDA5NDAzMzUsLTczLjgzMjA3Mzc4MjQwNDddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfN2FhODI5ZThhMThlNGEwYTgzOWMyNTYzODQ0NThiMzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNWZjZDI3OWExY2ZiNDI5MDg0YzBlYzlhNGIwMmQyYWYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYTg3NmI0NzViZmIzNDYxZjgwYWEzODJhMjQ4MDY4YjMgPSAkKCc8ZGl2IGlkPSJodG1sX2E4NzZiNDc1YmZiMzQ2MWY4MGFhMzgyYTI0ODA2OGIzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5QZWxoYW0gQmF5LCBCcm9ueDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNWZjZDI3OWExY2ZiNDI5MDg0YzBlYzlhNGIwMmQyYWYuc2V0Q29udGVudChodG1sX2E4NzZiNDc1YmZiMzQ2MWY4MGFhMzgyYTI0ODA2OGIzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2NlMWNmNmFhNGZjYzRlYzU4ZDI2MDkyYzBjOGY2YTFlLmJpbmRQb3B1cChwb3B1cF81ZmNkMjc5YTFjZmI0MjkwODRjMGVjOWE0YjAyZDJhZik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lNTY4ZjM0ZWNiNWI0MDU4YmFhZjk3MDYwNWNmMGNjMSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjgyNjU3OTUxNjg2OTIyLC03My44MjYyMDI3NTk5NDA3M10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83YWE4MjllOGExOGU0YTBhODM5YzI1NjM4NDQ1OGIzNCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xNWM2MjE3M2JmNWI0ZDY1YTJkMTc3Y2IwMzUyZDYyMSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82MzhlYWM1ZGE4ZTM0MzQ0YTY3MzQ4ZTVmZTVlYzIxYyA9ICQoJzxkaXYgaWQ9Imh0bWxfNjM4ZWFjNWRhOGUzNDM0NGE2NzM0OGU1ZmU1ZWMyMWMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlNjaHV5bGVydmlsbGUsIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xNWM2MjE3M2JmNWI0ZDY1YTJkMTc3Y2IwMzUyZDYyMS5zZXRDb250ZW50KGh0bWxfNjM4ZWFjNWRhOGUzNDM0NGE2NzM0OGU1ZmU1ZWMyMWMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZTU2OGYzNGVjYjViNDA1OGJhYWY5NzA2MDVjZjBjYzEuYmluZFBvcHVwKHBvcHVwXzE1YzYyMTczYmY1YjRkNjVhMmQxNzdjYjAzNTJkNjIxKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2RjOGZmZWU2NWUwZTQyMzA4MTA2YTAwNzM1Mjg0YTFmID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODIxOTg2MTE4MTYzNDk0LC03My44MTM4ODUxNDQyODYxOV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83YWE4MjllOGExOGU0YTBhODM5YzI1NjM4NDQ1OGIzNCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF80ZjZlMWI5ODUyNTQ0YzQ3YTI3ZDAzM2YyMTU5ZjI5MyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xMDJkZDdlM2ZkYjA0OTQxYTc3MDEyYWExM2Y5ZTQ0NCA9ICQoJzxkaXYgaWQ9Imh0bWxfMTAyZGQ3ZTNmZGIwNDk0MWE3NzAxMmFhMTNmOWU0NDQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkVkZ2V3YXRlciBQYXJrLCBCcm9ueDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNGY2ZTFiOTg1MjU0NGM0N2EyN2QwMzNmMjE1OWYyOTMuc2V0Q29udGVudChodG1sXzEwMmRkN2UzZmRiMDQ5NDFhNzcwMTJhYTEzZjllNDQ0KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2RjOGZmZWU2NWUwZTQyMzA4MTA2YTAwNzM1Mjg0YTFmLmJpbmRQb3B1cChwb3B1cF80ZjZlMWI5ODUyNTQ0YzQ3YTI3ZDAzM2YyMTU5ZjI5Myk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jY2RkMTYwNGE3ODg0ZTk1OTExOTVhYmYxNDg1MTAyMSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjgxOTAxNDM3Njk4ODMxNCwtNzMuODQ4MDI3Mjk1ODI3MzVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfN2FhODI5ZThhMThlNGEwYTgzOWMyNTYzODQ0NThiMzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfODI2NjEyZDAyOWVkNGRmNWIxYWVkYTIxNjdkMzJlNGMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNjdkM2VlYTkyOTg4NDI2NTlhZDE4YzJhMDBhOGE0OGMgPSAkKCc8ZGl2IGlkPSJodG1sXzY3ZDNlZWE5Mjk4ODQyNjU5YWQxOGMyYTAwYThhNDhjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DYXN0bGUgSGlsbCwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzgyNjYxMmQwMjllZDRkZjViMWFlZGEyMTY3ZDMyZTRjLnNldENvbnRlbnQoaHRtbF82N2QzZWVhOTI5ODg0MjY1OWFkMThjMmEwMGE4YTQ4Yyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9jY2RkMTYwNGE3ODg0ZTk1OTExOTVhYmYxNDg1MTAyMS5iaW5kUG9wdXAocG9wdXBfODI2NjEyZDAyOWVkNGRmNWIxYWVkYTIxNjdkMzJlNGMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNjk5NzUzNzI2MGJkNGU4MThlMjJhZjNjMjNkMDAyZDkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44NzEzNzA3ODE5MjM3MSwtNzMuODYzMzIzNjE2NTI3NzddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfN2FhODI5ZThhMThlNGEwYTgzOWMyNTYzODQ0NThiMzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNmY1ODViN2VlMDQ0NDg0ZjgzYTA4M2NjZWY3NGZhODIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMTZlY2I2NmQwM2IyNDE0ODg0NWViNjk1ZjEwOGQ1ZjUgPSAkKCc8ZGl2IGlkPSJodG1sXzE2ZWNiNjZkMDNiMjQxNDg4NDVlYjY5NWYxMDhkNWY1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5PbGludmlsbGUsIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82ZjU4NWI3ZWUwNDQ0ODRmODNhMDgzY2NlZjc0ZmE4Mi5zZXRDb250ZW50KGh0bWxfMTZlY2I2NmQwM2IyNDE0ODg0NWViNjk1ZjEwOGQ1ZjUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNjk5NzUzNzI2MGJkNGU4MThlMjJhZjNjMjNkMDAyZDkuYmluZFBvcHVwKHBvcHVwXzZmNTg1YjdlZTA0NDQ4NGY4M2EwODNjY2VmNzRmYTgyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzNjMDliYzZhOWI0MTRmYzdiYTAzYTVjNGRjYzkxNjZhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODYyOTY1NjI0Nzc5OTgsLTczLjg0MTYxMTk0ODMxMjIzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzdhYTgyOWU4YTE4ZTRhMGE4MzljMjU2Mzg0NDU4YjM0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzA2MTRjMDcyNGQ5YzQ5MDFhODU5NTZmY2NjZjQ4NjQ0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2YzMzc5NWI0Y2M4NjRiOGJiZTYzNTUyNzA0ZTgwOWQxID0gJCgnPGRpdiBpZD0iaHRtbF9mMzM3OTViNGNjODY0YjhiYmU2MzU1MjcwNGU4MDlkMSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UGVsaGFtIEdhcmRlbnMsIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wNjE0YzA3MjRkOWM0OTAxYTg1OTU2ZmNjY2Y0ODY0NC5zZXRDb250ZW50KGh0bWxfZjMzNzk1YjRjYzg2NGI4YmJlNjM1NTI3MDRlODA5ZDEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfM2MwOWJjNmE5YjQxNGZjN2JhMDNhNWM0ZGNjOTE2NmEuYmluZFBvcHVwKHBvcHVwXzA2MTRjMDcyNGQ5YzQ5MDFhODU5NTZmY2NjZjQ4NjQ0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzNjM2FhZDRjOWEyNDQyNDk4Y2JjMDlmMjI1YTM0YjczID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODM0MjgzODA3MzM4NTEsLTczLjkxNTU4OTQxNzczNDQ0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzdhYTgyOWU4YTE4ZTRhMGE4MzljMjU2Mzg0NDU4YjM0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzg0ZGE0ZWM2YmZmMDRhMWM4NjE3ZTMyMWE0ZTg3ZDY0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzQ1OTg4ZmQzNWM2MDRjZWM4NTkxZWE1ZGFhYTMzMmNmID0gJCgnPGRpdiBpZD0iaHRtbF80NTk4OGZkMzVjNjA0Y2VjODU5MWVhNWRhYWEzMzJjZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q29uY291cnNlLCBCcm9ueDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfODRkYTRlYzZiZmYwNGExYzg2MTdlMzIxYTRlODdkNjQuc2V0Q29udGVudChodG1sXzQ1OTg4ZmQzNWM2MDRjZWM4NTkxZWE1ZGFhYTMzMmNmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzNjM2FhZDRjOWEyNDQyNDk4Y2JjMDlmMjI1YTM0YjczLmJpbmRQb3B1cChwb3B1cF84NGRhNGVjNmJmZjA0YTFjODYxN2UzMjFhNGU4N2Q2NCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lNTc0MTcwZGU0MWU0ZTFhOTQ5OWFmOWQ3NGU4NTNjOSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjgyOTc3NDI5Nzg3MTYxLC03My44NTA1MzUyNDQ1MTkzNV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83YWE4MjllOGExOGU0YTBhODM5YzI1NjM4NDQ1OGIzNCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF81YmY4NzI5ZTg0YzM0ZDYxOTkyNWQwMzA5NWU1NmFiOCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hNzc2YmQ0ZWJmNGI0NDE0YTQyODVkYzYxMTAzMzM1NiA9ICQoJzxkaXYgaWQ9Imh0bWxfYTc3NmJkNGViZjRiNDQxNGE0Mjg1ZGM2MTEwMzMzNTYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlVuaW9ucG9ydCwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzViZjg3MjllODRjMzRkNjE5OTI1ZDAzMDk1ZTU2YWI4LnNldENvbnRlbnQoaHRtbF9hNzc2YmQ0ZWJmNGI0NDE0YTQyODVkYzYxMTAzMzM1Nik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9lNTc0MTcwZGU0MWU0ZTFhOTQ5OWFmOWQ3NGU4NTNjOS5iaW5kUG9wdXAocG9wdXBfNWJmODcyOWU4NGMzNGQ2MTk5MjVkMDMwOTVlNTZhYjgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMWM4NDEzNjIwOTE0NDNiNGE5OWQxMDgyMmZhMWNkNDggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44ODQ1NjEzMDMwMzczMiwtNzMuODQ4MDgyNzE4NzcxNjhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfN2FhODI5ZThhMThlNGEwYTgzOWMyNTYzODQ0NThiMzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMmM3MzYxNzdlMmY5NDA0YmJlMDIxYjIxOTYwMzMzOTYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMGZjYWRjMWY5OTE2NDUzZDg0Y2FiZTMyMGFjY2ZmY2YgPSAkKCc8ZGl2IGlkPSJodG1sXzBmY2FkYzFmOTkxNjQ1M2Q4NGNhYmUzMjBhY2NmZmNmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5FZGVud2FsZCwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzJjNzM2MTc3ZTJmOTQwNGJiZTAyMWIyMTk2MDMzMzk2LnNldENvbnRlbnQoaHRtbF8wZmNhZGMxZjk5MTY0NTNkODRjYWJlMzIwYWNjZmZjZik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8xYzg0MTM2MjA5MTQ0M2I0YTk5ZDEwODIyZmExY2Q0OC5iaW5kUG9wdXAocG9wdXBfMmM3MzYxNzdlMmY5NDA0YmJlMDIxYjIxOTYwMzMzOTYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOTk2ZDFlZTY2YjE4NDU4N2I2MDA1ZWI0OTkxYzY5NDYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42MjU4MDEwNjUwMTA2NTYsLTc0LjAzMDYyMDY5MzUzODEzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzdhYTgyOWU4YTE4ZTRhMGE4MzljMjU2Mzg0NDU4YjM0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2U0YTZiMjMwZWUzMjQ5YzJiMTAyNWI0YzQxNDcyMDM4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzNlOGFlMGI0NGEwNTQ0MzBhNWFhZDY5OTE5MjNmMTg4ID0gJCgnPGRpdiBpZD0iaHRtbF8zZThhZTBiNDRhMDU0NDMwYTVhYWQ2OTkxOTIzZjE4OCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QmF5IFJpZGdlLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZTRhNmIyMzBlZTMyNDljMmIxMDI1YjRjNDE0NzIwMzguc2V0Q29udGVudChodG1sXzNlOGFlMGI0NGEwNTQ0MzBhNWFhZDY5OTE5MjNmMTg4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzk5NmQxZWU2NmIxODQ1ODdiNjAwNWViNDk5MWM2OTQ2LmJpbmRQb3B1cChwb3B1cF9lNGE2YjIzMGVlMzI0OWMyYjEwMjViNGM0MTQ3MjAzOCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl84YWMzMTJmNDg3ZTE0YjliOTFlMGFiNmY1NGIyY2U2YiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjYxMTAwODkwMjAyMDQ0LC03My45OTUxNzk5ODM4MDcyOV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83YWE4MjllOGExOGU0YTBhODM5YzI1NjM4NDQ1OGIzNCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mNjdmYjA4OTY2MTE0OWJkYTMzMGIzOWI3NWM2NWRkMyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iMThhZGZiMDcxNmE0NmZmYmE3M2JmNzE4ZThjMGE0NCA9ICQoJzxkaXYgaWQ9Imh0bWxfYjE4YWRmYjA3MTZhNDZmZmJhNzNiZjcxOGU4YzBhNDQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkJlbnNvbmh1cnN0LCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZjY3ZmIwODk2NjExNDliZGEzMzBiMzliNzVjNjVkZDMuc2V0Q29udGVudChodG1sX2IxOGFkZmIwNzE2YTQ2ZmZiYTczYmY3MThlOGMwYTQ0KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzhhYzMxMmY0ODdlMTRiOWI5MWUwYWI2ZjU0YjJjZTZiLmJpbmRQb3B1cChwb3B1cF9mNjdmYjA4OTY2MTE0OWJkYTMzMGIzOWI3NWM2NWRkMyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl80MWFlMjYyYzNjNTg0ZmE4OGE0YjA1ZjI0MTNiNzMxYSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY0NTEwMjk0OTI1NDI5LC03NC4wMTAzMTYxODUyNzc4NF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83YWE4MjllOGExOGU0YTBhODM5YzI1NjM4NDQ1OGIzNCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF81ZmE2MWMzYWQyZTY0MDgxOWEyOTFjOTEyMjBlYzk5NyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hMDI2ZjY0NTNjMGQ0MTc5OTQ1ZTUyZWJlNWVjOTE2ZCA9ICQoJzxkaXYgaWQ9Imh0bWxfYTAyNmY2NDUzYzBkNDE3OTk0NWU1MmViZTVlYzkxNmQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlN1bnNldCBQYXJrLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNWZhNjFjM2FkMmU2NDA4MTlhMjkxYzkxMjIwZWM5OTcuc2V0Q29udGVudChodG1sX2EwMjZmNjQ1M2MwZDQxNzk5NDVlNTJlYmU1ZWM5MTZkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzQxYWUyNjJjM2M1ODRmYTg4YTRiMDVmMjQxM2I3MzFhLmJpbmRQb3B1cChwb3B1cF81ZmE2MWMzYWQyZTY0MDgxOWEyOTFjOTEyMjBlYzk5Nyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85Y2NkMzM2NzQ0YTk0ZGNiYjIyZjcyYjU2N2E2NmJlMiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjczMDIwMDk4NDg2NDcsLTczLjk1NDI0MDkzMTI3MzkzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzdhYTgyOWU4YTE4ZTRhMGE4MzljMjU2Mzg0NDU4YjM0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2Q1NjgzNzdkY2I3ZTQ2YzI4NDRjZjg5NzZjY2VhM2Y4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzU3NzYxNmY1ZmNjMjQzNWNhNjJkNDVjNTgyMjZjMmU2ID0gJCgnPGRpdiBpZD0iaHRtbF81Nzc2MTZmNWZjYzI0MzVjYTYyZDQ1YzU4MjI2YzJlNiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+R3JlZW5wb2ludCwgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2Q1NjgzNzdkY2I3ZTQ2YzI4NDRjZjg5NzZjY2VhM2Y4LnNldENvbnRlbnQoaHRtbF81Nzc2MTZmNWZjYzI0MzVjYTYyZDQ1YzU4MjI2YzJlNik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl85Y2NkMzM2NzQ0YTk0ZGNiYjIyZjcyYjU2N2E2NmJlMi5iaW5kUG9wdXAocG9wdXBfZDU2ODM3N2RjYjdlNDZjMjg0NGNmODk3NmNjZWEzZjgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOGEyZDAxMTY2NTI3NDcyMzg2MWIwYzQ5YjgwMWQ1MmUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC41OTUyNjAwMTMwNjU5MywtNzMuOTczNDcwODc3MDg0NDVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfN2FhODI5ZThhMThlNGEwYTgzOWMyNTYzODQ0NThiMzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMmU4OWIwZmE0ZGYyNDRiYzhhZWFjMTFlNWYwNDMzYjAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMDcwMGY0MDg0ZjMzNGIxNmFjYzMyZTBjMzZhYzVmMTYgPSAkKCc8ZGl2IGlkPSJodG1sXzA3MDBmNDA4NGYzMzRiMTZhY2MzMmUwYzM2YWM1ZjE2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5HcmF2ZXNlbmQsIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yZTg5YjBmYTRkZjI0NGJjOGFlYWMxMWU1ZjA0MzNiMC5zZXRDb250ZW50KGh0bWxfMDcwMGY0MDg0ZjMzNGIxNmFjYzMyZTBjMzZhYzVmMTYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOGEyZDAxMTY2NTI3NDcyMzg2MWIwYzQ5YjgwMWQ1MmUuYmluZFBvcHVwKHBvcHVwXzJlODliMGZhNGRmMjQ0YmM4YWVhYzExZTVmMDQzM2IwKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzIzZmVjYjUzNDIyOTQ0MzdiZjI3NTU4ZWVlMzY2ZTBlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTc2ODI1MDY1NjY2MDQsLTczLjk2NTA5NDQ4Nzg1MzM2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzdhYTgyOWU4YTE4ZTRhMGE4MzljMjU2Mzg0NDU4YjM0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzViZjgxNzA2MDdkODQ2ZTJiNjIyNTI5OTE5NTA1ZTQwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzg1YTg0NTBkODY5NTQ0NjFiODlmNzU5YmVmZmVlN2MyID0gJCgnPGRpdiBpZD0iaHRtbF84NWE4NDUwZDg2OTU0NDYxYjg5Zjc1OWJlZmZlZTdjMiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QnJpZ2h0b24gQmVhY2gsIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81YmY4MTcwNjA3ZDg0NmUyYjYyMjUyOTkxOTUwNWU0MC5zZXRDb250ZW50KGh0bWxfODVhODQ1MGQ4Njk1NDQ2MWI4OWY3NTliZWZmZWU3YzIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMjNmZWNiNTM0MjI5NDQzN2JmMjc1NThlZWUzNjZlMGUuYmluZFBvcHVwKHBvcHVwXzViZjgxNzA2MDdkODQ2ZTJiNjIyNTI5OTE5NTA1ZTQwKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2E0MWY4MDY3NzE5ODQyM2Y4MmFiZjMyZDFkNzc1ODE1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTg2ODkwMTI2NzgzODQsLTczLjk0MzE4NjQwNDgyOTc5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzdhYTgyOWU4YTE4ZTRhMGE4MzljMjU2Mzg0NDU4YjM0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzhmMzhhYzNlZmFlMDRlNjhiN2M5NDc2N2MwOTVmOTk3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2ZhNTM4OTBhZTg4MDQxMGE4ZTliYmU4YmQ1MGM4NDhlID0gJCgnPGRpdiBpZD0iaHRtbF9mYTUzODkwYWU4ODA0MTBhOGU5YmJlOGJkNTBjODQ4ZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U2hlZXBzaGVhZCBCYXksIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84ZjM4YWMzZWZhZTA0ZTY4YjdjOTQ3NjdjMDk1Zjk5Ny5zZXRDb250ZW50KGh0bWxfZmE1Mzg5MGFlODgwNDEwYThlOWJiZThiZDUwYzg0OGUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYTQxZjgwNjc3MTk4NDIzZjgyYWJmMzJkMWQ3NzU4MTUuYmluZFBvcHVwKHBvcHVwXzhmMzhhYzNlZmFlMDRlNjhiN2M5NDc2N2MwOTVmOTk3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzc5NzNhZjMyMjYxNDRlODViZjk0YzI4N2Y2NmVmNjE1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjE0NDMyNTEzMzUwOTgsLTczLjk1NzQzODQwNTU5OTM5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzdhYTgyOWU4YTE4ZTRhMGE4MzljMjU2Mzg0NDU4YjM0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzE3MzllOWRjYzExZTQzMWQ5ODA1NDc0ZDQ0YzkxMGFjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2NhNjY2YWQ1ODQ0MjQ2NDBhMDE5OTA0ZGVmNjI2NDllID0gJCgnPGRpdiBpZD0iaHRtbF9jYTY2NmFkNTg0NDI0NjQwYTAxOTkwNGRlZjYyNjQ5ZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TWFuaGF0dGFuIFRlcnJhY2UsIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xNzM5ZTlkY2MxMWU0MzFkOTgwNTQ3NGQ0NGM5MTBhYy5zZXRDb250ZW50KGh0bWxfY2E2NjZhZDU4NDQyNDY0MGEwMTk5MDRkZWY2MjY0OWUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNzk3M2FmMzIyNjE0NGU4NWJmOTRjMjg3ZjY2ZWY2MTUuYmluZFBvcHVwKHBvcHVwXzE3MzllOWRjYzExZTQzMWQ5ODA1NDc0ZDQ0YzkxMGFjKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzFmODZhMThlOTNjZDRhOGQ5ZTBlM2NiZWEyYjgyMDIyID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjM2MzI1ODkwMjY2NzcsLTczLjk1ODQwMTA2NTMzOTAzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzdhYTgyOWU4YTE4ZTRhMGE4MzljMjU2Mzg0NDU4YjM0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzdkNzA2YWRiMDA4NjRkMjdhMmI2MjFhNzRjMjAyMDZlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzYwN2Q0ZDM2NjZhZjRiNDY4MDNjN2EyZDc3ZGI4YzdmID0gJCgnPGRpdiBpZD0iaHRtbF82MDdkNGQzNjY2YWY0YjQ2ODAzYzdhMmQ3N2RiOGM3ZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RmxhdGJ1c2gsIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83ZDcwNmFkYjAwODY0ZDI3YTJiNjIxYTc0YzIwMjA2ZS5zZXRDb250ZW50KGh0bWxfNjA3ZDRkMzY2NmFmNGI0NjgwM2M3YTJkNzdkYjhjN2YpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMWY4NmExOGU5M2NkNGE4ZDllMGUzY2JlYTJiODIwMjIuYmluZFBvcHVwKHBvcHVwXzdkNzA2YWRiMDA4NjRkMjdhMmI2MjFhNzRjMjAyMDZlKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzI3YTg2MTcwYWZlNDQ5MzliNjE4MDQ4MzQwZTdkMWI2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjcwODI5MTc2OTUyOTQsLTczLjk0MzI5MTE5MDczNTgyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzdhYTgyOWU4YTE4ZTRhMGE4MzljMjU2Mzg0NDU4YjM0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzEzOGUzY2Y2ZDJmYjQ3MWNiZjY1OTgzZmRiZjNmYzhhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzYzYWRhMWRhZjkxNzQ2MDViMmFjOTllNGZlYzE2NzgwID0gJCgnPGRpdiBpZD0iaHRtbF82M2FkYTFkYWY5MTc0NjA1YjJhYzk5ZTRmZWMxNjc4MCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q3Jvd24gSGVpZ2h0cywgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzEzOGUzY2Y2ZDJmYjQ3MWNiZjY1OTgzZmRiZjNmYzhhLnNldENvbnRlbnQoaHRtbF82M2FkYTFkYWY5MTc0NjA1YjJhYzk5ZTRmZWMxNjc4MCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8yN2E4NjE3MGFmZTQ0OTM5YjYxODA0ODM0MGU3ZDFiNi5iaW5kUG9wdXAocG9wdXBfMTM4ZTNjZjZkMmZiNDcxY2JmNjU5ODNmZGJmM2ZjOGEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMDlmMGNlNzhiNjhmNDFlMGJiNTdjNGY1M2IxMGE4MDUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42NDE3MTc3NjY2ODk2MSwtNzMuOTM2MTAyNTYxODU4MzZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfN2FhODI5ZThhMThlNGEwYTgzOWMyNTYzODQ0NThiMzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMTgwMzdhNjcwYjZmNDM1MzllNDA1YzNhYWRjY2Q2MjEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfODNkZjdhNDkwOGRiNGZlYjk4ZTUzOGZkNzIyNjM1OGMgPSAkKCc8ZGl2IGlkPSJodG1sXzgzZGY3YTQ5MDhkYjRmZWI5OGU1MzhmZDcyMjYzNThjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5FYXN0IEZsYXRidXNoLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMTgwMzdhNjcwYjZmNDM1MzllNDA1YzNhYWRjY2Q2MjEuc2V0Q29udGVudChodG1sXzgzZGY3YTQ5MDhkYjRmZWI5OGU1MzhmZDcyMjYzNThjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzA5ZjBjZTc4YjY4ZjQxZTBiYjU3YzRmNTNiMTBhODA1LmJpbmRQb3B1cChwb3B1cF8xODAzN2E2NzBiNmY0MzUzOWU0MDVjM2FhZGNjZDYyMSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xMWM4YmVhYmQ3YzI0YmRmYjg1MmUzYTg1NTBkMjA4OSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY0MjM4MTk1ODAwMzUyNiwtNzMuOTgwNDIxMTA1NTk0NzRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfN2FhODI5ZThhMThlNGEwYTgzOWMyNTYzODQ0NThiMzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYzg4YjY3NTc3YTc1NGJhZmJkYmJkN2U0ZjkyZjNlMDEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYjk2ZjU3NzhjOThjNGQ5YjlkNmNkNGEwYjE2NGE1MWUgPSAkKCc8ZGl2IGlkPSJodG1sX2I5NmY1Nzc4Yzk4YzRkOWI5ZDZjZDRhMGIxNjRhNTFlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5LZW5zaW5ndG9uLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYzg4YjY3NTc3YTc1NGJhZmJkYmJkN2U0ZjkyZjNlMDEuc2V0Q29udGVudChodG1sX2I5NmY1Nzc4Yzk4YzRkOWI5ZDZjZDRhMGIxNjRhNTFlKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzExYzhiZWFiZDdjMjRiZGZiODUyZTNhODU1MGQyMDg5LmJpbmRQb3B1cChwb3B1cF9jODhiNjc1NzdhNzU0YmFmYmRiYmQ3ZTRmOTJmM2UwMSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl83ZTc5OGJmODViY2I0YjQzYmJkZTM1ZDAzMzJmY2U0MSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY1Njk0NTgzNTc1MTA0LC03My45ODAwNzM0MDQzMDE3Ml0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83YWE4MjllOGExOGU0YTBhODM5YzI1NjM4NDQ1OGIzNCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9jYjdlZTBiM2MxMDY0OTE2OGRhY2JmNmZhNWFiOWFiMiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wZGJiODcyZGExZGE0NDIxYWE2ZjRhM2U4OTM1MWEzOSA9ICQoJzxkaXYgaWQ9Imh0bWxfMGRiYjg3MmRhMWRhNDQyMWFhNmY0YTNlODkzNTFhMzkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPldpbmRzb3IgVGVycmFjZSwgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2NiN2VlMGIzYzEwNjQ5MTY4ZGFjYmY2ZmE1YWI5YWIyLnNldENvbnRlbnQoaHRtbF8wZGJiODcyZGExZGE0NDIxYWE2ZjRhM2U4OTM1MWEzOSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl83ZTc5OGJmODViY2I0YjQzYmJkZTM1ZDAzMzJmY2U0MS5iaW5kUG9wdXAocG9wdXBfY2I3ZWUwYjNjMTA2NDkxNjhkYWNiZjZmYTVhYjlhYjIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOGYwYWIwNzAzNTAyNGY1ZTk2ZGUwMDZhOWZjZWE0YjEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42NzY4MjIyNjIyNTQ3MjQsLTczLjk2NDg1OTI0MjYyNjldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfN2FhODI5ZThhMThlNGEwYTgzOWMyNTYzODQ0NThiMzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNTRhNjlmNDVhZjc1NDMzM2JjYzZlMmJlZjQ4OWQzMGUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMDM5MzE2NmRiOWMwNDIzNWEyYWMwMzMxYTYzMDU4MmMgPSAkKCc8ZGl2IGlkPSJodG1sXzAzOTMxNjZkYjljMDQyMzVhMmFjMDMzMWE2MzA1ODJjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Qcm9zcGVjdCBIZWlnaHRzLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNTRhNjlmNDVhZjc1NDMzM2JjYzZlMmJlZjQ4OWQzMGUuc2V0Q29udGVudChodG1sXzAzOTMxNjZkYjljMDQyMzVhMmFjMDMzMWE2MzA1ODJjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzhmMGFiMDcwMzUwMjRmNWU5NmRlMDA2YTlmY2VhNGIxLmJpbmRQb3B1cChwb3B1cF81NGE2OWY0NWFmNzU0MzMzYmNjNmUyYmVmNDg5ZDMwZSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85OWQ4NzU5Y2M1NmU0YWZkOGRlYmViZTNiMTNhYzc3MyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY2Mzk0OTk0MzM5NzU1LC03My45MTAyMzUzNjE3NjYwN10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83YWE4MjllOGExOGU0YTBhODM5YzI1NjM4NDQ1OGIzNCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lMDdmZTRmMTkzMDE0YzE0YTgzYzE5NmU4NzQ5NzNhOCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83YTFhNWRmNmExODA0ZjA5OTM4NWQ3YTRiN2IxYzUyNiA9ICQoJzxkaXYgaWQ9Imh0bWxfN2ExYTVkZjZhMTgwNGYwOTkzODVkN2E0YjdiMWM1MjYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkJyb3duc3ZpbGxlLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZTA3ZmU0ZjE5MzAxNGMxNGE4M2MxOTZlODc0OTczYTguc2V0Q29udGVudChodG1sXzdhMWE1ZGY2YTE4MDRmMDk5Mzg1ZDdhNGI3YjFjNTI2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzk5ZDg3NTljYzU2ZTRhZmQ4ZGViZWJlM2IxM2FjNzczLmJpbmRQb3B1cChwb3B1cF9lMDdmZTRmMTkzMDE0YzE0YTgzYzE5NmU4NzQ5NzNhOCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9iZGI3NmIxMDY1ZTY0ODM1OWU3ZjNlZTJjMWIxMTBkMSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjcwNzE0NDM5MzQ0MjUxLC03My45NTgxMTUyOTIyMDkyN10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83YWE4MjllOGExOGU0YTBhODM5YzI1NjM4NDQ1OGIzNCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9jMzMyOGUxMGZhMmY0ZjgzOTNiNzliY2NjNGYyMTgyZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kMjZmN2Y0MGVlMjA0ZDBmYjY5YTYyZGU5ZWI3NWFjOSA9ICQoJzxkaXYgaWQ9Imh0bWxfZDI2ZjdmNDBlZTIwNGQwZmI2OWE2MmRlOWViNzVhYzkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPldpbGxpYW1zYnVyZywgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2MzMzI4ZTEwZmEyZjRmODM5M2I3OWJjY2M0ZjIxODJkLnNldENvbnRlbnQoaHRtbF9kMjZmN2Y0MGVlMjA0ZDBmYjY5YTYyZGU5ZWI3NWFjOSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9iZGI3NmIxMDY1ZTY0ODM1OWU3ZjNlZTJjMWIxMTBkMS5iaW5kUG9wdXAocG9wdXBfYzMzMjhlMTBmYTJmNGY4MzkzYjc5YmNjYzRmMjE4MmQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMWM2NTk0MDdkZmQ5NGE3OGI4ZTAxM2FjNmI5ZjIxN2YgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42OTgxMTYxMTAxNzkwMSwtNzMuOTI1MjU3OTc0ODcwNDVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfN2FhODI5ZThhMThlNGEwYTgzOWMyNTYzODQ0NThiMzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMGQ0NjlhYWFmZWMxNDY4OTg1NDY1Njc3MDU1OWE2M2QgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZTlmYjdhNDYwMzk2NDc2ZTk3Y2JmZTRmMjRhMWIxNzUgPSAkKCc8ZGl2IGlkPSJodG1sX2U5ZmI3YTQ2MDM5NjQ3NmU5N2NiZmU0ZjI0YTFiMTc1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5CdXNod2ljaywgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzBkNDY5YWFhZmVjMTQ2ODk4NTQ2NTY3NzA1NTlhNjNkLnNldENvbnRlbnQoaHRtbF9lOWZiN2E0NjAzOTY0NzZlOTdjYmZlNGYyNGExYjE3NSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8xYzY1OTQwN2RmZDk0YTc4YjhlMDEzYWM2YjlmMjE3Zi5iaW5kUG9wdXAocG9wdXBfMGQ0NjlhYWFmZWMxNDY4OTg1NDY1Njc3MDU1OWE2M2QpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNDY0MWQ3MmFlNGNjNGY2Y2EwMGYzZjk1YTRmZTU5NWQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42ODcyMzE2MDc3MjA0NTYsLTczLjk0MTc4NDg4NjkwMjk3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzdhYTgyOWU4YTE4ZTRhMGE4MzljMjU2Mzg0NDU4YjM0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2MzZjQ5ZGM3YjJhZTQ3MDI4ZGRmNDA5MDRiM2JlMjQ0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzlkNzg4NTZiNmJkNzQ2MDJhNGYzNGU5ZjQwZTkxMzczID0gJCgnPGRpdiBpZD0iaHRtbF85ZDc4ODU2YjZiZDc0NjAyYTRmMzRlOWY0MGU5MTM3MyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QmVkZm9yZCBTdHV5dmVzYW50LCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYzNmNDlkYzdiMmFlNDcwMjhkZGY0MDkwNGIzYmUyNDQuc2V0Q29udGVudChodG1sXzlkNzg4NTZiNmJkNzQ2MDJhNGYzNGU5ZjQwZTkxMzczKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzQ2NDFkNzJhZTRjYzRmNmNhMDBmM2Y5NWE0ZmU1OTVkLmJpbmRQb3B1cChwb3B1cF9jM2Y0OWRjN2IyYWU0NzAyOGRkZjQwOTA0YjNiZTI0NCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jNWY5NTQyY2M3NzY0ZjNhYWRlNjRmNGUxMjIwYzRlMCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY5NTg2MzcyMjcyNDA4NCwtNzMuOTkzNzgyMjU0OTY0MjRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfN2FhODI5ZThhMThlNGEwYTgzOWMyNTYzODQ0NThiMzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfM2Y4MjMzOWU0OWFmNGFlZmI4Y2JjMTZhZjI2M2JhYTggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfODM4YjE3MGIwNzNkNDQ5NWFiMGE3ZjFkMGU1YzIwYjMgPSAkKCc8ZGl2IGlkPSJodG1sXzgzOGIxNzBiMDczZDQ0OTVhYjBhN2YxZDBlNWMyMGIzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Ccm9va2x5biBIZWlnaHRzLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfM2Y4MjMzOWU0OWFmNGFlZmI4Y2JjMTZhZjI2M2JhYTguc2V0Q29udGVudChodG1sXzgzOGIxNzBiMDczZDQ0OTVhYjBhN2YxZDBlNWMyMGIzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2M1Zjk1NDJjYzc3NjRmM2FhZGU2NGY0ZTEyMjBjNGUwLmJpbmRQb3B1cChwb3B1cF8zZjgyMzM5ZTQ5YWY0YWVmYjhjYmMxNmFmMjYzYmFhOCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85MDJlMzE3MDhmYmM0YTdiOGYzMDBkOTU3NzEyYzc4OSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY4NzkxOTcyMjQ4NTU3NCwtNzMuOTk4NTYxMzkyMTg0NjNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfN2FhODI5ZThhMThlNGEwYTgzOWMyNTYzODQ0NThiMzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNjFmYjFiY2E5ZGQxNDQ0NWIxMGYyODk2YWM4OTgxYTYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNmFiN2ZjMDRiNmFiNDk5ZjgyYWE3ZGViZTFmMmZkZTUgPSAkKCc8ZGl2IGlkPSJodG1sXzZhYjdmYzA0YjZhYjQ5OWY4MmFhN2RlYmUxZjJmZGU1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Db2JibGUgSGlsbCwgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzYxZmIxYmNhOWRkMTQ0NDViMTBmMjg5NmFjODk4MWE2LnNldENvbnRlbnQoaHRtbF82YWI3ZmMwNGI2YWI0OTlmODJhYTdkZWJlMWYyZmRlNSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl85MDJlMzE3MDhmYmM0YTdiOGYzMDBkOTU3NzEyYzc4OS5iaW5kUG9wdXAocG9wdXBfNjFmYjFiY2E5ZGQxNDQ0NWIxMGYyODk2YWM4OTgxYTYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfODVlNTAwYTNiNTk5NDkxN2I2NWM1MDVmMDEyNzZhYzEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42ODA1NDAyMzEwNzY0ODUsLTczLjk5NDY1MzcyODI4MDA2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzdhYTgyOWU4YTE4ZTRhMGE4MzljMjU2Mzg0NDU4YjM0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2YxZWIxZDAxMzk5YzRiYzViZmEzYWNhOTZjMGI3ZGU3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzhlNTM4Y2U0NWFhMTQ3ZjZhYjUwOGUwMGEwMTMxMTg1ID0gJCgnPGRpdiBpZD0iaHRtbF84ZTUzOGNlNDVhYTE0N2Y2YWI1MDhlMDBhMDEzMTE4NSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q2Fycm9sbCBHYXJkZW5zLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZjFlYjFkMDEzOTljNGJjNWJmYTNhY2E5NmMwYjdkZTcuc2V0Q29udGVudChodG1sXzhlNTM4Y2U0NWFhMTQ3ZjZhYjUwOGUwMGEwMTMxMTg1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzg1ZTUwMGEzYjU5OTQ5MTdiNjVjNTA1ZjAxMjc2YWMxLmJpbmRQb3B1cChwb3B1cF9mMWViMWQwMTM5OWM0YmM1YmZhM2FjYTk2YzBiN2RlNyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl82ZTYzYjc3OWMwNzI0OTgwOTI1ODE2M2Q1Nzg0MDFjOCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY3NjI1MzIzMDI1MDg4NiwtNzQuMDEyNzU4OTc0NzM1Nl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83YWE4MjllOGExOGU0YTBhODM5YzI1NjM4NDQ1OGIzNCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lZGUxZjVjY2FmMDQ0M2NjYjczYWZjY2I3ODdkMmI0NyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wMTgwYzM1ZGJmOWM0YTExOTM3MDQyNzU4YmQ0Y2ZlMSA9ICQoJzxkaXYgaWQ9Imh0bWxfMDE4MGMzNWRiZjljNGExMTkzNzA0Mjc1OGJkNGNmZTEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlJlZCBIb29rLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZWRlMWY1Y2NhZjA0NDNjY2I3M2FmY2NiNzg3ZDJiNDcuc2V0Q29udGVudChodG1sXzAxODBjMzVkYmY5YzRhMTE5MzcwNDI3NThiZDRjZmUxKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzZlNjNiNzc5YzA3MjQ5ODA5MjU4MTYzZDU3ODQwMWM4LmJpbmRQb3B1cChwb3B1cF9lZGUxZjVjY2FmMDQ0M2NjYjczYWZjY2I3ODdkMmI0Nyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl84ZjdlNjY0ZTNlMjY0YzE2OTg1ZTgyMDVkMDViMjNjNiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY3MzkzMTE0MzE4NzE1NCwtNzMuOTk0NDQwODcxNDUzMzldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfN2FhODI5ZThhMThlNGEwYTgzOWMyNTYzODQ0NThiMzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYzViZjFjMTIyYjI5NDc1NjhkZWM5Y2Y3M2M4ZmEzZWEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOWQ0YTg4ZTUwMGQyNDFhYmE5MmVhOTZkNWM5MDJiN2EgPSAkKCc8ZGl2IGlkPSJodG1sXzlkNGE4OGU1MDBkMjQxYWJhOTJlYTk2ZDVjOTAyYjdhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Hb3dhbnVzLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYzViZjFjMTIyYjI5NDc1NjhkZWM5Y2Y3M2M4ZmEzZWEuc2V0Q29udGVudChodG1sXzlkNGE4OGU1MDBkMjQxYWJhOTJlYTk2ZDVjOTAyYjdhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzhmN2U2NjRlM2UyNjRjMTY5ODVlODIwNWQwNWIyM2M2LmJpbmRQb3B1cChwb3B1cF9jNWJmMWMxMjJiMjk0NzU2OGRlYzljZjczYzhmYTNlYSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9iZWZjODRiOGY2MzU0YjgxODRiY2RmNjI3YzQ3OGU4OSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY4ODUyNzI2MDE4OTc3LC03My45NzI5MDU3NDM2OTA5Ml0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83YWE4MjllOGExOGU0YTBhODM5YzI1NjM4NDQ1OGIzNCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mOWNiNmVlOTFiODA0MmFhOGU3NmY5YzA2ZTFmZmNkYSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kODQ4NjhiMjhjZmI0M2I3ODM1NzBhYTAyYmVmOWQ0NyA9ICQoJzxkaXYgaWQ9Imh0bWxfZDg0ODY4YjI4Y2ZiNDNiNzgzNTcwYWEwMmJlZjlkNDciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkZvcnQgR3JlZW5lLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZjljYjZlZTkxYjgwNDJhYThlNzZmOWMwNmUxZmZjZGEuc2V0Q29udGVudChodG1sX2Q4NDg2OGIyOGNmYjQzYjc4MzU3MGFhMDJiZWY5ZDQ3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2JlZmM4NGI4ZjYzNTRiODE4NGJjZGY2MjdjNDc4ZTg5LmJpbmRQb3B1cChwb3B1cF9mOWNiNmVlOTFiODA0MmFhOGU3NmY5YzA2ZTFmZmNkYSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xNTkzMmIwOGE1ZjA0OWY5Yjg2MjJiZTgzODU2MDFiYyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY3MjMyMDUyMjY4MTk3LC03My45NzcwNTAzMDE4MzkyNF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83YWE4MjllOGExOGU0YTBhODM5YzI1NjM4NDQ1OGIzNCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hYTU4Y2QwYjNjY2U0NWZhYjQwYWIwMDFiNWQzZTViYSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mZDA3MDRlMzA2MjE0YjJjYjM1YzFmYjU0YjUzZmU2MCA9ICQoJzxkaXYgaWQ9Imh0bWxfZmQwNzA0ZTMwNjIxNGIyY2IzNWMxZmI1NGI1M2ZlNjAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlBhcmsgU2xvcGUsIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hYTU4Y2QwYjNjY2U0NWZhYjQwYWIwMDFiNWQzZTViYS5zZXRDb250ZW50KGh0bWxfZmQwNzA0ZTMwNjIxNGIyY2IzNWMxZmI1NGI1M2ZlNjApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMTU5MzJiMDhhNWYwNDlmOWI4NjIyYmU4Mzg1NjAxYmMuYmluZFBvcHVwKHBvcHVwX2FhNThjZDBiM2NjZTQ1ZmFiNDBhYjAwMWI1ZDNlNWJhKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzQxN2RhMDY0N2U1OTRkNDM4YTFhMjczOTNhNjcxMzY3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjgyMzkxMDExNDQyMTEsLTczLjg3NjYxNTk2NDU3Mjk2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzdhYTgyOWU4YTE4ZTRhMGE4MzljMjU2Mzg0NDU4YjM0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzY3MzUzZjEzNDgwNjQ1YTNhNTMzNGRkYjlmMDIxZWQ1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzI1ZDk2YTIxMGQyNjRmZjhhZWI0MmYxYjY3NTc3ZGRkID0gJCgnPGRpdiBpZD0iaHRtbF8yNWQ5NmEyMTBkMjY0ZmY4YWViNDJmMWI2NzU3N2RkZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q3lwcmVzcyBIaWxscywgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzY3MzUzZjEzNDgwNjQ1YTNhNTMzNGRkYjlmMDIxZWQ1LnNldENvbnRlbnQoaHRtbF8yNWQ5NmEyMTBkMjY0ZmY4YWViNDJmMWI2NzU3N2RkZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl80MTdkYTA2NDdlNTk0ZDQzOGExYTI3MzkzYTY3MTM2Ny5iaW5kUG9wdXAocG9wdXBfNjczNTNmMTM0ODA2NDVhM2E1MzM0ZGRiOWYwMjFlZDUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMGNmNmIyNmEwMTI2NDc1NWJjNWNmY2YwOWQ4M2Q5MzIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42Njk5MjU3MDA4NDcwNDUsLTczLjg4MDY5ODYzOTE3MzY2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzdhYTgyOWU4YTE4ZTRhMGE4MzljMjU2Mzg0NDU4YjM0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2JiMjMzY2JiNmZlYTRjYTRhYWE1Y2UxZGU3MjhlYWI5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzA5M2UzN2EwMjMzYTRiNjE5NzFmNzA4OGM1Yzk3MWQ3ID0gJCgnPGRpdiBpZD0iaHRtbF8wOTNlMzdhMDIzM2E0YjYxOTcxZjcwODhjNWM5NzFkNyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RWFzdCBOZXcgWW9yaywgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2JiMjMzY2JiNmZlYTRjYTRhYWE1Y2UxZGU3MjhlYWI5LnNldENvbnRlbnQoaHRtbF8wOTNlMzdhMDIzM2E0YjYxOTcxZjcwODhjNWM5NzFkNyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8wY2Y2YjI2YTAxMjY0NzU1YmM1Y2ZjZjA5ZDgzZDkzMi5iaW5kUG9wdXAocG9wdXBfYmIyMzNjYmI2ZmVhNGNhNGFhYTVjZTFkZTcyOGVhYjkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYmUxOGU2MDY5YmM4NDdhMzg1MzJlMTgzZjM0NmZjMTMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42NDc1ODkwNTIzMDg3NCwtNzMuODc5MzY5NzAwNDU4NzVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfN2FhODI5ZThhMThlNGEwYTgzOWMyNTYzODQ0NThiMzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNDY1MWYxMDQ4ZDQzNGU0ZTk2YTZjMTRjNTlkOGYyOTcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMGIxNjdiYmQyZmNlNGY5OGE5OGE1Mzc1MTU1ZjI3ZmQgPSAkKCc8ZGl2IGlkPSJodG1sXzBiMTY3YmJkMmZjZTRmOThhOThhNTM3NTE1NWYyN2ZkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5TdGFycmV0dCBDaXR5LCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNDY1MWYxMDQ4ZDQzNGU0ZTk2YTZjMTRjNTlkOGYyOTcuc2V0Q29udGVudChodG1sXzBiMTY3YmJkMmZjZTRmOThhOThhNTM3NTE1NWYyN2ZkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2JlMThlNjA2OWJjODQ3YTM4NTMyZTE4M2YzNDZmYzEzLmJpbmRQb3B1cChwb3B1cF80NjUxZjEwNDhkNDM0ZTRlOTZhNmMxNGM1OWQ4ZjI5Nyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jMTYxZTBlNGJlYzg0MWI1YWU0NWYyMGQ3ZjU0YzMzNyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjYzNTU2NDMyNzk3NDI4LC03My45MDIwOTI2OTc3ODk2Nl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83YWE4MjllOGExOGU0YTBhODM5YzI1NjM4NDQ1OGIzNCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lMTVhNGIyOThkZWM0YjEyOTM2MTIzYTk4ZWZhMGQxNyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wYTgwMjIyZWVmYzI0MjEyODk1ZmI3NWEwZWRiOWNkMiA9ICQoJzxkaXYgaWQ9Imh0bWxfMGE4MDIyMmVlZmMyNDIxMjg5NWZiNzVhMGVkYjljZDIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNhbmFyc2llLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZTE1YTRiMjk4ZGVjNGIxMjkzNjEyM2E5OGVmYTBkMTcuc2V0Q29udGVudChodG1sXzBhODAyMjJlZWZjMjQyMTI4OTVmYjc1YTBlZGI5Y2QyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2MxNjFlMGU0YmVjODQxYjVhZTQ1ZjIwZDdmNTRjMzM3LmJpbmRQb3B1cChwb3B1cF9lMTVhNGIyOThkZWM0YjEyOTM2MTIzYTk4ZWZhMGQxNyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jNjczMzQwNDBkZGI0Mzg5YjdjZDI3ZjhjNjcwY2JlYSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjYzMDQ0NjA0Mzc1NzQ2NiwtNzMuOTI5MTEzMDI2NDQ2NzRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfN2FhODI5ZThhMThlNGEwYTgzOWMyNTYzODQ0NThiMzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYTc4NTdhZDIwZGFmNDBhYmFhZDFkYTM5NzRlZTBhM2YgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYWVlNzg1Nzg4MzA1NDViNmI5YzlhYTYxZWVlODliNGMgPSAkKCc8ZGl2IGlkPSJodG1sX2FlZTc4NTc4ODMwNTQ1YjZiOWM5YWE2MWVlZTg5YjRjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5GbGF0bGFuZHMsIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hNzg1N2FkMjBkYWY0MGFiYWFkMWRhMzk3NGVlMGEzZi5zZXRDb250ZW50KGh0bWxfYWVlNzg1Nzg4MzA1NDViNmI5YzlhYTYxZWVlODliNGMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYzY3MzM0MDQwZGRiNDM4OWI3Y2QyN2Y4YzY3MGNiZWEuYmluZFBvcHVwKHBvcHVwX2E3ODU3YWQyMGRhZjQwYWJhYWQxZGEzOTc0ZWUwYTNmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzRhMTExNzUyZmJhMzQ5OWU4YmE5YmMyMzA0NDMwZDFmID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjA2MzM2NDIxNjg1NjI2LC03My45MDgxODU3MTc3NzQyM10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83YWE4MjllOGExOGU0YTBhODM5YzI1NjM4NDQ1OGIzNCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lM2QwZDE5ZjU0MTk0YjFkYTljYzBiZTk1MjQxZmYwOCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83ZjJjNTE4Zjk1OGI0YTI0YWVhYTU5MjZiNmFkOTk3YyA9ICQoJzxkaXYgaWQ9Imh0bWxfN2YyYzUxOGY5NThiNGEyNGFlYWE1OTI2YjZhZDk5N2MiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk1pbGwgSXNsYW5kLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZTNkMGQxOWY1NDE5NGIxZGE5Y2MwYmU5NTI0MWZmMDguc2V0Q29udGVudChodG1sXzdmMmM1MThmOTU4YjRhMjRhZWFhNTkyNmI2YWQ5OTdjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzRhMTExNzUyZmJhMzQ5OWU4YmE5YmMyMzA0NDMwZDFmLmJpbmRQb3B1cChwb3B1cF9lM2QwZDE5ZjU0MTk0YjFkYTljYzBiZTk1MjQxZmYwOCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8yNzI2YzU0YjI0Yjk0ZTMzOWQ4ZWJiNzc2NDJiNjVjZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjU3NzkxMzUwMzA4NjU3LC03My45NDM1MzcyMjg5MTg4Nl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83YWE4MjllOGExOGU0YTBhODM5YzI1NjM4NDQ1OGIzNCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hMTdkYjY2ZjFlZDg0ZTliYmQ4ODEwNzI3YzU3MDBjNiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF80YWQ4ZDliY2Q1YmI0MjYyYjMyYWZkZDAyYWVhNjcwNiA9ICQoJzxkaXYgaWQ9Imh0bWxfNGFkOGQ5YmNkNWJiNDI2MmIzMmFmZGQwMmFlYTY3MDYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk1hbmhhdHRhbiBCZWFjaCwgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2ExN2RiNjZmMWVkODRlOWJiZDg4MTA3MjdjNTcwMGM2LnNldENvbnRlbnQoaHRtbF80YWQ4ZDliY2Q1YmI0MjYyYjMyYWZkZDAyYWVhNjcwNik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8yNzI2YzU0YjI0Yjk0ZTMzOWQ4ZWJiNzc2NDJiNjVjZS5iaW5kUG9wdXAocG9wdXBfYTE3ZGI2NmYxZWQ4NGU5YmJkODgxMDcyN2M1NzAwYzYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYzFjYjYzOGM1YjkzNGE2MjllMDlkYTExYWM5Njc5MTkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC41NzQyOTI1NjQ3MTYwMSwtNzMuOTg4NjgyOTU4MjE2MzddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfN2FhODI5ZThhMThlNGEwYTgzOWMyNTYzODQ0NThiMzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZDJhYjU0MjYyOTU3NDVhZTg5ZmE4NDc1YTk2ODBmM2IgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYTg0OWM1ZDdjZWNlNGUzYjljNTI1NjEzNjNlZTI3NmUgPSAkKCc8ZGl2IGlkPSJodG1sX2E4NDljNWQ3Y2VjZTRlM2I5YzUyNTYxMzYzZWUyNzZlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Db25leSBJc2xhbmQsIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kMmFiNTQyNjI5NTc0NWFlODlmYTg0NzVhOTY4MGYzYi5zZXRDb250ZW50KGh0bWxfYTg0OWM1ZDdjZWNlNGUzYjljNTI1NjEzNjNlZTI3NmUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYzFjYjYzOGM1YjkzNGE2MjllMDlkYTExYWM5Njc5MTkuYmluZFBvcHVwKHBvcHVwX2QyYWI1NDI2Mjk1NzQ1YWU4OWZhODQ3NWE5NjgwZjNiKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzI0ZWNmOGZmZTM2NTQwYzg4MzI1YTA0Nzk5MmJhM2Y0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTk5NTE4NzAyODIyMzgsLTczLjk5ODc1MjIxNDQzNTE5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzdhYTgyOWU4YTE4ZTRhMGE4MzljMjU2Mzg0NDU4YjM0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzJjNzg0ZmMwZDBiZTRlZmVhM2NhZDBjNzdhYWRiOGJhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2IxNjI2ZTBmYjAwNDQxZDk5MDM3YzMwYTU2MWI5YWQyID0gJCgnPGRpdiBpZD0iaHRtbF9iMTYyNmUwZmIwMDQ0MWQ5OTAzN2MzMGE1NjFiOWFkMiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QmF0aCBCZWFjaCwgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzJjNzg0ZmMwZDBiZTRlZmVhM2NhZDBjNzdhYWRiOGJhLnNldENvbnRlbnQoaHRtbF9iMTYyNmUwZmIwMDQ0MWQ5OTAzN2MzMGE1NjFiOWFkMik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8yNGVjZjhmZmUzNjU0MGM4ODMyNWEwNDc5OTJiYTNmNC5iaW5kUG9wdXAocG9wdXBfMmM3ODRmYzBkMGJlNGVmZWEzY2FkMGM3N2FhZGI4YmEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMDQ1OTVjYjA3NmIzNDczN2IyMmI0M2Y1NjQ5NDI0OWYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42MzMxMzA1MTI3NTgwMTUsLTczLjk5MDQ5ODIzMDQ0ODExXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzdhYTgyOWU4YTE4ZTRhMGE4MzljMjU2Mzg0NDU4YjM0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzkxNjU2OWU3NzMzMTQ1OTJiNDgwOGYyMWNhMzBmYzMxID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzNhNjZmNGQ2NTMzNTRkMDU5YzAxZTBmZWQ2NDE3NGY2ID0gJCgnPGRpdiBpZD0iaHRtbF8zYTY2ZjRkNjUzMzU0ZDA1OWMwMWUwZmVkNjQxNzRmNiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Qm9yb3VnaCBQYXJrLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOTE2NTY5ZTc3MzMxNDU5MmI0ODA4ZjIxY2EzMGZjMzEuc2V0Q29udGVudChodG1sXzNhNjZmNGQ2NTMzNTRkMDU5YzAxZTBmZWQ2NDE3NGY2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzA0NTk1Y2IwNzZiMzQ3MzdiMjJiNDNmNTY0OTQyNDlmLmJpbmRQb3B1cChwb3B1cF85MTY1NjllNzczMzE0NTkyYjQ4MDhmMjFjYTMwZmMzMSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lNTFiNGRiMWIzMDk0NzUxODFiNjY2NzlkNTY3NDIxMSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjYxOTIxOTQ1NzcyMjYzNiwtNzQuMDE5MzEzNzU2MzYwMjJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfN2FhODI5ZThhMThlNGEwYTgzOWMyNTYzODQ0NThiMzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYTI1ZjRhNzk1MTBjNDUzYmEzN2NkZjczY2JiMGM0ZTcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZjljZDY5N2U3MmZmNGE1Yjk1YzRmNTBhOThjNWU3MWEgPSAkKCc8ZGl2IGlkPSJodG1sX2Y5Y2Q2OTdlNzJmZjRhNWI5NWM0ZjUwYTk4YzVlNzFhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5EeWtlciBIZWlnaHRzLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYTI1ZjRhNzk1MTBjNDUzYmEzN2NkZjczY2JiMGM0ZTcuc2V0Q29udGVudChodG1sX2Y5Y2Q2OTdlNzJmZjRhNWI5NWM0ZjUwYTk4YzVlNzFhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2U1MWI0ZGIxYjMwOTQ3NTE4MWI2NjY3OWQ1Njc0MjExLmJpbmRQb3B1cChwb3B1cF9hMjVmNGE3OTUxMGM0NTNiYTM3Y2RmNzNjYmIwYzRlNyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lMzk0N2U5MDdkMWE0OWE5OTAyM2QzNWMwZGNkN2Q5MCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjU5MDg0ODQzMzkwMjA0NiwtNzMuOTMwMTAxNzA2OTExOTZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfN2FhODI5ZThhMThlNGEwYTgzOWMyNTYzODQ0NThiMzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMWUzMThjYTJiZDQ3NDI3MmFmNjRiOGJiMDdlOWU2ZjcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMWNjMmE1NWQ2OWI1NDZlYTlmMmU1ZjUyNDgzYjBjMTggPSAkKCc8ZGl2IGlkPSJodG1sXzFjYzJhNTVkNjliNTQ2ZWE5ZjJlNWY1MjQ4M2IwYzE4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5HZXJyaXRzZW4gQmVhY2gsIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xZTMxOGNhMmJkNDc0MjcyYWY2NGI4YmIwN2U5ZTZmNy5zZXRDb250ZW50KGh0bWxfMWNjMmE1NWQ2OWI1NDZlYTlmMmU1ZjUyNDgzYjBjMTgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZTM5NDdlOTA3ZDFhNDlhOTkwMjNkMzVjMGRjZDdkOTAuYmluZFBvcHVwKHBvcHVwXzFlMzE4Y2EyYmQ0NzQyNzJhZjY0YjhiYjA3ZTllNmY3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2FmNmJlYzdiOWZhYjQ2OWI5ZjhmOWU5NTFiMGQwYzM2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjA5NzQ3Nzc5ODk0NjA0LC03My45MzEzNDQwNDEwODQ5N10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83YWE4MjllOGExOGU0YTBhODM5YzI1NjM4NDQ1OGIzNCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hYWQ4MWU1YjcwZWY0ZTY3ODY1MzkwNDg5MTM1YjRiZSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8yMTZiZTAwOTFiYTA0ZWZjODBlOTI2N2UwMTE1ZmVlMCA9ICQoJzxkaXYgaWQ9Imh0bWxfMjE2YmUwMDkxYmEwNGVmYzgwZTkyNjdlMDExNWZlZTAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk1hcmluZSBQYXJrLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYWFkODFlNWI3MGVmNGU2Nzg2NTM5MDQ4OTEzNWI0YmUuc2V0Q29udGVudChodG1sXzIxNmJlMDA5MWJhMDRlZmM4MGU5MjY3ZTAxMTVmZWUwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2FmNmJlYzdiOWZhYjQ2OWI5ZjhmOWU5NTFiMGQwYzM2LmJpbmRQb3B1cChwb3B1cF9hYWQ4MWU1YjcwZWY0ZTY3ODY1MzkwNDg5MTM1YjRiZSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9iZTUwNjVlYzc1ZGY0OTcxYjk4Y2FjZjc5NGRkZTY5NyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY5MzIyOTQyMTg4MTUwNCwtNzMuOTY3ODQzMDYyMTYzNjddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfN2FhODI5ZThhMThlNGEwYTgzOWMyNTYzODQ0NThiMzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYzQxMTc2MTAxNDIxNDlkMGI3MGFiZTlmNjM5MWZiZjEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOTliZWMyZmY4MzhkNGMyZjk1MWI2Yjk0YTI4ZjBlYTYgPSAkKCc8ZGl2IGlkPSJodG1sXzk5YmVjMmZmODM4ZDRjMmY5NTFiNmI5NGEyOGYwZWE2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DbGludG9uIEhpbGwsIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jNDExNzYxMDE0MjE0OWQwYjcwYWJlOWY2MzkxZmJmMS5zZXRDb250ZW50KGh0bWxfOTliZWMyZmY4MzhkNGMyZjk1MWI2Yjk0YTI4ZjBlYTYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYmU1MDY1ZWM3NWRmNDk3MWI5OGNhY2Y3OTRkZGU2OTcuYmluZFBvcHVwKHBvcHVwX2M0MTE3NjEwMTQyMTQ5ZDBiNzBhYmU5ZjYzOTFmYmYxKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2VjYWIyODBlNzg0YTQyNzJhOWNiNmRhNDgyYTRjZjFhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTc2Mzc1Mzc4OTAyMjQsLTc0LjAwNzg3MzExMjAwMjRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfN2FhODI5ZThhMThlNGEwYTgzOWMyNTYzODQ0NThiMzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMzVlYmI2NWE1ODRiNDFiZmFjNTIwYWNiMGUzMTBiYjkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNDE3YzYxZTY3NDU3NDUxNWJjNDdhOGZjYjUwYWY5N2IgPSAkKCc8ZGl2IGlkPSJodG1sXzQxN2M2MWU2NzQ1NzQ1MTViYzQ3YThmY2I1MGFmOTdiIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5TZWEgR2F0ZSwgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzM1ZWJiNjVhNTg0YjQxYmZhYzUyMGFjYjBlMzEwYmI5LnNldENvbnRlbnQoaHRtbF80MTdjNjFlNjc0NTc0NTE1YmM0N2E4ZmNiNTBhZjk3Yik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9lY2FiMjgwZTc4NGE0MjcyYTljYjZkYTQ4MmE0Y2YxYS5iaW5kUG9wdXAocG9wdXBfMzVlYmI2NWE1ODRiNDFiZmFjNTIwYWNiMGUzMTBiYjkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfODEwMjk1ZGY1ZmY5NDQ1ZGEwNTM0MmJiNWE0NTUwYTYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42OTA4NDQwMjEwOTgwMiwtNzMuOTgzNDYzMzc0MzEwOTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfN2FhODI5ZThhMThlNGEwYTgzOWMyNTYzODQ0NThiMzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNTdkYmUxYzRhYjVhNDgzODkzNWQxZmZkNjdmYjcyZWEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNjNhOGI1N2UzOWJhNGE4YWI2YzNkNmY4YTYwN2EyNTMgPSAkKCc8ZGl2IGlkPSJodG1sXzYzYThiNTdlMzliYTRhOGFiNmMzZDZmOGE2MDdhMjUzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Eb3dudG93biwgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzU3ZGJlMWM0YWI1YTQ4Mzg5MzVkMWZmZDY3ZmI3MmVhLnNldENvbnRlbnQoaHRtbF82M2E4YjU3ZTM5YmE0YThhYjZjM2Q2ZjhhNjA3YTI1Myk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl84MTAyOTVkZjVmZjk0NDVkYTA1MzQyYmI1YTQ1NTBhNi5iaW5kUG9wdXAocG9wdXBfNTdkYmUxYzRhYjVhNDgzODkzNWQxZmZkNjdmYjcyZWEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfY2NkMDdlNzc5YzY4NGEwZGI0Mzk4MTdiMDFlMzdiYmIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42ODU2ODI5MTIwOTE0NDQsLTczLjk4Mzc0ODI0MTE1Nzk4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzdhYTgyOWU4YTE4ZTRhMGE4MzljMjU2Mzg0NDU4YjM0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzAwN2RhMmYwOTUyNTQ1MDFiYzI1ZWUwZmQ5YmVlMmQ1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzJjMmZhZDk1ZDI2NzRmZTQ5NTA1ZWUwMTIxMWVmZWI3ID0gJCgnPGRpdiBpZD0iaHRtbF8yYzJmYWQ5NWQyNjc0ZmU0OTUwNWVlMDEyMTFlZmViNyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Qm9lcnVtIEhpbGwsIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wMDdkYTJmMDk1MjU0NTAxYmMyNWVlMGZkOWJlZTJkNS5zZXRDb250ZW50KGh0bWxfMmMyZmFkOTVkMjY3NGZlNDk1MDVlZTAxMjExZWZlYjcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfY2NkMDdlNzc5YzY4NGEwZGI0Mzk4MTdiMDFlMzdiYmIuYmluZFBvcHVwKHBvcHVwXzAwN2RhMmYwOTUyNTQ1MDFiYzI1ZWUwZmQ5YmVlMmQ1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2NkNGY5ZTUxNTJlMTQ1MDc5ZDg1MzQ4Y2FkOTJkZTE3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjU4NDIwMDE3NDY5ODE1LC03My45NTQ4OTg2NzA3NzcxM10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83YWE4MjllOGExOGU0YTBhODM5YzI1NjM4NDQ1OGIzNCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xZDZhYmQ0NWJkYTA0MWZkODAyNWU2ZGNlZWY1YzViZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jYjU3MDdmOWY3MGY0OTNhYTlmNTg4YzYwODZhNWM1OCA9ICQoJzxkaXYgaWQ9Imh0bWxfY2I1NzA3ZjlmNzBmNDkzYWE5ZjU4OGM2MDg2YTVjNTgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlByb3NwZWN0IExlZmZlcnRzIEdhcmRlbnMsIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xZDZhYmQ0NWJkYTA0MWZkODAyNWU2ZGNlZWY1YzViZC5zZXRDb250ZW50KGh0bWxfY2I1NzA3ZjlmNzBmNDkzYWE5ZjU4OGM2MDg2YTVjNTgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfY2Q0ZjllNTE1MmUxNDUwNzlkODUzNDhjYWQ5MmRlMTcuYmluZFBvcHVwKHBvcHVwXzFkNmFiZDQ1YmRhMDQxZmQ4MDI1ZTZkY2VlZjVjNWJkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2Q2ZDFjZjU2NWU1MDQzNDA5N2E4YTk2ZmViNGUwYWY5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjc4NDAyNTU0Nzk1MzU1LC03My45MTMwNjgzMTc4NzM5NV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83YWE4MjllOGExOGU0YTBhODM5YzI1NjM4NDQ1OGIzNCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lZWY1YmQyOTNjOWU0ZmNjYWQwZmNhNzc4ZThkYTA1ZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hZmI5YTI1ZWI5M2I0N2QzYmZmZjZlMGVlYzM5YTg2YyA9ICQoJzxkaXYgaWQ9Imh0bWxfYWZiOWEyNWViOTNiNDdkM2JmZmY2ZTBlZWMzOWE4NmMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk9jZWFuIEhpbGwsIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lZWY1YmQyOTNjOWU0ZmNjYWQwZmNhNzc4ZThkYTA1Zi5zZXRDb250ZW50KGh0bWxfYWZiOWEyNWViOTNiNDdkM2JmZmY2ZTBlZWMzOWE4NmMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZDZkMWNmNTY1ZTUwNDM0MDk3YThhOTZmZWI0ZTBhZjkuYmluZFBvcHVwKHBvcHVwX2VlZjViZDI5M2M5ZTRmY2NhZDBmY2E3NzhlOGRhMDVmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzE3NDc3YjI4OGFiNzQ0MTRiNTY0OTUwMjRiZGQ4MDU2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjc4NTY5OTU3Mjc0NzksLTczLjg2Nzk3NTk4MDgxMzM0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzdhYTgyOWU4YTE4ZTRhMGE4MzljMjU2Mzg0NDU4YjM0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2JlM2NhYmZiMDVlMTQwMzY5NzAwZGEyZTY1M2U5NGNmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzFmMWJjNGU5M2YzYzRjMTdhMGRjYzE4OTIxMGE5M2E3ID0gJCgnPGRpdiBpZD0iaHRtbF8xZjFiYzRlOTNmM2M0YzE3YTBkY2MxODkyMTBhOTNhNyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q2l0eSBMaW5lLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYmUzY2FiZmIwNWUxNDAzNjk3MDBkYTJlNjUzZTk0Y2Yuc2V0Q29udGVudChodG1sXzFmMWJjNGU5M2YzYzRjMTdhMGRjYzE4OTIxMGE5M2E3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzE3NDc3YjI4OGFiNzQ0MTRiNTY0OTUwMjRiZGQ4MDU2LmJpbmRQb3B1cChwb3B1cF9iZTNjYWJmYjA1ZTE0MDM2OTcwMGRhMmU2NTNlOTRjZik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xZGJjZmJjYWEyZDc0MTNkYmM0MWQ0MTlkNDYxZDM5NCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjYxNTE0OTU1MDQ1MzA4LC03My44OTg1NTYzMzYzMDMxN10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83YWE4MjllOGExOGU0YTBhODM5YzI1NjM4NDQ1OGIzNCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85MzYwYTczYzc5YzQ0NTZiOTJlNTUyN2RlNTkyNjEzYSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF84YjJjZGM2ZDZjMGM0YzdhODMwNTIzZWUwYTVhMWVmZiA9ICQoJzxkaXYgaWQ9Imh0bWxfOGIyY2RjNmQ2YzBjNGM3YTgzMDUyM2VlMGE1YTFlZmYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkJlcmdlbiBCZWFjaCwgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzkzNjBhNzNjNzljNDQ1NmI5MmU1NTI3ZGU1OTI2MTNhLnNldENvbnRlbnQoaHRtbF84YjJjZGM2ZDZjMGM0YzdhODMwNTIzZWUwYTVhMWVmZik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8xZGJjZmJjYWEyZDc0MTNkYmM0MWQ0MTlkNDYxZDM5NC5iaW5kUG9wdXAocG9wdXBfOTM2MGE3M2M3OWM0NDU2YjkyZTU1MjdkZTU5MjYxM2EpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZjYyNGY0Yzk4Mjg2NDdmZTg1MDc1NDNjNmRhMTU0NjcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42MjU1OTU4OTg2OTg0MywtNzMuOTU3NTk1MjM0ODk4MzhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfN2FhODI5ZThhMThlNGEwYTgzOWMyNTYzODQ0NThiMzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZmNiMWI4N2Q2OGIyNDI0N2E3Y2UwZmEyNDFlODEyYjYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMDZmODA3NTJjZmFjNDQ4NDgzY2UxNTIzYThhYjcwYTkgPSAkKCc8ZGl2IGlkPSJodG1sXzA2ZjgwNzUyY2ZhYzQ0ODQ4M2NlMTUyM2E4YWI3MGE5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NaWR3b29kLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZmNiMWI4N2Q2OGIyNDI0N2E3Y2UwZmEyNDFlODEyYjYuc2V0Q29udGVudChodG1sXzA2ZjgwNzUyY2ZhYzQ0ODQ4M2NlMTUyM2E4YWI3MGE5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2Y2MjRmNGM5ODI4NjQ3ZmU4NTA3NTQzYzZkYTE1NDY3LmJpbmRQb3B1cChwb3B1cF9mY2IxYjg3ZDY4YjI0MjQ3YTdjZTBmYTI0MWU4MTJiNik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9hNGQ5Zjg1MjYwNWY0NzA4YjdkYWJhZTUxMTRhN2U3YSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY0NzAwODYwMzE4NTE4NSwtNzMuOTYyNjEzMTY3MTYwNDhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfN2FhODI5ZThhMThlNGEwYTgzOWMyNTYzODQ0NThiMzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMmU4Njk2NTMxY2ZlNGFiZTk0YzE3YjcyZTBhYTk1N2QgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfY2Q5ODkyYWQ2MTgwNGRlYmExM2JhNTJjMzAyODhlMjUgPSAkKCc8ZGl2IGlkPSJodG1sX2NkOTg5MmFkNjE4MDRkZWJhMTNiYTUyYzMwMjg4ZTI1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Qcm9zcGVjdCBQYXJrIFNvdXRoLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMmU4Njk2NTMxY2ZlNGFiZTk0YzE3YjcyZTBhYTk1N2Quc2V0Q29udGVudChodG1sX2NkOTg5MmFkNjE4MDRkZWJhMTNiYTUyYzMwMjg4ZTI1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2E0ZDlmODUyNjA1ZjQ3MDhiN2RhYmFlNTExNGE3ZTdhLmJpbmRQb3B1cChwb3B1cF8yZTg2OTY1MzFjZmU0YWJlOTRjMTdiNzJlMGFhOTU3ZCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85ZTI5N2RjNzQyMjc0YjIxYTgyZDk2YzU3MmQ0N2JhOSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjYyMzg0NTI0NDc4NDE5LC03My45MTYwNzQ4Mzk1MTMyNF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83YWE4MjllOGExOGU0YTBhODM5YzI1NjM4NDQ1OGIzNCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82MjRhZjY4ZDExNjM0MzlmYjhiNzA4MjI3ZWJjODFiOCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jOWEyZTY3ZmViNGU0ZTQ1ODU1YTlmOWY5NmVmNzBiOCA9ICQoJzxkaXYgaWQ9Imh0bWxfYzlhMmU2N2ZlYjRlNGU0NTg1NWE5ZjlmOTZlZjcwYjgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkdlb3JnZXRvd24sIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82MjRhZjY4ZDExNjM0MzlmYjhiNzA4MjI3ZWJjODFiOC5zZXRDb250ZW50KGh0bWxfYzlhMmU2N2ZlYjRlNGU0NTg1NWE5ZjlmOTZlZjcwYjgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOWUyOTdkYzc0MjI3NGIyMWE4MmQ5NmM1NzJkNDdiYTkuYmluZFBvcHVwKHBvcHVwXzYyNGFmNjhkMTE2MzQzOWZiOGI3MDgyMjdlYmM4MWI4KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2M2MTIwZWJiMTYyZjRmZjBiZDc4ODM1ZGNlMGY4YmNiID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzA4NDkyNDEwNDE1NDgsLTczLjkzODg1ODE1MjY5MTk1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzdhYTgyOWU4YTE4ZTRhMGE4MzljMjU2Mzg0NDU4YjM0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzA4MzJmOTg4Zjg3YzQ4NDBhZWJhYTdlY2U0OTgzZGQ1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzA2YmI3MzYwNjgwZjQzYjQ5YmJhYzU2MTIyZjY0NTFmID0gJCgnPGRpdiBpZD0iaHRtbF8wNmJiNzM2MDY4MGY0M2I0OWJiYWM1NjEyMmY2NDUxZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RWFzdCBXaWxsaWFtc2J1cmcsIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wODMyZjk4OGY4N2M0ODQwYWViYWE3ZWNlNDk4M2RkNS5zZXRDb250ZW50KGh0bWxfMDZiYjczNjA2ODBmNDNiNDliYmFjNTYxMjJmNjQ1MWYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYzYxMjBlYmIxNjJmNGZmMGJkNzg4MzVkY2UwZjhiY2IuYmluZFBvcHVwKHBvcHVwXzA4MzJmOTg4Zjg3YzQ4NDBhZWJhYTdlY2U0OTgzZGQ1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzFhNmQ4YWYxNWQ2YTQxMDNiNmRkZTM4OWE1ZDBmNTcwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzE0ODIyOTA2NTMyMDE0LC03My45NTg4MDg1NzU4NzU4Ml0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83YWE4MjllOGExOGU0YTBhODM5YzI1NjM4NDQ1OGIzNCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iMjVkY2I4YmNiYmE0ZjE4OGQ3YWE3MmNmMjM3NDIyNiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jYTJkNTAzNmRhZGY0M2YzODM4MzYzZmUxMjAxNmZhNyA9ICQoJzxkaXYgaWQ9Imh0bWxfY2EyZDUwMzZkYWRmNDNmMzgzODM2M2ZlMTIwMTZmYTciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk5vcnRoIFNpZGUsIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iMjVkY2I4YmNiYmE0ZjE4OGQ3YWE3MmNmMjM3NDIyNi5zZXRDb250ZW50KGh0bWxfY2EyZDUwMzZkYWRmNDNmMzgzODM2M2ZlMTIwMTZmYTcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMWE2ZDhhZjE1ZDZhNDEwM2I2ZGRlMzg5YTVkMGY1NzAuYmluZFBvcHVwKHBvcHVwX2IyNWRjYjhiY2JiYTRmMTg4ZDdhYTcyY2YyMzc0MjI2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2ZiMGMxMTE4NTMxZTRkNzViMDc4NWEzMGNjZDI5NTFjID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzEwODYxNDcyNjUwNjQsLTczLjk1ODAwMDk1MTUzMzMxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzdhYTgyOWU4YTE4ZTRhMGE4MzljMjU2Mzg0NDU4YjM0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzJlNTJlMDQzNmJkNDQ0ZjU5ODY0MDkxNTAwMDcyY2MxID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2U2Y2MwNDBmOGE1NzRkOTg5NTM4YzU1MmE5OTdhYWE4ID0gJCgnPGRpdiBpZD0iaHRtbF9lNmNjMDQwZjhhNTc0ZDk4OTUzOGM1NTJhOTk3YWFhOCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U291dGggU2lkZSwgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzJlNTJlMDQzNmJkNDQ0ZjU5ODY0MDkxNTAwMDcyY2MxLnNldENvbnRlbnQoaHRtbF9lNmNjMDQwZjhhNTc0ZDk4OTUzOGM1NTJhOTk3YWFhOCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9mYjBjMTExODUzMWU0ZDc1YjA3ODVhMzBjY2QyOTUxYy5iaW5kUG9wdXAocG9wdXBfMmU1MmUwNDM2YmQ0NDRmNTk4NjQwOTE1MDAwNzJjYzEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOGJkOGJhYTlkNGNlNGQ1YmJiZGIzOTU1OTZiNmUxZGMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42MTMwNTk3NjY2Nzk0MiwtNzMuOTY4MzY2NzgwMzU1NDFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfN2FhODI5ZThhMThlNGEwYTgzOWMyNTYzODQ0NThiMzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMDQzNThlNDA0MzhjNDJkZmE1NzRiNzViZGQxMWM0OTEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfN2VkNDQ1MzkxOTkxNDgwNjliMWNhMGRjYTEyNGE3MDEgPSAkKCc8ZGl2IGlkPSJodG1sXzdlZDQ0NTM5MTk5MTQ4MDY5YjFjYTBkY2ExMjRhNzAxIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5PY2VhbiBQYXJrd2F5LCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMDQzNThlNDA0MzhjNDJkZmE1NzRiNzViZGQxMWM0OTEuc2V0Q29udGVudChodG1sXzdlZDQ0NTM5MTk5MTQ4MDY5YjFjYTBkY2ExMjRhNzAxKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzhiZDhiYWE5ZDRjZTRkNWJiYmRiMzk1NTk2YjZlMWRjLmJpbmRQb3B1cChwb3B1cF8wNDM1OGU0MDQzOGM0MmRmYTU3NGI3NWJkZDExYzQ5MSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lNmJiZjRkM2ZlN2E0M2ViODJkZTFjYWM5YTRlMzExMyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjYxNDc2ODEyNjk0MjI2LC03NC4wMzE5NzkxNDUzNzk4NF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83YWE4MjllOGExOGU0YTBhODM5YzI1NjM4NDQ1OGIzNCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF84ZjE4ZDU0YTE2YTA0Y2VmYTJlMDdmZTZiNzk2YTRhZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83NTE1ZGI5OTJiMzQ0MjkwOGUyZjQ2ZGMzMWIyOTBlZSA9ICQoJzxkaXYgaWQ9Imh0bWxfNzUxNWRiOTkyYjM0NDI5MDhlMmY0NmRjMzFiMjkwZWUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkZvcnQgSGFtaWx0b24sIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84ZjE4ZDU0YTE2YTA0Y2VmYTJlMDdmZTZiNzk2YTRhZC5zZXRDb250ZW50KGh0bWxfNzUxNWRiOTkyYjM0NDI5MDhlMmY0NmRjMzFiMjkwZWUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZTZiYmY0ZDNmZTdhNDNlYjgyZGUxY2FjOWE0ZTMxMTMuYmluZFBvcHVwKHBvcHVwXzhmMThkNTRhMTZhMDRjZWZhMmUwN2ZlNmI3OTZhNGFkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzc3ODgwZTU4ZjBiZTQ3ZTM5ZWQ2YjVmYzIxNzk0ZTQyID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzE1NjE4NDIyMzE0MzIsLTczLjk5NDI3OTM2MjU1OTc4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzdhYTgyOWU4YTE4ZTRhMGE4MzljMjU2Mzg0NDU4YjM0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzNhMTA1ZDA3ZjlmMTQ1MzBiNTY0YTAwMDQyZjQxMmM4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzU3ZTJkZDdjNjVjYzRlNTM4NzEyNDFjYjY4ZDVjOGEzID0gJCgnPGRpdiBpZD0iaHRtbF81N2UyZGQ3YzY1Y2M0ZTUzODcxMjQxY2I2OGQ1YzhhMyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q2hpbmF0b3duLCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzNhMTA1ZDA3ZjlmMTQ1MzBiNTY0YTAwMDQyZjQxMmM4LnNldENvbnRlbnQoaHRtbF81N2UyZGQ3YzY1Y2M0ZTUzODcxMjQxY2I2OGQ1YzhhMyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl83Nzg4MGU1OGYwYmU0N2UzOWVkNmI1ZmMyMTc5NGU0Mi5iaW5kUG9wdXAocG9wdXBfM2ExMDVkMDdmOWYxNDUzMGI1NjRhMDAwNDJmNDEyYzgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNGQ3OTk2N2MwNDZiNDNlZWE1ZWNiZmFmYTU3Yzc4YTYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44NTE5MDI1MjU1NTMwNSwtNzMuOTM2OTAwMjc5ODUyMzRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfN2FhODI5ZThhMThlNGEwYTgzOWMyNTYzODQ0NThiMzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYjUxYjBjY2I5MWUxNDgxNTgzZTE2MzkwZTIxYWZhNTAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNmRiZWUwNWUzZGI5NGQzOTkwNjE0NTM3MGRmMzU3MWMgPSAkKCc8ZGl2IGlkPSJodG1sXzZkYmVlMDVlM2RiOTRkMzk5MDYxNDUzNzBkZjM1NzFjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5XYXNoaW5ndG9uIEhlaWdodHMsIE1hbmhhdHRhbjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYjUxYjBjY2I5MWUxNDgxNTgzZTE2MzkwZTIxYWZhNTAuc2V0Q29udGVudChodG1sXzZkYmVlMDVlM2RiOTRkMzk5MDYxNDUzNzBkZjM1NzFjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzRkNzk5NjdjMDQ2YjQzZWVhNWVjYmZhZmE1N2M3OGE2LmJpbmRQb3B1cChwb3B1cF9iNTFiMGNjYjkxZTE0ODE1ODNlMTYzOTBlMjFhZmE1MCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl82MmVlZThiN2U4Yzk0YzhjOGQ1Yjc5YzIyMDdiNzJhZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjg2NzY4Mzk2NDQ5OTE1LC03My45MjEyMTA0MjIwMzg5N10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83YWE4MjllOGExOGU0YTBhODM5YzI1NjM4NDQ1OGIzNCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wODY2MDExZjE0NjY0MmNkOGMzOGEwNDVmODg4N2E1YyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83NzE1ZWZlY2I1NTM0NjFhOTg1MDMzNjYzNzEzNDdiMCA9ICQoJzxkaXYgaWQ9Imh0bWxfNzcxNWVmZWNiNTUzNDYxYTk4NTAzMzY2MzcxMzQ3YjAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPklud29vZCwgTWFuaGF0dGFuPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wODY2MDExZjE0NjY0MmNkOGMzOGEwNDVmODg4N2E1Yy5zZXRDb250ZW50KGh0bWxfNzcxNWVmZWNiNTUzNDYxYTk4NTAzMzY2MzcxMzQ3YjApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNjJlZWU4YjdlOGM5NGM4YzhkNWI3OWMyMjA3YjcyYWUuYmluZFBvcHVwKHBvcHVwXzA4NjYwMTFmMTQ2NjQyY2Q4YzM4YTA0NWY4ODg3YTVjKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzZmNjdjYzVmNzA0YjRlNGRiNDJlODQ3ZWJkYmZkMGQ3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODIzNjA0Mjg0ODExOTM1LC03My45NDk2ODc5MTg4MzM2Nl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83YWE4MjllOGExOGU0YTBhODM5YzI1NjM4NDQ1OGIzNCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8yNjM2MjEzNWVmNzU0ZmExODM1MDllM2I3NTAxNGM3ZSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83MGM0ZmQ2MDdmMGU0N2Y1ODRjZDU5ZGZlNjRkN2Y3NCA9ICQoJzxkaXYgaWQ9Imh0bWxfNzBjNGZkNjA3ZjBlNDdmNTg0Y2Q1OWRmZTY0ZDdmNzQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkhhbWlsdG9uIEhlaWdodHMsIE1hbmhhdHRhbjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMjYzNjIxMzVlZjc1NGZhMTgzNTA5ZTNiNzUwMTRjN2Uuc2V0Q29udGVudChodG1sXzcwYzRmZDYwN2YwZTQ3ZjU4NGNkNTlkZmU2NGQ3Zjc0KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzZmNjdjYzVmNzA0YjRlNGRiNDJlODQ3ZWJkYmZkMGQ3LmJpbmRQb3B1cChwb3B1cF8yNjM2MjEzNWVmNzU0ZmExODM1MDllM2I3NTAxNGM3ZSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9hNDVmNWM4ZTllNGY0YjFhYTZmMDdjNzMwMWU3Nzk3YiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjgxNjkzNDQyOTQ5NzgsLTczLjk1NzM4NTM5MzUxODhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfN2FhODI5ZThhMThlNGEwYTgzOWMyNTYzODQ0NThiMzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNjMxYWM4ZTFiMDQ2NDQ4YWJjZTRhM2IyN2M4ZTE0MWQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOTY4ODM2NmFhMDk4NGE0MjgxZDU1MzFkOWFkNmMyMWEgPSAkKCc8ZGl2IGlkPSJodG1sXzk2ODgzNjZhYTA5ODRhNDI4MWQ1NTMxZDlhZDZjMjFhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NYW5oYXR0YW52aWxsZSwgTWFuaGF0dGFuPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82MzFhYzhlMWIwNDY0NDhhYmNlNGEzYjI3YzhlMTQxZC5zZXRDb250ZW50KGh0bWxfOTY4ODM2NmFhMDk4NGE0MjgxZDU1MzFkOWFkNmMyMWEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYTQ1ZjVjOGU5ZTRmNGIxYWE2ZjA3YzczMDFlNzc5N2IuYmluZFBvcHVwKHBvcHVwXzYzMWFjOGUxYjA0NjQ0OGFiY2U0YTNiMjdjOGUxNDFkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzk2OWU3ZmZkMmY2ZTQyNTY4NjIxNjYwNjdlYTliNDM1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODE1OTc2MDY3NDI0MTQsLTczLjk0MzIxMTEyNjAzOTA1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzdhYTgyOWU4YTE4ZTRhMGE4MzljMjU2Mzg0NDU4YjM0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzM0ZDQ1N2UzMTZlNjQxMDZhM2VkNjA4ZTI2YjYwNzUwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzRhNGE3NDk5ZTJmYjRiYjM4NGE5MDM3M2NhMjljYjZjID0gJCgnPGRpdiBpZD0iaHRtbF80YTRhNzQ5OWUyZmI0YmIzODRhOTAzNzNjYTI5Y2I2YyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q2VudHJhbCBIYXJsZW0sIE1hbmhhdHRhbjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMzRkNDU3ZTMxNmU2NDEwNmEzZWQ2MDhlMjZiNjA3NTAuc2V0Q29udGVudChodG1sXzRhNGE3NDk5ZTJmYjRiYjM4NGE5MDM3M2NhMjljYjZjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzk2OWU3ZmZkMmY2ZTQyNTY4NjIxNjYwNjdlYTliNDM1LmJpbmRQb3B1cChwb3B1cF8zNGQ0NTdlMzE2ZTY0MTA2YTNlZDYwOGUyNmI2MDc1MCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8yNWZmMGYwZDQyYTM0ODVlODczZTg1ZDRmM2VlNzRiYSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc5MjI0OTQ2NjYzMDMzLC03My45NDQxODIyMzE0ODUyNF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83YWE4MjllOGExOGU0YTBhODM5YzI1NjM4NDQ1OGIzNCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF80NWUzNzNlNTY4Mjg0YzY4YjMxNmQ5NTEwN2Q0YmRkZSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF80ODVlNzdjZWM4ZWM0ZjE4OTBiYjAxMzNhZTkwZTk3OCA9ICQoJzxkaXYgaWQ9Imh0bWxfNDg1ZTc3Y2VjOGVjNGYxODkwYmIwMTMzYWU5MGU5NzgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkVhc3QgSGFybGVtLCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzQ1ZTM3M2U1NjgyODRjNjhiMzE2ZDk1MTA3ZDRiZGRlLnNldENvbnRlbnQoaHRtbF80ODVlNzdjZWM4ZWM0ZjE4OTBiYjAxMzNhZTkwZTk3OCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8yNWZmMGYwZDQyYTM0ODVlODczZTg1ZDRmM2VlNzRiYS5iaW5kUG9wdXAocG9wdXBfNDVlMzczZTU2ODI4NGM2OGIzMTZkOTUxMDdkNGJkZGUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMTQ3OGQxNGU5NjM0NDdiMDhhZDFiNTkwNmEzM2FkNjQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NzU2Mzg1NzMzMDE4MDUsLTczLjk2MDUwNzYzMTM1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzdhYTgyOWU4YTE4ZTRhMGE4MzljMjU2Mzg0NDU4YjM0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2Y3MDgwNjhjYzhmNTQ1YWZhNTFlNWQ5ZDcxMDJkMTlkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzZiMTQzYzBhZmM4NzQ0MjA5NDhmYzIzNjViMGY5Mjk4ID0gJCgnPGRpdiBpZD0iaHRtbF82YjE0M2MwYWZjODc0NDIwOTQ4ZmMyMzY1YjBmOTI5OCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+VXBwZXIgRWFzdCBTaWRlLCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2Y3MDgwNjhjYzhmNTQ1YWZhNTFlNWQ5ZDcxMDJkMTlkLnNldENvbnRlbnQoaHRtbF82YjE0M2MwYWZjODc0NDIwOTQ4ZmMyMzY1YjBmOTI5OCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8xNDc4ZDE0ZTk2MzQ0N2IwOGFkMWI1OTA2YTMzYWQ2NC5iaW5kUG9wdXAocG9wdXBfZjcwODA2OGNjOGY1NDVhZmE1MWU1ZDlkNzEwMmQxOWQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOTZmZDEyMzlhZmMwNDJkYzkwMDYzM2NjNDZhMDY5NTEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NzU5Mjk4NDk4ODQ4NzUsLTczLjk0NzExNzg0NDcxODI2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzdhYTgyOWU4YTE4ZTRhMGE4MzljMjU2Mzg0NDU4YjM0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzMwOTJjODZhZjhiMzQ5MmNiODIxYmFhYzQ5ZGFmYzgxID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2MyNTIxM2E3MmNhYjQzN2FhMzcyMmE5NDhhZDdmM2RjID0gJCgnPGRpdiBpZD0iaHRtbF9jMjUyMTNhNzJjYWI0MzdhYTM3MjJhOTQ4YWQ3ZjNkYyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WW9ya3ZpbGxlLCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzMwOTJjODZhZjhiMzQ5MmNiODIxYmFhYzQ5ZGFmYzgxLnNldENvbnRlbnQoaHRtbF9jMjUyMTNhNzJjYWI0MzdhYTM3MjJhOTQ4YWQ3ZjNkYyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl85NmZkMTIzOWFmYzA0MmRjOTAwNjMzY2M0NmEwNjk1MS5iaW5kUG9wdXAocG9wdXBfMzA5MmM4NmFmOGIzNDkyY2I4MjFiYWFjNDlkYWZjODEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZDBlZGZmOTY4YTg3NGQwNGIyNGM5MjAzYzU0MTE5NDQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NjgxMTI2NTgyODczMywtNzMuOTU4ODU5Njg4MTM3Nl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83YWE4MjllOGExOGU0YTBhODM5YzI1NjM4NDQ1OGIzNCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF80OThiNTc3ZmM2ZjI0MDI2OGIwYmYzM2FiOTE1NzFlZSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF85NWEzMjg4N2FiYzk0ZTYxOGRhN2QxNDk5ZWZmZDNjOCA9ICQoJzxkaXYgaWQ9Imh0bWxfOTVhMzI4ODdhYmM5NGU2MThkYTdkMTQ5OWVmZmQzYzgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkxlbm94IEhpbGwsIE1hbmhhdHRhbjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNDk4YjU3N2ZjNmYyNDAyNjhiMGJmMzNhYjkxNTcxZWUuc2V0Q29udGVudChodG1sXzk1YTMyODg3YWJjOTRlNjE4ZGE3ZDE0OTllZmZkM2M4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2QwZWRmZjk2OGE4NzRkMDRiMjRjOTIwM2M1NDExOTQ0LmJpbmRQb3B1cChwb3B1cF80OThiNTc3ZmM2ZjI0MDI2OGIwYmYzM2FiOTE1NzFlZSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl84ZTY2MDRhMzU4YzA0ZTY2YjY3YTJiMzkwOTFlMjVlMyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc2MjE1OTYwNTc2MjgzLC03My45NDkxNjc2OTIyNzk1M10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83YWE4MjllOGExOGU0YTBhODM5YzI1NjM4NDQ1OGIzNCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82MTNkNjI3ZTI1MzA0OTA0OWE5ZGM2MTllZmU5Yzc0MSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF84ZWY1NzUzNDA5ZmI0OWZkODk4NTAwMmE0ZDgwNWIwZiA9ICQoJzxkaXYgaWQ9Imh0bWxfOGVmNTc1MzQwOWZiNDlmZDg5ODUwMDJhNGQ4MDViMGYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlJvb3NldmVsdCBJc2xhbmQsIE1hbmhhdHRhbjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNjEzZDYyN2UyNTMwNDkwNDlhOWRjNjE5ZWZlOWM3NDEuc2V0Q29udGVudChodG1sXzhlZjU3NTM0MDlmYjQ5ZmQ4OTg1MDAyYTRkODA1YjBmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzhlNjYwNGEzNThjMDRlNjZiNjdhMmIzOTA5MWUyNWUzLmJpbmRQb3B1cChwb3B1cF82MTNkNjI3ZTI1MzA0OTA0OWE5ZGM2MTllZmU5Yzc0MSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lNGEwNDk1ZDZmYTA0M2ZiOTlmYzg5MGE3NmQyM2Q5NSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc4NzY1Nzk5ODUzNDg1NCwtNzMuOTc3MDU5MjM2MzA2MDNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfN2FhODI5ZThhMThlNGEwYTgzOWMyNTYzODQ0NThiMzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYzY3MGQyMmMyZDViNDllMGE5ZTNiNmMwYTk2M2IzNWYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfODQ3ZTkyMGUxZjNmNGI0MWE1MmViMGJmNjdkNzY4ZTcgPSAkKCc8ZGl2IGlkPSJodG1sXzg0N2U5MjBlMWYzZjRiNDFhNTJlYjBiZjY3ZDc2OGU3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5VcHBlciBXZXN0IFNpZGUsIE1hbmhhdHRhbjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYzY3MGQyMmMyZDViNDllMGE5ZTNiNmMwYTk2M2IzNWYuc2V0Q29udGVudChodG1sXzg0N2U5MjBlMWYzZjRiNDFhNTJlYjBiZjY3ZDc2OGU3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2U0YTA0OTVkNmZhMDQzZmI5OWZjODkwYTc2ZDIzZDk1LmJpbmRQb3B1cChwb3B1cF9jNjcwZDIyYzJkNWI0OWUwYTllM2I2YzBhOTYzYjM1Zik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81N2VmM2E1NGE5YWE0NzBkYmI1M2RkZmQ4MzQxZGY4OSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc3MzUyODg4OTQyMTY2LC03My45ODUzMzc3NzAwMTI2Ml0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83YWE4MjllOGExOGU0YTBhODM5YzI1NjM4NDQ1OGIzNCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wNWFjZTM2ODgyYjY0OTI3OTAyYzI5ZDE4YWM1MGUwZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF84MzJhYmJlMjQ2NjA0ODc4OGVhZGIxODY4MTAyZjA1NyA9ICQoJzxkaXYgaWQ9Imh0bWxfODMyYWJiZTI0NjYwNDg3ODhlYWRiMTg2ODEwMmYwNTciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkxpbmNvbG4gU3F1YXJlLCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzA1YWNlMzY4ODJiNjQ5Mjc5MDJjMjlkMThhYzUwZTBmLnNldENvbnRlbnQoaHRtbF84MzJhYmJlMjQ2NjA0ODc4OGVhZGIxODY4MTAyZjA1Nyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81N2VmM2E1NGE5YWE0NzBkYmI1M2RkZmQ4MzQxZGY4OS5iaW5kUG9wdXAocG9wdXBfMDVhY2UzNjg4MmI2NDkyNzkwMmMyOWQxOGFjNTBlMGYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZGRmYzg5NzEwYTQyNDYzY2JkNDUwY2I3ZDJjYzkxZTggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NTkxMDA4OTE0NjIxMiwtNzMuOTk2MTE5MzYzMDk0NzldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfN2FhODI5ZThhMThlNGEwYTgzOWMyNTYzODQ0NThiMzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfODczZTg3N2IyNWZlNDg5MWEwZDI4YThlNzJjMDQ0ZmQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfM2M4ZWJjYWI0OTkwNGQ4MWFiMDFhNmVmOTMxMGRiMDMgPSAkKCc8ZGl2IGlkPSJodG1sXzNjOGViY2FiNDk5MDRkODFhYjAxYTZlZjkzMTBkYjAzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DbGludG9uLCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzg3M2U4NzdiMjVmZTQ4OTFhMGQyOGE4ZTcyYzA0NGZkLnNldENvbnRlbnQoaHRtbF8zYzhlYmNhYjQ5OTA0ZDgxYWIwMWE2ZWY5MzEwZGIwMyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9kZGZjODk3MTBhNDI0NjNjYmQ0NTBjYjdkMmNjOTFlOC5iaW5kUG9wdXAocG9wdXBfODczZTg3N2IyNWZlNDg5MWEwZDI4YThlNzJjMDQ0ZmQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZmY5Y2UwODM0MzM4NDU5NzkxZWY5ODZhYjdjYzUyYTcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NTQ2OTExMDI3MDYyMywtNzMuOTgxNjY4ODI3MzAzMDRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfN2FhODI5ZThhMThlNGEwYTgzOWMyNTYzODQ0NThiMzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfN2ExNzUxZTRiZWMxNDU4MmIxMTI1MDcyZGQzOWE2MzMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMTcxYWVkYTU0OGZiNDlkYjhmZjQyNjA1YmE5YjljYTUgPSAkKCc8ZGl2IGlkPSJodG1sXzE3MWFlZGE1NDhmYjQ5ZGI4ZmY0MjYwNWJhOWI5Y2E1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NaWR0b3duLCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzdhMTc1MWU0YmVjMTQ1ODJiMTEyNTA3MmRkMzlhNjMzLnNldENvbnRlbnQoaHRtbF8xNzFhZWRhNTQ4ZmI0OWRiOGZmNDI2MDViYTliOWNhNSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9mZjljZTA4MzQzMzg0NTk3OTFlZjk4NmFiN2NjNTJhNy5iaW5kUG9wdXAocG9wdXBfN2ExNzUxZTRiZWMxNDU4MmIxMTI1MDcyZGQzOWE2MzMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfODc0NzdmM2QwMzJkNDViY2FjOGQ2YjBmZTAyZmNhMDkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NDgzMDMwNzcyNTIxNzQsLTczLjk3ODMzMjA3OTI0MTI3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzdhYTgyOWU4YTE4ZTRhMGE4MzljMjU2Mzg0NDU4YjM0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2MyNWU4MDY4OWIwODQ4M2ZhYjk2YzZmYzM5YjNmNGYwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzcxYTRkZTA2ZGJkZDQxNjFhODM4Y2Q4NTUxZDEzZWY2ID0gJCgnPGRpdiBpZD0iaHRtbF83MWE0ZGUwNmRiZGQ0MTYxYTgzOGNkODU1MWQxM2VmNiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TXVycmF5IEhpbGwsIE1hbmhhdHRhbjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYzI1ZTgwNjg5YjA4NDgzZmFiOTZjNmZjMzliM2Y0ZjAuc2V0Q29udGVudChodG1sXzcxYTRkZTA2ZGJkZDQxNjFhODM4Y2Q4NTUxZDEzZWY2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzg3NDc3ZjNkMDMyZDQ1YmNhYzhkNmIwZmUwMmZjYTA5LmJpbmRQb3B1cChwb3B1cF9jMjVlODA2ODliMDg0ODNmYWI5NmM2ZmMzOWIzZjRmMCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl84ZTY3MTM2OTg2OTE0ZDU2YTY0Zjg4NDVkZTUzZjQwOCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc0NDAzNDcwNjc0Nzk3NSwtNzQuMDAzMTE2MzM0NzI4MTNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfN2FhODI5ZThhMThlNGEwYTgzOWMyNTYzODQ0NThiMzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZmRjYTJhN2E0ZDA3NGZlZGE5MTI4OWJlZGQ4MjEzYWQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZjE3OGFjZmRlMjNmNGI4OGI0NWZhNGQ0NDcxNjQ0ZDggPSAkKCc8ZGl2IGlkPSJodG1sX2YxNzhhY2ZkZTIzZjRiODhiNDVmYTRkNDQ3MTY0NGQ4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DaGVsc2VhLCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2ZkY2EyYTdhNGQwNzRmZWRhOTEyODliZWRkODIxM2FkLnNldENvbnRlbnQoaHRtbF9mMTc4YWNmZGUyM2Y0Yjg4YjQ1ZmE0ZDQ0NzE2NDRkOCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl84ZTY3MTM2OTg2OTE0ZDU2YTY0Zjg4NDVkZTUzZjQwOC5iaW5kUG9wdXAocG9wdXBfZmRjYTJhN2E0ZDA3NGZlZGE5MTI4OWJlZGQ4MjEzYWQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMTM2MzFhMTgyYjQ3NDRlNTgyODMyZWEwNTc0YzM1YWIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MjY5MzI4ODUzNjEyOCwtNzMuOTk5OTE0MDI5NDU5MDJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfN2FhODI5ZThhMThlNGEwYTgzOWMyNTYzODQ0NThiMzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfODQ2ZjJiZjZmNWQ1NDdlYThjZjNhMDNlNjczNjE2ZGMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYTY0NDhkMDU3YzgzNDY1ZDg1ODA1Y2M1NTkxYjBlMDEgPSAkKCc8ZGl2IGlkPSJodG1sX2E2NDQ4ZDA1N2M4MzQ2NWQ4NTgwNWNjNTU5MWIwZTAxIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5HcmVlbndpY2ggVmlsbGFnZSwgTWFuaGF0dGFuPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84NDZmMmJmNmY1ZDU0N2VhOGNmM2EwM2U2NzM2MTZkYy5zZXRDb250ZW50KGh0bWxfYTY0NDhkMDU3YzgzNDY1ZDg1ODA1Y2M1NTkxYjBlMDEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMTM2MzFhMTgyYjQ3NDRlNTgyODMyZWEwNTc0YzM1YWIuYmluZFBvcHVwKHBvcHVwXzg0NmYyYmY2ZjVkNTQ3ZWE4Y2YzYTAzZTY3MzYxNmRjKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzBhZWM4MjY2YjIzZjQ2MTc5OWYwNmQ2OTNkNGY1ZjQyID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzI3ODQ2Nzc3MjcwMjQ0LC03My45ODIyMjYxNjUwNjQxNl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83YWE4MjllOGExOGU0YTBhODM5YzI1NjM4NDQ1OGIzNCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iZTc2ZjYwZTQwMzc0ZTYxOTJhMjU0YzNjYzhiZDk1MiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF80OTkzOTg1NThjZTI0NzY4YjM1MjY2MzgxN2I0ZTliMCA9ICQoJzxkaXYgaWQ9Imh0bWxfNDk5Mzk4NTU4Y2UyNDc2OGIzNTI2NjM4MTdiNGU5YjAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkVhc3QgVmlsbGFnZSwgTWFuaGF0dGFuPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iZTc2ZjYwZTQwMzc0ZTYxOTJhMjU0YzNjYzhiZDk1Mi5zZXRDb250ZW50KGh0bWxfNDk5Mzk4NTU4Y2UyNDc2OGIzNTI2NjM4MTdiNGU5YjApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMGFlYzgyNjZiMjNmNDYxNzk5ZjA2ZDY5M2Q0ZjVmNDIuYmluZFBvcHVwKHBvcHVwX2JlNzZmNjBlNDAzNzRlNjE5MmEyNTRjM2NjOGJkOTUyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzJlZGFkMjk2ODlhNDQ1Y2FhZmZhMzdhMTA0OTZmZTI2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzE3ODA2NzQ4OTI3NjUsLTczLjk4MDg5MDMxOTk5MjkxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzdhYTgyOWU4YTE4ZTRhMGE4MzljMjU2Mzg0NDU4YjM0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzE4NjFjZGVmYjk4YjQ4YmRhZDJhZmU0YzU2OWU4Yjg0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzBmNzlkMGZiZjRlOTRjNTBhMjNkMzRlMjhiMWJkMjQzID0gJCgnPGRpdiBpZD0iaHRtbF8wZjc5ZDBmYmY0ZTk0YzUwYTIzZDM0ZTI4YjFiZDI0MyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TG93ZXIgRWFzdCBTaWRlLCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzE4NjFjZGVmYjk4YjQ4YmRhZDJhZmU0YzU2OWU4Yjg0LnNldENvbnRlbnQoaHRtbF8wZjc5ZDBmYmY0ZTk0YzUwYTIzZDM0ZTI4YjFiZDI0Myk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8yZWRhZDI5Njg5YTQ0NWNhYWZmYTM3YTEwNDk2ZmUyNi5iaW5kUG9wdXAocG9wdXBfMTg2MWNkZWZiOThiNDhiZGFkMmFmZTRjNTY5ZThiODQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMDNkMDY1YzI4ZTRkNGI1NTliOTViMThmMjhkMjllODUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MjE1MjE5Njc0NDMyMTYsLTc0LjAxMDY4MzI4NTU5MDg3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzdhYTgyOWU4YTE4ZTRhMGE4MzljMjU2Mzg0NDU4YjM0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzhlZDU4ZmM5NWIwNTQ2MTA5NzUwYTUzYjIyM2E3MzlhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzQ1Nzk5MDcxZGUyNTQ4ODQ4ZTM2MjNhMWU2NGRhYjY4ID0gJCgnPGRpdiBpZD0iaHRtbF80NTc5OTA3MWRlMjU0ODg0OGUzNjIzYTFlNjRkYWI2OCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+VHJpYmVjYSwgTWFuaGF0dGFuPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84ZWQ1OGZjOTViMDU0NjEwOTc1MGE1M2IyMjNhNzM5YS5zZXRDb250ZW50KGh0bWxfNDU3OTkwNzFkZTI1NDg4NDhlMzYyM2ExZTY0ZGFiNjgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMDNkMDY1YzI4ZTRkNGI1NTliOTViMThmMjhkMjllODUuYmluZFBvcHVwKHBvcHVwXzhlZDU4ZmM5NWIwNTQ2MTA5NzUwYTUzYjIyM2E3MzlhKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2VhOGUwYjFkMjkwOTQyMmQ4OGY2OTJjOGE2Yjk2MWUyID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzE5MzIzNzkzOTU5MDcsLTczLjk5NzMwNDY3MjA4MDczXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzdhYTgyOWU4YTE4ZTRhMGE4MzljMjU2Mzg0NDU4YjM0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzE0YzgzNjgxMjZlZDQ4MjZiM2NjNmYyMDc4YTY0ODEwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2MyNWRkNDhlNjkwMzRmZWM4YjZkYmVkNzBhMzUwOWM4ID0gJCgnPGRpdiBpZD0iaHRtbF9jMjVkZDQ4ZTY5MDM0ZmVjOGI2ZGJlZDcwYTM1MDljOCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TGl0dGxlIEl0YWx5LCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzE0YzgzNjgxMjZlZDQ4MjZiM2NjNmYyMDc4YTY0ODEwLnNldENvbnRlbnQoaHRtbF9jMjVkZDQ4ZTY5MDM0ZmVjOGI2ZGJlZDcwYTM1MDljOCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9lYThlMGIxZDI5MDk0MjJkODhmNjkyYzhhNmI5NjFlMi5iaW5kUG9wdXAocG9wdXBfMTRjODM2ODEyNmVkNDgyNmIzY2M2ZjIwNzhhNjQ4MTApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZWFlOTAwNmZkYTQ3NDUwMjkxMmFhYTllZGZlOTllY2EgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MjIxODM4NDEzMTc5NCwtNzQuMDAwNjU2NjY5NTk3NTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfN2FhODI5ZThhMThlNGEwYTgzOWMyNTYzODQ0NThiMzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfN2Q5OGIxYTdkYzFiNGIzOWJjY2M5ZjVkMmRiOGIzNjggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNDc5NDk4OTliOTBjNDRmZjliMGY2Yjg0ZDBiMzJiMzEgPSAkKCc8ZGl2IGlkPSJodG1sXzQ3OTQ5ODk5YjkwYzQ0ZmY5YjBmNmI4NGQwYjMyYjMxIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Tb2hvLCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzdkOThiMWE3ZGMxYjRiMzliY2NjOWY1ZDJkYjhiMzY4LnNldENvbnRlbnQoaHRtbF80Nzk0OTg5OWI5MGM0NGZmOWIwZjZiODRkMGIzMmIzMSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9lYWU5MDA2ZmRhNDc0NTAyOTEyYWFhOWVkZmU5OWVjYS5iaW5kUG9wdXAocG9wdXBfN2Q5OGIxYTdkYzFiNGIzOWJjY2M5ZjVkMmRiOGIzNjgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNjVkNTFhYjgzZDEyNDk1YTkzYzczMzFkZjY5MzVjMDYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MzQ0MzM5MzU3MjQzNCwtNzQuMDA2MTc5OTgxMjY4MTJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfN2FhODI5ZThhMThlNGEwYTgzOWMyNTYzODQ0NThiMzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMWZjMmYzM2EzZWJjNDg2MzgzOTg2OWVjZjZlZTE1YmQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNTUxN2QyMTM3ZDcyNDY1N2FmNmExODA4OTQ5ZGI2NGYgPSAkKCc8ZGl2IGlkPSJodG1sXzU1MTdkMjEzN2Q3MjQ2NTdhZjZhMTgwODk0OWRiNjRmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5XZXN0IFZpbGxhZ2UsIE1hbmhhdHRhbjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMWZjMmYzM2EzZWJjNDg2MzgzOTg2OWVjZjZlZTE1YmQuc2V0Q29udGVudChodG1sXzU1MTdkMjEzN2Q3MjQ2NTdhZjZhMTgwODk0OWRiNjRmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzY1ZDUxYWI4M2QxMjQ5NWE5M2M3MzMxZGY2OTM1YzA2LmJpbmRQb3B1cChwb3B1cF8xZmMyZjMzYTNlYmM0ODYzODM5ODY5ZWNmNmVlMTViZCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl82NzFlNTI1M2IyMjI0Yzc4YTRkZjM2NmMwNWYzOTBlZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc5NzMwNzA0MTcwMjg2NSwtNzMuOTY0Mjg2MTc3NDA2NTVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfN2FhODI5ZThhMThlNGEwYTgzOWMyNTYzODQ0NThiMzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZmM4Nzg3MmQ0ZGE0NDY1N2FkMDUwMzY4MDQyYTk0ZjUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNDFjNzRiM2QwYjM0NDUxNThkZGY4MmIzOTBhZmU2MDggPSAkKCc8ZGl2IGlkPSJodG1sXzQxYzc0YjNkMGIzNDQ1MTU4ZGRmODJiMzkwYWZlNjA4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NYW5oYXR0YW4gVmFsbGV5LCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2ZjODc4NzJkNGRhNDQ2NTdhZDA1MDM2ODA0MmE5NGY1LnNldENvbnRlbnQoaHRtbF80MWM3NGIzZDBiMzQ0NTE1OGRkZjgyYjM5MGFmZTYwOCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl82NzFlNTI1M2IyMjI0Yzc4YTRkZjM2NmMwNWYzOTBlZC5iaW5kUG9wdXAocG9wdXBfZmM4Nzg3MmQ0ZGE0NDY1N2FkMDUwMzY4MDQyYTk0ZjUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMDBlZjlkOWY2OTk5NDkzY2ExMjdiMjIwMWY0YTBkOWYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44MDc5OTk3MzgxNjU4MjYsLTczLjk2Mzg5NjI3OTA1MzMyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzdhYTgyOWU4YTE4ZTRhMGE4MzljMjU2Mzg0NDU4YjM0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2E5MzAwOGZiZmYzMzRkZGI4YTZiOThmZjIzNjA5YTM3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzQ0NGZlMDBhOGZiMTRlMDRiNzViYWMxNWE1YzcxOWIxID0gJCgnPGRpdiBpZD0iaHRtbF80NDRmZTAwYThmYjE0ZTA0Yjc1YmFjMTVhNWM3MTliMSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TW9ybmluZ3NpZGUgSGVpZ2h0cywgTWFuaGF0dGFuPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hOTMwMDhmYmZmMzM0ZGRiOGE2Yjk4ZmYyMzYwOWEzNy5zZXRDb250ZW50KGh0bWxfNDQ0ZmUwMGE4ZmIxNGUwNGI3NWJhYzE1YTVjNzE5YjEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMDBlZjlkOWY2OTk5NDkzY2ExMjdiMjIwMWY0YTBkOWYuYmluZFBvcHVwKHBvcHVwX2E5MzAwOGZiZmYzMzRkZGI4YTZiOThmZjIzNjA5YTM3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzgzMWM5NmIzZGQ3ZjQ1MjZiMTE1MzQ3MTFhODAyYjNlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzM3MjA5ODMyNzE1LC03My45ODEzNzU5NDgzMzU0MV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83YWE4MjllOGExOGU0YTBhODM5YzI1NjM4NDQ1OGIzNCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8yZDU4MTYxYTM5ZTk0NTdlYjA1YzM4MGNhODc0OGJjZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zMWY3MGUwMTJlY2Y0ZGFkYmE4Y2U1YzA0MDUzOTJkNiA9ICQoJzxkaXYgaWQ9Imh0bWxfMzFmNzBlMDEyZWNmNGRhZGJhOGNlNWMwNDA1MzkyZDYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkdyYW1lcmN5LCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzJkNTgxNjFhMzllOTQ1N2ViMDVjMzgwY2E4NzQ4YmNmLnNldENvbnRlbnQoaHRtbF8zMWY3MGUwMTJlY2Y0ZGFkYmE4Y2U1YzA0MDUzOTJkNik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl84MzFjOTZiM2RkN2Y0NTI2YjExNTM0NzExYTgwMmIzZS5iaW5kUG9wdXAocG9wdXBfMmQ1ODE2MWEzOWU5NDU3ZWIwNWMzODBjYTg3NDhiY2YpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNzMxYmY1N2MyM2Y1NDQ3N2I1ZTQ2ZjdlMjBhMTk5MzAgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MTE5MzE5ODM5NDU2NSwtNzQuMDE2ODY5MzA1MDg2MTddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfN2FhODI5ZThhMThlNGEwYTgzOWMyNTYzODQ0NThiMzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNDI2YzUyMTBhNTM3NDM0NThkNmYyYTlmNDE4MTVlYWUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZmRkZWM4NjY0NmUzNGY3NzljZDMxYTA5MDYzZDU0ZTcgPSAkKCc8ZGl2IGlkPSJodG1sX2ZkZGVjODY2NDZlMzRmNzc5Y2QzMWEwOTA2M2Q1NGU3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5CYXR0ZXJ5IFBhcmsgQ2l0eSwgTWFuaGF0dGFuPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80MjZjNTIxMGE1Mzc0MzQ1OGQ2ZjJhOWY0MTgxNWVhZS5zZXRDb250ZW50KGh0bWxfZmRkZWM4NjY0NmUzNGY3NzljZDMxYTA5MDYzZDU0ZTcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNzMxYmY1N2MyM2Y1NDQ3N2I1ZTQ2ZjdlMjBhMTk5MzAuYmluZFBvcHVwKHBvcHVwXzQyNmM1MjEwYTUzNzQzNDU4ZDZmMmE5ZjQxODE1ZWFlKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2ZmN2E0Nzk2NGI3YzRiMDRhMzRlMmI4Njg4Y2I5YmZlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzA3MTA3MTA3MjcwNDgsLTc0LjAxMDY2NTQ0NTIxMjddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfN2FhODI5ZThhMThlNGEwYTgzOWMyNTYzODQ0NThiMzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMTkyOTA4ZjE2ZWY2NGZiNWJhYWMxYmRlODdlNzhmNzcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZTRhM2MwY2VkOTg1NGYxN2EzNzdiMzE2NWEyNzMwYzMgPSAkKCc8ZGl2IGlkPSJodG1sX2U0YTNjMGNlZDk4NTRmMTdhMzc3YjMxNjVhMjczMGMzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5GaW5hbmNpYWwgRGlzdHJpY3QsIE1hbmhhdHRhbjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMTkyOTA4ZjE2ZWY2NGZiNWJhYWMxYmRlODdlNzhmNzcuc2V0Q29udGVudChodG1sX2U0YTNjMGNlZDk4NTRmMTdhMzc3YjMxNjVhMjczMGMzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2ZmN2E0Nzk2NGI3YzRiMDRhMzRlMmI4Njg4Y2I5YmZlLmJpbmRQb3B1cChwb3B1cF8xOTI5MDhmMTZlZjY0ZmI1YmFhYzFiZGU4N2U3OGY3Nyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lM2ZjM2Q0NjA2ZDQ0OGE4OThmOWNjZGY5MzRjNjcyYyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc2ODUwODU5MzM1NDkyLC03My45MTU2NTM3NDMwNDIzNF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83YWE4MjllOGExOGU0YTBhODM5YzI1NjM4NDQ1OGIzNCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zNWJjM2FmZWQ2NDU0OTY3OGJjZjQ4YWRlYjlhNDhkMiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mMTQ3M2EyZjRjYzk0NzA3YTY5NTRlMTA1YTk0OTIxYSA9ICQoJzxkaXYgaWQ9Imh0bWxfZjE0NzNhMmY0Y2M5NDcwN2E2OTU0ZTEwNWE5NDkyMWEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkFzdG9yaWEsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMzViYzNhZmVkNjQ1NDk2NzhiY2Y0OGFkZWI5YTQ4ZDIuc2V0Q29udGVudChodG1sX2YxNDczYTJmNGNjOTQ3MDdhNjk1NGUxMDVhOTQ5MjFhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2UzZmMzZDQ2MDZkNDQ4YTg5OGY5Y2NkZjkzNGM2NzJjLmJpbmRQb3B1cChwb3B1cF8zNWJjM2FmZWQ2NDU0OTY3OGJjZjQ4YWRlYjlhNDhkMik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl80YzQyY2I0ZDY1MWQ0YjU5OTJjNGI5NWI4YjExZGYzYSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc0NjM0OTA4ODYwMjIyLC03My45MDE4NDE2NjgzODI4NF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83YWE4MjllOGExOGU0YTBhODM5YzI1NjM4NDQ1OGIzNCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9kMzk4NTEyYWQwYjc0YjJlYmIzMmQ5ZDk5YzZkNmI2NCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8yMmUwNGM4NjIzZTg0NzlmOTVlMGNkMDVlZGYxZjg5NSA9ICQoJzxkaXYgaWQ9Imh0bWxfMjJlMDRjODYyM2U4NDc5Zjk1ZTBjZDA1ZWRmMWY4OTUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPldvb2RzaWRlLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2QzOTg1MTJhZDBiNzRiMmViYjMyZDlkOTljNmQ2YjY0LnNldENvbnRlbnQoaHRtbF8yMmUwNGM4NjIzZTg0NzlmOTVlMGNkMDVlZGYxZjg5NSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl80YzQyY2I0ZDY1MWQ0YjU5OTJjNGI5NWI4YjExZGYzYS5iaW5kUG9wdXAocG9wdXBfZDM5ODUxMmFkMGI3NGIyZWJiMzJkOWQ5OWM2ZDZiNjQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOTc5ZmE3NTE4YTFkNDNhNjk4OWEzMGNkY2Q3NjkzMTYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NTE5ODEzODAwNzM2NywtNzMuODgyODIxMDkxNjQzNjVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfN2FhODI5ZThhMThlNGEwYTgzOWMyNTYzODQ0NThiMzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOGU4ZTRiODBhMWMyNDFjMDk4MTQzNGMyOTJmMDg4YjcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfODMxMzEyYjhiMDdlNDZiNWFjYThjY2YwMjBmYTJjZDMgPSAkKCc8ZGl2IGlkPSJodG1sXzgzMTMxMmI4YjA3ZTQ2YjVhY2E4Y2NmMDIwZmEyY2QzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5KYWNrc29uIEhlaWdodHMsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOGU4ZTRiODBhMWMyNDFjMDk4MTQzNGMyOTJmMDg4Yjcuc2V0Q29udGVudChodG1sXzgzMTMxMmI4YjA3ZTQ2YjVhY2E4Y2NmMDIwZmEyY2QzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzk3OWZhNzUxOGExZDQzYTY5ODlhMzBjZGNkNzY5MzE2LmJpbmRQb3B1cChwb3B1cF84ZThlNGI4MGExYzI0MWMwOTgxNDM0YzI5MmYwODhiNyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jMjdiMWQxYzFhNzY0NWUyYjA5ODdhNDE5YzM3YjRmOCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc0NDA0ODUwNTEyMjAyNCwtNzMuODgxNjU2MjIyODgzODhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfN2FhODI5ZThhMThlNGEwYTgzOWMyNTYzODQ0NThiMzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNWZmNzlhYzIxYjcxNDYwNmIyN2M5NGM1ZDAwNmYwM2UgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZDAyMjBmNzlhOGQ3NGQyMTk5MTVlZjViZGQ5NTlkNmUgPSAkKCc8ZGl2IGlkPSJodG1sX2QwMjIwZjc5YThkNzRkMjE5OTE1ZWY1YmRkOTU5ZDZlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5FbG1odXJzdCwgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81ZmY3OWFjMjFiNzE0NjA2YjI3Yzk0YzVkMDA2ZjAzZS5zZXRDb250ZW50KGh0bWxfZDAyMjBmNzlhOGQ3NGQyMTk5MTVlZjViZGQ5NTlkNmUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYzI3YjFkMWMxYTc2NDVlMmIwOTg3YTQxOWMzN2I0ZjguYmluZFBvcHVwKHBvcHVwXzVmZjc5YWMyMWI3MTQ2MDZiMjdjOTRjNWQwMDZmMDNlKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2E2YzVmOTEyOTRiOTRkNmZhMDcyM2E0MTFhMjc3MGNiID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjU0MjI1Mjc3Mzg0ODcsLTczLjgzODEzNzY0NjAwMjhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfN2FhODI5ZThhMThlNGEwYTgzOWMyNTYzODQ0NThiMzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZTAyZTI1ODUyOWM4NDUzNWE0YjE5NDc0NTQ2ZDhlYTYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMzdiNmY1MWRmNTk4NDhiZDhiNzg4YzJkMmEwYjg1M2YgPSAkKCc8ZGl2IGlkPSJodG1sXzM3YjZmNTFkZjU5ODQ4YmQ4Yjc4OGMyZDJhMGI4NTNmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Ib3dhcmQgQmVhY2gsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZTAyZTI1ODUyOWM4NDUzNWE0YjE5NDc0NTQ2ZDhlYTYuc2V0Q29udGVudChodG1sXzM3YjZmNTFkZjU5ODQ4YmQ4Yjc4OGMyZDJhMGI4NTNmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2E2YzVmOTEyOTRiOTRkNmZhMDcyM2E0MTFhMjc3MGNiLmJpbmRQb3B1cChwb3B1cF9lMDJlMjU4NTI5Yzg0NTM1YTRiMTk0NzQ1NDZkOGVhNik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8wMDFkOWFjMGU2YjM0NTNjYTk5OTRhMDUxZGFjZjlkNiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc0MjM4MTc1MDE1NjY3LC03My44NTY4MjQ5NzM0NTI1OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83YWE4MjllOGExOGU0YTBhODM5YzI1NjM4NDQ1OGIzNCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82OGJjZTg3M2NhZjY0NmEwODZjYTBiYzNmYzRlZjliYyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xZmRjYjM1MzA5NjA0OGI1OTQzN2FmYWVhNWQ3MWYxZCA9ICQoJzxkaXYgaWQ9Imh0bWxfMWZkY2IzNTMwOTYwNDhiNTk0MzdhZmFlYTVkNzFmMWQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNvcm9uYSwgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82OGJjZTg3M2NhZjY0NmEwODZjYTBiYzNmYzRlZjliYy5zZXRDb250ZW50KGh0bWxfMWZkY2IzNTMwOTYwNDhiNTk0MzdhZmFlYTVkNzFmMWQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMDAxZDlhYzBlNmIzNDUzY2E5OTk0YTA1MWRhY2Y5ZDYuYmluZFBvcHVwKHBvcHVwXzY4YmNlODczY2FmNjQ2YTA4NmNhMGJjM2ZjNGVmOWJjKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzQwZmUwNjAwZWM2ODQyNDBhNDkxMDI3ZmZlZDExMDZjID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzI1MjYzNzgyMTY1MDMsLTczLjg0NDQ3NTAwNzg4OTgzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzdhYTgyOWU4YTE4ZTRhMGE4MzljMjU2Mzg0NDU4YjM0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2UyM2IzNzI3N2UyMTQwNGU5NWUxODQ5ODRiN2JiODJkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzhkMDgzZWQ5M2M5YjQ4ZTZhMGIzYmZlZDI2ZDNlZDNmID0gJCgnPGRpdiBpZD0iaHRtbF84ZDA4M2VkOTNjOWI0OGU2YTBiM2JmZWQyNmQzZWQzZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Rm9yZXN0IEhpbGxzLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2UyM2IzNzI3N2UyMTQwNGU5NWUxODQ5ODRiN2JiODJkLnNldENvbnRlbnQoaHRtbF84ZDA4M2VkOTNjOWI0OGU2YTBiM2JmZWQyNmQzZWQzZik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl80MGZlMDYwMGVjNjg0MjQwYTQ5MTAyN2ZmZWQxMTA2Yy5iaW5kUG9wdXAocG9wdXBfZTIzYjM3Mjc3ZTIxNDA0ZTk1ZTE4NDk4NGI3YmI4MmQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNjdjZTFjNTc0NjZjNGRhZDhmMzQyODE2NzFiYTdmYzQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MDUxNzkwMzU0MTQ4LC03My44Mjk4MTkwNTgyNTcwM10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83YWE4MjllOGExOGU0YTBhODM5YzI1NjM4NDQ1OGIzNCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82NmZjZDFhNWUzMjA0ZDQ0OWMzNmI5ZTg3OGVhNmVmZSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF80ZDUxN2NmZDNlYzk0YzBmYWRlMTk3MmZkOWRmNWRjNiA9ICQoJzxkaXYgaWQ9Imh0bWxfNGQ1MTdjZmQzZWM5NGMwZmFkZTE5NzJmZDlkZjVkYzYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPktldyBHYXJkZW5zLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzY2ZmNkMWE1ZTMyMDRkNDQ5YzM2YjllODc4ZWE2ZWZlLnNldENvbnRlbnQoaHRtbF80ZDUxN2NmZDNlYzk0YzBmYWRlMTk3MmZkOWRmNWRjNik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl82N2NlMWM1NzQ2NmM0ZGFkOGYzNDI4MTY3MWJhN2ZjNC5iaW5kUG9wdXAocG9wdXBfNjZmY2QxYTVlMzIwNGQ0NDljMzZiOWU4NzhlYTZlZmUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMmM1ZDY2NzU4NDdmNGFlMTgyNGJmZWEwM2Q2MTc0YmUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42OTc5NDczMTQ3MTc2MywtNzMuODMxODMzMjE0NDY4ODddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfN2FhODI5ZThhMThlNGEwYTgzOWMyNTYzODQ0NThiMzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYmMxZTE3NjA0ZGRhNGFhNjg5YzdkZjU1YTEyYWZlZTMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNDY1ODRjMDIxZjk1NGIwMDg3NTQxMTExYmRiYmI1ZDcgPSAkKCc8ZGl2IGlkPSJodG1sXzQ2NTg0YzAyMWY5NTRiMDA4NzU0MTExMWJkYmJiNWQ3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5SaWNobW9uZCBIaWxsLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2JjMWUxNzYwNGRkYTRhYTY4OWM3ZGY1NWExMmFmZWUzLnNldENvbnRlbnQoaHRtbF80NjU4NGMwMjFmOTU0YjAwODc1NDExMTFiZGJiYjVkNyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8yYzVkNjY3NTg0N2Y0YWUxODI0YmZlYTAzZDYxNzRiZS5iaW5kUG9wdXAocG9wdXBfYmMxZTE3NjA0ZGRhNGFhNjg5YzdkZjU1YTEyYWZlZTMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYWNlMGU2NjY1NWIwNDA0ODhhOTMwNTc4MWIyZmM0YmMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NjQ0NTQxOTY5Nzg0NiwtNzMuODMxNzczMDAzMjk1ODJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfN2FhODI5ZThhMThlNGEwYTgzOWMyNTYzODQ0NThiMzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMDE0ZGI3YzdkZWE2NGZmNDkwNzI0MjUxNTM4NzUwOGIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNzU3NGQ1YTdmNTljNGNlMmJlYjliMDBmZTI5MmFhNTcgPSAkKCc8ZGl2IGlkPSJodG1sXzc1NzRkNWE3ZjU5YzRjZTJiZWI5YjAwZmUyOTJhYTU3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5GbHVzaGluZywgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wMTRkYjdjN2RlYTY0ZmY0OTA3MjQyNTE1Mzg3NTA4Yi5zZXRDb250ZW50KGh0bWxfNzU3NGQ1YTdmNTljNGNlMmJlYjliMDBmZTI5MmFhNTcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYWNlMGU2NjY1NWIwNDA0ODhhOTMwNTc4MWIyZmM0YmMuYmluZFBvcHVwKHBvcHVwXzAxNGRiN2M3ZGVhNjRmZjQ5MDcyNDI1MTUzODc1MDhiKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzNjYTg4ZDkwZDFhNjRhOTBhNmQ5YzMwNjAwNGIwMTcwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzUwMjE3MzQ2MTA1MjgsLTczLjkzOTIwMjIzOTE1NTA1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzdhYTgyOWU4YTE4ZTRhMGE4MzljMjU2Mzg0NDU4YjM0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2M5Zjk3NDZjN2NhMDQyMzg4YmVkZWI2MjlhY2VjMmU3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzRjY2Y3ZjIzOTdjNzQ5N2U4MWI0Y2ViZjZlMzU1NDRhID0gJCgnPGRpdiBpZD0iaHRtbF80Y2NmN2YyMzk3Yzc0OTdlODFiNGNlYmY2ZTM1NTQ0YSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TG9uZyBJc2xhbmQgQ2l0eSwgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jOWY5NzQ2YzdjYTA0MjM4OGJlZGViNjI5YWNlYzJlNy5zZXRDb250ZW50KGh0bWxfNGNjZjdmMjM5N2M3NDk3ZTgxYjRjZWJmNmUzNTU0NGEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfM2NhODhkOTBkMWE2NGE5MGE2ZDljMzA2MDA0YjAxNzAuYmluZFBvcHVwKHBvcHVwX2M5Zjk3NDZjN2NhMDQyMzg4YmVkZWI2MjlhY2VjMmU3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2I5MDk5Y2QwYTRhYzQ2ZjNiMzQxMGQwZjY3MGIwMDU4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzQwMTc2MjgzNTE5MjQsLTczLjkyNjkxNjE3NTYxNTc3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzdhYTgyOWU4YTE4ZTRhMGE4MzljMjU2Mzg0NDU4YjM0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzM2YmNhZmI5NTQ0YzRjZGY4OWFjZDQzNDU5NTA5YTA3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2U0YmU5YTBiZTQ5ZTQ0YjM5MTQwY2NkNmUyOThhNDk1ID0gJCgnPGRpdiBpZD0iaHRtbF9lNGJlOWEwYmU0OWU0NGIzOTE0MGNjZDZlMjk4YTQ5NSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U3VubnlzaWRlLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzM2YmNhZmI5NTQ0YzRjZGY4OWFjZDQzNDU5NTA5YTA3LnNldENvbnRlbnQoaHRtbF9lNGJlOWEwYmU0OWU0NGIzOTE0MGNjZDZlMjk4YTQ5NSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9iOTA5OWNkMGE0YWM0NmYzYjM0MTBkMGY2NzBiMDA1OC5iaW5kUG9wdXAocG9wdXBfMzZiY2FmYjk1NDRjNGNkZjg5YWNkNDM0NTk1MDlhMDcpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMGRiMzVlYmU5Njk1NGVjMWJiODRkZTk0ZWQ5NjRhZTkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NjQwNzMyMzg4MzA5MSwtNzMuODY3MDQxNDc2NTg3NzJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfN2FhODI5ZThhMThlNGEwYTgzOWMyNTYzODQ0NThiMzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOThkMWM3N2FjYTllNGNlMjgxYTg4MTg2YzliY2IyNmYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOWUzMjM0ODI0ZmU2NDU5YjlkMzg1YmE2NDgyZTJhNDIgPSAkKCc8ZGl2IGlkPSJodG1sXzllMzIzNDgyNGZlNjQ1OWI5ZDM4NWJhNjQ4MmUyYTQyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5FYXN0IEVsbWh1cnN0LCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzk4ZDFjNzdhY2E5ZTRjZTI4MWE4ODE4NmM5YmNiMjZmLnNldENvbnRlbnQoaHRtbF85ZTMyMzQ4MjRmZTY0NTliOWQzODViYTY0ODJlMmE0Mik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8wZGIzNWViZTk2OTU0ZWMxYmI4NGRlOTRlZDk2NGFlOS5iaW5kUG9wdXAocG9wdXBfOThkMWM3N2FjYTllNGNlMjgxYTg4MTg2YzliY2IyNmYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOTE5YzhiN2UwMzY4NGYwNjkwNjQzMzBlYjE4NGRhZTYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MjU0MjczNzQwOTM2MDYsLTczLjg5NjIxNzEzNjI2ODU5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzdhYTgyOWU4YTE4ZTRhMGE4MzljMjU2Mzg0NDU4YjM0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2E1MDM2N2M4YzY5MzRhNTNiNzE1ZDZhNTVmOGEzMjU0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzBhODBkOGMxYjdiZTQzYzNhNmU0NjRmMGVlYTUzZDM5ID0gJCgnPGRpdiBpZD0iaHRtbF8wYTgwZDhjMWI3YmU0M2MzYTZlNDY0ZjBlZWE1M2QzOSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TWFzcGV0aCwgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hNTAzNjdjOGM2OTM0YTUzYjcxNWQ2YTU1ZjhhMzI1NC5zZXRDb250ZW50KGh0bWxfMGE4MGQ4YzFiN2JlNDNjM2E2ZTQ2NGYwZWVhNTNkMzkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOTE5YzhiN2UwMzY4NGYwNjkwNjQzMzBlYjE4NGRhZTYuYmluZFBvcHVwKHBvcHVwX2E1MDM2N2M4YzY5MzRhNTNiNzE1ZDZhNTVmOGEzMjU0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2Q0ZDQzNGI4MzhmMTQzY2Q4NzgzZGNjYzY1YzdkNjJjID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzA4MzIzMTU2MTM4NTgsLTczLjkwMTQzNTE3NTU5NTg5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzdhYTgyOWU4YTE4ZTRhMGE4MzljMjU2Mzg0NDU4YjM0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzRkZWQxOWNjOGRlNTQ3YzdhYjYxNDVjOTlkMjFhZDg4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzA2NjE3OWU4ZmYyNDQzOTliOTNkZTNhZTQ2YzNhZThmID0gJCgnPGRpdiBpZD0iaHRtbF8wNjYxNzllOGZmMjQ0Mzk5YjkzZGUzYWU0NmMzYWU4ZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UmlkZ2V3b29kLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzRkZWQxOWNjOGRlNTQ3YzdhYjYxNDVjOTlkMjFhZDg4LnNldENvbnRlbnQoaHRtbF8wNjYxNzllOGZmMjQ0Mzk5YjkzZGUzYWU0NmMzYWU4Zik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9kNGQ0MzRiODM4ZjE0M2NkODc4M2RjY2M2NWM3ZDYyYy5iaW5kUG9wdXAocG9wdXBfNGRlZDE5Y2M4ZGU1NDdjN2FiNjE0NWM5OWQyMWFkODgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYTM3ODM5MjM4ZWY0NDk4YWIyMDE0ZDA0MmY2YmNiZGUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MDI3NjI0Mjk2NzgzOCwtNzMuODcwNzQxNjc0MzU2MDVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfN2FhODI5ZThhMThlNGEwYTgzOWMyNTYzODQ0NThiMzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZGJmOTJkYzVhOTUyNDllNWJkOWJiNTQ0YjM3NTYxMjUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNmFiMGI0NWQyYjYzNGU1NDkyNTkzZDhlZGQyZTAwMzAgPSAkKCc8ZGl2IGlkPSJodG1sXzZhYjBiNDVkMmI2MzRlNTQ5MjU5M2Q4ZWRkMmUwMDMwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5HbGVuZGFsZSwgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kYmY5MmRjNWE5NTI0OWU1YmQ5YmI1NDRiMzc1NjEyNS5zZXRDb250ZW50KGh0bWxfNmFiMGI0NWQyYjYzNGU1NDkyNTkzZDhlZGQyZTAwMzApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYTM3ODM5MjM4ZWY0NDk4YWIyMDE0ZDA0MmY2YmNiZGUuYmluZFBvcHVwKHBvcHVwX2RiZjkyZGM1YTk1MjQ5ZTViZDliYjU0NGIzNzU2MTI1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2Y0MDY4NmUzZjI2MjQ1NjQ5ZjFkYjQzNWMxMDk0YWYyID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzI4OTc0MDk0ODA3MzUsLTczLjg1NzgyNjg2OTA1MzddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfN2FhODI5ZThhMThlNGEwYTgzOWMyNTYzODQ0NThiMzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYWY0MGU0ZWRhODFhNDRkOGE3ZWE3NWI4OTMwNzIxZDEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMWE3NTk1YmZhNjQ4NGIzYTk5NTNhYzFiZjI3MjMwYWEgPSAkKCc8ZGl2IGlkPSJodG1sXzFhNzU5NWJmYTY0ODRiM2E5OTUzYWMxYmYyNzIzMGFhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5SZWdvIFBhcmssIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYWY0MGU0ZWRhODFhNDRkOGE3ZWE3NWI4OTMwNzIxZDEuc2V0Q29udGVudChodG1sXzFhNzU5NWJmYTY0ODRiM2E5OTUzYWMxYmYyNzIzMGFhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2Y0MDY4NmUzZjI2MjQ1NjQ5ZjFkYjQzNWMxMDk0YWYyLmJpbmRQb3B1cChwb3B1cF9hZjQwZTRlZGE4MWE0NGQ4YTdlYTc1Yjg5MzA3MjFkMSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85MDc2ZjFiZDMyNjU0OTk3ODIyYjgyNjU0MWRkZWQ2OCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY4OTg4Njg3OTE1Nzg5LC03My44NTgxMTA0NjU1NDMyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzdhYTgyOWU4YTE4ZTRhMGE4MzljMjU2Mzg0NDU4YjM0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzExNGVkMGE4NTRiMzQyMjE4NmQ0ZDczMjZiYmJhMWIxID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2Y5MzljZDdjYTk0ODRjMGE5NmRmNWNjYmE3YjY2YjU5ID0gJCgnPGRpdiBpZD0iaHRtbF9mOTM5Y2Q3Y2E5NDg0YzBhOTZkZjVjY2JhN2I2NmI1OSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+V29vZGhhdmVuLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzExNGVkMGE4NTRiMzQyMjE4NmQ0ZDczMjZiYmJhMWIxLnNldENvbnRlbnQoaHRtbF9mOTM5Y2Q3Y2E5NDg0YzBhOTZkZjVjY2JhN2I2NmI1OSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl85MDc2ZjFiZDMyNjU0OTk3ODIyYjgyNjU0MWRkZWQ2OC5iaW5kUG9wdXAocG9wdXBfMTE0ZWQwYTg1NGIzNDIyMTg2ZDRkNzMyNmJiYmExYjEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNTAwYzIwNjNhOGJjNGRjNzllNzAxZWU0YjgyNjJlMTAgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42ODA3MDg0NjgyNjU0MTUsLTczLjg0MzIwMjY2MTczNDQ3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzdhYTgyOWU4YTE4ZTRhMGE4MzljMjU2Mzg0NDU4YjM0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2FjYWFkNmNjYzg5MTQ1NWJhODQ2YTM1NDUxNmFjZGQ2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzAzYTI3ZTI0NTZlNzQ5NGM4OTc1N2NkYTA1ZTA5ZDVkID0gJCgnPGRpdiBpZD0iaHRtbF8wM2EyN2UyNDU2ZTc0OTRjODk3NTdjZGEwNWUwOWQ1ZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+T3pvbmUgUGFyaywgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hY2FhZDZjY2M4OTE0NTViYTg0NmEzNTQ1MTZhY2RkNi5zZXRDb250ZW50KGh0bWxfMDNhMjdlMjQ1NmU3NDk0Yzg5NzU3Y2RhMDVlMDlkNWQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNTAwYzIwNjNhOGJjNGRjNzllNzAxZWU0YjgyNjJlMTAuYmluZFBvcHVwKHBvcHVwX2FjYWFkNmNjYzg5MTQ1NWJhODQ2YTM1NDUxNmFjZGQ2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2VmZmYyM2JlZTg3YTQ2ZGRhYmI1MjM0MTdhMTYzNDRmID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjY4NTQ5NTc3NjcxOTUsLTczLjgwOTg2NDc4NjQ5MDQxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzdhYTgyOWU4YTE4ZTRhMGE4MzljMjU2Mzg0NDU4YjM0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzVjODgyYmU5ZDhhZjQxYzdiZWMzZjgyYmM1YzdjNGM5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzA3ZTU2Zjg4M2VlMzRlN2Q5NDg3YTQzNTY2MzYxYmQ1ID0gJCgnPGRpdiBpZD0iaHRtbF8wN2U1NmY4ODNlZTM0ZTdkOTQ4N2E0MzU2NjM2MWJkNSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U291dGggT3pvbmUgUGFyaywgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81Yzg4MmJlOWQ4YWY0MWM3YmVjM2Y4MmJjNWM3YzRjOS5zZXRDb250ZW50KGh0bWxfMDdlNTZmODgzZWUzNGU3ZDk0ODdhNDM1NjYzNjFiZDUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZWZmZjIzYmVlODdhNDZkZGFiYjUyMzQxN2ExNjM0NGYuYmluZFBvcHVwKHBvcHVwXzVjODgyYmU5ZDhhZjQxYzdiZWMzZjgyYmM1YzdjNGM5KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzNjZmNkYTZmMzliZTQwOWE4OWJmNTc4NjkxYjk1ZDA0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzg0OTAyNzQ5MjYwMjA1LC03My44NDMwNDUyODg5NjEyNV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83YWE4MjllOGExOGU0YTBhODM5YzI1NjM4NDQ1OGIzNCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9kNjQ2Y2NiYTQ1N2Y0NzgyYjYwOWY4YzcxZTg4MGNjOCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83MDI2NjllOWYzNzA0YjQzOTU0OWU0ZGUxODQ0NmMyOCA9ICQoJzxkaXYgaWQ9Imh0bWxfNzAyNjY5ZTlmMzcwNGI0Mzk1NDllNGRlMTg0NDZjMjgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNvbGxlZ2UgUG9pbnQsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZDY0NmNjYmE0NTdmNDc4MmI2MDlmOGM3MWU4ODBjYzguc2V0Q29udGVudChodG1sXzcwMjY2OWU5ZjM3MDRiNDM5NTQ5ZTRkZTE4NDQ2YzI4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzNjZmNkYTZmMzliZTQwOWE4OWJmNTc4NjkxYjk1ZDA0LmJpbmRQb3B1cChwb3B1cF9kNjQ2Y2NiYTQ1N2Y0NzgyYjYwOWY4YzcxZTg4MGNjOCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8zMDZhNGQ5ODFlMTQ0NDBiYjg1ZGJiMDVkMzQ4YWI4YiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc4MTI5MDc2NjAyNjk0LC03My44MTQyMDIxNjYxMDg2M10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83YWE4MjllOGExOGU0YTBhODM5YzI1NjM4NDQ1OGIzNCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF80ZDFhMmJiN2RiYzM0MDU2OTliOGM3ZDZkOGNjOWY2NSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iNzM4MmQxMWVhODY0YTNiYTg2MjhkNzQ2MTY5YWExMSA9ICQoJzxkaXYgaWQ9Imh0bWxfYjczODJkMTFlYTg2NGEzYmE4NjI4ZDc0NjE2OWFhMTEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPldoaXRlc3RvbmUsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNGQxYTJiYjdkYmMzNDA1Njk5YjhjN2Q2ZDhjYzlmNjUuc2V0Q29udGVudChodG1sX2I3MzgyZDExZWE4NjRhM2JhODYyOGQ3NDYxNjlhYTExKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzMwNmE0ZDk4MWUxNDQ0MGJiODVkYmIwNWQzNDhhYjhiLmJpbmRQb3B1cChwb3B1cF80ZDFhMmJiN2RiYzM0MDU2OTliOGM3ZDZkOGNjOWY2NSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8zMWIzYWE4YzdhYzQ0YThmOGMyYjRlMGNjZWVmZDJjOCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc2NjA0MDYzMjgxMDY0LC03My43NzQyNzM2MzA2ODY3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzdhYTgyOWU4YTE4ZTRhMGE4MzljMjU2Mzg0NDU4YjM0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzRhMTgwZDNjYzZkODQzNGNiNDU4ZDFkMjMyY2Y2ZGZjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzZmMTNiMTAzOWYwYTQ3ZTY5ZTRmYjA2M2FmMDBmYzQ1ID0gJCgnPGRpdiBpZD0iaHRtbF82ZjEzYjEwMzlmMGE0N2U2OWU0ZmIwNjNhZjAwZmM0NSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QmF5c2lkZSwgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80YTE4MGQzY2M2ZDg0MzRjYjQ1OGQxZDIzMmNmNmRmYy5zZXRDb250ZW50KGh0bWxfNmYxM2IxMDM5ZjBhNDdlNjllNGZiMDYzYWYwMGZjNDUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMzFiM2FhOGM3YWM0NGE4ZjhjMmI0ZTBjY2VlZmQyYzguYmluZFBvcHVwKHBvcHVwXzRhMTgwZDNjYzZkODQzNGNiNDU4ZDFkMjMyY2Y2ZGZjKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzNiZTNhMjIxMWM2YjQ5OGViMjM3NTE0NDA0NTRkNzQzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzYxNzI5NTQ5MDMyNjIsLTczLjc5MTc2MjQzNzI4MDYxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzdhYTgyOWU4YTE4ZTRhMGE4MzljMjU2Mzg0NDU4YjM0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzU0NDc1ZTQ2ZTcwNzQ5ZTlhMjRlOGU3OWMzODhkODJhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzMzZTEwMzE3YzVmYjRhZWRiZWU0Yzc4MzAyZjUyMTlmID0gJCgnPGRpdiBpZD0iaHRtbF8zM2UxMDMxN2M1ZmI0YWVkYmVlNGM3ODMwMmY1MjE5ZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QXVidXJuZGFsZSwgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81NDQ3NWU0NmU3MDc0OWU5YTI0ZThlNzljMzg4ZDgyYS5zZXRDb250ZW50KGh0bWxfMzNlMTAzMTdjNWZiNGFlZGJlZTRjNzgzMDJmNTIxOWYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfM2JlM2EyMjExYzZiNDk4ZWIyMzc1MTQ0MDQ1NGQ3NDMuYmluZFBvcHVwKHBvcHVwXzU0NDc1ZTQ2ZTcwNzQ5ZTlhMjRlOGU3OWMzODhkODJhKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzE4MGEzZGY3M2MwODQ0MzY5YzNlOWUwYjBkZWZlODMxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzcwODI2MTkyODI2NywtNzMuNzM4ODk3NzU1ODA3NF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83YWE4MjllOGExOGU0YTBhODM5YzI1NjM4NDQ1OGIzNCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zNDMxNTgzMDA5ZjA0YmVjOTI1YTkzZGNhZDI5ZjY5OSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82MjY0YTg2OGEyZDA0ODgyOWMyMjlkMmY1ZWU1MWQ3ZCA9ICQoJzxkaXYgaWQ9Imh0bWxfNjI2NGE4NjhhMmQwNDg4MjljMjI5ZDJmNWVlNTFkN2QiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkxpdHRsZSBOZWNrLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzM0MzE1ODMwMDlmMDRiZWM5MjVhOTNkY2FkMjlmNjk5LnNldENvbnRlbnQoaHRtbF82MjY0YTg2OGEyZDA0ODgyOWMyMjlkMmY1ZWU1MWQ3ZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8xODBhM2RmNzNjMDg0NDM2OWMzZTllMGIwZGVmZTgzMS5iaW5kUG9wdXAocG9wdXBfMzQzMTU4MzAwOWYwNGJlYzkyNWE5M2RjYWQyOWY2OTkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOGI0ZTA2ZjgyZjY0NDVhMjhjOGI0NjE1ZWFhYjA0MGIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NjY4NDYwOTc5MDc2MywtNzMuNzQyNDk4MjA3MjczM10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83YWE4MjllOGExOGU0YTBhODM5YzI1NjM4NDQ1OGIzNCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85MGNlNTliNThmYzE0ODQ1YThlYWFjN2RhN2M1NjEzMSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF85NWVhMjY1MDg3MmM0NzBlYjNlMzRmNDJkOThjYmQwMiA9ICQoJzxkaXYgaWQ9Imh0bWxfOTVlYTI2NTA4NzJjNDcwZWIzZTM0ZjQyZDk4Y2JkMDIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkRvdWdsYXN0b24sIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOTBjZTU5YjU4ZmMxNDg0NWE4ZWFhYzdkYTdjNTYxMzEuc2V0Q29udGVudChodG1sXzk1ZWEyNjUwODcyYzQ3MGViM2UzNGY0MmQ5OGNiZDAyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzhiNGUwNmY4MmY2NDQ1YTI4YzhiNDYxNWVhYWIwNDBiLmJpbmRQb3B1cChwb3B1cF85MGNlNTliNThmYzE0ODQ1YThlYWFjN2RhN2M1NjEzMSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jYWUzYjIzN2QzZGY0ZTdhODgzNTk1ZjBkNzE5MmQ1MyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc0OTQ0MDc5OTc0MzMyLC03My43MTU0ODExODk5OTE0NV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83YWE4MjllOGExOGU0YTBhODM5YzI1NjM4NDQ1OGIzNCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xZTJlMTcwNTRkNWQ0MDc4OTYwMWIwNTE0ZjQ3NmI4NiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zNjIwZjU1ZTliNTE0NjM4OWFmMmEwMDMxNGUyYTgyOCA9ICQoJzxkaXYgaWQ9Imh0bWxfMzYyMGY1NWU5YjUxNDYzODlhZjJhMDAzMTRlMmE4MjgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkdsZW4gT2FrcywgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xZTJlMTcwNTRkNWQ0MDc4OTYwMWIwNTE0ZjQ3NmI4Ni5zZXRDb250ZW50KGh0bWxfMzYyMGY1NWU5YjUxNDYzODlhZjJhMDAzMTRlMmE4MjgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfY2FlM2IyMzdkM2RmNGU3YTg4MzU5NWYwZDcxOTJkNTMuYmluZFBvcHVwKHBvcHVwXzFlMmUxNzA1NGQ1ZDQwNzg5NjAxYjA1MTRmNDc2Yjg2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2RmMzVlN2JkODI1ZjQ0NGViYjQwOWRjMDFkN2JmYzAwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzI4NTczMTgxNzY2NzUsLTczLjcyMDEyODE0ODI2OTAzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzdhYTgyOWU4YTE4ZTRhMGE4MzljMjU2Mzg0NDU4YjM0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2IyMjA1OTdjZTA1OTQ0ODQ4ZDIwOTQ3MDliYzM0OWJiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzQ1NWE0YzcxNjBhYzQzMDRhMTBkYjM0OTM4MjEzZDZmID0gJCgnPGRpdiBpZD0iaHRtbF80NTVhNGM3MTYwYWM0MzA0YTEwZGIzNDkzODIxM2Q2ZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QmVsbGVyb3NlLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2IyMjA1OTdjZTA1OTQ0ODQ4ZDIwOTQ3MDliYzM0OWJiLnNldENvbnRlbnQoaHRtbF80NTVhNGM3MTYwYWM0MzA0YTEwZGIzNDkzODIxM2Q2Zik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9kZjM1ZTdiZDgyNWY0NDRlYmI0MDlkYzAxZDdiZmMwMC5iaW5kUG9wdXAocG9wdXBfYjIyMDU5N2NlMDU5NDQ4NDhkMjA5NDcwOWJjMzQ5YmIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMDlmMTZhZWM3MDFlNGZjOTkxNzJhMTE1MTlmZTlhYmYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MjI1NzgyNDQyMjgwNDYsLTczLjgyMDg3NzY0OTMzNTY2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzdhYTgyOWU4YTE4ZTRhMGE4MzljMjU2Mzg0NDU4YjM0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2RmOGQ0MGVhNTlkNjRmOTU4MDczZTBhMzkzNTUyOTZkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzY5YjBlNzJkNzM1NjRlOTM5ZTYwMWY1YmZmNTFhZjg3ID0gJCgnPGRpdiBpZD0iaHRtbF82OWIwZTcyZDczNTY0ZTkzOWU2MDFmNWJmZjUxYWY4NyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+S2V3IEdhcmRlbnMgSGlsbHMsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZGY4ZDQwZWE1OWQ2NGY5NTgwNzNlMGEzOTM1NTI5NmQuc2V0Q29udGVudChodG1sXzY5YjBlNzJkNzM1NjRlOTM5ZTYwMWY1YmZmNTFhZjg3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzA5ZjE2YWVjNzAxZTRmYzk5MTcyYTExNTE5ZmU5YWJmLmJpbmRQb3B1cChwb3B1cF9kZjhkNDBlYTU5ZDY0Zjk1ODA3M2UwYTM5MzU1Mjk2ZCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl84NmRjMWZmYzUyMWY0NjdjYjdkNThiYjUyZGY4MzRjMCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjczNDM5NDQ2NTMzMTMsLTczLjc4MjcxMzM3MDAzMjY0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzdhYTgyOWU4YTE4ZTRhMGE4MzljMjU2Mzg0NDU4YjM0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2ViOTRhNzcxMmE2YTQ5NTliZjU5N2RiODJjNTQ3YjE5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzNlYmRhNTg5Nzg0NDRlN2I5MDJjN2E5YmExNjljNGQ4ID0gJCgnPGRpdiBpZD0iaHRtbF8zZWJkYTU4OTc4NDQ0ZTdiOTAyYzdhOWJhMTY5YzRkOCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RnJlc2ggTWVhZG93cywgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lYjk0YTc3MTJhNmE0OTU5YmY1OTdkYjgyYzU0N2IxOS5zZXRDb250ZW50KGh0bWxfM2ViZGE1ODk3ODQ0NGU3YjkwMmM3YTliYTE2OWM0ZDgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfODZkYzFmZmM1MjFmNDY3Y2I3ZDU4YmI1MmRmODM0YzAuYmluZFBvcHVwKHBvcHVwX2ViOTRhNzcxMmE2YTQ5NTliZjU5N2RiODJjNTQ3YjE5KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzgxYzA2M2NiNTQyMTQ4YzE4ZGVlMzkzMGEyNTE1YzlkID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzEwOTM1NDcyNTIyNzEsLTczLjgxMTc0ODIyNDU4NjM0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzdhYTgyOWU4YTE4ZTRhMGE4MzljMjU2Mzg0NDU4YjM0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzJiYmNiOTRlYjRlNTQ3Y2I5ZWRjYTZjODUwY2E0NDk4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2E1YjQwNTQ1MjhhYjQ2ODQ5NmUwZWQxYTcxNDM2YzE1ID0gJCgnPGRpdiBpZD0iaHRtbF9hNWI0MDU0NTI4YWI0Njg0OTZlMGVkMWE3MTQzNmMxNSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QnJpYXJ3b29kLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzJiYmNiOTRlYjRlNTQ3Y2I5ZWRjYTZjODUwY2E0NDk4LnNldENvbnRlbnQoaHRtbF9hNWI0MDU0NTI4YWI0Njg0OTZlMGVkMWE3MTQzNmMxNSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl84MWMwNjNjYjU0MjE0OGMxOGRlZTM5MzBhMjUxNWM5ZC5iaW5kUG9wdXAocG9wdXBfMmJiY2I5NGViNGU1NDdjYjllZGNhNmM4NTBjYTQ0OTgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfM2IwZmYzMjY1M2NjNDBiZDhiODNiY2Y0ZDczMmMxY2MgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MDQ2NTczNjA2ODcxNywtNzMuNzk2OTAxNjU4ODgyODldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfN2FhODI5ZThhMThlNGEwYTgzOWMyNTYzODQ0NThiMzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNjM3ZTBiMDEwYmJiNDcwOWExODdiNTlmYjI5MTM2NWQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYzc0YTRiZDMxMDE0NGVjMWFmZjc5N2JjNmViMzU2YmIgPSAkKCc8ZGl2IGlkPSJodG1sX2M3NGE0YmQzMTAxNDRlYzFhZmY3OTdiYzZlYjM1NmJiIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5KYW1haWNhIENlbnRlciwgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82MzdlMGIwMTBiYmI0NzA5YTE4N2I1OWZiMjkxMzY1ZC5zZXRDb250ZW50KGh0bWxfYzc0YTRiZDMxMDE0NGVjMWFmZjc5N2JjNmViMzU2YmIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfM2IwZmYzMjY1M2NjNDBiZDhiODNiY2Y0ZDczMmMxY2MuYmluZFBvcHVwKHBvcHVwXzYzN2UwYjAxMGJiYjQ3MDlhMTg3YjU5ZmIyOTEzNjVkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzI2YTBjNTI0YzEwNDQxMDJhODc1ZDFkYWViYWI4N2UzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzQ1NjE4NTcxNDE4NTUsLTczLjc1NDk0OTc2MjM0MzMyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzdhYTgyOWU4YTE4ZTRhMGE4MzljMjU2Mzg0NDU4YjM0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2UyNGIyNjZlMjMzOTQzZmE5ODZjYTg5ZTFiNjIxNWY0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2UyZThiZDI4NGUyZDQzZmM4ZDJlMWM0NjljNTFiYmU3ID0gJCgnPGRpdiBpZD0iaHRtbF9lMmU4YmQyODRlMmQ0M2ZjOGQyZTFjNDY5YzUxYmJlNyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+T2FrbGFuZCBHYXJkZW5zLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2UyNGIyNjZlMjMzOTQzZmE5ODZjYTg5ZTFiNjIxNWY0LnNldENvbnRlbnQoaHRtbF9lMmU4YmQyODRlMmQ0M2ZjOGQyZTFjNDY5YzUxYmJlNyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8yNmEwYzUyNGMxMDQ0MTAyYTg3NWQxZGFlYmFiODdlMy5iaW5kUG9wdXAocG9wdXBfZTI0YjI2NmUyMzM5NDNmYTk4NmNhODllMWI2MjE1ZjQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZTlkZjI4MWMzMjY4NDI4MWI2YjRiOGVhMGUyNDVjOTcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MTg4OTMwOTIxNjczNTYsLTczLjczODcxNDg0NTc4NDI0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzdhYTgyOWU4YTE4ZTRhMGE4MzljMjU2Mzg0NDU4YjM0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2Y2Nzg0NDQ0MTRkZjRlYTg5MDVmMDg5N2UwODc5ZDNlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzg1YzliMGViY2E4MTQyYmZiNjc2OWRhOTMzNWFlNDJhID0gJCgnPGRpdiBpZD0iaHRtbF84NWM5YjBlYmNhODE0MmJmYjY3NjlkYTkzMzVhZTQyYSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UXVlZW5zIFZpbGxhZ2UsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZjY3ODQ0NDQxNGRmNGVhODkwNWYwODk3ZTA4NzlkM2Uuc2V0Q29udGVudChodG1sXzg1YzliMGViY2E4MTQyYmZiNjc2OWRhOTMzNWFlNDJhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2U5ZGYyODFjMzI2ODQyODFiNmI0YjhlYTBlMjQ1Yzk3LmJpbmRQb3B1cChwb3B1cF9mNjc4NDQ0NDE0ZGY0ZWE4OTA1ZjA4OTdlMDg3OWQzZSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9hMTMyZjhiNGQ2Nzg0Y2U3OTI2MzBkOGIxYjg3YzQyMiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjcxMTI0MzQ0MTkxOTA0LC03My43NTkyNTAwOTMzNTU5NF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83YWE4MjllOGExOGU0YTBhODM5YzI1NjM4NDQ1OGIzNCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF81MWEwZTA2YzgzYWM0OWVmOWFjNGMxMzk0NTU0YTJlMiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zZDg1NjYwODRmNWQ0YWIxYTlhZDk5ZjNmYzc3YWE1MSA9ICQoJzxkaXYgaWQ9Imh0bWxfM2Q4NTY2MDg0ZjVkNGFiMWE5YWQ5OWYzZmM3N2FhNTEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkhvbGxpcywgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81MWEwZTA2YzgzYWM0OWVmOWFjNGMxMzk0NTU0YTJlMi5zZXRDb250ZW50KGh0bWxfM2Q4NTY2MDg0ZjVkNGFiMWE5YWQ5OWYzZmM3N2FhNTEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYTEzMmY4YjRkNjc4NGNlNzkyNjMwZDhiMWI4N2M0MjIuYmluZFBvcHVwKHBvcHVwXzUxYTBlMDZjODNhYzQ5ZWY5YWM0YzEzOTQ1NTRhMmUyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2E2MDBmZGY3NDEwOTQxY2VhYmRhNDBmMTdiM2ZkZDI2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjk2OTExMjUzNzg5ODg1LC03My43OTA0MjYxMzEzNTU0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzdhYTgyOWU4YTE4ZTRhMGE4MzljMjU2Mzg0NDU4YjM0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2JjN2U4NjMwMjQzNDQ5YzQ4NzZmYmVlYTNhYjJmMjIxID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzg0ZTA0NjUxZjkxODQ4NmQ5ZmUxZjAxODM1YzNlOTg5ID0gJCgnPGRpdiBpZD0iaHRtbF84NGUwNDY1MWY5MTg0ODZkOWZlMWYwMTgzNWMzZTk4OSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U291dGggSmFtYWljYSwgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iYzdlODYzMDI0MzQ0OWM0ODc2ZmJlZWEzYWIyZjIyMS5zZXRDb250ZW50KGh0bWxfODRlMDQ2NTFmOTE4NDg2ZDlmZTFmMDE4MzVjM2U5ODkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYTYwMGZkZjc0MTA5NDFjZWFiZGE0MGYxN2IzZmRkMjYuYmluZFBvcHVwKHBvcHVwX2JjN2U4NjMwMjQzNDQ5YzQ4NzZmYmVlYTNhYjJmMjIxKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2M3ZmU0ZTQ5NTY5MTRlOTY4M2JhNTYyZGMyOGExNzc3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjk0NDQ1Mzg1MjIzNTksLTczLjc1ODY3NjAzNzI3NzE3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzdhYTgyOWU4YTE4ZTRhMGE4MzljMjU2Mzg0NDU4YjM0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzc3OTI1NjEyYTA3MzRhZWI5ZWZkMDA2ZGRiZWUyNGM3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2JlMDAzMDJmMTU5ZjQyNjdiYzA5OTI3NjE3MTRhOGY1ID0gJCgnPGRpdiBpZD0iaHRtbF9iZTAwMzAyZjE1OWY0MjY3YmMwOTkyNzYxNzE0YThmNSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U3QuIEFsYmFucywgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83NzkyNTYxMmEwNzM0YWViOWVmZDAwNmRkYmVlMjRjNy5zZXRDb250ZW50KGh0bWxfYmUwMDMwMmYxNTlmNDI2N2JjMDk5Mjc2MTcxNGE4ZjUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYzdmZTRlNDk1NjkxNGU5NjgzYmE1NjJkYzI4YTE3NzcuYmluZFBvcHVwKHBvcHVwXzc3OTI1NjEyYTA3MzRhZWI5ZWZkMDA2ZGRiZWUyNGM3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzg4OTUzMTYxZTE4MTRhMDJhNjExMTg5ZWE3ODRiNTIzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjc1MjExMzk1OTE3MzMsLTczLjc3MjU4Nzg3NjIwOTA2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzdhYTgyOWU4YTE4ZTRhMGE4MzljMjU2Mzg0NDU4YjM0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2M4Nzk1M2M0NGZhMzRmMzg4MmRkNmE0ZGYyMTFkYjAyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzU2Njc3MjZjMzU3MzQyNWU5YjI1OTI0ZjRmY2NjZTdlID0gJCgnPGRpdiBpZD0iaHRtbF81NjY3NzI2YzM1NzM0MjVlOWIyNTkyNGY0ZmNjY2U3ZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Um9jaGRhbGUsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYzg3OTUzYzQ0ZmEzNGYzODgyZGQ2YTRkZjIxMWRiMDIuc2V0Q29udGVudChodG1sXzU2Njc3MjZjMzU3MzQyNWU5YjI1OTI0ZjRmY2NjZTdlKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzg4OTUzMTYxZTE4MTRhMDJhNjExMTg5ZWE3ODRiNTIzLmJpbmRQb3B1cChwb3B1cF9jODc5NTNjNDRmYTM0ZjM4ODJkZDZhNGRmMjExZGIwMik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8yZGM0MzgzOWVmNDY0MjE2OWQxNDgzNzdmMGE4ZmRjYiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY2NjIzMDQ5MDM2ODU4NCwtNzMuNzYwNDIwOTI2ODIyODddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfN2FhODI5ZThhMThlNGEwYTgzOWMyNTYzODQ0NThiMzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYmZiZTZlZWUwZjg4NDM0ODllNWM4ZGIzZTU1MmE2YTIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMWViMTQ1MDViNzBkNGM3ZmI2NjFhZTdiYTY3YTVjMmQgPSAkKCc8ZGl2IGlkPSJodG1sXzFlYjE0NTA1YjcwZDRjN2ZiNjYxYWU3YmE2N2E1YzJkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5TcHJpbmdmaWVsZCBHYXJkZW5zLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2JmYmU2ZWVlMGY4ODQzNDg5ZTVjOGRiM2U1NTJhNmEyLnNldENvbnRlbnQoaHRtbF8xZWIxNDUwNWI3MGQ0YzdmYjY2MWFlN2JhNjdhNWMyZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8yZGM0MzgzOWVmNDY0MjE2OWQxNDgzNzdmMGE4ZmRjYi5iaW5kUG9wdXAocG9wdXBfYmZiZTZlZWUwZjg4NDM0ODllNWM4ZGIzZTU1MmE2YTIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfN2QxYzIxODdmMDg5NGQ5MTg3MjM0YTU1NmM0NjgwZWIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42OTI3NzQ2MzkxNjA4NDUsLTczLjczNTI2ODczNzA4MDI2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzdhYTgyOWU4YTE4ZTRhMGE4MzljMjU2Mzg0NDU4YjM0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzQyZmRmYjBhZWNhYTRhN2M5ZWU4MWJmNzJjZDZkYjhlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzc1ODIwOWJhYTkxNTQxZTg4N2QyMGUyOWIzYThhYzA1ID0gJCgnPGRpdiBpZD0iaHRtbF83NTgyMDliYWE5MTU0MWU4ODdkMjBlMjliM2E4YWMwNSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q2FtYnJpYSBIZWlnaHRzLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzQyZmRmYjBhZWNhYTRhN2M5ZWU4MWJmNzJjZDZkYjhlLnNldENvbnRlbnQoaHRtbF83NTgyMDliYWE5MTU0MWU4ODdkMjBlMjliM2E4YWMwNSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl83ZDFjMjE4N2YwODk0ZDkxODcyMzRhNTU2YzQ2ODBlYi5iaW5kUG9wdXAocG9wdXBfNDJmZGZiMGFlY2FhNGE3YzllZTgxYmY3MmNkNmRiOGUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMTM1MjllNWI2YjExNDdmNDg0NzE5ZTE0NmJmYzAyYzEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42NTk4MTY0MzM0MjgwODQsLTczLjczNTI2MDc5NDI4Mjc4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzdhYTgyOWU4YTE4ZTRhMGE4MzljMjU2Mzg0NDU4YjM0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzg2OTkzMmY0YWQ3ODRhMDZhODhiOGI2MDJmZmQxZWU1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzk3NjI0YzA0Y2UzYjRmMzNhODAyZTBkZDVmNWFmMTdmID0gJCgnPGRpdiBpZD0iaHRtbF85NzYyNGMwNGNlM2I0ZjMzYTgwMmUwZGQ1ZjVhZjE3ZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Um9zZWRhbGUsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfODY5OTMyZjRhZDc4NGEwNmE4OGI4YjYwMmZmZDFlZTUuc2V0Q29udGVudChodG1sXzk3NjI0YzA0Y2UzYjRmMzNhODAyZTBkZDVmNWFmMTdmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzEzNTI5ZTViNmIxMTQ3ZjQ4NDcxOWUxNDZiZmMwMmMxLmJpbmRQb3B1cChwb3B1cF84Njk5MzJmNGFkNzg0YTA2YTg4YjhiNjAyZmZkMWVlNSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8zOTc1OGFhZGQ4NTg0ZTMwYjMwNzFjMTQxZWRhNjc0NyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjYwMzEzNDQzMjUwMDg5NCwtNzMuNzU0OTc5NjgwNDM4NzJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfN2FhODI5ZThhMThlNGEwYTgzOWMyNTYzODQ0NThiMzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZGVjOTJjMTYwOWIyNDBlMjg3YjA3YzU5YTU2OTJkNWIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNjQ0ZmMwZjUxMjA0NDU1MDk1Y2M2MTRiZTIzYzBkNDggPSAkKCc8ZGl2IGlkPSJodG1sXzY0NGZjMGY1MTIwNDQ1NTA5NWNjNjE0YmUyM2MwZDQ4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5GYXIgUm9ja2F3YXksIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZGVjOTJjMTYwOWIyNDBlMjg3YjA3YzU5YTU2OTJkNWIuc2V0Q29udGVudChodG1sXzY0NGZjMGY1MTIwNDQ1NTA5NWNjNjE0YmUyM2MwZDQ4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzM5NzU4YWFkZDg1ODRlMzBiMzA3MWMxNDFlZGE2NzQ3LmJpbmRQb3B1cChwb3B1cF9kZWM5MmMxNjA5YjI0MGUyODdiMDdjNTlhNTY5MmQ1Yik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl84MGIwYzVkYTYzMGE0OTBkOWE0Njk0ZTNmNmE5ZDVkNSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjYwMzAyNjU4MzUxMjM4LC03My44MjAwNTQ4OTExMDMyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzdhYTgyOWU4YTE4ZTRhMGE4MzljMjU2Mzg0NDU4YjM0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzEzMmE2YjA2ODQ5ZjQxM2ZiN2I2YTZjZTRkYjIxNTA4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2JkNmM5MmEyNDI1MjRlYTRhM2EyYTNmZjdmOWZkZmYxID0gJCgnPGRpdiBpZD0iaHRtbF9iZDZjOTJhMjQyNTI0ZWE0YTNhMmEzZmY3ZjlmZGZmMSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QnJvYWQgQ2hhbm5lbCwgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xMzJhNmIwNjg0OWY0MTNmYjdiNmE2Y2U0ZGIyMTUwOC5zZXRDb250ZW50KGh0bWxfYmQ2YzkyYTI0MjUyNGVhNGEzYTJhM2ZmN2Y5ZmRmZjEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfODBiMGM1ZGE2MzBhNDkwZDlhNDY5NGUzZjZhOWQ1ZDUuYmluZFBvcHVwKHBvcHVwXzEzMmE2YjA2ODQ5ZjQxM2ZiN2I2YTZjZTRkYjIxNTA4KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzhjNzFkMzdkOWIxZTQ5ODBiZDVhYjE2MmY1NzNkZWZkID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTU3NDAxMjg4NDU0NTIsLTczLjkyNTUxMTk2OTk0MTY4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzdhYTgyOWU4YTE4ZTRhMGE4MzljMjU2Mzg0NDU4YjM0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzA5OGFjMTljMWY0MDRlOTA4MzJmZDEyMjBiYmUyYTE2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2MyNDI5M2ZkNTFjMDRhZWU5NDA4NGViMzUxNGM2YWMyID0gJCgnPGRpdiBpZD0iaHRtbF9jMjQyOTNmZDUxYzA0YWVlOTQwODRlYjM1MTRjNmFjMiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QnJlZXp5IFBvaW50LCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzA5OGFjMTljMWY0MDRlOTA4MzJmZDEyMjBiYmUyYTE2LnNldENvbnRlbnQoaHRtbF9jMjQyOTNmZDUxYzA0YWVlOTQwODRlYjM1MTRjNmFjMik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl84YzcxZDM3ZDliMWU0OTgwYmQ1YWIxNjJmNTczZGVmZC5iaW5kUG9wdXAocG9wdXBfMDk4YWMxOWMxZjQwNGU5MDgzMmZkMTIyMGJiZTJhMTYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOTg0Mjk3ODNmOTcwNDI5NGIzNTMxNzU3M2ZhNDBhZWUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NzU5MjMwMTU2NDI4OTYsLTczLjkwMjI4OTYwMzkxNjczXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzdhYTgyOWU4YTE4ZTRhMGE4MzljMjU2Mzg0NDU4YjM0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzhlMDUzNGU5ZmYyZTQyZDhhZDg4OTE2MTM1NDk1ZDM0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2MwYjVlODkwYjc4NDRlMTE5MTMyOTIzODE2NzE3ZGE4ID0gJCgnPGRpdiBpZD0iaHRtbF9jMGI1ZTg5MGI3ODQ0ZTExOTEzMjkyMzgxNjcxN2RhOCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U3RlaW53YXksIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOGUwNTM0ZTlmZjJlNDJkOGFkODg5MTYxMzU0OTVkMzQuc2V0Q29udGVudChodG1sX2MwYjVlODkwYjc4NDRlMTE5MTMyOTIzODE2NzE3ZGE4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzk4NDI5NzgzZjk3MDQyOTRiMzUzMTc1NzNmYTQwYWVlLmJpbmRQb3B1cChwb3B1cF84ZTA1MzRlOWZmMmU0MmQ4YWQ4ODkxNjEzNTQ5NWQzNCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9hYmZjZWMwZGE1ZTM0MjEwODJiOTM3MjczZWVlYzBiYyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc5Mjc4MTQwMzYwMDQ4LC03My44MDQzNjQ1MTcyMDk4OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83YWE4MjllOGExOGU0YTBhODM5YzI1NjM4NDQ1OGIzNCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iYzgwYjVkNDE0Njk0MDZkYWFjZmZiOTFmMmIwNmRmOCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wZjQwMzZlYzNlNDY0OTIwYjQ3YmJiOWNkNzQwMzY2NSA9ICQoJzxkaXYgaWQ9Imh0bWxfMGY0MDM2ZWMzZTQ2NDkyMGI0N2JiYjljZDc0MDM2NjUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkJlZWNoaHVyc3QsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYmM4MGI1ZDQxNDY5NDA2ZGFhY2ZmYjkxZjJiMDZkZjguc2V0Q29udGVudChodG1sXzBmNDAzNmVjM2U0NjQ5MjBiNDdiYmI5Y2Q3NDAzNjY1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2FiZmNlYzBkYTVlMzQyMTA4MmI5MzcyNzNlZWVjMGJjLmJpbmRQb3B1cChwb3B1cF9iYzgwYjVkNDE0Njk0MDZkYWFjZmZiOTFmMmIwNmRmOCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85Zjk4NjdmOWEwNzM0NGJkYjliOTRlZjM5MTg2MjJjOCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc4Mjg0MjgwNjI0NTU1NCwtNzMuNzc2ODAyMjI2MjE1OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83YWE4MjllOGExOGU0YTBhODM5YzI1NjM4NDQ1OGIzNCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hN2IzN2ZkOTVjZmE0ZDUxYmM3NTcxZDZmMmZlNTQ5ZSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lOWE3OWQ5NmYwNmU0MmFjOWE5OTliMDJiNzkzZTk1MCA9ICQoJzxkaXYgaWQ9Imh0bWxfZTlhNzlkOTZmMDZlNDJhYzlhOTk5YjAyYjc5M2U5NTAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkJheSBUZXJyYWNlLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2E3YjM3ZmQ5NWNmYTRkNTFiYzc1NzFkNmYyZmU1NDllLnNldENvbnRlbnQoaHRtbF9lOWE3OWQ5NmYwNmU0MmFjOWE5OTliMDJiNzkzZTk1MCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl85Zjk4NjdmOWEwNzM0NGJkYjliOTRlZjM5MTg2MjJjOC5iaW5kUG9wdXAocG9wdXBfYTdiMzdmZDk1Y2ZhNGQ1MWJjNzU3MWQ2ZjJmZTU0OWUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNTdhNDExY2EwN2Y5NGI3NTkwYTRjODAyNmQwNTBlNjYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC41OTU2NDE4MDczNjg0OTQsLTczLjc3NjEzMjgyMzkxNzA1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzdhYTgyOWU4YTE4ZTRhMGE4MzljMjU2Mzg0NDU4YjM0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzMzZGNkZDY4NjExNzQ5YzViYTgzYTU3YWFkZWIxMjM5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2QwNGIzN2IxNGEzZTRhMDFhZjg3ODVkZmQ2Yjg4N2IzID0gJCgnPGRpdiBpZD0iaHRtbF9kMDRiMzdiMTRhM2U0YTAxYWY4Nzg1ZGZkNmI4ODdiMyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RWRnZW1lcmUsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMzNkY2RkNjg2MTE3NDljNWJhODNhNTdhYWRlYjEyMzkuc2V0Q29udGVudChodG1sX2QwNGIzN2IxNGEzZTRhMDFhZjg3ODVkZmQ2Yjg4N2IzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzU3YTQxMWNhMDdmOTRiNzU5MGE0YzgwMjZkMDUwZTY2LmJpbmRQb3B1cChwb3B1cF8zM2RjZGQ2ODYxMTc0OWM1YmE4M2E1N2FhZGViMTIzOSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9hMmJmOGE4YjU3ZjA0MmFmOWZmNDk0ODlmMjE0YzY2MiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjU4OTE0Mzk0MzcyOTcxLC03My43OTE5OTIzMzEzNjk0M10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83YWE4MjllOGExOGU0YTBhODM5YzI1NjM4NDQ1OGIzNCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8yZDVjMjk1ZGQzZWE0OTQ1OWI3NjUzZmM5ZjdhMDRjOSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hMTkyNmVmNTYyMTU0MmMzODYxNjE2YjhiNmNhNzMxYSA9ICQoJzxkaXYgaWQ9Imh0bWxfYTE5MjZlZjU2MjE1NDJjMzg2MTYxNmI4YjZjYTczMWEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkFydmVybmUsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMmQ1YzI5NWRkM2VhNDk0NTliNzY1M2ZjOWY3YTA0Yzkuc2V0Q29udGVudChodG1sX2ExOTI2ZWY1NjIxNTQyYzM4NjE2MTZiOGI2Y2E3MzFhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2EyYmY4YThiNTdmMDQyYWY5ZmY0OTQ4OWYyMTRjNjYyLmJpbmRQb3B1cChwb3B1cF8yZDVjMjk1ZGQzZWE0OTQ1OWI3NjUzZmM5ZjdhMDRjOSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9kMDRmYTFjMjYyYzc0YzNjOGVmNThmNDg3NmVhMmEyYyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjU4MjgwMTY5Njg0NTU4NiwtNzMuODIyMzYxMjEwODg3NTFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfN2FhODI5ZThhMThlNGEwYTgzOWMyNTYzODQ0NThiMzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNjljMWJlMjgxMDYxNDY3NTk0YzRkMWRlZGI2MjU5NTEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMGUyYTU4NTdhYmY3NDQ0MWEyMzZlZTBkMjk4MDBhOTQgPSAkKCc8ZGl2IGlkPSJodG1sXzBlMmE1ODU3YWJmNzQ0NDFhMjM2ZWUwZDI5ODAwYTk0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Sb2NrYXdheSBCZWFjaCwgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82OWMxYmUyODEwNjE0Njc1OTRjNGQxZGVkYjYyNTk1MS5zZXRDb250ZW50KGh0bWxfMGUyYTU4NTdhYmY3NDQ0MWEyMzZlZTBkMjk4MDBhOTQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZDA0ZmExYzI2MmM3NGMzYzhlZjU4ZjQ4NzZlYTJhMmMuYmluZFBvcHVwKHBvcHVwXzY5YzFiZTI4MTA2MTQ2NzU5NGM0ZDFkZWRiNjI1OTUxKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzRmNjNlMDZiN2YxYjQxYzc5YWI2NjVjMDM0YzFiM2ZiID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTcyMDM2NzMwMjE3MDE1LC03My44NTc1NDY3MjQxMDgyN10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83YWE4MjllOGExOGU0YTBhODM5YzI1NjM4NDQ1OGIzNCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zZjgxZjJiOWZhNDk0ZWQyYmFmN2NlODVlYjdjMDMxYyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83OTI1YTg2MjQzYTY0NjViYWM0NmJjYWE2YjJjYWUzNCA9ICQoJzxkaXYgaWQ9Imh0bWxfNzkyNWE4NjI0M2E2NDY1YmFjNDZiY2FhNmIyY2FlMzQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk5lcG9uc2l0LCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzNmODFmMmI5ZmE0OTRlZDJiYWY3Y2U4NWViN2MwMzFjLnNldENvbnRlbnQoaHRtbF83OTI1YTg2MjQzYTY0NjViYWM0NmJjYWE2YjJjYWUzNCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl80ZjYzZTA2YjdmMWI0MWM3OWFiNjY1YzAzNGMxYjNmYi5iaW5kUG9wdXAocG9wdXBfM2Y4MWYyYjlmYTQ5NGVkMmJhZjdjZTg1ZWI3YzAzMWMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYzc4MzAzMTdlYzhhNDAxMzhkNjE2YTc3YzBlOWU0MTQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NjQxMjYxMjI2MTQwNjYsLTczLjgxMjc2MjY5MTM1ODY2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzdhYTgyOWU4YTE4ZTRhMGE4MzljMjU2Mzg0NDU4YjM0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2ZkNjc1YTAzYzdmOTQ4Y2I5NTI2MDZiNDk3OGFkNjMxID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2IyMDAzNTgyNzE0NDQ2ODY4MTgxMmU2ZTJiMDcyZDRmID0gJCgnPGRpdiBpZD0iaHRtbF9iMjAwMzU4MjcxNDQ0Njg2ODE4MTJlNmUyYjA3MmQ0ZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TXVycmF5IEhpbGwsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZmQ2NzVhMDNjN2Y5NDhjYjk1MjYwNmI0OTc4YWQ2MzEuc2V0Q29udGVudChodG1sX2IyMDAzNTgyNzE0NDQ2ODY4MTgxMmU2ZTJiMDcyZDRmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2M3ODMwMzE3ZWM4YTQwMTM4ZDYxNmE3N2MwZTllNDE0LmJpbmRQb3B1cChwb3B1cF9mZDY3NWEwM2M3Zjk0OGNiOTUyNjA2YjQ5NzhhZDYzMSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8wZTk3ZjlhYmRlZmI0MWYyYmM2OTg3MWZmYWJlYjcxNiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc0MTM3ODQyMTk0NTQzNCwtNzMuNzA4ODQ3MDU4ODkyNDZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfN2FhODI5ZThhMThlNGEwYTgzOWMyNTYzODQ0NThiMzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNjA1ZjhiOWI1MjdiNGZjZmFiMTY5MGQ1YzlkYTgzMzggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMWNmZDFlODdkNmQ2NDc5ODk2MWY3MmI3ODU4MTBmMDggPSAkKCc8ZGl2IGlkPSJodG1sXzFjZmQxZTg3ZDZkNjQ3OTg5NjFmNzJiNzg1ODEwZjA4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5GbG9yYWwgUGFyaywgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82MDVmOGI5YjUyN2I0ZmNmYWIxNjkwZDVjOWRhODMzOC5zZXRDb250ZW50KGh0bWxfMWNmZDFlODdkNmQ2NDc5ODk2MWY3MmI3ODU4MTBmMDgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMGU5N2Y5YWJkZWZiNDFmMmJjNjk4NzFmZmFiZWI3MTYuYmluZFBvcHVwKHBvcHVwXzYwNWY4YjliNTI3YjRmY2ZhYjE2OTBkNWM5ZGE4MzM4KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2I1MmVkODFjZTk0ZjQyY2M4ZDVjMTBjOTU3NzQzNmU4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzIwOTU3MjA3NjQ0NCwtNzMuNzY3MTQxNjY3MTQ3MjldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfN2FhODI5ZThhMThlNGEwYTgzOWMyNTYzODQ0NThiMzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYzU5OTJkNzYxY2E2NDNlNjhiOGNiMDc4MDVmMDNkMDQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNzJiZjVkMDdkZTY3NDc4ZWE3ZGJkMzI1M2I0ZjE5OTggPSAkKCc8ZGl2IGlkPSJodG1sXzcyYmY1ZDA3ZGU2NzQ3OGVhN2RiZDMyNTNiNGYxOTk4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Ib2xsaXN3b29kLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2M1OTkyZDc2MWNhNjQzZTY4YjhjYjA3ODA1ZjAzZDA0LnNldENvbnRlbnQoaHRtbF83MmJmNWQwN2RlNjc0NzhlYTdkYmQzMjUzYjRmMTk5OCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9iNTJlZDgxY2U5NGY0MmNjOGQ1YzEwYzk1Nzc0MzZlOC5iaW5kUG9wdXAocG9wdXBfYzU5OTJkNzYxY2E2NDNlNjhiOGNiMDc4MDVmMDNkMDQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMDI0NGJlYjkwN2E2NDk5YmFmMmQ0YmFmZDdmZWFmMGIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MTY4MDQ4MzAxNDYxMywtNzMuNzg3MjI2OTY5MzY2Nl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83YWE4MjllOGExOGU0YTBhODM5YzI1NjM4NDQ1OGIzNCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zYjAwMWFmYzRmMWU0ZjZkYTU0MzEwYjAxMjExNzFjNiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF84Mjc1NWZhZjM2MDU0NDdmODQwNTdmMTMyMmFiMzQ4NiA9ICQoJzxkaXYgaWQ9Imh0bWxfODI3NTVmYWYzNjA1NDQ3Zjg0MDU3ZjEzMjJhYjM0ODYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkphbWFpY2EgRXN0YXRlcywgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zYjAwMWFmYzRmMWU0ZjZkYTU0MzEwYjAxMjExNzFjNi5zZXRDb250ZW50KGh0bWxfODI3NTVmYWYzNjA1NDQ3Zjg0MDU3ZjEzMjJhYjM0ODYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMDI0NGJlYjkwN2E2NDk5YmFmMmQ0YmFmZDdmZWFmMGIuYmluZFBvcHVwKHBvcHVwXzNiMDAxYWZjNGYxZTRmNmRhNTQzMTBiMDEyMTE3MWM2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2IxMWJiYjBhMjUyMjRmZWY4YWU1ZWZmYWYwNGQ4OTIyID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzQ0NTcyMzA5Mjg2NywtNzMuODI1ODA5MTUxMTA1NTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfN2FhODI5ZThhMThlNGEwYTgzOWMyNTYzODQ0NThiMzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYjdlOWVmYzFmZmEwNDJiY2JhMDI1NGVkNjMwMzM2ZDUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYzkyM2NjYzZmYjdlNDkxNTkyMDllOTA3MDQ4ZDkxNTEgPSAkKCc8ZGl2IGlkPSJodG1sX2M5MjNjY2M2ZmI3ZTQ5MTU5MjA5ZTkwNzA0OGQ5MTUxIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5RdWVlbnNib3JvIEhpbGwsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYjdlOWVmYzFmZmEwNDJiY2JhMDI1NGVkNjMwMzM2ZDUuc2V0Q29udGVudChodG1sX2M5MjNjY2M2ZmI3ZTQ5MTU5MjA5ZTkwNzA0OGQ5MTUxKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2IxMWJiYjBhMjUyMjRmZWY4YWU1ZWZmYWYwNGQ4OTIyLmJpbmRQb3B1cChwb3B1cF9iN2U5ZWZjMWZmYTA0MmJjYmEwMjU0ZWQ2MzAzMzZkNSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl84YTM3NGQyM2RkZWQ0YjA1OTcyNjUzMDc3NmRlY2UxYiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjcyMzgyNDkwMTgyOTIwNCwtNzMuNzk3NjAzMDA5MTI2NzJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfN2FhODI5ZThhMThlNGEwYTgzOWMyNTYzODQ0NThiMzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNzNiYWE1NzM1NDI1NDg2NjljYjQwZDMxZDlhMDk4OGEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMGExMDUwM2M5OGFmNDBiMWEwMTMwYWE0YTk5N2Y0YzQgPSAkKCc8ZGl2IGlkPSJodG1sXzBhMTA1MDNjOThhZjQwYjFhMDEzMGFhNGE5OTdmNGM0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5IaWxsY3Jlc3QsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNzNiYWE1NzM1NDI1NDg2NjljYjQwZDMxZDlhMDk4OGEuc2V0Q29udGVudChodG1sXzBhMTA1MDNjOThhZjQwYjFhMDEzMGFhNGE5OTdmNGM0KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzhhMzc0ZDIzZGRlZDRiMDU5NzI2NTMwNzc2ZGVjZTFiLmJpbmRQb3B1cChwb3B1cF83M2JhYTU3MzU0MjU0ODY2OWNiNDBkMzFkOWEwOTg4YSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl82YzdkYmMwMmM1M2I0MTM5YmUyZjAzNWU5NTRmMWZkZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc2MTcwNDUyNjA1NDE0NiwtNzMuOTMxNTc1MDYwNzI4NzhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfN2FhODI5ZThhMThlNGEwYTgzOWMyNTYzODQ0NThiMzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZjFiYzA2N2RjZjQ3NGIzNzhiYjIzNTNiYjRhNDI5ZTggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfODg3ZDY3ZjliZGYxNDBkNGFiZDNlZjVhMDUyNGQ2NjIgPSAkKCc8ZGl2IGlkPSJodG1sXzg4N2Q2N2Y5YmRmMTQwZDRhYmQzZWY1YTA1MjRkNjYyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5SYXZlbnN3b29kLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2YxYmMwNjdkY2Y0NzRiMzc4YmIyMzUzYmI0YTQyOWU4LnNldENvbnRlbnQoaHRtbF84ODdkNjdmOWJkZjE0MGQ0YWJkM2VmNWEwNTI0ZDY2Mik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl82YzdkYmMwMmM1M2I0MTM5YmUyZjAzNWU5NTRmMWZkZS5iaW5kUG9wdXAocG9wdXBfZjFiYzA2N2RjZjQ3NGIzNzhiYjIzNTNiYjRhNDI5ZTgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZjFlNmJkYjcxNTNmNGJkZmFiNzMxOGI4YzI5YTAxZDQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42NjM5MTg0MTkyNTEzOSwtNzMuODQ5NjM3ODI0MDI0NDFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfN2FhODI5ZThhMThlNGEwYTgzOWMyNTYzODQ0NThiMzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNDRjN2U3MzE4ZTJjNGEyMmFjMTM1Y2JhMGZlOTFmM2EgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZDY0ZmM1N2QzNmMyNDExNjkzMzFiYTI3N2U5NmQ4MTYgPSAkKCc8ZGl2IGlkPSJodG1sX2Q2NGZjNTdkMzZjMjQxMTY5MzMxYmEyNzdlOTZkODE2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5MaW5kZW53b29kLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzQ0YzdlNzMxOGUyYzRhMjJhYzEzNWNiYTBmZTkxZjNhLnNldENvbnRlbnQoaHRtbF9kNjRmYzU3ZDM2YzI0MTE2OTMzMWJhMjc3ZTk2ZDgxNik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9mMWU2YmRiNzE1M2Y0YmRmYWI3MzE4YjhjMjlhMDFkNC5iaW5kUG9wdXAocG9wdXBfNDRjN2U3MzE4ZTJjNGEyMmFjMTM1Y2JhMGZlOTFmM2EpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMDVlZWJiOTI5YmIxNDAxZDhlMjQzNzc1NzBhNjdlYTYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42Njc4ODM4OTY2MDI0NywtNzMuNzQwMjU2MDc5ODk4MjJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfN2FhODI5ZThhMThlNGEwYTgzOWMyNTYzODQ0NThiMzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNzJmYjNiMGY1MmEyNDJhZDk0MDg4MjBiOGNlMjQ2OGYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOTM4MDUyZjY2NjRmNGE0Zjg3MmJkYTUzOTExNWYwYzEgPSAkKCc8ZGl2IGlkPSJodG1sXzkzODA1MmY2NjY0ZjRhNGY4NzJiZGE1MzkxMTVmMGMxIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5MYXVyZWx0b24sIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNzJmYjNiMGY1MmEyNDJhZDk0MDg4MjBiOGNlMjQ2OGYuc2V0Q29udGVudChodG1sXzkzODA1MmY2NjY0ZjRhNGY4NzJiZGE1MzkxMTVmMGMxKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzA1ZWViYjkyOWJiMTQwMWQ4ZTI0Mzc3NTcwYTY3ZWE2LmJpbmRQb3B1cChwb3B1cF83MmZiM2IwZjUyYTI0MmFkOTQwODgyMGI4Y2UyNDY4Zik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9kMDM4MjgxOGNlYzQ0MTFkYWNjNjg5YzZhNzhiMWY3YyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjczNjA3NDU3MDgzMDc5NSwtNzMuODYyNTI0NzE0MTM3NF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83YWE4MjllOGExOGU0YTBhODM5YzI1NjM4NDQ1OGIzNCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85OTgyOWNhZmUyYWE0ZWFjYjVlZjllZTAyYjFjNWE3MSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kMTFlMjdiMzYxYzk0M2JhOTQ3YTIzZjFkZGJkZTRkNCA9ICQoJzxkaXYgaWQ9Imh0bWxfZDExZTI3YjM2MWM5NDNiYTk0N2EyM2YxZGRiZGU0ZDQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkxlZnJhayBDaXR5LCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzk5ODI5Y2FmZTJhYTRlYWNiNWVmOWVlMDJiMWM1YTcxLnNldENvbnRlbnQoaHRtbF9kMTFlMjdiMzYxYzk0M2JhOTQ3YTIzZjFkZGJkZTRkNCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9kMDM4MjgxOGNlYzQ0MTFkYWNjNjg5YzZhNzhiMWY3Yy5iaW5kUG9wdXAocG9wdXBfOTk4MjljYWZlMmFhNGVhY2I1ZWY5ZWUwMmIxYzVhNzEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMjRlYzk4Nzc1MjBkNGM0M2I4YzgwNDA5MDAyOTEzOWEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC41NzYxNTU1NjU0MzEwOSwtNzMuODU0MDE3NTAzOTI1Ml0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83YWE4MjllOGExOGU0YTBhODM5YzI1NjM4NDQ1OGIzNCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zYWExMzBmZGE5Zjg0YWUxOGQ0Yjc2ODg2ZTZhODA1OCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83ZDRhMjFlMmU2YzE0NDU0OTk5ZDVkMWIwMWJhYzJiOSA9ICQoJzxkaXYgaWQ9Imh0bWxfN2Q0YTIxZTJlNmMxNDQ1NDk5OWQ1ZDFiMDFiYWMyYjkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkJlbGxlIEhhcmJvciwgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zYWExMzBmZGE5Zjg0YWUxOGQ0Yjc2ODg2ZTZhODA1OC5zZXRDb250ZW50KGh0bWxfN2Q0YTIxZTJlNmMxNDQ1NDk5OWQ1ZDFiMDFiYWMyYjkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMjRlYzk4Nzc1MjBkNGM0M2I4YzgwNDA5MDAyOTEzOWEuYmluZFBvcHVwKHBvcHVwXzNhYTEzMGZkYTlmODRhZTE4ZDRiNzY4ODZlNmE4MDU4KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzE1ZDkxZWM2M2YyMDQ0NjlhYTJkMWVhNGI3OWI0MzIyID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTgwMzQyOTU2NDYxMzEsLTczLjg0MTUzMzcwMjI2MTg2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzdhYTgyOWU4YTE4ZTRhMGE4MzljMjU2Mzg0NDU4YjM0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzkxZTljZjBlOWViMjRmYmJhM2IzOGJhZDM3YThlYzJiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzcxNjQxNTIwYWFjNjQzMWE4NDQyYjA4N2RlMGY4MmVmID0gJCgnPGRpdiBpZD0iaHRtbF83MTY0MTUyMGFhYzY0MzFhODQ0MmIwODdkZTBmODJlZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Um9ja2F3YXkgUGFyaywgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85MWU5Y2YwZTllYjI0ZmJiYTNiMzhiYWQzN2E4ZWMyYi5zZXRDb250ZW50KGh0bWxfNzE2NDE1MjBhYWM2NDMxYTg0NDJiMDg3ZGUwZjgyZWYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMTVkOTFlYzYzZjIwNDQ2OWFhMmQxZWE0Yjc5YjQzMjIuYmluZFBvcHVwKHBvcHVwXzkxZTljZjBlOWViMjRmYmJhM2IzOGJhZDM3YThlYzJiKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzdiMzIwMTVhZjc4ZjQ0MTNhNDc4ZTFmMDQ0Y2UxYTM5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTk3NzEwNjE1NjU3NjgsLTczLjc5NjY0NzUwODQ0MDQ3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzdhYTgyOWU4YTE4ZTRhMGE4MzljMjU2Mzg0NDU4YjM0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzNiZjhmNjU4NDYxMjRiOTJiYmJmNGMxNzg5NTAyNTc3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2FmMDY1MzU3ZWIxZjQ0Mzk4ZGQzMzVlMzkxNDY0YzNmID0gJCgnPGRpdiBpZD0iaHRtbF9hZjA2NTM1N2ViMWY0NDM5OGRkMzM1ZTM5MTQ2NGMzZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U29tZXJ2aWxsZSwgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zYmY4ZjY1ODQ2MTI0YjkyYmJiZjRjMTc4OTUwMjU3Ny5zZXRDb250ZW50KGh0bWxfYWYwNjUzNTdlYjFmNDQzOThkZDMzNWUzOTE0NjRjM2YpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfN2IzMjAxNWFmNzhmNDQxM2E0NzhlMWYwNDRjZTFhMzkuYmluZFBvcHVwKHBvcHVwXzNiZjhmNjU4NDYxMjRiOTJiYmJmNGMxNzg5NTAyNTc3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzUzNzRkNjg0MWZiZDRmMzI5MjE1Y2YzODQzNGE4ZDQwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjYwMDAzMjI3MzM2MTMsLTczLjc1MTc1MzEwNzMxMTUzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzdhYTgyOWU4YTE4ZTRhMGE4MzljMjU2Mzg0NDU4YjM0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzI2NzEzMDg2MWI5YjQ5OGVhNTcyOTAyOTU5OGNjOWM2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2E2MGExZjgxMWJiNjQ3OTJhNTI5MjMxNjBiZGExOWQ2ID0gJCgnPGRpdiBpZD0iaHRtbF9hNjBhMWY4MTFiYjY0NzkyYTUyOTIzMTYwYmRhMTlkNiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QnJvb2t2aWxsZSwgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yNjcxMzA4NjFiOWI0OThlYTU3MjkwMjk1OThjYzljNi5zZXRDb250ZW50KGh0bWxfYTYwYTFmODExYmI2NDc5MmE1MjkyMzE2MGJkYTE5ZDYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNTM3NGQ2ODQxZmJkNGYzMjkyMTVjZjM4NDM0YThkNDAuYmluZFBvcHVwKHBvcHVwXzI2NzEzMDg2MWI5YjQ5OGVhNTcyOTAyOTU5OGNjOWM2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzhmNTBiNDZjZWE3MDQ3MzJiNWNmNzg3ODM0MTI2MmIwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzMzMDE0MDQwMjc4MzQsLTczLjczODg5MTk4OTEyNDgxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzdhYTgyOWU4YTE4ZTRhMGE4MzljMjU2Mzg0NDU4YjM0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2MxOGIyMDdjNDUwNTRjZThhNzY2YzY4YmIwODU2YzJhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzg2MDFmNzMzYjRkNjRjYjliZjA3YTExYjE1YmRiNGE1ID0gJCgnPGRpdiBpZD0iaHRtbF84NjAxZjczM2I0ZDY0Y2I5YmYwN2ExMWIxNWJkYjRhNSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QmVsbGFpcmUsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYzE4YjIwN2M0NTA1NGNlOGE3NjZjNjhiYjA4NTZjMmEuc2V0Q29udGVudChodG1sXzg2MDFmNzMzYjRkNjRjYjliZjA3YTExYjE1YmRiNGE1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzhmNTBiNDZjZWE3MDQ3MzJiNWNmNzg3ODM0MTI2MmIwLmJpbmRQb3B1cChwb3B1cF9jMThiMjA3YzQ1MDU0Y2U4YTc2NmM2OGJiMDg1NmMyYSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl80YjM2NmUyYmI5YjE0MWQ3YTU5NDdiNTk4MmI4NWRjZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc1NDA3MDk5OTA0ODksLTczLjg1NzUxNzkwNjc2NDQ3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzdhYTgyOWU4YTE4ZTRhMGE4MzljMjU2Mzg0NDU4YjM0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzFlYzE0ZDExZWQ5ZDRkMzE5MGM2MTYyYjYzNGYzZWFlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2I1MTU2ZWNmYjc0NzQ3ZmY5ZTk0YmI0MDQxYmY4YzM1ID0gJCgnPGRpdiBpZD0iaHRtbF9iNTE1NmVjZmI3NDc0N2ZmOWU5NGJiNDA0MWJmOGMzNSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Tm9ydGggQ29yb25hLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzFlYzE0ZDExZWQ5ZDRkMzE5MGM2MTYyYjYzNGYzZWFlLnNldENvbnRlbnQoaHRtbF9iNTE1NmVjZmI3NDc0N2ZmOWU5NGJiNDA0MWJmOGMzNSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl80YjM2NmUyYmI5YjE0MWQ3YTU5NDdiNTk4MmI4NWRjZC5iaW5kUG9wdXAocG9wdXBfMWVjMTRkMTFlZDlkNGQzMTkwYzYxNjJiNjM0ZjNlYWUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNjc0Y2E3NzM2OTdkNGM2N2IyZGYzNzA4YmZkMmI2OTEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MTQ2MTEwODE1MTE3LC03My44NDEwMjIxMTIzNDAxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzdhYTgyOWU4YTE4ZTRhMGE4MzljMjU2Mzg0NDU4YjM0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzUzZTViNGYxYjdkOTRjZGY4NmMzYTY0ZTY2YmM3YjNiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzE3ZGU3M2ZlNjA1MDQyNDk5YmYyZDA2MDQxNzc0NmVkID0gJCgnPGRpdiBpZD0iaHRtbF8xN2RlNzNmZTYwNTA0MjQ5OWJmMmQwNjA0MTc3NDZlZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Rm9yZXN0IEhpbGxzIEdhcmRlbnMsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNTNlNWI0ZjFiN2Q5NGNkZjg2YzNhNjRlNjZiYzdiM2Iuc2V0Q29udGVudChodG1sXzE3ZGU3M2ZlNjA1MDQyNDk5YmYyZDA2MDQxNzc0NmVkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzY3NGNhNzczNjk3ZDRjNjdiMmRmMzcwOGJmZDJiNjkxLmJpbmRQb3B1cChwb3B1cF81M2U1YjRmMWI3ZDk0Y2RmODZjM2E2NGU2NmJjN2IzYik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8zMjliNzE5MjliYTE0NTFiYWI0ODJlZWYzZTMyODdjMCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY0NDk4MTU3MTAwNDQsLTc0LjA3OTM1MzEyNTEyNzk3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzdhYTgyOWU4YTE4ZTRhMGE4MzljMjU2Mzg0NDU4YjM0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzczMzk4MmZlMzQzMDQ2YzE4OTE0NDEwZGYzN2NmNjNjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2E2ZTdhZTkyZWRjOTRhNWJhOGQxMGM5YzExYWU4OTZlID0gJCgnPGRpdiBpZD0iaHRtbF9hNmU3YWU5MmVkYzk0YTViYThkMTBjOWMxMWFlODk2ZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U3QuIEdlb3JnZSwgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNzMzOTgyZmUzNDMwNDZjMTg5MTQ0MTBkZjM3Y2Y2M2Muc2V0Q29udGVudChodG1sX2E2ZTdhZTkyZWRjOTRhNWJhOGQxMGM5YzExYWU4OTZlKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzMyOWI3MTkyOWJhMTQ1MWJhYjQ4MmVlZjNlMzI4N2MwLmJpbmRQb3B1cChwb3B1cF83MzM5ODJmZTM0MzA0NmMxODkxNDQxMGRmMzdjZjYzYyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85ODNiZDcwYTNhYzg0ZGIyYmFiYTk0YzA5ZmYzZThmZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY0MDYxNDU1OTEzNTExLC03NC4wODcwMTY1MDUxNjYyNV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83YWE4MjllOGExOGU0YTBhODM5YzI1NjM4NDQ1OGIzNCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9jMmZmYjE0ZWRiNzk0MGE2YWEyODhiMGU1OWVhNTYwZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF81OGE1Yjc4OWZjMDI0MGNkYTNlOTE5YmExNGVmYTljOSA9ICQoJzxkaXYgaWQ9Imh0bWxfNThhNWI3ODlmYzAyNDBjZGEzZTkxOWJhMTRlZmE5YzkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk5ldyBCcmlnaHRvbiwgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYzJmZmIxNGVkYjc5NDBhNmFhMjg4YjBlNTllYTU2MGYuc2V0Q29udGVudChodG1sXzU4YTViNzg5ZmMwMjQwY2RhM2U5MTliYTE0ZWZhOWM5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzk4M2JkNzBhM2FjODRkYjJiYWJhOTRjMDlmZjNlOGZlLmJpbmRQb3B1cChwb3B1cF9jMmZmYjE0ZWRiNzk0MGE2YWEyODhiMGU1OWVhNTYwZik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mOGQ2NGVjZmY1YTg0Y2JkYmNiN2IzZTYxNjE2YjQ2MCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjYyNjkyNzYyNTM4MTc2LC03NC4wNzc5MDE5MjY2MDA2Nl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83YWE4MjllOGExOGU0YTBhODM5YzI1NjM4NDQ1OGIzNCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF81MDlkMzNjYTYzM2I0MThlOGI4MWUwYjU4NThjNTcyZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF80MzNiMGJhOGI5MDM0YmJjYmU1YzA1NjAzOWYzNGVlMyA9ICQoJzxkaXYgaWQ9Imh0bWxfNDMzYjBiYThiOTAzNGJiY2JlNWMwNTYwMzlmMzRlZTMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlN0YXBsZXRvbiwgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNTA5ZDMzY2E2MzNiNDE4ZThiODFlMGI1ODU4YzU3MmYuc2V0Q29udGVudChodG1sXzQzM2IwYmE4YjkwMzRiYmNiZTVjMDU2MDM5ZjM0ZWUzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2Y4ZDY0ZWNmZjVhODRjYmRiY2I3YjNlNjE2MTZiNDYwLmJpbmRQb3B1cChwb3B1cF81MDlkMzNjYTYzM2I0MThlOGI4MWUwYjU4NThjNTcyZik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85YWFiNTBkMDQzODA0ZGE3OTE3NTVhNDcxNDM2ZDhkNCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjYxNTMwNDk0NjUyNzYxLC03NC4wNjk4MDUyNjcxNjE0MV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83YWE4MjllOGExOGU0YTBhODM5YzI1NjM4NDQ1OGIzNCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8yMDFhNzg2ZWVjYmM0NjdkODRiMzE1YzZiNzhmNGIzOSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82MzQ5NWE0NGY3ZTE0OTc2YjI0MjQ2YTU2MjQ2YmY1NCA9ICQoJzxkaXYgaWQ9Imh0bWxfNjM0OTVhNDRmN2UxNDk3NmIyNDI0NmE1NjI0NmJmNTQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlJvc2ViYW5rLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yMDFhNzg2ZWVjYmM0NjdkODRiMzE1YzZiNzhmNGIzOS5zZXRDb250ZW50KGh0bWxfNjM0OTVhNDRmN2UxNDk3NmIyNDI0NmE1NjI0NmJmNTQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOWFhYjUwZDA0MzgwNGRhNzkxNzU1YTQ3MTQzNmQ4ZDQuYmluZFBvcHVwKHBvcHVwXzIwMWE3ODZlZWNiYzQ2N2Q4NGIzMTVjNmI3OGY0YjM5KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2QxZDhjOGI0OTg1NjQwNmZiZmIwYTQ5NDZiMzhjZThmID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjMxODc4OTI2NTQ2MDcsLTc0LjEwNzE4MTc4MjY1NjFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfN2FhODI5ZThhMThlNGEwYTgzOWMyNTYzODQ0NThiMzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfY2QxYmQ5ODljZjRiNGJkNmI2OWEwMmJhMDk4OGM0YTkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNzFmYzYyMzc0ODkzNGI2ZDkwZGVjYWJlZGFlNGE4NGYgPSAkKCc8ZGl2IGlkPSJodG1sXzcxZmM2MjM3NDg5MzRiNmQ5MGRlY2FiZWRhZTRhODRmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5XZXN0IEJyaWdodG9uLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jZDFiZDk4OWNmNGI0YmQ2YjY5YTAyYmEwOTg4YzRhOS5zZXRDb250ZW50KGh0bWxfNzFmYzYyMzc0ODkzNGI2ZDkwZGVjYWJlZGFlNGE4NGYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZDFkOGM4YjQ5ODU2NDA2ZmJmYjBhNDk0NmIzOGNlOGYuYmluZFBvcHVwKHBvcHVwX2NkMWJkOTg5Y2Y0YjRiZDZiNjlhMDJiYTA5ODhjNGE5KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2JiNWQ3NDE4MTQxMjRhN2M5MThjNzUzYmRkZTk1ZmNkID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjI0MTg0NzkxMzEzMDA2LC03NC4wODcyNDgxOTk4MzcyOV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83YWE4MjllOGExOGU0YTBhODM5YzI1NjM4NDQ1OGIzNCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9jNzFmZDBiOTBjZjM0ODQxYTUyZWUwYWE0NTI0ZDE0NyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mYzE1ODdiMmJhMmI0MWQyODEwZjhkOWZjZDZkMjAzZSA9ICQoJzxkaXYgaWQ9Imh0bWxfZmMxNTg3YjJiYTJiNDFkMjgxMGY4ZDlmY2Q2ZDIwM2UiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkdyeW1lcyBIaWxsLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jNzFmZDBiOTBjZjM0ODQxYTUyZWUwYWE0NTI0ZDE0Ny5zZXRDb250ZW50KGh0bWxfZmMxNTg3YjJiYTJiNDFkMjgxMGY4ZDlmY2Q2ZDIwM2UpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYmI1ZDc0MTgxNDEyNGE3YzkxOGM3NTNiZGRlOTVmY2QuYmluZFBvcHVwKHBvcHVwX2M3MWZkMGI5MGNmMzQ4NDFhNTJlZTBhYTQ1MjRkMTQ3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzFkZmMzNjEwMTc1NzQwY2JhNjBhOWM2YmZjZDVjZjEyID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTk3MDY4NTE4MTQ2NzMsLTc0LjExMTMyODgxODAwODhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfN2FhODI5ZThhMThlNGEwYTgzOWMyNTYzODQ0NThiMzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOThlNzVlNDg1M2RhNDk1Zjg1MzJmY2MzNjRjY2UyMGMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOWRmZmIzNWQxNGRjNGQ1NmFmOTU5NjEyNTIyMTg2YWUgPSAkKCc8ZGl2IGlkPSJodG1sXzlkZmZiMzVkMTRkYzRkNTZhZjk1OTYxMjUyMjE4NmFlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Ub2R0IEhpbGwsIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzk4ZTc1ZTQ4NTNkYTQ5NWY4NTMyZmNjMzY0Y2NlMjBjLnNldENvbnRlbnQoaHRtbF85ZGZmYjM1ZDE0ZGM0ZDU2YWY5NTk2MTI1MjIxODZhZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8xZGZjMzYxMDE3NTc0MGNiYTYwYTljNmJmY2Q1Y2YxMi5iaW5kUG9wdXAocG9wdXBfOThlNzVlNDg1M2RhNDk1Zjg1MzJmY2MzNjRjY2UyMGMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZDkyODMzYjUwNzc3NGFlMWFkNzQzOWEyNDA4YjJhODkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC41ODAyNDc0MTM1MDk1NiwtNzQuMDc5NTUyOTI1Mzk4Ml0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83YWE4MjllOGExOGU0YTBhODM5YzI1NjM4NDQ1OGIzNCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lYjQ5MzhlMzkxODc0YzViOGU4ODM0ZjVhYTM4MWMxZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82NTQ3NmI1MjU5YTc0MjNjYjA5ODI3ZTViZTU0MjVkZiA9ICQoJzxkaXYgaWQ9Imh0bWxfNjU0NzZiNTI1OWE3NDIzY2IwOTgyN2U1YmU1NDI1ZGYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlNvdXRoIEJlYWNoLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lYjQ5MzhlMzkxODc0YzViOGU4ODM0ZjVhYTM4MWMxZi5zZXRDb250ZW50KGh0bWxfNjU0NzZiNTI1OWE3NDIzY2IwOTgyN2U1YmU1NDI1ZGYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZDkyODMzYjUwNzc3NGFlMWFkNzQzOWEyNDA4YjJhODkuYmluZFBvcHVwKHBvcHVwX2ViNDkzOGUzOTE4NzRjNWI4ZTg4MzRmNWFhMzgxYzFmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzJhOGU0YWUyYzhhYjRkZWJhYTY2NmQyNWE5Yjc3ODQ5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjMzNjY5MzA1NTQzNjUsLTc0LjEyOTQzNDI2Nzk3MDA4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzdhYTgyOWU4YTE4ZTRhMGE4MzljMjU2Mzg0NDU4YjM0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2Q2ZDEyMDFhNmQ1YTQwZWU4NTc3Y2Y0ZjdlMzBjMmFlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzc4NGZhMmVkMzMyYjRiMDVhNzhiYWI2Njg4ODY2OTY5ID0gJCgnPGRpdiBpZD0iaHRtbF83ODRmYTJlZDMzMmI0YjA1YTc4YmFiNjY4ODg2Njk2OSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UG9ydCBSaWNobW9uZCwgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZDZkMTIwMWE2ZDVhNDBlZTg1NzdjZjRmN2UzMGMyYWUuc2V0Q29udGVudChodG1sXzc4NGZhMmVkMzMyYjRiMDVhNzhiYWI2Njg4ODY2OTY5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzJhOGU0YWUyYzhhYjRkZWJhYTY2NmQyNWE5Yjc3ODQ5LmJpbmRQb3B1cChwb3B1cF9kNmQxMjAxYTZkNWE0MGVlODU3N2NmNGY3ZTMwYzJhZSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lMDJmMzRmZDIwMzg0MGEzODZjYmMzOWY5NjFlOTJhOCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjYzMjU0NjM5MDQ4MTEyNCwtNzQuMTUwMDg1MzcwNDY5ODFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfN2FhODI5ZThhMThlNGEwYTgzOWMyNTYzODQ0NThiMzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZGNjNzU3MmI2NzAxNDQyN2E0YTM0NGM2MzkzMTBiOWYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNWRkM2U1MzY0ZWMxNDkwYmI0YTRlYWZlNjBkYjI2ZjggPSAkKCc8ZGl2IGlkPSJodG1sXzVkZDNlNTM2NGVjMTQ5MGJiNGE0ZWFmZTYwZGIyNmY4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NYXJpbmVyJiMzOTtzIEhhcmJvciwgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZGNjNzU3MmI2NzAxNDQyN2E0YTM0NGM2MzkzMTBiOWYuc2V0Q29udGVudChodG1sXzVkZDNlNTM2NGVjMTQ5MGJiNGE0ZWFmZTYwZGIyNmY4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2UwMmYzNGZkMjAzODQwYTM4NmNiYzM5Zjk2MWU5MmE4LmJpbmRQb3B1cChwb3B1cF9kY2M3NTcyYjY3MDE0NDI3YTRhMzQ0YzYzOTMxMGI5Zik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mZDM0NzgwMTM0ZDI0YWI3ODUxNzljZDg3ZWVlMDgwNyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjYzOTY4Mjk3ODQ1NTQyLC03NC4xNzQ2NDUzMjk5MzU0Ml0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83YWE4MjllOGExOGU0YTBhODM5YzI1NjM4NDQ1OGIzNCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8yZTM5MWEzNjg1OTg0MTRiODUwYTVlZmRlYWIxZTI3YyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wMzY1MzczMjAyYjY0NDZmYTVhMGM3ZDIwZmJiMzg2YiA9ICQoJzxkaXYgaWQ9Imh0bWxfMDM2NTM3MzIwMmI2NDQ2ZmE1YTBjN2QyMGZiYjM4NmIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlBvcnQgSXZvcnksIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzJlMzkxYTM2ODU5ODQxNGI4NTBhNWVmZGVhYjFlMjdjLnNldENvbnRlbnQoaHRtbF8wMzY1MzczMjAyYjY0NDZmYTVhMGM3ZDIwZmJiMzg2Yik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9mZDM0NzgwMTM0ZDI0YWI3ODUxNzljZDg3ZWVlMDgwNy5iaW5kUG9wdXAocG9wdXBfMmUzOTFhMzY4NTk4NDE0Yjg1MGE1ZWZkZWFiMWUyN2MpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNWIzOGIwNzU5ZDdhNDJiM2E2OTNjZmZjOThkMGE4MzkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42MTMzMzU5Mzc2Njc0MiwtNzQuMTE5MTgwNTg1MzQ4NDJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfN2FhODI5ZThhMThlNGEwYTgzOWMyNTYzODQ0NThiMzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZTFiYmIxMWQ2N2VlNGY4OThjZjIwYjI0ZWY0Yzc1NDggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNWVjZGMyNzBiMDY4NDIxMmFlZmYwOWEwYjM0MzkzMWMgPSAkKCc8ZGl2IGlkPSJodG1sXzVlY2RjMjcwYjA2ODQyMTJhZWZmMDlhMGIzNDM5MzFjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DYXN0bGV0b24gQ29ybmVycywgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZTFiYmIxMWQ2N2VlNGY4OThjZjIwYjI0ZWY0Yzc1NDguc2V0Q29udGVudChodG1sXzVlY2RjMjcwYjA2ODQyMTJhZWZmMDlhMGIzNDM5MzFjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzViMzhiMDc1OWQ3YTQyYjNhNjkzY2ZmYzk4ZDBhODM5LmJpbmRQb3B1cChwb3B1cF9lMWJiYjExZDY3ZWU0Zjg5OGNmMjBiMjRlZjRjNzU0OCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jNDhkNWVlMjlmNzk0MzdhYjFiMjM5ZmM0NTM1NjEyYiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjU5NDI1MjM3OTE2MTY5NSwtNzQuMTY0OTYwMzEzMjk4MjddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfN2FhODI5ZThhMThlNGEwYTgzOWMyNTYzODQ0NThiMzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYjgxNWI0OTAxZTEzNDRkOWIxMDEzNmE5MTkwZDk1YjggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfY2JkNmEyMmYzMjg5NGJiNzkzNGY2NDhmYWZmN2Y5MmYgPSAkKCc8ZGl2IGlkPSJodG1sX2NiZDZhMjJmMzI4OTRiYjc5MzRmNjQ4ZmFmZjdmOTJmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5OZXcgU3ByaW5ndmlsbGUsIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2I4MTViNDkwMWUxMzQ0ZDliMTAxMzZhOTE5MGQ5NWI4LnNldENvbnRlbnQoaHRtbF9jYmQ2YTIyZjMyODk0YmI3OTM0ZjY0OGZhZmY3ZjkyZik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9jNDhkNWVlMjlmNzk0MzdhYjFiMjM5ZmM0NTM1NjEyYi5iaW5kUG9wdXAocG9wdXBfYjgxNWI0OTAxZTEzNDRkOWIxMDEzNmE5MTkwZDk1YjgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfN2FmZGM4YjU4MjI4NDZkOGIxZDI1Mjk3OWJmNzMyMDggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC41ODYzMTM3NTEwMzI4MSwtNzQuMTkwNzM3MTc1MzgxMTZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfN2FhODI5ZThhMThlNGEwYTgzOWMyNTYzODQ0NThiMzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZDZlNDU0OTU5MGYxNDJhM2FiMDJkMjk0OTcyZDgzNTggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYzU2M2UzYmUzNjk0NDU0Yzk5YjkxYjQwZWRlMThkZWIgPSAkKCc8ZGl2IGlkPSJodG1sX2M1NjNlM2JlMzY5NDQ1NGM5OWI5MWI0MGVkZTE4ZGViIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5UcmF2aXMsIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2Q2ZTQ1NDk1OTBmMTQyYTNhYjAyZDI5NDk3MmQ4MzU4LnNldENvbnRlbnQoaHRtbF9jNTYzZTNiZTM2OTQ0NTRjOTliOTFiNDBlZGUxOGRlYik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl83YWZkYzhiNTgyMjg0NmQ4YjFkMjUyOTc5YmY3MzIwOC5iaW5kUG9wdXAocG9wdXBfZDZlNDU0OTU5MGYxNDJhM2FiMDJkMjk0OTcyZDgzNTgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMzc1MTE5ODQ4Yjk1NDhmYWJlZDRhZDQzZWVmMmFlZWQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC41NzI1NzIzMTgyMDYzMiwtNzQuMTE2NDc5NDM2MDYzOF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83YWE4MjllOGExOGU0YTBhODM5YzI1NjM4NDQ1OGIzNCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF80ZWNiMjhhZWIwNmU0YzdhODc1M2EyZDk1ZjY5YjgwOCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83NWU1ODllNWI1ZGE0YTZmODBlM2MwODA5N2I3NzMwMCA9ICQoJzxkaXYgaWQ9Imh0bWxfNzVlNTg5ZTViNWRhNGE2ZjgwZTNjMDgwOTdiNzczMDAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk5ldyBEb3JwLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80ZWNiMjhhZWIwNmU0YzdhODc1M2EyZDk1ZjY5YjgwOC5zZXRDb250ZW50KGh0bWxfNzVlNTg5ZTViNWRhNGE2ZjgwZTNjMDgwOTdiNzczMDApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMzc1MTE5ODQ4Yjk1NDhmYWJlZDRhZDQzZWVmMmFlZWQuYmluZFBvcHVwKHBvcHVwXzRlY2IyOGFlYjA2ZTRjN2E4NzUzYTJkOTVmNjliODA4KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2JhNzllZmRiNGIxMDRkOWQ4NzY1NjVjMmI5YTMwOTkzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTU4NDYyMjQzMjg4OCwtNzQuMTIxNTY1OTM3NzE4OTZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfN2FhODI5ZThhMThlNGEwYTgzOWMyNTYzODQ0NThiMzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNDYyN2YwN2FiMTIxNGQyZjg1NDc2MTM2M2MyODlkNjYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNWI2NWRhZTJhOTRiNGM1ZWE4NTgxN2MwMTFkZGY5NGIgPSAkKCc8ZGl2IGlkPSJodG1sXzViNjVkYWUyYTk0YjRjNWVhODU4MTdjMDExZGRmOTRiIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5PYWt3b29kLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80NjI3ZjA3YWIxMjE0ZDJmODU0NzYxMzYzYzI4OWQ2Ni5zZXRDb250ZW50KGh0bWxfNWI2NWRhZTJhOTRiNGM1ZWE4NTgxN2MwMTFkZGY5NGIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYmE3OWVmZGI0YjEwNGQ5ZDg3NjU2NWMyYjlhMzA5OTMuYmluZFBvcHVwKHBvcHVwXzQ2MjdmMDdhYjEyMTRkMmY4NTQ3NjEzNjNjMjg5ZDY2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzc2OTlhYzc2ODc0NzQyYTFhZjhkOTFjYmFmYzNjNmI1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTQ5NDgwMjI4NzEzNjA1LC03NC4xNDkzMjM4MTQ5MDk5Ml0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83YWE4MjllOGExOGU0YTBhODM5YzI1NjM4NDQ1OGIzNCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zYWUxNGI1ODhiOWM0MGQwYjg0OThkYjQ5NGYxZWQ1YiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83MzFhOWEwYThhODg0YTRhOGU4Nzc4NGQ2NmM5ZjA4ZiA9ICQoJzxkaXYgaWQ9Imh0bWxfNzMxYTlhMGE4YTg4NGE0YThlODc3ODRkNjZjOWYwOGYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkdyZWF0IEtpbGxzLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zYWUxNGI1ODhiOWM0MGQwYjg0OThkYjQ5NGYxZWQ1Yi5zZXRDb250ZW50KGh0bWxfNzMxYTlhMGE4YTg4NGE0YThlODc3ODRkNjZjOWYwOGYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNzY5OWFjNzY4NzQ3NDJhMWFmOGQ5MWNiYWZjM2M2YjUuYmluZFBvcHVwKHBvcHVwXzNhZTE0YjU4OGI5YzQwZDBiODQ5OGRiNDk0ZjFlZDViKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzc3MWVlMzBlYjE4MDQ2OTNiNjkxMjFkZDNlZTU5MmIyID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTQyMjMwNzQ3NDUwNzQ1LC03NC4xNjQzMzA4MDQxOTM2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzdhYTgyOWU4YTE4ZTRhMGE4MzljMjU2Mzg0NDU4YjM0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzM3OTMzMThjODc2NTQ1Y2M5NGI0ZTc2Y2ZmMzM4Mjk0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzI4ZDA2NDg3YzNkYTQ1Mzc4ODU2MDg3OTdkMmJmNjMyID0gJCgnPGRpdiBpZD0iaHRtbF8yOGQwNjQ4N2MzZGE0NTM3ODg1NjA4Nzk3ZDJiZjYzMiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RWx0aW5ndmlsbGUsIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzM3OTMzMThjODc2NTQ1Y2M5NGI0ZTc2Y2ZmMzM4Mjk0LnNldENvbnRlbnQoaHRtbF8yOGQwNjQ4N2MzZGE0NTM3ODg1NjA4Nzk3ZDJiZjYzMik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl83NzFlZTMwZWIxODA0NjkzYjY5MTIxZGQzZWU1OTJiMi5iaW5kUG9wdXAocG9wdXBfMzc5MzMxOGM4NzY1NDVjYzk0YjRlNzZjZmYzMzgyOTQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYzlhNWJlODg1ZTg1NGFhZTgzNDVjMzgzYzE3YTVlYmYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC41MzgxMTQxNzQ3NDUwNywtNzQuMTc4NTQ4NjYxNjU4NzhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfN2FhODI5ZThhMThlNGEwYTgzOWMyNTYzODQ0NThiMzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOTdhMDYzYzc1NTE2NDBiMWI0NGRlOWE4Zjc2Mjk3MDEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMmY4NDMyNGIyYzk2NGUyZGE1NGQ1YzRkMjA4OWE1ZTkgPSAkKCc8ZGl2IGlkPSJodG1sXzJmODQzMjRiMmM5NjRlMmRhNTRkNWM0ZDIwODlhNWU5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Bbm5hZGFsZSwgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOTdhMDYzYzc1NTE2NDBiMWI0NGRlOWE4Zjc2Mjk3MDEuc2V0Q29udGVudChodG1sXzJmODQzMjRiMmM5NjRlMmRhNTRkNWM0ZDIwODlhNWU5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2M5YTViZTg4NWU4NTRhYWU4MzQ1YzM4M2MxN2E1ZWJmLmJpbmRQb3B1cChwb3B1cF85N2EwNjNjNzU1MTY0MGIxYjQ0ZGU5YThmNzYyOTcwMSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9kMmUzM2RjMDI2NjI0ODFlOTlhNWNiZDE1YzY3N2EwOSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjU0MTk2NzYyMjg4ODc1NSwtNzQuMjA1MjQ1ODI0ODAzMjZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfN2FhODI5ZThhMThlNGEwYTgzOWMyNTYzODQ0NThiMzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYTFiYTUzMWI4MzBkNDQ5YmIzNjFmYzQ5YWM5ODE5YmYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNWE2YTkxOWRkZTAzNDUwYjllOTA0ZWU2ZDY2MjAzYmEgPSAkKCc8ZGl2IGlkPSJodG1sXzVhNmE5MTlkZGUwMzQ1MGI5ZTkwNGVlNmQ2NjIwM2JhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Xb29kcm93LCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hMWJhNTMxYjgzMGQ0NDliYjM2MWZjNDlhYzk4MTliZi5zZXRDb250ZW50KGh0bWxfNWE2YTkxOWRkZTAzNDUwYjllOTA0ZWU2ZDY2MjAzYmEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZDJlMzNkYzAyNjYyNDgxZTk5YTVjYmQxNWM2NzdhMDkuYmluZFBvcHVwKHBvcHVwX2ExYmE1MzFiODMwZDQ0OWJiMzYxZmM0OWFjOTgxOWJmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2U2YWVlZWE1MmIxZDQzYmY5OGUyMDdmMmY1ODdhNDkzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTA1MzMzNzYxMTU2NDIsLTc0LjI0NjU2OTM0MjM1MjgzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzdhYTgyOWU4YTE4ZTRhMGE4MzljMjU2Mzg0NDU4YjM0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2E0ZmUwMTU2Y2UyZjRkNGY4MTQwOGEzNmFhZmY2YTY2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzQwOTVkZDA1ZGQyZDQyNDQ5ZmRjMzJiNWMxODliYjY0ID0gJCgnPGRpdiBpZD0iaHRtbF80MDk1ZGQwNWRkMmQ0MjQ0OWZkYzMyYjVjMTg5YmI2NCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+VG90dGVudmlsbGUsIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2E0ZmUwMTU2Y2UyZjRkNGY4MTQwOGEzNmFhZmY2YTY2LnNldENvbnRlbnQoaHRtbF80MDk1ZGQwNWRkMmQ0MjQ0OWZkYzMyYjVjMTg5YmI2NCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9lNmFlZWVhNTJiMWQ0M2JmOThlMjA3ZjJmNTg3YTQ5My5iaW5kUG9wdXAocG9wdXBfYTRmZTAxNTZjZTJmNGQ0ZjgxNDA4YTM2YWFmZjZhNjYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZTQ0MTNmNmRiMjIwNDFmYzg1NDcyMzA3NDMzMTM4ODYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42MzczMTYwNjcxMTAzMjYsLTc0LjA4MDU1MzUxNzkwMTE1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzdhYTgyOWU4YTE4ZTRhMGE4MzljMjU2Mzg0NDU4YjM0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzBmNjBhNzU3MTM3MDQ3OGVhNjJkOTQ3M2IzOTg2ODgxID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzVmOWY5ZDA1YTE1MzQ1NmNiODRhM2VmOGYxODM1YjczID0gJCgnPGRpdiBpZD0iaHRtbF81ZjlmOWQwNWExNTM0NTZjYjg0YTNlZjhmMTgzNWI3MyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+VG9tcGtpbnN2aWxsZSwgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMGY2MGE3NTcxMzcwNDc4ZWE2MmQ5NDczYjM5ODY4ODEuc2V0Q29udGVudChodG1sXzVmOWY5ZDA1YTE1MzQ1NmNiODRhM2VmOGYxODM1YjczKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2U0NDEzZjZkYjIyMDQxZmM4NTQ3MjMwNzQzMzEzODg2LmJpbmRQb3B1cChwb3B1cF8wZjYwYTc1NzEzNzA0NzhlYTYyZDk0NzNiMzk4Njg4MSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl82MDBmZWNmZmYxOTk0YjA1ODA3YjVkZGRiMWUzZjFlNSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjYxOTE5MzEwNzkyNjc2LC03NC4wOTYyOTAyOTIzNTQ1OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83YWE4MjllOGExOGU0YTBhODM5YzI1NjM4NDQ1OGIzNCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF81NjIxZGVhZmQzMWY0NWU1YmQ1YWUxZmQ2MWZiYTc2NyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jZDk1NjdkYWZjMzk0ZDdjYWI4YjUxYjNiMGFlNDY4NyA9ICQoJzxkaXYgaWQ9Imh0bWxfY2Q5NTY3ZGFmYzM5NGQ3Y2FiOGI1MWIzYjBhZTQ2ODciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlNpbHZlciBMYWtlLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81NjIxZGVhZmQzMWY0NWU1YmQ1YWUxZmQ2MWZiYTc2Ny5zZXRDb250ZW50KGh0bWxfY2Q5NTY3ZGFmYzM5NGQ3Y2FiOGI1MWIzYjBhZTQ2ODcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNjAwZmVjZmZmMTk5NGIwNTgwN2I1ZGRkYjFlM2YxZTUuYmluZFBvcHVwKHBvcHVwXzU2MjFkZWFmZDMxZjQ1ZTViZDVhZTFmZDYxZmJhNzY3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzEyNjliMTI0NWNkOTQxYmNiNDVhMDg5YjdhMjMwMzU2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjEyNzYwMTU3NTY0ODksLTc0LjA5NzEyNTUyMTc4NTNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfN2FhODI5ZThhMThlNGEwYTgzOWMyNTYzODQ0NThiMzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMGVjZTc4ZWY3OWVmNDM2MjgzOGYxYjI5YmE0YTBjZjYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfM2ExZmNiNjZhMTk5NDIzYmI3NzY4YjNhZmY5MjU0ZTcgPSAkKCc8ZGl2IGlkPSJodG1sXzNhMWZjYjY2YTE5OTQyM2JiNzc2OGIzYWZmOTI1NGU3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5TdW5ueXNpZGUsIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzBlY2U3OGVmNzllZjQzNjI4MzhmMWIyOWJhNGEwY2Y2LnNldENvbnRlbnQoaHRtbF8zYTFmY2I2NmExOTk0MjNiYjc3NjhiM2FmZjkyNTRlNyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8xMjY5YjEyNDVjZDk0MWJjYjQ1YTA4OWI3YTIzMDM1Ni5iaW5kUG9wdXAocG9wdXBfMGVjZTc4ZWY3OWVmNDM2MjgzOGYxYjI5YmE0YTBjZjYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZDkwMzVjMDc5YTYwNDAzMjk3Y2Y3YjdhODZhODQ3NGEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42NDM2NzUxODMzNDA5NzQsLTczLjk2MTAxMzEyNDY2Nzc5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzdhYTgyOWU4YTE4ZTRhMGE4MzljMjU2Mzg0NDU4YjM0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzQyY2UyOWI1NGM1MDQ4MGViYzZlNDIyOWY2ZDQzOGM5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzM5MGExOGNhMjVmMDQzNmViNGUzMWI4YjhhZTU5OTQwID0gJCgnPGRpdiBpZD0iaHRtbF8zOTBhMThjYTI1ZjA0MzZlYjRlMzFiOGI4YWU1OTk0MCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RGl0bWFzIFBhcmssIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80MmNlMjliNTRjNTA0ODBlYmM2ZTQyMjlmNmQ0MzhjOS5zZXRDb250ZW50KGh0bWxfMzkwYTE4Y2EyNWYwNDM2ZWI0ZTMxYjhiOGFlNTk5NDApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZDkwMzVjMDc5YTYwNDAzMjk3Y2Y3YjdhODZhODQ3NGEuYmluZFBvcHVwKHBvcHVwXzQyY2UyOWI1NGM1MDQ4MGViYzZlNDIyOWY2ZDQzOGM5KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzc4M2M2YmQ3ZTAxMzQ2ZTBiYzg3ZWZhYWIzMTIxZGMwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjYwOTQ2NTYxODgxMTEsLTczLjkzNzE4NjgwNTU5MzE0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzdhYTgyOWU4YTE4ZTRhMGE4MzljMjU2Mzg0NDU4YjM0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzk0MTk2ZDlhYzAzMDQzODRhMzAzZjBmZWE2N2RmNzM1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzgxOTMxM2YxZjVlMzRjN2E5YzZjODFlNTA3MzFhZjg2ID0gJCgnPGRpdiBpZD0iaHRtbF84MTkzMTNmMWY1ZTM0YzdhOWM2YzgxZTUwNzMxYWY4NiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+V2luZ2F0ZSwgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzk0MTk2ZDlhYzAzMDQzODRhMzAzZjBmZWE2N2RmNzM1LnNldENvbnRlbnQoaHRtbF84MTkzMTNmMWY1ZTM0YzdhOWM2YzgxZTUwNzMxYWY4Nik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl83ODNjNmJkN2UwMTM0NmUwYmM4N2VmYWFiMzEyMWRjMC5iaW5kUG9wdXAocG9wdXBfOTQxOTZkOWFjMDMwNDM4NGEzMDNmMGZlYTY3ZGY3MzUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZWY4NDIyZDgzZjQzNDI1MmI0Yjc5ODg3MWZiNWMwZjQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42NTU1NzIzMTMyODA3NjQsLTczLjkyNjg4MjEyNjE2OTU1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzdhYTgyOWU4YTE4ZTRhMGE4MzljMjU2Mzg0NDU4YjM0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2RlOTdmYzU3ODk5NTQzMTc5YjQ1MDQyOWIwNmQwNDU3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzc3OTBhZGFmZThiZjRlYmViOTZiZTQ0NWRhNDg5MDJhID0gJCgnPGRpdiBpZD0iaHRtbF83NzkwYWRhZmU4YmY0ZWJlYjk2YmU0NDVkYTQ4OTAyYSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UnVnYnksIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kZTk3ZmM1Nzg5OTU0MzE3OWI0NTA0MjliMDZkMDQ1Ny5zZXRDb250ZW50KGh0bWxfNzc5MGFkYWZlOGJmNGViZWI5NmJlNDQ1ZGE0ODkwMmEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZWY4NDIyZDgzZjQzNDI1MmI0Yjc5ODg3MWZiNWMwZjQuYmluZFBvcHVwKHBvcHVwX2RlOTdmYzU3ODk5NTQzMTc5YjQ1MDQyOWIwNmQwNDU3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzY2ZjE1YzgwYzI1ODRkMjNhNDAyODUwYzJkNGQ4ODVlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjA5MTkwNDQ0MzQ1NTgsLTc0LjA4MDE1NzM0OTM2Mjk2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzdhYTgyOWU4YTE4ZTRhMGE4MzljMjU2Mzg0NDU4YjM0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2FhYWExNjQ3MjYzODQyODc5N2NkMzI1YWEwZmIxOTVkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzVkODk2OWZkMTk1YzQzOTZhMDk1ODQ2Y2MyNDFiOTA5ID0gJCgnPGRpdiBpZD0iaHRtbF81ZDg5NjlmZDE5NWM0Mzk2YTA5NTg0NmNjMjQxYjkwOSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UGFyayBIaWxsLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hYWFhMTY0NzI2Mzg0Mjg3OTdjZDMyNWFhMGZiMTk1ZC5zZXRDb250ZW50KGh0bWxfNWQ4OTY5ZmQxOTVjNDM5NmEwOTU4NDZjYzI0MWI5MDkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNjZmMTVjODBjMjU4NGQyM2E0MDI4NTBjMmQ0ZDg4NWUuYmluZFBvcHVwKHBvcHVwX2FhYWExNjQ3MjYzODQyODc5N2NkMzI1YWEwZmIxOTVkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzBlNWI4ZWFjYWU1YzQ4YzNiODQ2MmM2ZjZjYjU4ZGNkID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjIxMDkwNDcyNzU0MDksLTc0LjEzMzA0MTQzOTUxNzA0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzdhYTgyOWU4YTE4ZTRhMGE4MzljMjU2Mzg0NDU4YjM0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzM2MGM2OWFmOTM3ZTQ5YzliZDA3OWI2ODUzOTg0ODMyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2FmNTIxZDQ5N2VhZTQ4OGU4MTExMGFkYWVjMDA4YzIzID0gJCgnPGRpdiBpZD0iaHRtbF9hZjUyMWQ0OTdlYWU0ODhlODExMTBhZGFlYzAwOGMyMyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+V2VzdGVybGVpZ2gsIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzM2MGM2OWFmOTM3ZTQ5YzliZDA3OWI2ODUzOTg0ODMyLnNldENvbnRlbnQoaHRtbF9hZjUyMWQ0OTdlYWU0ODhlODExMTBhZGFlYzAwOGMyMyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8wZTViOGVhY2FlNWM0OGMzYjg0NjJjNmY2Y2I1OGRjZC5iaW5kUG9wdXAocG9wdXBfMzYwYzY5YWY5MzdlNDljOWJkMDc5YjY4NTM5ODQ4MzIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNWU2YTA2NzhmODJkNGM5Zjk3MmEwNWVjOTljNTE2OGUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42MjAxNzE1MTIyMzE4ODQsLTc0LjE1MzE1MjQ2Mzg3NzYyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzdhYTgyOWU4YTE4ZTRhMGE4MzljMjU2Mzg0NDU4YjM0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzMxMjdlOTY4MmYxMTQ1ZTM5NzY0MDQ2MDE1Y2JkZTc2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzJhNTYyMzUxYzQ5ZjRjOGE5ZTFjYmNmODkwNzU5ZWJiID0gJCgnPGRpdiBpZD0iaHRtbF8yYTU2MjM1MWM0OWY0YzhhOWUxY2JjZjg5MDc1OWViYiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+R3Jhbml0ZXZpbGxlLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zMTI3ZTk2ODJmMTE0NWUzOTc2NDA0NjAxNWNiZGU3Ni5zZXRDb250ZW50KGh0bWxfMmE1NjIzNTFjNDlmNGM4YTllMWNiY2Y4OTA3NTllYmIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNWU2YTA2NzhmODJkNGM5Zjk3MmEwNWVjOTljNTE2OGUuYmluZFBvcHVwKHBvcHVwXzMxMjdlOTY4MmYxMTQ1ZTM5NzY0MDQ2MDE1Y2JkZTc2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2U0ODdkYmI3MjNlMDQyYzg4M2I5YjBiM2NkZDU3NWE0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjM1MzI1MDk5MTE0OTIsLTc0LjE2NTEwNDIwMjQxMTI0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzdhYTgyOWU4YTE4ZTRhMGE4MzljMjU2Mzg0NDU4YjM0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzQ1ODU1ODE1MmU1YzQwMGZhOWI5YTlmYmFmYzVjNDQ5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzk2Y2EzMWRiMmM3NjQzZGRhODA4NWEzNzA5YzQ1YTg2ID0gJCgnPGRpdiBpZD0iaHRtbF85NmNhMzFkYjJjNzY0M2RkYTgwODVhMzcwOWM0NWE4NiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QXJsaW5ndG9uLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80NTg1NTgxNTJlNWM0MDBmYTliOWE5ZmJhZmM1YzQ0OS5zZXRDb250ZW50KGh0bWxfOTZjYTMxZGIyYzc2NDNkZGE4MDg1YTM3MDljNDVhODYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZTQ4N2RiYjcyM2UwNDJjODgzYjliMGIzY2RkNTc1YTQuYmluZFBvcHVwKHBvcHVwXzQ1ODU1ODE1MmU1YzQwMGZhOWI5YTlmYmFmYzVjNDQ5KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzNmNzkwMmU1OTU4MDQ2ZGFhYWZjNGIzM2EyMTA4ZDYwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTk2MzEyNTcxMjc2NzM0LC03NC4wNjcxMjM2MzIyNTU3NF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83YWE4MjllOGExOGU0YTBhODM5YzI1NjM4NDQ1OGIzNCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zM2Q1OGQ3YmM1MDE0MDgwYjY5YzczMGY1Njc0Zjc3OSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wODc5YjViZDczYjU0MWRmODVkN2QzMzljNTM3YTRjMyA9ICQoJzxkaXYgaWQ9Imh0bWxfMDg3OWI1YmQ3M2I1NDFkZjg1ZDdkMzM5YzUzN2E0YzMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkFycm9jaGFyLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zM2Q1OGQ3YmM1MDE0MDgwYjY5YzczMGY1Njc0Zjc3OS5zZXRDb250ZW50KGh0bWxfMDg3OWI1YmQ3M2I1NDFkZjg1ZDdkMzM5YzUzN2E0YzMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfM2Y3OTAyZTU5NTgwNDZkYWFhZmM0YjMzYTIxMDhkNjAuYmluZFBvcHVwKHBvcHVwXzMzZDU4ZDdiYzUwMTQwODBiNjljNzMwZjU2NzRmNzc5KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzFlZjdiMzA4MTIwODRmMGY4MjNlMGUyYjkxNDNkZmRlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTk4MjY4MzU5NTk5OTEsLTc0LjA3NjY3NDM2Mjc5MDVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfN2FhODI5ZThhMThlNGEwYTgzOWMyNTYzODQ0NThiMzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYjdhNTYyZWQxN2RjNDk3OTg1NWJhMDA0NTcwOWU5ZmQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZjEyNDQ4Nzg4ZWZlNGJjMzhlYzE3N2Q5MDA2ZDY0OGEgPSAkKCc8ZGl2IGlkPSJodG1sX2YxMjQ0ODc4OGVmZTRiYzM4ZWMxNzdkOTAwNmQ2NDhhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5HcmFzbWVyZSwgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYjdhNTYyZWQxN2RjNDk3OTg1NWJhMDA0NTcwOWU5ZmQuc2V0Q29udGVudChodG1sX2YxMjQ0ODc4OGVmZTRiYzM4ZWMxNzdkOTAwNmQ2NDhhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzFlZjdiMzA4MTIwODRmMGY4MjNlMGUyYjkxNDNkZmRlLmJpbmRQb3B1cChwb3B1cF9iN2E1NjJlZDE3ZGM0OTc5ODU1YmEwMDQ1NzA5ZTlmZCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9hNGIyNjE0NDk1YjI0NTI3YmQyZjk1MTEwMWY1N2Q5YSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjU5NjMyODkxMzc5NTEzLC03NC4wODc1MTExODAwNTU3OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83YWE4MjllOGExOGU0YTBhODM5YzI1NjM4NDQ1OGIzNCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zZDE3NmMxMGFmODQ0ZWJhODkzNzk3MGZhNGY1OTJkMCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hODcwNWY4YTNjM2M0NTUyYTVlYTQxYjBlOTBlOWY2OCA9ICQoJzxkaXYgaWQ9Imh0bWxfYTg3MDVmOGEzYzNjNDU1MmE1ZWE0MWIwZTkwZTlmNjgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk9sZCBUb3duLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zZDE3NmMxMGFmODQ0ZWJhODkzNzk3MGZhNGY1OTJkMC5zZXRDb250ZW50KGh0bWxfYTg3MDVmOGEzYzNjNDU1MmE1ZWE0MWIwZTkwZTlmNjgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYTRiMjYxNDQ5NWIyNDUyN2JkMmY5NTExMDFmNTdkOWEuYmluZFBvcHVwKHBvcHVwXzNkMTc2YzEwYWY4NDRlYmE4OTM3OTcwZmE0ZjU5MmQwKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzAyNjcwZDU2NDJkYTQ2YWFiZTk2NTIzNGIwYTg3NDc0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTg4NjcyOTQ4MTk5Mjc1LC03NC4wOTYzOTkwNTMxMjUyMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83YWE4MjllOGExOGU0YTBhODM5YzI1NjM4NDQ1OGIzNCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82M2U4YTVkNzZiNTA0ZGUxYWE2Nzc4YWRhODVmMDE3ZSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zZTNjYmEzMjZjNGI0MGU3ODFiOTY0NzRlMzlkNjRmOSA9ICQoJzxkaXYgaWQ9Imh0bWxfM2UzY2JhMzI2YzRiNDBlNzgxYjk2NDc0ZTM5ZDY0ZjkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkRvbmdhbiBIaWxscywgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNjNlOGE1ZDc2YjUwNGRlMWFhNjc3OGFkYTg1ZjAxN2Uuc2V0Q29udGVudChodG1sXzNlM2NiYTMyNmM0YjQwZTc4MWI5NjQ3NGUzOWQ2NGY5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzAyNjcwZDU2NDJkYTQ2YWFiZTk2NTIzNGIwYTg3NDc0LmJpbmRQb3B1cChwb3B1cF82M2U4YTVkNzZiNTA0ZGUxYWE2Nzc4YWRhODVmMDE3ZSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8wNzAxMzMzOTRkY2Y0MTZiODg3NDVhNTZlNjE4NGIwMyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjU3MzUyNjkwNTc0MjgzLC03NC4wOTM0ODI2NjMwMzU5MV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83YWE4MjllOGExOGU0YTBhODM5YzI1NjM4NDQ1OGIzNCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9kMTZiZTgwNDJiNTY0MWI5Yjc5MWE5ZDI4M2NiNGQzZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF81OGIwZmQ5NmE2YmU0ZmEzODE0MTg1ZTQ1YTM3ZmIwZSA9ICQoJzxkaXYgaWQ9Imh0bWxfNThiMGZkOTZhNmJlNGZhMzgxNDE4NWU0NWEzN2ZiMGUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk1pZGxhbmQgQmVhY2gsIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2QxNmJlODA0MmI1NjQxYjliNzkxYTlkMjgzY2I0ZDNmLnNldENvbnRlbnQoaHRtbF81OGIwZmQ5NmE2YmU0ZmEzODE0MTg1ZTQ1YTM3ZmIwZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8wNzAxMzMzOTRkY2Y0MTZiODg3NDVhNTZlNjE4NGIwMy5iaW5kUG9wdXAocG9wdXBfZDE2YmU4MDQyYjU2NDFiOWI3OTFhOWQyODNjYjRkM2YpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZWVjN2E1MjRmN2YxNGIwOWE5YzdjNGY2MmJkYzA2N2QgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC41NzYyMTU1ODcxMTc4OCwtNzQuMTA1ODU1OTg1NDU0MzRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfN2FhODI5ZThhMThlNGEwYTgzOWMyNTYzODQ0NThiMzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNDQ5YjJiYTUwMzM1NDk5Zjk1OTg1MjZlY2IwNDdiZDAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNTIzZmE1NjJkOTYyNDllZWI3NWFiYjJhOTkzNTJjMTEgPSAkKCc8ZGl2IGlkPSJodG1sXzUyM2ZhNTYyZDk2MjQ5ZWViNzVhYmIyYTk5MzUyYzExIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5HcmFudCBDaXR5LCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80NDliMmJhNTAzMzU0OTlmOTU5ODUyNmVjYjA0N2JkMC5zZXRDb250ZW50KGh0bWxfNTIzZmE1NjJkOTYyNDllZWI3NWFiYjJhOTkzNTJjMTEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZWVjN2E1MjRmN2YxNGIwOWE5YzdjNGY2MmJkYzA2N2QuYmluZFBvcHVwKHBvcHVwXzQ0OWIyYmE1MDMzNTQ5OWY5NTk4NTI2ZWNiMDQ3YmQwKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2QwYzZhNjU4ZDBkNDQ1OTZiNjA3ZmEyNDI4NDZhNzBiID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTY0MjU1NDkzMDczMzUsLTc0LjEwNDMyNzA3NDY5MTI0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzdhYTgyOWU4YTE4ZTRhMGE4MzljMjU2Mzg0NDU4YjM0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzY2OTM2YjNjNzRkYjRiOTRhYTVlZGI1NTM4NTAwY2Q4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzM2NjIzY2NkNzgzOTQxZmFiYWQ0YmRlYmExZTdlNTI5ID0gJCgnPGRpdiBpZD0iaHRtbF8zNjYyM2NjZDc4Mzk0MWZhYmFkNGJkZWJhMWU3ZTUyOSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TmV3IERvcnAgQmVhY2gsIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzY2OTM2YjNjNzRkYjRiOTRhYTVlZGI1NTM4NTAwY2Q4LnNldENvbnRlbnQoaHRtbF8zNjYyM2NjZDc4Mzk0MWZhYmFkNGJkZWJhMWU3ZTUyOSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9kMGM2YTY1OGQwZDQ0NTk2YjYwN2ZhMjQyODQ2YTcwYi5iaW5kUG9wdXAocG9wdXBfNjY5MzZiM2M3NGRiNGI5NGFhNWVkYjU1Mzg1MDBjZDgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNzk0YWNmMjU5NjI5NGQ0OWE5NGFhZjU2N2FjMTc1OGMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC41NTM5ODgwMDg1ODQ2MiwtNzQuMTM5MTY2MjIxNzU3NjhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfN2FhODI5ZThhMThlNGEwYTgzOWMyNTYzODQ0NThiMzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZWFmMDQxMjYxNjhlNDc3MjljYzM2MTc1NzYyMzkzMjkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNGJkMzRjOTVmMDZkNGQ5NmI4ODRiNjg3MTA2NDZhMzYgPSAkKCc8ZGl2IGlkPSJodG1sXzRiZDM0Yzk1ZjA2ZDRkOTZiODg0YjY4NzEwNjQ2YTM2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5CYXkgVGVycmFjZSwgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZWFmMDQxMjYxNjhlNDc3MjljYzM2MTc1NzYyMzkzMjkuc2V0Q29udGVudChodG1sXzRiZDM0Yzk1ZjA2ZDRkOTZiODg0YjY4NzEwNjQ2YTM2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzc5NGFjZjI1OTYyOTRkNDlhOTRhYWY1NjdhYzE3NThjLmJpbmRQb3B1cChwb3B1cF9lYWYwNDEyNjE2OGU0NzcyOWNjMzYxNzU3NjIzOTMyOSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jMWY4OWRlMTVmNjM0YWVmYjhhMmMzODQyMjI4ZDk5OCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjUzMTkxMTkyMDQ4OTYwNSwtNzQuMTkxNzQxMDU3NDc4MTRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfN2FhODI5ZThhMThlNGEwYTgzOWMyNTYzODQ0NThiMzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfY2Y3NDQ0YjdjMDM5NGFjM2JkYmY4YWVlM2YwZTFkOGQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZTZmZTBkMzg2ODBhNDQ4MDhjOTY5YzkyYTUwZWI4NTIgPSAkKCc8ZGl2IGlkPSJodG1sX2U2ZmUwZDM4NjgwYTQ0ODA4Yzk2OWM5MmE1MGViODUyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5IdWd1ZW5vdCwgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfY2Y3NDQ0YjdjMDM5NGFjM2JkYmY4YWVlM2YwZTFkOGQuc2V0Q29udGVudChodG1sX2U2ZmUwZDM4NjgwYTQ0ODA4Yzk2OWM5MmE1MGViODUyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2MxZjg5ZGUxNWY2MzRhZWZiOGEyYzM4NDIyMjhkOTk4LmJpbmRQb3B1cChwb3B1cF9jZjc0NDRiN2MwMzk0YWMzYmRiZjhhZWUzZjBlMWQ4ZCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85M2FkOGJjM2IyYTk0NjZhYjQxNjAyNzA2OGFkYzEyYiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjUyNDY5OTM3NjExODEzNiwtNzQuMjE5ODMxMDY2MTY3NzddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfN2FhODI5ZThhMThlNGEwYTgzOWMyNTYzODQ0NThiMzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNGViNTljMmE4OGRmNDcwOWE2NGY2ODhjMzljMDU0ZWMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNWYxOGMzMGM3NDg0NGVjZDlmNDM2NWI2MTJhNzY3ZmEgPSAkKCc8ZGl2IGlkPSJodG1sXzVmMThjMzBjNzQ4NDRlY2Q5ZjQzNjViNjEyYTc2N2ZhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5QbGVhc2FudCBQbGFpbnMsIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzRlYjU5YzJhODhkZjQ3MDlhNjRmNjg4YzM5YzA1NGVjLnNldENvbnRlbnQoaHRtbF81ZjE4YzMwYzc0ODQ0ZWNkOWY0MzY1YjYxMmE3NjdmYSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl85M2FkOGJjM2IyYTk0NjZhYjQxNjAyNzA2OGFkYzEyYi5iaW5kUG9wdXAocG9wdXBfNGViNTljMmE4OGRmNDcwOWE2NGY2ODhjMzljMDU0ZWMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYWY5YjM0MGZlY2Q0NDEwMjkwODYxNzQ5MjNhYzhlNmUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC41MDYwODE2NTM0NjMwNSwtNzQuMjI5NTAzNTAyNjAwMjddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfN2FhODI5ZThhMThlNGEwYTgzOWMyNTYzODQ0NThiMzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfY2E0YjQwOTYyNzFmNDc3NTkwNTMwNDA0Nzg4YjFlZTYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZTMzZDExNDQwNzJkNGE5ZGFmYTkxZjNlMTBjZTYzZjEgPSAkKCc8ZGl2IGlkPSJodG1sX2UzM2QxMTQ0MDcyZDRhOWRhZmE5MWYzZTEwY2U2M2YxIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5CdXRsZXIgTWFub3IsIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2NhNGI0MDk2MjcxZjQ3NzU5MDUzMDQwNDc4OGIxZWU2LnNldENvbnRlbnQoaHRtbF9lMzNkMTE0NDA3MmQ0YTlkYWZhOTFmM2UxMGNlNjNmMSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9hZjliMzQwZmVjZDQ0MTAyOTA4NjE3NDkyM2FjOGU2ZS5iaW5kUG9wdXAocG9wdXBfY2E0YjQwOTYyNzFmNDc3NTkwNTMwNDA0Nzg4YjFlZTYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNzE3Y2NhZDdkYjIzNGQ4YWFjNThmZDlmMTEzODM3ZDAgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC41MzA1MzE0ODI4MzMxNCwtNzQuMjMyMTU3NzU4OTY1MjZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfN2FhODI5ZThhMThlNGEwYTgzOWMyNTYzODQ0NThiMzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNDMyYTUyMDA5YzdmNGE2YWIyYWI0YTk1MTNmMzM2OTYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZTJhZGMxOGM4ZDExNDM5NWJkOTdkOWFjYTVmOTkxODYgPSAkKCc8ZGl2IGlkPSJodG1sX2UyYWRjMThjOGQxMTQzOTViZDk3ZDlhY2E1Zjk5MTg2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DaGFybGVzdG9uLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80MzJhNTIwMDljN2Y0YTZhYjJhYjRhOTUxM2YzMzY5Ni5zZXRDb250ZW50KGh0bWxfZTJhZGMxOGM4ZDExNDM5NWJkOTdkOWFjYTVmOTkxODYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNzE3Y2NhZDdkYjIzNGQ4YWFjNThmZDlmMTEzODM3ZDAuYmluZFBvcHVwKHBvcHVwXzQzMmE1MjAwOWM3ZjRhNmFiMmFiNGE5NTEzZjMzNjk2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2JmZTI2YTgwYjMzNTRkYjRiMjQ3OTUwNzJkMDIxOWMxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTQ5NDA0MDA2NTAwNzIsLTc0LjIxNTcyODUxMTEzOTUyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzdhYTgyOWU4YTE4ZTRhMGE4MzljMjU2Mzg0NDU4YjM0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzk5Mjk2MGIwZjcwMTQyMThhODkyNGFjYWU0MWUzNmNjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2Y0YmQ4MDRiYWM0NjRmNmFhZDNiYzRkM2FhZjA4NTc0ID0gJCgnPGRpdiBpZD0iaHRtbF9mNGJkODA0YmFjNDY0ZjZhYWQzYmM0ZDNhYWYwODU3NCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Um9zc3ZpbGxlLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85OTI5NjBiMGY3MDE0MjE4YTg5MjRhY2FlNDFlMzZjYy5zZXRDb250ZW50KGh0bWxfZjRiZDgwNGJhYzQ2NGY2YWFkM2JjNGQzYWFmMDg1NzQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYmZlMjZhODBiMzM1NGRiNGIyNDc5NTA3MmQwMjE5YzEuYmluZFBvcHVwKHBvcHVwXzk5Mjk2MGIwZjcwMTQyMThhODkyNGFjYWU0MWUzNmNjKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzkyNmQ2ODZhMzZjMzRlYjNiZWVlZjY5MGY3NzRjOTdiID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTQ5Mjg1ODIyNzgzMjEsLTc0LjE4NTg4Njc0NTgzODkzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzdhYTgyOWU4YTE4ZTRhMGE4MzljMjU2Mzg0NDU4YjM0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzk0YjJiZmM3MDM4NjQ2OTBhOWY4M2M5NDEwYmVjNzEwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzg1NzU4YTJjMmI0NDQ1ZDU5ZGRmMTg1M2RhYzFiZTM1ID0gJCgnPGRpdiBpZD0iaHRtbF84NTc1OGEyYzJiNDQ0NWQ1OWRkZjE4NTNkYWMxYmUzNSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QXJkZW4gSGVpZ2h0cywgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOTRiMmJmYzcwMzg2NDY5MGE5ZjgzYzk0MTBiZWM3MTAuc2V0Q29udGVudChodG1sXzg1NzU4YTJjMmI0NDQ1ZDU5ZGRmMTg1M2RhYzFiZTM1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzkyNmQ2ODZhMzZjMzRlYjNiZWVlZjY5MGY3NzRjOTdiLmJpbmRQb3B1cChwb3B1cF85NGIyYmZjNzAzODY0NjkwYTlmODNjOTQxMGJlYzcxMCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81YzgwODJlOGY0YzQ0NzAxYWI4YmQ3N2EzNjBhZjA0MiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjU1NTI5NTIzNjE3MzE5NCwtNzQuMTcwNzk0MTQ3ODYwOTJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfN2FhODI5ZThhMThlNGEwYTgzOWMyNTYzODQ0NThiMzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOWQ2MDRhNmY0MDk5NDM0MWE3ZTA0OTU2ZmE0OTg5OTIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYWZlNzY3NGY5NzE1NDA0NGJmNTE5MjIxMWUyNzEyN2YgPSAkKCc8ZGl2IGlkPSJodG1sX2FmZTc2NzRmOTcxNTQwNDRiZjUxOTIyMTFlMjcxMjdmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5HcmVlbnJpZGdlLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85ZDYwNGE2ZjQwOTk0MzQxYTdlMDQ5NTZmYTQ5ODk5Mi5zZXRDb250ZW50KGh0bWxfYWZlNzY3NGY5NzE1NDA0NGJmNTE5MjIxMWUyNzEyN2YpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNWM4MDgyZThmNGM0NDcwMWFiOGJkNzdhMzYwYWYwNDIuYmluZFBvcHVwKHBvcHVwXzlkNjA0YTZmNDA5OTQzNDFhN2UwNDk1NmZhNDk4OTkyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzAzNzllZGYxZWJmYjRmM2Q5NTIyYWU1N2ZjNWNlZTUzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTg5MTM4OTQ4NzUyODEsLTc0LjE1OTAyMjA4MTU2NjAxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzdhYTgyOWU4YTE4ZTRhMGE4MzljMjU2Mzg0NDU4YjM0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzk4NmMwMWIyOTU1MTRhZjRhYTg3MjQzMDM4N2E5YjgzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzYxZDdhMjZjOTEyMTRhMzBhYTg1YmFlM2Y4ZGEwNjYyID0gJCgnPGRpdiBpZD0iaHRtbF82MWQ3YTI2YzkxMjE0YTMwYWE4NWJhZTNmOGRhMDY2MiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+SGVhcnRsYW5kIFZpbGxhZ2UsIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzk4NmMwMWIyOTU1MTRhZjRhYTg3MjQzMDM4N2E5YjgzLnNldENvbnRlbnQoaHRtbF82MWQ3YTI2YzkxMjE0YTMwYWE4NWJhZTNmOGRhMDY2Mik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8wMzc5ZWRmMWViZmI0ZjNkOTUyMmFlNTdmYzVjZWU1My5iaW5kUG9wdXAocG9wdXBfOTg2YzAxYjI5NTUxNGFmNGFhODcyNDMwMzg3YTliODMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOGY5ZDNjNzg5NDBmNGU0NzgwNTZiMWU3YjQ0YjkxNWIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC41OTQ3MjYwMjc0NjI5NSwtNzQuMTg5NTYwNDU1MTk2OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83YWE4MjllOGExOGU0YTBhODM5YzI1NjM4NDQ1OGIzNCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wNjBkYTE5OTg4YzY0MGQ0ODVkMDZhNjkwOTdkNDdhMiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jNzkxNDI1ZGJlZWQ0MmFmYmRmYjMwNDFhMmU4OWIwOCA9ICQoJzxkaXYgaWQ9Imh0bWxfYzc5MTQyNWRiZWVkNDJhZmJkZmIzMDQxYTJlODliMDgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNoZWxzZWEsIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzA2MGRhMTk5ODhjNjQwZDQ4NWQwNmE2OTA5N2Q0N2EyLnNldENvbnRlbnQoaHRtbF9jNzkxNDI1ZGJlZWQ0MmFmYmRmYjMwNDFhMmU4OWIwOCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl84ZjlkM2M3ODk0MGY0ZTQ3ODA1NmIxZTdiNDRiOTE1Yi5iaW5kUG9wdXAocG9wdXBfMDYwZGExOTk4OGM2NDBkNDg1ZDA2YTY5MDk3ZDQ3YTIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNWQ4NWE4MTIwOTE4NGVjNzlmYzRiNTM2NTcwY2VhNjEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42MDU3Nzg2ODQ1MjM1OCwtNzQuMTg3MjU2MzgzODE1NjddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfN2FhODI5ZThhMThlNGEwYTgzOWMyNTYzODQ0NThiMzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOWMxODU2ZmY4N2JkNGI0NTg0YzRkMjFhNTllOWUzOGYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNzU3YTQ1ZDAwODE4NDBkNWE0ZDgxMjk1YTQ3MzA4NjIgPSAkKCc8ZGl2IGlkPSJodG1sXzc1N2E0NWQwMDgxODQwZDVhNGQ4MTI5NWE0NzMwODYyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5CbG9vbWZpZWxkLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85YzE4NTZmZjg3YmQ0YjQ1ODRjNGQyMWE1OWU5ZTM4Zi5zZXRDb250ZW50KGh0bWxfNzU3YTQ1ZDAwODE4NDBkNWE0ZDgxMjk1YTQ3MzA4NjIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNWQ4NWE4MTIwOTE4NGVjNzlmYzRiNTM2NTcwY2VhNjEuYmluZFBvcHVwKHBvcHVwXzljMTg1NmZmODdiZDRiNDU4NGM0ZDIxYTU5ZTllMzhmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzc1MGMwODE0MjhlYTRhM2U5OTc5MTNkM2I5ODlkYzkyID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjA5NTkxODAwNDIwMywtNzQuMTU5NDA5NDg2NTcxMjJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfN2FhODI5ZThhMThlNGEwYTgzOWMyNTYzODQ0NThiMzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMmQ4YmUzNWNhNmM4NDViNzk2ZmVjZjY4YWU5Nzk5ZDIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOGJmNTg5OGI5MGM2NDVhNDk4YThjNGEzZDY0MWY3ZDAgPSAkKCc8ZGl2IGlkPSJodG1sXzhiZjU4OThiOTBjNjQ1YTQ5OGE4YzRhM2Q2NDFmN2QwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5CdWxscyBIZWFkLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yZDhiZTM1Y2E2Yzg0NWI3OTZmZWNmNjhhZTk3OTlkMi5zZXRDb250ZW50KGh0bWxfOGJmNTg5OGI5MGM2NDVhNDk4YThjNGEzZDY0MWY3ZDApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNzUwYzA4MTQyOGVhNGEzZTk5NzkxM2QzYjk4OWRjOTIuYmluZFBvcHVwKHBvcHVwXzJkOGJlMzVjYTZjODQ1Yjc5NmZlY2Y2OGFlOTc5OWQyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzgxNGJlY2M1Yjc2NzQxNDZhZDk3NjU1ZTExMDMzZjIwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzgyNjgyNTY3MTI1NywtNzMuOTUzMjU2NDY4MzcxMTJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfN2FhODI5ZThhMThlNGEwYTgzOWMyNTYzODQ0NThiMzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMThhYTE2MWQyYmMxNDk3Njk3Y2E0ZjdlNWQ5NTVhM2UgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMWRkMTI4MWExNzk0NDc5Y2FiN2ZhYzA3Mjk3ZjAzYTIgPSAkKCc8ZGl2IGlkPSJodG1sXzFkZDEyODFhMTc5NDQ3OWNhYjdmYWMwNzI5N2YwM2EyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DYXJuZWdpZSBIaWxsLCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzE4YWExNjFkMmJjMTQ5NzY5N2NhNGY3ZTVkOTU1YTNlLnNldENvbnRlbnQoaHRtbF8xZGQxMjgxYTE3OTQ0NzljYWI3ZmFjMDcyOTdmMDNhMik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl84MTRiZWNjNWI3Njc0MTQ2YWQ5NzY1NWUxMTAzM2YyMC5iaW5kUG9wdXAocG9wdXBfMThhYTE2MWQyYmMxNDk3Njk3Y2E0ZjdlNWQ5NTVhM2UpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNTY3Mjk3YzRmNzM4NDA4MDk3NjhlMTY0OWMzYmRmNzYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MjMyNTkwMTg4NTc2OCwtNzMuOTg4NDMzNjgwMjM1OTddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfN2FhODI5ZThhMThlNGEwYTgzOWMyNTYzODQ0NThiMzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZWNhMGUxN2VlNTAxNGY5MmIyNTU4MWIwZmM5MDFmOWUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNzIxMTkxZDMwYWEyNDNjYThlYTE0MzE0MDRkMDE3MWYgPSAkKCc8ZGl2IGlkPSJodG1sXzcyMTE5MWQzMGFhMjQzY2E4ZWExNDMxNDA0ZDAxNzFmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Ob2hvLCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2VjYTBlMTdlZTUwMTRmOTJiMjU1ODFiMGZjOTAxZjllLnNldENvbnRlbnQoaHRtbF83MjExOTFkMzBhYTI0M2NhOGVhMTQzMTQwNGQwMTcxZik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81NjcyOTdjNGY3Mzg0MDgwOTc2OGUxNjQ5YzNiZGY3Ni5iaW5kUG9wdXAocG9wdXBfZWNhMGUxN2VlNTAxNGY5MmIyNTU4MWIwZmM5MDFmOWUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZmYwYzUyZWYzNGE5NDZmMjljMjA5YjZiODdiOTliNjMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MTUyMjg5MjA0NjI4MiwtNzQuMDA1NDE1Mjk4NzMzNTVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfN2FhODI5ZThhMThlNGEwYTgzOWMyNTYzODQ0NThiMzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYWQ5ZmEwZGM0ZmUxNGUyMWE5OTA4ZTFkMjZhNGUzY2YgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfY2NlMzM5N2RkMWNiNGMzZjhkMGJlMGEyNTE2Njk1OGEgPSAkKCc8ZGl2IGlkPSJodG1sX2NjZTMzOTdkZDFjYjRjM2Y4ZDBiZTBhMjUxNjY5NThhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DaXZpYyBDZW50ZXIsIE1hbmhhdHRhbjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYWQ5ZmEwZGM0ZmUxNGUyMWE5OTA4ZTFkMjZhNGUzY2Yuc2V0Q29udGVudChodG1sX2NjZTMzOTdkZDFjYjRjM2Y4ZDBiZTBhMjUxNjY5NThhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2ZmMGM1MmVmMzRhOTQ2ZjI5YzIwOWI2Yjg3Yjk5YjYzLmJpbmRQb3B1cChwb3B1cF9hZDlmYTBkYzRmZTE0ZTIxYTk5MDhlMWQyNmE0ZTNjZik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8zOTdiNmZiNWYzZTI0M2IzYWVjMWEzMDFkNDkwNWExYiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc0ODUwOTY2NDMxMjIsLTczLjk4ODcxMzEzMjg1MjQ3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzdhYTgyOWU4YTE4ZTRhMGE4MzljMjU2Mzg0NDU4YjM0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2NkMTFmNTk0MTgxNDQ2MGM5ZGFmMDEwYTFlZmUxOTNhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzY1MjAyODFkYWNkZTQ5MGE4YTU3OGU5YTE4N2RiNDkyID0gJCgnPGRpdiBpZD0iaHRtbF82NTIwMjgxZGFjZGU0OTBhOGE1NzhlOWExODdkYjQ5MiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TWlkdG93biBTb3V0aCwgTWFuaGF0dGFuPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jZDExZjU5NDE4MTQ0NjBjOWRhZjAxMGExZWZlMTkzYS5zZXRDb250ZW50KGh0bWxfNjUyMDI4MWRhY2RlNDkwYThhNTc4ZTlhMTg3ZGI0OTIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMzk3YjZmYjVmM2UyNDNiM2FlYzFhMzAxZDQ5MDVhMWIuYmluZFBvcHVwKHBvcHVwX2NkMTFmNTk0MTgxNDQ2MGM5ZGFmMDEwYTFlZmUxOTNhKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2M3ZGI0NGYyN2YzZTQ4ZDViMWU4Y2M1MTA3OWYyMTU2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTY5NjA1OTQyNzU1MDUsLTc0LjEzNDA1NzI5ODYyNTddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfN2FhODI5ZThhMThlNGEwYTgzOWMyNTYzODQ0NThiMzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNWYyNmQzNGFhYmM1NGIxYzgzNmVjOGY0ZDE4NTVhMzQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYTFmZTRmZDU3MWRlNDZlMGI1ZTZlY2RiYmUyOTQzZjIgPSAkKCc8ZGl2IGlkPSJodG1sX2ExZmU0ZmQ1NzFkZTQ2ZTBiNWU2ZWNkYmJlMjk0M2YyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5SaWNobW9uZCBUb3duLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81ZjI2ZDM0YWFiYzU0YjFjODM2ZWM4ZjRkMTg1NWEzNC5zZXRDb250ZW50KGh0bWxfYTFmZTRmZDU3MWRlNDZlMGI1ZTZlY2RiYmUyOTQzZjIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYzdkYjQ0ZjI3ZjNlNDhkNWIxZThjYzUxMDc5ZjIxNTYuYmluZFBvcHVwKHBvcHVwXzVmMjZkMzRhYWJjNTRiMWM4MzZlYzhmNGQxODU1YTM0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzEyZmY5NDFlM2Y0NzRlZjZiMDY2ZWE4MWQ1NWYwNGU3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjA5NzE5MzQwNzkyODQsLTc0LjA2NjY3NzY2MDYxNzcxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzdhYTgyOWU4YTE4ZTRhMGE4MzljMjU2Mzg0NDU4YjM0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzQzMjEzZmE0YmY4ZTRlNTdhMzQ5YTM2Nzc3YzY1MDUwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2I2ZGM4Y2MzMzhjNDRlN2RiZWVmMTUyNGRiYzc0MWFjID0gJCgnPGRpdiBpZD0iaHRtbF9iNmRjOGNjMzM4YzQ0ZTdkYmVlZjE1MjRkYmM3NDFhYyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U2hvcmUgQWNyZXMsIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzQzMjEzZmE0YmY4ZTRlNTdhMzQ5YTM2Nzc3YzY1MDUwLnNldENvbnRlbnQoaHRtbF9iNmRjOGNjMzM4YzQ0ZTdkYmVlZjE1MjRkYmM3NDFhYyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8xMmZmOTQxZTNmNDc0ZWY2YjA2NmVhODFkNTVmMDRlNy5iaW5kUG9wdXAocG9wdXBfNDMyMTNmYTRiZjhlNGU1N2EzNDlhMzY3NzdjNjUwNTApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNWQ2MTcxZTM2MDAxNDcxYmFlNTJhZDU3NjE3NTI2OTMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42MTkxNzg0NTIwMjg0MywtNzQuMDcyNjQyNDQ1NDg0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzdhYTgyOWU4YTE4ZTRhMGE4MzljMjU2Mzg0NDU4YjM0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzc2ZjQ5M2EzN2QxZTRjZGRiNzIxZTZlODUzMjg4NmIyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2MwN2FhMmFlOWYyNTQ1OWY4ODBiZjU2MjUyYTg5ODUwID0gJCgnPGRpdiBpZD0iaHRtbF9jMDdhYTJhZTlmMjU0NTlmODgwYmY1NjI1MmE4OTg1MCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q2xpZnRvbiwgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNzZmNDkzYTM3ZDFlNGNkZGI3MjFlNmU4NTMyODg2YjIuc2V0Q29udGVudChodG1sX2MwN2FhMmFlOWYyNTQ1OWY4ODBiZjU2MjUyYTg5ODUwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzVkNjE3MWUzNjAwMTQ3MWJhZTUyYWQ1NzYxNzUyNjkzLmJpbmRQb3B1cChwb3B1cF83NmY0OTNhMzdkMWU0Y2RkYjcyMWU2ZTg1MzI4ODZiMik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl84ZWYzY2VmOTUyYjE0OTA4ODAxZTg5YjNmYmQ3YTYyNSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjYwNDQ3MzE4OTY4NzksLTc0LjA4NDAyMzY0NzQwMzU4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzdhYTgyOWU4YTE4ZTRhMGE4MzljMjU2Mzg0NDU4YjM0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2E3OTI0Njk4ZDhkMjRlZmM5Yzc0ODEyODQwMzFmMzY2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2E2OGIxZjhjMDYxOTQyMzFhNzU3YjViYTViMzkzZTI2ID0gJCgnPGRpdiBpZD0iaHRtbF9hNjhiMWY4YzA2MTk0MjMxYTc1N2I1YmE1YjM5M2UyNiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q29uY29yZCwgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYTc5MjQ2OThkOGQyNGVmYzljNzQ4MTI4NDAzMWYzNjYuc2V0Q29udGVudChodG1sX2E2OGIxZjhjMDYxOTQyMzFhNzU3YjViYTViMzkzZTI2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzhlZjNjZWY5NTJiMTQ5MDg4MDFlODliM2ZiZDdhNjI1LmJpbmRQb3B1cChwb3B1cF9hNzkyNDY5OGQ4ZDI0ZWZjOWM3NDgxMjg0MDMxZjM2Nik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81YTE0NDhiZmZlOTc0ZWI1OTAxMzFjOWQ2OTE1Mzk1NiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjYwNjc5NDM5NDgwMSwtNzQuMDk3NzYyMDY5NzI1MjJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfN2FhODI5ZThhMThlNGEwYTgzOWMyNTYzODQ0NThiMzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZjc5ZDJkOWU3YjcxNDA3MGJlZjdiNmQ1OGIzNjI0MWMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYzlkZWE3N2UxMmRhNGI0NThiNTU0MTI0NzJkMmVjZmQgPSAkKCc8ZGl2IGlkPSJodG1sX2M5ZGVhNzdlMTJkYTRiNDU4YjU1NDEyNDcyZDJlY2ZkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5FbWVyc29uIEhpbGwsIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2Y3OWQyZDllN2I3MTQwNzBiZWY3YjZkNThiMzYyNDFjLnNldENvbnRlbnQoaHRtbF9jOWRlYTc3ZTEyZGE0YjQ1OGI1NTQxMjQ3MmQyZWNmZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81YTE0NDhiZmZlOTc0ZWI1OTAxMzFjOWQ2OTE1Mzk1Ni5iaW5kUG9wdXAocG9wdXBfZjc5ZDJkOWU3YjcxNDA3MGJlZjdiNmQ1OGIzNjI0MWMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZmNjYTFjNzU2YzQyNGEwZDhkYWE0NWNmNDdjOWM5NTEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42MzU2MzAwMDY4MTE1MSwtNzQuMDk4MDUwNjIzNzM4ODddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfN2FhODI5ZThhMThlNGEwYTgzOWMyNTYzODQ0NThiMzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNjM4ZGI2MzM5Yjg1NDg1ZDg3Y2FkMjRmZjVmZjk0YjcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYTQ1MTE0NTFkZTRiNDk2MjgwNGViMjFjMDBlYTRmYTMgPSAkKCc8ZGl2IGlkPSJodG1sX2E0NTExNDUxZGU0YjQ5NjI4MDRlYjIxYzAwZWE0ZmEzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5SYW5kYWxsIE1hbm9yLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82MzhkYjYzMzliODU0ODVkODdjYWQyNGZmNWZmOTRiNy5zZXRDb250ZW50KGh0bWxfYTQ1MTE0NTFkZTRiNDk2MjgwNGViMjFjMDBlYTRmYTMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZmNjYTFjNzU2YzQyNGEwZDhkYWE0NWNmNDdjOWM5NTEuYmluZFBvcHVwKHBvcHVwXzYzOGRiNjMzOWI4NTQ4NWQ4N2NhZDI0ZmY1ZmY5NGI3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzg3NWI4YTM0NzAwYjQwMTBhMTNlMmYxODkwNWE0ZGQwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjM4NDMyODM3OTQ3OTUsLTc0LjE4NjIyMzMxNzQ5ODIzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzdhYTgyOWU4YTE4ZTRhMGE4MzljMjU2Mzg0NDU4YjM0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzVhOWY0MjBkNDNlNTRkOTJiMGYzYjE5YjdlMTA1ZDEwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzBmNzE3M2M3OGM1YjRhMDdhNWUyNDU4OTQxN2M0YTYwID0gJCgnPGRpdiBpZD0iaHRtbF8wZjcxNzNjNzhjNWI0YTA3YTVlMjQ1ODk0MTdjNGE2MCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+SG93bGFuZCBIb29rLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81YTlmNDIwZDQzZTU0ZDkyYjBmM2IxOWI3ZTEwNWQxMC5zZXRDb250ZW50KGh0bWxfMGY3MTczYzc4YzViNGEwN2E1ZTI0NTg5NDE3YzRhNjApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfODc1YjhhMzQ3MDBiNDAxMGExM2UyZjE4OTA1YTRkZDAuYmluZFBvcHVwKHBvcHVwXzVhOWY0MjBkNDNlNTRkOTJiMGYzYjE5YjdlMTA1ZDEwKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2M0MDhmN2M4MGJiNzQ1ZTM5ODdhZjZmNjEwMDljNjJlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjMwMTQ2NzQxMTkzODI2LC03NC4xNDE4MTY3ODk2ODg5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzdhYTgyOWU4YTE4ZTRhMGE4MzljMjU2Mzg0NDU4YjM0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2YyZmJkYWI2OTI1NzRjM2M5YzA1YTM0YjlkYjA2ZDNlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzY4Njg2Y2JhNTI1NDRiOTFiYzUxOTRjMzhhNzY2Mjg1ID0gJCgnPGRpdiBpZD0iaHRtbF82ODY4NmNiYTUyNTQ0YjkxYmM1MTk0YzM4YTc2NjI4NSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RWxtIFBhcmssIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2YyZmJkYWI2OTI1NzRjM2M5YzA1YTM0YjlkYjA2ZDNlLnNldENvbnRlbnQoaHRtbF82ODY4NmNiYTUyNTQ0YjkxYmM1MTk0YzM4YTc2NjI4NSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9jNDA4ZjdjODBiYjc0NWUzOTg3YWY2ZjYxMDA5YzYyZS5iaW5kUG9wdXAocG9wdXBfZjJmYmRhYjY5MjU3NGMzYzljMDVhMzRiOWRiMDZkM2UpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYjQyYjBhYjI0OTkyNDQ3Mjk0MDBiM2MxMzAzNmMzMzYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42NTIxMTc0NTE3OTM0OTQsLTczLjkxNjY1MzMxOTc4MDQ4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzdhYTgyOWU4YTE4ZTRhMGE4MzljMjU2Mzg0NDU4YjM0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2E2M2MzYzhkNzlhNzQ5MDhiYjVjNzlmZTcxZTRmZjFlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzAzZTU1MmJkYzAwZjRiNDQ5Y2ZiMzlhM2YwYjczNzcwID0gJCgnPGRpdiBpZD0iaHRtbF8wM2U1NTJiZGMwMGY0YjQ0OWNmYjM5YTNmMGI3Mzc3MCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UmVtc2VuIFZpbGxhZ2UsIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hNjNjM2M4ZDc5YTc0OTA4YmI1Yzc5ZmU3MWU0ZmYxZS5zZXRDb250ZW50KGh0bWxfMDNlNTUyYmRjMDBmNGI0NDljZmIzOWEzZjBiNzM3NzApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYjQyYjBhYjI0OTkyNDQ3Mjk0MDBiM2MxMzAzNmMzMzYuYmluZFBvcHVwKHBvcHVwX2E2M2MzYzhkNzlhNzQ5MDhiYjVjNzlmZTcxZTRmZjFlKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzljYTBhMTEzZDQwODQzZWZhMDUyMjNiMjkwMTRkYWQ3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjYyNzQ0Mjc5Njk2NiwtNzMuODg1MTE3NzYzNzkyOTJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfN2FhODI5ZThhMThlNGEwYTgzOWMyNTYzODQ0NThiMzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYzhlMzgyOGNmNDI2NGIwMWFkZDA2OTEzMzhmNTA2MDUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZTM0YzM5ZDg5MTM3NDJjYzlkY2RmZjI5MWMxNjY1YmYgPSAkKCc8ZGl2IGlkPSJodG1sX2UzNGMzOWQ4OTEzNzQyY2M5ZGNkZmYyOTFjMTY2NWJmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5OZXcgTG90cywgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2M4ZTM4MjhjZjQyNjRiMDFhZGQwNjkxMzM4ZjUwNjA1LnNldENvbnRlbnQoaHRtbF9lMzRjMzlkODkxMzc0MmNjOWRjZGZmMjkxYzE2NjViZik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl85Y2EwYTExM2Q0MDg0M2VmYTA1MjIzYjI5MDE0ZGFkNy5iaW5kUG9wdXAocG9wdXBfYzhlMzgyOGNmNDI2NGIwMWFkZDA2OTEzMzhmNTA2MDUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZGZhZTExZjA2M2NjNDFmMTljZjhhMDUyZGI2NGFkNTkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42MzEzMTc1NTAzOTY2NywtNzMuOTAyMzM0NzQyOTU4MzZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfN2FhODI5ZThhMThlNGEwYTgzOWMyNTYzODQ0NThiMzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZDhkYzAyOGI1ZjhlNDJkNDljOTI5ZmVmY2FjYzhkYzUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMzJlZmJiZTIzNzAyNDI0M2FjZGNhZjg4YTRjM2E1ZWYgPSAkKCc8ZGl2IGlkPSJodG1sXzMyZWZiYmUyMzcwMjQyNDNhY2RjYWY4OGE0YzNhNWVmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5QYWVyZGVnYXQgQmFzaW4sIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kOGRjMDI4YjVmOGU0MmQ0OWM5MjlmZWZjYWNjOGRjNS5zZXRDb250ZW50KGh0bWxfMzJlZmJiZTIzNzAyNDI0M2FjZGNhZjg4YTRjM2E1ZWYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZGZhZTExZjA2M2NjNDFmMTljZjhhMDUyZGI2NGFkNTkuYmluZFBvcHVwKHBvcHVwX2Q4ZGMwMjhiNWY4ZTQyZDQ5YzkyOWZlZmNhY2M4ZGM1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzRiMjFmMzc1ZDkwMDRhNDU4NTEyNjliZmYwNGYyZjY4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjE1OTc0MjM5NjIzMzYsLTczLjkxNTE1MzkxNTUwNDA0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzdhYTgyOWU4YTE4ZTRhMGE4MzljMjU2Mzg0NDU4YjM0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzZiMjE2NjY1YWNiMTRmNTM4OWZkMDNiOGFjZmQ4NWZhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzI5ZDk1MzljMjExYzQ3ZTI4NDc0NGU0YWIzNDdmMzk0ID0gJCgnPGRpdiBpZD0iaHRtbF8yOWQ5NTM5YzIxMWM0N2UyODQ3NDRlNGFiMzQ3ZjM5NCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TWlsbCBCYXNpbiwgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzZiMjE2NjY1YWNiMTRmNTM4OWZkMDNiOGFjZmQ4NWZhLnNldENvbnRlbnQoaHRtbF8yOWQ5NTM5YzIxMWM0N2UyODQ3NDRlNGFiMzQ3ZjM5NCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl80YjIxZjM3NWQ5MDA0YTQ1ODUxMjY5YmZmMDRmMmY2OC5iaW5kUG9wdXAocG9wdXBfNmIyMTY2NjVhY2IxNGY1Mzg5ZmQwM2I4YWNmZDg1ZmEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZTU5YWVjYjVjNjQwNDg0Mzg0NWM4ZjFmYjE4ZjYxZWMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MTE0NTk2NDM3MDQ4MiwtNzMuNzk2NDY0NjIwODE1OTNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfN2FhODI5ZThhMThlNGEwYTgzOWMyNTYzODQ0NThiMzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZGQxYzZlM2EzOGIxNDBiNjhiNzRiNTY1Y2Y0OTA0MjUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMDdlMjYwZWFiMTkxNDM2MGE0N2FmNzA0YzFhNjhkNzkgPSAkKCc8ZGl2IGlkPSJodG1sXzA3ZTI2MGVhYjE5MTQzNjBhNDdhZjcwNGMxYTY4ZDc5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5KYW1haWNhIEhpbGxzLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2RkMWM2ZTNhMzhiMTQwYjY4Yjc0YjU2NWNmNDkwNDI1LnNldENvbnRlbnQoaHRtbF8wN2UyNjBlYWIxOTE0MzYwYTQ3YWY3MDRjMWE2OGQ3OSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9lNTlhZWNiNWM2NDA0ODQzODQ1YzhmMWZiMThmNjFlYy5iaW5kUG9wdXAocG9wdXBfZGQxYzZlM2EzOGIxNDBiNjhiNzRiNTY1Y2Y0OTA0MjUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNmE4NzM4MzkxYjNmNDA0YjhkZDk5N2ZkNDc5ODg5YjUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MzM1MDAyNTQyOTc1NywtNzMuNzk2NzE2NzgwMjgzNDldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfN2FhODI5ZThhMThlNGEwYTgzOWMyNTYzODQ0NThiMzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMmIxODU2ZTUwMmIyNDc4YjgzMDdiMDYyYjgwZjYxNDYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZmIzYmE2MDNiOGJkNDgwMWI3MGVjYTJmZjU1YjQ5YTcgPSAkKCc8ZGl2IGlkPSJodG1sX2ZiM2JhNjAzYjhiZDQ4MDFiNzBlY2EyZmY1NWI0OWE3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5VdG9waWEsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMmIxODU2ZTUwMmIyNDc4YjgzMDdiMDYyYjgwZjYxNDYuc2V0Q29udGVudChodG1sX2ZiM2JhNjAzYjhiZDQ4MDFiNzBlY2EyZmY1NWI0OWE3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzZhODczODM5MWIzZjQwNGI4ZGQ5OTdmZDQ3OTg4OWI1LmJpbmRQb3B1cChwb3B1cF8yYjE4NTZlNTAyYjI0NzhiODMwN2IwNjJiODBmNjE0Nik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mMGRkYjg3YjkzMGY0NjY4OGQ2ZjhkN2M1MDc0MDgxNCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjczNDkzNjE4MDc1NDc4LC03My44MDQ4NjEyMDA0MDUzN10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83YWE4MjllOGExOGU0YTBhODM5YzI1NjM4NDQ1OGIzNCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zZDZhZTBjN2NlNGU0N2UxOGI4MWNlOThmYmJlNDY4NiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mNTZlZDBmOWExMzY0NTZlYmVmNGNlMzQwNzRiMTUxZCA9ICQoJzxkaXYgaWQ9Imh0bWxfZjU2ZWQwZjlhMTM2NDU2ZWJlZjRjZTM0MDc0YjE1MWQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlBvbW9ub2ssIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfM2Q2YWUwYzdjZTRlNDdlMThiODFjZTk4ZmJiZTQ2ODYuc2V0Q29udGVudChodG1sX2Y1NmVkMGY5YTEzNjQ1NmViZWY0Y2UzNDA3NGIxNTFkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2YwZGRiODdiOTMwZjQ2Njg4ZDZmOGQ3YzUwNzQwODE0LmJpbmRQb3B1cChwb3B1cF8zZDZhZTBjN2NlNGU0N2UxOGI4MWNlOThmYmJlNDY4Nik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl83MzNmYmVkODkzMGE0MTBmOWRkZjVlYThjZjdlNzE3OCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc3MDMxNzM5Mjk5ODIsLTczLjg5NDY3OTk2MjcwNTc0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzdhYTgyOWU4YTE4ZTRhMGE4MzljMjU2Mzg0NDU4YjM0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2E3MTMwYTBlNWIyZjQ3NzNhYmZlZjU4YTNhZmNjNmYxID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2Y2OWVkYTgwNmIwOTQ5MTRiMmQzNzQyNTg1NWFlYmFmID0gJCgnPGRpdiBpZD0iaHRtbF9mNjllZGE4MDZiMDk0OTE0YjJkMzc0MjU4NTVhZWJhZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QXN0b3JpYSBIZWlnaHRzLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2E3MTMwYTBlNWIyZjQ3NzNhYmZlZjU4YTNhZmNjNmYxLnNldENvbnRlbnQoaHRtbF9mNjllZGE4MDZiMDk0OTE0YjJkMzc0MjU4NTVhZWJhZik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl83MzNmYmVkODkzMGE0MTBmOWRkZjVlYThjZjdlNzE3OC5iaW5kUG9wdXAocG9wdXBfYTcxMzBhMGU1YjJmNDc3M2FiZmVmNThhM2FmY2M2ZjEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOTZjMGIwOTczYzA5NGJmNTkxMWIwYjVlNDk0YzMxMGMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44MzE0MjgzNDE2MTU0OCwtNzMuOTAxMTk5MDMzODc2NjddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfN2FhODI5ZThhMThlNGEwYTgzOWMyNTYzODQ0NThiMzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNTAwYWU5NjFmNTExNDBjNGJlMzIwMDhjOTVhZDQ5ZDUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNTIyZTUxMTI4OTY2NDE1NGFiNGM1MzJiMjI0ZWUxMmYgPSAkKCc8ZGl2IGlkPSJodG1sXzUyMmU1MTEyODk2NjQxNTRhYjRjNTMyYjIyNGVlMTJmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DbGFyZW1vbnQgVmlsbGFnZSwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzUwMGFlOTYxZjUxMTQwYzRiZTMyMDA4Yzk1YWQ0OWQ1LnNldENvbnRlbnQoaHRtbF81MjJlNTExMjg5NjY0MTU0YWI0YzUzMmIyMjRlZTEyZik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl85NmMwYjA5NzNjMDk0YmY1OTExYjBiNWU0OTRjMzEwYy5iaW5kUG9wdXAocG9wdXBfNTAwYWU5NjFmNTExNDBjNGJlMzIwMDhjOTVhZDQ5ZDUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfN2ZlMzcxNGIxYjY1NDc4Zjg1NGMyNjJmZWRiYzBjNTIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44MjQ3ODA0OTA4NDI5MDUsLTczLjkxNTg0NjUyNzU5MDA5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzdhYTgyOWU4YTE4ZTRhMGE4MzljMjU2Mzg0NDU4YjM0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2Q0ZTMyNjJjODQ1NDQyYWVhODczZDY4NDE3NzQ0MjQ4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2E0MDFmMjIwZDUzMTQzNGViYTcwOTFhYzM1NWZjMzUyID0gJCgnPGRpdiBpZD0iaHRtbF9hNDAxZjIyMGQ1MzE0MzRlYmE3MDkxYWMzNTVmYzM1MiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q29uY291cnNlIFZpbGxhZ2UsIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kNGUzMjYyYzg0NTQ0MmFlYTg3M2Q2ODQxNzc0NDI0OC5zZXRDb250ZW50KGh0bWxfYTQwMWYyMjBkNTMxNDM0ZWJhNzA5MWFjMzU1ZmMzNTIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfN2ZlMzcxNGIxYjY1NDc4Zjg1NGMyNjJmZWRiYzBjNTIuYmluZFBvcHVwKHBvcHVwX2Q0ZTMyNjJjODQ1NDQyYWVhODczZDY4NDE3NzQ0MjQ4KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2NmYmRlYjM4ZjU4NzQ1NGNhOTA1ZGNiY2VmZTVlM2VlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODQzODI2MTc2NzE2NTQsLTczLjkxNjU1NTUxOTY0NDE5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzdhYTgyOWU4YTE4ZTRhMGE4MzljMjU2Mzg0NDU4YjM0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzUyYWI5NDExZWRiNTQ3MTNhZWQ2ODM0YTMyODQxZGZjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzViZmMzZTBmOTM3MTRiYmE5YjZkZWNmMDc0MGUwZmRjID0gJCgnPGRpdiBpZD0iaHRtbF81YmZjM2UwZjkzNzE0YmJhOWI2ZGVjZjA3NDBlMGZkYyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TW91bnQgRWRlbiwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzUyYWI5NDExZWRiNTQ3MTNhZWQ2ODM0YTMyODQxZGZjLnNldENvbnRlbnQoaHRtbF81YmZjM2UwZjkzNzE0YmJhOWI2ZGVjZjA3NDBlMGZkYyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9jZmJkZWIzOGY1ODc0NTRjYTkwNWRjYmNlZmU1ZTNlZS5iaW5kUG9wdXAocG9wdXBfNTJhYjk0MTFlZGI1NDcxM2FlZDY4MzRhMzI4NDFkZmMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNGJiODhmODY4OTM2NDk1ZTk4MzAwYWU1MzU5OGNiZDMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44NDg4NDE2MDcyNDY2NSwtNzMuOTA4Mjk5MzA4ODE5ODhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfN2FhODI5ZThhMThlNGEwYTgzOWMyNTYzODQ0NThiMzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYjUxMzNkODEyNDMyNGUxYThjYjBlMGU5M2RkNGU4MjkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNmQwNDAzNjQ5ZWE5NDNkMGI0Y2EwZWM4MjI2YjQ5NWQgPSAkKCc8ZGl2IGlkPSJodG1sXzZkMDQwMzY0OWVhOTQzZDBiNGNhMGVjODIyNmI0OTVkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Nb3VudCBIb3BlLCBCcm9ueDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYjUxMzNkODEyNDMyNGUxYThjYjBlMGU5M2RkNGU4Mjkuc2V0Q29udGVudChodG1sXzZkMDQwMzY0OWVhOTQzZDBiNGNhMGVjODIyNmI0OTVkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzRiYjg4Zjg2ODkzNjQ5NWU5ODMwMGFlNTM1OThjYmQzLmJpbmRQb3B1cChwb3B1cF9iNTEzM2Q4MTI0MzI0ZTFhOGNiMGUwZTkzZGQ0ZTgyOSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8zMzU1NGJjOGVkMDQ0M2VlYTJlNGQyYzQ1MTFmYjM0NSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc2MDI4MDMzMTMxMzc0LC03My45NjM1NTYxNDA5NDMwM10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83YWE4MjllOGExOGU0YTBhODM5YzI1NjM4NDQ1OGIzNCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wYWMxNmUwMzAxZjM0Zjc3ODViOTllNmU1MzkyMjFmMSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wZmM4NDc2ZGJlZTA0ZmI3YmFmNDVkNDc3YjBhNWUxYSA9ICQoJzxkaXYgaWQ9Imh0bWxfMGZjODQ3NmRiZWUwNGZiN2JhZjQ1ZDQ3N2IwYTVlMWEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlN1dHRvbiBQbGFjZSwgTWFuaGF0dGFuPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wYWMxNmUwMzAxZjM0Zjc3ODViOTllNmU1MzkyMjFmMS5zZXRDb250ZW50KGh0bWxfMGZjODQ3NmRiZWUwNGZiN2JhZjQ1ZDQ3N2IwYTVlMWEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMzM1NTRiYzhlZDA0NDNlZWEyZTRkMmM0NTExZmIzNDUuYmluZFBvcHVwKHBvcHVwXzBhYzE2ZTAzMDFmMzRmNzc4NWI5OWU2ZTUzOTIyMWYxKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzJiODNlMzUyZjQ3ZjQyMmQ5YjA2ZmRhNTgwNTcxMGVhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzQzNDE0MDkwMDczNTM2LC03My45NTM4Njc4MjEzMDc0NV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83YWE4MjllOGExOGU0YTBhODM5YzI1NjM4NDQ1OGIzNCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lYTdmYTNhZDMyNWQ0MzlmOTNhZjI4ODg3MGUzNGFjYyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82MjJkZGE2MjVmOGU0NjI0YmJmMjZiOGEwMjA1M2QxOCA9ICQoJzxkaXYgaWQ9Imh0bWxfNjIyZGRhNjI1ZjhlNDYyNGJiZjI2YjhhMDIwNTNkMTgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkh1bnRlcnMgUG9pbnQsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZWE3ZmEzYWQzMjVkNDM5ZjkzYWYyODg4NzBlMzRhY2Muc2V0Q29udGVudChodG1sXzYyMmRkYTYyNWY4ZTQ2MjRiYmYyNmI4YTAyMDUzZDE4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzJiODNlMzUyZjQ3ZjQyMmQ5YjA2ZmRhNTgwNTcxMGVhLmJpbmRQb3B1cChwb3B1cF9lYTdmYTNhZDMyNWQ0MzlmOTNhZjI4ODg3MGUzNGFjYyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8zMGE1ZmNkMDQ4MWY0OWJlODU3MGY3NWYwYzNkNmFlYiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc1MjA0MjM2OTUwNzIyLC03My45Njc3MDgyNDU4MTgzNF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83YWE4MjllOGExOGU0YTBhODM5YzI1NjM4NDQ1OGIzNCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lMzM4YWJhYTFkYjE0M2FmYWM1NTIzZWM5NDAxOTE1OSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8yOGNmN2E1YmVlODI0MTZiOTMyMjBiZDkwMDY5NGIwNSA9ICQoJzxkaXYgaWQ9Imh0bWxfMjhjZjdhNWJlZTgyNDE2YjkzMjIwYmQ5MDA2OTRiMDUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlR1cnRsZSBCYXksIE1hbmhhdHRhbjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZTMzOGFiYWExZGIxNDNhZmFjNTUyM2VjOTQwMTkxNTkuc2V0Q29udGVudChodG1sXzI4Y2Y3YTViZWU4MjQxNmI5MzIyMGJkOTAwNjk0YjA1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzMwYTVmY2QwNDgxZjQ5YmU4NTcwZjc1ZjBjM2Q2YWViLmJpbmRQb3B1cChwb3B1cF9lMzM4YWJhYTFkYjE0M2FmYWM1NTIzZWM5NDAxOTE1OSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81OTk0YzljOGYzYWM0YzZjYTMwMTk3ODdhMzc5NmYxMiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc0NjkxNzQxMDc0MDE5NSwtNzMuOTcxMjE5Mjg3MjIyNjVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfN2FhODI5ZThhMThlNGEwYTgzOWMyNTYzODQ0NThiMzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMmRhMDZjOGE4NmMxNDY0NmJhYjI1ZDE4N2I1ZWE0ZDYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYjVhMGE0ZTYyMDY5NDhlZTg3NDdiYWU3ZjM5MmUyNzMgPSAkKCc8ZGl2IGlkPSJodG1sX2I1YTBhNGU2MjA2OTQ4ZWU4NzQ3YmFlN2YzOTJlMjczIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5UdWRvciBDaXR5LCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzJkYTA2YzhhODZjMTQ2NDZiYWIyNWQxODdiNWVhNGQ2LnNldENvbnRlbnQoaHRtbF9iNWEwYTRlNjIwNjk0OGVlODc0N2JhZTdmMzkyZTI3Myk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81OTk0YzljOGYzYWM0YzZjYTMwMTk3ODdhMzc5NmYxMi5iaW5kUG9wdXAocG9wdXBfMmRhMDZjOGE4NmMxNDY0NmJhYjI1ZDE4N2I1ZWE0ZDYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNmE4ZTYyMGQ2NWIyNGIwN2IzODZkNWQ0ZTI5ZDc1YzcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MzA5OTk1NTQ3NzA2MSwtNzMuOTc0MDUxNzA0NjkyMDNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfN2FhODI5ZThhMThlNGEwYTgzOWMyNTYzODQ0NThiMzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMTJjYmYxNGY3ODgyNDAwNzliN2JlZjIyMTNlNjQzNDcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNTQyZWVjN2JkOWZjNDRlNzhkNzZhMjRiMzMwNDEyZGQgPSAkKCc8ZGl2IGlkPSJodG1sXzU0MmVlYzdiZDlmYzQ0ZTc4ZDc2YTI0YjMzMDQxMmRkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5TdHV5dmVzYW50IFRvd24sIE1hbmhhdHRhbjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMTJjYmYxNGY3ODgyNDAwNzliN2JlZjIyMTNlNjQzNDcuc2V0Q29udGVudChodG1sXzU0MmVlYzdiZDlmYzQ0ZTc4ZDc2YTI0YjMzMDQxMmRkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzZhOGU2MjBkNjViMjRiMDdiMzg2ZDVkNGUyOWQ3NWM3LmJpbmRQb3B1cChwb3B1cF8xMmNiZjE0Zjc4ODI0MDA3OWI3YmVmMjIxM2U2NDM0Nyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9iNGYwYjNkZjgxYTk0ZGM3ODgwYzdkYzMyOWQ4YjRhOCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjczOTY3MzA0NzYzODQyNiwtNzMuOTkwOTQ3MTA1MjgyNl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83YWE4MjllOGExOGU0YTBhODM5YzI1NjM4NDQ1OGIzNCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82OWMyZmJjZDIzYjY0NjZhOTQ2NTg0OGI1YzlhMDkwNiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83YjkxYmQ5YjU5Zjc0N2FiOGE2ZDRjMDBjMGYzYjhjOSA9ICQoJzxkaXYgaWQ9Imh0bWxfN2I5MWJkOWI1OWY3NDdhYjhhNmQ0YzAwYzBmM2I4YzkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkZsYXRpcm9uLCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzY5YzJmYmNkMjNiNjQ2NmE5NDY1ODQ4YjVjOWEwOTA2LnNldENvbnRlbnQoaHRtbF83YjkxYmQ5YjU5Zjc0N2FiOGE2ZDRjMDBjMGYzYjhjOSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9iNGYwYjNkZjgxYTk0ZGM3ODgwYzdkYzMyOWQ4YjRhOC5iaW5kUG9wdXAocG9wdXBfNjljMmZiY2QyM2I2NDY2YTk0NjU4NDhiNWM5YTA5MDYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMTc4NGYxNjI4N2E0NGQ3YTk0MThmMDI3NTE3YjZkMWIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NDU2NTE4MDYwODA3NiwtNzMuOTE4MTkyODY0MzE2ODJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfN2FhODI5ZThhMThlNGEwYTgzOWMyNTYzODQ0NThiMzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNDRiM2FlOWJjNTljNGU5NmIyYjAxNmEwOTlmNjQxN2YgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZDdhNTE1YjlmNjg4NDc3YjllNGM1NmVlNTJmOTliZTcgPSAkKCc8ZGl2IGlkPSJodG1sX2Q3YTUxNWI5ZjY4ODQ3N2I5ZTRjNTZlZTUyZjk5YmU3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5TdW5ueXNpZGUgR2FyZGVucywgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80NGIzYWU5YmM1OWM0ZTk2YjJiMDE2YTA5OWY2NDE3Zi5zZXRDb250ZW50KGh0bWxfZDdhNTE1YjlmNjg4NDc3YjllNGM1NmVlNTJmOTliZTcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMTc4NGYxNjI4N2E0NGQ3YTk0MThmMDI3NTE3YjZkMWIuYmluZFBvcHVwKHBvcHVwXzQ0YjNhZTliYzU5YzRlOTZiMmIwMTZhMDk5ZjY0MTdmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzIzNTVhZjQyYjQ3ZjQwMDFhZWJjNmNmMTVjNzhhMDZhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzM3MjUwNzE2OTQ0OTcsLTczLjkzMjQ0MjM1MjYwMTc4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzdhYTgyOWU4YTE4ZTRhMGE4MzljMjU2Mzg0NDU4YjM0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzgyZjcxMzg4YjFjYzQwZjk4MGQ5NTIyM2UzZTdlYjJkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzZlMzE3M2ZmYTAwNTRhYjU4MGQxOTYyZDZlOWE4M2MyID0gJCgnPGRpdiBpZD0iaHRtbF82ZTMxNzNmZmEwMDU0YWI1ODBkMTk2MmQ2ZTlhODNjMiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Qmxpc3N2aWxsZSwgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84MmY3MTM4OGIxY2M0MGY5ODBkOTUyMjNlM2U3ZWIyZC5zZXRDb250ZW50KGh0bWxfNmUzMTczZmZhMDA1NGFiNTgwZDE5NjJkNmU5YTgzYzIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMjM1NWFmNDJiNDdmNDAwMWFlYmM2Y2YxNWM3OGEwNmEuYmluZFBvcHVwKHBvcHVwXzgyZjcxMzg4YjFjYzQwZjk4MGQ5NTIyM2UzZTdlYjJkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzJkNmMzYTlmYzg4OTRiNGFiYTFjM2MwYzYxNWE3MzRmID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzAzMjgxMDkwOTMwMTQsLTczLjk5NTUwNzUxODg4NDE1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzdhYTgyOWU4YTE4ZTRhMGE4MzljMjU2Mzg0NDU4YjM0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2Q0OTY3ZGQzNjhiNDQ2MTg4YTQ5ZDUyM2YyMTBiM2U1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzJjM2Y5NGRhN2Y2MjRjOGVhMzZlZGYyN2Y5OTJmYjM1ID0gJCgnPGRpdiBpZD0iaHRtbF8yYzNmOTRkYTdmNjI0YzhlYTM2ZWRmMjdmOTkyZmIzNSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RnVsdG9uIEZlcnJ5LCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZDQ5NjdkZDM2OGI0NDYxODhhNDlkNTIzZjIxMGIzZTUuc2V0Q29udGVudChodG1sXzJjM2Y5NGRhN2Y2MjRjOGVhMzZlZGYyN2Y5OTJmYjM1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzJkNmMzYTlmYzg4OTRiNGFiYTFjM2MwYzYxNWE3MzRmLmJpbmRQb3B1cChwb3B1cF9kNDk2N2RkMzY4YjQ0NjE4OGE0OWQ1MjNmMjEwYjNlNSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85NmUxZmZmMmYwZjQ0ZWFmYjhhYWM3ZjY3YTM4OGExYSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjcwMzMyMTQ5ODgyODc0LC03My45ODExMTYwMzU5MjM5M10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83YWE4MjllOGExOGU0YTBhODM5YzI1NjM4NDQ1OGIzNCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8yNzhhN2JmODg4OTk0ODI1OGM1Y2YxMzQzM2M5MGE4MSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xYmM1Yzg4ZjQ5NDg0NzM3Yjc1NTY0NzVjNjJjZjM3MSA9ICQoJzxkaXYgaWQ9Imh0bWxfMWJjNWM4OGY0OTQ4NDczN2I3NTU2NDc1YzYyY2YzNzEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlZpbmVnYXIgSGlsbCwgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzI3OGE3YmY4ODg5OTQ4MjU4YzVjZjEzNDMzYzkwYTgxLnNldENvbnRlbnQoaHRtbF8xYmM1Yzg4ZjQ5NDg0NzM3Yjc1NTY0NzVjNjJjZjM3MSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl85NmUxZmZmMmYwZjQ0ZWFmYjhhYWM3ZjY3YTM4OGExYS5iaW5kUG9wdXAocG9wdXBfMjc4YTdiZjg4ODk5NDgyNThjNWNmMTM0MzNjOTBhODEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMDEzOWFmMzc2MTdmNGE5YjllZTdhMjlhM2ZhNWE0YTkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42NzUwMzk4NjUwMzIzNywtNzMuOTMwNTMxMDg4MTczMzhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfN2FhODI5ZThhMThlNGEwYTgzOWMyNTYzODQ0NThiMzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYTgzNmMyMDU3NjQ2NDBhODlmNzllYTY4Nzc1ODA3YWQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZDQxYmVlN2Y2NWQ1NDI1YmFmODEwMWU0ODUzMTQ0NDQgPSAkKCc8ZGl2IGlkPSJodG1sX2Q0MWJlZTdmNjVkNTQyNWJhZjgxMDFlNDg1MzE0NDQ0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5XZWVrc3ZpbGxlLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYTgzNmMyMDU3NjQ2NDBhODlmNzllYTY4Nzc1ODA3YWQuc2V0Q29udGVudChodG1sX2Q0MWJlZTdmNjVkNTQyNWJhZjgxMDFlNDg1MzE0NDQ0KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzAxMzlhZjM3NjE3ZjRhOWI5ZWU3YTI5YTNmYTVhNGE5LmJpbmRQb3B1cChwb3B1cF9hODM2YzIwNTc2NDY0MGE4OWY3OWVhNjg3NzU4MDdhZCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl82NDE5MDBmNTgwODQ0MzQzOTc2MTUzOTBmOGU1YmNkYiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY3Nzg2MTA0NzY5NTMxLC03My45MDMzMTY4NDg1MjU5OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83YWE4MjllOGExOGU0YTBhODM5YzI1NjM4NDQ1OGIzNCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hYjc1NmFkYjQ0ODc0YjYzYWJiYmZjYTRhY2YxZDMxMCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jODljMmJkMWViYzk0ZmU1ODE2ZWQ2YjNlYmY1OWY3NyA9ICQoJzxkaXYgaWQ9Imh0bWxfYzg5YzJiZDFlYmM5NGZlNTgxNmVkNmIzZWJmNTlmNzciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkJyb2Fkd2F5IEp1bmN0aW9uLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYWI3NTZhZGI0NDg3NGI2M2FiYmJmY2E0YWNmMWQzMTAuc2V0Q29udGVudChodG1sX2M4OWMyYmQxZWJjOTRmZTU4MTZlZDZiM2ViZjU5Zjc3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzY0MTkwMGY1ODA4NDQzNDM5NzYxNTM5MGY4ZTViY2RiLmJpbmRQb3B1cChwb3B1cF9hYjc1NmFkYjQ0ODc0YjYzYWJiYmZjYTRhY2YxZDMxMCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8yOWJmNjE3ODYxZGU0ZWQzOGRiNTc5M2QyM2IzMjY2NiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjcwMzE3NjMyODIyNjkyLC03My45ODg3NTI4MDc0NTA0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzdhYTgyOWU4YTE4ZTRhMGE4MzljMjU2Mzg0NDU4YjM0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzIzMDUxMDA5OGNkYjRmODdhMDY2N2I5YmQyMTE4NDRlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2JmNDE0NmVkYzVlMzRkZWFhNTA3ODFkYmVjODg2MGNkID0gJCgnPGRpdiBpZD0iaHRtbF9iZjQxNDZlZGM1ZTM0ZGVhYTUwNzgxZGJlYzg4NjBjZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RHVtYm8sIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yMzA1MTAwOThjZGI0Zjg3YTA2NjdiOWJkMjExODQ0ZS5zZXRDb250ZW50KGh0bWxfYmY0MTQ2ZWRjNWUzNGRlYWE1MDc4MWRiZWM4ODYwY2QpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMjliZjYxNzg2MWRlNGVkMzhkYjU3OTNkMjNiMzI2NjYuYmluZFBvcHVwKHBvcHVwXzIzMDUxMDA5OGNkYjRmODdhMDY2N2I5YmQyMTE4NDRlKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzE3YmI1Yzc2ZTgzNDQ5NTU5YWJhNWE4NDczMTQxZGY4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjAxODA5NTc2MzE0NDQsLTc0LjEyMDU5Mzk5NzE4MDAxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzdhYTgyOWU4YTE4ZTRhMGE4MzljMjU2Mzg0NDU4YjM0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzMzYmY0ZTEyN2E5ZjRhNTBhNTkxZDc4MTFlZGE2YzQ1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzRkNjMwNjVkYjBmMTQ3ZDhiZDdlNjE2NTI0Mzg5NjU5ID0gJCgnPGRpdiBpZD0iaHRtbF80ZDYzMDY1ZGIwZjE0N2Q4YmQ3ZTYxNjUyNDM4OTY1OSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TWFub3IgSGVpZ2h0cywgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMzNiZjRlMTI3YTlmNGE1MGE1OTFkNzgxMWVkYTZjNDUuc2V0Q29udGVudChodG1sXzRkNjMwNjVkYjBmMTQ3ZDhiZDdlNjE2NTI0Mzg5NjU5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzE3YmI1Yzc2ZTgzNDQ5NTU5YWJhNWE4NDczMTQxZGY4LmJpbmRQb3B1cChwb3B1cF8zM2JmNGUxMjdhOWY0YTUwYTU5MWQ3ODExZWRhNmM0NSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8wM2ZhYmY1ODU3ZjE0M2E3OTQ4ODEyMGViM2Q5MjBiZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjYwMzcwNjkyNjI3MzcxLC03NC4xMzIwODQ0NzQ4NDI5OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83YWE4MjllOGExOGU0YTBhODM5YzI1NjM4NDQ1OGIzNCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iNmEyOTA3YjY0ZjY0MjIxOTY5MTNlMWVjNTQ0ODdlYiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wNDA1ZjIzNjdjOTI0YTUzOGJlZTAzZTRiZGU2NjE4MSA9ICQoJzxkaXYgaWQ9Imh0bWxfMDQwNWYyMzY3YzkyNGE1MzhiZWUwM2U0YmRlNjYxODEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPldpbGxvd2Jyb29rLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iNmEyOTA3YjY0ZjY0MjIxOTY5MTNlMWVjNTQ0ODdlYi5zZXRDb250ZW50KGh0bWxfMDQwNWYyMzY3YzkyNGE1MzhiZWUwM2U0YmRlNjYxODEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMDNmYWJmNTg1N2YxNDNhNzk0ODgxMjBlYjNkOTIwYmUuYmluZFBvcHVwKHBvcHVwX2I2YTI5MDdiNjRmNjQyMjE5NjkxM2UxZWM1NDQ4N2ViKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzliZGJiMDgxZGZlMzRhOTg5ODZkYjZjNTUyYjI3YWE2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTQxMTM5OTIyMDkxNzY2LC03NC4yMTc3NjYzNjA2ODU2N10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83YWE4MjllOGExOGU0YTBhODM5YzI1NjM4NDQ1OGIzNCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hMTc2OGQ4ZjlmYzc0NDk2YTMwYjBmZWUyNzE0YTZhMCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8yZjRjYzI2OTliNTQ0OWI3YjU5NzljOWZkZjdjMzMyOCA9ICQoJzxkaXYgaWQ9Imh0bWxfMmY0Y2MyNjk5YjU0NDliN2I1OTc5YzlmZGY3YzMzMjgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlNhbmR5IEdyb3VuZCwgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYTE3NjhkOGY5ZmM3NDQ5NmEzMGIwZmVlMjcxNGE2YTAuc2V0Q29udGVudChodG1sXzJmNGNjMjY5OWI1NDQ5YjdiNTk3OWM5ZmRmN2MzMzI4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzliZGJiMDgxZGZlMzRhOTg5ODZkYjZjNTUyYjI3YWE2LmJpbmRQb3B1cChwb3B1cF9hMTc2OGQ4ZjlmYzc0NDk2YTMwYjBmZWUyNzE0YTZhMCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81NzkxNWE5NjQ2ZTU0NWE0OGMxNDg5ZmI4ZTExYWQ4YyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjU3OTExODc0Mjk2MTIxNCwtNzQuMTI3MjcyNDA2MDQ5NDZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfN2FhODI5ZThhMThlNGEwYTgzOWMyNTYzODQ0NThiMzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZjgzY2FkMDk1ZGNiNGU3M2IwNTMxMWUxYWJlODU5ODQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYTczY2Q2NzVjMmRiNGZiZTk4NWJhMDdiNmNjMWY1NGMgPSAkKCc8ZGl2IGlkPSJodG1sX2E3M2NkNjc1YzJkYjRmYmU5ODViYTA3YjZjYzFmNTRjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5FZ2JlcnR2aWxsZSwgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZjgzY2FkMDk1ZGNiNGU3M2IwNTMxMWUxYWJlODU5ODQuc2V0Q29udGVudChodG1sX2E3M2NkNjc1YzJkYjRmYmU5ODViYTA3YjZjYzFmNTRjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzU3OTE1YTk2NDZlNTQ1YTQ4YzE0ODlmYjhlMTFhZDhjLmJpbmRQb3B1cChwb3B1cF9mODNjYWQwOTVkY2I0ZTczYjA1MzExZTFhYmU4NTk4NCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl83NWJkOGE3ZWRlMDk0ZmIzOTU4MDEyNDllMjMxNmI4NiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjU2NzM3NTg4OTU3MDMyLC03My44OTIxMzc2MDIzMjgyMl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83YWE4MjllOGExOGU0YTBhODM5YzI1NjM4NDQ1OGIzNCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF84ZjEzZjFhY2IyNmI0MWIwYTdkZjgyNWY4NzRiMTEyMyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF80OTQzYjgyMjI4OGM0ZDBhOTVkOTk0NWVmOGRjODNjYiA9ICQoJzxkaXYgaWQ9Imh0bWxfNDk0M2I4MjIyODhjNGQwYTk1ZDk5NDVlZjhkYzgzY2IiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlJveGJ1cnksIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOGYxM2YxYWNiMjZiNDFiMGE3ZGY4MjVmODc0YjExMjMuc2V0Q29udGVudChodG1sXzQ5NDNiODIyMjg4YzRkMGE5NWQ5OTQ1ZWY4ZGM4M2NiKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzc1YmQ4YTdlZGUwOTRmYjM5NTgwMTI0OWUyMzE2Yjg2LmJpbmRQb3B1cChwb3B1cF84ZjEzZjFhY2IyNmI0MWIwYTdkZjgyNWY4NzRiMTEyMyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jMjNlZDNhYmMzMTI0YjE0OWQ2YWQzM2NkNTM3YmFiOSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjU5ODUyNTA5NTEzNzI1NSwtNzMuOTU5MTg0NTk0Mjg3MDJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfN2FhODI5ZThhMThlNGEwYTgzOWMyNTYzODQ0NThiMzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMmY4MTc2NmQ1YzliNDRlNGEzOTBlYjk1N2ExNDVhMTUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZGIwNDEzNjg1NTY4NGEyNzkxOTNiYzI5ZTE0YzRlNzYgPSAkKCc8ZGl2IGlkPSJodG1sX2RiMDQxMzY4NTU2ODRhMjc5MTkzYmMyOWUxNGM0ZTc2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Ib21lY3Jlc3QsIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yZjgxNzY2ZDVjOWI0NGU0YTM5MGViOTU3YTE0NWExNS5zZXRDb250ZW50KGh0bWxfZGIwNDEzNjg1NTY4NGEyNzkxOTNiYzI5ZTE0YzRlNzYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYzIzZWQzYWJjMzEyNGIxNDlkNmFkMzNjZDUzN2JhYjkuYmluZFBvcHVwKHBvcHVwXzJmODE3NjZkNWM5YjQ0ZTRhMzkwZWI5NTdhMTQ1YTE1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2YxM2Y3OWI3MjQ1NDRhYTM5ZmVlNDMzZWJjZWU4NzBkID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzE2NDE0NTExMTU4MTg1LC03My44ODExNDMxOTIwMDYwNF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83YWE4MjllOGExOGU0YTBhODM5YzI1NjM4NDQ1OGIzNCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82YjhiYmNiM2Y0Njk0NGViOTQwYmJkMGZjNTZlNzVkOCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF81ZmIzNTUxYWQ4ZTQ0YWU0OTQ3ZGEyOGZhMGUyNjdhZSA9ICQoJzxkaXYgaWQ9Imh0bWxfNWZiMzU1MWFkOGU0NGFlNDk0N2RhMjhmYTBlMjY3YWUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk1pZGRsZSBWaWxsYWdlLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzZiOGJiY2IzZjQ2OTQ0ZWI5NDBiYmQwZmM1NmU3NWQ4LnNldENvbnRlbnQoaHRtbF81ZmIzNTUxYWQ4ZTQ0YWU0OTQ3ZGEyOGZhMGUyNjdhZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9mMTNmNzliNzI0NTQ0YWEzOWZlZTQzM2ViY2VlODcwZC5iaW5kUG9wdXAocG9wdXBfNmI4YmJjYjNmNDY5NDRlYjk0MGJiZDBmYzU2ZTc1ZDgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMTQ4YjQwYWYyODg0NGY5ZTgyOGEyN2FjNDliYjRhNWYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC41MjYyNjQwNjczNDgxMiwtNzQuMjAxNTI1NTY0NTc2NThdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfN2FhODI5ZThhMThlNGEwYTgzOWMyNTYzODQ0NThiMzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfN2RmMWY3MzNjNDhjNGFmY2FkMWE3ODE4ZjczNjUwMzcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMTU4Y2Q5NTEwYzBiNDI2ZGFjYTgwNmI2MGExMmU1NDYgPSAkKCc8ZGl2IGlkPSJodG1sXzE1OGNkOTUxMGMwYjQyNmRhY2E4MDZiNjBhMTJlNTQ2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5QcmluY2UmIzM5O3MgQmF5LCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83ZGYxZjczM2M0OGM0YWZjYWQxYTc4MThmNzM2NTAzNy5zZXRDb250ZW50KGh0bWxfMTU4Y2Q5NTEwYzBiNDI2ZGFjYTgwNmI2MGExMmU1NDYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMTQ4YjQwYWYyODg0NGY5ZTgyOGEyN2FjNDliYjRhNWYuYmluZFBvcHVwKHBvcHVwXzdkZjFmNzMzYzQ4YzRhZmNhZDFhNzgxOGY3MzY1MDM3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzAwZGNkMjViYjU4ZDRmNmU5OWFlNjM2MzEwNGQwYWY3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTc2NTA2MjkzNzk0ODksLTc0LjEzNzkyNjYzNzcxNTY4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzdhYTgyOWU4YTE4ZTRhMGE4MzljMjU2Mzg0NDU4YjM0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzY3ODhjMDE2ZDU5NDRjNzQ5NDdjODRkODdjNGYzN2YxID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzI2NzIwM2YxNWFhYjQwYzE4YjJkMGI3MzhiODNkMGE2ID0gJCgnPGRpdiBpZD0iaHRtbF8yNjcyMDNmMTVhYWI0MGMxOGIyZDBiNzM4YjgzZDBhNiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TGlnaHRob3VzZSBIaWxsLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82Nzg4YzAxNmQ1OTQ0Yzc0OTQ3Yzg0ZDg3YzRmMzdmMS5zZXRDb250ZW50KGh0bWxfMjY3MjAzZjE1YWFiNDBjMThiMmQwYjczOGI4M2QwYTYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMDBkY2QyNWJiNThkNGY2ZTk5YWU2MzYzMTA0ZDBhZjcuYmluZFBvcHVwKHBvcHVwXzY3ODhjMDE2ZDU5NDRjNzQ5NDdjODRkODdjNGYzN2YxKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzY5MzE1ZjdiNTBjMTRlN2Y5NTc5NDQ0MjA3YTY3Mzg3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTE5NTQxNDU3NDg5MDksLTc0LjIyOTU3MDgwNjI2OTQxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzdhYTgyOWU4YTE4ZTRhMGE4MzljMjU2Mzg0NDU4YjM0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzhkZWEwYWYxN2U2NDQ2OWY5MzczOGFjMTBjZDRkM2VjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzhkOTFjNDY4N2NiNDQwYTY5YmZkNGE1ZTYwOGY5YmM0ID0gJCgnPGRpdiBpZD0iaHRtbF84ZDkxYzQ2ODdjYjQ0MGE2OWJmZDRhNWU2MDhmOWJjNCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UmljaG1vbmQgVmFsbGV5LCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84ZGVhMGFmMTdlNjQ0NjlmOTM3MzhhYzEwY2Q0ZDNlYy5zZXRDb250ZW50KGh0bWxfOGQ5MWM0Njg3Y2I0NDBhNjliZmQ0YTVlNjA4ZjliYzQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNjkzMTVmN2I1MGMxNGU3Zjk1Nzk0NDQyMDdhNjczODcuYmluZFBvcHVwKHBvcHVwXzhkZWEwYWYxN2U2NDQ2OWY5MzczOGFjMTBjZDRkM2VjKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2NjNzQwMGFmOWY5NDQyMTE4ZDExYTIxZjc4MjJkZDE3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzkwNjAxNTU2NzAxNDgsLTczLjgyNjY3NzU3MTM4NjQxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzdhYTgyOWU4YTE4ZTRhMGE4MzljMjU2Mzg0NDU4YjM0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2JhN2EzMDRmZDA1ODQ3OTE4ODc2MjRkMWQ2ZjM0ODYzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzUyNzVlYzYzMjNiNjQ0NzZiN2UzNWIyNGQ4ZjE0MDdiID0gJCgnPGRpdiBpZD0iaHRtbF81Mjc1ZWM2MzIzYjY0NDc2YjdlMzViMjRkOGYxNDA3YiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TWFsYmEsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYmE3YTMwNGZkMDU4NDc5MTg4NzYyNGQxZDZmMzQ4NjMuc2V0Q29udGVudChodG1sXzUyNzVlYzYzMjNiNjQ0NzZiN2UzNWIyNGQ4ZjE0MDdiKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2NjNzQwMGFmOWY5NDQyMTE4ZDExYTIxZjc4MjJkZDE3LmJpbmRQb3B1cChwb3B1cF9iYTdhMzA0ZmQwNTg0NzkxODg3NjI0ZDFkNmYzNDg2Myk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mYzhmNjYyZTY4Y2M0NDU2ODQ5ZWVhZGYwMDhlMWM5MiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY4MTk5ODkzNDUxNzMsLTczLjg5MDM0NTcwOTg3Ml0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83YWE4MjllOGExOGU0YTBhODM5YzI1NjM4NDQ1OGIzNCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF84MzhmY2E1MThjMjM0NGJlYjQ0NGU1OTA3Y2YyYmFjZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF85MTcyZDEyZjIyNGM0MWI4YTYyN2Y2NWVkNTVlOTExYSA9ICQoJzxkaXYgaWQ9Imh0bWxfOTE3MmQxMmYyMjRjNDFiOGE2MjdmNjVlZDU1ZTkxMWEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkhpZ2hsYW5kIFBhcmssIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84MzhmY2E1MThjMjM0NGJlYjQ0NGU1OTA3Y2YyYmFjZC5zZXRDb250ZW50KGh0bWxfOTE3MmQxMmYyMjRjNDFiOGE2MjdmNjVlZDU1ZTkxMWEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZmM4ZjY2MmU2OGNjNDQ1Njg0OWVlYWRmMDA4ZTFjOTIuYmluZFBvcHVwKHBvcHVwXzgzOGZjYTUxOGMyMzQ0YmViNDQ0ZTU5MDdjZjJiYWNkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2JkOWY0MWIwMWEwYjRjNGViNjA1NjQzNmEzZGU0OTZlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjA5Mzc3NzAxMTM3NjYsLTczLjk0ODQxNTE1MzI4ODkzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzdhYTgyOWU4YTE4ZTRhMGE4MzljMjU2Mzg0NDU4YjM0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzkwZTE2YTc0MjZmODRhZGViNWFmMDBlN2U5YWUxYjM3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2M0NWQ2NzA0OGZlNzRmYTViMmU3ZDBjMmI0NjUxZDRiID0gJCgnPGRpdiBpZD0iaHRtbF9jNDVkNjcwNDhmZTc0ZmE1YjJlN2QwYzJiNDY1MWQ0YiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TWFkaXNvbiwgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzkwZTE2YTc0MjZmODRhZGViNWFmMDBlN2U5YWUxYjM3LnNldENvbnRlbnQoaHRtbF9jNDVkNjcwNDhmZTc0ZmE1YjJlN2QwYzJiNDY1MWQ0Yik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9iZDlmNDFiMDFhMGI0YzRlYjYwNTY0MzZhM2RlNDk2ZS5iaW5kUG9wdXAocG9wdXBfOTBlMTZhNzQyNmY4NGFkZWI1YWYwMGU3ZTlhZTFiMzcpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNDVhNzdmYjdkMzI2NGQ4OTliNmNlNzAxMjE3ODg4OTEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44NTI3MjI5NzYzMzAxNywtNzMuODYxNzI1Nzc1NTUxMTVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfN2FhODI5ZThhMThlNGEwYTgzOWMyNTYzODQ0NThiMzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNDM5NjBlZTcxNWJjNDk3YWE1NDVkMzY5MjBiMTIzOTIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMDhhMzUzODc2NzRmNDlmZTkwNzQ1YWRiZDI5YzM4Y2UgPSAkKCc8ZGl2IGlkPSJodG1sXzA4YTM1Mzg3Njc0ZjQ5ZmU5MDc0NWFkYmQyOWMzOGNlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Ccm9ueGRhbGUsIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80Mzk2MGVlNzE1YmM0OTdhYTU0NWQzNjkyMGIxMjM5Mi5zZXRDb250ZW50KGh0bWxfMDhhMzUzODc2NzRmNDlmZTkwNzQ1YWRiZDI5YzM4Y2UpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNDVhNzdmYjdkMzI2NGQ4OTliNmNlNzAxMjE3ODg4OTEuYmluZFBvcHVwKHBvcHVwXzQzOTYwZWU3MTViYzQ5N2FhNTQ1ZDM2OTIwYjEyMzkyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2ZlMWY0YjlkZjljMzRiYzY4Yjk1ZWRjZWViOGU1ZjliID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODY1Nzg3ODc4MDI5ODIsLTczLjg1OTMxODYzMjIxNjQ3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzdhYTgyOWU4YTE4ZTRhMGE4MzljMjU2Mzg0NDU4YjM0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2NjMjczYmM4YzA0NDQxYzg4NzgwZWYyY2RlZjgzN2M1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2Q2MWZkZDFkZDc5NTQ5NWRiYzMzZGMxODU5N2MyYmM0ID0gJCgnPGRpdiBpZD0iaHRtbF9kNjFmZGQxZGQ3OTU0OTVkYmMzM2RjMTg1OTdjMmJjNCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QWxsZXJ0b24sIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jYzI3M2JjOGMwNDQ0MWM4ODc4MGVmMmNkZWY4MzdjNS5zZXRDb250ZW50KGh0bWxfZDYxZmRkMWRkNzk1NDk1ZGJjMzNkYzE4NTk3YzJiYzQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZmUxZjRiOWRmOWMzNGJjNjhiOTVlZGNlZWI4ZTVmOWIuYmluZFBvcHVwKHBvcHVwX2NjMjczYmM4YzA0NDQxYzg4NzgwZWYyY2RlZjgzN2M1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzcyOWQyOTg5MTRhODQ4ZDA5ZDUyYzk3Mjc0NDNhODVlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODcwMzkyMzkxNDE0NywtNzMuOTAxNTIyNjQ1MTMxNDRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfN2FhODI5ZThhMThlNGEwYTgzOWMyNTYzODQ0NThiMzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMDljODIyZmFkNDVhNDNkYTkzNDU2OWEyNGZkNzY0ZmMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOGRiZjJhMWE4ZDJhNDI4OWE2MjU2OGY1MGJmMTVmZjUgPSAkKCc8ZGl2IGlkPSJodG1sXzhkYmYyYTFhOGQyYTQyODlhNjI1NjhmNTBiZjE1ZmY1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5LaW5nc2JyaWRnZSBIZWlnaHRzLCBCcm9ueDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMDljODIyZmFkNDVhNDNkYTkzNDU2OWEyNGZkNzY0ZmMuc2V0Q29udGVudChodG1sXzhkYmYyYTFhOGQyYTQyODlhNjI1NjhmNTBiZjE1ZmY1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzcyOWQyOTg5MTRhODQ4ZDA5ZDUyYzk3Mjc0NDNhODVlLmJpbmRQb3B1cChwb3B1cF8wOWM4MjJmYWQ0NWE0M2RhOTM0NTY5YTI0ZmQ3NjRmYyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8wM2RiNTExNmM0Yjk0MzBjOTc3ZDY1OWYxMWU1YWYwMSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY0NjkyNjA2NjU4NTc5LC03My45NDgxNzcwOTkyMDE4NF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF83YWE4MjllOGExOGU0YTBhODM5YzI1NjM4NDQ1OGIzNCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xOWU3OWIzMTlhNWU0YWM0YWQwNWY0MmRmYTY0ZTdjZSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mZWE1ZmVhNmNlMTM0OTQ1YjQwMWYzMDkwNzYzNDU1NiA9ICQoJzxkaXYgaWQ9Imh0bWxfZmVhNWZlYTZjZTEzNDk0NWI0MDFmMzA5MDc2MzQ1NTYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkVyYXNtdXMsIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xOWU3OWIzMTlhNWU0YWM0YWQwNWY0MmRmYTY0ZTdjZS5zZXRDb250ZW50KGh0bWxfZmVhNWZlYTZjZTEzNDk0NWI0MDFmMzA5MDc2MzQ1NTYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMDNkYjUxMTZjNGI5NDMwYzk3N2Q2NTlmMTFlNWFmMDEuYmluZFBvcHVwKHBvcHVwXzE5ZTc5YjMxOWE1ZTRhYzRhZDA1ZjQyZGZhNjRlN2NlKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2JkNDVhODU5MzU5MDQ3MDk5YTQ2MjAyYWQ4MjBjMWQ5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzU2NjU4MDgyMjc1MTksLTc0LjAwMDExMTM2MjAyNjM3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzdhYTgyOWU4YTE4ZTRhMGE4MzljMjU2Mzg0NDU4YjM0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzZhZmM3M2MzM2RlZTRkNTRiZjIyYmNiNjg3NTQxOGYwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2UzMjgzMGMwNTg1ZDQyZTViMTM1ZmFkOTNkNTEwMTU0ID0gJCgnPGRpdiBpZD0iaHRtbF9lMzI4MzBjMDU4NWQ0MmU1YjEzNWZhZDkzZDUxMDE1NCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+SHVkc29uIFlhcmRzLCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzZhZmM3M2MzM2RlZTRkNTRiZjIyYmNiNjg3NTQxOGYwLnNldENvbnRlbnQoaHRtbF9lMzI4MzBjMDU4NWQ0MmU1YjEzNWZhZDkzZDUxMDE1NCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9iZDQ1YTg1OTM1OTA0NzA5OWE0NjIwMmFkODIwYzFkOS5iaW5kUG9wdXAocG9wdXBfNmFmYzczYzMzZGVlNGQ1NGJmMjJiY2I2ODc1NDE4ZjApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfM2JlMDUzYzg3MWQwNGJiZGE4MTYwNzM0OTNkNDZmNmIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC41ODczMzc3NDAxODc0MSwtNzMuODA1NTMwMDI5Njg3MThdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfN2FhODI5ZThhMThlNGEwYTgzOWMyNTYzODQ0NThiMzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMGMwNmRmZGYzZDIyNGNmMGE1OTFkYzY4OGZlYjYwMTQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYWFhZWM2ZTExMjdlNDMwYTkwODc5Yzk5MTY3YjczYjEgPSAkKCc8ZGl2IGlkPSJodG1sX2FhYWVjNmUxMTI3ZTQzMGE5MDg3OWM5OTE2N2I3M2IxIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5IYW1tZWxzLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzBjMDZkZmRmM2QyMjRjZjBhNTkxZGM2ODhmZWI2MDE0LnNldENvbnRlbnQoaHRtbF9hYWFlYzZlMTEyN2U0MzBhOTA4NzljOTkxNjdiNzNiMSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8zYmUwNTNjODcxZDA0YmJkYTgxNjA3MzQ5M2Q0NmY2Yi5iaW5kUG9wdXAocG9wdXBfMGMwNmRmZGYzZDIyNGNmMGE1OTFkYzY4OGZlYjYwMTQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMjM2ZmI3NzQ0MzNiNGU2OThhYTNmODQ3YTg0YTI3ZGQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42MTEzMjE2OTEyODM4MzQsLTczLjc2NTk2NzgxNDQ1NjI3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzdhYTgyOWU4YTE4ZTRhMGE4MzljMjU2Mzg0NDU4YjM0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzc1MGRiZTM0NTMyYTRkOGE5ODZhN2VhZTVjZDI0N2NkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzg1NTczMGEyNzExYjQ1MTA5YjdkNWQ5ZTQ4YzhiNTc0ID0gJCgnPGRpdiBpZD0iaHRtbF84NTU3MzBhMjcxMWI0NTEwOWI3ZDVkOWU0OGM4YjU3NCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QmF5c3dhdGVyLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzc1MGRiZTM0NTMyYTRkOGE5ODZhN2VhZTVjZDI0N2NkLnNldENvbnRlbnQoaHRtbF84NTU3MzBhMjcxMWI0NTEwOWI3ZDVkOWU0OGM4YjU3NCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8yMzZmYjc3NDQzM2I0ZTY5OGFhM2Y4NDdhODRhMjdkZC5iaW5kUG9wdXAocG9wdXBfNzUwZGJlMzQ1MzJhNGQ4YTk4NmE3ZWFlNWNkMjQ3Y2QpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYjMzMDhiMzFmNTk2NDc1OTlhY2U3M2E3YjlmN2JlMGYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NTYwOTEyOTcwOTQ3MDYsLTczLjk0NTYzMDcwMzM0MDkxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzdhYTgyOWU4YTE4ZTRhMGE4MzljMjU2Mzg0NDU4YjM0KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzg2YzA5ZTVhYjQzYzQxOTE5MGFlMWU5ODE4NDhiMTc5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzhiMGI3ZTdiYWExMzQwNDc4MDYzZTI3YzM4NDAzYTExID0gJCgnPGRpdiBpZD0iaHRtbF84YjBiN2U3YmFhMTM0MDQ3ODA2M2UyN2MzODQwM2ExMSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UXVlZW5zYnJpZGdlLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzg2YzA5ZTVhYjQzYzQxOTE5MGFlMWU5ODE4NDhiMTc5LnNldENvbnRlbnQoaHRtbF84YjBiN2U3YmFhMTM0MDQ3ODA2M2UyN2MzODQwM2ExMSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9iMzMwOGIzMWY1OTY0NzU5OWFjZTczYTdiOWY3YmUwZi5iaW5kUG9wdXAocG9wdXBfODZjMDllNWFiNDNjNDE5MTkwYWUxZTk4MTg0OGIxNzkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMGJhNDc0YjU5YmUwNDEwMWE3NzRhZjY3NGIxOTUzNzkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42MTczMTA3OTI1Mjk4MywtNzQuMDgxNzM5OTIyMTE5NjJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfN2FhODI5ZThhMThlNGEwYTgzOWMyNTYzODQ0NThiMzQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMDY2ZmE3NzMyYjllNDIwN2I0MjdmNmFjNTdjOWNlNGIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZTA1ZDNkOGEzZWE2NGYwOWEzZWI0NGY1YzQ3ZjdiNTIgPSAkKCc8ZGl2IGlkPSJodG1sX2UwNWQzZDhhM2VhNjRmMDlhM2ViNDRmNWM0N2Y3YjUyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Gb3ggSGlsbHMsIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzA2NmZhNzczMmI5ZTQyMDdiNDI3ZjZhYzU3YzljZTRiLnNldENvbnRlbnQoaHRtbF9lMDVkM2Q4YTNlYTY0ZjA5YTNlYjQ0ZjVjNDdmN2I1Mik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8wYmE0NzRiNTliZTA0MTAxYTc3NGFmNjc0YjE5NTM3OS5iaW5kUG9wdXAocG9wdXBfMDY2ZmE3NzMyYjllNDIwN2I0MjdmNmFjNTdjOWNlNGIpOwoKICAgICAgICAgICAgCiAgICAgICAgCjwvc2NyaXB0Pg==\" style=\"position:absolute;width:100%;height:100%;left:0;top:0;border:none !important;\" allowfullscreen webkitallowfullscreen mozallowfullscreen></iframe></div></div>"
],
"text/plain": [
"<folium.folium.Map at 0x7fcec8db20b8>"
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# create map of New York using latitude and longitude values\n",
"map_newyork = folium.Map(location=[latitude, longitude], zoom_start=10)\n",
"\n",
"# add markers to map\n",
"for lat, lng, borough, neighborhood in zip(neighborhoods['Latitude'], neighborhoods['Longitude'], neighborhoods['Borough'], neighborhoods['Neighborhood']):\n",
" label = '{}, {}'.format(neighborhood, borough)\n",
" label = folium.Popup(label, parse_html=True)\n",
" folium.CircleMarker(\n",
" [lat, lng],\n",
" radius=5,\n",
" popup=label,\n",
" color='blue',\n",
" fill=True,\n",
" fill_color='#3186cc',\n",
" fill_opacity=0.7,\n",
" parse_html=False).add_to(map_newyork) \n",
" \n",
"map_newyork"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**Folium** is a great visualization library. Feel free to zoom into the above map, and click on each circle mark to reveal the name of the neighborhood and its respective borough."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"However, for illustration purposes, let's simplify the above map and segment and cluster only the neighborhoods in Manhattan. So let's slice the original dataframe and create a new dataframe of the Manhattan data."
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {
"collapsed": false,
"jupyter": {
"outputs_hidden": false
}
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Borough</th>\n",
" <th>Neighborhood</th>\n",
" <th>Latitude</th>\n",
" <th>Longitude</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Manhattan</td>\n",
" <td>Marble Hill</td>\n",
" <td>40.876551</td>\n",
" <td>-73.910660</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>Manhattan</td>\n",
" <td>Chinatown</td>\n",
" <td>40.715618</td>\n",
" <td>-73.994279</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>Manhattan</td>\n",
" <td>Washington Heights</td>\n",
" <td>40.851903</td>\n",
" <td>-73.936900</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>Manhattan</td>\n",
" <td>Inwood</td>\n",
" <td>40.867684</td>\n",
" <td>-73.921210</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>Manhattan</td>\n",
" <td>Hamilton Heights</td>\n",
" <td>40.823604</td>\n",
" <td>-73.949688</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Borough Neighborhood Latitude Longitude\n",
"0 Manhattan Marble Hill 40.876551 -73.910660\n",
"1 Manhattan Chinatown 40.715618 -73.994279\n",
"2 Manhattan Washington Heights 40.851903 -73.936900\n",
"3 Manhattan Inwood 40.867684 -73.921210\n",
"4 Manhattan Hamilton Heights 40.823604 -73.949688"
]
},
"execution_count": 16,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"manhattan_data = neighborhoods[neighborhoods['Borough'] == 'Manhattan'].reset_index(drop=True)\n",
"manhattan_data.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's get the geographical coordinates of Manhattan."
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {
"collapsed": false,
"jupyter": {
"outputs_hidden": false
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"The geograpical coordinate of Manhattan are 40.7900869, -73.9598295.\n"
]
}
],
"source": [
"address = 'Manhattan, NY'\n",
"\n",
"geolocator = Nominatim(user_agent=\"ny_explorer\")\n",
"location = geolocator.geocode(address)\n",
"latitude = location.latitude\n",
"longitude = location.longitude\n",
"print('The geograpical coordinate of Manhattan are {}, {}.'.format(latitude, longitude))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"As we did with all of New York City, let's visualizat Manhattan the neighborhoods in it."
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {
"collapsed": false,
"jupyter": {
"outputs_hidden": false
}
},
"outputs": [
{
"data": {
"text/html": [
"<div style=\"width:100%;\"><div style=\"position:relative;width:100%;height:0;padding-bottom:60%;\"><iframe src=\"data:text/html;charset=utf-8;base64,PCFET0NUWVBFIGh0bWw+CjxoZWFkPiAgICAKICAgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPgogICAgPHNjcmlwdD5MX1BSRUZFUl9DQU5WQVMgPSBmYWxzZTsgTF9OT19UT1VDSCA9IGZhbHNlOyBMX0RJU0FCTEVfM0QgPSBmYWxzZTs8L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2FqYXguZ29vZ2xlYXBpcy5jb20vYWpheC9saWJzL2pxdWVyeS8xLjExLjEvanF1ZXJ5Lm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvanMvYm9vdHN0cmFwLm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvTGVhZmxldC5hd2Vzb21lLW1hcmtlcnMvMi4wLjIvbGVhZmxldC5hd2Vzb21lLW1hcmtlcnMuanMiPjwvc2NyaXB0PgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS4yLjAvZGlzdC9sZWFmbGV0LmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9jc3MvYm9vdHN0cmFwLm1pbi5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvY3NzL2Jvb3RzdHJhcC10aGVtZS5taW4uY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vbWF4Y2RuLmJvb3RzdHJhcGNkbi5jb20vZm9udC1hd2Vzb21lLzQuNi4zL2Nzcy9mb250LWF3ZXNvbWUubWluLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9MZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy8yLjAuMi9sZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9yYXdnaXQuY29tL3B5dGhvbi12aXN1YWxpemF0aW9uL2ZvbGl1bS9tYXN0ZXIvZm9saXVtL3RlbXBsYXRlcy9sZWFmbGV0LmF3ZXNvbWUucm90YXRlLmNzcyIvPgogICAgPHN0eWxlPmh0bWwsIGJvZHkge3dpZHRoOiAxMDAlO2hlaWdodDogMTAwJTttYXJnaW46IDA7cGFkZGluZzogMDt9PC9zdHlsZT4KICAgIDxzdHlsZT4jbWFwIHtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtyaWdodDowO2xlZnQ6MDt9PC9zdHlsZT4KICAgIAogICAgICAgICAgICA8c3R5bGU+ICNtYXBfMjc1NzRjOTJkMmEzNDZhMjk3MDVlNDFlYWIwNDMzYjcgewogICAgICAgICAgICAgICAgcG9zaXRpb24gOiByZWxhdGl2ZTsKICAgICAgICAgICAgICAgIHdpZHRoIDogMTAwLjAlOwogICAgICAgICAgICAgICAgaGVpZ2h0OiAxMDAuMCU7CiAgICAgICAgICAgICAgICBsZWZ0OiAwLjAlOwogICAgICAgICAgICAgICAgdG9wOiAwLjAlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICA8L3N0eWxlPgogICAgICAgIAo8L2hlYWQ+Cjxib2R5PiAgICAKICAgIAogICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb2xpdW0tbWFwIiBpZD0ibWFwXzI3NTc0YzkyZDJhMzQ2YTI5NzA1ZTQxZWFiMDQzM2I3IiA+PC9kaXY+CiAgICAgICAgCjwvYm9keT4KPHNjcmlwdD4gICAgCiAgICAKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGJvdW5kcyA9IG51bGw7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcF8yNzU3NGM5MmQyYTM0NmEyOTcwNWU0MWVhYjA0MzNiNyA9IEwubWFwKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21hcF8yNzU3NGM5MmQyYTM0NmEyOTcwNWU0MWVhYjA0MzNiNycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y2VudGVyOiBbNDAuNzkwMDg2OSwtNzMuOTU5ODI5NV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6b29tOiAxMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heEJvdW5kczogYm91bmRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXJzOiBbXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmxkQ29weUp1bXA6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JzOiBMLkNSUy5FUFNHMzg1NwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHRpbGVfbGF5ZXJfYzliNjIzZjBkZmJkNGQ4NWE1YzJmYTYzZDZlYTdlOTUgPSBMLnRpbGVMYXllcigKICAgICAgICAgICAgICAgICdodHRwczovL3tzfS50aWxlLm9wZW5zdHJlZXRtYXAub3JnL3t6fS97eH0ve3l9LnBuZycsCiAgICAgICAgICAgICAgICB7CiAgImF0dHJpYnV0aW9uIjogbnVsbCwKICAiZGV0ZWN0UmV0aW5hIjogZmFsc2UsCiAgIm1heFpvb20iOiAxOCwKICAibWluWm9vbSI6IDEsCiAgIm5vV3JhcCI6IGZhbHNlLAogICJzdWJkb21haW5zIjogImFiYyIKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMjc1NzRjOTJkMmEzNDZhMjk3MDVlNDFlYWIwNDMzYjcpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzk4YjQ1OGE3ZTI0NzQyOWE5MmU1ODUyOGJkODNmZjdjID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODc2NTUwNzc4Nzk5NjQsLTczLjkxMDY1OTY1ODYyOTgxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzI3NTc0YzkyZDJhMzQ2YTI5NzA1ZTQxZWFiMDQzM2I3KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2MwOThiZjRiOGY5MTRiZmJiMDdjODk3YTgxNjM2ZjZlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2E1YjJhZDA5ZTBiZTQwZmU5NWFhNWE5YThmYzNmZDkxID0gJCgnPGRpdiBpZD0iaHRtbF9hNWIyYWQwOWUwYmU0MGZlOTVhYTVhOWE4ZmMzZmQ5MSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TWFyYmxlIEhpbGw8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2MwOThiZjRiOGY5MTRiZmJiMDdjODk3YTgxNjM2ZjZlLnNldENvbnRlbnQoaHRtbF9hNWIyYWQwOWUwYmU0MGZlOTVhYTVhOWE4ZmMzZmQ5MSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl85OGI0NThhN2UyNDc0MjlhOTJlNTg1MjhiZDgzZmY3Yy5iaW5kUG9wdXAocG9wdXBfYzA5OGJmNGI4ZjkxNGJmYmIwN2M4OTdhODE2MzZmNmUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZjY0ZTNhMGIwYTA2NDE0ZmI2MDM5Mzk3NDY4NTZkNjYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MTU2MTg0MjIzMTQzMiwtNzMuOTk0Mjc5MzYyNTU5NzhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMjc1NzRjOTJkMmEzNDZhMjk3MDVlNDFlYWIwNDMzYjcpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfY2M3OWM2MGU4OGEzNDliOTlhOTNkNjQwZTQzNTM3NDggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMTM0NTVjY2YzMjdmNDhhMjg4ZTFlYmI0MjY4ODgyZTEgPSAkKCc8ZGl2IGlkPSJodG1sXzEzNDU1Y2NmMzI3ZjQ4YTI4OGUxZWJiNDI2ODg4MmUxIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DaGluYXRvd248L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2NjNzljNjBlODhhMzQ5Yjk5YTkzZDY0MGU0MzUzNzQ4LnNldENvbnRlbnQoaHRtbF8xMzQ1NWNjZjMyN2Y0OGEyODhlMWViYjQyNjg4ODJlMSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9mNjRlM2EwYjBhMDY0MTRmYjYwMzkzOTc0Njg1NmQ2Ni5iaW5kUG9wdXAocG9wdXBfY2M3OWM2MGU4OGEzNDliOTlhOTNkNjQwZTQzNTM3NDgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNjc5OGRhYzRjZTY1NDMyOGE5YjdlNzgzMWE2ZTNjYTUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44NTE5MDI1MjU1NTMwNSwtNzMuOTM2OTAwMjc5ODUyMzRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMjc1NzRjOTJkMmEzNDZhMjk3MDVlNDFlYWIwNDMzYjcpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYjBjNDU5ZjJiMmUxNDZlZThkNmE1NTA4NDJjNzk2MmYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMDk3ZTk3OGIxYzhmNDYzY2JlMDA5NjE3MmUxYzkxYjQgPSAkKCc8ZGl2IGlkPSJodG1sXzA5N2U5NzhiMWM4ZjQ2M2NiZTAwOTYxNzJlMWM5MWI0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5XYXNoaW5ndG9uIEhlaWdodHM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2IwYzQ1OWYyYjJlMTQ2ZWU4ZDZhNTUwODQyYzc5NjJmLnNldENvbnRlbnQoaHRtbF8wOTdlOTc4YjFjOGY0NjNjYmUwMDk2MTcyZTFjOTFiNCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl82Nzk4ZGFjNGNlNjU0MzI4YTliN2U3ODMxYTZlM2NhNS5iaW5kUG9wdXAocG9wdXBfYjBjNDU5ZjJiMmUxNDZlZThkNmE1NTA4NDJjNzk2MmYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZGE3MzAxNzZhYWJmNDJhZDg0ZmU3YzZhYjk0OGM0ZjMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44Njc2ODM5NjQ0OTkxNSwtNzMuOTIxMjEwNDIyMDM4OTddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMjc1NzRjOTJkMmEzNDZhMjk3MDVlNDFlYWIwNDMzYjcpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOWUxNjE3ZGM2ZTVkNDI3MDhmOTdlZDJmMmE4Y2E4NTAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNzI2OTI0NWY3YTRjNGMwMDg0ZTBjNDU1ZTBhYjIyYmUgPSAkKCc8ZGl2IGlkPSJodG1sXzcyNjkyNDVmN2E0YzRjMDA4NGUwYzQ1NWUwYWIyMmJlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Jbndvb2Q8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzllMTYxN2RjNmU1ZDQyNzA4Zjk3ZWQyZjJhOGNhODUwLnNldENvbnRlbnQoaHRtbF83MjY5MjQ1ZjdhNGM0YzAwODRlMGM0NTVlMGFiMjJiZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9kYTczMDE3NmFhYmY0MmFkODRmZTdjNmFiOTQ4YzRmMy5iaW5kUG9wdXAocG9wdXBfOWUxNjE3ZGM2ZTVkNDI3MDhmOTdlZDJmMmE4Y2E4NTApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfM2Y1ZGQ1NGJlNzdiNGQ4MzgyNDkyNWZhYjRiZGUxMzcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44MjM2MDQyODQ4MTE5MzUsLTczLjk0OTY4NzkxODgzMzY2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzI3NTc0YzkyZDJhMzQ2YTI5NzA1ZTQxZWFiMDQzM2I3KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzRmMGZlZjk5YzIyNDRlNDdhNjVlNjExN2I2OTlmZGEwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2NhOWNlNmM4NTk4MzRmM2RiZmE3ZTk4NDhmNTBiOWY5ID0gJCgnPGRpdiBpZD0iaHRtbF9jYTljZTZjODU5ODM0ZjNkYmZhN2U5ODQ4ZjUwYjlmOSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+SGFtaWx0b24gSGVpZ2h0czwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNGYwZmVmOTljMjI0NGU0N2E2NWU2MTE3YjY5OWZkYTAuc2V0Q29udGVudChodG1sX2NhOWNlNmM4NTk4MzRmM2RiZmE3ZTk4NDhmNTBiOWY5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzNmNWRkNTRiZTc3YjRkODM4MjQ5MjVmYWI0YmRlMTM3LmJpbmRQb3B1cChwb3B1cF80ZjBmZWY5OWMyMjQ0ZTQ3YTY1ZTYxMTdiNjk5ZmRhMCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8zYTg5NzA1YmYwOTY0NjA5YThlNWQzM2E1ODY3Y2JmNyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjgxNjkzNDQyOTQ5NzgsLTczLjk1NzM4NTM5MzUxODhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMjc1NzRjOTJkMmEzNDZhMjk3MDVlNDFlYWIwNDMzYjcpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfODM0YWUzOTFjYWE4NGNjZWJmNWE3MjUzNTA3NmUwMGUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMzBmNzQ5MGJhNGZlNDZkOTg3ZjUyNTIxZmIxZmNjNzUgPSAkKCc8ZGl2IGlkPSJodG1sXzMwZjc0OTBiYTRmZTQ2ZDk4N2Y1MjUyMWZiMWZjYzc1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NYW5oYXR0YW52aWxsZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfODM0YWUzOTFjYWE4NGNjZWJmNWE3MjUzNTA3NmUwMGUuc2V0Q29udGVudChodG1sXzMwZjc0OTBiYTRmZTQ2ZDk4N2Y1MjUyMWZiMWZjYzc1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzNhODk3MDViZjA5NjQ2MDlhOGU1ZDMzYTU4NjdjYmY3LmJpbmRQb3B1cChwb3B1cF84MzRhZTM5MWNhYTg0Y2NlYmY1YTcyNTM1MDc2ZTAwZSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85ODI1ZTE4YmI4OTI0MmQ2OGE0Y2U5NGM2ODE5ZjczNyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjgxNTk3NjA2NzQyNDE0LC03My45NDMyMTExMjYwMzkwNV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8yNzU3NGM5MmQyYTM0NmEyOTcwNWU0MWVhYjA0MzNiNyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iZmM1ZGFkMzE0MzU0NTk5YTM4ZTZmODIxMjZmNTgzNSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8yNGU4ODM5NmMxZjE0N2U4OGQzYTg3NTQ5MmQ1ZmI3ZSA9ICQoJzxkaXYgaWQ9Imh0bWxfMjRlODgzOTZjMWYxNDdlODhkM2E4NzU0OTJkNWZiN2UiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNlbnRyYWwgSGFybGVtPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iZmM1ZGFkMzE0MzU0NTk5YTM4ZTZmODIxMjZmNTgzNS5zZXRDb250ZW50KGh0bWxfMjRlODgzOTZjMWYxNDdlODhkM2E4NzU0OTJkNWZiN2UpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOTgyNWUxOGJiODkyNDJkNjhhNGNlOTRjNjgxOWY3MzcuYmluZFBvcHVwKHBvcHVwX2JmYzVkYWQzMTQzNTQ1OTlhMzhlNmY4MjEyNmY1ODM1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzhhYmViNWZkNTU5MDQzM2E4ODI5YTI0OGQ5YmJjNzZiID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzkyMjQ5NDY2NjMwMzMsLTczLjk0NDE4MjIzMTQ4NTI0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzI3NTc0YzkyZDJhMzQ2YTI5NzA1ZTQxZWFiMDQzM2I3KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2I1NWJlZTQ0OTcxYzQ2N2U5OTQwMDljYzhhZDg0ZjI4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2U0YmY1NzZlNjM5MDQzMzJhZGVjODkxYjc1Y2RmYzgwID0gJCgnPGRpdiBpZD0iaHRtbF9lNGJmNTc2ZTYzOTA0MzMyYWRlYzg5MWI3NWNkZmM4MCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RWFzdCBIYXJsZW08L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2I1NWJlZTQ0OTcxYzQ2N2U5OTQwMDljYzhhZDg0ZjI4LnNldENvbnRlbnQoaHRtbF9lNGJmNTc2ZTYzOTA0MzMyYWRlYzg5MWI3NWNkZmM4MCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl84YWJlYjVmZDU1OTA0MzNhODgyOWEyNDhkOWJiYzc2Yi5iaW5kUG9wdXAocG9wdXBfYjU1YmVlNDQ5NzFjNDY3ZTk5NDAwOWNjOGFkODRmMjgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMjc5NTFmNzUxYjIyNGRiYmIwZDcwZmYzYzUwMzc0MDYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NzU2Mzg1NzMzMDE4MDUsLTczLjk2MDUwNzYzMTM1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzI3NTc0YzkyZDJhMzQ2YTI5NzA1ZTQxZWFiMDQzM2I3KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzE2MzA4NjRkMjMyNTRlMmZhZjM1ZGRiZTJiYWM1NDRmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzYxYTNmODViODhhNjQyZGRhYzBlN2EyNTI1NDRiYjM5ID0gJCgnPGRpdiBpZD0iaHRtbF82MWEzZjg1Yjg4YTY0MmRkYWMwZTdhMjUyNTQ0YmIzOSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+VXBwZXIgRWFzdCBTaWRlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xNjMwODY0ZDIzMjU0ZTJmYWYzNWRkYmUyYmFjNTQ0Zi5zZXRDb250ZW50KGh0bWxfNjFhM2Y4NWI4OGE2NDJkZGFjMGU3YTI1MjU0NGJiMzkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMjc5NTFmNzUxYjIyNGRiYmIwZDcwZmYzYzUwMzc0MDYuYmluZFBvcHVwKHBvcHVwXzE2MzA4NjRkMjMyNTRlMmZhZjM1ZGRiZTJiYWM1NDRmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzUzMTBjMDM5ZTg1MTQ2NjZiYmM1NzliZmE4YjgwNmI5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzc1OTI5ODQ5ODg0ODc1LC03My45NDcxMTc4NDQ3MTgyNl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8yNzU3NGM5MmQyYTM0NmEyOTcwNWU0MWVhYjA0MzNiNyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF84M2NiMTJlODQ5Mzg0YWY5YTViOTJjNjgzMmRhODQ1NSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wYjVhNmNmZDM5NmU0MzUyOTVlMjQ0OWZiMmYzYTIzNyA9ICQoJzxkaXYgaWQ9Imh0bWxfMGI1YTZjZmQzOTZlNDM1Mjk1ZTI0NDlmYjJmM2EyMzciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPllvcmt2aWxsZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfODNjYjEyZTg0OTM4NGFmOWE1YjkyYzY4MzJkYTg0NTUuc2V0Q29udGVudChodG1sXzBiNWE2Y2ZkMzk2ZTQzNTI5NWUyNDQ5ZmIyZjNhMjM3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzUzMTBjMDM5ZTg1MTQ2NjZiYmM1NzliZmE4YjgwNmI5LmJpbmRQb3B1cChwb3B1cF84M2NiMTJlODQ5Mzg0YWY5YTViOTJjNjgzMmRhODQ1NSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lNDllZWI4MzdjYWM0NzcxYTEwODBkNTljMWUxYTk4MSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc2ODExMjY1ODI4NzMzLC03My45NTg4NTk2ODgxMzc2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzI3NTc0YzkyZDJhMzQ2YTI5NzA1ZTQxZWFiMDQzM2I3KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2NiMzI1ZTlmMzE3ZjQ3YzVhOTVhM2ZkYzlkOWRlNmJjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2NlNmFhNzQ5MTBmZDRkZWE5N2M4ZDAwNjgwOTIwNDViID0gJCgnPGRpdiBpZD0iaHRtbF9jZTZhYTc0OTEwZmQ0ZGVhOTdjOGQwMDY4MDkyMDQ1YiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TGVub3ggSGlsbDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfY2IzMjVlOWYzMTdmNDdjNWE5NWEzZmRjOWQ5ZGU2YmMuc2V0Q29udGVudChodG1sX2NlNmFhNzQ5MTBmZDRkZWE5N2M4ZDAwNjgwOTIwNDViKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2U0OWVlYjgzN2NhYzQ3NzFhMTA4MGQ1OWMxZTFhOTgxLmJpbmRQb3B1cChwb3B1cF9jYjMyNWU5ZjMxN2Y0N2M1YTk1YTNmZGM5ZDlkZTZiYyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl80ZjE5M2JlMDBmNTE0MmE3YWQwZTU3OTZlOTZiMWU4NCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc2MjE1OTYwNTc2MjgzLC03My45NDkxNjc2OTIyNzk1M10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8yNzU3NGM5MmQyYTM0NmEyOTcwNWU0MWVhYjA0MzNiNyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF84NzAwMTRiNjJmMzA0MGVjYWE4NTY0OTZkN2NkMDJlYSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83MTdhMGM1NTY1NWU0OGU4YTQ4NzZlMzQ1YjFmZTg1YSA9ICQoJzxkaXYgaWQ9Imh0bWxfNzE3YTBjNTU2NTVlNDhlOGE0ODc2ZTM0NWIxZmU4NWEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlJvb3NldmVsdCBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzg3MDAxNGI2MmYzMDQwZWNhYTg1NjQ5NmQ3Y2QwMmVhLnNldENvbnRlbnQoaHRtbF83MTdhMGM1NTY1NWU0OGU4YTQ4NzZlMzQ1YjFmZTg1YSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl80ZjE5M2JlMDBmNTE0MmE3YWQwZTU3OTZlOTZiMWU4NC5iaW5kUG9wdXAocG9wdXBfODcwMDE0YjYyZjMwNDBlY2FhODU2NDk2ZDdjZDAyZWEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNWNmZjZmOGU0ZGJkNGYxM2E4MjBmYmU1M2MzNWMzNTMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43ODc2NTc5OTg1MzQ4NTQsLTczLjk3NzA1OTIzNjMwNjAzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzI3NTc0YzkyZDJhMzQ2YTI5NzA1ZTQxZWFiMDQzM2I3KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzA4MGU2ODRjYTllMzQ5NGQ4Mzc4ZTdjYTc4MTNlMDc4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzdlNDU5YWU2N2IzNTRlZWFhZjAzZTAwNmYyN2MxMDY2ID0gJCgnPGRpdiBpZD0iaHRtbF83ZTQ1OWFlNjdiMzU0ZWVhYWYwM2UwMDZmMjdjMTA2NiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+VXBwZXIgV2VzdCBTaWRlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wODBlNjg0Y2E5ZTM0OTRkODM3OGU3Y2E3ODEzZTA3OC5zZXRDb250ZW50KGh0bWxfN2U0NTlhZTY3YjM1NGVlYWFmMDNlMDA2ZjI3YzEwNjYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNWNmZjZmOGU0ZGJkNGYxM2E4MjBmYmU1M2MzNWMzNTMuYmluZFBvcHVwKHBvcHVwXzA4MGU2ODRjYTllMzQ5NGQ4Mzc4ZTdjYTc4MTNlMDc4KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzk2MmEzYzYxODk2ZDRiODE5ZWY1NTdlYjI4N2Q1YjdmID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzczNTI4ODg5NDIxNjYsLTczLjk4NTMzNzc3MDAxMjYyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzI3NTc0YzkyZDJhMzQ2YTI5NzA1ZTQxZWFiMDQzM2I3KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2Q1OTNhODY0YTk0YjQ0ZWFiNGM5NDdhMWFiM2VkNDhjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2E4MmFkNGYyZjQ0NTRmYTI5MDVjMzczYjVlYjdhYzgxID0gJCgnPGRpdiBpZD0iaHRtbF9hODJhZDRmMmY0NDU0ZmEyOTA1YzM3M2I1ZWI3YWM4MSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TGluY29sbiBTcXVhcmU8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2Q1OTNhODY0YTk0YjQ0ZWFiNGM5NDdhMWFiM2VkNDhjLnNldENvbnRlbnQoaHRtbF9hODJhZDRmMmY0NDU0ZmEyOTA1YzM3M2I1ZWI3YWM4MSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl85NjJhM2M2MTg5NmQ0YjgxOWVmNTU3ZWIyODdkNWI3Zi5iaW5kUG9wdXAocG9wdXBfZDU5M2E4NjRhOTRiNDRlYWI0Yzk0N2ExYWIzZWQ0OGMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMDJhMjk0NjE2ODQ5NDc3Y2I4NWExODBlY2VjZWI1MmQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NTkxMDA4OTE0NjIxMiwtNzMuOTk2MTE5MzYzMDk0NzldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMjc1NzRjOTJkMmEzNDZhMjk3MDVlNDFlYWIwNDMzYjcpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYjg5YWE0NzY4NDVmNDExZjk4YWJjNzMzNTI4NGI0NGMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNTQ4Mzg0ZTVjYjgzNDVhOTkwZDM0MjFiODcxOTc3MjkgPSAkKCc8ZGl2IGlkPSJodG1sXzU0ODM4NGU1Y2I4MzQ1YTk5MGQzNDIxYjg3MTk3NzI5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DbGludG9uPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iODlhYTQ3Njg0NWY0MTFmOThhYmM3MzM1Mjg0YjQ0Yy5zZXRDb250ZW50KGh0bWxfNTQ4Mzg0ZTVjYjgzNDVhOTkwZDM0MjFiODcxOTc3MjkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMDJhMjk0NjE2ODQ5NDc3Y2I4NWExODBlY2VjZWI1MmQuYmluZFBvcHVwKHBvcHVwX2I4OWFhNDc2ODQ1ZjQxMWY5OGFiYzczMzUyODRiNDRjKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzM0MzIwY2QwZjBiYTQ2YjNhMGNjMTUyMmRkNjIyNjMxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzU0NjkxMTAyNzA2MjMsLTczLjk4MTY2ODgyNzMwMzA0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzI3NTc0YzkyZDJhMzQ2YTI5NzA1ZTQxZWFiMDQzM2I3KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2ZhMGIwNjYxYjg4ZjRkM2U4ZmM2ZmNiY2RiMTEzMDRhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzc4M2QwNDE0ZDUyZDRjMWY4ZWRmYTJkMjNkNzc5MzBlID0gJCgnPGRpdiBpZD0iaHRtbF83ODNkMDQxNGQ1MmQ0YzFmOGVkZmEyZDIzZDc3OTMwZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TWlkdG93bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZmEwYjA2NjFiODhmNGQzZThmYzZmY2JjZGIxMTMwNGEuc2V0Q29udGVudChodG1sXzc4M2QwNDE0ZDUyZDRjMWY4ZWRmYTJkMjNkNzc5MzBlKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzM0MzIwY2QwZjBiYTQ2YjNhMGNjMTUyMmRkNjIyNjMxLmJpbmRQb3B1cChwb3B1cF9mYTBiMDY2MWI4OGY0ZDNlOGZjNmZjYmNkYjExMzA0YSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xZTM0Y2E3ZjQwYjM0OTEyOTA4OGU0OTYzN2U3NmRhOCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc0ODMwMzA3NzI1MjE3NCwtNzMuOTc4MzMyMDc5MjQxMjddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMjc1NzRjOTJkMmEzNDZhMjk3MDVlNDFlYWIwNDMzYjcpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYzk1ZjY2N2M3NDEyNGFlYzhhN2VjOWI1MzkwNTFjNTYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfM2U5YjYxODE2Y2FiNGQxYTk2ZDE5OWVlMDE4MTc2NDMgPSAkKCc8ZGl2IGlkPSJodG1sXzNlOWI2MTgxNmNhYjRkMWE5NmQxOTllZTAxODE3NjQzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NdXJyYXkgSGlsbDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYzk1ZjY2N2M3NDEyNGFlYzhhN2VjOWI1MzkwNTFjNTYuc2V0Q29udGVudChodG1sXzNlOWI2MTgxNmNhYjRkMWE5NmQxOTllZTAxODE3NjQzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzFlMzRjYTdmNDBiMzQ5MTI5MDg4ZTQ5NjM3ZTc2ZGE4LmJpbmRQb3B1cChwb3B1cF9jOTVmNjY3Yzc0MTI0YWVjOGE3ZWM5YjUzOTA1MWM1Nik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl82YWM4ZTllNjk4MTI0NTBkODAxMWUzOWVmOTlmMWJkOSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc0NDAzNDcwNjc0Nzk3NSwtNzQuMDAzMTE2MzM0NzI4MTNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMjc1NzRjOTJkMmEzNDZhMjk3MDVlNDFlYWIwNDMzYjcpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYmRhODdmOTk1NzRmNGNlNmI1MTkzNzczZWQ3NDhkM2MgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMWIxZDQxMzhmOGQ1NGVlMDg3MjhhNmJmYjUyYmYwZDAgPSAkKCc8ZGl2IGlkPSJodG1sXzFiMWQ0MTM4ZjhkNTRlZTA4NzI4YTZiZmI1MmJmMGQwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DaGVsc2VhPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iZGE4N2Y5OTU3NGY0Y2U2YjUxOTM3NzNlZDc0OGQzYy5zZXRDb250ZW50KGh0bWxfMWIxZDQxMzhmOGQ1NGVlMDg3MjhhNmJmYjUyYmYwZDApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNmFjOGU5ZTY5ODEyNDUwZDgwMTFlMzllZjk5ZjFiZDkuYmluZFBvcHVwKHBvcHVwX2JkYTg3Zjk5NTc0ZjRjZTZiNTE5Mzc3M2VkNzQ4ZDNjKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzA5YzcwN2MzZTVlYzQxNmE5N2RiZDFmMDQwZDY5M2E3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzI2OTMyODg1MzYxMjgsLTczLjk5OTkxNDAyOTQ1OTAyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzI3NTc0YzkyZDJhMzQ2YTI5NzA1ZTQxZWFiMDQzM2I3KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzA3ZWFhM2FiMGMwMDQxNGQ5ZTNlNmM3YzBiYzcwNDM1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzRlZjlmZTUxMTJmYTQxMWU4MDg3YTA0MDFlYzVlMmU2ID0gJCgnPGRpdiBpZD0iaHRtbF80ZWY5ZmU1MTEyZmE0MTFlODA4N2EwNDAxZWM1ZTJlNiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+R3JlZW53aWNoIFZpbGxhZ2U8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzA3ZWFhM2FiMGMwMDQxNGQ5ZTNlNmM3YzBiYzcwNDM1LnNldENvbnRlbnQoaHRtbF80ZWY5ZmU1MTEyZmE0MTFlODA4N2EwNDAxZWM1ZTJlNik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8wOWM3MDdjM2U1ZWM0MTZhOTdkYmQxZjA0MGQ2OTNhNy5iaW5kUG9wdXAocG9wdXBfMDdlYWEzYWIwYzAwNDE0ZDllM2U2YzdjMGJjNzA0MzUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOWUwNjJmM2U4M2FmNGNjOTlmN2ZjZTJlMDg5ZmE1ZWMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43Mjc4NDY3NzcyNzAyNDQsLTczLjk4MjIyNjE2NTA2NDE2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzI3NTc0YzkyZDJhMzQ2YTI5NzA1ZTQxZWFiMDQzM2I3KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzkwYTE4NDllOWU0ZTRlYjhiNDBlM2M3YjgxYWNlOTBkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzNkNTE5MDQwM2FhODQzMDg4ODY3YTM2YzEwN2Y3NTVlID0gJCgnPGRpdiBpZD0iaHRtbF8zZDUxOTA0MDNhYTg0MzA4ODg2N2EzNmMxMDdmNzU1ZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RWFzdCBWaWxsYWdlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85MGExODQ5ZTllNGU0ZWI4YjQwZTNjN2I4MWFjZTkwZC5zZXRDb250ZW50KGh0bWxfM2Q1MTkwNDAzYWE4NDMwODg4NjdhMzZjMTA3Zjc1NWUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOWUwNjJmM2U4M2FmNGNjOTlmN2ZjZTJlMDg5ZmE1ZWMuYmluZFBvcHVwKHBvcHVwXzkwYTE4NDllOWU0ZTRlYjhiNDBlM2M3YjgxYWNlOTBkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzdjZWY0NWI4ZDg2MzQ1YTA4MDU3OTQyODdiMmJlOGU4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzE3ODA2NzQ4OTI3NjUsLTczLjk4MDg5MDMxOTk5MjkxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzI3NTc0YzkyZDJhMzQ2YTI5NzA1ZTQxZWFiMDQzM2I3KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzZlNzI1MzY5N2E3MTQyNmFiOWM3ZjNlMTIyNzM1NzY1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzgxNWY0ZTJkOGEzYjQwZTA4MTg3NjI2NTZiNDVhN2NjID0gJCgnPGRpdiBpZD0iaHRtbF84MTVmNGUyZDhhM2I0MGUwODE4NzYyNjU2YjQ1YTdjYyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TG93ZXIgRWFzdCBTaWRlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82ZTcyNTM2OTdhNzE0MjZhYjljN2YzZTEyMjczNTc2NS5zZXRDb250ZW50KGh0bWxfODE1ZjRlMmQ4YTNiNDBlMDgxODc2MjY1NmI0NWE3Y2MpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfN2NlZjQ1YjhkODYzNDVhMDgwNTc5NDI4N2IyYmU4ZTguYmluZFBvcHVwKHBvcHVwXzZlNzI1MzY5N2E3MTQyNmFiOWM3ZjNlMTIyNzM1NzY1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2UxOWY4MTRiMjllMzQ5MTI5Yzc4MjI0MjllNWMwZWZiID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzIxNTIxOTY3NDQzMjE2LC03NC4wMTA2ODMyODU1OTA4N10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8yNzU3NGM5MmQyYTM0NmEyOTcwNWU0MWVhYjA0MzNiNyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF84NDAyZGI0OGZlMGY0YzhhOWVmNjM1NjlmNjQ2ZWJiZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8yZTJlYmZjMTkyZTU0OWJkOThhMTJhMjNkM2M3NjQ0ZSA9ICQoJzxkaXYgaWQ9Imh0bWxfMmUyZWJmYzE5MmU1NDliZDk4YTEyYTIzZDNjNzY0NGUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlRyaWJlY2E8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzg0MDJkYjQ4ZmUwZjRjOGE5ZWY2MzU2OWY2NDZlYmJkLnNldENvbnRlbnQoaHRtbF8yZTJlYmZjMTkyZTU0OWJkOThhMTJhMjNkM2M3NjQ0ZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9lMTlmODE0YjI5ZTM0OTEyOWM3ODIyNDI5ZTVjMGVmYi5iaW5kUG9wdXAocG9wdXBfODQwMmRiNDhmZTBmNGM4YTllZjYzNTY5ZjY0NmViYmQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZGY3NWQ3MDUwYzRjNGNlMGE1NzRmM2M5ZjM4NzA1NGEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MTkzMjM3OTM5NTkwNywtNzMuOTk3MzA0NjcyMDgwNzNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMjc1NzRjOTJkMmEzNDZhMjk3MDVlNDFlYWIwNDMzYjcpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfN2FlODU3ODMzMDNjNDg5MDhmMDM5OTQyYjI4YWY1NGYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNzgzZDY0NWQ3MDU1NDZiNGI3OWM0Nzg3OWQ2ODViNjUgPSAkKCc8ZGl2IGlkPSJodG1sXzc4M2Q2NDVkNzA1NTQ2YjRiNzljNDc4NzlkNjg1YjY1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5MaXR0bGUgSXRhbHk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzdhZTg1NzgzMzAzYzQ4OTA4ZjAzOTk0MmIyOGFmNTRmLnNldENvbnRlbnQoaHRtbF83ODNkNjQ1ZDcwNTU0NmI0Yjc5YzQ3ODc5ZDY4NWI2NSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9kZjc1ZDcwNTBjNGM0Y2UwYTU3NGYzYzlmMzg3MDU0YS5iaW5kUG9wdXAocG9wdXBfN2FlODU3ODMzMDNjNDg5MDhmMDM5OTQyYjI4YWY1NGYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNmUwYzU4NGQ0MTI0NDA5ODk5MTUyOGU2YWVlMDc5YzAgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MjIxODM4NDEzMTc5NCwtNzQuMDAwNjU2NjY5NTk3NTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMjc1NzRjOTJkMmEzNDZhMjk3MDVlNDFlYWIwNDMzYjcpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZGIxOGU2MjE5NzFhNDNmNzlkMjBhM2FlMGEwNjdkMTMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfODA2M2M1OTRiZTg4NGE5ZGFjZDQ0MGYzZjljYzg4ODIgPSAkKCc8ZGl2IGlkPSJodG1sXzgwNjNjNTk0YmU4ODRhOWRhY2Q0NDBmM2Y5Y2M4ODgyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Tb2hvPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kYjE4ZTYyMTk3MWE0M2Y3OWQyMGEzYWUwYTA2N2QxMy5zZXRDb250ZW50KGh0bWxfODA2M2M1OTRiZTg4NGE5ZGFjZDQ0MGYzZjljYzg4ODIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNmUwYzU4NGQ0MTI0NDA5ODk5MTUyOGU2YWVlMDc5YzAuYmluZFBvcHVwKHBvcHVwX2RiMThlNjIxOTcxYTQzZjc5ZDIwYTNhZTBhMDY3ZDEzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2NlYTM1ZTRiMjgxNTRlYjJiMmNkYzlhNDMzM2Y1NTg2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzM0NDMzOTM1NzI0MzQsLTc0LjAwNjE3OTk4MTI2ODEyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzI3NTc0YzkyZDJhMzQ2YTI5NzA1ZTQxZWFiMDQzM2I3KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2IxMjE1Nzk2NjhkOTRiZjQ5NzVjZGIxMzdjOTMwMzViID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2ViMjVhMTE0ZTdhNjQ5YzE4NjNkODhmZWYxYjI0OTJmID0gJCgnPGRpdiBpZD0iaHRtbF9lYjI1YTExNGU3YTY0OWMxODYzZDg4ZmVmMWIyNDkyZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+V2VzdCBWaWxsYWdlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iMTIxNTc5NjY4ZDk0YmY0OTc1Y2RiMTM3YzkzMDM1Yi5zZXRDb250ZW50KGh0bWxfZWIyNWExMTRlN2E2NDljMTg2M2Q4OGZlZjFiMjQ5MmYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfY2VhMzVlNGIyODE1NGViMmIyY2RjOWE0MzMzZjU1ODYuYmluZFBvcHVwKHBvcHVwX2IxMjE1Nzk2NjhkOTRiZjQ5NzVjZGIxMzdjOTMwMzViKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2E4ZGI3MjRhODhmMzRlOGU4OTAzYjU4YjQyMTdiNTBkID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzk3MzA3MDQxNzAyODY1LC03My45NjQyODYxNzc0MDY1NV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8yNzU3NGM5MmQyYTM0NmEyOTcwNWU0MWVhYjA0MzNiNyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lMmNjZjE3ZTFkNTQ0N2E5OGU2NjhhNGEzZWZmZjRkYiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mY2MyYzNjMTJiODE0MmJhYmJmNDNlMDM5MzdmZTExOSA9ICQoJzxkaXYgaWQ9Imh0bWxfZmNjMmMzYzEyYjgxNDJiYWJiZjQzZTAzOTM3ZmUxMTkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk1hbmhhdHRhbiBWYWxsZXk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2UyY2NmMTdlMWQ1NDQ3YTk4ZTY2OGE0YTNlZmZmNGRiLnNldENvbnRlbnQoaHRtbF9mY2MyYzNjMTJiODE0MmJhYmJmNDNlMDM5MzdmZTExOSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9hOGRiNzI0YTg4ZjM0ZThlODkwM2I1OGI0MjE3YjUwZC5iaW5kUG9wdXAocG9wdXBfZTJjY2YxN2UxZDU0NDdhOThlNjY4YTRhM2VmZmY0ZGIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZjE0ZmIzM2U5OGQ5NDk1YjlkM2RjNWI4MDQ4MzFlNzkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44MDc5OTk3MzgxNjU4MjYsLTczLjk2Mzg5NjI3OTA1MzMyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzI3NTc0YzkyZDJhMzQ2YTI5NzA1ZTQxZWFiMDQzM2I3KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2M0NTYyMzI1ODhkNzQ4ZjA5MDY0NTllY2VjMWI4OGRlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2U1ZWZjZjQ5ODQ1ZTQ0MTU4YWY0MjlmZGQwZDcyMWMxID0gJCgnPGRpdiBpZD0iaHRtbF9lNWVmY2Y0OTg0NWU0NDE1OGFmNDI5ZmRkMGQ3MjFjMSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TW9ybmluZ3NpZGUgSGVpZ2h0czwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYzQ1NjIzMjU4OGQ3NDhmMDkwNjQ1OWVjZWMxYjg4ZGUuc2V0Q29udGVudChodG1sX2U1ZWZjZjQ5ODQ1ZTQ0MTU4YWY0MjlmZGQwZDcyMWMxKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2YxNGZiMzNlOThkOTQ5NWI5ZDNkYzViODA0ODMxZTc5LmJpbmRQb3B1cChwb3B1cF9jNDU2MjMyNTg4ZDc0OGYwOTA2NDU5ZWNlYzFiODhkZSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8wMGI2MWQ5ZDg2NTE0MzM3YTY1YWFiYThlOWU3NmQ0YSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjczNzIwOTgzMjcxNSwtNzMuOTgxMzc1OTQ4MzM1NDFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMjc1NzRjOTJkMmEzNDZhMjk3MDVlNDFlYWIwNDMzYjcpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYTZhMmE0OGU0NWVmNDBhN2E2MDI5ODE0Y2I0MDI1OGQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZjZjYjE2NGQ3MTE0NGQzM2IxMzQwOWRlZWVhN2NlZjkgPSAkKCc8ZGl2IGlkPSJodG1sX2Y2Y2IxNjRkNzExNDRkMzNiMTM0MDlkZWVlYTdjZWY5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5HcmFtZXJjeTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYTZhMmE0OGU0NWVmNDBhN2E2MDI5ODE0Y2I0MDI1OGQuc2V0Q29udGVudChodG1sX2Y2Y2IxNjRkNzExNDRkMzNiMTM0MDlkZWVlYTdjZWY5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzAwYjYxZDlkODY1MTQzMzdhNjVhYWJhOGU5ZTc2ZDRhLmJpbmRQb3B1cChwb3B1cF9hNmEyYTQ4ZTQ1ZWY0MGE3YTYwMjk4MTRjYjQwMjU4ZCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8zYzIxY2ZhZGU4MDQ0Y2ZjYTg2ODQ0ZjI0N2NiZWU5YyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjcxMTkzMTk4Mzk0NTY1LC03NC4wMTY4NjkzMDUwODYxN10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8yNzU3NGM5MmQyYTM0NmEyOTcwNWU0MWVhYjA0MzNiNyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xNjRlZmIyN2RiMTc0NzY4OTY2OWU1YmFiMzliODg3NyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hNzQ0ZjZlNTM5MjA0NmRjOWQ0MWNlZGJjMDVmMzZiYSA9ICQoJzxkaXYgaWQ9Imh0bWxfYTc0NGY2ZTUzOTIwNDZkYzlkNDFjZWRiYzA1ZjM2YmEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkJhdHRlcnkgUGFyayBDaXR5PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xNjRlZmIyN2RiMTc0NzY4OTY2OWU1YmFiMzliODg3Ny5zZXRDb250ZW50KGh0bWxfYTc0NGY2ZTUzOTIwNDZkYzlkNDFjZWRiYzA1ZjM2YmEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfM2MyMWNmYWRlODA0NGNmY2E4Njg0NGYyNDdjYmVlOWMuYmluZFBvcHVwKHBvcHVwXzE2NGVmYjI3ZGIxNzQ3Njg5NjY5ZTViYWIzOWI4ODc3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2YyNmM4YmU2YTFjZTRiNWE4NmYwM2QzMzRhZmM5ZThjID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzA3MTA3MTA3MjcwNDgsLTc0LjAxMDY2NTQ0NTIxMjddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMjc1NzRjOTJkMmEzNDZhMjk3MDVlNDFlYWIwNDMzYjcpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNDFlN2JiMDViYzBlNDkyZjhiYjVjYjExYjRhODcxMjcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfODg4Y2Q4MTZmMDM2NGIzY2E3MGUxYjBlMDc2NWIyZjYgPSAkKCc8ZGl2IGlkPSJodG1sXzg4OGNkODE2ZjAzNjRiM2NhNzBlMWIwZTA3NjViMmY2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5GaW5hbmNpYWwgRGlzdHJpY3Q8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzQxZTdiYjA1YmMwZTQ5MmY4YmI1Y2IxMWI0YTg3MTI3LnNldENvbnRlbnQoaHRtbF84ODhjZDgxNmYwMzY0YjNjYTcwZTFiMGUwNzY1YjJmNik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9mMjZjOGJlNmExY2U0YjVhODZmMDNkMzM0YWZjOWU4Yy5iaW5kUG9wdXAocG9wdXBfNDFlN2JiMDViYzBlNDkyZjhiYjVjYjExYjRhODcxMjcpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMzQzMWM3NmFhMmE3NDk5MThlMjA5ZWU0ZGY0NWJiOTEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43ODI2ODI1NjcxMjU3LC03My45NTMyNTY0NjgzNzExMl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8yNzU3NGM5MmQyYTM0NmEyOTcwNWU0MWVhYjA0MzNiNyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9jNDRiNDAxMTFmZmE0ZTEzOGEyOTgwYTI2YmZhODY1ZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82MmM2NTE3ZDZkZjA0NDcxOWFjNDk5ZmVmY2QzYjM4MyA9ICQoJzxkaXYgaWQ9Imh0bWxfNjJjNjUxN2Q2ZGYwNDQ3MTlhYzQ5OWZlZmNkM2IzODMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNhcm5lZ2llIEhpbGw8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2M0NGI0MDExMWZmYTRlMTM4YTI5ODBhMjZiZmE4NjVkLnNldENvbnRlbnQoaHRtbF82MmM2NTE3ZDZkZjA0NDcxOWFjNDk5ZmVmY2QzYjM4Myk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8zNDMxYzc2YWEyYTc0OTkxOGUyMDllZTRkZjQ1YmI5MS5iaW5kUG9wdXAocG9wdXBfYzQ0YjQwMTExZmZhNGUxMzhhMjk4MGEyNmJmYTg2NWQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNzM0OWQxMzliMmRmNDU4Yzk2NTcxNTcxNzA2OWIzZTIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MjMyNTkwMTg4NTc2OCwtNzMuOTg4NDMzNjgwMjM1OTddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMjc1NzRjOTJkMmEzNDZhMjk3MDVlNDFlYWIwNDMzYjcpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNWVjZGE1YjlmYTFlNDAwZGFjNjg4ZjlhOTMzMDRmN2YgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfY2QxOGZkNzNhNDMzNDY1Mzk0YjRjMDQ5ZDg3NmUzMDcgPSAkKCc8ZGl2IGlkPSJodG1sX2NkMThmZDczYTQzMzQ2NTM5NGI0YzA0OWQ4NzZlMzA3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Ob2hvPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81ZWNkYTViOWZhMWU0MDBkYWM2ODhmOWE5MzMwNGY3Zi5zZXRDb250ZW50KGh0bWxfY2QxOGZkNzNhNDMzNDY1Mzk0YjRjMDQ5ZDg3NmUzMDcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNzM0OWQxMzliMmRmNDU4Yzk2NTcxNTcxNzA2OWIzZTIuYmluZFBvcHVwKHBvcHVwXzVlY2RhNWI5ZmExZTQwMGRhYzY4OGY5YTkzMzA0ZjdmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzNhN2RjNjJhMWU4YzQ3NjdiN2NjZjg4YjVmMDY2NmViID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzE1MjI4OTIwNDYyODIsLTc0LjAwNTQxNTI5ODczMzU1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzI3NTc0YzkyZDJhMzQ2YTI5NzA1ZTQxZWFiMDQzM2I3KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzc5ZmY2MjljMjJjMDQ4NWZiNGFhZTEzZTEwY2IyNjQ5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzRjOWFjMzNiNjgyYjQxZjQ4MGNmYmRmOTc1Yjc2OGEwID0gJCgnPGRpdiBpZD0iaHRtbF80YzlhYzMzYjY4MmI0MWY0ODBjZmJkZjk3NWI3NjhhMCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q2l2aWMgQ2VudGVyPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83OWZmNjI5YzIyYzA0ODVmYjRhYWUxM2UxMGNiMjY0OS5zZXRDb250ZW50KGh0bWxfNGM5YWMzM2I2ODJiNDFmNDgwY2ZiZGY5NzViNzY4YTApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfM2E3ZGM2MmExZThjNDc2N2I3Y2NmODhiNWYwNjY2ZWIuYmluZFBvcHVwKHBvcHVwXzc5ZmY2MjljMjJjMDQ4NWZiNGFhZTEzZTEwY2IyNjQ5KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2FmYzFhMjI1YzdhYTQyZGI4ZWI0NWYwZWZkYzRlMGUwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzQ4NTA5NjY0MzEyMiwtNzMuOTg4NzEzMTMyODUyNDddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMjc1NzRjOTJkMmEzNDZhMjk3MDVlNDFlYWIwNDMzYjcpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMDY1NWM0ODlmYWFmNGU2YmI5MjEyNjkwMjkxODBhZTEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMTkxNmE5OGZhYzk4NGMwMDg1Y2I1ODQzMTQxZTBkOTIgPSAkKCc8ZGl2IGlkPSJodG1sXzE5MTZhOThmYWM5ODRjMDA4NWNiNTg0MzE0MWUwZDkyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NaWR0b3duIFNvdXRoPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wNjU1YzQ4OWZhYWY0ZTZiYjkyMTI2OTAyOTE4MGFlMS5zZXRDb250ZW50KGh0bWxfMTkxNmE5OGZhYzk4NGMwMDg1Y2I1ODQzMTQxZTBkOTIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYWZjMWEyMjVjN2FhNDJkYjhlYjQ1ZjBlZmRjNGUwZTAuYmluZFBvcHVwKHBvcHVwXzA2NTVjNDg5ZmFhZjRlNmJiOTIxMjY5MDI5MTgwYWUxKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzczYzAwNDc3MzYzNTQ3MjQ5OThmZGU5MDI1MTBjNzBjID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzYwMjgwMzMxMzEzNzQsLTczLjk2MzU1NjE0MDk0MzAzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzI3NTc0YzkyZDJhMzQ2YTI5NzA1ZTQxZWFiMDQzM2I3KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzE1YWVhM2QyN2QzMzQxOTNiYzgwNzYwZGZmY2ExNWEzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzYwOThlNjYzMWJiMTRlNzQ5MWIzNDkxOWM3ODZiNGE4ID0gJCgnPGRpdiBpZD0iaHRtbF82MDk4ZTY2MzFiYjE0ZTc0OTFiMzQ5MTljNzg2YjRhOCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U3V0dG9uIFBsYWNlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xNWFlYTNkMjdkMzM0MTkzYmM4MDc2MGRmZmNhMTVhMy5zZXRDb250ZW50KGh0bWxfNjA5OGU2NjMxYmIxNGU3NDkxYjM0OTE5Yzc4NmI0YTgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNzNjMDA0NzczNjM1NDcyNDk5OGZkZTkwMjUxMGM3MGMuYmluZFBvcHVwKHBvcHVwXzE1YWVhM2QyN2QzMzQxOTNiYzgwNzYwZGZmY2ExNWEzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzk1MGJiNGMxMzA3NDQzMDA5YTMxZTBlNjU3MDY0NWZhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzUyMDQyMzY5NTA3MjIsLTczLjk2NzcwODI0NTgxODM0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzI3NTc0YzkyZDJhMzQ2YTI5NzA1ZTQxZWFiMDQzM2I3KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2E2ZjIxM2ZjMzRkODRhZTRiYTZiNmFkYTk3NWEyY2Y2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzQ3NTExZjJjOTRmYzQxYzY5N2UyNTJkOGIxNGU5MzlkID0gJCgnPGRpdiBpZD0iaHRtbF80NzUxMWYyYzk0ZmM0MWM2OTdlMjUyZDhiMTRlOTM5ZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+VHVydGxlIEJheTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYTZmMjEzZmMzNGQ4NGFlNGJhNmI2YWRhOTc1YTJjZjYuc2V0Q29udGVudChodG1sXzQ3NTExZjJjOTRmYzQxYzY5N2UyNTJkOGIxNGU5MzlkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzk1MGJiNGMxMzA3NDQzMDA5YTMxZTBlNjU3MDY0NWZhLmJpbmRQb3B1cChwb3B1cF9hNmYyMTNmYzM0ZDg0YWU0YmE2YjZhZGE5NzVhMmNmNik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81MTRmMzk4ZGIzMzg0NmY2YjNmZWNmMTU3MTRiMTk4NyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc0NjkxNzQxMDc0MDE5NSwtNzMuOTcxMjE5Mjg3MjIyNjVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMjc1NzRjOTJkMmEzNDZhMjk3MDVlNDFlYWIwNDMzYjcpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYWQ5MzMzMmVmYmJkNDhmMTk2NDc4MTkyN2I5YmZjYzggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMmU2OWRlMmVlYTEwNDNkMzljNTcyZDg2NzQ4ZTEwYjUgPSAkKCc8ZGl2IGlkPSJodG1sXzJlNjlkZTJlZWExMDQzZDM5YzU3MmQ4Njc0OGUxMGI1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5UdWRvciBDaXR5PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hZDkzMzMyZWZiYmQ0OGYxOTY0NzgxOTI3YjliZmNjOC5zZXRDb250ZW50KGh0bWxfMmU2OWRlMmVlYTEwNDNkMzljNTcyZDg2NzQ4ZTEwYjUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNTE0ZjM5OGRiMzM4NDZmNmIzZmVjZjE1NzE0YjE5ODcuYmluZFBvcHVwKHBvcHVwX2FkOTMzMzJlZmJiZDQ4ZjE5NjQ3ODE5MjdiOWJmY2M4KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzY0MGNmZDI5Mzk0NTQ4OGVhM2ZmNzRmNWQ4YzcwZmJjID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzMwOTk5NTU0NzcwNjEsLTczLjk3NDA1MTcwNDY5MjAzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzI3NTc0YzkyZDJhMzQ2YTI5NzA1ZTQxZWFiMDQzM2I3KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzU5NzhhY2QwZjQwZTRiYjJhMDMxZWFjNmEyMGFhOTQ2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzAwMTg2MTU2N2M0YjQ0MmU4YzQyOWZkMGEyZDVkZTExID0gJCgnPGRpdiBpZD0iaHRtbF8wMDE4NjE1NjdjNGI0NDJlOGM0MjlmZDBhMmQ1ZGUxMSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U3R1eXZlc2FudCBUb3duPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81OTc4YWNkMGY0MGU0YmIyYTAzMWVhYzZhMjBhYTk0Ni5zZXRDb250ZW50KGh0bWxfMDAxODYxNTY3YzRiNDQyZThjNDI5ZmQwYTJkNWRlMTEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNjQwY2ZkMjkzOTQ1NDg4ZWEzZmY3NGY1ZDhjNzBmYmMuYmluZFBvcHVwKHBvcHVwXzU5NzhhY2QwZjQwZTRiYjJhMDMxZWFjNmEyMGFhOTQ2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2Y3NjkyNjc0NDU4NzQ4NWRiZjg0ODY3NzE4ZTgyZmYyID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzM5NjczMDQ3NjM4NDI2LC03My45OTA5NDcxMDUyODI2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzI3NTc0YzkyZDJhMzQ2YTI5NzA1ZTQxZWFiMDQzM2I3KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzVmNjBkMDNiN2E5MzRmMzViNmZkOTNlMWNjYjY4NDY2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2Q1ODhhOTMzNjhjYjRmMDhiZmFjMzU4Njc4YzgwMGJjID0gJCgnPGRpdiBpZD0iaHRtbF9kNTg4YTkzMzY4Y2I0ZjA4YmZhYzM1ODY3OGM4MDBiYyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RmxhdGlyb248L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzVmNjBkMDNiN2E5MzRmMzViNmZkOTNlMWNjYjY4NDY2LnNldENvbnRlbnQoaHRtbF9kNTg4YTkzMzY4Y2I0ZjA4YmZhYzM1ODY3OGM4MDBiYyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9mNzY5MjY3NDQ1ODc0ODVkYmY4NDg2NzcxOGU4MmZmMi5iaW5kUG9wdXAocG9wdXBfNWY2MGQwM2I3YTkzNGYzNWI2ZmQ5M2UxY2NiNjg0NjYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYjdjZDc1MmNhOTRiNDJjOTk0NmE5NWM2MGZkMDEyMjggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NTY2NTgwODIyNzUxOSwtNzQuMDAwMTExMzYyMDI2MzddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMjc1NzRjOTJkMmEzNDZhMjk3MDVlNDFlYWIwNDMzYjcpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZjRmMGRlYTYwMDI5NDRjMjk0OWZkOWYxM2FjNGY5NDggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZGUzN2NhYzJhNzFiNGMxNTk5YTQ2YzI5ZjQ4NGY0ODYgPSAkKCc8ZGl2IGlkPSJodG1sX2RlMzdjYWMyYTcxYjRjMTU5OWE0NmMyOWY0ODRmNDg2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5IdWRzb24gWWFyZHM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2Y0ZjBkZWE2MDAyOTQ0YzI5NDlmZDlmMTNhYzRmOTQ4LnNldENvbnRlbnQoaHRtbF9kZTM3Y2FjMmE3MWI0YzE1OTlhNDZjMjlmNDg0ZjQ4Nik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9iN2NkNzUyY2E5NGI0MmM5OTQ2YTk1YzYwZmQwMTIyOC5iaW5kUG9wdXAocG9wdXBfZjRmMGRlYTYwMDI5NDRjMjk0OWZkOWYxM2FjNGY5NDgpOwoKICAgICAgICAgICAgCiAgICAgICAgCjwvc2NyaXB0Pg==\" style=\"position:absolute;width:100%;height:100%;left:0;top:0;border:none !important;\" allowfullscreen webkitallowfullscreen mozallowfullscreen></iframe></div></div>"
],
"text/plain": [
"<folium.folium.Map at 0x7fcec8db2ba8>"
]
},
"execution_count": 18,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# create map of Manhattan using latitude and longitude values\n",
"map_manhattan = folium.Map(location=[latitude, longitude], zoom_start=11)\n",
"\n",
"# add markers to map\n",
"for lat, lng, label in zip(manhattan_data['Latitude'], manhattan_data['Longitude'], manhattan_data['Neighborhood']):\n",
" label = folium.Popup(label, parse_html=True)\n",
" folium.CircleMarker(\n",
" [lat, lng],\n",
" radius=5,\n",
" popup=label,\n",
" color='blue',\n",
" fill=True,\n",
" fill_color='#3186cc',\n",
" fill_opacity=0.7,\n",
" parse_html=False).add_to(map_manhattan) \n",
" \n",
"map_manhattan"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Next, we are going to start utilizing the Foursquare API to explore the neighborhoods and segment them."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Define Foursquare Credentials and Version"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {
"collapsed": false,
"jupyter": {
"outputs_hidden": false
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Your credentails:\n",
"CLIENT_ID: HKB1ULVBQPKLEH30AUOZ2V2I4YXF5EDOL1WIWT0EMECCQ1CW\n",
"CLIENT_SECRET:FFIUIMUUBC42AIDQ5UG4OYH54234PDCT4OANAHB1SNCJE0HB\n"
]
}
],
"source": [
"CLIENT_ID = 'HKB1ULVBQPKLEH30AUOZ2V2I4YXF5EDOL1WIWT0EMECCQ1CW' # your Foursquare ID\n",
"CLIENT_SECRET = 'FFIUIMUUBC42AIDQ5UG4OYH54234PDCT4OANAHB1SNCJE0HB' # your Foursquare Secret\n",
"VERSION = '20180605' # Foursquare API version\n",
"\n",
"print('Your credentails:')\n",
"print('CLIENT_ID: ' + CLIENT_ID)\n",
"print('CLIENT_SECRET:' + CLIENT_SECRET)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Let's explore the first neighborhood in our dataframe."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Get the neighborhood's name."
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {
"collapsed": false,
"jupyter": {
"outputs_hidden": false
}
},
"outputs": [
{
"data": {
"text/plain": [
"'Marble Hill'"
]
},
"execution_count": 20,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"manhattan_data.loc[0, 'Neighborhood']"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Get the neighborhood's latitude and longitude values."
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {
"collapsed": false,
"jupyter": {
"outputs_hidden": false
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Latitude and longitude values of Marble Hill are 40.87655077879964, -73.91065965862981.\n"
]
}
],
"source": [
"neighborhood_latitude = manhattan_data.loc[0, 'Latitude'] # neighborhood latitude value\n",
"neighborhood_longitude = manhattan_data.loc[0, 'Longitude'] # neighborhood longitude value\n",
"\n",
"neighborhood_name = manhattan_data.loc[0, 'Neighborhood'] # neighborhood name\n",
"\n",
"print('Latitude and longitude values of {} are {}, {}.'.format(neighborhood_name, \n",
" neighborhood_latitude, \n",
" neighborhood_longitude))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Now, let's get the top 100 venues that are in Marble Hill within a radius of 500 meters."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"First, let's create the GET request URL. Name your URL **url**."
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {
"collapsed": false,
"jupyter": {
"outputs_hidden": false
},
"scrolled": true
},
"outputs": [
{
"data": {
"text/plain": [
"'https://api.foursquare.com/v2/venues/search?client_id=HKB1ULVBQPKLEH30AUOZ2V2I4YXF5EDOL1WIWT0EMECCQ1CW &client_secret=FFIUIMUUBC42AIDQ5UG4OYH54234PDCT4OANAHB1SNCJE0HB&ll=40.87655077879964,-73.91065965862981&v=20180605&query=Marble Hill&radius=500 &limit=100'"
]
},
"execution_count": 24,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Searching for Marble Hill\n",
"search_query = 'Marble Hill'\n",
"radius = 500\n",
"LIMIT = 100\n",
"\n",
"url = 'https://api.foursquare.com/v2/venues/search?client_id={} \\\n",
" &client_secret={}&ll={},{}&v={}&query={}&radius={} \\\n",
" &limit={}'.format(CLIENT_ID, \n",
" CLIENT_SECRET, \n",
" neighborhood_latitude, \n",
" neighborhood_longitude, \n",
" VERSION, \n",
" search_query, \n",
" radius, LIMIT)\n",
"url"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Double-click __here__ for the solution.\n",
"<!-- The correct answer is:\n",
"LIMIT = 100 # limit of number of venues returned by Foursquare API\n",
"-->\n",
"\n",
"<!--\n",
"radius = 500 # define radius\n",
"-->\n",
"\n",
"<!--\n",
"\\\\ # create URL\n",
"url = 'https://api.foursquare.com/v2/venues/explore?&client_id={}&client_secret={}&v={}&ll={},{}&radius={}&limit={}'.format(\n",
" CLIENT_ID, \n",
" CLIENT_SECRET, \n",
" VERSION, \n",
" neighborhood_latitude, \n",
" neighborhood_longitude, \n",
" radius, \n",
" LIMIT)\n",
"url # display URL\n",
"--> "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Send the GET request and examine the resutls"
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {
"collapsed": false,
"jupyter": {
"outputs_hidden": false
}
},
"outputs": [
{
"data": {
"text/plain": [
"{'meta': {'code': 200, 'requestId': '5d2b4a14e8f92800234a267e'},\n",
" 'response': {'venues': [{'id': '4b5e0e1ff964a520357b29e3',\n",
" 'name': 'Metro North - Marble Hill Train Station',\n",
" 'location': {'address': '1 West 225th St',\n",
" 'lat': 40.87469809860372,\n",
" 'lng': -73.91205168105456,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.87469809860372,\n",
" 'lng': -73.91205168105456}],\n",
" 'distance': 237,\n",
" 'postalCode': '10463',\n",
" 'cc': 'US',\n",
" 'city': 'New York',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['1 West 225th St',\n",
" 'New York, NY 10463',\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",
" 'referralId': 'v-1563118100',\n",
" 'hasPerk': False},\n",
" {'id': '4ae5a028f964a52022a121e3',\n",
" 'name': 'MTA Subway - 225th St/Marble Hill (1)',\n",
" 'location': {'address': 'W 225th St',\n",
" 'crossStreet': 'Broadway',\n",
" 'lat': 40.874486,\n",
" 'lng': -73.909589,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.874486,\n",
" 'lng': -73.909589}],\n",
" 'distance': 246,\n",
" 'postalCode': '10468',\n",
" 'cc': 'US',\n",
" 'city': 'New York',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['W 225th St (Broadway)',\n",
" 'New York, NY 10468',\n",
" 'United States']},\n",
" 'categories': [{'id': '4bf58dd8d48988d1fd931735',\n",
" 'name': 'Metro Station',\n",
" 'pluralName': 'Metro Stations',\n",
" 'shortName': 'Metro',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/travel/subway_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'referralId': 'v-1563118100',\n",
" 'hasPerk': False},\n",
" {'id': '4eaa78cc4fc6d0cb8bbabcda',\n",
" 'name': 'Marble Hill',\n",
" 'location': {'lat': 40.876111,\n",
" 'lng': -73.911111,\n",
" 'distance': 61,\n",
" 'postalCode': '10463',\n",
" 'cc': 'US',\n",
" 'city': 'New York',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['New York, NY 10463', 'United States']},\n",
" 'categories': [{'id': '4f2a25ac4b909258e854f55f',\n",
" 'name': 'Neighborhood',\n",
" 'pluralName': 'Neighborhoods',\n",
" 'shortName': 'Neighborhood',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/parks_outdoors/neighborhood_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'referralId': 'v-1563118100',\n",
" 'hasPerk': False},\n",
" {'id': '4cdf44123644a0932b8a519f',\n",
" 'name': 'NYCHA - Marble Hill Houses',\n",
" 'location': {'address': '5210 Broadway',\n",
" 'crossStreet': 'btwn W 225th St. & W 230th St.',\n",
" 'lat': 40.87549595293565,\n",
" 'lng': -73.90682082886778,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.87549595293565,\n",
" 'lng': -73.90682082886778}],\n",
" 'distance': 343,\n",
" 'postalCode': '10463',\n",
" 'cc': 'US',\n",
" 'city': 'Bronx',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['5210 Broadway (btwn W 225th St. & W 230th St.)',\n",
" 'Bronx, NY 10463',\n",
" 'United States']},\n",
" 'categories': [{'id': '4f2a210c4b9023bd5841ed28',\n",
" 'name': 'Housing Development',\n",
" 'pluralName': 'Housing Developments',\n",
" 'shortName': 'Housing Development',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/building/housingdevelopment_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'referralId': 'v-1563118100',\n",
" 'hasPerk': False},\n",
" {'id': '4c499026fbafc92834fd12db',\n",
" 'name': 'NYCHA - Marble Hill Community Center',\n",
" 'location': {'address': '5365 Broadway',\n",
" 'crossStreet': 'at W 230th St.',\n",
" 'lat': 40.87713528267983,\n",
" 'lng': -73.90806096859365,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.87713528267983,\n",
" 'lng': -73.90806096859365}],\n",
" 'distance': 228,\n",
" 'postalCode': '10463',\n",
" 'cc': 'US',\n",
" 'city': 'Bronx',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['5365 Broadway (at W 230th St.)',\n",
" 'Bronx, NY 10463',\n",
" 'United States']},\n",
" 'categories': [{'id': '4f2a210c4b9023bd5841ed28',\n",
" 'name': 'Housing Development',\n",
" 'pluralName': 'Housing Developments',\n",
" 'shortName': 'Housing Development',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/building/housingdevelopment_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'referralId': 'v-1563118100',\n",
" 'hasPerk': False},\n",
" {'id': '4e682cba6365d0e7120d32c7',\n",
" 'name': 'Marble Hill Dental Office',\n",
" 'location': {'address': '112 W 228th St',\n",
" 'lat': 40.875783452897316,\n",
" 'lng': -73.90836596488953,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.875783452897316,\n",
" 'lng': -73.90836596488953}],\n",
" 'distance': 211,\n",
" 'postalCode': '10463',\n",
" 'cc': 'US',\n",
" 'city': 'Bronx',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['112 W 228th St',\n",
" 'Bronx, NY 10463',\n",
" 'United States']},\n",
" 'categories': [{'id': '4bf58dd8d48988d178941735',\n",
" 'name': \"Dentist's Office\",\n",
" 'pluralName': \"Dentist's Offices\",\n",
" 'shortName': \"Dentist's Office\",\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/building/medical_dentist_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'referralId': 'v-1563118100',\n",
" 'hasPerk': False},\n",
" {'id': '512901b5e4b0ce6661fefdc1',\n",
" 'name': 'Marble Hill Unisex',\n",
" 'location': {'lat': 40.87738929799393,\n",
" 'lng': -73.90928264388714,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.87738929799393,\n",
" 'lng': -73.90928264388714}],\n",
" 'distance': 148,\n",
" 'postalCode': '10463',\n",
" 'cc': 'US',\n",
" 'city': 'Bronx',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['Bronx, NY 10463', 'United States']},\n",
" 'categories': [{'id': '4bf58dd8d48988d110951735',\n",
" 'name': 'Salon / Barbershop',\n",
" 'pluralName': 'Salons / Barbershops',\n",
" 'shortName': 'Salon / Barbershop',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/shops/salon_barber_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'referralId': 'v-1563118100',\n",
" 'hasPerk': False},\n",
" {'id': '4beec105e24d20a12c4b7314',\n",
" 'name': 'Marble Hill Playground',\n",
" 'location': {'lat': 40.877765307311414,\n",
" 'lng': -73.90799442086168,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.877765307311414,\n",
" 'lng': -73.90799442086168}],\n",
" 'distance': 261,\n",
" 'postalCode': '10463',\n",
" 'cc': 'US',\n",
" 'city': 'New York',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['New York, NY 10463', '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",
" 'referralId': 'v-1563118100',\n",
" 'hasPerk': False},\n",
" {'id': '572ba48f498e3a5e175667e3',\n",
" 'name': 'marble hill pharmacy',\n",
" 'location': {'lat': 40.87505,\n",
" 'lng': -73.909195,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.87505,\n",
" 'lng': -73.909195}],\n",
" 'distance': 207,\n",
" 'cc': 'US',\n",
" 'city': 'New York',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['New York, NY', 'United States']},\n",
" 'categories': [{'id': '4bf58dd8d48988d10f951735',\n",
" 'name': 'Pharmacy',\n",
" 'pluralName': 'Pharmacies',\n",
" 'shortName': 'Pharmacy',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/shops/pharmacy_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'referralId': 'v-1563118100',\n",
" 'hasPerk': False},\n",
" {'id': '4b4dd37bf964a520a8d826e3',\n",
" 'name': 'marble hill high school',\n",
" 'location': {'address': 'Jfk campus',\n",
" 'lat': 40.87741409080763,\n",
" 'lng': -73.91259659757611,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.87741409080763,\n",
" 'lng': -73.91259659757611}],\n",
" 'distance': 189,\n",
" 'cc': 'US',\n",
" 'state': 'New York',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['Jfk campus', 'New York', 'United States']},\n",
" 'categories': [{'id': '4bf58dd8d48988d13d941735',\n",
" 'name': 'High School',\n",
" 'pluralName': 'High Schools',\n",
" 'shortName': 'High School',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/building/school_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'referralId': 'v-1563118100',\n",
" 'hasPerk': False},\n",
" {'id': '4e579b58e4cd6acbd75d9c97',\n",
" 'name': 'Montefiore Medical Group-Marble Hill',\n",
" 'location': {'address': '5525 Broadway',\n",
" 'lat': 40.87751530175834,\n",
" 'lng': -73.90584478742304,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.87751530175834,\n",
" 'lng': -73.90584478742304}],\n",
" 'distance': 419,\n",
" 'postalCode': '10463',\n",
" 'cc': 'US',\n",
" 'city': 'Bronx',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['5525 Broadway',\n",
" 'Bronx, NY 10463',\n",
" 'United States']},\n",
" 'categories': [{'id': '4bf58dd8d48988d177941735',\n",
" 'name': \"Doctor's Office\",\n",
" 'pluralName': \"Doctor's Offices\",\n",
" 'shortName': \"Doctor's Office\",\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/building/medical_doctorsoffice_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'referralId': 'v-1563118100',\n",
" 'hasPerk': False},\n",
" {'id': '4ab3ef56f964a5202f6f20e3',\n",
" 'name': 'Marble Hill Nursery School',\n",
" 'location': {'address': '5470 Broadway',\n",
" 'lat': 40.8760280207113,\n",
" 'lng': -73.90694139835414,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.8760280207113,\n",
" 'lng': -73.90694139835414}],\n",
" 'distance': 318,\n",
" 'cc': 'US',\n",
" 'city': 'New York',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['5470 Broadway', 'New York, NY', 'United States']},\n",
" 'categories': [{'id': '4f4533814b9074f6e4fb0107',\n",
" 'name': 'Nursery School',\n",
" 'pluralName': 'Nursery Schools',\n",
" 'shortName': 'Nursery School',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/building/school_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'referralId': 'v-1563118100',\n",
" 'hasPerk': False},\n",
" {'id': '4ffb3492e0e262ad0fa416a8',\n",
" 'name': 'Marble Hill Youthmarket',\n",
" 'location': {'address': 'Broadway',\n",
" 'crossStreet': '225th St.',\n",
" 'lat': 40.87451892105627,\n",
" 'lng': -73.91039371490479,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.87451892105627,\n",
" 'lng': -73.91039371490479}],\n",
" 'distance': 227,\n",
" 'postalCode': '10463',\n",
" 'cc': 'US',\n",
" 'city': 'Bronx',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['Broadway (225th St.)',\n",
" 'Bronx, NY 10463',\n",
" 'United States']},\n",
" 'categories': [{'id': '4bf58dd8d48988d1fa941735',\n",
" 'name': 'Farmers Market',\n",
" 'pluralName': 'Farmers Markets',\n",
" 'shortName': \"Farmer's Market\",\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/shops/food_farmersmarket_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'referralId': 'v-1563118100',\n",
" 'hasPerk': False},\n",
" {'id': '5286c239498eae124d35e3bc',\n",
" 'name': 'marble hill@ Antoinette house',\n",
" 'location': {'address': '5240 Broadway',\n",
" 'lat': 40.87506103515625,\n",
" 'lng': -73.90840148925781,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.87506103515625,\n",
" 'lng': -73.90840148925781}],\n",
" 'distance': 252,\n",
" 'cc': 'US',\n",
" 'city': 'New York',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['5240 Broadway', 'New York, NY', 'United States']},\n",
" 'categories': [{'id': '4f2a210c4b9023bd5841ed28',\n",
" 'name': 'Housing Development',\n",
" 'pluralName': 'Housing Developments',\n",
" 'shortName': 'Housing Development',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/building/housingdevelopment_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'referralId': 'v-1563118100',\n",
" 'hasPerk': False},\n",
" {'id': '4c2402bfb7b8a5932cde3be8',\n",
" 'name': 'Marble Hill Liquors',\n",
" 'location': {'address': '5203 Broadway',\n",
" 'lat': 40.877048325000004,\n",
" 'lng': -73.90694665000001,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.877048325000004,\n",
" 'lng': -73.90694665000001}],\n",
" 'distance': 317,\n",
" 'postalCode': '10463',\n",
" 'cc': 'US',\n",
" 'city': 'New York',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['5203 Broadway',\n",
" 'New York, NY 10463',\n",
" 'United States']},\n",
" 'categories': [{'id': '4bf58dd8d48988d186941735',\n",
" 'name': 'Liquor Store',\n",
" 'pluralName': 'Liquor Stores',\n",
" 'shortName': 'Liquor Store',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/shops/food_liquor_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'referralId': 'v-1563118100',\n",
" 'hasPerk': False},\n",
" {'id': '53e28562498e23caea4617ce',\n",
" 'name': 'Orange Park, Marble Hill, Bronx, NY',\n",
" 'location': {'lat': 40.877986,\n",
" 'lng': -73.908028,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.877986,\n",
" 'lng': -73.908028}],\n",
" 'distance': 273,\n",
" 'cc': 'US',\n",
" 'city': 'New York',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['New York, NY', '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",
" 'referralId': 'v-1563118100',\n",
" 'hasPerk': False},\n",
" {'id': '4e16e76f7d8b69590f4638f6',\n",
" 'name': 'Marble Hill Houses Garden',\n",
" 'location': {'address': 'In front of 69w. 225th street',\n",
" 'lat': 40.8738564,\n",
" 'lng': -73.9080393,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.8738564,\n",
" 'lng': -73.9080393}],\n",
" 'distance': 372,\n",
" 'postalCode': '10463',\n",
" 'cc': 'US',\n",
" 'city': 'Bronx',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['In front of 69w. 225th street',\n",
" 'Bronx, NY 10463',\n",
" 'United States']},\n",
" 'categories': [{'id': '4bf58dd8d48988d1e5941735',\n",
" 'name': 'Dog Run',\n",
" 'pluralName': 'Dog Runs',\n",
" 'shortName': 'Dog Run',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/parks_outdoors/dogrun_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'referralId': 'v-1563118100',\n",
" 'hasPerk': False},\n",
" {'id': '4fa77994754a1bcf20f3e633',\n",
" 'name': 'MTA MaBSTOA Bus at W. 225th Street & Broadway (US Route 9): (Bx7, Bx9, Bx20)',\n",
" 'location': {'address': '225th Street',\n",
" 'crossStreet': 'Broadway',\n",
" 'lat': 40.87431795831848,\n",
" 'lng': -73.90929733101088,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.87431795831848,\n",
" 'lng': -73.90929733101088}],\n",
" 'distance': 273,\n",
" 'postalCode': '10463',\n",
" 'cc': 'US',\n",
" 'city': 'Bronx',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['225th Street (Broadway)',\n",
" 'Bronx, NY 10463',\n",
" '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",
" 'referralId': 'v-1563118100',\n",
" 'hasPerk': False},\n",
" {'id': '4be751dabcef2d7f202a06e5',\n",
" 'name': 'West 225th Street',\n",
" 'location': {'address': 'W 225th St',\n",
" 'lat': 40.87362907114855,\n",
" 'lng': -73.90792204481363,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.87362907114855,\n",
" 'lng': -73.90792204481363}],\n",
" 'distance': 398,\n",
" 'postalCode': '10463',\n",
" 'cc': 'US',\n",
" 'city': 'Bronx',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['W 225th St', 'Bronx, NY 10463', 'United States']},\n",
" 'categories': [{'id': '4bf58dd8d48988d1f9931735',\n",
" 'name': 'Road',\n",
" 'pluralName': 'Roads',\n",
" 'shortName': 'Road',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/travel/highway_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'referralId': 'v-1563118100',\n",
" 'hasPerk': False},\n",
" {'id': '4c28a1d1ce3fc9289d686d88',\n",
" 'name': '108 Marblehill',\n",
" 'location': {'address': '108 W 227th St',\n",
" 'crossStreet': 'Marble Hill Avenue',\n",
" 'lat': 40.876604529689956,\n",
" 'lng': -73.90942990932098,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.876604529689956,\n",
" 'lng': -73.90942990932098}],\n",
" 'distance': 103,\n",
" 'postalCode': '10463',\n",
" 'cc': 'US',\n",
" 'city': 'Bronx',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['108 W 227th St (Marble Hill Avenue)',\n",
" 'Bronx, NY 10463',\n",
" 'United States']},\n",
" 'categories': [{'id': '4f2a210c4b9023bd5841ed28',\n",
" 'name': 'Housing Development',\n",
" 'pluralName': 'Housing Developments',\n",
" 'shortName': 'Housing Development',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/building/housingdevelopment_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'referralId': 'v-1563118100',\n",
" 'hasPerk': False},\n",
" {'id': '50f9cecce4b0aa46a9995242',\n",
" 'name': 'Marbel Hill Community Center',\n",
" 'location': {'lat': 40.876231,\n",
" 'lng': -73.907805,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.876231,\n",
" 'lng': -73.907805}],\n",
" 'distance': 242,\n",
" 'postalCode': '10463',\n",
" 'cc': 'US',\n",
" 'city': 'Bronx',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['Bronx, NY 10463', 'United States']},\n",
" 'categories': [{'id': '50328a8e91d4c4b30a586d6c',\n",
" 'name': 'Non-Profit',\n",
" 'pluralName': 'Non-Profits',\n",
" 'shortName': 'Non-Profit',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/building/default_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'referralId': 'v-1563118100',\n",
" 'hasPerk': False},\n",
" {'id': '4e49811bae6014a2fdc6ea23',\n",
" 'name': 'Robert E Hill Inc Real Estate',\n",
" 'location': {'lat': 40.880836480755505,\n",
" 'lng': -73.9085030535321,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.880836480755505,\n",
" 'lng': -73.9085030535321}],\n",
" 'distance': 510,\n",
" 'cc': 'US',\n",
" 'state': 'New York',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['New York', 'United States']},\n",
" 'categories': [{'id': '4bf58dd8d48988d124941735',\n",
" 'name': 'Office',\n",
" 'pluralName': 'Offices',\n",
" 'shortName': 'Office',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/building/default_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'referralId': 'v-1563118100',\n",
" 'hasPerk': False}]}}"
]
},
"execution_count": 25,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"results = requests.get(url).json()\n",
"results"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"From the Foursquare lab in the previous module, we know that all the information is in the *items* key. Before we proceed, let's borrow the **get_category_type** function from the Foursquare lab."
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {},
"outputs": [],
"source": [
"# function that extracts the category of the venue\n",
"def get_category_type(row):\n",
" try:\n",
" categories_list = row['categories']\n",
" except:\n",
" categories_list = row['venue.categories']\n",
" \n",
" if len(categories_list) == 0:\n",
" return None\n",
" else:\n",
" return categories_list[0]['name']"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now we are ready to clean the json and structure it into a *pandas* dataframe."
]
},
{
"cell_type": "code",
"execution_count": 44,
"metadata": {
"collapsed": false,
"jupyter": {
"outputs_hidden": false
}
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>name</th>\n",
" <th>categories</th>\n",
" <th>lat</th>\n",
" <th>lng</th>\n",
" <th>categories</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Metro North - Marble Hill Train Station</td>\n",
" <td>[{'id': '4bf58dd8d48988d129951735', 'name': 'T...</td>\n",
" <td>40.874698</td>\n",
" <td>-73.912052</td>\n",
" <td>Train Station</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>MTA Subway - 225th St/Marble Hill (1)</td>\n",
" <td>[{'id': '4bf58dd8d48988d1fd931735', 'name': 'M...</td>\n",
" <td>40.874486</td>\n",
" <td>-73.909589</td>\n",
" <td>Metro Station</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>Marble Hill</td>\n",
" <td>[{'id': '4f2a25ac4b909258e854f55f', 'name': 'N...</td>\n",
" <td>40.876111</td>\n",
" <td>-73.911111</td>\n",
" <td>Neighborhood</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>NYCHA - Marble Hill Houses</td>\n",
" <td>[{'id': '4f2a210c4b9023bd5841ed28', 'name': 'H...</td>\n",
" <td>40.875496</td>\n",
" <td>-73.906821</td>\n",
" <td>Housing Development</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>NYCHA - Marble Hill Community Center</td>\n",
" <td>[{'id': '4f2a210c4b9023bd5841ed28', 'name': 'H...</td>\n",
" <td>40.877135</td>\n",
" <td>-73.908061</td>\n",
" <td>Housing Development</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" name \\\n",
"0 Metro North - Marble Hill Train Station \n",
"1 MTA Subway - 225th St/Marble Hill (1) \n",
"2 Marble Hill \n",
"3 NYCHA - Marble Hill Houses \n",
"4 NYCHA - Marble Hill Community Center \n",
"\n",
" categories lat lng \\\n",
"0 [{'id': '4bf58dd8d48988d129951735', 'name': 'T... 40.874698 -73.912052 \n",
"1 [{'id': '4bf58dd8d48988d1fd931735', 'name': 'M... 40.874486 -73.909589 \n",
"2 [{'id': '4f2a25ac4b909258e854f55f', 'name': 'N... 40.876111 -73.911111 \n",
"3 [{'id': '4f2a210c4b9023bd5841ed28', 'name': 'H... 40.875496 -73.906821 \n",
"4 [{'id': '4f2a210c4b9023bd5841ed28', 'name': 'H... 40.877135 -73.908061 \n",
"\n",
" categories \n",
"0 Train Station \n",
"1 Metro Station \n",
"2 Neighborhood \n",
"3 Housing Development \n",
"4 Housing Development "
]
},
"execution_count": 44,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"venues = results['response']['venues']\n",
"\n",
"nearby_venues = json_normalize(venues) # flatten JSON\n",
"\n",
"# filter columns\n",
"filtered_columns = ['name', 'categories', 'location.lat', 'location.lng']\n",
"nearby_venues = nearby_venues.loc[:, filtered_columns]\n",
"\n",
"# filter the category for each row\n",
"nearby_venues['venues.categories'] = nearby_venues.apply(get_category_type, axis=1)\n",
"\n",
"# clean columns\n",
"nearby_venues.columns = [col.split(\".\")[-1] for col in nearby_venues.columns]\n",
"\n",
"nearby_venues.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"And how many venues were returned by Foursquare?"
]
},
{
"cell_type": "code",
"execution_count": 45,
"metadata": {
"collapsed": false,
"jupyter": {
"outputs_hidden": false
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"22 venues were returned by Foursquare.\n"
]
}
],
"source": [
"print('{} venues were returned by Foursquare.'.format(nearby_venues.shape[0]))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<a id='item2'></a>"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 2. Explore Neighborhoods in Manhattan"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Let's create a function to repeat the same process to all the neighborhoods in Manhattan"
]
},
{
"cell_type": "code",
"execution_count": 89,
"metadata": {},
"outputs": [],
"source": [
"def getNearbyVenues(names, latitudes, longitudes, radius=500):\n",
" \n",
" venues_list=[]\n",
" for name, lat, lng in zip(names, latitudes, longitudes):\n",
" print(name)\n",
" \n",
" # create the API request URL\n",
" url = 'https://api.foursquare.com/v2/venues/explore?&client_id={}&client_secret={}&v={}&ll={},{}&radius={}&limit={}'.format(\n",
" CLIENT_ID, \n",
" CLIENT_SECRET, \n",
" VERSION, \n",
" lat, \n",
" lng, \n",
" radius, \n",
" LIMIT)\n",
" \n",
" # make the GET request\n",
" results = requests.get(url).json()['response']['groups'][0]['items']\n",
" \n",
" # return only relevant information for each nearby venue\n",
" venues_list.append([(\n",
" name, \n",
" lat, \n",
" lng, \n",
" v['venue']['name'], \n",
" v['venue']['location']['lat'], \n",
" v['venue']['location']['lng'], \n",
" v['venue']['categories'][0]['name']) for v in results])\n",
"\n",
" nearby_venues = pd.DataFrame([item for venue_list in venues_list for item in venue_list])\n",
" nearby_venues.columns = ['Neighborhood', \n",
" 'Neighborhood Latitude', \n",
" 'Neighborhood Longitude', \n",
" 'Venue', \n",
" 'Venue Latitude', \n",
" 'Venue Longitude', \n",
" 'Venue Category']\n",
" \n",
" return(nearby_venues)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Now write the code to run the above function on each neighborhood and create a new dataframe called *manhattan_venues*."
]
},
{
"cell_type": "code",
"execution_count": 90,
"metadata": {
"collapsed": false,
"jupyter": {
"outputs_hidden": false
},
"scrolled": true
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Marble Hill\n",
"Chinatown\n",
"Washington Heights\n",
"Inwood\n",
"Hamilton Heights\n",
"Manhattanville\n",
"Central Harlem\n",
"East Harlem\n",
"Upper East Side\n",
"Yorkville\n",
"Lenox Hill\n",
"Roosevelt Island\n",
"Upper West Side\n",
"Lincoln Square\n",
"Clinton\n",
"Midtown\n",
"Murray Hill\n",
"Chelsea\n",
"Greenwich Village\n",
"East Village\n",
"Lower East Side\n",
"Tribeca\n",
"Little Italy\n",
"Soho\n",
"West Village\n",
"Manhattan Valley\n",
"Morningside Heights\n",
"Gramercy\n",
"Battery Park City\n",
"Financial District\n",
"Carnegie Hill\n",
"Noho\n",
"Civic Center\n",
"Midtown South\n",
"Sutton Place\n",
"Turtle Bay\n",
"Tudor City\n",
"Stuyvesant Town\n",
"Flatiron\n",
"Hudson Yards\n"
]
}
],
"source": [
"# type your answer here\n",
"\n",
"#manhattan_data\n",
"\n",
"names=manhattan_data['Neighborhood']\n",
"latitudes=manhattan_data['Latitude']\n",
"longitudes=manhattan_data['Longitude']\n",
"\n",
"radius = 500\n",
"#LIMIT = 100\n",
"\n",
"manhattan_venues = getNearbyVenues(names,latitudes,longitudes)"
]
},
{
"cell_type": "code",
"execution_count": 77,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[{'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '4b4429abf964a52037f225e3',\n",
" 'name': \"Arturo's\",\n",
" 'location': {'address': '5198 Broadway',\n",
" 'crossStreet': 'at 225th St.',\n",
" 'lat': 40.87441177110231,\n",
" 'lng': -73.91027100981574,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.87441177110231,\n",
" 'lng': -73.91027100981574}],\n",
" 'distance': 240,\n",
" 'postalCode': '10463',\n",
" 'cc': 'US',\n",
" 'city': 'New York',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['5198 Broadway (at 225th St.)',\n",
" 'New York, NY 10463',\n",
" 'United States']},\n",
" 'categories': [{'id': '4bf58dd8d48988d1ca941735',\n",
" 'name': 'Pizza Place',\n",
" 'pluralName': 'Pizza Places',\n",
" 'shortName': 'Pizza',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/food/pizza_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'delivery': {'id': '72548',\n",
" 'url': 'https://www.seamless.com/menu/arturos-pizza-5189-broadway-ave-new-york/72548?affiliate=1131&utm_source=foursquare-affiliate-network&utm_medium=affiliate&utm_campaign=1131&utm_content=72548',\n",
" 'provider': {'name': 'seamless',\n",
" 'icon': {'prefix': 'https://fastly.4sqi.net/img/general/cap/',\n",
" 'sizes': [40, 50],\n",
" 'name': '/delivery_provider_seamless_20180129.png'}}},\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-4b4429abf964a52037f225e3-0'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '4baf59e8f964a520a6f93be3',\n",
" 'name': 'Bikram Yoga',\n",
" 'location': {'address': '5500 Broadway',\n",
" 'crossStreet': '230th Street',\n",
" 'lat': 40.876843690797934,\n",
" 'lng': -73.90620384419528,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.876843690797934,\n",
" 'lng': -73.90620384419528}],\n",
" 'distance': 376,\n",
" 'postalCode': '10463',\n",
" 'cc': 'US',\n",
" 'city': 'Bronx',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['5500 Broadway (230th Street)',\n",
" 'Bronx, NY 10463',\n",
" 'United States']},\n",
" 'categories': [{'id': '4bf58dd8d48988d102941735',\n",
" 'name': 'Yoga Studio',\n",
" 'pluralName': 'Yoga Studios',\n",
" 'shortName': 'Yoga Studio',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/shops/gym_yogastudio_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-4baf59e8f964a520a6f93be3-1'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '4b79cc46f964a520c5122fe3',\n",
" 'name': 'Tibbett Diner',\n",
" 'location': {'address': '3033 Tibbett Ave',\n",
" 'crossStreet': 'btwn 230th & 231st',\n",
" 'lat': 40.8804044222466,\n",
" 'lng': -73.90893738006402,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.8804044222466,\n",
" 'lng': -73.90893738006402}],\n",
" 'distance': 452,\n",
" 'postalCode': '10463',\n",
" 'cc': 'US',\n",
" 'city': 'Bronx',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['3033 Tibbett Ave (btwn 230th & 231st)',\n",
" 'Bronx, NY 10463',\n",
" 'United States']},\n",
" 'categories': [{'id': '4bf58dd8d48988d147941735',\n",
" 'name': 'Diner',\n",
" 'pluralName': 'Diners',\n",
" 'shortName': 'Diner',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/food/diner_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-4b79cc46f964a520c5122fe3-2'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '55f81cd2498ee903149fcc64',\n",
" 'name': 'Starbucks',\n",
" 'location': {'address': '171 W 230th St',\n",
" 'crossStreet': 'Kimberly Pl',\n",
" 'lat': 40.87753134921497,\n",
" 'lng': -73.90558216359267,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.87753134921497,\n",
" 'lng': -73.90558216359267}],\n",
" 'distance': 441,\n",
" 'postalCode': '10463',\n",
" 'cc': 'US',\n",
" 'city': 'Bronx',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['171 W 230th St (Kimberly Pl)',\n",
" 'Bronx, NY 10463',\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-55f81cd2498ee903149fcc64-3'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '4b5357adf964a520319827e3',\n",
" 'name': \"Dunkin'\",\n",
" 'location': {'address': '5501 Broadway',\n",
" 'crossStreet': 'W 230th St',\n",
" 'lat': 40.87713584201589,\n",
" 'lng': -73.90666550701411,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.87713584201589,\n",
" 'lng': -73.90666550701411}],\n",
" 'distance': 342,\n",
" 'postalCode': '10463',\n",
" 'cc': 'US',\n",
" 'city': 'Bronx',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['5501 Broadway (W 230th St)',\n",
" 'Bronx, NY 10463',\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-4b5357adf964a520319827e3-4'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '55f751ca498eacc0307d1cfe',\n",
" 'name': 'Blink Fitness Riverdale',\n",
" 'location': {'address': '5520 Broadway',\n",
" 'crossStreet': 'at W 230th St',\n",
" 'lat': 40.87714687429521,\n",
" 'lng': -73.90583697267095,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.87714687429521,\n",
" 'lng': -73.90583697267095}],\n",
" 'distance': 411,\n",
" 'postalCode': '10463',\n",
" 'cc': 'US',\n",
" 'neighborhood': 'Kingsbridge',\n",
" 'city': 'Bronx',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['5520 Broadway (at W 230th St)',\n",
" 'Bronx, NY 10463',\n",
" 'United States']},\n",
" 'categories': [{'id': '4bf58dd8d48988d176941735',\n",
" 'name': 'Gym',\n",
" 'pluralName': 'Gyms',\n",
" 'shortName': 'Gym',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/building/gym_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-55f751ca498eacc0307d1cfe-5'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '4a725fa1f964a520f6da1fe3',\n",
" 'name': 'TCR The Club of Riverdale',\n",
" 'location': {'address': '2600 Netherland Ave',\n",
" 'lat': 40.8786283,\n",
" 'lng': -73.9145678,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.8786283,\n",
" 'lng': -73.9145678}],\n",
" 'distance': 402,\n",
" 'postalCode': '10463',\n",
" 'cc': 'US',\n",
" 'city': 'Bronx',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['2600 Netherland Ave',\n",
" 'Bronx, NY 10463',\n",
" 'United States']},\n",
" 'categories': [{'id': '4e39a891bd410d7aed40cbc2',\n",
" 'name': 'Tennis Stadium',\n",
" 'pluralName': 'Tennis Stadiums',\n",
" 'shortName': 'Tennis',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/arts_entertainment/stadium_tennis_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []},\n",
" 'venuePage': {'id': '40358759'}},\n",
" 'referralId': 'e-0-4a725fa1f964a520f6da1fe3-6'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '4b9c9c6af964a520b27236e3',\n",
" 'name': 'Land & Sea Restaurant',\n",
" 'location': {'address': '5535 Broadway',\n",
" 'crossStreet': '231st St',\n",
" 'lat': 40.87788463309788,\n",
" 'lng': -73.90587282193539,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.87788463309788,\n",
" 'lng': -73.90587282193539}],\n",
" 'distance': 429,\n",
" 'postalCode': '10463',\n",
" 'cc': 'US',\n",
" 'city': 'Bronx',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['5535 Broadway (231st St)',\n",
" 'Bronx, NY 10463',\n",
" 'United States']},\n",
" 'categories': [{'id': '4bf58dd8d48988d1ce941735',\n",
" 'name': 'Seafood Restaurant',\n",
" 'pluralName': 'Seafood Restaurants',\n",
" 'shortName': 'Seafood',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/food/seafood_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'delivery': {'id': '277380',\n",
" 'url': 'https://www.seamless.com/menu/land--sea-restaurant-5535-broadway-ave-bronx/277380?affiliate=1131&utm_source=foursquare-affiliate-network&utm_medium=affiliate&utm_campaign=1131&utm_content=277380',\n",
" 'provider': {'name': 'seamless',\n",
" 'icon': {'prefix': 'https://fastly.4sqi.net/img/general/cap/',\n",
" 'sizes': [40, 50],\n",
" 'name': '/delivery_provider_seamless_20180129.png'}}},\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-4b9c9c6af964a520b27236e3-7'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '546d31ca498e561c698a0320',\n",
" 'name': 'T.J. Maxx',\n",
" 'location': {'lat': 40.87723198343352,\n",
" 'lng': -73.90504239962168,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.87723198343352,\n",
" 'lng': -73.90504239962168}],\n",
" 'distance': 478,\n",
" 'cc': 'US',\n",
" 'city': 'Bronx',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['Bronx, NY', 'United States']},\n",
" 'categories': [{'id': '4bf58dd8d48988d1f6941735',\n",
" 'name': 'Department Store',\n",
" 'pluralName': 'Department Stores',\n",
" 'shortName': 'Department Store',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/shops/departmentstore_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-546d31ca498e561c698a0320-8'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '57655be738faa66160da7527',\n",
" 'name': 'Starbucks',\n",
" 'location': {'address': '50 W 225th St',\n",
" 'lat': 40.873754554218515,\n",
" 'lng': -73.90861305343668,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.873754554218515,\n",
" 'lng': -73.90861305343668}],\n",
" 'distance': 355,\n",
" 'postalCode': '10463',\n",
" 'cc': 'US',\n",
" 'city': 'New York',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['50 W 225th St',\n",
" 'New York, NY 10463',\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-57655be738faa66160da7527-9'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '4b88e053f964a5208a1132e3',\n",
" 'name': 'Rite Aid',\n",
" 'location': {'address': '5237 Broadway',\n",
" 'crossStreet': '228th Street',\n",
" 'lat': 40.875466574434704,\n",
" 'lng': -73.90890629016033,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.875466574434704,\n",
" 'lng': -73.90890629016033}],\n",
" 'distance': 190,\n",
" 'postalCode': '10463',\n",
" 'cc': 'US',\n",
" 'city': 'Bronx',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['5237 Broadway (228th Street)',\n",
" 'Bronx, NY 10463',\n",
" 'United States']},\n",
" 'categories': [{'id': '4bf58dd8d48988d10f951735',\n",
" 'name': 'Pharmacy',\n",
" 'pluralName': 'Pharmacies',\n",
" 'shortName': 'Pharmacy',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/shops/pharmacy_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-4b88e053f964a5208a1132e3-10'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '5631194e498e2de074de661c',\n",
" 'name': 'Vitamin Shoppe',\n",
" 'location': {'address': '5510 Broadway',\n",
" 'lat': 40.87716,\n",
" 'lng': -73.905632,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.87716,\n",
" 'lng': -73.905632}],\n",
" 'distance': 428,\n",
" 'postalCode': '10463',\n",
" 'cc': 'US',\n",
" 'city': 'Bronx',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['5510 Broadway', 'Bronx, NY 10463', 'United States']},\n",
" 'categories': [{'id': '5744ccdfe4b0c0459246b4cd',\n",
" 'name': 'Supplement Shop',\n",
" 'pluralName': 'Supplement Shops',\n",
" 'shortName': 'Supplement Shop',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/education/lab_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-5631194e498e2de074de661c-11'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '4b9f030af964a520eb0f37e3',\n",
" 'name': 'GameStop',\n",
" 'location': {'address': '90 W 225th St Ste A-B',\n",
" 'crossStreet': 'btw Broadway & Exterior St.',\n",
" 'lat': 40.874266802124836,\n",
" 'lng': -73.90934218062803,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.874266802124836,\n",
" 'lng': -73.90934218062803}],\n",
" 'distance': 277,\n",
" 'postalCode': '10463',\n",
" 'cc': 'US',\n",
" 'city': 'Bronx',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['90 W 225th St Ste A-B (btw Broadway & Exterior St.)',\n",
" 'Bronx, NY 10463',\n",
" 'United States']},\n",
" 'categories': [{'id': '4bf58dd8d48988d10b951735',\n",
" 'name': 'Video Game Store',\n",
" 'pluralName': 'Video Game Stores',\n",
" 'shortName': 'Video Games',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/shops/videogames_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-4b9f030af964a520eb0f37e3-12'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '4b9c9c43f964a520ac7236e3',\n",
" 'name': 'Lot Less Closeouts',\n",
" 'location': {'address': '5545 Broadway',\n",
" 'crossStreet': '231st St',\n",
" 'lat': 40.878270422202085,\n",
" 'lng': -73.9052646742604,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.878270422202085,\n",
" 'lng': -73.9052646742604}],\n",
" 'distance': 492,\n",
" 'postalCode': '10463',\n",
" 'cc': 'US',\n",
" 'city': 'Bronx',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['5545 Broadway (231st St)',\n",
" 'Bronx, NY 10463',\n",
" 'United States']},\n",
" 'categories': [{'id': '52dea92d3cf9994f4e043dbb',\n",
" 'name': 'Discount Store',\n",
" 'pluralName': 'Discount Stores',\n",
" 'shortName': 'Discount Store',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/shops/discountstore_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-4b9c9c43f964a520ac7236e3-13'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '4dfe40df8877333e195b68fc',\n",
" 'name': 'Parrilla Latina',\n",
" 'location': {'address': '230th St & Broadway',\n",
" 'lat': 40.87747294351472,\n",
" 'lng': -73.90607346968568,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.87747294351472,\n",
" 'lng': -73.90607346968568}],\n",
" 'distance': 399,\n",
" 'postalCode': '10463',\n",
" 'cc': 'US',\n",
" 'city': 'Bronx',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['230th St & Broadway',\n",
" 'Bronx, NY 10463',\n",
" 'United States']},\n",
" 'categories': [{'id': '4bf58dd8d48988d1cc941735',\n",
" 'name': 'Steakhouse',\n",
" 'pluralName': 'Steakhouses',\n",
" 'shortName': 'Steakhouse',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/food/steakhouse_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'delivery': {'id': '330981',\n",
" 'url': 'https://www.seamless.com/menu/parrilla-latina-5523-broadway-bronx/330981?affiliate=1131&utm_source=foursquare-affiliate-network&utm_medium=affiliate&utm_campaign=1131&utm_content=330981',\n",
" 'provider': {'name': 'seamless',\n",
" 'icon': {'prefix': 'https://fastly.4sqi.net/img/general/cap/',\n",
" 'sizes': [40, 50],\n",
" 'name': '/delivery_provider_seamless_20180129.png'}}},\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-4dfe40df8877333e195b68fc-14'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '4e4e4517bd4101d0d7a67568',\n",
" 'name': 'Baskin-Robbins',\n",
" 'location': {'address': '5501 Broadway',\n",
" 'lat': 40.8769755336728,\n",
" 'lng': -73.90675193198494,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.8769755336728,\n",
" 'lng': -73.90675193198494}],\n",
" 'distance': 332,\n",
" 'postalCode': '10463',\n",
" 'cc': 'US',\n",
" 'city': 'Bronx',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['5501 Broadway', 'Bronx, NY 10463', 'United States']},\n",
" 'categories': [{'id': '4bf58dd8d48988d1c9941735',\n",
" 'name': 'Ice Cream Shop',\n",
" 'pluralName': 'Ice Cream Shops',\n",
" 'shortName': 'Ice Cream',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/food/icecream_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-4e4e4517bd4101d0d7a67568-15'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '4b4f7b65f964a5205a0827e3',\n",
" 'name': 'Subway Sandwiches',\n",
" 'location': {'address': '5209 Broadway',\n",
" 'lat': 40.8746665302951,\n",
" 'lng': -73.9095858429637,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.8746665302951,\n",
" 'lng': -73.9095858429637}],\n",
" 'distance': 228,\n",
" 'postalCode': '10463',\n",
" 'cc': 'US',\n",
" 'city': 'Bronx',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['5209 Broadway', 'Bronx, NY 10463', 'United States']},\n",
" 'categories': [{'id': '4bf58dd8d48988d1c5941735',\n",
" 'name': 'Sandwich Place',\n",
" 'pluralName': 'Sandwich Places',\n",
" 'shortName': 'Sandwiches',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/food/deli_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-4b4f7b65f964a5205a0827e3-16'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '4ec68016cc21b428e1d2060a',\n",
" 'name': 'TD Bank',\n",
" 'location': {'address': '281 W 230th St',\n",
" 'lat': 40.8794958,\n",
" 'lng': -73.9092856,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.8794958,\n",
" 'lng': -73.9092856}],\n",
" 'distance': 347,\n",
" 'postalCode': '10463',\n",
" 'cc': 'US',\n",
" 'city': 'Bronx',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['281 W 230th St',\n",
" 'Bronx, NY 10463',\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-4ec68016cc21b428e1d2060a-17'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '585c205665e7c70a2f1055ea',\n",
" 'name': 'Boston Market',\n",
" 'location': {'address': '5520 Broadway',\n",
" 'lat': 40.87743,\n",
" 'lng': -73.9054121,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.87743,\n",
" 'lng': -73.9054121}],\n",
" 'distance': 452,\n",
" 'postalCode': '10463',\n",
" 'cc': 'US',\n",
" 'city': 'Bronx',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['5520 Broadway', 'Bronx, NY 10463', '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-585c205665e7c70a2f1055ea-18'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '56229ff8498e2abb44b6f12b',\n",
" 'name': 'Five Below',\n",
" 'location': {'address': '171 W 230th St Fl 2',\n",
" 'lat': 40.87763977050781,\n",
" 'lng': -73.90499114990234,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.87763977050781,\n",
" 'lng': -73.90499114990234}],\n",
" 'distance': 492,\n",
" 'postalCode': '10463',\n",
" 'cc': 'US',\n",
" 'city': 'Bronx',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['171 W 230th St Fl 2',\n",
" 'Bronx, NY 10463',\n",
" 'United States']},\n",
" 'categories': [{'id': '52dea92d3cf9994f4e043dbb',\n",
" 'name': 'Discount Store',\n",
" 'pluralName': 'Discount Stores',\n",
" 'shortName': 'Discount Store',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/shops/discountstore_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-56229ff8498e2abb44b6f12b-19'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '4e4ce4debd413c4cc66d05d0',\n",
" 'name': 'SUBWAY',\n",
" 'location': {'address': '5549 Broadway',\n",
" 'lat': 40.87849271667849,\n",
" 'lng': -73.90538547211088,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.87849271667849,\n",
" 'lng': -73.90538547211088}],\n",
" 'distance': 493,\n",
" 'postalCode': '10463',\n",
" 'cc': 'US',\n",
" 'city': 'Bronx',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['5549 Broadway', 'Bronx, NY 10463', 'United States']},\n",
" 'categories': [{'id': '4bf58dd8d48988d1c5941735',\n",
" 'name': 'Sandwich Place',\n",
" 'pluralName': 'Sandwich Places',\n",
" 'shortName': 'Sandwiches',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/food/deli_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'delivery': {'id': '774886',\n",
" 'url': 'https://www.seamless.com/menu/subway-5549-broadway-bronx/774886?affiliate=1131&utm_source=foursquare-affiliate-network&utm_medium=affiliate&utm_campaign=1131&utm_content=774886',\n",
" 'provider': {'name': 'seamless',\n",
" 'icon': {'prefix': 'https://fastly.4sqi.net/img/general/cap/',\n",
" 'sizes': [40, 50],\n",
" 'name': '/delivery_provider_seamless_20180129.png'}}},\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-4e4ce4debd413c4cc66d05d0-20'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '58f4fc2b829b0c305839877b',\n",
" 'name': 'Forever 21',\n",
" 'location': {'lat': 40.87747,\n",
" 'lng': -73.90594,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.87747,\n",
" 'lng': -73.90594}],\n",
" 'distance': 410,\n",
" 'postalCode': '10463',\n",
" 'cc': 'US',\n",
" 'city': 'New York',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['New York, NY 10463', 'United States']},\n",
" 'categories': [{'id': '4bf58dd8d48988d103951735',\n",
" 'name': 'Clothing Store',\n",
" 'pluralName': 'Clothing Stores',\n",
" 'shortName': 'Apparel',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/shops/apparel_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-58f4fc2b829b0c305839877b-21'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '53319bb511d2ef06787f02b4',\n",
" 'name': 'Broadway Plaza',\n",
" 'location': {'address': '171 W 231st St',\n",
" 'lat': 40.87753906779665,\n",
" 'lng': -73.90539578168178,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.87753906779665,\n",
" 'lng': -73.90539578168178}],\n",
" 'distance': 456,\n",
" 'postalCode': '10463',\n",
" 'cc': 'US',\n",
" 'city': 'Bronx',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['171 W 231st St',\n",
" 'Bronx, NY 10463',\n",
" 'United States']},\n",
" 'categories': [{'id': '4bf58dd8d48988d1fd941735',\n",
" 'name': 'Shopping Mall',\n",
" 'pluralName': 'Shopping Malls',\n",
" 'shortName': 'Mall',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/shops/mall_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-53319bb511d2ef06787f02b4-22'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '4d0a529133d6b60cf4cf9985',\n",
" 'name': 'Subway',\n",
" 'location': {'address': '5209 Broadway',\n",
" 'lat': 40.877720351115315,\n",
" 'lng': -73.90537973066263,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.877720351115315,\n",
" 'lng': -73.90537973066263}],\n",
" 'distance': 463,\n",
" 'postalCode': '10463',\n",
" 'cc': 'US',\n",
" 'city': 'Bronx',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['5209 Broadway', 'Bronx, NY 10463', 'United States']},\n",
" 'categories': [{'id': '4bf58dd8d48988d1c5941735',\n",
" 'name': 'Sandwich Place',\n",
" 'pluralName': 'Sandwich Places',\n",
" 'shortName': 'Sandwiches',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/food/deli_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-4d0a529133d6b60cf4cf9985-23'},\n",
" {'reasons': {'count': 0,\n",
" 'items': [{'summary': 'This spot is popular',\n",
" 'type': 'general',\n",
" 'reasonName': 'globalInteractionReason'}]},\n",
" 'venue': {'id': '4ed7956b8b81b2bf28adc714',\n",
" 'name': 'Terrace View Delicatessen',\n",
" 'location': {'address': '135 Terrace View Ave.',\n",
" 'lat': 40.87647647652852,\n",
" 'lng': -73.91274586964578,\n",
" 'labeledLatLngs': [{'label': 'display',\n",
" 'lat': 40.87647647652852,\n",
" 'lng': -73.91274586964578}],\n",
" 'distance': 175,\n",
" 'postalCode': '10034',\n",
" 'cc': 'US',\n",
" 'city': 'New York',\n",
" 'state': 'NY',\n",
" 'country': 'United States',\n",
" 'formattedAddress': ['135 Terrace View Ave.',\n",
" 'New York, NY 10034',\n",
" 'United States']},\n",
" 'categories': [{'id': '4bf58dd8d48988d146941735',\n",
" 'name': 'Deli / Bodega',\n",
" 'pluralName': 'Delis / Bodegas',\n",
" 'shortName': 'Deli / Bodega',\n",
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/food/deli_',\n",
" 'suffix': '.png'},\n",
" 'primary': True}],\n",
" 'photos': {'count': 0, 'groups': []}},\n",
" 'referralId': 'e-0-4ed7956b8b81b2bf28adc714-24'}]"
]
},
"execution_count": 77,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# type your answer here\n",
"\n",
"#manhattan_data\n",
"\n",
"name=manhattan_data['Neighborhood'][0]\n",
"latitude=manhattan_data['Latitude'][0]\n",
"longitude=manhattan_data['Longitude'][0]\n",
"\n",
"radius = 500\n",
"LIMIT = 100\n",
"\n",
"# create the API request URL\n",
"url = 'https://api.foursquare.com/v2/venues/explore?&client_id={}&client_secret={}&v={}&ll={},{}&radius={}&limit={}'.format(\n",
" CLIENT_ID, \n",
" CLIENT_SECRET, \n",
" VERSION, \n",
" latitude, \n",
" longitude, \n",
" radius, \n",
" LIMIT)\n",
" \n",
"results = requests.get(url).json()['response']['groups'][0]['items']\n",
"results\n",
"\n",
"#manhattan_venues = getNearbyVenues(names,latitudes,longitudes)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Double-click __here__ for the solution.\n",
"<!-- The correct answer is:\n",
"manhattan_venues = getNearbyVenues(names=manhattan_data['Neighborhood'],\n",
" latitudes=manhattan_data['Latitude'],\n",
" longitudes=manhattan_data['Longitude']\n",
" )\n",
"--> "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Let's check the size of the resulting dataframe"
]
},
{
"cell_type": "code",
"execution_count": 91,
"metadata": {
"collapsed": false,
"jupyter": {
"outputs_hidden": false
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"(3324, 7)\n"
]
},
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Neighborhood</th>\n",
" <th>Neighborhood Latitude</th>\n",
" <th>Neighborhood Longitude</th>\n",
" <th>Venue</th>\n",
" <th>Venue Latitude</th>\n",
" <th>Venue Longitude</th>\n",
" <th>Venue Category</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Marble Hill</td>\n",
" <td>40.876551</td>\n",
" <td>-73.91066</td>\n",
" <td>Arturo's</td>\n",
" <td>40.874412</td>\n",
" <td>-73.910271</td>\n",
" <td>Pizza Place</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>Marble Hill</td>\n",
" <td>40.876551</td>\n",
" <td>-73.91066</td>\n",
" <td>Bikram Yoga</td>\n",
" <td>40.876844</td>\n",
" <td>-73.906204</td>\n",
" <td>Yoga Studio</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>Marble Hill</td>\n",
" <td>40.876551</td>\n",
" <td>-73.91066</td>\n",
" <td>Tibbett Diner</td>\n",
" <td>40.880404</td>\n",
" <td>-73.908937</td>\n",
" <td>Diner</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>Marble Hill</td>\n",
" <td>40.876551</td>\n",
" <td>-73.91066</td>\n",
" <td>Starbucks</td>\n",
" <td>40.877531</td>\n",
" <td>-73.905582</td>\n",
" <td>Coffee Shop</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>Marble Hill</td>\n",
" <td>40.876551</td>\n",
" <td>-73.91066</td>\n",
" <td>Dunkin'</td>\n",
" <td>40.877136</td>\n",
" <td>-73.906666</td>\n",
" <td>Donut Shop</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Neighborhood Neighborhood Latitude Neighborhood Longitude Venue \\\n",
"0 Marble Hill 40.876551 -73.91066 Arturo's \n",
"1 Marble Hill 40.876551 -73.91066 Bikram Yoga \n",
"2 Marble Hill 40.876551 -73.91066 Tibbett Diner \n",
"3 Marble Hill 40.876551 -73.91066 Starbucks \n",
"4 Marble Hill 40.876551 -73.91066 Dunkin' \n",
"\n",
" Venue Latitude Venue Longitude Venue Category \n",
"0 40.874412 -73.910271 Pizza Place \n",
"1 40.876844 -73.906204 Yoga Studio \n",
"2 40.880404 -73.908937 Diner \n",
"3 40.877531 -73.905582 Coffee Shop \n",
"4 40.877136 -73.906666 Donut Shop "
]
},
"execution_count": 91,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"print(manhattan_venues.shape)\n",
"manhattan_venues.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's check how many venues were returned for each neighborhood"
]
},
{
"cell_type": "code",
"execution_count": 92,
"metadata": {
"collapsed": false,
"jupyter": {
"outputs_hidden": false
}
},
"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>Neighborhood Latitude</th>\n",
" <th>Neighborhood Longitude</th>\n",
" <th>Venue</th>\n",
" <th>Venue Latitude</th>\n",
" <th>Venue Longitude</th>\n",
" <th>Venue Category</th>\n",
" </tr>\n",
" <tr>\n",
" <th>Neighborhood</th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>Battery Park City</th>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Carnegie Hill</th>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Central Harlem</th>\n",
" <td>45</td>\n",
" <td>45</td>\n",
" <td>45</td>\n",
" <td>45</td>\n",
" <td>45</td>\n",
" <td>45</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Chelsea</th>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Chinatown</th>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Civic Center</th>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Clinton</th>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" </tr>\n",
" <tr>\n",
" <th>East Harlem</th>\n",
" <td>46</td>\n",
" <td>46</td>\n",
" <td>46</td>\n",
" <td>46</td>\n",
" <td>46</td>\n",
" <td>46</td>\n",
" </tr>\n",
" <tr>\n",
" <th>East Village</th>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Financial District</th>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Flatiron</th>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Gramercy</th>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Greenwich Village</th>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Hamilton Heights</th>\n",
" <td>60</td>\n",
" <td>60</td>\n",
" <td>60</td>\n",
" <td>60</td>\n",
" <td>60</td>\n",
" <td>60</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Hudson Yards</th>\n",
" <td>77</td>\n",
" <td>77</td>\n",
" <td>77</td>\n",
" <td>77</td>\n",
" <td>77</td>\n",
" <td>77</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Inwood</th>\n",
" <td>58</td>\n",
" <td>58</td>\n",
" <td>58</td>\n",
" <td>58</td>\n",
" <td>58</td>\n",
" <td>58</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Lenox Hill</th>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Lincoln Square</th>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Little Italy</th>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Lower East Side</th>\n",
" <td>67</td>\n",
" <td>67</td>\n",
" <td>67</td>\n",
" <td>67</td>\n",
" <td>67</td>\n",
" <td>67</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Manhattan Valley</th>\n",
" <td>57</td>\n",
" <td>57</td>\n",
" <td>57</td>\n",
" <td>57</td>\n",
" <td>57</td>\n",
" <td>57</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Manhattanville</th>\n",
" <td>40</td>\n",
" <td>40</td>\n",
" <td>40</td>\n",
" <td>40</td>\n",
" <td>40</td>\n",
" <td>40</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Marble Hill</th>\n",
" <td>25</td>\n",
" <td>25</td>\n",
" <td>25</td>\n",
" <td>25</td>\n",
" <td>25</td>\n",
" <td>25</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Midtown</th>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Midtown South</th>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Morningside Heights</th>\n",
" <td>38</td>\n",
" <td>38</td>\n",
" <td>38</td>\n",
" <td>38</td>\n",
" <td>38</td>\n",
" <td>38</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Murray Hill</th>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Noho</th>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Roosevelt Island</th>\n",
" <td>25</td>\n",
" <td>25</td>\n",
" <td>25</td>\n",
" <td>25</td>\n",
" <td>25</td>\n",
" <td>25</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Soho</th>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Stuyvesant Town</th>\n",
" <td>19</td>\n",
" <td>19</td>\n",
" <td>19</td>\n",
" <td>19</td>\n",
" <td>19</td>\n",
" <td>19</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Sutton Place</th>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Tribeca</th>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Tudor City</th>\n",
" <td>82</td>\n",
" <td>82</td>\n",
" <td>82</td>\n",
" <td>82</td>\n",
" <td>82</td>\n",
" <td>82</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Turtle Bay</th>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Upper East Side</th>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Upper West Side</th>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Washington Heights</th>\n",
" <td>85</td>\n",
" <td>85</td>\n",
" <td>85</td>\n",
" <td>85</td>\n",
" <td>85</td>\n",
" <td>85</td>\n",
" </tr>\n",
" <tr>\n",
" <th>West Village</th>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Yorkville</th>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" <td>100</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Neighborhood Latitude Neighborhood Longitude Venue \\\n",
"Neighborhood \n",
"Battery Park City 100 100 100 \n",
"Carnegie Hill 100 100 100 \n",
"Central Harlem 45 45 45 \n",
"Chelsea 100 100 100 \n",
"Chinatown 100 100 100 \n",
"Civic Center 100 100 100 \n",
"Clinton 100 100 100 \n",
"East Harlem 46 46 46 \n",
"East Village 100 100 100 \n",
"Financial District 100 100 100 \n",
"Flatiron 100 100 100 \n",
"Gramercy 100 100 100 \n",
"Greenwich Village 100 100 100 \n",
"Hamilton Heights 60 60 60 \n",
"Hudson Yards 77 77 77 \n",
"Inwood 58 58 58 \n",
"Lenox Hill 100 100 100 \n",
"Lincoln Square 100 100 100 \n",
"Little Italy 100 100 100 \n",
"Lower East Side 67 67 67 \n",
"Manhattan Valley 57 57 57 \n",
"Manhattanville 40 40 40 \n",
"Marble Hill 25 25 25 \n",
"Midtown 100 100 100 \n",
"Midtown South 100 100 100 \n",
"Morningside Heights 38 38 38 \n",
"Murray Hill 100 100 100 \n",
"Noho 100 100 100 \n",
"Roosevelt Island 25 25 25 \n",
"Soho 100 100 100 \n",
"Stuyvesant Town 19 19 19 \n",
"Sutton Place 100 100 100 \n",
"Tribeca 100 100 100 \n",
"Tudor City 82 82 82 \n",
"Turtle Bay 100 100 100 \n",
"Upper East Side 100 100 100 \n",
"Upper West Side 100 100 100 \n",
"Washington Heights 85 85 85 \n",
"West Village 100 100 100 \n",
"Yorkville 100 100 100 \n",
"\n",
" Venue Latitude Venue Longitude Venue Category \n",
"Neighborhood \n",
"Battery Park City 100 100 100 \n",
"Carnegie Hill 100 100 100 \n",
"Central Harlem 45 45 45 \n",
"Chelsea 100 100 100 \n",
"Chinatown 100 100 100 \n",
"Civic Center 100 100 100 \n",
"Clinton 100 100 100 \n",
"East Harlem 46 46 46 \n",
"East Village 100 100 100 \n",
"Financial District 100 100 100 \n",
"Flatiron 100 100 100 \n",
"Gramercy 100 100 100 \n",
"Greenwich Village 100 100 100 \n",
"Hamilton Heights 60 60 60 \n",
"Hudson Yards 77 77 77 \n",
"Inwood 58 58 58 \n",
"Lenox Hill 100 100 100 \n",
"Lincoln Square 100 100 100 \n",
"Little Italy 100 100 100 \n",
"Lower East Side 67 67 67 \n",
"Manhattan Valley 57 57 57 \n",
"Manhattanville 40 40 40 \n",
"Marble Hill 25 25 25 \n",
"Midtown 100 100 100 \n",
"Midtown South 100 100 100 \n",
"Morningside Heights 38 38 38 \n",
"Murray Hill 100 100 100 \n",
"Noho 100 100 100 \n",
"Roosevelt Island 25 25 25 \n",
"Soho 100 100 100 \n",
"Stuyvesant Town 19 19 19 \n",
"Sutton Place 100 100 100 \n",
"Tribeca 100 100 100 \n",
"Tudor City 82 82 82 \n",
"Turtle Bay 100 100 100 \n",
"Upper East Side 100 100 100 \n",
"Upper West Side 100 100 100 \n",
"Washington Heights 85 85 85 \n",
"West Village 100 100 100 \n",
"Yorkville 100 100 100 "
]
},
"execution_count": 92,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"manhattan_venues.groupby('Neighborhood').count()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Let's find out how many unique categories can be curated from all the returned venues"
]
},
{
"cell_type": "code",
"execution_count": 93,
"metadata": {
"collapsed": false,
"jupyter": {
"outputs_hidden": false
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"There are 339 uniques categories.\n"
]
}
],
"source": [
"print('There are {} uniques categories.'.format(len(manhattan_venues['Venue Category'].unique())))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<a id='item3'></a>"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 3. Analyze Each Neighborhood"
]
},
{
"cell_type": "code",
"execution_count": 94,
"metadata": {
"collapsed": false,
"jupyter": {
"outputs_hidden": false
}
},
"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>Neighborhood</th>\n",
" <th>Accessories Store</th>\n",
" <th>Adult Boutique</th>\n",
" <th>Afghan Restaurant</th>\n",
" <th>African Restaurant</th>\n",
" <th>American Restaurant</th>\n",
" <th>Antique Shop</th>\n",
" <th>Arcade</th>\n",
" <th>Arepa Restaurant</th>\n",
" <th>Argentinian Restaurant</th>\n",
" <th>Art Gallery</th>\n",
" <th>Art Museum</th>\n",
" <th>Arts &amp; Crafts Store</th>\n",
" <th>Asian Restaurant</th>\n",
" <th>Athletics &amp; Sports</th>\n",
" <th>Auditorium</th>\n",
" <th>Australian Restaurant</th>\n",
" <th>Austrian Restaurant</th>\n",
" <th>Auto Workshop</th>\n",
" <th>BBQ Joint</th>\n",
" <th>Baby Store</th>\n",
" <th>Bagel Shop</th>\n",
" <th>Bakery</th>\n",
" <th>Bank</th>\n",
" <th>Bar</th>\n",
" <th>Baseball Field</th>\n",
" <th>Basketball Court</th>\n",
" <th>Beer Bar</th>\n",
" <th>Beer Garden</th>\n",
" <th>Beer Store</th>\n",
" <th>Big Box Store</th>\n",
" <th>Bike Rental / Bike Share</th>\n",
" <th>Bike Shop</th>\n",
" <th>Bike Trail</th>\n",
" <th>Bistro</th>\n",
" <th>Board Shop</th>\n",
" <th>Boat or Ferry</th>\n",
" <th>Bookstore</th>\n",
" <th>Boutique</th>\n",
" <th>Boxing Gym</th>\n",
" <th>Brazilian Restaurant</th>\n",
" <th>Breakfast Spot</th>\n",
" <th>Bridal Shop</th>\n",
" <th>Bridge</th>\n",
" <th>Bubble Tea Shop</th>\n",
" <th>Building</th>\n",
" <th>Burger Joint</th>\n",
" <th>Burrito Place</th>\n",
" <th>Bus Line</th>\n",
" <th>Bus Station</th>\n",
" <th>Bus Stop</th>\n",
" <th>Business Service</th>\n",
" <th>Butcher</th>\n",
" <th>Cafeteria</th>\n",
" <th>Café</th>\n",
" <th>Cambodian Restaurant</th>\n",
" <th>Camera Store</th>\n",
" <th>Candy Store</th>\n",
" <th>Cantonese Restaurant</th>\n",
" <th>Caribbean Restaurant</th>\n",
" <th>Caucasian Restaurant</th>\n",
" <th>Cheese Shop</th>\n",
" <th>Chinese Restaurant</th>\n",
" <th>Chocolate Shop</th>\n",
" <th>Circus</th>\n",
" <th>Climbing Gym</th>\n",
" <th>Clothing Store</th>\n",
" <th>Club House</th>\n",
" <th>Cocktail Bar</th>\n",
" <th>Coffee Shop</th>\n",
" <th>College Academic Building</th>\n",
" <th>College Bookstore</th>\n",
" <th>College Cafeteria</th>\n",
" <th>College Gym</th>\n",
" <th>College Theater</th>\n",
" <th>Comedy Club</th>\n",
" <th>Community Center</th>\n",
" <th>Concert Hall</th>\n",
" <th>Convenience Store</th>\n",
" <th>Cosmetics Shop</th>\n",
" <th>Coworking Space</th>\n",
" <th>Creperie</th>\n",
" <th>Cuban Restaurant</th>\n",
" <th>Cupcake Shop</th>\n",
" <th>Cycle Studio</th>\n",
" <th>Czech Restaurant</th>\n",
" <th>Dance Studio</th>\n",
" <th>Daycare</th>\n",
" <th>Deli / Bodega</th>\n",
" <th>Department Store</th>\n",
" <th>Design Studio</th>\n",
" <th>Dessert Shop</th>\n",
" <th>Dim Sum Restaurant</th>\n",
" <th>Diner</th>\n",
" <th>Discount Store</th>\n",
" <th>Dive Bar</th>\n",
" <th>Doctor's Office</th>\n",
" <th>Dog Run</th>\n",
" <th>Donut Shop</th>\n",
" <th>Drugstore</th>\n",
" <th>Dry Cleaner</th>\n",
" <th>Dumpling Restaurant</th>\n",
" <th>Duty-free Shop</th>\n",
" <th>Eastern European Restaurant</th>\n",
" <th>Electronics Store</th>\n",
" <th>Empanada Restaurant</th>\n",
" <th>English Restaurant</th>\n",
" <th>Ethiopian Restaurant</th>\n",
" <th>Event Space</th>\n",
" <th>Exhibit</th>\n",
" <th>Falafel Restaurant</th>\n",
" <th>Farmers Market</th>\n",
" <th>Fast Food Restaurant</th>\n",
" <th>Field</th>\n",
" <th>Filipino Restaurant</th>\n",
" <th>Financial or Legal Service</th>\n",
" <th>Fish Market</th>\n",
" <th>Flea Market</th>\n",
" <th>Flower Shop</th>\n",
" <th>Food &amp; Drink Shop</th>\n",
" <th>Food Court</th>\n",
" <th>Food Stand</th>\n",
" <th>Food Truck</th>\n",
" <th>Fountain</th>\n",
" <th>French Restaurant</th>\n",
" <th>Fried Chicken Joint</th>\n",
" <th>Frozen Yogurt Shop</th>\n",
" <th>Furniture / Home Store</th>\n",
" <th>Gaming Cafe</th>\n",
" <th>Garden</th>\n",
" <th>Garden Center</th>\n",
" <th>Gas Station</th>\n",
" <th>Gastropub</th>\n",
" <th>Gay Bar</th>\n",
" <th>General College &amp; University</th>\n",
" <th>General Entertainment</th>\n",
" <th>German Restaurant</th>\n",
" <th>Gift Shop</th>\n",
" <th>Golf Course</th>\n",
" <th>Gourmet Shop</th>\n",
" <th>Greek Restaurant</th>\n",
" <th>Grocery Store</th>\n",
" <th>Gym</th>\n",
" <th>Gym / Fitness Center</th>\n",
" <th>Gym Pool</th>\n",
" <th>Gymnastics Gym</th>\n",
" <th>Harbor / Marina</th>\n",
" <th>Hardware Store</th>\n",
" <th>Hawaiian Restaurant</th>\n",
" <th>Health &amp; Beauty Service</th>\n",
" <th>Health Food Store</th>\n",
" <th>Heliport</th>\n",
" <th>High School</th>\n",
" <th>Himalayan Restaurant</th>\n",
" <th>Historic Site</th>\n",
" <th>History Museum</th>\n",
" <th>Hobby Shop</th>\n",
" <th>Hookah Bar</th>\n",
" <th>Hostel</th>\n",
" <th>Hot Dog Joint</th>\n",
" <th>Hotel</th>\n",
" <th>Hotel Bar</th>\n",
" <th>Hotpot Restaurant</th>\n",
" <th>Ice Cream Shop</th>\n",
" <th>Indian Restaurant</th>\n",
" <th>Indie Movie Theater</th>\n",
" <th>Indie Theater</th>\n",
" <th>Intersection</th>\n",
" <th>Irish Pub</th>\n",
" <th>Israeli Restaurant</th>\n",
" <th>Italian Restaurant</th>\n",
" <th>Japanese Curry Restaurant</th>\n",
" <th>Japanese Restaurant</th>\n",
" <th>Jazz Club</th>\n",
" <th>Jewelry Store</th>\n",
" <th>Jewish Restaurant</th>\n",
" <th>Juice Bar</th>\n",
" <th>Karaoke Bar</th>\n",
" <th>Kebab Restaurant</th>\n",
" <th>Kids Store</th>\n",
" <th>Korean Restaurant</th>\n",
" <th>Kosher Restaurant</th>\n",
" <th>Latin American Restaurant</th>\n",
" <th>Laundry Service</th>\n",
" <th>Leather Goods Store</th>\n",
" <th>Lebanese Restaurant</th>\n",
" <th>Library</th>\n",
" <th>Lingerie Store</th>\n",
" <th>Liquor Store</th>\n",
" <th>Lounge</th>\n",
" <th>Malay Restaurant</th>\n",
" <th>Market</th>\n",
" <th>Martial Arts Dojo</th>\n",
" <th>Massage Studio</th>\n",
" <th>Medical Center</th>\n",
" <th>Mediterranean Restaurant</th>\n",
" <th>Memorial Site</th>\n",
" <th>Men's Store</th>\n",
" <th>Metro Station</th>\n",
" <th>Mexican Restaurant</th>\n",
" <th>Middle Eastern Restaurant</th>\n",
" <th>Mini Golf</th>\n",
" <th>Miscellaneous Shop</th>\n",
" <th>Mobile Phone Shop</th>\n",
" <th>Modern European Restaurant</th>\n",
" <th>Molecular Gastronomy Restaurant</th>\n",
" <th>Monument / Landmark</th>\n",
" <th>Moroccan Restaurant</th>\n",
" <th>Movie Theater</th>\n",
" <th>Museum</th>\n",
" <th>Music School</th>\n",
" <th>Music Venue</th>\n",
" <th>Nail Salon</th>\n",
" <th>New American Restaurant</th>\n",
" <th>Newsstand</th>\n",
" <th>Nightclub</th>\n",
" <th>Non-Profit</th>\n",
" <th>Noodle House</th>\n",
" <th>North Indian Restaurant</th>\n",
" <th>Office</th>\n",
" <th>Opera House</th>\n",
" <th>Optical Shop</th>\n",
" <th>Organic Grocery</th>\n",
" <th>Other Nightlife</th>\n",
" <th>Outdoor Sculpture</th>\n",
" <th>Outdoors &amp; Recreation</th>\n",
" <th>Paella Restaurant</th>\n",
" <th>Pakistani Restaurant</th>\n",
" <th>Paper / Office Supplies Store</th>\n",
" <th>Park</th>\n",
" <th>Pastry Shop</th>\n",
" <th>Performing Arts Venue</th>\n",
" <th>Persian Restaurant</th>\n",
" <th>Peruvian Restaurant</th>\n",
" <th>Pet Café</th>\n",
" <th>Pet Service</th>\n",
" <th>Pet Store</th>\n",
" <th>Pharmacy</th>\n",
" <th>Photography Studio</th>\n",
" <th>Piano Bar</th>\n",
" <th>Pie Shop</th>\n",
" <th>Pilates Studio</th>\n",
" <th>Pizza Place</th>\n",
" <th>Playground</th>\n",
" <th>Plaza</th>\n",
" <th>Poke Place</th>\n",
" <th>Pool</th>\n",
" <th>Pub</th>\n",
" <th>Public Art</th>\n",
" <th>Ramen Restaurant</th>\n",
" <th>Record Shop</th>\n",
" <th>Recreation Center</th>\n",
" <th>Rental Car Location</th>\n",
" <th>Residential Building (Apartment / Condo)</th>\n",
" <th>Resort</th>\n",
" <th>Rest Area</th>\n",
" <th>Restaurant</th>\n",
" <th>River</th>\n",
" <th>Rock Climbing Spot</th>\n",
" <th>Rock Club</th>\n",
" <th>Roof Deck</th>\n",
" <th>Russian Restaurant</th>\n",
" <th>Sake Bar</th>\n",
" <th>Salad Place</th>\n",
" <th>Salon / Barbershop</th>\n",
" <th>Sandwich Place</th>\n",
" <th>Scandinavian Restaurant</th>\n",
" <th>Scenic Lookout</th>\n",
" <th>School</th>\n",
" <th>Sculpture Garden</th>\n",
" <th>Seafood Restaurant</th>\n",
" <th>Shanghai Restaurant</th>\n",
" <th>Shipping Store</th>\n",
" <th>Shoe Repair</th>\n",
" <th>Shoe Store</th>\n",
" <th>Shopping Mall</th>\n",
" <th>Skate Park</th>\n",
" <th>Ski Shop</th>\n",
" <th>Smoke Shop</th>\n",
" <th>Smoothie Shop</th>\n",
" <th>Snack Place</th>\n",
" <th>Soba Restaurant</th>\n",
" <th>Social Club</th>\n",
" <th>Soup Place</th>\n",
" <th>South American Restaurant</th>\n",
" <th>South Indian Restaurant</th>\n",
" <th>Southern / Soul Food Restaurant</th>\n",
" <th>Spa</th>\n",
" <th>Spanish Restaurant</th>\n",
" <th>Speakeasy</th>\n",
" <th>Spiritual Center</th>\n",
" <th>Sporting Goods Shop</th>\n",
" <th>Sports Bar</th>\n",
" <th>Sports Club</th>\n",
" <th>Stables</th>\n",
" <th>Steakhouse</th>\n",
" <th>Street Art</th>\n",
" <th>Strip Club</th>\n",
" <th>Supermarket</th>\n",
" <th>Supplement Shop</th>\n",
" <th>Sushi Restaurant</th>\n",
" <th>Swiss Restaurant</th>\n",
" <th>Szechuan Restaurant</th>\n",
" <th>Taco Place</th>\n",
" <th>Tailor Shop</th>\n",
" <th>Taiwanese Restaurant</th>\n",
" <th>Tapas Restaurant</th>\n",
" <th>Tattoo Parlor</th>\n",
" <th>Tea Room</th>\n",
" <th>Tech Startup</th>\n",
" <th>Tennis Court</th>\n",
" <th>Tennis Stadium</th>\n",
" <th>Thai Restaurant</th>\n",
" <th>Theater</th>\n",
" <th>Theme Park Ride / Attraction</th>\n",
" <th>Thrift / Vintage Store</th>\n",
" <th>Tiki Bar</th>\n",
" <th>Tourist Information Center</th>\n",
" <th>Toy / Game Store</th>\n",
" <th>Trail</th>\n",
" <th>Tree</th>\n",
" <th>Turkish Restaurant</th>\n",
" <th>Udon Restaurant</th>\n",
" <th>Used Bookstore</th>\n",
" <th>Vegetarian / Vegan Restaurant</th>\n",
" <th>Venezuelan Restaurant</th>\n",
" <th>Veterinarian</th>\n",
" <th>Video Game Store</th>\n",
" <th>Video Store</th>\n",
" <th>Vietnamese Restaurant</th>\n",
" <th>Volleyball Court</th>\n",
" <th>Watch Shop</th>\n",
" <th>Waterfront</th>\n",
" <th>Weight Loss Center</th>\n",
" <th>Whisky Bar</th>\n",
" <th>Wine Bar</th>\n",
" <th>Wine Shop</th>\n",
" <th>Wings Joint</th>\n",
" <th>Women's Store</th>\n",
" <th>Yoga Studio</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Marble Hill</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>Marble Hill</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>Marble Hill</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>Marble Hill</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>Marble Hill</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Neighborhood Accessories Store Adult Boutique Afghan Restaurant \\\n",
"0 Marble Hill 0 0 0 \n",
"1 Marble Hill 0 0 0 \n",
"2 Marble Hill 0 0 0 \n",
"3 Marble Hill 0 0 0 \n",
"4 Marble Hill 0 0 0 \n",
"\n",
" African Restaurant American Restaurant Antique Shop Arcade \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" Arepa Restaurant Argentinian Restaurant Art Gallery Art Museum \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" Arts & Crafts Store Asian Restaurant Athletics & Sports Auditorium \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" Australian Restaurant Austrian Restaurant Auto Workshop BBQ Joint \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" Baby Store Bagel Shop Bakery Bank Bar Baseball Field \\\n",
"0 0 0 0 0 0 0 \n",
"1 0 0 0 0 0 0 \n",
"2 0 0 0 0 0 0 \n",
"3 0 0 0 0 0 0 \n",
"4 0 0 0 0 0 0 \n",
"\n",
" Basketball Court Beer Bar Beer Garden Beer Store Big Box Store \\\n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 0 0 0 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 0 \n",
"\n",
" Bike Rental / Bike Share Bike Shop Bike Trail Bistro Board Shop \\\n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 0 0 0 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 0 \n",
"\n",
" Boat or Ferry Bookstore Boutique Boxing Gym Brazilian Restaurant \\\n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 0 0 0 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 0 \n",
"\n",
" Breakfast Spot Bridal Shop Bridge Bubble Tea Shop Building \\\n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 0 0 0 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 0 \n",
"\n",
" Burger Joint Burrito Place Bus Line Bus Station Bus Stop \\\n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 0 0 0 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 0 \n",
"\n",
" Business Service Butcher Cafeteria Café Cambodian Restaurant \\\n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 0 0 0 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 0 \n",
"\n",
" Camera Store Candy Store Cantonese Restaurant Caribbean Restaurant \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" Caucasian Restaurant Cheese Shop Chinese Restaurant Chocolate Shop \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" Circus Climbing Gym Clothing Store Club House Cocktail Bar \\\n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 0 0 0 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 0 \n",
"\n",
" Coffee Shop College Academic Building College Bookstore \\\n",
"0 0 0 0 \n",
"1 0 0 0 \n",
"2 0 0 0 \n",
"3 1 0 0 \n",
"4 0 0 0 \n",
"\n",
" College Cafeteria College Gym College Theater Comedy Club \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" Community Center Concert Hall Convenience Store Cosmetics Shop \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" Coworking Space Creperie Cuban Restaurant Cupcake Shop Cycle Studio \\\n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 0 0 0 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 0 \n",
"\n",
" Czech Restaurant Dance Studio Daycare Deli / Bodega Department Store \\\n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 0 0 0 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 0 \n",
"\n",
" Design Studio Dessert Shop Dim Sum Restaurant Diner Discount Store \\\n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 0 0 1 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 0 \n",
"\n",
" Dive Bar Doctor's Office Dog Run Donut Shop Drugstore Dry Cleaner \\\n",
"0 0 0 0 0 0 0 \n",
"1 0 0 0 0 0 0 \n",
"2 0 0 0 0 0 0 \n",
"3 0 0 0 0 0 0 \n",
"4 0 0 0 1 0 0 \n",
"\n",
" Dumpling Restaurant Duty-free Shop Eastern European Restaurant \\\n",
"0 0 0 0 \n",
"1 0 0 0 \n",
"2 0 0 0 \n",
"3 0 0 0 \n",
"4 0 0 0 \n",
"\n",
" Electronics Store Empanada Restaurant English Restaurant \\\n",
"0 0 0 0 \n",
"1 0 0 0 \n",
"2 0 0 0 \n",
"3 0 0 0 \n",
"4 0 0 0 \n",
"\n",
" Ethiopian Restaurant Event Space Exhibit Falafel Restaurant \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" Farmers Market Fast Food Restaurant Field Filipino Restaurant \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" Financial or Legal Service Fish Market Flea Market Flower Shop \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" Food & Drink Shop Food Court Food Stand Food Truck Fountain \\\n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 0 0 0 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 0 \n",
"\n",
" French Restaurant Fried Chicken Joint Frozen Yogurt Shop \\\n",
"0 0 0 0 \n",
"1 0 0 0 \n",
"2 0 0 0 \n",
"3 0 0 0 \n",
"4 0 0 0 \n",
"\n",
" Furniture / Home Store Gaming Cafe Garden Garden Center Gas Station \\\n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 0 0 0 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 0 \n",
"\n",
" Gastropub Gay Bar General College & University General Entertainment \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" German Restaurant Gift Shop Golf Course Gourmet Shop Greek Restaurant \\\n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 0 0 0 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 0 \n",
"\n",
" Grocery Store Gym Gym / Fitness Center Gym Pool Gymnastics Gym \\\n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 0 0 0 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 0 \n",
"\n",
" Harbor / Marina Hardware Store Hawaiian Restaurant \\\n",
"0 0 0 0 \n",
"1 0 0 0 \n",
"2 0 0 0 \n",
"3 0 0 0 \n",
"4 0 0 0 \n",
"\n",
" Health & Beauty Service Health Food Store Heliport High School \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" Himalayan Restaurant Historic Site History Museum Hobby Shop \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" Hookah Bar Hostel Hot Dog Joint Hotel Hotel Bar Hotpot Restaurant \\\n",
"0 0 0 0 0 0 0 \n",
"1 0 0 0 0 0 0 \n",
"2 0 0 0 0 0 0 \n",
"3 0 0 0 0 0 0 \n",
"4 0 0 0 0 0 0 \n",
"\n",
" Ice Cream Shop Indian Restaurant Indie Movie Theater Indie Theater \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" Intersection Irish Pub Israeli Restaurant Italian Restaurant \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" Japanese Curry Restaurant Japanese Restaurant Jazz Club Jewelry Store \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" Jewish Restaurant Juice Bar Karaoke Bar Kebab Restaurant Kids Store \\\n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 0 0 0 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 0 \n",
"\n",
" Korean Restaurant Kosher Restaurant Latin American Restaurant \\\n",
"0 0 0 0 \n",
"1 0 0 0 \n",
"2 0 0 0 \n",
"3 0 0 0 \n",
"4 0 0 0 \n",
"\n",
" Laundry Service Leather Goods Store Lebanese Restaurant Library \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" Lingerie Store Liquor Store Lounge Malay Restaurant Market \\\n",
"0 0 0 0 0 0 \n",
"1 0 0 0 0 0 \n",
"2 0 0 0 0 0 \n",
"3 0 0 0 0 0 \n",
"4 0 0 0 0 0 \n",
"\n",
" Martial Arts Dojo Massage Studio Medical Center \\\n",
"0 0 0 0 \n",
"1 0 0 0 \n",
"2 0 0 0 \n",
"3 0 0 0 \n",
"4 0 0 0 \n",
"\n",
" Mediterranean Restaurant Memorial Site Men's Store Metro Station \\\n",
"0 0 0 0 0 \n",
"1 0 0 0 0 \n",
"2 0 0 0 0 \n",
"3 0 0 0 0 \n",
"4 0 0 0 0 \n",
"\n",
" Mexican Restaurant Middle Eastern Restaurant Mini Golf \\\n",
"0 0 0 0 \n",
"1 0 0 0 \n",
"2 0 0 0 \n",
"3 0 0 0 \n",
"4 0 0 0 \n",
"\n",
" Miscellaneous Shop Mobile Phone Shop Modern European Restaurant \\\n",
"0 0 0 0 \n",
"1 0 0 0 \n",
"2 0 0 0 \n",
"3 0 0 0 \n",
"4 0 0 0 \n",
"\n",
" Molecular Gastronomy Restaurant Monument / Landmark Moroccan Restaurant \\\n",
"0 0 0
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment