Created
September 29, 2019 15:59
-
-
Save AntonovMikhail/53833780e941097a13d857dd996de355 to your computer and use it in GitHub Desktop.
Created on Cognitive Class Labs
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"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": 6, | |
"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": 7, | |
"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": 7, | |
"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": 8, | |
"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": 9, | |
"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": 9, | |
"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": 10, | |
"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": 11, | |
"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", | |
" <td>0</td>\n", | |
" <td>Bronx</td>\n", | |
" <td>Wakefield</td>\n", | |
" <td>40.894705</td>\n", | |
" <td>-73.847201</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <td>1</td>\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", | |
" <td>2</td>\n", | |
" <td>Bronx</td>\n", | |
" <td>Eastchester</td>\n", | |
" <td>40.887556</td>\n", | |
" <td>-73.827806</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <td>3</td>\n", | |
" <td>Bronx</td>\n", | |
" <td>Fieldston</td>\n", | |
" <td>40.895437</td>\n", | |
" <td>-73.905643</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <td>4</td>\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": 11, | |
"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": 12, | |
"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": 13, | |
"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": 14, | |
"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+ICNtYXBfYzUyYzcwMjQ4YzUxNDQ5YThkZTM5N2JiMTFhZTNlZWEgewogICAgICAgICAgICAgICAgcG9zaXRpb24gOiByZWxhdGl2ZTsKICAgICAgICAgICAgICAgIHdpZHRoIDogMTAwLjAlOwogICAgICAgICAgICAgICAgaGVpZ2h0OiAxMDAuMCU7CiAgICAgICAgICAgICAgICBsZWZ0OiAwLjAlOwogICAgICAgICAgICAgICAgdG9wOiAwLjAlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICA8L3N0eWxlPgogICAgICAgIAo8L2hlYWQ+Cjxib2R5PiAgICAKICAgIAogICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb2xpdW0tbWFwIiBpZD0ibWFwX2M1MmM3MDI0OGM1MTQ0OWE4ZGUzOTdiYjExYWUzZWVhIiA+PC9kaXY+CiAgICAgICAgCjwvYm9keT4KPHNjcmlwdD4gICAgCiAgICAKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGJvdW5kcyA9IG51bGw7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcF9jNTJjNzAyNDhjNTE0NDlhOGRlMzk3YmIxMWFlM2VlYSA9IEwubWFwKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21hcF9jNTJjNzAyNDhjNTE0NDlhOGRlMzk3YmIxMWFlM2VlYScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y2VudGVyOiBbNDAuNzEyNzI4MSwtNzQuMDA2MDE1Ml0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6b29tOiAxMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heEJvdW5kczogYm91bmRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXJzOiBbXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmxkQ29weUp1bXA6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JzOiBMLkNSUy5FUFNHMzg1NwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHRpbGVfbGF5ZXJfOTQxYzZiMjNlOGVhNDM1YzlmMDYxNTUyOWFjMjY5NDAgPSBMLnRpbGVMYXllcigKICAgICAgICAgICAgICAgICdodHRwczovL3tzfS50aWxlLm9wZW5zdHJlZXRtYXAub3JnL3t6fS97eH0ve3l9LnBuZycsCiAgICAgICAgICAgICAgICB7CiAgImF0dHJpYnV0aW9uIjogbnVsbCwKICAiZGV0ZWN0UmV0aW5hIjogZmFsc2UsCiAgIm1heFpvb20iOiAxOCwKICAibWluWm9vbSI6IDEsCiAgIm5vV3JhcCI6IGZhbHNlLAogICJzdWJkb21haW5zIjogImFiYyIKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzUyYzcwMjQ4YzUxNDQ5YThkZTM5N2JiMTFhZTNlZWEpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2Q4ZjFiYzcxNWNiMDQ3NmRiNThmNGU2MTBiNzZiNDk0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODk0NzA1MTc2NjEsLTczLjg0NzIwMDUyMDU0OTAyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2M1MmM3MDI0OGM1MTQ0OWE4ZGUzOTdiYjExYWUzZWVhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzQwMmUzNDBjYzcxMDRhNzRhM2IxNzk1M2U3NDZlNWQ3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzFkYzQ5ZjBhNGE2YTRhZmE4ZjBiZDI3ZGFmOGIzNzUwID0gJCgnPGRpdiBpZD0iaHRtbF8xZGM0OWYwYTRhNmE0YWZhOGYwYmQyN2RhZjhiMzc1MCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+V2FrZWZpZWxkLCBCcm9ueDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNDAyZTM0MGNjNzEwNGE3NGEzYjE3OTUzZTc0NmU1ZDcuc2V0Q29udGVudChodG1sXzFkYzQ5ZjBhNGE2YTRhZmE4ZjBiZDI3ZGFmOGIzNzUwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2Q4ZjFiYzcxNWNiMDQ3NmRiNThmNGU2MTBiNzZiNDk0LmJpbmRQb3B1cChwb3B1cF80MDJlMzQwY2M3MTA0YTc0YTNiMTc5NTNlNzQ2ZTVkNyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85NmE1MjUzYTM1NWE0YzRjODgxNTZkYjYxNDg0Nzc3NiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjg3NDI5NDE5MzAzMDEyLC03My44Mjk5MzkxMDgxMjM5OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jNTJjNzAyNDhjNTE0NDlhOGRlMzk3YmIxMWFlM2VlYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wNWNkOGRhOTU0ZDc0OGU2YWIzMWEwYTc1OWRiYTI3YSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8yYzkyM2UzYzFmZjU0NzZkOWI1Mjc5ZmRhNWQzNWExMSA9ICQoJzxkaXYgaWQ9Imh0bWxfMmM5MjNlM2MxZmY1NDc2ZDliNTI3OWZkYTVkMzVhMTEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNvLW9wIENpdHksIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wNWNkOGRhOTU0ZDc0OGU2YWIzMWEwYTc1OWRiYTI3YS5zZXRDb250ZW50KGh0bWxfMmM5MjNlM2MxZmY1NDc2ZDliNTI3OWZkYTVkMzVhMTEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOTZhNTI1M2EzNTVhNGM0Yzg4MTU2ZGI2MTQ4NDc3NzYuYmluZFBvcHVwKHBvcHVwXzA1Y2Q4ZGE5NTRkNzQ4ZTZhYjMxYTBhNzU5ZGJhMjdhKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2FhYWI3YzRkYzA4ZDQ3NDdiNzQyZTczOTM2YTRlYWNmID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODg3NTU1Njc3MzUwNzc1LC03My44Mjc4MDY0NDcxNjQxMl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jNTJjNzAyNDhjNTE0NDlhOGRlMzk3YmIxMWFlM2VlYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8yOWNkY2Y0M2E4YjM0NTIxODZmNTcxNWNiNjA0MjA4NyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hMGY4OWVmZDAzYzM0M2RmODY3ZTg0NzUyYzI0ZmE2YyA9ICQoJzxkaXYgaWQ9Imh0bWxfYTBmODllZmQwM2MzNDNkZjg2N2U4NDc1MmMyNGZhNmMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkVhc3RjaGVzdGVyLCBCcm9ueDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMjljZGNmNDNhOGIzNDUyMTg2ZjU3MTVjYjYwNDIwODcuc2V0Q29udGVudChodG1sX2EwZjg5ZWZkMDNjMzQzZGY4NjdlODQ3NTJjMjRmYTZjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2FhYWI3YzRkYzA4ZDQ3NDdiNzQyZTczOTM2YTRlYWNmLmJpbmRQb3B1cChwb3B1cF8yOWNkY2Y0M2E4YjM0NTIxODZmNTcxNWNiNjA0MjA4Nyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81Y2EwMjJmOGM1NDM0ZGExYjlmMmQzNTVlYjc2Mzk2YSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjg5NTQzNzQyNjkwMzgzLC03My45MDU2NDI1OTU5MTY4Ml0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jNTJjNzAyNDhjNTE0NDlhOGRlMzk3YmIxMWFlM2VlYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lNmZlZDk5MmM2Y2I0MzgxYmQ1YmE5NGYyZTNiMzg1MyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83NTFhMDU3YjRmNTk0MWJmYjU0OTM1MTY4NWI5Yzk5NCA9ICQoJzxkaXYgaWQ9Imh0bWxfNzUxYTA1N2I0ZjU5NDFiZmI1NDkzNTE2ODViOWM5OTQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkZpZWxkc3RvbiwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2U2ZmVkOTkyYzZjYjQzODFiZDViYTk0ZjJlM2IzODUzLnNldENvbnRlbnQoaHRtbF83NTFhMDU3YjRmNTk0MWJmYjU0OTM1MTY4NWI5Yzk5NCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81Y2EwMjJmOGM1NDM0ZGExYjlmMmQzNTVlYjc2Mzk2YS5iaW5kUG9wdXAocG9wdXBfZTZmZWQ5OTJjNmNiNDM4MWJkNWJhOTRmMmUzYjM4NTMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYWQ4ZDNjODliMmJlNGU0YWFlYmIwYzQ4ZjViMjc2YjQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44OTA4MzQ0OTM4OTEzMDUsLTczLjkxMjU4NTQ2MTA4NTddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzUyYzcwMjQ4YzUxNDQ5YThkZTM5N2JiMTFhZTNlZWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMDczYmMwYmNiYjAxNGMyNDljOTg0MjQ5MDZkZmZjMjEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNzhhMjlhNTI1NzFkNDhkYzk3ZDM4MjI4MDc2NmZiN2YgPSAkKCc8ZGl2IGlkPSJodG1sXzc4YTI5YTUyNTcxZDQ4ZGM5N2QzODIyODA3NjZmYjdmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5SaXZlcmRhbGUsIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wNzNiYzBiY2JiMDE0YzI0OWM5ODQyNDkwNmRmZmMyMS5zZXRDb250ZW50KGh0bWxfNzhhMjlhNTI1NzFkNDhkYzk3ZDM4MjI4MDc2NmZiN2YpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYWQ4ZDNjODliMmJlNGU0YWFlYmIwYzQ4ZjViMjc2YjQuYmluZFBvcHVwKHBvcHVwXzA3M2JjMGJjYmIwMTRjMjQ5Yzk4NDI0OTA2ZGZmYzIxKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzM4NDY4NDM5ZGRhOTQ3MWI5YmUwYjBhZWYzMWMyOGEzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODgxNjg3MzcxMjA1MjEsLTczLjkwMjgxNzk4NzI0NjA0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2M1MmM3MDI0OGM1MTQ0OWE4ZGUzOTdiYjExYWUzZWVhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzVmZmE5MGYwOTdjNzRhNmZhOTBkMmZiYTQ3NzkzZjA5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2Y0OGIzYjcyZWNlODQwZDBhN2Y3N2QyZGU1YjBkMmRkID0gJCgnPGRpdiBpZD0iaHRtbF9mNDhiM2I3MmVjZTg0MGQwYTdmNzdkMmRlNWIwZDJkZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+S2luZ3NicmlkZ2UsIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81ZmZhOTBmMDk3Yzc0YTZmYTkwZDJmYmE0Nzc5M2YwOS5zZXRDb250ZW50KGh0bWxfZjQ4YjNiNzJlY2U4NDBkMGE3Zjc3ZDJkZTViMGQyZGQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMzg0Njg0MzlkZGE5NDcxYjliZTBiMGFlZjMxYzI4YTMuYmluZFBvcHVwKHBvcHVwXzVmZmE5MGYwOTdjNzRhNmZhOTBkMmZiYTQ3NzkzZjA5KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2IwNmFkZWU0NzU3ZTRjZTI4NzhkMTZlYzdiOWY4YjZkID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODc2NTUwNzc4Nzk5NjQsLTczLjkxMDY1OTY1ODYyOTgxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2M1MmM3MDI0OGM1MTQ0OWE4ZGUzOTdiYjExYWUzZWVhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzAwZjFhYzA2ZDVmNTRmODBiYjhhZjVkYjg1OTIzNjg1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzNiYTgzZjE3OGFiOTQzYTE5NjMwNzI3NWUxNWM1NzczID0gJCgnPGRpdiBpZD0iaHRtbF8zYmE4M2YxNzhhYjk0M2ExOTYzMDcyNzVlMTVjNTc3MyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TWFyYmxlIEhpbGwsIE1hbmhhdHRhbjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMDBmMWFjMDZkNWY1NGY4MGJiOGFmNWRiODU5MjM2ODUuc2V0Q29udGVudChodG1sXzNiYTgzZjE3OGFiOTQzYTE5NjMwNzI3NWUxNWM1NzczKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2IwNmFkZWU0NzU3ZTRjZTI4NzhkMTZlYzdiOWY4YjZkLmJpbmRQb3B1cChwb3B1cF8wMGYxYWMwNmQ1ZjU0ZjgwYmI4YWY1ZGI4NTkyMzY4NSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl82ZmM1ZDAxYjgwZDU0NmUzYjcxOTkxMzgzMDA2MDY2MCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjg5ODI3MjYxMjEzODA1LC03My44NjczMTQ5NjgxNDE3Nl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jNTJjNzAyNDhjNTE0NDlhOGRlMzk3YmIxMWFlM2VlYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9kZDc4MTQ1MGIxZjM0YjAyYTZlNGQ2ZDJjMWM0NjE3ZSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lYzcxZTRjODExNzI0NTg5OTRkYzRkNmQ3OWZiZjczMiA9ICQoJzxkaXYgaWQ9Imh0bWxfZWM3MWU0YzgxMTcyNDU4OTk0ZGM0ZDZkNzlmYmY3MzIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPldvb2RsYXduLCBCcm9ueDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZGQ3ODE0NTBiMWYzNGIwMmE2ZTRkNmQyYzFjNDYxN2Uuc2V0Q29udGVudChodG1sX2VjNzFlNGM4MTE3MjQ1ODk5NGRjNGQ2ZDc5ZmJmNzMyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzZmYzVkMDFiODBkNTQ2ZTNiNzE5OTEzODMwMDYwNjYwLmJpbmRQb3B1cChwb3B1cF9kZDc4MTQ1MGIxZjM0YjAyYTZlNGQ2ZDJjMWM0NjE3ZSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8yZjZkMWFmY2ZhZTU0OTUzYjllM2YwYjAwMDRjMDU1YiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjg3NzIyNDE1NTk5NDQ2LC03My44NzkzOTA3Mzk1NjgxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2M1MmM3MDI0OGM1MTQ0OWE4ZGUzOTdiYjExYWUzZWVhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2RjMWFmYjE0Mjc2NzQ0MzVhMWZlYjQ1Zjg2OTlmMDc1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzIzNjA2YWEwNTczYzQ1NTlhOGUyNTlhZGJlZjhkYTQ4ID0gJCgnPGRpdiBpZD0iaHRtbF8yMzYwNmFhMDU3M2M0NTU5YThlMjU5YWRiZWY4ZGE0OCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Tm9yd29vZCwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2RjMWFmYjE0Mjc2NzQ0MzVhMWZlYjQ1Zjg2OTlmMDc1LnNldENvbnRlbnQoaHRtbF8yMzYwNmFhMDU3M2M0NTU5YThlMjU5YWRiZWY4ZGE0OCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8yZjZkMWFmY2ZhZTU0OTUzYjllM2YwYjAwMDRjMDU1Yi5iaW5kUG9wdXAocG9wdXBfZGMxYWZiMTQyNzY3NDQzNWExZmViNDVmODY5OWYwNzUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNDcxOGIyNzA1ZDZiNDk4NTgzZThjYzgwYzBiYWM2NjYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44ODEwMzg4NzgxOTIxMSwtNzMuODU3NDQ2NDI5NzQyMDddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzUyYzcwMjQ4YzUxNDQ5YThkZTM5N2JiMTFhZTNlZWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNDJjZTgxMmQ2OGYxNDVkM2EzMTcwODhjNWVkYmI0NjAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZmJiMDE1ZGNmNGRhNGY4Y2ExY2ExZGI4ZWVlOWUxNjkgPSAkKCc8ZGl2IGlkPSJodG1sX2ZiYjAxNWRjZjRkYTRmOGNhMWNhMWRiOGVlZTllMTY5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5XaWxsaWFtc2JyaWRnZSwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzQyY2U4MTJkNjhmMTQ1ZDNhMzE3MDg4YzVlZGJiNDYwLnNldENvbnRlbnQoaHRtbF9mYmIwMTVkY2Y0ZGE0ZjhjYTFjYTFkYjhlZWU5ZTE2OSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl80NzE4YjI3MDVkNmI0OTg1ODNlOGNjODBjMGJhYzY2Ni5iaW5kUG9wdXAocG9wdXBfNDJjZTgxMmQ2OGYxNDVkM2EzMTcwODhjNWVkYmI0NjApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYzFiNmJiMjYxODIyNDAxY2I2MDFlMmVhOWQwZjNiOTggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44NjY4NTgxMDcyNTI2OTYsLTczLjgzNTc5NzU5ODA4MTE3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2M1MmM3MDI0OGM1MTQ0OWE4ZGUzOTdiYjExYWUzZWVhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2ZkNTRhYTUxN2NhYTQxZDQ4YmIyNmY5NjVmODFhMDA1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2U3YjQwZDI2Y2NhNDQ1MTI5NWMzNmYxNGI1OWZkOGM3ID0gJCgnPGRpdiBpZD0iaHRtbF9lN2I0MGQyNmNjYTQ0NTEyOTVjMzZmMTRiNTlmZDhjNyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QmF5Y2hlc3RlciwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2ZkNTRhYTUxN2NhYTQxZDQ4YmIyNmY5NjVmODFhMDA1LnNldENvbnRlbnQoaHRtbF9lN2I0MGQyNmNjYTQ0NTEyOTVjMzZmMTRiNTlmZDhjNyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9jMWI2YmIyNjE4MjI0MDFjYjYwMWUyZWE5ZDBmM2I5OC5iaW5kUG9wdXAocG9wdXBfZmQ1NGFhNTE3Y2FhNDFkNDhiYjI2Zjk2NWY4MWEwMDUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYWI3OTI1YTkyNTg4NDdjNGJhNWY2MTZkNzUzOGU4MTkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44NTc0MTM0OTgwODg2NSwtNzMuODU0NzU1NjQwMTc5OTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzUyYzcwMjQ4YzUxNDQ5YThkZTM5N2JiMTFhZTNlZWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNGY2MTc0ZDQ1YmRhNDMxMTk0MGVlMDFkYzc4ZTU5ZmIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfY2Y1YzliNDJlMGY1NGM5NGEyZWMxMDExMzI5OTBkZmQgPSAkKCc8ZGl2IGlkPSJodG1sX2NmNWM5YjQyZTBmNTRjOTRhMmVjMTAxMTMyOTkwZGZkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5QZWxoYW0gUGFya3dheSwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzRmNjE3NGQ0NWJkYTQzMTE5NDBlZTAxZGM3OGU1OWZiLnNldENvbnRlbnQoaHRtbF9jZjVjOWI0MmUwZjU0Yzk0YTJlYzEwMTEzMjk5MGRmZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9hYjc5MjVhOTI1ODg0N2M0YmE1ZjYxNmQ3NTM4ZTgxOS5iaW5kUG9wdXAocG9wdXBfNGY2MTc0ZDQ1YmRhNDMxMTk0MGVlMDFkYzc4ZTU5ZmIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZmRhMGRiZjY4Yjg4NDdkYzk5ZjVlN2MzZjllODY0ZTYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44NDcyNDY3MDQ5MTgxMywtNzMuNzg2NDg4NDUyNjc0MTNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzUyYzcwMjQ4YzUxNDQ5YThkZTM5N2JiMTFhZTNlZWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYTA0NzQyZTdjNWYzNDlmNmFlYmZlMTllYzAyMmRkNTMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNmJiMmVlNGNiODY0NDNkNjg4M2QyOGY3NzAwNWU0OTEgPSAkKCc8ZGl2IGlkPSJodG1sXzZiYjJlZTRjYjg2NDQzZDY4ODNkMjhmNzcwMDVlNDkxIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DaXR5IElzbGFuZCwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2EwNDc0MmU3YzVmMzQ5ZjZhZWJmZTE5ZWMwMjJkZDUzLnNldENvbnRlbnQoaHRtbF82YmIyZWU0Y2I4NjQ0M2Q2ODgzZDI4Zjc3MDA1ZTQ5MSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9mZGEwZGJmNjhiODg0N2RjOTlmNWU3YzNmOWU4NjRlNi5iaW5kUG9wdXAocG9wdXBfYTA0NzQyZTdjNWYzNDlmNmFlYmZlMTllYzAyMmRkNTMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNzk0MjE3YmEyOTE0NDA0Zjk1Yzg5MzZlZjVlMDczY2MgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44NzAxODUxNjQ5NzUzMjUsLTczLjg4NTUxMjE4NDE5MTNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzUyYzcwMjQ4YzUxNDQ5YThkZTM5N2JiMTFhZTNlZWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNDVjOGM1ODE2YWJkNGIzYjliMjk5MzUxMjYzMzg5YTIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfN2Y4NWZjMjU3NTNjNDM5YmI2M2FiNzgwNDVhNzc3OWIgPSAkKCc8ZGl2IGlkPSJodG1sXzdmODVmYzI1NzUzYzQzOWJiNjNhYjc4MDQ1YTc3NzliIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5CZWRmb3JkIFBhcmssIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80NWM4YzU4MTZhYmQ0YjNiOWIyOTkzNTEyNjMzODlhMi5zZXRDb250ZW50KGh0bWxfN2Y4NWZjMjU3NTNjNDM5YmI2M2FiNzgwNDVhNzc3OWIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNzk0MjE3YmEyOTE0NDA0Zjk1Yzg5MzZlZjVlMDczY2MuYmluZFBvcHVwKHBvcHVwXzQ1YzhjNTgxNmFiZDRiM2I5YjI5OTM1MTI2MzM4OWEyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzM3ZGJjYzkzYmIwODQ2ODhhYTIyZThiNGZkNTIwZTE3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODU1NzI3MDc3MTk2NjQsLTczLjkxMDQxNTk2MTkxMzFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzUyYzcwMjQ4YzUxNDQ5YThkZTM5N2JiMTFhZTNlZWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMTIwZDk2NTcyMzYwNDdmYTg1NGJkZGM4M2IwYTYxM2UgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZjg3ZjgxNjAzODZmNGJkMDliMWJkODIxOTM4MWIzM2UgPSAkKCc8ZGl2IGlkPSJodG1sX2Y4N2Y4MTYwMzg2ZjRiZDA5YjFiZDgyMTkzODFiMzNlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Vbml2ZXJzaXR5IEhlaWdodHMsIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xMjBkOTY1NzIzNjA0N2ZhODU0YmRkYzgzYjBhNjEzZS5zZXRDb250ZW50KGh0bWxfZjg3ZjgxNjAzODZmNGJkMDliMWJkODIxOTM4MWIzM2UpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMzdkYmNjOTNiYjA4NDY4OGFhMjJlOGI0ZmQ1MjBlMTcuYmluZFBvcHVwKHBvcHVwXzEyMGQ5NjU3MjM2MDQ3ZmE4NTRiZGRjODNiMGE2MTNlKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2NkYmNlZTRhZjMyODQxZmQ5NDJhMGRkODE0NjBmMzUwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODQ3ODk3OTI2MDYyNzEsLTczLjkxOTY3MTU5MTE5NTY1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2M1MmM3MDI0OGM1MTQ0OWE4ZGUzOTdiYjExYWUzZWVhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzMzM2ZjMjJhYWM3MDQ3OGNhNjY3YjE4NGQ2ZjNjZjgwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2RiZTFiZWQ1OTYwMDRhMjQ4OTBlMzQ3MTU0NjJjOGM2ID0gJCgnPGRpdiBpZD0iaHRtbF9kYmUxYmVkNTk2MDA0YTI0ODkwZTM0NzE1NDYyYzhjNiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TW9ycmlzIEhlaWdodHMsIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zMzNmYzIyYWFjNzA0NzhjYTY2N2IxODRkNmYzY2Y4MC5zZXRDb250ZW50KGh0bWxfZGJlMWJlZDU5NjAwNGEyNDg5MGUzNDcxNTQ2MmM4YzYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfY2RiY2VlNGFmMzI4NDFmZDk0MmEwZGQ4MTQ2MGYzNTAuYmluZFBvcHVwKHBvcHVwXzMzM2ZjMjJhYWM3MDQ3OGNhNjY3YjE4NGQ2ZjNjZjgwKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzZmMDUxN2ViZDk2YTRkNjhhNDU5M2RhOTc3Yjk1YTU1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODYwOTk2Nzk2Mzg2NTQsLTczLjg5NjQyNjU1OTgxNjIzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2M1MmM3MDI0OGM1MTQ0OWE4ZGUzOTdiYjExYWUzZWVhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzk1ZDFkMjRjOTQ5ZDQ2ZGNiYTA3MTQ5NjNmY2FhMTdjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzk0OTlmNDhkMjA0MzQ3YThiZDBlZWY2NjU2MTZjMWVjID0gJCgnPGRpdiBpZD0iaHRtbF85NDk5ZjQ4ZDIwNDM0N2E4YmQwZWVmNjY1NjE2YzFlYyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Rm9yZGhhbSwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzk1ZDFkMjRjOTQ5ZDQ2ZGNiYTA3MTQ5NjNmY2FhMTdjLnNldENvbnRlbnQoaHRtbF85NDk5ZjQ4ZDIwNDM0N2E4YmQwZWVmNjY1NjE2YzFlYyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl82ZjA1MTdlYmQ5NmE0ZDY4YTQ1OTNkYTk3N2I5NWE1NS5iaW5kUG9wdXAocG9wdXBfOTVkMWQyNGM5NDlkNDZkY2JhMDcxNDk2M2ZjYWExN2MpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNmRlNTcxMDNkMGE2NGRlN2JkZTU2NmQ3NGExZTJkMzQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44NDI2OTYxNTc4NjA1MywtNzMuODg3MzU2MTc1MzIzMzhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzUyYzcwMjQ4YzUxNDQ5YThkZTM5N2JiMTFhZTNlZWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYTMxOGY2ZGYwM2VlNDE4ZWJmY2MyNTVhM2JmMmM2N2IgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMzMwODZiNDhjNjZjNDRkOGE1OWU4ZjJkOWFiZWZhMDcgPSAkKCc8ZGl2IGlkPSJodG1sXzMzMDg2YjQ4YzY2YzQ0ZDhhNTllOGYyZDlhYmVmYTA3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5FYXN0IFRyZW1vbnQsIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hMzE4ZjZkZjAzZWU0MThlYmZjYzI1NWEzYmYyYzY3Yi5zZXRDb250ZW50KGh0bWxfMzMwODZiNDhjNjZjNDRkOGE1OWU4ZjJkOWFiZWZhMDcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNmRlNTcxMDNkMGE2NGRlN2JkZTU2NmQ3NGExZTJkMzQuYmluZFBvcHVwKHBvcHVwX2EzMThmNmRmMDNlZTQxOGViZmNjMjU1YTNiZjJjNjdiKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzNlZTc5YWZkNjhiODQzMWJiY2E4N2JhZWVkODBmODg1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODM5NDc1MDU2NzI2NTMsLTczLjg3Nzc0NDc0OTEwNTQ1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2M1MmM3MDI0OGM1MTQ0OWE4ZGUzOTdiYjExYWUzZWVhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2Q5ZmZlNDlhNmJhYzQwMTI5N2IxOWQ3OGM4ZmYzY2ZiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2NhMzUxZDQzMzhkODQxYzJiNmZmMjI0NjIzODYwYjhiID0gJCgnPGRpdiBpZD0iaHRtbF9jYTM1MWQ0MzM4ZDg0MWMyYjZmZjIyNDYyMzg2MGI4YiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+V2VzdCBGYXJtcywgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2Q5ZmZlNDlhNmJhYzQwMTI5N2IxOWQ3OGM4ZmYzY2ZiLnNldENvbnRlbnQoaHRtbF9jYTM1MWQ0MzM4ZDg0MWMyYjZmZjIyNDYyMzg2MGI4Yik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8zZWU3OWFmZDY4Yjg0MzFiYmNhODdiYWVlZDgwZjg4NS5iaW5kUG9wdXAocG9wdXBfZDlmZmU0OWE2YmFjNDAxMjk3YjE5ZDc4YzhmZjNjZmIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNWE3NTA5YmNhZDBmNGI3YmI4ZGViYmJlMzJhM2Y2NjkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44MzY2MjMwMTA3MDYwNTYsLTczLjkyNjEwMjA5MzU4MTNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzUyYzcwMjQ4YzUxNDQ5YThkZTM5N2JiMTFhZTNlZWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMWZhMjkzOWUyNTg3NDAxOTkzYzk2MGRlYWQ1NzgwYWEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNTA2MzUzY2Y4ODFhNDg3N2I4MjlmM2UzZjMxZmI3YzEgPSAkKCc8ZGl2IGlkPSJodG1sXzUwNjM1M2NmODgxYTQ4NzdiODI5ZjNlM2YzMWZiN2MxIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5IaWdoICBCcmlkZ2UsIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xZmEyOTM5ZTI1ODc0MDE5OTNjOTYwZGVhZDU3ODBhYS5zZXRDb250ZW50KGh0bWxfNTA2MzUzY2Y4ODFhNDg3N2I4MjlmM2UzZjMxZmI3YzEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNWE3NTA5YmNhZDBmNGI3YmI4ZGViYmJlMzJhM2Y2NjkuYmluZFBvcHVwKHBvcHVwXzFmYTI5MzllMjU4NzQwMTk5M2M5NjBkZWFkNTc4MGFhKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzQ4MTY0MzI5NjcwYTQ0NTI4MWI1NzMwYzQ1YWU4ZDQxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODE5NzU0MzcwNTk0OTM2LC03My45MDk0MjE2MDc1NzQzNl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jNTJjNzAyNDhjNTE0NDlhOGRlMzk3YmIxMWFlM2VlYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wMjdhMmY4Y2NhNGU0NTZiOTViYTUzYzgyMzNiOWM4OCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wMGVhYWIzZWMyNWI0MjEyYWIxYTY3MjJkNjRkMTE2ZCA9ICQoJzxkaXYgaWQ9Imh0bWxfMDBlYWFiM2VjMjViNDIxMmFiMWE2NzIyZDY0ZDExNmQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk1lbHJvc2UsIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wMjdhMmY4Y2NhNGU0NTZiOTViYTUzYzgyMzNiOWM4OC5zZXRDb250ZW50KGh0bWxfMDBlYWFiM2VjMjViNDIxMmFiMWE2NzIyZDY0ZDExNmQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNDgxNjQzMjk2NzBhNDQ1MjgxYjU3MzBjNDVhZThkNDEuYmluZFBvcHVwKHBvcHVwXzAyN2EyZjhjY2E0ZTQ1NmI5NWJhNTNjODIzM2I5Yzg4KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzc2YTRkMDY2ZTU5NTRhOTZhZWU1Y2E4NDIxNDEyYWJhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODA2MjM4NzQ5MzUxNzcsLTczLjkxNjA5OTg3NDg3NTc1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2M1MmM3MDI0OGM1MTQ0OWE4ZGUzOTdiYjExYWUzZWVhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2M4MTkwY2NjYWM0MTQzYjZiNjcxMTUxOTcxODE3NDg2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2ZmMWYyNjQ0MzNhNDRhZjBhNDQwMTJiZTM5NTkzMjNhID0gJCgnPGRpdiBpZD0iaHRtbF9mZjFmMjY0NDMzYTQ0YWYwYTQ0MDEyYmUzOTU5MzIzYSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TW90dCBIYXZlbiwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2M4MTkwY2NjYWM0MTQzYjZiNjcxMTUxOTcxODE3NDg2LnNldENvbnRlbnQoaHRtbF9mZjFmMjY0NDMzYTQ0YWYwYTQ0MDEyYmUzOTU5MzIzYSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl83NmE0ZDA2NmU1OTU0YTk2YWVlNWNhODQyMTQxMmFiYS5iaW5kUG9wdXAocG9wdXBfYzgxOTBjY2NhYzQxNDNiNmI2NzExNTE5NzE4MTc0ODYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYjJiY2EzMjM0NDUzNDJlMjgwNTcwODQxNGIwYmViNWMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44MDE2NjM2Mjc3NTYyMDYsLTczLjkxMzIyMTM5Mzg2MTM1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2M1MmM3MDI0OGM1MTQ0OWE4ZGUzOTdiYjExYWUzZWVhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2NjZjY4YzUxYWFhMjRhN2JiZDNhZDRkZDMwYThhYjlhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2NlZTg5MjZlN2ZhMzRkNGQ5NDc4Y2Y0NGViODEwODA1ID0gJCgnPGRpdiBpZD0iaHRtbF9jZWU4OTI2ZTdmYTM0ZDRkOTQ3OGNmNDRlYjgxMDgwNSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UG9ydCBNb3JyaXMsIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jY2Y2OGM1MWFhYTI0YTdiYmQzYWQ0ZGQzMGE4YWI5YS5zZXRDb250ZW50KGh0bWxfY2VlODkyNmU3ZmEzNGQ0ZDk0NzhjZjQ0ZWI4MTA4MDUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYjJiY2EzMjM0NDUzNDJlMjgwNTcwODQxNGIwYmViNWMuYmluZFBvcHVwKHBvcHVwX2NjZjY4YzUxYWFhMjRhN2JiZDNhZDRkZDMwYThhYjlhKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2E3NzE0MTRkMjQxNjRkZTlhZTNjNjliZmNlYmVjNDA2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODE1MDk5MDQ1NDU4MjIsLTczLjg5NTc4ODIwMDk0NDZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzUyYzcwMjQ4YzUxNDQ5YThkZTM5N2JiMTFhZTNlZWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMTBkZGYzNzZkNzE5NDRhOGE0NTk3ZTMxMzQzMzRmN2QgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZDRkMmRjMmFkZTIyNDE3ZGI1MTljYTcwNjQ1MTc1MjYgPSAkKCc8ZGl2IGlkPSJodG1sX2Q0ZDJkYzJhZGUyMjQxN2RiNTE5Y2E3MDY0NTE3NTI2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Mb25nd29vZCwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzEwZGRmMzc2ZDcxOTQ0YThhNDU5N2UzMTM0MzM0ZjdkLnNldENvbnRlbnQoaHRtbF9kNGQyZGMyYWRlMjI0MTdkYjUxOWNhNzA2NDUxNzUyNik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9hNzcxNDE0ZDI0MTY0ZGU5YWUzYzY5YmZjZWJlYzQwNi5iaW5kUG9wdXAocG9wdXBfMTBkZGYzNzZkNzE5NDRhOGE0NTk3ZTMxMzQzMzRmN2QpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOWI4OWFlNTIwMTRkNDFjOGJmNjJmNzA0NDExYmY4NTAgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44MDk3Mjk4NzkzODcwOSwtNzMuODgzMzE1MDU5NTUyOTFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzUyYzcwMjQ4YzUxNDQ5YThkZTM5N2JiMTFhZTNlZWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOGE3NWFmN2FhZDRiNDE2MGFjYTViYjQxMWNkZTBkMDMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNDYzNmMzYzU2N2NkNGY3MWI2NGRiMjJjNTBkMjBlN2EgPSAkKCc8ZGl2IGlkPSJodG1sXzQ2MzZjM2M1NjdjZDRmNzFiNjRkYjIyYzUwZDIwZTdhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5IdW50cyBQb2ludCwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzhhNzVhZjdhYWQ0YjQxNjBhY2E1YmI0MTFjZGUwZDAzLnNldENvbnRlbnQoaHRtbF80NjM2YzNjNTY3Y2Q0ZjcxYjY0ZGIyMmM1MGQyMGU3YSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl85Yjg5YWU1MjAxNGQ0MWM4YmY2MmY3MDQ0MTFiZjg1MC5iaW5kUG9wdXAocG9wdXBfOGE3NWFmN2FhZDRiNDE2MGFjYTViYjQxMWNkZTBkMDMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNDM4Yzc1YjY2Y2E3NDBiY2FhNzQyYjA4M2FjNjdlOGYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44MjM1OTE5ODU4NTUzNCwtNzMuOTAxNTA2NDg5NDMwNTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzUyYzcwMjQ4YzUxNDQ5YThkZTM5N2JiMTFhZTNlZWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNTE1NWIyNjA0MDRkNDY3ZGEyNGU0NjJkZTJkZTI2MzIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYjIzOTVkODZlMTgxNGYxNjk3ZDNkNmUwNjhhMmRiNDUgPSAkKCc8ZGl2IGlkPSJodG1sX2IyMzk1ZDg2ZTE4MTRmMTY5N2QzZDZlMDY4YTJkYjQ1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Nb3JyaXNhbmlhLCBCcm9ueDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNTE1NWIyNjA0MDRkNDY3ZGEyNGU0NjJkZTJkZTI2MzIuc2V0Q29udGVudChodG1sX2IyMzk1ZDg2ZTE4MTRmMTY5N2QzZDZlMDY4YTJkYjQ1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzQzOGM3NWI2NmNhNzQwYmNhYTc0MmIwODNhYzY3ZThmLmJpbmRQb3B1cChwb3B1cF81MTU1YjI2MDQwNGQ0NjdkYTI0ZTQ2MmRlMmRlMjYzMik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lOGNhZThmMTRkNWE0N2M1OGJmNDNhOWUzOTNkYjFjZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjgyMTAxMjE5NzkxNDAxNSwtNzMuODY1NzQ2MDk1NTQ5MjRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzUyYzcwMjQ4YzUxNDQ5YThkZTM5N2JiMTFhZTNlZWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYjMyMTVkNTkwY2I4NDMyNjhkZGRjNjMxNmJiYWRhM2UgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMTA4OWQ3ZGM0ZGQ0NDIxMWFiMWE5YmY1ZjhjZDZjMTkgPSAkKCc8ZGl2IGlkPSJodG1sXzEwODlkN2RjNGRkNDQyMTFhYjFhOWJmNWY4Y2Q2YzE5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Tb3VuZHZpZXcsIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iMzIxNWQ1OTBjYjg0MzI2OGRkZGM2MzE2YmJhZGEzZS5zZXRDb250ZW50KGh0bWxfMTA4OWQ3ZGM0ZGQ0NDIxMWFiMWE5YmY1ZjhjZDZjMTkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZThjYWU4ZjE0ZDVhNDdjNThiZjQzYTllMzkzZGIxY2UuYmluZFBvcHVwKHBvcHVwX2IzMjE1ZDU5MGNiODQzMjY4ZGRkYzYzMTZiYmFkYTNlKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2ZjZjkxMDcyYzYzYTRmNzBhMDU4NTBmOWI0NDU5NGZhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODA2NTUxMTIwMDM1ODksLTczLjg1NDE0NDE2MTg5MjY2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2M1MmM3MDI0OGM1MTQ0OWE4ZGUzOTdiYjExYWUzZWVhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2E2YjA0ZDRkMzU4YTRlNGRhY2Q5YWE5ZTc5OGFlMTcwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzM1Yjc4ZTQzOTE4YTRjY2Q5ZDA3MmI0Zjk4YTNlYTBjID0gJCgnPGRpdiBpZD0iaHRtbF8zNWI3OGU0MzkxOGE0Y2NkOWQwNzJiNGY5OGEzZWEwYyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q2xhc29uIFBvaW50LCBCcm9ueDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYTZiMDRkNGQzNThhNGU0ZGFjZDlhYTllNzk4YWUxNzAuc2V0Q29udGVudChodG1sXzM1Yjc4ZTQzOTE4YTRjY2Q5ZDA3MmI0Zjk4YTNlYTBjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2ZjZjkxMDcyYzYzYTRmNzBhMDU4NTBmOWI0NDU5NGZhLmJpbmRQb3B1cChwb3B1cF9hNmIwNGQ0ZDM1OGE0ZTRkYWNkOWFhOWU3OThhZTE3MCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8yMDE5MmJjMmY5OTA0OGJiYTI3MmY5ODY2OTZmNzA1MSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjgxNTEwOTI1ODA0MDA1LC03My44MTYzNTAwMjE1ODQ0MV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jNTJjNzAyNDhjNTE0NDlhOGRlMzk3YmIxMWFlM2VlYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8yNjIzODZjZDM5ODM0NjBiYjIxYWZlMmY3MTMzZjlhMSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jOTdkY2YyZTJhZDQ0OTQwYmQ0Y2JlZmVhMjJkMGEzOSA9ICQoJzxkaXYgaWQ9Imh0bWxfYzk3ZGNmMmUyYWQ0NDk0MGJkNGNiZWZlYTIyZDBhMzkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlRocm9ncyBOZWNrLCBCcm9ueDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMjYyMzg2Y2QzOTgzNDYwYmIyMWFmZTJmNzEzM2Y5YTEuc2V0Q29udGVudChodG1sX2M5N2RjZjJlMmFkNDQ5NDBiZDRjYmVmZWEyMmQwYTM5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzIwMTkyYmMyZjk5MDQ4YmJhMjcyZjk4NjY5NmY3MDUxLmJpbmRQb3B1cChwb3B1cF8yNjIzODZjZDM5ODM0NjBiYjIxYWZlMmY3MTMzZjlhMSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl83NmQ4MDBiOTdjNDA0ODBlYjEwMmU0ODAzZDZjYTdlOCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjg0NDI0NTkzNjk0NzM3NCwtNzMuODI0MDk5MjY3NTM4NV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jNTJjNzAyNDhjNTE0NDlhOGRlMzk3YmIxMWFlM2VlYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9jYWI2ZjBlZTllMmY0MGRmYTU1NDhkMmNiY2MyZDk0YyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8yNzlmZmExY2MyNTk0YWEyOTRmZTE3NTg2ZWI2ZTNiYiA9ICQoJzxkaXYgaWQ9Imh0bWxfMjc5ZmZhMWNjMjU5NGFhMjk0ZmUxNzU4NmViNmUzYmIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNvdW50cnkgQ2x1YiwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2NhYjZmMGVlOWUyZjQwZGZhNTU0OGQyY2JjYzJkOTRjLnNldENvbnRlbnQoaHRtbF8yNzlmZmExY2MyNTk0YWEyOTRmZTE3NTg2ZWI2ZTNiYik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl83NmQ4MDBiOTdjNDA0ODBlYjEwMmU0ODAzZDZjYTdlOC5iaW5kUG9wdXAocG9wdXBfY2FiNmYwZWU5ZTJmNDBkZmE1NTQ4ZDJjYmNjMmQ5NGMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNzIwNjY2M2NjYWNlNDdmY2FmODhjODAyN2FmYTQ5YzcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44Mzc5Mzc4MjIyNjcyODYsLTczLjg1NjAwMzEwNTM1NzgzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2M1MmM3MDI0OGM1MTQ0OWE4ZGUzOTdiYjExYWUzZWVhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzRhZTU0MWFiOGU3OTRhZmZiMjMzODNlOTEyY2FkYjg0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2I2ZTg0ZDcwYmNkYzQ4NTJhZmFiOGY3ZDI5OTkwNmU4ID0gJCgnPGRpdiBpZD0iaHRtbF9iNmU4NGQ3MGJjZGM0ODUyYWZhYjhmN2QyOTk5MDZlOCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UGFya2NoZXN0ZXIsIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80YWU1NDFhYjhlNzk0YWZmYjIzMzgzZTkxMmNhZGI4NC5zZXRDb250ZW50KGh0bWxfYjZlODRkNzBiY2RjNDg1MmFmYWI4ZjdkMjk5OTA2ZTgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNzIwNjY2M2NjYWNlNDdmY2FmODhjODAyN2FmYTQ5YzcuYmluZFBvcHVwKHBvcHVwXzRhZTU0MWFiOGU3OTRhZmZiMjMzODNlOTEyY2FkYjg0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzliOTVhYmE0ZTQ0YTRiZWJhOWJlYjI4NTU5YWQyNDFhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODQwNjE5NDk2NDMyNywtNzMuODQyMTk0MDc2MDQ0NDRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzUyYzcwMjQ4YzUxNDQ5YThkZTM5N2JiMTFhZTNlZWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNTIwYTg1MGIzNmNjNDA0YjliMDg5YmM0ZDk5MzI2MzggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNTFjYzU2MjljZGVmNDc3OGIzM2RjNjQ0MTg5MDg1NDkgPSAkKCc8ZGl2IGlkPSJodG1sXzUxY2M1NjI5Y2RlZjQ3NzhiMzNkYzY0NDE4OTA4NTQ5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5XZXN0Y2hlc3RlciBTcXVhcmUsIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81MjBhODUwYjM2Y2M0MDRiOWIwODliYzRkOTkzMjYzOC5zZXRDb250ZW50KGh0bWxfNTFjYzU2MjljZGVmNDc3OGIzM2RjNjQ0MTg5MDg1NDkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOWI5NWFiYTRlNDRhNGJlYmE5YmViMjg1NTlhZDI0MWEuYmluZFBvcHVwKHBvcHVwXzUyMGE4NTBiMzZjYzQwNGI5YjA4OWJjNGQ5OTMyNjM4KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzA2NWEwMDUxYmQ4NTQ3ZmM5NWY0ZmMwZDIxM2VmYTE2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODQzNjA4NDcxMjQ3MTgsLTczLjg2NjI5OTE4MDc1NjFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzUyYzcwMjQ4YzUxNDQ5YThkZTM5N2JiMTFhZTNlZWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOTg3MWZkZDcyNTEyNDRhMGExNzE0Y2RjNDhjNTVhMGIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNmUyYThjMmNjMWQxNDI3OThhNTQ5ZjAyYmY4MTQ0ODYgPSAkKCc8ZGl2IGlkPSJodG1sXzZlMmE4YzJjYzFkMTQyNzk4YTU0OWYwMmJmODE0NDg2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5WYW4gTmVzdCwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzk4NzFmZGQ3MjUxMjQ0YTBhMTcxNGNkYzQ4YzU1YTBiLnNldENvbnRlbnQoaHRtbF82ZTJhOGMyY2MxZDE0Mjc5OGE1NDlmMDJiZjgxNDQ4Nik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8wNjVhMDA1MWJkODU0N2ZjOTVmNGZjMGQyMTNlZmExNi5iaW5kUG9wdXAocG9wdXBfOTg3MWZkZDcyNTEyNDRhMGExNzE0Y2RjNDhjNTVhMGIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZmI0ZTFkZmY1NzRlNDdkOTgwNDQ5M2QxMWY4YjI5NzYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44NDc1NDkwNjM1MzYzMzQsLTczLjg1MDQwMTc4MDMwNDIxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2M1MmM3MDI0OGM1MTQ0OWE4ZGUzOTdiYjExYWUzZWVhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2EwMzk1ZjM3ODgwMTRjMWFhN2IwZTdjMzk0MzU4NGM4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzdkNWU5MjI3MzdmNDRjZGJiNmRiODQ0MzUyODY4NGY1ID0gJCgnPGRpdiBpZD0iaHRtbF83ZDVlOTIyNzM3ZjQ0Y2RiYjZkYjg0NDM1Mjg2ODRmNSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TW9ycmlzIFBhcmssIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hMDM5NWYzNzg4MDE0YzFhYTdiMGU3YzM5NDM1ODRjOC5zZXRDb250ZW50KGh0bWxfN2Q1ZTkyMjczN2Y0NGNkYmI2ZGI4NDQzNTI4Njg0ZjUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZmI0ZTFkZmY1NzRlNDdkOTgwNDQ5M2QxMWY4YjI5NzYuYmluZFBvcHVwKHBvcHVwX2EwMzk1ZjM3ODgwMTRjMWFhN2IwZTdjMzk0MzU4NGM4KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2I4ZGYyMDQzODcyNTQwZTk4Y2Q5ZGVhODkzMTJhNzI5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODU3Mjc3MTAwNzM4OTUsLTczLjg4ODQ1MTk2MTM0ODA0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2M1MmM3MDI0OGM1MTQ0OWE4ZGUzOTdiYjExYWUzZWVhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzVjMmM4MDZmMGJhYzQxMTViM2Q0ZGU1OWZiMjJhNjBjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2Y2MTBiNDQzOGVjYTRkOTRiOWQ5MjcyYWQ1ZGQ4OGIxID0gJCgnPGRpdiBpZD0iaHRtbF9mNjEwYjQ0MzhlY2E0ZDk0YjlkOTI3MmFkNWRkODhiMSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QmVsbW9udCwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzVjMmM4MDZmMGJhYzQxMTViM2Q0ZGU1OWZiMjJhNjBjLnNldENvbnRlbnQoaHRtbF9mNjEwYjQ0MzhlY2E0ZDk0YjlkOTI3MmFkNWRkODhiMSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9iOGRmMjA0Mzg3MjU0MGU5OGNkOWRlYTg5MzEyYTcyOS5iaW5kUG9wdXAocG9wdXBfNWMyYzgwNmYwYmFjNDExNWIzZDRkZTU5ZmIyMmE2MGMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNjI5ODJlNzIyOGE5NGZkYjk2NjkwMTM3ZTgzZGJlYWEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44ODEzOTQ5NzcyNzA4NiwtNzMuOTE3MTkwNDgyMTAzOTNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzUyYzcwMjQ4YzUxNDQ5YThkZTM5N2JiMTFhZTNlZWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOWYwOWZkNDdhOThjNGJkZmEzZWIyNTI3MDFjM2IxOGUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOGIwZjVhMTA3N2M0NGJmMjgwNGY5OGQ2NThiNDAwNjEgPSAkKCc8ZGl2IGlkPSJodG1sXzhiMGY1YTEwNzdjNDRiZjI4MDRmOThkNjU4YjQwMDYxIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5TcHV5dGVuIER1eXZpbCwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzlmMDlmZDQ3YTk4YzRiZGZhM2ViMjUyNzAxYzNiMThlLnNldENvbnRlbnQoaHRtbF84YjBmNWExMDc3YzQ0YmYyODA0Zjk4ZDY1OGI0MDA2MSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl82Mjk4MmU3MjI4YTk0ZmRiOTY2OTAxMzdlODNkYmVhYS5iaW5kUG9wdXAocG9wdXBfOWYwOWZkNDdhOThjNGJkZmEzZWIyNTI3MDFjM2IxOGUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNWU1ZWQ1M2VkMWRkNDkwMzhhZjFmYzJlMGNmZWJmYzQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC45MDg1NDI4Mjk1MDY2NiwtNzMuOTA0NTMwNTQ5MDg5MjddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzUyYzcwMjQ4YzUxNDQ5YThkZTM5N2JiMTFhZTNlZWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZjUxOGE4OWQ4ZjY4NDg3YjhlODY5ZmM5NTNhZTA5YTQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZTUzN2IwZjdmM2ZjNDY2MWI3ZWM5OTNkOWM5MjNlYTQgPSAkKCc8ZGl2IGlkPSJodG1sX2U1MzdiMGY3ZjNmYzQ2NjFiN2VjOTkzZDljOTIzZWE0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Ob3J0aCBSaXZlcmRhbGUsIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mNTE4YTg5ZDhmNjg0ODdiOGU4NjlmYzk1M2FlMDlhNC5zZXRDb250ZW50KGh0bWxfZTUzN2IwZjdmM2ZjNDY2MWI3ZWM5OTNkOWM5MjNlYTQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNWU1ZWQ1M2VkMWRkNDkwMzhhZjFmYzJlMGNmZWJmYzQuYmluZFBvcHVwKHBvcHVwX2Y1MThhODlkOGY2ODQ4N2I4ZTg2OWZjOTUzYWUwOWE0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzE0ZDIwOGRhZTA4NTQzM2NhOWRjOTI1N2ZlNTcyMjJkID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODUwNjQxNDA5NDAzMzUsLTczLjgzMjA3Mzc4MjQwNDddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzUyYzcwMjQ4YzUxNDQ5YThkZTM5N2JiMTFhZTNlZWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYmVhMzA1ZDkxNWQyNDU2YmIxMzk4NTAwNzYwMjhhOGQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZjVhMjBmNDIyZmU4NDY0M2FmNWEzY2NiNTAwMTA1YzEgPSAkKCc8ZGl2IGlkPSJodG1sX2Y1YTIwZjQyMmZlODQ2NDNhZjVhM2NjYjUwMDEwNWMxIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5QZWxoYW0gQmF5LCBCcm9ueDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYmVhMzA1ZDkxNWQyNDU2YmIxMzk4NTAwNzYwMjhhOGQuc2V0Q29udGVudChodG1sX2Y1YTIwZjQyMmZlODQ2NDNhZjVhM2NjYjUwMDEwNWMxKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzE0ZDIwOGRhZTA4NTQzM2NhOWRjOTI1N2ZlNTcyMjJkLmJpbmRQb3B1cChwb3B1cF9iZWEzMDVkOTE1ZDI0NTZiYjEzOTg1MDA3NjAyOGE4ZCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lMDE0MTU5Y2JiMjk0YzZlYTYyN2ZhMmNkZTAzNGQyZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjgyNjU3OTUxNjg2OTIyLC03My44MjYyMDI3NTk5NDA3M10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jNTJjNzAyNDhjNTE0NDlhOGRlMzk3YmIxMWFlM2VlYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iOWIzNzg4ZWQ1NDU0ZDM4YWNmZDY2ODRiNjk0YWY2NyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zMTc4NzYyMmFiNTI0ZjIxOWYzNzcwZDdlNDVlODNhNyA9ICQoJzxkaXYgaWQ9Imh0bWxfMzE3ODc2MjJhYjUyNGYyMTlmMzc3MGQ3ZTQ1ZTgzYTciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlNjaHV5bGVydmlsbGUsIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iOWIzNzg4ZWQ1NDU0ZDM4YWNmZDY2ODRiNjk0YWY2Ny5zZXRDb250ZW50KGh0bWxfMzE3ODc2MjJhYjUyNGYyMTlmMzc3MGQ3ZTQ1ZTgzYTcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZTAxNDE1OWNiYjI5NGM2ZWE2MjdmYTJjZGUwMzRkMmUuYmluZFBvcHVwKHBvcHVwX2I5YjM3ODhlZDU0NTRkMzhhY2ZkNjY4NGI2OTRhZjY3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzcwNDFiZDE5ZjNkMzQyNTliYTk2ZWU0NmEwYzg4ZTgwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODIxOTg2MTE4MTYzNDk0LC03My44MTM4ODUxNDQyODYxOV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jNTJjNzAyNDhjNTE0NDlhOGRlMzk3YmIxMWFlM2VlYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF80ZDEwYTQyNDNmZWE0NmZlOGE5YTAzN2Q4ZDQ5ZGQ2MSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wM2ViMTY5ZDE5Mjc0OTkzYTk3NzczMjczYWZkYzAxMCA9ICQoJzxkaXYgaWQ9Imh0bWxfMDNlYjE2OWQxOTI3NDk5M2E5Nzc3MzI3M2FmZGMwMTAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkVkZ2V3YXRlciBQYXJrLCBCcm9ueDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNGQxMGE0MjQzZmVhNDZmZThhOWEwMzdkOGQ0OWRkNjEuc2V0Q29udGVudChodG1sXzAzZWIxNjlkMTkyNzQ5OTNhOTc3NzMyNzNhZmRjMDEwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzcwNDFiZDE5ZjNkMzQyNTliYTk2ZWU0NmEwYzg4ZTgwLmJpbmRQb3B1cChwb3B1cF80ZDEwYTQyNDNmZWE0NmZlOGE5YTAzN2Q4ZDQ5ZGQ2MSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl80YzAxNDA2NjI2NDI0YzJlOWUxZDQyYzc1ZTFiNzQ4MyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjgxOTAxNDM3Njk4ODMxNCwtNzMuODQ4MDI3Mjk1ODI3MzVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzUyYzcwMjQ4YzUxNDQ5YThkZTM5N2JiMTFhZTNlZWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZGVkNTZlNDk3NzI2NDFmYzg2NzJmOWFjZjI5MmRjN2EgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZGEyZGVkYzk3MGE4NDM2YWIwZGQ1ZWEzZjFlYjcxYTcgPSAkKCc8ZGl2IGlkPSJodG1sX2RhMmRlZGM5NzBhODQzNmFiMGRkNWVhM2YxZWI3MWE3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DYXN0bGUgSGlsbCwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2RlZDU2ZTQ5NzcyNjQxZmM4NjcyZjlhY2YyOTJkYzdhLnNldENvbnRlbnQoaHRtbF9kYTJkZWRjOTcwYTg0MzZhYjBkZDVlYTNmMWViNzFhNyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl80YzAxNDA2NjI2NDI0YzJlOWUxZDQyYzc1ZTFiNzQ4My5iaW5kUG9wdXAocG9wdXBfZGVkNTZlNDk3NzI2NDFmYzg2NzJmOWFjZjI5MmRjN2EpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZTU3ZTlkOTY2YjEwNDhiMmFhOWE0NTI5YmZkZGIxNTcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44NzEzNzA3ODE5MjM3MSwtNzMuODYzMzIzNjE2NTI3NzddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzUyYzcwMjQ4YzUxNDQ5YThkZTM5N2JiMTFhZTNlZWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMjhiYjRkNWYzMDQ0NGY3MTk0ZjY3NmU3YzJlNjM4ZTUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMjU0OTg0ODczOTgwNDJjNjgxYjc0MDg0NjUyMmRhYWMgPSAkKCc8ZGl2IGlkPSJodG1sXzI1NDk4NDg3Mzk4MDQyYzY4MWI3NDA4NDY1MjJkYWFjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5PbGludmlsbGUsIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yOGJiNGQ1ZjMwNDQ0ZjcxOTRmNjc2ZTdjMmU2MzhlNS5zZXRDb250ZW50KGh0bWxfMjU0OTg0ODczOTgwNDJjNjgxYjc0MDg0NjUyMmRhYWMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZTU3ZTlkOTY2YjEwNDhiMmFhOWE0NTI5YmZkZGIxNTcuYmluZFBvcHVwKHBvcHVwXzI4YmI0ZDVmMzA0NDRmNzE5NGY2NzZlN2MyZTYzOGU1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzQwNzNhNjFmNDNkMTQ4MmU4NTJjYmI0YmZjYjg3MzJlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODYyOTY1NjI0Nzc5OTgsLTczLjg0MTYxMTk0ODMxMjIzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2M1MmM3MDI0OGM1MTQ0OWE4ZGUzOTdiYjExYWUzZWVhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2U4NmUyMTZkNTEyYzQ0NTNhZjMzMmY3ZTY5YWE4NzczID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzVlMTg2ZjM4ZTRhZTQyZmU5NWNhNzUwY2Y4ZWU0N2QwID0gJCgnPGRpdiBpZD0iaHRtbF81ZTE4NmYzOGU0YWU0MmZlOTVjYTc1MGNmOGVlNDdkMCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UGVsaGFtIEdhcmRlbnMsIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lODZlMjE2ZDUxMmM0NDUzYWYzMzJmN2U2OWFhODc3My5zZXRDb250ZW50KGh0bWxfNWUxODZmMzhlNGFlNDJmZTk1Y2E3NTBjZjhlZTQ3ZDApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNDA3M2E2MWY0M2QxNDgyZTg1MmNiYjRiZmNiODczMmUuYmluZFBvcHVwKHBvcHVwX2U4NmUyMTZkNTEyYzQ0NTNhZjMzMmY3ZTY5YWE4NzczKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzYyZWRmZjY2NDBkNTQ2YjA4NDRjYWNhOGIxZDAyNGI4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODM0MjgzODA3MzM4NTEsLTczLjkxNTU4OTQxNzczNDQ0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2M1MmM3MDI0OGM1MTQ0OWE4ZGUzOTdiYjExYWUzZWVhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzM1ZjEyOTYxNTRiMjRiNjE4ZmZmNmIzOTQxNmViYzQzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2NlYTNjNmFhM2E4NjQ0YzY5NTk4MjUxMDI0ZmI1ZTU1ID0gJCgnPGRpdiBpZD0iaHRtbF9jZWEzYzZhYTNhODY0NGM2OTU5ODI1MTAyNGZiNWU1NSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q29uY291cnNlLCBCcm9ueDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMzVmMTI5NjE1NGIyNGI2MThmZmY2YjM5NDE2ZWJjNDMuc2V0Q29udGVudChodG1sX2NlYTNjNmFhM2E4NjQ0YzY5NTk4MjUxMDI0ZmI1ZTU1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzYyZWRmZjY2NDBkNTQ2YjA4NDRjYWNhOGIxZDAyNGI4LmJpbmRQb3B1cChwb3B1cF8zNWYxMjk2MTU0YjI0YjYxOGZmZjZiMzk0MTZlYmM0Myk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9kMjM5ZDcyOTYxZGI0ODlkYWJmNGRmM2U0NGMwNGQ5MSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjgyOTc3NDI5Nzg3MTYxLC03My44NTA1MzUyNDQ1MTkzNV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jNTJjNzAyNDhjNTE0NDlhOGRlMzk3YmIxMWFlM2VlYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF80M2RhYTBhM2I1OGY0ODQwYmZiYTVlMmQxMmJkNTgwOSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xZTVhMTBlNzRkMDc0NzI0ODc1NzcwMGRlZWU4ZDM5MyA9ICQoJzxkaXYgaWQ9Imh0bWxfMWU1YTEwZTc0ZDA3NDcyNDg3NTc3MDBkZWVlOGQzOTMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlVuaW9ucG9ydCwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzQzZGFhMGEzYjU4ZjQ4NDBiZmJhNWUyZDEyYmQ1ODA5LnNldENvbnRlbnQoaHRtbF8xZTVhMTBlNzRkMDc0NzI0ODc1NzcwMGRlZWU4ZDM5Myk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9kMjM5ZDcyOTYxZGI0ODlkYWJmNGRmM2U0NGMwNGQ5MS5iaW5kUG9wdXAocG9wdXBfNDNkYWEwYTNiNThmNDg0MGJmYmE1ZTJkMTJiZDU4MDkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOTI2Y2Q4NzgxYWM2NDgzMmEzZTY0ZGM4MzJkNWUzZjYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44ODQ1NjEzMDMwMzczMiwtNzMuODQ4MDgyNzE4NzcxNjhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzUyYzcwMjQ4YzUxNDQ5YThkZTM5N2JiMTFhZTNlZWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNzVkNDI3ZDNmMTQxNDgzYjhlNjVkMTJhZjBlY2NmOWIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZjEyMDA5Yjg3Nzc4NGZiNThhYjNmYjVkM2U2MTQzMTYgPSAkKCc8ZGl2IGlkPSJodG1sX2YxMjAwOWI4Nzc3ODRmYjU4YWIzZmI1ZDNlNjE0MzE2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5FZGVud2FsZCwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzc1ZDQyN2QzZjE0MTQ4M2I4ZTY1ZDEyYWYwZWNjZjliLnNldENvbnRlbnQoaHRtbF9mMTIwMDliODc3Nzg0ZmI1OGFiM2ZiNWQzZTYxNDMxNik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl85MjZjZDg3ODFhYzY0ODMyYTNlNjRkYzgzMmQ1ZTNmNi5iaW5kUG9wdXAocG9wdXBfNzVkNDI3ZDNmMTQxNDgzYjhlNjVkMTJhZjBlY2NmOWIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNWJlOGY5NjU2ZDMzNDA2ZWIzYmI1ZDljNmNlMWJmOWQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42MjU4MDEwNjUwMTA2NTYsLTc0LjAzMDYyMDY5MzUzODEzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2M1MmM3MDI0OGM1MTQ0OWE4ZGUzOTdiYjExYWUzZWVhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2IyNjEzYzVlYzMyYzRjZWNhZjQ1NWI1MWIxNDAyODA4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzAzNGI5M2EzYWU3MjQ3ZjU5ZDcyNWVjOWE2ZDFmZWMwID0gJCgnPGRpdiBpZD0iaHRtbF8wMzRiOTNhM2FlNzI0N2Y1OWQ3MjVlYzlhNmQxZmVjMCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QmF5IFJpZGdlLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYjI2MTNjNWVjMzJjNGNlY2FmNDU1YjUxYjE0MDI4MDguc2V0Q29udGVudChodG1sXzAzNGI5M2EzYWU3MjQ3ZjU5ZDcyNWVjOWE2ZDFmZWMwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzViZThmOTY1NmQzMzQwNmViM2JiNWQ5YzZjZTFiZjlkLmJpbmRQb3B1cChwb3B1cF9iMjYxM2M1ZWMzMmM0Y2VjYWY0NTViNTFiMTQwMjgwOCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8yOGEzYWQyOTNlNGQ0MDBhYjkwZDFiOGE3OTNjNzE5ZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjYxMTAwODkwMjAyMDQ0LC03My45OTUxNzk5ODM4MDcyOV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jNTJjNzAyNDhjNTE0NDlhOGRlMzk3YmIxMWFlM2VlYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9kMzg1ODM3Njc5Y2M0Yjg1YjFjNWNhZDgyZjZlZjg0YiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wODdlYjkwNWEyNDI0MTM1ODNhNTk4MTAyYzNmMTQ3ZiA9ICQoJzxkaXYgaWQ9Imh0bWxfMDg3ZWI5MDVhMjQyNDEzNTgzYTU5ODEwMmMzZjE0N2YiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkJlbnNvbmh1cnN0LCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZDM4NTgzNzY3OWNjNGI4NWIxYzVjYWQ4MmY2ZWY4NGIuc2V0Q29udGVudChodG1sXzA4N2ViOTA1YTI0MjQxMzU4M2E1OTgxMDJjM2YxNDdmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzI4YTNhZDI5M2U0ZDQwMGFiOTBkMWI4YTc5M2M3MTlkLmJpbmRQb3B1cChwb3B1cF9kMzg1ODM3Njc5Y2M0Yjg1YjFjNWNhZDgyZjZlZjg0Yik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85OWU5YjMxNDNmMjU0OWRkOWI1OTc1MTNlYjU0NjI5NyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY0NTEwMjk0OTI1NDI5LC03NC4wMTAzMTYxODUyNzc4NF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jNTJjNzAyNDhjNTE0NDlhOGRlMzk3YmIxMWFlM2VlYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF84OTFhMzU2OGJlZWQ0ZjMzYWYyMDI2MjRjMGNiODhhYSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF81NDZlMDIwNGU0NmU0YmMxYTVkZGU2YmQ0YTY1OWQwZCA9ICQoJzxkaXYgaWQ9Imh0bWxfNTQ2ZTAyMDRlNDZlNGJjMWE1ZGRlNmJkNGE2NTlkMGQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlN1bnNldCBQYXJrLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfODkxYTM1NjhiZWVkNGYzM2FmMjAyNjI0YzBjYjg4YWEuc2V0Q29udGVudChodG1sXzU0NmUwMjA0ZTQ2ZTRiYzFhNWRkZTZiZDRhNjU5ZDBkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzk5ZTliMzE0M2YyNTQ5ZGQ5YjU5NzUxM2ViNTQ2Mjk3LmJpbmRQb3B1cChwb3B1cF84OTFhMzU2OGJlZWQ0ZjMzYWYyMDI2MjRjMGNiODhhYSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8zMGRiZGYwYjkyNGI0NmJmOTMxNDNmZWI3YTQyMmY4YyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjczMDIwMDk4NDg2NDcsLTczLjk1NDI0MDkzMTI3MzkzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2M1MmM3MDI0OGM1MTQ0OWE4ZGUzOTdiYjExYWUzZWVhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2EwYmQ0YmMzNTllZjQyZDJiZTRhMTNhNTNkN2Q1ZGIyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzNhMmUxYTIxN2YwZDRiNDliZGE5OWQyYWM5MDNhNDBhID0gJCgnPGRpdiBpZD0iaHRtbF8zYTJlMWEyMTdmMGQ0YjQ5YmRhOTlkMmFjOTAzYTQwYSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+R3JlZW5wb2ludCwgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2EwYmQ0YmMzNTllZjQyZDJiZTRhMTNhNTNkN2Q1ZGIyLnNldENvbnRlbnQoaHRtbF8zYTJlMWEyMTdmMGQ0YjQ5YmRhOTlkMmFjOTAzYTQwYSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8zMGRiZGYwYjkyNGI0NmJmOTMxNDNmZWI3YTQyMmY4Yy5iaW5kUG9wdXAocG9wdXBfYTBiZDRiYzM1OWVmNDJkMmJlNGExM2E1M2Q3ZDVkYjIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMjE1ZTVhYzlmNzEyNDY0ZGJjMDA3ZDRiYTE4NjExOTggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC41OTUyNjAwMTMwNjU5MywtNzMuOTczNDcwODc3MDg0NDVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzUyYzcwMjQ4YzUxNDQ5YThkZTM5N2JiMTFhZTNlZWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNWZlOTJmYmU5NDgwNGY2ZmJhMDRkMjJmYWNhODNjMTMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfM2FkOGQyZjQzZjRmNDI4M2IxM2ZiNjkyMzk5MDgxNTUgPSAkKCc8ZGl2IGlkPSJodG1sXzNhZDhkMmY0M2Y0ZjQyODNiMTNmYjY5MjM5OTA4MTU1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5HcmF2ZXNlbmQsIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81ZmU5MmZiZTk0ODA0ZjZmYmEwNGQyMmZhY2E4M2MxMy5zZXRDb250ZW50KGh0bWxfM2FkOGQyZjQzZjRmNDI4M2IxM2ZiNjkyMzk5MDgxNTUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMjE1ZTVhYzlmNzEyNDY0ZGJjMDA3ZDRiYTE4NjExOTguYmluZFBvcHVwKHBvcHVwXzVmZTkyZmJlOTQ4MDRmNmZiYTA0ZDIyZmFjYTgzYzEzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2QwMGUzMjg4YTk5NjQwZDk5ZTQwZTBjNDljOGNiY2U3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTc2ODI1MDY1NjY2MDQsLTczLjk2NTA5NDQ4Nzg1MzM2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2M1MmM3MDI0OGM1MTQ0OWE4ZGUzOTdiYjExYWUzZWVhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzIwMzU4ZmNjODFhYzQ4ZTY5YjI3ZDRhNjgzMmY0YmNiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzI5ZmVkZjk0YmQwZTQxYTFhODliODE3MjQyMjcxMWZmID0gJCgnPGRpdiBpZD0iaHRtbF8yOWZlZGY5NGJkMGU0MWExYTg5YjgxNzI0MjI3MTFmZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QnJpZ2h0b24gQmVhY2gsIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yMDM1OGZjYzgxYWM0OGU2OWIyN2Q0YTY4MzJmNGJjYi5zZXRDb250ZW50KGh0bWxfMjlmZWRmOTRiZDBlNDFhMWE4OWI4MTcyNDIyNzExZmYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZDAwZTMyODhhOTk2NDBkOTllNDBlMGM0OWM4Y2JjZTcuYmluZFBvcHVwKHBvcHVwXzIwMzU4ZmNjODFhYzQ4ZTY5YjI3ZDRhNjgzMmY0YmNiKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzVhYjExN2Y5OTViNDQ4OTc4Y2M2ZWNiZmQyM2Y1YzRmID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTg2ODkwMTI2NzgzODQsLTczLjk0MzE4NjQwNDgyOTc5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2M1MmM3MDI0OGM1MTQ0OWE4ZGUzOTdiYjExYWUzZWVhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzc4N2YzOWEwY2U5NTQ1ZmE5MjFmYmZlNmFmYzhmN2M2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2I0YjRmYTYxNzI2MzQ4ZGE5MmZlZDcwZGU2MWIyZWM2ID0gJCgnPGRpdiBpZD0iaHRtbF9iNGI0ZmE2MTcyNjM0OGRhOTJmZWQ3MGRlNjFiMmVjNiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U2hlZXBzaGVhZCBCYXksIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83ODdmMzlhMGNlOTU0NWZhOTIxZmJmZTZhZmM4ZjdjNi5zZXRDb250ZW50KGh0bWxfYjRiNGZhNjE3MjYzNDhkYTkyZmVkNzBkZTYxYjJlYzYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNWFiMTE3Zjk5NWI0NDg5NzhjYzZlY2JmZDIzZjVjNGYuYmluZFBvcHVwKHBvcHVwXzc4N2YzOWEwY2U5NTQ1ZmE5MjFmYmZlNmFmYzhmN2M2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzdmNWVhM2IzYjcyMDQ2MDVhNjhmY2FmNGIyOWMyODk2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjE0NDMyNTEzMzUwOTgsLTczLjk1NzQzODQwNTU5OTM5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2M1MmM3MDI0OGM1MTQ0OWE4ZGUzOTdiYjExYWUzZWVhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2VlM2UzMzM1Y2E3NDRkNjBhOGE1ZDIwMTc1NTNkZmNhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzM0ZTU2ZjAxYWZmNjQ0N2Y5YzNjZjhhMjE0OGU1YWQyID0gJCgnPGRpdiBpZD0iaHRtbF8zNGU1NmYwMWFmZjY0NDdmOWMzY2Y4YTIxNDhlNWFkMiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TWFuaGF0dGFuIFRlcnJhY2UsIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lZTNlMzMzNWNhNzQ0ZDYwYThhNWQyMDE3NTUzZGZjYS5zZXRDb250ZW50KGh0bWxfMzRlNTZmMDFhZmY2NDQ3ZjljM2NmOGEyMTQ4ZTVhZDIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfN2Y1ZWEzYjNiNzIwNDYwNWE2OGZjYWY0YjI5YzI4OTYuYmluZFBvcHVwKHBvcHVwX2VlM2UzMzM1Y2E3NDRkNjBhOGE1ZDIwMTc1NTNkZmNhKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzUyZWIxMTZiOWRiMzRiN2VhMDc5OWJhY2Y1Mjg2Yjc4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjM2MzI1ODkwMjY2NzcsLTczLjk1ODQwMTA2NTMzOTAzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2M1MmM3MDI0OGM1MTQ0OWE4ZGUzOTdiYjExYWUzZWVhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2VhODUzM2NiNjM0NjQ0MzI4ZWQxNGQ5N2ViMmYwOWQxID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzY5NDVkNTJmZTM1MzQxYjY4ZjhmYjVjMjhiM2JkNzUyID0gJCgnPGRpdiBpZD0iaHRtbF82OTQ1ZDUyZmUzNTM0MWI2OGY4ZmI1YzI4YjNiZDc1MiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RmxhdGJ1c2gsIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lYTg1MzNjYjYzNDY0NDMyOGVkMTRkOTdlYjJmMDlkMS5zZXRDb250ZW50KGh0bWxfNjk0NWQ1MmZlMzUzNDFiNjhmOGZiNWMyOGIzYmQ3NTIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNTJlYjExNmI5ZGIzNGI3ZWEwNzk5YmFjZjUyODZiNzguYmluZFBvcHVwKHBvcHVwX2VhODUzM2NiNjM0NjQ0MzI4ZWQxNGQ5N2ViMmYwOWQxKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzYxNWE2MjU5OTgwOTRiODBiYzEwMjc2Zjk1ZmEzNDViID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjcwODI5MTc2OTUyOTQsLTczLjk0MzI5MTE5MDczNTgyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2M1MmM3MDI0OGM1MTQ0OWE4ZGUzOTdiYjExYWUzZWVhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzFjZTI2ZTU3YzlmMTQ3NmE5YjJlMWQ5NmMwZGM3Y2E1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzY1NWZiZWY3YTRhYTQ3ZWZhMjRlMzZlYWU5ZGM2YTBlID0gJCgnPGRpdiBpZD0iaHRtbF82NTVmYmVmN2E0YWE0N2VmYTI0ZTM2ZWFlOWRjNmEwZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q3Jvd24gSGVpZ2h0cywgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzFjZTI2ZTU3YzlmMTQ3NmE5YjJlMWQ5NmMwZGM3Y2E1LnNldENvbnRlbnQoaHRtbF82NTVmYmVmN2E0YWE0N2VmYTI0ZTM2ZWFlOWRjNmEwZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl82MTVhNjI1OTk4MDk0YjgwYmMxMDI3NmY5NWZhMzQ1Yi5iaW5kUG9wdXAocG9wdXBfMWNlMjZlNTdjOWYxNDc2YTliMmUxZDk2YzBkYzdjYTUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNjJiYTI0YWNiYmVmNDQ4ZDgyMjRjMzk2NDk2ODE4ZGIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42NDE3MTc3NjY2ODk2MSwtNzMuOTM2MTAyNTYxODU4MzZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzUyYzcwMjQ4YzUxNDQ5YThkZTM5N2JiMTFhZTNlZWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZWQ3MTdlM2MxMDc0NDc5MTlkNzY0ZDA5YTkzMDkzY2YgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfY2Q1MDZhY2NkZjljNGRjOTkzZDVlNmRlYjcxYmJkMTQgPSAkKCc8ZGl2IGlkPSJodG1sX2NkNTA2YWNjZGY5YzRkYzk5M2Q1ZTZkZWI3MWJiZDE0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5FYXN0IEZsYXRidXNoLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZWQ3MTdlM2MxMDc0NDc5MTlkNzY0ZDA5YTkzMDkzY2Yuc2V0Q29udGVudChodG1sX2NkNTA2YWNjZGY5YzRkYzk5M2Q1ZTZkZWI3MWJiZDE0KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzYyYmEyNGFjYmJlZjQ0OGQ4MjI0YzM5NjQ5NjgxOGRiLmJpbmRQb3B1cChwb3B1cF9lZDcxN2UzYzEwNzQ0NzkxOWQ3NjRkMDlhOTMwOTNjZik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8yMDMwMGIwNDNhYjc0NTc0YjYyOTQyNTA4NmJmYmJhOCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY0MjM4MTk1ODAwMzUyNiwtNzMuOTgwNDIxMTA1NTk0NzRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzUyYzcwMjQ4YzUxNDQ5YThkZTM5N2JiMTFhZTNlZWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYmJjNzc5NGQ0NTM1NDlkOWJiOWE5NDlmMjc4ZTJiMzIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOWYxODUzZWRiYjZmNGU0MTk4MzhjNjc5ODRmYzFlMmYgPSAkKCc8ZGl2IGlkPSJodG1sXzlmMTg1M2VkYmI2ZjRlNDE5ODM4YzY3OTg0ZmMxZTJmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5LZW5zaW5ndG9uLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYmJjNzc5NGQ0NTM1NDlkOWJiOWE5NDlmMjc4ZTJiMzIuc2V0Q29udGVudChodG1sXzlmMTg1M2VkYmI2ZjRlNDE5ODM4YzY3OTg0ZmMxZTJmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzIwMzAwYjA0M2FiNzQ1NzRiNjI5NDI1MDg2YmZiYmE4LmJpbmRQb3B1cChwb3B1cF9iYmM3Nzk0ZDQ1MzU0OWQ5YmI5YTk0OWYyNzhlMmIzMik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85ZGI3Mzk4ZjZiZGE0MjNmOTc0YWMyNWFiZWRjZGRlZiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY1Njk0NTgzNTc1MTA0LC03My45ODAwNzM0MDQzMDE3Ml0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jNTJjNzAyNDhjNTE0NDlhOGRlMzk3YmIxMWFlM2VlYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xZjgwMWY1NmQ3ODg0OWI1ODY4M2ZlYTAwYTY4YWQyZSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xZWIzYjM0YzYzZDc0ZjE1YWQzMDY1N2JmMDM5YmZkZSA9ICQoJzxkaXYgaWQ9Imh0bWxfMWViM2IzNGM2M2Q3NGYxNWFkMzA2NTdiZjAzOWJmZGUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPldpbmRzb3IgVGVycmFjZSwgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzFmODAxZjU2ZDc4ODQ5YjU4NjgzZmVhMDBhNjhhZDJlLnNldENvbnRlbnQoaHRtbF8xZWIzYjM0YzYzZDc0ZjE1YWQzMDY1N2JmMDM5YmZkZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl85ZGI3Mzk4ZjZiZGE0MjNmOTc0YWMyNWFiZWRjZGRlZi5iaW5kUG9wdXAocG9wdXBfMWY4MDFmNTZkNzg4NDliNTg2ODNmZWEwMGE2OGFkMmUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNmFkYTAyYjAwMGNiNDdjM2JlZTgxM2FlZjhjNWY4NTkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42NzY4MjIyNjIyNTQ3MjQsLTczLjk2NDg1OTI0MjYyNjldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzUyYzcwMjQ4YzUxNDQ5YThkZTM5N2JiMTFhZTNlZWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMTNjNTNhMjQ4ZDQzNDdmYjk2NTdjZWI1MGRiMWFkZmEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNzgxZTRkMzNmOTZhNGQ3NjljZTczY2Q1ZDBlMTE0OTkgPSAkKCc8ZGl2IGlkPSJodG1sXzc4MWU0ZDMzZjk2YTRkNzY5Y2U3M2NkNWQwZTExNDk5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Qcm9zcGVjdCBIZWlnaHRzLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMTNjNTNhMjQ4ZDQzNDdmYjk2NTdjZWI1MGRiMWFkZmEuc2V0Q29udGVudChodG1sXzc4MWU0ZDMzZjk2YTRkNzY5Y2U3M2NkNWQwZTExNDk5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzZhZGEwMmIwMDBjYjQ3YzNiZWU4MTNhZWY4YzVmODU5LmJpbmRQb3B1cChwb3B1cF8xM2M1M2EyNDhkNDM0N2ZiOTY1N2NlYjUwZGIxYWRmYSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9iZGI1N2QwNGExZjE0MGYyYTk1YWYxYzM3MjQ0MzVkZiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY2Mzk0OTk0MzM5NzU1LC03My45MTAyMzUzNjE3NjYwN10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jNTJjNzAyNDhjNTE0NDlhOGRlMzk3YmIxMWFlM2VlYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xMzZjNmVjMWJmNTA0MDdhYTQ3ZGU2ZjkzNmExZTRhNSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lMDExNDkyYTk5OWQ0ODgyOWY1ZTM2ZjQ5MjRmMzY5MyA9ICQoJzxkaXYgaWQ9Imh0bWxfZTAxMTQ5MmE5OTlkNDg4MjlmNWUzNmY0OTI0ZjM2OTMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkJyb3duc3ZpbGxlLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMTM2YzZlYzFiZjUwNDA3YWE0N2RlNmY5MzZhMWU0YTUuc2V0Q29udGVudChodG1sX2UwMTE0OTJhOTk5ZDQ4ODI5ZjVlMzZmNDkyNGYzNjkzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2JkYjU3ZDA0YTFmMTQwZjJhOTVhZjFjMzcyNDQzNWRmLmJpbmRQb3B1cChwb3B1cF8xMzZjNmVjMWJmNTA0MDdhYTQ3ZGU2ZjkzNmExZTRhNSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lYjMzYTE2MTY0N2U0NGM1OWRhMGJlMGY4YTVlODY5MyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjcwNzE0NDM5MzQ0MjUxLC03My45NTgxMTUyOTIyMDkyN10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jNTJjNzAyNDhjNTE0NDlhOGRlMzk3YmIxMWFlM2VlYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8yNDFhZGNiNTliNDI0ZDE5OTdlODQzYjNjZmFmZDEwMiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lYmVjNTQ5YjZlZDc0NTlhYjgyOTQzOTdkNDIwNGU5MyA9ICQoJzxkaXYgaWQ9Imh0bWxfZWJlYzU0OWI2ZWQ3NDU5YWI4Mjk0Mzk3ZDQyMDRlOTMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPldpbGxpYW1zYnVyZywgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzI0MWFkY2I1OWI0MjRkMTk5N2U4NDNiM2NmYWZkMTAyLnNldENvbnRlbnQoaHRtbF9lYmVjNTQ5YjZlZDc0NTlhYjgyOTQzOTdkNDIwNGU5Myk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9lYjMzYTE2MTY0N2U0NGM1OWRhMGJlMGY4YTVlODY5My5iaW5kUG9wdXAocG9wdXBfMjQxYWRjYjU5YjQyNGQxOTk3ZTg0M2IzY2ZhZmQxMDIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNDVhM2RlOGMyYWJjNGE2MjhhMWU5Y2UzMzEyMTllNzEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42OTgxMTYxMTAxNzkwMSwtNzMuOTI1MjU3OTc0ODcwNDVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzUyYzcwMjQ4YzUxNDQ5YThkZTM5N2JiMTFhZTNlZWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMGUyMWY5M2Q1Y2E3NDk4ZDhiMjA2MmRhMzZlYzE5MzEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZjg3NmFlZGUxYWU3NGQyYjg2MDNlNzYyNWIzYmJhMzggPSAkKCc8ZGl2IGlkPSJodG1sX2Y4NzZhZWRlMWFlNzRkMmI4NjAzZTc2MjViM2JiYTM4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5CdXNod2ljaywgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzBlMjFmOTNkNWNhNzQ5OGQ4YjIwNjJkYTM2ZWMxOTMxLnNldENvbnRlbnQoaHRtbF9mODc2YWVkZTFhZTc0ZDJiODYwM2U3NjI1YjNiYmEzOCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl80NWEzZGU4YzJhYmM0YTYyOGExZTljZTMzMTIxOWU3MS5iaW5kUG9wdXAocG9wdXBfMGUyMWY5M2Q1Y2E3NDk4ZDhiMjA2MmRhMzZlYzE5MzEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYjEwZjc5NjM0YWM1NGE2ZWE2NDhhMGEzODcxYWMyNmIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42ODcyMzE2MDc3MjA0NTYsLTczLjk0MTc4NDg4NjkwMjk3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2M1MmM3MDI0OGM1MTQ0OWE4ZGUzOTdiYjExYWUzZWVhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2NhNmYwNWEzODMxYjQ4MDk5OTYyNGEzMjdkMjdjMTg4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzNhMmJmMjUzMDVlMTRiNmQ4YjQyN2UxYzNiMThlMTBiID0gJCgnPGRpdiBpZD0iaHRtbF8zYTJiZjI1MzA1ZTE0YjZkOGI0MjdlMWMzYjE4ZTEwYiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QmVkZm9yZCBTdHV5dmVzYW50LCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfY2E2ZjA1YTM4MzFiNDgwOTk5NjI0YTMyN2QyN2MxODguc2V0Q29udGVudChodG1sXzNhMmJmMjUzMDVlMTRiNmQ4YjQyN2UxYzNiMThlMTBiKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2IxMGY3OTYzNGFjNTRhNmVhNjQ4YTBhMzg3MWFjMjZiLmJpbmRQb3B1cChwb3B1cF9jYTZmMDVhMzgzMWI0ODA5OTk2MjRhMzI3ZDI3YzE4OCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl84MjFhNDE5YTAzNTc0OWUwOTViYmM2OWI4MTQzODQ1OCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY5NTg2MzcyMjcyNDA4NCwtNzMuOTkzNzgyMjU0OTY0MjRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzUyYzcwMjQ4YzUxNDQ5YThkZTM5N2JiMTFhZTNlZWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNjc4Y2M4OWYwOWIzNDI1NmFiMGY1N2E3Zjg4MTllNDAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMGEzNGE2OTNiM2JkNDAxYTkxM2I1NjJiNTY5MjQwYjEgPSAkKCc8ZGl2IGlkPSJodG1sXzBhMzRhNjkzYjNiZDQwMWE5MTNiNTYyYjU2OTI0MGIxIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Ccm9va2x5biBIZWlnaHRzLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNjc4Y2M4OWYwOWIzNDI1NmFiMGY1N2E3Zjg4MTllNDAuc2V0Q29udGVudChodG1sXzBhMzRhNjkzYjNiZDQwMWE5MTNiNTYyYjU2OTI0MGIxKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzgyMWE0MTlhMDM1NzQ5ZTA5NWJiYzY5YjgxNDM4NDU4LmJpbmRQb3B1cChwb3B1cF82NzhjYzg5ZjA5YjM0MjU2YWIwZjU3YTdmODgxOWU0MCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9hNjdmODA2Njk1YjM0YWU1OTRlZjkwZmJiZTFiY2FhNSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY4NzkxOTcyMjQ4NTU3NCwtNzMuOTk4NTYxMzkyMTg0NjNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzUyYzcwMjQ4YzUxNDQ5YThkZTM5N2JiMTFhZTNlZWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNDBmM2VjOWMyZjAyNGU4NjljMWQ1OTQxMmE4MWMxMDcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYmY1NzJiN2U4MDg4NDMzM2IxZmQ2MWIxNGQyMjZlNDAgPSAkKCc8ZGl2IGlkPSJodG1sX2JmNTcyYjdlODA4ODQzMzNiMWZkNjFiMTRkMjI2ZTQwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Db2JibGUgSGlsbCwgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzQwZjNlYzljMmYwMjRlODY5YzFkNTk0MTJhODFjMTA3LnNldENvbnRlbnQoaHRtbF9iZjU3MmI3ZTgwODg0MzMzYjFmZDYxYjE0ZDIyNmU0MCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9hNjdmODA2Njk1YjM0YWU1OTRlZjkwZmJiZTFiY2FhNS5iaW5kUG9wdXAocG9wdXBfNDBmM2VjOWMyZjAyNGU4NjljMWQ1OTQxMmE4MWMxMDcpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfODNlZjRiYTk2NjY1NDRjMmE3MWIwNDNkNGRjZTU1ZDcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42ODA1NDAyMzEwNzY0ODUsLTczLjk5NDY1MzcyODI4MDA2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2M1MmM3MDI0OGM1MTQ0OWE4ZGUzOTdiYjExYWUzZWVhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzkwYTg5ZmFhMmRmYzRmMWY4MjM3MzNiNGFlYTEwMmQ3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2E2YjM4YjI2NTViZTRhMDc5MWUyZjQzZWFlZDIzMDU1ID0gJCgnPGRpdiBpZD0iaHRtbF9hNmIzOGIyNjU1YmU0YTA3OTFlMmY0M2VhZWQyMzA1NSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q2Fycm9sbCBHYXJkZW5zLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOTBhODlmYWEyZGZjNGYxZjgyMzczM2I0YWVhMTAyZDcuc2V0Q29udGVudChodG1sX2E2YjM4YjI2NTViZTRhMDc5MWUyZjQzZWFlZDIzMDU1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzgzZWY0YmE5NjY2NTQ0YzJhNzFiMDQzZDRkY2U1NWQ3LmJpbmRQb3B1cChwb3B1cF85MGE4OWZhYTJkZmM0ZjFmODIzNzMzYjRhZWExMDJkNyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl82YjkyMTk4MTRhYzc0Mzg1YTUyMzk0MTQxNmUwOWYxYyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY3NjI1MzIzMDI1MDg4NiwtNzQuMDEyNzU4OTc0NzM1Nl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jNTJjNzAyNDhjNTE0NDlhOGRlMzk3YmIxMWFlM2VlYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF84Y2Q5ZDMxNzg3YmE0ZWI0OWYwMjI4YjMzNTQ4MTIyNyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF81NDFhYzY5MzZhZmQ0NDBkOWEzNTMwNmNlMTA1MzI0OCA9ICQoJzxkaXYgaWQ9Imh0bWxfNTQxYWM2OTM2YWZkNDQwZDlhMzUzMDZjZTEwNTMyNDgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlJlZCBIb29rLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOGNkOWQzMTc4N2JhNGViNDlmMDIyOGIzMzU0ODEyMjcuc2V0Q29udGVudChodG1sXzU0MWFjNjkzNmFmZDQ0MGQ5YTM1MzA2Y2UxMDUzMjQ4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzZiOTIxOTgxNGFjNzQzODVhNTIzOTQxNDE2ZTA5ZjFjLmJpbmRQb3B1cChwb3B1cF84Y2Q5ZDMxNzg3YmE0ZWI0OWYwMjI4YjMzNTQ4MTIyNyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl83MmUyYjlhMDU4OWU0ZDY2ODc3NmE5ODZhNGFkNTJjZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY3MzkzMTE0MzE4NzE1NCwtNzMuOTk0NDQwODcxNDUzMzldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzUyYzcwMjQ4YzUxNDQ5YThkZTM5N2JiMTFhZTNlZWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNmZjNDA4MDFjMjY0NGQzMzk0NDRlNzM2OTAyODg3NmMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMjM4N2QwM2QyNmY3NGQ4M2FjNTJiNjYwYzFkNmZkZTUgPSAkKCc8ZGl2IGlkPSJodG1sXzIzODdkMDNkMjZmNzRkODNhYzUyYjY2MGMxZDZmZGU1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Hb3dhbnVzLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNmZjNDA4MDFjMjY0NGQzMzk0NDRlNzM2OTAyODg3NmMuc2V0Q29udGVudChodG1sXzIzODdkMDNkMjZmNzRkODNhYzUyYjY2MGMxZDZmZGU1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzcyZTJiOWEwNTg5ZTRkNjY4Nzc2YTk4NmE0YWQ1MmNkLmJpbmRQb3B1cChwb3B1cF82ZmM0MDgwMWMyNjQ0ZDMzOTQ0NGU3MzY5MDI4ODc2Yyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8yODViODRmZDA0YzM0YmI4OTU3OTdhNjNlMjZmMjQ5OSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY4ODUyNzI2MDE4OTc3LC03My45NzI5MDU3NDM2OTA5Ml0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jNTJjNzAyNDhjNTE0NDlhOGRlMzk3YmIxMWFlM2VlYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF84OGFjNmNiMTFkZWY0YjRmYjQ0MTJhN2ViNzVmZGNlMyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83ZmEyMGRkZjZkNDI0YmUxOGNiOTlmZDVkMTVmMGZiYyA9ICQoJzxkaXYgaWQ9Imh0bWxfN2ZhMjBkZGY2ZDQyNGJlMThjYjk5ZmQ1ZDE1ZjBmYmMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkZvcnQgR3JlZW5lLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfODhhYzZjYjExZGVmNGI0ZmI0NDEyYTdlYjc1ZmRjZTMuc2V0Q29udGVudChodG1sXzdmYTIwZGRmNmQ0MjRiZTE4Y2I5OWZkNWQxNWYwZmJjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzI4NWI4NGZkMDRjMzRiYjg5NTc5N2E2M2UyNmYyNDk5LmJpbmRQb3B1cChwb3B1cF84OGFjNmNiMTFkZWY0YjRmYjQ0MTJhN2ViNzVmZGNlMyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl82Njk5NmY2MjM4YmE0ZTVjOTY1YjBkZTIxYzJhNjFlYSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY3MjMyMDUyMjY4MTk3LC03My45NzcwNTAzMDE4MzkyNF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jNTJjNzAyNDhjNTE0NDlhOGRlMzk3YmIxMWFlM2VlYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82ZmQ3YTQ2MWMwMmU0YjlmYWMyZjg0MDdiM2IwY2NlNCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF84NTgyZDdhMjFhYTk0ZWI4OTEyMTRjMzA5MDZhYTQ2NiA9ICQoJzxkaXYgaWQ9Imh0bWxfODU4MmQ3YTIxYWE5NGViODkxMjE0YzMwOTA2YWE0NjYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlBhcmsgU2xvcGUsIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82ZmQ3YTQ2MWMwMmU0YjlmYWMyZjg0MDdiM2IwY2NlNC5zZXRDb250ZW50KGh0bWxfODU4MmQ3YTIxYWE5NGViODkxMjE0YzMwOTA2YWE0NjYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNjY5OTZmNjIzOGJhNGU1Yzk2NWIwZGUyMWMyYTYxZWEuYmluZFBvcHVwKHBvcHVwXzZmZDdhNDYxYzAyZTRiOWZhYzJmODQwN2IzYjBjY2U0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2RkNDljMWYzOTJjNjRlZjI5ZDEzYTNlNmUwYTMwMThhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjgyMzkxMDExNDQyMTEsLTczLjg3NjYxNTk2NDU3Mjk2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2M1MmM3MDI0OGM1MTQ0OWE4ZGUzOTdiYjExYWUzZWVhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2Q3NTA1Yjk0YmMyODQ0MjQ5MjBiNWU4YTMxOGYwMGU4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2MzOTgwZmU1OWZlYzQ0YjViZjYyODczMzYzMGIwOGM4ID0gJCgnPGRpdiBpZD0iaHRtbF9jMzk4MGZlNTlmZWM0NGI1YmY2Mjg3MzM2MzBiMDhjOCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q3lwcmVzcyBIaWxscywgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2Q3NTA1Yjk0YmMyODQ0MjQ5MjBiNWU4YTMxOGYwMGU4LnNldENvbnRlbnQoaHRtbF9jMzk4MGZlNTlmZWM0NGI1YmY2Mjg3MzM2MzBiMDhjOCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9kZDQ5YzFmMzkyYzY0ZWYyOWQxM2EzZTZlMGEzMDE4YS5iaW5kUG9wdXAocG9wdXBfZDc1MDViOTRiYzI4NDQyNDkyMGI1ZThhMzE4ZjAwZTgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMGFmNmFkMjQ5NTMyNDE5MTg3NjZjODVjODUyNzRlZmYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42Njk5MjU3MDA4NDcwNDUsLTczLjg4MDY5ODYzOTE3MzY2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2M1MmM3MDI0OGM1MTQ0OWE4ZGUzOTdiYjExYWUzZWVhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzAzZWQ4M2ZhMmQ2NzQ2Mzg5MTU1Y2M0ZDcxMjMyMDc3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2VjOGYwNWI1Njg4MTRlYzI4NzZjOTZmY2ZjOThiYjdhID0gJCgnPGRpdiBpZD0iaHRtbF9lYzhmMDViNTY4ODE0ZWMyODc2Yzk2ZmNmYzk4YmI3YSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RWFzdCBOZXcgWW9yaywgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzAzZWQ4M2ZhMmQ2NzQ2Mzg5MTU1Y2M0ZDcxMjMyMDc3LnNldENvbnRlbnQoaHRtbF9lYzhmMDViNTY4ODE0ZWMyODc2Yzk2ZmNmYzk4YmI3YSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8wYWY2YWQyNDk1MzI0MTkxODc2NmM4NWM4NTI3NGVmZi5iaW5kUG9wdXAocG9wdXBfMDNlZDgzZmEyZDY3NDYzODkxNTVjYzRkNzEyMzIwNzcpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNmI2ZjNhNjI1ZjI2NGI1ZjlkZmI4OWY2NDgxZDY5OTMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42NDc1ODkwNTIzMDg3NCwtNzMuODc5MzY5NzAwNDU4NzVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzUyYzcwMjQ4YzUxNDQ5YThkZTM5N2JiMTFhZTNlZWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYmRlYjFjNjI3ZDZlNDY2Y2IzMWQyY2NkMzQzMjM1MWYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZGM0MzFjOGJmZmIxNGI2NTk1YTk2YzNhNmIzYjM5NGIgPSAkKCc8ZGl2IGlkPSJodG1sX2RjNDMxYzhiZmZiMTRiNjU5NWE5NmMzYTZiM2IzOTRiIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5TdGFycmV0dCBDaXR5LCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYmRlYjFjNjI3ZDZlNDY2Y2IzMWQyY2NkMzQzMjM1MWYuc2V0Q29udGVudChodG1sX2RjNDMxYzhiZmZiMTRiNjU5NWE5NmMzYTZiM2IzOTRiKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzZiNmYzYTYyNWYyNjRiNWY5ZGZiODlmNjQ4MWQ2OTkzLmJpbmRQb3B1cChwb3B1cF9iZGViMWM2MjdkNmU0NjZjYjMxZDJjY2QzNDMyMzUxZik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl80Y2ZkZGRhY2I3M2I0NmZlODg2ZGM3Y2JjNDhlM2FlMCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjYzNTU2NDMyNzk3NDI4LC03My45MDIwOTI2OTc3ODk2Nl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jNTJjNzAyNDhjNTE0NDlhOGRlMzk3YmIxMWFlM2VlYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82NWM4M2ZkZTFmZmU0YjE4ODk2MmYzYmQxMjNlYzk1ZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wOTdjNTQyNTlhYTc0Mjg0ODI2NGNlMzAyOTA5MTE0YiA9ICQoJzxkaXYgaWQ9Imh0bWxfMDk3YzU0MjU5YWE3NDI4NDgyNjRjZTMwMjkwOTExNGIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNhbmFyc2llLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNjVjODNmZGUxZmZlNGIxODg5NjJmM2JkMTIzZWM5NWYuc2V0Q29udGVudChodG1sXzA5N2M1NDI1OWFhNzQyODQ4MjY0Y2UzMDI5MDkxMTRiKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzRjZmRkZGFjYjczYjQ2ZmU4ODZkYzdjYmM0OGUzYWUwLmJpbmRQb3B1cChwb3B1cF82NWM4M2ZkZTFmZmU0YjE4ODk2MmYzYmQxMjNlYzk1Zik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl83M2RkMmM3ZDYzMmU0Y2UyYTg4OTA4NzJhYTk3M2QwZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjYzMDQ0NjA0Mzc1NzQ2NiwtNzMuOTI5MTEzMDI2NDQ2NzRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzUyYzcwMjQ4YzUxNDQ5YThkZTM5N2JiMTFhZTNlZWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNzVjZGY2Y2I0ODdhNDRkN2IxZjhhYWI3ODdlOGUwOWEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYTQ0NTRlYjIwYmM2NDc5Mzk0ZDQyNTk4MjllN2ZjYzUgPSAkKCc8ZGl2IGlkPSJodG1sX2E0NDU0ZWIyMGJjNjQ3OTM5NGQ0MjU5ODI5ZTdmY2M1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5GbGF0bGFuZHMsIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83NWNkZjZjYjQ4N2E0NGQ3YjFmOGFhYjc4N2U4ZTA5YS5zZXRDb250ZW50KGh0bWxfYTQ0NTRlYjIwYmM2NDc5Mzk0ZDQyNTk4MjllN2ZjYzUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNzNkZDJjN2Q2MzJlNGNlMmE4ODkwODcyYWE5NzNkMGQuYmluZFBvcHVwKHBvcHVwXzc1Y2RmNmNiNDg3YTQ0ZDdiMWY4YWFiNzg3ZThlMDlhKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzhiMTg2M2JiYzQxNzQwOWE4YzZmOTU2OWQ2MTI4OGIwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjA2MzM2NDIxNjg1NjI2LC03My45MDgxODU3MTc3NzQyM10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jNTJjNzAyNDhjNTE0NDlhOGRlMzk3YmIxMWFlM2VlYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF81MzgzY2I0ZjAxNDg0ODY4YWNmNTVkNmQ5ZTNkN2ZkYiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83ZWRjNmI3ODA2ZmM0MDAxODZhYzc1ZjdhMTM3NmMxNyA9ICQoJzxkaXYgaWQ9Imh0bWxfN2VkYzZiNzgwNmZjNDAwMTg2YWM3NWY3YTEzNzZjMTciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk1pbGwgSXNsYW5kLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNTM4M2NiNGYwMTQ4NDg2OGFjZjU1ZDZkOWUzZDdmZGIuc2V0Q29udGVudChodG1sXzdlZGM2Yjc4MDZmYzQwMDE4NmFjNzVmN2ExMzc2YzE3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzhiMTg2M2JiYzQxNzQwOWE4YzZmOTU2OWQ2MTI4OGIwLmJpbmRQb3B1cChwb3B1cF81MzgzY2I0ZjAxNDg0ODY4YWNmNTVkNmQ5ZTNkN2ZkYik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mNGQwZGEwZDlkMGM0N2ZiOWMyNjFiYzRkMTE3ZGI1ZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjU3NzkxMzUwMzA4NjU3LC03My45NDM1MzcyMjg5MTg4Nl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jNTJjNzAyNDhjNTE0NDlhOGRlMzk3YmIxMWFlM2VlYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF84OGJjNzk5MGI2NTA0ZGE3YWFkZDVmZmI3YmQ5NDc0ZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8yZGQxMzAzZjM4NmM0Y2M1OGVkMzU5ODk3NmY0Njk1NiA9ICQoJzxkaXYgaWQ9Imh0bWxfMmRkMTMwM2YzODZjNGNjNThlZDM1OTg5NzZmNDY5NTYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk1hbmhhdHRhbiBCZWFjaCwgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzg4YmM3OTkwYjY1MDRkYTdhYWRkNWZmYjdiZDk0NzRkLnNldENvbnRlbnQoaHRtbF8yZGQxMzAzZjM4NmM0Y2M1OGVkMzU5ODk3NmY0Njk1Nik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9mNGQwZGEwZDlkMGM0N2ZiOWMyNjFiYzRkMTE3ZGI1ZC5iaW5kUG9wdXAocG9wdXBfODhiYzc5OTBiNjUwNGRhN2FhZGQ1ZmZiN2JkOTQ3NGQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMWE4MTgyYjI3MzcxNGRjYWJlZWE0NjAzYjNlMmM1OTEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC41NzQyOTI1NjQ3MTYwMSwtNzMuOTg4NjgyOTU4MjE2MzddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzUyYzcwMjQ4YzUxNDQ5YThkZTM5N2JiMTFhZTNlZWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNWNhZTI3MzgxMzE2NGVjY2IwYzY4ZTBjNmM5MWFjYzIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMDlkZjQ1OThlNzkxNGE1ODg1MTRlZDRmYzA0MTM2OGMgPSAkKCc8ZGl2IGlkPSJodG1sXzA5ZGY0NTk4ZTc5MTRhNTg4NTE0ZWQ0ZmMwNDEzNjhjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Db25leSBJc2xhbmQsIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81Y2FlMjczODEzMTY0ZWNjYjBjNjhlMGM2YzkxYWNjMi5zZXRDb250ZW50KGh0bWxfMDlkZjQ1OThlNzkxNGE1ODg1MTRlZDRmYzA0MTM2OGMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMWE4MTgyYjI3MzcxNGRjYWJlZWE0NjAzYjNlMmM1OTEuYmluZFBvcHVwKHBvcHVwXzVjYWUyNzM4MTMxNjRlY2NiMGM2OGUwYzZjOTFhY2MyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzAwZDllZDZhNGY3ZjRkNjJhODA0MTljOGYxYmU1NGMxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTk5NTE4NzAyODIyMzgsLTczLjk5ODc1MjIxNDQzNTE5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2M1MmM3MDI0OGM1MTQ0OWE4ZGUzOTdiYjExYWUzZWVhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzc3NzIxY2Q5YzE1MjQzZmJhZDE1NTRmYzVmOGQxMTc4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzRhYTU2OWVjMzg4YzRkYzhiOWRiMWI1ZmQyNDRlNDlmID0gJCgnPGRpdiBpZD0iaHRtbF80YWE1NjllYzM4OGM0ZGM4YjlkYjFiNWZkMjQ0ZTQ5ZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QmF0aCBCZWFjaCwgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzc3NzIxY2Q5YzE1MjQzZmJhZDE1NTRmYzVmOGQxMTc4LnNldENvbnRlbnQoaHRtbF80YWE1NjllYzM4OGM0ZGM4YjlkYjFiNWZkMjQ0ZTQ5Zik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8wMGQ5ZWQ2YTRmN2Y0ZDYyYTgwNDE5YzhmMWJlNTRjMS5iaW5kUG9wdXAocG9wdXBfNzc3MjFjZDljMTUyNDNmYmFkMTU1NGZjNWY4ZDExNzgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZjVkMGFmN2Y4M2VhNDY3NTgzYWE1MTkwMjBkZGVlYzcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42MzMxMzA1MTI3NTgwMTUsLTczLjk5MDQ5ODIzMDQ0ODExXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2M1MmM3MDI0OGM1MTQ0OWE4ZGUzOTdiYjExYWUzZWVhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzlkYjE1ZTgxNTM5ZDQ1YWU4YjY0OThlYzE1ZjU5NmNhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzBhODE5Yjk3MDEyOTRlMWI5ZjQ2MTI4YTRmNTMzYmVhID0gJCgnPGRpdiBpZD0iaHRtbF8wYTgxOWI5NzAxMjk0ZTFiOWY0NjEyOGE0ZjUzM2JlYSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Qm9yb3VnaCBQYXJrLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOWRiMTVlODE1MzlkNDVhZThiNjQ5OGVjMTVmNTk2Y2Euc2V0Q29udGVudChodG1sXzBhODE5Yjk3MDEyOTRlMWI5ZjQ2MTI4YTRmNTMzYmVhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2Y1ZDBhZjdmODNlYTQ2NzU4M2FhNTE5MDIwZGRlZWM3LmJpbmRQb3B1cChwb3B1cF85ZGIxNWU4MTUzOWQ0NWFlOGI2NDk4ZWMxNWY1OTZjYSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81OWU2YWIxMzJlYjQ0NmNiOTY0MTBjOTIxZWJhODUzMCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjYxOTIxOTQ1NzcyMjYzNiwtNzQuMDE5MzEzNzU2MzYwMjJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzUyYzcwMjQ4YzUxNDQ5YThkZTM5N2JiMTFhZTNlZWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNWI4NjkwNTMwNDRlNDg0YmFhMDU0MGQ3NGNlNGVhOWEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMDdiMjBiZTI1YjY3NDcxN2I2YmZkYjU0Y2VjM2JmZDUgPSAkKCc8ZGl2IGlkPSJodG1sXzA3YjIwYmUyNWI2NzQ3MTdiNmJmZGI1NGNlYzNiZmQ1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5EeWtlciBIZWlnaHRzLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNWI4NjkwNTMwNDRlNDg0YmFhMDU0MGQ3NGNlNGVhOWEuc2V0Q29udGVudChodG1sXzA3YjIwYmUyNWI2NzQ3MTdiNmJmZGI1NGNlYzNiZmQ1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzU5ZTZhYjEzMmViNDQ2Y2I5NjQxMGM5MjFlYmE4NTMwLmJpbmRQb3B1cChwb3B1cF81Yjg2OTA1MzA0NGU0ODRiYWEwNTQwZDc0Y2U0ZWE5YSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mMjk2MTQ2MDUxNjU0OWVmODgyOWM1ZDMzZDk3YzA5ZiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjU5MDg0ODQzMzkwMjA0NiwtNzMuOTMwMTAxNzA2OTExOTZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzUyYzcwMjQ4YzUxNDQ5YThkZTM5N2JiMTFhZTNlZWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYTY5MjVmYmRlMzAzNGJmN2E4MmVjZTlmOTc5MjY3OTAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOTFlZDVmNDc0YTY1NGFmZGEyOTZjZWI3MGMxMDQ4NDcgPSAkKCc8ZGl2IGlkPSJodG1sXzkxZWQ1ZjQ3NGE2NTRhZmRhMjk2Y2ViNzBjMTA0ODQ3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5HZXJyaXRzZW4gQmVhY2gsIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hNjkyNWZiZGUzMDM0YmY3YTgyZWNlOWY5NzkyNjc5MC5zZXRDb250ZW50KGh0bWxfOTFlZDVmNDc0YTY1NGFmZGEyOTZjZWI3MGMxMDQ4NDcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZjI5NjE0NjA1MTY1NDllZjg4MjljNWQzM2Q5N2MwOWYuYmluZFBvcHVwKHBvcHVwX2E2OTI1ZmJkZTMwMzRiZjdhODJlY2U5Zjk3OTI2NzkwKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2NlODM0ZjI5Y2RjMjQwYTViZjAzZTgwYzE1OTllOGQ0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjA5NzQ3Nzc5ODk0NjA0LC03My45MzEzNDQwNDEwODQ5N10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jNTJjNzAyNDhjNTE0NDlhOGRlMzk3YmIxMWFlM2VlYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lYzA0ZWU4NWUzZWI0MmQ4Yjk2MDhlYzE3MGZkOGNiYyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xMDc2OTY5MjJkYjc0OWViOTM3NDRkNTZmMDllNmYxMyA9ICQoJzxkaXYgaWQ9Imh0bWxfMTA3Njk2OTIyZGI3NDllYjkzNzQ0ZDU2ZjA5ZTZmMTMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk1hcmluZSBQYXJrLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZWMwNGVlODVlM2ViNDJkOGI5NjA4ZWMxNzBmZDhjYmMuc2V0Q29udGVudChodG1sXzEwNzY5NjkyMmRiNzQ5ZWI5Mzc0NGQ1NmYwOWU2ZjEzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2NlODM0ZjI5Y2RjMjQwYTViZjAzZTgwYzE1OTllOGQ0LmJpbmRQb3B1cChwb3B1cF9lYzA0ZWU4NWUzZWI0MmQ4Yjk2MDhlYzE3MGZkOGNiYyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81ODE5Y2JiMGY0Y2Y0NjMyYWQ2ZDFmN2UwZTU4ZjY1YyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY5MzIyOTQyMTg4MTUwNCwtNzMuOTY3ODQzMDYyMTYzNjddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzUyYzcwMjQ4YzUxNDQ5YThkZTM5N2JiMTFhZTNlZWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYmNjZjMzNzVmNzM2NDQ3ODg5NTgyOThhMWJlMzNmMWQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMDIzZDM2OWYwNzNhNGQwNzkxNjgxNzhmNzg0ZTE2M2MgPSAkKCc8ZGl2IGlkPSJodG1sXzAyM2QzNjlmMDczYTRkMDc5MTY4MTc4Zjc4NGUxNjNjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DbGludG9uIEhpbGwsIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iY2NmMzM3NWY3MzY0NDc4ODk1ODI5OGExYmUzM2YxZC5zZXRDb250ZW50KGh0bWxfMDIzZDM2OWYwNzNhNGQwNzkxNjgxNzhmNzg0ZTE2M2MpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNTgxOWNiYjBmNGNmNDYzMmFkNmQxZjdlMGU1OGY2NWMuYmluZFBvcHVwKHBvcHVwX2JjY2YzMzc1ZjczNjQ0Nzg4OTU4Mjk4YTFiZTMzZjFkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzFiYzlmOTZiZDZmNzRjYjhhYjhmMjNmOTAwNzEzMjJjID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTc2Mzc1Mzc4OTAyMjQsLTc0LjAwNzg3MzExMjAwMjRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzUyYzcwMjQ4YzUxNDQ5YThkZTM5N2JiMTFhZTNlZWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMDVlNTg1NzgxZTY3NGUyMjgxNjVlZDZlNDk5N2E2ZGMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfODk2OWY5NTA5NzdlNDA4MWIzOGNkMjE2YmVmMzAxOTQgPSAkKCc8ZGl2IGlkPSJodG1sXzg5NjlmOTUwOTc3ZTQwODFiMzhjZDIxNmJlZjMwMTk0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5TZWEgR2F0ZSwgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzA1ZTU4NTc4MWU2NzRlMjI4MTY1ZWQ2ZTQ5OTdhNmRjLnNldENvbnRlbnQoaHRtbF84OTY5Zjk1MDk3N2U0MDgxYjM4Y2QyMTZiZWYzMDE5NCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8xYmM5Zjk2YmQ2Zjc0Y2I4YWI4ZjIzZjkwMDcxMzIyYy5iaW5kUG9wdXAocG9wdXBfMDVlNTg1NzgxZTY3NGUyMjgxNjVlZDZlNDk5N2E2ZGMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNzM5MTdmZTQ1NTE5NDc0ZDk3MmExMjdiM2Q3ODg2MDYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42OTA4NDQwMjEwOTgwMiwtNzMuOTgzNDYzMzc0MzEwOTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzUyYzcwMjQ4YzUxNDQ5YThkZTM5N2JiMTFhZTNlZWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfN2IxZDRiYmFlNDc2NDAwY2EyMjliMjBjNzI0YmYwNmQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZjA5MjAxYmE2YWQ5NDNlZWE0YjM4MTc4NGE4MmMwZjggPSAkKCc8ZGl2IGlkPSJodG1sX2YwOTIwMWJhNmFkOTQzZWVhNGIzODE3ODRhODJjMGY4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Eb3dudG93biwgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzdiMWQ0YmJhZTQ3NjQwMGNhMjI5YjIwYzcyNGJmMDZkLnNldENvbnRlbnQoaHRtbF9mMDkyMDFiYTZhZDk0M2VlYTRiMzgxNzg0YTgyYzBmOCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl83MzkxN2ZlNDU1MTk0NzRkOTcyYTEyN2IzZDc4ODYwNi5iaW5kUG9wdXAocG9wdXBfN2IxZDRiYmFlNDc2NDAwY2EyMjliMjBjNzI0YmYwNmQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOTVlZDI0MjI1YmY1NGYzOWJmNGFlM2M2NGVlNDU3MGIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42ODU2ODI5MTIwOTE0NDQsLTczLjk4Mzc0ODI0MTE1Nzk4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2M1MmM3MDI0OGM1MTQ0OWE4ZGUzOTdiYjExYWUzZWVhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzNhOGU4MTA4YzVkZTRjOTRiN2U4ZDdhMzZlYzFlNmYzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzNlZTE3MzM3N2NhZjQ4NzM4MjVhMGRmMjM1ZDMzMzk5ID0gJCgnPGRpdiBpZD0iaHRtbF8zZWUxNzMzNzdjYWY0ODczODI1YTBkZjIzNWQzMzM5OSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Qm9lcnVtIEhpbGwsIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zYThlODEwOGM1ZGU0Yzk0YjdlOGQ3YTM2ZWMxZTZmMy5zZXRDb250ZW50KGh0bWxfM2VlMTczMzc3Y2FmNDg3MzgyNWEwZGYyMzVkMzMzOTkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOTVlZDI0MjI1YmY1NGYzOWJmNGFlM2M2NGVlNDU3MGIuYmluZFBvcHVwKHBvcHVwXzNhOGU4MTA4YzVkZTRjOTRiN2U4ZDdhMzZlYzFlNmYzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2IxMGEyM2I2ZWUwMzQzNTc4Y2ZkOWY4NGI2ZGIzZGMxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjU4NDIwMDE3NDY5ODE1LC03My45NTQ4OTg2NzA3NzcxM10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jNTJjNzAyNDhjNTE0NDlhOGRlMzk3YmIxMWFlM2VlYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9kMjk5NDNlMjgxYmU0MGQ5ODg0M2Y1ZGQ4NGU4ZjE0OSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xNGM2Nzg5NTE1NWM0NjExYmY0N2M0ZTFiMWE5ZWQ2MiA9ICQoJzxkaXYgaWQ9Imh0bWxfMTRjNjc4OTUxNTVjNDYxMWJmNDdjNGUxYjFhOWVkNjIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlByb3NwZWN0IExlZmZlcnRzIEdhcmRlbnMsIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kMjk5NDNlMjgxYmU0MGQ5ODg0M2Y1ZGQ4NGU4ZjE0OS5zZXRDb250ZW50KGh0bWxfMTRjNjc4OTUxNTVjNDYxMWJmNDdjNGUxYjFhOWVkNjIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYjEwYTIzYjZlZTAzNDM1NzhjZmQ5Zjg0YjZkYjNkYzEuYmluZFBvcHVwKHBvcHVwX2QyOTk0M2UyODFiZTQwZDk4ODQzZjVkZDg0ZThmMTQ5KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzlhYTQ3NjEwNjM3YjQ3Mzg5NzZmNjZjNzc3NjRiNjY4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjc4NDAyNTU0Nzk1MzU1LC03My45MTMwNjgzMTc4NzM5NV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jNTJjNzAyNDhjNTE0NDlhOGRlMzk3YmIxMWFlM2VlYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hYTQ5ZmJiODc2MjQ0MWJjYjE5YmRjZjBlZmRhZGJlOSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iZDI2OThkY2M5NDk0N2I4ODdjZjFkM2NjYTE5YjZkNSA9ICQoJzxkaXYgaWQ9Imh0bWxfYmQyNjk4ZGNjOTQ5NDdiODg3Y2YxZDNjY2ExOWI2ZDUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk9jZWFuIEhpbGwsIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hYTQ5ZmJiODc2MjQ0MWJjYjE5YmRjZjBlZmRhZGJlOS5zZXRDb250ZW50KGh0bWxfYmQyNjk4ZGNjOTQ5NDdiODg3Y2YxZDNjY2ExOWI2ZDUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOWFhNDc2MTA2MzdiNDczODk3NmY2NmM3Nzc2NGI2NjguYmluZFBvcHVwKHBvcHVwX2FhNDlmYmI4NzYyNDQxYmNiMTliZGNmMGVmZGFkYmU5KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2JlNzBiZThlYzUxODQzYTc5MzRmYmVlZTAwZTc1NzA2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjc4NTY5OTU3Mjc0NzksLTczLjg2Nzk3NTk4MDgxMzM0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2M1MmM3MDI0OGM1MTQ0OWE4ZGUzOTdiYjExYWUzZWVhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzNhNjZmMDA1NjY2YzQ1NDZiODlmYjk2MTQxNzkzOGFmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzQ0MDlhM2QyMTI0ZDRjMThhZjlmY2JkNzA4OWI4NTBmID0gJCgnPGRpdiBpZD0iaHRtbF80NDA5YTNkMjEyNGQ0YzE4YWY5ZmNiZDcwODliODUwZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q2l0eSBMaW5lLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfM2E2NmYwMDU2NjZjNDU0NmI4OWZiOTYxNDE3OTM4YWYuc2V0Q29udGVudChodG1sXzQ0MDlhM2QyMTI0ZDRjMThhZjlmY2JkNzA4OWI4NTBmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2JlNzBiZThlYzUxODQzYTc5MzRmYmVlZTAwZTc1NzA2LmJpbmRQb3B1cChwb3B1cF8zYTY2ZjAwNTY2NmM0NTQ2Yjg5ZmI5NjE0MTc5MzhhZik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81ZTMwYmEzZWIxMzQ0YjJjYWUxZWQ5MjUwYTY0MWFiMiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjYxNTE0OTU1MDQ1MzA4LC03My44OTg1NTYzMzYzMDMxN10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jNTJjNzAyNDhjNTE0NDlhOGRlMzk3YmIxMWFlM2VlYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF80ZjhjNTcyNWIyZDU0MTYzOWFmOTI4NTE2OWY1MDg4ZSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF85NTZjZTVjOTlhZmI0NTI1YTk2ZTg0ZDQ4MDIwMzBmOSA9ICQoJzxkaXYgaWQ9Imh0bWxfOTU2Y2U1Yzk5YWZiNDUyNWE5NmU4NGQ0ODAyMDMwZjkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkJlcmdlbiBCZWFjaCwgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzRmOGM1NzI1YjJkNTQxNjM5YWY5Mjg1MTY5ZjUwODhlLnNldENvbnRlbnQoaHRtbF85NTZjZTVjOTlhZmI0NTI1YTk2ZTg0ZDQ4MDIwMzBmOSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81ZTMwYmEzZWIxMzQ0YjJjYWUxZWQ5MjUwYTY0MWFiMi5iaW5kUG9wdXAocG9wdXBfNGY4YzU3MjViMmQ1NDE2MzlhZjkyODUxNjlmNTA4OGUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMWNjMTc4MTk4MjNmNDg5N2FiZmQ0OGRiNWFhNjRjMDEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42MjU1OTU4OTg2OTg0MywtNzMuOTU3NTk1MjM0ODk4MzhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzUyYzcwMjQ4YzUxNDQ5YThkZTM5N2JiMTFhZTNlZWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOTc1OTE3YWQyYjI4NGRlMmI2MDQ1NjU5MzNkMGMwYmYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNTZjYjgyNmRjNTNiNGFiNjg5MTI5NDc3OGYzMGNjNWEgPSAkKCc8ZGl2IGlkPSJodG1sXzU2Y2I4MjZkYzUzYjRhYjY4OTEyOTQ3NzhmMzBjYzVhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NaWR3b29kLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOTc1OTE3YWQyYjI4NGRlMmI2MDQ1NjU5MzNkMGMwYmYuc2V0Q29udGVudChodG1sXzU2Y2I4MjZkYzUzYjRhYjY4OTEyOTQ3NzhmMzBjYzVhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzFjYzE3ODE5ODIzZjQ4OTdhYmZkNDhkYjVhYTY0YzAxLmJpbmRQb3B1cChwb3B1cF85NzU5MTdhZDJiMjg0ZGUyYjYwNDU2NTkzM2QwYzBiZik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mMDc4YjIwMGY0NjY0YTBkYTAwY2YzMjc0N2FkOWZmYyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY0NzAwODYwMzE4NTE4NSwtNzMuOTYyNjEzMTY3MTYwNDhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzUyYzcwMjQ4YzUxNDQ5YThkZTM5N2JiMTFhZTNlZWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZTNhNjEwNDUyNWRkNDVkMDg4OGUzNGUzN2Q0ODU3OTYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZjJhNDc2ZjIzNDUyNGZmZTkwNDEwNDYwOTA2YTg5MjcgPSAkKCc8ZGl2IGlkPSJodG1sX2YyYTQ3NmYyMzQ1MjRmZmU5MDQxMDQ2MDkwNmE4OTI3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Qcm9zcGVjdCBQYXJrIFNvdXRoLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZTNhNjEwNDUyNWRkNDVkMDg4OGUzNGUzN2Q0ODU3OTYuc2V0Q29udGVudChodG1sX2YyYTQ3NmYyMzQ1MjRmZmU5MDQxMDQ2MDkwNmE4OTI3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2YwNzhiMjAwZjQ2NjRhMGRhMDBjZjMyNzQ3YWQ5ZmZjLmJpbmRQb3B1cChwb3B1cF9lM2E2MTA0NTI1ZGQ0NWQwODg4ZTM0ZTM3ZDQ4NTc5Nik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85NWRiZWRmMGVlZDY0Yzg2OWFkZWQwZDAxNTIxNDY0ZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjYyMzg0NTI0NDc4NDE5LC03My45MTYwNzQ4Mzk1MTMyNF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jNTJjNzAyNDhjNTE0NDlhOGRlMzk3YmIxMWFlM2VlYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8yOTA1ZDlhNDBiNDY0NGIxYTEyZGZiZTYxMmJiMWJlYiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iNGFiOWFjZDY3Yzg0ZTdhYmIxOTBjODAzYTg5ZjU1ZCA9ICQoJzxkaXYgaWQ9Imh0bWxfYjRhYjlhY2Q2N2M4NGU3YWJiMTkwYzgwM2E4OWY1NWQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkdlb3JnZXRvd24sIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yOTA1ZDlhNDBiNDY0NGIxYTEyZGZiZTYxMmJiMWJlYi5zZXRDb250ZW50KGh0bWxfYjRhYjlhY2Q2N2M4NGU3YWJiMTkwYzgwM2E4OWY1NWQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOTVkYmVkZjBlZWQ2NGM4NjlhZGVkMGQwMTUyMTQ2NGUuYmluZFBvcHVwKHBvcHVwXzI5MDVkOWE0MGI0NjQ0YjFhMTJkZmJlNjEyYmIxYmViKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzU3ZDEyYTA0NTc1NzQ4NzdhMDhlNzI3YmY1ZDgyNzYyID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzA4NDkyNDEwNDE1NDgsLTczLjkzODg1ODE1MjY5MTk1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2M1MmM3MDI0OGM1MTQ0OWE4ZGUzOTdiYjExYWUzZWVhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2JjMDY1YWE3YWYzODQxM2VhNWNkYTk3NmU2MDNkMWMxID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzVhMDdjMDY4YTUyMjQwNjViZDlmYmVmZWI2MmU2YzAyID0gJCgnPGRpdiBpZD0iaHRtbF81YTA3YzA2OGE1MjI0MDY1YmQ5ZmJlZmViNjJlNmMwMiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RWFzdCBXaWxsaWFtc2J1cmcsIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iYzA2NWFhN2FmMzg0MTNlYTVjZGE5NzZlNjAzZDFjMS5zZXRDb250ZW50KGh0bWxfNWEwN2MwNjhhNTIyNDA2NWJkOWZiZWZlYjYyZTZjMDIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNTdkMTJhMDQ1NzU3NDg3N2EwOGU3MjdiZjVkODI3NjIuYmluZFBvcHVwKHBvcHVwX2JjMDY1YWE3YWYzODQxM2VhNWNkYTk3NmU2MDNkMWMxKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzM0ZDZhMTVlN2Y4MzQzZmU4YmRjYmI1OWE3MjIzNzI5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzE0ODIyOTA2NTMyMDE0LC03My45NTg4MDg1NzU4NzU4Ml0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jNTJjNzAyNDhjNTE0NDlhOGRlMzk3YmIxMWFlM2VlYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zZDg2M2JiOGY5NzM0NjNlYTkwYmE3NzVkNzlkM2JjMiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF84NDJjODExM2ZhZmQ0YmY4ODgwNmU0OWMzNzhjYjVjMiA9ICQoJzxkaXYgaWQ9Imh0bWxfODQyYzgxMTNmYWZkNGJmODg4MDZlNDljMzc4Y2I1YzIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk5vcnRoIFNpZGUsIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zZDg2M2JiOGY5NzM0NjNlYTkwYmE3NzVkNzlkM2JjMi5zZXRDb250ZW50KGh0bWxfODQyYzgxMTNmYWZkNGJmODg4MDZlNDljMzc4Y2I1YzIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMzRkNmExNWU3ZjgzNDNmZThiZGNiYjU5YTcyMjM3MjkuYmluZFBvcHVwKHBvcHVwXzNkODYzYmI4Zjk3MzQ2M2VhOTBiYTc3NWQ3OWQzYmMyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzYyMWY0MWUxNzA1MDQxMTI4NTdmMWE3NjRiNDY3NzAzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzEwODYxNDcyNjUwNjQsLTczLjk1ODAwMDk1MTUzMzMxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2M1MmM3MDI0OGM1MTQ0OWE4ZGUzOTdiYjExYWUzZWVhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2VhN2NhZWE2MzJhZDRlMDY4ODFiMThkNTAyMzNkZTAxID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzRiMzdhN2NkMmJhMTQ4ZTY4OGU3OTQ0NTczMDFlOGE5ID0gJCgnPGRpdiBpZD0iaHRtbF80YjM3YTdjZDJiYTE0OGU2ODhlNzk0NDU3MzAxZThhOSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U291dGggU2lkZSwgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2VhN2NhZWE2MzJhZDRlMDY4ODFiMThkNTAyMzNkZTAxLnNldENvbnRlbnQoaHRtbF80YjM3YTdjZDJiYTE0OGU2ODhlNzk0NDU3MzAxZThhOSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl82MjFmNDFlMTcwNTA0MTEyODU3ZjFhNzY0YjQ2NzcwMy5iaW5kUG9wdXAocG9wdXBfZWE3Y2FlYTYzMmFkNGUwNjg4MWIxOGQ1MDIzM2RlMDEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZTAwZmMzZjM4ZmI0NGQ3MzlkNGI5NzZlMzhiMDE4MTEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42MTMwNTk3NjY2Nzk0MiwtNzMuOTY4MzY2NzgwMzU1NDFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzUyYzcwMjQ4YzUxNDQ5YThkZTM5N2JiMTFhZTNlZWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZTg5MmEzY2IzNGZhNDBhMGIxNzQ5MDIyMzJkMWQ0MzMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNzAxY2EzOTY2OTFjNDc0NWE3Y2NhM2IzNTJkNjM0ZjEgPSAkKCc8ZGl2IGlkPSJodG1sXzcwMWNhMzk2NjkxYzQ3NDVhN2NjYTNiMzUyZDYzNGYxIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5PY2VhbiBQYXJrd2F5LCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZTg5MmEzY2IzNGZhNDBhMGIxNzQ5MDIyMzJkMWQ0MzMuc2V0Q29udGVudChodG1sXzcwMWNhMzk2NjkxYzQ3NDVhN2NjYTNiMzUyZDYzNGYxKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2UwMGZjM2YzOGZiNDRkNzM5ZDRiOTc2ZTM4YjAxODExLmJpbmRQb3B1cChwb3B1cF9lODkyYTNjYjM0ZmE0MGEwYjE3NDkwMjIzMmQxZDQzMyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl84Y2M3NTVlOGZiMTk0ZjMyYmYzMjc4ZjU0YWQ4YTc5ZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjYxNDc2ODEyNjk0MjI2LC03NC4wMzE5NzkxNDUzNzk4NF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jNTJjNzAyNDhjNTE0NDlhOGRlMzk3YmIxMWFlM2VlYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mYzIwYmJmMzU3OGU0NTQyYmMyZjFjMjZmMWI5ODIzMiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xNTQ3ZDdlYjI5ODY0YjhhODBjNzcxYTBkYzVkMDlmMiA9ICQoJzxkaXYgaWQ9Imh0bWxfMTU0N2Q3ZWIyOTg2NGI4YTgwYzc3MWEwZGM1ZDA5ZjIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkZvcnQgSGFtaWx0b24sIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mYzIwYmJmMzU3OGU0NTQyYmMyZjFjMjZmMWI5ODIzMi5zZXRDb250ZW50KGh0bWxfMTU0N2Q3ZWIyOTg2NGI4YTgwYzc3MWEwZGM1ZDA5ZjIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOGNjNzU1ZThmYjE5NGYzMmJmMzI3OGY1NGFkOGE3OWQuYmluZFBvcHVwKHBvcHVwX2ZjMjBiYmYzNTc4ZTQ1NDJiYzJmMWMyNmYxYjk4MjMyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2Q3ZmYxZDhjODJkNTQ1MjU4YjhhOGI5Mjg2YWRhMTI2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzE1NjE4NDIyMzE0MzIsLTczLjk5NDI3OTM2MjU1OTc4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2M1MmM3MDI0OGM1MTQ0OWE4ZGUzOTdiYjExYWUzZWVhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzZjMWUxNzY0MzQ0NzQ0ZWY4Mjc4ZTcxMDU1ZWE5NDA0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzljN2IxMWZmNjkxYzQ5NjFhNDI1ZWNlZTUwNWYzOTI4ID0gJCgnPGRpdiBpZD0iaHRtbF85YzdiMTFmZjY5MWM0OTYxYTQyNWVjZWU1MDVmMzkyOCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q2hpbmF0b3duLCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzZjMWUxNzY0MzQ0NzQ0ZWY4Mjc4ZTcxMDU1ZWE5NDA0LnNldENvbnRlbnQoaHRtbF85YzdiMTFmZjY5MWM0OTYxYTQyNWVjZWU1MDVmMzkyOCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9kN2ZmMWQ4YzgyZDU0NTI1OGI4YThiOTI4NmFkYTEyNi5iaW5kUG9wdXAocG9wdXBfNmMxZTE3NjQzNDQ3NDRlZjgyNzhlNzEwNTVlYTk0MDQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYmVmMGI5NWI0MmYxNDY2YzgxNTliYzdkNzliNGFiNWIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44NTE5MDI1MjU1NTMwNSwtNzMuOTM2OTAwMjc5ODUyMzRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzUyYzcwMjQ4YzUxNDQ5YThkZTM5N2JiMTFhZTNlZWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZmM0MmIzNTRhNDc1NDVlZTljZDQxYzY5MmI1MjRkM2EgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNDZiNWZmOGE0YzMwNDQ1ZmI2ZDQwMWU2NmMyMjI0MDAgPSAkKCc8ZGl2IGlkPSJodG1sXzQ2YjVmZjhhNGMzMDQ0NWZiNmQ0MDFlNjZjMjIyNDAwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5XYXNoaW5ndG9uIEhlaWdodHMsIE1hbmhhdHRhbjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZmM0MmIzNTRhNDc1NDVlZTljZDQxYzY5MmI1MjRkM2Euc2V0Q29udGVudChodG1sXzQ2YjVmZjhhNGMzMDQ0NWZiNmQ0MDFlNjZjMjIyNDAwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2JlZjBiOTViNDJmMTQ2NmM4MTU5YmM3ZDc5YjRhYjViLmJpbmRQb3B1cChwb3B1cF9mYzQyYjM1NGE0NzU0NWVlOWNkNDFjNjkyYjUyNGQzYSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9hOGFiMDAwMzY2Y2U0OGRhYWMxN2Y3MzZhMTA2ZGFjMCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjg2NzY4Mzk2NDQ5OTE1LC03My45MjEyMTA0MjIwMzg5N10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jNTJjNzAyNDhjNTE0NDlhOGRlMzk3YmIxMWFlM2VlYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF83NmRjMzZhYzYzOGQ0YTg5OWZhZTVkNzFhNDQxYzg1YiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF85MGMzODJmNmM0OTI0ZmZmYWMxOTVkZjg2NTk2NTViNyA9ICQoJzxkaXYgaWQ9Imh0bWxfOTBjMzgyZjZjNDkyNGZmZmFjMTk1ZGY4NjU5NjU1YjciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPklud29vZCwgTWFuaGF0dGFuPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83NmRjMzZhYzYzOGQ0YTg5OWZhZTVkNzFhNDQxYzg1Yi5zZXRDb250ZW50KGh0bWxfOTBjMzgyZjZjNDkyNGZmZmFjMTk1ZGY4NjU5NjU1YjcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYThhYjAwMDM2NmNlNDhkYWFjMTdmNzM2YTEwNmRhYzAuYmluZFBvcHVwKHBvcHVwXzc2ZGMzNmFjNjM4ZDRhODk5ZmFlNWQ3MWE0NDFjODViKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2VjOWUzNWQxY2UxMDQwNGRiY2JlYzIwZjY3YzBiMTQ1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODIzNjA0Mjg0ODExOTM1LC03My45NDk2ODc5MTg4MzM2Nl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jNTJjNzAyNDhjNTE0NDlhOGRlMzk3YmIxMWFlM2VlYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF83ZGNmMzJiZjgzNTM0YmNkODkxNDZiNmFlNWVmMTRlYiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kM2IxNjFiMDNmZTc0MmYzOTczNjlmMGMyNGVlOTdhYSA9ICQoJzxkaXYgaWQ9Imh0bWxfZDNiMTYxYjAzZmU3NDJmMzk3MzY5ZjBjMjRlZTk3YWEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkhhbWlsdG9uIEhlaWdodHMsIE1hbmhhdHRhbjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfN2RjZjMyYmY4MzUzNGJjZDg5MTQ2YjZhZTVlZjE0ZWIuc2V0Q29udGVudChodG1sX2QzYjE2MWIwM2ZlNzQyZjM5NzM2OWYwYzI0ZWU5N2FhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2VjOWUzNWQxY2UxMDQwNGRiY2JlYzIwZjY3YzBiMTQ1LmJpbmRQb3B1cChwb3B1cF83ZGNmMzJiZjgzNTM0YmNkODkxNDZiNmFlNWVmMTRlYik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9hMDVlYmNhNmFmNTI0NmVlYjU1NGRjOWQ1ODk3YWUzMSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjgxNjkzNDQyOTQ5NzgsLTczLjk1NzM4NTM5MzUxODhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzUyYzcwMjQ4YzUxNDQ5YThkZTM5N2JiMTFhZTNlZWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZjE3ODI0NmRhYzcyNDQ3OTg4ZGU4OTBhNmM5OGNjZTUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNGMzMzUwMGQxYmQ5NDEyMzk0OGQ3YTBmNGViMWQ2NDMgPSAkKCc8ZGl2IGlkPSJodG1sXzRjMzM1MDBkMWJkOTQxMjM5NDhkN2EwZjRlYjFkNjQzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NYW5oYXR0YW52aWxsZSwgTWFuaGF0dGFuPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mMTc4MjQ2ZGFjNzI0NDc5ODhkZTg5MGE2Yzk4Y2NlNS5zZXRDb250ZW50KGh0bWxfNGMzMzUwMGQxYmQ5NDEyMzk0OGQ3YTBmNGViMWQ2NDMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYTA1ZWJjYTZhZjUyNDZlZWI1NTRkYzlkNTg5N2FlMzEuYmluZFBvcHVwKHBvcHVwX2YxNzgyNDZkYWM3MjQ0Nzk4OGRlODkwYTZjOThjY2U1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzA2MTMzN2MzODMxMDQzMWVhNzI1NDU5MzY5N2IxNmYxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODE1OTc2MDY3NDI0MTQsLTczLjk0MzIxMTEyNjAzOTA1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2M1MmM3MDI0OGM1MTQ0OWE4ZGUzOTdiYjExYWUzZWVhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2Q1ZmY5MDc5NzlhMzQ1MGVhN2MzMTE3YmFhN2U4YjE2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzEwNmNlMjIwMTkzNzQzMjI5NGE5MDFjYTJlYjFlMzE5ID0gJCgnPGRpdiBpZD0iaHRtbF8xMDZjZTIyMDE5Mzc0MzIyOTRhOTAxY2EyZWIxZTMxOSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q2VudHJhbCBIYXJsZW0sIE1hbmhhdHRhbjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZDVmZjkwNzk3OWEzNDUwZWE3YzMxMTdiYWE3ZThiMTYuc2V0Q29udGVudChodG1sXzEwNmNlMjIwMTkzNzQzMjI5NGE5MDFjYTJlYjFlMzE5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzA2MTMzN2MzODMxMDQzMWVhNzI1NDU5MzY5N2IxNmYxLmJpbmRQb3B1cChwb3B1cF9kNWZmOTA3OTc5YTM0NTBlYTdjMzExN2JhYTdlOGIxNik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xZjFjNmZlYmZhNDc0MDk5OTBkZmU0MzIwNDQ0Y2VhMSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc5MjI0OTQ2NjYzMDMzLC03My45NDQxODIyMzE0ODUyNF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jNTJjNzAyNDhjNTE0NDlhOGRlMzk3YmIxMWFlM2VlYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF84MWE4MDRiMWIwZmQ0ZDFjODk2ZjQ1YmYyMmI5MTg1OSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zMjNiNzdlY2E3NzE0YWM2OGJjNDY0NDUxMDBjOTJkYSA9ICQoJzxkaXYgaWQ9Imh0bWxfMzIzYjc3ZWNhNzcxNGFjNjhiYzQ2NDQ1MTAwYzkyZGEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkVhc3QgSGFybGVtLCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzgxYTgwNGIxYjBmZDRkMWM4OTZmNDViZjIyYjkxODU5LnNldENvbnRlbnQoaHRtbF8zMjNiNzdlY2E3NzE0YWM2OGJjNDY0NDUxMDBjOTJkYSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8xZjFjNmZlYmZhNDc0MDk5OTBkZmU0MzIwNDQ0Y2VhMS5iaW5kUG9wdXAocG9wdXBfODFhODA0YjFiMGZkNGQxYzg5NmY0NWJmMjJiOTE4NTkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYTZiZTVkMTg4MDI4NDY4NThlYzY3ZmQ4OWI0ZTVkNjkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NzU2Mzg1NzMzMDE4MDUsLTczLjk2MDUwNzYzMTM1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2M1MmM3MDI0OGM1MTQ0OWE4ZGUzOTdiYjExYWUzZWVhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2IyMTkwYzFlNjg4ZTQ0Zjg5NGYyNTAxODg4YjcyMzQ4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2E3NGZlOGEwMDViNDRlOTFiNTlmOTJkM2M1MjRlYzk4ID0gJCgnPGRpdiBpZD0iaHRtbF9hNzRmZThhMDA1YjQ0ZTkxYjU5ZjkyZDNjNTI0ZWM5OCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+VXBwZXIgRWFzdCBTaWRlLCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2IyMTkwYzFlNjg4ZTQ0Zjg5NGYyNTAxODg4YjcyMzQ4LnNldENvbnRlbnQoaHRtbF9hNzRmZThhMDA1YjQ0ZTkxYjU5ZjkyZDNjNTI0ZWM5OCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9hNmJlNWQxODgwMjg0Njg1OGVjNjdmZDg5YjRlNWQ2OS5iaW5kUG9wdXAocG9wdXBfYjIxOTBjMWU2ODhlNDRmODk0ZjI1MDE4ODhiNzIzNDgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZDhkNGU0NGE1N2M2NGRjY2I3YzM3YTlmM2FmZTJmY2EgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NzU5Mjk4NDk4ODQ4NzUsLTczLjk0NzExNzg0NDcxODI2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2M1MmM3MDI0OGM1MTQ0OWE4ZGUzOTdiYjExYWUzZWVhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzMyODRiNjQ1MDlmZDQzN2Y4OTY5NDE1MzBjMmFhYjNhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzQ4ZDVkMmJmZmY5YzQ3MmY4YzVmNmUyNDQxYWJmOWJkID0gJCgnPGRpdiBpZD0iaHRtbF80OGQ1ZDJiZmZmOWM0NzJmOGM1ZjZlMjQ0MWFiZjliZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WW9ya3ZpbGxlLCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzMyODRiNjQ1MDlmZDQzN2Y4OTY5NDE1MzBjMmFhYjNhLnNldENvbnRlbnQoaHRtbF80OGQ1ZDJiZmZmOWM0NzJmOGM1ZjZlMjQ0MWFiZjliZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9kOGQ0ZTQ0YTU3YzY0ZGNjYjdjMzdhOWYzYWZlMmZjYS5iaW5kUG9wdXAocG9wdXBfMzI4NGI2NDUwOWZkNDM3Zjg5Njk0MTUzMGMyYWFiM2EpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMWQ0NjdkZjZlZmZlNGM1MGJjZjg5MDU1MjdhZDE5ZDYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NjgxMTI2NTgyODczMywtNzMuOTU4ODU5Njg4MTM3Nl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jNTJjNzAyNDhjNTE0NDlhOGRlMzk3YmIxMWFlM2VlYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9jYmNlOGQxNGE2ZTM0NjVlODA3N2JmMDEzZGJmOGFlZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wNDk4OWYxOGYyNzk0ZjNiOWNmN2MzYmM3YmJlZjA1OCA9ICQoJzxkaXYgaWQ9Imh0bWxfMDQ5ODlmMThmMjc5NGYzYjljZjdjM2JjN2JiZWYwNTgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkxlbm94IEhpbGwsIE1hbmhhdHRhbjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfY2JjZThkMTRhNmUzNDY1ZTgwNzdiZjAxM2RiZjhhZWQuc2V0Q29udGVudChodG1sXzA0OTg5ZjE4ZjI3OTRmM2I5Y2Y3YzNiYzdiYmVmMDU4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzFkNDY3ZGY2ZWZmZTRjNTBiY2Y4OTA1NTI3YWQxOWQ2LmJpbmRQb3B1cChwb3B1cF9jYmNlOGQxNGE2ZTM0NjVlODA3N2JmMDEzZGJmOGFlZCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8wMDU2Y2Q2ZTIxMjc0Y2RiYWYzODgyNTg1OTc2ZGFiMiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc2MjE1OTYwNTc2MjgzLC03My45NDkxNjc2OTIyNzk1M10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jNTJjNzAyNDhjNTE0NDlhOGRlMzk3YmIxMWFlM2VlYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9jMTQ5NjYyZmZhNjQ0YTg4OGRiZWUwZTczM2IzODk1ZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF84NmY3N2EzNmNlNGI0YmYwODU0YzQ5ZTMzZTM2ZWY1NCA9ICQoJzxkaXYgaWQ9Imh0bWxfODZmNzdhMzZjZTRiNGJmMDg1NGM0OWUzM2UzNmVmNTQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlJvb3NldmVsdCBJc2xhbmQsIE1hbmhhdHRhbjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYzE0OTY2MmZmYTY0NGE4ODhkYmVlMGU3MzNiMzg5NWYuc2V0Q29udGVudChodG1sXzg2Zjc3YTM2Y2U0YjRiZjA4NTRjNDllMzNlMzZlZjU0KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzAwNTZjZDZlMjEyNzRjZGJhZjM4ODI1ODU5NzZkYWIyLmJpbmRQb3B1cChwb3B1cF9jMTQ5NjYyZmZhNjQ0YTg4OGRiZWUwZTczM2IzODk1Zik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xMjQzNTNmMmEyOWY0OTQ5YTM1ZjA2ZDA0NGJlNzMzMiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc4NzY1Nzk5ODUzNDg1NCwtNzMuOTc3MDU5MjM2MzA2MDNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzUyYzcwMjQ4YzUxNDQ5YThkZTM5N2JiMTFhZTNlZWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNjEyOTJlOTVhODIxNDgxMWJkZjhlOTBlMDhjMjA0NTAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMmY2YTQ3ODgxNmRlNDJhMDliM2VhMjdkMzU5NTY0MDUgPSAkKCc8ZGl2IGlkPSJodG1sXzJmNmE0Nzg4MTZkZTQyYTA5YjNlYTI3ZDM1OTU2NDA1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5VcHBlciBXZXN0IFNpZGUsIE1hbmhhdHRhbjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNjEyOTJlOTVhODIxNDgxMWJkZjhlOTBlMDhjMjA0NTAuc2V0Q29udGVudChodG1sXzJmNmE0Nzg4MTZkZTQyYTA5YjNlYTI3ZDM1OTU2NDA1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzEyNDM1M2YyYTI5ZjQ5NDlhMzVmMDZkMDQ0YmU3MzMyLmJpbmRQb3B1cChwb3B1cF82MTI5MmU5NWE4MjE0ODExYmRmOGU5MGUwOGMyMDQ1MCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8zOWZiMzIxNjM3NDE0MWQ1YmMwMzcwOTM5N2U5NTBiZiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc3MzUyODg4OTQyMTY2LC03My45ODUzMzc3NzAwMTI2Ml0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jNTJjNzAyNDhjNTE0NDlhOGRlMzk3YmIxMWFlM2VlYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF81NGE2YjVhNzlmY2Y0ZTA3OGZmYTlkYmRmNDg4MmYwMyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xNjc5NzU4NTIyOTU0YmUyYTAxODhlNTczZjMxZDk4OCA9ICQoJzxkaXYgaWQ9Imh0bWxfMTY3OTc1ODUyMjk1NGJlMmEwMTg4ZTU3M2YzMWQ5ODgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkxpbmNvbG4gU3F1YXJlLCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzU0YTZiNWE3OWZjZjRlMDc4ZmZhOWRiZGY0ODgyZjAzLnNldENvbnRlbnQoaHRtbF8xNjc5NzU4NTIyOTU0YmUyYTAxODhlNTczZjMxZDk4OCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8zOWZiMzIxNjM3NDE0MWQ1YmMwMzcwOTM5N2U5NTBiZi5iaW5kUG9wdXAocG9wdXBfNTRhNmI1YTc5ZmNmNGUwNzhmZmE5ZGJkZjQ4ODJmMDMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOGI3ZjQwNWI3ZDFjNGUxZmFlNTJlNjIxN2JkYTM4MDEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NTkxMDA4OTE0NjIxMiwtNzMuOTk2MTE5MzYzMDk0NzldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzUyYzcwMjQ4YzUxNDQ5YThkZTM5N2JiMTFhZTNlZWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMDU2MTYzYjgyYjA2NDE3YWI5NmE0M2FhMmJkYjhlOWEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYzAyMGQyNzUyNjU1NGI0OGEzZDdkZDZhYmVjMGU2NGMgPSAkKCc8ZGl2IGlkPSJodG1sX2MwMjBkMjc1MjY1NTRiNDhhM2Q3ZGQ2YWJlYzBlNjRjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DbGludG9uLCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzA1NjE2M2I4MmIwNjQxN2FiOTZhNDNhYTJiZGI4ZTlhLnNldENvbnRlbnQoaHRtbF9jMDIwZDI3NTI2NTU0YjQ4YTNkN2RkNmFiZWMwZTY0Yyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl84YjdmNDA1YjdkMWM0ZTFmYWU1MmU2MjE3YmRhMzgwMS5iaW5kUG9wdXAocG9wdXBfMDU2MTYzYjgyYjA2NDE3YWI5NmE0M2FhMmJkYjhlOWEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfODdkZGJiZDFiNjUwNDNjZDkzYTQ5NTUyYzUyZmM5YWIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NTQ2OTExMDI3MDYyMywtNzMuOTgxNjY4ODI3MzAzMDRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzUyYzcwMjQ4YzUxNDQ5YThkZTM5N2JiMTFhZTNlZWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfM2M4YzQ3ZDQ2MTVkNDZlZjkwOTJiNjIwM2EyODI1YjEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMWQ5NDYyZDRiYWRlNGYxNWFmNmUyNWVhZmQ2Mjc2MTkgPSAkKCc8ZGl2IGlkPSJodG1sXzFkOTQ2MmQ0YmFkZTRmMTVhZjZlMjVlYWZkNjI3NjE5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NaWR0b3duLCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzNjOGM0N2Q0NjE1ZDQ2ZWY5MDkyYjYyMDNhMjgyNWIxLnNldENvbnRlbnQoaHRtbF8xZDk0NjJkNGJhZGU0ZjE1YWY2ZTI1ZWFmZDYyNzYxOSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl84N2RkYmJkMWI2NTA0M2NkOTNhNDk1NTJjNTJmYzlhYi5iaW5kUG9wdXAocG9wdXBfM2M4YzQ3ZDQ2MTVkNDZlZjkwOTJiNjIwM2EyODI1YjEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMTFhOWFlN2FkYzM1NDZlNWE4MjdkYTJkZWYwOGJlZmYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NDgzMDMwNzcyNTIxNzQsLTczLjk3ODMzMjA3OTI0MTI3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2M1MmM3MDI0OGM1MTQ0OWE4ZGUzOTdiYjExYWUzZWVhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2RjMDg1NTA4NDk5NTRiNTk4NDM0NzQ3N2Y4ZDQ4ZjM3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzFhMTg5YmIyZGEyYTRjMzJhMDg3MmJkN2RkNzA5OTQ1ID0gJCgnPGRpdiBpZD0iaHRtbF8xYTE4OWJiMmRhMmE0YzMyYTA4NzJiZDdkZDcwOTk0NSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TXVycmF5IEhpbGwsIE1hbmhhdHRhbjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZGMwODU1MDg0OTk1NGI1OTg0MzQ3NDc3ZjhkNDhmMzcuc2V0Q29udGVudChodG1sXzFhMTg5YmIyZGEyYTRjMzJhMDg3MmJkN2RkNzA5OTQ1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzExYTlhZTdhZGMzNTQ2ZTVhODI3ZGEyZGVmMDhiZWZmLmJpbmRQb3B1cChwb3B1cF9kYzA4NTUwODQ5OTU0YjU5ODQzNDc0NzdmOGQ0OGYzNyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xNTZlODkzMDJiMWQ0N2NkOTJjMTQ1Y2E5MmY4ODdiZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc0NDAzNDcwNjc0Nzk3NSwtNzQuMDAzMTE2MzM0NzI4MTNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzUyYzcwMjQ4YzUxNDQ5YThkZTM5N2JiMTFhZTNlZWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfN2RjMDgyZTQyMDVkNDYyOWI2NjVlNmJjY2U0OWFjZGIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNTNhNzEzZWUyYjBkNGY0MGIwYWI4MmM2MTVkOTkzNzkgPSAkKCc8ZGl2IGlkPSJodG1sXzUzYTcxM2VlMmIwZDRmNDBiMGFiODJjNjE1ZDk5Mzc5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DaGVsc2VhLCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzdkYzA4MmU0MjA1ZDQ2MjliNjY1ZTZiY2NlNDlhY2RiLnNldENvbnRlbnQoaHRtbF81M2E3MTNlZTJiMGQ0ZjQwYjBhYjgyYzYxNWQ5OTM3OSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8xNTZlODkzMDJiMWQ0N2NkOTJjMTQ1Y2E5MmY4ODdiZS5iaW5kUG9wdXAocG9wdXBfN2RjMDgyZTQyMDVkNDYyOWI2NjVlNmJjY2U0OWFjZGIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNjU2ZmUzODk1ODBjNDgzODkxNWM1Yjg2NGNjOTE3MmUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MjY5MzI4ODUzNjEyOCwtNzMuOTk5OTE0MDI5NDU5MDJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzUyYzcwMjQ4YzUxNDQ5YThkZTM5N2JiMTFhZTNlZWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZWQ0ZjA2NGRiOTlhNDQzMTk2ZTExZWRkNWNlNmEyOWQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZjgxNjRmYjNhN2ZlNGQ1ZjhjYTM0YmNlOWU1M2UyZmUgPSAkKCc8ZGl2IGlkPSJodG1sX2Y4MTY0ZmIzYTdmZTRkNWY4Y2EzNGJjZTllNTNlMmZlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5HcmVlbndpY2ggVmlsbGFnZSwgTWFuaGF0dGFuPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lZDRmMDY0ZGI5OWE0NDMxOTZlMTFlZGQ1Y2U2YTI5ZC5zZXRDb250ZW50KGh0bWxfZjgxNjRmYjNhN2ZlNGQ1ZjhjYTM0YmNlOWU1M2UyZmUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNjU2ZmUzODk1ODBjNDgzODkxNWM1Yjg2NGNjOTE3MmUuYmluZFBvcHVwKHBvcHVwX2VkNGYwNjRkYjk5YTQ0MzE5NmUxMWVkZDVjZTZhMjlkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzE4NGJiMjhmOTVmNjRhNzFiZjM5NzQyOWZmMzExODkxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzI3ODQ2Nzc3MjcwMjQ0LC03My45ODIyMjYxNjUwNjQxNl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jNTJjNzAyNDhjNTE0NDlhOGRlMzk3YmIxMWFlM2VlYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9jMGVlMTNmMWQ3OTI0MTljOGY3YTFhYmZkNmE5NzUwNCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF85NTdiNDc2YTNhZjU0ZDBkYmMyZjIzYjIyMjZkNzNjNyA9ICQoJzxkaXYgaWQ9Imh0bWxfOTU3YjQ3NmEzYWY1NGQwZGJjMmYyM2IyMjI2ZDczYzciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkVhc3QgVmlsbGFnZSwgTWFuaGF0dGFuPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jMGVlMTNmMWQ3OTI0MTljOGY3YTFhYmZkNmE5NzUwNC5zZXRDb250ZW50KGh0bWxfOTU3YjQ3NmEzYWY1NGQwZGJjMmYyM2IyMjI2ZDczYzcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMTg0YmIyOGY5NWY2NGE3MWJmMzk3NDI5ZmYzMTE4OTEuYmluZFBvcHVwKHBvcHVwX2MwZWUxM2YxZDc5MjQxOWM4ZjdhMWFiZmQ2YTk3NTA0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzg2Nzk2M2U1MWQxZDRlMTFhYzJiZjVjYjJiOWMxODcxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzE3ODA2NzQ4OTI3NjUsLTczLjk4MDg5MDMxOTk5MjkxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2M1MmM3MDI0OGM1MTQ0OWE4ZGUzOTdiYjExYWUzZWVhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2I4OTJjNGUzYjNjNjRkNDg5ZmJmYzg1ZWI0ZTM2MzEwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzQ4MGZjN2M0YzIxMDQzYmVhYmU4YmRjNWY0ZjRmNmYxID0gJCgnPGRpdiBpZD0iaHRtbF80ODBmYzdjNGMyMTA0M2JlYWJlOGJkYzVmNGY0ZjZmMSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TG93ZXIgRWFzdCBTaWRlLCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2I4OTJjNGUzYjNjNjRkNDg5ZmJmYzg1ZWI0ZTM2MzEwLnNldENvbnRlbnQoaHRtbF80ODBmYzdjNGMyMTA0M2JlYWJlOGJkYzVmNGY0ZjZmMSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl84Njc5NjNlNTFkMWQ0ZTExYWMyYmY1Y2IyYjljMTg3MS5iaW5kUG9wdXAocG9wdXBfYjg5MmM0ZTNiM2M2NGQ0ODlmYmZjODVlYjRlMzYzMTApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNDNkMDg2ODQxZWQwNGMwY2JiZjc5MTQ5ZjI0MzI4ZGIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MjE1MjE5Njc0NDMyMTYsLTc0LjAxMDY4MzI4NTU5MDg3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2M1MmM3MDI0OGM1MTQ0OWE4ZGUzOTdiYjExYWUzZWVhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzliZDJmM2ZmMmY4MTQ3NTNiOGQ2MDA0YTk1MGIzMGRjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzI3MjYzYjhjMjIxNzRjODdhZjY2ZWNjNWFkNWNmMWUzID0gJCgnPGRpdiBpZD0iaHRtbF8yNzI2M2I4YzIyMTc0Yzg3YWY2NmVjYzVhZDVjZjFlMyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+VHJpYmVjYSwgTWFuaGF0dGFuPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85YmQyZjNmZjJmODE0NzUzYjhkNjAwNGE5NTBiMzBkYy5zZXRDb250ZW50KGh0bWxfMjcyNjNiOGMyMjE3NGM4N2FmNjZlY2M1YWQ1Y2YxZTMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNDNkMDg2ODQxZWQwNGMwY2JiZjc5MTQ5ZjI0MzI4ZGIuYmluZFBvcHVwKHBvcHVwXzliZDJmM2ZmMmY4MTQ3NTNiOGQ2MDA0YTk1MGIzMGRjKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzI0ZTZkYjdkNjc4ZDQyYjI4N2Y0MDNiNWZhMTJiOGU4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzE5MzIzNzkzOTU5MDcsLTczLjk5NzMwNDY3MjA4MDczXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2M1MmM3MDI0OGM1MTQ0OWE4ZGUzOTdiYjExYWUzZWVhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzAyYjAyZWRlMmJiYTRjMzBhMTA2Mjk4ZmUxZjUxZmZjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2UwYTg4MjVmYjhiNjQ3ODRiMjE2YmE2YjlmMTkxN2I4ID0gJCgnPGRpdiBpZD0iaHRtbF9lMGE4ODI1ZmI4YjY0Nzg0YjIxNmJhNmI5ZjE5MTdiOCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TGl0dGxlIEl0YWx5LCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzAyYjAyZWRlMmJiYTRjMzBhMTA2Mjk4ZmUxZjUxZmZjLnNldENvbnRlbnQoaHRtbF9lMGE4ODI1ZmI4YjY0Nzg0YjIxNmJhNmI5ZjE5MTdiOCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8yNGU2ZGI3ZDY3OGQ0MmIyODdmNDAzYjVmYTEyYjhlOC5iaW5kUG9wdXAocG9wdXBfMDJiMDJlZGUyYmJhNGMzMGExMDYyOThmZTFmNTFmZmMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZmFmNTI1ZDA3NmRiNDc4Njk5Y2U2MmM4ZWJhNGI4NGUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MjIxODM4NDEzMTc5NCwtNzQuMDAwNjU2NjY5NTk3NTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzUyYzcwMjQ4YzUxNDQ5YThkZTM5N2JiMTFhZTNlZWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNDRiNTgzMzVjNjVkNDI4MWE2Yjk3N2FhMjIwNjYyM2QgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMWViZWU2NmQ5YTUwNGIyNTk2OTc2Y2M0MDgwOGNmNGYgPSAkKCc8ZGl2IGlkPSJodG1sXzFlYmVlNjZkOWE1MDRiMjU5Njk3NmNjNDA4MDhjZjRmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Tb2hvLCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzQ0YjU4MzM1YzY1ZDQyODFhNmI5NzdhYTIyMDY2MjNkLnNldENvbnRlbnQoaHRtbF8xZWJlZTY2ZDlhNTA0YjI1OTY5NzZjYzQwODA4Y2Y0Zik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9mYWY1MjVkMDc2ZGI0Nzg2OTljZTYyYzhlYmE0Yjg0ZS5iaW5kUG9wdXAocG9wdXBfNDRiNTgzMzVjNjVkNDI4MWE2Yjk3N2FhMjIwNjYyM2QpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNTc2MjZlYTQ5M2Y5NDk3ZGEyZDQ0OGI2YmYxNjY0NzMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MzQ0MzM5MzU3MjQzNCwtNzQuMDA2MTc5OTgxMjY4MTJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzUyYzcwMjQ4YzUxNDQ5YThkZTM5N2JiMTFhZTNlZWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZjdhYjU0N2E1YTA2NDUzMWEyMWUyZjU2YzY2MTQ0MzIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMWI0YTJiY2YzNzY2NDFhYzllNWEyNzdmMTVhY2VkNDUgPSAkKCc8ZGl2IGlkPSJodG1sXzFiNGEyYmNmMzc2NjQxYWM5ZTVhMjc3ZjE1YWNlZDQ1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5XZXN0IFZpbGxhZ2UsIE1hbmhhdHRhbjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZjdhYjU0N2E1YTA2NDUzMWEyMWUyZjU2YzY2MTQ0MzIuc2V0Q29udGVudChodG1sXzFiNGEyYmNmMzc2NjQxYWM5ZTVhMjc3ZjE1YWNlZDQ1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzU3NjI2ZWE0OTNmOTQ5N2RhMmQ0NDhiNmJmMTY2NDczLmJpbmRQb3B1cChwb3B1cF9mN2FiNTQ3YTVhMDY0NTMxYTIxZTJmNTZjNjYxNDQzMik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9iNjdiYWRkNTlkOWE0ZDk5YjlkODdjMmE0YmM2OTIyOCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc5NzMwNzA0MTcwMjg2NSwtNzMuOTY0Mjg2MTc3NDA2NTVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzUyYzcwMjQ4YzUxNDQ5YThkZTM5N2JiMTFhZTNlZWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZDAwODI5NTBkMjQ1NDU2MDliNzc1ZTRhY2FmNDkyZDggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNDZiM2FhMzc3Njk0NDBlYzg3Y2E0NzlmNTBiMzAxMzcgPSAkKCc8ZGl2IGlkPSJodG1sXzQ2YjNhYTM3NzY5NDQwZWM4N2NhNDc5ZjUwYjMwMTM3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NYW5oYXR0YW4gVmFsbGV5LCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2QwMDgyOTUwZDI0NTQ1NjA5Yjc3NWU0YWNhZjQ5MmQ4LnNldENvbnRlbnQoaHRtbF80NmIzYWEzNzc2OTQ0MGVjODdjYTQ3OWY1MGIzMDEzNyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9iNjdiYWRkNTlkOWE0ZDk5YjlkODdjMmE0YmM2OTIyOC5iaW5kUG9wdXAocG9wdXBfZDAwODI5NTBkMjQ1NDU2MDliNzc1ZTRhY2FmNDkyZDgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNDFhY2Y4NGYwNTgzNGQyOTkxNWQxOTlmYjk2YTU4MmUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44MDc5OTk3MzgxNjU4MjYsLTczLjk2Mzg5NjI3OTA1MzMyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2M1MmM3MDI0OGM1MTQ0OWE4ZGUzOTdiYjExYWUzZWVhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2VlN2MzODQ0OGYzYzQ5MWFiNzI0MzZmMTYwZTljOTJlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzE0ZjAxZGJjYzFmMTRiNjU4MjM3ZjI1ODBhYWFkZWRmID0gJCgnPGRpdiBpZD0iaHRtbF8xNGYwMWRiY2MxZjE0YjY1ODIzN2YyNTgwYWFhZGVkZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TW9ybmluZ3NpZGUgSGVpZ2h0cywgTWFuaGF0dGFuPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lZTdjMzg0NDhmM2M0OTFhYjcyNDM2ZjE2MGU5YzkyZS5zZXRDb250ZW50KGh0bWxfMTRmMDFkYmNjMWYxNGI2NTgyMzdmMjU4MGFhYWRlZGYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNDFhY2Y4NGYwNTgzNGQyOTkxNWQxOTlmYjk2YTU4MmUuYmluZFBvcHVwKHBvcHVwX2VlN2MzODQ0OGYzYzQ5MWFiNzI0MzZmMTYwZTljOTJlKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzVhODM1ZTFmYWU4OTQzMjdhNzk1Nzc0NzVmOTFiNmUxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzM3MjA5ODMyNzE1LC03My45ODEzNzU5NDgzMzU0MV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jNTJjNzAyNDhjNTE0NDlhOGRlMzk3YmIxMWFlM2VlYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF80ZTlkYjZjMzEwMWQ0YmIzODQyN2FjNTQzODRlNjNlNiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xOGMzOTJiNmIzZDk0NjRlODVlY2M2YzI2MjJiYzgxMiA9ICQoJzxkaXYgaWQ9Imh0bWxfMThjMzkyYjZiM2Q5NDY0ZTg1ZWNjNmMyNjIyYmM4MTIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkdyYW1lcmN5LCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzRlOWRiNmMzMTAxZDRiYjM4NDI3YWM1NDM4NGU2M2U2LnNldENvbnRlbnQoaHRtbF8xOGMzOTJiNmIzZDk0NjRlODVlY2M2YzI2MjJiYzgxMik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81YTgzNWUxZmFlODk0MzI3YTc5NTc3NDc1ZjkxYjZlMS5iaW5kUG9wdXAocG9wdXBfNGU5ZGI2YzMxMDFkNGJiMzg0MjdhYzU0Mzg0ZTYzZTYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNjE5YmE1MmM1ZmVlNDM1OTg0OTk5MTUwNjI3MmZhN2MgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MTE5MzE5ODM5NDU2NSwtNzQuMDE2ODY5MzA1MDg2MTddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzUyYzcwMjQ4YzUxNDQ5YThkZTM5N2JiMTFhZTNlZWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMzdmMjYyOThiMzE1NDA5Nzg0ZWY5MDIwZmMyYzVjZmIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYTAxODgyN2I2NmNhNGFmMWFlMDRlOTgzMDY1NWE5OTEgPSAkKCc8ZGl2IGlkPSJodG1sX2EwMTg4MjdiNjZjYTRhZjFhZTA0ZTk4MzA2NTVhOTkxIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5CYXR0ZXJ5IFBhcmsgQ2l0eSwgTWFuaGF0dGFuPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zN2YyNjI5OGIzMTU0MDk3ODRlZjkwMjBmYzJjNWNmYi5zZXRDb250ZW50KGh0bWxfYTAxODgyN2I2NmNhNGFmMWFlMDRlOTgzMDY1NWE5OTEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNjE5YmE1MmM1ZmVlNDM1OTg0OTk5MTUwNjI3MmZhN2MuYmluZFBvcHVwKHBvcHVwXzM3ZjI2Mjk4YjMxNTQwOTc4NGVmOTAyMGZjMmM1Y2ZiKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzc3ZjRiYTQxZDk2OTQ4MDA5ZWE1ODY5OTU5NzI1NTA2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzA3MTA3MTA3MjcwNDgsLTc0LjAxMDY2NTQ0NTIxMjddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzUyYzcwMjQ4YzUxNDQ5YThkZTM5N2JiMTFhZTNlZWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZjAwOGMzMDdiYWQ0NDQwMmI3ZTM4NTQ1NWM2MDQwYTkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNzM4ZjQxYjVlZTlhNDFmYTk4ZDMzZDVlMzMzZWM3MTQgPSAkKCc8ZGl2IGlkPSJodG1sXzczOGY0MWI1ZWU5YTQxZmE5OGQzM2Q1ZTMzM2VjNzE0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5GaW5hbmNpYWwgRGlzdHJpY3QsIE1hbmhhdHRhbjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZjAwOGMzMDdiYWQ0NDQwMmI3ZTM4NTQ1NWM2MDQwYTkuc2V0Q29udGVudChodG1sXzczOGY0MWI1ZWU5YTQxZmE5OGQzM2Q1ZTMzM2VjNzE0KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzc3ZjRiYTQxZDk2OTQ4MDA5ZWE1ODY5OTU5NzI1NTA2LmJpbmRQb3B1cChwb3B1cF9mMDA4YzMwN2JhZDQ0NDAyYjdlMzg1NDU1YzYwNDBhOSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9kOTIxYTI3NDdhMDI0NWNlOWI1ZjM3Y2M3OGJmYjExNyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc2ODUwODU5MzM1NDkyLC03My45MTU2NTM3NDMwNDIzNF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jNTJjNzAyNDhjNTE0NDlhOGRlMzk3YmIxMWFlM2VlYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85YzNjNTM3MTk3ZDA0NjE2YTE1ZTI4ZDAwZWNkN2YwYSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iMDM2ZDIzYmE3YWU0Y2NhOGNiZDY2MGQ3Y2I4NGNlZSA9ICQoJzxkaXYgaWQ9Imh0bWxfYjAzNmQyM2JhN2FlNGNjYThjYmQ2NjBkN2NiODRjZWUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkFzdG9yaWEsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOWMzYzUzNzE5N2QwNDYxNmExNWUyOGQwMGVjZDdmMGEuc2V0Q29udGVudChodG1sX2IwMzZkMjNiYTdhZTRjY2E4Y2JkNjYwZDdjYjg0Y2VlKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2Q5MjFhMjc0N2EwMjQ1Y2U5YjVmMzdjYzc4YmZiMTE3LmJpbmRQb3B1cChwb3B1cF85YzNjNTM3MTk3ZDA0NjE2YTE1ZTI4ZDAwZWNkN2YwYSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85ZjcyNWNkMGJkNTg0OTc5YTM4ZGRmOTY4ODI5MTUyYyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc0NjM0OTA4ODYwMjIyLC03My45MDE4NDE2NjgzODI4NF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jNTJjNzAyNDhjNTE0NDlhOGRlMzk3YmIxMWFlM2VlYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xZjFkZDkzMTJjNDE0ZTM0YTUzYWY5NzEwNGE5Y2U4MiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wMTRlNGM0MmI5MTA0NjFmYTEzNGRmNWE2YzNhMWM4NiA9ICQoJzxkaXYgaWQ9Imh0bWxfMDE0ZTRjNDJiOTEwNDYxZmExMzRkZjVhNmMzYTFjODYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPldvb2RzaWRlLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzFmMWRkOTMxMmM0MTRlMzRhNTNhZjk3MTA0YTljZTgyLnNldENvbnRlbnQoaHRtbF8wMTRlNGM0MmI5MTA0NjFmYTEzNGRmNWE2YzNhMWM4Nik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl85ZjcyNWNkMGJkNTg0OTc5YTM4ZGRmOTY4ODI5MTUyYy5iaW5kUG9wdXAocG9wdXBfMWYxZGQ5MzEyYzQxNGUzNGE1M2FmOTcxMDRhOWNlODIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYjI5NGM5MzcxYzcwNGJiZjllYmE3MDQ0M2VmNDA3YmYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NTE5ODEzODAwNzM2NywtNzMuODgyODIxMDkxNjQzNjVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzUyYzcwMjQ4YzUxNDQ5YThkZTM5N2JiMTFhZTNlZWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYTk1NDZkOTVmMTI4NGQ3OThiZDI4MGYyNGVjYjE4ZWEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMGU4NjhhMmU5N2MyNDg1MDk4ZGE0MDBkMmE4NTg0NTAgPSAkKCc8ZGl2IGlkPSJodG1sXzBlODY4YTJlOTdjMjQ4NTA5OGRhNDAwZDJhODU4NDUwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5KYWNrc29uIEhlaWdodHMsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYTk1NDZkOTVmMTI4NGQ3OThiZDI4MGYyNGVjYjE4ZWEuc2V0Q29udGVudChodG1sXzBlODY4YTJlOTdjMjQ4NTA5OGRhNDAwZDJhODU4NDUwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2IyOTRjOTM3MWM3MDRiYmY5ZWJhNzA0NDNlZjQwN2JmLmJpbmRQb3B1cChwb3B1cF9hOTU0NmQ5NWYxMjg0ZDc5OGJkMjgwZjI0ZWNiMThlYSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9iOGVlNDBmZmI2YmE0ZjcxYjMxYmE3M2MyMDViZTA0NiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc0NDA0ODUwNTEyMjAyNCwtNzMuODgxNjU2MjIyODgzODhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzUyYzcwMjQ4YzUxNDQ5YThkZTM5N2JiMTFhZTNlZWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfN2UxM2Q3N2ZiMDRjNDUyNDg0ZDBmMmM1MmI3M2FkYWMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYTNhMjk1NTk1ODJhNDQzYmEzMGQxNjBkOWI1OTgyM2YgPSAkKCc8ZGl2IGlkPSJodG1sX2EzYTI5NTU5NTgyYTQ0M2JhMzBkMTYwZDliNTk4MjNmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5FbG1odXJzdCwgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83ZTEzZDc3ZmIwNGM0NTI0ODRkMGYyYzUyYjczYWRhYy5zZXRDb250ZW50KGh0bWxfYTNhMjk1NTk1ODJhNDQzYmEzMGQxNjBkOWI1OTgyM2YpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYjhlZTQwZmZiNmJhNGY3MWIzMWJhNzNjMjA1YmUwNDYuYmluZFBvcHVwKHBvcHVwXzdlMTNkNzdmYjA0YzQ1MjQ4NGQwZjJjNTJiNzNhZGFjKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzg3NmFhNWMzODc3NjRhY2Y4MjdmZmI3MmZkNjM1MjBmID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjU0MjI1Mjc3Mzg0ODcsLTczLjgzODEzNzY0NjAwMjhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzUyYzcwMjQ4YzUxNDQ5YThkZTM5N2JiMTFhZTNlZWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOTQyYTYwODhhNTJkNDBmZDljMDU2NjBkMGQ1NGFmYzggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZGQ1MjQ4MmUwOWI5NGQxOGFiNDM0MWMwNTcxM2VhNzYgPSAkKCc8ZGl2IGlkPSJodG1sX2RkNTI0ODJlMDliOTRkMThhYjQzNDFjMDU3MTNlYTc2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Ib3dhcmQgQmVhY2gsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOTQyYTYwODhhNTJkNDBmZDljMDU2NjBkMGQ1NGFmYzguc2V0Q29udGVudChodG1sX2RkNTI0ODJlMDliOTRkMThhYjQzNDFjMDU3MTNlYTc2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzg3NmFhNWMzODc3NjRhY2Y4MjdmZmI3MmZkNjM1MjBmLmJpbmRQb3B1cChwb3B1cF85NDJhNjA4OGE1MmQ0MGZkOWMwNTY2MGQwZDU0YWZjOCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mOWZkOWZjZmY2NmU0OTUzOTI0ZWQ0MTRjMzg5NjM1MSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc0MjM4MTc1MDE1NjY3LC03My44NTY4MjQ5NzM0NTI1OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jNTJjNzAyNDhjNTE0NDlhOGRlMzk3YmIxMWFlM2VlYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF80MWU1NmUyZGY5YTc0MDQ5OTkzNmY3MjMwOGVlNmMyZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jNDA1NWM3MGM1NjQ0ODc5ODg5MGU3Y2FiOTNjMGMyNiA9ICQoJzxkaXYgaWQ9Imh0bWxfYzQwNTVjNzBjNTY0NDg3OTg4OTBlN2NhYjkzYzBjMjYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNvcm9uYSwgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80MWU1NmUyZGY5YTc0MDQ5OTkzNmY3MjMwOGVlNmMyZC5zZXRDb250ZW50KGh0bWxfYzQwNTVjNzBjNTY0NDg3OTg4OTBlN2NhYjkzYzBjMjYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZjlmZDlmY2ZmNjZlNDk1MzkyNGVkNDE0YzM4OTYzNTEuYmluZFBvcHVwKHBvcHVwXzQxZTU2ZTJkZjlhNzQwNDk5OTM2ZjcyMzA4ZWU2YzJkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzk0MzExYTBhNTBlMzRkOGZhODMwZGMzNDNhMWRiYzZlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzI1MjYzNzgyMTY1MDMsLTczLjg0NDQ3NTAwNzg4OTgzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2M1MmM3MDI0OGM1MTQ0OWE4ZGUzOTdiYjExYWUzZWVhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzQzNGJlNTUwYzFhODQzNWM5NDgwZmIzZDRkOTAzNWFiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2M4YmMwNWU3NDg4MjQzNzA5M2JjZmViYWRkOTUxZDlmID0gJCgnPGRpdiBpZD0iaHRtbF9jOGJjMDVlNzQ4ODI0MzcwOTNiY2ZlYmFkZDk1MWQ5ZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Rm9yZXN0IEhpbGxzLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzQzNGJlNTUwYzFhODQzNWM5NDgwZmIzZDRkOTAzNWFiLnNldENvbnRlbnQoaHRtbF9jOGJjMDVlNzQ4ODI0MzcwOTNiY2ZlYmFkZDk1MWQ5Zik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl85NDMxMWEwYTUwZTM0ZDhmYTgzMGRjMzQzYTFkYmM2ZS5iaW5kUG9wdXAocG9wdXBfNDM0YmU1NTBjMWE4NDM1Yzk0ODBmYjNkNGQ5MDM1YWIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfODk3YTA4ODNlMWI2NGI4MDk4Mzg4NjY2MTFiNWM2ZGEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MDUxNzkwMzU0MTQ4LC03My44Mjk4MTkwNTgyNTcwM10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jNTJjNzAyNDhjNTE0NDlhOGRlMzk3YmIxMWFlM2VlYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wOTA5ZDM0ZDc3ODk0ZTIwOTg3YzdiNTBkZjk2NmEwYiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hYmQ1ZWE2MjJjYjg0Zjc1OTYwNDA3OTgxMGRjMDg4MSA9ICQoJzxkaXYgaWQ9Imh0bWxfYWJkNWVhNjIyY2I4NGY3NTk2MDQwNzk4MTBkYzA4ODEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPktldyBHYXJkZW5zLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzA5MDlkMzRkNzc4OTRlMjA5ODdjN2I1MGRmOTY2YTBiLnNldENvbnRlbnQoaHRtbF9hYmQ1ZWE2MjJjYjg0Zjc1OTYwNDA3OTgxMGRjMDg4MSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl84OTdhMDg4M2UxYjY0YjgwOTgzODg2NjYxMWI1YzZkYS5iaW5kUG9wdXAocG9wdXBfMDkwOWQzNGQ3Nzg5NGUyMDk4N2M3YjUwZGY5NjZhMGIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYzZjMzk3NTY1MWVlNGRhZmFkMTEyMGQ2YzdkMTkwNmQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42OTc5NDczMTQ3MTc2MywtNzMuODMxODMzMjE0NDY4ODddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzUyYzcwMjQ4YzUxNDQ5YThkZTM5N2JiMTFhZTNlZWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNjZlMTI4MjQ4NmNmNGNlZGExNDM2MDZmZTA4MWIyOGUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMjAwNjk3Y2M4MTk2NDBjODlkMzllZWRlMmEyNTVjYWQgPSAkKCc8ZGl2IGlkPSJodG1sXzIwMDY5N2NjODE5NjQwYzg5ZDM5ZWVkZTJhMjU1Y2FkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5SaWNobW9uZCBIaWxsLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzY2ZTEyODI0ODZjZjRjZWRhMTQzNjA2ZmUwODFiMjhlLnNldENvbnRlbnQoaHRtbF8yMDA2OTdjYzgxOTY0MGM4OWQzOWVlZGUyYTI1NWNhZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9jNmMzOTc1NjUxZWU0ZGFmYWQxMTIwZDZjN2QxOTA2ZC5iaW5kUG9wdXAocG9wdXBfNjZlMTI4MjQ4NmNmNGNlZGExNDM2MDZmZTA4MWIyOGUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOWNlNjczNGVkMTg1NDQ0OTk0ZmE3MTQ0NWY4NDA5MjMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NjQ0NTQxOTY5Nzg0NiwtNzMuODMxNzczMDAzMjk1ODJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzUyYzcwMjQ4YzUxNDQ5YThkZTM5N2JiMTFhZTNlZWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMGY5OWRiMjdiNmVjNGQxYmIxYzQ4MDk5YTEwOTkwZDYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOGYzNjhhNWJjMjc4NGVkNjk1ZDRiNjRkYzA5NjUwZTggPSAkKCc8ZGl2IGlkPSJodG1sXzhmMzY4YTViYzI3ODRlZDY5NWQ0YjY0ZGMwOTY1MGU4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5GbHVzaGluZywgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wZjk5ZGIyN2I2ZWM0ZDFiYjFjNDgwOTlhMTA5OTBkNi5zZXRDb250ZW50KGh0bWxfOGYzNjhhNWJjMjc4NGVkNjk1ZDRiNjRkYzA5NjUwZTgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOWNlNjczNGVkMTg1NDQ0OTk0ZmE3MTQ0NWY4NDA5MjMuYmluZFBvcHVwKHBvcHVwXzBmOTlkYjI3YjZlYzRkMWJiMWM0ODA5OWExMDk5MGQ2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2RiZGIxOWNkMGU3MjQ0OTE4ZWIwMDQzNDYxNzUyMTliID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzUwMjE3MzQ2MTA1MjgsLTczLjkzOTIwMjIzOTE1NTA1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2M1MmM3MDI0OGM1MTQ0OWE4ZGUzOTdiYjExYWUzZWVhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2JjMmQyMWY2MDA4MzQyNjU5ZDc3MTQxN2QxM2NiZDY5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2NiYzAyNTU4YzFiZjQ3M2ViZGVjNmIyOTcxNmJiNjNjID0gJCgnPGRpdiBpZD0iaHRtbF9jYmMwMjU1OGMxYmY0NzNlYmRlYzZiMjk3MTZiYjYzYyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TG9uZyBJc2xhbmQgQ2l0eSwgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iYzJkMjFmNjAwODM0MjY1OWQ3NzE0MTdkMTNjYmQ2OS5zZXRDb250ZW50KGh0bWxfY2JjMDI1NThjMWJmNDczZWJkZWM2YjI5NzE2YmI2M2MpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZGJkYjE5Y2QwZTcyNDQ5MThlYjAwNDM0NjE3NTIxOWIuYmluZFBvcHVwKHBvcHVwX2JjMmQyMWY2MDA4MzQyNjU5ZDc3MTQxN2QxM2NiZDY5KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzM5YzkyNWM0MGM5OTQxOWFiMGY5ZWYzYjgyYjBhM2U3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzQwMTc2MjgzNTE5MjQsLTczLjkyNjkxNjE3NTYxNTc3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2M1MmM3MDI0OGM1MTQ0OWE4ZGUzOTdiYjExYWUzZWVhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzE5YWQzYzU0OGMxMDQ5YzFhNzI2M2MzZWIyY2ZjZDBiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzAyYmQ2ZGQ5Y2VkZDRmYTA5YTMxMjIyZmUyNWI1OTEzID0gJCgnPGRpdiBpZD0iaHRtbF8wMmJkNmRkOWNlZGQ0ZmEwOWEzMTIyMmZlMjViNTkxMyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U3VubnlzaWRlLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzE5YWQzYzU0OGMxMDQ5YzFhNzI2M2MzZWIyY2ZjZDBiLnNldENvbnRlbnQoaHRtbF8wMmJkNmRkOWNlZGQ0ZmEwOWEzMTIyMmZlMjViNTkxMyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8zOWM5MjVjNDBjOTk0MTlhYjBmOWVmM2I4MmIwYTNlNy5iaW5kUG9wdXAocG9wdXBfMTlhZDNjNTQ4YzEwNDljMWE3MjYzYzNlYjJjZmNkMGIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYzExMmI4N2QxYmVkNDEyYmEwZjQyZTBjY2Y2ODZiMTggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NjQwNzMyMzg4MzA5MSwtNzMuODY3MDQxNDc2NTg3NzJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzUyYzcwMjQ4YzUxNDQ5YThkZTM5N2JiMTFhZTNlZWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMzZjYjAwMmVkNDRmNDBkMThlYjM4NWJlZDJmNTBjMzcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMmUxNjYzMjcxY2ZjNGNlZTk2YzRlNzI4M2I2MTc2ZTcgPSAkKCc8ZGl2IGlkPSJodG1sXzJlMTY2MzI3MWNmYzRjZWU5NmM0ZTcyODNiNjE3NmU3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5FYXN0IEVsbWh1cnN0LCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzM2Y2IwMDJlZDQ0ZjQwZDE4ZWIzODViZWQyZjUwYzM3LnNldENvbnRlbnQoaHRtbF8yZTE2NjMyNzFjZmM0Y2VlOTZjNGU3MjgzYjYxNzZlNyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9jMTEyYjg3ZDFiZWQ0MTJiYTBmNDJlMGNjZjY4NmIxOC5iaW5kUG9wdXAocG9wdXBfMzZjYjAwMmVkNDRmNDBkMThlYjM4NWJlZDJmNTBjMzcpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYTU5NmEwMGZmNDRhNDY0ZTgzMjhlYzQ4MjZmODBhZDUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MjU0MjczNzQwOTM2MDYsLTczLjg5NjIxNzEzNjI2ODU5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2M1MmM3MDI0OGM1MTQ0OWE4ZGUzOTdiYjExYWUzZWVhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzJlYmI1NDY2ODBiYTQ1MzU5MGYxNzkyYWY5ZTFiZGQ5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2EzM2MwZGNiZTdlZDQwZTliZGE1NDYyOTM2ZmQ5YjlkID0gJCgnPGRpdiBpZD0iaHRtbF9hMzNjMGRjYmU3ZWQ0MGU5YmRhNTQ2MjkzNmZkOWI5ZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TWFzcGV0aCwgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yZWJiNTQ2NjgwYmE0NTM1OTBmMTc5MmFmOWUxYmRkOS5zZXRDb250ZW50KGh0bWxfYTMzYzBkY2JlN2VkNDBlOWJkYTU0NjI5MzZmZDliOWQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYTU5NmEwMGZmNDRhNDY0ZTgzMjhlYzQ4MjZmODBhZDUuYmluZFBvcHVwKHBvcHVwXzJlYmI1NDY2ODBiYTQ1MzU5MGYxNzkyYWY5ZTFiZGQ5KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2JmYzI2OTc3MTczNTQzMjY4ODY2YTI0OWUxZDgwYzA3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzA4MzIzMTU2MTM4NTgsLTczLjkwMTQzNTE3NTU5NTg5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2M1MmM3MDI0OGM1MTQ0OWE4ZGUzOTdiYjExYWUzZWVhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzAxMThiNThiNmFjZDRmN2RhMjFiYWI4MDhkNjJlNjcwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzUwZDY0MTkxYzE4ODQxYjFhZmEzNjMxZjkzNmRlMjliID0gJCgnPGRpdiBpZD0iaHRtbF81MGQ2NDE5MWMxODg0MWIxYWZhMzYzMWY5MzZkZTI5YiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UmlkZ2V3b29kLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzAxMThiNThiNmFjZDRmN2RhMjFiYWI4MDhkNjJlNjcwLnNldENvbnRlbnQoaHRtbF81MGQ2NDE5MWMxODg0MWIxYWZhMzYzMWY5MzZkZTI5Yik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9iZmMyNjk3NzE3MzU0MzI2ODg2NmEyNDllMWQ4MGMwNy5iaW5kUG9wdXAocG9wdXBfMDExOGI1OGI2YWNkNGY3ZGEyMWJhYjgwOGQ2MmU2NzApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYjExYzU0YmY4MDM1NDA0NzhhZTc2OWUyOTRiNWRkMDcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MDI3NjI0Mjk2NzgzOCwtNzMuODcwNzQxNjc0MzU2MDVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzUyYzcwMjQ4YzUxNDQ5YThkZTM5N2JiMTFhZTNlZWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMzJhZDQ4M2MwMDM3NDY1NTkyNDEyMzcyMmM0ZmE3YmYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMTA2NGVmM2U2NTFlNGY0MDk0OTY3ZWQ1YWI4NzIxNjMgPSAkKCc8ZGl2IGlkPSJodG1sXzEwNjRlZjNlNjUxZTRmNDA5NDk2N2VkNWFiODcyMTYzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5HbGVuZGFsZSwgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zMmFkNDgzYzAwMzc0NjU1OTI0MTIzNzIyYzRmYTdiZi5zZXRDb250ZW50KGh0bWxfMTA2NGVmM2U2NTFlNGY0MDk0OTY3ZWQ1YWI4NzIxNjMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYjExYzU0YmY4MDM1NDA0NzhhZTc2OWUyOTRiNWRkMDcuYmluZFBvcHVwKHBvcHVwXzMyYWQ0ODNjMDAzNzQ2NTU5MjQxMjM3MjJjNGZhN2JmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2U0OWM3NzAwZWZiNzRhZDdhNGNhN2U5OTUzOGRlNWE1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzI4OTc0MDk0ODA3MzUsLTczLjg1NzgyNjg2OTA1MzddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzUyYzcwMjQ4YzUxNDQ5YThkZTM5N2JiMTFhZTNlZWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYmY3NmU2NGJlYWIyNDA1ZDgyZDQ4NDY0ODcyMTU2MWQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOTY4M2MwMDAwOTcwNDAyZmI4NGQ5MDVhZjY0OGZhMTYgPSAkKCc8ZGl2IGlkPSJodG1sXzk2ODNjMDAwMDk3MDQwMmZiODRkOTA1YWY2NDhmYTE2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5SZWdvIFBhcmssIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYmY3NmU2NGJlYWIyNDA1ZDgyZDQ4NDY0ODcyMTU2MWQuc2V0Q29udGVudChodG1sXzk2ODNjMDAwMDk3MDQwMmZiODRkOTA1YWY2NDhmYTE2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2U0OWM3NzAwZWZiNzRhZDdhNGNhN2U5OTUzOGRlNWE1LmJpbmRQb3B1cChwb3B1cF9iZjc2ZTY0YmVhYjI0MDVkODJkNDg0NjQ4NzIxNTYxZCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85ZDAwMDNkNWFlNDU0MDJhYTRlYmMxOTgzZGU2MTQxYSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY4OTg4Njg3OTE1Nzg5LC03My44NTgxMTA0NjU1NDMyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2M1MmM3MDI0OGM1MTQ0OWE4ZGUzOTdiYjExYWUzZWVhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzkwNWY0Zjk2NTVjNjQ4M2M5NWYzZDExMzI3YjdiMTFjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzIxZTRjMmY5MTQ5MzRhZmRhMDI4ZWRkMDdjYmNiOThlID0gJCgnPGRpdiBpZD0iaHRtbF8yMWU0YzJmOTE0OTM0YWZkYTAyOGVkZDA3Y2JjYjk4ZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+V29vZGhhdmVuLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzkwNWY0Zjk2NTVjNjQ4M2M5NWYzZDExMzI3YjdiMTFjLnNldENvbnRlbnQoaHRtbF8yMWU0YzJmOTE0OTM0YWZkYTAyOGVkZDA3Y2JjYjk4ZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl85ZDAwMDNkNWFlNDU0MDJhYTRlYmMxOTgzZGU2MTQxYS5iaW5kUG9wdXAocG9wdXBfOTA1ZjRmOTY1NWM2NDgzYzk1ZjNkMTEzMjdiN2IxMWMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMDZiYzEwZDZmYjc4NDNmMmI3Zjg5YzE0NDFkMTg5MzkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42ODA3MDg0NjgyNjU0MTUsLTczLjg0MzIwMjY2MTczNDQ3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2M1MmM3MDI0OGM1MTQ0OWE4ZGUzOTdiYjExYWUzZWVhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2MzMWU5MTVkNTk2YjQxNDViM2M2NDVmY2NjMzc0Njc1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzg4ZGQxZTFmNDhjYzQ3YTFhNWQ0NGJhOGVkNTJmYWU4ID0gJCgnPGRpdiBpZD0iaHRtbF84OGRkMWUxZjQ4Y2M0N2ExYTVkNDRiYThlZDUyZmFlOCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+T3pvbmUgUGFyaywgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jMzFlOTE1ZDU5NmI0MTQ1YjNjNjQ1ZmNjYzM3NDY3NS5zZXRDb250ZW50KGh0bWxfODhkZDFlMWY0OGNjNDdhMWE1ZDQ0YmE4ZWQ1MmZhZTgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMDZiYzEwZDZmYjc4NDNmMmI3Zjg5YzE0NDFkMTg5MzkuYmluZFBvcHVwKHBvcHVwX2MzMWU5MTVkNTk2YjQxNDViM2M2NDVmY2NjMzc0Njc1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzMxMGRlNWYwOTZhNTQ5ZGFhM2JjN2Y1YmVmN2Q5OWZhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjY4NTQ5NTc3NjcxOTUsLTczLjgwOTg2NDc4NjQ5MDQxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2M1MmM3MDI0OGM1MTQ0OWE4ZGUzOTdiYjExYWUzZWVhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2Q5Nzg2MDAyMGYzYjQyZDZhNzA4NDdhMjQ4Y2Q2NDgzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzVkOTNkM2MyYWIzOTQ5YTZiNzVlYjM5MTIzN2I4Y2M1ID0gJCgnPGRpdiBpZD0iaHRtbF81ZDkzZDNjMmFiMzk0OWE2Yjc1ZWIzOTEyMzdiOGNjNSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U291dGggT3pvbmUgUGFyaywgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kOTc4NjAwMjBmM2I0MmQ2YTcwODQ3YTI0OGNkNjQ4My5zZXRDb250ZW50KGh0bWxfNWQ5M2QzYzJhYjM5NDlhNmI3NWViMzkxMjM3YjhjYzUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMzEwZGU1ZjA5NmE1NDlkYWEzYmM3ZjViZWY3ZDk5ZmEuYmluZFBvcHVwKHBvcHVwX2Q5Nzg2MDAyMGYzYjQyZDZhNzA4NDdhMjQ4Y2Q2NDgzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2MzYzMzYjhjODVkNzQwZDJiMDMyZDhlMTI0NDE0NDIxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzg0OTAyNzQ5MjYwMjA1LC03My44NDMwNDUyODg5NjEyNV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jNTJjNzAyNDhjNTE0NDlhOGRlMzk3YmIxMWFlM2VlYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xNjIzMmVkYTA1MDg0NjJmOTg1YjgyNDAzZjA0ODE0ZSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF80YmE4MTA5ZDBkZDQ0ZjQ5YmU4ZjAyM2U3ZDFjNzllNSA9ICQoJzxkaXYgaWQ9Imh0bWxfNGJhODEwOWQwZGQ0NGY0OWJlOGYwMjNlN2QxYzc5ZTUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNvbGxlZ2UgUG9pbnQsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMTYyMzJlZGEwNTA4NDYyZjk4NWI4MjQwM2YwNDgxNGUuc2V0Q29udGVudChodG1sXzRiYTgxMDlkMGRkNDRmNDliZThmMDIzZTdkMWM3OWU1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2MzYzMzYjhjODVkNzQwZDJiMDMyZDhlMTI0NDE0NDIxLmJpbmRQb3B1cChwb3B1cF8xNjIzMmVkYTA1MDg0NjJmOTg1YjgyNDAzZjA0ODE0ZSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jYzZmNDFjNjIyZTE0MDQzOGNlYzc4MTM4MWRkODViOCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc4MTI5MDc2NjAyNjk0LC03My44MTQyMDIxNjYxMDg2M10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jNTJjNzAyNDhjNTE0NDlhOGRlMzk3YmIxMWFlM2VlYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mODYyYWUyZjVkYzA0ODFhODkxYzA2MzA2YjE3ZmQ1YiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hZGMyZTUwYmI5YWI0ZmI5OGY2NjI3Yzk3M2U0NjkyNiA9ICQoJzxkaXYgaWQ9Imh0bWxfYWRjMmU1MGJiOWFiNGZiOThmNjYyN2M5NzNlNDY5MjYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPldoaXRlc3RvbmUsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZjg2MmFlMmY1ZGMwNDgxYTg5MWMwNjMwNmIxN2ZkNWIuc2V0Q29udGVudChodG1sX2FkYzJlNTBiYjlhYjRmYjk4ZjY2MjdjOTczZTQ2OTI2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2NjNmY0MWM2MjJlMTQwNDM4Y2VjNzgxMzgxZGQ4NWI4LmJpbmRQb3B1cChwb3B1cF9mODYyYWUyZjVkYzA0ODFhODkxYzA2MzA2YjE3ZmQ1Yik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8yNmVmNWY5ZGRkMzY0OWQxYjFkNzhhMmYwZmRlNTc3YiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc2NjA0MDYzMjgxMDY0LC03My43NzQyNzM2MzA2ODY3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2M1MmM3MDI0OGM1MTQ0OWE4ZGUzOTdiYjExYWUzZWVhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzM5YzY2OGE2MzAyMjQ2ODdhOTkzZjc2YWI1NTFmMzE4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzU4NDg3NjE1YmVhMjQ4ZDE5OGZhOTRiOTgyNjAzNjg2ID0gJCgnPGRpdiBpZD0iaHRtbF81ODQ4NzYxNWJlYTI0OGQxOThmYTk0Yjk4MjYwMzY4NiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QmF5c2lkZSwgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zOWM2NjhhNjMwMjI0Njg3YTk5M2Y3NmFiNTUxZjMxOC5zZXRDb250ZW50KGh0bWxfNTg0ODc2MTViZWEyNDhkMTk4ZmE5NGI5ODI2MDM2ODYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMjZlZjVmOWRkZDM2NDlkMWIxZDc4YTJmMGZkZTU3N2IuYmluZFBvcHVwKHBvcHVwXzM5YzY2OGE2MzAyMjQ2ODdhOTkzZjc2YWI1NTFmMzE4KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzBjODJmYTYyNDAzNDQ0ZDFhYzdjYTg4ZjM0YzI1ZTIxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzYxNzI5NTQ5MDMyNjIsLTczLjc5MTc2MjQzNzI4MDYxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2M1MmM3MDI0OGM1MTQ0OWE4ZGUzOTdiYjExYWUzZWVhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2FiOGE2YjBjMDBkYjRiYjNiYjU5MWI2NmZmMDRjYWJhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzI1MGRjNDRkOWE0NjQxNTZhOGNiNmVhYzgwMzFiM2E0ID0gJCgnPGRpdiBpZD0iaHRtbF8yNTBkYzQ0ZDlhNDY0MTU2YThjYjZlYWM4MDMxYjNhNCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QXVidXJuZGFsZSwgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hYjhhNmIwYzAwZGI0YmIzYmI1OTFiNjZmZjA0Y2FiYS5zZXRDb250ZW50KGh0bWxfMjUwZGM0NGQ5YTQ2NDE1NmE4Y2I2ZWFjODAzMWIzYTQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMGM4MmZhNjI0MDM0NDRkMWFjN2NhODhmMzRjMjVlMjEuYmluZFBvcHVwKHBvcHVwX2FiOGE2YjBjMDBkYjRiYjNiYjU5MWI2NmZmMDRjYWJhKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzQ1MzBiMzQ5OGEzNjRjNzVhZjgzZjBlN2QzYzFjNGYxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzcwODI2MTkyODI2NywtNzMuNzM4ODk3NzU1ODA3NF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jNTJjNzAyNDhjNTE0NDlhOGRlMzk3YmIxMWFlM2VlYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF81MGNlMWVhMTllMTc0YmI2YjcxNGU2NzBmNjA2ZGQ4NiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xMGQyOGI5MDhjNDU0NWRjOTRjNGNlODhjZDhmM2Y1NCA9ICQoJzxkaXYgaWQ9Imh0bWxfMTBkMjhiOTA4YzQ1NDVkYzk0YzRjZTg4Y2Q4ZjNmNTQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkxpdHRsZSBOZWNrLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzUwY2UxZWExOWUxNzRiYjZiNzE0ZTY3MGY2MDZkZDg2LnNldENvbnRlbnQoaHRtbF8xMGQyOGI5MDhjNDU0NWRjOTRjNGNlODhjZDhmM2Y1NCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl80NTMwYjM0OThhMzY0Yzc1YWY4M2YwZTdkM2MxYzRmMS5iaW5kUG9wdXAocG9wdXBfNTBjZTFlYTE5ZTE3NGJiNmI3MTRlNjcwZjYwNmRkODYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMDRiNjQ0NTgzOWUwNGI1ZDhhMzljMThiNTAzMDdjYjYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NjY4NDYwOTc5MDc2MywtNzMuNzQyNDk4MjA3MjczM10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jNTJjNzAyNDhjNTE0NDlhOGRlMzk3YmIxMWFlM2VlYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF83MWM0YmFhZDhlMTk0YWIyYTc5ODExZDU5ZjM2ZTlhMSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lNzkyOWQ3NmRjMTI0MmIxOWIxMjQzMzQwNmJjZjUwNyA9ICQoJzxkaXYgaWQ9Imh0bWxfZTc5MjlkNzZkYzEyNDJiMTliMTI0MzM0MDZiY2Y1MDciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkRvdWdsYXN0b24sIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNzFjNGJhYWQ4ZTE5NGFiMmE3OTgxMWQ1OWYzNmU5YTEuc2V0Q29udGVudChodG1sX2U3OTI5ZDc2ZGMxMjQyYjE5YjEyNDMzNDA2YmNmNTA3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzA0YjY0NDU4MzllMDRiNWQ4YTM5YzE4YjUwMzA3Y2I2LmJpbmRQb3B1cChwb3B1cF83MWM0YmFhZDhlMTk0YWIyYTc5ODExZDU5ZjM2ZTlhMSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xYzUwMDYzMTQxNjc0NTI0OTFiZDA1NWE1MTkyZjczMCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc0OTQ0MDc5OTc0MzMyLC03My43MTU0ODExODk5OTE0NV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jNTJjNzAyNDhjNTE0NDlhOGRlMzk3YmIxMWFlM2VlYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9kNmVjYWFkYzZmYjM0MGM2ODY4NzllNTcwMTNiNTE3YiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8yYjg5YjE0ZWU0OGM0NTFiOWE3N2FkM2E3ZTUyOGIwMyA9ICQoJzxkaXYgaWQ9Imh0bWxfMmI4OWIxNGVlNDhjNDUxYjlhNzdhZDNhN2U1MjhiMDMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkdsZW4gT2FrcywgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kNmVjYWFkYzZmYjM0MGM2ODY4NzllNTcwMTNiNTE3Yi5zZXRDb250ZW50KGh0bWxfMmI4OWIxNGVlNDhjNDUxYjlhNzdhZDNhN2U1MjhiMDMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMWM1MDA2MzE0MTY3NDUyNDkxYmQwNTVhNTE5MmY3MzAuYmluZFBvcHVwKHBvcHVwX2Q2ZWNhYWRjNmZiMzQwYzY4Njg3OWU1NzAxM2I1MTdiKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2E1Nzk4MjVmZTJmNzRlNjM5YWQ2ZmRmMDhiYTVhMTMyID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzI4NTczMTgxNzY2NzUsLTczLjcyMDEyODE0ODI2OTAzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2M1MmM3MDI0OGM1MTQ0OWE4ZGUzOTdiYjExYWUzZWVhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzBmMzk0OThhZjBlOTQwMDg4Nzk3ZjNmMDFhM2Q0ZmJlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzJlMzJjZmE5MWFmMDQwMjViYTVlNWUyN2Y2MDhlNGQ4ID0gJCgnPGRpdiBpZD0iaHRtbF8yZTMyY2ZhOTFhZjA0MDI1YmE1ZTVlMjdmNjA4ZTRkOCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QmVsbGVyb3NlLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzBmMzk0OThhZjBlOTQwMDg4Nzk3ZjNmMDFhM2Q0ZmJlLnNldENvbnRlbnQoaHRtbF8yZTMyY2ZhOTFhZjA0MDI1YmE1ZTVlMjdmNjA4ZTRkOCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9hNTc5ODI1ZmUyZjc0ZTYzOWFkNmZkZjA4YmE1YTEzMi5iaW5kUG9wdXAocG9wdXBfMGYzOTQ5OGFmMGU5NDAwODg3OTdmM2YwMWEzZDRmYmUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfM2JkN2NlOGMxMWU1NDljYWE5MjAwN2Y0Y2I3YmFkZDcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MjI1NzgyNDQyMjgwNDYsLTczLjgyMDg3NzY0OTMzNTY2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2M1MmM3MDI0OGM1MTQ0OWE4ZGUzOTdiYjExYWUzZWVhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzE5Yzk3YTBhYzIyODRlNTdhY2UyZGE5ZTRhODE5YmZmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzVjMjAwYzgxNjU3ZDRjMjRhMjA4ZWE2NDdmYWZlOGIzID0gJCgnPGRpdiBpZD0iaHRtbF81YzIwMGM4MTY1N2Q0YzI0YTIwOGVhNjQ3ZmFmZThiMyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+S2V3IEdhcmRlbnMgSGlsbHMsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMTljOTdhMGFjMjI4NGU1N2FjZTJkYTllNGE4MTliZmYuc2V0Q29udGVudChodG1sXzVjMjAwYzgxNjU3ZDRjMjRhMjA4ZWE2NDdmYWZlOGIzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzNiZDdjZThjMTFlNTQ5Y2FhOTIwMDdmNGNiN2JhZGQ3LmJpbmRQb3B1cChwb3B1cF8xOWM5N2EwYWMyMjg0ZTU3YWNlMmRhOWU0YTgxOWJmZik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8zYzI5N2YyNGI5ZGI0MTE3YTM5ODA1MmVlYmRhNTA1MCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjczNDM5NDQ2NTMzMTMsLTczLjc4MjcxMzM3MDAzMjY0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2M1MmM3MDI0OGM1MTQ0OWE4ZGUzOTdiYjExYWUzZWVhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzMwZWZkNWZkNjY4NzQ3YjdiYjBkNWE4MjhkMTFmMmVjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2JkNzQxZWM2YjczNTQxMzFhYzVkNTU3ZWQzN2E4OWMwID0gJCgnPGRpdiBpZD0iaHRtbF9iZDc0MWVjNmI3MzU0MTMxYWM1ZDU1N2VkMzdhODljMCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RnJlc2ggTWVhZG93cywgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zMGVmZDVmZDY2ODc0N2I3YmIwZDVhODI4ZDExZjJlYy5zZXRDb250ZW50KGh0bWxfYmQ3NDFlYzZiNzM1NDEzMWFjNWQ1NTdlZDM3YTg5YzApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfM2MyOTdmMjRiOWRiNDExN2EzOTgwNTJlZWJkYTUwNTAuYmluZFBvcHVwKHBvcHVwXzMwZWZkNWZkNjY4NzQ3YjdiYjBkNWE4MjhkMTFmMmVjKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzJlZTE3YjBhMjI2NjRiMjlhZmIzYzFmMTVmMjI1NjVkID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzEwOTM1NDcyNTIyNzEsLTczLjgxMTc0ODIyNDU4NjM0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2M1MmM3MDI0OGM1MTQ0OWE4ZGUzOTdiYjExYWUzZWVhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2RjMjlkZjQ1ZjhkZDRjYTJiMzQzMTgxYWY4Y2JhODc5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2ExZjA5MzkyMGFkMDQ4MDhiMTRjOTMzYzkwNzNiODAzID0gJCgnPGRpdiBpZD0iaHRtbF9hMWYwOTM5MjBhZDA0ODA4YjE0YzkzM2M5MDczYjgwMyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QnJpYXJ3b29kLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2RjMjlkZjQ1ZjhkZDRjYTJiMzQzMTgxYWY4Y2JhODc5LnNldENvbnRlbnQoaHRtbF9hMWYwOTM5MjBhZDA0ODA4YjE0YzkzM2M5MDczYjgwMyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8yZWUxN2IwYTIyNjY0YjI5YWZiM2MxZjE1ZjIyNTY1ZC5iaW5kUG9wdXAocG9wdXBfZGMyOWRmNDVmOGRkNGNhMmIzNDMxODFhZjhjYmE4NzkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNmVlMWZmNTVmYmFjNDA3M2IxZjI3OTQ5NDdiZGE4YTEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MDQ2NTczNjA2ODcxNywtNzMuNzk2OTAxNjU4ODgyODldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzUyYzcwMjQ4YzUxNDQ5YThkZTM5N2JiMTFhZTNlZWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOGRhMThmZWU5MzBlNGY5OThjNzliYWE1YzIzMTgzMWQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNTMwOTUxNzRkZjUxNGIyY2E4ZWRlNmQwMThjYTk2ZjYgPSAkKCc8ZGl2IGlkPSJodG1sXzUzMDk1MTc0ZGY1MTRiMmNhOGVkZTZkMDE4Y2E5NmY2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5KYW1haWNhIENlbnRlciwgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84ZGExOGZlZTkzMGU0Zjk5OGM3OWJhYTVjMjMxODMxZC5zZXRDb250ZW50KGh0bWxfNTMwOTUxNzRkZjUxNGIyY2E4ZWRlNmQwMThjYTk2ZjYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNmVlMWZmNTVmYmFjNDA3M2IxZjI3OTQ5NDdiZGE4YTEuYmluZFBvcHVwKHBvcHVwXzhkYTE4ZmVlOTMwZTRmOTk4Yzc5YmFhNWMyMzE4MzFkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzk1MWFlZDM2ZGI2MTRhNGI4ZDIyZjc0ZjYzNTE2ZDkzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzQ1NjE4NTcxNDE4NTUsLTczLjc1NDk0OTc2MjM0MzMyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2M1MmM3MDI0OGM1MTQ0OWE4ZGUzOTdiYjExYWUzZWVhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2RmMGUwMzk2YjkxMTQyNTU4NTZkNTNiM2Y2YTkwZGNiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzk5YmRiYmEzZjYyNzRjOWVhYWU5NzIwYzkxYjNmMzE2ID0gJCgnPGRpdiBpZD0iaHRtbF85OWJkYmJhM2Y2Mjc0YzllYWFlOTcyMGM5MWIzZjMxNiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+T2FrbGFuZCBHYXJkZW5zLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2RmMGUwMzk2YjkxMTQyNTU4NTZkNTNiM2Y2YTkwZGNiLnNldENvbnRlbnQoaHRtbF85OWJkYmJhM2Y2Mjc0YzllYWFlOTcyMGM5MWIzZjMxNik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl85NTFhZWQzNmRiNjE0YTRiOGQyMmY3NGY2MzUxNmQ5My5iaW5kUG9wdXAocG9wdXBfZGYwZTAzOTZiOTExNDI1NTg1NmQ1M2IzZjZhOTBkY2IpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYjRhMTYxMmJiNjFhNDcwN2EwMjJkYjM4OTlkYzE4YTcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MTg4OTMwOTIxNjczNTYsLTczLjczODcxNDg0NTc4NDI0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2M1MmM3MDI0OGM1MTQ0OWE4ZGUzOTdiYjExYWUzZWVhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2U5ZTY3ZmFkMDQ4OTRmNzk4ZmJhY2U5YWE2NTZkOTQ1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzJhMTgzZTc5YmQ2MTRlMjY5NDgzZjNmYmZjNjM3ZWQzID0gJCgnPGRpdiBpZD0iaHRtbF8yYTE4M2U3OWJkNjE0ZTI2OTQ4M2YzZmJmYzYzN2VkMyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UXVlZW5zIFZpbGxhZ2UsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZTllNjdmYWQwNDg5NGY3OThmYmFjZTlhYTY1NmQ5NDUuc2V0Q29udGVudChodG1sXzJhMTgzZTc5YmQ2MTRlMjY5NDgzZjNmYmZjNjM3ZWQzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2I0YTE2MTJiYjYxYTQ3MDdhMDIyZGIzODk5ZGMxOGE3LmJpbmRQb3B1cChwb3B1cF9lOWU2N2ZhZDA0ODk0Zjc5OGZiYWNlOWFhNjU2ZDk0NSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl83NWQyZWVhYTIzY2I0NTg4YWZkMDhkODU4MTM3YmE2MiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjcxMTI0MzQ0MTkxOTA0LC03My43NTkyNTAwOTMzNTU5NF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jNTJjNzAyNDhjNTE0NDlhOGRlMzk3YmIxMWFlM2VlYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hM2VlZGNmNGYzOWQ0YjNmYTdlNjUwNjBhOTJkMjVjNSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF84NzUwNGFjZjYxODY0ZmNhYWI3ZmU3NzdhYzFiMjcyYiA9ICQoJzxkaXYgaWQ9Imh0bWxfODc1MDRhY2Y2MTg2NGZjYWFiN2ZlNzc3YWMxYjI3MmIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkhvbGxpcywgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hM2VlZGNmNGYzOWQ0YjNmYTdlNjUwNjBhOTJkMjVjNS5zZXRDb250ZW50KGh0bWxfODc1MDRhY2Y2MTg2NGZjYWFiN2ZlNzc3YWMxYjI3MmIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNzVkMmVlYWEyM2NiNDU4OGFmZDA4ZDg1ODEzN2JhNjIuYmluZFBvcHVwKHBvcHVwX2EzZWVkY2Y0ZjM5ZDRiM2ZhN2U2NTA2MGE5MmQyNWM1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzcwZjM3NmYyMjM0MTRhOTZiN2ZjYWNmZjdmM2JmY2JkID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjk2OTExMjUzNzg5ODg1LC03My43OTA0MjYxMzEzNTU0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2M1MmM3MDI0OGM1MTQ0OWE4ZGUzOTdiYjExYWUzZWVhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzUxYWM1M2Y4YzhiMTRjOTJhZTgwMGNiYjkyNDM5Y2YzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzdkYzBlNTc0NTczYTQ0NmE4NjhiMzQ0Njc3NWVmYzM2ID0gJCgnPGRpdiBpZD0iaHRtbF83ZGMwZTU3NDU3M2E0NDZhODY4YjM0NDY3NzVlZmMzNiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U291dGggSmFtYWljYSwgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81MWFjNTNmOGM4YjE0YzkyYWU4MDBjYmI5MjQzOWNmMy5zZXRDb250ZW50KGh0bWxfN2RjMGU1NzQ1NzNhNDQ2YTg2OGIzNDQ2Nzc1ZWZjMzYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNzBmMzc2ZjIyMzQxNGE5NmI3ZmNhY2ZmN2YzYmZjYmQuYmluZFBvcHVwKHBvcHVwXzUxYWM1M2Y4YzhiMTRjOTJhZTgwMGNiYjkyNDM5Y2YzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzBjNWMyNTVhMzBmYTRhYWViZGNiNjI3ODAwZGI2Njg5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjk0NDQ1Mzg1MjIzNTksLTczLjc1ODY3NjAzNzI3NzE3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2M1MmM3MDI0OGM1MTQ0OWE4ZGUzOTdiYjExYWUzZWVhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzNhZDZkMzEzM2IzZTRjMGE5ODQxNzM0ZGFkYTQ4YWUyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2ZjYzMzZDVkN2RhMzQ0ZjdhYmZkMDZhZjdlZjI4OWEyID0gJCgnPGRpdiBpZD0iaHRtbF9mY2MzM2Q1ZDdkYTM0NGY3YWJmZDA2YWY3ZWYyODlhMiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U3QuIEFsYmFucywgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zYWQ2ZDMxMzNiM2U0YzBhOTg0MTczNGRhZGE0OGFlMi5zZXRDb250ZW50KGh0bWxfZmNjMzNkNWQ3ZGEzNDRmN2FiZmQwNmFmN2VmMjg5YTIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMGM1YzI1NWEzMGZhNGFhZWJkY2I2Mjc4MDBkYjY2ODkuYmluZFBvcHVwKHBvcHVwXzNhZDZkMzEzM2IzZTRjMGE5ODQxNzM0ZGFkYTQ4YWUyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzkzNzYxY2YzODYyNTRlMGRhOTkxZjhjODlmZmQ0MDk1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjc1MjExMzk1OTE3MzMsLTczLjc3MjU4Nzg3NjIwOTA2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2M1MmM3MDI0OGM1MTQ0OWE4ZGUzOTdiYjExYWUzZWVhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzcxYTdmOTZmMDU5MTQzMzE5NmEyMDI1NDAyOGEwNjEyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2U0ZjNkNWY4OWUxOTQ5MWE5YjgwMmIyY2RjM2YyM2VmID0gJCgnPGRpdiBpZD0iaHRtbF9lNGYzZDVmODllMTk0OTFhOWI4MDJiMmNkYzNmMjNlZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Um9jaGRhbGUsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNzFhN2Y5NmYwNTkxNDMzMTk2YTIwMjU0MDI4YTA2MTIuc2V0Q29udGVudChodG1sX2U0ZjNkNWY4OWUxOTQ5MWE5YjgwMmIyY2RjM2YyM2VmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzkzNzYxY2YzODYyNTRlMGRhOTkxZjhjODlmZmQ0MDk1LmJpbmRQb3B1cChwb3B1cF83MWE3Zjk2ZjA1OTE0MzMxOTZhMjAyNTQwMjhhMDYxMik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jY2QxYjUwOWY1NTQ0ZDUzOTEzOWI3YmVjNGQ3MjZmMCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY2NjIzMDQ5MDM2ODU4NCwtNzMuNzYwNDIwOTI2ODIyODddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzUyYzcwMjQ4YzUxNDQ5YThkZTM5N2JiMTFhZTNlZWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNTI0MGQzY2E1ZmEwNDQ4ZGI4ZGYwMzgxNzk0ZDZlMGYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNmRhOWEzYTg1NjAyNGQzZTk4YmViMWQ0MTgzZjY4MGQgPSAkKCc8ZGl2IGlkPSJodG1sXzZkYTlhM2E4NTYwMjRkM2U5OGJlYjFkNDE4M2Y2ODBkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5TcHJpbmdmaWVsZCBHYXJkZW5zLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzUyNDBkM2NhNWZhMDQ0OGRiOGRmMDM4MTc5NGQ2ZTBmLnNldENvbnRlbnQoaHRtbF82ZGE5YTNhODU2MDI0ZDNlOThiZWIxZDQxODNmNjgwZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9jY2QxYjUwOWY1NTQ0ZDUzOTEzOWI3YmVjNGQ3MjZmMC5iaW5kUG9wdXAocG9wdXBfNTI0MGQzY2E1ZmEwNDQ4ZGI4ZGYwMzgxNzk0ZDZlMGYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNzEwMzU0MWYwOWI0NGE2MTkyNzM3ODFlNWQ2ZWExZjMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42OTI3NzQ2MzkxNjA4NDUsLTczLjczNTI2ODczNzA4MDI2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2M1MmM3MDI0OGM1MTQ0OWE4ZGUzOTdiYjExYWUzZWVhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzdhOWJlZDBmYzYyNjRhMzJiYjI2ZGJmODlmMDYxMDI1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzkwNGZmYTk3ZWY4OTQxYzNiOTAxNWNiY2UzZTgyNGQ5ID0gJCgnPGRpdiBpZD0iaHRtbF85MDRmZmE5N2VmODk0MWMzYjkwMTVjYmNlM2U4MjRkOSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q2FtYnJpYSBIZWlnaHRzLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzdhOWJlZDBmYzYyNjRhMzJiYjI2ZGJmODlmMDYxMDI1LnNldENvbnRlbnQoaHRtbF85MDRmZmE5N2VmODk0MWMzYjkwMTVjYmNlM2U4MjRkOSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl83MTAzNTQxZjA5YjQ0YTYxOTI3Mzc4MWU1ZDZlYTFmMy5iaW5kUG9wdXAocG9wdXBfN2E5YmVkMGZjNjI2NGEzMmJiMjZkYmY4OWYwNjEwMjUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZDNmOWEwNWQ4NDhhNGQwZmFiNzRhZmI5NTMwNWM4YzcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42NTk4MTY0MzM0MjgwODQsLTczLjczNTI2MDc5NDI4Mjc4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2M1MmM3MDI0OGM1MTQ0OWE4ZGUzOTdiYjExYWUzZWVhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2FlMTYzOGM2N2FkZTQ1N2M4NzJhYTI3ZmJiMmJhODNlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzYyMGE5NjZhNTI3ODQ4NGU5ZGJmM2Q0Y2MwODMzYmM3ID0gJCgnPGRpdiBpZD0iaHRtbF82MjBhOTY2YTUyNzg0ODRlOWRiZjNkNGNjMDgzM2JjNyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Um9zZWRhbGUsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYWUxNjM4YzY3YWRlNDU3Yzg3MmFhMjdmYmIyYmE4M2Uuc2V0Q29udGVudChodG1sXzYyMGE5NjZhNTI3ODQ4NGU5ZGJmM2Q0Y2MwODMzYmM3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2QzZjlhMDVkODQ4YTRkMGZhYjc0YWZiOTUzMDVjOGM3LmJpbmRQb3B1cChwb3B1cF9hZTE2MzhjNjdhZGU0NTdjODcyYWEyN2ZiYjJiYTgzZSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9kZjgwOTE5ZWMwMmI0ZDQ4OTc2ZGU2MTRkNGQ1M2ZmYyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjYwMzEzNDQzMjUwMDg5NCwtNzMuNzU0OTc5NjgwNDM4NzJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzUyYzcwMjQ4YzUxNDQ5YThkZTM5N2JiMTFhZTNlZWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMWJmNjNkYjMzYjQ5NDNkNDkxZGQ1NDY3NWNjMWVhNGYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNDIwYWJmODc3ZjU3NGUzNzg2OTg2MDA3N2FlYWZlMGQgPSAkKCc8ZGl2IGlkPSJodG1sXzQyMGFiZjg3N2Y1NzRlMzc4Njk4NjAwNzdhZWFmZTBkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5GYXIgUm9ja2F3YXksIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMWJmNjNkYjMzYjQ5NDNkNDkxZGQ1NDY3NWNjMWVhNGYuc2V0Q29udGVudChodG1sXzQyMGFiZjg3N2Y1NzRlMzc4Njk4NjAwNzdhZWFmZTBkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2RmODA5MTllYzAyYjRkNDg5NzZkZTYxNGQ0ZDUzZmZjLmJpbmRQb3B1cChwb3B1cF8xYmY2M2RiMzNiNDk0M2Q0OTFkZDU0Njc1Y2MxZWE0Zik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81NzY4YzI0MmI1Y2M0YTk2OGI5Y2IxMWY4YWNlNGExZiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjYwMzAyNjU4MzUxMjM4LC03My44MjAwNTQ4OTExMDMyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2M1MmM3MDI0OGM1MTQ0OWE4ZGUzOTdiYjExYWUzZWVhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2Y2NTJmZjNjOTNlZTQ5ZWY4YmY0OTUwYTA0YWY3YTljID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2U0N2RmODk4YmFhNTRkYTNhNjZkYTEyNjU1NzQyN2IyID0gJCgnPGRpdiBpZD0iaHRtbF9lNDdkZjg5OGJhYTU0ZGEzYTY2ZGExMjY1NTc0MjdiMiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QnJvYWQgQ2hhbm5lbCwgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mNjUyZmYzYzkzZWU0OWVmOGJmNDk1MGEwNGFmN2E5Yy5zZXRDb250ZW50KGh0bWxfZTQ3ZGY4OThiYWE1NGRhM2E2NmRhMTI2NTU3NDI3YjIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNTc2OGMyNDJiNWNjNGE5NjhiOWNiMTFmOGFjZTRhMWYuYmluZFBvcHVwKHBvcHVwX2Y2NTJmZjNjOTNlZTQ5ZWY4YmY0OTUwYTA0YWY3YTljKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzJlZjBkMzhjYjZkMDQ0ZGViOTI0ZjJlMTZkMmUxNzRlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTU3NDAxMjg4NDU0NTIsLTczLjkyNTUxMTk2OTk0MTY4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2M1MmM3MDI0OGM1MTQ0OWE4ZGUzOTdiYjExYWUzZWVhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzMxMjc4ZTkzMzVlMzQ0MTFiNmY2NzdhNTYyYTU4YmEwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2Q0MzE0OTg3MmQ3ZTRjMTdhNzM0NmU1YzRjNDE1ODQzID0gJCgnPGRpdiBpZD0iaHRtbF9kNDMxNDk4NzJkN2U0YzE3YTczNDZlNWM0YzQxNTg0MyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QnJlZXp5IFBvaW50LCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzMxMjc4ZTkzMzVlMzQ0MTFiNmY2NzdhNTYyYTU4YmEwLnNldENvbnRlbnQoaHRtbF9kNDMxNDk4NzJkN2U0YzE3YTczNDZlNWM0YzQxNTg0Myk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8yZWYwZDM4Y2I2ZDA0NGRlYjkyNGYyZTE2ZDJlMTc0ZS5iaW5kUG9wdXAocG9wdXBfMzEyNzhlOTMzNWUzNDQxMWI2ZjY3N2E1NjJhNThiYTApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZjMzZDEzYmNmODllNGI5ODhhNjAzNTE0M2NkMzVhNWUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NzU5MjMwMTU2NDI4OTYsLTczLjkwMjI4OTYwMzkxNjczXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2M1MmM3MDI0OGM1MTQ0OWE4ZGUzOTdiYjExYWUzZWVhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzZkMGNhM2I5MzRkYzRjNzRhZWJiMWY0MDkzMDBiNDg5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzliYjgzZDAzYWJlZjQwNGFiZWYwODhhYjllOWM1ZDkyID0gJCgnPGRpdiBpZD0iaHRtbF85YmI4M2QwM2FiZWY0MDRhYmVmMDg4YWI5ZTljNWQ5MiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U3RlaW53YXksIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNmQwY2EzYjkzNGRjNGM3NGFlYmIxZjQwOTMwMGI0ODkuc2V0Q29udGVudChodG1sXzliYjgzZDAzYWJlZjQwNGFiZWYwODhhYjllOWM1ZDkyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2YzM2QxM2JjZjg5ZTRiOTg4YTYwMzUxNDNjZDM1YTVlLmJpbmRQb3B1cChwb3B1cF82ZDBjYTNiOTM0ZGM0Yzc0YWViYjFmNDA5MzAwYjQ4OSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xMjI3NTNlNTY3NmU0YmRhOTBhYzM5NGUzYzdhMzhkMSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc5Mjc4MTQwMzYwMDQ4LC03My44MDQzNjQ1MTcyMDk4OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jNTJjNzAyNDhjNTE0NDlhOGRlMzk3YmIxMWFlM2VlYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF81NTMxZmUwNjA5NGM0YWZiOGQ3YzRkMTRmNTk3ODQzYyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF84NWY3N2UyYzQ2NTM0YTU0YjBkNWVlMGQwMjcxY2FjNyA9ICQoJzxkaXYgaWQ9Imh0bWxfODVmNzdlMmM0NjUzNGE1NGIwZDVlZTBkMDI3MWNhYzciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkJlZWNoaHVyc3QsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNTUzMWZlMDYwOTRjNGFmYjhkN2M0ZDE0ZjU5Nzg0M2Muc2V0Q29udGVudChodG1sXzg1Zjc3ZTJjNDY1MzRhNTRiMGQ1ZWUwZDAyNzFjYWM3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzEyMjc1M2U1Njc2ZTRiZGE5MGFjMzk0ZTNjN2EzOGQxLmJpbmRQb3B1cChwb3B1cF81NTMxZmUwNjA5NGM0YWZiOGQ3YzRkMTRmNTk3ODQzYyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9hN2U3NzI1MGYyMzY0NmZkOGEwMDE4NjA4MGE4OGQwOCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc4Mjg0MjgwNjI0NTU1NCwtNzMuNzc2ODAyMjI2MjE1OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jNTJjNzAyNDhjNTE0NDlhOGRlMzk3YmIxMWFlM2VlYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hZmM3OWExYzVjYWE0YTcwYmZmYjAxMzFjMDE1OTYyZSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zZjE2MjhjNzhiOTg0NWQ1ODFiZmQ1M2Q4YjE0N2M3YSA9ICQoJzxkaXYgaWQ9Imh0bWxfM2YxNjI4Yzc4Yjk4NDVkNTgxYmZkNTNkOGIxNDdjN2EiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkJheSBUZXJyYWNlLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2FmYzc5YTFjNWNhYTRhNzBiZmZiMDEzMWMwMTU5NjJlLnNldENvbnRlbnQoaHRtbF8zZjE2MjhjNzhiOTg0NWQ1ODFiZmQ1M2Q4YjE0N2M3YSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9hN2U3NzI1MGYyMzY0NmZkOGEwMDE4NjA4MGE4OGQwOC5iaW5kUG9wdXAocG9wdXBfYWZjNzlhMWM1Y2FhNGE3MGJmZmIwMTMxYzAxNTk2MmUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOGI5OGUzNmZhMzNkNGQxZjhiNDM4MWRiOGI1YzhhY2EgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC41OTU2NDE4MDczNjg0OTQsLTczLjc3NjEzMjgyMzkxNzA1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2M1MmM3MDI0OGM1MTQ0OWE4ZGUzOTdiYjExYWUzZWVhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2NmNzZlZDA2ZGRlYTQ2MDhiN2NiNjI4Mzk0ZDEzYTUwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2Q3NTk2MDQyZTEyNDQ5YTBiODkxNjE1OGY0Mzk0ZWFmID0gJCgnPGRpdiBpZD0iaHRtbF9kNzU5NjA0MmUxMjQ0OWEwYjg5MTYxNThmNDM5NGVhZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RWRnZW1lcmUsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfY2Y3NmVkMDZkZGVhNDYwOGI3Y2I2MjgzOTRkMTNhNTAuc2V0Q29udGVudChodG1sX2Q3NTk2MDQyZTEyNDQ5YTBiODkxNjE1OGY0Mzk0ZWFmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzhiOThlMzZmYTMzZDRkMWY4YjQzODFkYjhiNWM4YWNhLmJpbmRQb3B1cChwb3B1cF9jZjc2ZWQwNmRkZWE0NjA4YjdjYjYyODM5NGQxM2E1MCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lNzA0MzhkYzQ4NjE0NGNiODhkZTFmNmYxYzFmNzUwMSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjU4OTE0Mzk0MzcyOTcxLC03My43OTE5OTIzMzEzNjk0M10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jNTJjNzAyNDhjNTE0NDlhOGRlMzk3YmIxMWFlM2VlYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82NjcwNTcwNTkzMTc0NTM4OWViMWJlYjJjMzk4OWE0NCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iNWViMjkzZjM2YmY0Y2M4YWVhMTc0ZmQ4MmJmZTdmMyA9ICQoJzxkaXYgaWQ9Imh0bWxfYjVlYjI5M2YzNmJmNGNjOGFlYTE3NGZkODJiZmU3ZjMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkFydmVybmUsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNjY3MDU3MDU5MzE3NDUzODllYjFiZWIyYzM5ODlhNDQuc2V0Q29udGVudChodG1sX2I1ZWIyOTNmMzZiZjRjYzhhZWExNzRmZDgyYmZlN2YzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2U3MDQzOGRjNDg2MTQ0Y2I4OGRlMWY2ZjFjMWY3NTAxLmJpbmRQb3B1cChwb3B1cF82NjcwNTcwNTkzMTc0NTM4OWViMWJlYjJjMzk4OWE0NCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jNmFlMmUxYmRmMTY0YWZmYjhlNmRhMjA0OTljNWY4MCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjU4MjgwMTY5Njg0NTU4NiwtNzMuODIyMzYxMjEwODg3NTFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzUyYzcwMjQ4YzUxNDQ5YThkZTM5N2JiMTFhZTNlZWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZjk0MzE1OWIzZDlhNGRiNjkxMjkyY2U3MzBkMTBlZmMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZjJlZGQxY2NhODc3NGRlYWJkNzRlYWEzYTMzNWE4ZTAgPSAkKCc8ZGl2IGlkPSJodG1sX2YyZWRkMWNjYTg3NzRkZWFiZDc0ZWFhM2EzMzVhOGUwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Sb2NrYXdheSBCZWFjaCwgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mOTQzMTU5YjNkOWE0ZGI2OTEyOTJjZTczMGQxMGVmYy5zZXRDb250ZW50KGh0bWxfZjJlZGQxY2NhODc3NGRlYWJkNzRlYWEzYTMzNWE4ZTApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYzZhZTJlMWJkZjE2NGFmZmI4ZTZkYTIwNDk5YzVmODAuYmluZFBvcHVwKHBvcHVwX2Y5NDMxNTliM2Q5YTRkYjY5MTI5MmNlNzMwZDEwZWZjKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzZkYWJiZDRlYTc5ZDQzOTI5ZTlhYjMzOWJlMjgyMTFlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTcyMDM2NzMwMjE3MDE1LC03My44NTc1NDY3MjQxMDgyN10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jNTJjNzAyNDhjNTE0NDlhOGRlMzk3YmIxMWFlM2VlYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xNTE5NDRmNDc5OGQ0ODJmOTJlMWVjYWEzMDU0ZjlmZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83YjUyN2Q3OGFjNzA0MzllYjA5ZTdhNjYzZGJjNzhkZiA9ICQoJzxkaXYgaWQ9Imh0bWxfN2I1MjdkNzhhYzcwNDM5ZWIwOWU3YTY2M2RiYzc4ZGYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk5lcG9uc2l0LCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzE1MTk0NGY0Nzk4ZDQ4MmY5MmUxZWNhYTMwNTRmOWZmLnNldENvbnRlbnQoaHRtbF83YjUyN2Q3OGFjNzA0MzllYjA5ZTdhNjYzZGJjNzhkZik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl82ZGFiYmQ0ZWE3OWQ0MzkyOWU5YWIzMzliZTI4MjExZS5iaW5kUG9wdXAocG9wdXBfMTUxOTQ0ZjQ3OThkNDgyZjkyZTFlY2FhMzA1NGY5ZmYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNzk1MTc5YTBiNzM4NDA5ODg2OWEyZjBkMGY2NDQ0OTcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NjQxMjYxMjI2MTQwNjYsLTczLjgxMjc2MjY5MTM1ODY2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2M1MmM3MDI0OGM1MTQ0OWE4ZGUzOTdiYjExYWUzZWVhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzI2MWM4ZjUwYzc5NzQzOGM5YzM0NDgxNDc4YzA3ZDY3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzY5MDY4MjVjYTRmMzQ2ODA5ZTQ5ZTlmOWFjZWEwNzhjID0gJCgnPGRpdiBpZD0iaHRtbF82OTA2ODI1Y2E0ZjM0NjgwOWU0OWU5ZjlhY2VhMDc4YyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TXVycmF5IEhpbGwsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMjYxYzhmNTBjNzk3NDM4YzljMzQ0ODE0NzhjMDdkNjcuc2V0Q29udGVudChodG1sXzY5MDY4MjVjYTRmMzQ2ODA5ZTQ5ZTlmOWFjZWEwNzhjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzc5NTE3OWEwYjczODQwOTg4NjlhMmYwZDBmNjQ0NDk3LmJpbmRQb3B1cChwb3B1cF8yNjFjOGY1MGM3OTc0MzhjOWMzNDQ4MTQ3OGMwN2Q2Nyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl83YThlMTNmZTNkNmY0MzczYTliMTRjZjhmMWRkOTg1MiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc0MTM3ODQyMTk0NTQzNCwtNzMuNzA4ODQ3MDU4ODkyNDZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzUyYzcwMjQ4YzUxNDQ5YThkZTM5N2JiMTFhZTNlZWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMDVkY2U3NDJiMWNkNGFjMGI3NTNkMGNiMjk2OGRkMDIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZDQzYjVlM2Q2YjI3NDE1NWJmZmZhNmM5MDFkMGVmZjIgPSAkKCc8ZGl2IGlkPSJodG1sX2Q0M2I1ZTNkNmIyNzQxNTViZmZmYTZjOTAxZDBlZmYyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5GbG9yYWwgUGFyaywgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wNWRjZTc0MmIxY2Q0YWMwYjc1M2QwY2IyOTY4ZGQwMi5zZXRDb250ZW50KGh0bWxfZDQzYjVlM2Q2YjI3NDE1NWJmZmZhNmM5MDFkMGVmZjIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfN2E4ZTEzZmUzZDZmNDM3M2E5YjE0Y2Y4ZjFkZDk4NTIuYmluZFBvcHVwKHBvcHVwXzA1ZGNlNzQyYjFjZDRhYzBiNzUzZDBjYjI5NjhkZDAyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2IyZjA2NGNjMGM1MzQ0N2M4NjIyYmRmZTQ2OWY5NjE2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzIwOTU3MjA3NjQ0NCwtNzMuNzY3MTQxNjY3MTQ3MjldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzUyYzcwMjQ4YzUxNDQ5YThkZTM5N2JiMTFhZTNlZWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMGNmNDJiZmFkZDkzNDA2ZWE3OTI4NjVkMWE3MDU2OTkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNjVhMjdkYTJmZWRkNGQ1ZWI3Nzg0MWE5NmJlMWRkMGMgPSAkKCc8ZGl2IGlkPSJodG1sXzY1YTI3ZGEyZmVkZDRkNWViNzc4NDFhOTZiZTFkZDBjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Ib2xsaXN3b29kLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzBjZjQyYmZhZGQ5MzQwNmVhNzkyODY1ZDFhNzA1Njk5LnNldENvbnRlbnQoaHRtbF82NWEyN2RhMmZlZGQ0ZDVlYjc3ODQxYTk2YmUxZGQwYyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9iMmYwNjRjYzBjNTM0NDdjODYyMmJkZmU0NjlmOTYxNi5iaW5kUG9wdXAocG9wdXBfMGNmNDJiZmFkZDkzNDA2ZWE3OTI4NjVkMWE3MDU2OTkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYWQ0ZmI3NjJiMTE3NGNhMDgwNjE4YmE2N2FiYjJiYWYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MTY4MDQ4MzAxNDYxMywtNzMuNzg3MjI2OTY5MzY2Nl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jNTJjNzAyNDhjNTE0NDlhOGRlMzk3YmIxMWFlM2VlYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9jNTRiNjBkYjVlMDY0YzBiOTBhNjM2ZWMzMmUwZDU0OSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hNGM2ZjE2MzkyZDM0ODk4OTA4NTUxZTVjNTA1ZWIxZCA9ICQoJzxkaXYgaWQ9Imh0bWxfYTRjNmYxNjM5MmQzNDg5ODkwODU1MWU1YzUwNWViMWQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkphbWFpY2EgRXN0YXRlcywgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jNTRiNjBkYjVlMDY0YzBiOTBhNjM2ZWMzMmUwZDU0OS5zZXRDb250ZW50KGh0bWxfYTRjNmYxNjM5MmQzNDg5ODkwODU1MWU1YzUwNWViMWQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYWQ0ZmI3NjJiMTE3NGNhMDgwNjE4YmE2N2FiYjJiYWYuYmluZFBvcHVwKHBvcHVwX2M1NGI2MGRiNWUwNjRjMGI5MGE2MzZlYzMyZTBkNTQ5KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzkzNTc1OGJkMTk1ZDRlOGJhNTc0MjJhMzYxMDMwNTI1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzQ0NTcyMzA5Mjg2NywtNzMuODI1ODA5MTUxMTA1NTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzUyYzcwMjQ4YzUxNDQ5YThkZTM5N2JiMTFhZTNlZWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZWMxZDcwMjhhMDI0NGFlYTg4NzgxMWY5YThkN2JlMTMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNWI4YzJkZGRlZWYxNDg0NTkwZmFhZGY3NThjZTNiNzcgPSAkKCc8ZGl2IGlkPSJodG1sXzViOGMyZGRkZWVmMTQ4NDU5MGZhYWRmNzU4Y2UzYjc3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5RdWVlbnNib3JvIEhpbGwsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZWMxZDcwMjhhMDI0NGFlYTg4NzgxMWY5YThkN2JlMTMuc2V0Q29udGVudChodG1sXzViOGMyZGRkZWVmMTQ4NDU5MGZhYWRmNzU4Y2UzYjc3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzkzNTc1OGJkMTk1ZDRlOGJhNTc0MjJhMzYxMDMwNTI1LmJpbmRQb3B1cChwb3B1cF9lYzFkNzAyOGEwMjQ0YWVhODg3ODExZjlhOGQ3YmUxMyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl84MDBhOGZiMjVjYTM0YmVjYmE4ZDIzOGM1ODJjNzYyNyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjcyMzgyNDkwMTgyOTIwNCwtNzMuNzk3NjAzMDA5MTI2NzJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzUyYzcwMjQ4YzUxNDQ5YThkZTM5N2JiMTFhZTNlZWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMGJlZjYxMzljZjAxNGQ5OTg5ZWMzZGU4ODc5NmM3ZGMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZjA2NzE4YjRjNDcyNGM1ZTlhNzcxMWQyNTY2MWE0ZTcgPSAkKCc8ZGl2IGlkPSJodG1sX2YwNjcxOGI0YzQ3MjRjNWU5YTc3MTFkMjU2NjFhNGU3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5IaWxsY3Jlc3QsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMGJlZjYxMzljZjAxNGQ5OTg5ZWMzZGU4ODc5NmM3ZGMuc2V0Q29udGVudChodG1sX2YwNjcxOGI0YzQ3MjRjNWU5YTc3MTFkMjU2NjFhNGU3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzgwMGE4ZmIyNWNhMzRiZWNiYThkMjM4YzU4MmM3NjI3LmJpbmRQb3B1cChwb3B1cF8wYmVmNjEzOWNmMDE0ZDk5ODllYzNkZTg4Nzk2YzdkYyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9kODE1ZWFiNmJiMjU0NzQyOTdiOGQ3ZGExN2VlNTNlOSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc2MTcwNDUyNjA1NDE0NiwtNzMuOTMxNTc1MDYwNzI4NzhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzUyYzcwMjQ4YzUxNDQ5YThkZTM5N2JiMTFhZTNlZWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNjc3NGYyMmZhM2U0NGIxM2FkYmZmMTI2MWIzNGZiMDQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfM2QxNWM0NjhjMGIxNDg3OTk4MTBjNWNmYzlkMDk3NjQgPSAkKCc8ZGl2IGlkPSJodG1sXzNkMTVjNDY4YzBiMTQ4Nzk5ODEwYzVjZmM5ZDA5NzY0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5SYXZlbnN3b29kLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzY3NzRmMjJmYTNlNDRiMTNhZGJmZjEyNjFiMzRmYjA0LnNldENvbnRlbnQoaHRtbF8zZDE1YzQ2OGMwYjE0ODc5OTgxMGM1Y2ZjOWQwOTc2NCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9kODE1ZWFiNmJiMjU0NzQyOTdiOGQ3ZGExN2VlNTNlOS5iaW5kUG9wdXAocG9wdXBfNjc3NGYyMmZhM2U0NGIxM2FkYmZmMTI2MWIzNGZiMDQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMTE1YTVmY2VkZTJkNDdhZWIwOGFiZmI5ODliMmI4ODMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42NjM5MTg0MTkyNTEzOSwtNzMuODQ5NjM3ODI0MDI0NDFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzUyYzcwMjQ4YzUxNDQ5YThkZTM5N2JiMTFhZTNlZWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNTg3MjJhOWI3ODc1NDYyZjgyMWU1Y2Y4MTgxZTQ4ZGUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZWMwYTQyMmI3ZTcwNDY1OTkyY2E2ZjVkNzgwY2IwZmIgPSAkKCc8ZGl2IGlkPSJodG1sX2VjMGE0MjJiN2U3MDQ2NTk5MmNhNmY1ZDc4MGNiMGZiIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5MaW5kZW53b29kLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzU4NzIyYTliNzg3NTQ2MmY4MjFlNWNmODE4MWU0OGRlLnNldENvbnRlbnQoaHRtbF9lYzBhNDIyYjdlNzA0NjU5OTJjYTZmNWQ3ODBjYjBmYik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8xMTVhNWZjZWRlMmQ0N2FlYjA4YWJmYjk4OWIyYjg4My5iaW5kUG9wdXAocG9wdXBfNTg3MjJhOWI3ODc1NDYyZjgyMWU1Y2Y4MTgxZTQ4ZGUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMjZkNzhkMDY2MDQ5NGZhY2E0MjZjZWJkZWE2MjY3YjYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42Njc4ODM4OTY2MDI0NywtNzMuNzQwMjU2MDc5ODk4MjJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzUyYzcwMjQ4YzUxNDQ5YThkZTM5N2JiMTFhZTNlZWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYjk3YmU4MWY0YWQyNDIzYmIxOGY0MDkyNmE3YzE5M2QgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfODc4ODkwODZjMzI3NDJkNTk2ZTdlMzQ1NzBlOTFjYmIgPSAkKCc8ZGl2IGlkPSJodG1sXzg3ODg5MDg2YzMyNzQyZDU5NmU3ZTM0NTcwZTkxY2JiIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5MYXVyZWx0b24sIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYjk3YmU4MWY0YWQyNDIzYmIxOGY0MDkyNmE3YzE5M2Quc2V0Q29udGVudChodG1sXzg3ODg5MDg2YzMyNzQyZDU5NmU3ZTM0NTcwZTkxY2JiKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzI2ZDc4ZDA2NjA0OTRmYWNhNDI2Y2ViZGVhNjI2N2I2LmJpbmRQb3B1cChwb3B1cF9iOTdiZTgxZjRhZDI0MjNiYjE4ZjQwOTI2YTdjMTkzZCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9kMWQ3MDA0YmZiOWM0YjBmYmE3YzRlNjE2MGRkNjA5MCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjczNjA3NDU3MDgzMDc5NSwtNzMuODYyNTI0NzE0MTM3NF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jNTJjNzAyNDhjNTE0NDlhOGRlMzk3YmIxMWFlM2VlYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82NzEwOTM4ZDQ3NzI0NmM3OGNmYjk1NWE1NTNhOGFmMyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wOGNhZTJhYzBjZmQ0MzhkYTNjODA3Njk0MGE3YmY0YSA9ICQoJzxkaXYgaWQ9Imh0bWxfMDhjYWUyYWMwY2ZkNDM4ZGEzYzgwNzY5NDBhN2JmNGEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkxlZnJhayBDaXR5LCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzY3MTA5MzhkNDc3MjQ2Yzc4Y2ZiOTU1YTU1M2E4YWYzLnNldENvbnRlbnQoaHRtbF8wOGNhZTJhYzBjZmQ0MzhkYTNjODA3Njk0MGE3YmY0YSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9kMWQ3MDA0YmZiOWM0YjBmYmE3YzRlNjE2MGRkNjA5MC5iaW5kUG9wdXAocG9wdXBfNjcxMDkzOGQ0NzcyNDZjNzhjZmI5NTVhNTUzYThhZjMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYWZjMmM4MTU0ZjY0NDQzMzllZGUzYmI0ZDI2MDYyM2EgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC41NzYxNTU1NjU0MzEwOSwtNzMuODU0MDE3NTAzOTI1Ml0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jNTJjNzAyNDhjNTE0NDlhOGRlMzk3YmIxMWFlM2VlYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xNThiZjIwYzhmNjI0YmUzYmEzNDIzNDNkNDNkMTA4YyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wODI5YWE0NTlkNGM0NmE3ODczZGRmM2U0ZWIyZDg1MSA9ICQoJzxkaXYgaWQ9Imh0bWxfMDgyOWFhNDU5ZDRjNDZhNzg3M2RkZjNlNGViMmQ4NTEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkJlbGxlIEhhcmJvciwgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xNThiZjIwYzhmNjI0YmUzYmEzNDIzNDNkNDNkMTA4Yy5zZXRDb250ZW50KGh0bWxfMDgyOWFhNDU5ZDRjNDZhNzg3M2RkZjNlNGViMmQ4NTEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYWZjMmM4MTU0ZjY0NDQzMzllZGUzYmI0ZDI2MDYyM2EuYmluZFBvcHVwKHBvcHVwXzE1OGJmMjBjOGY2MjRiZTNiYTM0MjM0M2Q0M2QxMDhjKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzIwNWVhYjkzMDc0ZjQ5OTJhMGY1YWZjNGRiNTI2ZThmID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTgwMzQyOTU2NDYxMzEsLTczLjg0MTUzMzcwMjI2MTg2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2M1MmM3MDI0OGM1MTQ0OWE4ZGUzOTdiYjExYWUzZWVhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2MxYmQ2ZTIyZTEwZjQyMDlhMmNiODA1ZTYzNWFkNjc0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzI4NGQ1MDM4ZmUxODQ3MTY5Njk3N2UyZGIyYjRhMTBhID0gJCgnPGRpdiBpZD0iaHRtbF8yODRkNTAzOGZlMTg0NzE2OTY5NzdlMmRiMmI0YTEwYSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Um9ja2F3YXkgUGFyaywgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jMWJkNmUyMmUxMGY0MjA5YTJjYjgwNWU2MzVhZDY3NC5zZXRDb250ZW50KGh0bWxfMjg0ZDUwMzhmZTE4NDcxNjk2OTc3ZTJkYjJiNGExMGEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMjA1ZWFiOTMwNzRmNDk5MmEwZjVhZmM0ZGI1MjZlOGYuYmluZFBvcHVwKHBvcHVwX2MxYmQ2ZTIyZTEwZjQyMDlhMmNiODA1ZTYzNWFkNjc0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzk1YjFiODUwMjBjMzQ1NTM4YzllNWE1ZDc2YWMzZmMyID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTk3NzEwNjE1NjU3NjgsLTczLjc5NjY0NzUwODQ0MDQ3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2M1MmM3MDI0OGM1MTQ0OWE4ZGUzOTdiYjExYWUzZWVhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzZiMTg5M2I5YzNlZDQ3OGM5MWViZWQzNjkwZmMyZmI3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzVkMTA4ZTBhZjJlMzQ2NGZhZGU1NjA3YTY2MDNlMTIxID0gJCgnPGRpdiBpZD0iaHRtbF81ZDEwOGUwYWYyZTM0NjRmYWRlNTYwN2E2NjAzZTEyMSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U29tZXJ2aWxsZSwgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82YjE4OTNiOWMzZWQ0NzhjOTFlYmVkMzY5MGZjMmZiNy5zZXRDb250ZW50KGh0bWxfNWQxMDhlMGFmMmUzNDY0ZmFkZTU2MDdhNjYwM2UxMjEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOTViMWI4NTAyMGMzNDU1MzhjOWU1YTVkNzZhYzNmYzIuYmluZFBvcHVwKHBvcHVwXzZiMTg5M2I5YzNlZDQ3OGM5MWViZWQzNjkwZmMyZmI3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzUyMjE5NTM4NTkwOTRlY2JhYzVlOTIxN2RmOTYyOGE2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjYwMDAzMjI3MzM2MTMsLTczLjc1MTc1MzEwNzMxMTUzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2M1MmM3MDI0OGM1MTQ0OWE4ZGUzOTdiYjExYWUzZWVhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzY5M2I0OWJmZjU3ZDQzOTlhNjA2ZWU1ZWI2Mjk2NzBkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2RlYjllYWU4MzAxMjQ5MWRiMmFhZTIyODdmMDk3Y2M1ID0gJCgnPGRpdiBpZD0iaHRtbF9kZWI5ZWFlODMwMTI0OTFkYjJhYWUyMjg3ZjA5N2NjNSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QnJvb2t2aWxsZSwgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82OTNiNDliZmY1N2Q0Mzk5YTYwNmVlNWViNjI5NjcwZC5zZXRDb250ZW50KGh0bWxfZGViOWVhZTgzMDEyNDkxZGIyYWFlMjI4N2YwOTdjYzUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNTIyMTk1Mzg1OTA5NGVjYmFjNWU5MjE3ZGY5NjI4YTYuYmluZFBvcHVwKHBvcHVwXzY5M2I0OWJmZjU3ZDQzOTlhNjA2ZWU1ZWI2Mjk2NzBkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzE0OWQ5ZTk4MGU1YzQ2MDRiYWY3YTRiOWU1YTcyYTdmID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzMzMDE0MDQwMjc4MzQsLTczLjczODg5MTk4OTEyNDgxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2M1MmM3MDI0OGM1MTQ0OWE4ZGUzOTdiYjExYWUzZWVhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzQyYmU3MTI2ZDY2ZTQxNzZhMTAzYjAwYzRiNTM5MzY5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzkwMDA0Y2M0MzU5YzQ4ZWI5ZWIwY2E4OWQ4ZmE5ZTU2ID0gJCgnPGRpdiBpZD0iaHRtbF85MDAwNGNjNDM1OWM0OGViOWViMGNhODlkOGZhOWU1NiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QmVsbGFpcmUsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNDJiZTcxMjZkNjZlNDE3NmExMDNiMDBjNGI1MzkzNjkuc2V0Q29udGVudChodG1sXzkwMDA0Y2M0MzU5YzQ4ZWI5ZWIwY2E4OWQ4ZmE5ZTU2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzE0OWQ5ZTk4MGU1YzQ2MDRiYWY3YTRiOWU1YTcyYTdmLmJpbmRQb3B1cChwb3B1cF80MmJlNzEyNmQ2NmU0MTc2YTEwM2IwMGM0YjUzOTM2OSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9hMjRmM2ZmOGQ2M2Q0YWUzODM0MzJjODhmZDBmYjcyYiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc1NDA3MDk5OTA0ODksLTczLjg1NzUxNzkwNjc2NDQ3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2M1MmM3MDI0OGM1MTQ0OWE4ZGUzOTdiYjExYWUzZWVhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2MyZWFjNzRiOTRiYzQ1MzhiZjg2NDU0NGM3YmRiYWQyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzRhM2Q1NDVkN2Q0MTQwYTU5ZDE0MTA0ZWM4NTMzZmZlID0gJCgnPGRpdiBpZD0iaHRtbF80YTNkNTQ1ZDdkNDE0MGE1OWQxNDEwNGVjODUzM2ZmZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Tm9ydGggQ29yb25hLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2MyZWFjNzRiOTRiYzQ1MzhiZjg2NDU0NGM3YmRiYWQyLnNldENvbnRlbnQoaHRtbF80YTNkNTQ1ZDdkNDE0MGE1OWQxNDEwNGVjODUzM2ZmZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9hMjRmM2ZmOGQ2M2Q0YWUzODM0MzJjODhmZDBmYjcyYi5iaW5kUG9wdXAocG9wdXBfYzJlYWM3NGI5NGJjNDUzOGJmODY0NTQ0YzdiZGJhZDIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYmI1ZmM1MzZkMTNmNDRlMzkxMmRlN2U0NzBlOWJlZjYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MTQ2MTEwODE1MTE3LC03My44NDEwMjIxMTIzNDAxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2M1MmM3MDI0OGM1MTQ0OWE4ZGUzOTdiYjExYWUzZWVhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2M3NTU3NTJjODJkNTRjMDc4MjE3NGNlZmExOTU1OTA4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzEwNTY2M2JhMzA1ODRlYTg5Zjg3NGU5NTFhZWNlYmE5ID0gJCgnPGRpdiBpZD0iaHRtbF8xMDU2NjNiYTMwNTg0ZWE4OWY4NzRlOTUxYWVjZWJhOSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Rm9yZXN0IEhpbGxzIEdhcmRlbnMsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYzc1NTc1MmM4MmQ1NGMwNzgyMTc0Y2VmYTE5NTU5MDguc2V0Q29udGVudChodG1sXzEwNTY2M2JhMzA1ODRlYTg5Zjg3NGU5NTFhZWNlYmE5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2JiNWZjNTM2ZDEzZjQ0ZTM5MTJkZTdlNDcwZTliZWY2LmJpbmRQb3B1cChwb3B1cF9jNzU1NzUyYzgyZDU0YzA3ODIxNzRjZWZhMTk1NTkwOCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lYzY4MWI5NWFlYmQ0NjFkODBkZjE1MTIxYTVlM2UzMCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY0NDk4MTU3MTAwNDQsLTc0LjA3OTM1MzEyNTEyNzk3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2M1MmM3MDI0OGM1MTQ0OWE4ZGUzOTdiYjExYWUzZWVhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2Q3YjM5ZmZmN2YwNDQ2ZDM4Mjc3OWZlM2UwNGI3M2M4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzNjZjU5MmU2ZjUzODRmZWY4NGE2NWM2YTE2MGY2YzA5ID0gJCgnPGRpdiBpZD0iaHRtbF8zY2Y1OTJlNmY1Mzg0ZmVmODRhNjVjNmExNjBmNmMwOSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U3QuIEdlb3JnZSwgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZDdiMzlmZmY3ZjA0NDZkMzgyNzc5ZmUzZTA0YjczYzguc2V0Q29udGVudChodG1sXzNjZjU5MmU2ZjUzODRmZWY4NGE2NWM2YTE2MGY2YzA5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2VjNjgxYjk1YWViZDQ2MWQ4MGRmMTUxMjFhNWUzZTMwLmJpbmRQb3B1cChwb3B1cF9kN2IzOWZmZjdmMDQ0NmQzODI3NzlmZTNlMDRiNzNjOCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8wYmEyOTUyMmRhMWE0NDc2YWUxZWJkYTY1N2NhODI4MyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY0MDYxNDU1OTEzNTExLC03NC4wODcwMTY1MDUxNjYyNV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jNTJjNzAyNDhjNTE0NDlhOGRlMzk3YmIxMWFlM2VlYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF84MTkzZDkyMzE1MGE0Mjc3YWU3NmViYzgyNTRlNTE1OCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kNWI0YTJiNzQzOGE0MmYwYmY4MzdjOTU5MmJhZjhjNCA9ICQoJzxkaXYgaWQ9Imh0bWxfZDViNGEyYjc0MzhhNDJmMGJmODM3Yzk1OTJiYWY4YzQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk5ldyBCcmlnaHRvbiwgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfODE5M2Q5MjMxNTBhNDI3N2FlNzZlYmM4MjU0ZTUxNTguc2V0Q29udGVudChodG1sX2Q1YjRhMmI3NDM4YTQyZjBiZjgzN2M5NTkyYmFmOGM0KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzBiYTI5NTIyZGExYTQ0NzZhZTFlYmRhNjU3Y2E4MjgzLmJpbmRQb3B1cChwb3B1cF84MTkzZDkyMzE1MGE0Mjc3YWU3NmViYzgyNTRlNTE1OCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9iYjI4OTFmYWI1MGM0MWM3YTFjMGRlZmM1OTAxYzZhYiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjYyNjkyNzYyNTM4MTc2LC03NC4wNzc5MDE5MjY2MDA2Nl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jNTJjNzAyNDhjNTE0NDlhOGRlMzk3YmIxMWFlM2VlYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lZGE3ODVjNzEyNTI0ZmJmYTc0NWRjMTg2NWYyNzIyNyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jNjE5ZDM1YmFkNGQ0NGRkOTJiYzdmZDI2YjQxZjNhZiA9ICQoJzxkaXYgaWQ9Imh0bWxfYzYxOWQzNWJhZDRkNDRkZDkyYmM3ZmQyNmI0MWYzYWYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlN0YXBsZXRvbiwgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZWRhNzg1YzcxMjUyNGZiZmE3NDVkYzE4NjVmMjcyMjcuc2V0Q29udGVudChodG1sX2M2MTlkMzViYWQ0ZDQ0ZGQ5MmJjN2ZkMjZiNDFmM2FmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2JiMjg5MWZhYjUwYzQxYzdhMWMwZGVmYzU5MDFjNmFiLmJpbmRQb3B1cChwb3B1cF9lZGE3ODVjNzEyNTI0ZmJmYTc0NWRjMTg2NWYyNzIyNyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl80ODYyZWQ1ZjhiMmU0YmM1OTE4ZTg4NjgyMDg1ZDIzMCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjYxNTMwNDk0NjUyNzYxLC03NC4wNjk4MDUyNjcxNjE0MV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jNTJjNzAyNDhjNTE0NDlhOGRlMzk3YmIxMWFlM2VlYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wODIzZTc0YjVhMzA0ZjIxYjkyYzE4MjNkZGNmZjc0ZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF84ZjNhNDJiNGE1MDI0MGQ5OTY5MjAyNTBkMmM5MTlkMSA9ICQoJzxkaXYgaWQ9Imh0bWxfOGYzYTQyYjRhNTAyNDBkOTk2OTIwMjUwZDJjOTE5ZDEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlJvc2ViYW5rLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wODIzZTc0YjVhMzA0ZjIxYjkyYzE4MjNkZGNmZjc0Zi5zZXRDb250ZW50KGh0bWxfOGYzYTQyYjRhNTAyNDBkOTk2OTIwMjUwZDJjOTE5ZDEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNDg2MmVkNWY4YjJlNGJjNTkxOGU4ODY4MjA4NWQyMzAuYmluZFBvcHVwKHBvcHVwXzA4MjNlNzRiNWEzMDRmMjFiOTJjMTgyM2RkY2ZmNzRmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzUyZDIyMDJlNWZmYzQzYTY4MmFkY2RjODExMmU4NzE1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjMxODc4OTI2NTQ2MDcsLTc0LjEwNzE4MTc4MjY1NjFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzUyYzcwMjQ4YzUxNDQ5YThkZTM5N2JiMTFhZTNlZWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZTFiMjQzYmJjNzQyNDM1MDgyM2VlZDY2MTNiMjJhMWQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNjE0YWMyN2E4Y2QxNDMxMGExNDY5ZTI0NjAyMjJjNTkgPSAkKCc8ZGl2IGlkPSJodG1sXzYxNGFjMjdhOGNkMTQzMTBhMTQ2OWUyNDYwMjIyYzU5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5XZXN0IEJyaWdodG9uLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lMWIyNDNiYmM3NDI0MzUwODIzZWVkNjYxM2IyMmExZC5zZXRDb250ZW50KGh0bWxfNjE0YWMyN2E4Y2QxNDMxMGExNDY5ZTI0NjAyMjJjNTkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNTJkMjIwMmU1ZmZjNDNhNjgyYWRjZGM4MTEyZTg3MTUuYmluZFBvcHVwKHBvcHVwX2UxYjI0M2JiYzc0MjQzNTA4MjNlZWQ2NjEzYjIyYTFkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2I5MTIwNjBlYjQwODRhNWZiOGFiMmQ5YTliMjBmMDQxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjI0MTg0NzkxMzEzMDA2LC03NC4wODcyNDgxOTk4MzcyOV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jNTJjNzAyNDhjNTE0NDlhOGRlMzk3YmIxMWFlM2VlYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8yZDg1M2M0MTZlOGY0MDU3YTkzOGQ3ZjNlNzA2OWRkOSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kZGExMDA3ZWY1OWU0NTc1YjcyZDMwNDk2NTIwZjA0NyA9ICQoJzxkaXYgaWQ9Imh0bWxfZGRhMTAwN2VmNTllNDU3NWI3MmQzMDQ5NjUyMGYwNDciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkdyeW1lcyBIaWxsLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yZDg1M2M0MTZlOGY0MDU3YTkzOGQ3ZjNlNzA2OWRkOS5zZXRDb250ZW50KGh0bWxfZGRhMTAwN2VmNTllNDU3NWI3MmQzMDQ5NjUyMGYwNDcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYjkxMjA2MGViNDA4NGE1ZmI4YWIyZDlhOWIyMGYwNDEuYmluZFBvcHVwKHBvcHVwXzJkODUzYzQxNmU4ZjQwNTdhOTM4ZDdmM2U3MDY5ZGQ5KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2RjODAwYzM5NGU0MDRmM2U5NzAyYzNiZGExMDg1MDRmID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTk3MDY4NTE4MTQ2NzMsLTc0LjExMTMyODgxODAwODhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzUyYzcwMjQ4YzUxNDQ5YThkZTM5N2JiMTFhZTNlZWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNjY3MjdkZDMyZWMxNDI5YmI5MTgzNTMyZmNhMzVmMDggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZWUwMzI1NzQ1YmRiNGNkMmE3YTM0NTNkNjRlNzc0ZWQgPSAkKCc8ZGl2IGlkPSJodG1sX2VlMDMyNTc0NWJkYjRjZDJhN2EzNDUzZDY0ZTc3NGVkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Ub2R0IEhpbGwsIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzY2NzI3ZGQzMmVjMTQyOWJiOTE4MzUzMmZjYTM1ZjA4LnNldENvbnRlbnQoaHRtbF9lZTAzMjU3NDViZGI0Y2QyYTdhMzQ1M2Q2NGU3NzRlZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9kYzgwMGMzOTRlNDA0ZjNlOTcwMmMzYmRhMTA4NTA0Zi5iaW5kUG9wdXAocG9wdXBfNjY3MjdkZDMyZWMxNDI5YmI5MTgzNTMyZmNhMzVmMDgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNjcyZDlhYTZjMDUxNDQyYzllZmNiZDhhZDM4ZDE1ODggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC41ODAyNDc0MTM1MDk1NiwtNzQuMDc5NTUyOTI1Mzk4Ml0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jNTJjNzAyNDhjNTE0NDlhOGRlMzk3YmIxMWFlM2VlYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF81MzZkZjhlMmY1ZmY0Y2IwOGYwMmRjMTRlMTM0NTYxMyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83YTcyY2UyODkyNGE0ZDdmYWQ4MWQwZTYzMzJlNWY2OSA9ICQoJzxkaXYgaWQ9Imh0bWxfN2E3MmNlMjg5MjRhNGQ3ZmFkODFkMGU2MzMyZTVmNjkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlNvdXRoIEJlYWNoLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81MzZkZjhlMmY1ZmY0Y2IwOGYwMmRjMTRlMTM0NTYxMy5zZXRDb250ZW50KGh0bWxfN2E3MmNlMjg5MjRhNGQ3ZmFkODFkMGU2MzMyZTVmNjkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNjcyZDlhYTZjMDUxNDQyYzllZmNiZDhhZDM4ZDE1ODguYmluZFBvcHVwKHBvcHVwXzUzNmRmOGUyZjVmZjRjYjA4ZjAyZGMxNGUxMzQ1NjEzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzkwMmUwMzU2MDllMzQ2MjY5OTJiZGU0NTkyMmEwYjI5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjMzNjY5MzA1NTQzNjUsLTc0LjEyOTQzNDI2Nzk3MDA4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2M1MmM3MDI0OGM1MTQ0OWE4ZGUzOTdiYjExYWUzZWVhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzhlMTViYTA1MTk4MzQyY2FiZmI2MDcxMzg4MTE5OWQyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2JjYjljZWM3ZWQ5NDQxNDJhMDc1ZmNiODk2MGU4ODgyID0gJCgnPGRpdiBpZD0iaHRtbF9iY2I5Y2VjN2VkOTQ0MTQyYTA3NWZjYjg5NjBlODg4MiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UG9ydCBSaWNobW9uZCwgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOGUxNWJhMDUxOTgzNDJjYWJmYjYwNzEzODgxMTk5ZDIuc2V0Q29udGVudChodG1sX2JjYjljZWM3ZWQ5NDQxNDJhMDc1ZmNiODk2MGU4ODgyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzkwMmUwMzU2MDllMzQ2MjY5OTJiZGU0NTkyMmEwYjI5LmJpbmRQb3B1cChwb3B1cF84ZTE1YmEwNTE5ODM0MmNhYmZiNjA3MTM4ODExOTlkMik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8yYWE1YzU4MjY5ZmQ0ZjdiOTU3NjdjYjgzNWMxMjI0YyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjYzMjU0NjM5MDQ4MTEyNCwtNzQuMTUwMDg1MzcwNDY5ODFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzUyYzcwMjQ4YzUxNDQ5YThkZTM5N2JiMTFhZTNlZWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYjBmMTAyN2JiZTkzNGFiM2IxZDhmMzkxYjFmNDUyNzQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYjk3MjMyZTgwM2Q4NDA0ZmJiZTYyZjJhMDI5ZWI3NTggPSAkKCc8ZGl2IGlkPSJodG1sX2I5NzIzMmU4MDNkODQwNGZiYmU2MmYyYTAyOWViNzU4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NYXJpbmVyJiMzOTtzIEhhcmJvciwgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYjBmMTAyN2JiZTkzNGFiM2IxZDhmMzkxYjFmNDUyNzQuc2V0Q29udGVudChodG1sX2I5NzIzMmU4MDNkODQwNGZiYmU2MmYyYTAyOWViNzU4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzJhYTVjNTgyNjlmZDRmN2I5NTc2N2NiODM1YzEyMjRjLmJpbmRQb3B1cChwb3B1cF9iMGYxMDI3YmJlOTM0YWIzYjFkOGYzOTFiMWY0NTI3NCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lNGYwOTI2MDFjNGY0ZmIxOTk5YWY5YWI1YTMzM2RjZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjYzOTY4Mjk3ODQ1NTQyLC03NC4xNzQ2NDUzMjk5MzU0Ml0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jNTJjNzAyNDhjNTE0NDlhOGRlMzk3YmIxMWFlM2VlYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF81ZGU4NTJiYmQ4ZWQ0NTQ5Yjk5MmM3ODM3M2ExZTRlZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kMTU2YjJiNGM0OGE0MjdmOTg1YmFkMWE5ZjA2NDYzZCA9ICQoJzxkaXYgaWQ9Imh0bWxfZDE1NmIyYjRjNDhhNDI3Zjk4NWJhZDFhOWYwNjQ2M2QiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlBvcnQgSXZvcnksIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzVkZTg1MmJiZDhlZDQ1NDliOTkyYzc4MzczYTFlNGVmLnNldENvbnRlbnQoaHRtbF9kMTU2YjJiNGM0OGE0MjdmOTg1YmFkMWE5ZjA2NDYzZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9lNGYwOTI2MDFjNGY0ZmIxOTk5YWY5YWI1YTMzM2RjZS5iaW5kUG9wdXAocG9wdXBfNWRlODUyYmJkOGVkNDU0OWI5OTJjNzgzNzNhMWU0ZWYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfY2ZhYzFlOWMzZjA3NDA5MDk3NGEwMzU3ZDczNDljMTEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42MTMzMzU5Mzc2Njc0MiwtNzQuMTE5MTgwNTg1MzQ4NDJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzUyYzcwMjQ4YzUxNDQ5YThkZTM5N2JiMTFhZTNlZWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYmVlYjdiNjM2YzdiNGM2MGE1YjM5ZGI0MzQ0NzBlYWYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMWRmNDZhMGRiYWM3NDZlZjk4NDkxNTdmMGQwN2ZhNmUgPSAkKCc8ZGl2IGlkPSJodG1sXzFkZjQ2YTBkYmFjNzQ2ZWY5ODQ5MTU3ZjBkMDdmYTZlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DYXN0bGV0b24gQ29ybmVycywgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYmVlYjdiNjM2YzdiNGM2MGE1YjM5ZGI0MzQ0NzBlYWYuc2V0Q29udGVudChodG1sXzFkZjQ2YTBkYmFjNzQ2ZWY5ODQ5MTU3ZjBkMDdmYTZlKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2NmYWMxZTljM2YwNzQwOTA5NzRhMDM1N2Q3MzQ5YzExLmJpbmRQb3B1cChwb3B1cF9iZWViN2I2MzZjN2I0YzYwYTViMzlkYjQzNDQ3MGVhZik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mNGQ2OTdjMjczMTk0ZmNlOTE0MjFjOGNjMzA3YTcwMSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjU5NDI1MjM3OTE2MTY5NSwtNzQuMTY0OTYwMzEzMjk4MjddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzUyYzcwMjQ4YzUxNDQ5YThkZTM5N2JiMTFhZTNlZWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMzRlMmI3YmJmY2EwNGI4NmFkNzljMTg3MWUyYmVmOTUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMGQ1MjZlZDNhMTdmNGFjZGE1Y2U5NjEyNWU2OTExNGEgPSAkKCc8ZGl2IGlkPSJodG1sXzBkNTI2ZWQzYTE3ZjRhY2RhNWNlOTYxMjVlNjkxMTRhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5OZXcgU3ByaW5ndmlsbGUsIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzM0ZTJiN2JiZmNhMDRiODZhZDc5YzE4NzFlMmJlZjk1LnNldENvbnRlbnQoaHRtbF8wZDUyNmVkM2ExN2Y0YWNkYTVjZTk2MTI1ZTY5MTE0YSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9mNGQ2OTdjMjczMTk0ZmNlOTE0MjFjOGNjMzA3YTcwMS5iaW5kUG9wdXAocG9wdXBfMzRlMmI3YmJmY2EwNGI4NmFkNzljMTg3MWUyYmVmOTUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNTNmODc3Y2JkOWEzNDg1ZGEwM2UzYWZiM2FjOTVmNTQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC41ODYzMTM3NTEwMzI4MSwtNzQuMTkwNzM3MTc1MzgxMTZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzUyYzcwMjQ4YzUxNDQ5YThkZTM5N2JiMTFhZTNlZWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNjdkOTkxZTAxM2Y1NDczNjk5NjBlM2IxOTgyNmJiNmYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZGE3ZjUyYjNkMWIxNDNjNTg0MzhiMGEyZDcyMTA1NDEgPSAkKCc8ZGl2IGlkPSJodG1sX2RhN2Y1MmIzZDFiMTQzYzU4NDM4YjBhMmQ3MjEwNTQxIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5UcmF2aXMsIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzY3ZDk5MWUwMTNmNTQ3MzY5OTYwZTNiMTk4MjZiYjZmLnNldENvbnRlbnQoaHRtbF9kYTdmNTJiM2QxYjE0M2M1ODQzOGIwYTJkNzIxMDU0MSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81M2Y4NzdjYmQ5YTM0ODVkYTAzZTNhZmIzYWM5NWY1NC5iaW5kUG9wdXAocG9wdXBfNjdkOTkxZTAxM2Y1NDczNjk5NjBlM2IxOTgyNmJiNmYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNmJjNTJlM2YyZGI2NDNmODhmYTg3OTEzOGY3ZTQ4ZjUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC41NzI1NzIzMTgyMDYzMiwtNzQuMTE2NDc5NDM2MDYzOF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jNTJjNzAyNDhjNTE0NDlhOGRlMzk3YmIxMWFlM2VlYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8yYzJlNTk1MDI0Mzk0MzUwOThiNWE2NGVhOWJmYzk4MiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF84MTE4NmRlMjgwMjE0Mzk3YjYwZDcyYmU2NzJjZTkyMiA9ICQoJzxkaXYgaWQ9Imh0bWxfODExODZkZTI4MDIxNDM5N2I2MGQ3MmJlNjcyY2U5MjIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk5ldyBEb3JwLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yYzJlNTk1MDI0Mzk0MzUwOThiNWE2NGVhOWJmYzk4Mi5zZXRDb250ZW50KGh0bWxfODExODZkZTI4MDIxNDM5N2I2MGQ3MmJlNjcyY2U5MjIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNmJjNTJlM2YyZGI2NDNmODhmYTg3OTEzOGY3ZTQ4ZjUuYmluZFBvcHVwKHBvcHVwXzJjMmU1OTUwMjQzOTQzNTA5OGI1YTY0ZWE5YmZjOTgyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzUwZTQ3MmNiMjNiYTRlMWFiNzE0MTkzNDZjNzZlN2Q2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTU4NDYyMjQzMjg4OCwtNzQuMTIxNTY1OTM3NzE4OTZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzUyYzcwMjQ4YzUxNDQ5YThkZTM5N2JiMTFhZTNlZWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMTU0NDMwNWQxNDA1NDRjNDk0MzMxYjkzYjBmMWY2NmQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfY2M4Yjc1MmJlZTMyNDIyNWFiYjVjMDM2YzAzZmI1MzMgPSAkKCc8ZGl2IGlkPSJodG1sX2NjOGI3NTJiZWUzMjQyMjVhYmI1YzAzNmMwM2ZiNTMzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5PYWt3b29kLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xNTQ0MzA1ZDE0MDU0NGM0OTQzMzFiOTNiMGYxZjY2ZC5zZXRDb250ZW50KGh0bWxfY2M4Yjc1MmJlZTMyNDIyNWFiYjVjMDM2YzAzZmI1MzMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNTBlNDcyY2IyM2JhNGUxYWI3MTQxOTM0NmM3NmU3ZDYuYmluZFBvcHVwKHBvcHVwXzE1NDQzMDVkMTQwNTQ0YzQ5NDMzMWI5M2IwZjFmNjZkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2ZkOGE3YWNmN2MxODQ4NjViODE2MjkwYWIzMzdmM2I0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTQ5NDgwMjI4NzEzNjA1LC03NC4xNDkzMjM4MTQ5MDk5Ml0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jNTJjNzAyNDhjNTE0NDlhOGRlMzk3YmIxMWFlM2VlYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hNTk1ODhmZmY5YTk0ZWE4YjhhOWY2NTI4NzBlZDY0YyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jY2ZiNWY3MTU2N2U0NjEzYTA5MmEyOGE1YTA4NjgxMiA9ICQoJzxkaXYgaWQ9Imh0bWxfY2NmYjVmNzE1NjdlNDYxM2EwOTJhMjhhNWEwODY4MTIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkdyZWF0IEtpbGxzLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hNTk1ODhmZmY5YTk0ZWE4YjhhOWY2NTI4NzBlZDY0Yy5zZXRDb250ZW50KGh0bWxfY2NmYjVmNzE1NjdlNDYxM2EwOTJhMjhhNWEwODY4MTIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZmQ4YTdhY2Y3YzE4NDg2NWI4MTYyOTBhYjMzN2YzYjQuYmluZFBvcHVwKHBvcHVwX2E1OTU4OGZmZjlhOTRlYThiOGE5ZjY1Mjg3MGVkNjRjKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2IyZGE5NzNhY2Q5OTRlZjdhNWZjOGNjOTI4M2UwZWI0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTQyMjMwNzQ3NDUwNzQ1LC03NC4xNjQzMzA4MDQxOTM2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2M1MmM3MDI0OGM1MTQ0OWE4ZGUzOTdiYjExYWUzZWVhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2I1MjFlNDQwNzZlMjQ1NjI5NGY2YzdjNzM2YmZjODVkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2VkYTkxZGQyMmY2MTQyYzM5ZDViOWUzZmVhY2Q4NmVlID0gJCgnPGRpdiBpZD0iaHRtbF9lZGE5MWRkMjJmNjE0MmMzOWQ1YjllM2ZlYWNkODZlZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RWx0aW5ndmlsbGUsIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2I1MjFlNDQwNzZlMjQ1NjI5NGY2YzdjNzM2YmZjODVkLnNldENvbnRlbnQoaHRtbF9lZGE5MWRkMjJmNjE0MmMzOWQ1YjllM2ZlYWNkODZlZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9iMmRhOTczYWNkOTk0ZWY3YTVmYzhjYzkyODNlMGViNC5iaW5kUG9wdXAocG9wdXBfYjUyMWU0NDA3NmUyNDU2Mjk0ZjZjN2M3MzZiZmM4NWQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNDMzYTU1YjlhYjJkNGQ5MmEzOWQyMDZhMWY3MDJhMGIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC41MzgxMTQxNzQ3NDUwNywtNzQuMTc4NTQ4NjYxNjU4NzhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzUyYzcwMjQ4YzUxNDQ5YThkZTM5N2JiMTFhZTNlZWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMDI0OGQxYThiMzBlNDQwMjgxMDY1YThlZDM3OTYyMTUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZDEwNjgyZTczNmU5NDI2N2IxZjljM2QwMzNlZTU4YWMgPSAkKCc8ZGl2IGlkPSJodG1sX2QxMDY4MmU3MzZlOTQyNjdiMWY5YzNkMDMzZWU1OGFjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Bbm5hZGFsZSwgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMDI0OGQxYThiMzBlNDQwMjgxMDY1YThlZDM3OTYyMTUuc2V0Q29udGVudChodG1sX2QxMDY4MmU3MzZlOTQyNjdiMWY5YzNkMDMzZWU1OGFjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzQzM2E1NWI5YWIyZDRkOTJhMzlkMjA2YTFmNzAyYTBiLmJpbmRQb3B1cChwb3B1cF8wMjQ4ZDFhOGIzMGU0NDAyODEwNjVhOGVkMzc5NjIxNSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85NWRiODU4YzVjNGY0NGE3YmJiZGY1MTU2NzFmYjA2ZiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjU0MTk2NzYyMjg4ODc1NSwtNzQuMjA1MjQ1ODI0ODAzMjZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzUyYzcwMjQ4YzUxNDQ5YThkZTM5N2JiMTFhZTNlZWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfODc4Y2RkYjVlOWY4NGZjMjlkMTJjMzcwMDA0MGMxNTUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYWNiZjU2ZWYwMDRmNDA5NThhNzA4ZTM0ZDE1ZmMwZjQgPSAkKCc8ZGl2IGlkPSJodG1sX2FjYmY1NmVmMDA0ZjQwOTU4YTcwOGUzNGQxNWZjMGY0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Xb29kcm93LCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84NzhjZGRiNWU5Zjg0ZmMyOWQxMmMzNzAwMDQwYzE1NS5zZXRDb250ZW50KGh0bWxfYWNiZjU2ZWYwMDRmNDA5NThhNzA4ZTM0ZDE1ZmMwZjQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOTVkYjg1OGM1YzRmNDRhN2JiYmRmNTE1NjcxZmIwNmYuYmluZFBvcHVwKHBvcHVwXzg3OGNkZGI1ZTlmODRmYzI5ZDEyYzM3MDAwNDBjMTU1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzc4MjhmMWVjMDA0NjQ1NDQ5MjRlYzgzNDMwMjYwODY2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTA1MzMzNzYxMTU2NDIsLTc0LjI0NjU2OTM0MjM1MjgzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2M1MmM3MDI0OGM1MTQ0OWE4ZGUzOTdiYjExYWUzZWVhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2RmNDM1ZDE0ODk1OTQ5MWY4OTg0YWQ4N2IyOGIwZDU3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzJhOTcxOGI3NDk0YjQ3YzY4NmY5MWM1MDhkOGVkMDQwID0gJCgnPGRpdiBpZD0iaHRtbF8yYTk3MThiNzQ5NGI0N2M2ODZmOTFjNTA4ZDhlZDA0MCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+VG90dGVudmlsbGUsIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2RmNDM1ZDE0ODk1OTQ5MWY4OTg0YWQ4N2IyOGIwZDU3LnNldENvbnRlbnQoaHRtbF8yYTk3MThiNzQ5NGI0N2M2ODZmOTFjNTA4ZDhlZDA0MCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl83ODI4ZjFlYzAwNDY0NTQ0OTI0ZWM4MzQzMDI2MDg2Ni5iaW5kUG9wdXAocG9wdXBfZGY0MzVkMTQ4OTU5NDkxZjg5ODRhZDg3YjI4YjBkNTcpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMTQyNGM4NjQ3OGUwNDM1OGJiOGQ0MmY1MTdmNjQ5MWMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42MzczMTYwNjcxMTAzMjYsLTc0LjA4MDU1MzUxNzkwMTE1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2M1MmM3MDI0OGM1MTQ0OWE4ZGUzOTdiYjExYWUzZWVhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2ZiZTJhZWE4MmE4MTRlZDI5Y2YzZTQ1NDJhMmQ5ZGIzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2RiZDYyYjRkMjllZjRkOTM5YjMzZTgzNzkwZjNiMWI1ID0gJCgnPGRpdiBpZD0iaHRtbF9kYmQ2MmI0ZDI5ZWY0ZDkzOWIzM2U4Mzc5MGYzYjFiNSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+VG9tcGtpbnN2aWxsZSwgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZmJlMmFlYTgyYTgxNGVkMjljZjNlNDU0MmEyZDlkYjMuc2V0Q29udGVudChodG1sX2RiZDYyYjRkMjllZjRkOTM5YjMzZTgzNzkwZjNiMWI1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzE0MjRjODY0NzhlMDQzNThiYjhkNDJmNTE3ZjY0OTFjLmJpbmRQb3B1cChwb3B1cF9mYmUyYWVhODJhODE0ZWQyOWNmM2U0NTQyYTJkOWRiMyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9kNzcwOGM4NDg2NmQ0Njk4YjdjODdlNGNkZjJkOWFiMCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjYxOTE5MzEwNzkyNjc2LC03NC4wOTYyOTAyOTIzNTQ1OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jNTJjNzAyNDhjNTE0NDlhOGRlMzk3YmIxMWFlM2VlYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wNjZkZDIzYWE2Yzg0ZGIxOTkwNTI5YzQ1ZDhmMmQ3MyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83N2VjNmI5YjgwYzM0ODdjYmJkMGI2YzFkNGI5NzZhNSA9ICQoJzxkaXYgaWQ9Imh0bWxfNzdlYzZiOWI4MGMzNDg3Y2JiZDBiNmMxZDRiOTc2YTUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlNpbHZlciBMYWtlLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wNjZkZDIzYWE2Yzg0ZGIxOTkwNTI5YzQ1ZDhmMmQ3My5zZXRDb250ZW50KGh0bWxfNzdlYzZiOWI4MGMzNDg3Y2JiZDBiNmMxZDRiOTc2YTUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZDc3MDhjODQ4NjZkNDY5OGI3Yzg3ZTRjZGYyZDlhYjAuYmluZFBvcHVwKHBvcHVwXzA2NmRkMjNhYTZjODRkYjE5OTA1MjljNDVkOGYyZDczKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2FjZjQ0NjNmNjE5NTQwYzJiOTlhZGE3MDkxZTkwZjBmID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjEyNzYwMTU3NTY0ODksLTc0LjA5NzEyNTUyMTc4NTNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzUyYzcwMjQ4YzUxNDQ5YThkZTM5N2JiMTFhZTNlZWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMWU0M2ExMDA2MTY3NGFhNGEyMGM5NTBjYTEyMmEyNmUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOTM3NTk0MDJjOWU5NDE0NmE2MDVlYTY0YjViZmFiZmQgPSAkKCc8ZGl2IGlkPSJodG1sXzkzNzU5NDAyYzllOTQxNDZhNjA1ZWE2NGI1YmZhYmZkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5TdW5ueXNpZGUsIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzFlNDNhMTAwNjE2NzRhYTRhMjBjOTUwY2ExMjJhMjZlLnNldENvbnRlbnQoaHRtbF85Mzc1OTQwMmM5ZTk0MTQ2YTYwNWVhNjRiNWJmYWJmZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9hY2Y0NDYzZjYxOTU0MGMyYjk5YWRhNzA5MWU5MGYwZi5iaW5kUG9wdXAocG9wdXBfMWU0M2ExMDA2MTY3NGFhNGEyMGM5NTBjYTEyMmEyNmUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNDFjZWY4OGZlZTBjNGMxMDlhZDhmYTA5OWVjYThkNDYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42NDM2NzUxODMzNDA5NzQsLTczLjk2MTAxMzEyNDY2Nzc5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2M1MmM3MDI0OGM1MTQ0OWE4ZGUzOTdiYjExYWUzZWVhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2RkMWI3ZDdiMDE2ZDRiY2U4ZjdlZmUwMDU3NmJiYjM5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzEzOGU4ODU1MzdkZTRhNmNhY2EzN2UzMTg4OTA5NzA1ID0gJCgnPGRpdiBpZD0iaHRtbF8xMzhlODg1NTM3ZGU0YTZjYWNhMzdlMzE4ODkwOTcwNSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RGl0bWFzIFBhcmssIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kZDFiN2Q3YjAxNmQ0YmNlOGY3ZWZlMDA1NzZiYmIzOS5zZXRDb250ZW50KGh0bWxfMTM4ZTg4NTUzN2RlNGE2Y2FjYTM3ZTMxODg5MDk3MDUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNDFjZWY4OGZlZTBjNGMxMDlhZDhmYTA5OWVjYThkNDYuYmluZFBvcHVwKHBvcHVwX2RkMWI3ZDdiMDE2ZDRiY2U4ZjdlZmUwMDU3NmJiYjM5KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzMxYmZjNTBjMTE0ZjQ3YjVhMjM3NDUxN2E4YmIzMjQwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjYwOTQ2NTYxODgxMTEsLTczLjkzNzE4NjgwNTU5MzE0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2M1MmM3MDI0OGM1MTQ0OWE4ZGUzOTdiYjExYWUzZWVhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2JlODkxMjA5YmNkODRhZGY4MjRmOTVmNWQwNTVkMTcyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2E3ZmRlNzJkMmJhMTRiZTc5ZGM0OGZiM2YxZDg0YWU5ID0gJCgnPGRpdiBpZD0iaHRtbF9hN2ZkZTcyZDJiYTE0YmU3OWRjNDhmYjNmMWQ4NGFlOSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+V2luZ2F0ZSwgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2JlODkxMjA5YmNkODRhZGY4MjRmOTVmNWQwNTVkMTcyLnNldENvbnRlbnQoaHRtbF9hN2ZkZTcyZDJiYTE0YmU3OWRjNDhmYjNmMWQ4NGFlOSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8zMWJmYzUwYzExNGY0N2I1YTIzNzQ1MTdhOGJiMzI0MC5iaW5kUG9wdXAocG9wdXBfYmU4OTEyMDliY2Q4NGFkZjgyNGY5NWY1ZDA1NWQxNzIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfY2MxMzc4MDNhYzgyNDViYWExZGI5ZTU2YjNlNWY1ODUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42NTU1NzIzMTMyODA3NjQsLTczLjkyNjg4MjEyNjE2OTU1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2M1MmM3MDI0OGM1MTQ0OWE4ZGUzOTdiYjExYWUzZWVhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzE4M2VkNmM2NTVlYTQ0MzQ4NDBiYTcxYjRiM2UxMzcxID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzMwYWNhMTAxNTQwZjQxODM5Y2JkNTA0Y2Q0NWJlZDU4ID0gJCgnPGRpdiBpZD0iaHRtbF8zMGFjYTEwMTU0MGY0MTgzOWNiZDUwNGNkNDViZWQ1OCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UnVnYnksIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xODNlZDZjNjU1ZWE0NDM0ODQwYmE3MWI0YjNlMTM3MS5zZXRDb250ZW50KGh0bWxfMzBhY2ExMDE1NDBmNDE4MzljYmQ1MDRjZDQ1YmVkNTgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfY2MxMzc4MDNhYzgyNDViYWExZGI5ZTU2YjNlNWY1ODUuYmluZFBvcHVwKHBvcHVwXzE4M2VkNmM2NTVlYTQ0MzQ4NDBiYTcxYjRiM2UxMzcxKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2MzMTY2YTA4MTY2NDQ0MDI5MzZmYjJiOWVhNGYyYzhlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjA5MTkwNDQ0MzQ1NTgsLTc0LjA4MDE1NzM0OTM2Mjk2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2M1MmM3MDI0OGM1MTQ0OWE4ZGUzOTdiYjExYWUzZWVhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzZkYTIyYjc0ZjM5YzRiMDdhODc0NzFkOTdlYWFhNTk5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzljNTQ0OGNjMzg0YTRmZjNiZmQzMmZmMzdkNmMyMDZhID0gJCgnPGRpdiBpZD0iaHRtbF85YzU0NDhjYzM4NGE0ZmYzYmZkMzJmZjM3ZDZjMjA2YSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UGFyayBIaWxsLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82ZGEyMmI3NGYzOWM0YjA3YTg3NDcxZDk3ZWFhYTU5OS5zZXRDb250ZW50KGh0bWxfOWM1NDQ4Y2MzODRhNGZmM2JmZDMyZmYzN2Q2YzIwNmEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYzMxNjZhMDgxNjY0NDQwMjkzNmZiMmI5ZWE0ZjJjOGUuYmluZFBvcHVwKHBvcHVwXzZkYTIyYjc0ZjM5YzRiMDdhODc0NzFkOTdlYWFhNTk5KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2UwZTFiYjFjNDk1ODQzMThiYjU4ZTYwNDU5NGZlMzZlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjIxMDkwNDcyNzU0MDksLTc0LjEzMzA0MTQzOTUxNzA0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2M1MmM3MDI0OGM1MTQ0OWE4ZGUzOTdiYjExYWUzZWVhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2I4NmNmYzE3N2M5MTRiYWM4MTE4MzcyYzg2YTY4ZDViID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2M0ZTM3NDZhODEyODRjNjA4YjM2NzBkMTU5YjhiNTEzID0gJCgnPGRpdiBpZD0iaHRtbF9jNGUzNzQ2YTgxMjg0YzYwOGIzNjcwZDE1OWI4YjUxMyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+V2VzdGVybGVpZ2gsIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2I4NmNmYzE3N2M5MTRiYWM4MTE4MzcyYzg2YTY4ZDViLnNldENvbnRlbnQoaHRtbF9jNGUzNzQ2YTgxMjg0YzYwOGIzNjcwZDE1OWI4YjUxMyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9lMGUxYmIxYzQ5NTg0MzE4YmI1OGU2MDQ1OTRmZTM2ZS5iaW5kUG9wdXAocG9wdXBfYjg2Y2ZjMTc3YzkxNGJhYzgxMTgzNzJjODZhNjhkNWIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYzk4ZmEwODAzMGIxNGU0Yzg3MGI2ODQ1Y2UyZDEyMjcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42MjAxNzE1MTIyMzE4ODQsLTc0LjE1MzE1MjQ2Mzg3NzYyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2M1MmM3MDI0OGM1MTQ0OWE4ZGUzOTdiYjExYWUzZWVhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2FhMDg0YTM1M2Y1ZTQ3ZjlhMDhhYjM0ZjNkYmFmZDRjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzA1Y2U3OTE3MThmODRlMGU4NTY0MjlkYzBiNDM2ZGMzID0gJCgnPGRpdiBpZD0iaHRtbF8wNWNlNzkxNzE4Zjg0ZTBlODU2NDI5ZGMwYjQzNmRjMyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+R3Jhbml0ZXZpbGxlLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hYTA4NGEzNTNmNWU0N2Y5YTA4YWIzNGYzZGJhZmQ0Yy5zZXRDb250ZW50KGh0bWxfMDVjZTc5MTcxOGY4NGUwZTg1NjQyOWRjMGI0MzZkYzMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYzk4ZmEwODAzMGIxNGU0Yzg3MGI2ODQ1Y2UyZDEyMjcuYmluZFBvcHVwKHBvcHVwX2FhMDg0YTM1M2Y1ZTQ3ZjlhMDhhYjM0ZjNkYmFmZDRjKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2VmMzA0MTJmNGQ3YTQ3OWJhNzdhZWRlMmJmZTU1YmQ4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjM1MzI1MDk5MTE0OTIsLTc0LjE2NTEwNDIwMjQxMTI0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2M1MmM3MDI0OGM1MTQ0OWE4ZGUzOTdiYjExYWUzZWVhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzYyYjFiZDYyNGMzNTQwNTA4YWQyYjI1YjUzYTc1NWU1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzMwNjU2ZWY3ODQyNjRlZjViZTQ4NWFiZTc4OWE0ZTA1ID0gJCgnPGRpdiBpZD0iaHRtbF8zMDY1NmVmNzg0MjY0ZWY1YmU0ODVhYmU3ODlhNGUwNSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QXJsaW5ndG9uLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82MmIxYmQ2MjRjMzU0MDUwOGFkMmIyNWI1M2E3NTVlNS5zZXRDb250ZW50KGh0bWxfMzA2NTZlZjc4NDI2NGVmNWJlNDg1YWJlNzg5YTRlMDUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZWYzMDQxMmY0ZDdhNDc5YmE3N2FlZGUyYmZlNTViZDguYmluZFBvcHVwKHBvcHVwXzYyYjFiZDYyNGMzNTQwNTA4YWQyYjI1YjUzYTc1NWU1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzM3NGJmZTlmMGM1ODQwY2NiMmE1ZTU1NGQ2N2IwZmFiID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTk2MzEyNTcxMjc2NzM0LC03NC4wNjcxMjM2MzIyNTU3NF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jNTJjNzAyNDhjNTE0NDlhOGRlMzk3YmIxMWFlM2VlYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF84ZTg4OTYzZDEzYjk0YTgyOTBjMmM2MGRkOGRiOTI1ZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jZWQ5ZWVmNDQxOWU0ZDY2OGEyNGMyZmQwNWZmNTYwOCA9ICQoJzxkaXYgaWQ9Imh0bWxfY2VkOWVlZjQ0MTllNGQ2NjhhMjRjMmZkMDVmZjU2MDgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkFycm9jaGFyLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84ZTg4OTYzZDEzYjk0YTgyOTBjMmM2MGRkOGRiOTI1ZC5zZXRDb250ZW50KGh0bWxfY2VkOWVlZjQ0MTllNGQ2NjhhMjRjMmZkMDVmZjU2MDgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMzc0YmZlOWYwYzU4NDBjY2IyYTVlNTU0ZDY3YjBmYWIuYmluZFBvcHVwKHBvcHVwXzhlODg5NjNkMTNiOTRhODI5MGMyYzYwZGQ4ZGI5MjVkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzlkZjRhYTMxYzI5YzRkM2Y4YTcxMjM2ZDY4YTBjNTUwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTk4MjY4MzU5NTk5OTEsLTc0LjA3NjY3NDM2Mjc5MDVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzUyYzcwMjQ4YzUxNDQ5YThkZTM5N2JiMTFhZTNlZWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZmJhMjEzMWYyMzM1NDBjODk0NTlmNzIxZjEyNmM1ODcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYTllNWJkYzE4ZDM3NGFlY2I4MGMzNGY1MGIxN2E4YmMgPSAkKCc8ZGl2IGlkPSJodG1sX2E5ZTViZGMxOGQzNzRhZWNiODBjMzRmNTBiMTdhOGJjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5HcmFzbWVyZSwgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZmJhMjEzMWYyMzM1NDBjODk0NTlmNzIxZjEyNmM1ODcuc2V0Q29udGVudChodG1sX2E5ZTViZGMxOGQzNzRhZWNiODBjMzRmNTBiMTdhOGJjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzlkZjRhYTMxYzI5YzRkM2Y4YTcxMjM2ZDY4YTBjNTUwLmJpbmRQb3B1cChwb3B1cF9mYmEyMTMxZjIzMzU0MGM4OTQ1OWY3MjFmMTI2YzU4Nyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85MjIxNjFlMDA2OGU0MjFjYmE5MTRhMmY2OTM2YmJjZiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjU5NjMyODkxMzc5NTEzLC03NC4wODc1MTExODAwNTU3OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jNTJjNzAyNDhjNTE0NDlhOGRlMzk3YmIxMWFlM2VlYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iMjg0YzExYjNjMTE0YjA5YjMxZTU2OWIwMzBjMDQ2OCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8yYjAyOTBlMDZkOTY0ODFjOTkyYjQzNjFlN2JkOThkMCA9ICQoJzxkaXYgaWQ9Imh0bWxfMmIwMjkwZTA2ZDk2NDgxYzk5MmI0MzYxZTdiZDk4ZDAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk9sZCBUb3duLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iMjg0YzExYjNjMTE0YjA5YjMxZTU2OWIwMzBjMDQ2OC5zZXRDb250ZW50KGh0bWxfMmIwMjkwZTA2ZDk2NDgxYzk5MmI0MzYxZTdiZDk4ZDApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOTIyMTYxZTAwNjhlNDIxY2JhOTE0YTJmNjkzNmJiY2YuYmluZFBvcHVwKHBvcHVwX2IyODRjMTFiM2MxMTRiMDliMzFlNTY5YjAzMGMwNDY4KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzVkMTU1NWY2OTJlNzQwODVhN2I1Mjc5NjQ2NWQ1MDgwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTg4NjcyOTQ4MTk5Mjc1LC03NC4wOTYzOTkwNTMxMjUyMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jNTJjNzAyNDhjNTE0NDlhOGRlMzk3YmIxMWFlM2VlYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iMzJkZmM5MmYwNzA0YjE4YTA3MjdmZjJlZDAyMTJlNSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jZGI4YjI2NWQzZTQ0NmRjOGYxZmZjNGI5NTQ0ZTVjNiA9ICQoJzxkaXYgaWQ9Imh0bWxfY2RiOGIyNjVkM2U0NDZkYzhmMWZmYzRiOTU0NGU1YzYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkRvbmdhbiBIaWxscywgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYjMyZGZjOTJmMDcwNGIxOGEwNzI3ZmYyZWQwMjEyZTUuc2V0Q29udGVudChodG1sX2NkYjhiMjY1ZDNlNDQ2ZGM4ZjFmZmM0Yjk1NDRlNWM2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzVkMTU1NWY2OTJlNzQwODVhN2I1Mjc5NjQ2NWQ1MDgwLmJpbmRQb3B1cChwb3B1cF9iMzJkZmM5MmYwNzA0YjE4YTA3MjdmZjJlZDAyMTJlNSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9kZWJjMWZjNWE4NzE0Mjk1ODhmOTYyMjhkYWY4ZWQ2NCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjU3MzUyNjkwNTc0MjgzLC03NC4wOTM0ODI2NjMwMzU5MV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jNTJjNzAyNDhjNTE0NDlhOGRlMzk3YmIxMWFlM2VlYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF81MzYxNzFkZTJlYTI0Y2U5OTQwMTU5YzI5MTc0MTFiMiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hNDQwYTM5M2Y0YWI0YThlOTZkZjE4YWNmYWY5ZGE0YSA9ICQoJzxkaXYgaWQ9Imh0bWxfYTQ0MGEzOTNmNGFiNGE4ZTk2ZGYxOGFjZmFmOWRhNGEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk1pZGxhbmQgQmVhY2gsIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzUzNjE3MWRlMmVhMjRjZTk5NDAxNTljMjkxNzQxMWIyLnNldENvbnRlbnQoaHRtbF9hNDQwYTM5M2Y0YWI0YThlOTZkZjE4YWNmYWY5ZGE0YSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9kZWJjMWZjNWE4NzE0Mjk1ODhmOTYyMjhkYWY4ZWQ2NC5iaW5kUG9wdXAocG9wdXBfNTM2MTcxZGUyZWEyNGNlOTk0MDE1OWMyOTE3NDExYjIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYTA3ODUzY2JmMTY4NDExM2JmMjYzOWIwMmIwODZjMzQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC41NzYyMTU1ODcxMTc4OCwtNzQuMTA1ODU1OTg1NDU0MzRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzUyYzcwMjQ4YzUxNDQ5YThkZTM5N2JiMTFhZTNlZWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZTc3M2M1ZTQxYTBiNDI5YjhlNjJlOTk2OGVlYWZkNjIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZDNiYjdmODVkMjNkNDFhZWFjOTJmZjY2YTFlNGM1ZTIgPSAkKCc8ZGl2IGlkPSJodG1sX2QzYmI3Zjg1ZDIzZDQxYWVhYzkyZmY2NmExZTRjNWUyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5HcmFudCBDaXR5LCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lNzczYzVlNDFhMGI0MjliOGU2MmU5OTY4ZWVhZmQ2Mi5zZXRDb250ZW50KGh0bWxfZDNiYjdmODVkMjNkNDFhZWFjOTJmZjY2YTFlNGM1ZTIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYTA3ODUzY2JmMTY4NDExM2JmMjYzOWIwMmIwODZjMzQuYmluZFBvcHVwKHBvcHVwX2U3NzNjNWU0MWEwYjQyOWI4ZTYyZTk5NjhlZWFmZDYyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzc2Mjc3ODZmOTMwYzQ2MGViNGYxMGNhOTcxNGEwZmNhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTY0MjU1NDkzMDczMzUsLTc0LjEwNDMyNzA3NDY5MTI0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2M1MmM3MDI0OGM1MTQ0OWE4ZGUzOTdiYjExYWUzZWVhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2M1N2NhMDIxZjZmNDRkYTc4YjE3YTk3NmNhZGZlMzYyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzhlYjkwOWYyZjJhZTRiYjA5NDY1N2Y4ZmJiZmNmYzk4ID0gJCgnPGRpdiBpZD0iaHRtbF84ZWI5MDlmMmYyYWU0YmIwOTQ2NTdmOGZiYmZjZmM5OCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TmV3IERvcnAgQmVhY2gsIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2M1N2NhMDIxZjZmNDRkYTc4YjE3YTk3NmNhZGZlMzYyLnNldENvbnRlbnQoaHRtbF84ZWI5MDlmMmYyYWU0YmIwOTQ2NTdmOGZiYmZjZmM5OCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl83NjI3Nzg2ZjkzMGM0NjBlYjRmMTBjYTk3MTRhMGZjYS5iaW5kUG9wdXAocG9wdXBfYzU3Y2EwMjFmNmY0NGRhNzhiMTdhOTc2Y2FkZmUzNjIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYTNhODg5YTdlNDdjNGVkYzllMzAxZGZhNTU3ZTc3ZTUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC41NTM5ODgwMDg1ODQ2MiwtNzQuMTM5MTY2MjIxNzU3NjhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzUyYzcwMjQ4YzUxNDQ5YThkZTM5N2JiMTFhZTNlZWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZGZjYTg0ZTBiOGZjNDQ0YmIzODk4YjVhMjhjMGZlODYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNTFiNTA4MGYzODQyNGQ0ZWJiNmU1ZGJlMjI0Y2ZmYTEgPSAkKCc8ZGl2IGlkPSJodG1sXzUxYjUwODBmMzg0MjRkNGViYjZlNWRiZTIyNGNmZmExIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5CYXkgVGVycmFjZSwgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZGZjYTg0ZTBiOGZjNDQ0YmIzODk4YjVhMjhjMGZlODYuc2V0Q29udGVudChodG1sXzUxYjUwODBmMzg0MjRkNGViYjZlNWRiZTIyNGNmZmExKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2EzYTg4OWE3ZTQ3YzRlZGM5ZTMwMWRmYTU1N2U3N2U1LmJpbmRQb3B1cChwb3B1cF9kZmNhODRlMGI4ZmM0NDRiYjM4OThiNWEyOGMwZmU4Nik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl82ZWVhYWUwN2VjN2Y0YjJhYmI0NWU4N2VkYjZhYWVlNSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjUzMTkxMTkyMDQ4OTYwNSwtNzQuMTkxNzQxMDU3NDc4MTRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzUyYzcwMjQ4YzUxNDQ5YThkZTM5N2JiMTFhZTNlZWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMTc0MTY3ZmIzN2FmNGQwMDk0YTQ5YzkxNDM2YThhMWUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNDBmNTBiY2M1ODA3NDYxY2FlOWVkOGJhYjA1OTQxMGEgPSAkKCc8ZGl2IGlkPSJodG1sXzQwZjUwYmNjNTgwNzQ2MWNhZTllZDhiYWIwNTk0MTBhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5IdWd1ZW5vdCwgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMTc0MTY3ZmIzN2FmNGQwMDk0YTQ5YzkxNDM2YThhMWUuc2V0Q29udGVudChodG1sXzQwZjUwYmNjNTgwNzQ2MWNhZTllZDhiYWIwNTk0MTBhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzZlZWFhZTA3ZWM3ZjRiMmFiYjQ1ZTg3ZWRiNmFhZWU1LmJpbmRQb3B1cChwb3B1cF8xNzQxNjdmYjM3YWY0ZDAwOTRhNDljOTE0MzZhOGExZSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8yNTI3MGIwZGVlMTQ0YWE0YTE4ZTM2MDE0M2ZkMDMyOCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjUyNDY5OTM3NjExODEzNiwtNzQuMjE5ODMxMDY2MTY3NzddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzUyYzcwMjQ4YzUxNDQ5YThkZTM5N2JiMTFhZTNlZWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYjc5NjllN2FhMWVkNDY2Zjg5ZTMxMTU0M2I2YzE2ZjEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfY2Y3MjY3ZTk5NGExNDhkYTg3NTZiN2NjZGFmNDBjNzYgPSAkKCc8ZGl2IGlkPSJodG1sX2NmNzI2N2U5OTRhMTQ4ZGE4NzU2YjdjY2RhZjQwYzc2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5QbGVhc2FudCBQbGFpbnMsIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2I3OTY5ZTdhYTFlZDQ2NmY4OWUzMTE1NDNiNmMxNmYxLnNldENvbnRlbnQoaHRtbF9jZjcyNjdlOTk0YTE0OGRhODc1NmI3Y2NkYWY0MGM3Nik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8yNTI3MGIwZGVlMTQ0YWE0YTE4ZTM2MDE0M2ZkMDMyOC5iaW5kUG9wdXAocG9wdXBfYjc5NjllN2FhMWVkNDY2Zjg5ZTMxMTU0M2I2YzE2ZjEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfN2JiNjgyYjMzNTIzNDA0NTllZDUzNzgxNDE2MGUzZGQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC41MDYwODE2NTM0NjMwNSwtNzQuMjI5NTAzNTAyNjAwMjddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzUyYzcwMjQ4YzUxNDQ5YThkZTM5N2JiMTFhZTNlZWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfODg5NDk2OTNjNTMwNGUyMTg2NzUzYmQ4ZjM1ZTFmMzUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMGU1NTdkNDEwMjk4NGJjN2E5NmQxOGM0NDI5MDhlMjQgPSAkKCc8ZGl2IGlkPSJodG1sXzBlNTU3ZDQxMDI5ODRiYzdhOTZkMThjNDQyOTA4ZTI0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5CdXRsZXIgTWFub3IsIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzg4OTQ5NjkzYzUzMDRlMjE4Njc1M2JkOGYzNWUxZjM1LnNldENvbnRlbnQoaHRtbF8wZTU1N2Q0MTAyOTg0YmM3YTk2ZDE4YzQ0MjkwOGUyNCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl83YmI2ODJiMzM1MjM0MDQ1OWVkNTM3ODE0MTYwZTNkZC5iaW5kUG9wdXAocG9wdXBfODg5NDk2OTNjNTMwNGUyMTg2NzUzYmQ4ZjM1ZTFmMzUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMjMzNDE1Y2M0OWZkNDdhYzk0NGMyOTIzMmFhNDMzMDEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC41MzA1MzE0ODI4MzMxNCwtNzQuMjMyMTU3NzU4OTY1MjZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzUyYzcwMjQ4YzUxNDQ5YThkZTM5N2JiMTFhZTNlZWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYTg2NGUwZGMwMWRiNGQyZjljMmVjN2RmN2FlODE0YTYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMDE0MWNhYmE0ODFkNDA0Nzk1NTY1MjMyNjY1ZjFhN2MgPSAkKCc8ZGl2IGlkPSJodG1sXzAxNDFjYWJhNDgxZDQwNDc5NTU2NTIzMjY2NWYxYTdjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DaGFybGVzdG9uLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hODY0ZTBkYzAxZGI0ZDJmOWMyZWM3ZGY3YWU4MTRhNi5zZXRDb250ZW50KGh0bWxfMDE0MWNhYmE0ODFkNDA0Nzk1NTY1MjMyNjY1ZjFhN2MpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMjMzNDE1Y2M0OWZkNDdhYzk0NGMyOTIzMmFhNDMzMDEuYmluZFBvcHVwKHBvcHVwX2E4NjRlMGRjMDFkYjRkMmY5YzJlYzdkZjdhZTgxNGE2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2QzOThhMTUxYjFmMzRmYWNiYWUxZTBlMDhkYzhmZDM4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTQ5NDA0MDA2NTAwNzIsLTc0LjIxNTcyODUxMTEzOTUyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2M1MmM3MDI0OGM1MTQ0OWE4ZGUzOTdiYjExYWUzZWVhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzYyMjc2MDU3MjljYzQ5OTRiNDQ0MzU0YjRmZDZmYTUzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2E0ZWU3MmZkMDAwMjRiYzc5N2MzMTIwNzU3NGQwZGQ4ID0gJCgnPGRpdiBpZD0iaHRtbF9hNGVlNzJmZDAwMDI0YmM3OTdjMzEyMDc1NzRkMGRkOCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Um9zc3ZpbGxlLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82MjI3NjA1NzI5Y2M0OTk0YjQ0NDM1NGI0ZmQ2ZmE1My5zZXRDb250ZW50KGh0bWxfYTRlZTcyZmQwMDAyNGJjNzk3YzMxMjA3NTc0ZDBkZDgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZDM5OGExNTFiMWYzNGZhY2JhZTFlMGUwOGRjOGZkMzguYmluZFBvcHVwKHBvcHVwXzYyMjc2MDU3MjljYzQ5OTRiNDQ0MzU0YjRmZDZmYTUzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzQ3YjZmMjAxZDQyMTRiOTA5Y2NjZWM5ZGYxNWY0YzFlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTQ5Mjg1ODIyNzgzMjEsLTc0LjE4NTg4Njc0NTgzODkzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2M1MmM3MDI0OGM1MTQ0OWE4ZGUzOTdiYjExYWUzZWVhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2Y2NjZjYmU3MGQ4MjRjYjhiOTYwNjIzMTg3MWQxY2E3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzNkNzM3OGUyMGYyODQxZWM4MmQ3MzQ0ZTY1NTUzNDk3ID0gJCgnPGRpdiBpZD0iaHRtbF8zZDczNzhlMjBmMjg0MWVjODJkNzM0NGU2NTU1MzQ5NyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QXJkZW4gSGVpZ2h0cywgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZjY2NmNiZTcwZDgyNGNiOGI5NjA2MjMxODcxZDFjYTcuc2V0Q29udGVudChodG1sXzNkNzM3OGUyMGYyODQxZWM4MmQ3MzQ0ZTY1NTUzNDk3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzQ3YjZmMjAxZDQyMTRiOTA5Y2NjZWM5ZGYxNWY0YzFlLmJpbmRQb3B1cChwb3B1cF9mNjY2Y2JlNzBkODI0Y2I4Yjk2MDYyMzE4NzFkMWNhNyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mNGUzYmYwYTc5MjU0ZWIwYTlmNTkyYjBiMmYyODQ1MyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjU1NTI5NTIzNjE3MzE5NCwtNzQuMTcwNzk0MTQ3ODYwOTJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzUyYzcwMjQ4YzUxNDQ5YThkZTM5N2JiMTFhZTNlZWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNjQ3MjQ0ODBkMTJhNGNiM2EyNDBlOGUyMjg1Nzk2MTAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYTE1Njg0NGRjOWVkNDlmNWJmN2M2MmY4MGY2YzY0N2YgPSAkKCc8ZGl2IGlkPSJodG1sX2ExNTY4NDRkYzllZDQ5ZjViZjdjNjJmODBmNmM2NDdmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5HcmVlbnJpZGdlLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82NDcyNDQ4MGQxMmE0Y2IzYTI0MGU4ZTIyODU3OTYxMC5zZXRDb250ZW50KGh0bWxfYTE1Njg0NGRjOWVkNDlmNWJmN2M2MmY4MGY2YzY0N2YpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZjRlM2JmMGE3OTI1NGViMGE5ZjU5MmIwYjJmMjg0NTMuYmluZFBvcHVwKHBvcHVwXzY0NzI0NDgwZDEyYTRjYjNhMjQwZThlMjI4NTc5NjEwKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzY5NzZjN2U4MzQ3ZjRmMjdhZDEwN2MxYTE4YTMzYzc4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTg5MTM4OTQ4NzUyODEsLTc0LjE1OTAyMjA4MTU2NjAxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2M1MmM3MDI0OGM1MTQ0OWE4ZGUzOTdiYjExYWUzZWVhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2E2ZGQwODY4ZjNkYjRhZWNhMzBjYTc2M2ZiOWU2M2NlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzkyNzE4ZGU0ODZjYTQwODU5NzgxZjRiYzRhZjgyN2I3ID0gJCgnPGRpdiBpZD0iaHRtbF85MjcxOGRlNDg2Y2E0MDg1OTc4MWY0YmM0YWY4MjdiNyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+SGVhcnRsYW5kIFZpbGxhZ2UsIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2E2ZGQwODY4ZjNkYjRhZWNhMzBjYTc2M2ZiOWU2M2NlLnNldENvbnRlbnQoaHRtbF85MjcxOGRlNDg2Y2E0MDg1OTc4MWY0YmM0YWY4MjdiNyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl82OTc2YzdlODM0N2Y0ZjI3YWQxMDdjMWExOGEzM2M3OC5iaW5kUG9wdXAocG9wdXBfYTZkZDA4NjhmM2RiNGFlY2EzMGNhNzYzZmI5ZTYzY2UpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOTc4ODU1OGY0YjFkNGFiNmFiMTQ4MjgwMjFjMzQyOTAgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC41OTQ3MjYwMjc0NjI5NSwtNzQuMTg5NTYwNDU1MTk2OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jNTJjNzAyNDhjNTE0NDlhOGRlMzk3YmIxMWFlM2VlYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85M2U1ZDI5NmE2NTE0ZDFjYjVhNjdiOTUwNjZmMzc2MiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xMzEyNjY0OTBmYzg0YjJjYmY3OWUwODAxNDIyNGRjNCA9ICQoJzxkaXYgaWQ9Imh0bWxfMTMxMjY2NDkwZmM4NGIyY2JmNzllMDgwMTQyMjRkYzQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNoZWxzZWEsIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzkzZTVkMjk2YTY1MTRkMWNiNWE2N2I5NTA2NmYzNzYyLnNldENvbnRlbnQoaHRtbF8xMzEyNjY0OTBmYzg0YjJjYmY3OWUwODAxNDIyNGRjNCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl85Nzg4NTU4ZjRiMWQ0YWI2YWIxNDgyODAyMWMzNDI5MC5iaW5kUG9wdXAocG9wdXBfOTNlNWQyOTZhNjUxNGQxY2I1YTY3Yjk1MDY2ZjM3NjIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZDkxZjMzOWI1ODY0NGU0ZGI2OGE5MGUxMWM4YTMxMmYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42MDU3Nzg2ODQ1MjM1OCwtNzQuMTg3MjU2MzgzODE1NjddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzUyYzcwMjQ4YzUxNDQ5YThkZTM5N2JiMTFhZTNlZWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMWExYThhNTdlYjhjNGExNjlmNjIxZDZmMWQ0NzhjOGQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNmM5ODJhMDFjZmY3NDcwZjk4NmQzNTUzYjYwYjQwZDkgPSAkKCc8ZGl2IGlkPSJodG1sXzZjOTgyYTAxY2ZmNzQ3MGY5ODZkMzU1M2I2MGI0MGQ5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5CbG9vbWZpZWxkLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xYTFhOGE1N2ViOGM0YTE2OWY2MjFkNmYxZDQ3OGM4ZC5zZXRDb250ZW50KGh0bWxfNmM5ODJhMDFjZmY3NDcwZjk4NmQzNTUzYjYwYjQwZDkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZDkxZjMzOWI1ODY0NGU0ZGI2OGE5MGUxMWM4YTMxMmYuYmluZFBvcHVwKHBvcHVwXzFhMWE4YTU3ZWI4YzRhMTY5ZjYyMWQ2ZjFkNDc4YzhkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzI4MTIwYjc0YjlhMzQ0ZmZiNWI3ZmEzYTczYWZjN2ZjID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjA5NTkxODAwNDIwMywtNzQuMTU5NDA5NDg2NTcxMjJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzUyYzcwMjQ4YzUxNDQ5YThkZTM5N2JiMTFhZTNlZWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZTI1NTliMDAxOGU2NDI1MmJlMzk5N2RlMDhhNjU0MzIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZjQ4MmNjYzU3MTEyNGQwYmJiYjlhZTUxNTUxMmZlODggPSAkKCc8ZGl2IGlkPSJodG1sX2Y0ODJjY2M1NzExMjRkMGJiYmI5YWU1MTU1MTJmZTg4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5CdWxscyBIZWFkLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lMjU1OWIwMDE4ZTY0MjUyYmUzOTk3ZGUwOGE2NTQzMi5zZXRDb250ZW50KGh0bWxfZjQ4MmNjYzU3MTEyNGQwYmJiYjlhZTUxNTUxMmZlODgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMjgxMjBiNzRiOWEzNDRmZmI1YjdmYTNhNzNhZmM3ZmMuYmluZFBvcHVwKHBvcHVwX2UyNTU5YjAwMThlNjQyNTJiZTM5OTdkZTA4YTY1NDMyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2ZhMTdjODdlMGY3ZDQ2MzVhNmQ4MmY3YmE0MTVmZjFmID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzgyNjgyNTY3MTI1NywtNzMuOTUzMjU2NDY4MzcxMTJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzUyYzcwMjQ4YzUxNDQ5YThkZTM5N2JiMTFhZTNlZWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZmI1MTRjNjI0MzUxNDQxYWJkNWE5M2ZkNjkwM2U0MmEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYzBjMDBiMmQ3N2M0NDM0ZmEzZjQyNTM0ZTRlNThmMTkgPSAkKCc8ZGl2IGlkPSJodG1sX2MwYzAwYjJkNzdjNDQzNGZhM2Y0MjUzNGU0ZTU4ZjE5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DYXJuZWdpZSBIaWxsLCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2ZiNTE0YzYyNDM1MTQ0MWFiZDVhOTNmZDY5MDNlNDJhLnNldENvbnRlbnQoaHRtbF9jMGMwMGIyZDc3YzQ0MzRmYTNmNDI1MzRlNGU1OGYxOSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9mYTE3Yzg3ZTBmN2Q0NjM1YTZkODJmN2JhNDE1ZmYxZi5iaW5kUG9wdXAocG9wdXBfZmI1MTRjNjI0MzUxNDQxYWJkNWE5M2ZkNjkwM2U0MmEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMWM3YTMxM2I0M2NkNGY0ZTlhNjk1ZDBiN2I2MTlmMmYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MjMyNTkwMTg4NTc2OCwtNzMuOTg4NDMzNjgwMjM1OTddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzUyYzcwMjQ4YzUxNDQ5YThkZTM5N2JiMTFhZTNlZWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNTczMDMyYTJhMTYzNGViZTkwYTBlZmM3Njk3Y2EwM2YgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYzBjYjg0OTliYTRlNDAxOTk5MzQ5ODA0ZDJjZDhkYTYgPSAkKCc8ZGl2IGlkPSJodG1sX2MwY2I4NDk5YmE0ZTQwMTk5OTM0OTgwNGQyY2Q4ZGE2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Ob2hvLCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzU3MzAzMmEyYTE2MzRlYmU5MGEwZWZjNzY5N2NhMDNmLnNldENvbnRlbnQoaHRtbF9jMGNiODQ5OWJhNGU0MDE5OTkzNDk4MDRkMmNkOGRhNik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8xYzdhMzEzYjQzY2Q0ZjRlOWE2OTVkMGI3YjYxOWYyZi5iaW5kUG9wdXAocG9wdXBfNTczMDMyYTJhMTYzNGViZTkwYTBlZmM3Njk3Y2EwM2YpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZDk1NTdlZDc2NmU4NGRhMTk0ODViM2QxZDBhM2YwZWMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MTUyMjg5MjA0NjI4MiwtNzQuMDA1NDE1Mjk4NzMzNTVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzUyYzcwMjQ4YzUxNDQ5YThkZTM5N2JiMTFhZTNlZWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNGNlODliZDZhZjQ5NDZlYTg0NTQ2OTdmZjliZDU4MTUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMWQ1NGQ3NjQ0YjhiNDVhZmE4ZDc5N2FiNmVhMTdiZDEgPSAkKCc8ZGl2IGlkPSJodG1sXzFkNTRkNzY0NGI4YjQ1YWZhOGQ3OTdhYjZlYTE3YmQxIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DaXZpYyBDZW50ZXIsIE1hbmhhdHRhbjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNGNlODliZDZhZjQ5NDZlYTg0NTQ2OTdmZjliZDU4MTUuc2V0Q29udGVudChodG1sXzFkNTRkNzY0NGI4YjQ1YWZhOGQ3OTdhYjZlYTE3YmQxKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2Q5NTU3ZWQ3NjZlODRkYTE5NDg1YjNkMWQwYTNmMGVjLmJpbmRQb3B1cChwb3B1cF80Y2U4OWJkNmFmNDk0NmVhODQ1NDY5N2ZmOWJkNTgxNSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mNmJmZDhmYzkxZTQ0MTBjODYyZTYxNWUxOWM2OWNmNSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc0ODUwOTY2NDMxMjIsLTczLjk4ODcxMzEzMjg1MjQ3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2M1MmM3MDI0OGM1MTQ0OWE4ZGUzOTdiYjExYWUzZWVhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2M0N2JmNzAzYmQzNzQ1YWRhMDRlOTgxM2I1YmZiZGM1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzdlMGUyNDdiODM5MjRlZTA5NzAzMTFjMjk0OWFhMjRmID0gJCgnPGRpdiBpZD0iaHRtbF83ZTBlMjQ3YjgzOTI0ZWUwOTcwMzExYzI5NDlhYTI0ZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TWlkdG93biBTb3V0aCwgTWFuaGF0dGFuPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jNDdiZjcwM2JkMzc0NWFkYTA0ZTk4MTNiNWJmYmRjNS5zZXRDb250ZW50KGh0bWxfN2UwZTI0N2I4MzkyNGVlMDk3MDMxMWMyOTQ5YWEyNGYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZjZiZmQ4ZmM5MWU0NDEwYzg2MmU2MTVlMTljNjljZjUuYmluZFBvcHVwKHBvcHVwX2M0N2JmNzAzYmQzNzQ1YWRhMDRlOTgxM2I1YmZiZGM1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2JmYzkzMGY1NDdhNjQzY2M4MDM4MTYxZjhjYzZlYWQ5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTY5NjA1OTQyNzU1MDUsLTc0LjEzNDA1NzI5ODYyNTddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzUyYzcwMjQ4YzUxNDQ5YThkZTM5N2JiMTFhZTNlZWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNjIyZjdiYmQ3NjQ4NDdlMjk0MDM3MTU2NWE4ZDdlNTUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMWNlZDc2NmMyMWE2NDBjYmIyMzcwY2EwNDJmMThjYTYgPSAkKCc8ZGl2IGlkPSJodG1sXzFjZWQ3NjZjMjFhNjQwY2JiMjM3MGNhMDQyZjE4Y2E2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5SaWNobW9uZCBUb3duLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82MjJmN2JiZDc2NDg0N2UyOTQwMzcxNTY1YThkN2U1NS5zZXRDb250ZW50KGh0bWxfMWNlZDc2NmMyMWE2NDBjYmIyMzcwY2EwNDJmMThjYTYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYmZjOTMwZjU0N2E2NDNjYzgwMzgxNjFmOGNjNmVhZDkuYmluZFBvcHVwKHBvcHVwXzYyMmY3YmJkNzY0ODQ3ZTI5NDAzNzE1NjVhOGQ3ZTU1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzNkMTFiMmMwOGY1YjQxNWJiNmIwY2Q3YTcyN2QxYjBhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjA5NzE5MzQwNzkyODQsLTc0LjA2NjY3NzY2MDYxNzcxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2M1MmM3MDI0OGM1MTQ0OWE4ZGUzOTdiYjExYWUzZWVhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2QzMzc5YmExYTAzZjQxZGY5NTJmYTA5YjlmOWUxMzljID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzkyNjVhZWYxOGVlNzQ0MDA5MzE5NTdlODk0MWQwNDE4ID0gJCgnPGRpdiBpZD0iaHRtbF85MjY1YWVmMThlZTc0NDAwOTMxOTU3ZTg5NDFkMDQxOCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U2hvcmUgQWNyZXMsIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2QzMzc5YmExYTAzZjQxZGY5NTJmYTA5YjlmOWUxMzljLnNldENvbnRlbnQoaHRtbF85MjY1YWVmMThlZTc0NDAwOTMxOTU3ZTg5NDFkMDQxOCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8zZDExYjJjMDhmNWI0MTViYjZiMGNkN2E3MjdkMWIwYS5iaW5kUG9wdXAocG9wdXBfZDMzNzliYTFhMDNmNDFkZjk1MmZhMDliOWY5ZTEzOWMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMDk4MjZmNmQzYjI2NGRmYTllNTMyODVhNzQyNjExYzMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42MTkxNzg0NTIwMjg0MywtNzQuMDcyNjQyNDQ1NDg0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2M1MmM3MDI0OGM1MTQ0OWE4ZGUzOTdiYjExYWUzZWVhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2M4NGE3OTVlNWVkZTQwYjc4MzZjOWM0NjliMWRlMTAxID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2Q0MWI3N2M3ZGUxYTRjODJhMzU5M2U3YjY4MjYzZWQ4ID0gJCgnPGRpdiBpZD0iaHRtbF9kNDFiNzdjN2RlMWE0YzgyYTM1OTNlN2I2ODI2M2VkOCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q2xpZnRvbiwgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYzg0YTc5NWU1ZWRlNDBiNzgzNmM5YzQ2OWIxZGUxMDEuc2V0Q29udGVudChodG1sX2Q0MWI3N2M3ZGUxYTRjODJhMzU5M2U3YjY4MjYzZWQ4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzA5ODI2ZjZkM2IyNjRkZmE5ZTUzMjg1YTc0MjYxMWMzLmJpbmRQb3B1cChwb3B1cF9jODRhNzk1ZTVlZGU0MGI3ODM2YzljNDY5YjFkZTEwMSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9kMTA1YWEyNTRmZjU0MDNmOTg4ZThjYzk1MTFlMDgxNCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjYwNDQ3MzE4OTY4NzksLTc0LjA4NDAyMzY0NzQwMzU4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2M1MmM3MDI0OGM1MTQ0OWE4ZGUzOTdiYjExYWUzZWVhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzM3MjEzOTg2NTY4ZTQ0OTA4NjViMGJlYzQwMjY5Y2E5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzgyY2E1YTk4OTA4ZjQ4YTJhMWJhMzdhN2UzYzg4MDJlID0gJCgnPGRpdiBpZD0iaHRtbF84MmNhNWE5ODkwOGY0OGEyYTFiYTM3YTdlM2M4ODAyZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q29uY29yZCwgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMzcyMTM5ODY1NjhlNDQ5MDg2NWIwYmVjNDAyNjljYTkuc2V0Q29udGVudChodG1sXzgyY2E1YTk4OTA4ZjQ4YTJhMWJhMzdhN2UzYzg4MDJlKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2QxMDVhYTI1NGZmNTQwM2Y5ODhlOGNjOTUxMWUwODE0LmJpbmRQb3B1cChwb3B1cF8zNzIxMzk4NjU2OGU0NDkwODY1YjBiZWM0MDI2OWNhOSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8zNTgxMjU3OTEwZjM0OTA2YjQ0YzEyNTU3MmFiZWZhYiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjYwNjc5NDM5NDgwMSwtNzQuMDk3NzYyMDY5NzI1MjJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzUyYzcwMjQ4YzUxNDQ5YThkZTM5N2JiMTFhZTNlZWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMmY3ZTlhNzhhMTgwNDk1ZDliODg0YmM4Mjg0YmIyMmIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfM2JkYzZmZDE5NjA1NGUyMzk3Yjc4YTY4N2ZhYTQ5ZmIgPSAkKCc8ZGl2IGlkPSJodG1sXzNiZGM2ZmQxOTYwNTRlMjM5N2I3OGE2ODdmYWE0OWZiIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5FbWVyc29uIEhpbGwsIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzJmN2U5YTc4YTE4MDQ5NWQ5Yjg4NGJjODI4NGJiMjJiLnNldENvbnRlbnQoaHRtbF8zYmRjNmZkMTk2MDU0ZTIzOTdiNzhhNjg3ZmFhNDlmYik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8zNTgxMjU3OTEwZjM0OTA2YjQ0YzEyNTU3MmFiZWZhYi5iaW5kUG9wdXAocG9wdXBfMmY3ZTlhNzhhMTgwNDk1ZDliODg0YmM4Mjg0YmIyMmIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMjhhNzk2YzUyNTQzNDFkOGI5NWYwNzliYmU2OGYyYzcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42MzU2MzAwMDY4MTE1MSwtNzQuMDk4MDUwNjIzNzM4ODddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzUyYzcwMjQ4YzUxNDQ5YThkZTM5N2JiMTFhZTNlZWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYWI3MmY5MzM0YmZkNGUzNjgyZDU5MDIwOWVlNTZkZjMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMjI5ODUyY2FkMzMyNDk1Mjk4ZGU1ODAwODU3OTQ5MTQgPSAkKCc8ZGl2IGlkPSJodG1sXzIyOTg1MmNhZDMzMjQ5NTI5OGRlNTgwMDg1Nzk0OTE0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5SYW5kYWxsIE1hbm9yLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hYjcyZjkzMzRiZmQ0ZTM2ODJkNTkwMjA5ZWU1NmRmMy5zZXRDb250ZW50KGh0bWxfMjI5ODUyY2FkMzMyNDk1Mjk4ZGU1ODAwODU3OTQ5MTQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMjhhNzk2YzUyNTQzNDFkOGI5NWYwNzliYmU2OGYyYzcuYmluZFBvcHVwKHBvcHVwX2FiNzJmOTMzNGJmZDRlMzY4MmQ1OTAyMDllZTU2ZGYzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzJkYjcxZDUwMWIyZTQ5NTM5MjE3ODA3ZWVkNTA3NzRjID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjM4NDMyODM3OTQ3OTUsLTc0LjE4NjIyMzMxNzQ5ODIzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2M1MmM3MDI0OGM1MTQ0OWE4ZGUzOTdiYjExYWUzZWVhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzJhZTNlMzhjZGUyNTRlYTc4ZTVjZTc2M2RjMzM2N2QxID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2NiMzU1NzNkMWQ5YjRjYjc5NjY1NWYyNTc4MTgxMDg1ID0gJCgnPGRpdiBpZD0iaHRtbF9jYjM1NTczZDFkOWI0Y2I3OTY2NTVmMjU3ODE4MTA4NSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+SG93bGFuZCBIb29rLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yYWUzZTM4Y2RlMjU0ZWE3OGU1Y2U3NjNkYzMzNjdkMS5zZXRDb250ZW50KGh0bWxfY2IzNTU3M2QxZDliNGNiNzk2NjU1ZjI1NzgxODEwODUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMmRiNzFkNTAxYjJlNDk1MzkyMTc4MDdlZWQ1MDc3NGMuYmluZFBvcHVwKHBvcHVwXzJhZTNlMzhjZGUyNTRlYTc4ZTVjZTc2M2RjMzM2N2QxKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzg2NDAwOGM1YTQ4YjRiMThiZmI3NDg1ZWVkMTBhYzMwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjMwMTQ2NzQxMTkzODI2LC03NC4xNDE4MTY3ODk2ODg5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2M1MmM3MDI0OGM1MTQ0OWE4ZGUzOTdiYjExYWUzZWVhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2MwMjg5ZmY5ODgwYTQyY2Q4NWVkMDRlYTVkYmExYmYwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2NkOTMzNDU4OWFhYzRkMDc5Y2JhNjEyYWUwZDlmMzNmID0gJCgnPGRpdiBpZD0iaHRtbF9jZDkzMzQ1ODlhYWM0ZDA3OWNiYTYxMmFlMGQ5ZjMzZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RWxtIFBhcmssIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2MwMjg5ZmY5ODgwYTQyY2Q4NWVkMDRlYTVkYmExYmYwLnNldENvbnRlbnQoaHRtbF9jZDkzMzQ1ODlhYWM0ZDA3OWNiYTYxMmFlMGQ5ZjMzZik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl84NjQwMDhjNWE0OGI0YjE4YmZiNzQ4NWVlZDEwYWMzMC5iaW5kUG9wdXAocG9wdXBfYzAyODlmZjk4ODBhNDJjZDg1ZWQwNGVhNWRiYTFiZjApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYTQ0M2ZiNjg3ZmUzNGJiZWI1ZDA5YWVkMzBkMDAzYTkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42NTIxMTc0NTE3OTM0OTQsLTczLjkxNjY1MzMxOTc4MDQ4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2M1MmM3MDI0OGM1MTQ0OWE4ZGUzOTdiYjExYWUzZWVhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2VmN2ExY2FjMzI4NjRlZGJhNDZmYjQzZjQ5OTA3YzIyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2Q5OGJiMDM0MzIzNzQ4YTdhZTY3NzI1NGNkZWI3YmQzID0gJCgnPGRpdiBpZD0iaHRtbF9kOThiYjAzNDMyMzc0OGE3YWU2NzcyNTRjZGViN2JkMyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UmVtc2VuIFZpbGxhZ2UsIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lZjdhMWNhYzMyODY0ZWRiYTQ2ZmI0M2Y0OTkwN2MyMi5zZXRDb250ZW50KGh0bWxfZDk4YmIwMzQzMjM3NDhhN2FlNjc3MjU0Y2RlYjdiZDMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYTQ0M2ZiNjg3ZmUzNGJiZWI1ZDA5YWVkMzBkMDAzYTkuYmluZFBvcHVwKHBvcHVwX2VmN2ExY2FjMzI4NjRlZGJhNDZmYjQzZjQ5OTA3YzIyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2U5YmYzMTgwZjRjMjQyNjdiZjc1N2YwMjA0NTgyMTcyID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjYyNzQ0Mjc5Njk2NiwtNzMuODg1MTE3NzYzNzkyOTJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzUyYzcwMjQ4YzUxNDQ5YThkZTM5N2JiMTFhZTNlZWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNDQzZDBhMWU5OGExNGEwNzk1MWUwNmZiNjhlNTM5MjIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNmUzNTZlODMxYWY2NDlhNDhkNGJkY2Q5ZGI1Mzg4NmUgPSAkKCc8ZGl2IGlkPSJodG1sXzZlMzU2ZTgzMWFmNjQ5YTQ4ZDRiZGNkOWRiNTM4ODZlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5OZXcgTG90cywgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzQ0M2QwYTFlOThhMTRhMDc5NTFlMDZmYjY4ZTUzOTIyLnNldENvbnRlbnQoaHRtbF82ZTM1NmU4MzFhZjY0OWE0OGQ0YmRjZDlkYjUzODg2ZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9lOWJmMzE4MGY0YzI0MjY3YmY3NTdmMDIwNDU4MjE3Mi5iaW5kUG9wdXAocG9wdXBfNDQzZDBhMWU5OGExNGEwNzk1MWUwNmZiNjhlNTM5MjIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZDE3YjJlZGRiYzgxNDBkZDg0MjhjNDZlNGQwMDJjZWEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42MzEzMTc1NTAzOTY2NywtNzMuOTAyMzM0NzQyOTU4MzZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzUyYzcwMjQ4YzUxNDQ5YThkZTM5N2JiMTFhZTNlZWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMzYyZjJhN2ZmODE4NGM1N2EwNjY2NTY4MjhjZDA4OTcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfODRlMzg0N2Y5MzQ0NDFmN2JiYzFlNzI0MGY4YjU2OTcgPSAkKCc8ZGl2IGlkPSJodG1sXzg0ZTM4NDdmOTM0NDQxZjdiYmMxZTcyNDBmOGI1Njk3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5QYWVyZGVnYXQgQmFzaW4sIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zNjJmMmE3ZmY4MTg0YzU3YTA2NjY1NjgyOGNkMDg5Ny5zZXRDb250ZW50KGh0bWxfODRlMzg0N2Y5MzQ0NDFmN2JiYzFlNzI0MGY4YjU2OTcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZDE3YjJlZGRiYzgxNDBkZDg0MjhjNDZlNGQwMDJjZWEuYmluZFBvcHVwKHBvcHVwXzM2MmYyYTdmZjgxODRjNTdhMDY2NjU2ODI4Y2QwODk3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzJlNzI4YjVlMzYyNTQzYzNhMjhiMjIwZTY5YjBkNWY0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjE1OTc0MjM5NjIzMzYsLTczLjkxNTE1MzkxNTUwNDA0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2M1MmM3MDI0OGM1MTQ0OWE4ZGUzOTdiYjExYWUzZWVhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2U5MjgyNjg2MmI3MjRmMWE5MDUzYzQxZmU4YWYzZjMwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzRkMWM4NzA0NzFhZDQwY2Y5ZDJmMjFjMmE5OTk0NTA2ID0gJCgnPGRpdiBpZD0iaHRtbF80ZDFjODcwNDcxYWQ0MGNmOWQyZjIxYzJhOTk5NDUwNiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TWlsbCBCYXNpbiwgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2U5MjgyNjg2MmI3MjRmMWE5MDUzYzQxZmU4YWYzZjMwLnNldENvbnRlbnQoaHRtbF80ZDFjODcwNDcxYWQ0MGNmOWQyZjIxYzJhOTk5NDUwNik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8yZTcyOGI1ZTM2MjU0M2MzYTI4YjIyMGU2OWIwZDVmNC5iaW5kUG9wdXAocG9wdXBfZTkyODI2ODYyYjcyNGYxYTkwNTNjNDFmZThhZjNmMzApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYjcwOTk4NGE3YzQ4NDIyYmFmMDhmMTllOWE3YzJlY2QgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MTE0NTk2NDM3MDQ4MiwtNzMuNzk2NDY0NjIwODE1OTNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzUyYzcwMjQ4YzUxNDQ5YThkZTM5N2JiMTFhZTNlZWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOTAzYWVhZTNkNzQ4NDE2Yjk3ZTkyNmJjODdkZThiMTkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYzhkMzQzZTdkZjk1NDI2YWE0MDhiYzQ2ZTE4ZWM3MmEgPSAkKCc8ZGl2IGlkPSJodG1sX2M4ZDM0M2U3ZGY5NTQyNmFhNDA4YmM0NmUxOGVjNzJhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5KYW1haWNhIEhpbGxzLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzkwM2FlYWUzZDc0ODQxNmI5N2U5MjZiYzg3ZGU4YjE5LnNldENvbnRlbnQoaHRtbF9jOGQzNDNlN2RmOTU0MjZhYTQwOGJjNDZlMThlYzcyYSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9iNzA5OTg0YTdjNDg0MjJiYWYwOGYxOWU5YTdjMmVjZC5iaW5kUG9wdXAocG9wdXBfOTAzYWVhZTNkNzQ4NDE2Yjk3ZTkyNmJjODdkZThiMTkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZTM1YmJkMWIyZmM0NDhiYzkxYTIxZTgzNTY2ZWI2ZjMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MzM1MDAyNTQyOTc1NywtNzMuNzk2NzE2NzgwMjgzNDldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzUyYzcwMjQ4YzUxNDQ5YThkZTM5N2JiMTFhZTNlZWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYjI5NmMxNDU0MmUwNDZjMWEwZmE4ZGY1MDhmODRkZjAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNDZmZmZhYzI2ZmVkNGNkMjhiZWIxMDJmODJjNWEwYjUgPSAkKCc8ZGl2IGlkPSJodG1sXzQ2ZmZmYWMyNmZlZDRjZDI4YmViMTAyZjgyYzVhMGI1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5VdG9waWEsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYjI5NmMxNDU0MmUwNDZjMWEwZmE4ZGY1MDhmODRkZjAuc2V0Q29udGVudChodG1sXzQ2ZmZmYWMyNmZlZDRjZDI4YmViMTAyZjgyYzVhMGI1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2UzNWJiZDFiMmZjNDQ4YmM5MWEyMWU4MzU2NmViNmYzLmJpbmRQb3B1cChwb3B1cF9iMjk2YzE0NTQyZTA0NmMxYTBmYThkZjUwOGY4NGRmMCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8zZmViMjIyMjg5NjQ0ZTIwYTBmMjBjOWNmNTc2NTIxNCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjczNDkzNjE4MDc1NDc4LC03My44MDQ4NjEyMDA0MDUzN10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jNTJjNzAyNDhjNTE0NDlhOGRlMzk3YmIxMWFlM2VlYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9kYzJhMTY4NTczN2E0YWFiODcwYTMxOWFhMTIxYjVkMSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8yODIyMzAwZWEzNmI0Nzg0YWQ2MGIyMGU3MzI2YzY5YyA9ICQoJzxkaXYgaWQ9Imh0bWxfMjgyMjMwMGVhMzZiNDc4NGFkNjBiMjBlNzMyNmM2OWMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlBvbW9ub2ssIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZGMyYTE2ODU3MzdhNGFhYjg3MGEzMTlhYTEyMWI1ZDEuc2V0Q29udGVudChodG1sXzI4MjIzMDBlYTM2YjQ3ODRhZDYwYjIwZTczMjZjNjljKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzNmZWIyMjIyODk2NDRlMjBhMGYyMGM5Y2Y1NzY1MjE0LmJpbmRQb3B1cChwb3B1cF9kYzJhMTY4NTczN2E0YWFiODcwYTMxOWFhMTIxYjVkMSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81MzZlMzU4ZGZlNDM0MmYxODYwMjIwZWI2MzNlZTk3YiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc3MDMxNzM5Mjk5ODIsLTczLjg5NDY3OTk2MjcwNTc0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2M1MmM3MDI0OGM1MTQ0OWE4ZGUzOTdiYjExYWUzZWVhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2ZlZjIxZjMyMmI5MDQyNThhZTY2MzNkOTQ0YzBkYjYzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzA4OGU4Yjg5ZDkyMTQ1ZTJhNjkwMjMwNGEwOTlhODZhID0gJCgnPGRpdiBpZD0iaHRtbF8wODhlOGI4OWQ5MjE0NWUyYTY5MDIzMDRhMDk5YTg2YSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QXN0b3JpYSBIZWlnaHRzLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2ZlZjIxZjMyMmI5MDQyNThhZTY2MzNkOTQ0YzBkYjYzLnNldENvbnRlbnQoaHRtbF8wODhlOGI4OWQ5MjE0NWUyYTY5MDIzMDRhMDk5YTg2YSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81MzZlMzU4ZGZlNDM0MmYxODYwMjIwZWI2MzNlZTk3Yi5iaW5kUG9wdXAocG9wdXBfZmVmMjFmMzIyYjkwNDI1OGFlNjYzM2Q5NDRjMGRiNjMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZTQzMjBmNjgwNTc4NDAwNzgzZGFjNzI3MmI5NTgyYWYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44MzE0MjgzNDE2MTU0OCwtNzMuOTAxMTk5MDMzODc2NjddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzUyYzcwMjQ4YzUxNDQ5YThkZTM5N2JiMTFhZTNlZWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMjI5ZGQzOWI2MjU1NGI2Mzk0OTM5MjlmMzNmY2UyYTcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMmQxMTkxODcyN2I4NGI1M2IwN2YxMjBhMGI3ZjNkMzcgPSAkKCc8ZGl2IGlkPSJodG1sXzJkMTE5MTg3MjdiODRiNTNiMDdmMTIwYTBiN2YzZDM3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DbGFyZW1vbnQgVmlsbGFnZSwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzIyOWRkMzliNjI1NTRiNjM5NDkzOTI5ZjMzZmNlMmE3LnNldENvbnRlbnQoaHRtbF8yZDExOTE4NzI3Yjg0YjUzYjA3ZjEyMGEwYjdmM2QzNyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9lNDMyMGY2ODA1Nzg0MDA3ODNkYWM3MjcyYjk1ODJhZi5iaW5kUG9wdXAocG9wdXBfMjI5ZGQzOWI2MjU1NGI2Mzk0OTM5MjlmMzNmY2UyYTcpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYzJmZTQ4N2QxODkwNGVkNjgxYmZkOWUxODEzYjc3YmYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44MjQ3ODA0OTA4NDI5MDUsLTczLjkxNTg0NjUyNzU5MDA5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2M1MmM3MDI0OGM1MTQ0OWE4ZGUzOTdiYjExYWUzZWVhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzEzYThkYTNhMTgyZTQ3NjM4NzkyZjVhNjNkY2Q0ZjAwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzQxZWNkZjA4N2ExMTQyYzI5NTJmNjhmMDlmM2M1MDQ1ID0gJCgnPGRpdiBpZD0iaHRtbF80MWVjZGYwODdhMTE0MmMyOTUyZjY4ZjA5ZjNjNTA0NSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q29uY291cnNlIFZpbGxhZ2UsIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xM2E4ZGEzYTE4MmU0NzYzODc5MmY1YTYzZGNkNGYwMC5zZXRDb250ZW50KGh0bWxfNDFlY2RmMDg3YTExNDJjMjk1MmY2OGYwOWYzYzUwNDUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYzJmZTQ4N2QxODkwNGVkNjgxYmZkOWUxODEzYjc3YmYuYmluZFBvcHVwKHBvcHVwXzEzYThkYTNhMTgyZTQ3NjM4NzkyZjVhNjNkY2Q0ZjAwKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2NlMDJlMzZhMzhlNjQ1ZWU4MjFhNDIxODIxOGM4Njc4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODQzODI2MTc2NzE2NTQsLTczLjkxNjU1NTUxOTY0NDE5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2M1MmM3MDI0OGM1MTQ0OWE4ZGUzOTdiYjExYWUzZWVhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzRlOTAxMzlkNzQ1YzRiMmM5NDlhZWM1NDQxZGVjN2M5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzJmZDY2YWE1MjI0MjQ0OGE4MTY2YWFkMGY2ODM2ZWVlID0gJCgnPGRpdiBpZD0iaHRtbF8yZmQ2NmFhNTIyNDI0NDhhODE2NmFhZDBmNjgzNmVlZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TW91bnQgRWRlbiwgQnJvbng8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzRlOTAxMzlkNzQ1YzRiMmM5NDlhZWM1NDQxZGVjN2M5LnNldENvbnRlbnQoaHRtbF8yZmQ2NmFhNTIyNDI0NDhhODE2NmFhZDBmNjgzNmVlZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9jZTAyZTM2YTM4ZTY0NWVlODIxYTQyMTgyMThjODY3OC5iaW5kUG9wdXAocG9wdXBfNGU5MDEzOWQ3NDVjNGIyYzk0OWFlYzU0NDFkZWM3YzkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNWVkN2UxMzAzMTIwNGY2ZGI2N2IyYjc1OTlkZjJmMTAgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44NDg4NDE2MDcyNDY2NSwtNzMuOTA4Mjk5MzA4ODE5ODhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzUyYzcwMjQ4YzUxNDQ5YThkZTM5N2JiMTFhZTNlZWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOTgzYjY3YzUyNzhjNGVhOTg3YmY1OTM1M2JhZThjNmUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYTdhOTExZWRlODU1NGY5NjllMmFkN2EyNWFjZDViMjcgPSAkKCc8ZGl2IGlkPSJodG1sX2E3YTkxMWVkZTg1NTRmOTY5ZTJhZDdhMjVhY2Q1YjI3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Nb3VudCBIb3BlLCBCcm9ueDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOTgzYjY3YzUyNzhjNGVhOTg3YmY1OTM1M2JhZThjNmUuc2V0Q29udGVudChodG1sX2E3YTkxMWVkZTg1NTRmOTY5ZTJhZDdhMjVhY2Q1YjI3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzVlZDdlMTMwMzEyMDRmNmRiNjdiMmI3NTk5ZGYyZjEwLmJpbmRQb3B1cChwb3B1cF85ODNiNjdjNTI3OGM0ZWE5ODdiZjU5MzUzYmFlOGM2ZSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9iOWY3OTQ1NmMwMzg0MDlkOGUzMmRhOGUwMWU3MmUwNSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc2MDI4MDMzMTMxMzc0LC03My45NjM1NTYxNDA5NDMwM10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jNTJjNzAyNDhjNTE0NDlhOGRlMzk3YmIxMWFlM2VlYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9kYWRkZTFlNmE0Mjg0OTZmODFiN2Y1MjVhMGQzNDY4ZSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jZDQ3OTg1YTg2ZmQ0ZGY1OWQwYzYxNzZiMTk0N2E4NSA9ICQoJzxkaXYgaWQ9Imh0bWxfY2Q0Nzk4NWE4NmZkNGRmNTlkMGM2MTc2YjE5NDdhODUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlN1dHRvbiBQbGFjZSwgTWFuaGF0dGFuPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kYWRkZTFlNmE0Mjg0OTZmODFiN2Y1MjVhMGQzNDY4ZS5zZXRDb250ZW50KGh0bWxfY2Q0Nzk4NWE4NmZkNGRmNTlkMGM2MTc2YjE5NDdhODUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYjlmNzk0NTZjMDM4NDA5ZDhlMzJkYThlMDFlNzJlMDUuYmluZFBvcHVwKHBvcHVwX2RhZGRlMWU2YTQyODQ5NmY4MWI3ZjUyNWEwZDM0NjhlKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2U3Mzc3NTNiODNmNzQyNjNhOTE1ODUzMWYyNmZhMDg0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzQzNDE0MDkwMDczNTM2LC03My45NTM4Njc4MjEzMDc0NV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jNTJjNzAyNDhjNTE0NDlhOGRlMzk3YmIxMWFlM2VlYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hNWY2Nzg0NDNhZjE0ZWQzOTMzMWMxMWE2NTU2ZTA1OCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jMzE1ZDUxZmE5MGE0MTFkYmUyZTQwNDQxODk4ZmFmYSA9ICQoJzxkaXYgaWQ9Imh0bWxfYzMxNWQ1MWZhOTBhNDExZGJlMmU0MDQ0MTg5OGZhZmEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkh1bnRlcnMgUG9pbnQsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYTVmNjc4NDQzYWYxNGVkMzkzMzFjMTFhNjU1NmUwNTguc2V0Q29udGVudChodG1sX2MzMTVkNTFmYTkwYTQxMWRiZTJlNDA0NDE4OThmYWZhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2U3Mzc3NTNiODNmNzQyNjNhOTE1ODUzMWYyNmZhMDg0LmJpbmRQb3B1cChwb3B1cF9hNWY2Nzg0NDNhZjE0ZWQzOTMzMWMxMWE2NTU2ZTA1OCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81MmZhYzBhNWVkNWU0MWUzOWM4NTk1ZjI0YmRjMDcyMyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc1MjA0MjM2OTUwNzIyLC03My45Njc3MDgyNDU4MTgzNF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jNTJjNzAyNDhjNTE0NDlhOGRlMzk3YmIxMWFlM2VlYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hMzI0YzM2MDg1MGU0ODRlOThhOTJkOWEyN2I0NzQxYiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83NThiMmIzMDcxMDI0OTY3YWViMjY4NmEzZWQzNjk3OCA9ICQoJzxkaXYgaWQ9Imh0bWxfNzU4YjJiMzA3MTAyNDk2N2FlYjI2ODZhM2VkMzY5NzgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlR1cnRsZSBCYXksIE1hbmhhdHRhbjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYTMyNGMzNjA4NTBlNDg0ZTk4YTkyZDlhMjdiNDc0MWIuc2V0Q29udGVudChodG1sXzc1OGIyYjMwNzEwMjQ5NjdhZWIyNjg2YTNlZDM2OTc4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzUyZmFjMGE1ZWQ1ZTQxZTM5Yzg1OTVmMjRiZGMwNzIzLmJpbmRQb3B1cChwb3B1cF9hMzI0YzM2MDg1MGU0ODRlOThhOTJkOWEyN2I0NzQxYik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl84ZDVkYzFlZWNhN2Y0MGYwYjM3ZTlhNGM2M2Q2YTdkMyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc0NjkxNzQxMDc0MDE5NSwtNzMuOTcxMjE5Mjg3MjIyNjVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzUyYzcwMjQ4YzUxNDQ5YThkZTM5N2JiMTFhZTNlZWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMzE2ZGIwYTUyMDIxNGU0NWFkYTUzYjcwMDRjZTk4MWIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZjM5N2NmYTJiMjU0NDk4MWFlNjI3ZGE5YjIxMTU1NWYgPSAkKCc8ZGl2IGlkPSJodG1sX2YzOTdjZmEyYjI1NDQ5ODFhZTYyN2RhOWIyMTE1NTVmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5UdWRvciBDaXR5LCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzMxNmRiMGE1MjAyMTRlNDVhZGE1M2I3MDA0Y2U5ODFiLnNldENvbnRlbnQoaHRtbF9mMzk3Y2ZhMmIyNTQ0OTgxYWU2MjdkYTliMjExNTU1Zik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl84ZDVkYzFlZWNhN2Y0MGYwYjM3ZTlhNGM2M2Q2YTdkMy5iaW5kUG9wdXAocG9wdXBfMzE2ZGIwYTUyMDIxNGU0NWFkYTUzYjcwMDRjZTk4MWIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYzc1N2I2NWE0NGIyNDEzMThiNjBlN2JlZWZlMTc1YmIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MzA5OTk1NTQ3NzA2MSwtNzMuOTc0MDUxNzA0NjkyMDNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzUyYzcwMjQ4YzUxNDQ5YThkZTM5N2JiMTFhZTNlZWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYmVhYmUxNjg1NjE5NGQxZWEyYWMxN2FhMGY3ZGY0ZmQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMjU2N2ZjOTU2YzI2NGY0NDgzMjExOGJkMzNhY2U2MWIgPSAkKCc8ZGl2IGlkPSJodG1sXzI1NjdmYzk1NmMyNjRmNDQ4MzIxMThiZDMzYWNlNjFiIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5TdHV5dmVzYW50IFRvd24sIE1hbmhhdHRhbjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYmVhYmUxNjg1NjE5NGQxZWEyYWMxN2FhMGY3ZGY0ZmQuc2V0Q29udGVudChodG1sXzI1NjdmYzk1NmMyNjRmNDQ4MzIxMThiZDMzYWNlNjFiKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2M3NTdiNjVhNDRiMjQxMzE4YjYwZTdiZWVmZTE3NWJiLmJpbmRQb3B1cChwb3B1cF9iZWFiZTE2ODU2MTk0ZDFlYTJhYzE3YWEwZjdkZjRmZCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mNWIxYTExNGRlYmM0MmIwODM1YWFkZDJkMmYzOTMzYiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjczOTY3MzA0NzYzODQyNiwtNzMuOTkwOTQ3MTA1MjgyNl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jNTJjNzAyNDhjNTE0NDlhOGRlMzk3YmIxMWFlM2VlYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85ZWJjMzg1OTdjNjM0YjBkYWI0MDQ1MTM5MWFiZDM0NyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82ZWM2YjZjZWFiOTc0MzI1YTY0ZTczZGRlMDYyNzM5MyA9ICQoJzxkaXYgaWQ9Imh0bWxfNmVjNmI2Y2VhYjk3NDMyNWE2NGU3M2RkZTA2MjczOTMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkZsYXRpcm9uLCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzllYmMzODU5N2M2MzRiMGRhYjQwNDUxMzkxYWJkMzQ3LnNldENvbnRlbnQoaHRtbF82ZWM2YjZjZWFiOTc0MzI1YTY0ZTczZGRlMDYyNzM5Myk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9mNWIxYTExNGRlYmM0MmIwODM1YWFkZDJkMmYzOTMzYi5iaW5kUG9wdXAocG9wdXBfOWViYzM4NTk3YzYzNGIwZGFiNDA0NTEzOTFhYmQzNDcpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMDRjMmI2YjdlMThiNDk2NTk2ZTY0YTlmODNhOGJjZGQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NDU2NTE4MDYwODA3NiwtNzMuOTE4MTkyODY0MzE2ODJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzUyYzcwMjQ4YzUxNDQ5YThkZTM5N2JiMTFhZTNlZWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMDUzM2JkNGU1NGE2NDNlNTkyYTJmZGVhMjhjMGEwZjMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYTgyNGVhY2Y3NDczNDg3ZmJkY2Q0ZDcyMmVkNzg2NTEgPSAkKCc8ZGl2IGlkPSJodG1sX2E4MjRlYWNmNzQ3MzQ4N2ZiZGNkNGQ3MjJlZDc4NjUxIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5TdW5ueXNpZGUgR2FyZGVucywgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wNTMzYmQ0ZTU0YTY0M2U1OTJhMmZkZWEyOGMwYTBmMy5zZXRDb250ZW50KGh0bWxfYTgyNGVhY2Y3NDczNDg3ZmJkY2Q0ZDcyMmVkNzg2NTEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMDRjMmI2YjdlMThiNDk2NTk2ZTY0YTlmODNhOGJjZGQuYmluZFBvcHVwKHBvcHVwXzA1MzNiZDRlNTRhNjQzZTU5MmEyZmRlYTI4YzBhMGYzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzU1YTUyNWUyNWYyMjQ1MDBiNGU1ZjJmNjU5NWI4ZmVkID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzM3MjUwNzE2OTQ0OTcsLTczLjkzMjQ0MjM1MjYwMTc4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2M1MmM3MDI0OGM1MTQ0OWE4ZGUzOTdiYjExYWUzZWVhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2NiMjM3MjlhMDNlNTQ5YmRhYjliYTIwODE2MzUyODYyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzFmNzdlYjgyYjVkMTQ0ZDQ5YzMwOGJkOTYxYmU4NGQ5ID0gJCgnPGRpdiBpZD0iaHRtbF8xZjc3ZWI4MmI1ZDE0NGQ0OWMzMDhiZDk2MWJlODRkOSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Qmxpc3N2aWxsZSwgUXVlZW5zPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jYjIzNzI5YTAzZTU0OWJkYWI5YmEyMDgxNjM1Mjg2Mi5zZXRDb250ZW50KGh0bWxfMWY3N2ViODJiNWQxNDRkNDljMzA4YmQ5NjFiZTg0ZDkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNTVhNTI1ZTI1ZjIyNDUwMGI0ZTVmMmY2NTk1YjhmZWQuYmluZFBvcHVwKHBvcHVwX2NiMjM3MjlhMDNlNTQ5YmRhYjliYTIwODE2MzUyODYyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2QyZGFhMTBmNWY4OTQxNTM5YzdkZjcyMjBkMjRlYWNhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzAzMjgxMDkwOTMwMTQsLTczLjk5NTUwNzUxODg4NDE1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2M1MmM3MDI0OGM1MTQ0OWE4ZGUzOTdiYjExYWUzZWVhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzQxMDlkMzAyYzExYjQ5OWZiNjc2N2EwYzYxMDZlYmE1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2NjZGE1MWM2ZTM3YzQwYTZhZTk1YmUwZDhmODVhNjQ3ID0gJCgnPGRpdiBpZD0iaHRtbF9jY2RhNTFjNmUzN2M0MGE2YWU5NWJlMGQ4Zjg1YTY0NyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RnVsdG9uIEZlcnJ5LCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNDEwOWQzMDJjMTFiNDk5ZmI2NzY3YTBjNjEwNmViYTUuc2V0Q29udGVudChodG1sX2NjZGE1MWM2ZTM3YzQwYTZhZTk1YmUwZDhmODVhNjQ3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2QyZGFhMTBmNWY4OTQxNTM5YzdkZjcyMjBkMjRlYWNhLmJpbmRQb3B1cChwb3B1cF80MTA5ZDMwMmMxMWI0OTlmYjY3NjdhMGM2MTA2ZWJhNSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xZWE5MTI1N2FhZmI0MGViODI5OWM2OGI2OWNhMWNlOCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjcwMzMyMTQ5ODgyODc0LC03My45ODExMTYwMzU5MjM5M10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jNTJjNzAyNDhjNTE0NDlhOGRlMzk3YmIxMWFlM2VlYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82ZDFkZjI1MjQxMzU0YTU2ODllZTZjOGQ5NTJjNTRkZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF80ZmYwNjVlMTUwZGU0OGYxYWVlZjhhYjJkOTcyMTE5ZiA9ICQoJzxkaXYgaWQ9Imh0bWxfNGZmMDY1ZTE1MGRlNDhmMWFlZWY4YWIyZDk3MjExOWYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlZpbmVnYXIgSGlsbCwgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzZkMWRmMjUyNDEzNTRhNTY4OWVlNmM4ZDk1MmM1NGRmLnNldENvbnRlbnQoaHRtbF80ZmYwNjVlMTUwZGU0OGYxYWVlZjhhYjJkOTcyMTE5Zik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8xZWE5MTI1N2FhZmI0MGViODI5OWM2OGI2OWNhMWNlOC5iaW5kUG9wdXAocG9wdXBfNmQxZGYyNTI0MTM1NGE1Njg5ZWU2YzhkOTUyYzU0ZGYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYzQyNTkzODQ1MGViNDRkN2FlZTQwMDE3YTVhYTg5MzAgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42NzUwMzk4NjUwMzIzNywtNzMuOTMwNTMxMDg4MTczMzhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzUyYzcwMjQ4YzUxNDQ5YThkZTM5N2JiMTFhZTNlZWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNDM3NjJkN2ZlMmZiNGE0NmE4NDY5YTAyM2VkZTU4ZmEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfODZmNjU4NTJmMTYxNDRiM2I1NWNlOWM5NjUyMzVkNmQgPSAkKCc8ZGl2IGlkPSJodG1sXzg2ZjY1ODUyZjE2MTQ0YjNiNTVjZTljOTY1MjM1ZDZkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5XZWVrc3ZpbGxlLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNDM3NjJkN2ZlMmZiNGE0NmE4NDY5YTAyM2VkZTU4ZmEuc2V0Q29udGVudChodG1sXzg2ZjY1ODUyZjE2MTQ0YjNiNTVjZTljOTY1MjM1ZDZkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2M0MjU5Mzg0NTBlYjQ0ZDdhZWU0MDAxN2E1YWE4OTMwLmJpbmRQb3B1cChwb3B1cF80Mzc2MmQ3ZmUyZmI0YTQ2YTg0NjlhMDIzZWRlNThmYSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xMTgzMzc5ZTA5M2U0MjY3ODk4NjZiM2YwNDVkNDk2NSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY3Nzg2MTA0NzY5NTMxLC03My45MDMzMTY4NDg1MjU5OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jNTJjNzAyNDhjNTE0NDlhOGRlMzk3YmIxMWFlM2VlYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lMjJlZjgxOWEzZTU0ZDE1Yjc5MTQzYTIxZjcwYWI3OCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jZmUzMjEzNWQ1MzE0OGE0YWEyOTRkYzViMDdiNmE5ZSA9ICQoJzxkaXYgaWQ9Imh0bWxfY2ZlMzIxMzVkNTMxNDhhNGFhMjk0ZGM1YjA3YjZhOWUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkJyb2Fkd2F5IEp1bmN0aW9uLCBCcm9va2x5bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZTIyZWY4MTlhM2U1NGQxNWI3OTE0M2EyMWY3MGFiNzguc2V0Q29udGVudChodG1sX2NmZTMyMTM1ZDUzMTQ4YTRhYTI5NGRjNWIwN2I2YTllKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzExODMzNzllMDkzZTQyNjc4OTg2NmIzZjA0NWQ0OTY1LmJpbmRQb3B1cChwb3B1cF9lMjJlZjgxOWEzZTU0ZDE1Yjc5MTQzYTIxZjcwYWI3OCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jNmQ4YjNhNTA4OTg0Y2EyYjc0ZTU4ZTk1MjliYmM5NCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjcwMzE3NjMyODIyNjkyLC03My45ODg3NTI4MDc0NTA0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2M1MmM3MDI0OGM1MTQ0OWE4ZGUzOTdiYjExYWUzZWVhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2U4ODYzM2FmMDlhYTQ5MWJiNzFlZDc4ODNkODY5ZTg1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzY5MjgxNTM4N2NjZTQxNTM4MzNmZDIxNWY2ZWFkMTU5ID0gJCgnPGRpdiBpZD0iaHRtbF82OTI4MTUzODdjY2U0MTUzODMzZmQyMTVmNmVhZDE1OSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RHVtYm8sIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lODg2MzNhZjA5YWE0OTFiYjcxZWQ3ODgzZDg2OWU4NS5zZXRDb250ZW50KGh0bWxfNjkyODE1Mzg3Y2NlNDE1MzgzM2ZkMjE1ZjZlYWQxNTkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYzZkOGIzYTUwODk4NGNhMmI3NGU1OGU5NTI5YmJjOTQuYmluZFBvcHVwKHBvcHVwX2U4ODYzM2FmMDlhYTQ5MWJiNzFlZDc4ODNkODY5ZTg1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzcxYTA0MGNjZjBiODRjMDNiZmNiZDBlMTExZDA2YzBhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjAxODA5NTc2MzE0NDQsLTc0LjEyMDU5Mzk5NzE4MDAxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2M1MmM3MDI0OGM1MTQ0OWE4ZGUzOTdiYjExYWUzZWVhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzU2N2U2YzBlYTU4MDRjNTNhNjYxZjA4OWM4NmIzYTM4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2EwMGY0OGZhNDA3NDRhYTA4NmYwY2MxZmRjZGQyMDA1ID0gJCgnPGRpdiBpZD0iaHRtbF9hMDBmNDhmYTQwNzQ0YWEwODZmMGNjMWZkY2RkMjAwNSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TWFub3IgSGVpZ2h0cywgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNTY3ZTZjMGVhNTgwNGM1M2E2NjFmMDg5Yzg2YjNhMzguc2V0Q29udGVudChodG1sX2EwMGY0OGZhNDA3NDRhYTA4NmYwY2MxZmRjZGQyMDA1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzcxYTA0MGNjZjBiODRjMDNiZmNiZDBlMTExZDA2YzBhLmJpbmRQb3B1cChwb3B1cF81NjdlNmMwZWE1ODA0YzUzYTY2MWYwODljODZiM2EzOCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8zYjdjY2UzNWU1MTQ0OTgwYjlmOWU3OTgwYzAzMjY1OCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjYwMzcwNjkyNjI3MzcxLC03NC4xMzIwODQ0NzQ4NDI5OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jNTJjNzAyNDhjNTE0NDlhOGRlMzk3YmIxMWFlM2VlYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hNjQ4YWYzZTgwMmE0MzQ3ODliYjc0MWI3N2UxODFhYiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wODk1N2E1NGMzNjE0MzBmOGY3MmZkOWQ4YjJjMzYwMyA9ICQoJzxkaXYgaWQ9Imh0bWxfMDg5NTdhNTRjMzYxNDMwZjhmNzJmZDlkOGIyYzM2MDMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPldpbGxvd2Jyb29rLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hNjQ4YWYzZTgwMmE0MzQ3ODliYjc0MWI3N2UxODFhYi5zZXRDb250ZW50KGh0bWxfMDg5NTdhNTRjMzYxNDMwZjhmNzJmZDlkOGIyYzM2MDMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfM2I3Y2NlMzVlNTE0NDk4MGI5ZjllNzk4MGMwMzI2NTguYmluZFBvcHVwKHBvcHVwX2E2NDhhZjNlODAyYTQzNDc4OWJiNzQxYjc3ZTE4MWFiKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzcxNTNhNDJhODg3MDQ3ZTU4ZmI2N2Y0NjlhNmRmNGFjID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTQxMTM5OTIyMDkxNzY2LC03NC4yMTc3NjYzNjA2ODU2N10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jNTJjNzAyNDhjNTE0NDlhOGRlMzk3YmIxMWFlM2VlYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9jMzE4OTYwMDRiZWI0YTk1ODg1MzcyODExYTZjYWQ4ZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wZTQ4ZWE2NGI0OWI0NmRlOTA4ZTllODA0ZTdlNjhlZiA9ICQoJzxkaXYgaWQ9Imh0bWxfMGU0OGVhNjRiNDliNDZkZTkwOGU5ZTgwNGU3ZTY4ZWYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlNhbmR5IEdyb3VuZCwgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYzMxODk2MDA0YmViNGE5NTg4NTM3MjgxMWE2Y2FkOGYuc2V0Q29udGVudChodG1sXzBlNDhlYTY0YjQ5YjQ2ZGU5MDhlOWU4MDRlN2U2OGVmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzcxNTNhNDJhODg3MDQ3ZTU4ZmI2N2Y0NjlhNmRmNGFjLmJpbmRQb3B1cChwb3B1cF9jMzE4OTYwMDRiZWI0YTk1ODg1MzcyODExYTZjYWQ4Zik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8yZWFkMjU0MTQ4NzY0NjYwODlkNTUxMTA4OTc2MWIxYSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjU3OTExODc0Mjk2MTIxNCwtNzQuMTI3MjcyNDA2MDQ5NDZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzUyYzcwMjQ4YzUxNDQ5YThkZTM5N2JiMTFhZTNlZWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfN2M0NjdiY2RmNGIzNGY3Y2FiNjUxMWYzMjJiMzQyMjEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNTcxZGEwMjcxYjMyNGZiYzhmYjI4NWIwOTlkYjU1MWQgPSAkKCc8ZGl2IGlkPSJodG1sXzU3MWRhMDI3MWIzMjRmYmM4ZmIyODViMDk5ZGI1NTFkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5FZ2JlcnR2aWxsZSwgU3RhdGVuIElzbGFuZDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfN2M0NjdiY2RmNGIzNGY3Y2FiNjUxMWYzMjJiMzQyMjEuc2V0Q29udGVudChodG1sXzU3MWRhMDI3MWIzMjRmYmM4ZmIyODViMDk5ZGI1NTFkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzJlYWQyNTQxNDg3NjQ2NjA4OWQ1NTExMDg5NzYxYjFhLmJpbmRQb3B1cChwb3B1cF83YzQ2N2JjZGY0YjM0ZjdjYWI2NTExZjMyMmIzNDIyMSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl82ZTM0ZmM1NGM3ODg0YzRjODhkZTc5ZGE5MTMwNDc5YyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjU2NzM3NTg4OTU3MDMyLC03My44OTIxMzc2MDIzMjgyMl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jNTJjNzAyNDhjNTE0NDlhOGRlMzk3YmIxMWFlM2VlYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF81ZjI1ZDBkOGQ2ODY0Njg2YjFhMjQwNzE0ZWRlMTcyOSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iMzFjMmU1YzI3YjQ0YzJjYmZiNjg4YTU3YzhlZDMyZiA9ICQoJzxkaXYgaWQ9Imh0bWxfYjMxYzJlNWMyN2I0NGMyY2JmYjY4OGE1N2M4ZWQzMmYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlJveGJ1cnksIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNWYyNWQwZDhkNjg2NDY4NmIxYTI0MDcxNGVkZTE3Mjkuc2V0Q29udGVudChodG1sX2IzMWMyZTVjMjdiNDRjMmNiZmI2ODhhNTdjOGVkMzJmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzZlMzRmYzU0Yzc4ODRjNGM4OGRlNzlkYTkxMzA0NzljLmJpbmRQb3B1cChwb3B1cF81ZjI1ZDBkOGQ2ODY0Njg2YjFhMjQwNzE0ZWRlMTcyOSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mZmZkYTllM2JiODE0MGI4YjEyNmMzY2JjODMyMzkwOCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjU5ODUyNTA5NTEzNzI1NSwtNzMuOTU5MTg0NTk0Mjg3MDJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzUyYzcwMjQ4YzUxNDQ5YThkZTM5N2JiMTFhZTNlZWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNmU2NmY0NDg5YzQzNGIwNTgxNWUzNGVkMzk0ZjY4ZjMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNjQxMTZlODYwMWUzNDU0NzlkODNjMTRhMjQzY2Y4ODQgPSAkKCc8ZGl2IGlkPSJodG1sXzY0MTE2ZTg2MDFlMzQ1NDc5ZDgzYzE0YTI0M2NmODg0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Ib21lY3Jlc3QsIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82ZTY2ZjQ0ODljNDM0YjA1ODE1ZTM0ZWQzOTRmNjhmMy5zZXRDb250ZW50KGh0bWxfNjQxMTZlODYwMWUzNDU0NzlkODNjMTRhMjQzY2Y4ODQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZmZmZGE5ZTNiYjgxNDBiOGIxMjZjM2NiYzgzMjM5MDguYmluZFBvcHVwKHBvcHVwXzZlNjZmNDQ4OWM0MzRiMDU4MTVlMzRlZDM5NGY2OGYzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzg4YzY1MGQyZTU1ZDQ2OTdhN2RlODg3MDNjMDJlOWE0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzE2NDE0NTExMTU4MTg1LC03My44ODExNDMxOTIwMDYwNF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jNTJjNzAyNDhjNTE0NDlhOGRlMzk3YmIxMWFlM2VlYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF81NjRjYmI5Njg3MjM0ZWQ1YmIzMzhhZWU1NDRjNDdlNSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82NDMyZmIwMjgyM2Q0MDk0OTk0NWEzYjNiZGU5YWM4YiA9ICQoJzxkaXYgaWQ9Imh0bWxfNjQzMmZiMDI4MjNkNDA5NDk5NDVhM2IzYmRlOWFjOGIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk1pZGRsZSBWaWxsYWdlLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzU2NGNiYjk2ODcyMzRlZDViYjMzOGFlZTU0NGM0N2U1LnNldENvbnRlbnQoaHRtbF82NDMyZmIwMjgyM2Q0MDk0OTk0NWEzYjNiZGU5YWM4Yik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl84OGM2NTBkMmU1NWQ0Njk3YTdkZTg4NzAzYzAyZTlhNC5iaW5kUG9wdXAocG9wdXBfNTY0Y2JiOTY4NzIzNGVkNWJiMzM4YWVlNTQ0YzQ3ZTUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZGUxOTNhNDg0NTIzNDA4NjhkNzE0NDMwZmI0YmVhNjUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC41MjYyNjQwNjczNDgxMiwtNzQuMjAxNTI1NTY0NTc2NThdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzUyYzcwMjQ4YzUxNDQ5YThkZTM5N2JiMTFhZTNlZWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNGZhMDRiZjdmY2JiNDIxMGJiYzA3MmM2ZGE2MzQzMzUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNTA2YWU4YzI1ZGRiNGZlOThmMmU3OTYzNDg1N2ZhNDAgPSAkKCc8ZGl2IGlkPSJodG1sXzUwNmFlOGMyNWRkYjRmZTk4ZjJlNzk2MzQ4NTdmYTQwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5QcmluY2UmIzM5O3MgQmF5LCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80ZmEwNGJmN2ZjYmI0MjEwYmJjMDcyYzZkYTYzNDMzNS5zZXRDb250ZW50KGh0bWxfNTA2YWU4YzI1ZGRiNGZlOThmMmU3OTYzNDg1N2ZhNDApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZGUxOTNhNDg0NTIzNDA4NjhkNzE0NDMwZmI0YmVhNjUuYmluZFBvcHVwKHBvcHVwXzRmYTA0YmY3ZmNiYjQyMTBiYmMwNzJjNmRhNjM0MzM1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzFiZWMzOTJhY2JhZjRhZDU4NDM2NmQwMTg4N2Y3MmEzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTc2NTA2MjkzNzk0ODksLTc0LjEzNzkyNjYzNzcxNTY4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2M1MmM3MDI0OGM1MTQ0OWE4ZGUzOTdiYjExYWUzZWVhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2Y1NzUwODFjNTFkZDQ3Nzk4ZGUzMTc5N2U0ZDdhNTE3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzI1Y2QxY2YyNzQ3NTQ1MjRiYjQ0YmEyODljNDdmYzlkID0gJCgnPGRpdiBpZD0iaHRtbF8yNWNkMWNmMjc0NzU0NTI0YmI0NGJhMjg5YzQ3ZmM5ZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TGlnaHRob3VzZSBIaWxsLCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mNTc1MDgxYzUxZGQ0Nzc5OGRlMzE3OTdlNGQ3YTUxNy5zZXRDb250ZW50KGh0bWxfMjVjZDFjZjI3NDc1NDUyNGJiNDRiYTI4OWM0N2ZjOWQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMWJlYzM5MmFjYmFmNGFkNTg0MzY2ZDAxODg3ZjcyYTMuYmluZFBvcHVwKHBvcHVwX2Y1NzUwODFjNTFkZDQ3Nzk4ZGUzMTc5N2U0ZDdhNTE3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzgyM2UwMjFhMjIxNDQyZDc4MmU2YWMyYzZiOTFhOTc4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNTE5NTQxNDU3NDg5MDksLTc0LjIyOTU3MDgwNjI2OTQxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2M1MmM3MDI0OGM1MTQ0OWE4ZGUzOTdiYjExYWUzZWVhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzQwZGMxMmIyMmY1ODRhMGM4ZjU5ZmM3MTE1NzUyNjc0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzg4YWMxNzYxZDU1YjQ4YTg5Y2EwMTM1NWMzNTdjNDIzID0gJCgnPGRpdiBpZD0iaHRtbF84OGFjMTc2MWQ1NWI0OGE4OWNhMDEzNTVjMzU3YzQyMyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UmljaG1vbmQgVmFsbGV5LCBTdGF0ZW4gSXNsYW5kPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80MGRjMTJiMjJmNTg0YTBjOGY1OWZjNzExNTc1MjY3NC5zZXRDb250ZW50KGh0bWxfODhhYzE3NjFkNTViNDhhODljYTAxMzU1YzM1N2M0MjMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfODIzZTAyMWEyMjE0NDJkNzgyZTZhYzJjNmI5MWE5NzguYmluZFBvcHVwKHBvcHVwXzQwZGMxMmIyMmY1ODRhMGM4ZjU5ZmM3MTE1NzUyNjc0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzQ4NmE3YzNjYjZiMDRlNWU4MThkYWVmZjVmNDkyMTNmID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzkwNjAxNTU2NzAxNDgsLTczLjgyNjY3NzU3MTM4NjQxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2M1MmM3MDI0OGM1MTQ0OWE4ZGUzOTdiYjExYWUzZWVhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2YyMWZkOWMzZWI0MjQwMzFiMDQzYzVhZjk4YTEyYTc1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzE1NTIwOWUxNzRlOTQ0ZWE5NTBkZTQzN2VmY2VjMWZhID0gJCgnPGRpdiBpZD0iaHRtbF8xNTUyMDllMTc0ZTk0NGVhOTUwZGU0MzdlZmNlYzFmYSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TWFsYmEsIFF1ZWVuczwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZjIxZmQ5YzNlYjQyNDAzMWIwNDNjNWFmOThhMTJhNzUuc2V0Q29udGVudChodG1sXzE1NTIwOWUxNzRlOTQ0ZWE5NTBkZTQzN2VmY2VjMWZhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzQ4NmE3YzNjYjZiMDRlNWU4MThkYWVmZjVmNDkyMTNmLmJpbmRQb3B1cChwb3B1cF9mMjFmZDljM2ViNDI0MDMxYjA0M2M1YWY5OGExMmE3NSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lZGY2ODBlMmJlNjI0OTFlYTg3ZTliZWM4YzJlYjVkZiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY4MTk5ODkzNDUxNzMsLTczLjg5MDM0NTcwOTg3Ml0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jNTJjNzAyNDhjNTE0NDlhOGRlMzk3YmIxMWFlM2VlYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hYmJiM2RjYzNhYjA0NDQ1OGZiM2U2OWZjYTc3ODg0ZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kZjYzZjg2MjAyZWI0NDc4YmZkZWY5ZDUyZmY2MjRlMyA9ICQoJzxkaXYgaWQ9Imh0bWxfZGY2M2Y4NjIwMmViNDQ3OGJmZGVmOWQ1MmZmNjI0ZTMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkhpZ2hsYW5kIFBhcmssIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hYmJiM2RjYzNhYjA0NDQ1OGZiM2U2OWZjYTc3ODg0Zi5zZXRDb250ZW50KGh0bWxfZGY2M2Y4NjIwMmViNDQ3OGJmZGVmOWQ1MmZmNjI0ZTMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZWRmNjgwZTJiZTYyNDkxZWE4N2U5YmVjOGMyZWI1ZGYuYmluZFBvcHVwKHBvcHVwX2FiYmIzZGNjM2FiMDQ0NDU4ZmIzZTY5ZmNhNzc4ODRmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2ViZDEzOTBiODUyYjQ1MThhZTM2ZGYzYzI5Y2VhOTY0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNjA5Mzc3NzAxMTM3NjYsLTczLjk0ODQxNTE1MzI4ODkzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2M1MmM3MDI0OGM1MTQ0OWE4ZGUzOTdiYjExYWUzZWVhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzY4N2UzMmE3MDBmZjQ2YzJhNWM4ODgzNDcxZjA0NGVjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzcyMDVhNWQ2NGUxOTQ3Y2Y5NjZjZDE5ZmFiZDhlNmU2ID0gJCgnPGRpdiBpZD0iaHRtbF83MjA1YTVkNjRlMTk0N2NmOTY2Y2QxOWZhYmQ4ZTZlNiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TWFkaXNvbiwgQnJvb2tseW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzY4N2UzMmE3MDBmZjQ2YzJhNWM4ODgzNDcxZjA0NGVjLnNldENvbnRlbnQoaHRtbF83MjA1YTVkNjRlMTk0N2NmOTY2Y2QxOWZhYmQ4ZTZlNik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9lYmQxMzkwYjg1MmI0NTE4YWUzNmRmM2MyOWNlYTk2NC5iaW5kUG9wdXAocG9wdXBfNjg3ZTMyYTcwMGZmNDZjMmE1Yzg4ODM0NzFmMDQ0ZWMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYzk5YjYyZTI3Y2FjNDUzY2IwMDBkNWVlMjI0YzY3OWIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44NTI3MjI5NzYzMzAxNywtNzMuODYxNzI1Nzc1NTUxMTVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzUyYzcwMjQ4YzUxNDQ5YThkZTM5N2JiMTFhZTNlZWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfN2EyYmJmOThkNWJjNDlhMWJmMGVlZTI0NmIxZjA5M2UgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMzA2MmVlN2JjNmI1NGU1ZDgxYmIzYzNiNGFkOTliYjggPSAkKCc8ZGl2IGlkPSJodG1sXzMwNjJlZTdiYzZiNTRlNWQ4MWJiM2MzYjRhZDk5YmI4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Ccm9ueGRhbGUsIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83YTJiYmY5OGQ1YmM0OWExYmYwZWVlMjQ2YjFmMDkzZS5zZXRDb250ZW50KGh0bWxfMzA2MmVlN2JjNmI1NGU1ZDgxYmIzYzNiNGFkOTliYjgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYzk5YjYyZTI3Y2FjNDUzY2IwMDBkNWVlMjI0YzY3OWIuYmluZFBvcHVwKHBvcHVwXzdhMmJiZjk4ZDViYzQ5YTFiZjBlZWUyNDZiMWYwOTNlKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzc1ZTNiYmU4MmI5NjQwOTViY2U2MjhiYTkyNjIyNGFjID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODY1Nzg3ODc4MDI5ODIsLTczLjg1OTMxODYzMjIxNjQ3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2M1MmM3MDI0OGM1MTQ0OWE4ZGUzOTdiYjExYWUzZWVhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzM5YjRiOThjN2NlZjRhNTNhMjVhMDQxZGYzZTFiMWU4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2U3NTZkOTg0YTk1YjQwNmRhNTEzM2Q5YjM3Y2IxMTljID0gJCgnPGRpdiBpZD0iaHRtbF9lNzU2ZDk4NGE5NWI0MDZkYTUxMzNkOWIzN2NiMTE5YyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QWxsZXJ0b24sIEJyb254PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zOWI0Yjk4YzdjZWY0YTUzYTI1YTA0MWRmM2UxYjFlOC5zZXRDb250ZW50KGh0bWxfZTc1NmQ5ODRhOTViNDA2ZGE1MTMzZDliMzdjYjExOWMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNzVlM2JiZTgyYjk2NDA5NWJjZTYyOGJhOTI2MjI0YWMuYmluZFBvcHVwKHBvcHVwXzM5YjRiOThjN2NlZjRhNTNhMjVhMDQxZGYzZTFiMWU4KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2U0ZDczY2Y4NzI3NTQxNjRiZDI2MzI1MmMwZTIxMjQwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODcwMzkyMzkxNDE0NywtNzMuOTAxNTIyNjQ1MTMxNDRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzUyYzcwMjQ4YzUxNDQ5YThkZTM5N2JiMTFhZTNlZWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZDUyNzE0Y2U5NWQ3NGNjNDk3OGJlNGIxZjFmYTQzOTcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYWQ3MzA3MGJmNDUzNDQxODhhN2VhNTdkYWYwY2IwZGEgPSAkKCc8ZGl2IGlkPSJodG1sX2FkNzMwNzBiZjQ1MzQ0MTg4YTdlYTU3ZGFmMGNiMGRhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5LaW5nc2JyaWRnZSBIZWlnaHRzLCBCcm9ueDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZDUyNzE0Y2U5NWQ3NGNjNDk3OGJlNGIxZjFmYTQzOTcuc2V0Q29udGVudChodG1sX2FkNzMwNzBiZjQ1MzQ0MTg4YTdlYTU3ZGFmMGNiMGRhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2U0ZDczY2Y4NzI3NTQxNjRiZDI2MzI1MmMwZTIxMjQwLmJpbmRQb3B1cChwb3B1cF9kNTI3MTRjZTk1ZDc0Y2M0OTc4YmU0YjFmMWZhNDM5Nyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl80MGVlYzhlMDRiNjM0ZmJjODcyZmY0MmYwNDg3ZTQzZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjY0NjkyNjA2NjU4NTc5LC03My45NDgxNzcwOTkyMDE4NF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9jNTJjNzAyNDhjNTE0NDlhOGRlMzk3YmIxMWFlM2VlYSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8yNWE4N2RmYzQ2MjY0ZmJhOWZmMGI3MDdmNDRmOTc5NyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zNWE5NWJlOGRkN2I0MzgyYjc3MzQ1Yzk3MTJjZWI0MyA9ICQoJzxkaXYgaWQ9Imh0bWxfMzVhOTViZThkZDdiNDM4MmI3NzM0NWM5NzEyY2ViNDMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkVyYXNtdXMsIEJyb29rbHluPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yNWE4N2RmYzQ2MjY0ZmJhOWZmMGI3MDdmNDRmOTc5Ny5zZXRDb250ZW50KGh0bWxfMzVhOTViZThkZDdiNDM4MmI3NzM0NWM5NzEyY2ViNDMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNDBlZWM4ZTA0YjYzNGZiYzg3MmZmNDJmMDQ4N2U0M2QuYmluZFBvcHVwKHBvcHVwXzI1YTg3ZGZjNDYyNjRmYmE5ZmYwYjcwN2Y0NGY5Nzk3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2I1NWUyNWEyYTg5MTRlZjY4YzQzZGNkZmFmNGRhMTcwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzU2NjU4MDgyMjc1MTksLTc0LjAwMDExMTM2MjAyNjM3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2M1MmM3MDI0OGM1MTQ0OWE4ZGUzOTdiYjExYWUzZWVhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzUzMGIyODA2YTBhNjQ3ODlhNWM1MTNjOWE1NzBlOWFmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzA2MWQwMTQ4NmFkZjQ2YTA4MTM5YTNhNDFkNDdlYzMwID0gJCgnPGRpdiBpZD0iaHRtbF8wNjFkMDE0ODZhZGY0NmEwODEzOWEzYTQxZDQ3ZWMzMCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+SHVkc29uIFlhcmRzLCBNYW5oYXR0YW48L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzUzMGIyODA2YTBhNjQ3ODlhNWM1MTNjOWE1NzBlOWFmLnNldENvbnRlbnQoaHRtbF8wNjFkMDE0ODZhZGY0NmEwODEzOWEzYTQxZDQ3ZWMzMCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9iNTVlMjVhMmE4OTE0ZWY2OGM0M2RjZGZhZjRkYTE3MC5iaW5kUG9wdXAocG9wdXBfNTMwYjI4MDZhMGE2NDc4OWE1YzUxM2M5YTU3MGU5YWYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMGRmNjc1MjIyNTMzNDNlNWJjNjZkNzJmNTQxOTM1YjcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC41ODczMzc3NDAxODc0MSwtNzMuODA1NTMwMDI5Njg3MThdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzUyYzcwMjQ4YzUxNDQ5YThkZTM5N2JiMTFhZTNlZWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZDEzOWUzZmU5YTVlNDBlOTkyODMyM2UxNmYxZTdkZTQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNmNjZjA5MTEzODYwNDU0OTkwNGE1MDhiYTk4NzI0ODAgPSAkKCc8ZGl2IGlkPSJodG1sXzZjY2YwOTExMzg2MDQ1NDk5MDRhNTA4YmE5ODcyNDgwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5IYW1tZWxzLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2QxMzllM2ZlOWE1ZTQwZTk5MjgzMjNlMTZmMWU3ZGU0LnNldENvbnRlbnQoaHRtbF82Y2NmMDkxMTM4NjA0NTQ5OTA0YTUwOGJhOTg3MjQ4MCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8wZGY2NzUyMjI1MzM0M2U1YmM2NmQ3MmY1NDE5MzViNy5iaW5kUG9wdXAocG9wdXBfZDEzOWUzZmU5YTVlNDBlOTkyODMyM2UxNmYxZTdkZTQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNGZmZDVmMmQzNGNkNDViM2I4YTY2ZjI5NmY0NjQxNzUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42MTEzMjE2OTEyODM4MzQsLTczLjc2NTk2NzgxNDQ1NjI3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2M1MmM3MDI0OGM1MTQ0OWE4ZGUzOTdiYjExYWUzZWVhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzY2NjlmYWZmZWE2MjQ2NGY5ZmE0NjdmMDQ1ODk4Mzk0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzU4NjFkYzdkZWY3MzRlZjA5MjAwMDhjYTA2Mjk5OWJiID0gJCgnPGRpdiBpZD0iaHRtbF81ODYxZGM3ZGVmNzM0ZWYwOTIwMDA4Y2EwNjI5OTliYiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QmF5c3dhdGVyLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzY2NjlmYWZmZWE2MjQ2NGY5ZmE0NjdmMDQ1ODk4Mzk0LnNldENvbnRlbnQoaHRtbF81ODYxZGM3ZGVmNzM0ZWYwOTIwMDA4Y2EwNjI5OTliYik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl80ZmZkNWYyZDM0Y2Q0NWIzYjhhNjZmMjk2ZjQ2NDE3NS5iaW5kUG9wdXAocG9wdXBfNjY2OWZhZmZlYTYyNDY0ZjlmYTQ2N2YwNDU4OTgzOTQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfM2FlMjU4OWE0YmU4NDkzY2JjOTUyZWFjNDJmZjRlMDcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NTYwOTEyOTcwOTQ3MDYsLTczLjk0NTYzMDcwMzM0MDkxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2M1MmM3MDI0OGM1MTQ0OWE4ZGUzOTdiYjExYWUzZWVhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzI1MTk4OTQ1OTNjMTQ5ZDRiYjk3MmFkZDA2OGJjYjI2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2U1MWE1ZjJjMzQ4NTQ0Y2U5MDAwZWY3MGQ4ZWRkMDBkID0gJCgnPGRpdiBpZD0iaHRtbF9lNTFhNWYyYzM0ODU0NGNlOTAwMGVmNzBkOGVkZDAwZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UXVlZW5zYnJpZGdlLCBRdWVlbnM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzI1MTk4OTQ1OTNjMTQ5ZDRiYjk3MmFkZDA2OGJjYjI2LnNldENvbnRlbnQoaHRtbF9lNTFhNWYyYzM0ODU0NGNlOTAwMGVmNzBkOGVkZDAwZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8zYWUyNTg5YTRiZTg0OTNjYmM5NTJlYWM0MmZmNGUwNy5iaW5kUG9wdXAocG9wdXBfMjUxOTg5NDU5M2MxNDlkNGJiOTcyYWRkMDY4YmNiMjYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYzQ1YzMzYTRlY2I4NGRiODgwMzFmMGE4OGZlMzlmNDkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC42MTczMTA3OTI1Mjk4MywtNzQuMDgxNzM5OTIyMTE5NjJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYzUyYzcwMjQ4YzUxNDQ5YThkZTM5N2JiMTFhZTNlZWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNTkyMTBmYTU0YzQ3NGYwOTkxMmMzNzQzOTE5YWUyMGUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZDhmODZhODE2Y2ZmNGYzNWE3OTZhMTFmOTg1ZmYxZDMgPSAkKCc8ZGl2IGlkPSJodG1sX2Q4Zjg2YTgxNmNmZjRmMzVhNzk2YTExZjk4NWZmMWQzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Gb3ggSGlsbHMsIFN0YXRlbiBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzU5MjEwZmE1NGM0NzRmMDk5MTJjMzc0MzkxOWFlMjBlLnNldENvbnRlbnQoaHRtbF9kOGY4NmE4MTZjZmY0ZjM1YTc5NmExMWY5ODVmZjFkMyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9jNDVjMzNhNGVjYjg0ZGI4ODAzMWYwYTg4ZmUzOWY0OS5iaW5kUG9wdXAocG9wdXBfNTkyMTBmYTU0YzQ3NGYwOTkxMmMzNzQzOTE5YWUyMGUpOwoKICAgICAgICAgICAgCiAgICAgICAgCjwvc2NyaXB0Pg==\" 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 0x7f86c57e8438>" | |
] | |
}, | |
"execution_count": 14, | |
"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": 15, | |
"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", | |
" <td>0</td>\n", | |
" <td>Manhattan</td>\n", | |
" <td>Marble Hill</td>\n", | |
" <td>40.876551</td>\n", | |
" <td>-73.910660</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <td>1</td>\n", | |
" <td>Manhattan</td>\n", | |
" <td>Chinatown</td>\n", | |
" <td>40.715618</td>\n", | |
" <td>-73.994279</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <td>2</td>\n", | |
" <td>Manhattan</td>\n", | |
" <td>Washington Heights</td>\n", | |
" <td>40.851903</td>\n", | |
" <td>-73.936900</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <td>3</td>\n", | |
" <td>Manhattan</td>\n", | |
" <td>Inwood</td>\n", | |
" <td>40.867684</td>\n", | |
" <td>-73.921210</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <td>4</td>\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": 15, | |
"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.7896239, -73.9598939.\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+ICNtYXBfZTg2YjllZGYyZjg3NGIzN2FhODgyMzUzNTcwYzY1NzcgewogICAgICAgICAgICAgICAgcG9zaXRpb24gOiByZWxhdGl2ZTsKICAgICAgICAgICAgICAgIHdpZHRoIDogMTAwLjAlOwogICAgICAgICAgICAgICAgaGVpZ2h0OiAxMDAuMCU7CiAgICAgICAgICAgICAgICBsZWZ0OiAwLjAlOwogICAgICAgICAgICAgICAgdG9wOiAwLjAlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICA8L3N0eWxlPgogICAgICAgIAo8L2hlYWQ+Cjxib2R5PiAgICAKICAgIAogICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb2xpdW0tbWFwIiBpZD0ibWFwX2U4NmI5ZWRmMmY4NzRiMzdhYTg4MjM1MzU3MGM2NTc3IiA+PC9kaXY+CiAgICAgICAgCjwvYm9keT4KPHNjcmlwdD4gICAgCiAgICAKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGJvdW5kcyA9IG51bGw7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcF9lODZiOWVkZjJmODc0YjM3YWE4ODIzNTM1NzBjNjU3NyA9IEwubWFwKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21hcF9lODZiOWVkZjJmODc0YjM3YWE4ODIzNTM1NzBjNjU3NycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y2VudGVyOiBbNDAuNzg5NjIzOSwtNzMuOTU5ODkzOV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6b29tOiAxMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heEJvdW5kczogYm91bmRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXJzOiBbXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmxkQ29weUp1bXA6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JzOiBMLkNSUy5FUFNHMzg1NwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHRpbGVfbGF5ZXJfMWM2MWMwNTI0MjY1NDQ2MWE4ZjQ3NjU4ZTNlNGQyNzYgPSBMLnRpbGVMYXllcigKICAgICAgICAgICAgICAgICdodHRwczovL3tzfS50aWxlLm9wZW5zdHJlZXRtYXAub3JnL3t6fS97eH0ve3l9LnBuZycsCiAgICAgICAgICAgICAgICB7CiAgImF0dHJpYnV0aW9uIjogbnVsbCwKICAiZGV0ZWN0UmV0aW5hIjogZmFsc2UsCiAgIm1heFpvb20iOiAxOCwKICAibWluWm9vbSI6IDEsCiAgIm5vV3JhcCI6IGZhbHNlLAogICJzdWJkb21haW5zIjogImFiYyIKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZTg2YjllZGYyZjg3NGIzN2FhODgyMzUzNTcwYzY1NzcpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzVlNzI0MWI1Y2M1ZDQ5ZDE5NjIwNDRmZjg0NmNiYTUxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODc2NTUwNzc4Nzk5NjQsLTczLjkxMDY1OTY1ODYyOTgxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2U4NmI5ZWRmMmY4NzRiMzdhYTg4MjM1MzU3MGM2NTc3KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzNkNTAxMjRkZTUxZjRlMjhiNGM0OWFjZWJmOGI0YTg1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzVkYjJkYjJmYWIzNzRlNWFhNzVjMzkwZDQzMDUzYjVhID0gJCgnPGRpdiBpZD0iaHRtbF81ZGIyZGIyZmFiMzc0ZTVhYTc1YzM5MGQ0MzA1M2I1YSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TWFyYmxlIEhpbGw8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzNkNTAxMjRkZTUxZjRlMjhiNGM0OWFjZWJmOGI0YTg1LnNldENvbnRlbnQoaHRtbF81ZGIyZGIyZmFiMzc0ZTVhYTc1YzM5MGQ0MzA1M2I1YSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81ZTcyNDFiNWNjNWQ0OWQxOTYyMDQ0ZmY4NDZjYmE1MS5iaW5kUG9wdXAocG9wdXBfM2Q1MDEyNGRlNTFmNGUyOGI0YzQ5YWNlYmY4YjRhODUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOGYyZWViMjBjNjc2NDY1Njg1ZjQ3YzNjYWRiYTJkNGIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MTU2MTg0MjIzMTQzMiwtNzMuOTk0Mjc5MzYyNTU5NzhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZTg2YjllZGYyZjg3NGIzN2FhODgyMzUzNTcwYzY1NzcpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMzUxZTZlN2E0MjAxNDgwNmJlY2MxNzIwYTRhNmVmNGEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYzBhMmFjYzY3MjdkNDAwNjhjZDc4YTA0Y2M3ODkyZjYgPSAkKCc8ZGl2IGlkPSJodG1sX2MwYTJhY2M2NzI3ZDQwMDY4Y2Q3OGEwNGNjNzg5MmY2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DaGluYXRvd248L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzM1MWU2ZTdhNDIwMTQ4MDZiZWNjMTcyMGE0YTZlZjRhLnNldENvbnRlbnQoaHRtbF9jMGEyYWNjNjcyN2Q0MDA2OGNkNzhhMDRjYzc4OTJmNik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl84ZjJlZWIyMGM2NzY0NjU2ODVmNDdjM2NhZGJhMmQ0Yi5iaW5kUG9wdXAocG9wdXBfMzUxZTZlN2E0MjAxNDgwNmJlY2MxNzIwYTRhNmVmNGEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNmQ5NThlNDg0ZTliNDQxNWE3NTVjMWYyMWRlZWM3MmEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44NTE5MDI1MjU1NTMwNSwtNzMuOTM2OTAwMjc5ODUyMzRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZTg2YjllZGYyZjg3NGIzN2FhODgyMzUzNTcwYzY1NzcpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfY2U2ODcyMGE0ODVjNGNmNzliOTM3NWVjNjExYjk0ZGEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOTcwNDk1M2QxNzJmNDQ5YmJjOGZiMDIxOGM3MzVhOWUgPSAkKCc8ZGl2IGlkPSJodG1sXzk3MDQ5NTNkMTcyZjQ0OWJiYzhmYjAyMThjNzM1YTllIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5XYXNoaW5ndG9uIEhlaWdodHM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2NlNjg3MjBhNDg1YzRjZjc5YjkzNzVlYzYxMWI5NGRhLnNldENvbnRlbnQoaHRtbF85NzA0OTUzZDE3MmY0NDliYmM4ZmIwMjE4YzczNWE5ZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl82ZDk1OGU0ODRlOWI0NDE1YTc1NWMxZjIxZGVlYzcyYS5iaW5kUG9wdXAocG9wdXBfY2U2ODcyMGE0ODVjNGNmNzliOTM3NWVjNjExYjk0ZGEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOTdjNTgyZGMxYWVjNGVmYThhZTU1MzJiODU0NWEzZjMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44Njc2ODM5NjQ0OTkxNSwtNzMuOTIxMjEwNDIyMDM4OTddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZTg2YjllZGYyZjg3NGIzN2FhODgyMzUzNTcwYzY1NzcpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYTlkNTcyN2Y2YWEzNDg4YzkzYWFmZDk0NDg0N2Y5ZGYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYjE0ZTA0MjQ0ZDdiNDQ0NzkzNTQ3OTk3YWQxNmEwNTUgPSAkKCc8ZGl2IGlkPSJodG1sX2IxNGUwNDI0NGQ3YjQ0NDc5MzU0Nzk5N2FkMTZhMDU1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Jbndvb2Q8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2E5ZDU3MjdmNmFhMzQ4OGM5M2FhZmQ5NDQ4NDdmOWRmLnNldENvbnRlbnQoaHRtbF9iMTRlMDQyNDRkN2I0NDQ3OTM1NDc5OTdhZDE2YTA1NSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl85N2M1ODJkYzFhZWM0ZWZhOGFlNTUzMmI4NTQ1YTNmMy5iaW5kUG9wdXAocG9wdXBfYTlkNTcyN2Y2YWEzNDg4YzkzYWFmZDk0NDg0N2Y5ZGYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMGEyOGFiM2EwNzE0NDM0OWFjM2M5OTJmNTE2ZTJmMmMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44MjM2MDQyODQ4MTE5MzUsLTczLjk0OTY4NzkxODgzMzY2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2U4NmI5ZWRmMmY4NzRiMzdhYTg4MjM1MzU3MGM2NTc3KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzUzMWM4MTM3NmI4ODQxMjBhMjY2YTc1MTM3NDZkNjYyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzMwM2U5NzZkNTZkYjRmYzE5NmUyZWJmNzMzM2ZiYmE5ID0gJCgnPGRpdiBpZD0iaHRtbF8zMDNlOTc2ZDU2ZGI0ZmMxOTZlMmViZjczMzNmYmJhOSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+SGFtaWx0b24gSGVpZ2h0czwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNTMxYzgxMzc2Yjg4NDEyMGEyNjZhNzUxMzc0NmQ2NjIuc2V0Q29udGVudChodG1sXzMwM2U5NzZkNTZkYjRmYzE5NmUyZWJmNzMzM2ZiYmE5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzBhMjhhYjNhMDcxNDQzNDlhYzNjOTkyZjUxNmUyZjJjLmJpbmRQb3B1cChwb3B1cF81MzFjODEzNzZiODg0MTIwYTI2NmE3NTEzNzQ2ZDY2Mik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jMjJjZGE3MmE2YzY0ZTg0YmUyYWY4MDVjMjBmMWNkZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjgxNjkzNDQyOTQ5NzgsLTczLjk1NzM4NTM5MzUxODhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZTg2YjllZGYyZjg3NGIzN2FhODgyMzUzNTcwYzY1NzcpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZjEwNjg5OGEzMTQ5NGUwMjlmM2QwYjE3OWJhOTk4MWYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYjcxMDA0ZTgxM2VmNGM4ZTgxNTA3YTdiYzgwZjYwZjUgPSAkKCc8ZGl2IGlkPSJodG1sX2I3MTAwNGU4MTNlZjRjOGU4MTUwN2E3YmM4MGY2MGY1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NYW5oYXR0YW52aWxsZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZjEwNjg5OGEzMTQ5NGUwMjlmM2QwYjE3OWJhOTk4MWYuc2V0Q29udGVudChodG1sX2I3MTAwNGU4MTNlZjRjOGU4MTUwN2E3YmM4MGY2MGY1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2MyMmNkYTcyYTZjNjRlODRiZTJhZjgwNWMyMGYxY2RlLmJpbmRQb3B1cChwb3B1cF9mMTA2ODk4YTMxNDk0ZTAyOWYzZDBiMTc5YmE5OTgxZik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jZWRiYTZlMjYwODc0MjRkYWM1OWIzNTkzNGUzNDU1NSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjgxNTk3NjA2NzQyNDE0LC03My45NDMyMTExMjYwMzkwNV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9lODZiOWVkZjJmODc0YjM3YWE4ODIzNTM1NzBjNjU3Nyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hM2ZkNTRlNzcyNzg0ZDVlYWQxOTRkZDc5MjU0YWEyNSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83NGJiYzVhMmI1YzU0YjE2OGRkNjlhNTQ5NDNjYzg0NiA9ICQoJzxkaXYgaWQ9Imh0bWxfNzRiYmM1YTJiNWM1NGIxNjhkZDY5YTU0OTQzY2M4NDYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNlbnRyYWwgSGFybGVtPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hM2ZkNTRlNzcyNzg0ZDVlYWQxOTRkZDc5MjU0YWEyNS5zZXRDb250ZW50KGh0bWxfNzRiYmM1YTJiNWM1NGIxNjhkZDY5YTU0OTQzY2M4NDYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfY2VkYmE2ZTI2MDg3NDI0ZGFjNTliMzU5MzRlMzQ1NTUuYmluZFBvcHVwKHBvcHVwX2EzZmQ1NGU3NzI3ODRkNWVhZDE5NGRkNzkyNTRhYTI1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2I2MGM3MWMzZTIzNDQzMjQ4ZGU2NzFmYzg0ZDk3N2U1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzkyMjQ5NDY2NjMwMzMsLTczLjk0NDE4MjIzMTQ4NTI0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2U4NmI5ZWRmMmY4NzRiMzdhYTg4MjM1MzU3MGM2NTc3KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2I3OWM0ZDA1ZmM3NDQyYmE5ODY2MjA4MzM1Yjg1MjI0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2Y0NjAzZGMxMDAzNzQ0NzE4NWZhYTYzMDYyMzgyY2E1ID0gJCgnPGRpdiBpZD0iaHRtbF9mNDYwM2RjMTAwMzc0NDcxODVmYWE2MzA2MjM4MmNhNSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RWFzdCBIYXJsZW08L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2I3OWM0ZDA1ZmM3NDQyYmE5ODY2MjA4MzM1Yjg1MjI0LnNldENvbnRlbnQoaHRtbF9mNDYwM2RjMTAwMzc0NDcxODVmYWE2MzA2MjM4MmNhNSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9iNjBjNzFjM2UyMzQ0MzI0OGRlNjcxZmM4NGQ5NzdlNS5iaW5kUG9wdXAocG9wdXBfYjc5YzRkMDVmYzc0NDJiYTk4NjYyMDgzMzViODUyMjQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNzRiNDNkM2Q2ZjVlNDNmYmIxYzdjY2VlMGM4OWVmYmQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NzU2Mzg1NzMzMDE4MDUsLTczLjk2MDUwNzYzMTM1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2U4NmI5ZWRmMmY4NzRiMzdhYTg4MjM1MzU3MGM2NTc3KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2M4MTJlNDZkYzMxZDQ1YzE5MzM5MDJlYTI4Yjk4ZTNlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzNlZDQxYzFkYWVjOTQ1YmY4NjUyZDVmMmEyODhlYjE4ID0gJCgnPGRpdiBpZD0iaHRtbF8zZWQ0MWMxZGFlYzk0NWJmODY1MmQ1ZjJhMjg4ZWIxOCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+VXBwZXIgRWFzdCBTaWRlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jODEyZTQ2ZGMzMWQ0NWMxOTMzOTAyZWEyOGI5OGUzZS5zZXRDb250ZW50KGh0bWxfM2VkNDFjMWRhZWM5NDViZjg2NTJkNWYyYTI4OGViMTgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNzRiNDNkM2Q2ZjVlNDNmYmIxYzdjY2VlMGM4OWVmYmQuYmluZFBvcHVwKHBvcHVwX2M4MTJlNDZkYzMxZDQ1YzE5MzM5MDJlYTI4Yjk4ZTNlKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzFhNjgxNTczZThkYjRlNmQ4YzQ3ZmNmY2Q0MGRkZTg3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzc1OTI5ODQ5ODg0ODc1LC03My45NDcxMTc4NDQ3MTgyNl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9lODZiOWVkZjJmODc0YjM3YWE4ODIzNTM1NzBjNjU3Nyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lYzc0NWRmYTAwZDg0NzE3OTYwMzllNmZmMzI0M2QyYyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8yMjJmYWE4MTU4ZWE0YWY2OTU5YzBiZDQyMGZiYTA4MCA9ICQoJzxkaXYgaWQ9Imh0bWxfMjIyZmFhODE1OGVhNGFmNjk1OWMwYmQ0MjBmYmEwODAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPllvcmt2aWxsZTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZWM3NDVkZmEwMGQ4NDcxNzk2MDM5ZTZmZjMyNDNkMmMuc2V0Q29udGVudChodG1sXzIyMmZhYTgxNThlYTRhZjY5NTljMGJkNDIwZmJhMDgwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzFhNjgxNTczZThkYjRlNmQ4YzQ3ZmNmY2Q0MGRkZTg3LmJpbmRQb3B1cChwb3B1cF9lYzc0NWRmYTAwZDg0NzE3OTYwMzllNmZmMzI0M2QyYyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl82MjllNDViMThjZmM0MmY5YWYzM2RkODA0MTc3YzYxMSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc2ODExMjY1ODI4NzMzLC03My45NTg4NTk2ODgxMzc2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2U4NmI5ZWRmMmY4NzRiMzdhYTg4MjM1MzU3MGM2NTc3KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2Y2YTQ4YjdlZGFmZTQ4NDJhMGZjMDUxMWNhMDc5ZDUzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2M0MzM2MmI3OGIwNjQ4Zjk4MzMyNDI3MDZkYzdhMmIyID0gJCgnPGRpdiBpZD0iaHRtbF9jNDMzNjJiNzhiMDY0OGY5ODMzMjQyNzA2ZGM3YTJiMiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TGVub3ggSGlsbDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZjZhNDhiN2VkYWZlNDg0MmEwZmMwNTExY2EwNzlkNTMuc2V0Q29udGVudChodG1sX2M0MzM2MmI3OGIwNjQ4Zjk4MzMyNDI3MDZkYzdhMmIyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzYyOWU0NWIxOGNmYzQyZjlhZjMzZGQ4MDQxNzdjNjExLmJpbmRQb3B1cChwb3B1cF9mNmE0OGI3ZWRhZmU0ODQyYTBmYzA1MTFjYTA3OWQ1Myk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mMTY0ZDRlYzYxZDM0MDQyOGQ5MWJjOWZjZmY2MWYwZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc2MjE1OTYwNTc2MjgzLC03My45NDkxNjc2OTIyNzk1M10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9lODZiOWVkZjJmODc0YjM3YWE4ODIzNTM1NzBjNjU3Nyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xMjEyMGZlZTgwOTU0NGJhOGM1YTVlNTFjMTZkYzZiZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xNTBhMTBlYmQ5ZmI0OTllYTYyYTdmMTFhYTU2ZTJlZiA9ICQoJzxkaXYgaWQ9Imh0bWxfMTUwYTEwZWJkOWZiNDk5ZWE2MmE3ZjExYWE1NmUyZWYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlJvb3NldmVsdCBJc2xhbmQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzEyMTIwZmVlODA5NTQ0YmE4YzVhNWU1MWMxNmRjNmJkLnNldENvbnRlbnQoaHRtbF8xNTBhMTBlYmQ5ZmI0OTllYTYyYTdmMTFhYTU2ZTJlZik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9mMTY0ZDRlYzYxZDM0MDQyOGQ5MWJjOWZjZmY2MWYwZC5iaW5kUG9wdXAocG9wdXBfMTIxMjBmZWU4MDk1NDRiYThjNWE1ZTUxYzE2ZGM2YmQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMjI3ZjkzODhlNDA5NDM1YzhkN2UwZWZlYjg4MWE5ZjYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43ODc2NTc5OTg1MzQ4NTQsLTczLjk3NzA1OTIzNjMwNjAzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2U4NmI5ZWRmMmY4NzRiMzdhYTg4MjM1MzU3MGM2NTc3KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzgwYTJlZTYzMGMzZDQzMjJiODk2MzMzOTFmYzU2NzAwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2U2ZDQwZWYzNTlhMTRmMTM4MzRkMmFkOWRiZGQ3MTcxID0gJCgnPGRpdiBpZD0iaHRtbF9lNmQ0MGVmMzU5YTE0ZjEzODM0ZDJhZDlkYmRkNzE3MSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+VXBwZXIgV2VzdCBTaWRlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84MGEyZWU2MzBjM2Q0MzIyYjg5NjMzMzkxZmM1NjcwMC5zZXRDb250ZW50KGh0bWxfZTZkNDBlZjM1OWExNGYxMzgzNGQyYWQ5ZGJkZDcxNzEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMjI3ZjkzODhlNDA5NDM1YzhkN2UwZWZlYjg4MWE5ZjYuYmluZFBvcHVwKHBvcHVwXzgwYTJlZTYzMGMzZDQzMjJiODk2MzMzOTFmYzU2NzAwKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzc4ZmEyNjI4MDU1YzQ3ZDY4NWM0OThhOTAxMzYwYmVlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzczNTI4ODg5NDIxNjYsLTczLjk4NTMzNzc3MDAxMjYyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2U4NmI5ZWRmMmY4NzRiMzdhYTg4MjM1MzU3MGM2NTc3KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2NmZWY5ODVlZmI4NDQyYzE5NjQ3NzNiMjg1ZTFmN2E0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzY3N2YxMjc2ZGIyMzRjZmE5NzAxN2E0NGE3NmNiYzNjID0gJCgnPGRpdiBpZD0iaHRtbF82NzdmMTI3NmRiMjM0Y2ZhOTcwMTdhNDRhNzZjYmMzYyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TGluY29sbiBTcXVhcmU8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2NmZWY5ODVlZmI4NDQyYzE5NjQ3NzNiMjg1ZTFmN2E0LnNldENvbnRlbnQoaHRtbF82NzdmMTI3NmRiMjM0Y2ZhOTcwMTdhNDRhNzZjYmMzYyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl83OGZhMjYyODA1NWM0N2Q2ODVjNDk4YTkwMTM2MGJlZS5iaW5kUG9wdXAocG9wdXBfY2ZlZjk4NWVmYjg0NDJjMTk2NDc3M2IyODVlMWY3YTQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMDg5NjJiYTg2YzY2NDM2YWIyMDNhNzgwNjA5ZGMxNjQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NTkxMDA4OTE0NjIxMiwtNzMuOTk2MTE5MzYzMDk0NzldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZTg2YjllZGYyZjg3NGIzN2FhODgyMzUzNTcwYzY1NzcpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfY2MzNmUxMTdhYmUxNGM0YmEwYjA5Yjk3Y2Q3YjRjMWYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOTU1NDlhM2ViMDFlNDE2ZjhhMjMyNTk3YzBiODY2MzkgPSAkKCc8ZGl2IGlkPSJodG1sXzk1NTQ5YTNlYjAxZTQxNmY4YTIzMjU5N2MwYjg2NjM5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DbGludG9uPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jYzM2ZTExN2FiZTE0YzRiYTBiMDliOTdjZDdiNGMxZi5zZXRDb250ZW50KGh0bWxfOTU1NDlhM2ViMDFlNDE2ZjhhMjMyNTk3YzBiODY2MzkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMDg5NjJiYTg2YzY2NDM2YWIyMDNhNzgwNjA5ZGMxNjQuYmluZFBvcHVwKHBvcHVwX2NjMzZlMTE3YWJlMTRjNGJhMGIwOWI5N2NkN2I0YzFmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzJhZmVhNDEzODViODQ5YjQ4NjQ4YjM2MThhNTAzYjFkID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzU0NjkxMTAyNzA2MjMsLTczLjk4MTY2ODgyNzMwMzA0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2U4NmI5ZWRmMmY4NzRiMzdhYTg4MjM1MzU3MGM2NTc3KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzMxNDk1MDE0NmY3NjQzZmVhNjY4YzYxYmNmMTZkNTBjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2Y1MmM4NDdhMDk1MjQ2MjQ5MzY2NTI3MTdkMjljZTlmID0gJCgnPGRpdiBpZD0iaHRtbF9mNTJjODQ3YTA5NTI0NjI0OTM2NjUyNzE3ZDI5Y2U5ZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TWlkdG93bjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMzE0OTUwMTQ2Zjc2NDNmZWE2NjhjNjFiY2YxNmQ1MGMuc2V0Q29udGVudChodG1sX2Y1MmM4NDdhMDk1MjQ2MjQ5MzY2NTI3MTdkMjljZTlmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzJhZmVhNDEzODViODQ5YjQ4NjQ4YjM2MThhNTAzYjFkLmJpbmRQb3B1cChwb3B1cF8zMTQ5NTAxNDZmNzY0M2ZlYTY2OGM2MWJjZjE2ZDUwYyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81OTJhZjc5ZTczMzM0ZWVkYTc2Y2Q3ZjlmMzA5ODQ5YiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc0ODMwMzA3NzI1MjE3NCwtNzMuOTc4MzMyMDc5MjQxMjddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZTg2YjllZGYyZjg3NGIzN2FhODgyMzUzNTcwYzY1NzcpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfODk5ZjI4YzE3ZWI0NDU2NDg1Y2E2ZGRlNDM0YWYwOTIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNDIzMjIyOGY0MGY5NDMwMzkyMTcwZDhlZTEwYTIyZTIgPSAkKCc8ZGl2IGlkPSJodG1sXzQyMzIyMjhmNDBmOTQzMDM5MjE3MGQ4ZWUxMGEyMmUyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NdXJyYXkgSGlsbDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfODk5ZjI4YzE3ZWI0NDU2NDg1Y2E2ZGRlNDM0YWYwOTIuc2V0Q29udGVudChodG1sXzQyMzIyMjhmNDBmOTQzMDM5MjE3MGQ4ZWUxMGEyMmUyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzU5MmFmNzllNzMzMzRlZWRhNzZjZDdmOWYzMDk4NDliLmJpbmRQb3B1cChwb3B1cF84OTlmMjhjMTdlYjQ0NTY0ODVjYTZkZGU0MzRhZjA5Mik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl82YzQxMzhiMzlhNGY0YjNlOWM4YTViOWM1ZjA5NjliMSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc0NDAzNDcwNjc0Nzk3NSwtNzQuMDAzMTE2MzM0NzI4MTNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZTg2YjllZGYyZjg3NGIzN2FhODgyMzUzNTcwYzY1NzcpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZmZlZDM5Mzk5ZWRhNGM4YTg5ZGRhNmFlOGNiMDZmZTQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfM2U2MjA4OWFkYjk0NDQxNzg0NDM1OWMwYWE4ZDkzNzIgPSAkKCc8ZGl2IGlkPSJodG1sXzNlNjIwODlhZGI5NDQ0MTc4NDQzNTljMGFhOGQ5MzcyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DaGVsc2VhPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mZmVkMzkzOTllZGE0YzhhODlkZGE2YWU4Y2IwNmZlNC5zZXRDb250ZW50KGh0bWxfM2U2MjA4OWFkYjk0NDQxNzg0NDM1OWMwYWE4ZDkzNzIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNmM0MTM4YjM5YTRmNGIzZTljOGE1YjljNWYwOTY5YjEuYmluZFBvcHVwKHBvcHVwX2ZmZWQzOTM5OWVkYTRjOGE4OWRkYTZhZThjYjA2ZmU0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzcwNWFlYTkyMzJhNTQ5ZDFhNWJmNDlkZDM5M2NkYjIzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzI2OTMyODg1MzYxMjgsLTczLjk5OTkxNDAyOTQ1OTAyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2U4NmI5ZWRmMmY4NzRiMzdhYTg4MjM1MzU3MGM2NTc3KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2JhMDkwYTc3MDc0MDRkZTA4MGRiZDUwOGRlNzk1OTEyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2NmMTVhOTkzZWFhNTRmZTliYTNiMjc1MTkzMDBhNjQ5ID0gJCgnPGRpdiBpZD0iaHRtbF9jZjE1YTk5M2VhYTU0ZmU5YmEzYjI3NTE5MzAwYTY0OSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+R3JlZW53aWNoIFZpbGxhZ2U8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2JhMDkwYTc3MDc0MDRkZTA4MGRiZDUwOGRlNzk1OTEyLnNldENvbnRlbnQoaHRtbF9jZjE1YTk5M2VhYTU0ZmU5YmEzYjI3NTE5MzAwYTY0OSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl83MDVhZWE5MjMyYTU0OWQxYTViZjQ5ZGQzOTNjZGIyMy5iaW5kUG9wdXAocG9wdXBfYmEwOTBhNzcwNzQwNGRlMDgwZGJkNTA4ZGU3OTU5MTIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNTdjNGIwMjI5Zjc1NGNkMmI0MmM5ZWRhNWQ3MDlmNDUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43Mjc4NDY3NzcyNzAyNDQsLTczLjk4MjIyNjE2NTA2NDE2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2U4NmI5ZWRmMmY4NzRiMzdhYTg4MjM1MzU3MGM2NTc3KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzcwY2EwNDQ0OTk3ZjRhNmM4MWM0YjExMDcyZTZkMTNiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2VkMTM3MGMyODA2ODQzOWVhZTVmMzgxNzhhZDJmZWE1ID0gJCgnPGRpdiBpZD0iaHRtbF9lZDEzNzBjMjgwNjg0MzllYWU1ZjM4MTc4YWQyZmVhNSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RWFzdCBWaWxsYWdlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83MGNhMDQ0NDk5N2Y0YTZjODFjNGIxMTA3MmU2ZDEzYi5zZXRDb250ZW50KGh0bWxfZWQxMzcwYzI4MDY4NDM5ZWFlNWYzODE3OGFkMmZlYTUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNTdjNGIwMjI5Zjc1NGNkMmI0MmM5ZWRhNWQ3MDlmNDUuYmluZFBvcHVwKHBvcHVwXzcwY2EwNDQ0OTk3ZjRhNmM4MWM0YjExMDcyZTZkMTNiKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzY2ZGNmNTliNDU2NTQzNDdhYWY3NTY5OWIyZGZjYmUwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzE3ODA2NzQ4OTI3NjUsLTczLjk4MDg5MDMxOTk5MjkxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2U4NmI5ZWRmMmY4NzRiMzdhYTg4MjM1MzU3MGM2NTc3KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzkwOGNiZmM2N2E5YzRmNTNiNmIwOTg2MWJmNzE3MGRiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2QxNWI2MDNiYTQ0ZTQ4YTFhY2VhZTQ5NzQ4ZWFmOTQyID0gJCgnPGRpdiBpZD0iaHRtbF9kMTViNjAzYmE0NGU0OGExYWNlYWU0OTc0OGVhZjk0MiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TG93ZXIgRWFzdCBTaWRlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85MDhjYmZjNjdhOWM0ZjUzYjZiMDk4NjFiZjcxNzBkYi5zZXRDb250ZW50KGh0bWxfZDE1YjYwM2JhNDRlNDhhMWFjZWFlNDk3NDhlYWY5NDIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNjZkY2Y1OWI0NTY1NDM0N2FhZjc1Njk5YjJkZmNiZTAuYmluZFBvcHVwKHBvcHVwXzkwOGNiZmM2N2E5YzRmNTNiNmIwOTg2MWJmNzE3MGRiKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzczMGQ1NWRiM2NjNjQ3M2Y4MjYzMDNkZGM2N2ZhNWJmID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzIxNTIxOTY3NDQzMjE2LC03NC4wMTA2ODMyODU1OTA4N10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9lODZiOWVkZjJmODc0YjM3YWE4ODIzNTM1NzBjNjU3Nyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF84NmQyNDYxNmVmMWY0M2ZmODg0ZDc2YmU5MmM3NWE2NCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xMWU4OGRiN2M1M2E0ZjdkYjY1Y2U1ZDgwYWIwYWY2OCA9ICQoJzxkaXYgaWQ9Imh0bWxfMTFlODhkYjdjNTNhNGY3ZGI2NWNlNWQ4MGFiMGFmNjgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlRyaWJlY2E8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzg2ZDI0NjE2ZWYxZjQzZmY4ODRkNzZiZTkyYzc1YTY0LnNldENvbnRlbnQoaHRtbF8xMWU4OGRiN2M1M2E0ZjdkYjY1Y2U1ZDgwYWIwYWY2OCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl83MzBkNTVkYjNjYzY0NzNmODI2MzAzZGRjNjdmYTViZi5iaW5kUG9wdXAocG9wdXBfODZkMjQ2MTZlZjFmNDNmZjg4NGQ3NmJlOTJjNzVhNjQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNmZiYjUzZDNhZTc1NGVjMjlkMDNiZWVhMmQ5ODIzODMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MTkzMjM3OTM5NTkwNywtNzMuOTk3MzA0NjcyMDgwNzNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZTg2YjllZGYyZjg3NGIzN2FhODgyMzUzNTcwYzY1NzcpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYzg1MmFkZjVjZmE0NDFkMjk3ZGIzZTljNzdjMjM0NDIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYWRkZDBmNDRhYWVjNDcyYzkzMWNjMjU2Mzk0MDRiMWMgPSAkKCc8ZGl2IGlkPSJodG1sX2FkZGQwZjQ0YWFlYzQ3MmM5MzFjYzI1NjM5NDA0YjFjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5MaXR0bGUgSXRhbHk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2M4NTJhZGY1Y2ZhNDQxZDI5N2RiM2U5Yzc3YzIzNDQyLnNldENvbnRlbnQoaHRtbF9hZGRkMGY0NGFhZWM0NzJjOTMxY2MyNTYzOTQwNGIxYyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl82ZmJiNTNkM2FlNzU0ZWMyOWQwM2JlZWEyZDk4MjM4My5iaW5kUG9wdXAocG9wdXBfYzg1MmFkZjVjZmE0NDFkMjk3ZGIzZTljNzdjMjM0NDIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMjk3ZjJkMjI4NmQwNGIxYmI2OGEwMzgwMWU3ODdjZWUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MjIxODM4NDEzMTc5NCwtNzQuMDAwNjU2NjY5NTk3NTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZTg2YjllZGYyZjg3NGIzN2FhODgyMzUzNTcwYzY1NzcpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZDE1MzhiMDExNGRmNGU2OGEyNGUwOGIzZjk4YTBmZjYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMzY0OTExMzQyMmQ3NGNhYzllYjAzN2UxN2FhZjU1ZTAgPSAkKCc8ZGl2IGlkPSJodG1sXzM2NDkxMTM0MjJkNzRjYWM5ZWIwMzdlMTdhYWY1NWUwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Tb2hvPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kMTUzOGIwMTE0ZGY0ZTY4YTI0ZTA4YjNmOThhMGZmNi5zZXRDb250ZW50KGh0bWxfMzY0OTExMzQyMmQ3NGNhYzllYjAzN2UxN2FhZjU1ZTApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMjk3ZjJkMjI4NmQwNGIxYmI2OGEwMzgwMWU3ODdjZWUuYmluZFBvcHVwKHBvcHVwX2QxNTM4YjAxMTRkZjRlNjhhMjRlMDhiM2Y5OGEwZmY2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzExNjRkYmE5OWRkMjQ1OGRiODc4Y2Q5N2I4ZGEwOGQ5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzM0NDMzOTM1NzI0MzQsLTc0LjAwNjE3OTk4MTI2ODEyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2U4NmI5ZWRmMmY4NzRiMzdhYTg4MjM1MzU3MGM2NTc3KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzYxNDRlOGZhMDA4MzQ0ZjNiNjhjYjYwYmE1ODY4OTJmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzYzOTExNjRhMWZmNzRhYjY4ZTMzNDU0MDJkODkyZjE1ID0gJCgnPGRpdiBpZD0iaHRtbF82MzkxMTY0YTFmZjc0YWI2OGUzMzQ1NDAyZDg5MmYxNSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+V2VzdCBWaWxsYWdlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82MTQ0ZThmYTAwODM0NGYzYjY4Y2I2MGJhNTg2ODkyZi5zZXRDb250ZW50KGh0bWxfNjM5MTE2NGExZmY3NGFiNjhlMzM0NTQwMmQ4OTJmMTUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMTE2NGRiYTk5ZGQyNDU4ZGI4NzhjZDk3YjhkYTA4ZDkuYmluZFBvcHVwKHBvcHVwXzYxNDRlOGZhMDA4MzQ0ZjNiNjhjYjYwYmE1ODY4OTJmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzlkNWU0ZTEyMWQ2YTRiM2ZiNmFkM2I5NWY0YjI5ZDFhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzk3MzA3MDQxNzAyODY1LC03My45NjQyODYxNzc0MDY1NV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9lODZiOWVkZjJmODc0YjM3YWE4ODIzNTM1NzBjNjU3Nyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lMWMwZGE4NjNlNmY0NTk3YmZkOTRiYThlMWI1MWNiZSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF81ZDc3MjMyZGQ0NTk0NjgxYjU2MWYxNzkxMTBhMTk4OSA9ICQoJzxkaXYgaWQ9Imh0bWxfNWQ3NzIzMmRkNDU5NDY4MWI1NjFmMTc5MTEwYTE5ODkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk1hbmhhdHRhbiBWYWxsZXk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2UxYzBkYTg2M2U2ZjQ1OTdiZmQ5NGJhOGUxYjUxY2JlLnNldENvbnRlbnQoaHRtbF81ZDc3MjMyZGQ0NTk0NjgxYjU2MWYxNzkxMTBhMTk4OSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl85ZDVlNGUxMjFkNmE0YjNmYjZhZDNiOTVmNGIyOWQxYS5iaW5kUG9wdXAocG9wdXBfZTFjMGRhODYzZTZmNDU5N2JmZDk0YmE4ZTFiNTFjYmUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZTU1ZTk0Yzc2NjIxNGY3Nzk0YzYyMjQ5MDc2YmM3ZTUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC44MDc5OTk3MzgxNjU4MjYsLTczLjk2Mzg5NjI3OTA1MzMyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2U4NmI5ZWRmMmY4NzRiMzdhYTg4MjM1MzU3MGM2NTc3KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzg3Y2YxYjVkMDlhYjRjMzc5OGQzM2QzMDMwMDkwOGYyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzllY2EyZTA1ODM0OTQyMjlhNjI4ZTFjNGIyMDJiOGY3ID0gJCgnPGRpdiBpZD0iaHRtbF85ZWNhMmUwNTgzNDk0MjI5YTYyOGUxYzRiMjAyYjhmNyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TW9ybmluZ3NpZGUgSGVpZ2h0czwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfODdjZjFiNWQwOWFiNGMzNzk4ZDMzZDMwMzAwOTA4ZjIuc2V0Q29udGVudChodG1sXzllY2EyZTA1ODM0OTQyMjlhNjI4ZTFjNGIyMDJiOGY3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2U1NWU5NGM3NjYyMTRmNzc5NGM2MjI0OTA3NmJjN2U1LmJpbmRQb3B1cChwb3B1cF84N2NmMWI1ZDA5YWI0YzM3OThkMzNkMzAzMDA5MDhmMik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81MGQyMDE0MGM5NTk0NTI1OGI3YTFhMzEzZDJhMzU0NiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjczNzIwOTgzMjcxNSwtNzMuOTgxMzc1OTQ4MzM1NDFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZTg2YjllZGYyZjg3NGIzN2FhODgyMzUzNTcwYzY1NzcpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMmVhMGZhZWRmN2U1NDhlZWFlMzY3OTAxOTNjOGE0MmQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYmQxOGI5MmYzN2MwNGQ5MWI0OWJkZTFmMzViOTBlMTYgPSAkKCc8ZGl2IGlkPSJodG1sX2JkMThiOTJmMzdjMDRkOTFiNDliZGUxZjM1YjkwZTE2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5HcmFtZXJjeTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMmVhMGZhZWRmN2U1NDhlZWFlMzY3OTAxOTNjOGE0MmQuc2V0Q29udGVudChodG1sX2JkMThiOTJmMzdjMDRkOTFiNDliZGUxZjM1YjkwZTE2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzUwZDIwMTQwYzk1OTQ1MjU4YjdhMWEzMTNkMmEzNTQ2LmJpbmRQb3B1cChwb3B1cF8yZWEwZmFlZGY3ZTU0OGVlYWUzNjc5MDE5M2M4YTQyZCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9kOTg3ODM5ZWRhNzY0MjUxOGRkYmRjMjUyZGNjNzJhOCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjcxMTkzMTk4Mzk0NTY1LC03NC4wMTY4NjkzMDUwODYxN10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9lODZiOWVkZjJmODc0YjM3YWE4ODIzNTM1NzBjNjU3Nyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iMGU5NTJhMDE1YTE0OWJlYTU0MzI5NTVhYTc4NmI3NiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lODEwM2M2N2QzNzA0MzAyOWU3MTJjOTgyNTkxNzEzZiA9ICQoJzxkaXYgaWQ9Imh0bWxfZTgxMDNjNjdkMzcwNDMwMjllNzEyYzk4MjU5MTcxM2YiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkJhdHRlcnkgUGFyayBDaXR5PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iMGU5NTJhMDE1YTE0OWJlYTU0MzI5NTVhYTc4NmI3Ni5zZXRDb250ZW50KGh0bWxfZTgxMDNjNjdkMzcwNDMwMjllNzEyYzk4MjU5MTcxM2YpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZDk4NzgzOWVkYTc2NDI1MThkZGJkYzI1MmRjYzcyYTguYmluZFBvcHVwKHBvcHVwX2IwZTk1MmEwMTVhMTQ5YmVhNTQzMjk1NWFhNzg2Yjc2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2VkZmU0ZDRjYTNlNDRkOTc5ZTZkMWMxOWFjZjA1MjM0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzA3MTA3MTA3MjcwNDgsLTc0LjAxMDY2NTQ0NTIxMjddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZTg2YjllZGYyZjg3NGIzN2FhODgyMzUzNTcwYzY1NzcpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMjU5NGE1NTBlNDMxNDEyMThlNjA5MjdhZGI3MzgxNGEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYzdkMDhjYTQ0NGM5NDU0MmE4M2JmMDljNTk1ZTk3MzggPSAkKCc8ZGl2IGlkPSJodG1sX2M3ZDA4Y2E0NDRjOTQ1NDJhODNiZjA5YzU5NWU5NzM4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5GaW5hbmNpYWwgRGlzdHJpY3Q8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzI1OTRhNTUwZTQzMTQxMjE4ZTYwOTI3YWRiNzM4MTRhLnNldENvbnRlbnQoaHRtbF9jN2QwOGNhNDQ0Yzk0NTQyYTgzYmYwOWM1OTVlOTczOCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9lZGZlNGQ0Y2EzZTQ0ZDk3OWU2ZDFjMTlhY2YwNTIzNC5iaW5kUG9wdXAocG9wdXBfMjU5NGE1NTBlNDMxNDEyMThlNjA5MjdhZGI3MzgxNGEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZWQ5YWFmNzc4NTg1NGMzZmIyY2Y3NzcwZGVmODg2OTMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43ODI2ODI1NjcxMjU3LC03My45NTMyNTY0NjgzNzExMl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJibHVlIiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiIzMxODZjYyIsCiAgImZpbGxPcGFjaXR5IjogMC43LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9lODZiOWVkZjJmODc0YjM3YWE4ODIzNTM1NzBjNjU3Nyk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF80YmU5N2MwMjE3MzA0NDNjYWE0MGNhM2ViOTU1OTgwZSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8yNDY1Mjc5NDhjNDg0M2IyOGQ4MGM5NjU5Y2M5MmViZSA9ICQoJzxkaXYgaWQ9Imh0bWxfMjQ2NTI3OTQ4YzQ4NDNiMjhkODBjOTY1OWNjOTJlYmUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNhcm5lZ2llIEhpbGw8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzRiZTk3YzAyMTczMDQ0M2NhYTQwY2EzZWI5NTU5ODBlLnNldENvbnRlbnQoaHRtbF8yNDY1Mjc5NDhjNDg0M2IyOGQ4MGM5NjU5Y2M5MmViZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9lZDlhYWY3Nzg1ODU0YzNmYjJjZjc3NzBkZWY4ODY5My5iaW5kUG9wdXAocG9wdXBfNGJlOTdjMDIxNzMwNDQzY2FhNDBjYTNlYjk1NTk4MGUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOGZmNzFmZjQ5NGEwNDI5N2FiNTMwMjkwMDcwNGI5NzkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43MjMyNTkwMTg4NTc2OCwtNzMuOTg4NDMzNjgwMjM1OTddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZTg2YjllZGYyZjg3NGIzN2FhODgyMzUzNTcwYzY1NzcpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYmRhNjhjZjFkOWJjNGVmMGIwZjNjODk1ZGE2MTFkNTMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYTBlNzJlMTBkMTBhNDIxN2E5ZjY0NWVjYzhjN2E5N2YgPSAkKCc8ZGl2IGlkPSJodG1sX2EwZTcyZTEwZDEwYTQyMTdhOWY2NDVlY2M4YzdhOTdmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Ob2hvPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iZGE2OGNmMWQ5YmM0ZWYwYjBmM2M4OTVkYTYxMWQ1My5zZXRDb250ZW50KGh0bWxfYTBlNzJlMTBkMTBhNDIxN2E5ZjY0NWVjYzhjN2E5N2YpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOGZmNzFmZjQ5NGEwNDI5N2FiNTMwMjkwMDcwNGI5NzkuYmluZFBvcHVwKHBvcHVwX2JkYTY4Y2YxZDliYzRlZjBiMGYzYzg5NWRhNjExZDUzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzdhOWNkYWIyOTE1YTQwMGFhMTViNWFmNDNhNTliMDRmID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzE1MjI4OTIwNDYyODIsLTc0LjAwNTQxNTI5ODczMzU1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2U4NmI5ZWRmMmY4NzRiMzdhYTg4MjM1MzU3MGM2NTc3KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2M0YTI3YmQ3YWI1ODRiNmFhOGZhZTdkMzg4MGYzNGViID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzc3OTY1ZDU0OTNkOTRlY2NiYTE3NjM2NDQzYThhMGUzID0gJCgnPGRpdiBpZD0iaHRtbF83Nzk2NWQ1NDkzZDk0ZWNjYmExNzYzNjQ0M2E4YTBlMyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q2l2aWMgQ2VudGVyPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jNGEyN2JkN2FiNTg0YjZhYThmYWU3ZDM4ODBmMzRlYi5zZXRDb250ZW50KGh0bWxfNzc5NjVkNTQ5M2Q5NGVjY2JhMTc2MzY0NDNhOGEwZTMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfN2E5Y2RhYjI5MTVhNDAwYWExNWI1YWY0M2E1OWIwNGYuYmluZFBvcHVwKHBvcHVwX2M0YTI3YmQ3YWI1ODRiNmFhOGZhZTdkMzg4MGYzNGViKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzc5YTMyODU5NGM4MzQ1ZjQ5MGQxYWY3NjZlNzMwZjBlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzQ4NTA5NjY0MzEyMiwtNzMuOTg4NzEzMTMyODUyNDddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZTg2YjllZGYyZjg3NGIzN2FhODgyMzUzNTcwYzY1NzcpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOWYxODZmMGE2MzA2NGZlNmI5MTc0MDE0NmRjMDExOWQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNzU1YjNmNTQyZGFkNDBmOGFiYjRjNjAxYjEyNDM4NzggPSAkKCc8ZGl2IGlkPSJodG1sXzc1NWIzZjU0MmRhZDQwZjhhYmI0YzYwMWIxMjQzODc4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NaWR0b3duIFNvdXRoPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85ZjE4NmYwYTYzMDY0ZmU2YjkxNzQwMTQ2ZGMwMTE5ZC5zZXRDb250ZW50KGh0bWxfNzU1YjNmNTQyZGFkNDBmOGFiYjRjNjAxYjEyNDM4NzgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNzlhMzI4NTk0YzgzNDVmNDkwZDFhZjc2NmU3MzBmMGUuYmluZFBvcHVwKHBvcHVwXzlmMTg2ZjBhNjMwNjRmZTZiOTE3NDAxNDZkYzAxMTlkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzg5ODc0YjQ1OTZjNDRmY2E5NGNiN2Q3NDJmZDc1NzExID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzYwMjgwMzMxMzEzNzQsLTczLjk2MzU1NjE0MDk0MzAzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2U4NmI5ZWRmMmY4NzRiMzdhYTg4MjM1MzU3MGM2NTc3KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzNjNjI4OGIzOTE5ZjQ3YWU4Njk1ZDU3ZGZjYjZiYzVmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2Q2NmFmNWE5M2FlMjQwYTJiNTFlMGJhMWFlZWY0NmYxID0gJCgnPGRpdiBpZD0iaHRtbF9kNjZhZjVhOTNhZTI0MGEyYjUxZTBiYTFhZWVmNDZmMSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U3V0dG9uIFBsYWNlPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zYzYyODhiMzkxOWY0N2FlODY5NWQ1N2RmY2I2YmM1Zi5zZXRDb250ZW50KGh0bWxfZDY2YWY1YTkzYWUyNDBhMmI1MWUwYmExYWVlZjQ2ZjEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfODk4NzRiNDU5NmM0NGZjYTk0Y2I3ZDc0MmZkNzU3MTEuYmluZFBvcHVwKHBvcHVwXzNjNjI4OGIzOTE5ZjQ3YWU4Njk1ZDU3ZGZjYjZiYzVmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzk3NDJhNjY3OTk0YTRhMWI4YTYxYjFlYzQzN2MxZWQwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzUyMDQyMzY5NTA3MjIsLTczLjk2NzcwODI0NTgxODM0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2U4NmI5ZWRmMmY4NzRiMzdhYTg4MjM1MzU3MGM2NTc3KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzEyNzk4MTdjZTgwNDRiNjZiMDRhNjM0ZDBjNjk3YzlhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzhiMmQ2ZTM3YTE1NzQ4YTdiOTQzMzAxNWU3ZDcxYTgzID0gJCgnPGRpdiBpZD0iaHRtbF84YjJkNmUzN2ExNTc0OGE3Yjk0MzMwMTVlN2Q3MWE4MyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+VHVydGxlIEJheTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMTI3OTgxN2NlODA0NGI2NmIwNGE2MzRkMGM2OTdjOWEuc2V0Q29udGVudChodG1sXzhiMmQ2ZTM3YTE1NzQ4YTdiOTQzMzAxNWU3ZDcxYTgzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzk3NDJhNjY3OTk0YTRhMWI4YTYxYjFlYzQzN2MxZWQwLmJpbmRQb3B1cChwb3B1cF8xMjc5ODE3Y2U4MDQ0YjY2YjA0YTYzNGQwYzY5N2M5YSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xNzUxNGQ3ODM1N2Y0NzBmYjAzMGNkMjI3ZDMzZDM5MyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc0NjkxNzQxMDc0MDE5NSwtNzMuOTcxMjE5Mjg3MjIyNjVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZTg2YjllZGYyZjg3NGIzN2FhODgyMzUzNTcwYzY1NzcpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYjMyNTBjMjhlMWFjNDZhYWI4MzM4YTU4NWE2Nzg0MjkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYzUyMjg2YmI5N2Q2NDJlZmFhZjY1YWQzNjFhZDY4OTMgPSAkKCc8ZGl2IGlkPSJodG1sX2M1MjI4NmJiOTdkNjQyZWZhYWY2NWFkMzYxYWQ2ODkzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5UdWRvciBDaXR5PC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iMzI1MGMyOGUxYWM0NmFhYjgzMzhhNTg1YTY3ODQyOS5zZXRDb250ZW50KGh0bWxfYzUyMjg2YmI5N2Q2NDJlZmFhZjY1YWQzNjFhZDY4OTMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMTc1MTRkNzgzNTdmNDcwZmIwMzBjZDIyN2QzM2QzOTMuYmluZFBvcHVwKHBvcHVwX2IzMjUwYzI4ZTFhYzQ2YWFiODMzOGE1ODVhNjc4NDI5KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2RhMWE0N2ZmMDZlODQ0MzdhYjkxN2RiNzAzMWY4MWUwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzMwOTk5NTU0NzcwNjEsLTczLjk3NDA1MTcwNDY5MjAzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2U4NmI5ZWRmMmY4NzRiMzdhYTg4MjM1MzU3MGM2NTc3KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzMxZWFlYTdmNmI4NDRkNTc5NTZjMTdlYTMwZDk5ZjQ2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2VhOWZhYjU1MTg2ZjQ0ZmY4OGY0MmRiZjc3ZjcxZGQ3ID0gJCgnPGRpdiBpZD0iaHRtbF9lYTlmYWI1NTE4NmY0NGZmODhmNDJkYmY3N2Y3MWRkNyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U3R1eXZlc2FudCBUb3duPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zMWVhZWE3ZjZiODQ0ZDU3OTU2YzE3ZWEzMGQ5OWY0Ni5zZXRDb250ZW50KGh0bWxfZWE5ZmFiNTUxODZmNDRmZjg4ZjQyZGJmNzdmNzFkZDcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZGExYTQ3ZmYwNmU4NDQzN2FiOTE3ZGI3MDMxZjgxZTAuYmluZFBvcHVwKHBvcHVwXzMxZWFlYTdmNmI4NDRkNTc5NTZjMTdlYTMwZDk5ZjQ2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzUyOWRmMDdmMTY0NTQxNWI4N2MxZGZjNWI5ZDU4YmQyID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzM5NjczMDQ3NjM4NDI2LC03My45OTA5NDcxMDUyODI2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogImJsdWUiLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICIjMzE4NmNjIiwKICAiZmlsbE9wYWNpdHkiOiAwLjcsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2U4NmI5ZWRmMmY4NzRiMzdhYTg4MjM1MzU3MGM2NTc3KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzY2MzZhYzVlYTNjMDRjMjNhZWYwOWFjOWI1ZGZjYjUzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzAxZjM5M2MzMjk4ZTQ1Yjc5OTNjMDE3ZGQ5Y2UzNWU4ID0gJCgnPGRpdiBpZD0iaHRtbF8wMWYzOTNjMzI5OGU0NWI3OTkzYzAxN2RkOWNlMzVlOCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RmxhdGlyb248L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzY2MzZhYzVlYTNjMDRjMjNhZWYwOWFjOWI1ZGZjYjUzLnNldENvbnRlbnQoaHRtbF8wMWYzOTNjMzI5OGU0NWI3OTkzYzAxN2RkOWNlMzVlOCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81MjlkZjA3ZjE2NDU0MTViODdjMWRmYzViOWQ1OGJkMi5iaW5kUG9wdXAocG9wdXBfNjYzNmFjNWVhM2MwNGMyM2FlZjA5YWM5YjVkZmNiNTMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYTcyZDNmZjY3MzdiNDc4OWI1YzUxNDM2NGZkNmU3ZWMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MC43NTY2NTgwODIyNzUxOSwtNzQuMDAwMTExMzYyMDI2MzddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAiYmx1ZSIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogIiMzMTg2Y2MiLAogICJmaWxsT3BhY2l0eSI6IDAuNywKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZTg2YjllZGYyZjg3NGIzN2FhODgyMzUzNTcwYzY1NzcpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZmYyYzE1OWU2NzM5NDgxMmI0MTViZjE4YmU2YWU4NjIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMGE1NjYxMWM5NDA1NDI2OThiNjRlMmY1MGZiNmRjNTcgPSAkKCc8ZGl2IGlkPSJodG1sXzBhNTY2MTFjOTQwNTQyNjk4YjY0ZTJmNTBmYjZkYzU3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5IdWRzb24gWWFyZHM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2ZmMmMxNTllNjczOTQ4MTJiNDE1YmYxOGJlNmFlODYyLnNldENvbnRlbnQoaHRtbF8wYTU2NjExYzk0MDU0MjY5OGI2NGUyZjUwZmI2ZGM1Nyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9hNzJkM2ZmNjczN2I0Nzg5YjVjNTE0MzY0ZmQ2ZTdlYy5iaW5kUG9wdXAocG9wdXBfZmYyYzE1OWU2NzM5NDgxMmI0MTViZjE4YmU2YWU4NjIpOwoKICAgICAgICAgICAgCiAgICAgICAgCjwvc2NyaXB0Pg==\" 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 0x7f86c5256390>" | |
] | |
}, | |
"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: 5U2T23VF03PLNMRSAQ4VUSL4TX4N0Y0TD0L4ZKA5DCWEZHTR\n", | |
"CLIENT_SECRET:W1VVTS2CF01FATKXALYKGK35CCZ05F5ERVQZIQUZCDTMNW2X\n" | |
] | |
} | |
], | |
"source": [ | |
"CLIENT_ID = '5U2T23VF03PLNMRSAQ4VUSL4TX4N0Y0TD0L4ZKA5DCWEZHTR' # your Foursquare ID\n", | |
"CLIENT_SECRET = 'W1VVTS2CF01FATKXALYKGK35CCZ05F5ERVQZIQUZCDTMNW2X' # your Foursquare Secret\n", | |
"VERSION = '20180605'\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": 22, | |
"metadata": { | |
"collapsed": false, | |
"jupyter": { | |
"outputs_hidden": false | |
}, | |
"scrolled": true | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"'https://api.foursquare.com/v2/venues/explore?&client_id=5U2T23VF03PLNMRSAQ4VUSL4TX4N0Y0TD0L4ZKA5DCWEZHTR&client_secret=W1VVTS2CF01FATKXALYKGK35CCZ05F5ERVQZIQUZCDTMNW2X&v=20180605&ll=40.87655077879964,-73.91065965862981&radius=500&limit=100'" | |
] | |
}, | |
"execution_count": 22, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"LIMIT = 100 # limit of number of venues returned by Foursquare API\n", | |
"\n", | |
"radius = 500 # define radius\n", | |
"\n", | |
"# create URL\n", | |
"url = 'https://api.foursquare.com/v2/venues/explore?&client_id={}&client_secret={}&v={}&ll={},{}&radius={}&limit={}'.format(\n", | |
" CLIENT_ID, \n", | |
" CLIENT_SECRET, \n", | |
" VERSION, \n", | |
" neighborhood_latitude, \n", | |
" neighborhood_longitude, \n", | |
" radius, \n", | |
" LIMIT)\n", | |
"url # display URL\n", | |
" \n", | |
"\n", | |
"\n" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"Send the GET request and examine the resutls" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 23, | |
"metadata": { | |
"collapsed": false, | |
"jupyter": { | |
"outputs_hidden": false | |
} | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"{'meta': {'code': 200, 'requestId': '5d90d42092e7a9002c37b3e2'},\n", | |
" 'response': {'suggestedFilters': {'header': 'Tap to show:',\n", | |
" 'filters': [{'name': 'Open now', 'key': 'openNow'}]},\n", | |
" 'headerLocation': 'Marble Hill',\n", | |
" 'headerFullLocation': 'Marble Hill, New York',\n", | |
" 'headerLocationGranularity': 'neighborhood',\n", | |
" 'totalResults': 24,\n", | |
" 'suggestedBounds': {'ne': {'lat': 40.88105078329964,\n", | |
" 'lng': -73.90471933917806},\n", | |
" 'sw': {'lat': 40.87205077429964, 'lng': -73.91659997808156}},\n", | |
" 'groups': [{'type': 'Recommended Places',\n", | |
" 'name': 'recommended',\n", | |
" 'items': [{'reasons': {'count': 0,\n", | |
" 'items': [{'summary': 'This spot is popular',\n", | |
" 'type': 'general',\n", | |
" 'reasonName': 'globalInteractionReason'}]},\n", | |
" 'venue': {'id': '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': '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-7'},\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-8'},\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-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',\n", | |
" 'Bronx, NY 10463',\n", | |
" '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': '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-12'},\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-13'},\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',\n", | |
" 'lat': 40.87745060873134,\n", | |
" 'lng': -73.9051704920654,\n", | |
" 'labeledLatLngs': [{'label': 'display',\n", | |
" 'lat': 40.87745060873134,\n", | |
" 'lng': -73.9051704920654}],\n", | |
" 'distance': 472,\n", | |
" 'postalCode': '10463',\n", | |
" 'cc': 'US',\n", | |
" 'city': 'Bronx',\n", | |
" 'state': 'NY',\n", | |
" 'country': 'United States',\n", | |
" 'formattedAddress': ['171 W 230th St',\n", | |
" 'Bronx, NY 10463',\n", | |
" 'United States']},\n", | |
" 'categories': [{'id': '4bf58dd8d48988d1ff941735',\n", | |
" 'name': 'Miscellaneous Shop',\n", | |
" 'pluralName': 'Miscellaneous Shops',\n", | |
" 'shortName': 'Shop',\n", | |
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/shops/default_',\n", | |
" 'suffix': '.png'},\n", | |
" 'primary': True}],\n", | |
" 'photos': {'count': 0, 'groups': []}},\n", | |
" 'referralId': 'e-0-56229ff8498e2abb44b6f12b-14'},\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-15'},\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',\n", | |
" 'Bronx, NY 10463',\n", | |
" '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-16'},\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-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',\n", | |
" 'Bronx, NY 10463',\n", | |
" 'United States']},\n", | |
" 'categories': [{'id': '4bf58dd8d48988d14e941735',\n", | |
" 'name': 'American Restaurant',\n", | |
" 'pluralName': 'American Restaurants',\n", | |
" 'shortName': 'American',\n", | |
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/food/default_',\n", | |
" 'suffix': '.png'},\n", | |
" 'primary': True}],\n", | |
" 'photos': {'count': 0, 'groups': []}},\n", | |
" 'referralId': 'e-0-585c205665e7c70a2f1055ea-18'},\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',\n", | |
" 'Bronx, NY 10463',\n", | |
" '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-19'},\n", | |
" {'reasons': {'count': 0,\n", | |
" 'items': [{'summary': 'This spot is popular',\n", | |
" 'type': 'general',\n", | |
" 'reasonName': 'globalInteractionReason'}]},\n", | |
" 'venue': {'id': '4c852173dc018cfa2bc3e56c',\n", | |
" 'name': \"The Children's Place\",\n", | |
" 'location': {'address': '44 W 225th St',\n", | |
" 'lat': 40.873671591133125,\n", | |
" 'lng': -73.90815619608166,\n", | |
" 'labeledLatLngs': [{'label': 'display',\n", | |
" 'lat': 40.873671591133125,\n", | |
" 'lng': -73.90815619608166}],\n", | |
" 'distance': 383,\n", | |
" 'postalCode': '10463',\n", | |
" 'cc': 'US',\n", | |
" 'city': 'Bronx',\n", | |
" 'state': 'NY',\n", | |
" 'country': 'United States',\n", | |
" 'formattedAddress': ['44 W 225th St',\n", | |
" 'Bronx, NY 10463',\n", | |
" 'United States']},\n", | |
" 'categories': [{'id': '4bf58dd8d48988d105951735',\n", | |
" 'name': 'Kids Store',\n", | |
" 'pluralName': 'Kids Stores',\n", | |
" 'shortName': 'Kids Store',\n", | |
" 'icon': {'prefix': 'https://ss3.4sqi.net/img/categories_v2/shops/apparel_kids_',\n", | |
" 'suffix': '.png'},\n", | |
" 'primary': True}],\n", | |
" 'photos': {'count': 0, 'groups': []}},\n", | |
" 'referralId': 'e-0-4c852173dc018cfa2bc3e56c-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': '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',\n", | |
" 'Bronx, NY 10463',\n", | |
" '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-22'},\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-23'}]}]}}" | |
] | |
}, | |
"execution_count": 23, | |
"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": 24, | |
"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": 25, | |
"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", | |
" </tr>\n", | |
" </thead>\n", | |
" <tbody>\n", | |
" <tr>\n", | |
" <td>0</td>\n", | |
" <td>Arturo's</td>\n", | |
" <td>Pizza Place</td>\n", | |
" <td>40.874412</td>\n", | |
" <td>-73.910271</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <td>1</td>\n", | |
" <td>Bikram Yoga</td>\n", | |
" <td>Yoga Studio</td>\n", | |
" <td>40.876844</td>\n", | |
" <td>-73.906204</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <td>2</td>\n", | |
" <td>Tibbett Diner</td>\n", | |
" <td>Diner</td>\n", | |
" <td>40.880404</td>\n", | |
" <td>-73.908937</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <td>3</td>\n", | |
" <td>Starbucks</td>\n", | |
" <td>Coffee Shop</td>\n", | |
" <td>40.877531</td>\n", | |
" <td>-73.905582</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <td>4</td>\n", | |
" <td>Dunkin'</td>\n", | |
" <td>Donut Shop</td>\n", | |
" <td>40.877136</td>\n", | |
" <td>-73.906666</td>\n", | |
" </tr>\n", | |
" </tbody>\n", | |
"</table>\n", | |
"</div>" | |
], | |
"text/plain": [ | |
" name categories lat lng\n", | |
"0 Arturo's Pizza Place 40.874412 -73.910271\n", | |
"1 Bikram Yoga Yoga Studio 40.876844 -73.906204\n", | |
"2 Tibbett Diner Diner 40.880404 -73.908937\n", | |
"3 Starbucks Coffee Shop 40.877531 -73.905582\n", | |
"4 Dunkin' Donut Shop 40.877136 -73.906666" | |
] | |
}, | |
"execution_count": 25, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"venues = results['response']['groups'][0]['items']\n", | |
" \n", | |
"nearby_venues = json_normalize(venues) # flatten JSON\n", | |
"\n", | |
"# filter columns\n", | |
"filtered_columns = ['venue.name', 'venue.categories', 'venue.location.lat', 'venue.location.lng']\n", | |
"nearby_venues =nearby_venues.loc[:, filtered_columns]\n", | |
"\n", | |
"# filter the category for each row\n", | |
"nearby_venues['venue.categories'] = nearby_venues.apply(get_category_type, axis=1)\n", | |
"\n", | |
"# clean columns\n", | |
"nearby_venues.columns = [col.split(\".\")[-1] for col in nearby_venues.columns]\n", | |
"\n", | |
"nearby_venues.head()" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"And how many venues were returned by Foursquare?" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 26, | |
"metadata": { | |
"collapsed": false, | |
"jupyter": { | |
"outputs_hidden": false | |
} | |
}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"24 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": 27, | |
"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": null, | |
"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" | |
] | |
} | |
], | |
"source": [ | |
"# type your answer here\n", | |
"\n", | |
"manhattan_venues = getNearbyVenues(names=manhattan_data['Neighborhood'],\n", | |
" latitudes=manhattan_data['Latitude'],\n", | |
" longitudes=manhattan_data['Longitude']\n", | |
" )\n", | |
"\n" | |
] | |
}, | |
{ | |
"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": null, | |
"metadata": { | |
"collapsed": false, | |
"jupyter": { | |
"outputs_hidden": false | |
} | |
}, | |
"outputs": [], | |
"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": null, | |
"metadata": { | |
"collapsed": false, | |
"jupyter": { | |
"outputs_hidden": false | |
} | |
}, | |
"outputs": [], | |
"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": null, | |
"metadata": { | |
"collapsed": false, | |
"jupyter": { | |
"outputs_hidden": false | |
} | |
}, | |
"outputs": [], | |
"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": null, | |
"metadata": { | |
"collapsed": false, | |
"jupyter": { | |
"outputs_hidden": false | |
} | |
}, | |
"outputs": [], | |
"source": [ | |
"# one hot encoding\n", | |
"manhattan_onehot = pd.get_dummies(manhattan_venues[['Venue Category']], prefix=\"\", prefix_sep=\"\")\n", | |
"\n", | |
"# add neighborhood column back to dataframe\n", | |
"manhattan_onehot['Neighborhood'] = manhattan_venues['Neighborhood'] \n", | |
"\n", | |
"# move neighborhood column to the first column\n", | |
"fixed_columns = [manhattan_onehot.columns[-1]] + list(manhattan_onehot.columns[:-1])\n", | |
"manhattan_onehot = manhattan_onehot[fixed_columns]\n", | |
"\n", | |
"manhattan_onehot.head()" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"And let's examine the new dataframe size." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": { | |
"collapsed": false, | |
"jupyter": { | |
"outputs_hidden": false | |
} | |
}, | |
"outputs": [], | |
"source": [ | |
"manhattan_onehot.shape" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"#### Next, let's group rows by neighborhood and by taking the mean of the frequency of occurrence of each category" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": { | |
"collapsed": false, | |
"jupyter": { | |
"outputs_hidden": false | |
} | |
}, | |
"outputs": [], | |
"source": [ | |
"manhattan_grouped = manhattan_onehot.groupby('Neighborhood').mean().reset_index()\n", | |
"manhattan_grouped" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"#### Let's confirm the new size" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": { | |
"collapsed": false, | |
"jupyter": { | |
"outputs_hidden": false | |
} | |
}, | |
"outputs": [], | |
"source": [ | |
"manhattan_grouped.shape" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"#### Let's print each neighborhood along with the top 5 most common venues" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": { | |
"collapsed": false, | |
"jupyter": { | |
"outputs_hidden": false | |
} | |
}, | |
"outputs": [], | |
"source": [ | |
"num_top_venues = 5\n", | |
"\n", | |
"for hood in manhattan_grouped['Neighborhood']:\n", | |
" print(\"----\"+hood+\"----\")\n", | |
" temp = manhattan_grouped[manhattan_grouped['Neighborhood'] == hood].T.reset_index()\n", | |
" temp.columns = ['venue','freq']\n", | |
" temp = temp.iloc[1:]\n", | |
" temp['freq'] = temp['freq'].astype(float)\n", | |
" temp = temp.round({'freq': 2})\n", | |
" print(temp.sort_values('freq', ascending=False).reset_index(drop=True).head(num_top_venues))\n", | |
" print('\\n')" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"#### Let's put that into a *pandas* dataframe" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"First, let's write a function to sort the venues in descending order." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": { | |
"collapsed": true, | |
"jupyter": { | |
"outputs_hidden": true | |
} | |
}, | |
"outputs": [], | |
"source": [ | |
"def return_most_common_venues(row, num_top_venues):\n", | |
" row_categories = row.iloc[1:]\n", | |
" row_categories_sorted = row_categories.sort_values(ascending=False)\n", | |
" \n", | |
" return row_categories_sorted.index.values[0:num_top_venues]" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"Now let's create the new dataframe and display the top 10 venues for each neighborhood." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": { | |
"collapsed": false, | |
"jupyter": { | |
"outputs_hidden": false | |
} | |
}, | |
"outputs": [], | |
"source": [ | |
"num_top_venues = 10\n", | |
"\n", | |
"indicators = ['st', 'nd', 'rd']\n", | |
"\n", | |
"# create columns according to number of top venues\n", | |
"columns = ['Neighborhood']\n", | |
"for ind in np.arange(num_top_venues):\n", | |
" try:\n", | |
" columns.append('{}{} Most Common Venue'.format(ind+1, indicators[ind]))\n", | |
" except:\n", | |
" columns.append('{}th Most Common Venue'.format(ind+1))\n", | |
"\n", | |
"# create a new dataframe\n", | |
"neighborhoods_venues_sorted = pd.DataFrame(columns=columns)\n", | |
"neighborhoods_venues_sorted['Neighborhood'] = manhattan_grouped['Neighborhood']\n", | |
"\n", | |
"for ind in np.arange(manhattan_grouped.shape[0]):\n", | |
" neighborhoods_venues_sorted.iloc[ind, 1:] = return_most_common_venues(manhattan_grouped.iloc[ind, :], num_top_venues)\n", | |
"\n", | |
"neighborhoods_venues_sorted.head()" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"<a id='item4'></a>" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"## 4. Cluster Neighborhoods" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"Run *k*-means to cluster the neighborhood into 5 clusters." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": { | |
"collapsed": false, | |
"jupyter": { | |
"outputs_hidden": false | |
} | |
}, | |
"outputs": [], | |
"source": [ | |
"# set number of clusters\n", | |
"kclusters = 5\n", | |
"\n", | |
"manhattan_grouped_clustering = manhattan_grouped.drop('Neighborhood', 1)\n", | |
"\n", | |
"# run k-means clustering\n", | |
"kmeans = KMeans(n_clusters=kclusters, random_state=0).fit(manhattan_grouped_clustering)\n", | |
"\n", | |
"# check cluster labels generated for each row in the dataframe\n", | |
"kmeans.labels_[0:10] " | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"Let's create a new dataframe that includes the cluster as well as the top 10 venues for each neighborhood." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": { | |
"collapsed": false, | |
"jupyter": { | |
"outputs_hidden": false | |
} | |
}, | |
"outputs": [], | |
"source": [ | |
"# add clustering labels\n", | |
"neighborhoods_venues_sorted.insert(0, 'Cluster Labels', kmeans.labels_)\n", | |
"\n", | |
"manhattan_merged = manhattan_data\n", | |
"\n", | |
"# merge toronto_grouped with toronto_data to add latitude/longitude for each neighborhood\n", | |
"manhattan_merged = manhattan_merged.join(neighborhoods_venues_sorted.set_index('Neighborhood'), on='Neighborhood')\n", | |
"\n", | |
"manhattan_merged.head() # check the last columns!" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"Finally, let's visualize the resulting clusters" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": { | |
"collapsed": false, | |
"jupyter": { | |
"outputs_hidden": false | |
} | |
}, | |
"outputs": [], | |
"source": [ | |
"# create map\n", | |
"map_clusters = folium.Map(location=[latitude, longitude], zoom_start=11)\n", | |
"\n", | |
"# set color scheme for the clusters\n", | |
"x = np.arange(kclusters)\n", | |
"ys = [i + x + (i*x)**2 for i in range(kclusters)]\n", | |
"colors_array = cm.rainbow(np.linspace(0, 1, len(ys)))\n", | |
"rainbow = [colors.rgb2hex(i) for i in colors_array]\n", | |
"\n", | |
"# add markers to the map\n", | |
"markers_colors = []\n", | |
"for lat, lon, poi, cluster in zip(manhattan_merged['Latitude'], manhattan_merged['Longitude'], manhattan_merged['Neighborhood'], manhattan_merged['Cluster Labels']):\n", | |
" label = folium.Popup(str(poi) + ' Cluster ' + str(cluster), parse_html=True)\n", | |
" folium.CircleMarker(\n", | |
" [lat, lon],\n", | |
" radius=5,\n", | |
" popup=label,\n", | |
" color=rainbow[cluster-1],\n", | |
" fill=True,\n", | |
" fill_color=rainbow[cluster-1],\n", | |
" fill_opacity=0.7).add_to(map_clusters)\n", | |
" \n", | |
"map_clusters" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"<a id='item5'></a>" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"## 5. Examine Clusters" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"Now, you can examine each cluster and determine the discriminating venue categories that distinguish each cluster. Based on the defining categories, you can then assign a name to each cluster. I will leave this exercise to you." | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"#### Cluster 1" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": { | |
"collapsed": false, | |
"jupyter": { | |
"outputs_hidden": false | |
} | |
}, | |
"outputs": [], | |
"source": [ | |
"manhattan_merged.loc[manhattan_merged['Cluster Labels'] == 0, manhattan_merged.columns[[1] + list(range(5, manhattan_merged.shape[1]))]]" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"#### Cluster 2" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": { | |
"collapsed": false, | |
"jupyter": { | |
"outputs_hidden": false | |
} | |
}, | |
"outputs": [], | |
"source": [ | |
"manhattan_merged.loc[manhattan_merged['Cluster Labels'] == 1, manhattan_merged.columns[[1] + list(range(5, manhattan_merged.shape[1]))]]" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"#### Cluster 3" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": { | |
"collapsed": false, | |
"jupyter": { | |
"outputs_hidden": false | |
} | |
}, | |
"outputs": [], | |
"source": [ | |
"manhattan_merged.loc[manhattan_merged['Cluster Labels'] == 2, manhattan_merged.columns[[1] + list(range(5, manhattan_merged.shape[1]))]]" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"#### Cluster 4" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": { | |
"collapsed": false, | |
"jupyter": { | |
"outputs_hidden": false | |
} | |
}, | |
"outputs": [], | |
"source": [ | |
"manhattan_merged.loc[manhattan_merged['Cluster Labels'] == 3, manhattan_merged.columns[[1] + list(range(5, manhattan_merged.shape[1]))]]" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"#### Cluster 5" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": { | |
"collapsed": false, | |
"jupyter": { | |
"outputs_hidden": false | |
} | |
}, | |
"outputs": [], | |
"source": [ | |
"manhattan_merged.loc[manhattan_merged['Cluster Labels'] == 4, manhattan_merged.columns[[1] + list(range(5, manhattan_merged.shape[1]))]]" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"### Thank you for completing this lab!\n", | |
"\n", | |
"This notebook was created by [Alex Aklson](https://www.linkedin.com/in/aklson/) and [Polong Lin](https://www.linkedin.com/in/polonglin/). I hope you found this lab interesting and educational. Feel free to contact us if you have any questions!" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"This notebook is part of a course on **Coursera** called *Applied Data Science Capstone*. If you accessed this notebook outside the course, you can take this course online by clicking [here](http://cocl.us/DP0701EN_Coursera_Week3_LAB2)." | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"<hr>\n", | |
"\n", | |
"Copyright © 2018 [Cognitive Class](https://cognitiveclass.ai/?utm_source=bducopyrightlink&utm_medium=dswb&utm_campaign=bdu). This notebook and its source code are released under the terms of the [MIT License](https://bigdatauniversity.com/mit-license/)." | |
] | |
} | |
], | |
"metadata": { | |
"kernelspec": { | |
"display_name": "Python", | |
"language": "python", | |
"name": "conda-env-python-py" | |
}, | |
"language_info": { | |
"codemirror_mode": { | |
"name": "ipython", | |
"version": 3 | |
}, | |
"file_extension": ".py", | |
"mimetype": "text/x-python", | |
"name": "python", | |
"nbconvert_exporter": "python", | |
"pygments_lexer": "ipython3", | |
"version": "3.6.7" | |
}, | |
"widgets": { | |
"state": {}, | |
"version": "1.1.2" | |
} | |
}, | |
"nbformat": 4, | |
"nbformat_minor": 4 | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment