Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save eltomali/9b464803abff50f4a992db2e3c08c297 to your computer and use it in GitHub Desktop.
Save eltomali/9b464803abff50f4a992db2e3c08c297 to your computer and use it in GitHub Desktop.
Created on Cognitive Class Labs
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"editable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"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>Generating Maps with Python</font></h1>"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"editable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"## Introduction\n",
"\n",
"In this lab, we will learn how to create maps for different objectives. To do that, we will part ways with Matplotlib and work with another Python visualization library, namely **Folium**. What is nice about **Folium** is that it was developed for the sole purpose of visualizing geospatial data. While other libraries are available to visualize geospatial data, such as **plotly**, they might have a cap on how many API calls you can make within a defined time frame. **Folium**, on the other hand, is completely free."
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"editable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"## Table of Contents\n",
"\n",
"<div class=\"alert alert-block alert-info\" style=\"margin-top: 20px\">\n",
"\n",
"1. [Exploring Datasets with *p*andas](#0)<br>\n",
"2. [Downloading and Prepping Data](#2)<br>\n",
"3. [Introduction to Folium](#4) <br>\n",
"4. [Map with Markers](#6) <br>\n",
"5. [Choropleth Maps](#8) <br>\n",
"</div>\n",
"<hr>"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"editable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"# Exploring Datasets with *pandas* and Matplotlib<a id=\"0\"></a>\n",
"\n",
"Toolkits: This lab heavily relies on [*pandas*](http://pandas.pydata.org/) and [**Numpy**](http://www.numpy.org/) for data wrangling, analysis, and visualization. The primary plotting library we will explore in this lab is [**Folium**](https://github.com/python-visualization/folium/).\n",
"\n",
"Datasets: \n",
"\n",
"1. San Francisco Police Department Incidents for the year 2016 - [Police Department Incidents](https://data.sfgov.org/Public-Safety/Police-Department-Incidents-Previous-Year-2016-/ritf-b9ki) from San Francisco public data portal. Incidents derived from San Francisco Police Department (SFPD) Crime Incident Reporting system. Updated daily, showing data for the entire year of 2016. Address and location has been anonymized by moving to mid-block or to an intersection. \n",
"\n",
"2. Immigration to Canada from 1980 to 2013 - [International migration flows to and from selected countries - The 2015 revision](http://www.un.org/en/development/desa/population/migration/data/empirical2/migrationflows.shtml) from United Nation's website. The dataset contains annual data on the flows of international migrants as recorded by the countries of destination. The data presents both inflows and outflows according to the place of birth, citizenship or place of previous / next residence both for foreigners and nationals. For this lesson, we will focus on the Canadian Immigration data"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"editable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"# Downloading and Prepping Data <a id=\"2\"></a>"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"editable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"Import Primary Modules:"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"button": false,
"collapsed": true,
"deletable": true,
"editable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [],
"source": [
"import numpy as np # useful for many scientific computing in Python\n",
"import pandas as pd # primary data structure library"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"editable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"# Introduction to Folium <a id=\"4\"></a>"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"editable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"Folium is a powerful Python library that helps you create several types of Leaflet maps. The fact that the Folium results are interactive makes this library very useful for dashboard building.\n",
"\n",
"From the official Folium documentation page:\n",
"\n",
"> Folium builds on the data wrangling strengths of the Python ecosystem and the mapping strengths of the Leaflet.js library. Manipulate your data in Python, then visualize it in on a Leaflet map via Folium.\n",
"\n",
"> Folium makes it easy to visualize data that's been manipulated in Python on an interactive Leaflet map. It enables both the binding of data to a map for choropleth visualizations as well as passing Vincent/Vega visualizations as markers on the map.\n",
"\n",
"> The library has a number of built-in tilesets from OpenStreetMap, Mapbox, and Stamen, and supports custom tilesets with Mapbox or Cloudmade API keys. Folium supports both GeoJSON and TopoJSON overlays, as well as the binding of data to those overlays to create choropleth maps with color-brewer color schemes."
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"editable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"#### Let's install **Folium**"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"editable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"**Folium** is not available by default. So, we first need to install it before we are able to import it."
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"editable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Collecting package metadata: done\n",
"Solving environment: | \n",
"The environment is inconsistent, please check the package plan carefully\n",
"The following packages are causing the inconsistency:\n",
"\n",
" - defaults/linux-64::anaconda==5.3.1=py37_0\n",
" - defaults/linux-64::astropy==3.0.4=py37h14c3975_0\n",
" - defaults/linux-64::bkcharts==0.2=py37_0\n",
" - defaults/linux-64::blaze==0.11.3=py37_0\n",
" - defaults/linux-64::bokeh==0.13.0=py37_0\n",
" - defaults/linux-64::bottleneck==1.2.1=py37h035aef0_1\n",
" - defaults/linux-64::dask==0.19.1=py37_0\n",
" - defaults/linux-64::datashape==0.5.4=py37_1\n",
" - defaults/linux-64::mkl-service==1.1.2=py37h90e4bf4_5\n",
" - defaults/linux-64::numba==0.39.0=py37h04863e7_0\n",
" - defaults/linux-64::numexpr==2.6.8=py37hd89afb7_0\n",
" - defaults/linux-64::odo==0.5.1=py37_0\n",
" - defaults/linux-64::pytables==3.4.4=py37ha205bf6_0\n",
" - defaults/linux-64::pytest-arraydiff==0.2=py37h39e3cac_0\n",
" - defaults/linux-64::pytest-astropy==0.4.0=py37_0\n",
" - defaults/linux-64::pytest-doctestplus==0.1.3=py37_0\n",
" - defaults/linux-64::pywavelets==1.0.0=py37hdd07704_0\n",
" - defaults/linux-64::scikit-image==0.14.0=py37hf484d3e_1\n",
"done\n",
"\n",
"# All requested packages already installed.\n",
"\n",
"Folium installed and imported!\n"
]
}
],
"source": [
"!conda install -c conda-forge folium=0.5.0 --yes\n",
"import folium\n",
"\n",
"print('Folium installed and imported!')"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"editable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"Generating the world map is straigtforward in **Folium**. You simply create a **Folium** *Map* object and then you display it. What is attactive about **Folium** maps is that they are interactive, so you can zoom into any region of interest despite the initial zoom level. "
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"editable": true,
"new_sheet": false,
"run_control": {
"read_only": false
},
"scrolled": true
},
"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+ICNtYXBfZTJjZjE0NDcwYzA0NGU1MGI3NmQ5NGE3MTdiZDZkMWYgewogICAgICAgICAgICAgICAgcG9zaXRpb24gOiByZWxhdGl2ZTsKICAgICAgICAgICAgICAgIHdpZHRoIDogMTAwLjAlOwogICAgICAgICAgICAgICAgaGVpZ2h0OiAxMDAuMCU7CiAgICAgICAgICAgICAgICBsZWZ0OiAwLjAlOwogICAgICAgICAgICAgICAgdG9wOiAwLjAlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICA8L3N0eWxlPgogICAgICAgIAo8L2hlYWQ+Cjxib2R5PiAgICAKICAgIAogICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb2xpdW0tbWFwIiBpZD0ibWFwX2UyY2YxNDQ3MGMwNDRlNTBiNzZkOTRhNzE3YmQ2ZDFmIiA+PC9kaXY+CiAgICAgICAgCjwvYm9keT4KPHNjcmlwdD4gICAgCiAgICAKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGJvdW5kcyA9IG51bGw7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcF9lMmNmMTQ0NzBjMDQ0ZTUwYjc2ZDk0YTcxN2JkNmQxZiA9IEwubWFwKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21hcF9lMmNmMTQ0NzBjMDQ0ZTUwYjc2ZDk0YTcxN2JkNmQxZicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y2VudGVyOiBbMCwwXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpvb206IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhCb3VuZHM6IGJvdW5kcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyczogW10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JsZENvcHlKdW1wOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyczogTC5DUlMuRVBTRzM4NTcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciB0aWxlX2xheWVyXzJlZTZjN2M3NGI2OTQ0NWY4NDQ0MWU4NjFkNzI1YjliID0gTC50aWxlTGF5ZXIoCiAgICAgICAgICAgICAgICAnaHR0cHM6Ly97c30udGlsZS5vcGVuc3RyZWV0bWFwLm9yZy97en0ve3h9L3t5fS5wbmcnLAogICAgICAgICAgICAgICAgewogICJhdHRyaWJ1dGlvbiI6IG51bGwsCiAgImRldGVjdFJldGluYSI6IGZhbHNlLAogICJtYXhab29tIjogMTgsCiAgIm1pblpvb20iOiAxLAogICJub1dyYXAiOiBmYWxzZSwKICAic3ViZG9tYWlucyI6ICJhYmMiCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwX2UyY2YxNDQ3MGMwNDRlNTBiNzZkOTRhNzE3YmQ2ZDFmKTsKICAgICAgICAKPC9zY3JpcHQ+\" 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 0x7fb0020b8438>"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# define the world map\n",
"world_map = folium.Map()\n",
"\n",
"# display world map\n",
"world_map"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"editable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"Go ahead. Try zooming in and out of the rendered map above."
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"editable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"You can customize this default definition of the world map by specifying the centre of your map and the intial zoom level. \n",
"\n",
"All locations on a map are defined by their respective *Latitude* and *Longitude* values. So you can create a map and pass in a center of *Latitude* and *Longitude* values of **[0, 0]**. \n",
"\n",
"For a defined center, you can also define the intial zoom level into that location when the map is rendered. **The higher the zoom level the more the map is zoomed into the center**.\n",
"\n",
"Let's create a map centered around Canada and play with the zoom level to see how it affects the rendered map."
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"editable": true,
"new_sheet": false,
"run_control": {
"read_only": false
},
"scrolled": 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+ICNtYXBfZDIzNDY1MzNkNDFkNGE4ZTkzNjA2NTljMDU3MmJjOWUgewogICAgICAgICAgICAgICAgcG9zaXRpb24gOiByZWxhdGl2ZTsKICAgICAgICAgICAgICAgIHdpZHRoIDogMTAwLjAlOwogICAgICAgICAgICAgICAgaGVpZ2h0OiAxMDAuMCU7CiAgICAgICAgICAgICAgICBsZWZ0OiAwLjAlOwogICAgICAgICAgICAgICAgdG9wOiAwLjAlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICA8L3N0eWxlPgogICAgICAgIAo8L2hlYWQ+Cjxib2R5PiAgICAKICAgIAogICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb2xpdW0tbWFwIiBpZD0ibWFwX2QyMzQ2NTMzZDQxZDRhOGU5MzYwNjU5YzA1NzJiYzllIiA+PC9kaXY+CiAgICAgICAgCjwvYm9keT4KPHNjcmlwdD4gICAgCiAgICAKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGJvdW5kcyA9IG51bGw7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcF9kMjM0NjUzM2Q0MWQ0YThlOTM2MDY1OWMwNTcyYmM5ZSA9IEwubWFwKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21hcF9kMjM0NjUzM2Q0MWQ0YThlOTM2MDY1OWMwNTcyYmM5ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y2VudGVyOiBbNTYuMTMsLTEwNi4zNV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6b29tOiA0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4Qm91bmRzOiBib3VuZHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXllcnM6IFtdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ybGRDb3B5SnVtcDogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcnM6IEwuQ1JTLkVQU0czODU3CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgdGlsZV9sYXllcl81MzBmNjc5NTY1ZDA0YTgyODdiMGQ4ZTViNjhlY2IxMCA9IEwudGlsZUxheWVyKAogICAgICAgICAgICAgICAgJ2h0dHBzOi8ve3N9LnRpbGUub3BlbnN0cmVldG1hcC5vcmcve3p9L3t4fS97eX0ucG5nJywKICAgICAgICAgICAgICAgIHsKICAiYXR0cmlidXRpb24iOiBudWxsLAogICJkZXRlY3RSZXRpbmEiOiBmYWxzZSwKICAibWF4Wm9vbSI6IDE4LAogICJtaW5ab29tIjogMSwKICAibm9XcmFwIjogZmFsc2UsCiAgInN1YmRvbWFpbnMiOiAiYWJjIgp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9kMjM0NjUzM2Q0MWQ0YThlOTM2MDY1OWMwNTcyYmM5ZSk7CiAgICAgICAgCjwvc2NyaXB0Pg==\" 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 0x7fb000dffa90>"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# define the world map centered around Canada with a low zoom level\n",
"world_map = folium.Map(location=[56.130, -106.35], zoom_start=4)\n",
"\n",
"# display world map\n",
"world_map"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"editable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"Let's create the map again with a higher zoom level"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"editable": true,
"new_sheet": false,
"run_control": {
"read_only": false
},
"scrolled": 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+ICNtYXBfOTkxNmMwZWM5ODdhNGRmNmJmMDJkM2QyNjQxNmUxMjQgewogICAgICAgICAgICAgICAgcG9zaXRpb24gOiByZWxhdGl2ZTsKICAgICAgICAgICAgICAgIHdpZHRoIDogMTAwLjAlOwogICAgICAgICAgICAgICAgaGVpZ2h0OiAxMDAuMCU7CiAgICAgICAgICAgICAgICBsZWZ0OiAwLjAlOwogICAgICAgICAgICAgICAgdG9wOiAwLjAlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICA8L3N0eWxlPgogICAgICAgIAo8L2hlYWQ+Cjxib2R5PiAgICAKICAgIAogICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb2xpdW0tbWFwIiBpZD0ibWFwXzk5MTZjMGVjOTg3YTRkZjZiZjAyZDNkMjY0MTZlMTI0IiA+PC9kaXY+CiAgICAgICAgCjwvYm9keT4KPHNjcmlwdD4gICAgCiAgICAKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGJvdW5kcyA9IG51bGw7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcF85OTE2YzBlYzk4N2E0ZGY2YmYwMmQzZDI2NDE2ZTEyNCA9IEwubWFwKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21hcF85OTE2YzBlYzk4N2E0ZGY2YmYwMmQzZDI2NDE2ZTEyNCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y2VudGVyOiBbNTYuMTMsLTEwNi4zNV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6b29tOiA4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4Qm91bmRzOiBib3VuZHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXllcnM6IFtdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ybGRDb3B5SnVtcDogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcnM6IEwuQ1JTLkVQU0czODU3CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgdGlsZV9sYXllcl8zODU1MTNhMjdkYzM0MzQxOWZlOWJhNTM0MDAyZGEyYyA9IEwudGlsZUxheWVyKAogICAgICAgICAgICAgICAgJ2h0dHBzOi8ve3N9LnRpbGUub3BlbnN0cmVldG1hcC5vcmcve3p9L3t4fS97eX0ucG5nJywKICAgICAgICAgICAgICAgIHsKICAiYXR0cmlidXRpb24iOiBudWxsLAogICJkZXRlY3RSZXRpbmEiOiBmYWxzZSwKICAibWF4Wm9vbSI6IDE4LAogICJtaW5ab29tIjogMSwKICAibm9XcmFwIjogZmFsc2UsCiAgInN1YmRvbWFpbnMiOiAiYWJjIgp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF85OTE2YzBlYzk4N2E0ZGY2YmYwMmQzZDI2NDE2ZTEyNCk7CiAgICAgICAgCjwvc2NyaXB0Pg==\" 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 0x7fb000e00e48>"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# define the world map centered around Canada with a higher zoom level\n",
"world_map = folium.Map(location=[56.130, -106.35], zoom_start=8)\n",
"\n",
"# display world map\n",
"world_map"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"editable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"As you can see, the higher the zoom level the more the map is zoomed into the given center."
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"**Question**: Create a map of Mexico with a zoom level of 4."
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": 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+ICNtYXBfZTUxMzMzZjk2YmYzNDI0NmEyNWJiOGE3ZmJmOTM4YmYgewogICAgICAgICAgICAgICAgcG9zaXRpb24gOiByZWxhdGl2ZTsKICAgICAgICAgICAgICAgIHdpZHRoIDogMTAwLjAlOwogICAgICAgICAgICAgICAgaGVpZ2h0OiAxMDAuMCU7CiAgICAgICAgICAgICAgICBsZWZ0OiAwLjAlOwogICAgICAgICAgICAgICAgdG9wOiAwLjAlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICA8L3N0eWxlPgogICAgICAgIAo8L2hlYWQ+Cjxib2R5PiAgICAKICAgIAogICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb2xpdW0tbWFwIiBpZD0ibWFwX2U1MTMzM2Y5NmJmMzQyNDZhMjViYjhhN2ZiZjkzOGJmIiA+PC9kaXY+CiAgICAgICAgCjwvYm9keT4KPHNjcmlwdD4gICAgCiAgICAKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGJvdW5kcyA9IG51bGw7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcF9lNTEzMzNmOTZiZjM0MjQ2YTI1YmI4YTdmYmY5MzhiZiA9IEwubWFwKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21hcF9lNTEzMzNmOTZiZjM0MjQ2YTI1YmI4YTdmYmY5MzhiZicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y2VudGVyOiBbMjMuNjM0NSwtMTAyLjU1MjhdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgem9vbTogNCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heEJvdW5kczogYm91bmRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXJzOiBbXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmxkQ29weUp1bXA6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JzOiBMLkNSUy5FUFNHMzg1NwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHRpbGVfbGF5ZXJfNjY1MDRkOTJhN2JiNDBjOWEyYjg3ODlmNDkyNWJhZjAgPSBMLnRpbGVMYXllcigKICAgICAgICAgICAgICAgICdodHRwczovL3tzfS50aWxlLm9wZW5zdHJlZXRtYXAub3JnL3t6fS97eH0ve3l9LnBuZycsCiAgICAgICAgICAgICAgICB7CiAgImF0dHJpYnV0aW9uIjogbnVsbCwKICAiZGV0ZWN0UmV0aW5hIjogZmFsc2UsCiAgIm1heFpvb20iOiAxOCwKICAibWluWm9vbSI6IDEsCiAgIm5vV3JhcCI6IGZhbHNlLAogICJzdWJkb21haW5zIjogImFiYyIKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZTUxMzMzZjk2YmYzNDI0NmEyNWJiOGE3ZmJmOTM4YmYpOwogICAgICAgIAo8L3NjcmlwdD4=\" 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 0x7fb000d8df60>"
]
},
"execution_count": 16,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"### type your answer here\n",
"world_map_mex = folium.Map(location=[23.6345, -102.5528], zoom_start=4)\n",
"\n",
"world_map_mex\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"Double-click __here__ for the solution.\n",
"<!-- The correct answer is:\n",
"\\\\ # define Mexico's geolocation coordinates\n",
"mexico_latitude = 23.6345 \n",
"mexico_longitude = -102.5528\n",
"-->\n",
"\n",
"<!--\n",
"\\\\ # define the world map centered around Canada with a higher zoom level\n",
"mexico_map = folium.Map(location=[mexico_latitude, mexico_longitude], zoom_start=4)\n",
"-->\n",
"\n",
"<!--\n",
"\\\\ # display world map\n",
"mexico_map\n",
"-->"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"editable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"Another cool feature of **Folium** is that you can generate different map styles."
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"editable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"### A. Stamen Toner Maps\n",
"\n",
"These are high-contrast B+W (black and white) maps. They are perfect for data mashups and exploring river meanders and coastal zones. "
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"editable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"Let's create a Stamen Toner map of canada with a zoom level of 4."
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"editable": true,
"new_sheet": false,
"run_control": {
"read_only": false
},
"scrolled": 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+ICNtYXBfODRmMWJkZmY5OWQyNGQ4ZGJlMGU5ZGNiYTUyNDc0YTAgewogICAgICAgICAgICAgICAgcG9zaXRpb24gOiByZWxhdGl2ZTsKICAgICAgICAgICAgICAgIHdpZHRoIDogMTAwLjAlOwogICAgICAgICAgICAgICAgaGVpZ2h0OiAxMDAuMCU7CiAgICAgICAgICAgICAgICBsZWZ0OiAwLjAlOwogICAgICAgICAgICAgICAgdG9wOiAwLjAlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICA8L3N0eWxlPgogICAgICAgIAo8L2hlYWQ+Cjxib2R5PiAgICAKICAgIAogICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb2xpdW0tbWFwIiBpZD0ibWFwXzg0ZjFiZGZmOTlkMjRkOGRiZTBlOWRjYmE1MjQ3NGEwIiA+PC9kaXY+CiAgICAgICAgCjwvYm9keT4KPHNjcmlwdD4gICAgCiAgICAKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGJvdW5kcyA9IG51bGw7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcF84NGYxYmRmZjk5ZDI0ZDhkYmUwZTlkY2JhNTI0NzRhMCA9IEwubWFwKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21hcF84NGYxYmRmZjk5ZDI0ZDhkYmUwZTlkY2JhNTI0NzRhMCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y2VudGVyOiBbNTYuMTMsLTEwNi4zNV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6b29tOiA0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4Qm91bmRzOiBib3VuZHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXllcnM6IFtdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ybGRDb3B5SnVtcDogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcnM6IEwuQ1JTLkVQU0czODU3CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgdGlsZV9sYXllcl9mZDA2NTgxMTgwNWY0OTI3YjdjNTA0MTc0N2UzOWYxNiA9IEwudGlsZUxheWVyKAogICAgICAgICAgICAgICAgJ2h0dHBzOi8vc3RhbWVuLXRpbGVzLXtzfS5hLnNzbC5mYXN0bHkubmV0L3RvbmVyL3t6fS97eH0ve3l9LnBuZycsCiAgICAgICAgICAgICAgICB7CiAgImF0dHJpYnV0aW9uIjogbnVsbCwKICAiZGV0ZWN0UmV0aW5hIjogZmFsc2UsCiAgIm1heFpvb20iOiAxOCwKICAibWluWm9vbSI6IDEsCiAgIm5vV3JhcCI6IGZhbHNlLAogICJzdWJkb21haW5zIjogImFiYyIKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfODRmMWJkZmY5OWQyNGQ4ZGJlMGU5ZGNiYTUyNDc0YTApOwogICAgICAgIAo8L3NjcmlwdD4=\" 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 0x7fb000d19ef0>"
]
},
"execution_count": 17,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# create a Stamen Toner map of the world centered around Canada\n",
"world_map = folium.Map(location=[56.130, -106.35], zoom_start=4, tiles='Stamen Toner')\n",
"\n",
"# display map\n",
"world_map"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"editable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"Feel free to zoom in and out to see how this style compares to the default one."
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"editable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"### B. Stamen Terrain Maps\n",
"\n",
"These are maps that feature hill shading and natural vegetation colors. They showcase advanced labeling and linework generalization of dual-carriageway roads."
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"editable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"Let's create a Stamen Terrain map of Canada with zoom level 4."
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"editable": true,
"new_sheet": false,
"run_control": {
"read_only": false
},
"scrolled": 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+ICNtYXBfZGEyODgzZTZmZmJmNDU4MjljZTEzNzgyZDM5M2E4YTIgewogICAgICAgICAgICAgICAgcG9zaXRpb24gOiByZWxhdGl2ZTsKICAgICAgICAgICAgICAgIHdpZHRoIDogMTAwLjAlOwogICAgICAgICAgICAgICAgaGVpZ2h0OiAxMDAuMCU7CiAgICAgICAgICAgICAgICBsZWZ0OiAwLjAlOwogICAgICAgICAgICAgICAgdG9wOiAwLjAlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICA8L3N0eWxlPgogICAgICAgIAo8L2hlYWQ+Cjxib2R5PiAgICAKICAgIAogICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb2xpdW0tbWFwIiBpZD0ibWFwX2RhMjg4M2U2ZmZiZjQ1ODI5Y2UxMzc4MmQzOTNhOGEyIiA+PC9kaXY+CiAgICAgICAgCjwvYm9keT4KPHNjcmlwdD4gICAgCiAgICAKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGJvdW5kcyA9IG51bGw7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcF9kYTI4ODNlNmZmYmY0NTgyOWNlMTM3ODJkMzkzYThhMiA9IEwubWFwKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21hcF9kYTI4ODNlNmZmYmY0NTgyOWNlMTM3ODJkMzkzYThhMicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y2VudGVyOiBbNTYuMTMsLTEwNi4zNV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6b29tOiA0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4Qm91bmRzOiBib3VuZHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXllcnM6IFtdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ybGRDb3B5SnVtcDogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcnM6IEwuQ1JTLkVQU0czODU3CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgdGlsZV9sYXllcl8xZWY0N2U0YTkyZDc0ZmU1YjQ0MTEwYTM1ZWZkNDA1OSA9IEwudGlsZUxheWVyKAogICAgICAgICAgICAgICAgJ2h0dHBzOi8vc3RhbWVuLXRpbGVzLXtzfS5hLnNzbC5mYXN0bHkubmV0L3RlcnJhaW4ve3p9L3t4fS97eX0uanBnJywKICAgICAgICAgICAgICAgIHsKICAiYXR0cmlidXRpb24iOiBudWxsLAogICJkZXRlY3RSZXRpbmEiOiBmYWxzZSwKICAibWF4Wm9vbSI6IDE4LAogICJtaW5ab29tIjogMSwKICAibm9XcmFwIjogZmFsc2UsCiAgInN1YmRvbWFpbnMiOiAiYWJjIgp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF9kYTI4ODNlNmZmYmY0NTgyOWNlMTM3ODJkMzkzYThhMik7CiAgICAgICAgCjwvc2NyaXB0Pg==\" 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 0x7fb000d1b978>"
]
},
"execution_count": 18,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# create a Stamen Toner map of the world centered around Canada\n",
"world_map = folium.Map(location=[56.130, -106.35], zoom_start=4, tiles='Stamen Terrain')\n",
"\n",
"# display map\n",
"world_map"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"editable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"Feel free to zoom in and out to see how this style compares to Stamen Toner and the default style."
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"editable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"### C. Mapbox Bright Maps\n",
"\n",
"These are maps that quite similar to the default style, except that the borders are not visible with a low zoom level. Furthermore, unlike the default style where country names are displayed in each country's native language, *Mapbox Bright* style displays all country names in English."
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"editable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"Let's create a world map with this style."
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"editable": true,
"new_sheet": false,
"run_control": {
"read_only": 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+ICNtYXBfZGRkNDdkNGZiNTNlNGEzZmJlMzQzNjVlNzI0ZjU5YWIgewogICAgICAgICAgICAgICAgcG9zaXRpb24gOiByZWxhdGl2ZTsKICAgICAgICAgICAgICAgIHdpZHRoIDogMTAwLjAlOwogICAgICAgICAgICAgICAgaGVpZ2h0OiAxMDAuMCU7CiAgICAgICAgICAgICAgICBsZWZ0OiAwLjAlOwogICAgICAgICAgICAgICAgdG9wOiAwLjAlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICA8L3N0eWxlPgogICAgICAgIAo8L2hlYWQ+Cjxib2R5PiAgICAKICAgIAogICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb2xpdW0tbWFwIiBpZD0ibWFwX2RkZDQ3ZDRmYjUzZTRhM2ZiZTM0MzY1ZTcyNGY1OWFiIiA+PC9kaXY+CiAgICAgICAgCjwvYm9keT4KPHNjcmlwdD4gICAgCiAgICAKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGJvdW5kcyA9IG51bGw7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcF9kZGQ0N2Q0ZmI1M2U0YTNmYmUzNDM2NWU3MjRmNTlhYiA9IEwubWFwKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21hcF9kZGQ0N2Q0ZmI1M2U0YTNmYmUzNDM2NWU3MjRmNTlhYicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y2VudGVyOiBbMCwwXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpvb206IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhCb3VuZHM6IGJvdW5kcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyczogW10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JsZENvcHlKdW1wOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyczogTC5DUlMuRVBTRzM4NTcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciB0aWxlX2xheWVyX2U4ZDMyOWM4MjY4ZjRjNTFiMmUwMTY4MDk5YzYxZWM0ID0gTC50aWxlTGF5ZXIoCiAgICAgICAgICAgICAgICAnaHR0cHM6Ly97c30udGlsZXMubWFwYm94LmNvbS92My9tYXBib3gud29ybGQtYnJpZ2h0L3t6fS97eH0ve3l9LnBuZycsCiAgICAgICAgICAgICAgICB7CiAgImF0dHJpYnV0aW9uIjogbnVsbCwKICAiZGV0ZWN0UmV0aW5hIjogZmFsc2UsCiAgIm1heFpvb20iOiAxOCwKICAibWluWm9vbSI6IDEsCiAgIm5vV3JhcCI6IGZhbHNlLAogICJzdWJkb21haW5zIjogImFiYyIKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfZGRkNDdkNGZiNTNlNGEzZmJlMzQzNjVlNzI0ZjU5YWIpOwogICAgICAgIAo8L3NjcmlwdD4=\" 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 0x7fb000dfa978>"
]
},
"execution_count": 19,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# create a world map with a Mapbox Bright style.\n",
"world_map = folium.Map(tiles='Mapbox Bright')\n",
"\n",
"# display the map\n",
"world_map"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"editable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"Zoom in and notice how the borders start showing as you zoom in, and the displayed country names are in English."
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"**Question**: Create a map of Mexico to visualize its hill shading and natural vegetation. Use a zoom level of 6."
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": 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+ICNtYXBfYTk2NmM3MDc2NTIyNGMwMzhhM2ZhY2EwMzA1YmFkM2UgewogICAgICAgICAgICAgICAgcG9zaXRpb24gOiByZWxhdGl2ZTsKICAgICAgICAgICAgICAgIHdpZHRoIDogMTAwLjAlOwogICAgICAgICAgICAgICAgaGVpZ2h0OiAxMDAuMCU7CiAgICAgICAgICAgICAgICBsZWZ0OiAwLjAlOwogICAgICAgICAgICAgICAgdG9wOiAwLjAlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICA8L3N0eWxlPgogICAgICAgIAo8L2hlYWQ+Cjxib2R5PiAgICAKICAgIAogICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb2xpdW0tbWFwIiBpZD0ibWFwX2E5NjZjNzA3NjUyMjRjMDM4YTNmYWNhMDMwNWJhZDNlIiA+PC9kaXY+CiAgICAgICAgCjwvYm9keT4KPHNjcmlwdD4gICAgCiAgICAKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGJvdW5kcyA9IG51bGw7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcF9hOTY2YzcwNzY1MjI0YzAzOGEzZmFjYTAzMDViYWQzZSA9IEwubWFwKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21hcF9hOTY2YzcwNzY1MjI0YzAzOGEzZmFjYTAzMDViYWQzZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y2VudGVyOiBbMjMuNjM0NSwtMTAyLjU1MjhdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgem9vbTogNiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heEJvdW5kczogYm91bmRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXJzOiBbXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmxkQ29weUp1bXA6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JzOiBMLkNSUy5FUFNHMzg1NwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHRpbGVfbGF5ZXJfZDc4MzJlMjcyYTliNDAyN2ExNDEwN2I1OWI4ZWQwY2EgPSBMLnRpbGVMYXllcigKICAgICAgICAgICAgICAgICdodHRwczovL3N0YW1lbi10aWxlcy17c30uYS5zc2wuZmFzdGx5Lm5ldC90ZXJyYWluL3t6fS97eH0ve3l9LmpwZycsCiAgICAgICAgICAgICAgICB7CiAgImF0dHJpYnV0aW9uIjogbnVsbCwKICAiZGV0ZWN0UmV0aW5hIjogZmFsc2UsCiAgIm1heFpvb20iOiAxOCwKICAibWluWm9vbSI6IDEsCiAgIm5vV3JhcCI6IGZhbHNlLAogICJzdWJkb21haW5zIjogImFiYyIKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfYTk2NmM3MDc2NTIyNGMwMzhhM2ZhY2EwMzA1YmFkM2UpOwogICAgICAgIAo8L3NjcmlwdD4=\" 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 0x7fb000d4e198>"
]
},
"execution_count": 22,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"### type your answer here\n",
"mexico_map = folium.Map(location = [23.6345, -102.5528], zoom_start=6, tiles='Stamen Terrain')\n",
"\n",
"mexico_map\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"Double-click __here__ for the solution.\n",
"<!-- The correct answer is:\n",
"\\\\ # define Mexico's geolocation coordinates\n",
"mexico_latitude = 23.6345 \n",
"mexico_longitude = -102.5528\n",
"-->\n",
"\n",
"<!--\n",
"\\\\ # define the world map centered around Canada with a higher zoom level\n",
"mexico_map = folium.Map(location=[mexico_latitude, mexico_longitude], zoom_start=6, tiles='Stamen Terrain')\n",
"-->\n",
"\n",
"<!--\n",
"\\\\ # display world map\n",
"mexico_map\n",
"-->"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"editable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"# Maps with Markers <a id=\"6\"></a>\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"editable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"Let's download and import the data on police department incidents using *pandas* `read_csv()` method."
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"editable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"Download the dataset and read it into a *pandas* dataframe:"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"editable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Dataset downloaded and read into a pandas dataframe!\n"
]
}
],
"source": [
"df_incidents = pd.read_csv('https://s3-api.us-geo.objectstorage.softlayer.net/cf-courses-data/CognitiveClass/DV0101EN/labs/Data_Files/Police_Department_Incidents_-_Previous_Year__2016_.csv')\n",
"\n",
"print('Dataset downloaded and read into a pandas dataframe!')"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"editable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"Let's take a look at the first five items in our dataset."
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"editable": true,
"new_sheet": false,
"run_control": {
"read_only": 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>IncidntNum</th>\n",
" <th>Category</th>\n",
" <th>Descript</th>\n",
" <th>DayOfWeek</th>\n",
" <th>Date</th>\n",
" <th>Time</th>\n",
" <th>PdDistrict</th>\n",
" <th>Resolution</th>\n",
" <th>Address</th>\n",
" <th>X</th>\n",
" <th>Y</th>\n",
" <th>Location</th>\n",
" <th>PdId</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>120058272</td>\n",
" <td>WEAPON LAWS</td>\n",
" <td>POSS OF PROHIBITED WEAPON</td>\n",
" <td>Friday</td>\n",
" <td>01/29/2016 12:00:00 AM</td>\n",
" <td>11:00</td>\n",
" <td>SOUTHERN</td>\n",
" <td>ARREST, BOOKED</td>\n",
" <td>800 Block of BRYANT ST</td>\n",
" <td>-122.403405</td>\n",
" <td>37.775421</td>\n",
" <td>(37.775420706711, -122.403404791479)</td>\n",
" <td>12005827212120</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>120058272</td>\n",
" <td>WEAPON LAWS</td>\n",
" <td>FIREARM, LOADED, IN VEHICLE, POSSESSION OR USE</td>\n",
" <td>Friday</td>\n",
" <td>01/29/2016 12:00:00 AM</td>\n",
" <td>11:00</td>\n",
" <td>SOUTHERN</td>\n",
" <td>ARREST, BOOKED</td>\n",
" <td>800 Block of BRYANT ST</td>\n",
" <td>-122.403405</td>\n",
" <td>37.775421</td>\n",
" <td>(37.775420706711, -122.403404791479)</td>\n",
" <td>12005827212168</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>141059263</td>\n",
" <td>WARRANTS</td>\n",
" <td>WARRANT ARREST</td>\n",
" <td>Monday</td>\n",
" <td>04/25/2016 12:00:00 AM</td>\n",
" <td>14:59</td>\n",
" <td>BAYVIEW</td>\n",
" <td>ARREST, BOOKED</td>\n",
" <td>KEITH ST / SHAFTER AV</td>\n",
" <td>-122.388856</td>\n",
" <td>37.729981</td>\n",
" <td>(37.7299809672996, -122.388856204292)</td>\n",
" <td>14105926363010</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>160013662</td>\n",
" <td>NON-CRIMINAL</td>\n",
" <td>LOST PROPERTY</td>\n",
" <td>Tuesday</td>\n",
" <td>01/05/2016 12:00:00 AM</td>\n",
" <td>23:50</td>\n",
" <td>TENDERLOIN</td>\n",
" <td>NONE</td>\n",
" <td>JONES ST / OFARRELL ST</td>\n",
" <td>-122.412971</td>\n",
" <td>37.785788</td>\n",
" <td>(37.7857883766888, -122.412970537591)</td>\n",
" <td>16001366271000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>160002740</td>\n",
" <td>NON-CRIMINAL</td>\n",
" <td>LOST PROPERTY</td>\n",
" <td>Friday</td>\n",
" <td>01/01/2016 12:00:00 AM</td>\n",
" <td>00:30</td>\n",
" <td>MISSION</td>\n",
" <td>NONE</td>\n",
" <td>16TH ST / MISSION ST</td>\n",
" <td>-122.419672</td>\n",
" <td>37.765050</td>\n",
" <td>(37.7650501214668, -122.419671780296)</td>\n",
" <td>16000274071000</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" IncidntNum Category Descript \\\n",
"0 120058272 WEAPON LAWS POSS OF PROHIBITED WEAPON \n",
"1 120058272 WEAPON LAWS FIREARM, LOADED, IN VEHICLE, POSSESSION OR USE \n",
"2 141059263 WARRANTS WARRANT ARREST \n",
"3 160013662 NON-CRIMINAL LOST PROPERTY \n",
"4 160002740 NON-CRIMINAL LOST PROPERTY \n",
"\n",
" DayOfWeek Date Time PdDistrict Resolution \\\n",
"0 Friday 01/29/2016 12:00:00 AM 11:00 SOUTHERN ARREST, BOOKED \n",
"1 Friday 01/29/2016 12:00:00 AM 11:00 SOUTHERN ARREST, BOOKED \n",
"2 Monday 04/25/2016 12:00:00 AM 14:59 BAYVIEW ARREST, BOOKED \n",
"3 Tuesday 01/05/2016 12:00:00 AM 23:50 TENDERLOIN NONE \n",
"4 Friday 01/01/2016 12:00:00 AM 00:30 MISSION NONE \n",
"\n",
" Address X Y \\\n",
"0 800 Block of BRYANT ST -122.403405 37.775421 \n",
"1 800 Block of BRYANT ST -122.403405 37.775421 \n",
"2 KEITH ST / SHAFTER AV -122.388856 37.729981 \n",
"3 JONES ST / OFARRELL ST -122.412971 37.785788 \n",
"4 16TH ST / MISSION ST -122.419672 37.765050 \n",
"\n",
" Location PdId \n",
"0 (37.775420706711, -122.403404791479) 12005827212120 \n",
"1 (37.775420706711, -122.403404791479) 12005827212168 \n",
"2 (37.7299809672996, -122.388856204292) 14105926363010 \n",
"3 (37.7857883766888, -122.412970537591) 16001366271000 \n",
"4 (37.7650501214668, -122.419671780296) 16000274071000 "
]
},
"execution_count": 24,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_incidents.head()"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"editable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"So each row consists of 13 features:\n",
"> 1. **IncidntNum**: Incident Number\n",
"> 2. **Category**: Category of crime or incident\n",
"> 3. **Descript**: Description of the crime or incident\n",
"> 4. **DayOfWeek**: The day of week on which the incident occurred\n",
"> 5. **Date**: The Date on which the incident occurred\n",
"> 6. **Time**: The time of day on which the incident occurred\n",
"> 7. **PdDistrict**: The police department district\n",
"> 8. **Resolution**: The resolution of the crime in terms whether the perpetrator was arrested or not\n",
"> 9. **Address**: The closest address to where the incident took place\n",
"> 10. **X**: The longitude value of the crime location \n",
"> 11. **Y**: The latitude value of the crime location\n",
"> 12. **Location**: A tuple of the latitude and the longitude values\n",
"> 13. **PdId**: The police department ID"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"editable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"Let's find out how many entries there are in our dataset."
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"editable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [
{
"data": {
"text/plain": [
"(150500, 13)"
]
},
"execution_count": 25,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_incidents.shape"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"editable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"So the dataframe consists of 150,500 crimes, which took place in the year 2016. In order to reduce computational cost, let's just work with the first 100 incidents in this dataset."
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {
"button": false,
"collapsed": true,
"deletable": true,
"editable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [],
"source": [
"# get the first 100 crimes in the df_incidents dataframe\n",
"limit = 100\n",
"df_incidents = df_incidents.iloc[0:limit, :]"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"editable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"Let's confirm that our dataframe now consists only of 100 crimes."
]
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"editable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [
{
"data": {
"text/plain": [
"(100, 13)"
]
},
"execution_count": 27,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_incidents.shape"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"editable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"Now that we reduced the data a little bit, let's visualize where these crimes took place in the city of San Francisco. We will use the default style and we will initialize the zoom level to 12. "
]
},
{
"cell_type": "code",
"execution_count": 28,
"metadata": {
"button": false,
"collapsed": true,
"deletable": true,
"editable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [],
"source": [
"# San Francisco latitude and longitude values\n",
"latitude = 37.77\n",
"longitude = -122.42"
]
},
{
"cell_type": "code",
"execution_count": 29,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"editable": true,
"new_sheet": false,
"run_control": {
"read_only": 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+ICNtYXBfMTI0OWE4ZjJmNGFjNDgyZmFmMDhiMjZhMDg3NDZjNjMgewogICAgICAgICAgICAgICAgcG9zaXRpb24gOiByZWxhdGl2ZTsKICAgICAgICAgICAgICAgIHdpZHRoIDogMTAwLjAlOwogICAgICAgICAgICAgICAgaGVpZ2h0OiAxMDAuMCU7CiAgICAgICAgICAgICAgICBsZWZ0OiAwLjAlOwogICAgICAgICAgICAgICAgdG9wOiAwLjAlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICA8L3N0eWxlPgogICAgICAgIAo8L2hlYWQ+Cjxib2R5PiAgICAKICAgIAogICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb2xpdW0tbWFwIiBpZD0ibWFwXzEyNDlhOGYyZjRhYzQ4MmZhZjA4YjI2YTA4NzQ2YzYzIiA+PC9kaXY+CiAgICAgICAgCjwvYm9keT4KPHNjcmlwdD4gICAgCiAgICAKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGJvdW5kcyA9IG51bGw7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcF8xMjQ5YThmMmY0YWM0ODJmYWYwOGIyNmEwODc0NmM2MyA9IEwubWFwKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21hcF8xMjQ5YThmMmY0YWM0ODJmYWYwOGIyNmEwODc0NmM2MycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y2VudGVyOiBbMzcuNzcsLTEyMi40Ml0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6b29tOiAxMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heEJvdW5kczogYm91bmRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXJzOiBbXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmxkQ29weUp1bXA6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JzOiBMLkNSUy5FUFNHMzg1NwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHRpbGVfbGF5ZXJfNjIzNTdhNDQ4YmRkNDRiODllNjUyZDM5YjVjMzQyYzAgPSBMLnRpbGVMYXllcigKICAgICAgICAgICAgICAgICdodHRwczovL3tzfS50aWxlLm9wZW5zdHJlZXRtYXAub3JnL3t6fS97eH0ve3l9LnBuZycsCiAgICAgICAgICAgICAgICB7CiAgImF0dHJpYnV0aW9uIjogbnVsbCwKICAiZGV0ZWN0UmV0aW5hIjogZmFsc2UsCiAgIm1heFpvb20iOiAxOCwKICAibWluWm9vbSI6IDEsCiAgIm5vV3JhcCI6IGZhbHNlLAogICJzdWJkb21haW5zIjogImFiYyIKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMTI0OWE4ZjJmNGFjNDgyZmFmMDhiMjZhMDg3NDZjNjMpOwogICAgICAgIAo8L3NjcmlwdD4=\" 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 0x7fb000035a20>"
]
},
"execution_count": 29,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# create map and display it\n",
"sanfran_map = folium.Map(location=[latitude, longitude], zoom_start=12)\n",
"\n",
"# display the map of San Francisco\n",
"sanfran_map"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"editable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"Now let's superimpose the locations of the crimes onto the map. The way to do that in **Folium** is to create a *feature group* with its own features and style and then add it to the sanfran_map."
]
},
{
"cell_type": "code",
"execution_count": 30,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"editable": true,
"new_sheet": false,
"run_control": {
"read_only": false
},
"scrolled": 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+ICNtYXBfMTI0OWE4ZjJmNGFjNDgyZmFmMDhiMjZhMDg3NDZjNjMgewogICAgICAgICAgICAgICAgcG9zaXRpb24gOiByZWxhdGl2ZTsKICAgICAgICAgICAgICAgIHdpZHRoIDogMTAwLjAlOwogICAgICAgICAgICAgICAgaGVpZ2h0OiAxMDAuMCU7CiAgICAgICAgICAgICAgICBsZWZ0OiAwLjAlOwogICAgICAgICAgICAgICAgdG9wOiAwLjAlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICA8L3N0eWxlPgogICAgICAgIAo8L2hlYWQ+Cjxib2R5PiAgICAKICAgIAogICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb2xpdW0tbWFwIiBpZD0ibWFwXzEyNDlhOGYyZjRhYzQ4MmZhZjA4YjI2YTA4NzQ2YzYzIiA+PC9kaXY+CiAgICAgICAgCjwvYm9keT4KPHNjcmlwdD4gICAgCiAgICAKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGJvdW5kcyA9IG51bGw7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcF8xMjQ5YThmMmY0YWM0ODJmYWYwOGIyNmEwODc0NmM2MyA9IEwubWFwKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21hcF8xMjQ5YThmMmY0YWM0ODJmYWYwOGIyNmEwODc0NmM2MycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y2VudGVyOiBbMzcuNzcsLTEyMi40Ml0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6b29tOiAxMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heEJvdW5kczogYm91bmRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXJzOiBbXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmxkQ29weUp1bXA6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JzOiBMLkNSUy5FUFNHMzg1NwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHRpbGVfbGF5ZXJfNjIzNTdhNDQ4YmRkNDRiODllNjUyZDM5YjVjMzQyYzAgPSBMLnRpbGVMYXllcigKICAgICAgICAgICAgICAgICdodHRwczovL3tzfS50aWxlLm9wZW5zdHJlZXRtYXAub3JnL3t6fS97eH0ve3l9LnBuZycsCiAgICAgICAgICAgICAgICB7CiAgImF0dHJpYnV0aW9uIjogbnVsbCwKICAiZGV0ZWN0UmV0aW5hIjogZmFsc2UsCiAgIm1heFpvb20iOiAxOCwKICAibWluWm9vbSI6IDEsCiAgIm5vV3JhcCI6IGZhbHNlLAogICJzdWJkb21haW5zIjogImFiYyIKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMTI0OWE4ZjJmNGFjNDgyZmFmMDhiMjZhMDg3NDZjNjMpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBmZWF0dXJlX2dyb3VwX2RhMzQ0NjU0MjMxMjQ1N2I4M2U4ZTdjZWJkOGVmZjQ2ID0gTC5mZWF0dXJlR3JvdXAoCiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8xMjQ5YThmMmY0YWM0ODJmYWYwOGIyNmEwODc0NmM2Myk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYjZmYTFlODRkMDU3NDZjNDk3OTdmYzk5OTEwMDNhNWMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NzU0MjA3MDY3MTEsLTEyMi40MDM0MDQ3OTE0Nzg5OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9kYTM0NDY1NDIzMTI0NTdiODNlOGU3Y2ViZDhlZmY0Nik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2JmNWI1ZDE5MGNlNzQzMzU5MjIyZWEzNjdmY2ZlZjhlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzc1NDIwNzA2NzExLC0xMjIuNDAzNDA0NzkxNDc4OTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGEzNDQ2NTQyMzEyNDU3YjgzZThlN2NlYmQ4ZWZmNDYpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8yZTVjMmQyNjQ2NzI0NDdlYWE5YmRiYmJlNzE4MWZjNiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjcyOTk4MDk2NzI5OTU5NiwtMTIyLjM4ODg1NjIwNDI5Ml0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9kYTM0NDY1NDIzMTI0NTdiODNlOGU3Y2ViZDhlZmY0Nik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2UxZmVlMTM1ZjMzODRlNjc4MjlhOWI1YzNhNzFiODY3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzg1Nzg4Mzc2Njg4NzksLTEyMi40MTI5NzA1Mzc1OTFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGEzNDQ2NTQyMzEyNDU3YjgzZThlN2NlYmQ4ZWZmNDYpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl84NGY2MWI3OTFlNDE0YzNiOWVkYWVmMzdjNmYxZTQwZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc2NTA1MDEyMTQ2NjgsLTEyMi40MTk2NzE3ODAyOTZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGEzNDQ2NTQyMzEyNDU3YjgzZThlN2NlYmQ4ZWZmNDYpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9kZWVhYjVjYTIyOWU0MjRkYTBjMTNjY2ZjNThiOTdhZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc4ODAxODU1NTgyOSwtMTIyLjQyNjA3NzE3NzM3NDk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2RhMzQ0NjU0MjMxMjQ1N2I4M2U4ZTdjZWJkOGVmZjQ2KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZjRkNDNmNGRjMzRmNDdmMzkyYTA1NmQ0NTVlNTIwODYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODA4Nzg5MzYwMjE0LC0xMjIuNDA1NzIxNDU0NTY3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2RhMzQ0NjU0MjMxMjQ1N2I4M2U4ZTdjZWJkOGVmZjQ2KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOWU0ZmNhZWIwMjdhNDMzMGE4NjY2YTVlMzU0MDY2ODggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODM5ODA1NTkyNjM0LC0xMjIuNDExNzc4Mjk1OTkyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2RhMzQ0NjU0MjMxMjQ1N2I4M2U4ZTdjZWJkOGVmZjQ2KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMTVmYmJhMmYwYmI4NGEwNjljNzJiODgwOWE2MjM0ZjAgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NzU3ODc2MjE4MjkyOTUsLTEyMi4zOTMzNTcyNDE0NTFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGEzNDQ2NTQyMzEyNDU3YjgzZThlN2NlYmQ4ZWZmNDYpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81OTllMjg4NGU3Yjc0NzNmODNiY2IxNjJhYzI1ZDA1NyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjcyMDk2Njk2MTU0OTksLTEyMi4zODcxODE2MzU5OTVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGEzNDQ2NTQyMzEyNDU3YjgzZThlN2NlYmQ4ZWZmNDYpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lZTM1NzAyODQwNmQ0MDNkODY3NmJlNjk4NTJjZDk5YiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc2NDQ3ODE1Nzg2OTUwNSwtMTIyLjQ3NzM3NjUyNDAwMjk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2RhMzQ0NjU0MjMxMjQ1N2I4M2U4ZTdjZWJkOGVmZjQ2KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfODMzNGYwNGZjMGFiNGFjZDk1MjU1MTk1NDJjYzkyMTUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NDU3Mzg5NDI5NjU0OTUsLTEyMi40Nzc5NjAzMjcyOTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGEzNDQ2NTQyMzEyNDU3YjgzZThlN2NlYmQ4ZWZmNDYpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8zYTEzZTk1MmQyM2Q0N2E3OWEyN2U4MzViZmM3ZWU5NSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjczNTY5NzAyNzU0ODIwNiwtMTIyLjM3Njc1NzY1NTUzMDAxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2RhMzQ0NjU0MjMxMjQ1N2I4M2U4ZTdjZWJkOGVmZjQ2KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNzA5ZjJkMDQwNzQzNDI5YTkwNjYzMTQ3NzIzZjYwNWUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43MjkyNzA1MTk5NTkyLC0xMjIuNDMyMzI1ODcxMDI4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2RhMzQ0NjU0MjMxMjQ1N2I4M2U4ZTdjZWJkOGVmZjQ2KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZTRiNGJhY2ExMjlhNDQyMjgwYmQyZjhkZDBmYmMzZjggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43OTE2NDI5ODIzODQsLTEyMi40MDA5MDg2OTg4ODk5OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9kYTM0NDY1NDIzMTI0NTdiODNlOGU3Y2ViZDhlZmY0Nik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzE3ZWEwYzg3MTY2ZTQ2ZDliNGZlODIzOTczMjc5MjljID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzgzNzA2OTMwMTU0NSwtMTIyLjQwODU5NTExMDg2OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9kYTM0NDY1NDIzMTI0NTdiODNlOGU3Y2ViZDhlZmY0Nik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzJjNDg3MTFhNmY5MDRhMDZhYTQzZmVjMDU0YjgwODA3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzU3Mjg5NTkwNDU3Nzk1LC0xMjIuNDA2ODcwNDAyMDgyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2RhMzQ0NjU0MjMxMjQ1N2I4M2U4ZTdjZWJkOGVmZjQ2KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMWZmMTViYzJkNTc0NDc0Y2JlNDI0N2NjOGE2YTI3OGQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NDg5MDYzMDUxODI5LC0xMjIuNDIwMzU0NzgwODYwOTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGEzNDQ2NTQyMzEyNDU3YjgzZThlN2NlYmQ4ZWZmNDYpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85NTUwOGE3YjAwZmY0YWJiYWE2ZDY3NTdjMDNhOGJkNyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjcxNTc2NTQyNjk5NSwtMTIyLjQzOTkwOTc2Njc3Ml0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9kYTM0NDY1NDIzMTI0NTdiODNlOGU3Y2ViZDhlZmY0Nik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzAxZTZkMTY2ODM5OTQ0MGM4OWIyNWUzNWI1MTFkZDZlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzgzNTY5OTM4NjkxOCwtMTIyLjQwODQyMTExNjkyMl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9kYTM0NDY1NDIzMTI0NTdiODNlOGU3Y2ViZDhlZmY0Nik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzg4MDdkNWYyNDVhYjQxZTBiZmNkZGFlOGU4NWU1YzcwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzczNjE4NjI3NjQ1NjA0LC0xMjIuNDIyMzE1NjcwNzQ5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2RhMzQ0NjU0MjMxMjQ1N2I4M2U4ZTdjZWJkOGVmZjQ2KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMTNmN2EyYjYyNzUwNDNhYWJmNGU4MmNmMGVhNGVkMmMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43OTI4NDEyODQwNDQ3MDUsLTEyMi40MjQ1MTk4MzUwMDkwMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9kYTM0NDY1NDIzMTI0NTdiODNlOGU3Y2ViZDhlZmY0Nik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2E0OTE3NmMwMTQxNTQ5NmViNTFiNzM4MTIyZGQwOGI1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzU0MDk4Njg4MjA2Nzk1LC0xMjIuNDE0MjMzODQ5MDM3OThdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGEzNDQ2NTQyMzEyNDU3YjgzZThlN2NlYmQ4ZWZmNDYpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lOThiZTEwMTI0OWI0OGI5ODg1MDQzOTUwNzg2NDgyNCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc1NDA5ODY4ODIwNjc5NSwtMTIyLjQxNDIzMzg0OTAzNzk4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2RhMzQ0NjU0MjMxMjQ1N2I4M2U4ZTdjZWJkOGVmZjQ2KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYTMxYWFjMDgyZGZlNGZjYjhlNzg5NjZmOWFiYjFhNTYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NzE0OTM5OTY5NDE2LC0xMjIuNTA3NzUwMTMxMDA0MDJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGEzNDQ2NTQyMzEyNDU3YjgzZThlN2NlYmQ4ZWZmNDYpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9hMjljZjFiNjFkNDE0ZDgyYTUxNmI4MWE4OTllZWYzMiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjcxODMwMjIwNDc2NjAwNSwtMTIyLjQ3NDQ0NDYzOTU5NDk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2RhMzQ0NjU0MjMxMjQ1N2I4M2U4ZTdjZWJkOGVmZjQ2KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNTM3MzExNGU0NmEwNDFiMjllMTZkZmNmZjk4NzU3YmMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NjQ1NzUyMzE3NjE1LC0xMjIuNDI3NTYyNTk2OTg1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2RhMzQ0NjU0MjMxMjQ1N2I4M2U4ZTdjZWJkOGVmZjQ2KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMTE3Yjc5NWZjODdjNDllYThjMGNmMTI3NzcyYTVjNGIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODc0Mzc4MzA5MTEyLC0xMjIuNDE5MjAzMDA0MjY4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2RhMzQ0NjU0MjMxMjQ1N2I4M2U4ZTdjZWJkOGVmZjQ2KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfM2FhYzdhODgyMTBhNDZhM2E3MThjOTA3ZjM5ZjRiN2YgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NDkzNjg4Mjg0NTMyLC0xMjIuNDEyNjkwMTQyMzA4MDFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGEzNDQ2NTQyMzEyNDU3YjgzZThlN2NlYmQ4ZWZmNDYpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85MGU1YWE1ZDMzYTg0NjJiYjgyYzg0ZjI2NzY5ODk5MiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjcwOTIwMTA0NjIzNzksLTEyMi40MzQ2MDkyODAzNTJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGEzNDQ2NTQyMzEyNDU3YjgzZThlN2NlYmQ4ZWZmNDYpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9iZTlhMDg2M2UxNWQ0MjdmODI0YWNhMGNjYmNlZDEzYiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc4NzkyMDkzNzU1MzI5NSwtMTIyLjQxMDg4MjgyNTU1MV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9kYTM0NDY1NDIzMTI0NTdiODNlOGU3Y2ViZDhlZmY0Nik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzA0YjRmYWE5ZTQ1YzQ0MzE5OTg1OGFkZTM1ZDczYmYwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuODAwNDU2NjQ3MTAzODksLTEyMi40MDE0MzI3NTQ3MjIwMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9kYTM0NDY1NDIzMTI0NTdiODNlOGU3Y2ViZDhlZmY0Nik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzlmMzU3YzI4NWQ4YjRmZDU4MGY5ZmEyYzE3YWZmMWQ5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzQzNTU1MDU0MjI2NSwtMTIyLjQyMTEyODAyOTUwNV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9kYTM0NDY1NDIzMTI0NTdiODNlOGU3Y2ViZDhlZmY0Nik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzRmZGQ0NjBmOGVkZTRlMGE4NmYxMzcyMWIxM2I1MWViID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzg2NTY0NzYwNzY4NSwtMTIyLjQwNzI0NDA4NzAzMl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9kYTM0NDY1NDIzMTI0NTdiODNlOGU3Y2ViZDhlZmY0Nik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzg1NjEwMzIwNDMzOTQ3YjY5ODNiZjg5Zjc2YWUyMmNlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzYxNTY1NTkyODA0NSwtMTIyLjQyMzgwMzAwMTkwMDk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2RhMzQ0NjU0MjMxMjQ1N2I4M2U4ZTdjZWJkOGVmZjQ2KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMWEyZDc4NGE3NDgwNDZlMWFkMmVkYzVkYzYzOTVmMjQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NjE1NjU1OTI4MDQ1LC0xMjIuNDIzODAzMDAxOTAwOTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGEzNDQ2NTQyMzEyNDU3YjgzZThlN2NlYmQ4ZWZmNDYpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85OGYxMDI0YjRkMjk0ZThmYTdhNjNkZTY3NjdiNWFlMCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc0NDE5Mjc1MDg5MzIwNSwtMTIyLjQ0NDY4NTQ4MjI3M10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9kYTM0NDY1NDIzMTI0NTdiODNlOGU3Y2ViZDhlZmY0Nik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzUyNzQ0MTI5YjkyNDQ4ZGNhZjQ2NjgyZTVmNzQ5NjU2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzc1NDY5MjgyMDA0MSwtMTIyLjQxNTc1NzAzOTE5Nl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9kYTM0NDY1NDIzMTI0NTdiODNlOGU3Y2ViZDhlZmY0Nik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2ZhYjg4MTNlODVlMzQ2OWRhYWQyMmE3Y2RkMTc2NGI1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzI4NTI4MDYyNzQ2NSwtMTIyLjQ3NTY0NzQ2MDc4NTk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2RhMzQ0NjU0MjMxMjQ1N2I4M2U4ZTdjZWJkOGVmZjQ2KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMWY4MDkyMjcxNTE5NGFkN2I4NzRlNjNhZDQ3NTU3YzYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NDI4NTE3Mzc0NDQ4OTQsLTEyMi40MjA5Njc0NDA1NjRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGEzNDQ2NTQyMzEyNDU3YjgzZThlN2NlYmQ4ZWZmNDYpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81YTg0ZDBkZmQwYzE0OTc2OTY1YWYyZTI5NDFiNjRjZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc4MjExOTg0ODg5MzEsLTEyMi40MTU2Njk2NjE0NDNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGEzNDQ2NTQyMzEyNDU3YjgzZThlN2NlYmQ4ZWZmNDYpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9iMDk4ZjM0OGNkOGM0MjllOThjYmY5YmY1NTY1ZjJkYSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc3OTE2NzQyMTg5NjMsLTEyMi40MDYzNDY0MjU2MzJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGEzNDQ2NTQyMzEyNDU3YjgzZThlN2NlYmQ4ZWZmNDYpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mZWFiNmIwY2NkY2E0MzBkODI2Yjg5YmUzMGFkMjNhNSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc2NTcxODQzOTUyODIsLTEyMi40MDk1Mjk5MTMyNzhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGEzNDQ2NTQyMzEyNDU3YjgzZThlN2NlYmQ4ZWZmNDYpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8wNTI3ZDQ2MmY0MWU0ZjA3ODMwZWNmZGE4M2RlOGExNyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc3NTQyMDcwNjcxMSwtMTIyLjQwMzQwNDc5MTQ3ODk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2RhMzQ0NjU0MjMxMjQ1N2I4M2U4ZTdjZWJkOGVmZjQ2KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNzc4ZTU0ZGUxZGExNDJiZGEwYTM1ZDc3NzZhODM4N2MgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43Njc1MjQzMDg3ODMsLTEyMi40MTA3MzgwOTczMTVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGEzNDQ2NTQyMzEyNDU3YjgzZThlN2NlYmQ4ZWZmNDYpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9kMTFkYTZiNzZlYjE0OTNkYmMzODcxZmRjYWZlM2E5MSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc2NzUyNDMwODc4MywtMTIyLjQxMDczODA5NzMxNV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9kYTM0NDY1NDIzMTI0NTdiODNlOGU3Y2ViZDhlZmY0Nik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2NkZDEyMGZiYjBiZDQ3N2Q4MzUyOGFkZjBjYTIwNzg0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzEzMTA4MzQzMzI2NCwtMTIyLjQ0NDMxNDAyNTE4OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9kYTM0NDY1NDIzMTI0NTdiODNlOGU3Y2ViZDhlZmY0Nik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzZiYTBmYzdkYWJhMTRlNzdiYzc4ZjQ2ZjQxYjQwMjZmID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzEzMTA4MzQzMzI2NCwtMTIyLjQ0NDMxNDAyNTE4OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9kYTM0NDY1NDIzMTI0NTdiODNlOGU3Y2ViZDhlZmY0Nik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzAzMzU1NWU0NjI4ODRiMjg5OTFlMzBkOThlYTcxZTI3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzY2MDE2MDExNDEwMywtMTIyLjQwMzY0NDYyMDQzOV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9kYTM0NDY1NDIzMTI0NTdiODNlOGU3Y2ViZDhlZmY0Nik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2I2NjA5YjE1Y2YzMTQ3ZjE5MTY1OWI1ZmI1NWZhYjM4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzY2MDE2MDExNDEwMywtMTIyLjQwMzY0NDYyMDQzOV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9kYTM0NDY1NDIzMTI0NTdiODNlOGU3Y2ViZDhlZmY0Nik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2NiM2IyOGIzYTlmNTRmNWFiMDBhZjI3YmNiNTExNDAwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzc2MjMxMDQwNDc1OCwtMTIyLjQxNDcxNDI5NTU3ODk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2RhMzQ0NjU0MjMxMjQ1N2I4M2U4ZTdjZWJkOGVmZjQ2KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZDU0NDcxN2RmNWJjNDQ3YzllMjQ0ZTExNTQ5Nzk3NDIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NzYyMzEwNDA0NzU4LC0xMjIuNDE0NzE0Mjk1NTc4OTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGEzNDQ2NTQyMzEyNDU3YjgzZThlN2NlYmQ4ZWZmNDYpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl84MDI4NTFlZWRkODU0MDFhODcyYzg5ODlmMzVjMDgzZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc3NzUxMTg4OTU2OTUsLTEyMi40MTgwNDU0NTI3NjhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGEzNDQ2NTQyMzEyNDU3YjgzZThlN2NlYmQ4ZWZmNDYpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9kNzM2ZmI0ZDZkMWI0ODNjODQxNjJlNjMyZGNmNDM4NiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc4MjAyMzg0Nzg5NzUsLTEyMi40MDExNjE1NTU2MDJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGEzNDQ2NTQyMzEyNDU3YjgzZThlN2NlYmQ4ZWZmNDYpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8zYmY5NWYwZGY3MDM0ODg4ODM0NmQ4NGY1NmM0YTFmZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjcyNzAwNTMxOTYyOTk5NSwtMTIyLjQwMzQwODY2OTE5MV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9kYTM0NDY1NDIzMTI0NTdiODNlOGU3Y2ViZDhlZmY0Nik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzM1ZDQxODBjNGFjNzRjOWJiMjAyZTI0MDA1Y2QwYjc1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzgzODM0NDM3NDE0MSwtMTIyLjQxMjkzMDUyMjA1OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9kYTM0NDY1NDIzMTI0NTdiODNlOGU3Y2ViZDhlZmY0Nik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2U5MjVkZjAzZTNhMDRlMTM5NDZlNDg4NzFlMjkwNjgxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzUzMDE4NjUzNzQ0NjA0LC0xMjIuNDE4NTg3MTcyMjE5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2RhMzQ0NjU0MjMxMjQ1N2I4M2U4ZTdjZWJkOGVmZjQ2KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMTVlYmQ5MjcwMmI0NDk3M2I2ZDI4ZGI0MGJmNmMyMzkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NzQwNDE4Mzg1MDQxLC0xMjIuNDE0MzcwNjI3NDk1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2RhMzQ0NjU0MjMxMjQ1N2I4M2U4ZTdjZWJkOGVmZjQ2KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMjYwNmFmZjlmMjBhNDAwNWFkNmQ3YWRjYzdjODYzNDIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43OTA1Mzg5OTM3MjUsLTEyMi40MDM5MTU2ODE1NzEwMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9kYTM0NDY1NDIzMTI0NTdiODNlOGU3Y2ViZDhlZmY0Nik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2UzY2UyZDQyMThmNzRhMTA5NjFlMDgwYTczMjk5NmVkID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzgzMDk5ODI0NDU5MjEsLTEyMi40MTkxODMwOTYzNjJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGEzNDQ2NTQyMzEyNDU3YjgzZThlN2NlYmQ4ZWZmNDYpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl83ODY5MjBkOGJmZWM0ZTE3ODcxZTcxZGM3MDFhMDJkYSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc0MDczNjA1NDgzNTc5LC0xMjIuMzg4NzUzMDQ2OTk3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2RhMzQ0NjU0MjMxMjQ1N2I4M2U4ZTdjZWJkOGVmZjQ2KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOWI4NzcwYjNiNDAxNGQzZmIxYjU1MzA5MTRkODU0M2MgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NzQ5OTEyOTQ0MzY2LC0xMjIuNDM3Nzk5NzAzNDY4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2RhMzQ0NjU0MjMxMjQ1N2I4M2U4ZTdjZWJkOGVmZjQ2KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMzNlZTEzMjU4NGU0NDE0NmFhOGI4YzZhNWRiYzI3ZjIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NzcwOTAyNzQzNjY5LC0xMjIuNDIxMzMyNjg0NjMzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2RhMzQ0NjU0MjMxMjQ1N2I4M2U4ZTdjZWJkOGVmZjQ2KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNDM3NzRjOGEyMmM3NDIxZTgxMTUyNmM0MTA5NDkyNTIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NzcwOTAyNzQzNjY5LC0xMjIuNDIxMzMyNjg0NjMzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2RhMzQ0NjU0MjMxMjQ1N2I4M2U4ZTdjZWJkOGVmZjQ2KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOTgxNDBkZmY5MmJhNDg2OWE3NTg2ZDU2NTY2YjU5MmEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODIyNDU4MjIzOTE3LC0xMjIuNDQ2NjEyOTc4ODM5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2RhMzQ0NjU0MjMxMjQ1N2I4M2U4ZTdjZWJkOGVmZjQ2KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMTMzMjNjY2M4MjAwNDdkZjllYWFmZDJkNzU5OTRiNDcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43MzAwMzc5OTk1MTI3OTUsLTEyMi40MDQ1OTQxNDA2MzRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGEzNDQ2NTQyMzEyNDU3YjgzZThlN2NlYmQ4ZWZmNDYpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl84MGM5ZGU2ZDhjNjc0OTYyYWIzZjE5ZjA4NjhjYjIyZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc5NTMzMzgyNjc0MzYsLTEyMi4zOTczNzM3NDAwNjZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGEzNDQ2NTQyMzEyNDU3YjgzZThlN2NlYmQ4ZWZmNDYpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl80MWRmYWNkYWMzOWY0NDQ1YTQxMWYyMDE4ZjIxNGExYyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc4NzUxNTg3NDE2MjI5NSwtMTIyLjQwNzQzNDk4OTUyM10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9kYTM0NDY1NDIzMTI0NTdiODNlOGU3Y2ViZDhlZmY0Nik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzVlZjRkOWYyOGUzODQyZjg4ZjlkYTM4Y2Q1YTJhMzA2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzc4NTIzMzc3NjAzMiwtMTIyLjQwMzQ2NDA4MDAzM10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9kYTM0NDY1NDIzMTI0NTdiODNlOGU3Y2ViZDhlZmY0Nik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzVhYTU2NWJhYjc1MzQwODU4ZTIxODBlM2UxOGMwMmFhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzc4NTIzMzc3NjAzMiwtMTIyLjQwMzQ2NDA4MDAzM10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9kYTM0NDY1NDIzMTI0NTdiODNlOGU3Y2ViZDhlZmY0Nik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzZkMTkwMzEzZjk1YjQzZjViOWU3YWEyZWI0OGM5NDUwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzczMjkxODA2OTAyOTk2LC0xMjIuNDM2NjE0MTgxMzMxMDFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGEzNDQ2NTQyMzEyNDU3YjgzZThlN2NlYmQ4ZWZmNDYpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl83YTBiYjc5ODE5NWQ0YWRmOGJjYTg5NjY5NmU3MDE1ZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc4MDUyNzU3ODUwOSwtMTIyLjM5Njg0OTAxNTE3MjAxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2RhMzQ0NjU0MjMxMjQ1N2I4M2U4ZTdjZWJkOGVmZjQ2KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYTFmYmQyMDcwNmY3NDY4YzgxNjJjM2FlNTIyMTEzNDcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODA1Mjc1Nzg1MDksLTEyMi4zOTY4NDkwMTUxNzIwMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9kYTM0NDY1NDIzMTI0NTdiODNlOGU3Y2ViZDhlZmY0Nik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2FlNzAxNjc5ZTVjZjQ0NWQ5ZjdmNTJmOTIwYjI3NGIzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzI4NDE4MDcwNjYwMjA0LC0xMjIuNDUwMDAwNzkwNDQ1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2RhMzQ0NjU0MjMxMjQ1N2I4M2U4ZTdjZWJkOGVmZjQ2KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZTIxZTU3YWJiMzY4NGMzOWJmZDI3ZmNmY2Y2ODNiZDQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43MjkyMTE0NjQ3MzU5LC0xMjIuNDAwODM0MjgzMDMxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2RhMzQ0NjU0MjMxMjQ1N2I4M2U4ZTdjZWJkOGVmZjQ2KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMTExYWQ1YjYxZDEyNDg0YmJkYjkwN2EzYmRhMDFlYzggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODgwMDY1MzI0MzkyMDUsLTEyMi4zOTk4MDIxNDU3OTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGEzNDQ2NTQyMzEyNDU3YjgzZThlN2NlYmQ4ZWZmNDYpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jNWEzYTY3YjY1ZTE0MTMwYjk3NDIzZDI3N2NiZmJiNyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjcyMzk3NDgyNDE2MDksLTEyMi4zOTQ5Mjg0NzU4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2RhMzQ0NjU0MjMxMjQ1N2I4M2U4ZTdjZWJkOGVmZjQ2KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZjFkMTAyYWQyMjM3NDBjM2E5ZmYzNDZiNzA4MjE0YjggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43MjM5NzQ4MjQxNjA5LC0xMjIuMzk0OTI4NDc1OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9kYTM0NDY1NDIzMTI0NTdiODNlOGU3Y2ViZDhlZmY0Nik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2Y4ODZhYWUzMmFmMTRkMmM4ZDQzOWQ5YWY5MDJkMGM1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzIzOTc0ODI0MTYwOSwtMTIyLjM5NDkyODQ3NThdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGEzNDQ2NTQyMzEyNDU3YjgzZThlN2NlYmQ4ZWZmNDYpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85NGQyOWZjODI5ZTY0OTliODI3M2MwNzQxYzYxMjM5YyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc4ODMyMzU0NDk5MDQsLTEyMi40MTE4NTcwMzI1NF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9kYTM0NDY1NDIzMTI0NTdiODNlOGU3Y2ViZDhlZmY0Nik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzNhN2Y1MzI4NjNkNjQ3YTdhZmQzODZlNDUwYmQ0MmVmID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzU1OTk3NzMzOTg1NiwtMTIyLjQwOTQzNTYxNzEwNl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9kYTM0NDY1NDIzMTI0NTdiODNlOGU3Y2ViZDhlZmY0Nik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2Q1YzE1M2I5ZGZjYjQ5MTlhNTE5N2QzZGFhNzI2YmFkID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzg3MDc5ODE0NDQ0MywtMTIyLjQyNTg4MzM1ODE0OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9kYTM0NDY1NDIzMTI0NTdiODNlOGU3Y2ViZDhlZmY0Nik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2Y4YzcyNzY5Y2I4NjRmMzVhMDQ4Y2FmMTU1ZGMwYTQ5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzM2MDM3NDQ2Njg2MjA0LC0xMjIuNDE1MTI2NTQzMDAxMDFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGEzNDQ2NTQyMzEyNDU3YjgzZThlN2NlYmQ4ZWZmNDYpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85OGNiZDEwMmQxOTM0MmE3YTk2NmU2MDg0MTM1NzZjZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjcxMjc2Nzg4NDgyMSwtMTIyLjQzMTkyODAxMTA4OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9kYTM0NDY1NDIzMTI0NTdiODNlOGU3Y2ViZDhlZmY0Nik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzBiYWMyOGY4MzBhMDQ1MTU5ZGJlMWY1YjM4NTQwMjcwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzg5NTcxMDI1NTg2MywtMTIyLjQwMjE2MzcxMzYxOF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9kYTM0NDY1NDIzMTI0NTdiODNlOGU3Y2ViZDhlZmY0Nik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzdhNWRhMDdlMjQ4NjQ4MTRiYjZmYjcyYTZiMmRmYTEyID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzMwNzQyOTE2OTU1OSwtMTIyLjQyOTMwNjcyODM3Nl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9kYTM0NDY1NDIzMTI0NTdiODNlOGU3Y2ViZDhlZmY0Nik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2Q4ODFiMmNiMjBmZDRkZDdiYjRlZTA2YjA2NmM5NjRjID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzgzODM2NTU2NTM0Nzk0LC0xMjIuNDEzNzkwOTcyNzgwOTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGEzNDQ2NTQyMzEyNDU3YjgzZThlN2NlYmQ4ZWZmNDYpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl80OTEzOWFiYmM5YzU0ZTZjOTQ2ZTkzN2M5NThhYWNlZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjczMDc0MjkxNjk1NTksLTEyMi40MjkzMDY3MjgzNzZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGEzNDQ2NTQyMzEyNDU3YjgzZThlN2NlYmQ4ZWZmNDYpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jYTUzOTVmNDVjMGU0NjQzODFmOGQ1MTY2ZmNmMDNjOCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjczNzM2MjM2MDUyMTI5NiwtMTIyLjQyMjA2NzE4NDkzN10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9kYTM0NDY1NDIzMTI0NTdiODNlOGU3Y2ViZDhlZmY0Nik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzg5YTE4MDAzOTI1NTQ0ZWViMTUyZmU2MDM5ZmNjNDc1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzM3MzYyMzYwNTIxMjk2LC0xMjIuNDIyMDY3MTg0OTM3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2RhMzQ0NjU0MjMxMjQ1N2I4M2U4ZTdjZWJkOGVmZjQ2KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfODcxZWNjMGUxMmI0NGUzN2FjNGNiMjY1NzM1YWY5NjUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODU5OTg4MzIzNzk3OTYsLTEyMi40MTE3NDczNzE5MjRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGEzNDQ2NTQyMzEyNDU3YjgzZThlN2NlYmQ4ZWZmNDYpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lNGEwMGRiNTZhNjM0NTk2YTJlZjJmMDQ3MThkZjI5YSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc2MzM3NTgwNTgwNTksLTEyMi40MjA0MzQ3MjQ1NTI5OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9kYTM0NDY1NDIzMTI0NTdiODNlOGU3Y2ViZDhlZmY0Nik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2ZjNzk0YzAzZTc1NjQwM2M5YmZjNzUxOTk5ZDgxMWEwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzg1MDIyNjYyMjc4NiwtMTIyLjQxMTk4NzY0MzU5NTAxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2RhMzQ0NjU0MjMxMjQ1N2I4M2U4ZTdjZWJkOGVmZjQ2KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZmNhNDM3OTM3ZDMwNDM0MThkMGI5ZjU0OWJjODQzOGMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NzQ2MjA2NDkxMDY0OTUsLTEyMi41MDAzODA0Mjc5MTVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGEzNDQ2NTQyMzEyNDU3YjgzZThlN2NlYmQ4ZWZmNDYpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jZDdlOTg0NGM4ZGQ0NjAyYWZlODI3MjQ3MDI5YmIzNSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc3NTE5MTgyNjcyMTcsLTEyMi40NjY1NTg3ODA2ODNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGEzNDQ2NTQyMzEyNDU3YjgzZThlN2NlYmQ4ZWZmNDYpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85YjFlOTIwNzZjZWI0NmUzOWM3Zjc2YzAwZThhYmYxMSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc0OTA4NDE3MjkwMjgsLTEyMi40ODY5MjU5NjAxMTQwMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9kYTM0NDY1NDIzMTI0NTdiODNlOGU3Y2ViZDhlZmY0Nik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzZmYzQxN2I5MDBmMjQ5YzliM2UzYzJmODAxMWI4ZmY3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzY4NTM2MDEyMzU4MywtMTIyLjQxNTYxNjMzODMxOTk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2RhMzQ0NjU0MjMxMjQ1N2I4M2U4ZTdjZWJkOGVmZjQ2KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYjJjYzQ5ZTJjMjg5NDc0YzhmMTI1OWVmZTUxMWEyNzUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NjQ0Mjk3NzE0MDc0LC0xMjIuNDQ5NzUxNjUyNTYzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2RhMzQ0NjU0MjMxMjQ1N2I4M2U4ZTdjZWJkOGVmZjQ2KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOGY0YTllMDQ5YjI2NGE5OGI3MThkN2M4YzRiMDlhN2UgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NjQ0Mjk3NzE0MDc0LC0xMjIuNDQ5NzUxNjUyNTYzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2RhMzQ0NjU0MjMxMjQ1N2I4M2U4ZTdjZWJkOGVmZjQ2KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOTRmNjEyMzM2YzI4NDJjM2I4MmNjNjc2MDAwZmEzZTcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43MzUyNjgxNDY5MDgzOTYsLTEyMi40NzI3MTU3NTk2MzFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGEzNDQ2NTQyMzEyNDU3YjgzZThlN2NlYmQ4ZWZmNDYpOwogICAgICAgICAgICAKPC9zY3JpcHQ+\" 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 0x7fb000035a20>"
]
},
"execution_count": 30,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# instantiate a feature group for the incidents in the dataframe\n",
"incidents = folium.map.FeatureGroup()\n",
"\n",
"# loop through the 100 crimes and add each to the incidents feature group\n",
"for lat, lng, in zip(df_incidents.Y, df_incidents.X):\n",
" incidents.add_child(\n",
" folium.features.CircleMarker(\n",
" [lat, lng],\n",
" radius=5, # define how big you want the circle markers to be\n",
" color='yellow',\n",
" fill=True,\n",
" fill_color='blue',\n",
" fill_opacity=0.6\n",
" )\n",
" )\n",
"\n",
"# add incidents to map\n",
"sanfran_map.add_child(incidents)"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"editable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"You can also add some pop-up text that would get displayed when you hover over a marker. Let's make each marker display the category of the crime when hovered over."
]
},
{
"cell_type": "code",
"execution_count": 31,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"editable": true,
"new_sheet": false,
"run_control": {
"read_only": false
},
"scrolled": 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+ICNtYXBfMTI0OWE4ZjJmNGFjNDgyZmFmMDhiMjZhMDg3NDZjNjMgewogICAgICAgICAgICAgICAgcG9zaXRpb24gOiByZWxhdGl2ZTsKICAgICAgICAgICAgICAgIHdpZHRoIDogMTAwLjAlOwogICAgICAgICAgICAgICAgaGVpZ2h0OiAxMDAuMCU7CiAgICAgICAgICAgICAgICBsZWZ0OiAwLjAlOwogICAgICAgICAgICAgICAgdG9wOiAwLjAlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICA8L3N0eWxlPgogICAgICAgIAo8L2hlYWQ+Cjxib2R5PiAgICAKICAgIAogICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb2xpdW0tbWFwIiBpZD0ibWFwXzEyNDlhOGYyZjRhYzQ4MmZhZjA4YjI2YTA4NzQ2YzYzIiA+PC9kaXY+CiAgICAgICAgCjwvYm9keT4KPHNjcmlwdD4gICAgCiAgICAKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGJvdW5kcyA9IG51bGw7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcF8xMjQ5YThmMmY0YWM0ODJmYWYwOGIyNmEwODc0NmM2MyA9IEwubWFwKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21hcF8xMjQ5YThmMmY0YWM0ODJmYWYwOGIyNmEwODc0NmM2MycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y2VudGVyOiBbMzcuNzcsLTEyMi40Ml0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6b29tOiAxMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heEJvdW5kczogYm91bmRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXJzOiBbXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmxkQ29weUp1bXA6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JzOiBMLkNSUy5FUFNHMzg1NwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHRpbGVfbGF5ZXJfNjIzNTdhNDQ4YmRkNDRiODllNjUyZDM5YjVjMzQyYzAgPSBMLnRpbGVMYXllcigKICAgICAgICAgICAgICAgICdodHRwczovL3tzfS50aWxlLm9wZW5zdHJlZXRtYXAub3JnL3t6fS97eH0ve3l9LnBuZycsCiAgICAgICAgICAgICAgICB7CiAgImF0dHJpYnV0aW9uIjogbnVsbCwKICAiZGV0ZWN0UmV0aW5hIjogZmFsc2UsCiAgIm1heFpvb20iOiAxOCwKICAibWluWm9vbSI6IDEsCiAgIm5vV3JhcCI6IGZhbHNlLAogICJzdWJkb21haW5zIjogImFiYyIKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMTI0OWE4ZjJmNGFjNDgyZmFmMDhiMjZhMDg3NDZjNjMpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBmZWF0dXJlX2dyb3VwX2RhMzQ0NjU0MjMxMjQ1N2I4M2U4ZTdjZWJkOGVmZjQ2ID0gTC5mZWF0dXJlR3JvdXAoCiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8xMjQ5YThmMmY0YWM0ODJmYWYwOGIyNmEwODc0NmM2Myk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYjZmYTFlODRkMDU3NDZjNDk3OTdmYzk5OTEwMDNhNWMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NzU0MjA3MDY3MTEsLTEyMi40MDM0MDQ3OTE0Nzg5OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9kYTM0NDY1NDIzMTI0NTdiODNlOGU3Y2ViZDhlZmY0Nik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2JmNWI1ZDE5MGNlNzQzMzU5MjIyZWEzNjdmY2ZlZjhlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzc1NDIwNzA2NzExLC0xMjIuNDAzNDA0NzkxNDc4OTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGEzNDQ2NTQyMzEyNDU3YjgzZThlN2NlYmQ4ZWZmNDYpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8yZTVjMmQyNjQ2NzI0NDdlYWE5YmRiYmJlNzE4MWZjNiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjcyOTk4MDk2NzI5OTU5NiwtMTIyLjM4ODg1NjIwNDI5Ml0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9kYTM0NDY1NDIzMTI0NTdiODNlOGU3Y2ViZDhlZmY0Nik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2UxZmVlMTM1ZjMzODRlNjc4MjlhOWI1YzNhNzFiODY3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzg1Nzg4Mzc2Njg4NzksLTEyMi40MTI5NzA1Mzc1OTFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGEzNDQ2NTQyMzEyNDU3YjgzZThlN2NlYmQ4ZWZmNDYpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl84NGY2MWI3OTFlNDE0YzNiOWVkYWVmMzdjNmYxZTQwZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc2NTA1MDEyMTQ2NjgsLTEyMi40MTk2NzE3ODAyOTZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGEzNDQ2NTQyMzEyNDU3YjgzZThlN2NlYmQ4ZWZmNDYpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9kZWVhYjVjYTIyOWU0MjRkYTBjMTNjY2ZjNThiOTdhZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc4ODAxODU1NTgyOSwtMTIyLjQyNjA3NzE3NzM3NDk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2RhMzQ0NjU0MjMxMjQ1N2I4M2U4ZTdjZWJkOGVmZjQ2KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZjRkNDNmNGRjMzRmNDdmMzkyYTA1NmQ0NTVlNTIwODYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODA4Nzg5MzYwMjE0LC0xMjIuNDA1NzIxNDU0NTY3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2RhMzQ0NjU0MjMxMjQ1N2I4M2U4ZTdjZWJkOGVmZjQ2KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOWU0ZmNhZWIwMjdhNDMzMGE4NjY2YTVlMzU0MDY2ODggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODM5ODA1NTkyNjM0LC0xMjIuNDExNzc4Mjk1OTkyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2RhMzQ0NjU0MjMxMjQ1N2I4M2U4ZTdjZWJkOGVmZjQ2KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMTVmYmJhMmYwYmI4NGEwNjljNzJiODgwOWE2MjM0ZjAgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NzU3ODc2MjE4MjkyOTUsLTEyMi4zOTMzNTcyNDE0NTFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGEzNDQ2NTQyMzEyNDU3YjgzZThlN2NlYmQ4ZWZmNDYpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81OTllMjg4NGU3Yjc0NzNmODNiY2IxNjJhYzI1ZDA1NyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjcyMDk2Njk2MTU0OTksLTEyMi4zODcxODE2MzU5OTVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGEzNDQ2NTQyMzEyNDU3YjgzZThlN2NlYmQ4ZWZmNDYpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lZTM1NzAyODQwNmQ0MDNkODY3NmJlNjk4NTJjZDk5YiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc2NDQ3ODE1Nzg2OTUwNSwtMTIyLjQ3NzM3NjUyNDAwMjk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2RhMzQ0NjU0MjMxMjQ1N2I4M2U4ZTdjZWJkOGVmZjQ2KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfODMzNGYwNGZjMGFiNGFjZDk1MjU1MTk1NDJjYzkyMTUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NDU3Mzg5NDI5NjU0OTUsLTEyMi40Nzc5NjAzMjcyOTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGEzNDQ2NTQyMzEyNDU3YjgzZThlN2NlYmQ4ZWZmNDYpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8zYTEzZTk1MmQyM2Q0N2E3OWEyN2U4MzViZmM3ZWU5NSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjczNTY5NzAyNzU0ODIwNiwtMTIyLjM3Njc1NzY1NTUzMDAxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2RhMzQ0NjU0MjMxMjQ1N2I4M2U4ZTdjZWJkOGVmZjQ2KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNzA5ZjJkMDQwNzQzNDI5YTkwNjYzMTQ3NzIzZjYwNWUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43MjkyNzA1MTk5NTkyLC0xMjIuNDMyMzI1ODcxMDI4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2RhMzQ0NjU0MjMxMjQ1N2I4M2U4ZTdjZWJkOGVmZjQ2KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZTRiNGJhY2ExMjlhNDQyMjgwYmQyZjhkZDBmYmMzZjggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43OTE2NDI5ODIzODQsLTEyMi40MDA5MDg2OTg4ODk5OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9kYTM0NDY1NDIzMTI0NTdiODNlOGU3Y2ViZDhlZmY0Nik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzE3ZWEwYzg3MTY2ZTQ2ZDliNGZlODIzOTczMjc5MjljID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzgzNzA2OTMwMTU0NSwtMTIyLjQwODU5NTExMDg2OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9kYTM0NDY1NDIzMTI0NTdiODNlOGU3Y2ViZDhlZmY0Nik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzJjNDg3MTFhNmY5MDRhMDZhYTQzZmVjMDU0YjgwODA3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzU3Mjg5NTkwNDU3Nzk1LC0xMjIuNDA2ODcwNDAyMDgyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2RhMzQ0NjU0MjMxMjQ1N2I4M2U4ZTdjZWJkOGVmZjQ2KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMWZmMTViYzJkNTc0NDc0Y2JlNDI0N2NjOGE2YTI3OGQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NDg5MDYzMDUxODI5LC0xMjIuNDIwMzU0NzgwODYwOTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGEzNDQ2NTQyMzEyNDU3YjgzZThlN2NlYmQ4ZWZmNDYpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85NTUwOGE3YjAwZmY0YWJiYWE2ZDY3NTdjMDNhOGJkNyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjcxNTc2NTQyNjk5NSwtMTIyLjQzOTkwOTc2Njc3Ml0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9kYTM0NDY1NDIzMTI0NTdiODNlOGU3Y2ViZDhlZmY0Nik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzAxZTZkMTY2ODM5OTQ0MGM4OWIyNWUzNWI1MTFkZDZlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzgzNTY5OTM4NjkxOCwtMTIyLjQwODQyMTExNjkyMl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9kYTM0NDY1NDIzMTI0NTdiODNlOGU3Y2ViZDhlZmY0Nik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzg4MDdkNWYyNDVhYjQxZTBiZmNkZGFlOGU4NWU1YzcwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzczNjE4NjI3NjQ1NjA0LC0xMjIuNDIyMzE1NjcwNzQ5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2RhMzQ0NjU0MjMxMjQ1N2I4M2U4ZTdjZWJkOGVmZjQ2KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMTNmN2EyYjYyNzUwNDNhYWJmNGU4MmNmMGVhNGVkMmMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43OTI4NDEyODQwNDQ3MDUsLTEyMi40MjQ1MTk4MzUwMDkwMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9kYTM0NDY1NDIzMTI0NTdiODNlOGU3Y2ViZDhlZmY0Nik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2E0OTE3NmMwMTQxNTQ5NmViNTFiNzM4MTIyZGQwOGI1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzU0MDk4Njg4MjA2Nzk1LC0xMjIuNDE0MjMzODQ5MDM3OThdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGEzNDQ2NTQyMzEyNDU3YjgzZThlN2NlYmQ4ZWZmNDYpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lOThiZTEwMTI0OWI0OGI5ODg1MDQzOTUwNzg2NDgyNCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc1NDA5ODY4ODIwNjc5NSwtMTIyLjQxNDIzMzg0OTAzNzk4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2RhMzQ0NjU0MjMxMjQ1N2I4M2U4ZTdjZWJkOGVmZjQ2KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYTMxYWFjMDgyZGZlNGZjYjhlNzg5NjZmOWFiYjFhNTYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NzE0OTM5OTY5NDE2LC0xMjIuNTA3NzUwMTMxMDA0MDJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGEzNDQ2NTQyMzEyNDU3YjgzZThlN2NlYmQ4ZWZmNDYpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9hMjljZjFiNjFkNDE0ZDgyYTUxNmI4MWE4OTllZWYzMiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjcxODMwMjIwNDc2NjAwNSwtMTIyLjQ3NDQ0NDYzOTU5NDk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2RhMzQ0NjU0MjMxMjQ1N2I4M2U4ZTdjZWJkOGVmZjQ2KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNTM3MzExNGU0NmEwNDFiMjllMTZkZmNmZjk4NzU3YmMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NjQ1NzUyMzE3NjE1LC0xMjIuNDI3NTYyNTk2OTg1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2RhMzQ0NjU0MjMxMjQ1N2I4M2U4ZTdjZWJkOGVmZjQ2KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMTE3Yjc5NWZjODdjNDllYThjMGNmMTI3NzcyYTVjNGIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODc0Mzc4MzA5MTEyLC0xMjIuNDE5MjAzMDA0MjY4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2RhMzQ0NjU0MjMxMjQ1N2I4M2U4ZTdjZWJkOGVmZjQ2KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfM2FhYzdhODgyMTBhNDZhM2E3MThjOTA3ZjM5ZjRiN2YgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NDkzNjg4Mjg0NTMyLC0xMjIuNDEyNjkwMTQyMzA4MDFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGEzNDQ2NTQyMzEyNDU3YjgzZThlN2NlYmQ4ZWZmNDYpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85MGU1YWE1ZDMzYTg0NjJiYjgyYzg0ZjI2NzY5ODk5MiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjcwOTIwMTA0NjIzNzksLTEyMi40MzQ2MDkyODAzNTJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGEzNDQ2NTQyMzEyNDU3YjgzZThlN2NlYmQ4ZWZmNDYpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9iZTlhMDg2M2UxNWQ0MjdmODI0YWNhMGNjYmNlZDEzYiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc4NzkyMDkzNzU1MzI5NSwtMTIyLjQxMDg4MjgyNTU1MV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9kYTM0NDY1NDIzMTI0NTdiODNlOGU3Y2ViZDhlZmY0Nik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzA0YjRmYWE5ZTQ1YzQ0MzE5OTg1OGFkZTM1ZDczYmYwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuODAwNDU2NjQ3MTAzODksLTEyMi40MDE0MzI3NTQ3MjIwMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9kYTM0NDY1NDIzMTI0NTdiODNlOGU3Y2ViZDhlZmY0Nik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzlmMzU3YzI4NWQ4YjRmZDU4MGY5ZmEyYzE3YWZmMWQ5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzQzNTU1MDU0MjI2NSwtMTIyLjQyMTEyODAyOTUwNV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9kYTM0NDY1NDIzMTI0NTdiODNlOGU3Y2ViZDhlZmY0Nik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzRmZGQ0NjBmOGVkZTRlMGE4NmYxMzcyMWIxM2I1MWViID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzg2NTY0NzYwNzY4NSwtMTIyLjQwNzI0NDA4NzAzMl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9kYTM0NDY1NDIzMTI0NTdiODNlOGU3Y2ViZDhlZmY0Nik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzg1NjEwMzIwNDMzOTQ3YjY5ODNiZjg5Zjc2YWUyMmNlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzYxNTY1NTkyODA0NSwtMTIyLjQyMzgwMzAwMTkwMDk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2RhMzQ0NjU0MjMxMjQ1N2I4M2U4ZTdjZWJkOGVmZjQ2KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMWEyZDc4NGE3NDgwNDZlMWFkMmVkYzVkYzYzOTVmMjQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NjE1NjU1OTI4MDQ1LC0xMjIuNDIzODAzMDAxOTAwOTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGEzNDQ2NTQyMzEyNDU3YjgzZThlN2NlYmQ4ZWZmNDYpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85OGYxMDI0YjRkMjk0ZThmYTdhNjNkZTY3NjdiNWFlMCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc0NDE5Mjc1MDg5MzIwNSwtMTIyLjQ0NDY4NTQ4MjI3M10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9kYTM0NDY1NDIzMTI0NTdiODNlOGU3Y2ViZDhlZmY0Nik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzUyNzQ0MTI5YjkyNDQ4ZGNhZjQ2NjgyZTVmNzQ5NjU2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzc1NDY5MjgyMDA0MSwtMTIyLjQxNTc1NzAzOTE5Nl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9kYTM0NDY1NDIzMTI0NTdiODNlOGU3Y2ViZDhlZmY0Nik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2ZhYjg4MTNlODVlMzQ2OWRhYWQyMmE3Y2RkMTc2NGI1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzI4NTI4MDYyNzQ2NSwtMTIyLjQ3NTY0NzQ2MDc4NTk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2RhMzQ0NjU0MjMxMjQ1N2I4M2U4ZTdjZWJkOGVmZjQ2KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMWY4MDkyMjcxNTE5NGFkN2I4NzRlNjNhZDQ3NTU3YzYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NDI4NTE3Mzc0NDQ4OTQsLTEyMi40MjA5Njc0NDA1NjRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGEzNDQ2NTQyMzEyNDU3YjgzZThlN2NlYmQ4ZWZmNDYpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81YTg0ZDBkZmQwYzE0OTc2OTY1YWYyZTI5NDFiNjRjZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc4MjExOTg0ODg5MzEsLTEyMi40MTU2Njk2NjE0NDNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGEzNDQ2NTQyMzEyNDU3YjgzZThlN2NlYmQ4ZWZmNDYpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9iMDk4ZjM0OGNkOGM0MjllOThjYmY5YmY1NTY1ZjJkYSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc3OTE2NzQyMTg5NjMsLTEyMi40MDYzNDY0MjU2MzJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGEzNDQ2NTQyMzEyNDU3YjgzZThlN2NlYmQ4ZWZmNDYpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mZWFiNmIwY2NkY2E0MzBkODI2Yjg5YmUzMGFkMjNhNSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc2NTcxODQzOTUyODIsLTEyMi40MDk1Mjk5MTMyNzhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGEzNDQ2NTQyMzEyNDU3YjgzZThlN2NlYmQ4ZWZmNDYpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8wNTI3ZDQ2MmY0MWU0ZjA3ODMwZWNmZGE4M2RlOGExNyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc3NTQyMDcwNjcxMSwtMTIyLjQwMzQwNDc5MTQ3ODk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2RhMzQ0NjU0MjMxMjQ1N2I4M2U4ZTdjZWJkOGVmZjQ2KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNzc4ZTU0ZGUxZGExNDJiZGEwYTM1ZDc3NzZhODM4N2MgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43Njc1MjQzMDg3ODMsLTEyMi40MTA3MzgwOTczMTVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGEzNDQ2NTQyMzEyNDU3YjgzZThlN2NlYmQ4ZWZmNDYpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9kMTFkYTZiNzZlYjE0OTNkYmMzODcxZmRjYWZlM2E5MSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc2NzUyNDMwODc4MywtMTIyLjQxMDczODA5NzMxNV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9kYTM0NDY1NDIzMTI0NTdiODNlOGU3Y2ViZDhlZmY0Nik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2NkZDEyMGZiYjBiZDQ3N2Q4MzUyOGFkZjBjYTIwNzg0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzEzMTA4MzQzMzI2NCwtMTIyLjQ0NDMxNDAyNTE4OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9kYTM0NDY1NDIzMTI0NTdiODNlOGU3Y2ViZDhlZmY0Nik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzZiYTBmYzdkYWJhMTRlNzdiYzc4ZjQ2ZjQxYjQwMjZmID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzEzMTA4MzQzMzI2NCwtMTIyLjQ0NDMxNDAyNTE4OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9kYTM0NDY1NDIzMTI0NTdiODNlOGU3Y2ViZDhlZmY0Nik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzAzMzU1NWU0NjI4ODRiMjg5OTFlMzBkOThlYTcxZTI3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzY2MDE2MDExNDEwMywtMTIyLjQwMzY0NDYyMDQzOV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9kYTM0NDY1NDIzMTI0NTdiODNlOGU3Y2ViZDhlZmY0Nik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2I2NjA5YjE1Y2YzMTQ3ZjE5MTY1OWI1ZmI1NWZhYjM4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzY2MDE2MDExNDEwMywtMTIyLjQwMzY0NDYyMDQzOV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9kYTM0NDY1NDIzMTI0NTdiODNlOGU3Y2ViZDhlZmY0Nik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2NiM2IyOGIzYTlmNTRmNWFiMDBhZjI3YmNiNTExNDAwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzc2MjMxMDQwNDc1OCwtMTIyLjQxNDcxNDI5NTU3ODk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2RhMzQ0NjU0MjMxMjQ1N2I4M2U4ZTdjZWJkOGVmZjQ2KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZDU0NDcxN2RmNWJjNDQ3YzllMjQ0ZTExNTQ5Nzk3NDIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NzYyMzEwNDA0NzU4LC0xMjIuNDE0NzE0Mjk1NTc4OTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGEzNDQ2NTQyMzEyNDU3YjgzZThlN2NlYmQ4ZWZmNDYpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl84MDI4NTFlZWRkODU0MDFhODcyYzg5ODlmMzVjMDgzZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc3NzUxMTg4OTU2OTUsLTEyMi40MTgwNDU0NTI3NjhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGEzNDQ2NTQyMzEyNDU3YjgzZThlN2NlYmQ4ZWZmNDYpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9kNzM2ZmI0ZDZkMWI0ODNjODQxNjJlNjMyZGNmNDM4NiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc4MjAyMzg0Nzg5NzUsLTEyMi40MDExNjE1NTU2MDJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGEzNDQ2NTQyMzEyNDU3YjgzZThlN2NlYmQ4ZWZmNDYpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8zYmY5NWYwZGY3MDM0ODg4ODM0NmQ4NGY1NmM0YTFmZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjcyNzAwNTMxOTYyOTk5NSwtMTIyLjQwMzQwODY2OTE5MV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9kYTM0NDY1NDIzMTI0NTdiODNlOGU3Y2ViZDhlZmY0Nik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzM1ZDQxODBjNGFjNzRjOWJiMjAyZTI0MDA1Y2QwYjc1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzgzODM0NDM3NDE0MSwtMTIyLjQxMjkzMDUyMjA1OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9kYTM0NDY1NDIzMTI0NTdiODNlOGU3Y2ViZDhlZmY0Nik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2U5MjVkZjAzZTNhMDRlMTM5NDZlNDg4NzFlMjkwNjgxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzUzMDE4NjUzNzQ0NjA0LC0xMjIuNDE4NTg3MTcyMjE5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2RhMzQ0NjU0MjMxMjQ1N2I4M2U4ZTdjZWJkOGVmZjQ2KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMTVlYmQ5MjcwMmI0NDk3M2I2ZDI4ZGI0MGJmNmMyMzkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NzQwNDE4Mzg1MDQxLC0xMjIuNDE0MzcwNjI3NDk1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2RhMzQ0NjU0MjMxMjQ1N2I4M2U4ZTdjZWJkOGVmZjQ2KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMjYwNmFmZjlmMjBhNDAwNWFkNmQ3YWRjYzdjODYzNDIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43OTA1Mzg5OTM3MjUsLTEyMi40MDM5MTU2ODE1NzEwMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9kYTM0NDY1NDIzMTI0NTdiODNlOGU3Y2ViZDhlZmY0Nik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2UzY2UyZDQyMThmNzRhMTA5NjFlMDgwYTczMjk5NmVkID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzgzMDk5ODI0NDU5MjEsLTEyMi40MTkxODMwOTYzNjJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGEzNDQ2NTQyMzEyNDU3YjgzZThlN2NlYmQ4ZWZmNDYpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl83ODY5MjBkOGJmZWM0ZTE3ODcxZTcxZGM3MDFhMDJkYSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc0MDczNjA1NDgzNTc5LC0xMjIuMzg4NzUzMDQ2OTk3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2RhMzQ0NjU0MjMxMjQ1N2I4M2U4ZTdjZWJkOGVmZjQ2KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOWI4NzcwYjNiNDAxNGQzZmIxYjU1MzA5MTRkODU0M2MgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NzQ5OTEyOTQ0MzY2LC0xMjIuNDM3Nzk5NzAzNDY4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2RhMzQ0NjU0MjMxMjQ1N2I4M2U4ZTdjZWJkOGVmZjQ2KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMzNlZTEzMjU4NGU0NDE0NmFhOGI4YzZhNWRiYzI3ZjIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NzcwOTAyNzQzNjY5LC0xMjIuNDIxMzMyNjg0NjMzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2RhMzQ0NjU0MjMxMjQ1N2I4M2U4ZTdjZWJkOGVmZjQ2KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNDM3NzRjOGEyMmM3NDIxZTgxMTUyNmM0MTA5NDkyNTIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NzcwOTAyNzQzNjY5LC0xMjIuNDIxMzMyNjg0NjMzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2RhMzQ0NjU0MjMxMjQ1N2I4M2U4ZTdjZWJkOGVmZjQ2KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOTgxNDBkZmY5MmJhNDg2OWE3NTg2ZDU2NTY2YjU5MmEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODIyNDU4MjIzOTE3LC0xMjIuNDQ2NjEyOTc4ODM5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2RhMzQ0NjU0MjMxMjQ1N2I4M2U4ZTdjZWJkOGVmZjQ2KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMTMzMjNjY2M4MjAwNDdkZjllYWFmZDJkNzU5OTRiNDcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43MzAwMzc5OTk1MTI3OTUsLTEyMi40MDQ1OTQxNDA2MzRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGEzNDQ2NTQyMzEyNDU3YjgzZThlN2NlYmQ4ZWZmNDYpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl84MGM5ZGU2ZDhjNjc0OTYyYWIzZjE5ZjA4NjhjYjIyZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc5NTMzMzgyNjc0MzYsLTEyMi4zOTczNzM3NDAwNjZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGEzNDQ2NTQyMzEyNDU3YjgzZThlN2NlYmQ4ZWZmNDYpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl80MWRmYWNkYWMzOWY0NDQ1YTQxMWYyMDE4ZjIxNGExYyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc4NzUxNTg3NDE2MjI5NSwtMTIyLjQwNzQzNDk4OTUyM10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9kYTM0NDY1NDIzMTI0NTdiODNlOGU3Y2ViZDhlZmY0Nik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzVlZjRkOWYyOGUzODQyZjg4ZjlkYTM4Y2Q1YTJhMzA2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzc4NTIzMzc3NjAzMiwtMTIyLjQwMzQ2NDA4MDAzM10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9kYTM0NDY1NDIzMTI0NTdiODNlOGU3Y2ViZDhlZmY0Nik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzVhYTU2NWJhYjc1MzQwODU4ZTIxODBlM2UxOGMwMmFhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzc4NTIzMzc3NjAzMiwtMTIyLjQwMzQ2NDA4MDAzM10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9kYTM0NDY1NDIzMTI0NTdiODNlOGU3Y2ViZDhlZmY0Nik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzZkMTkwMzEzZjk1YjQzZjViOWU3YWEyZWI0OGM5NDUwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzczMjkxODA2OTAyOTk2LC0xMjIuNDM2NjE0MTgxMzMxMDFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGEzNDQ2NTQyMzEyNDU3YjgzZThlN2NlYmQ4ZWZmNDYpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl83YTBiYjc5ODE5NWQ0YWRmOGJjYTg5NjY5NmU3MDE1ZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc4MDUyNzU3ODUwOSwtMTIyLjM5Njg0OTAxNTE3MjAxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2RhMzQ0NjU0MjMxMjQ1N2I4M2U4ZTdjZWJkOGVmZjQ2KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYTFmYmQyMDcwNmY3NDY4YzgxNjJjM2FlNTIyMTEzNDcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODA1Mjc1Nzg1MDksLTEyMi4zOTY4NDkwMTUxNzIwMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9kYTM0NDY1NDIzMTI0NTdiODNlOGU3Y2ViZDhlZmY0Nik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2FlNzAxNjc5ZTVjZjQ0NWQ5ZjdmNTJmOTIwYjI3NGIzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzI4NDE4MDcwNjYwMjA0LC0xMjIuNDUwMDAwNzkwNDQ1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2RhMzQ0NjU0MjMxMjQ1N2I4M2U4ZTdjZWJkOGVmZjQ2KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZTIxZTU3YWJiMzY4NGMzOWJmZDI3ZmNmY2Y2ODNiZDQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43MjkyMTE0NjQ3MzU5LC0xMjIuNDAwODM0MjgzMDMxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2RhMzQ0NjU0MjMxMjQ1N2I4M2U4ZTdjZWJkOGVmZjQ2KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMTExYWQ1YjYxZDEyNDg0YmJkYjkwN2EzYmRhMDFlYzggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODgwMDY1MzI0MzkyMDUsLTEyMi4zOTk4MDIxNDU3OTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGEzNDQ2NTQyMzEyNDU3YjgzZThlN2NlYmQ4ZWZmNDYpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jNWEzYTY3YjY1ZTE0MTMwYjk3NDIzZDI3N2NiZmJiNyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjcyMzk3NDgyNDE2MDksLTEyMi4zOTQ5Mjg0NzU4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2RhMzQ0NjU0MjMxMjQ1N2I4M2U4ZTdjZWJkOGVmZjQ2KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZjFkMTAyYWQyMjM3NDBjM2E5ZmYzNDZiNzA4MjE0YjggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43MjM5NzQ4MjQxNjA5LC0xMjIuMzk0OTI4NDc1OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9kYTM0NDY1NDIzMTI0NTdiODNlOGU3Y2ViZDhlZmY0Nik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2Y4ODZhYWUzMmFmMTRkMmM4ZDQzOWQ5YWY5MDJkMGM1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzIzOTc0ODI0MTYwOSwtMTIyLjM5NDkyODQ3NThdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGEzNDQ2NTQyMzEyNDU3YjgzZThlN2NlYmQ4ZWZmNDYpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85NGQyOWZjODI5ZTY0OTliODI3M2MwNzQxYzYxMjM5YyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc4ODMyMzU0NDk5MDQsLTEyMi40MTE4NTcwMzI1NF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9kYTM0NDY1NDIzMTI0NTdiODNlOGU3Y2ViZDhlZmY0Nik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzNhN2Y1MzI4NjNkNjQ3YTdhZmQzODZlNDUwYmQ0MmVmID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzU1OTk3NzMzOTg1NiwtMTIyLjQwOTQzNTYxNzEwNl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9kYTM0NDY1NDIzMTI0NTdiODNlOGU3Y2ViZDhlZmY0Nik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2Q1YzE1M2I5ZGZjYjQ5MTlhNTE5N2QzZGFhNzI2YmFkID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzg3MDc5ODE0NDQ0MywtMTIyLjQyNTg4MzM1ODE0OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9kYTM0NDY1NDIzMTI0NTdiODNlOGU3Y2ViZDhlZmY0Nik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2Y4YzcyNzY5Y2I4NjRmMzVhMDQ4Y2FmMTU1ZGMwYTQ5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzM2MDM3NDQ2Njg2MjA0LC0xMjIuNDE1MTI2NTQzMDAxMDFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGEzNDQ2NTQyMzEyNDU3YjgzZThlN2NlYmQ4ZWZmNDYpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85OGNiZDEwMmQxOTM0MmE3YTk2NmU2MDg0MTM1NzZjZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjcxMjc2Nzg4NDgyMSwtMTIyLjQzMTkyODAxMTA4OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9kYTM0NDY1NDIzMTI0NTdiODNlOGU3Y2ViZDhlZmY0Nik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzBiYWMyOGY4MzBhMDQ1MTU5ZGJlMWY1YjM4NTQwMjcwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzg5NTcxMDI1NTg2MywtMTIyLjQwMjE2MzcxMzYxOF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9kYTM0NDY1NDIzMTI0NTdiODNlOGU3Y2ViZDhlZmY0Nik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzdhNWRhMDdlMjQ4NjQ4MTRiYjZmYjcyYTZiMmRmYTEyID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzMwNzQyOTE2OTU1OSwtMTIyLjQyOTMwNjcyODM3Nl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9kYTM0NDY1NDIzMTI0NTdiODNlOGU3Y2ViZDhlZmY0Nik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2Q4ODFiMmNiMjBmZDRkZDdiYjRlZTA2YjA2NmM5NjRjID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzgzODM2NTU2NTM0Nzk0LC0xMjIuNDEzNzkwOTcyNzgwOTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGEzNDQ2NTQyMzEyNDU3YjgzZThlN2NlYmQ4ZWZmNDYpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl80OTEzOWFiYmM5YzU0ZTZjOTQ2ZTkzN2M5NThhYWNlZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjczMDc0MjkxNjk1NTksLTEyMi40MjkzMDY3MjgzNzZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGEzNDQ2NTQyMzEyNDU3YjgzZThlN2NlYmQ4ZWZmNDYpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jYTUzOTVmNDVjMGU0NjQzODFmOGQ1MTY2ZmNmMDNjOCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjczNzM2MjM2MDUyMTI5NiwtMTIyLjQyMjA2NzE4NDkzN10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9kYTM0NDY1NDIzMTI0NTdiODNlOGU3Y2ViZDhlZmY0Nik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzg5YTE4MDAzOTI1NTQ0ZWViMTUyZmU2MDM5ZmNjNDc1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzM3MzYyMzYwNTIxMjk2LC0xMjIuNDIyMDY3MTg0OTM3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2RhMzQ0NjU0MjMxMjQ1N2I4M2U4ZTdjZWJkOGVmZjQ2KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfODcxZWNjMGUxMmI0NGUzN2FjNGNiMjY1NzM1YWY5NjUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODU5OTg4MzIzNzk3OTYsLTEyMi40MTE3NDczNzE5MjRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGEzNDQ2NTQyMzEyNDU3YjgzZThlN2NlYmQ4ZWZmNDYpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lNGEwMGRiNTZhNjM0NTk2YTJlZjJmMDQ3MThkZjI5YSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc2MzM3NTgwNTgwNTksLTEyMi40MjA0MzQ3MjQ1NTI5OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9kYTM0NDY1NDIzMTI0NTdiODNlOGU3Y2ViZDhlZmY0Nik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2ZjNzk0YzAzZTc1NjQwM2M5YmZjNzUxOTk5ZDgxMWEwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzg1MDIyNjYyMjc4NiwtMTIyLjQxMTk4NzY0MzU5NTAxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2RhMzQ0NjU0MjMxMjQ1N2I4M2U4ZTdjZWJkOGVmZjQ2KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZmNhNDM3OTM3ZDMwNDM0MThkMGI5ZjU0OWJjODQzOGMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NzQ2MjA2NDkxMDY0OTUsLTEyMi41MDAzODA0Mjc5MTVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGEzNDQ2NTQyMzEyNDU3YjgzZThlN2NlYmQ4ZWZmNDYpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jZDdlOTg0NGM4ZGQ0NjAyYWZlODI3MjQ3MDI5YmIzNSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc3NTE5MTgyNjcyMTcsLTEyMi40NjY1NTg3ODA2ODNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGEzNDQ2NTQyMzEyNDU3YjgzZThlN2NlYmQ4ZWZmNDYpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85YjFlOTIwNzZjZWI0NmUzOWM3Zjc2YzAwZThhYmYxMSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc0OTA4NDE3MjkwMjgsLTEyMi40ODY5MjU5NjAxMTQwMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF9kYTM0NDY1NDIzMTI0NTdiODNlOGU3Y2ViZDhlZmY0Nik7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzZmYzQxN2I5MDBmMjQ5YzliM2UzYzJmODAxMWI4ZmY3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzY4NTM2MDEyMzU4MywtMTIyLjQxNTYxNjMzODMxOTk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2RhMzQ0NjU0MjMxMjQ1N2I4M2U4ZTdjZWJkOGVmZjQ2KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYjJjYzQ5ZTJjMjg5NDc0YzhmMTI1OWVmZTUxMWEyNzUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NjQ0Mjk3NzE0MDc0LC0xMjIuNDQ5NzUxNjUyNTYzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2RhMzQ0NjU0MjMxMjQ1N2I4M2U4ZTdjZWJkOGVmZjQ2KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOGY0YTllMDQ5YjI2NGE5OGI3MThkN2M4YzRiMDlhN2UgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NjQ0Mjk3NzE0MDc0LC0xMjIuNDQ5NzUxNjUyNTYzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwX2RhMzQ0NjU0MjMxMjQ1N2I4M2U4ZTdjZWJkOGVmZjQ2KTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOTRmNjEyMzM2YzI4NDJjM2I4MmNjNjc2MDAwZmEzZTcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43MzUyNjgxNDY5MDgzOTYsLTEyMi40NzI3MTU3NTk2MzFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfZGEzNDQ2NTQyMzEyNDU3YjgzZThlN2NlYmQ4ZWZmNDYpOwogICAgICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl8yOWJlZmEyNTQ0ODE0YjE1YjBmMWQ3YTBkN2FjZDJkZiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc3NTQyMDcwNjcxMSwtMTIyLjQwMzQwNDc5MTQ3ODk5XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfMTI0OWE4ZjJmNGFjNDgyZmFmMDhiMjZhMDg3NDZjNjMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYzlhOTg2N2MwNzdjNDRiOWE0MWY3MjRmOGU2YThjNjUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMjgyY2RhZjAxYzZkNGFkYjg5MGMyMDNmMDYxYTljZGIgPSAkKCc8ZGl2IGlkPSJodG1sXzI4MmNkYWYwMWM2ZDRhZGI4OTBjMjAzZjA2MWE5Y2RiIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5XRUFQT04gTEFXUzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYzlhOTg2N2MwNzdjNDRiOWE0MWY3MjRmOGU2YThjNjUuc2V0Q29udGVudChodG1sXzI4MmNkYWYwMWM2ZDRhZGI4OTBjMjAzZjA2MWE5Y2RiKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMjliZWZhMjU0NDgxNGIxNWIwZjFkN2EwZDdhY2QyZGYuYmluZFBvcHVwKHBvcHVwX2M5YTk4NjdjMDc3YzQ0YjlhNDFmNzI0ZjhlNmE4YzY1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzIzMzRlZjFlYmQ5NzRlOTdiY2E1ZTA2ZmE1ZjVkYTRhID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzc1NDIwNzA2NzExLC0xMjIuNDAzNDA0NzkxNDc4OTldLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF8xMjQ5YThmMmY0YWM0ODJmYWYwOGIyNmEwODc0NmM2Myk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lOGE3MWQwODc3ZTY0ZjQ1OWM3OWM5ZjYyYmQ0M2I4OCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jMjdkN2VhMDgxMDE0YTYzOGZhNGVlMzk2M2UxNWJiOSA9ICQoJzxkaXYgaWQ9Imh0bWxfYzI3ZDdlYTA4MTAxNGE2MzhmYTRlZTM5NjNlMTViYjkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPldFQVBPTiBMQVdTPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lOGE3MWQwODc3ZTY0ZjQ1OWM3OWM5ZjYyYmQ0M2I4OC5zZXRDb250ZW50KGh0bWxfYzI3ZDdlYTA4MTAxNGE2MzhmYTRlZTM5NjNlMTViYjkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8yMzM0ZWYxZWJkOTc0ZTk3YmNhNWUwNmZhNWY1ZGE0YS5iaW5kUG9wdXAocG9wdXBfZThhNzFkMDg3N2U2NGY0NTljNzljOWY2MmJkNDNiODgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfMmYxMGJhY2JkNjAyNDU5YjlkNzk4YmUyNDIwYmZiOTkgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43Mjk5ODA5NjcyOTk1OTYsLTEyMi4zODg4NTYyMDQyOTJdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF8xMjQ5YThmMmY0YWM0ODJmYWYwOGIyNmEwODc0NmM2Myk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zMzQwYWNjNmQ2ZTg0YzY4YTY4YmI0N2VlNGNhYTRhZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iOTk4MzQ4ZjA0Mzk0M2Q3YjQyMWIwZGJlNTBkNjI1YyA9ICQoJzxkaXYgaWQ9Imh0bWxfYjk5ODM0OGYwNDM5NDNkN2I0MjFiMGRiZTUwZDYyNWMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPldBUlJBTlRTPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zMzQwYWNjNmQ2ZTg0YzY4YTY4YmI0N2VlNGNhYTRhZi5zZXRDb250ZW50KGh0bWxfYjk5ODM0OGYwNDM5NDNkN2I0MjFiMGRiZTUwZDYyNWMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8yZjEwYmFjYmQ2MDI0NTliOWQ3OThiZTI0MjBiZmI5OS5iaW5kUG9wdXAocG9wdXBfMzM0MGFjYzZkNmU4NGM2OGE2OGJiNDdlZTRjYWE0YWYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfODI1OGMzZjU3YWQ3NGZiZmI2ZGYwNmIxZDliYmE3YmUgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODU3ODgzNzY2ODg3OSwtMTIyLjQxMjk3MDUzNzU5MV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzEyNDlhOGYyZjRhYzQ4MmZhZjA4YjI2YTA4NzQ2YzYzKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzkzMTRkZjc3YmQzOTQ4NWViMDBiYTlkYTljMzE0NjRhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzg4NWI1MmQ1NGFkYjRkNjI5MmI4ZWQ0ZGNiMzkwYTQwID0gJCgnPGRpdiBpZD0iaHRtbF84ODViNTJkNTRhZGI0ZDYyOTJiOGVkNGRjYjM5MGE0MCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Tk9OLUNSSU1JTkFMPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85MzE0ZGY3N2JkMzk0ODVlYjAwYmE5ZGE5YzMxNDY0YS5zZXRDb250ZW50KGh0bWxfODg1YjUyZDU0YWRiNGQ2MjkyYjhlZDRkY2IzOTBhNDApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl84MjU4YzNmNTdhZDc0ZmJmYjZkZjA2YjFkOWJiYTdiZS5iaW5kUG9wdXAocG9wdXBfOTMxNGRmNzdiZDM5NDg1ZWIwMGJhOWRhOWMzMTQ2NGEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfN2JhYmNmNjljNzkyNGI4MWFlMjVkZTRlNDM1NTEwODIgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NjUwNTAxMjE0NjY4LC0xMjIuNDE5NjcxNzgwMjk2XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfMTI0OWE4ZjJmNGFjNDgyZmFmMDhiMjZhMDg3NDZjNjMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYjUxODc2YzZkMzZkNDE4OGFjYzUzYjdkYWJmNGU0YWMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMTdkZTliNDdhOGYwNDgzNGIwYjU2Y2JjOTUwOGYyMzIgPSAkKCc8ZGl2IGlkPSJodG1sXzE3ZGU5YjQ3YThmMDQ4MzRiMGI1NmNiYzk1MDhmMjMyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5OT04tQ1JJTUlOQUw8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2I1MTg3NmM2ZDM2ZDQxODhhY2M1M2I3ZGFiZjRlNGFjLnNldENvbnRlbnQoaHRtbF8xN2RlOWI0N2E4ZjA0ODM0YjBiNTZjYmM5NTA4ZjIzMik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzdiYWJjZjY5Yzc5MjRiODFhZTI1ZGU0ZTQzNTUxMDgyLmJpbmRQb3B1cChwb3B1cF9iNTE4NzZjNmQzNmQ0MTg4YWNjNTNiN2RhYmY0ZTRhYyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl81NWNkYjQ4ODM4YjQ0MTU2YTc1YzA1ZTM2NzUzODk4ZiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc4ODAxODU1NTgyOSwtMTIyLjQyNjA3NzE3NzM3NDk5XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfMTI0OWE4ZjJmNGFjNDgyZmFmMDhiMjZhMDg3NDZjNjMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMWU4YzFiZWZiZGM4NDEwZDliY2JjNmExN2Q0YTA4MTMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfY2E3OTI4NzMwZTgyNDExZGE3OTViOTRjZGY5MzVlZWUgPSAkKCc8ZGl2IGlkPSJodG1sX2NhNzkyODczMGU4MjQxMWRhNzk1Yjk0Y2RmOTM1ZWVlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5BU1NBVUxUPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xZThjMWJlZmJkYzg0MTBkOWJjYmM2YTE3ZDRhMDgxMy5zZXRDb250ZW50KGh0bWxfY2E3OTI4NzMwZTgyNDExZGE3OTViOTRjZGY5MzVlZWUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl81NWNkYjQ4ODM4YjQ0MTU2YTc1YzA1ZTM2NzUzODk4Zi5iaW5kUG9wdXAocG9wdXBfMWU4YzFiZWZiZGM4NDEwZDliY2JjNmExN2Q0YTA4MTMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfOWQxZDBhODJkN2IwNDYwYzk5ZWI5YzY4MTU0ODhhODMgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODA4Nzg5MzYwMjE0LC0xMjIuNDA1NzIxNDU0NTY3XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfMTI0OWE4ZjJmNGFjNDgyZmFmMDhiMjZhMDg3NDZjNjMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfY2M1ZjNiMzExODUwNGMzNjg5MmU4ZmI4NDU1MWMxMWMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZGJiM2JjZDFkMTAyNDAwYjlkMzM2YjVjZWQ2MDRlYjYgPSAkKCc8ZGl2IGlkPSJodG1sX2RiYjNiY2QxZDEwMjQwMGI5ZDMzNmI1Y2VkNjA0ZWI2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5PVEhFUiBPRkZFTlNFUzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfY2M1ZjNiMzExODUwNGMzNjg5MmU4ZmI4NDU1MWMxMWMuc2V0Q29udGVudChodG1sX2RiYjNiY2QxZDEwMjQwMGI5ZDMzNmI1Y2VkNjA0ZWI2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfOWQxZDBhODJkN2IwNDYwYzk5ZWI5YzY4MTU0ODhhODMuYmluZFBvcHVwKHBvcHVwX2NjNWYzYjMxMTg1MDRjMzY4OTJlOGZiODQ1NTFjMTFjKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzU5YmUzYjM5ZTVkMzQ3MDU5YWMxODYxYjQ1MjE4M2Q1ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzgzOTgwNTU5MjYzNCwtMTIyLjQxMTc3ODI5NTk5Ml0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzEyNDlhOGYyZjRhYzQ4MmZhZjA4YjI2YTA4NzQ2YzYzKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzVmZTNlZjVhYmRlYTQ5N2I5MjRkNjQ5ZmNhOTUzOGI2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzM0MTM2YzMxNTU0OTRkNzA5N2JiYzhmZDYzNjY2YjZlID0gJCgnPGRpdiBpZD0iaHRtbF8zNDEzNmMzMTU1NDk0ZDcwOTdiYmM4ZmQ2MzY2NmI2ZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Tk9OLUNSSU1JTkFMPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81ZmUzZWY1YWJkZWE0OTdiOTI0ZDY0OWZjYTk1MzhiNi5zZXRDb250ZW50KGh0bWxfMzQxMzZjMzE1NTQ5NGQ3MDk3YmJjOGZkNjM2NjZiNmUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl81OWJlM2IzOWU1ZDM0NzA1OWFjMTg2MWI0NTIxODNkNS5iaW5kUG9wdXAocG9wdXBfNWZlM2VmNWFiZGVhNDk3YjkyNGQ2NDlmY2E5NTM4YjYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfOGI5YjhhZjYwNTU4NDlkMWJlNjdiNTNhMzY0ZDY0ZWQgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NzU3ODc2MjE4MjkyOTUsLTEyMi4zOTMzNTcyNDE0NTFdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF8xMjQ5YThmMmY0YWM0ODJmYWYwOGIyNmEwODc0NmM2Myk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82MjIyNzBjMjlhZjA0NzZiYjAyODQ0MjJjZWViNzhkMSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iYTlhOWU2YjU0ZDk0YWQyYWY4NjFmODUyZGE2YjJjYiA9ICQoJzxkaXYgaWQ9Imh0bWxfYmE5YTllNmI1NGQ5NGFkMmFmODYxZjg1MmRhNmIyY2IiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPldBUlJBTlRTPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82MjIyNzBjMjlhZjA0NzZiYjAyODQ0MjJjZWViNzhkMS5zZXRDb250ZW50KGh0bWxfYmE5YTllNmI1NGQ5NGFkMmFmODYxZjg1MmRhNmIyY2IpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl84YjliOGFmNjA1NTg0OWQxYmU2N2I1M2EzNjRkNjRlZC5iaW5kUG9wdXAocG9wdXBfNjIyMjcwYzI5YWYwNDc2YmIwMjg0NDIyY2VlYjc4ZDEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfYjY0MWM4YjlkMjFiNDJhM2I4NDcyZjdjNGRiOTk1MzUgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43MjA5NjY5NjE1NDk5LC0xMjIuMzg3MTgxNjM1OTk1XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfMTI0OWE4ZjJmNGFjNDgyZmFmMDhiMjZhMDg3NDZjNjMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNDljMGQzMzM3ZjIwNGJiNGI3ZjFhYzFhMWQzOWU0ZjQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMjEwNzRiYzM4NmZmNDQyOTkxMWJiYWJjMzQ0ZWU4ZDkgPSAkKCc8ZGl2IGlkPSJodG1sXzIxMDc0YmMzODZmZjQ0Mjk5MTFiYmFiYzM0NGVlOGQ5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NSVNTSU5HIFBFUlNPTjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNDljMGQzMzM3ZjIwNGJiNGI3ZjFhYzFhMWQzOWU0ZjQuc2V0Q29udGVudChodG1sXzIxMDc0YmMzODZmZjQ0Mjk5MTFiYmFiYzM0NGVlOGQ5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfYjY0MWM4YjlkMjFiNDJhM2I4NDcyZjdjNGRiOTk1MzUuYmluZFBvcHVwKHBvcHVwXzQ5YzBkMzMzN2YyMDRiYjRiN2YxYWMxYTFkMzllNGY0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2MxNTI0ZDU4NGVmYzRiNWZhZTllMzA2Yjc5MjQ3OGRhID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzY0NDc4MTU3ODY5NTA1LC0xMjIuNDc3Mzc2NTI0MDAyOTldLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF8xMjQ5YThmMmY0YWM0ODJmYWYwOGIyNmEwODc0NmM2Myk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9kY2E1NjMzNThhYzE0YWYwYTFmY2RjYTM3MTlkNDczZSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF81NGFjYmM5N2JkNTE0NjI1OWY3MWQxMjZkMWFkNDk3NyA9ICQoJzxkaXYgaWQ9Imh0bWxfNTRhY2JjOTdiZDUxNDYyNTlmNzFkMTI2ZDFhZDQ5NzciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkxBUkNFTlkvVEhFRlQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2RjYTU2MzM1OGFjMTRhZjBhMWZjZGNhMzcxOWQ0NzNlLnNldENvbnRlbnQoaHRtbF81NGFjYmM5N2JkNTE0NjI1OWY3MWQxMjZkMWFkNDk3Nyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2MxNTI0ZDU4NGVmYzRiNWZhZTllMzA2Yjc5MjQ3OGRhLmJpbmRQb3B1cChwb3B1cF9kY2E1NjMzNThhYzE0YWYwYTFmY2RjYTM3MTlkNDczZSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl8yYjRkNjY4ZTIxYTE0ZmNhOWMxZmQ2ZDZjZTZmYjU3ZCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc0NTczODk0Mjk2NTQ5NSwtMTIyLjQ3Nzk2MDMyNzI5OV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzEyNDlhOGYyZjRhYzQ4MmZhZjA4YjI2YTA4NzQ2YzYzKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzlkMWJjNjE1NTlhZjQxNzA4ODEyMTY5YzlhNzMwMjQ5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2IyZDZkYzlhNzQxODQzOTQ5MWUwMmNjNDYzMzc2NTM0ID0gJCgnPGRpdiBpZD0iaHRtbF9iMmQ2ZGM5YTc0MTg0Mzk0OTFlMDJjYzQ2MzM3NjUzNCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Tk9OLUNSSU1JTkFMPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85ZDFiYzYxNTU5YWY0MTcwODgxMjE2OWM5YTczMDI0OS5zZXRDb250ZW50KGh0bWxfYjJkNmRjOWE3NDE4NDM5NDkxZTAyY2M0NjMzNzY1MzQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8yYjRkNjY4ZTIxYTE0ZmNhOWMxZmQ2ZDZjZTZmYjU3ZC5iaW5kUG9wdXAocG9wdXBfOWQxYmM2MTU1OWFmNDE3MDg4MTIxNjljOWE3MzAyNDkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfZDQzMmI0NWEwOTkyNGM1YjgxYzAxYTdkZDY3YzUzMGIgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43MzU2OTcwMjc1NDgyMDYsLTEyMi4zNzY3NTc2NTU1MzAwMV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzEyNDlhOGYyZjRhYzQ4MmZhZjA4YjI2YTA4NzQ2YzYzKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzg2ZDA5NzQ1MWY2ZDQ2NWViODk0YTgwMDQ3YTU2ZjBmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzNlNjIxNDNjYzdjMTRiYzM4MzZhYWJhMGE2OGE3OWRmID0gJCgnPGRpdiBpZD0iaHRtbF8zZTYyMTQzY2M3YzE0YmMzODM2YWFiYTBhNjhhNzlkZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+T1RIRVIgT0ZGRU5TRVM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzg2ZDA5NzQ1MWY2ZDQ2NWViODk0YTgwMDQ3YTU2ZjBmLnNldENvbnRlbnQoaHRtbF8zZTYyMTQzY2M3YzE0YmMzODM2YWFiYTBhNjhhNzlkZik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2Q0MzJiNDVhMDk5MjRjNWI4MWMwMWE3ZGQ2N2M1MzBiLmJpbmRQb3B1cChwb3B1cF84NmQwOTc0NTFmNmQ0NjVlYjg5NGE4MDA0N2E1NmYwZik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl84NzVmNTZlNzc4NTU0MGIwYmYwOTEyYWY4YTE3MjNlMiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjcyOTI3MDUxOTk1OTIsLTEyMi40MzIzMjU4NzEwMjhdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF8xMjQ5YThmMmY0YWM0ODJmYWYwOGIyNmEwODc0NmM2Myk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hYTNmZWJjYThlYzA0ZTA1ODNmM2Q4MGVkZTIwYTRhOSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iNTcxMWVmNGNhZmQ0YmM4YThiNDdlNTU0NmY0YmE1YyA9ICQoJzxkaXYgaWQ9Imh0bWxfYjU3MTFlZjRjYWZkNGJjOGE4YjQ3ZTU1NDZmNGJhNWMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkFTU0FVTFQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2FhM2ZlYmNhOGVjMDRlMDU4M2YzZDgwZWRlMjBhNGE5LnNldENvbnRlbnQoaHRtbF9iNTcxMWVmNGNhZmQ0YmM4YThiNDdlNTU0NmY0YmE1Yyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzg3NWY1NmU3Nzg1NTQwYjBiZjA5MTJhZjhhMTcyM2UyLmJpbmRQb3B1cChwb3B1cF9hYTNmZWJjYThlYzA0ZTA1ODNmM2Q4MGVkZTIwYTRhOSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl8xYzc3OGUzZTgzNGU0NTdjYmI0ZDg5OTM4YzY1OGNjMyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc5MTY0Mjk4MjM4NCwtMTIyLjQwMDkwODY5ODg4OTk5XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfMTI0OWE4ZjJmNGFjNDgyZmFmMDhiMjZhMDg3NDZjNjMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNjY5NTQ4Mjg1YjVjNGEzZTk2ZTZiZTQ2ZWViOTJkM2UgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYjFiZmRhOTNiOTg4NGNiZGI1NjBhOTc1YWUxYWEwMzggPSAkKCc8ZGl2IGlkPSJodG1sX2IxYmZkYTkzYjk4ODRjYmRiNTYwYTk3NWFlMWFhMDM4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5CVVJHTEFSWTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNjY5NTQ4Mjg1YjVjNGEzZTk2ZTZiZTQ2ZWViOTJkM2Uuc2V0Q29udGVudChodG1sX2IxYmZkYTkzYjk4ODRjYmRiNTYwYTk3NWFlMWFhMDM4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMWM3NzhlM2U4MzRlNDU3Y2JiNGQ4OTkzOGM2NThjYzMuYmluZFBvcHVwKHBvcHVwXzY2OTU0ODI4NWI1YzRhM2U5NmU2YmU0NmVlYjkyZDNlKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzkzZTFkMDUwMDI5MTQwZGM5YWFmOGRkZmQxN2YwZDIxID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzgzNzA2OTMwMTU0NSwtMTIyLjQwODU5NTExMDg2OV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzEyNDlhOGYyZjRhYzQ4MmZhZjA4YjI2YTA4NzQ2YzYzKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzljNjVkNDExNGYzOTQ0MzliYWE0ZTBkNDQ1NmQ5MjNlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzE4ZTRkM2U4MmRiZTRmNzg4OGY1ZWNjNjNjNDMzOTI3ID0gJCgnPGRpdiBpZD0iaHRtbF8xOGU0ZDNlODJkYmU0Zjc4ODhmNWVjYzYzYzQzMzkyNyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U1RPTEVOIFBST1BFUlRZPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85YzY1ZDQxMTRmMzk0NDM5YmFhNGUwZDQ0NTZkOTIzZS5zZXRDb250ZW50KGh0bWxfMThlNGQzZTgyZGJlNGY3ODg4ZjVlY2M2M2M0MzM5MjcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl85M2UxZDA1MDAyOTE0MGRjOWFhZjhkZGZkMTdmMGQyMS5iaW5kUG9wdXAocG9wdXBfOWM2NWQ0MTE0ZjM5NDQzOWJhYTRlMGQ0NDU2ZDkyM2UpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfZmVkMWUxNTlkZjU3NDFmMzgxMDQ2YjQ3NzgyMjJhODggPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NTcyODk1OTA0NTc3OTUsLTEyMi40MDY4NzA0MDIwODJdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF8xMjQ5YThmMmY0YWM0ODJmYWYwOGIyNmEwODc0NmM2Myk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zNjQxYjhhNGMzY2U0YTY2ODJkNTI0ZTRhMzc5Yzc4ZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mY2I2NTZiOGJhZGI0NmU0OTNmMGM0MTkyNjI4ZDA1NSA9ICQoJzxkaXYgaWQ9Imh0bWxfZmNiNjU2YjhiYWRiNDZlNDkzZjBjNDE5MjYyOGQwNTUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlJPQkJFUlk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzM2NDFiOGE0YzNjZTRhNjY4MmQ1MjRlNGEzNzljNzhkLnNldENvbnRlbnQoaHRtbF9mY2I2NTZiOGJhZGI0NmU0OTNmMGM0MTkyNjI4ZDA1NSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2ZlZDFlMTU5ZGY1NzQxZjM4MTA0NmI0Nzc4MjIyYTg4LmJpbmRQb3B1cChwb3B1cF8zNjQxYjhhNGMzY2U0YTY2ODJkNTI0ZTRhMzc5Yzc4ZCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl80ZDk0NjA2MzNlODc0NGU5OTI1M2JhYzEzNjQ2OWNmYiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc0ODkwNjMwNTE4MjksLTEyMi40MjAzNTQ3ODA4NjA5OV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzEyNDlhOGYyZjRhYzQ4MmZhZjA4YjI2YTA4NzQ2YzYzKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2ZkYzk1MTRiZTQwODQ2OTViMWI3YzI0ZjU0MWVhYTAxID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzk4NTViY2ViOWI0MzRiZWM4N2M2OGY2OWMwYzlmZjVlID0gJCgnPGRpdiBpZD0iaHRtbF85ODU1YmNlYjliNDM0YmVjODdjNjhmNjljMGM5ZmY1ZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QVNTQVVMVDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZmRjOTUxNGJlNDA4NDY5NWIxYjdjMjRmNTQxZWFhMDEuc2V0Q29udGVudChodG1sXzk4NTViY2ViOWI0MzRiZWM4N2M2OGY2OWMwYzlmZjVlKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfNGQ5NDYwNjMzZTg3NDRlOTkyNTNiYWMxMzY0NjljZmIuYmluZFBvcHVwKHBvcHVwX2ZkYzk1MTRiZTQwODQ2OTViMWI3YzI0ZjU0MWVhYTAxKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2Y0YzU2MzAyMDI3MDQyYTliM2QyZGExNGUxMTFhOGNmID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzE1NzY1NDI2OTk1LC0xMjIuNDM5OTA5NzY2NzcyXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfMTI0OWE4ZjJmNGFjNDgyZmFmMDhiMjZhMDg3NDZjNjMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZjE5MjhjZDYzNDkxNDdmZTkxMDkzNTE4NzhjYTIyOTggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMjNjMDNlYTUxYmUzNDMwNGI4MjFhMGZhNTQxMmUzOGMgPSAkKCc8ZGl2IGlkPSJodG1sXzIzYzAzZWE1MWJlMzQzMDRiODIxYTBmYTU0MTJlMzhjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5BU1NBVUxUPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mMTkyOGNkNjM0OTE0N2ZlOTEwOTM1MTg3OGNhMjI5OC5zZXRDb250ZW50KGh0bWxfMjNjMDNlYTUxYmUzNDMwNGI4MjFhMGZhNTQxMmUzOGMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9mNGM1NjMwMjAyNzA0MmE5YjNkMmRhMTRlMTExYThjZi5iaW5kUG9wdXAocG9wdXBfZjE5MjhjZDYzNDkxNDdmZTkxMDkzNTE4NzhjYTIyOTgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfYWQwOWNmNTk1OWE5NGUyMjk3MDNlMWNkMzQyZDNjMzcgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODM1Njk5Mzg2OTE4LC0xMjIuNDA4NDIxMTE2OTIyXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfMTI0OWE4ZjJmNGFjNDgyZmFmMDhiMjZhMDg3NDZjNjMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYTQ2MjM5NGRkY2FhNGQ3N2E0MWNlYmFhNTQ0ODU2ZmYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMTk0YWFkMmQxZDgzNGZiOTg3NmViNWUwMjk2MmNjN2EgPSAkKCc8ZGl2IGlkPSJodG1sXzE5NGFhZDJkMWQ4MzRmYjk4NzZlYjVlMDI5NjJjYzdhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5MQVJDRU5ZL1RIRUZUPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hNDYyMzk0ZGRjYWE0ZDc3YTQxY2ViYWE1NDQ4NTZmZi5zZXRDb250ZW50KGh0bWxfMTk0YWFkMmQxZDgzNGZiOTg3NmViNWUwMjk2MmNjN2EpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9hZDA5Y2Y1OTU5YTk0ZTIyOTcwM2UxY2QzNDJkM2MzNy5iaW5kUG9wdXAocG9wdXBfYTQ2MjM5NGRkY2FhNGQ3N2E0MWNlYmFhNTQ0ODU2ZmYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfMDJmMzUwZTNmNDhmNGFhMTk2MGMzOWYxYmQ1Mjc0ODggPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NzM2MTg2Mjc2NDU2MDQsLTEyMi40MjIzMTU2NzA3NDldLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF8xMjQ5YThmMmY0YWM0ODJmYWYwOGIyNmEwODc0NmM2Myk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82ZTliN2JlYjg2N2Q0YjBhYmQ1MDBmNmUzODczMTY5NSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hNjBjMmFmZThkM2M0NjQ2OGEwZTgzNWZmM2MxNDg3OSA9ICQoJzxkaXYgaWQ9Imh0bWxfYTYwYzJhZmU4ZDNjNDY0NjhhMGU4MzVmZjNjMTQ4NzkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkZSQVVEPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82ZTliN2JlYjg2N2Q0YjBhYmQ1MDBmNmUzODczMTY5NS5zZXRDb250ZW50KGh0bWxfYTYwYzJhZmU4ZDNjNDY0NjhhMGU4MzVmZjNjMTQ4NzkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8wMmYzNTBlM2Y0OGY0YWExOTYwYzM5ZjFiZDUyNzQ4OC5iaW5kUG9wdXAocG9wdXBfNmU5YjdiZWI4NjdkNGIwYWJkNTAwZjZlMzg3MzE2OTUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfZDM2NDMyZGVhMjEzNGIxOTljODc2ZDNmNDhlYjgxZTIgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43OTI4NDEyODQwNDQ3MDUsLTEyMi40MjQ1MTk4MzUwMDkwMV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzEyNDlhOGYyZjRhYzQ4MmZhZjA4YjI2YTA4NzQ2YzYzKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2IzZjJiYTg5MThjMjRhNDlhNDg4NjgwMTM1ZGRkM2ZkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2E4Mjg0MjE2ZDI0YjRhY2I4YTY3Y2NhNWU3ZGZmOWE1ID0gJCgnPGRpdiBpZD0iaHRtbF9hODI4NDIxNmQyNGI0YWNiOGE2N2NjYTVlN2RmZjlhNSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+V0FSUkFOVFM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2IzZjJiYTg5MThjMjRhNDlhNDg4NjgwMTM1ZGRkM2ZkLnNldENvbnRlbnQoaHRtbF9hODI4NDIxNmQyNGI0YWNiOGE2N2NjYTVlN2RmZjlhNSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2QzNjQzMmRlYTIxMzRiMTk5Yzg3NmQzZjQ4ZWI4MWUyLmJpbmRQb3B1cChwb3B1cF9iM2YyYmE4OTE4YzI0YTQ5YTQ4ODY4MDEzNWRkZDNmZCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl81YTJiNzQzOWZiNDI0MDYxYTY0MWE5ZGQwMTg0MzZkOSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc1NDA5ODY4ODIwNjc5NSwtMTIyLjQxNDIzMzg0OTAzNzk4XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfMTI0OWE4ZjJmNGFjNDgyZmFmMDhiMjZhMDg3NDZjNjMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNDZmMDc0ZWExM2YxNGMzMGExMWEzNWJhNTM4NTdjYmIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOTAxNDVhNTA4YWMxNGQwN2EyMTQ1NjJmNTlmNDQwNTggPSAkKCc8ZGl2IGlkPSJodG1sXzkwMTQ1YTUwOGFjMTRkMDdhMjE0NTYyZjU5ZjQ0MDU4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5EUlVHL05BUkNPVElDPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80NmYwNzRlYTEzZjE0YzMwYTExYTM1YmE1Mzg1N2NiYi5zZXRDb250ZW50KGh0bWxfOTAxNDVhNTA4YWMxNGQwN2EyMTQ1NjJmNTlmNDQwNTgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl81YTJiNzQzOWZiNDI0MDYxYTY0MWE5ZGQwMTg0MzZkOS5iaW5kUG9wdXAocG9wdXBfNDZmMDc0ZWExM2YxNGMzMGExMWEzNWJhNTM4NTdjYmIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfNzkwZmJmNTcwZTRkNDQ2OGJhNmQ1MGYyODk1ZjI1MDggPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NTQwOTg2ODgyMDY3OTUsLTEyMi40MTQyMzM4NDkwMzc5OF0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzEyNDlhOGYyZjRhYzQ4MmZhZjA4YjI2YTA4NzQ2YzYzKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2JhNDkzZmI5ZjA3NTQ4MTliZWZhN2UwZWQyNzliYWY4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzk4YjliM2IyZDQyYTRlNjBhM2Y3OGI5N2FmZjg1MzVlID0gJCgnPGRpdiBpZD0iaHRtbF85OGI5YjNiMmQ0MmE0ZTYwYTNmNzhiOTdhZmY4NTM1ZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+T1RIRVIgT0ZGRU5TRVM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2JhNDkzZmI5ZjA3NTQ4MTliZWZhN2UwZWQyNzliYWY4LnNldENvbnRlbnQoaHRtbF85OGI5YjNiMmQ0MmE0ZTYwYTNmNzhiOTdhZmY4NTM1ZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzc5MGZiZjU3MGU0ZDQ0NjhiYTZkNTBmMjg5NWYyNTA4LmJpbmRQb3B1cChwb3B1cF9iYTQ5M2ZiOWYwNzU0ODE5YmVmYTdlMGVkMjc5YmFmOCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9hMmNhYTAzOGQxMWY0ZTUzYjk1MzUyOTAzOGM2YTI2MCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc3MTQ5Mzk5Njk0MTYsLTEyMi41MDc3NTAxMzEwMDQwMl0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzEyNDlhOGYyZjRhYzQ4MmZhZjA4YjI2YTA4NzQ2YzYzKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2ViZThlZWZkNGQ2ZjQ3ZDJhYTlhZjRlNWM1OWRmMWYzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzIyOWM0NDM5YzI5MDRiZjNhN2E2NjRhZWQzYzRiNTExID0gJCgnPGRpdiBpZD0iaHRtbF8yMjljNDQzOWMyOTA0YmYzYTdhNjY0YWVkM2M0YjUxMSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QVNTQVVMVDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZWJlOGVlZmQ0ZDZmNDdkMmFhOWFmNGU1YzU5ZGYxZjMuc2V0Q29udGVudChodG1sXzIyOWM0NDM5YzI5MDRiZjNhN2E2NjRhZWQzYzRiNTExKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfYTJjYWEwMzhkMTFmNGU1M2I5NTM1MjkwMzhjNmEyNjAuYmluZFBvcHVwKHBvcHVwX2ViZThlZWZkNGQ2ZjQ3ZDJhYTlhZjRlNWM1OWRmMWYzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzQ5MWNjYWY4NmU5MzQ4YmRiYWM0ZjBiOThhZjVkNTkyID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzE4MzAyMjA0NzY2MDA1LC0xMjIuNDc0NDQ0NjM5NTk0OTldLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF8xMjQ5YThmMmY0YWM0ODJmYWYwOGIyNmEwODc0NmM2Myk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zMDY1Y2NiYjU1OWI0MmI0ODk4NGY2M2JhOTY1OGZkNiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82ZGE2YmI0OTZlNGI0NTMxYjA3OTQ5N2QzN2I2ZjNmMiA9ICQoJzxkaXYgaWQ9Imh0bWxfNmRhNmJiNDk2ZTRiNDUzMWIwNzk0OTdkMzdiNmYzZjIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk9USEVSIE9GRkVOU0VTPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zMDY1Y2NiYjU1OWI0MmI0ODk4NGY2M2JhOTY1OGZkNi5zZXRDb250ZW50KGh0bWxfNmRhNmJiNDk2ZTRiNDUzMWIwNzk0OTdkMzdiNmYzZjIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl80OTFjY2FmODZlOTM0OGJkYmFjNGYwYjk4YWY1ZDU5Mi5iaW5kUG9wdXAocG9wdXBfMzA2NWNjYmI1NTliNDJiNDg5ODRmNjNiYTk2NThmZDYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfNGQ2YWExMTRmYTFmNGI2YWFjMDNmOGUwNDU2OGU1NTMgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NjQ1NzUyMzE3NjE1LC0xMjIuNDI3NTYyNTk2OTg1XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfMTI0OWE4ZjJmNGFjNDgyZmFmMDhiMjZhMDg3NDZjNjMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOWYzZDYzM2QyMDZjNDIyM2JiZmEzN2JjNDE1MzE2NjkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMzBhMDI1M2Y1MTQ1NDkxNWE1YmE0OGE3Y2E4Yzc1NjIgPSAkKCc8ZGl2IGlkPSJodG1sXzMwYTAyNTNmNTE0NTQ5MTVhNWJhNDhhN2NhOGM3NTYyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5PVEhFUiBPRkZFTlNFUzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOWYzZDYzM2QyMDZjNDIyM2JiZmEzN2JjNDE1MzE2Njkuc2V0Q29udGVudChodG1sXzMwYTAyNTNmNTE0NTQ5MTVhNWJhNDhhN2NhOGM3NTYyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfNGQ2YWExMTRmYTFmNGI2YWFjMDNmOGUwNDU2OGU1NTMuYmluZFBvcHVwKHBvcHVwXzlmM2Q2MzNkMjA2YzQyMjNiYmZhMzdiYzQxNTMxNjY5KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2VkN2MyYTkwMjY1YzQ4OTg5MmE3MDhkNDBmM2YzZWQ4ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzg3NDM3ODMwOTExMiwtMTIyLjQxOTIwMzAwNDI2OF0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzEyNDlhOGYyZjRhYzQ4MmZhZjA4YjI2YTA4NzQ2YzYzKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2EwOTFmZGIxOTI1MjQ0Y2FhZjEzMmNkNDEzNDdiYThlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2Q3NDYzNmEyNTUxMDQ1MDE4YTI2M2I3OWVhY2U1MzRiID0gJCgnPGRpdiBpZD0iaHRtbF9kNzQ2MzZhMjU1MTA0NTAxOGEyNjNiNzllYWNlNTM0YiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QlVSR0xBUlk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2EwOTFmZGIxOTI1MjQ0Y2FhZjEzMmNkNDEzNDdiYThlLnNldENvbnRlbnQoaHRtbF9kNzQ2MzZhMjU1MTA0NTAxOGEyNjNiNzllYWNlNTM0Yik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2VkN2MyYTkwMjY1YzQ4OTg5MmE3MDhkNDBmM2YzZWQ4LmJpbmRQb3B1cChwb3B1cF9hMDkxZmRiMTkyNTI0NGNhYWYxMzJjZDQxMzQ3YmE4ZSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl8xNzlkY2QwM2VkZTU0MDEwYjA0M2I2MjUwYTQ5OGYxMCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc0OTM2ODgyODQ1MzIsLTEyMi40MTI2OTAxNDIzMDgwMV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzEyNDlhOGYyZjRhYzQ4MmZhZjA4YjI2YTA4NzQ2YzYzKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzdiMDM5ZmY4ODg3MzQ5MGY5ODc4ZGMyMDFhNjljZTY3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzBjOGVkYTZmMTY2ZjQwNTFiNzQ1YmFhZGJlOGZjMzczID0gJCgnPGRpdiBpZD0iaHRtbF8wYzhlZGE2ZjE2NmY0MDUxYjc0NWJhYWRiZThmYzM3MyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+T1RIRVIgT0ZGRU5TRVM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzdiMDM5ZmY4ODg3MzQ5MGY5ODc4ZGMyMDFhNjljZTY3LnNldENvbnRlbnQoaHRtbF8wYzhlZGE2ZjE2NmY0MDUxYjc0NWJhYWRiZThmYzM3Myk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzE3OWRjZDAzZWRlNTQwMTBiMDQzYjYyNTBhNDk4ZjEwLmJpbmRQb3B1cChwb3B1cF83YjAzOWZmODg4NzM0OTBmOTg3OGRjMjAxYTY5Y2U2Nyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl8yMmJmMzBmYTkzM2Y0N2Q2OTUwNjU2YzY5ZDNlYWYyMyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjcwOTIwMTA0NjIzNzksLTEyMi40MzQ2MDkyODAzNTJdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF8xMjQ5YThmMmY0YWM0ODJmYWYwOGIyNmEwODc0NmM2Myk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hZjljYzZhMjE3Mjk0Mjg4YjA2OTc1Y2QxOTgzMjNjMiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mNGJhNDZlNDMzODA0MTllOWIyZTM1YTdjNmIzYzY1YSA9ICQoJzxkaXYgaWQ9Imh0bWxfZjRiYTQ2ZTQzMzgwNDE5ZTliMmUzNWE3YzZiM2M2NWEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk5PTi1DUklNSU5BTDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYWY5Y2M2YTIxNzI5NDI4OGIwNjk3NWNkMTk4MzIzYzIuc2V0Q29udGVudChodG1sX2Y0YmE0NmU0MzM4MDQxOWU5YjJlMzVhN2M2YjNjNjVhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMjJiZjMwZmE5MzNmNDdkNjk1MDY1NmM2OWQzZWFmMjMuYmluZFBvcHVwKHBvcHVwX2FmOWNjNmEyMTcyOTQyODhiMDY5NzVjZDE5ODMyM2MyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzQxYWJjZmU2MWQ1MjQ2NWRhNGU2MjE1MWUxOTRmMGM1ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzg3OTIwOTM3NTUzMjk1LC0xMjIuNDEwODgyODI1NTUxXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfMTI0OWE4ZjJmNGFjNDgyZmFmMDhiMjZhMDg3NDZjNjMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMGEyYWNlZjM1YzdhNDU5NWFkZmY4MjIzNzA2OWZjNGUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZGI3ZjBmMjcwZjdlNDA3Y2E3N2Y4ZTJmNzgzNjM3NWUgPSAkKCc8ZGl2IGlkPSJodG1sX2RiN2YwZjI3MGY3ZTQwN2NhNzdmOGUyZjc4MzYzNzVlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5WRUhJQ0xFIFRIRUZUPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wYTJhY2VmMzVjN2E0NTk1YWRmZjgyMjM3MDY5ZmM0ZS5zZXRDb250ZW50KGh0bWxfZGI3ZjBmMjcwZjdlNDA3Y2E3N2Y4ZTJmNzgzNjM3NWUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl80MWFiY2ZlNjFkNTI0NjVkYTRlNjIxNTFlMTk0ZjBjNS5iaW5kUG9wdXAocG9wdXBfMGEyYWNlZjM1YzdhNDU5NWFkZmY4MjIzNzA2OWZjNGUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfMzM0NmZhYmY2NTI2NDljMTk5ZjU2ZmY1N2I2YzFjOTMgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy44MDA0NTY2NDcxMDM4OSwtMTIyLjQwMTQzMjc1NDcyMjAxXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfMTI0OWE4ZjJmNGFjNDgyZmFmMDhiMjZhMDg3NDZjNjMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYWZlYjJhYTVkNWM2NGY1MzgyNmMxNmE5MTJlNGY4MDggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZjQzMDMwYzhkZjlhNGY2Mjg0YmEzMDg3NzhjZGE1ZTkgPSAkKCc8ZGl2IGlkPSJodG1sX2Y0MzAzMGM4ZGY5YTRmNjI4NGJhMzA4Nzc4Y2RhNWU5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5WRUhJQ0xFIFRIRUZUPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hZmViMmFhNWQ1YzY0ZjUzODI2YzE2YTkxMmU0ZjgwOC5zZXRDb250ZW50KGh0bWxfZjQzMDMwYzhkZjlhNGY2Mjg0YmEzMDg3NzhjZGE1ZTkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8zMzQ2ZmFiZjY1MjY0OWMxOTlmNTZmZjU3YjZjMWM5My5iaW5kUG9wdXAocG9wdXBfYWZlYjJhYTVkNWM2NGY1MzgyNmMxNmE5MTJlNGY4MDgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfMzEzOGQ4NGY3MjZjNGRmMTgzMTZhMjgzODczYzY3OGUgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NDM1NTUwNTQyMjY1LC0xMjIuNDIxMTI4MDI5NTA1XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfMTI0OWE4ZjJmNGFjNDgyZmFmMDhiMjZhMDg3NDZjNjMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZWM4OTkxYTQwZmJlNGZjMDg2MjVkMTQ0NDNmM2IxOTQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYmZlYjA0ZGEwOGU0NDI2MzgyY2JiOTBlMGU3MTM0YWQgPSAkKCc8ZGl2IGlkPSJodG1sX2JmZWIwNGRhMDhlNDQyNjM4MmNiYjkwZTBlNzEzNGFkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5MQVJDRU5ZL1RIRUZUPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lYzg5OTFhNDBmYmU0ZmMwODYyNWQxNDQ0M2YzYjE5NC5zZXRDb250ZW50KGh0bWxfYmZlYjA0ZGEwOGU0NDI2MzgyY2JiOTBlMGU3MTM0YWQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8zMTM4ZDg0ZjcyNmM0ZGYxODMxNmEyODM4NzNjNjc4ZS5iaW5kUG9wdXAocG9wdXBfZWM4OTkxYTQwZmJlNGZjMDg2MjVkMTQ0NDNmM2IxOTQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfNWM3OTNhZTJmZWQ4NDUwZDhiMTRlZDA5MDFhN2RiMTQgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODY1NjQ3NjA3Njg1LC0xMjIuNDA3MjQ0MDg3MDMyXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfMTI0OWE4ZjJmNGFjNDgyZmFmMDhiMjZhMDg3NDZjNjMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYTUzZjcwMGJhYzUzNDAzZjg3YWRjMzNhNmUyY2EzZTggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYmY5NDA2NTRiNWQ2NGFiNjkxZDdlN2FmZGQ2ZDA5ZmYgPSAkKCc8ZGl2IGlkPSJodG1sX2JmOTQwNjU0YjVkNjRhYjY5MWQ3ZTdhZmRkNmQwOWZmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5BU1NBVUxUPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hNTNmNzAwYmFjNTM0MDNmODdhZGMzM2E2ZTJjYTNlOC5zZXRDb250ZW50KGh0bWxfYmY5NDA2NTRiNWQ2NGFiNjkxZDdlN2FmZGQ2ZDA5ZmYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl81Yzc5M2FlMmZlZDg0NTBkOGIxNGVkMDkwMWE3ZGIxNC5iaW5kUG9wdXAocG9wdXBfYTUzZjcwMGJhYzUzNDAzZjg3YWRjMzNhNmUyY2EzZTgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfZmMxZTJmZDVmZGRhNDliOTg3MDM4NTc0ZGY5MzQ0OWUgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NjE1NjU1OTI4MDQ1LC0xMjIuNDIzODAzMDAxOTAwOTldLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF8xMjQ5YThmMmY0YWM0ODJmYWYwOGIyNmEwODc0NmM2Myk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iYTkwMzRhNzAzZTc0NDlmYTU3ZGVhYzFmMDZkZWVkZSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF81ZTdkNDgyYWViODE0NWYzYjJmYjkxNmIzNGQzZGU1NSA9ICQoJzxkaXYgaWQ9Imh0bWxfNWU3ZDQ4MmFlYjgxNDVmM2IyZmI5MTZiMzRkM2RlNTUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlJFQ09WRVJFRCBWRUhJQ0xFPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iYTkwMzRhNzAzZTc0NDlmYTU3ZGVhYzFmMDZkZWVkZS5zZXRDb250ZW50KGh0bWxfNWU3ZDQ4MmFlYjgxNDVmM2IyZmI5MTZiMzRkM2RlNTUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9mYzFlMmZkNWZkZGE0OWI5ODcwMzg1NzRkZjkzNDQ5ZS5iaW5kUG9wdXAocG9wdXBfYmE5MDM0YTcwM2U3NDQ5ZmE1N2RlYWMxZjA2ZGVlZGUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfYzI4MWE2NTM5MjEzNDgzOThiZGRjNGQ2NTZlNzEzNDQgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NjE1NjU1OTI4MDQ1LC0xMjIuNDIzODAzMDAxOTAwOTldLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF8xMjQ5YThmMmY0YWM0ODJmYWYwOGIyNmEwODc0NmM2Myk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xMzVhZjhlNGQ0OGI0NGRlOTFiMmM1YmM4NWIzMDVhNiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xMGNlNDdhYTI0OWE0ZTA5OWNkYzE2YjkzODBmZWY4MSA9ICQoJzxkaXYgaWQ9Imh0bWxfMTBjZTQ3YWEyNDlhNGUwOTljZGMxNmI5MzgwZmVmODEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk9USEVSIE9GRkVOU0VTPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xMzVhZjhlNGQ0OGI0NGRlOTFiMmM1YmM4NWIzMDVhNi5zZXRDb250ZW50KGh0bWxfMTBjZTQ3YWEyNDlhNGUwOTljZGMxNmI5MzgwZmVmODEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9jMjgxYTY1MzkyMTM0ODM5OGJkZGM0ZDY1NmU3MTM0NC5iaW5kUG9wdXAocG9wdXBfMTM1YWY4ZTRkNDhiNDRkZTkxYjJjNWJjODViMzA1YTYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfNTQ3Y2ZhNWNhNjRmNDI5NmJiNzEzMThiNTVmZTcxMGMgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NDQxOTI3NTA4OTMyMDUsLTEyMi40NDQ2ODU0ODIyNzNdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF8xMjQ5YThmMmY0YWM0ODJmYWYwOGIyNmEwODc0NmM2Myk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9jYjc4ZTljOWRmMWU0MThlODM3ZWJiOWYyZGYyNmIwMyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF84N2E0ZDBjMDNjNDY0ODAwYTdjZWJhMzYxNGU5OWVmNiA9ICQoJzxkaXYgaWQ9Imh0bWxfODdhNGQwYzAzYzQ2NDgwMGE3Y2ViYTM2MTRlOTllZjYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk5PTi1DUklNSU5BTDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfY2I3OGU5YzlkZjFlNDE4ZTgzN2ViYjlmMmRmMjZiMDMuc2V0Q29udGVudChodG1sXzg3YTRkMGMwM2M0NjQ4MDBhN2NlYmEzNjE0ZTk5ZWY2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfNTQ3Y2ZhNWNhNjRmNDI5NmJiNzEzMThiNTVmZTcxMGMuYmluZFBvcHVwKHBvcHVwX2NiNzhlOWM5ZGYxZTQxOGU4MzdlYmI5ZjJkZjI2YjAzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzU4ZTkwMzhjYjM4MDRkMGNiM2RlNDhlOWYxM2QzODM0ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzc1NDY5MjgyMDA0MSwtMTIyLjQxNTc1NzAzOTE5Nl0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzEyNDlhOGYyZjRhYzQ4MmZhZjA4YjI2YTA4NzQ2YzYzKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzgxMmYyODMzYzJhNjQxODI4OTBlMjI4ODUxNDc3ZTM2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2IzZjA1Y2U4MzI2NjRmZWE5YzMwMjllNWIzMDNhOWNkID0gJCgnPGRpdiBpZD0iaHRtbF9iM2YwNWNlODMyNjY0ZmVhOWMzMDI5ZTViMzAzYTljZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Tk9OLUNSSU1JTkFMPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84MTJmMjgzM2MyYTY0MTgyODkwZTIyODg1MTQ3N2UzNi5zZXRDb250ZW50KGh0bWxfYjNmMDVjZTgzMjY2NGZlYTljMzAyOWU1YjMwM2E5Y2QpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl81OGU5MDM4Y2IzODA0ZDBjYjNkZTQ4ZTlmMTNkMzgzNC5iaW5kUG9wdXAocG9wdXBfODEyZjI4MzNjMmE2NDE4Mjg5MGUyMjg4NTE0NzdlMzYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfOTI2ZjkwZWE5YjBmNDI3Zjk0ODYzZjBjMDNkOTM3ZDUgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43Mjg1MjgwNjI3NDY1LC0xMjIuNDc1NjQ3NDYwNzg1OTldLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF8xMjQ5YThmMmY0YWM0ODJmYWYwOGIyNmEwODc0NmM2Myk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wMjkyYWQwMWM2ZmY0ODBlOTJiMzA5MjZhYmIzYzI5OCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kYjU5ZThlMTg0YzU0ZTYyODA3YmM1MDZkNGM3OTFlOCA9ICQoJzxkaXYgaWQ9Imh0bWxfZGI1OWU4ZTE4NGM1NGU2MjgwN2JjNTA2ZDRjNzkxZTgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlJPQkJFUlk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzAyOTJhZDAxYzZmZjQ4MGU5MmIzMDkyNmFiYjNjMjk4LnNldENvbnRlbnQoaHRtbF9kYjU5ZThlMTg0YzU0ZTYyODA3YmM1MDZkNGM3OTFlOCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzkyNmY5MGVhOWIwZjQyN2Y5NDg2M2YwYzAzZDkzN2Q1LmJpbmRQb3B1cChwb3B1cF8wMjkyYWQwMWM2ZmY0ODBlOTJiMzA5MjZhYmIzYzI5OCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl80YjBmMDc5N2Y1NGY0YWFmYTk3YjVjYjc0Yjk4ZGQ0OSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc0Mjg1MTczNzQ0NDg5NCwtMTIyLjQyMDk2NzQ0MDU2NF0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzEyNDlhOGYyZjRhYzQ4MmZhZjA4YjI2YTA4NzQ2YzYzKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzBjMDdkYzBhZDg0ZjQzZTY4MmU3MDg5NzYwOTkxY2I3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzE1Y2IyMmY5MGNiNDQzZTdhYjM2OGZmNDM4MmZhOTU2ID0gJCgnPGRpdiBpZD0iaHRtbF8xNWNiMjJmOTBjYjQ0M2U3YWIzNjhmZjQzODJmYTk1NiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+T1RIRVIgT0ZGRU5TRVM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzBjMDdkYzBhZDg0ZjQzZTY4MmU3MDg5NzYwOTkxY2I3LnNldENvbnRlbnQoaHRtbF8xNWNiMjJmOTBjYjQ0M2U3YWIzNjhmZjQzODJmYTk1Nik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzRiMGYwNzk3ZjU0ZjRhYWZhOTdiNWNiNzRiOThkZDQ5LmJpbmRQb3B1cChwb3B1cF8wYzA3ZGMwYWQ4NGY0M2U2ODJlNzA4OTc2MDk5MWNiNyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9mMDEyMGY3OWU1YjE0MzlmYWQ1YWEwZTU5NDUwYWRlNyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc4MjExOTg0ODg5MzEsLTEyMi40MTU2Njk2NjE0NDNdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF8xMjQ5YThmMmY0YWM0ODJmYWYwOGIyNmEwODc0NmM2Myk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lYjM0ZWVkMGEzOGY0MjM5ODEwYzU1YWU3NmQ3MWY1ZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zMDBkNzM5YzkxNTg0ZmYwOThjYzFhOTMzMjI0ZjBjNCA9ICQoJzxkaXYgaWQ9Imh0bWxfMzAwZDczOWM5MTU4NGZmMDk4Y2MxYTkzMzIyNGYwYzQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlZBTkRBTElTTTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZWIzNGVlZDBhMzhmNDIzOTgxMGM1NWFlNzZkNzFmNWYuc2V0Q29udGVudChodG1sXzMwMGQ3MzljOTE1ODRmZjA5OGNjMWE5MzMyMjRmMGM0KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfZjAxMjBmNzllNWIxNDM5ZmFkNWFhMGU1OTQ1MGFkZTcuYmluZFBvcHVwKHBvcHVwX2ViMzRlZWQwYTM4ZjQyMzk4MTBjNTVhZTc2ZDcxZjVmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzQ0ZTNmM2I1NGJkZTQzYjc4ZGYwN2ZiODY4YzliMGQwID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzc5MTY3NDIxODk2MywtMTIyLjQwNjM0NjQyNTYzMl0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzEyNDlhOGYyZjRhYzQ4MmZhZjA4YjI2YTA4NzQ2YzYzKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzEyMDQ3NzFjZmI3ZDQxYTE5NWY4NjU5YzdlNGU4NjhiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzJmZjgxYzBjNTUzZDQ4NTlhZDg3YTMyZjAyNmEwODhjID0gJCgnPGRpdiBpZD0iaHRtbF8yZmY4MWMwYzU1M2Q0ODU5YWQ4N2EzMmYwMjZhMDg4YyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QVNTQVVMVDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMTIwNDc3MWNmYjdkNDFhMTk1Zjg2NTljN2U0ZTg2OGIuc2V0Q29udGVudChodG1sXzJmZjgxYzBjNTUzZDQ4NTlhZDg3YTMyZjAyNmEwODhjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfNDRlM2YzYjU0YmRlNDNiNzhkZjA3ZmI4NjhjOWIwZDAuYmluZFBvcHVwKHBvcHVwXzEyMDQ3NzFjZmI3ZDQxYTE5NWY4NjU5YzdlNGU4NjhiKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzQ4NDU5NWNiYTA1NTRjMzRiNWUxMjU2OWY2MTRlODgyID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzY1NzE4NDM5NTI4MiwtMTIyLjQwOTUyOTkxMzI3OF0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzEyNDlhOGYyZjRhYzQ4MmZhZjA4YjI2YTA4NzQ2YzYzKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2M1YzlkNDZlZGFjZDRjOWY4MWYzMjJmMDRiMmI4ODBmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzJhYmU5ZGE3NzkyMzQxOTg5ODgyNTZhN2IxODJiMjU0ID0gJCgnPGRpdiBpZD0iaHRtbF8yYWJlOWRhNzc5MjM0MTk4OTg4MjU2YTdiMTgyYjI1NCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TEFSQ0VOWS9USEVGVDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYzVjOWQ0NmVkYWNkNGM5ZjgxZjMyMmYwNGIyYjg4MGYuc2V0Q29udGVudChodG1sXzJhYmU5ZGE3NzkyMzQxOTg5ODgyNTZhN2IxODJiMjU0KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfNDg0NTk1Y2JhMDU1NGMzNGI1ZTEyNTY5ZjYxNGU4ODIuYmluZFBvcHVwKHBvcHVwX2M1YzlkNDZlZGFjZDRjOWY4MWYzMjJmMDRiMmI4ODBmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzQzMzNhOTYwMWQxZDQ3MDdhMGI3ZDY1YzJmMTRjZGE1ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzc1NDIwNzA2NzExLC0xMjIuNDAzNDA0NzkxNDc4OTldLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF8xMjQ5YThmMmY0YWM0ODJmYWYwOGIyNmEwODc0NmM2Myk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wMjdjOWM3MjA0YTk0NDY4YmY5YWEyNDYwYjY4ZDQ1MyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF84NGVkZmQyMjY3NzY0ZmNkOGNhMjVhZmMwOGQxMWIyZiA9ICQoJzxkaXYgaWQ9Imh0bWxfODRlZGZkMjI2Nzc2NGZjZDhjYTI1YWZjMDhkMTFiMmYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk5PTi1DUklNSU5BTDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMDI3YzljNzIwNGE5NDQ2OGJmOWFhMjQ2MGI2OGQ0NTMuc2V0Q29udGVudChodG1sXzg0ZWRmZDIyNjc3NjRmY2Q4Y2EyNWFmYzA4ZDExYjJmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfNDMzM2E5NjAxZDFkNDcwN2EwYjdkNjVjMmYxNGNkYTUuYmluZFBvcHVwKHBvcHVwXzAyN2M5YzcyMDRhOTQ0NjhiZjlhYTI0NjBiNjhkNDUzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzcyZGU4MTg4NGRmZTQ4OTZiMTY3ZmU1YTMzNzU1MmQyID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzY3NTI0MzA4NzgzLC0xMjIuNDEwNzM4MDk3MzE1XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfMTI0OWE4ZjJmNGFjNDgyZmFmMDhiMjZhMDg3NDZjNjMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMzE5MzA4ZGU3OWZiNGI4ODlhNGZmOTVhZDA2NGJhYWUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNGRkYTcyNzY4NjI3NGQ1Yzg4MzA5NzBjOThjZmFkYjEgPSAkKCc8ZGl2IGlkPSJodG1sXzRkZGE3Mjc2ODYyNzRkNWM4ODMwOTcwYzk4Y2ZhZGIxIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5CVVJHTEFSWTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMzE5MzA4ZGU3OWZiNGI4ODlhNGZmOTVhZDA2NGJhYWUuc2V0Q29udGVudChodG1sXzRkZGE3Mjc2ODYyNzRkNWM4ODMwOTcwYzk4Y2ZhZGIxKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfNzJkZTgxODg0ZGZlNDg5NmIxNjdmZTVhMzM3NTUyZDIuYmluZFBvcHVwKHBvcHVwXzMxOTMwOGRlNzlmYjRiODg5YTRmZjk1YWQwNjRiYWFlKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2I0ZmQ1NDVlMWVlMDQ0YmI4NTRlZmQ4ZjMzODliNjg5ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzY3NTI0MzA4NzgzLC0xMjIuNDEwNzM4MDk3MzE1XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfMTI0OWE4ZjJmNGFjNDgyZmFmMDhiMjZhMDg3NDZjNjMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZTU1OWRiMTZhMzE2NDg4YTgyMjcwZjVkN2ViOTQ4YzUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNmMxZjFmYjYyMDc4NGVmNTk2YzA3ZmJmYzZiMjA0MTUgPSAkKCc8ZGl2IGlkPSJodG1sXzZjMWYxZmI2MjA3ODRlZjU5NmMwN2ZiZmM2YjIwNDE1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5BUlNPTjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZTU1OWRiMTZhMzE2NDg4YTgyMjcwZjVkN2ViOTQ4YzUuc2V0Q29udGVudChodG1sXzZjMWYxZmI2MjA3ODRlZjU5NmMwN2ZiZmM2YjIwNDE1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfYjRmZDU0NWUxZWUwNDRiYjg1NGVmZDhmMzM4OWI2ODkuYmluZFBvcHVwKHBvcHVwX2U1NTlkYjE2YTMxNjQ4OGE4MjI3MGY1ZDdlYjk0OGM1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzQ5ZGY0OWFlY2IwNzRiYzVhMzBmZDE2M2FmODBmYWU5ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzEzMTA4MzQzMzI2NCwtMTIyLjQ0NDMxNDAyNTE4OF0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzEyNDlhOGYyZjRhYzQ4MmZhZjA4YjI2YTA4NzQ2YzYzKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzMyM2EzMjNkZTcwOTQ0OGY5NWRkN2RkOWVjMTc2YjQxID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzEyNGJkMzNjMGQxMDQ1N2Y4NmRlNjM4NmMzNmI1ZTJmID0gJCgnPGRpdiBpZD0iaHRtbF8xMjRiZDMzYzBkMTA0NTdmODZkZTYzODZjMzZiNWUyZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QlVSR0xBUlk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzMyM2EzMjNkZTcwOTQ0OGY5NWRkN2RkOWVjMTc2YjQxLnNldENvbnRlbnQoaHRtbF8xMjRiZDMzYzBkMTA0NTdmODZkZTYzODZjMzZiNWUyZik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzQ5ZGY0OWFlY2IwNzRiYzVhMzBmZDE2M2FmODBmYWU5LmJpbmRQb3B1cChwb3B1cF8zMjNhMzIzZGU3MDk0NDhmOTVkZDdkZDllYzE3NmI0MSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl8xOTE0NmNlN2U1MzM0ZDE0YWJjYjFlNDZmMzI4ZGIxZSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjcxMzEwODM0MzMyNjQsLTEyMi40NDQzMTQwMjUxODhdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF8xMjQ5YThmMmY0YWM0ODJmYWYwOGIyNmEwODc0NmM2Myk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF81ZDYwNTgwZGU2YTI0M2FjYmJhYjdhYTFkNDkyMzg2ZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hOTgzZTRmNDY5Nzg0ZDExYjk2ZTM5ZjYxZjkzOGVhOCA9ICQoJzxkaXYgaWQ9Imh0bWxfYTk4M2U0ZjQ2OTc4NGQxMWI5NmUzOWY2MWY5MzhlYTgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkRSVUcvTkFSQ09USUM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzVkNjA1ODBkZTZhMjQzYWNiYmFiN2FhMWQ0OTIzODZkLnNldENvbnRlbnQoaHRtbF9hOTgzZTRmNDY5Nzg0ZDExYjk2ZTM5ZjYxZjkzOGVhOCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzE5MTQ2Y2U3ZTUzMzRkMTRhYmNiMWU0NmYzMjhkYjFlLmJpbmRQb3B1cChwb3B1cF81ZDYwNTgwZGU2YTI0M2FjYmJhYjdhYTFkNDkyMzg2ZCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl84ODcwNjVjZWNlYWE0NmU0OWUwNDQwZjRjMmMwNjAxMiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc2NjAxNjAxMTQxMDMsLTEyMi40MDM2NDQ2MjA0MzldLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF8xMjQ5YThmMmY0YWM0ODJmYWYwOGIyNmEwODc0NmM2Myk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF80OWNlYzhlODhhZDM0MzQzYjg1MWE3MDhkYzdmZWM1YSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8yMTY1MDVmOGE3N2E0NDQ2ODYyOGFiNTFjMTEwMmE2NCA9ICQoJzxkaXYgaWQ9Imh0bWxfMjE2NTA1ZjhhNzdhNDQ0Njg2MjhhYjUxYzExMDJhNjQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk1JU1NJTkcgUEVSU09OPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80OWNlYzhlODhhZDM0MzQzYjg1MWE3MDhkYzdmZWM1YS5zZXRDb250ZW50KGh0bWxfMjE2NTA1ZjhhNzdhNDQ0Njg2MjhhYjUxYzExMDJhNjQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl84ODcwNjVjZWNlYWE0NmU0OWUwNDQwZjRjMmMwNjAxMi5iaW5kUG9wdXAocG9wdXBfNDljZWM4ZTg4YWQzNDM0M2I4NTFhNzA4ZGM3ZmVjNWEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfMzEwZTdlOWFjNDEwNDQ2NDllNzk3ZTI3NzQ2MjlhNzAgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NjYwMTYwMTE0MTAzLC0xMjIuNDAzNjQ0NjIwNDM5XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfMTI0OWE4ZjJmNGFjNDgyZmFmMDhiMjZhMDg3NDZjNjMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZWYxMDgwZDA3NzliNDA4NTkwMGFlMjBhYjMzMDJjYjEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNzBmOTBlOTViMzEzNDYzZGIyNjc2NjNmNDFkOTMwNGEgPSAkKCc8ZGl2IGlkPSJodG1sXzcwZjkwZTk1YjMxMzQ2M2RiMjY3NjYzZjQxZDkzMDRhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NSVNTSU5HIFBFUlNPTjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZWYxMDgwZDA3NzliNDA4NTkwMGFlMjBhYjMzMDJjYjEuc2V0Q29udGVudChodG1sXzcwZjkwZTk1YjMxMzQ2M2RiMjY3NjYzZjQxZDkzMDRhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMzEwZTdlOWFjNDEwNDQ2NDllNzk3ZTI3NzQ2MjlhNzAuYmluZFBvcHVwKHBvcHVwX2VmMTA4MGQwNzc5YjQwODU5MDBhZTIwYWIzMzAyY2IxKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzA5YjBkMmQ5MDM5MDQ4MDFiZjMwZDFkOWIyNjIwYWEwID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzc2MjMxMDQwNDc1OCwtMTIyLjQxNDcxNDI5NTU3ODk5XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfMTI0OWE4ZjJmNGFjNDgyZmFmMDhiMjZhMDg3NDZjNjMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNzMxNDhjNGQzNTY2NDRjNDkxNzRkMzJjOTA5OWJlNmUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMWU2MjZlZWU0YWQ5NDk5NGFjZjQ4MTljYmQ1YjFhZTMgPSAkKCc8ZGl2IGlkPSJodG1sXzFlNjI2ZWVlNGFkOTQ5OTRhY2Y0ODE5Y2JkNWIxYWUzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5BU1NBVUxUPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83MzE0OGM0ZDM1NjY0NGM0OTE3NGQzMmM5MDk5YmU2ZS5zZXRDb250ZW50KGh0bWxfMWU2MjZlZWU0YWQ5NDk5NGFjZjQ4MTljYmQ1YjFhZTMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8wOWIwZDJkOTAzOTA0ODAxYmYzMGQxZDliMjYyMGFhMC5iaW5kUG9wdXAocG9wdXBfNzMxNDhjNGQzNTY2NDRjNDkxNzRkMzJjOTA5OWJlNmUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfZGNmMmYwYmQ5ZTY3NGNkMGJiODIxYThhOWFlN2MyNGQgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NzYyMzEwNDA0NzU4LC0xMjIuNDE0NzE0Mjk1NTc4OTldLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF8xMjQ5YThmMmY0YWM0ODJmYWYwOGIyNmEwODc0NmM2Myk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xZjJjMmVlYjNiMTI0MDI5YWJmMjVlNjA2NjAxN2E4ZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF80MDllZmQwMjlkYTY0OTJmYmIwZTJjZTQzNmRjYTdlYyA9ICQoJzxkaXYgaWQ9Imh0bWxfNDA5ZWZkMDI5ZGE2NDkyZmJiMGUyY2U0MzZkY2E3ZWMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk1JU1NJTkcgUEVSU09OPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xZjJjMmVlYjNiMTI0MDI5YWJmMjVlNjA2NjAxN2E4ZC5zZXRDb250ZW50KGh0bWxfNDA5ZWZkMDI5ZGE2NDkyZmJiMGUyY2U0MzZkY2E3ZWMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9kY2YyZjBiZDllNjc0Y2QwYmI4MjFhOGE5YWU3YzI0ZC5iaW5kUG9wdXAocG9wdXBfMWYyYzJlZWIzYjEyNDAyOWFiZjI1ZTYwNjYwMTdhOGQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfMmNjNWExM2Y3MDNmNGZlNGExMTdjYmY2N2U0MjFjN2EgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43Nzc1MTE4ODk1Njk1LC0xMjIuNDE4MDQ1NDUyNzY4XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfMTI0OWE4ZjJmNGFjNDgyZmFmMDhiMjZhMDg3NDZjNjMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMTk0NGI1ZmEwNzFmNDMyNTg0MDZhYjdkYzYwNzBkZDcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNmI3NjVkMjMzMWQ4NDQ3NDg0ZWM5NzQ5YWNlMjZlNzUgPSAkKCc8ZGl2IGlkPSJodG1sXzZiNzY1ZDIzMzFkODQ0NzQ4NGVjOTc0OWFjZTI2ZTc1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5WRUhJQ0xFIFRIRUZUPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xOTQ0YjVmYTA3MWY0MzI1ODQwNmFiN2RjNjA3MGRkNy5zZXRDb250ZW50KGh0bWxfNmI3NjVkMjMzMWQ4NDQ3NDg0ZWM5NzQ5YWNlMjZlNzUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8yY2M1YTEzZjcwM2Y0ZmU0YTExN2NiZjY3ZTQyMWM3YS5iaW5kUG9wdXAocG9wdXBfMTk0NGI1ZmEwNzFmNDMyNTg0MDZhYjdkYzYwNzBkZDcpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfMzdmMTk4NzY0YmZkNDcxOWEyODFmZDY1MmYyNDJjZTQgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODIwMjM4NDc4OTc1LC0xMjIuNDAxMTYxNTU1NjAyXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfMTI0OWE4ZjJmNGFjNDgyZmFmMDhiMjZhMDg3NDZjNjMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMzZjNDEwMWEwODk2NDI1Zjk5MzVlMjJkNGU4YTg1YWYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOTE3ZDk1ZGU2ZjU1NGQ5YjgwOGZmOTU5MTY0NWRlZmUgPSAkKCc8ZGl2IGlkPSJodG1sXzkxN2Q5NWRlNmY1NTRkOWI4MDhmZjk1OTE2NDVkZWZlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5PVEhFUiBPRkZFTlNFUzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMzZjNDEwMWEwODk2NDI1Zjk5MzVlMjJkNGU4YTg1YWYuc2V0Q29udGVudChodG1sXzkxN2Q5NWRlNmY1NTRkOWI4MDhmZjk1OTE2NDVkZWZlKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMzdmMTk4NzY0YmZkNDcxOWEyODFmZDY1MmYyNDJjZTQuYmluZFBvcHVwKHBvcHVwXzM2YzQxMDFhMDg5NjQyNWY5OTM1ZTIyZDRlOGE4NWFmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzY4YWUxMzkxOTAyMjQ0ZTZhOTFmZmMyMjVjZWY0YzJiID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzI3MDA1MzE5NjI5OTk1LC0xMjIuNDAzNDA4NjY5MTkxXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfMTI0OWE4ZjJmNGFjNDgyZmFmMDhiMjZhMDg3NDZjNjMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZGEyZmRmNThmZjllNGU3ZWI4ZDdmMzVmNGE3NjQxYTggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZTRjMzk3MDU2N2I0NGZlMTg4MGY0OTI0NTVmNDMwNGIgPSAkKCc8ZGl2IGlkPSJodG1sX2U0YzM5NzA1NjdiNDRmZTE4ODBmNDkyNDU1ZjQzMDRiIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5XQVJSQU5UUzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZGEyZmRmNThmZjllNGU3ZWI4ZDdmMzVmNGE3NjQxYTguc2V0Q29udGVudChodG1sX2U0YzM5NzA1NjdiNDRmZTE4ODBmNDkyNDU1ZjQzMDRiKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfNjhhZTEzOTE5MDIyNDRlNmE5MWZmYzIyNWNlZjRjMmIuYmluZFBvcHVwKHBvcHVwX2RhMmZkZjU4ZmY5ZTRlN2ViOGQ3ZjM1ZjRhNzY0MWE4KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2ZmYzFhYjA5OGVlYTRhMzdhNTZkNTkwOGFhZjYwMGFkID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzgzODM0NDM3NDE0MSwtMTIyLjQxMjkzMDUyMjA1OV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzEyNDlhOGYyZjRhYzQ4MmZhZjA4YjI2YTA4NzQ2YzYzKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzkzN2I3MjVlMjVlZTQ4ZTViMTVlNDcyYzc3MWM3NzY0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzIxYzc3NjE1YWU2OTRhOWM4ZDE1YzU5MTRmMDBhY2JhID0gJCgnPGRpdiBpZD0iaHRtbF8yMWM3NzYxNWFlNjk0YTljOGQxNWM1OTE0ZjAwYWNiYSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+VkFOREFMSVNNPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85MzdiNzI1ZTI1ZWU0OGU1YjE1ZTQ3MmM3NzFjNzc2NC5zZXRDb250ZW50KGh0bWxfMjFjNzc2MTVhZTY5NGE5YzhkMTVjNTkxNGYwMGFjYmEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9mZmMxYWIwOThlZWE0YTM3YTU2ZDU5MDhhYWY2MDBhZC5iaW5kUG9wdXAocG9wdXBfOTM3YjcyNWUyNWVlNDhlNWIxNWU0NzJjNzcxYzc3NjQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfNjc3YmFkZmI3OGZiNGYzOTlhN2QwNGU4MGY3MDQzYWIgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NTMwMTg2NTM3NDQ2MDQsLTEyMi40MTg1ODcxNzIyMTldLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF8xMjQ5YThmMmY0YWM0ODJmYWYwOGIyNmEwODc0NmM2Myk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hNzczMTdiMjBiNGY0NzczYWE4MjUzMGE3OWY5ZDdlZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF85YmQ4MWI3MzhmMGQ0NDA1YTA4NzNjODBkNjkyZGFjNiA9ICQoJzxkaXYgaWQ9Imh0bWxfOWJkODFiNzM4ZjBkNDQwNWEwODczYzgwZDY5MmRhYzYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk5PTi1DUklNSU5BTDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYTc3MzE3YjIwYjRmNDc3M2FhODI1MzBhNzlmOWQ3ZWQuc2V0Q29udGVudChodG1sXzliZDgxYjczOGYwZDQ0MDVhMDg3M2M4MGQ2OTJkYWM2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfNjc3YmFkZmI3OGZiNGYzOTlhN2QwNGU4MGY3MDQzYWIuYmluZFBvcHVwKHBvcHVwX2E3NzMxN2IyMGI0ZjQ3NzNhYTgyNTMwYTc5ZjlkN2VkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2RiZTBiOTkyYzJmOTQ0MzlhY2ZiZDBiYmVmOWFjZDI3ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzc0MDQxODM4NTA0MSwtMTIyLjQxNDM3MDYyNzQ5NV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzEyNDlhOGYyZjRhYzQ4MmZhZjA4YjI2YTA4NzQ2YzYzKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2I0ZjQ4ZGE1MzVjZDQ2YjI4NTViNzJhNjNlMmYyNmM2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2EzM2M0OTVjNzE1YjRkZjZiNmVjN2QyYWQwNzJhNmFhID0gJCgnPGRpdiBpZD0iaHRtbF9hMzNjNDk1YzcxNWI0ZGY2YjZlYzdkMmFkMDcyYTZhYSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RlJBVUQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2I0ZjQ4ZGE1MzVjZDQ2YjI4NTViNzJhNjNlMmYyNmM2LnNldENvbnRlbnQoaHRtbF9hMzNjNDk1YzcxNWI0ZGY2YjZlYzdkMmFkMDcyYTZhYSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2RiZTBiOTkyYzJmOTQ0MzlhY2ZiZDBiYmVmOWFjZDI3LmJpbmRQb3B1cChwb3B1cF9iNGY0OGRhNTM1Y2Q0NmIyODU1YjcyYTYzZTJmMjZjNik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl83NDE5MDg0Mzg4NjI0YTAzODg0NGFmMmQyODNjZTIyYSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc5MDUzODk5MzcyNSwtMTIyLjQwMzkxNTY4MTU3MTAxXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfMTI0OWE4ZjJmNGFjNDgyZmFmMDhiMjZhMDg3NDZjNjMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfODg0MzllNmU4YmE2NDdlY2IxNzg3ZjI2ZmU1ODI5MzYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZDFhYWQ2ZTU1YzM5NDVjNjkzZDA2NDI1Nzg2Y2Q1ZmEgPSAkKCc8ZGl2IGlkPSJodG1sX2QxYWFkNmU1NWMzOTQ1YzY5M2QwNjQyNTc4NmNkNWZhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5BU1NBVUxUPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84ODQzOWU2ZThiYTY0N2VjYjE3ODdmMjZmZTU4MjkzNi5zZXRDb250ZW50KGh0bWxfZDFhYWQ2ZTU1YzM5NDVjNjkzZDA2NDI1Nzg2Y2Q1ZmEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl83NDE5MDg0Mzg4NjI0YTAzODg0NGFmMmQyODNjZTIyYS5iaW5kUG9wdXAocG9wdXBfODg0MzllNmU4YmE2NDdlY2IxNzg3ZjI2ZmU1ODI5MzYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfZmRlYWVjZTQxMTk3NDlkNzlmNGJhNTBiZjUyMDk2YmUgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODMwOTk4MjQ0NTkyMSwtMTIyLjQxOTE4MzA5NjM2Ml0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzEyNDlhOGYyZjRhYzQ4MmZhZjA4YjI2YTA4NzQ2YzYzKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzkwNWUxNWZiNjk0NTQxYjY5OWZiMDMxYmQ2MTJjMzhjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2NiNDBiZTVlZDNjZTQwNDM4ZTZiZGU3OTg2ZTA5M2VhID0gJCgnPGRpdiBpZD0iaHRtbF9jYjQwYmU1ZWQzY2U0MDQzOGU2YmRlNzk4NmUwOTNlYSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+T1RIRVIgT0ZGRU5TRVM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzkwNWUxNWZiNjk0NTQxYjY5OWZiMDMxYmQ2MTJjMzhjLnNldENvbnRlbnQoaHRtbF9jYjQwYmU1ZWQzY2U0MDQzOGU2YmRlNzk4NmUwOTNlYSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2ZkZWFlY2U0MTE5NzQ5ZDc5ZjRiYTUwYmY1MjA5NmJlLmJpbmRQb3B1cChwb3B1cF85MDVlMTVmYjY5NDU0MWI2OTlmYjAzMWJkNjEyYzM4Yyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl8xNjU0MGJkNWU0ODY0ZGJkYWQ3YTE3OThhNzhhNTgxMyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc0MDczNjA1NDgzNTc5LC0xMjIuMzg4NzUzMDQ2OTk3XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfMTI0OWE4ZjJmNGFjNDgyZmFmMDhiMjZhMDg3NDZjNjMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOGMzNzU5OTRhYWYxNGFhMmJkMmRlOTdiNDQxMzUyODQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMDM5NGYzNDE5OTA3NDA0N2JkMDhkZmFhMzliNzdmNWIgPSAkKCc8ZGl2IGlkPSJodG1sXzAzOTRmMzQxOTkwNzQwNDdiZDA4ZGZhYTM5Yjc3ZjViIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5PVEhFUiBPRkZFTlNFUzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOGMzNzU5OTRhYWYxNGFhMmJkMmRlOTdiNDQxMzUyODQuc2V0Q29udGVudChodG1sXzAzOTRmMzQxOTkwNzQwNDdiZDA4ZGZhYTM5Yjc3ZjViKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMTY1NDBiZDVlNDg2NGRiZGFkN2ExNzk4YTc4YTU4MTMuYmluZFBvcHVwKHBvcHVwXzhjMzc1OTk0YWFmMTRhYTJiZDJkZTk3YjQ0MTM1Mjg0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2I0ZDFmMjIwNDZjMDRhYjRhYzcyODFhYThlYjRkMWQ4ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzc0OTkxMjk0NDM2NiwtMTIyLjQzNzc5OTcwMzQ2OF0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzEyNDlhOGYyZjRhYzQ4MmZhZjA4YjI2YTA4NzQ2YzYzKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2RkYmI1OTZjMDc3ZDQxNmU4MjQ5YTM2OGUzMjY3MDhjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2RlY2E4ZDNlZmQ0MjQ5ZjlhYWI3ZjJmYmFiNDA4MjhjID0gJCgnPGRpdiBpZD0iaHRtbF9kZWNhOGQzZWZkNDI0OWY5YWFiN2YyZmJhYjQwODI4YyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TEFSQ0VOWS9USEVGVDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZGRiYjU5NmMwNzdkNDE2ZTgyNDlhMzY4ZTMyNjcwOGMuc2V0Q29udGVudChodG1sX2RlY2E4ZDNlZmQ0MjQ5ZjlhYWI3ZjJmYmFiNDA4MjhjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfYjRkMWYyMjA0NmMwNGFiNGFjNzI4MWFhOGViNGQxZDguYmluZFBvcHVwKHBvcHVwX2RkYmI1OTZjMDc3ZDQxNmU4MjQ5YTM2OGUzMjY3MDhjKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzE0MzUyOGY2ZWY0ODQwNjI4YWU0YWIzZDMzMjYxODBmID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzc3MDkwMjc0MzY2OSwtMTIyLjQyMTMzMjY4NDYzM10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzEyNDlhOGYyZjRhYzQ4MmZhZjA4YjI2YTA4NzQ2YzYzKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzU2ZTkyZjJkMDg2ZTRlNDc5ZmZlMTIzNGIxNWViMWY1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzIzZjI1OGEyMmY2NzQzMDM5NzQ2YjBmYWQwYzYzNTVkID0gJCgnPGRpdiBpZD0iaHRtbF8yM2YyNThhMjJmNjc0MzAzOTc0NmIwZmFkMGM2MzU1ZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TUlTU0lORyBQRVJTT048L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzU2ZTkyZjJkMDg2ZTRlNDc5ZmZlMTIzNGIxNWViMWY1LnNldENvbnRlbnQoaHRtbF8yM2YyNThhMjJmNjc0MzAzOTc0NmIwZmFkMGM2MzU1ZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzE0MzUyOGY2ZWY0ODQwNjI4YWU0YWIzZDMzMjYxODBmLmJpbmRQb3B1cChwb3B1cF81NmU5MmYyZDA4NmU0ZTQ3OWZmZTEyMzRiMTVlYjFmNSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl8wYjBlZDVmZGNmNjY0ZjRlOWRlMzA5MWZlN2RiNjc2NyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc3NzA5MDI3NDM2NjksLTEyMi40MjEzMzI2ODQ2MzNdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF8xMjQ5YThmMmY0YWM0ODJmYWYwOGIyNmEwODc0NmM2Myk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85MTE1NGMxODk0NWQ0YjI5ODVkYzBmYTNkMDA5MjkxZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mYmI0ZWM0OWExY2E0MDc0YWY4ZjQ2ZDZiNDM4ODE1YSA9ICQoJzxkaXYgaWQ9Imh0bWxfZmJiNGVjNDlhMWNhNDA3NGFmOGY0NmQ2YjQzODgxNWEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk1JU1NJTkcgUEVSU09OPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85MTE1NGMxODk0NWQ0YjI5ODVkYzBmYTNkMDA5MjkxZi5zZXRDb250ZW50KGh0bWxfZmJiNGVjNDlhMWNhNDA3NGFmOGY0NmQ2YjQzODgxNWEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8wYjBlZDVmZGNmNjY0ZjRlOWRlMzA5MWZlN2RiNjc2Ny5iaW5kUG9wdXAocG9wdXBfOTExNTRjMTg5NDVkNGIyOTg1ZGMwZmEzZDAwOTI5MWYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfNjIzMTUyM2IyZGYwNDQzNWJlMDIwNTkzM2Y1MmQ5YjkgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODIyNDU4MjIzOTE3LC0xMjIuNDQ2NjEyOTc4ODM5XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfMTI0OWE4ZjJmNGFjNDgyZmFmMDhiMjZhMDg3NDZjNjMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNWJlNjk4ZTdlYTQxNDFlNjg0NGQ4MmVkZWIyMmZlMzIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNTVlNzQyMTA0ZjY1NDU5NWI1NWQ0MDNiMzg2NmNjZDIgPSAkKCc8ZGl2IGlkPSJodG1sXzU1ZTc0MjEwNGY2NTQ1OTViNTVkNDAzYjM4NjZjY2QyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5XQVJSQU5UUzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNWJlNjk4ZTdlYTQxNDFlNjg0NGQ4MmVkZWIyMmZlMzIuc2V0Q29udGVudChodG1sXzU1ZTc0MjEwNGY2NTQ1OTViNTVkNDAzYjM4NjZjY2QyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfNjIzMTUyM2IyZGYwNDQzNWJlMDIwNTkzM2Y1MmQ5YjkuYmluZFBvcHVwKHBvcHVwXzViZTY5OGU3ZWE0MTQxZTY4NDRkODJlZGViMjJmZTMyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2JhYTdmNjhjNmNmNTRjOGU5NTU2Y2JiNjczZDM2NDg2ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzMwMDM3OTk5NTEyNzk1LC0xMjIuNDA0NTk0MTQwNjM0XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfMTI0OWE4ZjJmNGFjNDgyZmFmMDhiMjZhMDg3NDZjNjMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMTNjNjNlNzFlYzk2NGZkZGIzMTg1MTIwYTJmNThkYWUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYTFhOGRhOTk0YWMxNGMwNmFmZmNmYWIzYzk0NDllZjYgPSAkKCc8ZGl2IGlkPSJodG1sX2ExYThkYTk5NGFjMTRjMDZhZmZjZmFiM2M5NDQ5ZWY2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5OT04tQ1JJTUlOQUw8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzEzYzYzZTcxZWM5NjRmZGRiMzE4NTEyMGEyZjU4ZGFlLnNldENvbnRlbnQoaHRtbF9hMWE4ZGE5OTRhYzE0YzA2YWZmY2ZhYjNjOTQ0OWVmNik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2JhYTdmNjhjNmNmNTRjOGU5NTU2Y2JiNjczZDM2NDg2LmJpbmRQb3B1cChwb3B1cF8xM2M2M2U3MWVjOTY0ZmRkYjMxODUxMjBhMmY1OGRhZSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9iZTY0YzMzMjYxY2Q0ZmQxYmNhZDY4ZWU4MmIyMzA5MiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc5NTMzMzgyNjc0MzYsLTEyMi4zOTczNzM3NDAwNjZdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF8xMjQ5YThmMmY0YWM0ODJmYWYwOGIyNmEwODc0NmM2Myk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF81NjNiMDhmMzA4ODQ0ODFiOWJjODMyMGQwM2IwYjgxNyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF80OGQ0Yjg3NGM3NjY0M2RjYjE4NmJiMGRhYThjMmRkZCA9ICQoJzxkaXYgaWQ9Imh0bWxfNDhkNGI4NzRjNzY2NDNkY2IxODZiYjBkYWE4YzJkZGQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk5PTi1DUklNSU5BTDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNTYzYjA4ZjMwODg0NDgxYjliYzgzMjBkMDNiMGI4MTcuc2V0Q29udGVudChodG1sXzQ4ZDRiODc0Yzc2NjQzZGNiMTg2YmIwZGFhOGMyZGRkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfYmU2NGMzMzI2MWNkNGZkMWJjYWQ2OGVlODJiMjMwOTIuYmluZFBvcHVwKHBvcHVwXzU2M2IwOGYzMDg4NDQ4MWI5YmM4MzIwZDAzYjBiODE3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2UyYzVlZGYxYWM3NjQzYTFiOTZhOTJjODIyMGNlOGUwID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzg3NTE1ODc0MTYyMjk1LC0xMjIuNDA3NDM0OTg5NTIzXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfMTI0OWE4ZjJmNGFjNDgyZmFmMDhiMjZhMDg3NDZjNjMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfODViNTk1YWZhODY2NGY3NzgwNTc2NzViMGYwMTE4NzQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZmZiYTE0Njc4ZWM1NGUxNjlkOGM5MDg5Njc5YWNlZDcgPSAkKCc8ZGl2IGlkPSJodG1sX2ZmYmExNDY3OGVjNTRlMTY5ZDhjOTA4OTY3OWFjZWQ3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5XQVJSQU5UUzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfODViNTk1YWZhODY2NGY3NzgwNTc2NzViMGYwMTE4NzQuc2V0Q29udGVudChodG1sX2ZmYmExNDY3OGVjNTRlMTY5ZDhjOTA4OTY3OWFjZWQ3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfZTJjNWVkZjFhYzc2NDNhMWI5NmE5MmM4MjIwY2U4ZTAuYmluZFBvcHVwKHBvcHVwXzg1YjU5NWFmYTg2NjRmNzc4MDU3Njc1YjBmMDExODc0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2EzNzg4ZWIwNDVkMzQ5OWZhYTYzNjQ3ZGY4ZDQ4YmVlID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzc4NTIzMzc3NjAzMiwtMTIyLjQwMzQ2NDA4MDAzM10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzEyNDlhOGYyZjRhYzQ4MmZhZjA4YjI2YTA4NzQ2YzYzKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzU0MmU0NGYyZDRmZTRjNzRhZjhlZDc1M2FiM2U3NjZhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzgyMTkxYTcwMjVmOTRlZmM4MTI2NjgwZDUwM2Y0ODA3ID0gJCgnPGRpdiBpZD0iaHRtbF84MjE5MWE3MDI1Zjk0ZWZjODEyNjY4MGQ1MDNmNDgwNyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UFJPU1RJVFVUSU9OPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81NDJlNDRmMmQ0ZmU0Yzc0YWY4ZWQ3NTNhYjNlNzY2YS5zZXRDb250ZW50KGh0bWxfODIxOTFhNzAyNWY5NGVmYzgxMjY2ODBkNTAzZjQ4MDcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9hMzc4OGViMDQ1ZDM0OTlmYWE2MzY0N2RmOGQ0OGJlZS5iaW5kUG9wdXAocG9wdXBfNTQyZTQ0ZjJkNGZlNGM3NGFmOGVkNzUzYWIzZTc2NmEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfMTJjZTA3OWRjMWI3NGI4MWE0NWQ3NDQyZDA5OTY5MmIgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43Nzg1MjMzNzc2MDMyLC0xMjIuNDAzNDY0MDgwMDMzXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfMTI0OWE4ZjJmNGFjNDgyZmFmMDhiMjZhMDg3NDZjNjMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMWMxOGM0OTU1Njk1NGZiYTliNTZkMGRhYjhkMTBjMDAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNjRkNjU2YjZhMzM0NGYzMWEyOThmOWE1M2RjMTNhZDcgPSAkKCc8ZGl2IGlkPSJodG1sXzY0ZDY1NmI2YTMzNDRmMzFhMjk4ZjlhNTNkYzEzYWQ3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5PVEhFUiBPRkZFTlNFUzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMWMxOGM0OTU1Njk1NGZiYTliNTZkMGRhYjhkMTBjMDAuc2V0Q29udGVudChodG1sXzY0ZDY1NmI2YTMzNDRmMzFhMjk4ZjlhNTNkYzEzYWQ3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMTJjZTA3OWRjMWI3NGI4MWE0NWQ3NDQyZDA5OTY5MmIuYmluZFBvcHVwKHBvcHVwXzFjMThjNDk1NTY5NTRmYmE5YjU2ZDBkYWI4ZDEwYzAwKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzhmYzE0ZDc3OGYwZDRjMjg5OGEwMGI1N2ViOWE4ZTk1ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzczMjkxODA2OTAyOTk2LC0xMjIuNDM2NjE0MTgxMzMxMDFdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF8xMjQ5YThmMmY0YWM0ODJmYWYwOGIyNmEwODc0NmM2Myk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9jZDQ4MjE1MzU5NGQ0NDViODQ3NjRlMGRkMTIwMzdlMyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mOTkyMjI4ZDAzMWY0MmJmOTA4MmU2N2UyYWQxNTMwNCA9ICQoJzxkaXYgaWQ9Imh0bWxfZjk5MjIyOGQwMzFmNDJiZjkwODJlNjdlMmFkMTUzMDQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk5PTi1DUklNSU5BTDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfY2Q0ODIxNTM1OTRkNDQ1Yjg0NzY0ZTBkZDEyMDM3ZTMuc2V0Q29udGVudChodG1sX2Y5OTIyMjhkMDMxZjQyYmY5MDgyZTY3ZTJhZDE1MzA0KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfOGZjMTRkNzc4ZjBkNGMyODk4YTAwYjU3ZWI5YThlOTUuYmluZFBvcHVwKHBvcHVwX2NkNDgyMTUzNTk0ZDQ0NWI4NDc2NGUwZGQxMjAzN2UzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2I3MWYzYmNjNjYwMTRlOWRiYWY1MzUwMzdhOTUyN2M2ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzgwNTI3NTc4NTA5LC0xMjIuMzk2ODQ5MDE1MTcyMDFdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF8xMjQ5YThmMmY0YWM0ODJmYWYwOGIyNmEwODc0NmM2Myk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lMDM4YTdlOTczZDA0MWUyYjgxMDNlOTQwZTc4MWQ3ZSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF80NDU2NjMyZjIwOGY0ZmIxYWI4ZjY2ZDhlMmY5NTkxMiA9ICQoJzxkaXYgaWQ9Imh0bWxfNDQ1NjYzMmYyMDhmNGZiMWFiOGY2NmQ4ZTJmOTU5MTIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkRSVUcvTkFSQ09USUM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2UwMzhhN2U5NzNkMDQxZTJiODEwM2U5NDBlNzgxZDdlLnNldENvbnRlbnQoaHRtbF80NDU2NjMyZjIwOGY0ZmIxYWI4ZjY2ZDhlMmY5NTkxMik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2I3MWYzYmNjNjYwMTRlOWRiYWY1MzUwMzdhOTUyN2M2LmJpbmRQb3B1cChwb3B1cF9lMDM4YTdlOTczZDA0MWUyYjgxMDNlOTQwZTc4MWQ3ZSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl80MTExZTA5NjAyZTM0NmE2OGRjMGU1ODBlZTJiY2ZjMSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc4MDUyNzU3ODUwOSwtMTIyLjM5Njg0OTAxNTE3MjAxXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfMTI0OWE4ZjJmNGFjNDgyZmFmMDhiMjZhMDg3NDZjNjMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfN2RkMjI1Mzk4NTg1NDFhZGJmZmQ5ZWIyYzVkODFhZjYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMmU4MTAyMmQ0ZGNlNDIwZGJmNThlMzdhYTY0MjQ5ODQgPSAkKCc8ZGl2IGlkPSJodG1sXzJlODEwMjJkNGRjZTQyMGRiZjU4ZTM3YWE2NDI0OTg0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5XQVJSQU5UUzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfN2RkMjI1Mzk4NTg1NDFhZGJmZmQ5ZWIyYzVkODFhZjYuc2V0Q29udGVudChodG1sXzJlODEwMjJkNGRjZTQyMGRiZjU4ZTM3YWE2NDI0OTg0KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfNDExMWUwOTYwMmUzNDZhNjhkYzBlNTgwZWUyYmNmYzEuYmluZFBvcHVwKHBvcHVwXzdkZDIyNTM5ODU4NTQxYWRiZmZkOWViMmM1ZDgxYWY2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2UzYTk2NjRjOWIzODRhYjVhYjYyYjEwNTg4ZDVhNDZlID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzI4NDE4MDcwNjYwMjA0LC0xMjIuNDUwMDAwNzkwNDQ1XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfMTI0OWE4ZjJmNGFjNDgyZmFmMDhiMjZhMDg3NDZjNjMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYmEzZjY2NzY2YjUwNDU0NmIwMWYyZDAwYmIyZjA4MWIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNGU0ZGFlYjFmMWM1NGVjODgwNzk0NGZhMWZlOTZkOGUgPSAkKCc8ZGl2IGlkPSJodG1sXzRlNGRhZWIxZjFjNTRlYzg4MDc5NDRmYTFmZTk2ZDhlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5MQVJDRU5ZL1RIRUZUPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iYTNmNjY3NjZiNTA0NTQ2YjAxZjJkMDBiYjJmMDgxYi5zZXRDb250ZW50KGh0bWxfNGU0ZGFlYjFmMWM1NGVjODgwNzk0NGZhMWZlOTZkOGUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9lM2E5NjY0YzliMzg0YWI1YWI2MmIxMDU4OGQ1YTQ2ZS5iaW5kUG9wdXAocG9wdXBfYmEzZjY2NzY2YjUwNDU0NmIwMWYyZDAwYmIyZjA4MWIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfMGJlMmM5YmM3NjcxNGM4OThkN2RmZDllZjkzNTc3OGUgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43MjkyMTE0NjQ3MzU5LC0xMjIuNDAwODM0MjgzMDMxXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfMTI0OWE4ZjJmNGFjNDgyZmFmMDhiMjZhMDg3NDZjNjMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYTMzYzE3NTU0ZTY1NGM0NjgzMmUxNGZkNTc1Yjg2ZWIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOTMzMjBlMTM1MDU3NDQ0ZmIwMzFhZmU5ZTBiOGU1ZGQgPSAkKCc8ZGl2IGlkPSJodG1sXzkzMzIwZTEzNTA1NzQ0NGZiMDMxYWZlOWUwYjhlNWRkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5PVEhFUiBPRkZFTlNFUzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYTMzYzE3NTU0ZTY1NGM0NjgzMmUxNGZkNTc1Yjg2ZWIuc2V0Q29udGVudChodG1sXzkzMzIwZTEzNTA1NzQ0NGZiMDMxYWZlOWUwYjhlNWRkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMGJlMmM5YmM3NjcxNGM4OThkN2RmZDllZjkzNTc3OGUuYmluZFBvcHVwKHBvcHVwX2EzM2MxNzU1NGU2NTRjNDY4MzJlMTRmZDU3NWI4NmViKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzA3NjgyNDFhYmJjNjRkY2Q5NjU1Yjg0ZjM3ODEzZjhlID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzg4MDA2NTMyNDM5MjA1LC0xMjIuMzk5ODAyMTQ1Nzk5XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfMTI0OWE4ZjJmNGFjNDgyZmFmMDhiMjZhMDg3NDZjNjMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNTdhYWI5Y2MwOTg0NDUxYWE0OWViZDE2OTExMDQzMTAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYzVkNTAxM2RkMTc3NDZkOGFhNjZiYTkzZmUwNDVlMzggPSAkKCc8ZGl2IGlkPSJodG1sX2M1ZDUwMTNkZDE3NzQ2ZDhhYTY2YmE5M2ZlMDQ1ZTM4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5MQVJDRU5ZL1RIRUZUPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81N2FhYjljYzA5ODQ0NTFhYTQ5ZWJkMTY5MTEwNDMxMC5zZXRDb250ZW50KGh0bWxfYzVkNTAxM2RkMTc3NDZkOGFhNjZiYTkzZmUwNDVlMzgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8wNzY4MjQxYWJiYzY0ZGNkOTY1NWI4NGYzNzgxM2Y4ZS5iaW5kUG9wdXAocG9wdXBfNTdhYWI5Y2MwOTg0NDUxYWE0OWViZDE2OTExMDQzMTApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfNzIwM2Q2ZGY0OTRlNDQzZDkzMWFkNzMwNWJlY2IyNTcgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43MjM5NzQ4MjQxNjA5LC0xMjIuMzk0OTI4NDc1OF0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzEyNDlhOGYyZjRhYzQ4MmZhZjA4YjI2YTA4NzQ2YzYzKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzMxNzI2OTc3MzczNjQyODA5ODQ1MzEzOWJiMWQ5NWNhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzEzMGE4ODk3ODRmODRkMTE4OTA2YTc0OTVkZGE2ZDUwID0gJCgnPGRpdiBpZD0iaHRtbF8xMzBhODg5Nzg0Zjg0ZDExODkwNmE3NDk1ZGRhNmQ1MCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U0VDT05EQVJZIENPREVTPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zMTcyNjk3NzM3MzY0MjgwOTg0NTMxMzliYjFkOTVjYS5zZXRDb250ZW50KGh0bWxfMTMwYTg4OTc4NGY4NGQxMTg5MDZhNzQ5NWRkYTZkNTApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl83MjAzZDZkZjQ5NGU0NDNkOTMxYWQ3MzA1YmVjYjI1Ny5iaW5kUG9wdXAocG9wdXBfMzE3MjY5NzczNzM2NDI4MDk4NDUzMTM5YmIxZDk1Y2EpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfY2MzZmMyMTkyMWEwNGJmZWE3ODYzNGE3N2EyZGFkMmQgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43MjM5NzQ4MjQxNjA5LC0xMjIuMzk0OTI4NDc1OF0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzEyNDlhOGYyZjRhYzQ4MmZhZjA4YjI2YTA4NzQ2YzYzKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzk1ZGIwMTkzZTgyMjRhMDlhMDZjY2E5YTgwZmE2YTdlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzE1NDhmYjc3YzYwZDRkNmE4N2EwMGZmYTUxNjFjNTRjID0gJCgnPGRpdiBpZD0iaHRtbF8xNTQ4ZmI3N2M2MGQ0ZDZhODdhMDBmZmE1MTYxYzU0YyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U1VTUElDSU9VUyBPQ0M8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzk1ZGIwMTkzZTgyMjRhMDlhMDZjY2E5YTgwZmE2YTdlLnNldENvbnRlbnQoaHRtbF8xNTQ4ZmI3N2M2MGQ0ZDZhODdhMDBmZmE1MTYxYzU0Yyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2NjM2ZjMjE5MjFhMDRiZmVhNzg2MzRhNzdhMmRhZDJkLmJpbmRQb3B1cChwb3B1cF85NWRiMDE5M2U4MjI0YTA5YTA2Y2NhOWE4MGZhNmE3ZSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl82ZGIzZDdmMGRmZTA0MGFjYmI1N2RjYzNhNmM5MmEyZSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjcyMzk3NDgyNDE2MDksLTEyMi4zOTQ5Mjg0NzU4XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfMTI0OWE4ZjJmNGFjNDgyZmFmMDhiMjZhMDg3NDZjNjMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYTNkNDM3NDg5YzNlNDhhNDg5ZjE2Zjk0OTJjYWYyNzQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfODUyMjAyNTZkNjdlNGIxMTk2ZmE5M2ViMDY5MGFhN2MgPSAkKCc8ZGl2IGlkPSJodG1sXzg1MjIwMjU2ZDY3ZTRiMTE5NmZhOTNlYjA2OTBhYTdjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5PVEhFUiBPRkZFTlNFUzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYTNkNDM3NDg5YzNlNDhhNDg5ZjE2Zjk0OTJjYWYyNzQuc2V0Q29udGVudChodG1sXzg1MjIwMjU2ZDY3ZTRiMTE5NmZhOTNlYjA2OTBhYTdjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfNmRiM2Q3ZjBkZmUwNDBhY2JiNTdkY2MzYTZjOTJhMmUuYmluZFBvcHVwKHBvcHVwX2EzZDQzNzQ4OWMzZTQ4YTQ4OWYxNmY5NDkyY2FmMjc0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzJiNzFlNjY5ZDUyMjQwZDY5NDE1MDM1Y2Q3M2ExYmM0ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzg4MzIzNTQ0OTkwNCwtMTIyLjQxMTg1NzAzMjU0XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfMTI0OWE4ZjJmNGFjNDgyZmFmMDhiMjZhMDg3NDZjNjMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMDE1N2MzOWJlZGQ4NDNjMTk0N2Y0ZDQzMzI0NGRkZWQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfM2E2ZjBmYjg0MTViNDIzYzhlNzhmMWFjM2EwNmQyNjIgPSAkKCc8ZGl2IGlkPSJodG1sXzNhNmYwZmI4NDE1YjQyM2M4ZTc4ZjFhYzNhMDZkMjYyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5MQVJDRU5ZL1RIRUZUPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wMTU3YzM5YmVkZDg0M2MxOTQ3ZjRkNDMzMjQ0ZGRlZC5zZXRDb250ZW50KGh0bWxfM2E2ZjBmYjg0MTViNDIzYzhlNzhmMWFjM2EwNmQyNjIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8yYjcxZTY2OWQ1MjI0MGQ2OTQxNTAzNWNkNzNhMWJjNC5iaW5kUG9wdXAocG9wdXBfMDE1N2MzOWJlZGQ4NDNjMTk0N2Y0ZDQzMzI0NGRkZWQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfNGZjOGRlNTIxZGVmNGRhZTgxMWM3YzcxNjZlNTA1Y2MgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NTU5OTc3MzM5ODU2LC0xMjIuNDA5NDM1NjE3MTA2XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfMTI0OWE4ZjJmNGFjNDgyZmFmMDhiMjZhMDg3NDZjNjMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNzJjNWUxM2Y3MDZkNDBkNWFjZGM4ODYzNGI2OGRiMDAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYTEyNjYzZTkwMGU2NGJkMjk3ODZhZTBkMTU1NjhkMTQgPSAkKCc8ZGl2IGlkPSJodG1sX2ExMjY2M2U5MDBlNjRiZDI5Nzg2YWUwZDE1NTY4ZDE0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5PVEhFUiBPRkZFTlNFUzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNzJjNWUxM2Y3MDZkNDBkNWFjZGM4ODYzNGI2OGRiMDAuc2V0Q29udGVudChodG1sX2ExMjY2M2U5MDBlNjRiZDI5Nzg2YWUwZDE1NTY4ZDE0KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfNGZjOGRlNTIxZGVmNGRhZTgxMWM3YzcxNjZlNTA1Y2MuYmluZFBvcHVwKHBvcHVwXzcyYzVlMTNmNzA2ZDQwZDVhY2RjODg2MzRiNjhkYjAwKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2E4ZWJkZTNlYzdjOTRlYTQ5MjU5YzExN2Q4OTgwMzQzID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzg3MDc5ODE0NDQ0MywtMTIyLjQyNTg4MzM1ODE0OF0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzEyNDlhOGYyZjRhYzQ4MmZhZjA4YjI2YTA4NzQ2YzYzKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2FjY2NhMDhjODQ1MDQ4YWVhMzg1ODg2NDY5MzFhMTBiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzg2Mjc3MTYwMWM4ZjQ5NTY4ZmVjZDk1MzNhZTIxMzkxID0gJCgnPGRpdiBpZD0iaHRtbF84NjI3NzE2MDFjOGY0OTU2OGZlY2Q5NTMzYWUyMTM5MSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Tk9OLUNSSU1JTkFMPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hY2NjYTA4Yzg0NTA0OGFlYTM4NTg4NjQ2OTMxYTEwYi5zZXRDb250ZW50KGh0bWxfODYyNzcxNjAxYzhmNDk1NjhmZWNkOTUzM2FlMjEzOTEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9hOGViZGUzZWM3Yzk0ZWE0OTI1OWMxMTdkODk4MDM0My5iaW5kUG9wdXAocG9wdXBfYWNjY2EwOGM4NDUwNDhhZWEzODU4ODY0NjkzMWExMGIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfY2JlZjE3ZWJhM2I1NDQyNTgwZWQxYWQ1ZDUwYzNmZjUgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43MzYwMzc0NDY2ODYyMDQsLTEyMi40MTUxMjY1NDMwMDEwMV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzEyNDlhOGYyZjRhYzQ4MmZhZjA4YjI2YTA4NzQ2YzYzKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzAxMzJiNWE4ZTA5MTQ3NDY5NTgxZjI3YTE3OTY3ZmUxID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2NmYmEwMzNmODgxMDQ5Njg5MDFkOGM3NTBmOGU5NjNhID0gJCgnPGRpdiBpZD0iaHRtbF9jZmJhMDMzZjg4MTA0OTY4OTAxZDhjNzUwZjhlOTYzYSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Tk9OLUNSSU1JTkFMPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wMTMyYjVhOGUwOTE0NzQ2OTU4MWYyN2ExNzk2N2ZlMS5zZXRDb250ZW50KGh0bWxfY2ZiYTAzM2Y4ODEwNDk2ODkwMWQ4Yzc1MGY4ZTk2M2EpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9jYmVmMTdlYmEzYjU0NDI1ODBlZDFhZDVkNTBjM2ZmNS5iaW5kUG9wdXAocG9wdXBfMDEzMmI1YThlMDkxNDc0Njk1ODFmMjdhMTc5NjdmZTEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfNzYwYmUwNWZjYmUyNDIwZmJiMDRiN2I0ZWJhOTkwZDAgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43MTI3Njc4ODQ4MjEsLTEyMi40MzE5MjgwMTEwODldLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF8xMjQ5YThmMmY0YWM0ODJmYWYwOGIyNmEwODc0NmM2Myk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85ZTgzZGQ5NWMwNzQ0MzJhYjdiYmUwNzhhMTI4ZWEwMyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF81NDRjNDFhYzdkYzI0ODlmODhkOWM3MjMxY2Y1ZGE1MyA9ICQoJzxkaXYgaWQ9Imh0bWxfNTQ0YzQxYWM3ZGMyNDg5Zjg4ZDljNzIzMWNmNWRhNTMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk9USEVSIE9GRkVOU0VTPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85ZTgzZGQ5NWMwNzQ0MzJhYjdiYmUwNzhhMTI4ZWEwMy5zZXRDb250ZW50KGh0bWxfNTQ0YzQxYWM3ZGMyNDg5Zjg4ZDljNzIzMWNmNWRhNTMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl83NjBiZTA1ZmNiZTI0MjBmYmIwNGI3YjRlYmE5OTBkMC5iaW5kUG9wdXAocG9wdXBfOWU4M2RkOTVjMDc0NDMyYWI3YmJlMDc4YTEyOGVhMDMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfYmIyODYzOGE3ZDViNDBjOGJhYTM2Mzk0NWE0ZDBjZmYgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODk1NzEwMjU1ODYzLC0xMjIuNDAyMTYzNzEzNjE4XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfMTI0OWE4ZjJmNGFjNDgyZmFmMDhiMjZhMDg3NDZjNjMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMGMwMDA1OTU0OGVkNGJkZWFjYjQ5ZTU2ZGYxMTk4NGEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNzQzN2YyN2MyOWM5NGE4MWJhZDQzZDM1NTE0Y2VkMmQgPSAkKCc8ZGl2IGlkPSJodG1sXzc0MzdmMjdjMjljOTRhODFiYWQ0M2QzNTUxNGNlZDJkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5EUlVOS0VOTkVTUzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMGMwMDA1OTU0OGVkNGJkZWFjYjQ5ZTU2ZGYxMTk4NGEuc2V0Q29udGVudChodG1sXzc0MzdmMjdjMjljOTRhODFiYWQ0M2QzNTUxNGNlZDJkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfYmIyODYzOGE3ZDViNDBjOGJhYTM2Mzk0NWE0ZDBjZmYuYmluZFBvcHVwKHBvcHVwXzBjMDAwNTk1NDhlZDRiZGVhY2I0OWU1NmRmMTE5ODRhKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzI0OTMzNGUxMTQwYzRhMjQ4YWYxMWFhYWM4NDI1ZGZhID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzMwNzQyOTE2OTU1OSwtMTIyLjQyOTMwNjcyODM3Nl0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzEyNDlhOGYyZjRhYzQ4MmZhZjA4YjI2YTA4NzQ2YzYzKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzkwZTBiMjNhZGJiOTQ1ZmNiOTMzMDU5ODI0ZDJkOGM4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzEzZTZlZDI1NDhhMzRiOWI4OTdjMjU2MGU5ZmNjNjQ5ID0gJCgnPGRpdiBpZD0iaHRtbF8xM2U2ZWQyNTQ4YTM0YjliODk3YzI1NjBlOWZjYzY0OSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+T1RIRVIgT0ZGRU5TRVM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzkwZTBiMjNhZGJiOTQ1ZmNiOTMzMDU5ODI0ZDJkOGM4LnNldENvbnRlbnQoaHRtbF8xM2U2ZWQyNTQ4YTM0YjliODk3YzI1NjBlOWZjYzY0OSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzI0OTMzNGUxMTQwYzRhMjQ4YWYxMWFhYWM4NDI1ZGZhLmJpbmRQb3B1cChwb3B1cF85MGUwYjIzYWRiYjk0NWZjYjkzMzA1OTgyNGQyZDhjOCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl80NTkxYmY3OWYxZDY0MTk5YWFmNDZlMjc5NGExYThiMiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc4MzgzNjU1NjUzNDc5NCwtMTIyLjQxMzc5MDk3Mjc4MDk5XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfMTI0OWE4ZjJmNGFjNDgyZmFmMDhiMjZhMDg3NDZjNjMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMTgzNWMzZDc0ODM4NGRlZjg4MDY2Y2M0Y2M1NDczY2QgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZWJmNzkwMmJjZmMyNDcyMWE4ZTFkZGYwNzU3ZTUyOTMgPSAkKCc8ZGl2IGlkPSJodG1sX2ViZjc5MDJiY2ZjMjQ3MjFhOGUxZGRmMDc1N2U1MjkzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5WQU5EQUxJU008L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzE4MzVjM2Q3NDgzODRkZWY4ODA2NmNjNGNjNTQ3M2NkLnNldENvbnRlbnQoaHRtbF9lYmY3OTAyYmNmYzI0NzIxYThlMWRkZjA3NTdlNTI5Myk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzQ1OTFiZjc5ZjFkNjQxOTlhYWY0NmUyNzk0YTFhOGIyLmJpbmRQb3B1cChwb3B1cF8xODM1YzNkNzQ4Mzg0ZGVmODgwNjZjYzRjYzU0NzNjZCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl82MDQ3MjZiMDc4MzI0ZTlkOWIwZWViOWI1MzQ0ZWJkMSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjczMDc0MjkxNjk1NTksLTEyMi40MjkzMDY3MjgzNzZdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF8xMjQ5YThmMmY0YWM0ODJmYWYwOGIyNmEwODc0NmM2Myk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9jZDdkOTM5MzQ0NGM0YzAwOTk3NTY4YTM5N2IxY2JiNyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iMjcyYmUzZjgwZGE0NjBkYTA4Zjc4ODY0MjMwZWM5NCA9ICQoJzxkaXYgaWQ9Imh0bWxfYjI3MmJlM2Y4MGRhNDYwZGEwOGY3ODg2NDIzMGVjOTQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk9USEVSIE9GRkVOU0VTPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jZDdkOTM5MzQ0NGM0YzAwOTk3NTY4YTM5N2IxY2JiNy5zZXRDb250ZW50KGh0bWxfYjI3MmJlM2Y4MGRhNDYwZGEwOGY3ODg2NDIzMGVjOTQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl82MDQ3MjZiMDc4MzI0ZTlkOWIwZWViOWI1MzQ0ZWJkMS5iaW5kUG9wdXAocG9wdXBfY2Q3ZDkzOTM0NDRjNGMwMDk5NzU2OGEzOTdiMWNiYjcpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfNzhjM2RiYWFmMDJjNDM0OThkOTBlNTgwMzAzZTUyYmIgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43MzczNjIzNjA1MjEyOTYsLTEyMi40MjIwNjcxODQ5MzddLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF8xMjQ5YThmMmY0YWM0ODJmYWYwOGIyNmEwODc0NmM2Myk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8yNTYwNjFlMDcyMTM0ODZiYjVlZjE0Y2NjYWQ4NWQ3YiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zNTVkNGQyYjY0ODQ0MDVlOTk3ZmQ4MTFhODcwZTRhMyA9ICQoJzxkaXYgaWQ9Imh0bWxfMzU1ZDRkMmI2NDg0NDA1ZTk5N2ZkODExYTg3MGU0YTMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlNFQ09OREFSWSBDT0RFUzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMjU2MDYxZTA3MjEzNDg2YmI1ZWYxNGNjY2FkODVkN2Iuc2V0Q29udGVudChodG1sXzM1NWQ0ZDJiNjQ4NDQwNWU5OTdmZDgxMWE4NzBlNGEzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfNzhjM2RiYWFmMDJjNDM0OThkOTBlNTgwMzAzZTUyYmIuYmluZFBvcHVwKHBvcHVwXzI1NjA2MWUwNzIxMzQ4NmJiNWVmMTRjY2NhZDg1ZDdiKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2YxYmNkMzEyZDBjODRkNmI4NTA4MTY2YTBmOTNhM2FkID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzM3MzYyMzYwNTIxMjk2LC0xMjIuNDIyMDY3MTg0OTM3XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfMTI0OWE4ZjJmNGFjNDgyZmFmMDhiMjZhMDg3NDZjNjMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYThiZWMyOGQ3YjIyNDcwMzg3OTk3ZDg5N2U4OGMyNDAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMTRhMTVlZDY5NzY5NGY1Yjk1ZTViODVhZWVlOTM2NjAgPSAkKCc8ZGl2IGlkPSJodG1sXzE0YTE1ZWQ2OTc2OTRmNWI5NWU1Yjg1YWVlZTkzNjYwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5WQU5EQUxJU008L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2E4YmVjMjhkN2IyMjQ3MDM4Nzk5N2Q4OTdlODhjMjQwLnNldENvbnRlbnQoaHRtbF8xNGExNWVkNjk3Njk0ZjViOTVlNWI4NWFlZWU5MzY2MCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2YxYmNkMzEyZDBjODRkNmI4NTA4MTY2YTBmOTNhM2FkLmJpbmRQb3B1cChwb3B1cF9hOGJlYzI4ZDdiMjI0NzAzODc5OTdkODk3ZTg4YzI0MCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl85MzJkZjhhNTUyZjA0MDNiOTk1NDBjODA2YTBlZGE4ZiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc4NTk5ODgzMjM3OTc5NiwtMTIyLjQxMTc0NzM3MTkyNF0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzEyNDlhOGYyZjRhYzQ4MmZhZjA4YjI2YTA4NzQ2YzYzKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzdhYTI0MWRhZTc3MDQ3NjRiNjI3NDFlZDk0NzdiZGQxID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2UwYWJjNjc3M2EwZDQxNzliYjkzYjQzOGQyYjAyN2I4ID0gJCgnPGRpdiBpZD0iaHRtbF9lMGFiYzY3NzNhMGQ0MTc5YmI5M2I0MzhkMmIwMjdiOCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U1VTUElDSU9VUyBPQ0M8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzdhYTI0MWRhZTc3MDQ3NjRiNjI3NDFlZDk0NzdiZGQxLnNldENvbnRlbnQoaHRtbF9lMGFiYzY3NzNhMGQ0MTc5YmI5M2I0MzhkMmIwMjdiOCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzkzMmRmOGE1NTJmMDQwM2I5OTU0MGM4MDZhMGVkYThmLmJpbmRQb3B1cChwb3B1cF83YWEyNDFkYWU3NzA0NzY0YjYyNzQxZWQ5NDc3YmRkMSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl80NGVmZTExODFhNzU0MGJlODRlN2M5ZWI1ZmVmNTQzMSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc2MzM3NTgwNTgwNTksLTEyMi40MjA0MzQ3MjQ1NTI5OV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzEyNDlhOGYyZjRhYzQ4MmZhZjA4YjI2YTA4NzQ2YzYzKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2FiNTA3NTNmZjc3NDQ5OTdhZDdiMGYyNjAxMjgwMTc5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2M5MmM4NDAxZTEyMzQ4M2FhNDMyOGNlODU0Yzk5MzA5ID0gJCgnPGRpdiBpZD0iaHRtbF9jOTJjODQwMWUxMjM0ODNhYTQzMjhjZTg1NGM5OTMwOSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+T1RIRVIgT0ZGRU5TRVM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2FiNTA3NTNmZjc3NDQ5OTdhZDdiMGYyNjAxMjgwMTc5LnNldENvbnRlbnQoaHRtbF9jOTJjODQwMWUxMjM0ODNhYTQzMjhjZTg1NGM5OTMwOSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzQ0ZWZlMTE4MWE3NTQwYmU4NGU3YzllYjVmZWY1NDMxLmJpbmRQb3B1cChwb3B1cF9hYjUwNzUzZmY3NzQ0OTk3YWQ3YjBmMjYwMTI4MDE3OSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9lOWY4NjViNDY5YzU0YTQ2OGIwNDI0NGU2YzQxNmIwNiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc4NTAyMjY2MjI3ODYsLTEyMi40MTE5ODc2NDM1OTUwMV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzEyNDlhOGYyZjRhYzQ4MmZhZjA4YjI2YTA4NzQ2YzYzKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzlhZTAwZjg2MDI4MDQ5MTNhZmFiZWIyZmE2NjFhYzNmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzAwMGFhMzA2ZTEwNjRkM2Y5MzY3ODJhYjU0NmY1ODMxID0gJCgnPGRpdiBpZD0iaHRtbF8wMDBhYTMwNmUxMDY0ZDNmOTM2NzgyYWI1NDZmNTgzMSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Tk9OLUNSSU1JTkFMPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85YWUwMGY4NjAyODA0OTEzYWZhYmViMmZhNjYxYWMzZi5zZXRDb250ZW50KGh0bWxfMDAwYWEzMDZlMTA2NGQzZjkzNjc4MmFiNTQ2ZjU4MzEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9lOWY4NjViNDY5YzU0YTQ2OGIwNDI0NGU2YzQxNmIwNi5iaW5kUG9wdXAocG9wdXBfOWFlMDBmODYwMjgwNDkxM2FmYWJlYjJmYTY2MWFjM2YpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfN2MzNTU2ZjFmY2JiNDAxNTk0ZjliNjE3MDRlYmQwYmIgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NzQ2MjA2NDkxMDY0OTUsLTEyMi41MDAzODA0Mjc5MTVdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF8xMjQ5YThmMmY0YWM0ODJmYWYwOGIyNmEwODc0NmM2Myk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xYzg2NThkNjA2MTg0NmQ0OGIwODYxOWJkMWZlMWY3NCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mODM0ODhkMWZiOGU0Yzk2OTNjMzIwOWU0YTFmZTE5MyA9ICQoJzxkaXYgaWQ9Imh0bWxfZjgzNDg4ZDFmYjhlNGM5NjkzYzMyMDllNGExZmUxOTMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk9USEVSIE9GRkVOU0VTPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xYzg2NThkNjA2MTg0NmQ0OGIwODYxOWJkMWZlMWY3NC5zZXRDb250ZW50KGh0bWxfZjgzNDg4ZDFmYjhlNGM5NjkzYzMyMDllNGExZmUxOTMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl83YzM1NTZmMWZjYmI0MDE1OTRmOWI2MTcwNGViZDBiYi5iaW5kUG9wdXAocG9wdXBfMWM4NjU4ZDYwNjE4NDZkNDhiMDg2MTliZDFmZTFmNzQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfMGFlZmQxNzg0ZjMzNDRlNDgzYjY5MjI2ZDhjMTZjZDUgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NzUxOTE4MjY3MjE3LC0xMjIuNDY2NTU4NzgwNjgzXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXBfMTI0OWE4ZjJmNGFjNDgyZmFmMDhiMjZhMDg3NDZjNjMpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMmY0NTZhOWUyN2U2NDY4OWFkODRmODc2ZjY1MzVjMzMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMjIzZmU0MWY5NjkxNDJiMWIwMmMzZWNlNzhlYTFhZDIgPSAkKCc8ZGl2IGlkPSJodG1sXzIyM2ZlNDFmOTY5MTQyYjFiMDJjM2VjZTc4ZWExYWQyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5ST0JCRVJZPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yZjQ1NmE5ZTI3ZTY0Njg5YWQ4NGY4NzZmNjUzNWMzMy5zZXRDb250ZW50KGh0bWxfMjIzZmU0MWY5NjkxNDJiMWIwMmMzZWNlNzhlYTFhZDIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8wYWVmZDE3ODRmMzM0NGU0ODNiNjkyMjZkOGMxNmNkNS5iaW5kUG9wdXAocG9wdXBfMmY0NTZhOWUyN2U2NDY4OWFkODRmODc2ZjY1MzVjMzMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfZjgwYTNlMmJjOWYyNGYyZmE4NmNjZjA3ZDExNTljYjUgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NDkwODQxNzI5MDI4LC0xMjIuNDg2OTI1OTYwMTE0MDFdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF8xMjQ5YThmMmY0YWM0ODJmYWYwOGIyNmEwODc0NmM2Myk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hYTM4YTVlNDY2ZmI0MTVhYTkwYmJmNzAyODI4N2U1ZSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wOWQ4ZWZkYTkxOWE0NDkxODI2MGIzZGM1ZTUwNGViYiA9ICQoJzxkaXYgaWQ9Imh0bWxfMDlkOGVmZGE5MTlhNDQ5MTgyNjBiM2RjNWU1MDRlYmIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk9USEVSIE9GRkVOU0VTPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hYTM4YTVlNDY2ZmI0MTVhYTkwYmJmNzAyODI4N2U1ZS5zZXRDb250ZW50KGh0bWxfMDlkOGVmZGE5MTlhNDQ5MTgyNjBiM2RjNWU1MDRlYmIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9mODBhM2UyYmM5ZjI0ZjJmYTg2Y2NmMDdkMTE1OWNiNS5iaW5kUG9wdXAocG9wdXBfYWEzOGE1ZTQ2NmZiNDE1YWE5MGJiZjcwMjgyODdlNWUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfYmYyM2JkYjA4M2U0NDUwMjkxYjI4MWRiZTc2Zjc1YjEgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43Njg1MzYwMTIzNTgzLC0xMjIuNDE1NjE2MzM4MzE5OTldLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF8xMjQ5YThmMmY0YWM0ODJmYWYwOGIyNmEwODc0NmM2Myk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85NjU1YTQ1YWM3NGU0YTQxYjVhZDY5MDljMjM1Nzg4NyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hMTdjOGZiMDc4NTU0NTEzOTVmNTlmNTI5NzlhOGQyNiA9ICQoJzxkaXYgaWQ9Imh0bWxfYTE3YzhmYjA3ODU1NDUxMzk1ZjU5ZjUyOTc5YThkMjYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk5PTi1DUklNSU5BTDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOTY1NWE0NWFjNzRlNGE0MWI1YWQ2OTA5YzIzNTc4ODcuc2V0Q29udGVudChodG1sX2ExN2M4ZmIwNzg1NTQ1MTM5NWY1OWY1Mjk3OWE4ZDI2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfYmYyM2JkYjA4M2U0NDUwMjkxYjI4MWRiZTc2Zjc1YjEuYmluZFBvcHVwKHBvcHVwXzk2NTVhNDVhYzc0ZTRhNDFiNWFkNjkwOWMyMzU3ODg3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2VhZGYxZWQ3MDRiOTRkMmRhY2UxMzJkNGI2OTIzY2QwID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzY0NDI5NzcxNDA3NCwtMTIyLjQ0OTc1MTY1MjU2M10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzEyNDlhOGYyZjRhYzQ4MmZhZjA4YjI2YTA4NzQ2YzYzKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzYyZjllZjI1YmQ2MDRiZDI4OWFjMzQzMTgyMjExZGQ4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzhiNGNhNjViNzRhNzQyM2Y4YWM0OGMwYjE2YWE4OGFlID0gJCgnPGRpdiBpZD0iaHRtbF84YjRjYTY1Yjc0YTc0MjNmOGFjNDhjMGIxNmFhODhhZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QlVSR0xBUlk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzYyZjllZjI1YmQ2MDRiZDI4OWFjMzQzMTgyMjExZGQ4LnNldENvbnRlbnQoaHRtbF84YjRjYTY1Yjc0YTc0MjNmOGFjNDhjMGIxNmFhODhhZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2VhZGYxZWQ3MDRiOTRkMmRhY2UxMzJkNGI2OTIzY2QwLmJpbmRQb3B1cChwb3B1cF82MmY5ZWYyNWJkNjA0YmQyODlhYzM0MzE4MjIxMWRkOCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9hNTJjZDJhMWM5OWM0MzFmYmUxYzMzZTQ4NmVkYzljMiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc2NDQyOTc3MTQwNzQsLTEyMi40NDk3NTE2NTI1NjNdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcF8xMjQ5YThmMmY0YWM0ODJmYWYwOGIyNmEwODc0NmM2Myk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9kZTNjYTRhNGNiYmI0NmMyYWJkNThmM2UzY2Y0ZGU0YiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iYjg1NDA2YzJhMzM0NzRiOGNkMjVlMjE3NGY0ZWZhYSA9ICQoJzxkaXYgaWQ9Imh0bWxfYmI4NTQwNmMyYTMzNDc0YjhjZDI1ZTIxNzRmNGVmYWEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkxBUkNFTlkvVEhFRlQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2RlM2NhNGE0Y2JiYjQ2YzJhYmQ1OGYzZTNjZjRkZTRiLnNldENvbnRlbnQoaHRtbF9iYjg1NDA2YzJhMzM0NzRiOGNkMjVlMjE3NGY0ZWZhYSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2E1MmNkMmExYzk5YzQzMWZiZTFjMzNlNDg2ZWRjOWMyLmJpbmRQb3B1cChwb3B1cF9kZTNjYTRhNGNiYmI0NmMyYWJkNThmM2UzY2Y0ZGU0Yik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl80ZjM3ZGU1NGQ4NWE0ZjY1YWRjYzJlOGU3NjJlNDk3YSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjczNTI2ODE0NjkwODM5NiwtMTIyLjQ3MjcxNTc1OTYzMV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFwXzEyNDlhOGYyZjRhYzQ4MmZhZjA4YjI2YTA4NzQ2YzYzKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzM4NGFkZTY0ZDNlNTQ0NWJhNGE0YmIxNGU3MDFiNzY3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzAyMmNkNmY4MGViMTQ4OTI5MDliNjAzYjg0Zjc2ZWY2ID0gJCgnPGRpdiBpZD0iaHRtbF8wMjJjZDZmODBlYjE0ODkyOTA5YjYwM2I4NGY3NmVmNiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TEFSQ0VOWS9USEVGVDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMzg0YWRlNjRkM2U1NDQ1YmE0YTRiYjE0ZTcwMWI3Njcuc2V0Q29udGVudChodG1sXzAyMmNkNmY4MGViMTQ4OTI5MDliNjAzYjg0Zjc2ZWY2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfNGYzN2RlNTRkODVhNGY2NWFkY2MyZThlNzYyZTQ5N2EuYmluZFBvcHVwKHBvcHVwXzM4NGFkZTY0ZDNlNTQ0NWJhNGE0YmIxNGU3MDFiNzY3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBmZWF0dXJlX2dyb3VwXzE4NmU0YjUzN2Y5MzQxMWZhN2UwYWNkNWU0NjMxMDNkID0gTC5mZWF0dXJlR3JvdXAoCiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8xMjQ5YThmMmY0YWM0ODJmYWYwOGIyNmEwODc0NmM2Myk7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfODk5ODhjMzc4MWRmNDcxMDlmODc0ZDE5MzhjYTM1MzMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NzU0MjA3MDY3MTEsLTEyMi40MDM0MDQ3OTE0Nzg5OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF8xODZlNGI1MzdmOTM0MTFmYTdlMGFjZDVlNDYzMTAzZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzIxNGVlN2IwYzkyNTRlNDU4MTM0NzBhMDUyNWIwNmE5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzc1NDIwNzA2NzExLC0xMjIuNDAzNDA0NzkxNDc4OTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfMTg2ZTRiNTM3ZjkzNDExZmE3ZTBhY2Q1ZTQ2MzEwM2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8wZWEyOWFlNjczMmQ0MzU2OTNiMjU2ZWQ1NDdlYTY1ZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjcyOTk4MDk2NzI5OTU5NiwtMTIyLjM4ODg1NjIwNDI5Ml0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF8xODZlNGI1MzdmOTM0MTFmYTdlMGFjZDVlNDYzMTAzZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzIyOWIyZjNmYmFmOTQxYmY4YjkxM2Q2MGQ1MjA4ZTE1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzg1Nzg4Mzc2Njg4NzksLTEyMi40MTI5NzA1Mzc1OTFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfMTg2ZTRiNTM3ZjkzNDExZmE3ZTBhY2Q1ZTQ2MzEwM2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9kYzk5YTE1Nzc3ZTY0YmFiOWMyMjMzOGQxMjc2MDA1MSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc2NTA1MDEyMTQ2NjgsLTEyMi40MTk2NzE3ODAyOTZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfMTg2ZTRiNTM3ZjkzNDExZmE3ZTBhY2Q1ZTQ2MzEwM2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl80MmE3ZmQyYWJjYWM0M2MxOTVjYTEzMmQyYThiMDZmNiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc4ODAxODU1NTgyOSwtMTIyLjQyNjA3NzE3NzM3NDk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzE4NmU0YjUzN2Y5MzQxMWZhN2UwYWNkNWU0NjMxMDNkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMzNmNzE0ZTZhY2ZmNDI2NTg3ODBiODMxNjQ1MDVhZDYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODA4Nzg5MzYwMjE0LC0xMjIuNDA1NzIxNDU0NTY3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzE4NmU0YjUzN2Y5MzQxMWZhN2UwYWNkNWU0NjMxMDNkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMTIyNDI1ZDc4ZmFkNGUxZDg1ZmI4Y2RlMTg5ZjcxNTggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODM5ODA1NTkyNjM0LC0xMjIuNDExNzc4Mjk1OTkyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzE4NmU0YjUzN2Y5MzQxMWZhN2UwYWNkNWU0NjMxMDNkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNmMxMDEzZjk2YjczNDA2ODg5YmRhNTFkNDQwMDBmNjQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NzU3ODc2MjE4MjkyOTUsLTEyMi4zOTMzNTcyNDE0NTFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfMTg2ZTRiNTM3ZjkzNDExZmE3ZTBhY2Q1ZTQ2MzEwM2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lMWE3NzY4YWU1M2E0YWIzOTMyMDc5OTM4NjlmMGVlMyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjcyMDk2Njk2MTU0OTksLTEyMi4zODcxODE2MzU5OTVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfMTg2ZTRiNTM3ZjkzNDExZmE3ZTBhY2Q1ZTQ2MzEwM2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9kNzA2YmUxODhjMmI0NTEzYWRlNDE3MDU0ZTZhMjgyZiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc2NDQ3ODE1Nzg2OTUwNSwtMTIyLjQ3NzM3NjUyNDAwMjk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzE4NmU0YjUzN2Y5MzQxMWZhN2UwYWNkNWU0NjMxMDNkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYjUzOGZlMWRiMzYzNDY3MTliYTVjYzg1ZjYwM2ZiNDUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NDU3Mzg5NDI5NjU0OTUsLTEyMi40Nzc5NjAzMjcyOTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfMTg2ZTRiNTM3ZjkzNDExZmE3ZTBhY2Q1ZTQ2MzEwM2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mZGY3N2NlODIyOGI0YTAyOTA2ODlhNDRkMmU1OTJlMyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjczNTY5NzAyNzU0ODIwNiwtMTIyLjM3Njc1NzY1NTUzMDAxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzE4NmU0YjUzN2Y5MzQxMWZhN2UwYWNkNWU0NjMxMDNkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZThlNTc3YTdkYTQ3NDQxZGE2NDQxNTI4ZDg3ZTFlZTggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43MjkyNzA1MTk5NTkyLC0xMjIuNDMyMzI1ODcxMDI4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzE4NmU0YjUzN2Y5MzQxMWZhN2UwYWNkNWU0NjMxMDNkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYmI2NDhjMWQwOTgxNGVhYTgwMGM4M2U0ZDI5N2UxMmMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43OTE2NDI5ODIzODQsLTEyMi40MDA5MDg2OTg4ODk5OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF8xODZlNGI1MzdmOTM0MTFmYTdlMGFjZDVlNDYzMTAzZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzk3MDJmY2ZlY2MxZjQ3MDlhNTQ4Y2M5ZjM0MzJiMGUxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzgzNzA2OTMwMTU0NSwtMTIyLjQwODU5NTExMDg2OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF8xODZlNGI1MzdmOTM0MTFmYTdlMGFjZDVlNDYzMTAzZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2JkZDQ1N2FmNWY0NzQyM2ZhNjM5ZTg3NmUzYjc3NmM5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzU3Mjg5NTkwNDU3Nzk1LC0xMjIuNDA2ODcwNDAyMDgyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzE4NmU0YjUzN2Y5MzQxMWZhN2UwYWNkNWU0NjMxMDNkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYTQxNTkyYmM1MjZmNGQ2OGFlYjQ3MmUwMTM0MWRjMTYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NDg5MDYzMDUxODI5LC0xMjIuNDIwMzU0NzgwODYwOTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfMTg2ZTRiNTM3ZjkzNDExZmE3ZTBhY2Q1ZTQ2MzEwM2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8zMjc2YWNhMmU4NjA0NTM3OGU2MjJjYWQzNzcyYzE0OSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjcxNTc2NTQyNjk5NSwtMTIyLjQzOTkwOTc2Njc3Ml0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF8xODZlNGI1MzdmOTM0MTFmYTdlMGFjZDVlNDYzMTAzZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzUxYzkwNzU5YmI0ZDQ2Njk4ZDQ2YjkxNWE2YjE3MDQzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzgzNTY5OTM4NjkxOCwtMTIyLjQwODQyMTExNjkyMl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF8xODZlNGI1MzdmOTM0MTFmYTdlMGFjZDVlNDYzMTAzZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzRjNWE1MGUxMDRjODQwMzZiOTFiODgwNTY5ODZiYWNiID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzczNjE4NjI3NjQ1NjA0LC0xMjIuNDIyMzE1NjcwNzQ5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzE4NmU0YjUzN2Y5MzQxMWZhN2UwYWNkNWU0NjMxMDNkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNjA2NDBlODkwNzAzNDdmNDlhNDJlNDBkOGViMjMwOGMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43OTI4NDEyODQwNDQ3MDUsLTEyMi40MjQ1MTk4MzUwMDkwMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF8xODZlNGI1MzdmOTM0MTFmYTdlMGFjZDVlNDYzMTAzZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzYwOWIwNDEzOWY0NjQxNjc5MzlkODBjZTE4NDcyMzkwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzU0MDk4Njg4MjA2Nzk1LC0xMjIuNDE0MjMzODQ5MDM3OThdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfMTg2ZTRiNTM3ZjkzNDExZmE3ZTBhY2Q1ZTQ2MzEwM2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lY2M0YWRmYjRjZGQ0OGZlYjg4NzExZGM2ZDNjZGM2ZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc1NDA5ODY4ODIwNjc5NSwtMTIyLjQxNDIzMzg0OTAzNzk4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzE4NmU0YjUzN2Y5MzQxMWZhN2UwYWNkNWU0NjMxMDNkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNDczOWJhYzBiYWQ5NDVkNjhmMmU2ZDMyODRkZmQyNjEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NzE0OTM5OTY5NDE2LC0xMjIuNTA3NzUwMTMxMDA0MDJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfMTg2ZTRiNTM3ZjkzNDExZmE3ZTBhY2Q1ZTQ2MzEwM2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jZjQ5MzZjNDQ3ZWE0ZjU0OWVkMjg5YWY5NDBkMzI5YyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjcxODMwMjIwNDc2NjAwNSwtMTIyLjQ3NDQ0NDYzOTU5NDk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzE4NmU0YjUzN2Y5MzQxMWZhN2UwYWNkNWU0NjMxMDNkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNDExMjk3ODdkZmE4NDFjZmE5NjhlN2M5YzgxZDUxOGMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NjQ1NzUyMzE3NjE1LC0xMjIuNDI3NTYyNTk2OTg1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzE4NmU0YjUzN2Y5MzQxMWZhN2UwYWNkNWU0NjMxMDNkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNzJiOWI0ZjMyYzdiNDFjMTgzNTc4OWNkY2Q5ZDk1ZjkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODc0Mzc4MzA5MTEyLC0xMjIuNDE5MjAzMDA0MjY4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzE4NmU0YjUzN2Y5MzQxMWZhN2UwYWNkNWU0NjMxMDNkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfN2QxOTBiMDg0Y2M1NDNhNzljZTdlNDUwMDIzZjBjZjUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NDkzNjg4Mjg0NTMyLC0xMjIuNDEyNjkwMTQyMzA4MDFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfMTg2ZTRiNTM3ZjkzNDExZmE3ZTBhY2Q1ZTQ2MzEwM2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xNzYzNDA0NGE5NTg0NDYyYWU1OWE5Y2E1YTNjYmIyZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjcwOTIwMTA0NjIzNzksLTEyMi40MzQ2MDkyODAzNTJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfMTg2ZTRiNTM3ZjkzNDExZmE3ZTBhY2Q1ZTQ2MzEwM2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8wNmU2NDNkNzdhNDg0M2FmYWVkZGU0NGYwMTg2ZWU5ZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc4NzkyMDkzNzU1MzI5NSwtMTIyLjQxMDg4MjgyNTU1MV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF8xODZlNGI1MzdmOTM0MTFmYTdlMGFjZDVlNDYzMTAzZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzhhZjdiMzYyOTMwYzRlNmQ4YTEwZjU4Y2RjZTMyMmE3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuODAwNDU2NjQ3MTAzODksLTEyMi40MDE0MzI3NTQ3MjIwMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF8xODZlNGI1MzdmOTM0MTFmYTdlMGFjZDVlNDYzMTAzZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzExZjE1OWQwYWYxMzQxZTBhOTk5NmYyMTkzYzNlOGYzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzQzNTU1MDU0MjI2NSwtMTIyLjQyMTEyODAyOTUwNV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF8xODZlNGI1MzdmOTM0MTFmYTdlMGFjZDVlNDYzMTAzZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzg3NDE5OTMzYzE0NTQ5NGU5MTUyNWVmNDhlOGMyMjRkID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzg2NTY0NzYwNzY4NSwtMTIyLjQwNzI0NDA4NzAzMl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF8xODZlNGI1MzdmOTM0MTFmYTdlMGFjZDVlNDYzMTAzZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzkyY2FkNmY3MjJmMTQwNTdhZDM4NmFjYWFhNTJlNzE5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzYxNTY1NTkyODA0NSwtMTIyLjQyMzgwMzAwMTkwMDk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzE4NmU0YjUzN2Y5MzQxMWZhN2UwYWNkNWU0NjMxMDNkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZGM2N2VjZjBhNzIwNDBlMzlhMWNlNjBhMGI5YTQwN2UgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NjE1NjU1OTI4MDQ1LC0xMjIuNDIzODAzMDAxOTAwOTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfMTg2ZTRiNTM3ZjkzNDExZmE3ZTBhY2Q1ZTQ2MzEwM2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl80MjQ3Nzc2NWE3OGE0ZTAyYWUwNTRlNmMyY2Y3ZjQ0OCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc0NDE5Mjc1MDg5MzIwNSwtMTIyLjQ0NDY4NTQ4MjI3M10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF8xODZlNGI1MzdmOTM0MTFmYTdlMGFjZDVlNDYzMTAzZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2Q1NTAwYjNhNjIxOTQzZjA5YWViNjgyMGI0NzZmODYyID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzc1NDY5MjgyMDA0MSwtMTIyLjQxNTc1NzAzOTE5Nl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF8xODZlNGI1MzdmOTM0MTFmYTdlMGFjZDVlNDYzMTAzZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzhiZDEyZTRiY2EwZjRjN2U4MTY3ZjQwOWM5ZWNhZmY0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzI4NTI4MDYyNzQ2NSwtMTIyLjQ3NTY0NzQ2MDc4NTk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzE4NmU0YjUzN2Y5MzQxMWZhN2UwYWNkNWU0NjMxMDNkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMjkwNWIxNWJmYjA4NGE5ZWIyNzBlODFhODcxYzU4NDMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NDI4NTE3Mzc0NDQ4OTQsLTEyMi40MjA5Njc0NDA1NjRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfMTg2ZTRiNTM3ZjkzNDExZmE3ZTBhY2Q1ZTQ2MzEwM2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jYjQzYjJlMzg3YTE0M2Q3Yjc5MmM0M2ZlM2I1MGM4ZiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc4MjExOTg0ODg5MzEsLTEyMi40MTU2Njk2NjE0NDNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfMTg2ZTRiNTM3ZjkzNDExZmE3ZTBhY2Q1ZTQ2MzEwM2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jOWNiODE5NjI0ZjU0OTRiODU1NWQwNTcxZTA3NTg3NCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc3OTE2NzQyMTg5NjMsLTEyMi40MDYzNDY0MjU2MzJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfMTg2ZTRiNTM3ZjkzNDExZmE3ZTBhY2Q1ZTQ2MzEwM2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8yNjc2MzY3ZWJkZDQ0MDViYmRhOWZlZWY1NmRlODU4OSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc2NTcxODQzOTUyODIsLTEyMi40MDk1Mjk5MTMyNzhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfMTg2ZTRiNTM3ZjkzNDExZmE3ZTBhY2Q1ZTQ2MzEwM2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl82Nzk1NDQzYzZhNjc0NmZlYTJiYzM0YzhlYjAxZDMzOCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc3NTQyMDcwNjcxMSwtMTIyLjQwMzQwNDc5MTQ3ODk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzE4NmU0YjUzN2Y5MzQxMWZhN2UwYWNkNWU0NjMxMDNkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZTU4M2NhNGVhMTQzNDBhNmJhYzQyNDQ2ZTg2MzI2ZDcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43Njc1MjQzMDg3ODMsLTEyMi40MTA3MzgwOTczMTVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfMTg2ZTRiNTM3ZjkzNDExZmE3ZTBhY2Q1ZTQ2MzEwM2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85NTc0OTJhOGZkNDU0NGRiOTc0OGQyZjE5MzVhYzAxNCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc2NzUyNDMwODc4MywtMTIyLjQxMDczODA5NzMxNV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF8xODZlNGI1MzdmOTM0MTFmYTdlMGFjZDVlNDYzMTAzZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzAwOGM0ODVkZjE5NjQwNDNiZGZmZmNjOTdkZDk3OWE5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzEzMTA4MzQzMzI2NCwtMTIyLjQ0NDMxNDAyNTE4OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF8xODZlNGI1MzdmOTM0MTFmYTdlMGFjZDVlNDYzMTAzZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2FlYWM1NmFiMGNjMDQyYWViMWZiMmZkMzAzMjU2ZTUwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzEzMTA4MzQzMzI2NCwtMTIyLjQ0NDMxNDAyNTE4OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF8xODZlNGI1MzdmOTM0MTFmYTdlMGFjZDVlNDYzMTAzZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzM3NzA3NGI5NGVjMzQzNGViNjlhYjAwYzI0M2I4NTI0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzY2MDE2MDExNDEwMywtMTIyLjQwMzY0NDYyMDQzOV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF8xODZlNGI1MzdmOTM0MTFmYTdlMGFjZDVlNDYzMTAzZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzRjNTJlOWE1NzQ1ZDQ2M2JhOWNkNzUxNWFiMWNlZTQ2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzY2MDE2MDExNDEwMywtMTIyLjQwMzY0NDYyMDQzOV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF8xODZlNGI1MzdmOTM0MTFmYTdlMGFjZDVlNDYzMTAzZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzA4NzU5YTY5NzE3NDQ5OTY5ZTAwZWVjODEzNzUyOGRlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzc2MjMxMDQwNDc1OCwtMTIyLjQxNDcxNDI5NTU3ODk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzE4NmU0YjUzN2Y5MzQxMWZhN2UwYWNkNWU0NjMxMDNkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMTBmMDFjYzk0OGUwNDQ1ZDk3NDVhNTM1NzdkMjBmODggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NzYyMzEwNDA0NzU4LC0xMjIuNDE0NzE0Mjk1NTc4OTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfMTg2ZTRiNTM3ZjkzNDExZmE3ZTBhY2Q1ZTQ2MzEwM2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85NDZmY2E2NzJlOTQ0Njc0YjZlNDM4NzhlN2ZmZjkyMyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc3NzUxMTg4OTU2OTUsLTEyMi40MTgwNDU0NTI3NjhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfMTg2ZTRiNTM3ZjkzNDExZmE3ZTBhY2Q1ZTQ2MzEwM2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mNDYzMjZkOTkwNTE0ZGZkYmY0OGM0MGRhYzE1YmMyOSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc4MjAyMzg0Nzg5NzUsLTEyMi40MDExNjE1NTU2MDJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfMTg2ZTRiNTM3ZjkzNDExZmE3ZTBhY2Q1ZTQ2MzEwM2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl84N2I3MzdmMTEyYTc0MmEzYmMyNjEyMDBjZGU5MTdmYyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjcyNzAwNTMxOTYyOTk5NSwtMTIyLjQwMzQwODY2OTE5MV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF8xODZlNGI1MzdmOTM0MTFmYTdlMGFjZDVlNDYzMTAzZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2M2NTFiM2MzMWJlMTQwMTBhMWIzMzUyOWUwNTY4M2VmID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzgzODM0NDM3NDE0MSwtMTIyLjQxMjkzMDUyMjA1OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF8xODZlNGI1MzdmOTM0MTFmYTdlMGFjZDVlNDYzMTAzZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2Q4MDk2M2IwOTlkNjQ2NWU4ZmUwYjk1MTBkMWM2M2U2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzUzMDE4NjUzNzQ0NjA0LC0xMjIuNDE4NTg3MTcyMjE5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzE4NmU0YjUzN2Y5MzQxMWZhN2UwYWNkNWU0NjMxMDNkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZGQ1YmUwODFjMDgyNGYzNmIxODliNjFiOTMxMmE1NzggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NzQwNDE4Mzg1MDQxLC0xMjIuNDE0MzcwNjI3NDk1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzE4NmU0YjUzN2Y5MzQxMWZhN2UwYWNkNWU0NjMxMDNkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNDlhMzRhMTlhYjAyNDQ4MWE1ZTgwOWY5NjRmNzEzNmYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43OTA1Mzg5OTM3MjUsLTEyMi40MDM5MTU2ODE1NzEwMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF8xODZlNGI1MzdmOTM0MTFmYTdlMGFjZDVlNDYzMTAzZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2U2YjgwMTJjMTAzMTQ2ZjBiZDQ4YWNmYjNmMTMzNDYzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzgzMDk5ODI0NDU5MjEsLTEyMi40MTkxODMwOTYzNjJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfMTg2ZTRiNTM3ZjkzNDExZmE3ZTBhY2Q1ZTQ2MzEwM2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl84NGNmMDM5Y2ZjZjM0NTJlYTZkNDRhOTI4MjQ4MjdjNyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc0MDczNjA1NDgzNTc5LC0xMjIuMzg4NzUzMDQ2OTk3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzE4NmU0YjUzN2Y5MzQxMWZhN2UwYWNkNWU0NjMxMDNkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNDY3M2RlMWMzZDIzNDQzNjgyNDk0ZjIwYTc1NGQwZWEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NzQ5OTEyOTQ0MzY2LC0xMjIuNDM3Nzk5NzAzNDY4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzE4NmU0YjUzN2Y5MzQxMWZhN2UwYWNkNWU0NjMxMDNkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYmQzODY4NmQ2ZGVlNGQ3OGFmODEwYTI3Mjg5M2ZjYWUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NzcwOTAyNzQzNjY5LC0xMjIuNDIxMzMyNjg0NjMzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzE4NmU0YjUzN2Y5MzQxMWZhN2UwYWNkNWU0NjMxMDNkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYjdjOTE2NDU3YTVjNGUwZmE5ZGRiYzlkZjkxZDA2YjQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NzcwOTAyNzQzNjY5LC0xMjIuNDIxMzMyNjg0NjMzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzE4NmU0YjUzN2Y5MzQxMWZhN2UwYWNkNWU0NjMxMDNkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZWZjNDEyMGI0Yzg2NGM5Mzk2OTljY2ZiMjAwYjkwZjYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODIyNDU4MjIzOTE3LC0xMjIuNDQ2NjEyOTc4ODM5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzE4NmU0YjUzN2Y5MzQxMWZhN2UwYWNkNWU0NjMxMDNkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZjY4NzRjOWRlNWM2NDgzZTljNDM0MzY2NGQ2MGI5ZDYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43MzAwMzc5OTk1MTI3OTUsLTEyMi40MDQ1OTQxNDA2MzRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfMTg2ZTRiNTM3ZjkzNDExZmE3ZTBhY2Q1ZTQ2MzEwM2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xZWZmZTFhNjM1YzU0MzAzODE0N2ZjOThlM2RlZDRkNyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc5NTMzMzgyNjc0MzYsLTEyMi4zOTczNzM3NDAwNjZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfMTg2ZTRiNTM3ZjkzNDExZmE3ZTBhY2Q1ZTQ2MzEwM2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8zNWUyNmViYTAzYWE0ODk1OWFiZGRkYzdjNTkwNDRiMyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc4NzUxNTg3NDE2MjI5NSwtMTIyLjQwNzQzNDk4OTUyM10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF8xODZlNGI1MzdmOTM0MTFmYTdlMGFjZDVlNDYzMTAzZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzQyNmFlZWU1MjBhNjQzMDM4YjY4YjhkYmFmZmU5NWYxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzc4NTIzMzc3NjAzMiwtMTIyLjQwMzQ2NDA4MDAzM10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF8xODZlNGI1MzdmOTM0MTFmYTdlMGFjZDVlNDYzMTAzZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzdjMGMyZDNjZTFhYjRjNjJiZTI1MGVmZjliM2YxYTZlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzc4NTIzMzc3NjAzMiwtMTIyLjQwMzQ2NDA4MDAzM10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF8xODZlNGI1MzdmOTM0MTFmYTdlMGFjZDVlNDYzMTAzZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2JjMDM0ZjNlNjY1MjQ5Mjc4NDVlMjZlYTM5NDQ2ZTI5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzczMjkxODA2OTAyOTk2LC0xMjIuNDM2NjE0MTgxMzMxMDFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfMTg2ZTRiNTM3ZjkzNDExZmE3ZTBhY2Q1ZTQ2MzEwM2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8yOGFjNDI5M2UwYTc0ZGViOThiMzExYTA2Mjg5NzBhMiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc4MDUyNzU3ODUwOSwtMTIyLjM5Njg0OTAxNTE3MjAxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzE4NmU0YjUzN2Y5MzQxMWZhN2UwYWNkNWU0NjMxMDNkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOWVmZThmYTFkMzI4NGUxNjg2NDIzNjc2NTJjNDhlYjkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODA1Mjc1Nzg1MDksLTEyMi4zOTY4NDkwMTUxNzIwMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF8xODZlNGI1MzdmOTM0MTFmYTdlMGFjZDVlNDYzMTAzZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2U4MjBiZWViNDA0NzQ0OTA4YWNjNmQ1MDYzNmQ5MDQyID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzI4NDE4MDcwNjYwMjA0LC0xMjIuNDUwMDAwNzkwNDQ1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzE4NmU0YjUzN2Y5MzQxMWZhN2UwYWNkNWU0NjMxMDNkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNTAxZmY3MTM0N2U3NDE4YTkxMGMyZTJjNDJhY2JmMDkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43MjkyMTE0NjQ3MzU5LC0xMjIuNDAwODM0MjgzMDMxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzE4NmU0YjUzN2Y5MzQxMWZhN2UwYWNkNWU0NjMxMDNkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMmM2ZjIxNWQyYjk4NDI2MTg0ZTk2M2FhZjBiMjQzMTIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODgwMDY1MzI0MzkyMDUsLTEyMi4zOTk4MDIxNDU3OTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfMTg2ZTRiNTM3ZjkzNDExZmE3ZTBhY2Q1ZTQ2MzEwM2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lYzFmN2U3OGEzODI0ODZlOWU1NWNkM2Y5MTZhYWE4MyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjcyMzk3NDgyNDE2MDksLTEyMi4zOTQ5Mjg0NzU4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzE4NmU0YjUzN2Y5MzQxMWZhN2UwYWNkNWU0NjMxMDNkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNTVkYjliNmFmMzBiNDAzMDkyOWU3ZTQ3ZTgzZDA0NTQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43MjM5NzQ4MjQxNjA5LC0xMjIuMzk0OTI4NDc1OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF8xODZlNGI1MzdmOTM0MTFmYTdlMGFjZDVlNDYzMTAzZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzhiYTM5Y2FjNzUyNDQ3MjRiZTlhZGY3N2EwYjIxY2RmID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzIzOTc0ODI0MTYwOSwtMTIyLjM5NDkyODQ3NThdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfMTg2ZTRiNTM3ZjkzNDExZmE3ZTBhY2Q1ZTQ2MzEwM2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jMWFhMThkYjJiNzI0YzM4YTM0NDBkM2Y1MTQ5OWNiMyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc4ODMyMzU0NDk5MDQsLTEyMi40MTE4NTcwMzI1NF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF8xODZlNGI1MzdmOTM0MTFmYTdlMGFjZDVlNDYzMTAzZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzcyNDMzN2FmNGRlODRmMGNiZTgwYWNlMGJhMTYxMjA0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzU1OTk3NzMzOTg1NiwtMTIyLjQwOTQzNTYxNzEwNl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF8xODZlNGI1MzdmOTM0MTFmYTdlMGFjZDVlNDYzMTAzZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzBhODExYjNjMDJjNzQ3YTVhMmY3MzU3NDJiNjBmNDI1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzg3MDc5ODE0NDQ0MywtMTIyLjQyNTg4MzM1ODE0OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF8xODZlNGI1MzdmOTM0MTFmYTdlMGFjZDVlNDYzMTAzZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2JmNjMyOTZiZDE1YTRlYjU5MTM0YzFiMjIxNTllNTFmID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzM2MDM3NDQ2Njg2MjA0LC0xMjIuNDE1MTI2NTQzMDAxMDFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfMTg2ZTRiNTM3ZjkzNDExZmE3ZTBhY2Q1ZTQ2MzEwM2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8wMGI3NDU3OWE0MGQ0M2I1OGU0N2UxYmZlNjUxZWFlZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjcxMjc2Nzg4NDgyMSwtMTIyLjQzMTkyODAxMTA4OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF8xODZlNGI1MzdmOTM0MTFmYTdlMGFjZDVlNDYzMTAzZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2JhYzg0OWVkNGIwZDRlNTlhMzY0NjAyOWE2NzJkODE1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzg5NTcxMDI1NTg2MywtMTIyLjQwMjE2MzcxMzYxOF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF8xODZlNGI1MzdmOTM0MTFmYTdlMGFjZDVlNDYzMTAzZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2ZkZGQyMmU1YjhmZDQ1NzliNzJhNjVlMTNmZWQ2ZWY1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzMwNzQyOTE2OTU1OSwtMTIyLjQyOTMwNjcyODM3Nl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF8xODZlNGI1MzdmOTM0MTFmYTdlMGFjZDVlNDYzMTAzZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2QwOTEwNDM0NmEzMzQxNGY5YzZiZDEyMjlhMjViM2JjID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzgzODM2NTU2NTM0Nzk0LC0xMjIuNDEzNzkwOTcyNzgwOTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfMTg2ZTRiNTM3ZjkzNDExZmE3ZTBhY2Q1ZTQ2MzEwM2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9iMjlmODcyMWJkYzI0YmFiYjE3ZDcyNmQyOGEyOWE3YyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjczMDc0MjkxNjk1NTksLTEyMi40MjkzMDY3MjgzNzZdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfMTg2ZTRiNTM3ZjkzNDExZmE3ZTBhY2Q1ZTQ2MzEwM2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9hNjI4NTdhOTBjZGI0MDljODUzOWRkZjQ4MTAzNDllNCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjczNzM2MjM2MDUyMTI5NiwtMTIyLjQyMjA2NzE4NDkzN10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF8xODZlNGI1MzdmOTM0MTFmYTdlMGFjZDVlNDYzMTAzZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2FhODI5NWEyYWQ0MDQ1YjA5NDFmMTM1MGQzNmRhMzgwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzM3MzYyMzYwNTIxMjk2LC0xMjIuNDIyMDY3MTg0OTM3XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzE4NmU0YjUzN2Y5MzQxMWZhN2UwYWNkNWU0NjMxMDNkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOWQxZmZkYjZkY2U1NGU2NTkyYzllODY5NDZmMjdlMjcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODU5OTg4MzIzNzk3OTYsLTEyMi40MTE3NDczNzE5MjRdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfMTg2ZTRiNTM3ZjkzNDExZmE3ZTBhY2Q1ZTQ2MzEwM2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mYjgwOTdkOGQzMTA0ZDc0OTg5ODI2NGU4NmYxZTg3YSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc2MzM3NTgwNTgwNTksLTEyMi40MjA0MzQ3MjQ1NTI5OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF8xODZlNGI1MzdmOTM0MTFmYTdlMGFjZDVlNDYzMTAzZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzlkZjY5MzVjZWZkOTQxYjc4NDFjOGQxMjI2MzJmMTZlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzg1MDIyNjYyMjc4NiwtMTIyLjQxMTk4NzY0MzU5NTAxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzE4NmU0YjUzN2Y5MzQxMWZhN2UwYWNkNWU0NjMxMDNkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMzNhN2NiNTQyNTg5NDc5OTk3MDkyZmFmMzc1ZGNmMzIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NzQ2MjA2NDkxMDY0OTUsLTEyMi41MDAzODA0Mjc5MTVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfMTg2ZTRiNTM3ZjkzNDExZmE3ZTBhY2Q1ZTQ2MzEwM2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9hMTUyZTY2YTY4Y2U0NDBmOWMxNWNkY2Q2NzliZjE3OSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc3NTE5MTgyNjcyMTcsLTEyMi40NjY1NTg3ODA2ODNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfMTg2ZTRiNTM3ZjkzNDExZmE3ZTBhY2Q1ZTQ2MzEwM2QpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl82MWZhNWQyY2ZmMTk0NDRlYmM2MTgwMzhiMzE5YmEzNCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc0OTA4NDE3MjkwMjgsLTEyMi40ODY5MjU5NjAxMTQwMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8oZmVhdHVyZV9ncm91cF8xODZlNGI1MzdmOTM0MTFmYTdlMGFjZDVlNDYzMTAzZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzQyZmY3MWQ3ZmNiZTQ5M2M4ZDBhZDE3NzI0ZjEyMzZkID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzY4NTM2MDEyMzU4MywtMTIyLjQxNTYxNjMzODMxOTk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzE4NmU0YjUzN2Y5MzQxMWZhN2UwYWNkNWU0NjMxMDNkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfY2JkMGE5YjQ0ZWJhNGQ3YjgzNmYyYTQ0MjE4Nzg0NTEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NjQ0Mjk3NzE0MDc0LC0xMjIuNDQ5NzUxNjUyNTYzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzE4NmU0YjUzN2Y5MzQxMWZhN2UwYWNkNWU0NjMxMDNkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZjc3ZTVkODJmZWY4NGIyZjkwNDliMDFhZjU4Mzk1OWQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NjQ0Mjk3NzE0MDc0LC0xMjIuNDQ5NzUxNjUyNTYzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhmZWF0dXJlX2dyb3VwXzE4NmU0YjUzN2Y5MzQxMWZhN2UwYWNkNWU0NjMxMDNkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNWMwOTc5ZTJmMzI3NDkzZWFiNjgyZGY1YTNjZWI4ZmYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43MzUyNjgxNDY5MDgzOTYsLTEyMi40NzI3MTU3NTk2MzFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKGZlYXR1cmVfZ3JvdXBfMTg2ZTRiNTM3ZjkzNDExZmE3ZTBhY2Q1ZTQ2MzEwM2QpOwogICAgICAgICAgICAKPC9zY3JpcHQ+\" 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 0x7fb000035a20>"
]
},
"execution_count": 31,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# instantiate a feature group for the incidents in the dataframe\n",
"incidents = folium.map.FeatureGroup()\n",
"\n",
"# loop through the 100 crimes and add each to the incidents feature group\n",
"for lat, lng, in zip(df_incidents.Y, df_incidents.X):\n",
" incidents.add_child(\n",
" folium.features.CircleMarker(\n",
" [lat, lng],\n",
" radius=5, # define how big you want the circle markers to be\n",
" color='yellow',\n",
" fill=True,\n",
" fill_color='blue',\n",
" fill_opacity=0.6\n",
" )\n",
" )\n",
"\n",
"# add pop-up text to each marker on the map\n",
"latitudes = list(df_incidents.Y)\n",
"longitudes = list(df_incidents.X)\n",
"labels = list(df_incidents.Category)\n",
"\n",
"for lat, lng, label in zip(latitudes, longitudes, labels):\n",
" folium.Marker([lat, lng], popup=label).add_to(sanfran_map) \n",
" \n",
"# add incidents to map\n",
"sanfran_map.add_child(incidents)"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"editable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"Isn't this really cool? Now you are able to know what crime category occurred at each marker.\n",
"\n",
"If you find the map to be so congested will all these markers, there are two remedies to this problem. The simpler solution is to remove these location markers and just add the text to the circle markers themselves as follows:"
]
},
{
"cell_type": "code",
"execution_count": 32,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": 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+ICNtYXBfMzE2NjMyYWMxZDUxNGNmYmI5NjdhNzJmYjRjNzk4NmQgewogICAgICAgICAgICAgICAgcG9zaXRpb24gOiByZWxhdGl2ZTsKICAgICAgICAgICAgICAgIHdpZHRoIDogMTAwLjAlOwogICAgICAgICAgICAgICAgaGVpZ2h0OiAxMDAuMCU7CiAgICAgICAgICAgICAgICBsZWZ0OiAwLjAlOwogICAgICAgICAgICAgICAgdG9wOiAwLjAlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICA8L3N0eWxlPgogICAgICAgIAo8L2hlYWQ+Cjxib2R5PiAgICAKICAgIAogICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb2xpdW0tbWFwIiBpZD0ibWFwXzMxNjYzMmFjMWQ1MTRjZmJiOTY3YTcyZmI0Yzc5ODZkIiA+PC9kaXY+CiAgICAgICAgCjwvYm9keT4KPHNjcmlwdD4gICAgCiAgICAKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGJvdW5kcyA9IG51bGw7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1hcF8zMTY2MzJhYzFkNTE0Y2ZiYjk2N2E3MmZiNGM3OTg2ZCA9IEwubWFwKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21hcF8zMTY2MzJhYzFkNTE0Y2ZiYjk2N2E3MmZiNGM3OTg2ZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y2VudGVyOiBbMzcuNzcsLTEyMi40Ml0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6b29tOiAxMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heEJvdW5kczogYm91bmRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXJzOiBbXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmxkQ29weUp1bXA6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JzOiBMLkNSUy5FUFNHMzg1NwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHRpbGVfbGF5ZXJfZGZjZjlhNjQ5OGYyNDlmZTk4NjVjYTYwY2Y4N2IyZDEgPSBMLnRpbGVMYXllcigKICAgICAgICAgICAgICAgICdodHRwczovL3tzfS50aWxlLm9wZW5zdHJlZXRtYXAub3JnL3t6fS97eH0ve3l9LnBuZycsCiAgICAgICAgICAgICAgICB7CiAgImF0dHJpYnV0aW9uIjogbnVsbCwKICAiZGV0ZWN0UmV0aW5hIjogZmFsc2UsCiAgIm1heFpvb20iOiAxOCwKICAibWluWm9vbSI6IDEsCiAgIm5vV3JhcCI6IGZhbHNlLAogICJzdWJkb21haW5zIjogImFiYyIKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzE2NjMyYWMxZDUxNGNmYmI5NjdhNzJmYjRjNzk4NmQpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzVkZGQ4YjBiMmM2ZjQyYWFiZDVlZWYxYWI5MzE1MTJhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzc1NDIwNzA2NzExLC0xMjIuNDAzNDA0NzkxNDc4OTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zMTY2MzJhYzFkNTE0Y2ZiYjk2N2E3MmZiNGM3OTg2ZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF83YTQzMTQ1NjdjYmU0MWU0OWU1MTZjNzdkYTQ2ZmI1NyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82NzQ5ZjBlMDIzYzk0ZDZjOTI1YTIxNDk1ZWE0YWFhYiA9ICQoJzxkaXYgaWQ9Imh0bWxfNjc0OWYwZTAyM2M5NGQ2YzkyNWEyMTQ5NWVhNGFhYWIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPldFQVBPTiBMQVdTPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83YTQzMTQ1NjdjYmU0MWU0OWU1MTZjNzdkYTQ2ZmI1Ny5zZXRDb250ZW50KGh0bWxfNjc0OWYwZTAyM2M5NGQ2YzkyNWEyMTQ5NWVhNGFhYWIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNWRkZDhiMGIyYzZmNDJhYWJkNWVlZjFhYjkzMTUxMmEuYmluZFBvcHVwKHBvcHVwXzdhNDMxNDU2N2NiZTQxZTQ5ZTUxNmM3N2RhNDZmYjU3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzQ0MTc5Zjc5ODhiNDQ0ODc5MmNkNTBiOWRmODQ1MWU2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzc1NDIwNzA2NzExLC0xMjIuNDAzNDA0NzkxNDc4OTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zMTY2MzJhYzFkNTE0Y2ZiYjk2N2E3MmZiNGM3OTg2ZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xZTA5MGI2ODA1NzA0ZjI5OTZjYmM5NDVkN2E0ODA0NSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF80MTA1YTZhOGNkYjM0NWQ3YmFhYTNlMjk0NWZmZDAzYSA9ICQoJzxkaXYgaWQ9Imh0bWxfNDEwNWE2YThjZGIzNDVkN2JhYWEzZTI5NDVmZmQwM2EiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPldFQVBPTiBMQVdTPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xZTA5MGI2ODA1NzA0ZjI5OTZjYmM5NDVkN2E0ODA0NS5zZXRDb250ZW50KGh0bWxfNDEwNWE2YThjZGIzNDVkN2JhYWEzZTI5NDVmZmQwM2EpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNDQxNzlmNzk4OGI0NDQ4NzkyY2Q1MGI5ZGY4NDUxZTYuYmluZFBvcHVwKHBvcHVwXzFlMDkwYjY4MDU3MDRmMjk5NmNiYzk0NWQ3YTQ4MDQ1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzdiNmIzZDkwMjgwZDRlNTk4Yjc5MGM1YmY0MDViMzc3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzI5OTgwOTY3Mjk5NTk2LC0xMjIuMzg4ODU2MjA0MjkyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzE2NjMyYWMxZDUxNGNmYmI5NjdhNzJmYjRjNzk4NmQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNTc3YzllNGE4ODE2NDBhODg2YWU4NTgyMThiZjdkOGYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNmViYjk5NmI0YWFjNGNiZTgwNWU5NjljZjUwYzhiNGMgPSAkKCc8ZGl2IGlkPSJodG1sXzZlYmI5OTZiNGFhYzRjYmU4MDVlOTY5Y2Y1MGM4YjRjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5XQVJSQU5UUzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNTc3YzllNGE4ODE2NDBhODg2YWU4NTgyMThiZjdkOGYuc2V0Q29udGVudChodG1sXzZlYmI5OTZiNGFhYzRjYmU4MDVlOTY5Y2Y1MGM4YjRjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzdiNmIzZDkwMjgwZDRlNTk4Yjc5MGM1YmY0MDViMzc3LmJpbmRQb3B1cChwb3B1cF81NzdjOWU0YTg4MTY0MGE4ODZhZTg1ODIxOGJmN2Q4Zik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lY2EyNTdmMzAzOGI0NDZhYjMyNzcxOWE4MzU2ZDgzYyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc4NTc4ODM3NjY4ODc5LC0xMjIuNDEyOTcwNTM3NTkxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzE2NjMyYWMxZDUxNGNmYmI5NjdhNzJmYjRjNzk4NmQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMzVlZTllMjdmZjE3NGIyYmIzN2U0Zjg0MThhODk5ZDcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMWVhYzYxYWY5NzY2NDM3Y2JiNmIwZmYyMGQyMzBhZjggPSAkKCc8ZGl2IGlkPSJodG1sXzFlYWM2MWFmOTc2NjQzN2NiYjZiMGZmMjBkMjMwYWY4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5OT04tQ1JJTUlOQUw8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzM1ZWU5ZTI3ZmYxNzRiMmJiMzdlNGY4NDE4YTg5OWQ3LnNldENvbnRlbnQoaHRtbF8xZWFjNjFhZjk3NjY0MzdjYmI2YjBmZjIwZDIzMGFmOCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9lY2EyNTdmMzAzOGI0NDZhYjMyNzcxOWE4MzU2ZDgzYy5iaW5kUG9wdXAocG9wdXBfMzVlZTllMjdmZjE3NGIyYmIzN2U0Zjg0MThhODk5ZDcpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfODM0NTFjZTY2ZWMxNGIyZWFkYTdlZjAyMmNkNDJkNWYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NjUwNTAxMjE0NjY4LC0xMjIuNDE5NjcxNzgwMjk2XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzE2NjMyYWMxZDUxNGNmYmI5NjdhNzJmYjRjNzk4NmQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZGRkNDNjNzdhZmNlNDY2NWJhYzg1NzBmMDIyYjY4OTQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMDY1ZGNlOGYzZDdjNGJhZGI3NzQxMDYyZjZhZjhlMDcgPSAkKCc8ZGl2IGlkPSJodG1sXzA2NWRjZThmM2Q3YzRiYWRiNzc0MTA2MmY2YWY4ZTA3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5OT04tQ1JJTUlOQUw8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2RkZDQzYzc3YWZjZTQ2NjViYWM4NTcwZjAyMmI2ODk0LnNldENvbnRlbnQoaHRtbF8wNjVkY2U4ZjNkN2M0YmFkYjc3NDEwNjJmNmFmOGUwNyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl84MzQ1MWNlNjZlYzE0YjJlYWRhN2VmMDIyY2Q0MmQ1Zi5iaW5kUG9wdXAocG9wdXBfZGRkNDNjNzdhZmNlNDY2NWJhYzg1NzBmMDIyYjY4OTQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMjU3OTk0NzI2MjYxNDEzMmIwYzFkNjFiYzAxNzY3NzIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODgwMTg1NTU4MjksLTEyMi40MjYwNzcxNzczNzQ5OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzMxNjYzMmFjMWQ1MTRjZmJiOTY3YTcyZmI0Yzc5ODZkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzk2YzVlZThjOWJhYzQyMzM4OGI4OGU4ZjJkZmIyOWZiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2Q3NmE0YjgxZDA4ODQxZmNhODU3YzcxZjk2ZDBmOGM4ID0gJCgnPGRpdiBpZD0iaHRtbF9kNzZhNGI4MWQwODg0MWZjYTg1N2M3MWY5NmQwZjhjOCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QVNTQVVMVDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOTZjNWVlOGM5YmFjNDIzMzg4Yjg4ZThmMmRmYjI5ZmIuc2V0Q29udGVudChodG1sX2Q3NmE0YjgxZDA4ODQxZmNhODU3YzcxZjk2ZDBmOGM4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzI1Nzk5NDcyNjI2MTQxMzJiMGMxZDYxYmMwMTc2NzcyLmJpbmRQb3B1cChwb3B1cF85NmM1ZWU4YzliYWM0MjMzODhiODhlOGYyZGZiMjlmYik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xMjIyMDg3MmI1MzQ0MWE5YWM3ODgyZDEwYTVjMjljOCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc4MDg3ODkzNjAyMTQsLTEyMi40MDU3MjE0NTQ1NjddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zMTY2MzJhYzFkNTE0Y2ZiYjk2N2E3MmZiNGM3OTg2ZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zMTQxMTM0ZWUyMmM0ODg0OTgwODFlMWNiOGNlYTE1OCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jZmJiNTU5MzI1OGE0MDg1YWYxMGY2Y2E0NDJhMWY1MSA9ICQoJzxkaXYgaWQ9Imh0bWxfY2ZiYjU1OTMyNThhNDA4NWFmMTBmNmNhNDQyYTFmNTEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk9USEVSIE9GRkVOU0VTPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zMTQxMTM0ZWUyMmM0ODg0OTgwODFlMWNiOGNlYTE1OC5zZXRDb250ZW50KGh0bWxfY2ZiYjU1OTMyNThhNDA4NWFmMTBmNmNhNDQyYTFmNTEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMTIyMjA4NzJiNTM0NDFhOWFjNzg4MmQxMGE1YzI5YzguYmluZFBvcHVwKHBvcHVwXzMxNDExMzRlZTIyYzQ4ODQ5ODA4MWUxY2I4Y2VhMTU4KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzI0NjAwMmQwZjIxMzQ4ZThhNjgyODExZjQ5N2NhZTljID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzgzOTgwNTU5MjYzNCwtMTIyLjQxMTc3ODI5NTk5Ml0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzMxNjYzMmFjMWQ1MTRjZmJiOTY3YTcyZmI0Yzc5ODZkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2ViNjQ2N2E2ZTBjZjRjYTI5NzNkMzNmOGJhMjA4YzkzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzljOWU1YjM3NDc5ZTQyZmQ4NGI1ODRlZDk4NDMwMGVmID0gJCgnPGRpdiBpZD0iaHRtbF85YzllNWIzNzQ3OWU0MmZkODRiNTg0ZWQ5ODQzMDBlZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Tk9OLUNSSU1JTkFMPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lYjY0NjdhNmUwY2Y0Y2EyOTczZDMzZjhiYTIwOGM5My5zZXRDb250ZW50KGh0bWxfOWM5ZTViMzc0NzllNDJmZDg0YjU4NGVkOTg0MzAwZWYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMjQ2MDAyZDBmMjEzNDhlOGE2ODI4MTFmNDk3Y2FlOWMuYmluZFBvcHVwKHBvcHVwX2ViNjQ2N2E2ZTBjZjRjYTI5NzNkMzNmOGJhMjA4YzkzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzUyZDQyMDc5YWU0MjRlODA4ZjJlYTM1Nzk4ZmUzNmVmID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzc1Nzg3NjIxODI5Mjk1LC0xMjIuMzkzMzU3MjQxNDUxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzE2NjMyYWMxZDUxNGNmYmI5NjdhNzJmYjRjNzk4NmQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNzAzOTI2ZWVjN2NjNDJkOTkzZWJhYmZkOWQ4ZDc1NGEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYjNjYzEzZTU3M2QwNDllMjlkOTVkMDMwYmY0Njk4N2YgPSAkKCc8ZGl2IGlkPSJodG1sX2IzY2MxM2U1NzNkMDQ5ZTI5ZDk1ZDAzMGJmNDY5ODdmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5XQVJSQU5UUzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNzAzOTI2ZWVjN2NjNDJkOTkzZWJhYmZkOWQ4ZDc1NGEuc2V0Q29udGVudChodG1sX2IzY2MxM2U1NzNkMDQ5ZTI5ZDk1ZDAzMGJmNDY5ODdmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzUyZDQyMDc5YWU0MjRlODA4ZjJlYTM1Nzk4ZmUzNmVmLmJpbmRQb3B1cChwb3B1cF83MDM5MjZlZWM3Y2M0MmQ5OTNlYmFiZmQ5ZDhkNzU0YSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8yYmUwOTg2MTAzMTQ0NTJmOWFmYjU4ODI4ZWM5MjZhOCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjcyMDk2Njk2MTU0OTksLTEyMi4zODcxODE2MzU5OTVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zMTY2MzJhYzFkNTE0Y2ZiYjk2N2E3MmZiNGM3OTg2ZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iNzg1OWFlNWE5NjA0NTY2YjcwNzJiOTIwZTY0ZThlOCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mNWQ2OGVmNDk5ZGQ0OWVlYjFlMTdhZDA4NGI1ZmJkNSA9ICQoJzxkaXYgaWQ9Imh0bWxfZjVkNjhlZjQ5OWRkNDllZWIxZTE3YWQwODRiNWZiZDUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk1JU1NJTkcgUEVSU09OPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iNzg1OWFlNWE5NjA0NTY2YjcwNzJiOTIwZTY0ZThlOC5zZXRDb250ZW50KGh0bWxfZjVkNjhlZjQ5OWRkNDllZWIxZTE3YWQwODRiNWZiZDUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMmJlMDk4NjEwMzE0NDUyZjlhZmI1ODgyOGVjOTI2YTguYmluZFBvcHVwKHBvcHVwX2I3ODU5YWU1YTk2MDQ1NjZiNzA3MmI5MjBlNjRlOGU4KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzUyOTFiZDM3OWYyZDQ0NWFhYjFhYjgwMmZhYWRmMDliID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzY0NDc4MTU3ODY5NTA1LC0xMjIuNDc3Mzc2NTI0MDAyOTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zMTY2MzJhYzFkNTE0Y2ZiYjk2N2E3MmZiNGM3OTg2ZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF83YjlhYjU0MmJmZTM0NzQxYmM4ZWYwZGNkNjc1MDhlZSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF80NmNmYWRiNjJmZTI0NTMzYjYwNWJjZDY2M2FiYmY1MiA9ICQoJzxkaXYgaWQ9Imh0bWxfNDZjZmFkYjYyZmUyNDUzM2I2MDViY2Q2NjNhYmJmNTIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkxBUkNFTlkvVEhFRlQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzdiOWFiNTQyYmZlMzQ3NDFiYzhlZjBkY2Q2NzUwOGVlLnNldENvbnRlbnQoaHRtbF80NmNmYWRiNjJmZTI0NTMzYjYwNWJjZDY2M2FiYmY1Mik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81MjkxYmQzNzlmMmQ0NDVhYWIxYWI4MDJmYWFkZjA5Yi5iaW5kUG9wdXAocG9wdXBfN2I5YWI1NDJiZmUzNDc0MWJjOGVmMGRjZDY3NTA4ZWUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZjg1MDJmZDI1Y2JlNGQwOTgyMDM2MDg4Zjk2N2UyMzIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NDU3Mzg5NDI5NjU0OTUsLTEyMi40Nzc5NjAzMjcyOTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zMTY2MzJhYzFkNTE0Y2ZiYjk2N2E3MmZiNGM3OTg2ZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9jNjg2NDQwNGRjN2M0ODYzYmE4YzcwMWExNzJhOWUxMCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lNmM5MDNkMTU3YWE0ZDMxYjUzNDJkZWEwMjY3ZjQ0MyA9ICQoJzxkaXYgaWQ9Imh0bWxfZTZjOTAzZDE1N2FhNGQzMWI1MzQyZGVhMDI2N2Y0NDMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk5PTi1DUklNSU5BTDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYzY4NjQ0MDRkYzdjNDg2M2JhOGM3MDFhMTcyYTllMTAuc2V0Q29udGVudChodG1sX2U2YzkwM2QxNTdhYTRkMzFiNTM0MmRlYTAyNjdmNDQzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2Y4NTAyZmQyNWNiZTRkMDk4MjAzNjA4OGY5NjdlMjMyLmJpbmRQb3B1cChwb3B1cF9jNjg2NDQwNGRjN2M0ODYzYmE4YzcwMWExNzJhOWUxMCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl83OTZlNzhlNzMwNWY0Y2M2OWQzZTA0ODQ2ZTg2YzhhOCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjczNTY5NzAyNzU0ODIwNiwtMTIyLjM3Njc1NzY1NTUzMDAxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzE2NjMyYWMxZDUxNGNmYmI5NjdhNzJmYjRjNzk4NmQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZmFkNmVhODdiODEwNDNjN2JmMDlkYjNhYTk1Yzc4YmIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMGY2N2EzMDc3N2Q4NGUwZjliY2E4N2IxZWIwYjUwODMgPSAkKCc8ZGl2IGlkPSJodG1sXzBmNjdhMzA3NzdkODRlMGY5YmNhODdiMWViMGI1MDgzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5PVEhFUiBPRkZFTlNFUzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZmFkNmVhODdiODEwNDNjN2JmMDlkYjNhYTk1Yzc4YmIuc2V0Q29udGVudChodG1sXzBmNjdhMzA3NzdkODRlMGY5YmNhODdiMWViMGI1MDgzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzc5NmU3OGU3MzA1ZjRjYzY5ZDNlMDQ4NDZlODZjOGE4LmJpbmRQb3B1cChwb3B1cF9mYWQ2ZWE4N2I4MTA0M2M3YmYwOWRiM2FhOTVjNzhiYik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8zYjk5MjZiZmMyNmE0M2YxYWViNjE1ZDk2NDc4YjRjOCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjcyOTI3MDUxOTk1OTIsLTEyMi40MzIzMjU4NzEwMjhdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zMTY2MzJhYzFkNTE0Y2ZiYjk2N2E3MmZiNGM3OTg2ZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xNjRiNDcxZGM2YmY0YjU0OTRiYzZiZTQ3YzlhZjIzOCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF85YjcyMWYxYmM1NTU0N2ZhYjg0YzM1ZWNkNDU3NDZiMSA9ICQoJzxkaXYgaWQ9Imh0bWxfOWI3MjFmMWJjNTU1NDdmYWI4NGMzNWVjZDQ1NzQ2YjEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkFTU0FVTFQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzE2NGI0NzFkYzZiZjRiNTQ5NGJjNmJlNDdjOWFmMjM4LnNldENvbnRlbnQoaHRtbF85YjcyMWYxYmM1NTU0N2ZhYjg0YzM1ZWNkNDU3NDZiMSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8zYjk5MjZiZmMyNmE0M2YxYWViNjE1ZDk2NDc4YjRjOC5iaW5kUG9wdXAocG9wdXBfMTY0YjQ3MWRjNmJmNGI1NDk0YmM2YmU0N2M5YWYyMzgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNDRlM2VmYzMzNzk4NDcxMThmMzQ2YzdjMjE1ZTIzNTcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43OTE2NDI5ODIzODQsLTEyMi40MDA5MDg2OTg4ODk5OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzMxNjYzMmFjMWQ1MTRjZmJiOTY3YTcyZmI0Yzc5ODZkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzExZTJhNzg4M2NlOTQ0OTE4MzIwZDAzY2RhOWExMGIyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzQxYzgzNWFkOGM2YjQ4NTU4NTBhNjQ3MzFkOWNhZWNmID0gJCgnPGRpdiBpZD0iaHRtbF80MWM4MzVhZDhjNmI0ODU1ODUwYTY0NzMxZDljYWVjZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QlVSR0xBUlk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzExZTJhNzg4M2NlOTQ0OTE4MzIwZDAzY2RhOWExMGIyLnNldENvbnRlbnQoaHRtbF80MWM4MzVhZDhjNmI0ODU1ODUwYTY0NzMxZDljYWVjZik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl80NGUzZWZjMzM3OTg0NzExOGYzNDZjN2MyMTVlMjM1Ny5iaW5kUG9wdXAocG9wdXBfMTFlMmE3ODgzY2U5NDQ5MTgzMjBkMDNjZGE5YTEwYjIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMWI0NjkyODVjM2NhNGY0MGE2YTNlMDhiYzc3NDFhNDQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODM3MDY5MzAxNTQ1LC0xMjIuNDA4NTk1MTEwODY5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzE2NjMyYWMxZDUxNGNmYmI5NjdhNzJmYjRjNzk4NmQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMWZlMzc1MTlhZjE0NGRmNThjYWJkODdkY2Y1MWIxMjQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMjU1YWIzMWM5ZWMwNDExY2FjZjgxMWYxODNkMDkyMTUgPSAkKCc8ZGl2IGlkPSJodG1sXzI1NWFiMzFjOWVjMDQxMWNhY2Y4MTFmMTgzZDA5MjE1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5TVE9MRU4gUFJPUEVSVFk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzFmZTM3NTE5YWYxNDRkZjU4Y2FiZDg3ZGNmNTFiMTI0LnNldENvbnRlbnQoaHRtbF8yNTVhYjMxYzllYzA0MTFjYWNmODExZjE4M2QwOTIxNSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8xYjQ2OTI4NWMzY2E0ZjQwYTZhM2UwOGJjNzc0MWE0NC5iaW5kUG9wdXAocG9wdXBfMWZlMzc1MTlhZjE0NGRmNThjYWJkODdkY2Y1MWIxMjQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNTFlYzhhNjZjMzE2NGRiMDliMzBhNzA0MWE2Zjk4NjMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NTcyODk1OTA0NTc3OTUsLTEyMi40MDY4NzA0MDIwODJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zMTY2MzJhYzFkNTE0Y2ZiYjk2N2E3MmZiNGM3OTg2ZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zOGM3ODMwNjhhY2E0ZTAzODc1YzZhNGFmYWY2MGM4YSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF84YWRmZDcxN2Q0ZDg0ZmZlYTMzODZiMzQ5MDAwY2E0OCA9ICQoJzxkaXYgaWQ9Imh0bWxfOGFkZmQ3MTdkNGQ4NGZmZWEzMzg2YjM0OTAwMGNhNDgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlJPQkJFUlk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzM4Yzc4MzA2OGFjYTRlMDM4NzVjNmE0YWZhZjYwYzhhLnNldENvbnRlbnQoaHRtbF84YWRmZDcxN2Q0ZDg0ZmZlYTMzODZiMzQ5MDAwY2E0OCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81MWVjOGE2NmMzMTY0ZGIwOWIzMGE3MDQxYTZmOTg2My5iaW5kUG9wdXAocG9wdXBfMzhjNzgzMDY4YWNhNGUwMzg3NWM2YTRhZmFmNjBjOGEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZmZjNTY1NjI2MzdjNDU3Mzk0MjhlMzk3MjRmMTBiZTEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NDg5MDYzMDUxODI5LC0xMjIuNDIwMzU0NzgwODYwOTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zMTY2MzJhYzFkNTE0Y2ZiYjk2N2E3MmZiNGM3OTg2ZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9jYzM3ZjMxNDc5Zjk0ZmEzOGQzODliMTg0ZjVkMWQ3ZSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jYTdiMzI5YWM2Yzk0YzdmYjFjZTI2OGMxNGI2ZDdjZCA9ICQoJzxkaXYgaWQ9Imh0bWxfY2E3YjMyOWFjNmM5NGM3ZmIxY2UyNjhjMTRiNmQ3Y2QiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkFTU0FVTFQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2NjMzdmMzE0NzlmOTRmYTM4ZDM4OWIxODRmNWQxZDdlLnNldENvbnRlbnQoaHRtbF9jYTdiMzI5YWM2Yzk0YzdmYjFjZTI2OGMxNGI2ZDdjZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9mZmM1NjU2MjYzN2M0NTczOTQyOGUzOTcyNGYxMGJlMS5iaW5kUG9wdXAocG9wdXBfY2MzN2YzMTQ3OWY5NGZhMzhkMzg5YjE4NGY1ZDFkN2UpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMzMzZTdkOGRiMWRjNDIxYTljZmU2ZmE4YjQyMTQ4NTYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43MTU3NjU0MjY5OTUsLTEyMi40Mzk5MDk3NjY3NzJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zMTY2MzJhYzFkNTE0Y2ZiYjk2N2E3MmZiNGM3OTg2ZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lMDhjNWUxMjU4ZWY0ZjY5YjJhNGU2OGY1MTgxMGZlZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jY2EwMTZkYTE5NDQ0MTIyYTBkZTM2MGE0M2M5OWJjMCA9ICQoJzxkaXYgaWQ9Imh0bWxfY2NhMDE2ZGExOTQ0NDEyMmEwZGUzNjBhNDNjOTliYzAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkFTU0FVTFQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2UwOGM1ZTEyNThlZjRmNjliMmE0ZTY4ZjUxODEwZmVkLnNldENvbnRlbnQoaHRtbF9jY2EwMTZkYTE5NDQ0MTIyYTBkZTM2MGE0M2M5OWJjMCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8zMzNlN2Q4ZGIxZGM0MjFhOWNmZTZmYThiNDIxNDg1Ni5iaW5kUG9wdXAocG9wdXBfZTA4YzVlMTI1OGVmNGY2OWIyYTRlNjhmNTE4MTBmZWQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYmQzZTZjNGVkMzg0NGI3YmFjMjMyZGZiMTZkZjk0OGUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODM1Njk5Mzg2OTE4LC0xMjIuNDA4NDIxMTE2OTIyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzE2NjMyYWMxZDUxNGNmYmI5NjdhNzJmYjRjNzk4NmQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfODliMzIyZTI2MDhlNDIyNGEzMzUyNTFjM2NjMzZlZDUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMWI0ZjFkNmQ2NzlkNDI2NjgwM2Y5ZTcwZTY2ODJlZDIgPSAkKCc8ZGl2IGlkPSJodG1sXzFiNGYxZDZkNjc5ZDQyNjY4MDNmOWU3MGU2NjgyZWQyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5MQVJDRU5ZL1RIRUZUPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84OWIzMjJlMjYwOGU0MjI0YTMzNTI1MWMzY2MzNmVkNS5zZXRDb250ZW50KGh0bWxfMWI0ZjFkNmQ2NzlkNDI2NjgwM2Y5ZTcwZTY2ODJlZDIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYmQzZTZjNGVkMzg0NGI3YmFjMjMyZGZiMTZkZjk0OGUuYmluZFBvcHVwKHBvcHVwXzg5YjMyMmUyNjA4ZTQyMjRhMzM1MjUxYzNjYzM2ZWQ1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzNkOTZjNDY5YmE3ZjQ0OGJhOTc4NTZkN2VhNDY2NzcyID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzczNjE4NjI3NjQ1NjA0LC0xMjIuNDIyMzE1NjcwNzQ5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzE2NjMyYWMxZDUxNGNmYmI5NjdhNzJmYjRjNzk4NmQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfM2I5ZjFmZjZmNmQ3NDA4Njk3ZjcwNTY3ZTM3YTAxMzUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMGRiZDZmOGNiZThjNGE5YWFiMzJiOWE1ZGMyZGY4YzIgPSAkKCc8ZGl2IGlkPSJodG1sXzBkYmQ2ZjhjYmU4YzRhOWFhYjMyYjlhNWRjMmRmOGMyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5GUkFVRDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfM2I5ZjFmZjZmNmQ3NDA4Njk3ZjcwNTY3ZTM3YTAxMzUuc2V0Q29udGVudChodG1sXzBkYmQ2ZjhjYmU4YzRhOWFhYjMyYjlhNWRjMmRmOGMyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzNkOTZjNDY5YmE3ZjQ0OGJhOTc4NTZkN2VhNDY2NzcyLmJpbmRQb3B1cChwb3B1cF8zYjlmMWZmNmY2ZDc0MDg2OTdmNzA1NjdlMzdhMDEzNSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xM2M4ZmZlMDdiMjA0YzBlYWNjNzQ1MjgxZmNjZWJmMiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc5Mjg0MTI4NDA0NDcwNSwtMTIyLjQyNDUxOTgzNTAwOTAxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzE2NjMyYWMxZDUxNGNmYmI5NjdhNzJmYjRjNzk4NmQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMDM4OWQ2YWEwZTU1NGYwYzhhNDQ3NzM3NjlkNjcyYmUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZjg1ZGRkMmY5YTA2NDY3M2IzZDIxMjdiYTU2NGJhZjUgPSAkKCc8ZGl2IGlkPSJodG1sX2Y4NWRkZDJmOWEwNjQ2NzNiM2QyMTI3YmE1NjRiYWY1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5XQVJSQU5UUzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMDM4OWQ2YWEwZTU1NGYwYzhhNDQ3NzM3NjlkNjcyYmUuc2V0Q29udGVudChodG1sX2Y4NWRkZDJmOWEwNjQ2NzNiM2QyMTI3YmE1NjRiYWY1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzEzYzhmZmUwN2IyMDRjMGVhY2M3NDUyODFmY2NlYmYyLmJpbmRQb3B1cChwb3B1cF8wMzg5ZDZhYTBlNTU0ZjBjOGE0NDc3Mzc2OWQ2NzJiZSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl80M2NjMjJjYjZhNWU0YjJiODQ4OTRjNDZlOTM3NzRiNSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc1NDA5ODY4ODIwNjc5NSwtMTIyLjQxNDIzMzg0OTAzNzk4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzE2NjMyYWMxZDUxNGNmYmI5NjdhNzJmYjRjNzk4NmQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfODZiOTIxZDk2ZTQ1NDUwMGEzOWIzMWRkZmQ0ODFmODIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZjBjMzBmYmYxZGM0NDg4ZDg0ODYzOTRhNmI0NjI1YTAgPSAkKCc8ZGl2IGlkPSJodG1sX2YwYzMwZmJmMWRjNDQ4OGQ4NDg2Mzk0YTZiNDYyNWEwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5EUlVHL05BUkNPVElDPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84NmI5MjFkOTZlNDU0NTAwYTM5YjMxZGRmZDQ4MWY4Mi5zZXRDb250ZW50KGh0bWxfZjBjMzBmYmYxZGM0NDg4ZDg0ODYzOTRhNmI0NjI1YTApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNDNjYzIyY2I2YTVlNGIyYjg0ODk0YzQ2ZTkzNzc0YjUuYmluZFBvcHVwKHBvcHVwXzg2YjkyMWQ5NmU0NTQ1MDBhMzliMzFkZGZkNDgxZjgyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzk3NjQ5ZDUzZDVjNzRlNWZhN2Q3OWFhOTMyNWJjMzA4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzU0MDk4Njg4MjA2Nzk1LC0xMjIuNDE0MjMzODQ5MDM3OThdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zMTY2MzJhYzFkNTE0Y2ZiYjk2N2E3MmZiNGM3OTg2ZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9jOTNkZmU3MTU2ZTM0ZThjODg3YzJjMDE2MTc2NTVhOCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82Njc5MDJhNDk3MGQ0ZjlmYjNlZWIxZWIyZTIxZWUxMSA9ICQoJzxkaXYgaWQ9Imh0bWxfNjY3OTAyYTQ5NzBkNGY5ZmIzZWViMWViMmUyMWVlMTEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk9USEVSIE9GRkVOU0VTPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jOTNkZmU3MTU2ZTM0ZThjODg3YzJjMDE2MTc2NTVhOC5zZXRDb250ZW50KGh0bWxfNjY3OTAyYTQ5NzBkNGY5ZmIzZWViMWViMmUyMWVlMTEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOTc2NDlkNTNkNWM3NGU1ZmE3ZDc5YWE5MzI1YmMzMDguYmluZFBvcHVwKHBvcHVwX2M5M2RmZTcxNTZlMzRlOGM4ODdjMmMwMTYxNzY1NWE4KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzcxZmQ1ODVlZTMzYjQwYmI5OWY4M2QxZjRkMjE2Y2ZjID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzcxNDkzOTk2OTQxNiwtMTIyLjUwNzc1MDEzMTAwNDAyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzE2NjMyYWMxZDUxNGNmYmI5NjdhNzJmYjRjNzk4NmQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfODNhMzYyMzM3ZGJiNGU2M2I2ZjNmNTI2ZThiMjk2MzggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfY2UzNDU2YTAzNzk1NDk2Y2I1YzY3ZDY0MjJkYjRmZjUgPSAkKCc8ZGl2IGlkPSJodG1sX2NlMzQ1NmEwMzc5NTQ5NmNiNWM2N2Q2NDIyZGI0ZmY1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5BU1NBVUxUPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84M2EzNjIzMzdkYmI0ZTYzYjZmM2Y1MjZlOGIyOTYzOC5zZXRDb250ZW50KGh0bWxfY2UzNDU2YTAzNzk1NDk2Y2I1YzY3ZDY0MjJkYjRmZjUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNzFmZDU4NWVlMzNiNDBiYjk5ZjgzZDFmNGQyMTZjZmMuYmluZFBvcHVwKHBvcHVwXzgzYTM2MjMzN2RiYjRlNjNiNmYzZjUyNmU4YjI5NjM4KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2Y4Y2JlNDU1NWRjZTRjMTE5MjNmZGVmODhiZGZjNmMxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzE4MzAyMjA0NzY2MDA1LC0xMjIuNDc0NDQ0NjM5NTk0OTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zMTY2MzJhYzFkNTE0Y2ZiYjk2N2E3MmZiNGM3OTg2ZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85Njg1MThmYzM3MzM0MWMxODYzNWQ0ZWY0YTNhNWYyMCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF85YzgzYjE2ZDE1MWI0ZTE5YmY1NGM3YTZjZGZiYmYxYSA9ICQoJzxkaXYgaWQ9Imh0bWxfOWM4M2IxNmQxNTFiNGUxOWJmNTRjN2E2Y2RmYmJmMWEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk9USEVSIE9GRkVOU0VTPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85Njg1MThmYzM3MzM0MWMxODYzNWQ0ZWY0YTNhNWYyMC5zZXRDb250ZW50KGh0bWxfOWM4M2IxNmQxNTFiNGUxOWJmNTRjN2E2Y2RmYmJmMWEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZjhjYmU0NTU1ZGNlNGMxMTkyM2ZkZWY4OGJkZmM2YzEuYmluZFBvcHVwKHBvcHVwXzk2ODUxOGZjMzczMzQxYzE4NjM1ZDRlZjRhM2E1ZjIwKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzdjMjE1MDVlMzNlYjQwM2E4YjRiNzY4MTgyYWE5ZThhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzY0NTc1MjMxNzYxNSwtMTIyLjQyNzU2MjU5Njk4NV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzMxNjYzMmFjMWQ1MTRjZmJiOTY3YTcyZmI0Yzc5ODZkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2M4MjgyZDQ3NzJkMDQ3ZDBhMTdmZGExMWYwM2RhNGY0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzhlZTEwYzI0OTRmNzRmMTE4ZGJlMmY4NzRiMWE0ZDA1ID0gJCgnPGRpdiBpZD0iaHRtbF84ZWUxMGMyNDk0Zjc0ZjExOGRiZTJmODc0YjFhNGQwNSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+T1RIRVIgT0ZGRU5TRVM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2M4MjgyZDQ3NzJkMDQ3ZDBhMTdmZGExMWYwM2RhNGY0LnNldENvbnRlbnQoaHRtbF84ZWUxMGMyNDk0Zjc0ZjExOGRiZTJmODc0YjFhNGQwNSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl83YzIxNTA1ZTMzZWI0MDNhOGI0Yjc2ODE4MmFhOWU4YS5iaW5kUG9wdXAocG9wdXBfYzgyODJkNDc3MmQwNDdkMGExN2ZkYTExZjAzZGE0ZjQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNjExYjE5Njc3MzYxNGU5ZGI3YjliZGRhYmRhMDRkZTkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODc0Mzc4MzA5MTEyLC0xMjIuNDE5MjAzMDA0MjY4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzE2NjMyYWMxZDUxNGNmYmI5NjdhNzJmYjRjNzk4NmQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYjQ0OGU5MzA4YzZjNDgyOGExZGFlYjIyZmI5MWMwZWQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOGRhOTA4YTYxYzA4NDE5ZDhmZjlmM2JlMjBmMWY2NTggPSAkKCc8ZGl2IGlkPSJodG1sXzhkYTkwOGE2MWMwODQxOWQ4ZmY5ZjNiZTIwZjFmNjU4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5CVVJHTEFSWTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYjQ0OGU5MzA4YzZjNDgyOGExZGFlYjIyZmI5MWMwZWQuc2V0Q29udGVudChodG1sXzhkYTkwOGE2MWMwODQxOWQ4ZmY5ZjNiZTIwZjFmNjU4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzYxMWIxOTY3NzM2MTRlOWRiN2I5YmRkYWJkYTA0ZGU5LmJpbmRQb3B1cChwb3B1cF9iNDQ4ZTkzMDhjNmM0ODI4YTFkYWViMjJmYjkxYzBlZCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9hYTk3MDY4YWQ2ODU0OWNjOTExMTM3YjZkYzkxNzNkZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc0OTM2ODgyODQ1MzIsLTEyMi40MTI2OTAxNDIzMDgwMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzMxNjYzMmFjMWQ1MTRjZmJiOTY3YTcyZmI0Yzc5ODZkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzIyNTU1ZGQyYTY2ODQ0ZGE5ZWRkNDIxY2NkNzRiMzA2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzQ0OWIyMjQyZWJiMDRlNjU5NjUzZmIzMTA4OGMzZDAxID0gJCgnPGRpdiBpZD0iaHRtbF80NDliMjI0MmViYjA0ZTY1OTY1M2ZiMzEwODhjM2QwMSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+T1RIRVIgT0ZGRU5TRVM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzIyNTU1ZGQyYTY2ODQ0ZGE5ZWRkNDIxY2NkNzRiMzA2LnNldENvbnRlbnQoaHRtbF80NDliMjI0MmViYjA0ZTY1OTY1M2ZiMzEwODhjM2QwMSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9hYTk3MDY4YWQ2ODU0OWNjOTExMTM3YjZkYzkxNzNkZS5iaW5kUG9wdXAocG9wdXBfMjI1NTVkZDJhNjY4NDRkYTllZGQ0MjFjY2Q3NGIzMDYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYTI5Y2IzNmRmOGMwNGZiZDk3MjZmMGFiNmUyYjViMmIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43MDkyMDEwNDYyMzc5LC0xMjIuNDM0NjA5MjgwMzUyXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzE2NjMyYWMxZDUxNGNmYmI5NjdhNzJmYjRjNzk4NmQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNWZkMTVmNDgyYzA5NDY3ZGE4ZDgzZTk0NDJkN2U3YWQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYTY3OWNjMTU1MTI1NDUyODkzMTBmNTRiYzY3YzQyM2IgPSAkKCc8ZGl2IGlkPSJodG1sX2E2NzljYzE1NTEyNTQ1Mjg5MzEwZjU0YmM2N2M0MjNiIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5OT04tQ1JJTUlOQUw8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzVmZDE1ZjQ4MmMwOTQ2N2RhOGQ4M2U5NDQyZDdlN2FkLnNldENvbnRlbnQoaHRtbF9hNjc5Y2MxNTUxMjU0NTI4OTMxMGY1NGJjNjdjNDIzYik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9hMjljYjM2ZGY4YzA0ZmJkOTcyNmYwYWI2ZTJiNWIyYi5iaW5kUG9wdXAocG9wdXBfNWZkMTVmNDgyYzA5NDY3ZGE4ZDgzZTk0NDJkN2U3YWQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYjRiM2YyMDhiZWUxNGZkYWJiOWRiMDJkOWFjZGRiYzkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODc5MjA5Mzc1NTMyOTUsLTEyMi40MTA4ODI4MjU1NTFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zMTY2MzJhYzFkNTE0Y2ZiYjk2N2E3MmZiNGM3OTg2ZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zZmY2OGRhMjBhZGI0Nzg5YjYyZmYwMTQ5OWNmNzJiMSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF85ODA3YmE1ZmI0YzM0MWU3YTk3YmMxZTQ3NDAxMTUwYiA9ICQoJzxkaXYgaWQ9Imh0bWxfOTgwN2JhNWZiNGMzNDFlN2E5N2JjMWU0NzQwMTE1MGIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlZFSElDTEUgVEhFRlQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzNmZjY4ZGEyMGFkYjQ3ODliNjJmZjAxNDk5Y2Y3MmIxLnNldENvbnRlbnQoaHRtbF85ODA3YmE1ZmI0YzM0MWU3YTk3YmMxZTQ3NDAxMTUwYik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9iNGIzZjIwOGJlZTE0ZmRhYmI5ZGIwMmQ5YWNkZGJjOS5iaW5kUG9wdXAocG9wdXBfM2ZmNjhkYTIwYWRiNDc4OWI2MmZmMDE0OTljZjcyYjEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMDk3OGNiZTFmZGUxNDAxMGFmYTUxMTI0YzFhZjMyZjAgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy44MDA0NTY2NDcxMDM4OSwtMTIyLjQwMTQzMjc1NDcyMjAxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzE2NjMyYWMxZDUxNGNmYmI5NjdhNzJmYjRjNzk4NmQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNDFlNzQ4ZTZmZmEzNDFhZGE0Njk0ZGRmZWQyOGE4OGUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYTUzZmYyYTJiZjllNDYzMGEyNDE1OWI5OGY3YThkZGYgPSAkKCc8ZGl2IGlkPSJodG1sX2E1M2ZmMmEyYmY5ZTQ2MzBhMjQxNTliOThmN2E4ZGRmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5WRUhJQ0xFIFRIRUZUPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80MWU3NDhlNmZmYTM0MWFkYTQ2OTRkZGZlZDI4YTg4ZS5zZXRDb250ZW50KGh0bWxfYTUzZmYyYTJiZjllNDYzMGEyNDE1OWI5OGY3YThkZGYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMDk3OGNiZTFmZGUxNDAxMGFmYTUxMTI0YzFhZjMyZjAuYmluZFBvcHVwKHBvcHVwXzQxZTc0OGU2ZmZhMzQxYWRhNDY5NGRkZmVkMjhhODhlKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzQ3YzFjNDdlMWY2MjRjMmQ5NWMxZTQxN2UwMGY1ZDhiID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzQzNTU1MDU0MjI2NSwtMTIyLjQyMTEyODAyOTUwNV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzMxNjYzMmFjMWQ1MTRjZmJiOTY3YTcyZmI0Yzc5ODZkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzU0OWFkMDhmNmI1NjQ3ODU4NDEzNjI0MzZjM2U1YjQ3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2JiM2U2NDA3MGQ0MDQyYmRhYTU0ZWM2ODQ0ODlhYjgzID0gJCgnPGRpdiBpZD0iaHRtbF9iYjNlNjQwNzBkNDA0MmJkYWE1NGVjNjg0NDg5YWI4MyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TEFSQ0VOWS9USEVGVDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNTQ5YWQwOGY2YjU2NDc4NTg0MTM2MjQzNmMzZTViNDcuc2V0Q29udGVudChodG1sX2JiM2U2NDA3MGQ0MDQyYmRhYTU0ZWM2ODQ0ODlhYjgzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzQ3YzFjNDdlMWY2MjRjMmQ5NWMxZTQxN2UwMGY1ZDhiLmJpbmRQb3B1cChwb3B1cF81NDlhZDA4ZjZiNTY0Nzg1ODQxMzYyNDM2YzNlNWI0Nyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl83MTVhZTIxZGI0NDI0NTE4OTM5ZGIyNDcxMTc3MTU3ZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc4NjU2NDc2MDc2ODUsLTEyMi40MDcyNDQwODcwMzJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zMTY2MzJhYzFkNTE0Y2ZiYjk2N2E3MmZiNGM3OTg2ZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF84ZjM3ZWY1NmQwZGE0NjY5OWY3NGE3ODM0MjZhZGE5MCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF80YTgzOTJjNWM4ZmQ0YmRkOTQ0YzQyZmFmNGJkYmU0YSA9ICQoJzxkaXYgaWQ9Imh0bWxfNGE4MzkyYzVjOGZkNGJkZDk0NGM0MmZhZjRiZGJlNGEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkFTU0FVTFQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzhmMzdlZjU2ZDBkYTQ2Njk5Zjc0YTc4MzQyNmFkYTkwLnNldENvbnRlbnQoaHRtbF80YTgzOTJjNWM4ZmQ0YmRkOTQ0YzQyZmFmNGJkYmU0YSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl83MTVhZTIxZGI0NDI0NTE4OTM5ZGIyNDcxMTc3MTU3ZS5iaW5kUG9wdXAocG9wdXBfOGYzN2VmNTZkMGRhNDY2OTlmNzRhNzgzNDI2YWRhOTApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZjljZmQ4MzZmMmRkNGFjYTlkYzAzMTE4MGJkZmNlYmQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NjE1NjU1OTI4MDQ1LC0xMjIuNDIzODAzMDAxOTAwOTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zMTY2MzJhYzFkNTE0Y2ZiYjk2N2E3MmZiNGM3OTg2ZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF81MjRmNzllOTc3MDM0YTVkOTYxYjBiMzk4ZDYwZGUyMCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kMDQ1ZTYwNWI0ODE0OWZiYmYzNzhlYzgwMzg4M2EyNCA9ICQoJzxkaXYgaWQ9Imh0bWxfZDA0NWU2MDViNDgxNDlmYmJmMzc4ZWM4MDM4ODNhMjQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlJFQ09WRVJFRCBWRUhJQ0xFPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81MjRmNzllOTc3MDM0YTVkOTYxYjBiMzk4ZDYwZGUyMC5zZXRDb250ZW50KGh0bWxfZDA0NWU2MDViNDgxNDlmYmJmMzc4ZWM4MDM4ODNhMjQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZjljZmQ4MzZmMmRkNGFjYTlkYzAzMTE4MGJkZmNlYmQuYmluZFBvcHVwKHBvcHVwXzUyNGY3OWU5NzcwMzRhNWQ5NjFiMGIzOThkNjBkZTIwKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2IxMTJiMjg5NmU0MzQ2ZmI5YzhiZjZmYTViYTdjYjU5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzYxNTY1NTkyODA0NSwtMTIyLjQyMzgwMzAwMTkwMDk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzE2NjMyYWMxZDUxNGNmYmI5NjdhNzJmYjRjNzk4NmQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNjJiZmY3ZTBiNDQ0NGZmN2I3ZDg3OTk1MTI1MDkyMzYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMmIxNTQ5NTQ5NTdmNGM0MGI3ZjI1NWU5MGYzYmRkYjMgPSAkKCc8ZGl2IGlkPSJodG1sXzJiMTU0OTU0OTU3ZjRjNDBiN2YyNTVlOTBmM2JkZGIzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5PVEhFUiBPRkZFTlNFUzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNjJiZmY3ZTBiNDQ0NGZmN2I3ZDg3OTk1MTI1MDkyMzYuc2V0Q29udGVudChodG1sXzJiMTU0OTU0OTU3ZjRjNDBiN2YyNTVlOTBmM2JkZGIzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2IxMTJiMjg5NmU0MzQ2ZmI5YzhiZjZmYTViYTdjYjU5LmJpbmRQb3B1cChwb3B1cF82MmJmZjdlMGI0NDQ0ZmY3YjdkODc5OTUxMjUwOTIzNik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl80NTdiYjRlYzU4MTg0ZTFhYjBjY2JjZjU4OTFlM2M0NCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc0NDE5Mjc1MDg5MzIwNSwtMTIyLjQ0NDY4NTQ4MjI3M10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzMxNjYzMmFjMWQ1MTRjZmJiOTY3YTcyZmI0Yzc5ODZkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzA2Y2Q1NjQ0NGMzYjRkNzZiM2I0MjUwNTFiNWU3YzE4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2U1NTI0OTdlZDhhODRkZWNiYjY5ZjJjZjU4MmFlNDJhID0gJCgnPGRpdiBpZD0iaHRtbF9lNTUyNDk3ZWQ4YTg0ZGVjYmI2OWYyY2Y1ODJhZTQyYSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Tk9OLUNSSU1JTkFMPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wNmNkNTY0NDRjM2I0ZDc2YjNiNDI1MDUxYjVlN2MxOC5zZXRDb250ZW50KGh0bWxfZTU1MjQ5N2VkOGE4NGRlY2JiNjlmMmNmNTgyYWU0MmEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNDU3YmI0ZWM1ODE4NGUxYWIwY2NiY2Y1ODkxZTNjNDQuYmluZFBvcHVwKHBvcHVwXzA2Y2Q1NjQ0NGMzYjRkNzZiM2I0MjUwNTFiNWU3YzE4KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzljOGJiMGVkMzAwZTQ0ZmFiNGIyYjc0MDAyMDIyMWVlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzc1NDY5MjgyMDA0MSwtMTIyLjQxNTc1NzAzOTE5Nl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzMxNjYzMmFjMWQ1MTRjZmJiOTY3YTcyZmI0Yzc5ODZkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzExNDgzNzI5NjkyNjRmYjFhMTdhZTRkNjBmZjFkOGFiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzlmNTJjYjJkMGZjMjQzNTQ5NTZhYjJhMDI1YTgxZmZlID0gJCgnPGRpdiBpZD0iaHRtbF85ZjUyY2IyZDBmYzI0MzU0OTU2YWIyYTAyNWE4MWZmZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Tk9OLUNSSU1JTkFMPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xMTQ4MzcyOTY5MjY0ZmIxYTE3YWU0ZDYwZmYxZDhhYi5zZXRDb250ZW50KGh0bWxfOWY1MmNiMmQwZmMyNDM1NDk1NmFiMmEwMjVhODFmZmUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOWM4YmIwZWQzMDBlNDRmYWI0YjJiNzQwMDIwMjIxZWUuYmluZFBvcHVwKHBvcHVwXzExNDgzNzI5NjkyNjRmYjFhMTdhZTRkNjBmZjFkOGFiKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzU4OWJmYTAyZmFjNTRmNzdhODQ1NGViNTBiMjliOGYxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzI4NTI4MDYyNzQ2NSwtMTIyLjQ3NTY0NzQ2MDc4NTk5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzE2NjMyYWMxZDUxNGNmYmI5NjdhNzJmYjRjNzk4NmQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZDcwMzNjZDZhNDAxNDEwMTk4ZTJhY2IzN2FkOWMwZTEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMjgyYzI2YjVkYTI3NGI3MDhhZjVjODNlMDE3OGUzMjEgPSAkKCc8ZGl2IGlkPSJodG1sXzI4MmMyNmI1ZGEyNzRiNzA4YWY1YzgzZTAxNzhlMzIxIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5ST0JCRVJZPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kNzAzM2NkNmE0MDE0MTAxOThlMmFjYjM3YWQ5YzBlMS5zZXRDb250ZW50KGh0bWxfMjgyYzI2YjVkYTI3NGI3MDhhZjVjODNlMDE3OGUzMjEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNTg5YmZhMDJmYWM1NGY3N2E4NDU0ZWI1MGIyOWI4ZjEuYmluZFBvcHVwKHBvcHVwX2Q3MDMzY2Q2YTQwMTQxMDE5OGUyYWNiMzdhZDljMGUxKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2M1ZjQ2YTEzNTUxZTQ1N2NiY2UzOWY2N2NmN2Y1ZDg0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzQyODUxNzM3NDQ0ODk0LC0xMjIuNDIwOTY3NDQwNTY0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzE2NjMyYWMxZDUxNGNmYmI5NjdhNzJmYjRjNzk4NmQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMTc5MzY5ZTA5N2RkNGFlNmExMmI1ZTA1ODA2NjczNjIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYjgwOGZlZjQxMzI5NGQ5YWJkZmM5ZWVkNDZhMjg4MjMgPSAkKCc8ZGl2IGlkPSJodG1sX2I4MDhmZWY0MTMyOTRkOWFiZGZjOWVlZDQ2YTI4ODIzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5PVEhFUiBPRkZFTlNFUzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMTc5MzY5ZTA5N2RkNGFlNmExMmI1ZTA1ODA2NjczNjIuc2V0Q29udGVudChodG1sX2I4MDhmZWY0MTMyOTRkOWFiZGZjOWVlZDQ2YTI4ODIzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2M1ZjQ2YTEzNTUxZTQ1N2NiY2UzOWY2N2NmN2Y1ZDg0LmJpbmRQb3B1cChwb3B1cF8xNzkzNjllMDk3ZGQ0YWU2YTEyYjVlMDU4MDY2NzM2Mik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8wZGMwMGMyYTJkYWE0MmYxYmI4MDc0NTU0ODI0NzNiYiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc4MjExOTg0ODg5MzEsLTEyMi40MTU2Njk2NjE0NDNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zMTY2MzJhYzFkNTE0Y2ZiYjk2N2E3MmZiNGM3OTg2ZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iMTQxNzA2NjJiMTQ0YjhjYjQ1ZGM2MDQyNmRmNWRmYSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82MTQyNDdiMThmNmM0NzY1OTgxMmViOTMzOGIwNTY0NSA9ICQoJzxkaXYgaWQ9Imh0bWxfNjE0MjQ3YjE4ZjZjNDc2NTk4MTJlYjkzMzhiMDU2NDUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlZBTkRBTElTTTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYjE0MTcwNjYyYjE0NGI4Y2I0NWRjNjA0MjZkZjVkZmEuc2V0Q29udGVudChodG1sXzYxNDI0N2IxOGY2YzQ3NjU5ODEyZWI5MzM4YjA1NjQ1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzBkYzAwYzJhMmRhYTQyZjFiYjgwNzQ1NTQ4MjQ3M2JiLmJpbmRQb3B1cChwb3B1cF9iMTQxNzA2NjJiMTQ0YjhjYjQ1ZGM2MDQyNmRmNWRmYSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl82ZWE0YzMwYTM3NDQ0OGEyYTE0M2MxOTYxYzU4ZjNmNSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc3OTE2NzQyMTg5NjMsLTEyMi40MDYzNDY0MjU2MzJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zMTY2MzJhYzFkNTE0Y2ZiYjk2N2E3MmZiNGM3OTg2ZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hMWU2NmJiNjg0Mjg0NTYxYWY2ZTg0MzAzOTc3Mzk3MCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lYWJiYjI2OGNmOTc0N2ZlODY3YjU0OTE3ZWE5NmMxMSA9ICQoJzxkaXYgaWQ9Imh0bWxfZWFiYmIyNjhjZjk3NDdmZTg2N2I1NDkxN2VhOTZjMTEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkFTU0FVTFQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2ExZTY2YmI2ODQyODQ1NjFhZjZlODQzMDM5NzczOTcwLnNldENvbnRlbnQoaHRtbF9lYWJiYjI2OGNmOTc0N2ZlODY3YjU0OTE3ZWE5NmMxMSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl82ZWE0YzMwYTM3NDQ0OGEyYTE0M2MxOTYxYzU4ZjNmNS5iaW5kUG9wdXAocG9wdXBfYTFlNjZiYjY4NDI4NDU2MWFmNmU4NDMwMzk3NzM5NzApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYTU5MGZjZjM2NGEwNDc3ZTg2YzAwZjJhYjEzZWM3ODggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NjU3MTg0Mzk1MjgyLC0xMjIuNDA5NTI5OTEzMjc4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzE2NjMyYWMxZDUxNGNmYmI5NjdhNzJmYjRjNzk4NmQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNmIzYTgyNDg4MjgwNDk0ODgyMzVlMTE5ZDBlZmQzNzUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOTdkNGQyYzk4MTEyNGZiOGI1NDRhNTY4MzFlZTVhODUgPSAkKCc8ZGl2IGlkPSJodG1sXzk3ZDRkMmM5ODExMjRmYjhiNTQ0YTU2ODMxZWU1YTg1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5MQVJDRU5ZL1RIRUZUPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82YjNhODI0ODgyODA0OTQ4ODIzNWUxMTlkMGVmZDM3NS5zZXRDb250ZW50KGh0bWxfOTdkNGQyYzk4MTEyNGZiOGI1NDRhNTY4MzFlZTVhODUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYTU5MGZjZjM2NGEwNDc3ZTg2YzAwZjJhYjEzZWM3ODguYmluZFBvcHVwKHBvcHVwXzZiM2E4MjQ4ODI4MDQ5NDg4MjM1ZTExOWQwZWZkMzc1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzI3NTg1MTk0MDViZjQyNjc5YjJlODdmNzNjYzFlZWM4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzc1NDIwNzA2NzExLC0xMjIuNDAzNDA0NzkxNDc4OTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zMTY2MzJhYzFkNTE0Y2ZiYjk2N2E3MmZiNGM3OTg2ZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lMWMwNzU4OWRkNmQ0YTNlOGRkNWU5YzdjOWU5MDBlNyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82MDQ3NDFjNGIzZGY0N2MwYmI1NGRhOWE2MTk0ZDgwOSA9ICQoJzxkaXYgaWQ9Imh0bWxfNjA0NzQxYzRiM2RmNDdjMGJiNTRkYTlhNjE5NGQ4MDkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk5PTi1DUklNSU5BTDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZTFjMDc1ODlkZDZkNGEzZThkZDVlOWM3YzllOTAwZTcuc2V0Q29udGVudChodG1sXzYwNDc0MWM0YjNkZjQ3YzBiYjU0ZGE5YTYxOTRkODA5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzI3NTg1MTk0MDViZjQyNjc5YjJlODdmNzNjYzFlZWM4LmJpbmRQb3B1cChwb3B1cF9lMWMwNzU4OWRkNmQ0YTNlOGRkNWU5YzdjOWU5MDBlNyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9hZTNjOTk3ZDhiOTI0MWY5YTUwMWM4Zjc1N2E5NDNhNCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc2NzUyNDMwODc4MywtMTIyLjQxMDczODA5NzMxNV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzMxNjYzMmFjMWQ1MTRjZmJiOTY3YTcyZmI0Yzc5ODZkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzVlNzJiNWU1NzAyMzQwY2M4YjMzNWFkZGU1ZjViMDYzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzQ2NTMzYjcxMWUwOTRmYjA5MWExNjdhYzM2YWQyYTY0ID0gJCgnPGRpdiBpZD0iaHRtbF80NjUzM2I3MTFlMDk0ZmIwOTFhMTY3YWMzNmFkMmE2NCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QlVSR0xBUlk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzVlNzJiNWU1NzAyMzQwY2M4YjMzNWFkZGU1ZjViMDYzLnNldENvbnRlbnQoaHRtbF80NjUzM2I3MTFlMDk0ZmIwOTFhMTY3YWMzNmFkMmE2NCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9hZTNjOTk3ZDhiOTI0MWY5YTUwMWM4Zjc1N2E5NDNhNC5iaW5kUG9wdXAocG9wdXBfNWU3MmI1ZTU3MDIzNDBjYzhiMzM1YWRkZTVmNWIwNjMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNWNmODBiOTViYmI0NDEzZmI0YTgwNWE0YWM5ZjFmOGYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43Njc1MjQzMDg3ODMsLTEyMi40MTA3MzgwOTczMTVdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zMTY2MzJhYzFkNTE0Y2ZiYjk2N2E3MmZiNGM3OTg2ZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9kNmQwODBkYzcyOGU0MWVmYmM1NDllOGY3OGFiZjcwMiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82Zjg3OGMzYTRhNTE0MzM2OGY4ZjNjMzA2MzcyYjQwYSA9ICQoJzxkaXYgaWQ9Imh0bWxfNmY4NzhjM2E0YTUxNDMzNjhmOGYzYzMwNjM3MmI0MGEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkFSU09OPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kNmQwODBkYzcyOGU0MWVmYmM1NDllOGY3OGFiZjcwMi5zZXRDb250ZW50KGh0bWxfNmY4NzhjM2E0YTUxNDMzNjhmOGYzYzMwNjM3MmI0MGEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNWNmODBiOTViYmI0NDEzZmI0YTgwNWE0YWM5ZjFmOGYuYmluZFBvcHVwKHBvcHVwX2Q2ZDA4MGRjNzI4ZTQxZWZiYzU0OWU4Zjc4YWJmNzAyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzMyMmJkZjE3OWU0MzQyZTk4OGViYzFjZDBiYzYyZWZiID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzEzMTA4MzQzMzI2NCwtMTIyLjQ0NDMxNDAyNTE4OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzMxNjYzMmFjMWQ1MTRjZmJiOTY3YTcyZmI0Yzc5ODZkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzEyZWY1NjU1NTIzYzQ4Mzc5NTZmMzJiM2E3YTdkY2U3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzk2ODM3MmMwNGZkMDQ1NTA4ZmY3N2MzYWQ4NWM2N2VjID0gJCgnPGRpdiBpZD0iaHRtbF85NjgzNzJjMDRmZDA0NTUwOGZmNzdjM2FkODVjNjdlYyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QlVSR0xBUlk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzEyZWY1NjU1NTIzYzQ4Mzc5NTZmMzJiM2E3YTdkY2U3LnNldENvbnRlbnQoaHRtbF85NjgzNzJjMDRmZDA0NTUwOGZmNzdjM2FkODVjNjdlYyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8zMjJiZGYxNzllNDM0MmU5ODhlYmMxY2QwYmM2MmVmYi5iaW5kUG9wdXAocG9wdXBfMTJlZjU2NTU1MjNjNDgzNzk1NmYzMmIzYTdhN2RjZTcpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZjJlNTMzYzUxNTE4NDJmMzkyYzk0NDAyODA0NjRhYjMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43MTMxMDgzNDMzMjY0LC0xMjIuNDQ0MzE0MDI1MTg4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzE2NjMyYWMxZDUxNGNmYmI5NjdhNzJmYjRjNzk4NmQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOWNkZGZjZmQ4ZWFkNDU0NzhmZTM5YjNiNzNjMDYyZTUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNmFlYTRjYzc5MjIyNGQwMjhiYWI1NTE3NWEyZGQ3NzcgPSAkKCc8ZGl2IGlkPSJodG1sXzZhZWE0Y2M3OTIyMjRkMDI4YmFiNTUxNzVhMmRkNzc3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5EUlVHL05BUkNPVElDPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85Y2RkZmNmZDhlYWQ0NTQ3OGZlMzliM2I3M2MwNjJlNS5zZXRDb250ZW50KGh0bWxfNmFlYTRjYzc5MjIyNGQwMjhiYWI1NTE3NWEyZGQ3NzcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZjJlNTMzYzUxNTE4NDJmMzkyYzk0NDAyODA0NjRhYjMuYmluZFBvcHVwKHBvcHVwXzljZGRmY2ZkOGVhZDQ1NDc4ZmUzOWIzYjczYzA2MmU1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzA5OTAyODg4NWI2YTRhZTdhZGMzMTMyMTQ5ZjdjNTRhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzY2MDE2MDExNDEwMywtMTIyLjQwMzY0NDYyMDQzOV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzMxNjYzMmFjMWQ1MTRjZmJiOTY3YTcyZmI0Yzc5ODZkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzMyNTk0MWIyMzlhZDQzNWZhNzA5MmU4YTdkNDQyNTkzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzZkZjEzOTFjMmMzODQzMzg5NmZkNGIxOTRiOGM5ZWQxID0gJCgnPGRpdiBpZD0iaHRtbF82ZGYxMzkxYzJjMzg0MzM4OTZmZDRiMTk0YjhjOWVkMSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TUlTU0lORyBQRVJTT048L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzMyNTk0MWIyMzlhZDQzNWZhNzA5MmU4YTdkNDQyNTkzLnNldENvbnRlbnQoaHRtbF82ZGYxMzkxYzJjMzg0MzM4OTZmZDRiMTk0YjhjOWVkMSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8wOTkwMjg4ODViNmE0YWU3YWRjMzEzMjE0OWY3YzU0YS5iaW5kUG9wdXAocG9wdXBfMzI1OTQxYjIzOWFkNDM1ZmE3MDkyZThhN2Q0NDI1OTMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMDkwOTgxMzQ0YjgzNDJkNjk3M2Y0ZTM4MzE2ZTNiZGUgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NjYwMTYwMTE0MTAzLC0xMjIuNDAzNjQ0NjIwNDM5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzE2NjMyYWMxZDUxNGNmYmI5NjdhNzJmYjRjNzk4NmQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYmIxMGE5NGMwNWI5NGQzYWIwODdlZDlhZDZmZDQ2MmMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOWY0ZjhhYzg1MjEwNDc3Yzg3NDAxNTZkYWE0N2QyZTQgPSAkKCc8ZGl2IGlkPSJodG1sXzlmNGY4YWM4NTIxMDQ3N2M4NzQwMTU2ZGFhNDdkMmU0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NSVNTSU5HIFBFUlNPTjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYmIxMGE5NGMwNWI5NGQzYWIwODdlZDlhZDZmZDQ2MmMuc2V0Q29udGVudChodG1sXzlmNGY4YWM4NTIxMDQ3N2M4NzQwMTU2ZGFhNDdkMmU0KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzA5MDk4MTM0NGI4MzQyZDY5NzNmNGUzODMxNmUzYmRlLmJpbmRQb3B1cChwb3B1cF9iYjEwYTk0YzA1Yjk0ZDNhYjA4N2VkOWFkNmZkNDYyYyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9iNDFhZmVkZWM5ODA0ZTkyODA1Zjk5ZDE3ZTg5MmQxOSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc3NjIzMTA0MDQ3NTgsLTEyMi40MTQ3MTQyOTU1Nzg5OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzMxNjYzMmFjMWQ1MTRjZmJiOTY3YTcyZmI0Yzc5ODZkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzYyOGUyNWE5MDk4YzRhZDliMjBiMThhNjkzZWQ1M2Y5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzRiMjA5OTFmMjM3ZDRhYTJiODY3OWYwM2EwNTk5NjliID0gJCgnPGRpdiBpZD0iaHRtbF80YjIwOTkxZjIzN2Q0YWEyYjg2NzlmMDNhMDU5OTY5YiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QVNTQVVMVDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNjI4ZTI1YTkwOThjNGFkOWIyMGIxOGE2OTNlZDUzZjkuc2V0Q29udGVudChodG1sXzRiMjA5OTFmMjM3ZDRhYTJiODY3OWYwM2EwNTk5NjliKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2I0MWFmZWRlYzk4MDRlOTI4MDVmOTlkMTdlODkyZDE5LmJpbmRQb3B1cChwb3B1cF82MjhlMjVhOTA5OGM0YWQ5YjIwYjE4YTY5M2VkNTNmOSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl80NWFkNzU5OWVhZDk0YWZkOTYyMGQ0Yjg1NjA3NzQyOCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc3NjIzMTA0MDQ3NTgsLTEyMi40MTQ3MTQyOTU1Nzg5OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzMxNjYzMmFjMWQ1MTRjZmJiOTY3YTcyZmI0Yzc5ODZkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzUzMmVmMjcyODM0OTQ3MTFiMzg1NGM0ZDNhNjIwNzI4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzRmYzg2MDVkNGRmYzQwMThhNDk3MDI3ZTYyYThkZjM0ID0gJCgnPGRpdiBpZD0iaHRtbF80ZmM4NjA1ZDRkZmM0MDE4YTQ5NzAyN2U2MmE4ZGYzNCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TUlTU0lORyBQRVJTT048L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzUzMmVmMjcyODM0OTQ3MTFiMzg1NGM0ZDNhNjIwNzI4LnNldENvbnRlbnQoaHRtbF80ZmM4NjA1ZDRkZmM0MDE4YTQ5NzAyN2U2MmE4ZGYzNCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl80NWFkNzU5OWVhZDk0YWZkOTYyMGQ0Yjg1NjA3NzQyOC5iaW5kUG9wdXAocG9wdXBfNTMyZWYyNzI4MzQ5NDcxMWIzODU0YzRkM2E2MjA3MjgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMTc4NDFhMGUxZGEzNGE5OWE0YTAyZjZhMDUwYTkxNzYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43Nzc1MTE4ODk1Njk1LC0xMjIuNDE4MDQ1NDUyNzY4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzE2NjMyYWMxZDUxNGNmYmI5NjdhNzJmYjRjNzk4NmQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYWQ2ZTkzZmM2Yzk5NDQ1M2E3Mjk3MGRhMGE1MWIzYjYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfODlkODhlNjllZjFhNGY3OGJhMjUxMzRkNGMxMmY4MWUgPSAkKCc8ZGl2IGlkPSJodG1sXzg5ZDg4ZTY5ZWYxYTRmNzhiYTI1MTM0ZDRjMTJmODFlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5WRUhJQ0xFIFRIRUZUPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hZDZlOTNmYzZjOTk0NDUzYTcyOTcwZGEwYTUxYjNiNi5zZXRDb250ZW50KGh0bWxfODlkODhlNjllZjFhNGY3OGJhMjUxMzRkNGMxMmY4MWUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMTc4NDFhMGUxZGEzNGE5OWE0YTAyZjZhMDUwYTkxNzYuYmluZFBvcHVwKHBvcHVwX2FkNmU5M2ZjNmM5OTQ0NTNhNzI5NzBkYTBhNTFiM2I2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2MxYTczZDE3MTc5NDRkN2Q4ZWZlMGExZWUyYTMzYWYwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzgyMDIzODQ3ODk3NSwtMTIyLjQwMTE2MTU1NTYwMl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzMxNjYzMmFjMWQ1MTRjZmJiOTY3YTcyZmI0Yzc5ODZkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2U4MjVmMjhlNmYxMDQwY2FiNzg3MmFmYjdhYjEzYzkyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzM4YzY3YWUzMTY3MjQ0ODQ4ZTkzMGIyZDA2ODUzMzhhID0gJCgnPGRpdiBpZD0iaHRtbF8zOGM2N2FlMzE2NzI0NDg0OGU5MzBiMmQwNjg1MzM4YSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+T1RIRVIgT0ZGRU5TRVM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2U4MjVmMjhlNmYxMDQwY2FiNzg3MmFmYjdhYjEzYzkyLnNldENvbnRlbnQoaHRtbF8zOGM2N2FlMzE2NzI0NDg0OGU5MzBiMmQwNjg1MzM4YSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9jMWE3M2QxNzE3OTQ0ZDdkOGVmZTBhMWVlMmEzM2FmMC5iaW5kUG9wdXAocG9wdXBfZTgyNWYyOGU2ZjEwNDBjYWI3ODcyYWZiN2FiMTNjOTIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYzViMGQwYzkzOGYxNGRlOTg3NGQ1NzEyMDZhMGUxZjMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43MjcwMDUzMTk2Mjk5OTUsLTEyMi40MDM0MDg2NjkxOTFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zMTY2MzJhYzFkNTE0Y2ZiYjk2N2E3MmZiNGM3OTg2ZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xYjk3Zjg1MTcxMWE0ZjQyOTczYTU1ODJhMjFkYmRmOCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF81MjBiOWU3NzRkODY0MGUxYTVhZWM0NzI0MmIwZjdiMiA9ICQoJzxkaXYgaWQ9Imh0bWxfNTIwYjllNzc0ZDg2NDBlMWE1YWVjNDcyNDJiMGY3YjIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPldBUlJBTlRTPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xYjk3Zjg1MTcxMWE0ZjQyOTczYTU1ODJhMjFkYmRmOC5zZXRDb250ZW50KGh0bWxfNTIwYjllNzc0ZDg2NDBlMWE1YWVjNDcyNDJiMGY3YjIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYzViMGQwYzkzOGYxNGRlOTg3NGQ1NzEyMDZhMGUxZjMuYmluZFBvcHVwKHBvcHVwXzFiOTdmODUxNzExYTRmNDI5NzNhNTU4MmEyMWRiZGY4KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2E1NzY3N2MxNWM5NzQ3MTBiMmM5NWViODUzNzYzMjI3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzgzODM0NDM3NDE0MSwtMTIyLjQxMjkzMDUyMjA1OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzMxNjYzMmFjMWQ1MTRjZmJiOTY3YTcyZmI0Yzc5ODZkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2NjODk5N2E3MjRkNDRlZDY4YjI3NGJlN2Y1NDNiMzU1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2RlY2U0ZmFjZGNjMTRjY2RhMDUwMzU5M2U0NTU1NzQwID0gJCgnPGRpdiBpZD0iaHRtbF9kZWNlNGZhY2RjYzE0Y2NkYTA1MDM1OTNlNDU1NTc0MCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+VkFOREFMSVNNPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jYzg5OTdhNzI0ZDQ0ZWQ2OGIyNzRiZTdmNTQzYjM1NS5zZXRDb250ZW50KGh0bWxfZGVjZTRmYWNkY2MxNGNjZGEwNTAzNTkzZTQ1NTU3NDApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYTU3Njc3YzE1Yzk3NDcxMGIyYzk1ZWI4NTM3NjMyMjcuYmluZFBvcHVwKHBvcHVwX2NjODk5N2E3MjRkNDRlZDY4YjI3NGJlN2Y1NDNiMzU1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzVjNDYxODg3MmQ3NTQ1Y2VhNDg0MGQ1MzM5MjRjMTY2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzUzMDE4NjUzNzQ0NjA0LC0xMjIuNDE4NTg3MTcyMjE5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzE2NjMyYWMxZDUxNGNmYmI5NjdhNzJmYjRjNzk4NmQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMGQ3MGQ5NTllYTJlNDAyOGI3NjA5ZGU0Mzk0N2FkZWYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYjExNGFkZTE1N2QxNDY0NTlhNmQ3MjU1MjJkNjBiYjcgPSAkKCc8ZGl2IGlkPSJodG1sX2IxMTRhZGUxNTdkMTQ2NDU5YTZkNzI1NTIyZDYwYmI3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5OT04tQ1JJTUlOQUw8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzBkNzBkOTU5ZWEyZTQwMjhiNzYwOWRlNDM5NDdhZGVmLnNldENvbnRlbnQoaHRtbF9iMTE0YWRlMTU3ZDE0NjQ1OWE2ZDcyNTUyMmQ2MGJiNyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81YzQ2MTg4NzJkNzU0NWNlYTQ4NDBkNTMzOTI0YzE2Ni5iaW5kUG9wdXAocG9wdXBfMGQ3MGQ5NTllYTJlNDAyOGI3NjA5ZGU0Mzk0N2FkZWYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZGY1MmFhZTk5YTQ1NDAzYmFkYjE2NGQxZGEzMzlkODggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NzQwNDE4Mzg1MDQxLC0xMjIuNDE0MzcwNjI3NDk1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzE2NjMyYWMxZDUxNGNmYmI5NjdhNzJmYjRjNzk4NmQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNzM5MDk5MWFkNTlhNGFkOGI5MjVjYzYyNjg5YzJjNGEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNTRlYTMxNTY5YzdlNDczYzg2NTRhYzgwMTdiMDEzZGQgPSAkKCc8ZGl2IGlkPSJodG1sXzU0ZWEzMTU2OWM3ZTQ3M2M4NjU0YWM4MDE3YjAxM2RkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5GUkFVRDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNzM5MDk5MWFkNTlhNGFkOGI5MjVjYzYyNjg5YzJjNGEuc2V0Q29udGVudChodG1sXzU0ZWEzMTU2OWM3ZTQ3M2M4NjU0YWM4MDE3YjAxM2RkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2RmNTJhYWU5OWE0NTQwM2JhZGIxNjRkMWRhMzM5ZDg4LmJpbmRQb3B1cChwb3B1cF83MzkwOTkxYWQ1OWE0YWQ4YjkyNWNjNjI2ODljMmM0YSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl84NzA0ZDFjMzczOWM0ODI3OTQ2NWNjNTYwYWE5NjJjZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc5MDUzODk5MzcyNSwtMTIyLjQwMzkxNTY4MTU3MTAxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzE2NjMyYWMxZDUxNGNmYmI5NjdhNzJmYjRjNzk4NmQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMmFkZmM0MWUzZWU4NGM5YzkxMDgzZDVhYTRlY2NjMWYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMzYzNzExYmRjNDM3NGE0YTgwODM3ZGQzNzBlMzk5YWQgPSAkKCc8ZGl2IGlkPSJodG1sXzM2MzcxMWJkYzQzNzRhNGE4MDgzN2RkMzcwZTM5OWFkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5BU1NBVUxUPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yYWRmYzQxZTNlZTg0YzljOTEwODNkNWFhNGVjY2MxZi5zZXRDb250ZW50KGh0bWxfMzYzNzExYmRjNDM3NGE0YTgwODM3ZGQzNzBlMzk5YWQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfODcwNGQxYzM3MzljNDgyNzk0NjVjYzU2MGFhOTYyY2UuYmluZFBvcHVwKHBvcHVwXzJhZGZjNDFlM2VlODRjOWM5MTA4M2Q1YWE0ZWNjYzFmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzJhYzY4ZjljOTQxODQ5ZWJiNDUxYjY1NTViYjYwODJhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzgzMDk5ODI0NDU5MjEsLTEyMi40MTkxODMwOTYzNjJdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zMTY2MzJhYzFkNTE0Y2ZiYjk2N2E3MmZiNGM3OTg2ZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wZGM4MmU5NDFhYmM0MjIwYjEyZmQzMDMxNWE3ODQ1MiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hMzMxNzQ1YjAzZWE0NTcwOGRiOTY1ZTNmNWQyY2NmNiA9ICQoJzxkaXYgaWQ9Imh0bWxfYTMzMTc0NWIwM2VhNDU3MDhkYjk2NWUzZjVkMmNjZjYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk9USEVSIE9GRkVOU0VTPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wZGM4MmU5NDFhYmM0MjIwYjEyZmQzMDMxNWE3ODQ1Mi5zZXRDb250ZW50KGh0bWxfYTMzMTc0NWIwM2VhNDU3MDhkYjk2NWUzZjVkMmNjZjYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMmFjNjhmOWM5NDE4NDllYmI0NTFiNjU1NWJiNjA4MmEuYmluZFBvcHVwKHBvcHVwXzBkYzgyZTk0MWFiYzQyMjBiMTJmZDMwMzE1YTc4NDUyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzgxMTc1ZDVmMTVhZjQwMzRiMTNkODVkYzkxZjhiM2YzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzQwNzM2MDU0ODM1NzksLTEyMi4zODg3NTMwNDY5OTddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zMTY2MzJhYzFkNTE0Y2ZiYjk2N2E3MmZiNGM3OTg2ZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85ODczOGQyNjcyNmY0MmY5YWUxZTM2MjMyZWIyZGQzNCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iZWJjYzM5YzYxMTk0OWNkODBkZmRjODMwOGUyNmRhNSA9ICQoJzxkaXYgaWQ9Imh0bWxfYmViY2MzOWM2MTE5NDljZDgwZGZkYzgzMDhlMjZkYTUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk9USEVSIE9GRkVOU0VTPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85ODczOGQyNjcyNmY0MmY5YWUxZTM2MjMyZWIyZGQzNC5zZXRDb250ZW50KGh0bWxfYmViY2MzOWM2MTE5NDljZDgwZGZkYzgzMDhlMjZkYTUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfODExNzVkNWYxNWFmNDAzNGIxM2Q4NWRjOTFmOGIzZjMuYmluZFBvcHVwKHBvcHVwXzk4NzM4ZDI2NzI2ZjQyZjlhZTFlMzYyMzJlYjJkZDM0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzdhZGQxZmJlYjE1YjRhMTJiMWM5ZDVkZmU2MjRkOTM5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzc0OTkxMjk0NDM2NiwtMTIyLjQzNzc5OTcwMzQ2OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzMxNjYzMmFjMWQ1MTRjZmJiOTY3YTcyZmI0Yzc5ODZkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzZlM2Y0MDkxMjYyMjRmZTdiODNmNTE2OWM2ODVmOTE0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2U5NmFiMzVkYzRhZDQ0MjZhMjVlYjIzOWY1MDVjMzI0ID0gJCgnPGRpdiBpZD0iaHRtbF9lOTZhYjM1ZGM0YWQ0NDI2YTI1ZWIyMzlmNTA1YzMyNCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TEFSQ0VOWS9USEVGVDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNmUzZjQwOTEyNjIyNGZlN2I4M2Y1MTY5YzY4NWY5MTQuc2V0Q29udGVudChodG1sX2U5NmFiMzVkYzRhZDQ0MjZhMjVlYjIzOWY1MDVjMzI0KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzdhZGQxZmJlYjE1YjRhMTJiMWM5ZDVkZmU2MjRkOTM5LmJpbmRQb3B1cChwb3B1cF82ZTNmNDA5MTI2MjI0ZmU3YjgzZjUxNjljNjg1ZjkxNCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl84YzYyZjMzOWI3OTA0Y2RjOGMxZGExMjVhYjU1N2Y2YyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc3NzA5MDI3NDM2NjksLTEyMi40MjEzMzI2ODQ2MzNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zMTY2MzJhYzFkNTE0Y2ZiYjk2N2E3MmZiNGM3OTg2ZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lN2U3MGM5YjNmYjg0NWJjOGU4NDI0YTZlMzcwYTVkMCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zYmRmYTEwM2VkN2U0YzJmOTUyNjEzNWRkZmEwZGRkZSA9ICQoJzxkaXYgaWQ9Imh0bWxfM2JkZmExMDNlZDdlNGMyZjk1MjYxMzVkZGZhMGRkZGUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk1JU1NJTkcgUEVSU09OPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lN2U3MGM5YjNmYjg0NWJjOGU4NDI0YTZlMzcwYTVkMC5zZXRDb250ZW50KGh0bWxfM2JkZmExMDNlZDdlNGMyZjk1MjYxMzVkZGZhMGRkZGUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOGM2MmYzMzliNzkwNGNkYzhjMWRhMTI1YWI1NTdmNmMuYmluZFBvcHVwKHBvcHVwX2U3ZTcwYzliM2ZiODQ1YmM4ZTg0MjRhNmUzNzBhNWQwKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzUzMzVlZTIyMDVjYjRjZTc4NWJkMGI1MmJjZGQxMTcwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzc3MDkwMjc0MzY2OSwtMTIyLjQyMTMzMjY4NDYzM10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzMxNjYzMmFjMWQ1MTRjZmJiOTY3YTcyZmI0Yzc5ODZkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzlmZWQ2ZjAyNjJhODRjODA5OWQ2ZWQ3MmMwYWM5NDlhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzhkMDJmMGNhZDI5YTQ1NWE4Y2Y5MzFhYTQzZTIxM2JlID0gJCgnPGRpdiBpZD0iaHRtbF84ZDAyZjBjYWQyOWE0NTVhOGNmOTMxYWE0M2UyMTNiZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TUlTU0lORyBQRVJTT048L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzlmZWQ2ZjAyNjJhODRjODA5OWQ2ZWQ3MmMwYWM5NDlhLnNldENvbnRlbnQoaHRtbF84ZDAyZjBjYWQyOWE0NTVhOGNmOTMxYWE0M2UyMTNiZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81MzM1ZWUyMjA1Y2I0Y2U3ODViZDBiNTJiY2RkMTE3MC5iaW5kUG9wdXAocG9wdXBfOWZlZDZmMDI2MmE4NGM4MDk5ZDZlZDcyYzBhYzk0OWEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMjBiYWYwZGQ2Y2UxNDVkNTk5ZWFjMjc3NjZjYjFhM2UgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODIyNDU4MjIzOTE3LC0xMjIuNDQ2NjEyOTc4ODM5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzE2NjMyYWMxZDUxNGNmYmI5NjdhNzJmYjRjNzk4NmQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMjMwOGM2NzdkNzBiNDQzNGI2NjUzMjU3OWY2MjM1ODEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYTBiM2I5OGRjOTk4NDMwNWJiMTMyZmU3OGQyZTA2ZTkgPSAkKCc8ZGl2IGlkPSJodG1sX2EwYjNiOThkYzk5ODQzMDViYjEzMmZlNzhkMmUwNmU5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5XQVJSQU5UUzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMjMwOGM2NzdkNzBiNDQzNGI2NjUzMjU3OWY2MjM1ODEuc2V0Q29udGVudChodG1sX2EwYjNiOThkYzk5ODQzMDViYjEzMmZlNzhkMmUwNmU5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzIwYmFmMGRkNmNlMTQ1ZDU5OWVhYzI3NzY2Y2IxYTNlLmJpbmRQb3B1cChwb3B1cF8yMzA4YzY3N2Q3MGI0NDM0YjY2NTMyNTc5ZjYyMzU4MSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8wZjNlNTIzZjUzNmY0ZmRlYmM2NzZiZTc5NTE5N2UzZiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjczMDAzNzk5OTUxMjc5NSwtMTIyLjQwNDU5NDE0MDYzNF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzMxNjYzMmFjMWQ1MTRjZmJiOTY3YTcyZmI0Yzc5ODZkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2RhNDE2YTA0YzZmYjRjM2Y4MDI1MWMyYThiMWI0OTdiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzI2MzI4YzliZjIyNDQwNmM4NjQzYjdkMjU1Mzc0MjdhID0gJCgnPGRpdiBpZD0iaHRtbF8yNjMyOGM5YmYyMjQ0MDZjODY0M2I3ZDI1NTM3NDI3YSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Tk9OLUNSSU1JTkFMPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kYTQxNmEwNGM2ZmI0YzNmODAyNTFjMmE4YjFiNDk3Yi5zZXRDb250ZW50KGh0bWxfMjYzMjhjOWJmMjI0NDA2Yzg2NDNiN2QyNTUzNzQyN2EpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMGYzZTUyM2Y1MzZmNGZkZWJjNjc2YmU3OTUxOTdlM2YuYmluZFBvcHVwKHBvcHVwX2RhNDE2YTA0YzZmYjRjM2Y4MDI1MWMyYThiMWI0OTdiKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2IxYjRiZTYxNzdmYjQwNWI5ZmJlMjY1NDA4YzhkYjgyID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzk1MzMzODI2NzQzNiwtMTIyLjM5NzM3Mzc0MDA2Nl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzMxNjYzMmFjMWQ1MTRjZmJiOTY3YTcyZmI0Yzc5ODZkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2FkYzVmOTIwYzBkMDRlNDliOTYzYThjMmIxMjVhZTdiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzRiYmYwN2FhYmM3ZDQwZDU4YjE1YzFmYWFlZDcwYzI2ID0gJCgnPGRpdiBpZD0iaHRtbF80YmJmMDdhYWJjN2Q0MGQ1OGIxNWMxZmFhZWQ3MGMyNiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Tk9OLUNSSU1JTkFMPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hZGM1ZjkyMGMwZDA0ZTQ5Yjk2M2E4YzJiMTI1YWU3Yi5zZXRDb250ZW50KGh0bWxfNGJiZjA3YWFiYzdkNDBkNThiMTVjMWZhYWVkNzBjMjYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYjFiNGJlNjE3N2ZiNDA1YjlmYmUyNjU0MDhjOGRiODIuYmluZFBvcHVwKHBvcHVwX2FkYzVmOTIwYzBkMDRlNDliOTYzYThjMmIxMjVhZTdiKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzdkNWY0ZmNlNjQ4MzRlNWU4MzY1YWZhZDY1MTBjMDQwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzg3NTE1ODc0MTYyMjk1LC0xMjIuNDA3NDM0OTg5NTIzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzE2NjMyYWMxZDUxNGNmYmI5NjdhNzJmYjRjNzk4NmQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNGQ2NjI1NjIxNDZhNDBhNmFkNWMzMWJhYmY0ZjQ2Y2IgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZjZmNGU0OTE4NTM3NDc2M2E5NTQ4NDU1NDZhYmQ0MzAgPSAkKCc8ZGl2IGlkPSJodG1sX2Y2ZjRlNDkxODUzNzQ3NjNhOTU0ODQ1NTQ2YWJkNDMwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5XQVJSQU5UUzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNGQ2NjI1NjIxNDZhNDBhNmFkNWMzMWJhYmY0ZjQ2Y2Iuc2V0Q29udGVudChodG1sX2Y2ZjRlNDkxODUzNzQ3NjNhOTU0ODQ1NTQ2YWJkNDMwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzdkNWY0ZmNlNjQ4MzRlNWU4MzY1YWZhZDY1MTBjMDQwLmJpbmRQb3B1cChwb3B1cF80ZDY2MjU2MjE0NmE0MGE2YWQ1YzMxYmFiZjRmNDZjYik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9kNWM2YjI2YTRkMzg0Nzc5ODJiOGJlMjkyM2M4NzE5OCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc3ODUyMzM3NzYwMzIsLTEyMi40MDM0NjQwODAwMzNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zMTY2MzJhYzFkNTE0Y2ZiYjk2N2E3MmZiNGM3OTg2ZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hMDM2MjYzM2M2MWU0ODU4OGFjNWQ1NWMzNmUyMjNjMSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82NDFmZDhjMzViMGY0ZDBlOTY1YzBmNWRiYjEwODQwYiA9ICQoJzxkaXYgaWQ9Imh0bWxfNjQxZmQ4YzM1YjBmNGQwZTk2NWMwZjVkYmIxMDg0MGIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlBST1NUSVRVVElPTjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYTAzNjI2MzNjNjFlNDg1ODhhYzVkNTVjMzZlMjIzYzEuc2V0Q29udGVudChodG1sXzY0MWZkOGMzNWIwZjRkMGU5NjVjMGY1ZGJiMTA4NDBiKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2Q1YzZiMjZhNGQzODQ3Nzk4MmI4YmUyOTIzYzg3MTk4LmJpbmRQb3B1cChwb3B1cF9hMDM2MjYzM2M2MWU0ODU4OGFjNWQ1NWMzNmUyMjNjMSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81ZmJkYWM5ZGYxN2Q0NGQwOTFjYWExMjFlMGI2N2Y4OSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc3ODUyMzM3NzYwMzIsLTEyMi40MDM0NjQwODAwMzNdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zMTY2MzJhYzFkNTE0Y2ZiYjk2N2E3MmZiNGM3OTg2ZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF80MzlmM2ZlYjVlMDA0ZGMzYmE5ODdkMTE0MzFlMjg2ZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF85YTEyNjE0MTc2MTI0NGFkYjkzNjFmYjBiNmJhNDFlZCA9ICQoJzxkaXYgaWQ9Imh0bWxfOWExMjYxNDE3NjEyNDRhZGI5MzYxZmIwYjZiYTQxZWQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk9USEVSIE9GRkVOU0VTPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80MzlmM2ZlYjVlMDA0ZGMzYmE5ODdkMTE0MzFlMjg2ZC5zZXRDb250ZW50KGh0bWxfOWExMjYxNDE3NjEyNDRhZGI5MzYxZmIwYjZiYTQxZWQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNWZiZGFjOWRmMTdkNDRkMDkxY2FhMTIxZTBiNjdmODkuYmluZFBvcHVwKHBvcHVwXzQzOWYzZmViNWUwMDRkYzNiYTk4N2QxMTQzMWUyODZkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzY1ZjRmMTljN2I4YjQ1NGE4Y2E4Y2UzOTdhMzI3M2MwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzczMjkxODA2OTAyOTk2LC0xMjIuNDM2NjE0MTgxMzMxMDFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zMTY2MzJhYzFkNTE0Y2ZiYjk2N2E3MmZiNGM3OTg2ZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF80NmEzY2M5MjIwNDM0Y2I1YTAxZmUxYjc4NTY1ZGM0MiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zNzE2YmU4YzhiNTU0YmI2OTdjYmRjZjM4NTM3ZWIyZSA9ICQoJzxkaXYgaWQ9Imh0bWxfMzcxNmJlOGM4YjU1NGJiNjk3Y2JkY2YzODUzN2ViMmUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk5PTi1DUklNSU5BTDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNDZhM2NjOTIyMDQzNGNiNWEwMWZlMWI3ODU2NWRjNDIuc2V0Q29udGVudChodG1sXzM3MTZiZThjOGI1NTRiYjY5N2NiZGNmMzg1MzdlYjJlKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzY1ZjRmMTljN2I4YjQ1NGE4Y2E4Y2UzOTdhMzI3M2MwLmJpbmRQb3B1cChwb3B1cF80NmEzY2M5MjIwNDM0Y2I1YTAxZmUxYjc4NTY1ZGM0Mik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9iNmFhNTRmNDM1OTI0MjA0ODQzZTRjM2NjN2RiMjNjZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc4MDUyNzU3ODUwOSwtMTIyLjM5Njg0OTAxNTE3MjAxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzE2NjMyYWMxZDUxNGNmYmI5NjdhNzJmYjRjNzk4NmQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNmVkNjYzYTZhYjI4NGUzZGI0NzNmODg5M2ZmMGE2NWQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMGJkMmI1N2ZkZjMzNDdjMWI3ODQwN2Y2MGNiY2Q4M2YgPSAkKCc8ZGl2IGlkPSJodG1sXzBiZDJiNTdmZGYzMzQ3YzFiNzg0MDdmNjBjYmNkODNmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5EUlVHL05BUkNPVElDPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82ZWQ2NjNhNmFiMjg0ZTNkYjQ3M2Y4ODkzZmYwYTY1ZC5zZXRDb250ZW50KGh0bWxfMGJkMmI1N2ZkZjMzNDdjMWI3ODQwN2Y2MGNiY2Q4M2YpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYjZhYTU0ZjQzNTkyNDIwNDg0M2U0YzNjYzdkYjIzY2QuYmluZFBvcHVwKHBvcHVwXzZlZDY2M2E2YWIyODRlM2RiNDczZjg4OTNmZjBhNjVkKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzhlODk4MjA2MDMxOTQ1OGM5YWFkNmEzN2U3YjNkNTRjID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzgwNTI3NTc4NTA5LC0xMjIuMzk2ODQ5MDE1MTcyMDFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zMTY2MzJhYzFkNTE0Y2ZiYjk2N2E3MmZiNGM3OTg2ZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xY2M4OGViMzUzZTU0YmMyYjJhN2EzYzgxOTc0YTI3NyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zODEzZmExYWZlZWU0YTAxOGRiYzc5OGI1NTNjNzdhNiA9ICQoJzxkaXYgaWQ9Imh0bWxfMzgxM2ZhMWFmZWVlNGEwMThkYmM3OThiNTUzYzc3YTYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPldBUlJBTlRTPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xY2M4OGViMzUzZTU0YmMyYjJhN2EzYzgxOTc0YTI3Ny5zZXRDb250ZW50KGh0bWxfMzgxM2ZhMWFmZWVlNGEwMThkYmM3OThiNTUzYzc3YTYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfOGU4OTgyMDYwMzE5NDU4YzlhYWQ2YTM3ZTdiM2Q1NGMuYmluZFBvcHVwKHBvcHVwXzFjYzg4ZWIzNTNlNTRiYzJiMmE3YTNjODE5NzRhMjc3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2RkNGY1NTRkMTY3ODRhNjI5OTBhN2Y1MTExNGRmZTZlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzI4NDE4MDcwNjYwMjA0LC0xMjIuNDUwMDAwNzkwNDQ1XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzE2NjMyYWMxZDUxNGNmYmI5NjdhNzJmYjRjNzk4NmQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYzY4MDAzY2ZlZjk0NDYxMzgwNTRlZWVhMTQ3MDAxYTggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNjdiMDAxOWI2YTZiNDAyNzk4N2NmNDJkOTIxMGYzNWEgPSAkKCc8ZGl2IGlkPSJodG1sXzY3YjAwMTliNmE2YjQwMjc5ODdjZjQyZDkyMTBmMzVhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5MQVJDRU5ZL1RIRUZUPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jNjgwMDNjZmVmOTQ0NjEzODA1NGVlZWExNDcwMDFhOC5zZXRDb250ZW50KGh0bWxfNjdiMDAxOWI2YTZiNDAyNzk4N2NmNDJkOTIxMGYzNWEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZGQ0ZjU1NGQxNjc4NGE2Mjk5MGE3ZjUxMTE0ZGZlNmUuYmluZFBvcHVwKHBvcHVwX2M2ODAwM2NmZWY5NDQ2MTM4MDU0ZWVlYTE0NzAwMWE4KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzAzZjNmZWZlZDJjYzQ4NDdiNmFiZGM5ODUzODYyY2QwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzI5MjExNDY0NzM1OSwtMTIyLjQwMDgzNDI4MzAzMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzMxNjYzMmFjMWQ1MTRjZmJiOTY3YTcyZmI0Yzc5ODZkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzRhNDAxYjMzNTU5MzQyYzBiOGQ3YTljNmExYmU3MmVhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzk5Y2I3NTkwZjE3YjRiY2FiMDcyZjkwOTQ5ZjJkZGIyID0gJCgnPGRpdiBpZD0iaHRtbF85OWNiNzU5MGYxN2I0YmNhYjA3MmY5MDk0OWYyZGRiMiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+T1RIRVIgT0ZGRU5TRVM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzRhNDAxYjMzNTU5MzQyYzBiOGQ3YTljNmExYmU3MmVhLnNldENvbnRlbnQoaHRtbF85OWNiNzU5MGYxN2I0YmNhYjA3MmY5MDk0OWYyZGRiMik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8wM2YzZmVmZWQyY2M0ODQ3YjZhYmRjOTg1Mzg2MmNkMC5iaW5kUG9wdXAocG9wdXBfNGE0MDFiMzM1NTkzNDJjMGI4ZDdhOWM2YTFiZTcyZWEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMTc0MmNlOTE0MWFhNDdiNDgwN2U5M2U4YjkzZWUxYzIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODgwMDY1MzI0MzkyMDUsLTEyMi4zOTk4MDIxNDU3OTldLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zMTY2MzJhYzFkNTE0Y2ZiYjk2N2E3MmZiNGM3OTg2ZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mNjU2NzM1ODBiNTk0MTI2ODY5OGFiYzk2M2U2MWUyMSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kYmE1OTUwMGNjNGE0ZjBlOGYyOWM1OTk5MzNiYzcxNyA9ICQoJzxkaXYgaWQ9Imh0bWxfZGJhNTk1MDBjYzRhNGYwZThmMjljNTk5OTMzYmM3MTciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkxBUkNFTlkvVEhFRlQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2Y2NTY3MzU4MGI1OTQxMjY4Njk4YWJjOTYzZTYxZTIxLnNldENvbnRlbnQoaHRtbF9kYmE1OTUwMGNjNGE0ZjBlOGYyOWM1OTk5MzNiYzcxNyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8xNzQyY2U5MTQxYWE0N2I0ODA3ZTkzZThiOTNlZTFjMi5iaW5kUG9wdXAocG9wdXBfZjY1NjczNTgwYjU5NDEyNjg2OThhYmM5NjNlNjFlMjEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNjBlMjA3YWM0ZTQ4NDdhZDlmMzE4ZmMwNTcxMWQ1NGQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43MjM5NzQ4MjQxNjA5LC0xMjIuMzk0OTI4NDc1OF0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzMxNjYzMmFjMWQ1MTRjZmJiOTY3YTcyZmI0Yzc5ODZkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2UxYmUwY2RhMmQwODQxMzg4YTRlN2Y2YzI2NzY1MmY1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzhlZjYxNTZiOGNlYjQ1NGY5ZTRiNTFiNzc1YjRiOWY3ID0gJCgnPGRpdiBpZD0iaHRtbF84ZWY2MTU2YjhjZWI0NTRmOWU0YjUxYjc3NWI0YjlmNyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U0VDT05EQVJZIENPREVTPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lMWJlMGNkYTJkMDg0MTM4OGE0ZTdmNmMyNjc2NTJmNS5zZXRDb250ZW50KGh0bWxfOGVmNjE1NmI4Y2ViNDU0ZjllNGI1MWI3NzViNGI5ZjcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNjBlMjA3YWM0ZTQ4NDdhZDlmMzE4ZmMwNTcxMWQ1NGQuYmluZFBvcHVwKHBvcHVwX2UxYmUwY2RhMmQwODQxMzg4YTRlN2Y2YzI2NzY1MmY1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2JmMTc2Yjg0ZGJmMjQzMDM5ZmE0MzlkZjg3YTVjMmQ2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzIzOTc0ODI0MTYwOSwtMTIyLjM5NDkyODQ3NThdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zMTY2MzJhYzFkNTE0Y2ZiYjk2N2E3MmZiNGM3OTg2ZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF81Y2ZhMzI1ZWY5NDg0YTdlOTY5ZDFhODVmZTE4MmZjMiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF81OTJjMzdkYzI0MTE0ZjRhYmJhNDE1ZjA1Mzc5NzM0NyA9ICQoJzxkaXYgaWQ9Imh0bWxfNTkyYzM3ZGMyNDExNGY0YWJiYTQxNWYwNTM3OTczNDciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlNVU1BJQ0lPVVMgT0NDPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81Y2ZhMzI1ZWY5NDg0YTdlOTY5ZDFhODVmZTE4MmZjMi5zZXRDb250ZW50KGh0bWxfNTkyYzM3ZGMyNDExNGY0YWJiYTQxNWYwNTM3OTczNDcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYmYxNzZiODRkYmYyNDMwMzlmYTQzOWRmODdhNWMyZDYuYmluZFBvcHVwKHBvcHVwXzVjZmEzMjVlZjk0ODRhN2U5NjlkMWE4NWZlMTgyZmMyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzFjOWIwNzk1ZjZhMzQ1OGY4Y2ZmYjM3OGU2MmY4ZGRhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzIzOTc0ODI0MTYwOSwtMTIyLjM5NDkyODQ3NThdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zMTY2MzJhYzFkNTE0Y2ZiYjk2N2E3MmZiNGM3OTg2ZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lZWNkOTJkMjMyN2Q0NTQyODcyNjFjNmRhMzIxNWJiNiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8yNmRkZDdlNzQ5MmI0NmI1ODdkZmU3NjJlZTkzMGQ0NSA9ICQoJzxkaXYgaWQ9Imh0bWxfMjZkZGQ3ZTc0OTJiNDZiNTg3ZGZlNzYyZWU5MzBkNDUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk9USEVSIE9GRkVOU0VTPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lZWNkOTJkMjMyN2Q0NTQyODcyNjFjNmRhMzIxNWJiNi5zZXRDb250ZW50KGh0bWxfMjZkZGQ3ZTc0OTJiNDZiNTg3ZGZlNzYyZWU5MzBkNDUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMWM5YjA3OTVmNmEzNDU4ZjhjZmZiMzc4ZTYyZjhkZGEuYmluZFBvcHVwKHBvcHVwX2VlY2Q5MmQyMzI3ZDQ1NDI4NzI2MWM2ZGEzMjE1YmI2KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2JiNjkyNTZkZmJmZDQ3ZDdiNmRiNDI3NDYzZGQxNTQzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzg4MzIzNTQ0OTkwNCwtMTIyLjQxMTg1NzAzMjU0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzE2NjMyYWMxZDUxNGNmYmI5NjdhNzJmYjRjNzk4NmQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMDQzZDU1N2RkYzQ2NGE3MmI5MTFjM2MyOGQ1MjEwNDcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNTJkNmVlZGI3OTM2NGJlMzkzOWNmOGRkYjA3OTA0YWYgPSAkKCc8ZGl2IGlkPSJodG1sXzUyZDZlZWRiNzkzNjRiZTM5MzljZjhkZGIwNzkwNGFmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5MQVJDRU5ZL1RIRUZUPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wNDNkNTU3ZGRjNDY0YTcyYjkxMWMzYzI4ZDUyMTA0Ny5zZXRDb250ZW50KGh0bWxfNTJkNmVlZGI3OTM2NGJlMzkzOWNmOGRkYjA3OTA0YWYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYmI2OTI1NmRmYmZkNDdkN2I2ZGI0Mjc0NjNkZDE1NDMuYmluZFBvcHVwKHBvcHVwXzA0M2Q1NTdkZGM0NjRhNzJiOTExYzNjMjhkNTIxMDQ3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzI4NDNkY2QzZjAwOTQyZTNhNDA1YTJjNzZhNGFiZWI5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzU1OTk3NzMzOTg1NiwtMTIyLjQwOTQzNTYxNzEwNl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzMxNjYzMmFjMWQ1MTRjZmJiOTY3YTcyZmI0Yzc5ODZkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzJiZGU5ODZmNmUyYjRlMjY5Zjg3MjI0MzNhN2Q0Zjk1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzlhZjI3N2RhZWRkMjQ4NzQ4MjAwMzY0MmJhZjMyOTM1ID0gJCgnPGRpdiBpZD0iaHRtbF85YWYyNzdkYWVkZDI0ODc0ODIwMDM2NDJiYWYzMjkzNSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+T1RIRVIgT0ZGRU5TRVM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzJiZGU5ODZmNmUyYjRlMjY5Zjg3MjI0MzNhN2Q0Zjk1LnNldENvbnRlbnQoaHRtbF85YWYyNzdkYWVkZDI0ODc0ODIwMDM2NDJiYWYzMjkzNSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8yODQzZGNkM2YwMDk0MmUzYTQwNWEyYzc2YTRhYmViOS5iaW5kUG9wdXAocG9wdXBfMmJkZTk4NmY2ZTJiNGUyNjlmODcyMjQzM2E3ZDRmOTUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOTkwMmNlNTFiYzhjNDdmYmEwNGM1MGMzZDU5ODVmOWEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODcwNzk4MTQ0NDQzLC0xMjIuNDI1ODgzMzU4MTQ4XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzE2NjMyYWMxZDUxNGNmYmI5NjdhNzJmYjRjNzk4NmQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMGUwZDIyMGY3ZTk0NDkwZDgyMTFjOGJjODI2MWFmMDQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNzljNWQ2M2I0ZmQwNDIxNDljYzI0ZWVhYzBkMDI0NDAgPSAkKCc8ZGl2IGlkPSJodG1sXzc5YzVkNjNiNGZkMDQyMTQ5Y2MyNGVlYWMwZDAyNDQwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5OT04tQ1JJTUlOQUw8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzBlMGQyMjBmN2U5NDQ5MGQ4MjExYzhiYzgyNjFhZjA0LnNldENvbnRlbnQoaHRtbF83OWM1ZDYzYjRmZDA0MjE0OWNjMjRlZWFjMGQwMjQ0MCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl85OTAyY2U1MWJjOGM0N2ZiYTA0YzUwYzNkNTk4NWY5YS5iaW5kUG9wdXAocG9wdXBfMGUwZDIyMGY3ZTk0NDkwZDgyMTFjOGJjODI2MWFmMDQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZjBhYTRkNjA4MjBiNDZlYmE2ZjFkZGFjZjBhNmVlMDAgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43MzYwMzc0NDY2ODYyMDQsLTEyMi40MTUxMjY1NDMwMDEwMV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzMxNjYzMmFjMWQ1MTRjZmJiOTY3YTcyZmI0Yzc5ODZkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2JjYjdmODI1ZjA0ZjQ4NzBiMzk0OWVkMWFjMGJmN2QzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzNiM2MwNWJkMjhhNjQyZmJhOWUwOTE5NTJjMDQ4ZWQ3ID0gJCgnPGRpdiBpZD0iaHRtbF8zYjNjMDViZDI4YTY0MmZiYTllMDkxOTUyYzA0OGVkNyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Tk9OLUNSSU1JTkFMPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iY2I3ZjgyNWYwNGY0ODcwYjM5NDllZDFhYzBiZjdkMy5zZXRDb250ZW50KGh0bWxfM2IzYzA1YmQyOGE2NDJmYmE5ZTA5MTk1MmMwNDhlZDcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfZjBhYTRkNjA4MjBiNDZlYmE2ZjFkZGFjZjBhNmVlMDAuYmluZFBvcHVwKHBvcHVwX2JjYjdmODI1ZjA0ZjQ4NzBiMzk0OWVkMWFjMGJmN2QzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzMxZGY2NWQyYWE5ZDQ1ODliMWNkMzYwNzk1ZjZhNDFkID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzEyNzY3ODg0ODIxLC0xMjIuNDMxOTI4MDExMDg5XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzE2NjMyYWMxZDUxNGNmYmI5NjdhNzJmYjRjNzk4NmQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZDkzMGI1NmJkZjNjNDMxZWI4ZTBiZDkwNDg5OWFlMzIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMWE4ODE3OTA3YjU3NDAyY2FmMjcxMzQ0NTdlMGM2ODAgPSAkKCc8ZGl2IGlkPSJodG1sXzFhODgxNzkwN2I1NzQwMmNhZjI3MTM0NDU3ZTBjNjgwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5PVEhFUiBPRkZFTlNFUzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZDkzMGI1NmJkZjNjNDMxZWI4ZTBiZDkwNDg5OWFlMzIuc2V0Q29udGVudChodG1sXzFhODgxNzkwN2I1NzQwMmNhZjI3MTM0NDU3ZTBjNjgwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzMxZGY2NWQyYWE5ZDQ1ODliMWNkMzYwNzk1ZjZhNDFkLmJpbmRQb3B1cChwb3B1cF9kOTMwYjU2YmRmM2M0MzFlYjhlMGJkOTA0ODk5YWUzMik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xZmQ1NGFmNmY1M2Y0ZTY2YjljNzM3ZWZjZTg1OTEzMCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc4OTU3MTAyNTU4NjMsLTEyMi40MDIxNjM3MTM2MThdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zMTY2MzJhYzFkNTE0Y2ZiYjk2N2E3MmZiNGM3OTg2ZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hNmJjNGM3ODdkMDI0NWE0OWQ5ZDliZjE5MzVhZmJkOSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jZTBiMGNmODYxNWU0ZDhiYTNjYzM3MzlhMjA0NTM2YyA9ICQoJzxkaXYgaWQ9Imh0bWxfY2UwYjBjZjg2MTVlNGQ4YmEzY2MzNzM5YTIwNDUzNmMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkRSVU5LRU5ORVNTPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hNmJjNGM3ODdkMDI0NWE0OWQ5ZDliZjE5MzVhZmJkOS5zZXRDb250ZW50KGh0bWxfY2UwYjBjZjg2MTVlNGQ4YmEzY2MzNzM5YTIwNDUzNmMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMWZkNTRhZjZmNTNmNGU2NmI5YzczN2VmY2U4NTkxMzAuYmluZFBvcHVwKHBvcHVwX2E2YmM0Yzc4N2QwMjQ1YTQ5ZDlkOWJmMTkzNWFmYmQ5KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzUwMTlmYWMxM2IzYTQwM2E4NDgxZmI5NWFiNDlkMDUyID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzMwNzQyOTE2OTU1OSwtMTIyLjQyOTMwNjcyODM3Nl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzMxNjYzMmFjMWQ1MTRjZmJiOTY3YTcyZmI0Yzc5ODZkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzcwNzkxMjc5MDUyYzRlMmE4OTNmYjczN2NhYWZmZDg3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzQxMjhjOGIzOTgzNDRjODk5ZjA5ZmE0NWM1ODlkNjJjID0gJCgnPGRpdiBpZD0iaHRtbF80MTI4YzhiMzk4MzQ0Yzg5OWYwOWZhNDVjNTg5ZDYyYyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+T1RIRVIgT0ZGRU5TRVM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzcwNzkxMjc5MDUyYzRlMmE4OTNmYjczN2NhYWZmZDg3LnNldENvbnRlbnQoaHRtbF80MTI4YzhiMzk4MzQ0Yzg5OWYwOWZhNDVjNTg5ZDYyYyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl81MDE5ZmFjMTNiM2E0MDNhODQ4MWZiOTVhYjQ5ZDA1Mi5iaW5kUG9wdXAocG9wdXBfNzA3OTEyNzkwNTJjNGUyYTg5M2ZiNzM3Y2FhZmZkODcpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYTdiOTE4ZmFlMGQ1NDgyMjg3YzUxZmUxYTBmNTlmOGEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODM4MzY1NTY1MzQ3OTQsLTEyMi40MTM3OTA5NzI3ODA5OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzMxNjYzMmFjMWQ1MTRjZmJiOTY3YTcyZmI0Yzc5ODZkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzc5MjVhMGExZjFjMTQxODE5ZTFiZDYzNDQ2NDM5YWI4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzk1NWUzYzA1ZmI3MjRiZDY5Y2IzZDRjMzNjZWM1NDk3ID0gJCgnPGRpdiBpZD0iaHRtbF85NTVlM2MwNWZiNzI0YmQ2OWNiM2Q0YzMzY2VjNTQ5NyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+VkFOREFMSVNNPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83OTI1YTBhMWYxYzE0MTgxOWUxYmQ2MzQ0NjQzOWFiOC5zZXRDb250ZW50KGh0bWxfOTU1ZTNjMDVmYjcyNGJkNjljYjNkNGMzM2NlYzU0OTcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYTdiOTE4ZmFlMGQ1NDgyMjg3YzUxZmUxYTBmNTlmOGEuYmluZFBvcHVwKHBvcHVwXzc5MjVhMGExZjFjMTQxODE5ZTFiZDYzNDQ2NDM5YWI4KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzJiOTk4ZGIyNjBhMjQxNGU5ZGU4NDcwMWE1YTUwMjhiID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzMwNzQyOTE2OTU1OSwtMTIyLjQyOTMwNjcyODM3Nl0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzMxNjYzMmFjMWQ1MTRjZmJiOTY3YTcyZmI0Yzc5ODZkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzJlYmY3ZGQ5MDFkODRmZTc5NzQ2OWNhY2IyMTM1MTA4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzczMjVjNDMwMjFkYTQyNDY4YzFiNjg4MjkzM2JkZGMyID0gJCgnPGRpdiBpZD0iaHRtbF83MzI1YzQzMDIxZGE0MjQ2OGMxYjY4ODI5MzNiZGRjMiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+T1RIRVIgT0ZGRU5TRVM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzJlYmY3ZGQ5MDFkODRmZTc5NzQ2OWNhY2IyMTM1MTA4LnNldENvbnRlbnQoaHRtbF83MzI1YzQzMDIxZGE0MjQ2OGMxYjY4ODI5MzNiZGRjMik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8yYjk5OGRiMjYwYTI0MTRlOWRlODQ3MDFhNWE1MDI4Yi5iaW5kUG9wdXAocG9wdXBfMmViZjdkZDkwMWQ4NGZlNzk3NDY5Y2FjYjIxMzUxMDgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYzk5N2JhMWJmYjFhNGY5NmI2OTkyYzEyZDg1ZDY3MzEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43MzczNjIzNjA1MjEyOTYsLTEyMi40MjIwNjcxODQ5MzddLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zMTY2MzJhYzFkNTE0Y2ZiYjk2N2E3MmZiNGM3OTg2ZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xN2Y3ZWQzMGVhMDY0Y2YxYmU0NTE5YTMyOTFjYzQwZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82N2I4NDhkNjFjNzM0NzdjOTlkZWUyZDlmMmYwMjFlNCA9ICQoJzxkaXYgaWQ9Imh0bWxfNjdiODQ4ZDYxYzczNDc3Yzk5ZGVlMmQ5ZjJmMDIxZTQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlNFQ09OREFSWSBDT0RFUzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMTdmN2VkMzBlYTA2NGNmMWJlNDUxOWEzMjkxY2M0MGYuc2V0Q29udGVudChodG1sXzY3Yjg0OGQ2MWM3MzQ3N2M5OWRlZTJkOWYyZjAyMWU0KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2M5OTdiYTFiZmIxYTRmOTZiNjk5MmMxMmQ4NWQ2NzMxLmJpbmRQb3B1cChwb3B1cF8xN2Y3ZWQzMGVhMDY0Y2YxYmU0NTE5YTMyOTFjYzQwZik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9hN2ZjYzNhYjU1MWI0MDk1YTI0ZGU0YjNjOTg1M2EwZiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjczNzM2MjM2MDUyMTI5NiwtMTIyLjQyMjA2NzE4NDkzN10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzMxNjYzMmFjMWQ1MTRjZmJiOTY3YTcyZmI0Yzc5ODZkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2UwNzE4M2Q4NWI1YTQ4ZDg4ZmRhMDhhNzgwZDU2NjA1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2NjNDJjMTUyZWM1NTRjNjhiYjg5M2U5M2NhNzY2YzMzID0gJCgnPGRpdiBpZD0iaHRtbF9jYzQyYzE1MmVjNTU0YzY4YmI4OTNlOTNjYTc2NmMzMyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+VkFOREFMSVNNPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lMDcxODNkODViNWE0OGQ4OGZkYTA4YTc4MGQ1NjYwNS5zZXRDb250ZW50KGh0bWxfY2M0MmMxNTJlYzU1NGM2OGJiODkzZTkzY2E3NjZjMzMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfYTdmY2MzYWI1NTFiNDA5NWEyNGRlNGIzYzk4NTNhMGYuYmluZFBvcHVwKHBvcHVwX2UwNzE4M2Q4NWI1YTQ4ZDg4ZmRhMDhhNzgwZDU2NjA1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2VkNWM1NGQzOTliNzQyZjdiNjMyYzk2ZDJlZWQwNDM5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzg1OTk4ODMyMzc5Nzk2LC0xMjIuNDExNzQ3MzcxOTI0XSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzE2NjMyYWMxZDUxNGNmYmI5NjdhNzJmYjRjNzk4NmQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYjNkMDM3MDgzMGU4NDA1ODg0MjQ4Yzk4ZjY1NTdlNWEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNjUyYzE4NDhiOGU5NDA3NGFjZDBkOTg4NzhiOWNhMjIgPSAkKCc8ZGl2IGlkPSJodG1sXzY1MmMxODQ4YjhlOTQwNzRhY2QwZDk4ODc4YjljYTIyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5TVVNQSUNJT1VTIE9DQzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYjNkMDM3MDgzMGU4NDA1ODg0MjQ4Yzk4ZjY1NTdlNWEuc2V0Q29udGVudChodG1sXzY1MmMxODQ4YjhlOTQwNzRhY2QwZDk4ODc4YjljYTIyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2VkNWM1NGQzOTliNzQyZjdiNjMyYzk2ZDJlZWQwNDM5LmJpbmRQb3B1cChwb3B1cF9iM2QwMzcwODMwZTg0MDU4ODQyNDhjOThmNjU1N2U1YSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8wOTEzNjliNmU4Zjk0MzRkYTczYzMxMGExNDg0ZjgxNSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc2MzM3NTgwNTgwNTksLTEyMi40MjA0MzQ3MjQ1NTI5OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzMxNjYzMmFjMWQ1MTRjZmJiOTY3YTcyZmI0Yzc5ODZkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2NkMThlMThlMjk2MDQ1MzM5NGEzM2NjYzdjYjNlZWIwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzk4OTQ5NTJlMzVkNzRkZmY4MzIxYjE3NmQ3NTM0YzkyID0gJCgnPGRpdiBpZD0iaHRtbF85ODk0OTUyZTM1ZDc0ZGZmODMyMWIxNzZkNzUzNGM5MiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+T1RIRVIgT0ZGRU5TRVM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2NkMThlMThlMjk2MDQ1MzM5NGEzM2NjYzdjYjNlZWIwLnNldENvbnRlbnQoaHRtbF85ODk0OTUyZTM1ZDc0ZGZmODMyMWIxNzZkNzUzNGM5Mik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8wOTEzNjliNmU4Zjk0MzRkYTczYzMxMGExNDg0ZjgxNS5iaW5kUG9wdXAocG9wdXBfY2QxOGUxOGUyOTYwNDUzMzk0YTMzY2NjN2NiM2VlYjApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZDI0ZTBjZTMwMTM4NDNjODhlZjBhOThkOTE0Njc1NmEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODUwMjI2NjIyNzg2LC0xMjIuNDExOTg3NjQzNTk1MDFdLAogICAgICAgICAgICAgICAgewogICJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwKICAiY29sb3IiOiAieWVsbG93IiwKICAiZGFzaEFycmF5IjogbnVsbCwKICAiZGFzaE9mZnNldCI6IG51bGwsCiAgImZpbGwiOiB0cnVlLAogICJmaWxsQ29sb3IiOiAiYmx1ZSIsCiAgImZpbGxPcGFjaXR5IjogMC42LAogICJmaWxsUnVsZSI6ICJldmVub2RkIiwKICAibGluZUNhcCI6ICJyb3VuZCIsCiAgImxpbmVKb2luIjogInJvdW5kIiwKICAib3BhY2l0eSI6IDEuMCwKICAicmFkaXVzIjogNSwKICAic3Ryb2tlIjogdHJ1ZSwKICAid2VpZ2h0IjogMwp9CiAgICAgICAgICAgICAgICApLmFkZFRvKG1hcF8zMTY2MzJhYzFkNTE0Y2ZiYjk2N2E3MmZiNGM3OTg2ZCk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF84MThhNDA2NzgzMGE0YTdmODViMTg2YWZlMjdhMGY3MSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mYWU4MTc5ZmY4NDI0NDcwOWFiMjU0MzllMDZiMGFlNiA9ICQoJzxkaXYgaWQ9Imh0bWxfZmFlODE3OWZmODQyNDQ3MDlhYjI1NDM5ZTA2YjBhZTYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk5PTi1DUklNSU5BTDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfODE4YTQwNjc4MzBhNGE3Zjg1YjE4NmFmZTI3YTBmNzEuc2V0Q29udGVudChodG1sX2ZhZTgxNzlmZjg0MjQ0NzA5YWIyNTQzOWUwNmIwYWU2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyX2QyNGUwY2UzMDEzODQzYzg4ZWYwYTk4ZDkxNDY3NTZhLmJpbmRQb3B1cChwb3B1cF84MThhNDA2NzgzMGE0YTdmODViMTg2YWZlMjdhMGY3MSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jZDEwZDNlMjNlNWI0ZjcyOTM3OTE3Y2E2MTUwOTQ1MCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc3NDYyMDY0OTEwNjQ5NSwtMTIyLjUwMDM4MDQyNzkxNV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzMxNjYzMmFjMWQ1MTRjZmJiOTY3YTcyZmI0Yzc5ODZkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzY0ZDdiZGZmYjM2ZDQ2ZmJiNTI1Y2Y1NDMyM2UxOGU3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzRjYmJkYjA4ZjY0ZTQwYTQ5YTg2NTY5ZDY3MTRkOWNjID0gJCgnPGRpdiBpZD0iaHRtbF80Y2JiZGIwOGY2NGU0MGE0OWE4NjU2OWQ2NzE0ZDljYyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+T1RIRVIgT0ZGRU5TRVM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzY0ZDdiZGZmYjM2ZDQ2ZmJiNTI1Y2Y1NDMyM2UxOGU3LnNldENvbnRlbnQoaHRtbF80Y2JiZGIwOGY2NGU0MGE0OWE4NjU2OWQ2NzE0ZDljYyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl9jZDEwZDNlMjNlNWI0ZjcyOTM3OTE3Y2E2MTUwOTQ1MC5iaW5kUG9wdXAocG9wdXBfNjRkN2JkZmZiMzZkNDZmYmI1MjVjZjU0MzIzZTE4ZTcpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNjkxNTQxNzZmMTg2NGE5ZDhkOTQ5ZmJmM2M1NmMxODEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NzUxOTE4MjY3MjE3LC0xMjIuNDY2NTU4NzgwNjgzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzE2NjMyYWMxZDUxNGNmYmI5NjdhNzJmYjRjNzk4NmQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOGI3MzczYzdlMmExNDk1OGFkYjUwNTA1MWU4NmQyMDUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNGVmNmE4YThjYTllNDY1NmFmY2Y0MmZkYzE2MGY0ZDMgPSAkKCc8ZGl2IGlkPSJodG1sXzRlZjZhOGE4Y2E5ZTQ2NTZhZmNmNDJmZGMxNjBmNGQzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5ST0JCRVJZPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84YjczNzNjN2UyYTE0OTU4YWRiNTA1MDUxZTg2ZDIwNS5zZXRDb250ZW50KGh0bWxfNGVmNmE4YThjYTllNDY1NmFmY2Y0MmZkYzE2MGY0ZDMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfNjkxNTQxNzZmMTg2NGE5ZDhkOTQ5ZmJmM2M1NmMxODEuYmluZFBvcHVwKHBvcHVwXzhiNzM3M2M3ZTJhMTQ5NThhZGI1MDUwNTFlODZkMjA1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzQ5NWM3M2QwNjhhMTRmZjZhYzA5MjFmNDMwMjhiNDYzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzQ5MDg0MTcyOTAyOCwtMTIyLjQ4NjkyNTk2MDExNDAxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzE2NjMyYWMxZDUxNGNmYmI5NjdhNzJmYjRjNzk4NmQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYzc4ZjFlZTQxOWUyNGZjZWEzZGUxNjY1ZDUzM2QzYjAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOWM2MjMzNTA2OTE1NGQxMTlmMzUxYzBlZDkzYWQ3OGEgPSAkKCc8ZGl2IGlkPSJodG1sXzljNjIzMzUwNjkxNTRkMTE5ZjM1MWMwZWQ5M2FkNzhhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5PVEhFUiBPRkZFTlNFUzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYzc4ZjFlZTQxOWUyNGZjZWEzZGUxNjY1ZDUzM2QzYjAuc2V0Q29udGVudChodG1sXzljNjIzMzUwNjkxNTRkMTE5ZjM1MWMwZWQ5M2FkNzhhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBjaXJjbGVfbWFya2VyXzQ5NWM3M2QwNjhhMTRmZjZhYzA5MjFmNDMwMjhiNDYzLmJpbmRQb3B1cChwb3B1cF9jNzhmMWVlNDE5ZTI0ZmNlYTNkZTE2NjVkNTMzZDNiMCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8wYmU4M2M0YWZmNzQ0ODQ5YWVhOTEzMmQ3Y2FhNGI0OSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc2ODUzNjAxMjM1ODMsLTEyMi40MTU2MTYzMzgzMTk5OV0sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzMxNjYzMmFjMWQ1MTRjZmJiOTY3YTcyZmI0Yzc5ODZkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzI1NjAyMzE4ZDY1OTQ2ODQ5MjU0NGRhY2VmNWQwODRiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2MyZTEzOWJmN2Q2ZjQzMWViMWY3MTRjMTZiYThlNDhjID0gJCgnPGRpdiBpZD0iaHRtbF9jMmUxMzliZjdkNmY0MzFlYjFmNzE0YzE2YmE4ZTQ4YyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Tk9OLUNSSU1JTkFMPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yNTYwMjMxOGQ2NTk0Njg0OTI1NDRkYWNlZjVkMDg0Yi5zZXRDb250ZW50KGh0bWxfYzJlMTM5YmY3ZDZmNDMxZWIxZjcxNGMxNmJhOGU0OGMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfMGJlODNjNGFmZjc0NDg0OWFlYTkxMzJkN2NhYTRiNDkuYmluZFBvcHVwKHBvcHVwXzI1NjAyMzE4ZDY1OTQ2ODQ5MjU0NGRhY2VmNWQwODRiKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzIzYzMwZjJlNTM0MDQzMTM5YTA0MGM0MWU4M2IzMTU1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzY0NDI5NzcxNDA3NCwtMTIyLjQ0OTc1MTY1MjU2M10sCiAgICAgICAgICAgICAgICB7CiAgImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLAogICJjb2xvciI6ICJ5ZWxsb3ciLAogICJkYXNoQXJyYXkiOiBudWxsLAogICJkYXNoT2Zmc2V0IjogbnVsbCwKICAiZmlsbCI6IHRydWUsCiAgImZpbGxDb2xvciI6ICJibHVlIiwKICAiZmlsbE9wYWNpdHkiOiAwLjYsCiAgImZpbGxSdWxlIjogImV2ZW5vZGQiLAogICJsaW5lQ2FwIjogInJvdW5kIiwKICAibGluZUpvaW4iOiAicm91bmQiLAogICJvcGFjaXR5IjogMS4wLAogICJyYWRpdXMiOiA1LAogICJzdHJva2UiOiB0cnVlLAogICJ3ZWlnaHQiOiAzCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzMxNjYzMmFjMWQ1MTRjZmJiOTY3YTcyZmI0Yzc5ODZkKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2U0NmM4MDg1OTQ3ZDQyMjQ5ZjM1ZTMzYWJmNjM2MGM4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2UzYmViNTYyMTdiNTQ5NzJiZmRiZjQwNmQxODhmNWI2ID0gJCgnPGRpdiBpZD0iaHRtbF9lM2JlYjU2MjE3YjU0OTcyYmZkYmY0MDZkMTg4ZjViNiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QlVSR0xBUlk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2U0NmM4MDg1OTQ3ZDQyMjQ5ZjM1ZTMzYWJmNjM2MGM4LnNldENvbnRlbnQoaHRtbF9lM2JlYjU2MjE3YjU0OTcyYmZkYmY0MDZkMTg4ZjViNik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgY2lyY2xlX21hcmtlcl8yM2MzMGYyZTUzNDA0MzEzOWEwNDBjNDFlODNiMzE1NS5iaW5kUG9wdXAocG9wdXBfZTQ2YzgwODU5NDdkNDIyNDlmMzVlMzNhYmY2MzYwYzgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfODlhODFkNDdjNGU1NDMzZjgyNDg1YWUyNDUyYTE3OTkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NjQ0Mjk3NzE0MDc0LC0xMjIuNDQ5NzUxNjUyNTYzXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzE2NjMyYWMxZDUxNGNmYmI5NjdhNzJmYjRjNzk4NmQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMmYyOWVjMGJlMzg4NGY0MTk2MTE1MjI2MmRkMDMxYzkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNzU1Zjg1NWJkMjc0NDkzZDkwZTBmYmE0NzFhOTUwOWIgPSAkKCc8ZGl2IGlkPSJodG1sXzc1NWY4NTViZDI3NDQ5M2Q5MGUwZmJhNDcxYTk1MDliIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5MQVJDRU5ZL1RIRUZUPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yZjI5ZWMwYmUzODg0ZjQxOTYxMTUyMjYyZGQwMzFjOS5zZXRDb250ZW50KGh0bWxfNzU1Zjg1NWJkMjc0NDkzZDkwZTBmYmE0NzFhOTUwOWIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfODlhODFkNDdjNGU1NDMzZjgyNDg1YWUyNDUyYTE3OTkuYmluZFBvcHVwKHBvcHVwXzJmMjllYzBiZTM4ODRmNDE5NjExNTIyNjJkZDAzMWM5KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzNhYzIwMjZkMTk2MTQzMzlhZmYxNWQ5MWIzMjg1ZjUwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzM1MjY4MTQ2OTA4Mzk2LC0xMjIuNDcyNzE1NzU5NjMxXSwKICAgICAgICAgICAgICAgIHsKICAiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsCiAgImNvbG9yIjogInllbGxvdyIsCiAgImRhc2hBcnJheSI6IG51bGwsCiAgImRhc2hPZmZzZXQiOiBudWxsLAogICJmaWxsIjogdHJ1ZSwKICAiZmlsbENvbG9yIjogImJsdWUiLAogICJmaWxsT3BhY2l0eSI6IDAuNiwKICAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsCiAgImxpbmVDYXAiOiAicm91bmQiLAogICJsaW5lSm9pbiI6ICJyb3VuZCIsCiAgIm9wYWNpdHkiOiAxLjAsCiAgInJhZGl1cyI6IDUsCiAgInN0cm9rZSI6IHRydWUsCiAgIndlaWdodCI6IDMKfQogICAgICAgICAgICAgICAgKS5hZGRUbyhtYXBfMzE2NjMyYWMxZDUxNGNmYmI5NjdhNzJmYjRjNzk4NmQpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNDNjNzJjZWFkZmZhNGJmOTkzMDZlZTYyM2UxOGIxMmUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZmJlZDE2NzkyNmQ3NDU5ZGJjYzVkZWUyN2VkOTA2NmYgPSAkKCc8ZGl2IGlkPSJodG1sX2ZiZWQxNjc5MjZkNzQ1OWRiY2M1ZGVlMjdlZDkwNjZmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5MQVJDRU5ZL1RIRUZUPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80M2M3MmNlYWRmZmE0YmY5OTMwNmVlNjIzZTE4YjEyZS5zZXRDb250ZW50KGh0bWxfZmJlZDE2NzkyNmQ3NDU5ZGJjYzVkZWUyN2VkOTA2NmYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIGNpcmNsZV9tYXJrZXJfM2FjMjAyNmQxOTYxNDMzOWFmZjE1ZDkxYjMyODVmNTAuYmluZFBvcHVwKHBvcHVwXzQzYzcyY2VhZGZmYTRiZjk5MzA2ZWU2MjNlMThiMTJlKTsKCiAgICAgICAgICAgIAogICAgICAgIAo8L3NjcmlwdD4=\" 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 0x7faffbec7b00>"
]
},
"execution_count": 32,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# create map and display it\n",
"sanfran_map = folium.Map(location=[latitude, longitude], zoom_start=12)\n",
"\n",
"# loop through the 100 crimes and add each to the map\n",
"for lat, lng, label in zip(df_incidents.Y, df_incidents.X, df_incidents.Category):\n",
" folium.features.CircleMarker(\n",
" [lat, lng],\n",
" radius=5, # define how big you want the circle markers to be\n",
" color='yellow',\n",
" fill=True,\n",
" popup=label,\n",
" fill_color='blue',\n",
" fill_opacity=0.6\n",
" ).add_to(sanfran_map)\n",
"\n",
"# show map\n",
"sanfran_map"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"The other proper remedy is to group the markers into different clusters. Each cluster is then represented by the number of crimes in each neighborhood. These clusters can be thought of as pockets of San Francisco which you can then analyze separately.\n",
"\n",
"To implement this, we start off by instantiating a *MarkerCluster* object and adding all the data points in the dataframe to this object."
]
},
{
"cell_type": "code",
"execution_count": 33,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"editable": true,
"new_sheet": false,
"run_control": {
"read_only": 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+ICNtYXBfNjYzNjNjMGRhOTBjNGI1MjlkNDBmYjhkNzRjMzVlYzcgewogICAgICAgICAgICAgICAgcG9zaXRpb24gOiByZWxhdGl2ZTsKICAgICAgICAgICAgICAgIHdpZHRoIDogMTAwLjAlOwogICAgICAgICAgICAgICAgaGVpZ2h0OiAxMDAuMCU7CiAgICAgICAgICAgICAgICBsZWZ0OiAwLjAlOwogICAgICAgICAgICAgICAgdG9wOiAwLjAlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICA8L3N0eWxlPgogICAgICAgIAogICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vY2RuanMuY2xvdWRmbGFyZS5jb20vYWpheC9saWJzL2xlYWZsZXQubWFya2VyY2x1c3Rlci8xLjEuMC9sZWFmbGV0Lm1hcmtlcmNsdXN0ZXIuanMiPjwvc2NyaXB0PgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9sZWFmbGV0Lm1hcmtlcmNsdXN0ZXIvMS4xLjAvTWFya2VyQ2x1c3Rlci5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvbGVhZmxldC5tYXJrZXJjbHVzdGVyLzEuMS4wL01hcmtlckNsdXN0ZXIuRGVmYXVsdC5jc3MiLz4KPC9oZWFkPgo8Ym9keT4gICAgCiAgICAKICAgICAgICAgICAgPGRpdiBjbGFzcz0iZm9saXVtLW1hcCIgaWQ9Im1hcF82NjM2M2MwZGE5MGM0YjUyOWQ0MGZiOGQ3NGMzNWVjNyIgPjwvZGl2PgogICAgICAgIAo8L2JvZHk+CjxzY3JpcHQ+ICAgIAogICAgCgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBib3VuZHMgPSBudWxsOwogICAgICAgICAgICAKCiAgICAgICAgICAgIHZhciBtYXBfNjYzNjNjMGRhOTBjNGI1MjlkNDBmYjhkNzRjMzVlYzcgPSBMLm1hcCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtYXBfNjYzNjNjMGRhOTBjNGI1MjlkNDBmYjhkNzRjMzVlYzcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2NlbnRlcjogWzM3Ljc3LC0xMjIuNDJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgem9vbTogMTIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhCb3VuZHM6IGJvdW5kcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyczogW10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JsZENvcHlKdW1wOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyczogTC5DUlMuRVBTRzM4NTcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciB0aWxlX2xheWVyXzIzOGNmMWI0NjQ0MjQ3MTE4ZThmMjFiNTE0NzE5Zjc0ID0gTC50aWxlTGF5ZXIoCiAgICAgICAgICAgICAgICAnaHR0cHM6Ly97c30udGlsZS5vcGVuc3RyZWV0bWFwLm9yZy97en0ve3h9L3t5fS5wbmcnLAogICAgICAgICAgICAgICAgewogICJhdHRyaWJ1dGlvbiI6IG51bGwsCiAgImRldGVjdFJldGluYSI6IGZhbHNlLAogICJtYXhab29tIjogMTgsCiAgIm1pblpvb20iOiAxLAogICJub1dyYXAiOiBmYWxzZSwKICAic3ViZG9tYWlucyI6ICJhYmMiCn0KICAgICAgICAgICAgICAgICkuYWRkVG8obWFwXzY2MzYzYzBkYTkwYzRiNTI5ZDQwZmI4ZDc0YzM1ZWM3KTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFya2VyX2NsdXN0ZXJfNzg5OThiM2YxYThlNGQzMWFjNDBmNjAxOGZmYzJmOWEgPSBMLm1hcmtlckNsdXN0ZXJHcm91cCh7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIG1hcF82NjM2M2MwZGE5MGM0YjUyOWQ0MGZiOGQ3NGMzNWVjNy5hZGRMYXllcihtYXJrZXJfY2x1c3Rlcl83ODk5OGIzZjFhOGU0ZDMxYWM0MGY2MDE4ZmZjMmY5YSk7CiAgICAgICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzU4ZGE3N2RjMWJiZTQzMzhiNTljYzBlYWRiMTA1YTI4ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzc1NDIwNzA2NzExLC0xMjIuNDAzNDA0NzkxNDc4OTldLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzc4OTk4YjNmMWE4ZTRkMzFhYzQwZjYwMThmZmMyZjlhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzFjNzhjNzQ3ZDMxZDQwODNiNzc5YzlmOWI3MTY1ZmU4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzc2ZmNiZjEyYjk1NzRiZjNiMmQxNmY4ODg0YWE5OTM5ID0gJCgnPGRpdiBpZD0iaHRtbF83NmZjYmYxMmI5NTc0YmYzYjJkMTZmODg4NGFhOTkzOSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+V0VBUE9OIExBV1M8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzFjNzhjNzQ3ZDMxZDQwODNiNzc5YzlmOWI3MTY1ZmU4LnNldENvbnRlbnQoaHRtbF83NmZjYmYxMmI5NTc0YmYzYjJkMTZmODg4NGFhOTkzOSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzU4ZGE3N2RjMWJiZTQzMzhiNTljYzBlYWRiMTA1YTI4LmJpbmRQb3B1cChwb3B1cF8xYzc4Yzc0N2QzMWQ0MDgzYjc3OWM5ZjliNzE2NWZlOCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl85YWNhN2RiNTE1ODc0YzczYTEwMjU2MzYxMTc1OGUxZiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc3NTQyMDcwNjcxMSwtMTIyLjQwMzQwNDc5MTQ3ODk5XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl83ODk5OGIzZjFhOGU0ZDMxYWM0MGY2MDE4ZmZjMmY5YSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF81NTViNDExNmFhMTg0MmRjOTU3MjkxYmMyZjJiMmJjMSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF81MTdmYTlkOGE1ZGU0MDkzOWJjYTRkNmFlMTNlM2I2ZiA9ICQoJzxkaXYgaWQ9Imh0bWxfNTE3ZmE5ZDhhNWRlNDA5MzliY2E0ZDZhZTEzZTNiNmYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPldFQVBPTiBMQVdTPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81NTViNDExNmFhMTg0MmRjOTU3MjkxYmMyZjJiMmJjMS5zZXRDb250ZW50KGh0bWxfNTE3ZmE5ZDhhNWRlNDA5MzliY2E0ZDZhZTEzZTNiNmYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl85YWNhN2RiNTE1ODc0YzczYTEwMjU2MzYxMTc1OGUxZi5iaW5kUG9wdXAocG9wdXBfNTU1YjQxMTZhYTE4NDJkYzk1NzI5MWJjMmYyYjJiYzEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfMTNiMjE1ZTBkYWNmNDQ5OWE1ZTYzMWJmZjEyNjRiN2MgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43Mjk5ODA5NjcyOTk1OTYsLTEyMi4zODg4NTYyMDQyOTJdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzc4OTk4YjNmMWE4ZTRkMzFhYzQwZjYwMThmZmMyZjlhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2NkM2MzMGY3MTM2MDQyZWE4NGUwYTlkYmI4MDlkMDZjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzBiY2IxMGIxYjQyNDRiNmNhNjkyNGJmN2YzZTljYzE0ID0gJCgnPGRpdiBpZD0iaHRtbF8wYmNiMTBiMWI0MjQ0YjZjYTY5MjRiZjdmM2U5Y2MxNCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+V0FSUkFOVFM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2NkM2MzMGY3MTM2MDQyZWE4NGUwYTlkYmI4MDlkMDZjLnNldENvbnRlbnQoaHRtbF8wYmNiMTBiMWI0MjQ0YjZjYTY5MjRiZjdmM2U5Y2MxNCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzEzYjIxNWUwZGFjZjQ0OTlhNWU2MzFiZmYxMjY0YjdjLmJpbmRQb3B1cChwb3B1cF9jZDNjMzBmNzEzNjA0MmVhODRlMGE5ZGJiODA5ZDA2Yyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl82OTM3NzgxYmE3OGQ0NjJkOTA0ZmJjOTZjYThmN2FiMCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc4NTc4ODM3NjY4ODc5LC0xMjIuNDEyOTcwNTM3NTkxXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl83ODk5OGIzZjFhOGU0ZDMxYWM0MGY2MDE4ZmZjMmY5YSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wOWUyN2FiZjk4YWQ0Mzg5YTJiYWYzODUwNjM5YzM5NyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF81ZGI1M2Q4YTkyODI0NDgwYjU5MWZlYzMxMzRlMGIyNyA9ICQoJzxkaXYgaWQ9Imh0bWxfNWRiNTNkOGE5MjgyNDQ4MGI1OTFmZWMzMTM0ZTBiMjciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk5PTi1DUklNSU5BTDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMDllMjdhYmY5OGFkNDM4OWEyYmFmMzg1MDYzOWMzOTcuc2V0Q29udGVudChodG1sXzVkYjUzZDhhOTI4MjQ0ODBiNTkxZmVjMzEzNGUwYjI3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfNjkzNzc4MWJhNzhkNDYyZDkwNGZiYzk2Y2E4ZjdhYjAuYmluZFBvcHVwKHBvcHVwXzA5ZTI3YWJmOThhZDQzODlhMmJhZjM4NTA2MzljMzk3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2I1ZTY5Yzg3YmQxZjRiOWI4YmFiYWY0OTc0NWQ0ZWE3ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzY1MDUwMTIxNDY2OCwtMTIyLjQxOTY3MTc4MDI5Nl0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfNzg5OThiM2YxYThlNGQzMWFjNDBmNjAxOGZmYzJmOWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMGQ4MThiZDJlZWEzNGQyZTk3NDdlOTZlMTc3ZjEyNGQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNTExODgxNDkwODEwNGMxZjgwZmM5N2Q4MDhlM2JkZmMgPSAkKCc8ZGl2IGlkPSJodG1sXzUxMTg4MTQ5MDgxMDRjMWY4MGZjOTdkODA4ZTNiZGZjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5OT04tQ1JJTUlOQUw8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzBkODE4YmQyZWVhMzRkMmU5NzQ3ZTk2ZTE3N2YxMjRkLnNldENvbnRlbnQoaHRtbF81MTE4ODE0OTA4MTA0YzFmODBmYzk3ZDgwOGUzYmRmYyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2I1ZTY5Yzg3YmQxZjRiOWI4YmFiYWY0OTc0NWQ0ZWE3LmJpbmRQb3B1cChwb3B1cF8wZDgxOGJkMmVlYTM0ZDJlOTc0N2U5NmUxNzdmMTI0ZCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl85ZTk0MjAzOTEzNjY0MGRmYjNhY2FjZjI2NDgxODFhNCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc4ODAxODU1NTgyOSwtMTIyLjQyNjA3NzE3NzM3NDk5XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl83ODk5OGIzZjFhOGU0ZDMxYWM0MGY2MDE4ZmZjMmY5YSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wMDg3ODczZjQxMTc0NGNmYThjNzYxYTQ2NDJmMTQwNyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lM2Q4MjExNzY4Nzc0NjlhYTQ4ZTVjNjllMzAxZTE0NyA9ICQoJzxkaXYgaWQ9Imh0bWxfZTNkODIxMTc2ODc3NDY5YWE0OGU1YzY5ZTMwMWUxNDciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkFTU0FVTFQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzAwODc4NzNmNDExNzQ0Y2ZhOGM3NjFhNDY0MmYxNDA3LnNldENvbnRlbnQoaHRtbF9lM2Q4MjExNzY4Nzc0NjlhYTQ4ZTVjNjllMzAxZTE0Nyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzllOTQyMDM5MTM2NjQwZGZiM2FjYWNmMjY0ODE4MWE0LmJpbmRQb3B1cChwb3B1cF8wMDg3ODczZjQxMTc0NGNmYThjNzYxYTQ2NDJmMTQwNyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9jNDlmZTU0YTIyMWI0NjFkYjM3Y2UwZjAwMDdmZGQ4ZSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc4MDg3ODkzNjAyMTQsLTEyMi40MDU3MjE0NTQ1NjddLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzc4OTk4YjNmMWE4ZTRkMzFhYzQwZjYwMThmZmMyZjlhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzcyZGJjNjNkY2E0YjQzYTNiYjdhN2Y1MDkyMTE4NmJhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2I1OWVhYmQ2OTQ2YjRjNjZiNmYzMDhjMDdiNWY2NGFkID0gJCgnPGRpdiBpZD0iaHRtbF9iNTllYWJkNjk0NmI0YzY2YjZmMzA4YzA3YjVmNjRhZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+T1RIRVIgT0ZGRU5TRVM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzcyZGJjNjNkY2E0YjQzYTNiYjdhN2Y1MDkyMTE4NmJhLnNldENvbnRlbnQoaHRtbF9iNTllYWJkNjk0NmI0YzY2YjZmMzA4YzA3YjVmNjRhZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2M0OWZlNTRhMjIxYjQ2MWRiMzdjZTBmMDAwN2ZkZDhlLmJpbmRQb3B1cChwb3B1cF83MmRiYzYzZGNhNGI0M2EzYmI3YTdmNTA5MjExODZiYSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl82Yjk4NzU0MzNkOTM0NjJkODAxZmRlNDkxZWU2MTg4ZCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc4Mzk4MDU1OTI2MzQsLTEyMi40MTE3NzgyOTU5OTJdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzc4OTk4YjNmMWE4ZTRkMzFhYzQwZjYwMThmZmMyZjlhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2M3YzVhNDcwZDY0YzQ2ZTA5ZDZlMTkyYmZlOTFlYWU3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzhhN2VlNWFmMGI3ZTRhMjZhODQ3Nzc1MzJhMjVkYjIyID0gJCgnPGRpdiBpZD0iaHRtbF84YTdlZTVhZjBiN2U0YTI2YTg0Nzc3NTMyYTI1ZGIyMiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Tk9OLUNSSU1JTkFMPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jN2M1YTQ3MGQ2NGM0NmUwOWQ2ZTE5MmJmZTkxZWFlNy5zZXRDb250ZW50KGh0bWxfOGE3ZWU1YWYwYjdlNGEyNmE4NDc3NzUzMmEyNWRiMjIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl82Yjk4NzU0MzNkOTM0NjJkODAxZmRlNDkxZWU2MTg4ZC5iaW5kUG9wdXAocG9wdXBfYzdjNWE0NzBkNjRjNDZlMDlkNmUxOTJiZmU5MWVhZTcpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfMzIwZmUxNzllMTlkNDUxNTkyYzU1NjAyMzMzOTRjNTMgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NzU3ODc2MjE4MjkyOTUsLTEyMi4zOTMzNTcyNDE0NTFdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzc4OTk4YjNmMWE4ZTRkMzFhYzQwZjYwMThmZmMyZjlhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2NkNTU4MGMxOWFjZDQxYzRhNGZlZjMyYzg1Y2ZlNGM5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2M4MGVmMmQ2ZThjYTQ3MDU4MTlmM2FkYjMxYmE0NzQ1ID0gJCgnPGRpdiBpZD0iaHRtbF9jODBlZjJkNmU4Y2E0NzA1ODE5ZjNhZGIzMWJhNDc0NSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+V0FSUkFOVFM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2NkNTU4MGMxOWFjZDQxYzRhNGZlZjMyYzg1Y2ZlNGM5LnNldENvbnRlbnQoaHRtbF9jODBlZjJkNmU4Y2E0NzA1ODE5ZjNhZGIzMWJhNDc0NSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzMyMGZlMTc5ZTE5ZDQ1MTU5MmM1NTYwMjMzMzk0YzUzLmJpbmRQb3B1cChwb3B1cF9jZDU1ODBjMTlhY2Q0MWM0YTRmZWYzMmM4NWNmZTRjOSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9lNGIxOTllN2JhZWE0YjdjOTU0YzVmZTljY2RhYjBhMCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjcyMDk2Njk2MTU0OTksLTEyMi4zODcxODE2MzU5OTVdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzc4OTk4YjNmMWE4ZTRkMzFhYzQwZjYwMThmZmMyZjlhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzM5YTE3NzUyN2MyZDRjODJiZjUwYmM4Mzc5ODExMjg5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2RmNTk5YmJkNDEyNzQzYTg4ZDAyNTA1MmJkMjc4MzQyID0gJCgnPGRpdiBpZD0iaHRtbF9kZjU5OWJiZDQxMjc0M2E4OGQwMjUwNTJiZDI3ODM0MiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TUlTU0lORyBQRVJTT048L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzM5YTE3NzUyN2MyZDRjODJiZjUwYmM4Mzc5ODExMjg5LnNldENvbnRlbnQoaHRtbF9kZjU5OWJiZDQxMjc0M2E4OGQwMjUwNTJiZDI3ODM0Mik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2U0YjE5OWU3YmFlYTRiN2M5NTRjNWZlOWNjZGFiMGEwLmJpbmRQb3B1cChwb3B1cF8zOWExNzc1MjdjMmQ0YzgyYmY1MGJjODM3OTgxMTI4OSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9jNjg4OGQwZjRjYmU0YzIwOTNmOGFmZGJkMWNmZWQ3YiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc2NDQ3ODE1Nzg2OTUwNSwtMTIyLjQ3NzM3NjUyNDAwMjk5XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl83ODk5OGIzZjFhOGU0ZDMxYWM0MGY2MDE4ZmZjMmY5YSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF84NWZmZjhiZWU3NTM0MTQyYmNjZDI5YmJiODNiZWIxNiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF81ODgxYTM2YjM3ZWQ0MzljOWZlNzhlOTVkYjUzYmYxZSA9ICQoJzxkaXYgaWQ9Imh0bWxfNTg4MWEzNmIzN2VkNDM5YzlmZTc4ZTk1ZGI1M2JmMWUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkxBUkNFTlkvVEhFRlQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzg1ZmZmOGJlZTc1MzQxNDJiY2NkMjliYmI4M2JlYjE2LnNldENvbnRlbnQoaHRtbF81ODgxYTM2YjM3ZWQ0MzljOWZlNzhlOTVkYjUzYmYxZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2M2ODg4ZDBmNGNiZTRjMjA5M2Y4YWZkYmQxY2ZlZDdiLmJpbmRQb3B1cChwb3B1cF84NWZmZjhiZWU3NTM0MTQyYmNjZDI5YmJiODNiZWIxNik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl84N2JlZTYyNjQ0ZjA0OWMwOGE4YjY4MGVhNWE0YTFkMSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc0NTczODk0Mjk2NTQ5NSwtMTIyLjQ3Nzk2MDMyNzI5OV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfNzg5OThiM2YxYThlNGQzMWFjNDBmNjAxOGZmYzJmOWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNDI1NWFiMmJkOTI1NGNkZTliNDllNGVmNDZmNzBkMjggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNjM2NWMwM2Y4YjA4NDlhM2I5ZjljNmRmMzQzNDUzOGEgPSAkKCc8ZGl2IGlkPSJodG1sXzYzNjVjMDNmOGIwODQ5YTNiOWY5YzZkZjM0MzQ1MzhhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5OT04tQ1JJTUlOQUw8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzQyNTVhYjJiZDkyNTRjZGU5YjQ5ZTRlZjQ2ZjcwZDI4LnNldENvbnRlbnQoaHRtbF82MzY1YzAzZjhiMDg0OWEzYjlmOWM2ZGYzNDM0NTM4YSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzg3YmVlNjI2NDRmMDQ5YzA4YThiNjgwZWE1YTRhMWQxLmJpbmRQb3B1cChwb3B1cF80MjU1YWIyYmQ5MjU0Y2RlOWI0OWU0ZWY0NmY3MGQyOCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl85NGEzNDYxNGFiMjY0MDliODc2ZDFhNTM4ZmU3ZTE1MyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjczNTY5NzAyNzU0ODIwNiwtMTIyLjM3Njc1NzY1NTUzMDAxXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl83ODk5OGIzZjFhOGU0ZDMxYWM0MGY2MDE4ZmZjMmY5YSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mNzExYmY0ZDMyYjk0Y2UzYjIzM2VkMjBhNzVmODYzOSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xNjFmYzk1NzRlNzU0NGQzOWY3YTk2MTllNjdkYmRiMSA9ICQoJzxkaXYgaWQ9Imh0bWxfMTYxZmM5NTc0ZTc1NDRkMzlmN2E5NjE5ZTY3ZGJkYjEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk9USEVSIE9GRkVOU0VTPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mNzExYmY0ZDMyYjk0Y2UzYjIzM2VkMjBhNzVmODYzOS5zZXRDb250ZW50KGh0bWxfMTYxZmM5NTc0ZTc1NDRkMzlmN2E5NjE5ZTY3ZGJkYjEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl85NGEzNDYxNGFiMjY0MDliODc2ZDFhNTM4ZmU3ZTE1My5iaW5kUG9wdXAocG9wdXBfZjcxMWJmNGQzMmI5NGNlM2IyMzNlZDIwYTc1Zjg2MzkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfNTBhNDcyOWRkZWNkNDhkMmE1ZmY3NGU5MDljMjhjZmMgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43MjkyNzA1MTk5NTkyLC0xMjIuNDMyMzI1ODcxMDI4XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl83ODk5OGIzZjFhOGU0ZDMxYWM0MGY2MDE4ZmZjMmY5YSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF80ODRmOGNjN2UxYWY0OTkxODUzMDMzNDI1N2FjODk4MSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF85N2U3YjlhZmI3OGE0OGU3OWU0Mjk0NzhkMjNmNTlhYiA9ICQoJzxkaXYgaWQ9Imh0bWxfOTdlN2I5YWZiNzhhNDhlNzllNDI5NDc4ZDIzZjU5YWIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkFTU0FVTFQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzQ4NGY4Y2M3ZTFhZjQ5OTE4NTMwMzM0MjU3YWM4OTgxLnNldENvbnRlbnQoaHRtbF85N2U3YjlhZmI3OGE0OGU3OWU0Mjk0NzhkMjNmNTlhYik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzUwYTQ3MjlkZGVjZDQ4ZDJhNWZmNzRlOTA5YzI4Y2ZjLmJpbmRQb3B1cChwb3B1cF80ODRmOGNjN2UxYWY0OTkxODUzMDMzNDI1N2FjODk4MSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl81NTRjYzc4Y2U5MmU0ZTRlODExYjE1YjkyMGE2N2FhNSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc5MTY0Mjk4MjM4NCwtMTIyLjQwMDkwODY5ODg4OTk5XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl83ODk5OGIzZjFhOGU0ZDMxYWM0MGY2MDE4ZmZjMmY5YSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zNTQyNTdhZjFjYmE0M2M4YWM0Y2I2ZGRiNDVjNjQ0NiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF81NzcyZmY2NmU5ZGU0OGIwYmY5Zjg3YTBmMGRlNTc3ZCA9ICQoJzxkaXYgaWQ9Imh0bWxfNTc3MmZmNjZlOWRlNDhiMGJmOWY4N2EwZjBkZTU3N2QiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkJVUkdMQVJZPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zNTQyNTdhZjFjYmE0M2M4YWM0Y2I2ZGRiNDVjNjQ0Ni5zZXRDb250ZW50KGh0bWxfNTc3MmZmNjZlOWRlNDhiMGJmOWY4N2EwZjBkZTU3N2QpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl81NTRjYzc4Y2U5MmU0ZTRlODExYjE1YjkyMGE2N2FhNS5iaW5kUG9wdXAocG9wdXBfMzU0MjU3YWYxY2JhNDNjOGFjNGNiNmRkYjQ1YzY0NDYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfYWRiNTYyYmFiZjViNDc1N2FlYTAyM2M2OWJiYTc0MmYgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODM3MDY5MzAxNTQ1LC0xMjIuNDA4NTk1MTEwODY5XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl83ODk5OGIzZjFhOGU0ZDMxYWM0MGY2MDE4ZmZjMmY5YSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9kN2MwOWIzMTg4MTc0YTk3YjY1MTE4ODk4OGVkMTFjZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xOTA3YzZkNzA1MDM0MzAyODlhYTRlMGEzZmRlZWU1NyA9ICQoJzxkaXYgaWQ9Imh0bWxfMTkwN2M2ZDcwNTAzNDMwMjg5YWE0ZTBhM2ZkZWVlNTciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlNUT0xFTiBQUk9QRVJUWTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZDdjMDliMzE4ODE3NGE5N2I2NTExODg5ODhlZDExY2Yuc2V0Q29udGVudChodG1sXzE5MDdjNmQ3MDUwMzQzMDI4OWFhNGUwYTNmZGVlZTU3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfYWRiNTYyYmFiZjViNDc1N2FlYTAyM2M2OWJiYTc0MmYuYmluZFBvcHVwKHBvcHVwX2Q3YzA5YjMxODgxNzRhOTdiNjUxMTg4OTg4ZWQxMWNmKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzE2MTFlMmMzODRkMzRjYzZiMmVmMzFhNzE1NGQxYTU2ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzU3Mjg5NTkwNDU3Nzk1LC0xMjIuNDA2ODcwNDAyMDgyXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl83ODk5OGIzZjFhOGU0ZDMxYWM0MGY2MDE4ZmZjMmY5YSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iYThiZjllOGUzZjg0MmE5YTZhMzE0MmUwMTEzYzEzNyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF85MWI2ZWY4MjIzMzU0YzAzOTIyMDRmZTA5ZDcxOGM3OCA9ICQoJzxkaXYgaWQ9Imh0bWxfOTFiNmVmODIyMzM1NGMwMzkyMjA0ZmUwOWQ3MThjNzgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlJPQkJFUlk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2JhOGJmOWU4ZTNmODQyYTlhNmEzMTQyZTAxMTNjMTM3LnNldENvbnRlbnQoaHRtbF85MWI2ZWY4MjIzMzU0YzAzOTIyMDRmZTA5ZDcxOGM3OCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzE2MTFlMmMzODRkMzRjYzZiMmVmMzFhNzE1NGQxYTU2LmJpbmRQb3B1cChwb3B1cF9iYThiZjllOGUzZjg0MmE5YTZhMzE0MmUwMTEzYzEzNyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl8yNTlhZDg2ZWFlNTk0OTYxODZjZDdiMmRmNTZlNmUxNSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc0ODkwNjMwNTE4MjksLTEyMi40MjAzNTQ3ODA4NjA5OV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfNzg5OThiM2YxYThlNGQzMWFjNDBmNjAxOGZmYzJmOWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYTE2MzM4YTg1ODlhNDI1MmI2NWE3Yzg4OGZlNjMxNDQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYmYzYWY3YWNhNmFhNDEzNTllYzRjNDQ3OTdmYzdkNDYgPSAkKCc8ZGl2IGlkPSJodG1sX2JmM2FmN2FjYTZhYTQxMzU5ZWM0YzQ0Nzk3ZmM3ZDQ2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5BU1NBVUxUPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hMTYzMzhhODU4OWE0MjUyYjY1YTdjODg4ZmU2MzE0NC5zZXRDb250ZW50KGh0bWxfYmYzYWY3YWNhNmFhNDEzNTllYzRjNDQ3OTdmYzdkNDYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8yNTlhZDg2ZWFlNTk0OTYxODZjZDdiMmRmNTZlNmUxNS5iaW5kUG9wdXAocG9wdXBfYTE2MzM4YTg1ODlhNDI1MmI2NWE3Yzg4OGZlNjMxNDQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfMWU0N2ZhOGE0NWI5NGE1Y2IzMzRjYTM1OTMxMTI5ZWMgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43MTU3NjU0MjY5OTUsLTEyMi40Mzk5MDk3NjY3NzJdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzc4OTk4YjNmMWE4ZTRkMzFhYzQwZjYwMThmZmMyZjlhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzgyNjJhN2E2YjZiNDRlNzQ5YjE3MGE0OTAyMDQ0MDRjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzA5ZjBlYjUyMTk1ZTQwODZiZWE0N2ExOGIzMmVhYzhlID0gJCgnPGRpdiBpZD0iaHRtbF8wOWYwZWI1MjE5NWU0MDg2YmVhNDdhMThiMzJlYWM4ZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QVNTQVVMVDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfODI2MmE3YTZiNmI0NGU3NDliMTcwYTQ5MDIwNDQwNGMuc2V0Q29udGVudChodG1sXzA5ZjBlYjUyMTk1ZTQwODZiZWE0N2ExOGIzMmVhYzhlKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMWU0N2ZhOGE0NWI5NGE1Y2IzMzRjYTM1OTMxMTI5ZWMuYmluZFBvcHVwKHBvcHVwXzgyNjJhN2E2YjZiNDRlNzQ5YjE3MGE0OTAyMDQ0MDRjKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzgwYzJhMTJkZGM2ODQwZTQ5OTdkYWJmZTY5MzJlZjE3ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzgzNTY5OTM4NjkxOCwtMTIyLjQwODQyMTExNjkyMl0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfNzg5OThiM2YxYThlNGQzMWFjNDBmNjAxOGZmYzJmOWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZDJhYTRhYzVjNjQ5NGY2NzllNzFmMGI1YzcyNDc3ZWUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNmI4ODY2NTg2ZDhhNDNlYmExOTI5ODEyNmY3M2JiMjIgPSAkKCc8ZGl2IGlkPSJodG1sXzZiODg2NjU4NmQ4YTQzZWJhMTkyOTgxMjZmNzNiYjIyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5MQVJDRU5ZL1RIRUZUPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kMmFhNGFjNWM2NDk0ZjY3OWU3MWYwYjVjNzI0NzdlZS5zZXRDb250ZW50KGh0bWxfNmI4ODY2NTg2ZDhhNDNlYmExOTI5ODEyNmY3M2JiMjIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl84MGMyYTEyZGRjNjg0MGU0OTk3ZGFiZmU2OTMyZWYxNy5iaW5kUG9wdXAocG9wdXBfZDJhYTRhYzVjNjQ5NGY2NzllNzFmMGI1YzcyNDc3ZWUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfMDg3ZTgwNzY4MzA5NGI5MThjMjNiNDk0MjVjYzIwYTMgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NzM2MTg2Mjc2NDU2MDQsLTEyMi40MjIzMTU2NzA3NDldLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzc4OTk4YjNmMWE4ZTRkMzFhYzQwZjYwMThmZmMyZjlhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzMxNDEzZGQ4YmZkYzQ0NWVhNGQ0Y2IzOGYxZmJkM2RhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzNmOGFiMTEwMTE4NDQ3ZTViOGYwNjY0MTQ2ZGZiODg4ID0gJCgnPGRpdiBpZD0iaHRtbF8zZjhhYjExMDExODQ0N2U1YjhmMDY2NDE0NmRmYjg4OCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RlJBVUQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzMxNDEzZGQ4YmZkYzQ0NWVhNGQ0Y2IzOGYxZmJkM2RhLnNldENvbnRlbnQoaHRtbF8zZjhhYjExMDExODQ0N2U1YjhmMDY2NDE0NmRmYjg4OCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzA4N2U4MDc2ODMwOTRiOTE4YzIzYjQ5NDI1Y2MyMGEzLmJpbmRQb3B1cChwb3B1cF8zMTQxM2RkOGJmZGM0NDVlYTRkNGNiMzhmMWZiZDNkYSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9hYmI5ZjlhZmY0ZGM0ODhiYjMwNThlYzRlYmMwOTAxNSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc5Mjg0MTI4NDA0NDcwNSwtMTIyLjQyNDUxOTgzNTAwOTAxXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl83ODk5OGIzZjFhOGU0ZDMxYWM0MGY2MDE4ZmZjMmY5YSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF84OTFiYmQ2ZWNiZWE0OTdmOTc5MTUzNzVmZGEyZjBlNyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zNjI2YTU5ODRjY2Y0YjM4Yjc4YmMxMjdmZjhhZGM2MiA9ICQoJzxkaXYgaWQ9Imh0bWxfMzYyNmE1OTg0Y2NmNGIzOGI3OGJjMTI3ZmY4YWRjNjIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPldBUlJBTlRTPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84OTFiYmQ2ZWNiZWE0OTdmOTc5MTUzNzVmZGEyZjBlNy5zZXRDb250ZW50KGh0bWxfMzYyNmE1OTg0Y2NmNGIzOGI3OGJjMTI3ZmY4YWRjNjIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9hYmI5ZjlhZmY0ZGM0ODhiYjMwNThlYzRlYmMwOTAxNS5iaW5kUG9wdXAocG9wdXBfODkxYmJkNmVjYmVhNDk3Zjk3OTE1Mzc1ZmRhMmYwZTcpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfYzdmYjk1ZWIxZGMyNDFkYjhmYzJiMWE0YzJkOGQ3ODEgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NTQwOTg2ODgyMDY3OTUsLTEyMi40MTQyMzM4NDkwMzc5OF0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfNzg5OThiM2YxYThlNGQzMWFjNDBmNjAxOGZmYzJmOWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYmY2ODk4MjM4MGIwNGVmNDk0ZTJhODZiNjU5MjA5ZjYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfM2VhNmNmNDFlNDQwNDZlNGFkNWQ2MGM0MmIxODI4NmQgPSAkKCc8ZGl2IGlkPSJodG1sXzNlYTZjZjQxZTQ0MDQ2ZTRhZDVkNjBjNDJiMTgyODZkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5EUlVHL05BUkNPVElDPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iZjY4OTgyMzgwYjA0ZWY0OTRlMmE4NmI2NTkyMDlmNi5zZXRDb250ZW50KGh0bWxfM2VhNmNmNDFlNDQwNDZlNGFkNWQ2MGM0MmIxODI4NmQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9jN2ZiOTVlYjFkYzI0MWRiOGZjMmIxYTRjMmQ4ZDc4MS5iaW5kUG9wdXAocG9wdXBfYmY2ODk4MjM4MGIwNGVmNDk0ZTJhODZiNjU5MjA5ZjYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfOTYzOWRjNDhhM2U3NDljNjg2MDMyY2MxYzg4NDU5MDcgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NTQwOTg2ODgyMDY3OTUsLTEyMi40MTQyMzM4NDkwMzc5OF0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfNzg5OThiM2YxYThlNGQzMWFjNDBmNjAxOGZmYzJmOWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNTRjMmQ3YTllNjA2NGVjZGIyMDgxZDdjZjI3NjA4MGUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNTNlNzY4NjZjMDIzNDJkZTgwZjI0M2IxYTY1ZTAyMGUgPSAkKCc8ZGl2IGlkPSJodG1sXzUzZTc2ODY2YzAyMzQyZGU4MGYyNDNiMWE2NWUwMjBlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5PVEhFUiBPRkZFTlNFUzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNTRjMmQ3YTllNjA2NGVjZGIyMDgxZDdjZjI3NjA4MGUuc2V0Q29udGVudChodG1sXzUzZTc2ODY2YzAyMzQyZGU4MGYyNDNiMWE2NWUwMjBlKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfOTYzOWRjNDhhM2U3NDljNjg2MDMyY2MxYzg4NDU5MDcuYmluZFBvcHVwKHBvcHVwXzU0YzJkN2E5ZTYwNjRlY2RiMjA4MWQ3Y2YyNzYwODBlKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzkwMGZhMzRlMmI3OTQzN2NiMTAwODBmZGU5NDM4NjQ3ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzcxNDkzOTk2OTQxNiwtMTIyLjUwNzc1MDEzMTAwNDAyXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl83ODk5OGIzZjFhOGU0ZDMxYWM0MGY2MDE4ZmZjMmY5YSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85YmMxZThlZWRjOTc0NDdiOWU1NWExYzljMmMwMGQ3YSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jOTdjNDdlNGY0MGM0OGUxYTZkNDc0OTIxMTVjMWFjZSA9ICQoJzxkaXYgaWQ9Imh0bWxfYzk3YzQ3ZTRmNDBjNDhlMWE2ZDQ3NDkyMTE1YzFhY2UiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkFTU0FVTFQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzliYzFlOGVlZGM5NzQ0N2I5ZTU1YTFjOWMyYzAwZDdhLnNldENvbnRlbnQoaHRtbF9jOTdjNDdlNGY0MGM0OGUxYTZkNDc0OTIxMTVjMWFjZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzkwMGZhMzRlMmI3OTQzN2NiMTAwODBmZGU5NDM4NjQ3LmJpbmRQb3B1cChwb3B1cF85YmMxZThlZWRjOTc0NDdiOWU1NWExYzljMmMwMGQ3YSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9jYWNjZTVlODlmZTE0OWMyOTViMzdmNDQyYjRkOTRhNCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjcxODMwMjIwNDc2NjAwNSwtMTIyLjQ3NDQ0NDYzOTU5NDk5XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl83ODk5OGIzZjFhOGU0ZDMxYWM0MGY2MDE4ZmZjMmY5YSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wZjYyYzk3Y2NkOTI0NzhkODBmMDA5ZmE2MjczZGZjNyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF85ZTc2Zjc1MGNkYzc0OWMzYmYyNTRjYWU5ZDFiNzI3YSA9ICQoJzxkaXYgaWQ9Imh0bWxfOWU3NmY3NTBjZGM3NDljM2JmMjU0Y2FlOWQxYjcyN2EiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk9USEVSIE9GRkVOU0VTPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wZjYyYzk3Y2NkOTI0NzhkODBmMDA5ZmE2MjczZGZjNy5zZXRDb250ZW50KGh0bWxfOWU3NmY3NTBjZGM3NDljM2JmMjU0Y2FlOWQxYjcyN2EpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9jYWNjZTVlODlmZTE0OWMyOTViMzdmNDQyYjRkOTRhNC5iaW5kUG9wdXAocG9wdXBfMGY2MmM5N2NjZDkyNDc4ZDgwZjAwOWZhNjI3M2RmYzcpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfYzhhZDNkYzZkOWU1NGU5Njg3YWMxMjUwMjlhNGYyNTggPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NjQ1NzUyMzE3NjE1LC0xMjIuNDI3NTYyNTk2OTg1XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl83ODk5OGIzZjFhOGU0ZDMxYWM0MGY2MDE4ZmZjMmY5YSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mNDM2YjY2NThhNjk0ODNmOWRkZmUzNGYxOTk3MTk0NSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iZTA4MTBiOTZkMmY0ZjE5OTcwMWFmOTdiZmI5YjgzZiA9ICQoJzxkaXYgaWQ9Imh0bWxfYmUwODEwYjk2ZDJmNGYxOTk3MDFhZjk3YmZiOWI4M2YiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk9USEVSIE9GRkVOU0VTPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mNDM2YjY2NThhNjk0ODNmOWRkZmUzNGYxOTk3MTk0NS5zZXRDb250ZW50KGh0bWxfYmUwODEwYjk2ZDJmNGYxOTk3MDFhZjk3YmZiOWI4M2YpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9jOGFkM2RjNmQ5ZTU0ZTk2ODdhYzEyNTAyOWE0ZjI1OC5iaW5kUG9wdXAocG9wdXBfZjQzNmI2NjU4YTY5NDgzZjlkZGZlMzRmMTk5NzE5NDUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfMWFiOWYxOWU1OWY1NDZhNTkxYzBlNzA4ZTk5MmJkNDUgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODc0Mzc4MzA5MTEyLC0xMjIuNDE5MjAzMDA0MjY4XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl83ODk5OGIzZjFhOGU0ZDMxYWM0MGY2MDE4ZmZjMmY5YSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85YTJhMjNlZThiMjE0OTFlYjAyNzdiNDFjNDY2NDNhMiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iM2VmZjJjOGRiNDM0NTQzOWU1ODVjYjY3Y2ZiYTc5MCA9ICQoJzxkaXYgaWQ9Imh0bWxfYjNlZmYyYzhkYjQzNDU0MzllNTg1Y2I2N2NmYmE3OTAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkJVUkdMQVJZPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85YTJhMjNlZThiMjE0OTFlYjAyNzdiNDFjNDY2NDNhMi5zZXRDb250ZW50KGh0bWxfYjNlZmYyYzhkYjQzNDU0MzllNTg1Y2I2N2NmYmE3OTApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8xYWI5ZjE5ZTU5ZjU0NmE1OTFjMGU3MDhlOTkyYmQ0NS5iaW5kUG9wdXAocG9wdXBfOWEyYTIzZWU4YjIxNDkxZWIwMjc3YjQxYzQ2NjQzYTIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfMGY4MjMwYjkwOWY1NDdlN2I2N2EzNzYyM2MxYjUzNDkgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NDkzNjg4Mjg0NTMyLC0xMjIuNDEyNjkwMTQyMzA4MDFdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzc4OTk4YjNmMWE4ZTRkMzFhYzQwZjYwMThmZmMyZjlhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzAyNWQ3MWI3NWU3ZDQyZGJhNTM2ZDhhZTI5ZmRkM2FlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzc1ZWQ5NzZiZWJlODRhY2I5MGEwODBmNDQ1NDk0NWE4ID0gJCgnPGRpdiBpZD0iaHRtbF83NWVkOTc2YmViZTg0YWNiOTBhMDgwZjQ0NTQ5NDVhOCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+T1RIRVIgT0ZGRU5TRVM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzAyNWQ3MWI3NWU3ZDQyZGJhNTM2ZDhhZTI5ZmRkM2FlLnNldENvbnRlbnQoaHRtbF83NWVkOTc2YmViZTg0YWNiOTBhMDgwZjQ0NTQ5NDVhOCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzBmODIzMGI5MDlmNTQ3ZTdiNjdhMzc2MjNjMWI1MzQ5LmJpbmRQb3B1cChwb3B1cF8wMjVkNzFiNzVlN2Q0MmRiYTUzNmQ4YWUyOWZkZDNhZSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9kOTk1NWY1ZTNmMmM0NDc1ODA4ZGUzMmQ1OWM0Y2ZkZSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjcwOTIwMTA0NjIzNzksLTEyMi40MzQ2MDkyODAzNTJdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzc4OTk4YjNmMWE4ZTRkMzFhYzQwZjYwMThmZmMyZjlhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2U0ODVkZWIwYmZhYTRmYjViYjhkODY0NzEwY2Q1ODViID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzJjODlkZDg4NjY2MjQyODI5YzM4YWQxYWE4NmU4YTllID0gJCgnPGRpdiBpZD0iaHRtbF8yYzg5ZGQ4ODY2NjI0MjgyOWMzOGFkMWFhODZlOGE5ZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Tk9OLUNSSU1JTkFMPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lNDg1ZGViMGJmYWE0ZmI1YmI4ZDg2NDcxMGNkNTg1Yi5zZXRDb250ZW50KGh0bWxfMmM4OWRkODg2NjYyNDI4MjljMzhhZDFhYTg2ZThhOWUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9kOTk1NWY1ZTNmMmM0NDc1ODA4ZGUzMmQ1OWM0Y2ZkZS5iaW5kUG9wdXAocG9wdXBfZTQ4NWRlYjBiZmFhNGZiNWJiOGQ4NjQ3MTBjZDU4NWIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfYjIyNTBkOTA0N2M5NGMxZTg3MDFmMTE5ZGY2OWQ1YjQgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODc5MjA5Mzc1NTMyOTUsLTEyMi40MTA4ODI4MjU1NTFdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzc4OTk4YjNmMWE4ZTRkMzFhYzQwZjYwMThmZmMyZjlhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2M4ZDE5NWY1NjcxYjQwY2M4ZjkxMDk4NzZkOTRmMDZlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2JlMjM3ZTJiNDBjZjRjZDE5NzVmY2VhNTNiNmM2NmVlID0gJCgnPGRpdiBpZD0iaHRtbF9iZTIzN2UyYjQwY2Y0Y2QxOTc1ZmNlYTUzYjZjNjZlZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+VkVISUNMRSBUSEVGVDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYzhkMTk1ZjU2NzFiNDBjYzhmOTEwOTg3NmQ5NGYwNmUuc2V0Q29udGVudChodG1sX2JlMjM3ZTJiNDBjZjRjZDE5NzVmY2VhNTNiNmM2NmVlKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfYjIyNTBkOTA0N2M5NGMxZTg3MDFmMTE5ZGY2OWQ1YjQuYmluZFBvcHVwKHBvcHVwX2M4ZDE5NWY1NjcxYjQwY2M4ZjkxMDk4NzZkOTRmMDZlKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzFiMmI1MTFhOWJkZjQ0OGM5Nzc2NjFjNWQ1Y2E0MTBiID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuODAwNDU2NjQ3MTAzODksLTEyMi40MDE0MzI3NTQ3MjIwMV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfNzg5OThiM2YxYThlNGQzMWFjNDBmNjAxOGZmYzJmOWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMWZlYjk5Njg3NDM3NDhjZTgxNTk2MzgzYWYxMjQxYmUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNzA3OTk5MGU2ZjYyNGU2ZTgxYTBmODg2ZTNmNTFkY2IgPSAkKCc8ZGl2IGlkPSJodG1sXzcwNzk5OTBlNmY2MjRlNmU4MWEwZjg4NmUzZjUxZGNiIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5WRUhJQ0xFIFRIRUZUPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xZmViOTk2ODc0Mzc0OGNlODE1OTYzODNhZjEyNDFiZS5zZXRDb250ZW50KGh0bWxfNzA3OTk5MGU2ZjYyNGU2ZTgxYTBmODg2ZTNmNTFkY2IpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8xYjJiNTExYTliZGY0NDhjOTc3NjYxYzVkNWNhNDEwYi5iaW5kUG9wdXAocG9wdXBfMWZlYjk5Njg3NDM3NDhjZTgxNTk2MzgzYWYxMjQxYmUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfMWYwOTYzOGQ1MDIxNGVjZGFlOTliNzkyMGM3NzQwNmUgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NDM1NTUwNTQyMjY1LC0xMjIuNDIxMTI4MDI5NTA1XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl83ODk5OGIzZjFhOGU0ZDMxYWM0MGY2MDE4ZmZjMmY5YSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82Y2VlNGQ3NDQyNjM0ZTY2YTRiOGYzZGM5ZTVkYTA1MCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF81MzhhMjljZjY1N2M0NTQwOTEzODUzMjU4N2U5M2YxNiA9ICQoJzxkaXYgaWQ9Imh0bWxfNTM4YTI5Y2Y2NTdjNDU0MDkxMzg1MzI1ODdlOTNmMTYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkxBUkNFTlkvVEhFRlQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzZjZWU0ZDc0NDI2MzRlNjZhNGI4ZjNkYzllNWRhMDUwLnNldENvbnRlbnQoaHRtbF81MzhhMjljZjY1N2M0NTQwOTEzODUzMjU4N2U5M2YxNik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzFmMDk2MzhkNTAyMTRlY2RhZTk5Yjc5MjBjNzc0MDZlLmJpbmRQb3B1cChwb3B1cF82Y2VlNGQ3NDQyNjM0ZTY2YTRiOGYzZGM5ZTVkYTA1MCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl82YjI4ZjhjYmM2ZjE0NTMzOTI3NzhlYTZkYTliNGYyZiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc4NjU2NDc2MDc2ODUsLTEyMi40MDcyNDQwODcwMzJdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzc4OTk4YjNmMWE4ZTRkMzFhYzQwZjYwMThmZmMyZjlhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2NiNjM0M2IzMTJiZDRmM2Q4M2YwY2RkOWI1OTM1Y2IzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2YyZGU5ZWIyN2JjZDQ0ZjY4ZTg5NDFlYmMyNjkzODZjID0gJCgnPGRpdiBpZD0iaHRtbF9mMmRlOWViMjdiY2Q0NGY2OGU4OTQxZWJjMjY5Mzg2YyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QVNTQVVMVDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfY2I2MzQzYjMxMmJkNGYzZDgzZjBjZGQ5YjU5MzVjYjMuc2V0Q29udGVudChodG1sX2YyZGU5ZWIyN2JjZDQ0ZjY4ZTg5NDFlYmMyNjkzODZjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfNmIyOGY4Y2JjNmYxNDUzMzkyNzc4ZWE2ZGE5YjRmMmYuYmluZFBvcHVwKHBvcHVwX2NiNjM0M2IzMTJiZDRmM2Q4M2YwY2RkOWI1OTM1Y2IzKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzgxMGFiNzFmOGUwMDQwN2M4NjQzMjU3ZmQyZWVlY2UwID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzYxNTY1NTkyODA0NSwtMTIyLjQyMzgwMzAwMTkwMDk5XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl83ODk5OGIzZjFhOGU0ZDMxYWM0MGY2MDE4ZmZjMmY5YSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hZmM0MzdiZmVkODQ0ZjUyYmI2OTc4YzA5OTMyZTA2ZSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hNGI0YjE0YjY5OTk0YzdjOTZjM2I1OWQxZjU2MjAxZiA9ICQoJzxkaXYgaWQ9Imh0bWxfYTRiNGIxNGI2OTk5NGM3Yzk2YzNiNTlkMWY1NjIwMWYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlJFQ09WRVJFRCBWRUhJQ0xFPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hZmM0MzdiZmVkODQ0ZjUyYmI2OTc4YzA5OTMyZTA2ZS5zZXRDb250ZW50KGh0bWxfYTRiNGIxNGI2OTk5NGM3Yzk2YzNiNTlkMWY1NjIwMWYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl84MTBhYjcxZjhlMDA0MDdjODY0MzI1N2ZkMmVlZWNlMC5iaW5kUG9wdXAocG9wdXBfYWZjNDM3YmZlZDg0NGY1MmJiNjk3OGMwOTkzMmUwNmUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfYmFhMDRjZjExYjAwNDFhNThiZDU2ZDcyNzc5YzdlY2QgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NjE1NjU1OTI4MDQ1LC0xMjIuNDIzODAzMDAxOTAwOTldLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzc4OTk4YjNmMWE4ZTRkMzFhYzQwZjYwMThmZmMyZjlhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzdlNzQ5NGZlZjc4YTQ0YTRiM2NmMDRhY2E5MWQxNjliID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2M5MGVmOWNkNWY4ZjQ1MTJiMDgwY2JiOGEwZWRkOGIxID0gJCgnPGRpdiBpZD0iaHRtbF9jOTBlZjljZDVmOGY0NTEyYjA4MGNiYjhhMGVkZDhiMSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+T1RIRVIgT0ZGRU5TRVM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzdlNzQ5NGZlZjc4YTQ0YTRiM2NmMDRhY2E5MWQxNjliLnNldENvbnRlbnQoaHRtbF9jOTBlZjljZDVmOGY0NTEyYjA4MGNiYjhhMGVkZDhiMSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2JhYTA0Y2YxMWIwMDQxYTU4YmQ1NmQ3Mjc3OWM3ZWNkLmJpbmRQb3B1cChwb3B1cF83ZTc0OTRmZWY3OGE0NGE0YjNjZjA0YWNhOTFkMTY5Yik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl84MGY1ZmQ1MTA0ZTA0MWY5OTY5NjZkNjE0NWZmZWJkOSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc0NDE5Mjc1MDg5MzIwNSwtMTIyLjQ0NDY4NTQ4MjI3M10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfNzg5OThiM2YxYThlNGQzMWFjNDBmNjAxOGZmYzJmOWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMTM2NjY4NzYwOWNlNGNhYzg3NTI1MWU5MmViZTgyZTkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYTBiYmIwMTRmNWNhNGIxN2FmZmFkODVlZjI4OWQ1MzIgPSAkKCc8ZGl2IGlkPSJodG1sX2EwYmJiMDE0ZjVjYTRiMTdhZmZhZDg1ZWYyODlkNTMyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5OT04tQ1JJTUlOQUw8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzEzNjY2ODc2MDljZTRjYWM4NzUyNTFlOTJlYmU4MmU5LnNldENvbnRlbnQoaHRtbF9hMGJiYjAxNGY1Y2E0YjE3YWZmYWQ4NWVmMjg5ZDUzMik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzgwZjVmZDUxMDRlMDQxZjk5Njk2NmQ2MTQ1ZmZlYmQ5LmJpbmRQb3B1cChwb3B1cF8xMzY2Njg3NjA5Y2U0Y2FjODc1MjUxZTkyZWJlODJlOSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9mYjk4OTY3NjFmMDQ0OTQ4YjE1MmY4N2EyNzJhNjhjNSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc3NTQ2OTI4MjAwNDEsLTEyMi40MTU3NTcwMzkxOTZdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzc4OTk4YjNmMWE4ZTRkMzFhYzQwZjYwMThmZmMyZjlhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2M0ODI0MzVjNDBiZDQxM2Y4NmJlYjdjNGY4NWRhNGQwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzE5ZjI3NDJkZDE1MTRlZGY5MjdlOWJmZTFjZWExOThiID0gJCgnPGRpdiBpZD0iaHRtbF8xOWYyNzQyZGQxNTE0ZWRmOTI3ZTliZmUxY2VhMTk4YiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Tk9OLUNSSU1JTkFMPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jNDgyNDM1YzQwYmQ0MTNmODZiZWI3YzRmODVkYTRkMC5zZXRDb250ZW50KGh0bWxfMTlmMjc0MmRkMTUxNGVkZjkyN2U5YmZlMWNlYTE5OGIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9mYjk4OTY3NjFmMDQ0OTQ4YjE1MmY4N2EyNzJhNjhjNS5iaW5kUG9wdXAocG9wdXBfYzQ4MjQzNWM0MGJkNDEzZjg2YmViN2M0Zjg1ZGE0ZDApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfZDk3NzE3MWY4MDhkNDYxMThmYzU1YjUxMzBjNjc0NDIgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43Mjg1MjgwNjI3NDY1LC0xMjIuNDc1NjQ3NDYwNzg1OTldLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzc4OTk4YjNmMWE4ZTRkMzFhYzQwZjYwMThmZmMyZjlhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2E0OGY1NTQ2OWRkNTRjYjM4NjdiYTk3NGUxMmY2ZGIyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzM5ZGNiYmNlNjBhMzRmOWM5YzE2N2FlZDQ5ODMxNzc1ID0gJCgnPGRpdiBpZD0iaHRtbF8zOWRjYmJjZTYwYTM0ZjljOWMxNjdhZWQ0OTgzMTc3NSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Uk9CQkVSWTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYTQ4ZjU1NDY5ZGQ1NGNiMzg2N2JhOTc0ZTEyZjZkYjIuc2V0Q29udGVudChodG1sXzM5ZGNiYmNlNjBhMzRmOWM5YzE2N2FlZDQ5ODMxNzc1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfZDk3NzE3MWY4MDhkNDYxMThmYzU1YjUxMzBjNjc0NDIuYmluZFBvcHVwKHBvcHVwX2E0OGY1NTQ2OWRkNTRjYjM4NjdiYTk3NGUxMmY2ZGIyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2EyN2RjZjFjYmM1YjRiZTNiMjRmYzY0OWU1YzBhZThiID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzQyODUxNzM3NDQ0ODk0LC0xMjIuNDIwOTY3NDQwNTY0XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl83ODk5OGIzZjFhOGU0ZDMxYWM0MGY2MDE4ZmZjMmY5YSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mZDdkNjdhYTk4MWE0MTI3ODliOTI0NDM0NmU0MzgxOCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mZDM5OTI2ZTBkOWU0NWU5YjhkODcwMDNmNjA1YTRkZSA9ICQoJzxkaXYgaWQ9Imh0bWxfZmQzOTkyNmUwZDllNDVlOWI4ZDg3MDAzZjYwNWE0ZGUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk9USEVSIE9GRkVOU0VTPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mZDdkNjdhYTk4MWE0MTI3ODliOTI0NDM0NmU0MzgxOC5zZXRDb250ZW50KGh0bWxfZmQzOTkyNmUwZDllNDVlOWI4ZDg3MDAzZjYwNWE0ZGUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9hMjdkY2YxY2JjNWI0YmUzYjI0ZmM2NDllNWMwYWU4Yi5iaW5kUG9wdXAocG9wdXBfZmQ3ZDY3YWE5ODFhNDEyNzg5YjkyNDQzNDZlNDM4MTgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfNzQ3MDJhMjAwZDZjNDczMDhhYTljY2EwZDVhOGQ3NzggPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODIxMTk4NDg4OTMxLC0xMjIuNDE1NjY5NjYxNDQzXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl83ODk5OGIzZjFhOGU0ZDMxYWM0MGY2MDE4ZmZjMmY5YSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF83NGNkMTUyMWU5YjA0ODI5OWYxZTk2MjQyNTIzODAyOSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lZjA2MWM1MTMyODg0MTAwYTM5OGJkOTRlYWNmN2I5OCA9ICQoJzxkaXYgaWQ9Imh0bWxfZWYwNjFjNTEzMjg4NDEwMGEzOThiZDk0ZWFjZjdiOTgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlZBTkRBTElTTTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNzRjZDE1MjFlOWIwNDgyOTlmMWU5NjI0MjUyMzgwMjkuc2V0Q29udGVudChodG1sX2VmMDYxYzUxMzI4ODQxMDBhMzk4YmQ5NGVhY2Y3Yjk4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfNzQ3MDJhMjAwZDZjNDczMDhhYTljY2EwZDVhOGQ3NzguYmluZFBvcHVwKHBvcHVwXzc0Y2QxNTIxZTliMDQ4Mjk5ZjFlOTYyNDI1MjM4MDI5KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzg5ZjBhZmEyZDFmNjRmZGQ5NDIzNTcxN2NjZjY2YzE4ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzc5MTY3NDIxODk2MywtMTIyLjQwNjM0NjQyNTYzMl0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfNzg5OThiM2YxYThlNGQzMWFjNDBmNjAxOGZmYzJmOWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZDRjM2I0NTdiMzhhNDY5OWFjOWNjMTdmOTcxNGNkZTkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNGZhNDQyYjQ2NTlmNDJiMjg1MjA2YTdmNDVkYWU1YzAgPSAkKCc8ZGl2IGlkPSJodG1sXzRmYTQ0MmI0NjU5ZjQyYjI4NTIwNmE3ZjQ1ZGFlNWMwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5BU1NBVUxUPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kNGMzYjQ1N2IzOGE0Njk5YWM5Y2MxN2Y5NzE0Y2RlOS5zZXRDb250ZW50KGh0bWxfNGZhNDQyYjQ2NTlmNDJiMjg1MjA2YTdmNDVkYWU1YzApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl84OWYwYWZhMmQxZjY0ZmRkOTQyMzU3MTdjY2Y2NmMxOC5iaW5kUG9wdXAocG9wdXBfZDRjM2I0NTdiMzhhNDY5OWFjOWNjMTdmOTcxNGNkZTkpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfOWRkZjc5ZTM3NjU0NDExMGFkZWJlNTI1MjRiZTllZTIgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NjU3MTg0Mzk1MjgyLC0xMjIuNDA5NTI5OTEzMjc4XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl83ODk5OGIzZjFhOGU0ZDMxYWM0MGY2MDE4ZmZjMmY5YSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9kODYwOWIzZjhkMGQ0MDVmYjAwYzNmYWFlNjc2MzZlNyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hM2RhMzI1MTUwOTg0ZTA3ODBlZmFkMDBjY2Y4OTQxNyA9ICQoJzxkaXYgaWQ9Imh0bWxfYTNkYTMyNTE1MDk4NGUwNzgwZWZhZDAwY2NmODk0MTciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkxBUkNFTlkvVEhFRlQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2Q4NjA5YjNmOGQwZDQwNWZiMDBjM2ZhYWU2NzYzNmU3LnNldENvbnRlbnQoaHRtbF9hM2RhMzI1MTUwOTg0ZTA3ODBlZmFkMDBjY2Y4OTQxNyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzlkZGY3OWUzNzY1NDQxMTBhZGViZTUyNTI0YmU5ZWUyLmJpbmRQb3B1cChwb3B1cF9kODYwOWIzZjhkMGQ0MDVmYjAwYzNmYWFlNjc2MzZlNyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl81ZDEyNzYxMWYzMDA0NmMyODU3OGE5N2UyZjI1ZjQ2NCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc3NTQyMDcwNjcxMSwtMTIyLjQwMzQwNDc5MTQ3ODk5XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl83ODk5OGIzZjFhOGU0ZDMxYWM0MGY2MDE4ZmZjMmY5YSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF83NTM1NDc3ZWRlOTc0MTcxODQzYjEzMDQwNTQ4OWY0MiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kNDVjMmE5NTYxNzQ0NTM1OTRmZDQ0MDk5NDczYTIzNyA9ICQoJzxkaXYgaWQ9Imh0bWxfZDQ1YzJhOTU2MTc0NDUzNTk0ZmQ0NDA5OTQ3M2EyMzciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk5PTi1DUklNSU5BTDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNzUzNTQ3N2VkZTk3NDE3MTg0M2IxMzA0MDU0ODlmNDIuc2V0Q29udGVudChodG1sX2Q0NWMyYTk1NjE3NDQ1MzU5NGZkNDQwOTk0NzNhMjM3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfNWQxMjc2MTFmMzAwNDZjMjg1NzhhOTdlMmYyNWY0NjQuYmluZFBvcHVwKHBvcHVwXzc1MzU0NzdlZGU5NzQxNzE4NDNiMTMwNDA1NDg5ZjQyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2Y1ODVlMGRkNDE4YzQzMzJiODAxMTZmZWIxZDA3NTE4ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzY3NTI0MzA4NzgzLC0xMjIuNDEwNzM4MDk3MzE1XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl83ODk5OGIzZjFhOGU0ZDMxYWM0MGY2MDE4ZmZjMmY5YSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9kZjY5ZDAzZGVhNTc0ZTU5OWE1ZWY3MjgxMTZlODUyZSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hNTAwZWE5MmFhMWY0NjM0ODczNGY3YWJmMDU3NTBmZSA9ICQoJzxkaXYgaWQ9Imh0bWxfYTUwMGVhOTJhYTFmNDYzNDg3MzRmN2FiZjA1NzUwZmUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkJVUkdMQVJZPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kZjY5ZDAzZGVhNTc0ZTU5OWE1ZWY3MjgxMTZlODUyZS5zZXRDb250ZW50KGh0bWxfYTUwMGVhOTJhYTFmNDYzNDg3MzRmN2FiZjA1NzUwZmUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9mNTg1ZTBkZDQxOGM0MzMyYjgwMTE2ZmViMWQwNzUxOC5iaW5kUG9wdXAocG9wdXBfZGY2OWQwM2RlYTU3NGU1OTlhNWVmNzI4MTE2ZTg1MmUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfZmQxYzI4NmNmMTJlNGUxMGE4MGY2ZjA4NmY4ZjAxNTEgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43Njc1MjQzMDg3ODMsLTEyMi40MTA3MzgwOTczMTVdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzc4OTk4YjNmMWE4ZTRkMzFhYzQwZjYwMThmZmMyZjlhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2Q5M2Y1YTRjYTYzZTRjYTc5OGI2YTg5YmJkZjY1ODQ1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzA5YmFlYTlmOTEyNDQ1N2E5OWZhZDQwNzg2YTVhODhiID0gJCgnPGRpdiBpZD0iaHRtbF8wOWJhZWE5ZjkxMjQ0NTdhOTlmYWQ0MDc4NmE1YTg4YiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QVJTT048L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2Q5M2Y1YTRjYTYzZTRjYTc5OGI2YTg5YmJkZjY1ODQ1LnNldENvbnRlbnQoaHRtbF8wOWJhZWE5ZjkxMjQ0NTdhOTlmYWQ0MDc4NmE1YTg4Yik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2ZkMWMyODZjZjEyZTRlMTBhODBmNmYwODZmOGYwMTUxLmJpbmRQb3B1cChwb3B1cF9kOTNmNWE0Y2E2M2U0Y2E3OThiNmE4OWJiZGY2NTg0NSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl81ZTliODYwZTIwMWY0OGI4YTY1OGJmY2IyZTgzMzhkOSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjcxMzEwODM0MzMyNjQsLTEyMi40NDQzMTQwMjUxODhdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzc4OTk4YjNmMWE4ZTRkMzFhYzQwZjYwMThmZmMyZjlhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzIxOTEyNzFhMzA4NzRiOWJiMzQyZDkzOGQ4MmRjZGVmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzZmN2NhOTdlN2M4NDQ4MDE4NDUxZDVjY2ZkYjRkMzc0ID0gJCgnPGRpdiBpZD0iaHRtbF82ZjdjYTk3ZTdjODQ0ODAxODQ1MWQ1Y2NmZGI0ZDM3NCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QlVSR0xBUlk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzIxOTEyNzFhMzA4NzRiOWJiMzQyZDkzOGQ4MmRjZGVmLnNldENvbnRlbnQoaHRtbF82ZjdjYTk3ZTdjODQ0ODAxODQ1MWQ1Y2NmZGI0ZDM3NCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzVlOWI4NjBlMjAxZjQ4YjhhNjU4YmZjYjJlODMzOGQ5LmJpbmRQb3B1cChwb3B1cF8yMTkxMjcxYTMwODc0YjliYjM0MmQ5MzhkODJkY2RlZik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9jMGJmOWQ5M2VhNzI0MjQyOGM2ODdmNzM5MTE4Mjc0OCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjcxMzEwODM0MzMyNjQsLTEyMi40NDQzMTQwMjUxODhdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzc4OTk4YjNmMWE4ZTRkMzFhYzQwZjYwMThmZmMyZjlhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzdkZjJkM2UxNWI5MzQyYzE5OTFmY2E4ZTY1ZmUyNWQ3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzZhMTQxNDM0MDAxMzQ3ZGRiOWRkYmZiODEzYjYyYjk0ID0gJCgnPGRpdiBpZD0iaHRtbF82YTE0MTQzNDAwMTM0N2RkYjlkZGJmYjgxM2I2MmI5NCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RFJVRy9OQVJDT1RJQzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfN2RmMmQzZTE1YjkzNDJjMTk5MWZjYThlNjVmZTI1ZDcuc2V0Q29udGVudChodG1sXzZhMTQxNDM0MDAxMzQ3ZGRiOWRkYmZiODEzYjYyYjk0KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfYzBiZjlkOTNlYTcyNDI0MjhjNjg3ZjczOTExODI3NDguYmluZFBvcHVwKHBvcHVwXzdkZjJkM2UxNWI5MzQyYzE5OTFmY2E4ZTY1ZmUyNWQ3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzU5NjY4MTA3YzhkMTQ3ZTQ4ZTY5M2UwZmQyMDEzY2EzID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzY2MDE2MDExNDEwMywtMTIyLjQwMzY0NDYyMDQzOV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfNzg5OThiM2YxYThlNGQzMWFjNDBmNjAxOGZmYzJmOWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYjVhMDExZTA5YWJhNGM1OGJiYmEzOTZmYjgwYjhmNjUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYjQwOGMzNmJjM2JjNGE0ZGE3NTUxNjc3YjJkMzZjNjQgPSAkKCc8ZGl2IGlkPSJodG1sX2I0MDhjMzZiYzNiYzRhNGRhNzU1MTY3N2IyZDM2YzY0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NSVNTSU5HIFBFUlNPTjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYjVhMDExZTA5YWJhNGM1OGJiYmEzOTZmYjgwYjhmNjUuc2V0Q29udGVudChodG1sX2I0MDhjMzZiYzNiYzRhNGRhNzU1MTY3N2IyZDM2YzY0KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfNTk2NjgxMDdjOGQxNDdlNDhlNjkzZTBmZDIwMTNjYTMuYmluZFBvcHVwKHBvcHVwX2I1YTAxMWUwOWFiYTRjNThiYmJhMzk2ZmI4MGI4ZjY1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2ZjZmQ1YTY0OThjNDRkN2JiOTljMmM3ZjYxOGQ5NzMxID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzY2MDE2MDExNDEwMywtMTIyLjQwMzY0NDYyMDQzOV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfNzg5OThiM2YxYThlNGQzMWFjNDBmNjAxOGZmYzJmOWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZTY5Y2E3YWM4MThjNDhmYzk3OTc3YWJiMWM2MGUzNGEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNWM2OTc3MDdjMDIwNGYwMTk4YzE3ODNkOGZlYzIxMWMgPSAkKCc8ZGl2IGlkPSJodG1sXzVjNjk3NzA3YzAyMDRmMDE5OGMxNzgzZDhmZWMyMTFjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NSVNTSU5HIFBFUlNPTjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZTY5Y2E3YWM4MThjNDhmYzk3OTc3YWJiMWM2MGUzNGEuc2V0Q29udGVudChodG1sXzVjNjk3NzA3YzAyMDRmMDE5OGMxNzgzZDhmZWMyMTFjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfZmNmZDVhNjQ5OGM0NGQ3YmI5OWMyYzdmNjE4ZDk3MzEuYmluZFBvcHVwKHBvcHVwX2U2OWNhN2FjODE4YzQ4ZmM5Nzk3N2FiYjFjNjBlMzRhKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2Q4MTZlOTYwYzE2MjRmNTRhNjViMzQ2NmI2NDg4ZDZmID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzc2MjMxMDQwNDc1OCwtMTIyLjQxNDcxNDI5NTU3ODk5XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl83ODk5OGIzZjFhOGU0ZDMxYWM0MGY2MDE4ZmZjMmY5YSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lNzZiZjlmNzkyMjg0MWZmYjc4ZTBlNmJlZWQ3OWRhYSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xZDRhYzJkYmY0NDc0NGU0YWU4MWQyZmFhZDE4YzY1MCA9ICQoJzxkaXYgaWQ9Imh0bWxfMWQ0YWMyZGJmNDQ3NDRlNGFlODFkMmZhYWQxOGM2NTAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkFTU0FVTFQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2U3NmJmOWY3OTIyODQxZmZiNzhlMGU2YmVlZDc5ZGFhLnNldENvbnRlbnQoaHRtbF8xZDRhYzJkYmY0NDc0NGU0YWU4MWQyZmFhZDE4YzY1MCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2Q4MTZlOTYwYzE2MjRmNTRhNjViMzQ2NmI2NDg4ZDZmLmJpbmRQb3B1cChwb3B1cF9lNzZiZjlmNzkyMjg0MWZmYjc4ZTBlNmJlZWQ3OWRhYSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl82NDdiM2E2OThhOTg0YWFmYTFmMThlM2M4OWI5NzMyYyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc3NjIzMTA0MDQ3NTgsLTEyMi40MTQ3MTQyOTU1Nzg5OV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfNzg5OThiM2YxYThlNGQzMWFjNDBmNjAxOGZmYzJmOWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNTE4NGQyMmMxM2IzNDE5ZGIyNzEwYjg5MDc2N2ZmMjIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfODg0YzQ5OGY2NGQ0NGM2ZGFjZDBiZmJlYzJiZmQ3OWMgPSAkKCc8ZGl2IGlkPSJodG1sXzg4NGM0OThmNjRkNDRjNmRhY2QwYmZiZWMyYmZkNzljIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NSVNTSU5HIFBFUlNPTjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNTE4NGQyMmMxM2IzNDE5ZGIyNzEwYjg5MDc2N2ZmMjIuc2V0Q29udGVudChodG1sXzg4NGM0OThmNjRkNDRjNmRhY2QwYmZiZWMyYmZkNzljKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfNjQ3YjNhNjk4YTk4NGFhZmExZjE4ZTNjODliOTczMmMuYmluZFBvcHVwKHBvcHVwXzUxODRkMjJjMTNiMzQxOWRiMjcxMGI4OTA3NjdmZjIyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzQ2MjdhZmJlY2EzMDRiOGJiMzk1MDVhZmFlMWYyYTI5ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzc3NTExODg5NTY5NSwtMTIyLjQxODA0NTQ1Mjc2OF0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfNzg5OThiM2YxYThlNGQzMWFjNDBmNjAxOGZmYzJmOWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZmRiNjIzODJlZmExNGE2YmFiMWUzNDMxZTgyYWU1YTAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYmI5Mjk0N2QyZjYxNDA3ZmE4NGI3OThmMDEyODQ3MTQgPSAkKCc8ZGl2IGlkPSJodG1sX2JiOTI5NDdkMmY2MTQwN2ZhODRiNzk4ZjAxMjg0NzE0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5WRUhJQ0xFIFRIRUZUPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mZGI2MjM4MmVmYTE0YTZiYWIxZTM0MzFlODJhZTVhMC5zZXRDb250ZW50KGh0bWxfYmI5Mjk0N2QyZjYxNDA3ZmE4NGI3OThmMDEyODQ3MTQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl80NjI3YWZiZWNhMzA0YjhiYjM5NTA1YWZhZTFmMmEyOS5iaW5kUG9wdXAocG9wdXBfZmRiNjIzODJlZmExNGE2YmFiMWUzNDMxZTgyYWU1YTApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfMzQ4NmUyNDQ4MTU0NDhlZTg0NzY0M2M1Yzg1NmJmMWMgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODIwMjM4NDc4OTc1LC0xMjIuNDAxMTYxNTU1NjAyXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl83ODk5OGIzZjFhOGU0ZDMxYWM0MGY2MDE4ZmZjMmY5YSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9kOGZjZjE1YThmZmU0ZjQyYWEzOTRiYzUwYTkxY2ZjNiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82Y2E5YzQ5MWI0NTc0MGI5YThkODM3OWFmMzNmOTkxNSA9ICQoJzxkaXYgaWQ9Imh0bWxfNmNhOWM0OTFiNDU3NDBiOWE4ZDgzNzlhZjMzZjk5MTUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk9USEVSIE9GRkVOU0VTPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kOGZjZjE1YThmZmU0ZjQyYWEzOTRiYzUwYTkxY2ZjNi5zZXRDb250ZW50KGh0bWxfNmNhOWM0OTFiNDU3NDBiOWE4ZDgzNzlhZjMzZjk5MTUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8zNDg2ZTI0NDgxNTQ0OGVlODQ3NjQzYzVjODU2YmYxYy5iaW5kUG9wdXAocG9wdXBfZDhmY2YxNWE4ZmZlNGY0MmFhMzk0YmM1MGE5MWNmYzYpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfNzRlYjFlYzhkMjgyNGIyODhjZGMwNzY5OWJiZjdjZGYgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43MjcwMDUzMTk2Mjk5OTUsLTEyMi40MDM0MDg2NjkxOTFdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzc4OTk4YjNmMWE4ZTRkMzFhYzQwZjYwMThmZmMyZjlhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzg5ZThmZTJjN2I5MDQyNDJiYmJkYTM4YWFmZGQ4ZmE4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2U4YTVlYjhlZDg2NTQzZmM5N2YxZjQ0OWExMDEyNzk2ID0gJCgnPGRpdiBpZD0iaHRtbF9lOGE1ZWI4ZWQ4NjU0M2ZjOTdmMWY0NDlhMTAxMjc5NiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+V0FSUkFOVFM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzg5ZThmZTJjN2I5MDQyNDJiYmJkYTM4YWFmZGQ4ZmE4LnNldENvbnRlbnQoaHRtbF9lOGE1ZWI4ZWQ4NjU0M2ZjOTdmMWY0NDlhMTAxMjc5Nik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzc0ZWIxZWM4ZDI4MjRiMjg4Y2RjMDc2OTliYmY3Y2RmLmJpbmRQb3B1cChwb3B1cF84OWU4ZmUyYzdiOTA0MjQyYmJiZGEzOGFhZmRkOGZhOCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl85MTlkZjAyNDgzNTU0YWMwOGQyZGI4NjU5YTZkYmJkZiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc4MzgzNDQzNzQxNDEsLTEyMi40MTI5MzA1MjIwNTldLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzc4OTk4YjNmMWE4ZTRkMzFhYzQwZjYwMThmZmMyZjlhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2ZhMjI1ZmZiNDg2NDQ4YzFiNzhhZjVkODMyMWQ3YmFkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2RhOTZmOWY4MGZjZDRiODNhOTlhYzM0MWU2ZWUxOGM4ID0gJCgnPGRpdiBpZD0iaHRtbF9kYTk2ZjlmODBmY2Q0YjgzYTk5YWMzNDFlNmVlMThjOCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+VkFOREFMSVNNPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mYTIyNWZmYjQ4NjQ0OGMxYjc4YWY1ZDgzMjFkN2JhZC5zZXRDb250ZW50KGh0bWxfZGE5NmY5ZjgwZmNkNGI4M2E5OWFjMzQxZTZlZTE4YzgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl85MTlkZjAyNDgzNTU0YWMwOGQyZGI4NjU5YTZkYmJkZi5iaW5kUG9wdXAocG9wdXBfZmEyMjVmZmI0ODY0NDhjMWI3OGFmNWQ4MzIxZDdiYWQpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfOTg3YjdkM2QyMmJkNDdiYThlMTBhNDY3YzY1YWZiMzEgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NTMwMTg2NTM3NDQ2MDQsLTEyMi40MTg1ODcxNzIyMTldLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzc4OTk4YjNmMWE4ZTRkMzFhYzQwZjYwMThmZmMyZjlhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzA5Mzg5OWY0NDEwZDQ5MGE4OTc5OGFjZTQxNjNiOGM4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2MxMWYxMTA4ZmE2MzQxZWFhMDZlMjE0MDEwZmRhYmUyID0gJCgnPGRpdiBpZD0iaHRtbF9jMTFmMTEwOGZhNjM0MWVhYTA2ZTIxNDAxMGZkYWJlMiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Tk9OLUNSSU1JTkFMPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wOTM4OTlmNDQxMGQ0OTBhODk3OThhY2U0MTYzYjhjOC5zZXRDb250ZW50KGh0bWxfYzExZjExMDhmYTYzNDFlYWEwNmUyMTQwMTBmZGFiZTIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl85ODdiN2QzZDIyYmQ0N2JhOGUxMGE0NjdjNjVhZmIzMS5iaW5kUG9wdXAocG9wdXBfMDkzODk5ZjQ0MTBkNDkwYTg5Nzk4YWNlNDE2M2I4YzgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfMTE4MDI4OGJiY2ZjNDlhMTg2YWM5NjU4M2FmY2VjZDIgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NzQwNDE4Mzg1MDQxLC0xMjIuNDE0MzcwNjI3NDk1XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl83ODk5OGIzZjFhOGU0ZDMxYWM0MGY2MDE4ZmZjMmY5YSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wMTdmNTc0ODQ4Mjc0ZDc0YTM3MzQ5MzEyZGFiYjM5ZSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zYWQ4NGVkYjI0YTg0MGI5YWZlNTIwYWUxYjIzOTA4NCA9ICQoJzxkaXYgaWQ9Imh0bWxfM2FkODRlZGIyNGE4NDBiOWFmZTUyMGFlMWIyMzkwODQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkZSQVVEPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wMTdmNTc0ODQ4Mjc0ZDc0YTM3MzQ5MzEyZGFiYjM5ZS5zZXRDb250ZW50KGh0bWxfM2FkODRlZGIyNGE4NDBiOWFmZTUyMGFlMWIyMzkwODQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8xMTgwMjg4YmJjZmM0OWExODZhYzk2NTgzYWZjZWNkMi5iaW5kUG9wdXAocG9wdXBfMDE3ZjU3NDg0ODI3NGQ3NGEzNzM0OTMxMmRhYmIzOWUpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfYWFkZTYzMjBmMjllNDE0ZjgyMTkwOTE3MDg2NzM3YTUgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43OTA1Mzg5OTM3MjUsLTEyMi40MDM5MTU2ODE1NzEwMV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfNzg5OThiM2YxYThlNGQzMWFjNDBmNjAxOGZmYzJmOWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZDhmODNlMjdkZTNmNDQ2ODkwNjQ3MWFmYWJkZGVkNmMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNTU5ZTllOTc4MmVhNGNhYTlmZmE3MTRmZTJmYTMwODMgPSAkKCc8ZGl2IGlkPSJodG1sXzU1OWU5ZTk3ODJlYTRjYWE5ZmZhNzE0ZmUyZmEzMDgzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5BU1NBVUxUPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kOGY4M2UyN2RlM2Y0NDY4OTA2NDcxYWZhYmRkZWQ2Yy5zZXRDb250ZW50KGh0bWxfNTU5ZTllOTc4MmVhNGNhYTlmZmE3MTRmZTJmYTMwODMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9hYWRlNjMyMGYyOWU0MTRmODIxOTA5MTcwODY3MzdhNS5iaW5kUG9wdXAocG9wdXBfZDhmODNlMjdkZTNmNDQ2ODkwNjQ3MWFmYWJkZGVkNmMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfZjNhMjY2OWJiYmIxNGJkYTk1ZGQ0YTQzNDkxYWViYzcgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODMwOTk4MjQ0NTkyMSwtMTIyLjQxOTE4MzA5NjM2Ml0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfNzg5OThiM2YxYThlNGQzMWFjNDBmNjAxOGZmYzJmOWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOTM2MTgzOTc4ZWUyNDUyZGE2NTIzZGQwZDFjZGMzMTUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfY2Y2MWQxMTUyMjE1NGY3NzljMDI1MDc5YmRhNDMwMDcgPSAkKCc8ZGl2IGlkPSJodG1sX2NmNjFkMTE1MjIxNTRmNzc5YzAyNTA3OWJkYTQzMDA3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5PVEhFUiBPRkZFTlNFUzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOTM2MTgzOTc4ZWUyNDUyZGE2NTIzZGQwZDFjZGMzMTUuc2V0Q29udGVudChodG1sX2NmNjFkMTE1MjIxNTRmNzc5YzAyNTA3OWJkYTQzMDA3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfZjNhMjY2OWJiYmIxNGJkYTk1ZGQ0YTQzNDkxYWViYzcuYmluZFBvcHVwKHBvcHVwXzkzNjE4Mzk3OGVlMjQ1MmRhNjUyM2RkMGQxY2RjMzE1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2FkOWMzOTI2MGI0OTQ2NWE4Y2MyNjhmNDQ3YTFmNTBmID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzQwNzM2MDU0ODM1NzksLTEyMi4zODg3NTMwNDY5OTddLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzc4OTk4YjNmMWE4ZTRkMzFhYzQwZjYwMThmZmMyZjlhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzA5ZGFjMDE5Nzg0ODRhMmFiNmExNmYxYWJmYzBmODVkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzNiNWM3MGU1ZGJhZjQzZGViMzdjY2QwNjQxODA1MGYxID0gJCgnPGRpdiBpZD0iaHRtbF8zYjVjNzBlNWRiYWY0M2RlYjM3Y2NkMDY0MTgwNTBmMSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+T1RIRVIgT0ZGRU5TRVM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzA5ZGFjMDE5Nzg0ODRhMmFiNmExNmYxYWJmYzBmODVkLnNldENvbnRlbnQoaHRtbF8zYjVjNzBlNWRiYWY0M2RlYjM3Y2NkMDY0MTgwNTBmMSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2FkOWMzOTI2MGI0OTQ2NWE4Y2MyNjhmNDQ3YTFmNTBmLmJpbmRQb3B1cChwb3B1cF8wOWRhYzAxOTc4NDg0YTJhYjZhMTZmMWFiZmMwZjg1ZCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9jMDNkNjJiM2MxY2M0YTVlYjU1MTNiM2UxMWVkZDcyZCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc3NDk5MTI5NDQzNjYsLTEyMi40Mzc3OTk3MDM0NjhdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzc4OTk4YjNmMWE4ZTRkMzFhYzQwZjYwMThmZmMyZjlhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzMwMTc2YTgyZGM3MTRlNzY4MWIxNzQzMDJiMTIzOTQxID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzFiZjUzZDk4MTA2ODQ5YTBiMzliYTdiNDA0MWM3ZmVmID0gJCgnPGRpdiBpZD0iaHRtbF8xYmY1M2Q5ODEwNjg0OWEwYjM5YmE3YjQwNDFjN2ZlZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TEFSQ0VOWS9USEVGVDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMzAxNzZhODJkYzcxNGU3NjgxYjE3NDMwMmIxMjM5NDEuc2V0Q29udGVudChodG1sXzFiZjUzZDk4MTA2ODQ5YTBiMzliYTdiNDA0MWM3ZmVmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfYzAzZDYyYjNjMWNjNGE1ZWI1NTEzYjNlMTFlZGQ3MmQuYmluZFBvcHVwKHBvcHVwXzMwMTc2YTgyZGM3MTRlNzY4MWIxNzQzMDJiMTIzOTQxKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2VjMDI0YzhjMjI0ZDRlNzBhM2UxMDA1MGEzZTFhMDZlID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzc3MDkwMjc0MzY2OSwtMTIyLjQyMTMzMjY4NDYzM10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfNzg5OThiM2YxYThlNGQzMWFjNDBmNjAxOGZmYzJmOWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYjcxOGQwZjYxNzllNDQ2M2JhNzMzY2E1MjAwZDlkYWIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYzE2NmRkYmE2YTU2NGIyMWJmMzFiMjJiMGRkNmZlODEgPSAkKCc8ZGl2IGlkPSJodG1sX2MxNjZkZGJhNmE1NjRiMjFiZjMxYjIyYjBkZDZmZTgxIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NSVNTSU5HIFBFUlNPTjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYjcxOGQwZjYxNzllNDQ2M2JhNzMzY2E1MjAwZDlkYWIuc2V0Q29udGVudChodG1sX2MxNjZkZGJhNmE1NjRiMjFiZjMxYjIyYjBkZDZmZTgxKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfZWMwMjRjOGMyMjRkNGU3MGEzZTEwMDUwYTNlMWEwNmUuYmluZFBvcHVwKHBvcHVwX2I3MThkMGY2MTc5ZTQ0NjNiYTczM2NhNTIwMGQ5ZGFiKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzFiYTViYTVhNDI0ZjRhMzU5OGNkMmVhZTBlNDhlZjFiID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzc3MDkwMjc0MzY2OSwtMTIyLjQyMTMzMjY4NDYzM10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfNzg5OThiM2YxYThlNGQzMWFjNDBmNjAxOGZmYzJmOWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNjhhMWY1MWRhN2U5NGY1ZWEyYmVlOGMzYTg2OGRiNmEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZTFlYzIxOGYwNTYyNGI3N2FhNzU0YjQ1M2ZhYzU3OWEgPSAkKCc8ZGl2IGlkPSJodG1sX2UxZWMyMThmMDU2MjRiNzdhYTc1NGI0NTNmYWM1NzlhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NSVNTSU5HIFBFUlNPTjwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNjhhMWY1MWRhN2U5NGY1ZWEyYmVlOGMzYTg2OGRiNmEuc2V0Q29udGVudChodG1sX2UxZWMyMThmMDU2MjRiNzdhYTc1NGI0NTNmYWM1NzlhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMWJhNWJhNWE0MjRmNGEzNTk4Y2QyZWFlMGU0OGVmMWIuYmluZFBvcHVwKHBvcHVwXzY4YTFmNTFkYTdlOTRmNWVhMmJlZThjM2E4NjhkYjZhKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2E5MmY4M2Q3OGEzNTQzOTBiNWIzY2FhYmUxNTg0Y2JkID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzgyMjQ1ODIyMzkxNywtMTIyLjQ0NjYxMjk3ODgzOV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfNzg5OThiM2YxYThlNGQzMWFjNDBmNjAxOGZmYzJmOWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYjBjNThjYjliMjk5NDYzMjkzOWUzNzU4OTczN2U1MWEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfODAzOTA3M2Q3Mzg3NGI5NmEyYWE5N2YxNzVlN2NmZDIgPSAkKCc8ZGl2IGlkPSJodG1sXzgwMzkwNzNkNzM4NzRiOTZhMmFhOTdmMTc1ZTdjZmQyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5XQVJSQU5UUzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYjBjNThjYjliMjk5NDYzMjkzOWUzNzU4OTczN2U1MWEuc2V0Q29udGVudChodG1sXzgwMzkwNzNkNzM4NzRiOTZhMmFhOTdmMTc1ZTdjZmQyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfYTkyZjgzZDc4YTM1NDM5MGI1YjNjYWFiZTE1ODRjYmQuYmluZFBvcHVwKHBvcHVwX2IwYzU4Y2I5YjI5OTQ2MzI5MzllMzc1ODk3MzdlNTFhKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzljZWY1ZDM4ZDUwYTQzYzg5MGY1YjAxNTAwMGNiNDk3ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzMwMDM3OTk5NTEyNzk1LC0xMjIuNDA0NTk0MTQwNjM0XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl83ODk5OGIzZjFhOGU0ZDMxYWM0MGY2MDE4ZmZjMmY5YSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mOGI3NzAxZDFkMWM0YzE5OTRiNGM5NmVhNmNmZjJkOSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kY2RjNjhiMWU0NGQ0YmFmOGFjMDFkMWZlZWEwZWMxMyA9ICQoJzxkaXYgaWQ9Imh0bWxfZGNkYzY4YjFlNDRkNGJhZjhhYzAxZDFmZWVhMGVjMTMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk5PTi1DUklNSU5BTDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZjhiNzcwMWQxZDFjNGMxOTk0YjRjOTZlYTZjZmYyZDkuc2V0Q29udGVudChodG1sX2RjZGM2OGIxZTQ0ZDRiYWY4YWMwMWQxZmVlYTBlYzEzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfOWNlZjVkMzhkNTBhNDNjODkwZjViMDE1MDAwY2I0OTcuYmluZFBvcHVwKHBvcHVwX2Y4Yjc3MDFkMWQxYzRjMTk5NGI0Yzk2ZWE2Y2ZmMmQ5KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzdlZjg2Njg1MmNlMDRlZjM4MDBiODY2NzRiOTk4YTNiID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzk1MzMzODI2NzQzNiwtMTIyLjM5NzM3Mzc0MDA2Nl0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfNzg5OThiM2YxYThlNGQzMWFjNDBmNjAxOGZmYzJmOWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYzMxOGFkZmI3ZmFiNDQ4MmJlOWFiMmE2Y2ZjMzNkM2UgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMGI1ZDc3MDFlYjYyNDQyODhkZGUwZjY5MjQ0OGIwMGYgPSAkKCc8ZGl2IGlkPSJodG1sXzBiNWQ3NzAxZWI2MjQ0Mjg4ZGRlMGY2OTI0NDhiMDBmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5OT04tQ1JJTUlOQUw8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2MzMThhZGZiN2ZhYjQ0ODJiZTlhYjJhNmNmYzMzZDNlLnNldENvbnRlbnQoaHRtbF8wYjVkNzcwMWViNjI0NDI4OGRkZTBmNjkyNDQ4YjAwZik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzdlZjg2Njg1MmNlMDRlZjM4MDBiODY2NzRiOTk4YTNiLmJpbmRQb3B1cChwb3B1cF9jMzE4YWRmYjdmYWI0NDgyYmU5YWIyYTZjZmMzM2QzZSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl8wNzE2ZDExMDliZDY0NDFjYTNmNDJjYzZhOTA3ZjE1YSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc4NzUxNTg3NDE2MjI5NSwtMTIyLjQwNzQzNDk4OTUyM10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfNzg5OThiM2YxYThlNGQzMWFjNDBmNjAxOGZmYzJmOWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMmVlN2I3ZjIyY2M5NDQ1ZTg2M2U0NmM3ZGMxMGI2MjIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNjMxZjY4MmFmMmJlNGRiZTkyMjYxMDcyN2VkMDQwMDggPSAkKCc8ZGl2IGlkPSJodG1sXzYzMWY2ODJhZjJiZTRkYmU5MjI2MTA3MjdlZDA0MDA4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5XQVJSQU5UUzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMmVlN2I3ZjIyY2M5NDQ1ZTg2M2U0NmM3ZGMxMGI2MjIuc2V0Q29udGVudChodG1sXzYzMWY2ODJhZjJiZTRkYmU5MjI2MTA3MjdlZDA0MDA4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMDcxNmQxMTA5YmQ2NDQxY2EzZjQyY2M2YTkwN2YxNWEuYmluZFBvcHVwKHBvcHVwXzJlZTdiN2YyMmNjOTQ0NWU4NjNlNDZjN2RjMTBiNjIyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzdiMGExNGVjNzY1ZTRlY2FhYmYzN2FiNGViNWExNmUyID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzc4NTIzMzc3NjAzMiwtMTIyLjQwMzQ2NDA4MDAzM10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfNzg5OThiM2YxYThlNGQzMWFjNDBmNjAxOGZmYzJmOWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfN2VlOGM3MTZmNDM2NGY2OWI3YmIwNjVjYTQ2OTVlOWQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYmYxMzIyZjFkMTA5NDVmZGE1NjE2N2I2ZDI5MmIxYzggPSAkKCc8ZGl2IGlkPSJodG1sX2JmMTMyMmYxZDEwOTQ1ZmRhNTYxNjdiNmQyOTJiMWM4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5QUk9TVElUVVRJT048L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzdlZThjNzE2ZjQzNjRmNjliN2JiMDY1Y2E0Njk1ZTlkLnNldENvbnRlbnQoaHRtbF9iZjEzMjJmMWQxMDk0NWZkYTU2MTY3YjZkMjkyYjFjOCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzdiMGExNGVjNzY1ZTRlY2FhYmYzN2FiNGViNWExNmUyLmJpbmRQb3B1cChwb3B1cF83ZWU4YzcxNmY0MzY0ZjY5YjdiYjA2NWNhNDY5NWU5ZCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl83Y2ExNDg5OTI3NWQ0YzgwOWYyNjkzNmZiOTQxZmYxMyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc3ODUyMzM3NzYwMzIsLTEyMi40MDM0NjQwODAwMzNdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzc4OTk4YjNmMWE4ZTRkMzFhYzQwZjYwMThmZmMyZjlhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2Q3NTA5YTdmNmM0NjQyYjZhOGJhZjFlOTU5Zjg4MzIyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzNhMjBjYWNkOGY0NzRiZTQ4ZDhkYmEzYzMzZTUxMzlhID0gJCgnPGRpdiBpZD0iaHRtbF8zYTIwY2FjZDhmNDc0YmU0OGQ4ZGJhM2MzM2U1MTM5YSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+T1RIRVIgT0ZGRU5TRVM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2Q3NTA5YTdmNmM0NjQyYjZhOGJhZjFlOTU5Zjg4MzIyLnNldENvbnRlbnQoaHRtbF8zYTIwY2FjZDhmNDc0YmU0OGQ4ZGJhM2MzM2U1MTM5YSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzdjYTE0ODk5Mjc1ZDRjODA5ZjI2OTM2ZmI5NDFmZjEzLmJpbmRQb3B1cChwb3B1cF9kNzUwOWE3ZjZjNDY0MmI2YThiYWYxZTk1OWY4ODMyMik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl8zYWRiMjE3OWRhMWI0MTAwOTdmYmMyNTZiODUzNTlkOSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc3MzI5MTgwNjkwMjk5NiwtMTIyLjQzNjYxNDE4MTMzMTAxXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl83ODk5OGIzZjFhOGU0ZDMxYWM0MGY2MDE4ZmZjMmY5YSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82NzdhOGU0NzEyOTE0YWFkYTU3NjEzODYxYzE3OGE5NyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wNWE4Y2MyMTU5ZDk0NzZlYmFkM2E4YWJkODAyN2Q0MyA9ICQoJzxkaXYgaWQ9Imh0bWxfMDVhOGNjMjE1OWQ5NDc2ZWJhZDNhOGFiZDgwMjdkNDMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk5PTi1DUklNSU5BTDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNjc3YThlNDcxMjkxNGFhZGE1NzYxMzg2MWMxNzhhOTcuc2V0Q29udGVudChodG1sXzA1YThjYzIxNTlkOTQ3NmViYWQzYThhYmQ4MDI3ZDQzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfM2FkYjIxNzlkYTFiNDEwMDk3ZmJjMjU2Yjg1MzU5ZDkuYmluZFBvcHVwKHBvcHVwXzY3N2E4ZTQ3MTI5MTRhYWRhNTc2MTM4NjFjMTc4YTk3KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzBjYjdjMDkwMjY0NDQ0NTI5MGRhOGYyNTg4NWY2OWZjID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzgwNTI3NTc4NTA5LC0xMjIuMzk2ODQ5MDE1MTcyMDFdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzc4OTk4YjNmMWE4ZTRkMzFhYzQwZjYwMThmZmMyZjlhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzgwNjViZGVlNGI4MjQ5MDdhYjc1YjZiOWQ4NzdlYjRjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2M1NmZiYTA5ZjFkMDRhOTU5YTE0MGMzZjVjZWI0MTFmID0gJCgnPGRpdiBpZD0iaHRtbF9jNTZmYmEwOWYxZDA0YTk1OWExNDBjM2Y1Y2ViNDExZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RFJVRy9OQVJDT1RJQzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfODA2NWJkZWU0YjgyNDkwN2FiNzViNmI5ZDg3N2ViNGMuc2V0Q29udGVudChodG1sX2M1NmZiYTA5ZjFkMDRhOTU5YTE0MGMzZjVjZWI0MTFmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMGNiN2MwOTAyNjQ0NDQ1MjkwZGE4ZjI1ODg1ZjY5ZmMuYmluZFBvcHVwKHBvcHVwXzgwNjViZGVlNGI4MjQ5MDdhYjc1YjZiOWQ4NzdlYjRjKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2EzNGUwNTg1OTRhMjRkZWU4YzAwYTk5ZDMzOTAwOTlmID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzgwNTI3NTc4NTA5LC0xMjIuMzk2ODQ5MDE1MTcyMDFdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzc4OTk4YjNmMWE4ZTRkMzFhYzQwZjYwMThmZmMyZjlhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2ZkNDViODIzMTNlOTQ2N2NhN2U3OWIwMzYwYWJiYjIzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzNkYjEzMmMwOWY3OTRmYzRiZDIyMzE1MzZkY2VhNmI2ID0gJCgnPGRpdiBpZD0iaHRtbF8zZGIxMzJjMDlmNzk0ZmM0YmQyMjMxNTM2ZGNlYTZiNiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+V0FSUkFOVFM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2ZkNDViODIzMTNlOTQ2N2NhN2U3OWIwMzYwYWJiYjIzLnNldENvbnRlbnQoaHRtbF8zZGIxMzJjMDlmNzk0ZmM0YmQyMjMxNTM2ZGNlYTZiNik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2EzNGUwNTg1OTRhMjRkZWU4YzAwYTk5ZDMzOTAwOTlmLmJpbmRQb3B1cChwb3B1cF9mZDQ1YjgyMzEzZTk0NjdjYTdlNzliMDM2MGFiYmIyMyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl82YjFlZTdjZTlhZjk0M2ZmYjgwN2E4MmI0MWE3OGE5YyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjcyODQxODA3MDY2MDIwNCwtMTIyLjQ1MDAwMDc5MDQ0NV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfNzg5OThiM2YxYThlNGQzMWFjNDBmNjAxOGZmYzJmOWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYThiZjZkYTU0YjhhNDliZDkwZTE5YmE5ZDIzYWFiNDEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYzE4MDYzM2I4Yzg1NDg5MmJkOTZlYzYxZmUzYTFkMDUgPSAkKCc8ZGl2IGlkPSJodG1sX2MxODA2MzNiOGM4NTQ4OTJiZDk2ZWM2MWZlM2ExZDA1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5MQVJDRU5ZL1RIRUZUPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hOGJmNmRhNTRiOGE0OWJkOTBlMTliYTlkMjNhYWI0MS5zZXRDb250ZW50KGh0bWxfYzE4MDYzM2I4Yzg1NDg5MmJkOTZlYzYxZmUzYTFkMDUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl82YjFlZTdjZTlhZjk0M2ZmYjgwN2E4MmI0MWE3OGE5Yy5iaW5kUG9wdXAocG9wdXBfYThiZjZkYTU0YjhhNDliZDkwZTE5YmE5ZDIzYWFiNDEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfNzU2YTZmMzgyYjk3NDRlYjlhMDJkNTBhZTIzMjRlM2MgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43MjkyMTE0NjQ3MzU5LC0xMjIuNDAwODM0MjgzMDMxXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl83ODk5OGIzZjFhOGU0ZDMxYWM0MGY2MDE4ZmZjMmY5YSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF84OWFiYzU3OTdmMWM0M2FjODZhZmU0NGIzNmRmYzA4YiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jNjFjOGMyZjUwMTk0MDJlODAzNmEwY2JmZDgxZjJiNiA9ICQoJzxkaXYgaWQ9Imh0bWxfYzYxYzhjMmY1MDE5NDAyZTgwMzZhMGNiZmQ4MWYyYjYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk9USEVSIE9GRkVOU0VTPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84OWFiYzU3OTdmMWM0M2FjODZhZmU0NGIzNmRmYzA4Yi5zZXRDb250ZW50KGh0bWxfYzYxYzhjMmY1MDE5NDAyZTgwMzZhMGNiZmQ4MWYyYjYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl83NTZhNmYzODJiOTc0NGViOWEwMmQ1MGFlMjMyNGUzYy5iaW5kUG9wdXAocG9wdXBfODlhYmM1Nzk3ZjFjNDNhYzg2YWZlNDRiMzZkZmMwOGIpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfMjUxM2ExNTYwYzAxNGE2Mzk3OGU0NWFmOWFjMmFkNDYgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODgwMDY1MzI0MzkyMDUsLTEyMi4zOTk4MDIxNDU3OTldLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzc4OTk4YjNmMWE4ZTRkMzFhYzQwZjYwMThmZmMyZjlhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzIyYWI4YTFkYmM0ODQwMWM4OGM2MmJiMzU2MjJmZjc0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzg4NzNmNjJmZDQ4MzQxNzg4NDI3YzczZmZiOThlNDJkID0gJCgnPGRpdiBpZD0iaHRtbF84ODczZjYyZmQ0ODM0MTc4ODQyN2M3M2ZmYjk4ZTQyZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TEFSQ0VOWS9USEVGVDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMjJhYjhhMWRiYzQ4NDAxYzg4YzYyYmIzNTYyMmZmNzQuc2V0Q29udGVudChodG1sXzg4NzNmNjJmZDQ4MzQxNzg4NDI3YzczZmZiOThlNDJkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMjUxM2ExNTYwYzAxNGE2Mzk3OGU0NWFmOWFjMmFkNDYuYmluZFBvcHVwKHBvcHVwXzIyYWI4YTFkYmM0ODQwMWM4OGM2MmJiMzU2MjJmZjc0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzA2YWU5NWE0MDJmYTQwMzJhYzcxYjg4MTU4NjhjMWY2ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzIzOTc0ODI0MTYwOSwtMTIyLjM5NDkyODQ3NThdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzc4OTk4YjNmMWE4ZTRkMzFhYzQwZjYwMThmZmMyZjlhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2NhY2MzMmYyMzVkZjQxMDg5M2QxYzkwNmY4MGQyOWNiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzlhYzgyMTNiZWIxYzRmZGRiNGVkMDU1Mzk2NWRmMTU4ID0gJCgnPGRpdiBpZD0iaHRtbF85YWM4MjEzYmViMWM0ZmRkYjRlZDA1NTM5NjVkZjE1OCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U0VDT05EQVJZIENPREVTPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jYWNjMzJmMjM1ZGY0MTA4OTNkMWM5MDZmODBkMjljYi5zZXRDb250ZW50KGh0bWxfOWFjODIxM2JlYjFjNGZkZGI0ZWQwNTUzOTY1ZGYxNTgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8wNmFlOTVhNDAyZmE0MDMyYWM3MWI4ODE1ODY4YzFmNi5iaW5kUG9wdXAocG9wdXBfY2FjYzMyZjIzNWRmNDEwODkzZDFjOTA2ZjgwZDI5Y2IpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfOGFkM2U5NzQ4NDUxNDc2MGJlNmY0YjJjZmZjMjhmMzkgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43MjM5NzQ4MjQxNjA5LC0xMjIuMzk0OTI4NDc1OF0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfNzg5OThiM2YxYThlNGQzMWFjNDBmNjAxOGZmYzJmOWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMjNlMDFmYzJkNTI2NDExZTllZDY0NTk0ZTY2ZDY3YzggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMWMxYzM4ZGE5NThlNDIyN2E0NGYwMjI3NmZmNDQzYzIgPSAkKCc8ZGl2IGlkPSJodG1sXzFjMWMzOGRhOTU4ZTQyMjdhNDRmMDIyNzZmZjQ0M2MyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5TVVNQSUNJT1VTIE9DQzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMjNlMDFmYzJkNTI2NDExZTllZDY0NTk0ZTY2ZDY3Yzguc2V0Q29udGVudChodG1sXzFjMWMzOGRhOTU4ZTQyMjdhNDRmMDIyNzZmZjQ0M2MyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfOGFkM2U5NzQ4NDUxNDc2MGJlNmY0YjJjZmZjMjhmMzkuYmluZFBvcHVwKHBvcHVwXzIzZTAxZmMyZDUyNjQxMWU5ZWQ2NDU5NGU2NmQ2N2M4KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzQzMTM3ZjViYzBhZjQ2MGY5NjAxOTg0OTRmZWE0NjQwID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzIzOTc0ODI0MTYwOSwtMTIyLjM5NDkyODQ3NThdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzc4OTk4YjNmMWE4ZTRkMzFhYzQwZjYwMThmZmMyZjlhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzkzNWNlMjRjMzczNjQ5NzY4MDRjMmUxYzQyODI1NWVmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzgxOWMwZTUwMDkwNDQ0YTFiNmY1ZDEwMTQzMTUzMGU2ID0gJCgnPGRpdiBpZD0iaHRtbF84MTljMGU1MDA5MDQ0NGExYjZmNWQxMDE0MzE1MzBlNiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+T1RIRVIgT0ZGRU5TRVM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzkzNWNlMjRjMzczNjQ5NzY4MDRjMmUxYzQyODI1NWVmLnNldENvbnRlbnQoaHRtbF84MTljMGU1MDA5MDQ0NGExYjZmNWQxMDE0MzE1MzBlNik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzQzMTM3ZjViYzBhZjQ2MGY5NjAxOTg0OTRmZWE0NjQwLmJpbmRQb3B1cChwb3B1cF85MzVjZTI0YzM3MzY0OTc2ODA0YzJlMWM0MjgyNTVlZik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl82ZmJmMTg0ZmJmNGM0YWExOGRmMDNlNmVlMWU4Yjk3NCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc4ODMyMzU0NDk5MDQsLTEyMi40MTE4NTcwMzI1NF0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfNzg5OThiM2YxYThlNGQzMWFjNDBmNjAxOGZmYzJmOWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZjQyNzM5YWY2NWZmNDVjNDhiOWI3MmY2MGI0NDdmZDggPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYTYxZWU5NzVjMmUxNDQ1ODhiMDNkNzkzZjVmMjZkMDMgPSAkKCc8ZGl2IGlkPSJodG1sX2E2MWVlOTc1YzJlMTQ0NTg4YjAzZDc5M2Y1ZjI2ZDAzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5MQVJDRU5ZL1RIRUZUPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mNDI3MzlhZjY1ZmY0NWM0OGI5YjcyZjYwYjQ0N2ZkOC5zZXRDb250ZW50KGh0bWxfYTYxZWU5NzVjMmUxNDQ1ODhiMDNkNzkzZjVmMjZkMDMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl82ZmJmMTg0ZmJmNGM0YWExOGRmMDNlNmVlMWU4Yjk3NC5iaW5kUG9wdXAocG9wdXBfZjQyNzM5YWY2NWZmNDVjNDhiOWI3MmY2MGI0NDdmZDgpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfNzkwOGFjNzJiYjFhNDg1OTgzN2FmYzQ0MzQyMGYwYzMgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NTU5OTc3MzM5ODU2LC0xMjIuNDA5NDM1NjE3MTA2XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl83ODk5OGIzZjFhOGU0ZDMxYWM0MGY2MDE4ZmZjMmY5YSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF80MjQ5ZDA1NzI3Nzc0ZjY4ODBmNTlhNWFlOTE5OThjMCA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF81NWVhMjNiOGNmOTE0NWEwYjVkM2RkY2M0NWMzYmY0MSA9ICQoJzxkaXYgaWQ9Imh0bWxfNTVlYTIzYjhjZjkxNDVhMGI1ZDNkZGNjNDVjM2JmNDEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk9USEVSIE9GRkVOU0VTPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80MjQ5ZDA1NzI3Nzc0ZjY4ODBmNTlhNWFlOTE5OThjMC5zZXRDb250ZW50KGh0bWxfNTVlYTIzYjhjZjkxNDVhMGI1ZDNkZGNjNDVjM2JmNDEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl83OTA4YWM3MmJiMWE0ODU5ODM3YWZjNDQzNDIwZjBjMy5iaW5kUG9wdXAocG9wdXBfNDI0OWQwNTcyNzc3NGY2ODgwZjU5YTVhZTkxOTk4YzApOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfMTcyM2JiNDc3NDU4NDcyOWE0OThiODc5MTQzMDVlNWYgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43ODcwNzk4MTQ0NDQzLC0xMjIuNDI1ODgzMzU4MTQ4XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl83ODk5OGIzZjFhOGU0ZDMxYWM0MGY2MDE4ZmZjMmY5YSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF80NjkwMDdlZTkyNTM0ZDM0OGI1MzI0Nzc2ZTMyNTg2YSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xMDBhY2JmZmMzZjQ0NzFmOGI5YTVkYThiM2FhYzA4OCA9ICQoJzxkaXYgaWQ9Imh0bWxfMTAwYWNiZmZjM2Y0NDcxZjhiOWE1ZGE4YjNhYWMwODgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk5PTi1DUklNSU5BTDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNDY5MDA3ZWU5MjUzNGQzNDhiNTMyNDc3NmUzMjU4NmEuc2V0Q29udGVudChodG1sXzEwMGFjYmZmYzNmNDQ3MWY4YjlhNWRhOGIzYWFjMDg4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMTcyM2JiNDc3NDU4NDcyOWE0OThiODc5MTQzMDVlNWYuYmluZFBvcHVwKHBvcHVwXzQ2OTAwN2VlOTI1MzRkMzQ4YjUzMjQ3NzZlMzI1ODZhKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzIwNDAwYjZmZjg0NDQ3YjE4NzRhYmRmNDFmYzdhOGU1ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzM2MDM3NDQ2Njg2MjA0LC0xMjIuNDE1MTI2NTQzMDAxMDFdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzc4OTk4YjNmMWE4ZTRkMzFhYzQwZjYwMThmZmMyZjlhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2FkYjZiMjY2ZjNhNDRjY2VhMTc2NzE2ZDA2Y2Y5YTgxID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzI1YjAzNTZkMzRlMzQ4YjM5OTY4NmNkZGQ5NmM2ZjYzID0gJCgnPGRpdiBpZD0iaHRtbF8yNWIwMzU2ZDM0ZTM0OGIzOTk2ODZjZGRkOTZjNmY2MyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Tk9OLUNSSU1JTkFMPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hZGI2YjI2NmYzYTQ0Y2NlYTE3NjcxNmQwNmNmOWE4MS5zZXRDb250ZW50KGh0bWxfMjViMDM1NmQzNGUzNDhiMzk5Njg2Y2RkZDk2YzZmNjMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8yMDQwMGI2ZmY4NDQ0N2IxODc0YWJkZjQxZmM3YThlNS5iaW5kUG9wdXAocG9wdXBfYWRiNmIyNjZmM2E0NGNjZWExNzY3MTZkMDZjZjlhODEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfNDkzYjA5NDc0MTE3NDE0Mjg0MjBiNWU1NDZiZmNjMWMgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43MTI3Njc4ODQ4MjEsLTEyMi40MzE5MjgwMTEwODldLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzc4OTk4YjNmMWE4ZTRkMzFhYzQwZjYwMThmZmMyZjlhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2E0ZTRhNmZmMWQxMTQ1ZDBhZDNhYzE1OTlhYzA2NDk4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2RkZjUwNzcwNTYwNDRmZmE5ZmNlNDVmZTQxMjA0MzI0ID0gJCgnPGRpdiBpZD0iaHRtbF9kZGY1MDc3MDU2MDQ0ZmZhOWZjZTQ1ZmU0MTIwNDMyNCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+T1RIRVIgT0ZGRU5TRVM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2E0ZTRhNmZmMWQxMTQ1ZDBhZDNhYzE1OTlhYzA2NDk4LnNldENvbnRlbnQoaHRtbF9kZGY1MDc3MDU2MDQ0ZmZhOWZjZTQ1ZmU0MTIwNDMyNCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzQ5M2IwOTQ3NDExNzQxNDI4NDIwYjVlNTQ2YmZjYzFjLmJpbmRQb3B1cChwb3B1cF9hNGU0YTZmZjFkMTE0NWQwYWQzYWMxNTk5YWMwNjQ5OCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl8wYmQ5Yzc3Y2ZkMjM0Njk5ODRlN2E4MjQzMDgxMWU4MSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc4OTU3MTAyNTU4NjMsLTEyMi40MDIxNjM3MTM2MThdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzc4OTk4YjNmMWE4ZTRkMzFhYzQwZjYwMThmZmMyZjlhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzc1MWZmMjRiYzJjOTQzYjI5NjVkYTU1MzBhOTU1OTc0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2MyZjFhZWM3M2IzMzQyNjdiZmUxNDdhNjljNmE5NjYwID0gJCgnPGRpdiBpZD0iaHRtbF9jMmYxYWVjNzNiMzM0MjY3YmZlMTQ3YTY5YzZhOTY2MCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RFJVTktFTk5FU1M8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzc1MWZmMjRiYzJjOTQzYjI5NjVkYTU1MzBhOTU1OTc0LnNldENvbnRlbnQoaHRtbF9jMmYxYWVjNzNiMzM0MjY3YmZlMTQ3YTY5YzZhOTY2MCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzBiZDljNzdjZmQyMzQ2OTk4NGU3YTgyNDMwODExZTgxLmJpbmRQb3B1cChwb3B1cF83NTFmZjI0YmMyYzk0M2IyOTY1ZGE1NTMwYTk1NTk3NCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl82MmYxNWJjNzQxMDQ0OTI2OWU1ZGJhNzhiNWFhYTZlNCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjczMDc0MjkxNjk1NTksLTEyMi40MjkzMDY3MjgzNzZdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzc4OTk4YjNmMWE4ZTRkMzFhYzQwZjYwMThmZmMyZjlhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzU0NjVlYjlhNzE3NjQ1NzI5ZGU0MDU2NWU0NjM5OGNkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2YwMzRlOWY2OTcwYjQxODJiZTc5MGRkY2Y4MTE1ZTQzID0gJCgnPGRpdiBpZD0iaHRtbF9mMDM0ZTlmNjk3MGI0MTgyYmU3OTBkZGNmODExNWU0MyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+T1RIRVIgT0ZGRU5TRVM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzU0NjVlYjlhNzE3NjQ1NzI5ZGU0MDU2NWU0NjM5OGNkLnNldENvbnRlbnQoaHRtbF9mMDM0ZTlmNjk3MGI0MTgyYmU3OTBkZGNmODExNWU0Myk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzYyZjE1YmM3NDEwNDQ5MjY5ZTVkYmE3OGI1YWFhNmU0LmJpbmRQb3B1cChwb3B1cF81NDY1ZWI5YTcxNzY0NTcyOWRlNDA1NjVlNDYzOThjZCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl8xZTI2NDE4ZjQ2ZGM0Y2UzYjY0NzRkMWFkZTI2YWE5NiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc4MzgzNjU1NjUzNDc5NCwtMTIyLjQxMzc5MDk3Mjc4MDk5XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl83ODk5OGIzZjFhOGU0ZDMxYWM0MGY2MDE4ZmZjMmY5YSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF81NGJkZmMxMTQzMGE0OTY5OGY1NDE1NmZjMDNhNjdiNSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF80MmUwMDUzY2Q4Y2M0NmE0OWZmMDhjOTA2NjMyYTQ4NSA9ICQoJzxkaXYgaWQ9Imh0bWxfNDJlMDA1M2NkOGNjNDZhNDlmZjA4YzkwNjYzMmE0ODUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlZBTkRBTElTTTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNTRiZGZjMTE0MzBhNDk2OThmNTQxNTZmYzAzYTY3YjUuc2V0Q29udGVudChodG1sXzQyZTAwNTNjZDhjYzQ2YTQ5ZmYwOGM5MDY2MzJhNDg1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMWUyNjQxOGY0NmRjNGNlM2I2NDc0ZDFhZGUyNmFhOTYuYmluZFBvcHVwKHBvcHVwXzU0YmRmYzExNDMwYTQ5Njk4ZjU0MTU2ZmMwM2E2N2I1KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzhiY2FhOWQ4YzFiODRkNzU4YmE3MTYxNzY3MDlmNzI2ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzMwNzQyOTE2OTU1OSwtMTIyLjQyOTMwNjcyODM3Nl0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfNzg5OThiM2YxYThlNGQzMWFjNDBmNjAxOGZmYzJmOWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZGIzM2U4MTE2Y2ExNGYxMzk5ZDc5MTg2MDhhNDMyZjAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNjJhOGRkYzQ3OGUxNDE2ZjlhMjBhNWU0YmZmOThhMzIgPSAkKCc8ZGl2IGlkPSJodG1sXzYyYThkZGM0NzhlMTQxNmY5YTIwYTVlNGJmZjk4YTMyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5PVEhFUiBPRkZFTlNFUzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZGIzM2U4MTE2Y2ExNGYxMzk5ZDc5MTg2MDhhNDMyZjAuc2V0Q29udGVudChodG1sXzYyYThkZGM0NzhlMTQxNmY5YTIwYTVlNGJmZjk4YTMyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfOGJjYWE5ZDhjMWI4NGQ3NThiYTcxNjE3NjcwOWY3MjYuYmluZFBvcHVwKHBvcHVwX2RiMzNlODExNmNhMTRmMTM5OWQ3OTE4NjA4YTQzMmYwKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2NkOWQyOGQwMGI5NzQ0MDU5ZmJmODZjZjAzNWI0M2VjID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzM3MzYyMzYwNTIxMjk2LC0xMjIuNDIyMDY3MTg0OTM3XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl83ODk5OGIzZjFhOGU0ZDMxYWM0MGY2MDE4ZmZjMmY5YSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9jNWFkNGM0ODkzMjU0NDg2OTBlMDkxMTg4NDBhYmMxYyA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zOTJkMWE2YjAxY2Q0MTRiYWRlNjY3NmM1MGJjZjNkOSA9ICQoJzxkaXYgaWQ9Imh0bWxfMzkyZDFhNmIwMWNkNDE0YmFkZTY2NzZjNTBiY2YzZDkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlNFQ09OREFSWSBDT0RFUzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYzVhZDRjNDg5MzI1NDQ4NjkwZTA5MTE4ODQwYWJjMWMuc2V0Q29udGVudChodG1sXzM5MmQxYTZiMDFjZDQxNGJhZGU2Njc2YzUwYmNmM2Q5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfY2Q5ZDI4ZDAwYjk3NDQwNTlmYmY4NmNmMDM1YjQzZWMuYmluZFBvcHVwKHBvcHVwX2M1YWQ0YzQ4OTMyNTQ0ODY5MGUwOTExODg0MGFiYzFjKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2E1NmQ3YjA4MmY1MDRjMjY4N2Y5MGM3ZDAzNjQzNDI0ID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzM3MzYyMzYwNTIxMjk2LC0xMjIuNDIyMDY3MTg0OTM3XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl83ODk5OGIzZjFhOGU0ZDMxYWM0MGY2MDE4ZmZjMmY5YSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82MDI4YmZjZWMyNWE0ZDIxYTI3ZDI5OGEwYWY4NDgyMiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF81M2MxYWQ4MjJmODY0MTBkYjdkMDNmMTRhMGE4ZjM0NiA9ICQoJzxkaXYgaWQ9Imh0bWxfNTNjMWFkODIyZjg2NDEwZGI3ZDAzZjE0YTBhOGYzNDYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlZBTkRBTElTTTwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNjAyOGJmY2VjMjVhNGQyMWEyN2QyOThhMGFmODQ4MjIuc2V0Q29udGVudChodG1sXzUzYzFhZDgyMmY4NjQxMGRiN2QwM2YxNGEwYThmMzQ2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfYTU2ZDdiMDgyZjUwNGMyNjg3ZjkwYzdkMDM2NDM0MjQuYmluZFBvcHVwKHBvcHVwXzYwMjhiZmNlYzI1YTRkMjFhMjdkMjk4YTBhZjg0ODIyKTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyX2RiNzJhOTQyYWY5YzQ1ZWJiNzhhNzM4YjZkMjI5ZGExID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzg1OTk4ODMyMzc5Nzk2LC0xMjIuNDExNzQ3MzcxOTI0XSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl83ODk5OGIzZjFhOGU0ZDMxYWM0MGY2MDE4ZmZjMmY5YSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9jOTY3OTg5ZjBlZWI0OWFiYTZjMWVlMzlkMTZjYThiYSA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8yODgzY2EzMzliN2U0NDBiOTkwNDYzN2UwNTVhZDhlYyA9ICQoJzxkaXYgaWQ9Imh0bWxfMjg4M2NhMzM5YjdlNDQwYjk5MDQ2MzdlMDU1YWQ4ZWMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlNVU1BJQ0lPVVMgT0NDPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jOTY3OTg5ZjBlZWI0OWFiYTZjMWVlMzlkMTZjYThiYS5zZXRDb250ZW50KGh0bWxfMjg4M2NhMzM5YjdlNDQwYjk5MDQ2MzdlMDU1YWQ4ZWMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9kYjcyYTk0MmFmOWM0NWViYjc4YTczOGI2ZDIyOWRhMS5iaW5kUG9wdXAocG9wdXBfYzk2Nzk4OWYwZWViNDlhYmE2YzFlZTM5ZDE2Y2E4YmEpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfY2Y5YTg5NWMwMjkyNGFhMWFmODgxNGU5MDRkOWVlZWUgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NjMzNzU4MDU4MDU5LC0xMjIuNDIwNDM0NzI0NTUyOTldLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzc4OTk4YjNmMWE4ZTRkMzFhYzQwZjYwMThmZmMyZjlhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2VmNWUyNjE0NzEzMDQwOWY5M2Y3ODI0ZmJkMmQwOTg0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2FmYjg3Zjk3M2Y3MjRhYjM5YTM1MzdlYzgzNDhkNjZhID0gJCgnPGRpdiBpZD0iaHRtbF9hZmI4N2Y5NzNmNzI0YWIzOWEzNTM3ZWM4MzQ4ZDY2YSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+T1RIRVIgT0ZGRU5TRVM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2VmNWUyNjE0NzEzMDQwOWY5M2Y3ODI0ZmJkMmQwOTg0LnNldENvbnRlbnQoaHRtbF9hZmI4N2Y5NzNmNzI0YWIzOWEzNTM3ZWM4MzQ4ZDY2YSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2NmOWE4OTVjMDI5MjRhYTFhZjg4MTRlOTA0ZDllZWVlLmJpbmRQb3B1cChwb3B1cF9lZjVlMjYxNDcxMzA0MDlmOTNmNzgyNGZiZDJkMDk4NCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl8wZjMyMDI0N2JmNWI0N2U5YWU4ODgxODMxNjIyNWEwYSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc4NTAyMjY2MjI3ODYsLTEyMi40MTE5ODc2NDM1OTUwMV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfNzg5OThiM2YxYThlNGQzMWFjNDBmNjAxOGZmYzJmOWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMTk3MGI1ZjFmMjg4NGRkODg1MWUxOWFhY2I3ZmEwZWEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMTM0NTEwMzk4MmE1NDUyMzlkNjEzYjgwOGYyM2Q4N2QgPSAkKCc8ZGl2IGlkPSJodG1sXzEzNDUxMDM5ODJhNTQ1MjM5ZDYxM2I4MDhmMjNkODdkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5OT04tQ1JJTUlOQUw8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzE5NzBiNWYxZjI4ODRkZDg4NTFlMTlhYWNiN2ZhMGVhLnNldENvbnRlbnQoaHRtbF8xMzQ1MTAzOTgyYTU0NTIzOWQ2MTNiODA4ZjIzZDg3ZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzBmMzIwMjQ3YmY1YjQ3ZTlhZTg4ODE4MzE2MjI1YTBhLmJpbmRQb3B1cChwb3B1cF8xOTcwYjVmMWYyODg0ZGQ4ODUxZTE5YWFjYjdmYTBlYSk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9jN2EyNjEwMmYxZTU0OGYyOGI0Zjc2N2RjZjgyYTdiYSA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc3NDYyMDY0OTEwNjQ5NSwtMTIyLjUwMDM4MDQyNzkxNV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfNzg5OThiM2YxYThlNGQzMWFjNDBmNjAxOGZmYzJmOWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNTY1MTc2NzdlYWQ3NDY5MmI3ZDFkNDYyMTFmMjdlNTQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZWZlY2ZjOGRhYmJkNDdlOGFhNTA0OGEyNTg3YTQ2MzMgPSAkKCc8ZGl2IGlkPSJodG1sX2VmZWNmYzhkYWJiZDQ3ZThhYTUwNDhhMjU4N2E0NjMzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5PVEhFUiBPRkZFTlNFUzwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNTY1MTc2NzdlYWQ3NDY5MmI3ZDFkNDYyMTFmMjdlNTQuc2V0Q29udGVudChodG1sX2VmZWNmYzhkYWJiZDQ3ZThhYTUwNDhhMjU4N2E0NjMzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfYzdhMjYxMDJmMWU1NDhmMjhiNGY3NjdkY2Y4MmE3YmEuYmluZFBvcHVwKHBvcHVwXzU2NTE3Njc3ZWFkNzQ2OTJiN2QxZDQ2MjExZjI3ZTU0KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzRjMjRmZGY4OGYyYjRmNmQ5ZWVjMzg5YmE3YWUxNjQwID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzc1MTkxODI2NzIxNywtMTIyLjQ2NjU1ODc4MDY4M10sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfNzg5OThiM2YxYThlNGQzMWFjNDBmNjAxOGZmYzJmOWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOThhNDhkNzdmYWU3NDA5MWFiZDdhNzRhMGViZWQzZTMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNmQ5NDkyZmFhZDAwNDFkNmI1YjIyN2EwZTA4N2JiYzkgPSAkKCc8ZGl2IGlkPSJodG1sXzZkOTQ5MmZhYWQwMDQxZDZiNWIyMjdhMGUwODdiYmM5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5ST0JCRVJZPC9kaXY+JylbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85OGE0OGQ3N2ZhZTc0MDkxYWJkN2E3NGEwZWJlZDNlMy5zZXRDb250ZW50KGh0bWxfNmQ5NDkyZmFhZDAwNDFkNmI1YjIyN2EwZTA4N2JiYzkpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl80YzI0ZmRmODhmMmI0ZjZkOWVlYzM4OWJhN2FlMTY0MC5iaW5kUG9wdXAocG9wdXBfOThhNDhkNzdmYWU3NDA5MWFiZDdhNzRhMGViZWQzZTMpOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKCiAgICAgICAgICAgIHZhciBtYXJrZXJfODk1ODI3YjdiNDIyNDBjYmFiOWVjNmM2MGE4YzdiM2UgPSBMLm1hcmtlcigKICAgICAgICAgICAgICAgIFszNy43NDkwODQxNzI5MDI4LC0xMjIuNDg2OTI1OTYwMTE0MDFdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzc4OTk4YjNmMWE4ZTRkMzFhYzQwZjYwMThmZmMyZjlhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzRiZWNmY2EyNjA2NDRmNzZiOGM0YzM0YTg0YWZmM2E2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzhmODU2OWE4ODI5NzRkY2E4YzE4ZmU1MmM2Y2E3ZTM3ID0gJCgnPGRpdiBpZD0iaHRtbF84Zjg1NjlhODgyOTc0ZGNhOGMxOGZlNTJjNmNhN2UzNyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+T1RIRVIgT0ZGRU5TRVM8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzRiZWNmY2EyNjA2NDRmNzZiOGM0YzM0YTg0YWZmM2E2LnNldENvbnRlbnQoaHRtbF84Zjg1NjlhODgyOTc0ZGNhOGMxOGZlNTJjNmNhN2UzNyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzg5NTgyN2I3YjQyMjQwY2JhYjllYzZjNjBhOGM3YjNlLmJpbmRQb3B1cChwb3B1cF80YmVjZmNhMjYwNjQ0Zjc2YjhjNGMzNGE4NGFmZjNhNik7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl84NGM1YzI2NGM5NWI0NDM3YWI5ZDJiNTk5ZTVlODE2NCA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc2ODUzNjAxMjM1ODMsLTEyMi40MTU2MTYzMzgzMTk5OV0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAuYWRkVG8obWFya2VyX2NsdXN0ZXJfNzg5OThiM2YxYThlNGQzMWFjNDBmNjAxOGZmYzJmOWEpOwogICAgICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZjE0MmY3MTA0MzJhNGQwYWJkZmI1NGJkOTc0MDNiOWMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzMwMCd9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNGFjOWNkYzM5MjJlNDc0Nzg4YjFmYjRkY2NmNDVjYTUgPSAkKCc8ZGl2IGlkPSJodG1sXzRhYzljZGMzOTIyZTQ3NDc4OGIxZmI0ZGNjZjQ1Y2E1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5OT04tQ1JJTUlOQUw8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2YxNDJmNzEwNDMyYTRkMGFiZGZiNTRiZDk3NDAzYjljLnNldENvbnRlbnQoaHRtbF80YWM5Y2RjMzkyMmU0NzQ3ODhiMWZiNGRjY2Y0NWNhNSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzg0YzVjMjY0Yzk1YjQ0MzdhYjlkMmI1OTllNWU4MTY0LmJpbmRQb3B1cChwb3B1cF9mMTQyZjcxMDQzMmE0ZDBhYmRmYjU0YmQ5NzQwM2I5Yyk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl9iNWQwNzYyYjk5ZDE0MmNhOGZhNDdhNjBhZmY1NTNkNyA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc2NDQyOTc3MTQwNzQsLTEyMi40NDk3NTE2NTI1NjNdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzc4OTk4YjNmMWE4ZTRkMzFhYzQwZjYwMThmZmMyZjlhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzE1ZmExNDY4ODUxNDQyZmY5NjQ2MmY0Mjg0Y2Q5NmYwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2IwMzkwMDZkNjI3MjRjNjNhNzZmZTRlNDk2YjJkNWM0ID0gJCgnPGRpdiBpZD0iaHRtbF9iMDM5MDA2ZDYyNzI0YzYzYTc2ZmU0ZTQ5NmIyZDVjNCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QlVSR0xBUlk8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzE1ZmExNDY4ODUxNDQyZmY5NjQ2MmY0Mjg0Y2Q5NmYwLnNldENvbnRlbnQoaHRtbF9iMDM5MDA2ZDYyNzI0YzYzYTc2ZmU0ZTQ5NmIyZDVjNCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2I1ZDA3NjJiOTlkMTQyY2E4ZmE0N2E2MGFmZjU1M2Q3LmJpbmRQb3B1cChwb3B1cF8xNWZhMTQ2ODg1MTQ0MmZmOTY0NjJmNDI4NGNkOTZmMCk7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAoKICAgICAgICAgICAgdmFyIG1hcmtlcl8xMzI2YjI1YTc0Y2I0OTVmOTNmY2U1MzBjYTRkZjcwNiA9IEwubWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc2NDQyOTc3MTQwNzQsLTEyMi40NDk3NTE2NTI1NjNdLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLmFkZFRvKG1hcmtlcl9jbHVzdGVyXzc4OTk4YjNmMWE4ZTRkMzFhYzQwZjYwMThmZmMyZjlhKTsKICAgICAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzRmMzJmODNjYjc1MTQ1YTVhNjIzMDNlMWFjYWVkMjI5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICczMDAnfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2Q4MWY2ZTZiYzQ2MTQ2OGZhODNlZWEwZDg5ZWRhNGJjID0gJCgnPGRpdiBpZD0iaHRtbF9kODFmNmU2YmM0NjE0NjhmYTgzZWVhMGQ4OWVkYTRiYyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TEFSQ0VOWS9USEVGVDwvZGl2PicpWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNGYzMmY4M2NiNzUxNDVhNWE2MjMwM2UxYWNhZWQyMjkuc2V0Q29udGVudChodG1sX2Q4MWY2ZTZiYzQ2MTQ2OGZhODNlZWEwZDg5ZWRhNGJjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMTMyNmIyNWE3NGNiNDk1ZjkzZmNlNTMwY2E0ZGY3MDYuYmluZFBvcHVwKHBvcHVwXzRmMzJmODNjYjc1MTQ1YTVhNjIzMDNlMWFjYWVkMjI5KTsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCgogICAgICAgICAgICB2YXIgbWFya2VyXzc4MGEzNzEyOTY0NDRiMWM5OGZkNjU4YjIzM2E3NGEzID0gTC5tYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuNzM1MjY4MTQ2OTA4Mzk2LC0xMjIuNDcyNzE1NzU5NjMxXSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hZGRUbyhtYXJrZXJfY2x1c3Rlcl83ODk5OGIzZjFhOGU0ZDMxYWM0MGY2MDE4ZmZjMmY5YSk7CiAgICAgICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lNjYzMWRmYWQzYjk0YjYxOTcwNzJlYzlmNGI1ZDUzZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMzAwJ30pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82ZjgzY2I0NjU3NzI0MDE4OTJjMzU1YjI4YzNiYTA0MyA9ICQoJzxkaXYgaWQ9Imh0bWxfNmY4M2NiNDY1NzcyNDAxODkyYzM1NWIyOGMzYmEwNDMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkxBUkNFTlkvVEhFRlQ8L2Rpdj4nKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2U2NjMxZGZhZDNiOTRiNjE5NzA3MmVjOWY0YjVkNTNmLnNldENvbnRlbnQoaHRtbF82ZjgzY2I0NjU3NzI0MDE4OTJjMzU1YjI4YzNiYTA0Myk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzc4MGEzNzEyOTY0NDRiMWM5OGZkNjU4YjIzM2E3NGEzLmJpbmRQb3B1cChwb3B1cF9lNjYzMWRmYWQzYjk0YjYxOTcwNzJlYzlmNGI1ZDUzZik7CgogICAgICAgICAgICAKICAgICAgICAKPC9zY3JpcHQ+\" 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 0x7faffa270710>"
]
},
"execution_count": 33,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from folium import plugins\n",
"\n",
"# let's start again with a clean copy of the map of San Francisco\n",
"sanfran_map = folium.Map(location = [latitude, longitude], zoom_start = 12)\n",
"\n",
"# instantiate a mark cluster object for the incidents in the dataframe\n",
"incidents = plugins.MarkerCluster().add_to(sanfran_map)\n",
"\n",
"# loop through the dataframe and add each data point to the mark cluster\n",
"for lat, lng, label, in zip(df_incidents.Y, df_incidents.X, df_incidents.Category):\n",
" folium.Marker(\n",
" location=[lat, lng],\n",
" icon=None,\n",
" popup=label,\n",
" ).add_to(incidents)\n",
"\n",
"# display map\n",
"sanfran_map"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"editable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"Notice how when you zoom out all the way, all markers are grouped into one cluster, *the global cluster*, of 100 markers or crimes, which is the total number of crimes in our dataframe. Once you start zooming in, the *global cluster* will start breaking up into smaller clusters. Zooming in all the way will result in individual markers."
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"editable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"# Choropleth Maps <a id=\"8\"></a>\n",
"\n",
"A `Choropleth` map is a thematic map in which areas are shaded or patterned in proportion to the measurement of the statistical variable being displayed on the map, such as population density or per-capita income. The choropleth map provides an easy way to visualize how a measurement varies across a geographic area or it shows the level of variability within a region. Below is a `Choropleth` map of the US depicting the population by square mile per state.\n",
"\n",
"<img src = \"https://s3-api.us-geo.objectstorage.softlayer.net/cf-courses-data/CognitiveClass/DV0101EN/labs/Images/2000_census_population_density_map_by_state.png\" width = 600> "
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"editable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"Now, let's create our own `Choropleth` map of the world depicting immigration from various countries to Canada.\n",
"\n",
"Let's first download and import our primary Canadian immigration dataset using *pandas* `read_excel()` method. Normally, before we can do that, we would need to download a module which *pandas* requires to read in excel files. This module is **xlrd**. For your convenience, we have pre-installed this module, so you would not have to worry about that. Otherwise, you would need to run the following line of code to install the **xlrd** module:\n",
"```\n",
"!conda install -c anaconda xlrd --yes\n",
"```"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"editable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"Download the dataset and read it into a *pandas* dataframe:"
]
},
{
"cell_type": "code",
"execution_count": 34,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"editable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Data downloaded and read into a dataframe!\n"
]
}
],
"source": [
"df_can = pd.read_excel('https://s3-api.us-geo.objectstorage.softlayer.net/cf-courses-data/CognitiveClass/DV0101EN/labs/Data_Files/Canada.xlsx',\n",
" sheet_name='Canada by Citizenship',\n",
" skiprows=range(20),\n",
" skipfooter=2)\n",
"\n",
"print('Data downloaded and read into a dataframe!')"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"editable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"Let's take a look at the first five items in our dataset."
]
},
{
"cell_type": "code",
"execution_count": 35,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"editable": true,
"new_sheet": false,
"run_control": {
"read_only": 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>Type</th>\n",
" <th>Coverage</th>\n",
" <th>OdName</th>\n",
" <th>AREA</th>\n",
" <th>AreaName</th>\n",
" <th>REG</th>\n",
" <th>RegName</th>\n",
" <th>DEV</th>\n",
" <th>DevName</th>\n",
" <th>1980</th>\n",
" <th>...</th>\n",
" <th>2004</th>\n",
" <th>2005</th>\n",
" <th>2006</th>\n",
" <th>2007</th>\n",
" <th>2008</th>\n",
" <th>2009</th>\n",
" <th>2010</th>\n",
" <th>2011</th>\n",
" <th>2012</th>\n",
" <th>2013</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Immigrants</td>\n",
" <td>Foreigners</td>\n",
" <td>Afghanistan</td>\n",
" <td>935</td>\n",
" <td>Asia</td>\n",
" <td>5501</td>\n",
" <td>Southern Asia</td>\n",
" <td>902</td>\n",
" <td>Developing regions</td>\n",
" <td>16</td>\n",
" <td>...</td>\n",
" <td>2978</td>\n",
" <td>3436</td>\n",
" <td>3009</td>\n",
" <td>2652</td>\n",
" <td>2111</td>\n",
" <td>1746</td>\n",
" <td>1758</td>\n",
" <td>2203</td>\n",
" <td>2635</td>\n",
" <td>2004</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>Immigrants</td>\n",
" <td>Foreigners</td>\n",
" <td>Albania</td>\n",
" <td>908</td>\n",
" <td>Europe</td>\n",
" <td>925</td>\n",
" <td>Southern Europe</td>\n",
" <td>901</td>\n",
" <td>Developed regions</td>\n",
" <td>1</td>\n",
" <td>...</td>\n",
" <td>1450</td>\n",
" <td>1223</td>\n",
" <td>856</td>\n",
" <td>702</td>\n",
" <td>560</td>\n",
" <td>716</td>\n",
" <td>561</td>\n",
" <td>539</td>\n",
" <td>620</td>\n",
" <td>603</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>Immigrants</td>\n",
" <td>Foreigners</td>\n",
" <td>Algeria</td>\n",
" <td>903</td>\n",
" <td>Africa</td>\n",
" <td>912</td>\n",
" <td>Northern Africa</td>\n",
" <td>902</td>\n",
" <td>Developing regions</td>\n",
" <td>80</td>\n",
" <td>...</td>\n",
" <td>3616</td>\n",
" <td>3626</td>\n",
" <td>4807</td>\n",
" <td>3623</td>\n",
" <td>4005</td>\n",
" <td>5393</td>\n",
" <td>4752</td>\n",
" <td>4325</td>\n",
" <td>3774</td>\n",
" <td>4331</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>Immigrants</td>\n",
" <td>Foreigners</td>\n",
" <td>American Samoa</td>\n",
" <td>909</td>\n",
" <td>Oceania</td>\n",
" <td>957</td>\n",
" <td>Polynesia</td>\n",
" <td>902</td>\n",
" <td>Developing regions</td>\n",
" <td>0</td>\n",
" <td>...</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>Immigrants</td>\n",
" <td>Foreigners</td>\n",
" <td>Andorra</td>\n",
" <td>908</td>\n",
" <td>Europe</td>\n",
" <td>925</td>\n",
" <td>Southern Europe</td>\n",
" <td>901</td>\n",
" <td>Developed regions</td>\n",
" <td>0</td>\n",
" <td>...</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>5 rows × 43 columns</p>\n",
"</div>"
],
"text/plain": [
" Type Coverage OdName AREA AreaName REG \\\n",
"0 Immigrants Foreigners Afghanistan 935 Asia 5501 \n",
"1 Immigrants Foreigners Albania 908 Europe 925 \n",
"2 Immigrants Foreigners Algeria 903 Africa 912 \n",
"3 Immigrants Foreigners American Samoa 909 Oceania 957 \n",
"4 Immigrants Foreigners Andorra 908 Europe 925 \n",
"\n",
" RegName DEV DevName 1980 ... 2004 2005 2006 \\\n",
"0 Southern Asia 902 Developing regions 16 ... 2978 3436 3009 \n",
"1 Southern Europe 901 Developed regions 1 ... 1450 1223 856 \n",
"2 Northern Africa 902 Developing regions 80 ... 3616 3626 4807 \n",
"3 Polynesia 902 Developing regions 0 ... 0 0 1 \n",
"4 Southern Europe 901 Developed regions 0 ... 0 0 1 \n",
"\n",
" 2007 2008 2009 2010 2011 2012 2013 \n",
"0 2652 2111 1746 1758 2203 2635 2004 \n",
"1 702 560 716 561 539 620 603 \n",
"2 3623 4005 5393 4752 4325 3774 4331 \n",
"3 0 0 0 0 0 0 0 \n",
"4 1 0 0 0 0 1 1 \n",
"\n",
"[5 rows x 43 columns]"
]
},
"execution_count": 35,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_can.head()"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"editable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"Let's find out how many entries there are in our dataset."
]
},
{
"cell_type": "code",
"execution_count": 36,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"editable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"(195, 43)\n"
]
}
],
"source": [
"# print the dimensions of the dataframe\n",
"print(df_can.shape)"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"editable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"Clean up data. We will make some modifications to the original dataset to make it easier to create our visualizations. Refer to *Introduction to Matplotlib and Line Plots* and *Area Plots, Histograms, and Bar Plots* notebooks for a detailed description of this preprocessing."
]
},
{
"cell_type": "code",
"execution_count": 37,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"editable": true,
"new_sheet": false,
"run_control": {
"read_only": false
},
"scrolled": true
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"data dimensions: (195, 39)\n"
]
}
],
"source": [
"# clean up the dataset to remove unnecessary columns (eg. REG) \n",
"df_can.drop(['AREA','REG','DEV','Type','Coverage'], axis=1, inplace=True)\n",
"\n",
"# let's rename the columns so that they make sense\n",
"df_can.rename(columns={'OdName':'Country', 'AreaName':'Continent','RegName':'Region'}, inplace=True)\n",
"\n",
"# for sake of consistency, let's also make all column labels of type string\n",
"df_can.columns = list(map(str, df_can.columns))\n",
"\n",
"# add total column\n",
"df_can['Total'] = df_can.sum(axis=1)\n",
"\n",
"# years that we will be using in this lesson - useful for plotting later on\n",
"years = list(map(str, range(1980, 2014)))\n",
"print ('data dimensions:', df_can.shape)"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"editable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"Let's take a look at the first five items of our cleaned dataframe."
]
},
{
"cell_type": "code",
"execution_count": 38,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"editable": true,
"new_sheet": false,
"run_control": {
"read_only": 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>Country</th>\n",
" <th>Continent</th>\n",
" <th>Region</th>\n",
" <th>DevName</th>\n",
" <th>1980</th>\n",
" <th>1981</th>\n",
" <th>1982</th>\n",
" <th>1983</th>\n",
" <th>1984</th>\n",
" <th>1985</th>\n",
" <th>...</th>\n",
" <th>2005</th>\n",
" <th>2006</th>\n",
" <th>2007</th>\n",
" <th>2008</th>\n",
" <th>2009</th>\n",
" <th>2010</th>\n",
" <th>2011</th>\n",
" <th>2012</th>\n",
" <th>2013</th>\n",
" <th>Total</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Afghanistan</td>\n",
" <td>Asia</td>\n",
" <td>Southern Asia</td>\n",
" <td>Developing regions</td>\n",
" <td>16</td>\n",
" <td>39</td>\n",
" <td>39</td>\n",
" <td>47</td>\n",
" <td>71</td>\n",
" <td>340</td>\n",
" <td>...</td>\n",
" <td>3436</td>\n",
" <td>3009</td>\n",
" <td>2652</td>\n",
" <td>2111</td>\n",
" <td>1746</td>\n",
" <td>1758</td>\n",
" <td>2203</td>\n",
" <td>2635</td>\n",
" <td>2004</td>\n",
" <td>58639</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>Albania</td>\n",
" <td>Europe</td>\n",
" <td>Southern Europe</td>\n",
" <td>Developed regions</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>...</td>\n",
" <td>1223</td>\n",
" <td>856</td>\n",
" <td>702</td>\n",
" <td>560</td>\n",
" <td>716</td>\n",
" <td>561</td>\n",
" <td>539</td>\n",
" <td>620</td>\n",
" <td>603</td>\n",
" <td>15699</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>Algeria</td>\n",
" <td>Africa</td>\n",
" <td>Northern Africa</td>\n",
" <td>Developing regions</td>\n",
" <td>80</td>\n",
" <td>67</td>\n",
" <td>71</td>\n",
" <td>69</td>\n",
" <td>63</td>\n",
" <td>44</td>\n",
" <td>...</td>\n",
" <td>3626</td>\n",
" <td>4807</td>\n",
" <td>3623</td>\n",
" <td>4005</td>\n",
" <td>5393</td>\n",
" <td>4752</td>\n",
" <td>4325</td>\n",
" <td>3774</td>\n",
" <td>4331</td>\n",
" <td>69439</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>American Samoa</td>\n",
" <td>Oceania</td>\n",
" <td>Polynesia</td>\n",
" <td>Developing regions</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>...</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>6</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>Andorra</td>\n",
" <td>Europe</td>\n",
" <td>Southern Europe</td>\n",
" <td>Developed regions</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>...</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>15</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>5 rows × 39 columns</p>\n",
"</div>"
],
"text/plain": [
" Country Continent Region DevName 1980 1981 \\\n",
"0 Afghanistan Asia Southern Asia Developing regions 16 39 \n",
"1 Albania Europe Southern Europe Developed regions 1 0 \n",
"2 Algeria Africa Northern Africa Developing regions 80 67 \n",
"3 American Samoa Oceania Polynesia Developing regions 0 1 \n",
"4 Andorra Europe Southern Europe Developed regions 0 0 \n",
"\n",
" 1982 1983 1984 1985 ... 2005 2006 2007 2008 2009 2010 2011 \\\n",
"0 39 47 71 340 ... 3436 3009 2652 2111 1746 1758 2203 \n",
"1 0 0 0 0 ... 1223 856 702 560 716 561 539 \n",
"2 71 69 63 44 ... 3626 4807 3623 4005 5393 4752 4325 \n",
"3 0 0 0 0 ... 0 1 0 0 0 0 0 \n",
"4 0 0 0 0 ... 0 1 1 0 0 0 0 \n",
"\n",
" 2012 2013 Total \n",
"0 2635 2004 58639 \n",
"1 620 603 15699 \n",
"2 3774 4331 69439 \n",
"3 0 0 6 \n",
"4 1 1 15 \n",
"\n",
"[5 rows x 39 columns]"
]
},
"execution_count": 38,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_can.head()"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"editable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"In order to create a `Choropleth` map, we need a GeoJSON file that defines the areas/boundaries of the state, county, or country that we are interested in. In our case, since we are endeavoring to create a world map, we want a GeoJSON that defines the boundaries of all world countries. For your convenience, we will be providing you with this file, so let's go ahead and download it. Let's name it **world_countries.json**."
]
},
{
"cell_type": "code",
"execution_count": 39,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"editable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"GeoJSON file downloaded!\n"
]
}
],
"source": [
"# download countries geojson file\n",
"!wget --quiet https://s3-api.us-geo.objectstorage.softlayer.net/cf-courses-data/CognitiveClass/DV0101EN/labs/Data_Files/world_countries.json -O world_countries.json\n",
" \n",
"print('GeoJSON file downloaded!')"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"editable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"Now that we have the GeoJSON file, let's create a world map, centered around **[0, 0]** *latitude* and *longitude* values, with an intial zoom level of 2, and using *Mapbox Bright* style."
]
},
{
"cell_type": "code",
"execution_count": 40,
"metadata": {
"button": false,
"collapsed": false,
"deletable": true,
"editable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [],
"source": [
"world_geo = r'world_countries.json' # geojson file\n",
"\n",
"# create a plain world map\n",
"world_map = folium.Map(location=[0, 0], zoom_start=2, tiles='Mapbox Bright')"
]
},
{
"cell_type": "markdown",
"metadata": {
"button": false,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"source": [
"And now to create a `Choropleth` map, we will use the *choropleth* method with the following main parameters:\n",
"\n",
"1. geo_data, which is the GeoJSON file.\n",
"2. data, which is the dataframe containing the data.\n",
"3. columns, which represents the columns in the dataframe that will be used to create the `Choropleth` map.\n",
"4. key_on, which is the key or variable in the GeoJSON file that contains the name of the variable of interest. To determine that, you will need to open the GeoJSON file using any text editor and note the name of the key or variable that contains the name of the countries, since the countries are our variable of interest. In this case, **name** is the key in the GeoJSON file that contains the name of the countries. Note that this key is case_sensitive, so you need to pass exactly as it exists in the GeoJSON file."
]
},
{
"cell_type": "code",
"execution_count": 41,
"metadata": {
"button": false,
"collapsed": true,
"deletable": true,
"new_sheet": false,
"run_control": {
"read_only": false
}
},
"outputs": [
{
"data": {
"text/html": [
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment