{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Figure size 432x288 with 0 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "%run ./utils.ipynb\n",
    "%run ./viz_utils.ipynb\n",
    "import numpy as np\n",
    "import pandas as pd"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [],
   "source": [
    "engine = get_rds_engine()\n",
    "schema = 'ace3c2bb4abd9fcaf9807975e6ab940131386dc9ecddb2b7e31288ff8'\n",
    "customer = \"Pixies\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "plot_age_gender(schema,customer)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "plot_fan_maps(schema, customer)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# ----------------------------------------Superfans -------------------------- #\n",
    "# get unique fans from fans table\n",
    "query1 = f\"\"\"select id as fan_id, 1 as mailing_list from {schema}.fan\"\"\"\n",
    "uniqueFans = pd.read_sql(query1, engine)\n",
    "# get item count\n",
    "query2 = f\"\"\"select fan_id, sum(CAST (merch_purchase_quantity AS INTEGER)) as count,\n",
    "        sum(CAST (merch_item_price AS DOUBLE precision)) as value,\n",
    "        max(merch_purchase_date::timestamp) as last_date from\n",
    "        {schema}.fan_merch_data_temp fmd\n",
    "        where merch_purchase_date is not null and CAST(merch_purchase_monetary AS DOUBLE precision)>0 group by fan_id\"\"\"\n",
    "itemCountPerFan = pd.read_sql(query2, engine)\n",
    "\n",
    "query3 = f\"\"\"\n",
    "SELECT \n",
    "fan_id, root_email\n",
    "FROM {schema}.fan_table\n",
    ";\n",
    "\"\"\"\n",
    "fan_emails = pd.read_sql(query3, engine)\n",
    "\n",
    "# query optin count\n",
    "query4 = f\"\"\"\n",
    "SELECT \n",
    "fan_id, sum(number_of_opt_ins) as optin_count\n",
    "FROM {schema}.fan_optin group by fan_id\n",
    ";\n",
    "\"\"\"\n",
    "fan_optins = pd.read_sql(query4, engine)\n",
    "# print (itemCountPerFan.describe())\n",
    "# print(itemCountPerFan[\"value\"].quantile(0.90))\n",
    "\n",
    "itemCountPerFan['high_value_purchases'] =np.where(itemCountPerFan['value']>77,1, np.nan)\n",
    "itemCountPerFan['single_item'] =np.where(itemCountPerFan['count']>0,1, np.nan)\n",
    "itemCountPerFan['multiple_item'] =np.where(itemCountPerFan['count']>1,1, np.nan)\n",
    "itemCountPerFan['purchase_last_30d'] =np.where(\n",
    "    (calculate_diff(itemCountPerFan['last_date'], pd.to_datetime('today'))) / pd.Timedelta(1, unit='d')<90,1, np.nan\n",
    "                                        )\n",
    "itemCountPerFan.drop(['count','last_date','value'], axis=1,inplace=True)\n",
    "\n",
    "fan_optins['multi_optin']=np.where(fan_optins['optin_count']>1,1, np.nan)\n",
    "fan_optins.drop(['optin_count'], axis=1,inplace=True)\n",
    "\n",
    "# merge dataframes\n",
    "rawSuperFanDf = pd.merge(uniqueFans, itemCountPerFan, how='left', on=['fan_id'])\n",
    "rawSuperFanDf = pd.merge(rawSuperFanDf, fan_optins, how='left', on=['fan_id'])\n",
    "rawSuperFanDf['total_score'] = rawSuperFanDf.sum(axis=1)\n",
    "# write superfandata into RDS\n",
    "rawSuperFanDf.to_sql(f'superfans',\n",
    "              engine,\n",
    "              schema=schema,\n",
    "              if_exists='replace',\n",
    "              #index_label='fan_id',\n",
    "              index=False\n",
    "              )\n",
    "\n",
    "# print(rawSuperFanDf.head(5))\n",
    "groupedSuperFanData = rawSuperFanDf.groupby(['total_score'],as_index=False).count()\n",
    "print(groupedSuperFanData)\n",
    "\n",
    "# Join emails\n",
    "rawSuperFanDf = pd.merge(rawSuperFanDf, fan_emails, how='left', on=['fan_id'])\n",
    "\n",
    "#rawSuperFanDf.loc[rawSuperFanDf['total_score']==2]\n",
    "\n",
    "# Select some good segments (4,5,6)\n",
    "superfans = rawSuperFanDf.loc[rawSuperFanDf['total_score'].isin([3,4,5,6])]\n",
    "# print(superfans.head(10))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "topc = pd.read_csv(\"top1000_us_cities_lat_long.csv\",delimiter=\";\")\n",
    "print(topc.shape)\n",
    "topc.to_sql(f'top1000_us_cities',\n",
    "              engine,\n",
    "              schema=schema,\n",
    "              if_exists='replace',\n",
    "              #index_label='fan_id',\n",
    "              index=False\n",
    "              )"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# schema, customer, treshold= lowest score group to include\n",
    "plot_superfan_maps(schema,customer,4)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "df = prepare_rfm_dataset_pixies(schema)\n",
    "print(df.dtypes)\n",
    "print(df.shape)\n",
    "# df_=df.filter(items=['fan_id','rfm_segment'])\n",
    "#print(df_.dtypes)\n",
    "#print(df_.shape)\n",
    "#df_.to_sql(f'rfm_segments',\n",
    "#              engine,\n",
    "#              schema=schema,\n",
    "#              if_exists='replace',\n",
    "#              #index_label='fan_id',\n",
    "#              index=False\n",
    "#              )\n",
    "gg = df.groupby([\"rfm_segment\"],as_index=False)[\"fan_id\"].count()\n",
    "print(gg)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "df2 = prepare_fan_demographics(schema)\n",
    "print(df2.dtypes)\n",
    "print(df2.shape)\n",
    "print(df2.tail(5))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "df['Sales_Bins'] = pd.qcut(df.monetary_value,4)\n",
    "df.Sales_Bins.value_counts().sort_index()\n",
    "bins = list(df.Sales_Bins.value_counts().sort_index())\n",
    "print(bins)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# print(df.groupby('rfm_segment')[\"fan_id\"].count())\n",
    "# clusterGender = clusteredFans.groupby([\"cluster\",\"gender\"],as_index=False)[\"fan_id\"].count().rename(columns={'fan_id' : 'count'})\n",
    "plot_rfm_data(schema,df,customer)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# rfm_segment='Hibernating'\n",
    "rfm_segment='Champions'\n",
    "# rfm_segment='Loyal Customers'\n",
    "rfm_segment=6\n",
    "plot_us_cities(schema,customer,rfm_segment)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "plot_merch_cluster_results(schema, customer)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "plot_merch_cluster_top_items(schema, customer)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "plot_merch_timeseries(schema,customer)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Lose\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div style=\"width:100%;\"><div style=\"position:relative;width:100%;height:0;padding-bottom:60%;\"><span style=\"color:#565656\">Make this Notebook Trusted to load map: File -> Trust Notebook</span><iframe src=\"about:blank\" style=\"position:absolute;width:100%;height:100%;left:0;top:0;border:none !important;\" data-html=PCFET0NUWVBFIGh0bWw+CjxoZWFkPiAgICAKICAgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPgogICAgCiAgICAgICAgPHNjcmlwdD4KICAgICAgICAgICAgTF9OT19UT1VDSCA9IGZhbHNlOwogICAgICAgICAgICBMX0RJU0FCTEVfM0QgPSBmYWxzZTsKICAgICAgICA8L3NjcmlwdD4KICAgIAogICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vbGVhZmxldEAxLjYuMC9kaXN0L2xlYWZsZXQuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vY29kZS5qcXVlcnkuY29tL2pxdWVyeS0xLjEyLjQubWluLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9qcy9ib290c3RyYXAubWluLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9MZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy8yLjAuMi9sZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy5qcyI+PC9zY3JpcHQ+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vbGVhZmxldEAxLjYuMC9kaXN0L2xlYWZsZXQuY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vbWF4Y2RuLmJvb3RzdHJhcGNkbi5jb20vYm9vdHN0cmFwLzMuMi4wL2Nzcy9ib290c3RyYXAubWluLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9jc3MvYm9vdHN0cmFwLXRoZW1lLm1pbi5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9mb250LWF3ZXNvbWUvNC42LjMvY3NzL2ZvbnQtYXdlc29tZS5taW4uY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vY2RuanMuY2xvdWRmbGFyZS5jb20vYWpheC9saWJzL0xlYWZsZXQuYXdlc29tZS1tYXJrZXJzLzIuMC4yL2xlYWZsZXQuYXdlc29tZS1tYXJrZXJzLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL3Jhd2Nkbi5naXRoYWNrLmNvbS9weXRob24tdmlzdWFsaXphdGlvbi9mb2xpdW0vbWFzdGVyL2ZvbGl1bS90ZW1wbGF0ZXMvbGVhZmxldC5hd2Vzb21lLnJvdGF0ZS5jc3MiLz4KICAgIDxzdHlsZT5odG1sLCBib2R5IHt3aWR0aDogMTAwJTtoZWlnaHQ6IDEwMCU7bWFyZ2luOiAwO3BhZGRpbmc6IDA7fTwvc3R5bGU+CiAgICA8c3R5bGU+I21hcCB7cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7Ym90dG9tOjA7cmlnaHQ6MDtsZWZ0OjA7fTwvc3R5bGU+CiAgICAKICAgICAgICAgICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwKICAgICAgICAgICAgICAgIGluaXRpYWwtc2NhbGU9MS4wLCBtYXhpbXVtLXNjYWxlPTEuMCwgdXNlci1zY2FsYWJsZT1ubyIgLz4KICAgICAgICAgICAgPHN0eWxlPgogICAgICAgICAgICAgICAgI21hcF80NGQ1YWFiOWVlZjk0MjcyOTQ1Yjc5MTZiNzI4OGNiMCB7CiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgICAgICAgICAgICAgIHdpZHRoOiAxMDAuMCU7CiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiAxMDAuMCU7CiAgICAgICAgICAgICAgICAgICAgbGVmdDogMC4wJTsKICAgICAgICAgICAgICAgICAgICB0b3A6IDAuMCU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIDwvc3R5bGU+CiAgICAgICAgCjwvaGVhZD4KPGJvZHk+ICAgIAogICAgCiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZvbGl1bS1tYXAiIGlkPSJtYXBfNDRkNWFhYjllZWY5NDI3Mjk0NWI3OTE2YjcyODhjYjAiID48L2Rpdj4KICAgICAgICAKPC9ib2R5Pgo8c2NyaXB0PiAgICAKICAgIAogICAgICAgICAgICB2YXIgbWFwXzQ0ZDVhYWI5ZWVmOTQyNzI5NDViNzkxNmI3Mjg4Y2IwID0gTC5tYXAoCiAgICAgICAgICAgICAgICAibWFwXzQ0ZDVhYWI5ZWVmOTQyNzI5NDViNzkxNmI3Mjg4Y2IwIiwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjZW50ZXI6IFszOC4wMjUyNjUsIC0xMDEuMjg0OTVdLAogICAgICAgICAgICAgICAgICAgIGNyczogTC5DUlMuRVBTRzM4NTcsCiAgICAgICAgICAgICAgICAgICAgem9vbTogMy41LAogICAgICAgICAgICAgICAgICAgIHpvb21Db250cm9sOiB0cnVlLAogICAgICAgICAgICAgICAgICAgIHByZWZlckNhbnZhczogZmFsc2UsCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICk7CgogICAgICAgICAgICAKCiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHRpbGVfbGF5ZXJfMWEwZjdiMjNhMTM3NDg4NWI5OWJlMjcwZWVmODRmYTUgPSBMLnRpbGVMYXllcigKICAgICAgICAgICAgICAgICJodHRwczovL3tzfS50aWxlLm9wZW5zdHJlZXRtYXAub3JnL3t6fS97eH0ve3l9LnBuZyIsCiAgICAgICAgICAgICAgICB7ImF0dHJpYnV0aW9uIjogIkRhdGEgYnkgXHUwMDI2Y29weTsgXHUwMDNjYSBocmVmPVwiaHR0cDovL29wZW5zdHJlZXRtYXAub3JnXCJcdTAwM2VPcGVuU3RyZWV0TWFwXHUwMDNjL2FcdTAwM2UsIHVuZGVyIFx1MDAzY2EgaHJlZj1cImh0dHA6Ly93d3cub3BlbnN0cmVldG1hcC5vcmcvY29weXJpZ2h0XCJcdTAwM2VPRGJMXHUwMDNjL2FcdTAwM2UuIiwgImRldGVjdFJldGluYSI6IGZhbHNlLCAibWF4TmF0aXZlWm9vbSI6IDE4LCAibWF4Wm9vbSI6IDE4LCAibWluWm9vbSI6IDAsICJub1dyYXAiOiBmYWxzZSwgIm9wYWNpdHkiOiAxLCAic3ViZG9tYWlucyI6ICJhYmMiLCAidG1zIjogZmFsc2V9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0ZDVhYWI5ZWVmOTQyNzI5NDViNzkxNmI3Mjg4Y2IwKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85MjhhM2FjMDAyNmQ0YzlkOGY1Y2U0NGNhNDI5MTc2MCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc2NTIwNjUsIC0xMjIuMjQxNjM1NV0sCiAgICAgICAgICAgICAgICB7ImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLCAiY29sb3IiOiAiI2ViN2EzNCIsICJkYXNoQXJyYXkiOiBudWxsLCAiZGFzaE9mZnNldCI6IG51bGwsICJmaWxsIjogdHJ1ZSwgImZpbGxDb2xvciI6ICIjZWI3YTM0IiwgImZpbGxPcGFjaXR5IjogMC44LCAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsICJsaW5lQ2FwIjogInJvdW5kIiwgImxpbmVKb2luIjogInJvdW5kIiwgIm9wYWNpdHkiOiAxLjAsICJyYWRpdXMiOiAxLCAic3Ryb2tlIjogdHJ1ZSwgIndlaWdodCI6IDN9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0ZDVhYWI5ZWVmOTQyNzI5NDViNzkxNmI3Mjg4Y2IwKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF9mMGY3YTZkZWRkOTE0MzQ1OWIwNDA3YTVhY2JmYzZkMiA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfNDRmOWJjMjFkNzNmNDM3Y2FmYTk2MTNkNDgyZThjODYgPSAkKGA8ZGl2IGlkPSJodG1sXzQ0ZjliYzIxZDczZjQzN2NhZmE5NjEzZDQ4MmU4Yzg2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5BbGFtZWRhPC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwX2YwZjdhNmRlZGQ5MTQzNDU5YjA0MDdhNWFjYmZjNmQyLnNldENvbnRlbnQoaHRtbF80NGY5YmMyMWQ3M2Y0MzdjYWZhOTYxM2Q0ODJlOGM4Nik7CiAgICAgICAgCgogICAgICAgIGNpcmNsZV9tYXJrZXJfOTI4YTNhYzAwMjZkNGM5ZDhmNWNlNDRjYTQyOTE3NjAuYmluZFBvcHVwKHBvcHVwX2YwZjdhNmRlZGQ5MTQzNDU5YjA0MDdhNWFjYmZjNmQyKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8zYzkxYjY4MGI5NWI0OTA0OGQ4ODdhNWU4MWY4ZjkyYiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM1LjA4NTMzMzYsIC0xMDYuNjA1NTUzNF0sCiAgICAgICAgICAgICAgICB7ImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLCAiY29sb3IiOiAiI2ViN2EzNCIsICJkYXNoQXJyYXkiOiBudWxsLCAiZGFzaE9mZnNldCI6IG51bGwsICJmaWxsIjogdHJ1ZSwgImZpbGxDb2xvciI6ICIjZWI3YTM0IiwgImZpbGxPcGFjaXR5IjogMC44LCAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsICJsaW5lQ2FwIjogInJvdW5kIiwgImxpbmVKb2luIjogInJvdW5kIiwgIm9wYWNpdHkiOiAxLjAsICJyYWRpdXMiOiAyLCAic3Ryb2tlIjogdHJ1ZSwgIndlaWdodCI6IDN9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0ZDVhYWI5ZWVmOTQyNzI5NDViNzkxNmI3Mjg4Y2IwKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF8xNDZmMGZjMTAzMWY0MDQ3ODA2Y2Q5NDMwNzc0OGE3NSA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfMzQyNjFkYjM1Zjg2NDYyNmI2MjQyNGMwOWJlOTZmMWYgPSAkKGA8ZGl2IGlkPSJodG1sXzM0MjYxZGIzNWY4NjQ2MjZiNjI0MjRjMDliZTk2ZjFmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5BbGJ1cXVlcnF1ZTwvZGl2PmApWzBdOwogICAgICAgICAgICBwb3B1cF8xNDZmMGZjMTAzMWY0MDQ3ODA2Y2Q5NDMwNzc0OGE3NS5zZXRDb250ZW50KGh0bWxfMzQyNjFkYjM1Zjg2NDYyNmI2MjQyNGMwOWJlOTZmMWYpOwogICAgICAgIAoKICAgICAgICBjaXJjbGVfbWFya2VyXzNjOTFiNjgwYjk1YjQ5MDQ4ZDg4N2E1ZTgxZjhmOTJiLmJpbmRQb3B1cChwb3B1cF8xNDZmMGZjMTAzMWY0MDQ3ODA2Y2Q5NDMwNzc0OGE3NSkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYTZlMWNjNDVmNDAyNGUyNWE4MWM2NjRlMjQzMjM0YjggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszOC44MDQ4MzU1LCAtNzcuMDQ2OTIxNF0sCiAgICAgICAgICAgICAgICB7ImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLCAiY29sb3IiOiAiI2ViN2EzNCIsICJkYXNoQXJyYXkiOiBudWxsLCAiZGFzaE9mZnNldCI6IG51bGwsICJmaWxsIjogdHJ1ZSwgImZpbGxDb2xvciI6ICIjZWI3YTM0IiwgImZpbGxPcGFjaXR5IjogMC44LCAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsICJsaW5lQ2FwIjogInJvdW5kIiwgImxpbmVKb2luIjogInJvdW5kIiwgIm9wYWNpdHkiOiAxLjAsICJyYWRpdXMiOiAxLCAic3Ryb2tlIjogdHJ1ZSwgIndlaWdodCI6IDN9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0ZDVhYWI5ZWVmOTQyNzI5NDViNzkxNmI3Mjg4Y2IwKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF83NzBlZmMyYjRhODQ0Y2U5Yjg3OWI3NjFhZTgyMGNkNSA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfOTYwMjhkNjQyMDU0NGIzNTk0OTUyNzM1YWY2MzdhYTYgPSAkKGA8ZGl2IGlkPSJodG1sXzk2MDI4ZDY0MjA1NDRiMzU5NDk1MjczNWFmNjM3YWE2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5BbGV4YW5kcmlhPC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzc3MGVmYzJiNGE4NDRjZTliODc5Yjc2MWFlODIwY2Q1LnNldENvbnRlbnQoaHRtbF85NjAyOGQ2NDIwNTQ0YjM1OTQ5NTI3MzVhZjYzN2FhNik7CiAgICAgICAgCgogICAgICAgIGNpcmNsZV9tYXJrZXJfYTZlMWNjNDVmNDAyNGUyNWE4MWM2NjRlMjQzMjM0YjguYmluZFBvcHVwKHBvcHVwXzc3MGVmYzJiNGE4NDRjZTliODc5Yjc2MWFlODIwY2Q1KQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8wNjgyMTRlOTEzNmY0Y2I2ODhkYWYzNTgwMjFjZDFkYyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzMzLjgzNTI5MzIsIC0xMTcuOTE0NTAzNl0sCiAgICAgICAgICAgICAgICB7ImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLCAiY29sb3IiOiAiI2ViN2EzNCIsICJkYXNoQXJyYXkiOiBudWxsLCAiZGFzaE9mZnNldCI6IG51bGwsICJmaWxsIjogdHJ1ZSwgImZpbGxDb2xvciI6ICIjZWI3YTM0IiwgImZpbGxPcGFjaXR5IjogMC44LCAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsICJsaW5lQ2FwIjogInJvdW5kIiwgImxpbmVKb2luIjogInJvdW5kIiwgIm9wYWNpdHkiOiAxLjAsICJyYWRpdXMiOiAxLCAic3Ryb2tlIjogdHJ1ZSwgIndlaWdodCI6IDN9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0ZDVhYWI5ZWVmOTQyNzI5NDViNzkxNmI3Mjg4Y2IwKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF84ODE1ZmExNTc2NDA0ZjVkYTJhZWZmMWQyNzI3ODU0YyA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfY2NmMDIyMDE2NzI4NGE1OGEyMDVmYWY3YWVmZTBlODggPSAkKGA8ZGl2IGlkPSJodG1sX2NjZjAyMjAxNjcyODRhNThhMjA1ZmFmN2FlZmUwZTg4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5BbmFoZWltPC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzg4MTVmYTE1NzY0MDRmNWRhMmFlZmYxZDI3Mjc4NTRjLnNldENvbnRlbnQoaHRtbF9jY2YwMjIwMTY3Mjg0YTU4YTIwNWZhZjdhZWZlMGU4OCk7CiAgICAgICAgCgogICAgICAgIGNpcmNsZV9tYXJrZXJfMDY4MjE0ZTkxMzZmNGNiNjg4ZGFmMzU4MDIxY2QxZGMuYmluZFBvcHVwKHBvcHVwXzg4MTVmYTE1NzY0MDRmNWRhMmFlZmYxZDI3Mjc4NTRjKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lODZlNDRhYTNlODA0ZWEzOWI2NTcyYjMyYjg3ZjQxNSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjEwNTMxOTYsIC04NS42ODAyNTQxXSwKICAgICAgICAgICAgICAgIHsiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsICJjb2xvciI6ICIjZWI3YTM0IiwgImRhc2hBcnJheSI6IG51bGwsICJkYXNoT2Zmc2V0IjogbnVsbCwgImZpbGwiOiB0cnVlLCAiZmlsbENvbG9yIjogIiNlYjdhMzQiLCAiZmlsbE9wYWNpdHkiOiAwLjgsICJmaWxsUnVsZSI6ICJldmVub2RkIiwgImxpbmVDYXAiOiAicm91bmQiLCAibGluZUpvaW4iOiAicm91bmQiLCAib3BhY2l0eSI6IDEuMCwgInJhZGl1cyI6IDEsICJzdHJva2UiOiB0cnVlLCAid2VpZ2h0IjogM30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDRkNWFhYjllZWY5NDI3Mjk0NWI3OTE2YjcyODhjYjApOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzQ5MTZkNDM1YTMwZTQ1N2U5MzhlOWExN2UyMGFiODFiID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF8zNDNmNWI4ZTcyYzQ0ZjI2OTlhOGYwNjc0Yjg2NThhYSA9ICQoYDxkaXYgaWQ9Imh0bWxfMzQzZjViOGU3MmM0NGYyNjk5YThmMDY3NGI4NjU4YWEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkFuZGVyc29uPC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzQ5MTZkNDM1YTMwZTQ1N2U5MzhlOWExN2UyMGFiODFiLnNldENvbnRlbnQoaHRtbF8zNDNmNWI4ZTcyYzQ0ZjI2OTlhOGYwNjc0Yjg2NThhYSk7CiAgICAgICAgCgogICAgICAgIGNpcmNsZV9tYXJrZXJfZTg2ZTQ0YWEzZTgwNGVhMzliNjU3MmIzMmI4N2Y0MTUuYmluZFBvcHVwKHBvcHVwXzQ5MTZkNDM1YTMwZTQ1N2U5MzhlOWExN2UyMGFiODFiKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8zYjYxNDNkNzUwNzE0MzA4OTdkZWRmYmYxNjA1MWQxYSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQyLjI4MDgyNTYsIC04My43NDMwMzc4XSwKICAgICAgICAgICAgICAgIHsiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsICJjb2xvciI6ICIjZWI3YTM0IiwgImRhc2hBcnJheSI6IG51bGwsICJkYXNoT2Zmc2V0IjogbnVsbCwgImZpbGwiOiB0cnVlLCAiZmlsbENvbG9yIjogIiNlYjdhMzQiLCAiZmlsbE9wYWNpdHkiOiAwLjgsICJmaWxsUnVsZSI6ICJldmVub2RkIiwgImxpbmVDYXAiOiAicm91bmQiLCAibGluZUpvaW4iOiAicm91bmQiLCAib3BhY2l0eSI6IDEuMCwgInJhZGl1cyI6IDEsICJzdHJva2UiOiB0cnVlLCAid2VpZ2h0IjogM30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDRkNWFhYjllZWY5NDI3Mjk0NWI3OTE2YjcyODhjYjApOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzE4MDFiZTZlMjQzMTRlZTA5OTM2NzAyZWVlODgzZjY3ID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF8wYTViNDFkZjdiYmU0YzNiYmI3ZTQzYjJkNzliNjAxMSA9ICQoYDxkaXYgaWQ9Imh0bWxfMGE1YjQxZGY3YmJlNGMzYmJiN2U0M2IyZDc5YjYwMTEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkFubiBBcmJvcjwvZGl2PmApWzBdOwogICAgICAgICAgICBwb3B1cF8xODAxYmU2ZTI0MzE0ZWUwOTkzNjcwMmVlZTg4M2Y2Ny5zZXRDb250ZW50KGh0bWxfMGE1YjQxZGY3YmJlNGMzYmJiN2U0M2IyZDc5YjYwMTEpOwogICAgICAgIAoKICAgICAgICBjaXJjbGVfbWFya2VyXzNiNjE0M2Q3NTA3MTQzMDg5N2RlZGZiZjE2MDUxZDFhLmJpbmRQb3B1cChwb3B1cF8xODAxYmU2ZTI0MzE0ZWUwOTkzNjcwMmVlZTg4M2Y2NykKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMzAwMjkwMDFmY2I1NDQ5NzkzNzlmYjE0NWY2NjkyZDkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszOC4wMDQ5MjE0LCAtMTIxLjgwNTc4OV0sCiAgICAgICAgICAgICAgICB7ImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLCAiY29sb3IiOiAiI2ViN2EzNCIsICJkYXNoQXJyYXkiOiBudWxsLCAiZGFzaE9mZnNldCI6IG51bGwsICJmaWxsIjogdHJ1ZSwgImZpbGxDb2xvciI6ICIjZWI3YTM0IiwgImZpbGxPcGFjaXR5IjogMC44LCAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsICJsaW5lQ2FwIjogInJvdW5kIiwgImxpbmVKb2luIjogInJvdW5kIiwgIm9wYWNpdHkiOiAxLjAsICJyYWRpdXMiOiAxLCAic3Ryb2tlIjogdHJ1ZSwgIndlaWdodCI6IDN9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0ZDVhYWI5ZWVmOTQyNzI5NDViNzkxNmI3Mjg4Y2IwKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF9kZjBjMGEzZmY4ZWY0MGNkYTIyYTIyNGVhZTkwZjdhYSA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfYTUxMzc4ODMyYjNjNGI3N2JjOGViZWI3N2QxYWRiNzMgPSAkKGA8ZGl2IGlkPSJodG1sX2E1MTM3ODgzMmIzYzRiNzdiYzhlYmViNzdkMWFkYjczIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5BbnRpb2NoPC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwX2RmMGMwYTNmZjhlZjQwY2RhMjJhMjI0ZWFlOTBmN2FhLnNldENvbnRlbnQoaHRtbF9hNTEzNzg4MzJiM2M0Yjc3YmM4ZWJlYjc3ZDFhZGI3Myk7CiAgICAgICAgCgogICAgICAgIGNpcmNsZV9tYXJrZXJfMzAwMjkwMDFmY2I1NDQ5NzkzNzlmYjE0NWY2NjkyZDkuYmluZFBvcHVwKHBvcHVwX2RmMGMwYTNmZjhlZjQwY2RhMjJhMjI0ZWFlOTBmN2FhKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl84MWRkZWJmZjdjZWM0YmE3OWZmMmRhNzNjOTM5Yjk5OSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzMyLjczNTY4NywgLTk3LjEwODA2NTZdLAogICAgICAgICAgICAgICAgeyJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwgImNvbG9yIjogIiNlYjdhMzQiLCAiZGFzaEFycmF5IjogbnVsbCwgImRhc2hPZmZzZXQiOiBudWxsLCAiZmlsbCI6IHRydWUsICJmaWxsQ29sb3IiOiAiI2ViN2EzNCIsICJmaWxsT3BhY2l0eSI6IDAuOCwgImZpbGxSdWxlIjogImV2ZW5vZGQiLCAibGluZUNhcCI6ICJyb3VuZCIsICJsaW5lSm9pbiI6ICJyb3VuZCIsICJvcGFjaXR5IjogMS4wLCAicmFkaXVzIjogMSwgInN0cm9rZSI6IHRydWUsICJ3ZWlnaHQiOiAzfQogICAgICAgICAgICApLmFkZFRvKG1hcF80NGQ1YWFiOWVlZjk0MjcyOTQ1Yjc5MTZiNzI4OGNiMCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfNzBmYjEwNDM1ZTQ1NDAwNjgzMGExYWFiMzU0ZTAyZjIgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sXzcxOWMyOTEyMzY0NTQzOWFhNjZmMzE3NmI3NzZhODU2ID0gJChgPGRpdiBpZD0iaHRtbF83MTljMjkxMjM2NDU0MzlhYTY2ZjMxNzZiNzc2YTg1NiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QXJsaW5ndG9uPC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzcwZmIxMDQzNWU0NTQwMDY4MzBhMWFhYjM1NGUwMmYyLnNldENvbnRlbnQoaHRtbF83MTljMjkxMjM2NDU0MzlhYTY2ZjMxNzZiNzc2YTg1Nik7CiAgICAgICAgCgogICAgICAgIGNpcmNsZV9tYXJrZXJfODFkZGViZmY3Y2VjNGJhNzlmZjJkYTczYzkzOWI5OTkuYmluZFBvcHVwKHBvcHVwXzcwZmIxMDQzNWU0NTQwMDY4MzBhMWFhYjM1NGUwMmYyKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl84M2Q1MmUwNGJmYTE0YWI4YTAyNmUwZDY3YTMwYmI3NCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQyLjA4ODM2MDMsIC04Ny45ODA2MjY1XSwKICAgICAgICAgICAgICAgIHsiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsICJjb2xvciI6ICIjZWI3YTM0IiwgImRhc2hBcnJheSI6IG51bGwsICJkYXNoT2Zmc2V0IjogbnVsbCwgImZpbGwiOiB0cnVlLCAiZmlsbENvbG9yIjogIiNlYjdhMzQiLCAiZmlsbE9wYWNpdHkiOiAwLjgsICJmaWxsUnVsZSI6ICJldmVub2RkIiwgImxpbmVDYXAiOiAicm91bmQiLCAibGluZUpvaW4iOiAicm91bmQiLCAib3BhY2l0eSI6IDEuMCwgInJhZGl1cyI6IDEsICJzdHJva2UiOiB0cnVlLCAid2VpZ2h0IjogM30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDRkNWFhYjllZWY5NDI3Mjk0NWI3OTE2YjcyODhjYjApOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwX2VjOGRiYmE1YTM2MDQ5NWY5NzI5OTQzMjdkNmQwNzJkID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF8zNTRiYThhM2M5YzE0MjZlYTFiYjRmYjNiNDA4NGY0MiA9ICQoYDxkaXYgaWQ9Imh0bWxfMzU0YmE4YTNjOWMxNDI2ZWExYmI0ZmIzYjQwODRmNDIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkFybGluZ3RvbiBIZWlnaHRzPC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwX2VjOGRiYmE1YTM2MDQ5NWY5NzI5OTQzMjdkNmQwNzJkLnNldENvbnRlbnQoaHRtbF8zNTRiYThhM2M5YzE0MjZlYTFiYjRmYjNiNDA4NGY0Mik7CiAgICAgICAgCgogICAgICAgIGNpcmNsZV9tYXJrZXJfODNkNTJlMDRiZmExNGFiOGEwMjZlMGQ2N2EzMGJiNzQuYmluZFBvcHVwKHBvcHVwX2VjOGRiYmE1YTM2MDQ5NWY5NzI5OTQzMjdkNmQwNzJkKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9hMzE3ZTg4YjU1NTQ0OWZiYjlhNTFjMWE4N2VlZmQ3YiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzMzLjc0ODk5NTQsIC04NC4zODc5ODI0XSwKICAgICAgICAgICAgICAgIHsiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsICJjb2xvciI6ICIjZWI3YTM0IiwgImRhc2hBcnJheSI6IG51bGwsICJkYXNoT2Zmc2V0IjogbnVsbCwgImZpbGwiOiB0cnVlLCAiZmlsbENvbG9yIjogIiNlYjdhMzQiLCAiZmlsbE9wYWNpdHkiOiAwLjgsICJmaWxsUnVsZSI6ICJldmVub2RkIiwgImxpbmVDYXAiOiAicm91bmQiLCAibGluZUpvaW4iOiAicm91bmQiLCAib3BhY2l0eSI6IDEuMCwgInJhZGl1cyI6IDIsICJzdHJva2UiOiB0cnVlLCAid2VpZ2h0IjogM30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDRkNWFhYjllZWY5NDI3Mjk0NWI3OTE2YjcyODhjYjApOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwX2FlZGZkZWJlYzVjZDRkODg4NDE1Zjg4YzZjZmZjNGY5ID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF8yMGI3MzMwY2UxYWU0ZTZmYmE2MGMxNjMyMzQyNGU1YyA9ICQoYDxkaXYgaWQ9Imh0bWxfMjBiNzMzMGNlMWFlNGU2ZmJhNjBjMTYzMjM0MjRlNWMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkF0bGFudGE8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfYWVkZmRlYmVjNWNkNGQ4ODg0MTVmODhjNmNmZmM0Zjkuc2V0Q29udGVudChodG1sXzIwYjczMzBjZTFhZTRlNmZiYTYwYzE2MzIzNDI0ZTVjKTsKICAgICAgICAKCiAgICAgICAgY2lyY2xlX21hcmtlcl9hMzE3ZTg4YjU1NTQ0OWZiYjlhNTFjMWE4N2VlZmQ3Yi5iaW5kUG9wdXAocG9wdXBfYWVkZmRlYmVjNWNkNGQ4ODg0MTVmODhjNmNmZmM0ZjkpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2E0MTJlMGU1MzJmODQ0MmM4M2IxNWExZDBlYmQyNWQ3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzAuMjY3MTUzLCAtOTcuNzQzMDYwOF0sCiAgICAgICAgICAgICAgICB7ImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLCAiY29sb3IiOiAiI2ViN2EzNCIsICJkYXNoQXJyYXkiOiBudWxsLCAiZGFzaE9mZnNldCI6IG51bGwsICJmaWxsIjogdHJ1ZSwgImZpbGxDb2xvciI6ICIjZWI3YTM0IiwgImZpbGxPcGFjaXR5IjogMC44LCAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsICJsaW5lQ2FwIjogInJvdW5kIiwgImxpbmVKb2luIjogInJvdW5kIiwgIm9wYWNpdHkiOiAxLjAsICJyYWRpdXMiOiA3LCAic3Ryb2tlIjogdHJ1ZSwgIndlaWdodCI6IDN9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0ZDVhYWI5ZWVmOTQyNzI5NDViNzkxNmI3Mjg4Y2IwKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF8yM2U3NDcwNmU2ZjI0MmEwODkyZThlOTBjMTUzYWQzZCA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfOTZlNzRjMDBhYjFkNGY3ZDlkMjkxYTk5OTIwYmM5ZjEgPSAkKGA8ZGl2IGlkPSJodG1sXzk2ZTc0YzAwYWIxZDRmN2Q5ZDI5MWE5OTkyMGJjOWYxIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5BdXN0aW48L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfMjNlNzQ3MDZlNmYyNDJhMDg5MmU4ZTkwYzE1M2FkM2Quc2V0Q29udGVudChodG1sXzk2ZTc0YzAwYWIxZDRmN2Q5ZDI5MWE5OTkyMGJjOWYxKTsKICAgICAgICAKCiAgICAgICAgY2lyY2xlX21hcmtlcl9hNDEyZTBlNTMyZjg0NDJjODNiMTVhMWQwZWJkMjVkNy5iaW5kUG9wdXAocG9wdXBfMjNlNzQ3MDZlNmYyNDJhMDg5MmU4ZTkwYzE1M2FkM2QpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2JhZmUzMDZmMzZjYjRjNDY5ZDJjZDg3M2EzYzk0OGIzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzkuMjkwMzg0OCwgLTc2LjYxMjE4OTNdLAogICAgICAgICAgICAgICAgeyJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwgImNvbG9yIjogIiNlYjdhMzQiLCAiZGFzaEFycmF5IjogbnVsbCwgImRhc2hPZmZzZXQiOiBudWxsLCAiZmlsbCI6IHRydWUsICJmaWxsQ29sb3IiOiAiI2ViN2EzNCIsICJmaWxsT3BhY2l0eSI6IDAuOCwgImZpbGxSdWxlIjogImV2ZW5vZGQiLCAibGluZUNhcCI6ICJyb3VuZCIsICJsaW5lSm9pbiI6ICJyb3VuZCIsICJvcGFjaXR5IjogMS4wLCAicmFkaXVzIjogMSwgInN0cm9rZSI6IHRydWUsICJ3ZWlnaHQiOiAzfQogICAgICAgICAgICApLmFkZFRvKG1hcF80NGQ1YWFiOWVlZjk0MjcyOTQ1Yjc5MTZiNzI4OGNiMCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfZDc0NzgyNGIzZGZlNDMwOWIwM2E4M2E2ZDZmZjljOWIgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sX2U4NzM1OWNmOWZkYjRlNGZhODUyZmRkMmZjMDRlYzFlID0gJChgPGRpdiBpZD0iaHRtbF9lODczNTljZjlmZGI0ZTRmYTg1MmZkZDJmYzA0ZWMxZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QmFsdGltb3JlPC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwX2Q3NDc4MjRiM2RmZTQzMDliMDNhODNhNmQ2ZmY5YzliLnNldENvbnRlbnQoaHRtbF9lODczNTljZjlmZGI0ZTRmYTg1MmZkZDJmYzA0ZWMxZSk7CiAgICAgICAgCgogICAgICAgIGNpcmNsZV9tYXJrZXJfYmFmZTMwNmYzNmNiNGM0NjlkMmNkODczYTNjOTQ4YjMuYmluZFBvcHVwKHBvcHVwX2Q3NDc4MjRiM2RmZTQzMDliMDNhODNhNmQ2ZmY5YzliKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl84MDcyMzVkN2VlMTI0ODBkYmQ5Nzc0MWY2ZThhNWExNyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzMyLjg0NDAxNywgLTk3LjE0MzA2NzFdLAogICAgICAgICAgICAgICAgeyJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwgImNvbG9yIjogIiNlYjdhMzQiLCAiZGFzaEFycmF5IjogbnVsbCwgImRhc2hPZmZzZXQiOiBudWxsLCAiZmlsbCI6IHRydWUsICJmaWxsQ29sb3IiOiAiI2ViN2EzNCIsICJmaWxsT3BhY2l0eSI6IDAuOCwgImZpbGxSdWxlIjogImV2ZW5vZGQiLCAibGluZUNhcCI6ICJyb3VuZCIsICJsaW5lSm9pbiI6ICJyb3VuZCIsICJvcGFjaXR5IjogMS4wLCAicmFkaXVzIjogMSwgInN0cm9rZSI6IHRydWUsICJ3ZWlnaHQiOiAzfQogICAgICAgICAgICApLmFkZFRvKG1hcF80NGQ1YWFiOWVlZjk0MjcyOTQ1Yjc5MTZiNzI4OGNiMCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfOTAwMzRmYzVjZTNmNDE2MWE2NDBjNzY2NDVmN2U2MmYgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sXzAxZDMyNTFkMGI3ZjQ5ODc4ZTFlNWE2YjUwMmQxYjA2ID0gJChgPGRpdiBpZD0iaHRtbF8wMWQzMjUxZDBiN2Y0OTg3OGUxZTVhNmI1MDJkMWIwNiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QmVkZm9yZDwvZGl2PmApWzBdOwogICAgICAgICAgICBwb3B1cF85MDAzNGZjNWNlM2Y0MTYxYTY0MGM3NjY0NWY3ZTYyZi5zZXRDb250ZW50KGh0bWxfMDFkMzI1MWQwYjdmNDk4NzhlMWU1YTZiNTAyZDFiMDYpOwogICAgICAgIAoKICAgICAgICBjaXJjbGVfbWFya2VyXzgwNzIzNWQ3ZWUxMjQ4MGRiZDk3NzQxZjZlOGE1YTE3LmJpbmRQb3B1cChwb3B1cF85MDAzNGZjNWNlM2Y0MTYxYTY0MGM3NjY0NWY3ZTYyZikKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNTE4ODk1ZmJjMjA0NGVkZTg5YWUyMjQ3M2VjNjc3OWYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszMC4zOTYwMzE4LCAtODguODg1MzA3OF0sCiAgICAgICAgICAgICAgICB7ImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLCAiY29sb3IiOiAiI2ViN2EzNCIsICJkYXNoQXJyYXkiOiBudWxsLCAiZGFzaE9mZnNldCI6IG51bGwsICJmaWxsIjogdHJ1ZSwgImZpbGxDb2xvciI6ICIjZWI3YTM0IiwgImZpbGxPcGFjaXR5IjogMC44LCAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsICJsaW5lQ2FwIjogInJvdW5kIiwgImxpbmVKb2luIjogInJvdW5kIiwgIm9wYWNpdHkiOiAxLjAsICJyYWRpdXMiOiAxLCAic3Ryb2tlIjogdHJ1ZSwgIndlaWdodCI6IDN9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0ZDVhYWI5ZWVmOTQyNzI5NDViNzkxNmI3Mjg4Y2IwKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF9jZTI1MWYyMGEwMWE0OGQzYTFiZWMyY2MyZmFjZWM5MSA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfNWE5NTVmYjkwMDY3NDQ4ZTg3NGM0Nzg2MzczMjQ4OTkgPSAkKGA8ZGl2IGlkPSJodG1sXzVhOTU1ZmI5MDA2NzQ0OGU4NzRjNDc4NjM3MzI0ODk5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5CaWxveGk8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfY2UyNTFmMjBhMDFhNDhkM2ExYmVjMmNjMmZhY2VjOTEuc2V0Q29udGVudChodG1sXzVhOTU1ZmI5MDA2NzQ0OGU4NzRjNDc4NjM3MzI0ODk5KTsKICAgICAgICAKCiAgICAgICAgY2lyY2xlX21hcmtlcl81MTg4OTVmYmMyMDQ0ZWRlODlhZTIyNDczZWM2Nzc5Zi5iaW5kUG9wdXAocG9wdXBfY2UyNTFmMjBhMDFhNDhkM2ExYmVjMmNjMmZhY2VjOTEpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzA3MWQ3YzMwY2FmYTQ3NzA4MjViNmVhYjNlNDFjMmUwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzMuNTIwNjYwOCwgLTg2LjgwMjQ5XSwKICAgICAgICAgICAgICAgIHsiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsICJjb2xvciI6ICIjZWI3YTM0IiwgImRhc2hBcnJheSI6IG51bGwsICJkYXNoT2Zmc2V0IjogbnVsbCwgImZpbGwiOiB0cnVlLCAiZmlsbENvbG9yIjogIiNlYjdhMzQiLCAiZmlsbE9wYWNpdHkiOiAwLjgsICJmaWxsUnVsZSI6ICJldmVub2RkIiwgImxpbmVDYXAiOiAicm91bmQiLCAibGluZUpvaW4iOiAicm91bmQiLCAib3BhY2l0eSI6IDEuMCwgInJhZGl1cyI6IDIsICJzdHJva2UiOiB0cnVlLCAid2VpZ2h0IjogM30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDRkNWFhYjllZWY5NDI3Mjk0NWI3OTE2YjcyODhjYjApOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwX2M2NmE4MTE5NDVjZTQxNGU5NDdmN2IzMzg1ZjRhZWRmID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF84N2EzYTk3NzM4NjA0YmEwOWM3OWY3YTFiZWQ2ODA0MCA9ICQoYDxkaXYgaWQ9Imh0bWxfODdhM2E5NzczODYwNGJhMDljNzlmN2ExYmVkNjgwNDAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkJpcm1pbmdoYW08L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfYzY2YTgxMTk0NWNlNDE0ZTk0N2Y3YjMzODVmNGFlZGYuc2V0Q29udGVudChodG1sXzg3YTNhOTc3Mzg2MDRiYTA5Yzc5ZjdhMWJlZDY4MDQwKTsKICAgICAgICAKCiAgICAgICAgY2lyY2xlX21hcmtlcl8wNzFkN2MzMGNhZmE0NzcwODI1YjZlYWIzZTQxYzJlMC5iaW5kUG9wdXAocG9wdXBfYzY2YTgxMTk0NWNlNDE0ZTk0N2Y3YjMzODVmNGFlZGYpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzIxMGQ0M2Y1OGRjYTRhNDhiZmFhMzliNjUyNjhiYWZlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDIuMzYwMDgyNSwgLTcxLjA1ODg4MDFdLAogICAgICAgICAgICAgICAgeyJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwgImNvbG9yIjogIiNlYjdhMzQiLCAiZGFzaEFycmF5IjogbnVsbCwgImRhc2hPZmZzZXQiOiBudWxsLCAiZmlsbCI6IHRydWUsICJmaWxsQ29sb3IiOiAiI2ViN2EzNCIsICJmaWxsT3BhY2l0eSI6IDAuOCwgImZpbGxSdWxlIjogImV2ZW5vZGQiLCAibGluZUNhcCI6ICJyb3VuZCIsICJsaW5lSm9pbiI6ICJyb3VuZCIsICJvcGFjaXR5IjogMS4wLCAicmFkaXVzIjogMiwgInN0cm9rZSI6IHRydWUsICJ3ZWlnaHQiOiAzfQogICAgICAgICAgICApLmFkZFRvKG1hcF80NGQ1YWFiOWVlZjk0MjcyOTQ1Yjc5MTZiNzI4OGNiMCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfOTJkNDE4ZDU3ZGNhNDViN2E3YTJmMDMzMmUxZGZhOTIgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sXzgwODFhMjJlMDc3MjRmN2M4MDQ3NGQ0NTc5MGY0NjFlID0gJChgPGRpdiBpZD0iaHRtbF84MDgxYTIyZTA3NzI0ZjdjODA0NzRkNDU3OTBmNDYxZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Qm9zdG9uPC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzkyZDQxOGQ1N2RjYTQ1YjdhN2EyZjAzMzJlMWRmYTkyLnNldENvbnRlbnQoaHRtbF84MDgxYTIyZTA3NzI0ZjdjODA0NzRkNDU3OTBmNDYxZSk7CiAgICAgICAgCgogICAgICAgIGNpcmNsZV9tYXJrZXJfMjEwZDQzZjU4ZGNhNGE0OGJmYWEzOWI2NTI2OGJhZmUuYmluZFBvcHVwKHBvcHVwXzkyZDQxOGQ1N2RjYTQ1YjdhN2EyZjAzMzJlMWRmYTkyKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jOTlmN2I4NTEzMzY0NDE2YmQ5ODNmZDYyNjM5Y2QxNiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM2LjAzMzExNjQsIC04Ni43ODI3NzcyXSwKICAgICAgICAgICAgICAgIHsiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsICJjb2xvciI6ICIjZWI3YTM0IiwgImRhc2hBcnJheSI6IG51bGwsICJkYXNoT2Zmc2V0IjogbnVsbCwgImZpbGwiOiB0cnVlLCAiZmlsbENvbG9yIjogIiNlYjdhMzQiLCAiZmlsbE9wYWNpdHkiOiAwLjgsICJmaWxsUnVsZSI6ICJldmVub2RkIiwgImxpbmVDYXAiOiAicm91bmQiLCAibGluZUpvaW4iOiAicm91bmQiLCAib3BhY2l0eSI6IDEuMCwgInJhZGl1cyI6IDEsICJzdHJva2UiOiB0cnVlLCAid2VpZ2h0IjogM30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDRkNWFhYjllZWY5NDI3Mjk0NWI3OTE2YjcyODhjYjApOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzA1YjUwYzQzNDE2ZDQ3MGRhM2VhYzUxYWQ4YmY5MWU4ID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF9hZmY3ZDRkNjJhNjg0Y2RjYjFkNmJkZmE2OTllYzY1ZSA9ICQoYDxkaXYgaWQ9Imh0bWxfYWZmN2Q0ZDYyYTY4NGNkY2IxZDZiZGZhNjk5ZWM2NWUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkJyZW50d29vZDwvZGl2PmApWzBdOwogICAgICAgICAgICBwb3B1cF8wNWI1MGM0MzQxNmQ0NzBkYTNlYWM1MWFkOGJmOTFlOC5zZXRDb250ZW50KGh0bWxfYWZmN2Q0ZDYyYTY4NGNkY2IxZDZiZGZhNjk5ZWM2NWUpOwogICAgICAgIAoKICAgICAgICBjaXJjbGVfbWFya2VyX2M5OWY3Yjg1MTMzNjQ0MTZiZDk4M2ZkNjI2MzljZDE2LmJpbmRQb3B1cChwb3B1cF8wNWI1MGM0MzQxNmQ0NzBkYTNlYWM1MWFkOGJmOTFlOCkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYWNkYzcwNmIwMGYxNDFiNGE3NDhlYTM1YzBkYWQ1ZTQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Mi44ODY0NDY4LCAtNzguODc4MzY4OV0sCiAgICAgICAgICAgICAgICB7ImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLCAiY29sb3IiOiAiI2ViN2EzNCIsICJkYXNoQXJyYXkiOiBudWxsLCAiZGFzaE9mZnNldCI6IG51bGwsICJmaWxsIjogdHJ1ZSwgImZpbGxDb2xvciI6ICIjZWI3YTM0IiwgImZpbGxPcGFjaXR5IjogMC44LCAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsICJsaW5lQ2FwIjogInJvdW5kIiwgImxpbmVKb2luIjogInJvdW5kIiwgIm9wYWNpdHkiOiAxLjAsICJyYWRpdXMiOiAxLCAic3Ryb2tlIjogdHJ1ZSwgIndlaWdodCI6IDN9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0ZDVhYWI5ZWVmOTQyNzI5NDViNzkxNmI3Mjg4Y2IwKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF9iOTFjNjY0Zjk5N2U0YWNlODc1Yzk4M2FlNWUwODYzNyA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfNDM4ODU2NjUwNzgwNGM1NTgwM2Y3NjdkZTg3ODJhYWUgPSAkKGA8ZGl2IGlkPSJodG1sXzQzODg1NjY1MDc4MDRjNTU4MDNmNzY3ZGU4NzgyYWFlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5CdWZmYWxvPC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwX2I5MWM2NjRmOTk3ZTRhY2U4NzVjOTgzYWU1ZTA4NjM3LnNldENvbnRlbnQoaHRtbF80Mzg4NTY2NTA3ODA0YzU1ODAzZjc2N2RlODc4MmFhZSk7CiAgICAgICAgCgogICAgICAgIGNpcmNsZV9tYXJrZXJfYWNkYzcwNmIwMGYxNDFiNGE3NDhlYTM1YzBkYWQ1ZTQuYmluZFBvcHVwKHBvcHVwX2I5MWM2NjRmOTk3ZTRhY2U4NzVjOTgzYWU1ZTA4NjM3KQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85NjU4NWQ3MDViYmI0NzAyOWZhMmY5YTdmYjQ3YzdkMSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM0LjE4MDgzOTIsIC0xMTguMzA4OTY2MV0sCiAgICAgICAgICAgICAgICB7ImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLCAiY29sb3IiOiAiI2ViN2EzNCIsICJkYXNoQXJyYXkiOiBudWxsLCAiZGFzaE9mZnNldCI6IG51bGwsICJmaWxsIjogdHJ1ZSwgImZpbGxDb2xvciI6ICIjZWI3YTM0IiwgImZpbGxPcGFjaXR5IjogMC44LCAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsICJsaW5lQ2FwIjogInJvdW5kIiwgImxpbmVKb2luIjogInJvdW5kIiwgIm9wYWNpdHkiOiAxLjAsICJyYWRpdXMiOiAxLCAic3Ryb2tlIjogdHJ1ZSwgIndlaWdodCI6IDN9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0ZDVhYWI5ZWVmOTQyNzI5NDViNzkxNmI3Mjg4Y2IwKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF9hMmY5YTg4Y2IxNjg0NzA3ODQ4YTM0YjYwNGMwNmQyOCA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfN2VmYzQ3ZGQxNDE0NDk2MjliMTViZjdkZmNkYTg2NzggPSAkKGA8ZGl2IGlkPSJodG1sXzdlZmM0N2RkMTQxNDQ5NjI5YjE1YmY3ZGZjZGE4Njc4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5CdXJiYW5rPC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwX2EyZjlhODhjYjE2ODQ3MDc4NDhhMzRiNjA0YzA2ZDI4LnNldENvbnRlbnQoaHRtbF83ZWZjNDdkZDE0MTQ0OTYyOWIxNWJmN2RmY2RhODY3OCk7CiAgICAgICAgCgogICAgICAgIGNpcmNsZV9tYXJrZXJfOTY1ODVkNzA1YmJiNDcwMjlmYTJmOWE3ZmI0N2M3ZDEuYmluZFBvcHVwKHBvcHVwX2EyZjlhODhjYjE2ODQ3MDc4NDhhMzRiNjA0YzA2ZDI4KQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl82YjBiOTlmODQ4YmQ0ZDNmOWI3NWJhNjBjYjRiNzkxMyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ0LjQ3NTg4MjUsIC03My4yMTIwNzJdLAogICAgICAgICAgICAgICAgeyJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwgImNvbG9yIjogIiNlYjdhMzQiLCAiZGFzaEFycmF5IjogbnVsbCwgImRhc2hPZmZzZXQiOiBudWxsLCAiZmlsbCI6IHRydWUsICJmaWxsQ29sb3IiOiAiI2ViN2EzNCIsICJmaWxsT3BhY2l0eSI6IDAuOCwgImZpbGxSdWxlIjogImV2ZW5vZGQiLCAibGluZUNhcCI6ICJyb3VuZCIsICJsaW5lSm9pbiI6ICJyb3VuZCIsICJvcGFjaXR5IjogMS4wLCAicmFkaXVzIjogMiwgInN0cm9rZSI6IHRydWUsICJ3ZWlnaHQiOiAzfQogICAgICAgICAgICApLmFkZFRvKG1hcF80NGQ1YWFiOWVlZjk0MjcyOTQ1Yjc5MTZiNzI4OGNiMCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfYjk5OTQxMGEyZDU1NDhmNmEwMmM2YTU3MTMzZTk3YmQgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sX2U2YjZlNDdkY2YzMzQ0YmFiYTJmMjIwMjdkZDc2YWI1ID0gJChgPGRpdiBpZD0iaHRtbF9lNmI2ZTQ3ZGNmMzM0NGJhYmEyZjIyMDI3ZGQ3NmFiNSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+QnVybGluZ3RvbjwvZGl2PmApWzBdOwogICAgICAgICAgICBwb3B1cF9iOTk5NDEwYTJkNTU0OGY2YTAyYzZhNTcxMzNlOTdiZC5zZXRDb250ZW50KGh0bWxfZTZiNmU0N2RjZjMzNDRiYWJhMmYyMjAyN2RkNzZhYjUpOwogICAgICAgIAoKICAgICAgICBjaXJjbGVfbWFya2VyXzZiMGI5OWY4NDhiZDRkM2Y5Yjc1YmE2MGNiNGI3OTEzLmJpbmRQb3B1cChwb3B1cF9iOTk5NDEwYTJkNTU0OGY2YTAyYzZhNTcxMzNlOTdiZCkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYjUyNmYxZTYzMTViNDY4Y2JhZDk0YjNmZmIyNmE0ZjEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszMi45NzU2NDE1LCAtOTYuODg5OTYzNl0sCiAgICAgICAgICAgICAgICB7ImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLCAiY29sb3IiOiAiI2ViN2EzNCIsICJkYXNoQXJyYXkiOiBudWxsLCAiZGFzaE9mZnNldCI6IG51bGwsICJmaWxsIjogdHJ1ZSwgImZpbGxDb2xvciI6ICIjZWI3YTM0IiwgImZpbGxPcGFjaXR5IjogMC44LCAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsICJsaW5lQ2FwIjogInJvdW5kIiwgImxpbmVKb2luIjogInJvdW5kIiwgIm9wYWNpdHkiOiAxLjAsICJyYWRpdXMiOiAzLCAic3Ryb2tlIjogdHJ1ZSwgIndlaWdodCI6IDN9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0ZDVhYWI5ZWVmOTQyNzI5NDViNzkxNmI3Mjg4Y2IwKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF84NTc0NzE2ZWRjN2E0MTFmOGU3Y2U1YjhjNDk5MzFlMSA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfOTExMjQ4YzZhMTA0NDQ3YWI4ZTYzNTU0NWE0NGY0ODUgPSAkKGA8ZGl2IGlkPSJodG1sXzkxMTI0OGM2YTEwNDQ0N2FiOGU2MzU1NDVhNDRmNDg1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DYXJyb2xsdG9uPC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzg1NzQ3MTZlZGM3YTQxMWY4ZTdjZTViOGM0OTkzMWUxLnNldENvbnRlbnQoaHRtbF85MTEyNDhjNmExMDQ0NDdhYjhlNjM1NTQ1YTQ0ZjQ4NSk7CiAgICAgICAgCgogICAgICAgIGNpcmNsZV9tYXJrZXJfYjUyNmYxZTYzMTViNDY4Y2JhZDk0YjNmZmIyNmE0ZjEuYmluZFBvcHVwKHBvcHVwXzg1NzQ3MTZlZGM3YTQxMWY4ZTdjZTViOGM0OTkzMWUxKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mMTQ2MTliMGY5MjY0MjVjYjY1NGRmMmJmNjVlZjY4OCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM5LjE2Mzc5ODQsIC0xMTkuNzY3NDAzNF0sCiAgICAgICAgICAgICAgICB7ImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLCAiY29sb3IiOiAiI2ViN2EzNCIsICJkYXNoQXJyYXkiOiBudWxsLCAiZGFzaE9mZnNldCI6IG51bGwsICJmaWxsIjogdHJ1ZSwgImZpbGxDb2xvciI6ICIjZWI3YTM0IiwgImZpbGxPcGFjaXR5IjogMC44LCAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsICJsaW5lQ2FwIjogInJvdW5kIiwgImxpbmVKb2luIjogInJvdW5kIiwgIm9wYWNpdHkiOiAxLjAsICJyYWRpdXMiOiAxLCAic3Ryb2tlIjogdHJ1ZSwgIndlaWdodCI6IDN9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0ZDVhYWI5ZWVmOTQyNzI5NDViNzkxNmI3Mjg4Y2IwKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF83YjE3M2ZiMDYwYzA0YTg5YmM1MzIzY2FkNTc1ZTU1OSA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfOThmYTk0ZDc2ZDNkNDRhZDgxZDY5M2Y1M2VmYWM3NDAgPSAkKGA8ZGl2IGlkPSJodG1sXzk4ZmE5NGQ3NmQzZDQ0YWQ4MWQ2OTNmNTNlZmFjNzQwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DYXJzb24gQ2l0eTwvZGl2PmApWzBdOwogICAgICAgICAgICBwb3B1cF83YjE3M2ZiMDYwYzA0YTg5YmM1MzIzY2FkNTc1ZTU1OS5zZXRDb250ZW50KGh0bWxfOThmYTk0ZDc2ZDNkNDRhZDgxZDY5M2Y1M2VmYWM3NDApOwogICAgICAgIAoKICAgICAgICBjaXJjbGVfbWFya2VyX2YxNDYxOWIwZjkyNjQyNWNiNjU0ZGYyYmY2NWVmNjg4LmJpbmRQb3B1cChwb3B1cF83YjE3M2ZiMDYwYzA0YTg5YmM1MzIzY2FkNTc1ZTU1OSkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZjIxNWRlYzZiYWIyNDA3ZmJhYmEzZGU0ZmZjZDJmODIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszMy43ODA1Mzg4LCAtMTE2LjQ2NjgwMzZdLAogICAgICAgICAgICAgICAgeyJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwgImNvbG9yIjogIiNlYjdhMzQiLCAiZGFzaEFycmF5IjogbnVsbCwgImRhc2hPZmZzZXQiOiBudWxsLCAiZmlsbCI6IHRydWUsICJmaWxsQ29sb3IiOiAiI2ViN2EzNCIsICJmaWxsT3BhY2l0eSI6IDAuOCwgImZpbGxSdWxlIjogImV2ZW5vZGQiLCAibGluZUNhcCI6ICJyb3VuZCIsICJsaW5lSm9pbiI6ICJyb3VuZCIsICJvcGFjaXR5IjogMS4wLCAicmFkaXVzIjogMSwgInN0cm9rZSI6IHRydWUsICJ3ZWlnaHQiOiAzfQogICAgICAgICAgICApLmFkZFRvKG1hcF80NGQ1YWFiOWVlZjk0MjcyOTQ1Yjc5MTZiNzI4OGNiMCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfMmIwM2M0ZGMzYjljNGY2NTgwOGY4ZTEwNmU5YTU3Y2IgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sXzk0NjNmNjQ2MmMyZjRkMTk5NmNjMjE0MGUyY2RkNDlkID0gJChgPGRpdiBpZD0iaHRtbF85NDYzZjY0NjJjMmY0ZDE5OTZjYzIxNDBlMmNkZDQ5ZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q2F0aGVkcmFsIENpdHk8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfMmIwM2M0ZGMzYjljNGY2NTgwOGY4ZTEwNmU5YTU3Y2Iuc2V0Q29udGVudChodG1sXzk0NjNmNjQ2MmMyZjRkMTk5NmNjMjE0MGUyY2RkNDlkKTsKICAgICAgICAKCiAgICAgICAgY2lyY2xlX21hcmtlcl9mMjE1ZGVjNmJhYjI0MDdmYmFiYTNkZTRmZmNkMmY4Mi5iaW5kUG9wdXAocG9wdXBfMmIwM2M0ZGMzYjljNGY2NTgwOGY4ZTEwNmU5YTU3Y2IpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2Q1ZmUzYTY5ZmQ2NzQxMDU4ODI1MzhiMTYwOTg0NDU1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuMTE2NDIwNCwgLTg4LjI0MzM4MjldLAogICAgICAgICAgICAgICAgeyJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwgImNvbG9yIjogIiNlYjdhMzQiLCAiZGFzaEFycmF5IjogbnVsbCwgImRhc2hPZmZzZXQiOiBudWxsLCAiZmlsbCI6IHRydWUsICJmaWxsQ29sb3IiOiAiI2ViN2EzNCIsICJmaWxsT3BhY2l0eSI6IDAuOCwgImZpbGxSdWxlIjogImV2ZW5vZGQiLCAibGluZUNhcCI6ICJyb3VuZCIsICJsaW5lSm9pbiI6ICJyb3VuZCIsICJvcGFjaXR5IjogMS4wLCAicmFkaXVzIjogMSwgInN0cm9rZSI6IHRydWUsICJ3ZWlnaHQiOiAzfQogICAgICAgICAgICApLmFkZFRvKG1hcF80NGQ1YWFiOWVlZjk0MjcyOTQ1Yjc5MTZiNzI4OGNiMCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfMDc1YzlkNWNkMTJlNGJiODk4NWRhM2U1OWY4OWJhMzQgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sX2Y5NDc5YTkzOTM5ZTQ5ZTk4ZTIzYWNkZDE1OTBkZGNmID0gJChgPGRpdiBpZD0iaHRtbF9mOTQ3OWE5MzkzOWU0OWU5OGUyM2FjZGQxNTkwZGRjZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q2hhbXBhaWduPC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzA3NWM5ZDVjZDEyZTRiYjg5ODVkYTNlNTlmODliYTM0LnNldENvbnRlbnQoaHRtbF9mOTQ3OWE5MzkzOWU0OWU5OGUyM2FjZGQxNTkwZGRjZik7CiAgICAgICAgCgogICAgICAgIGNpcmNsZV9tYXJrZXJfZDVmZTNhNjlmZDY3NDEwNTg4MjUzOGIxNjA5ODQ0NTUuYmluZFBvcHVwKHBvcHVwXzA3NWM5ZDVjZDEyZTRiYjg5ODVkYTNlNTlmODliYTM0KQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81YTE0NzRkZTdmZjk0ZDM3OGY4ZTQxOGVmMGM2NzQwNiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM4LjM0OTgxOTUsIC04MS42MzI2MjM0XSwKICAgICAgICAgICAgICAgIHsiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsICJjb2xvciI6ICIjZWI3YTM0IiwgImRhc2hBcnJheSI6IG51bGwsICJkYXNoT2Zmc2V0IjogbnVsbCwgImZpbGwiOiB0cnVlLCAiZmlsbENvbG9yIjogIiNlYjdhMzQiLCAiZmlsbE9wYWNpdHkiOiAwLjgsICJmaWxsUnVsZSI6ICJldmVub2RkIiwgImxpbmVDYXAiOiAicm91bmQiLCAibGluZUpvaW4iOiAicm91bmQiLCAib3BhY2l0eSI6IDEuMCwgInJhZGl1cyI6IDEsICJzdHJva2UiOiB0cnVlLCAid2VpZ2h0IjogM30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDRkNWFhYjllZWY5NDI3Mjk0NWI3OTE2YjcyODhjYjApOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzBhOTE0ZDIyMmZkNTQ5MjBhYmEyMzg0MzJlZTA4Njc4ID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF9mYWRlYmJiMGJiNWY0ZDE2OTE2ZjgyOGM5ZmU2ZjNhNSA9ICQoYDxkaXYgaWQ9Imh0bWxfZmFkZWJiYjBiYjVmNGQxNjkxNmY4MjhjOWZlNmYzYTUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNoYXJsZXN0b248L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfMGE5MTRkMjIyZmQ1NDkyMGFiYTIzODQzMmVlMDg2Nzguc2V0Q29udGVudChodG1sX2ZhZGViYmIwYmI1ZjRkMTY5MTZmODI4YzlmZTZmM2E1KTsKICAgICAgICAKCiAgICAgICAgY2lyY2xlX21hcmtlcl81YTE0NzRkZTdmZjk0ZDM3OGY4ZTQxOGVmMGM2NzQwNi5iaW5kUG9wdXAocG9wdXBfMGE5MTRkMjIyZmQ1NDkyMGFiYTIzODQzMmVlMDg2NzgpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzA2Y2FiMmQyYzVhOTRjNDU4ZGVmMTA1ZTE1NzFlMmYxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzUuMDQ1NjI5NywgLTg1LjMwOTY4MDFdLAogICAgICAgICAgICAgICAgeyJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwgImNvbG9yIjogIiNlYjdhMzQiLCAiZGFzaEFycmF5IjogbnVsbCwgImRhc2hPZmZzZXQiOiBudWxsLCAiZmlsbCI6IHRydWUsICJmaWxsQ29sb3IiOiAiI2ViN2EzNCIsICJmaWxsT3BhY2l0eSI6IDAuOCwgImZpbGxSdWxlIjogImV2ZW5vZGQiLCAibGluZUNhcCI6ICJyb3VuZCIsICJsaW5lSm9pbiI6ICJyb3VuZCIsICJvcGFjaXR5IjogMS4wLCAicmFkaXVzIjogMSwgInN0cm9rZSI6IHRydWUsICJ3ZWlnaHQiOiAzfQogICAgICAgICAgICApLmFkZFRvKG1hcF80NGQ1YWFiOWVlZjk0MjcyOTQ1Yjc5MTZiNzI4OGNiMCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfNjRjNWNkMGNmZjU2NDZkYWFmNmRhNGMwZTUxMzFkZmIgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sXzQ5YTVkNjBhYjQxYjQzNjk5NGQ2NTM4ODczNTJjZGU2ID0gJChgPGRpdiBpZD0iaHRtbF80OWE1ZDYwYWI0MWI0MzY5OTRkNjUzODg3MzUyY2RlNiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q2hhdHRhbm9vZ2E8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfNjRjNWNkMGNmZjU2NDZkYWFmNmRhNGMwZTUxMzFkZmIuc2V0Q29udGVudChodG1sXzQ5YTVkNjBhYjQxYjQzNjk5NGQ2NTM4ODczNTJjZGU2KTsKICAgICAgICAKCiAgICAgICAgY2lyY2xlX21hcmtlcl8wNmNhYjJkMmM1YTk0YzQ1OGRlZjEwNWUxNTcxZTJmMS5iaW5kUG9wdXAocG9wdXBfNjRjNWNkMGNmZjU2NDZkYWFmNmRhNGMwZTUxMzFkZmIpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2EyZWJkNWY4ZDJmNzQ3ZmFiNWExYjgyMDEzYjg5YWJlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDEuMTM5OTgxNCwgLTEwNC44MjAyNDYyXSwKICAgICAgICAgICAgICAgIHsiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsICJjb2xvciI6ICIjZWI3YTM0IiwgImRhc2hBcnJheSI6IG51bGwsICJkYXNoT2Zmc2V0IjogbnVsbCwgImZpbGwiOiB0cnVlLCAiZmlsbENvbG9yIjogIiNlYjdhMzQiLCAiZmlsbE9wYWNpdHkiOiAwLjgsICJmaWxsUnVsZSI6ICJldmVub2RkIiwgImxpbmVDYXAiOiAicm91bmQiLCAibGluZUpvaW4iOiAicm91bmQiLCAib3BhY2l0eSI6IDEuMCwgInJhZGl1cyI6IDEsICJzdHJva2UiOiB0cnVlLCAid2VpZ2h0IjogM30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDRkNWFhYjllZWY5NDI3Mjk0NWI3OTE2YjcyODhjYjApOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzk5YjdjYzIxY2RmNzQwZmNiNGRkODYyNTQ2OWVhNjI3ID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF9mZWFkZDc0MDQyM2Y0NzU3OGZlMTg4ZDRjN2ZkNWQxZCA9ICQoYDxkaXYgaWQ9Imh0bWxfZmVhZGQ3NDA0MjNmNDc1NzhmZTE4OGQ0YzdmZDVkMWQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNoZXllbm5lPC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzk5YjdjYzIxY2RmNzQwZmNiNGRkODYyNTQ2OWVhNjI3LnNldENvbnRlbnQoaHRtbF9mZWFkZDc0MDQyM2Y0NzU3OGZlMTg4ZDRjN2ZkNWQxZCk7CiAgICAgICAgCgogICAgICAgIGNpcmNsZV9tYXJrZXJfYTJlYmQ1ZjhkMmY3NDdmYWI1YTFiODIwMTNiODlhYmUuYmluZFBvcHVwKHBvcHVwXzk5YjdjYzIxY2RmNzQwZmNiNGRkODYyNTQ2OWVhNjI3KQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9kYjQxYjViN2QyNGQ0NmU1YmNhYWU5NTJiNjg3NDllMSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQxLjg3ODExMzYsIC04Ny42Mjk3OTgyXSwKICAgICAgICAgICAgICAgIHsiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsICJjb2xvciI6ICIjZWI3YTM0IiwgImRhc2hBcnJheSI6IG51bGwsICJkYXNoT2Zmc2V0IjogbnVsbCwgImZpbGwiOiB0cnVlLCAiZmlsbENvbG9yIjogIiNlYjdhMzQiLCAiZmlsbE9wYWNpdHkiOiAwLjgsICJmaWxsUnVsZSI6ICJldmVub2RkIiwgImxpbmVDYXAiOiAicm91bmQiLCAibGluZUpvaW4iOiAicm91bmQiLCAib3BhY2l0eSI6IDEuMCwgInJhZGl1cyI6IDcsICJzdHJva2UiOiB0cnVlLCAid2VpZ2h0IjogM30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDRkNWFhYjllZWY5NDI3Mjk0NWI3OTE2YjcyODhjYjApOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwX2E2YzM1OGMxNDFjNDQ4N2Q5ZmExOTNiMDc0ZGNmODAxID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF9jZjg4OTIyNTA3NTY0ZGI5YWRiMzNiZjM0ZjBkODA0YyA9ICQoYDxkaXYgaWQ9Imh0bWxfY2Y4ODkyMjUwNzU2NGRiOWFkYjMzYmYzNGYwZDgwNGMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNoaWNhZ288L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfYTZjMzU4YzE0MWM0NDg3ZDlmYTE5M2IwNzRkY2Y4MDEuc2V0Q29udGVudChodG1sX2NmODg5MjI1MDc1NjRkYjlhZGIzM2JmMzRmMGQ4MDRjKTsKICAgICAgICAKCiAgICAgICAgY2lyY2xlX21hcmtlcl9kYjQxYjViN2QyNGQ0NmU1YmNhYWU5NTJiNjg3NDllMS5iaW5kUG9wdXAocG9wdXBfYTZjMzU4YzE0MWM0NDg3ZDlmYTE5M2IwNzRkY2Y4MDEpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzQ4YmM2MjQ0M2VkOTRmNzY5ZmNiYWE1N2IwZWQyZDA5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDIuMTQ4NzA0MywgLTcyLjYwNzg2NzJdLAogICAgICAgICAgICAgICAgeyJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwgImNvbG9yIjogIiNlYjdhMzQiLCAiZGFzaEFycmF5IjogbnVsbCwgImRhc2hPZmZzZXQiOiBudWxsLCAiZmlsbCI6IHRydWUsICJmaWxsQ29sb3IiOiAiI2ViN2EzNCIsICJmaWxsT3BhY2l0eSI6IDAuOCwgImZpbGxSdWxlIjogImV2ZW5vZGQiLCAibGluZUNhcCI6ICJyb3VuZCIsICJsaW5lSm9pbiI6ICJyb3VuZCIsICJvcGFjaXR5IjogMS4wLCAicmFkaXVzIjogMSwgInN0cm9rZSI6IHRydWUsICJ3ZWlnaHQiOiAzfQogICAgICAgICAgICApLmFkZFRvKG1hcF80NGQ1YWFiOWVlZjk0MjcyOTQ1Yjc5MTZiNzI4OGNiMCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfZTliMjFhYWQ0MzExNGNkYmI0MThlYzU4ZTQ4Yzk3MjcgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sX2NlNmI1YjdkODUzODRhMTc4NmNkYjk3MmExZDU1ZGYwID0gJChgPGRpdiBpZD0iaHRtbF9jZTZiNWI3ZDg1Mzg0YTE3ODZjZGI5NzJhMWQ1NWRmMCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q2hpY29wZWU8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfZTliMjFhYWQ0MzExNGNkYmI0MThlYzU4ZTQ4Yzk3Mjcuc2V0Q29udGVudChodG1sX2NlNmI1YjdkODUzODRhMTc4NmNkYjk3MmExZDU1ZGYwKTsKICAgICAgICAKCiAgICAgICAgY2lyY2xlX21hcmtlcl80OGJjNjI0NDNlZDk0Zjc2OWZjYmFhNTdiMGVkMmQwOS5iaW5kUG9wdXAocG9wdXBfZTliMjFhYWQ0MzExNGNkYmI0MThlYzU4ZTQ4Yzk3MjcpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzM3MzhhY2M2NmI4ODRlNGRiOTI0MDhjMTcyZDczZDBiID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzkuMTAzMTE4MiwgLTg0LjUxMjAxOTZdLAogICAgICAgICAgICAgICAgeyJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwgImNvbG9yIjogIiNlYjdhMzQiLCAiZGFzaEFycmF5IjogbnVsbCwgImRhc2hPZmZzZXQiOiBudWxsLCAiZmlsbCI6IHRydWUsICJmaWxsQ29sb3IiOiAiI2ViN2EzNCIsICJmaWxsT3BhY2l0eSI6IDAuOCwgImZpbGxSdWxlIjogImV2ZW5vZGQiLCAibGluZUNhcCI6ICJyb3VuZCIsICJsaW5lSm9pbiI6ICJyb3VuZCIsICJvcGFjaXR5IjogMS4wLCAicmFkaXVzIjogMywgInN0cm9rZSI6IHRydWUsICJ3ZWlnaHQiOiAzfQogICAgICAgICAgICApLmFkZFRvKG1hcF80NGQ1YWFiOWVlZjk0MjcyOTQ1Yjc5MTZiNzI4OGNiMCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfOTYwYTc4NzA5ODE5NDI3MjlkNDBiMGYwMDgyYWM2OTEgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sXzQ2N2I5OWQ3NjdhNTQ1YWU4Y2ZmMDNhNWViNzJkYjE0ID0gJChgPGRpdiBpZD0iaHRtbF80NjdiOTlkNzY3YTU0NWFlOGNmZjAzYTVlYjcyZGIxNCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Q2luY2lubmF0aTwvZGl2PmApWzBdOwogICAgICAgICAgICBwb3B1cF85NjBhNzg3MDk4MTk0MjcyOWQ0MGIwZjAwODJhYzY5MS5zZXRDb250ZW50KGh0bWxfNDY3Yjk5ZDc2N2E1NDVhZThjZmYwM2E1ZWI3MmRiMTQpOwogICAgICAgIAoKICAgICAgICBjaXJjbGVfbWFya2VyXzM3MzhhY2M2NmI4ODRlNGRiOTI0MDhjMTcyZDczZDBiLmJpbmRQb3B1cChwb3B1cF85NjBhNzg3MDk4MTk0MjcyOWQ0MGIwZjAwODJhYzY5MSkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfM2E4OGQ5NTQ4NjQ5NDkxZDkwM2Q5NzRlNjgyYmRmZTMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFsyNy45NjU4NTMzLCAtODIuODAwMTAyNl0sCiAgICAgICAgICAgICAgICB7ImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLCAiY29sb3IiOiAiI2ViN2EzNCIsICJkYXNoQXJyYXkiOiBudWxsLCAiZGFzaE9mZnNldCI6IG51bGwsICJmaWxsIjogdHJ1ZSwgImZpbGxDb2xvciI6ICIjZWI3YTM0IiwgImZpbGxPcGFjaXR5IjogMC44LCAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsICJsaW5lQ2FwIjogInJvdW5kIiwgImxpbmVKb2luIjogInJvdW5kIiwgIm9wYWNpdHkiOiAxLjAsICJyYWRpdXMiOiAxLCAic3Ryb2tlIjogdHJ1ZSwgIndlaWdodCI6IDN9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0ZDVhYWI5ZWVmOTQyNzI5NDViNzkxNmI3Mjg4Y2IwKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF82YmY4MmU4NmExMTI0ZjcxYjlmZGJjYzBhOTFmYzRmYSA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfZTY0OTE2NTFlYmNiNGFlYThlZWZjOWIzY2MxMzI3MGYgPSAkKGA8ZGl2IGlkPSJodG1sX2U2NDkxNjUxZWJjYjRhZWE4ZWVmYzliM2NjMTMyNzBmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DbGVhcndhdGVyPC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzZiZjgyZTg2YTExMjRmNzFiOWZkYmNjMGE5MWZjNGZhLnNldENvbnRlbnQoaHRtbF9lNjQ5MTY1MWViY2I0YWVhOGVlZmM5YjNjYzEzMjcwZik7CiAgICAgICAgCgogICAgICAgIGNpcmNsZV9tYXJrZXJfM2E4OGQ5NTQ4NjQ5NDkxZDkwM2Q5NzRlNjgyYmRmZTMuYmluZFBvcHVwKHBvcHVwXzZiZjgyZTg2YTExMjRmNzFiOWZkYmNjMGE5MWZjNGZhKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl80NWFiN2ZkZjY1MWE0NzVkOGZkMzAzY2RhYjU1MWY1YSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQxLjQ5OTMyLCAtODEuNjk0MzYwNV0sCiAgICAgICAgICAgICAgICB7ImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLCAiY29sb3IiOiAiI2ViN2EzNCIsICJkYXNoQXJyYXkiOiBudWxsLCAiZGFzaE9mZnNldCI6IG51bGwsICJmaWxsIjogdHJ1ZSwgImZpbGxDb2xvciI6ICIjZWI3YTM0IiwgImZpbGxPcGFjaXR5IjogMC44LCAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsICJsaW5lQ2FwIjogInJvdW5kIiwgImxpbmVKb2luIjogInJvdW5kIiwgIm9wYWNpdHkiOiAxLjAsICJyYWRpdXMiOiAyLCAic3Ryb2tlIjogdHJ1ZSwgIndlaWdodCI6IDN9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0ZDVhYWI5ZWVmOTQyNzI5NDViNzkxNmI3Mjg4Y2IwKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF9mODQyM2I5NzJmMjU0MmNlYWMzNmZkNTFjNGUwMzJjYSA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfNThlZmM3NTlhZTc3NDAxZGEzNThlNTZiOTEyOTAyYTkgPSAkKGA8ZGl2IGlkPSJodG1sXzU4ZWZjNzU5YWU3NzQwMWRhMzU4ZTU2YjkxMjkwMmE5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5DbGV2ZWxhbmQ8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfZjg0MjNiOTcyZjI1NDJjZWFjMzZmZDUxYzRlMDMyY2Euc2V0Q29udGVudChodG1sXzU4ZWZjNzU5YWU3NzQwMWRhMzU4ZTU2YjkxMjkwMmE5KTsKICAgICAgICAKCiAgICAgICAgY2lyY2xlX21hcmtlcl80NWFiN2ZkZjY1MWE0NzVkOGZkMzAzY2RhYjU1MWY1YS5iaW5kUG9wdXAocG9wdXBfZjg0MjNiOTcyZjI1NDJjZWFjMzZmZDUxYzRlMDMyY2EpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2JhZGYwNTJkZjdhYTQzMWE5NDEzOTRkOWVmYTgwYzAwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzYuODI1MjI3NywgLTExOS43MDI5MTk0XSwKICAgICAgICAgICAgICAgIHsiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsICJjb2xvciI6ICIjZWI3YTM0IiwgImRhc2hBcnJheSI6IG51bGwsICJkYXNoT2Zmc2V0IjogbnVsbCwgImZpbGwiOiB0cnVlLCAiZmlsbENvbG9yIjogIiNlYjdhMzQiLCAiZmlsbE9wYWNpdHkiOiAwLjgsICJmaWxsUnVsZSI6ICJldmVub2RkIiwgImxpbmVDYXAiOiAicm91bmQiLCAibGluZUpvaW4iOiAicm91bmQiLCAib3BhY2l0eSI6IDEuMCwgInJhZGl1cyI6IDEsICJzdHJva2UiOiB0cnVlLCAid2VpZ2h0IjogM30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDRkNWFhYjllZWY5NDI3Mjk0NWI3OTE2YjcyODhjYjApOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwX2UwYjAzYWM1NTA0MzRlNGI5YmQ2YjkzNzMwYmJjOTk0ID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF9hY2RhNzE2MTI3Mzk0ZWNiOTMxNTBmYTQzODJmY2YwZiA9ICQoYDxkaXYgaWQ9Imh0bWxfYWNkYTcxNjEyNzM5NGVjYjkzMTUwZmE0MzgyZmNmMGYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkNsb3ZpczwvZGl2PmApWzBdOwogICAgICAgICAgICBwb3B1cF9lMGIwM2FjNTUwNDM0ZTRiOWJkNmI5MzczMGJiYzk5NC5zZXRDb250ZW50KGh0bWxfYWNkYTcxNjEyNzM5NGVjYjkzMTUwZmE0MzgyZmNmMGYpOwogICAgICAgIAoKICAgICAgICBjaXJjbGVfbWFya2VyX2JhZGYwNTJkZjdhYTQzMWE5NDEzOTRkOWVmYTgwYzAwLmJpbmRQb3B1cChwb3B1cF9lMGIwM2FjNTUwNDM0ZTRiOWJkNmI5MzczMGJiYzk5NCkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMzU1YmRhZDcyZGE0NDE0MWIxY2Y0OWVlOTM3ZDAyNzQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszOS45NjExNzU1LCAtODIuOTk4Nzk0Ml0sCiAgICAgICAgICAgICAgICB7ImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLCAiY29sb3IiOiAiI2ViN2EzNCIsICJkYXNoQXJyYXkiOiBudWxsLCAiZGFzaE9mZnNldCI6IG51bGwsICJmaWxsIjogdHJ1ZSwgImZpbGxDb2xvciI6ICIjZWI3YTM0IiwgImZpbGxPcGFjaXR5IjogMC44LCAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsICJsaW5lQ2FwIjogInJvdW5kIiwgImxpbmVKb2luIjogInJvdW5kIiwgIm9wYWNpdHkiOiAxLjAsICJyYWRpdXMiOiAyLCAic3Ryb2tlIjogdHJ1ZSwgIndlaWdodCI6IDN9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0ZDVhYWI5ZWVmOTQyNzI5NDViNzkxNmI3Mjg4Y2IwKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF83MTg1NTA4MzQ4NjI0ZjFkODdiYjMxZDJhMTJiNGYxMSA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfNWYxZmM4MWVhZjZjNGU5MDk5ZTJhNDc4YTg4ZjE1NDAgPSAkKGA8ZGl2IGlkPSJodG1sXzVmMWZjODFlYWY2YzRlOTA5OWUyYTQ3OGE4OGYxNTQwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Db2x1bWJ1czwvZGl2PmApWzBdOwogICAgICAgICAgICBwb3B1cF83MTg1NTA4MzQ4NjI0ZjFkODdiYjMxZDJhMTJiNGYxMS5zZXRDb250ZW50KGh0bWxfNWYxZmM4MWVhZjZjNGU5MDk5ZTJhNDc4YTg4ZjE1NDApOwogICAgICAgIAoKICAgICAgICBjaXJjbGVfbWFya2VyXzM1NWJkYWQ3MmRhNDQxNDFiMWNmNDllZTkzN2QwMjc0LmJpbmRQb3B1cChwb3B1cF83MTg1NTA4MzQ4NjI0ZjFkODdiYjMxZDJhMTJiNGYxMSkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMjg1ZjgyMjBiMTg1NGExYWI1NTQ5YWFiYjIzMmM1MmYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszMi43NzY2NjQyLCAtOTYuNzk2OTg3OV0sCiAgICAgICAgICAgICAgICB7ImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLCAiY29sb3IiOiAiI2ViN2EzNCIsICJkYXNoQXJyYXkiOiBudWxsLCAiZGFzaE9mZnNldCI6IG51bGwsICJmaWxsIjogdHJ1ZSwgImZpbGxDb2xvciI6ICIjZWI3YTM0IiwgImZpbGxPcGFjaXR5IjogMC44LCAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsICJsaW5lQ2FwIjogInJvdW5kIiwgImxpbmVKb2luIjogInJvdW5kIiwgIm9wYWNpdHkiOiAxLjAsICJyYWRpdXMiOiAzLCAic3Ryb2tlIjogdHJ1ZSwgIndlaWdodCI6IDN9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0ZDVhYWI5ZWVmOTQyNzI5NDViNzkxNmI3Mjg4Y2IwKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF83YzQ3NDliYTU0NjA0YWM2OGQ3ZTM4YjRhMjhjMDY1ZCA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfY2Y3YzEwMzc3YzZlNDczMDg2ZGZlZTBlZDM5NDlhMmUgPSAkKGA8ZGl2IGlkPSJodG1sX2NmN2MxMDM3N2M2ZTQ3MzA4NmRmZWUwZWQzOTQ5YTJlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5EYWxsYXM8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfN2M0NzQ5YmE1NDYwNGFjNjhkN2UzOGI0YTI4YzA2NWQuc2V0Q29udGVudChodG1sX2NmN2MxMDM3N2M2ZTQ3MzA4NmRmZWUwZWQzOTQ5YTJlKTsKICAgICAgICAKCiAgICAgICAgY2lyY2xlX21hcmtlcl8yODVmODIyMGIxODU0YTFhYjU1NDlhYWJiMjMyYzUyZi5iaW5kUG9wdXAocG9wdXBfN2M0NzQ5YmE1NDYwNGFjNjhkN2UzOGI0YTI4YzA2NWQpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzg3MWE3ZDA4MDI1NDQ5MmJiODA3ZWNkNmRiMGVhMjg2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzkuNzU4OTQ3OCwgLTg0LjE5MTYwNjldLAogICAgICAgICAgICAgICAgeyJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwgImNvbG9yIjogIiNlYjdhMzQiLCAiZGFzaEFycmF5IjogbnVsbCwgImRhc2hPZmZzZXQiOiBudWxsLCAiZmlsbCI6IHRydWUsICJmaWxsQ29sb3IiOiAiI2ViN2EzNCIsICJmaWxsT3BhY2l0eSI6IDAuOCwgImZpbGxSdWxlIjogImV2ZW5vZGQiLCAibGluZUNhcCI6ICJyb3VuZCIsICJsaW5lSm9pbiI6ICJyb3VuZCIsICJvcGFjaXR5IjogMS4wLCAicmFkaXVzIjogMiwgInN0cm9rZSI6IHRydWUsICJ3ZWlnaHQiOiAzfQogICAgICAgICAgICApLmFkZFRvKG1hcF80NGQ1YWFiOWVlZjk0MjcyOTQ1Yjc5MTZiNzI4OGNiMCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfYzRjN2EyMzVhYmVjNGU5MjhiZmViZTI3OGRjNDJjMTQgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sX2VkY2U4YzZhMTUxNzQwZGRiZjc5ZWI1OWE2Y2Q4MGE5ID0gJChgPGRpdiBpZD0iaHRtbF9lZGNlOGM2YTE1MTc0MGRkYmY3OWViNTlhNmNkODBhOSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RGF5dG9uPC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwX2M0YzdhMjM1YWJlYzRlOTI4YmZlYmUyNzhkYzQyYzE0LnNldENvbnRlbnQoaHRtbF9lZGNlOGM2YTE1MTc0MGRkYmY3OWViNTlhNmNkODBhOSk7CiAgICAgICAgCgogICAgICAgIGNpcmNsZV9tYXJrZXJfODcxYTdkMDgwMjU0NDkyYmI4MDdlY2Q2ZGIwZWEyODYuYmluZFBvcHVwKHBvcHVwX2M0YzdhMjM1YWJlYzRlOTI4YmZlYmUyNzhkYzQyYzE0KQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mNmM4Yzc2ZDUwNmQ0NGM3YjI1YzYyMzJmYjRjNzExYiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzI5LjIxMDgxNDcsIC04MS4wMjI4MzMxXSwKICAgICAgICAgICAgICAgIHsiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsICJjb2xvciI6ICIjZWI3YTM0IiwgImRhc2hBcnJheSI6IG51bGwsICJkYXNoT2Zmc2V0IjogbnVsbCwgImZpbGwiOiB0cnVlLCAiZmlsbENvbG9yIjogIiNlYjdhMzQiLCAiZmlsbE9wYWNpdHkiOiAwLjgsICJmaWxsUnVsZSI6ICJldmVub2RkIiwgImxpbmVDYXAiOiAicm91bmQiLCAibGluZUpvaW4iOiAicm91bmQiLCAib3BhY2l0eSI6IDEuMCwgInJhZGl1cyI6IDEsICJzdHJva2UiOiB0cnVlLCAid2VpZ2h0IjogM30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDRkNWFhYjllZWY5NDI3Mjk0NWI3OTE2YjcyODhjYjApOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwX2FhMmIyOWI1N2QzODRhM2Y4ZmYyMTJjYjQzYzY2M2QxID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF9hZGQ0MmJkZDBhMmM0NTZmOGY0ZTk1MWQzOTQwZTQxOSA9ICQoYDxkaXYgaWQ9Imh0bWxfYWRkNDJiZGQwYTJjNDU2ZjhmNGU5NTFkMzk0MGU0MTkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkRheXRvbmEgQmVhY2g8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfYWEyYjI5YjU3ZDM4NGEzZjhmZjIxMmNiNDNjNjYzZDEuc2V0Q29udGVudChodG1sX2FkZDQyYmRkMGEyYzQ1NmY4ZjRlOTUxZDM5NDBlNDE5KTsKICAgICAgICAKCiAgICAgICAgY2lyY2xlX21hcmtlcl9mNmM4Yzc2ZDUwNmQ0NGM3YjI1YzYyMzJmYjRjNzExYi5iaW5kUG9wdXAocG9wdXBfYWEyYjI5YjU3ZDM4NGEzZjhmZjIxMmNiNDNjNjYzZDEpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzRlMzUzZTAwZTAxZjQwODJhNzAzZjcxMmI2ZmUxODNiID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDIuMzIyMjU5OSwgLTgzLjE3NjMxNDVdLAogICAgICAgICAgICAgICAgeyJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwgImNvbG9yIjogIiNlYjdhMzQiLCAiZGFzaEFycmF5IjogbnVsbCwgImRhc2hPZmZzZXQiOiBudWxsLCAiZmlsbCI6IHRydWUsICJmaWxsQ29sb3IiOiAiI2ViN2EzNCIsICJmaWxsT3BhY2l0eSI6IDAuOCwgImZpbGxSdWxlIjogImV2ZW5vZGQiLCAibGluZUNhcCI6ICJyb3VuZCIsICJsaW5lSm9pbiI6ICJyb3VuZCIsICJvcGFjaXR5IjogMS4wLCAicmFkaXVzIjogMSwgInN0cm9rZSI6IHRydWUsICJ3ZWlnaHQiOiAzfQogICAgICAgICAgICApLmFkZFRvKG1hcF80NGQ1YWFiOWVlZjk0MjcyOTQ1Yjc5MTZiNzI4OGNiMCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfY2VlMzk3YTZhMTlkNGY4Yzg0YWU0YWI4NjlhZWY3ZTggPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sX2RmMTM1N2M1NmNhOTQwY2NiMmRhOTdjM2E2MmI5ZTY0ID0gJChgPGRpdiBpZD0iaHRtbF9kZjEzNTdjNTZjYTk0MGNjYjJkYTk3YzNhNjJiOWU2NCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RGVhcmJvcm48L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfY2VlMzk3YTZhMTlkNGY4Yzg0YWU0YWI4NjlhZWY3ZTguc2V0Q29udGVudChodG1sX2RmMTM1N2M1NmNhOTQwY2NiMmRhOTdjM2E2MmI5ZTY0KTsKICAgICAgICAKCiAgICAgICAgY2lyY2xlX21hcmtlcl80ZTM1M2UwMGUwMWY0MDgyYTcwM2Y3MTJiNmZlMTgzYi5iaW5kUG9wdXAocG9wdXBfY2VlMzk3YTZhMTlkNGY4Yzg0YWU0YWI4NjlhZWY3ZTgpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzQ0MmE5ZTM4Y2E5OTQ0ZjM4MWQ1MWYzZTlmNzdmMGQ5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzkuODQwMzE0NywgLTg4Ljk1NDgwMDFdLAogICAgICAgICAgICAgICAgeyJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwgImNvbG9yIjogIiNlYjdhMzQiLCAiZGFzaEFycmF5IjogbnVsbCwgImRhc2hPZmZzZXQiOiBudWxsLCAiZmlsbCI6IHRydWUsICJmaWxsQ29sb3IiOiAiI2ViN2EzNCIsICJmaWxsT3BhY2l0eSI6IDAuOCwgImZpbGxSdWxlIjogImV2ZW5vZGQiLCAibGluZUNhcCI6ICJyb3VuZCIsICJsaW5lSm9pbiI6ICJyb3VuZCIsICJvcGFjaXR5IjogMS4wLCAicmFkaXVzIjogMSwgInN0cm9rZSI6IHRydWUsICJ3ZWlnaHQiOiAzfQogICAgICAgICAgICApLmFkZFRvKG1hcF80NGQ1YWFiOWVlZjk0MjcyOTQ1Yjc5MTZiNzI4OGNiMCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfZDY2NzQzM2ZkMmRhNGE5MzlhODRkY2I2YWJiNDk3MTAgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sXzFjOGI3YjE4NjIxMTRiZWU5ZWNhMDYyZWZlZDhhNDBlID0gJChgPGRpdiBpZD0iaHRtbF8xYzhiN2IxODYyMTE0YmVlOWVjYTA2MmVmZWQ4YTQwZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RGVjYXR1cjwvZGl2PmApWzBdOwogICAgICAgICAgICBwb3B1cF9kNjY3NDMzZmQyZGE0YTkzOWE4NGRjYjZhYmI0OTcxMC5zZXRDb250ZW50KGh0bWxfMWM4YjdiMTg2MjExNGJlZTllY2EwNjJlZmVkOGE0MGUpOwogICAgICAgIAoKICAgICAgICBjaXJjbGVfbWFya2VyXzQ0MmE5ZTM4Y2E5OTQ0ZjM4MWQ1MWYzZTlmNzdmMGQ5LmJpbmRQb3B1cChwb3B1cF9kNjY3NDMzZmQyZGE0YTkzOWE4NGRjYjZhYmI0OTcxMCkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNzFjMjI3MjFkM2RkNDc3M2FhZmVlMmZhMjNmYjc4YjAgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszOS43MzkyMzU4LCAtMTA0Ljk5MDI1MV0sCiAgICAgICAgICAgICAgICB7ImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLCAiY29sb3IiOiAiI2ViN2EzNCIsICJkYXNoQXJyYXkiOiBudWxsLCAiZGFzaE9mZnNldCI6IG51bGwsICJmaWxsIjogdHJ1ZSwgImZpbGxDb2xvciI6ICIjZWI3YTM0IiwgImZpbGxPcGFjaXR5IjogMC44LCAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsICJsaW5lQ2FwIjogInJvdW5kIiwgImxpbmVKb2luIjogInJvdW5kIiwgIm9wYWNpdHkiOiAxLjAsICJyYWRpdXMiOiAxLCAic3Ryb2tlIjogdHJ1ZSwgIndlaWdodCI6IDN9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0ZDVhYWI5ZWVmOTQyNzI5NDViNzkxNmI3Mjg4Y2IwKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF9iNGM0NzZlMzAyZTI0Mjk3OTFiODMzNTgwNDNlNjY2ZiA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfZTA1NDg0Yzc4MjIzNGQxZjhjNGY2OTIxMmYzNDU2YzEgPSAkKGA8ZGl2IGlkPSJodG1sX2UwNTQ4NGM3ODIyMzRkMWY4YzRmNjkyMTJmMzQ1NmMxIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5EZW52ZXI8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfYjRjNDc2ZTMwMmUyNDI5NzkxYjgzMzU4MDQzZTY2NmYuc2V0Q29udGVudChodG1sX2UwNTQ4NGM3ODIyMzRkMWY4YzRmNjkyMTJmMzQ1NmMxKTsKICAgICAgICAKCiAgICAgICAgY2lyY2xlX21hcmtlcl83MWMyMjcyMWQzZGQ0NzczYWFmZWUyZmEyM2ZiNzhiMC5iaW5kUG9wdXAocG9wdXBfYjRjNDc2ZTMwMmUyNDI5NzkxYjgzMzU4MDQzZTY2NmYpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzE0NDQzNTRlYWYyMTQ0OTVhNjUxOWZhN2UwYTY0ZTIyID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDEuNjAwNTQ0OCwgLTkzLjYwOTEwNjRdLAogICAgICAgICAgICAgICAgeyJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwgImNvbG9yIjogIiNlYjdhMzQiLCAiZGFzaEFycmF5IjogbnVsbCwgImRhc2hPZmZzZXQiOiBudWxsLCAiZmlsbCI6IHRydWUsICJmaWxsQ29sb3IiOiAiI2ViN2EzNCIsICJmaWxsT3BhY2l0eSI6IDAuOCwgImZpbGxSdWxlIjogImV2ZW5vZGQiLCAibGluZUNhcCI6ICJyb3VuZCIsICJsaW5lSm9pbiI6ICJyb3VuZCIsICJvcGFjaXR5IjogMS4wLCAicmFkaXVzIjogMSwgInN0cm9rZSI6IHRydWUsICJ3ZWlnaHQiOiAzfQogICAgICAgICAgICApLmFkZFRvKG1hcF80NGQ1YWFiOWVlZjk0MjcyOTQ1Yjc5MTZiNzI4OGNiMCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfMzVkOWI1ZjFjZmQwNGM0YWE1MDU3M2YwMzc2OWMwNTIgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sX2RiYmM2ZTIyNDI4NjRkMTFiOTNkM2M2ODRjZWUwN2NlID0gJChgPGRpdiBpZD0iaHRtbF9kYmJjNmUyMjQyODY0ZDExYjkzZDNjNjg0Y2VlMDdjZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RGVzIE1vaW5lczwvZGl2PmApWzBdOwogICAgICAgICAgICBwb3B1cF8zNWQ5YjVmMWNmZDA0YzRhYTUwNTczZjAzNzY5YzA1Mi5zZXRDb250ZW50KGh0bWxfZGJiYzZlMjI0Mjg2NGQxMWI5M2QzYzY4NGNlZTA3Y2UpOwogICAgICAgIAoKICAgICAgICBjaXJjbGVfbWFya2VyXzE0NDQzNTRlYWYyMTQ0OTVhNjUxOWZhN2UwYTY0ZTIyLmJpbmRQb3B1cChwb3B1cF8zNWQ5YjVmMWNmZDA0YzRhYTUwNTczZjAzNzY5YzA1MikKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZWQxNTY4N2VmMDgzNDE3NTlhMTRiOGY3OWI0YzNjZDQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0NC44NTQ2ODU2LCAtOTMuNDcwNzg2XSwKICAgICAgICAgICAgICAgIHsiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsICJjb2xvciI6ICIjZWI3YTM0IiwgImRhc2hBcnJheSI6IG51bGwsICJkYXNoT2Zmc2V0IjogbnVsbCwgImZpbGwiOiB0cnVlLCAiZmlsbENvbG9yIjogIiNlYjdhMzQiLCAiZmlsbE9wYWNpdHkiOiAwLjgsICJmaWxsUnVsZSI6ICJldmVub2RkIiwgImxpbmVDYXAiOiAicm91bmQiLCAibGluZUpvaW4iOiAicm91bmQiLCAib3BhY2l0eSI6IDEuMCwgInJhZGl1cyI6IDEsICJzdHJva2UiOiB0cnVlLCAid2VpZ2h0IjogM30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDRkNWFhYjllZWY5NDI3Mjk0NWI3OTE2YjcyODhjYjApOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwX2IxYjYzYmQxYmI3ZDQ1Yzc5MDM2ZDQ2OGY3NGRmYjE5ID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF81ZTY3NDExNzFlNGI0NjYxYjUxYjZhYzk4YzM4MTc4NCA9ICQoYDxkaXYgaWQ9Imh0bWxfNWU2NzQxMTcxZTRiNDY2MWI1MWI2YWM5OGMzODE3ODQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkVkZW4gUHJhaXJpZTwvZGl2PmApWzBdOwogICAgICAgICAgICBwb3B1cF9iMWI2M2JkMWJiN2Q0NWM3OTAzNmQ0NjhmNzRkZmIxOS5zZXRDb250ZW50KGh0bWxfNWU2NzQxMTcxZTRiNDY2MWI1MWI2YWM5OGMzODE3ODQpOwogICAgICAgIAoKICAgICAgICBjaXJjbGVfbWFya2VyX2VkMTU2ODdlZjA4MzQxNzU5YTE0YjhmNzliNGMzY2Q0LmJpbmRQb3B1cChwb3B1cF9iMWI2M2JkMWJiN2Q0NWM3OTAzNmQ0NjhmNzRkZmIxOSkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNGJiNGI2YTgyZGJkNDRhM2FlMjc5MmFmNzU2NmJjMTAgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MS44OTk0NzQ0LCAtODcuOTQwMzQxOF0sCiAgICAgICAgICAgICAgICB7ImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLCAiY29sb3IiOiAiI2ViN2EzNCIsICJkYXNoQXJyYXkiOiBudWxsLCAiZGFzaE9mZnNldCI6IG51bGwsICJmaWxsIjogdHJ1ZSwgImZpbGxDb2xvciI6ICIjZWI3YTM0IiwgImZpbGxPcGFjaXR5IjogMC44LCAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsICJsaW5lQ2FwIjogInJvdW5kIiwgImxpbmVKb2luIjogInJvdW5kIiwgIm9wYWNpdHkiOiAxLjAsICJyYWRpdXMiOiAxLCAic3Ryb2tlIjogdHJ1ZSwgIndlaWdodCI6IDN9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0ZDVhYWI5ZWVmOTQyNzI5NDViNzkxNmI3Mjg4Y2IwKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF9jZjI3Yzg1ZDUwYzU0MGEzYTY2Y2E5MDBhYWU2ODNmYiA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfNzNhYTYyODMyMmIyNGQ1ZmExMmFkNmExY2UxY2UxNWYgPSAkKGA8ZGl2IGlkPSJodG1sXzczYWE2MjgzMjJiMjRkNWZhMTJhZDZhMWNlMWNlMTVmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5FbG1odXJzdDwvZGl2PmApWzBdOwogICAgICAgICAgICBwb3B1cF9jZjI3Yzg1ZDUwYzU0MGEzYTY2Y2E5MDBhYWU2ODNmYi5zZXRDb250ZW50KGh0bWxfNzNhYTYyODMyMmIyNGQ1ZmExMmFkNmExY2UxY2UxNWYpOwogICAgICAgIAoKICAgICAgICBjaXJjbGVfbWFya2VyXzRiYjRiNmE4MmRiZDQ0YTNhZTI3OTJhZjc1NjZiYzEwLmJpbmRQb3B1cChwb3B1cF9jZjI3Yzg1ZDUwYzU0MGEzYTY2Y2E5MDBhYWU2ODNmYikKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYjdjNzY5ZGJjYzUyNGI2ZmJiZTk2N2Q2YTRlMGJlMzMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszMy4wMzY5ODY3LCAtMTE3LjI5MTk4MThdLAogICAgICAgICAgICAgICAgeyJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwgImNvbG9yIjogIiNlYjdhMzQiLCAiZGFzaEFycmF5IjogbnVsbCwgImRhc2hPZmZzZXQiOiBudWxsLCAiZmlsbCI6IHRydWUsICJmaWxsQ29sb3IiOiAiI2ViN2EzNCIsICJmaWxsT3BhY2l0eSI6IDAuOCwgImZpbGxSdWxlIjogImV2ZW5vZGQiLCAibGluZUNhcCI6ICJyb3VuZCIsICJsaW5lSm9pbiI6ICJyb3VuZCIsICJvcGFjaXR5IjogMS4wLCAicmFkaXVzIjogMSwgInN0cm9rZSI6IHRydWUsICJ3ZWlnaHQiOiAzfQogICAgICAgICAgICApLmFkZFRvKG1hcF80NGQ1YWFiOWVlZjk0MjcyOTQ1Yjc5MTZiNzI4OGNiMCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfODBkMDIwMzEzMWRhNDZkYmI2NGViMzg1ZDc1NTY5ZGEgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sX2Q2YThkNjM1YjVjNTQwODFiMjczZGQ1YTg3NTU3MGQzID0gJChgPGRpdiBpZD0iaHRtbF9kNmE4ZDYzNWI1YzU0MDgxYjI3M2RkNWE4NzU1NzBkMyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RW5jaW5pdGFzPC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzgwZDAyMDMxMzFkYTQ2ZGJiNjRlYjM4NWQ3NTU2OWRhLnNldENvbnRlbnQoaHRtbF9kNmE4ZDYzNWI1YzU0MDgxYjI3M2RkNWE4NzU1NzBkMyk7CiAgICAgICAgCgogICAgICAgIGNpcmNsZV9tYXJrZXJfYjdjNzY5ZGJjYzUyNGI2ZmJiZTk2N2Q2YTRlMGJlMzMuYmluZFBvcHVwKHBvcHVwXzgwZDAyMDMxMzFkYTQ2ZGJiNjRlYjM4NWQ3NTU2OWRhKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xYTNmOWM2ZmYwNGE0ODgwOGRmY2YzNjgzZTgyMDAyNCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzMzLjExOTIwNjgsIC0xMTcuMDg2NDIxXSwKICAgICAgICAgICAgICAgIHsiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsICJjb2xvciI6ICIjZWI3YTM0IiwgImRhc2hBcnJheSI6IG51bGwsICJkYXNoT2Zmc2V0IjogbnVsbCwgImZpbGwiOiB0cnVlLCAiZmlsbENvbG9yIjogIiNlYjdhMzQiLCAiZmlsbE9wYWNpdHkiOiAwLjgsICJmaWxsUnVsZSI6ICJldmVub2RkIiwgImxpbmVDYXAiOiAicm91bmQiLCAibGluZUpvaW4iOiAicm91bmQiLCAib3BhY2l0eSI6IDEuMCwgInJhZGl1cyI6IDEsICJzdHJva2UiOiB0cnVlLCAid2VpZ2h0IjogM30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDRkNWFhYjllZWY5NDI3Mjk0NWI3OTE2YjcyODhjYjApOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzBmNjhhZjFkZWVjYzQwNmFhNWIzNjNkMmE1YzNhMDgxID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF84OWIyYzY2M2NmNmE0NWVlYmFhYjRiYTBmZWM5ZjhiNSA9ICQoYDxkaXYgaWQ9Imh0bWxfODliMmM2NjNjZjZhNDVlZWJhYWI0YmEwZmVjOWY4YjUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkVzY29uZGlkbzwvZGl2PmApWzBdOwogICAgICAgICAgICBwb3B1cF8wZjY4YWYxZGVlY2M0MDZhYTViMzYzZDJhNWMzYTA4MS5zZXRDb250ZW50KGh0bWxfODliMmM2NjNjZjZhNDVlZWJhYWI0YmEwZmVjOWY4YjUpOwogICAgICAgIAoKICAgICAgICBjaXJjbGVfbWFya2VyXzFhM2Y5YzZmZjA0YTQ4ODA4ZGZjZjM2ODNlODIwMDI0LmJpbmRQb3B1cChwb3B1cF8wZjY4YWYxZGVlY2M0MDZhYTViMzYzZDJhNWMzYTA4MSkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYmMwNjU5NWQ5YmNiNGM4YmFjMzQ5ODA2NWQwN2NmYTEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszMi44MzcwNzI3LCAtOTcuMDgxOTU0MV0sCiAgICAgICAgICAgICAgICB7ImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLCAiY29sb3IiOiAiI2ViN2EzNCIsICJkYXNoQXJyYXkiOiBudWxsLCAiZGFzaE9mZnNldCI6IG51bGwsICJmaWxsIjogdHJ1ZSwgImZpbGxDb2xvciI6ICIjZWI3YTM0IiwgImZpbGxPcGFjaXR5IjogMC44LCAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsICJsaW5lQ2FwIjogInJvdW5kIiwgImxpbmVKb2luIjogInJvdW5kIiwgIm9wYWNpdHkiOiAxLjAsICJyYWRpdXMiOiAxLCAic3Ryb2tlIjogdHJ1ZSwgIndlaWdodCI6IDN9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0ZDVhYWI5ZWVmOTQyNzI5NDViNzkxNmI3Mjg4Y2IwKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF9jYzc2MDRiMzE3M2I0ZGZiYThlZTdjNGQ3Y2VhMzBiYSA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfZDcyN2Y0ZTlhZWFhNDE4NTllYmMwMmQ5ZjFkZWY3MzIgPSAkKGA8ZGl2IGlkPSJodG1sX2Q3MjdmNGU5YWVhYTQxODU5ZWJjMDJkOWYxZGVmNzMyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5FdWxlc3M8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfY2M3NjA0YjMxNzNiNGRmYmE4ZWU3YzRkN2NlYTMwYmEuc2V0Q29udGVudChodG1sX2Q3MjdmNGU5YWVhYTQxODU5ZWJjMDJkOWYxZGVmNzMyKTsKICAgICAgICAKCiAgICAgICAgY2lyY2xlX21hcmtlcl9iYzA2NTk1ZDliY2I0YzhiYWMzNDk4MDY1ZDA3Y2ZhMS5iaW5kUG9wdXAocG9wdXBfY2M3NjA0YjMxNzNiNGRmYmE4ZWU3YzRkN2NlYTMwYmEpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2U4YjNlYTcxNGJjYjQ4YTVhOGNjMWVjOTZmMjMzNDJiID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDIuMDQ1MDcyMiwgLTg3LjY4NzY5NjldLAogICAgICAgICAgICAgICAgeyJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwgImNvbG9yIjogIiNlYjdhMzQiLCAiZGFzaEFycmF5IjogbnVsbCwgImRhc2hPZmZzZXQiOiBudWxsLCAiZmlsbCI6IHRydWUsICJmaWxsQ29sb3IiOiAiI2ViN2EzNCIsICJmaWxsT3BhY2l0eSI6IDAuOCwgImZpbGxSdWxlIjogImV2ZW5vZGQiLCAibGluZUNhcCI6ICJyb3VuZCIsICJsaW5lSm9pbiI6ICJyb3VuZCIsICJvcGFjaXR5IjogMS4wLCAicmFkaXVzIjogMSwgInN0cm9rZSI6IHRydWUsICJ3ZWlnaHQiOiAzfQogICAgICAgICAgICApLmFkZFRvKG1hcF80NGQ1YWFiOWVlZjk0MjcyOTQ1Yjc5MTZiNzI4OGNiMCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfNmM4MmM1NGM2NDM0NDZkYWFjNGU3YTk5YWE1YjFlMmQgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sXzY4NzYwZjJkOTZkYjQ0OGViY2M1MWIxZTM0NzQ3MWRiID0gJChgPGRpdiBpZD0iaHRtbF82ODc2MGYyZDk2ZGI0NDhlYmNjNTFiMWUzNDc0NzFkYiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RXZhbnN0b248L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfNmM4MmM1NGM2NDM0NDZkYWFjNGU3YTk5YWE1YjFlMmQuc2V0Q29udGVudChodG1sXzY4NzYwZjJkOTZkYjQ0OGViY2M1MWIxZTM0NzQ3MWRiKTsKICAgICAgICAKCiAgICAgICAgY2lyY2xlX21hcmtlcl9lOGIzZWE3MTRiY2I0OGE1YThjYzFlYzk2ZjIzMzQyYi5iaW5kUG9wdXAocG9wdXBfNmM4MmM1NGM2NDM0NDZkYWFjNGU3YTk5YWE1YjFlMmQpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2U1YTI2NzZkNDE4ZTRhNzY4OTg3NzUzMWEwOGY2Zjk1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzkuMzQ1NDY3MywgLTg0LjU2MDMxODddLAogICAgICAgICAgICAgICAgeyJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwgImNvbG9yIjogIiNlYjdhMzQiLCAiZGFzaEFycmF5IjogbnVsbCwgImRhc2hPZmZzZXQiOiBudWxsLCAiZmlsbCI6IHRydWUsICJmaWxsQ29sb3IiOiAiI2ViN2EzNCIsICJmaWxsT3BhY2l0eSI6IDAuOCwgImZpbGxSdWxlIjogImV2ZW5vZGQiLCAibGluZUNhcCI6ICJyb3VuZCIsICJsaW5lSm9pbiI6ICJyb3VuZCIsICJvcGFjaXR5IjogMS4wLCAicmFkaXVzIjogMSwgInN0cm9rZSI6IHRydWUsICJ3ZWlnaHQiOiAzfQogICAgICAgICAgICApLmFkZFRvKG1hcF80NGQ1YWFiOWVlZjk0MjcyOTQ1Yjc5MTZiNzI4OGNiMCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfODgyMWNlMTMzYWU0NDU1N2FiN2FjZjg2ODZiYWQ0NzAgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sXzdmZDBiMDM3ZDBhODRlOTQ5MTNkMjNlZTRmZmVmZGQ1ID0gJChgPGRpdiBpZD0iaHRtbF83ZmQwYjAzN2QwYTg0ZTk0OTEzZDIzZWU0ZmZlZmRkNSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RmFpcmZpZWxkPC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzg4MjFjZTEzM2FlNDQ1NTdhYjdhY2Y4Njg2YmFkNDcwLnNldENvbnRlbnQoaHRtbF83ZmQwYjAzN2QwYTg0ZTk0OTEzZDIzZWU0ZmZlZmRkNSk7CiAgICAgICAgCgogICAgICAgIGNpcmNsZV9tYXJrZXJfZTVhMjY3NmQ0MThlNGE3Njg5ODc3NTMxYTA4ZjZmOTUuYmluZFBvcHVwKHBvcHVwXzg4MjFjZTEzM2FlNDQ1NTdhYjdhY2Y4Njg2YmFkNDcwKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85YTYzMzgxNmEzOTc0NzM2YWU2YjdjNmE4MmZiNzBlYyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ2Ljg3NzE4NjMsIC05Ni43ODk4MDM0XSwKICAgICAgICAgICAgICAgIHsiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsICJjb2xvciI6ICIjZWI3YTM0IiwgImRhc2hBcnJheSI6IG51bGwsICJkYXNoT2Zmc2V0IjogbnVsbCwgImZpbGwiOiB0cnVlLCAiZmlsbENvbG9yIjogIiNlYjdhMzQiLCAiZmlsbE9wYWNpdHkiOiAwLjgsICJmaWxsUnVsZSI6ICJldmVub2RkIiwgImxpbmVDYXAiOiAicm91bmQiLCAibGluZUpvaW4iOiAicm91bmQiLCAib3BhY2l0eSI6IDEuMCwgInJhZGl1cyI6IDEsICJzdHJva2UiOiB0cnVlLCAid2VpZ2h0IjogM30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDRkNWFhYjllZWY5NDI3Mjk0NWI3OTE2YjcyODhjYjApOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzllMDZkZjVkMzJlMjQ3ZmY4MjY0NmUzNDE0OTEzMGUwID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF8zZmNhZDUzNzk4ZWY0NzI2YjFjYTlmYmQxOTk1MmQxYiA9ICQoYDxkaXYgaWQ9Imh0bWxfM2ZjYWQ1Mzc5OGVmNDcyNmIxY2E5ZmJkMTk5NTJkMWIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkZhcmdvPC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzllMDZkZjVkMzJlMjQ3ZmY4MjY0NmUzNDE0OTEzMGUwLnNldENvbnRlbnQoaHRtbF8zZmNhZDUzNzk4ZWY0NzI2YjFjYTlmYmQxOTk1MmQxYik7CiAgICAgICAgCgogICAgICAgIGNpcmNsZV9tYXJrZXJfOWE2MzM4MTZhMzk3NDczNmFlNmI3YzZhODJmYjcwZWMuYmluZFBvcHVwKHBvcHVwXzllMDZkZjVkMzJlMjQ3ZmY4MjY0NmUzNDE0OTEzMGUwKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lNjdjMTE3M2M3NjA0MjQyYjA5NzI4ZDJkMjk4NGE5OSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM1LjE5ODI4MzYsIC0xMTEuNjUxMzAyXSwKICAgICAgICAgICAgICAgIHsiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsICJjb2xvciI6ICIjZWI3YTM0IiwgImRhc2hBcnJheSI6IG51bGwsICJkYXNoT2Zmc2V0IjogbnVsbCwgImZpbGwiOiB0cnVlLCAiZmlsbENvbG9yIjogIiNlYjdhMzQiLCAiZmlsbE9wYWNpdHkiOiAwLjgsICJmaWxsUnVsZSI6ICJldmVub2RkIiwgImxpbmVDYXAiOiAicm91bmQiLCAibGluZUpvaW4iOiAicm91bmQiLCAib3BhY2l0eSI6IDEuMCwgInJhZGl1cyI6IDEsICJzdHJva2UiOiB0cnVlLCAid2VpZ2h0IjogM30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDRkNWFhYjllZWY5NDI3Mjk0NWI3OTE2YjcyODhjYjApOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzdmNzcxM2E1YTMwNDRiMzJiZTY2N2VjNmIzYmM1MjllID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF8zOTQ4YTYwNzczNWU0MGIwOTBjNzRlYjdiOGM4YTc1YyA9ICQoYDxkaXYgaWQ9Imh0bWxfMzk0OGE2MDc3MzVlNDBiMDkwYzc0ZWI3YjhjOGE3NWMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkZsYWdzdGFmZjwvZGl2PmApWzBdOwogICAgICAgICAgICBwb3B1cF83Zjc3MTNhNWEzMDQ0YjMyYmU2NjdlYzZiM2JjNTI5ZS5zZXRDb250ZW50KGh0bWxfMzk0OGE2MDc3MzVlNDBiMDkwYzc0ZWI3YjhjOGE3NWMpOwogICAgICAgIAoKICAgICAgICBjaXJjbGVfbWFya2VyX2U2N2MxMTczYzc2MDQyNDJiMDk3MjhkMmQyOTg0YTk5LmJpbmRQb3B1cChwb3B1cF83Zjc3MTNhNWEzMDQ0YjMyYmU2NjdlYzZiM2JjNTI5ZSkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMWNkYzI3YmVjNWZkNGU3NDg5MmJmYmQ4Y2I5Mzk0MjYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszOC42Nzc5NTkxLCAtMTIxLjE3NjA1ODNdLAogICAgICAgICAgICAgICAgeyJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwgImNvbG9yIjogIiNlYjdhMzQiLCAiZGFzaEFycmF5IjogbnVsbCwgImRhc2hPZmZzZXQiOiBudWxsLCAiZmlsbCI6IHRydWUsICJmaWxsQ29sb3IiOiAiI2ViN2EzNCIsICJmaWxsT3BhY2l0eSI6IDAuOCwgImZpbGxSdWxlIjogImV2ZW5vZGQiLCAibGluZUNhcCI6ICJyb3VuZCIsICJsaW5lSm9pbiI6ICJyb3VuZCIsICJvcGFjaXR5IjogMS4wLCAicmFkaXVzIjogMSwgInN0cm9rZSI6IHRydWUsICJ3ZWlnaHQiOiAzfQogICAgICAgICAgICApLmFkZFRvKG1hcF80NGQ1YWFiOWVlZjk0MjcyOTQ1Yjc5MTZiNzI4OGNiMCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfODhjZjdmNjBmZWQ1NDA2MWI0OWI1NWUyNDkzMzUzZGMgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sXzg3MjMzOWE2Y2MxMDRmOTJiZDkwNmFkNmNjY2MzZjhhID0gJChgPGRpdiBpZD0iaHRtbF84NzIzMzlhNmNjMTA0ZjkyYmQ5MDZhZDZjY2NjM2Y4YSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Rm9sc29tPC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzg4Y2Y3ZjYwZmVkNTQwNjFiNDliNTVlMjQ5MzM1M2RjLnNldENvbnRlbnQoaHRtbF84NzIzMzlhNmNjMTA0ZjkyYmQ5MDZhZDZjY2NjM2Y4YSk7CiAgICAgICAgCgogICAgICAgIGNpcmNsZV9tYXJrZXJfMWNkYzI3YmVjNWZkNGU3NDg5MmJmYmQ4Y2I5Mzk0MjYuYmluZFBvcHVwKHBvcHVwXzg4Y2Y3ZjYwZmVkNTQwNjFiNDliNTVlMjQ5MzM1M2RjKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9hNjQ2NTEwMjU2MmY0MDVjYmZjYmY3M2Q1NWUxMTc4YSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM1LjM4NTkyNDIsIC05NC4zOTg1NDc1XSwKICAgICAgICAgICAgICAgIHsiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsICJjb2xvciI6ICIjZWI3YTM0IiwgImRhc2hBcnJheSI6IG51bGwsICJkYXNoT2Zmc2V0IjogbnVsbCwgImZpbGwiOiB0cnVlLCAiZmlsbENvbG9yIjogIiNlYjdhMzQiLCAiZmlsbE9wYWNpdHkiOiAwLjgsICJmaWxsUnVsZSI6ICJldmVub2RkIiwgImxpbmVDYXAiOiAicm91bmQiLCAibGluZUpvaW4iOiAicm91bmQiLCAib3BhY2l0eSI6IDEuMCwgInJhZGl1cyI6IDEsICJzdHJva2UiOiB0cnVlLCAid2VpZ2h0IjogM30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDRkNWFhYjllZWY5NDI3Mjk0NWI3OTE2YjcyODhjYjApOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzQzNDU1Y2NmYzIzMzQ3MjZiNjMzZmE0OGYxOGYxYjViID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF83YWU0NzA2MDk0NmQ0NTI5YjA3N2E4ZGQ5MzUyZTcwYSA9ICQoYDxkaXYgaWQ9Imh0bWxfN2FlNDcwNjA5NDZkNDUyOWIwNzdhOGRkOTM1MmU3MGEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkZvcnQgU21pdGg8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfNDM0NTVjY2ZjMjMzNDcyNmI2MzNmYTQ4ZjE4ZjFiNWIuc2V0Q29udGVudChodG1sXzdhZTQ3MDYwOTQ2ZDQ1MjliMDc3YThkZDkzNTJlNzBhKTsKICAgICAgICAKCiAgICAgICAgY2lyY2xlX21hcmtlcl9hNjQ2NTEwMjU2MmY0MDVjYmZjYmY3M2Q1NWUxMTc4YS5iaW5kUG9wdXAocG9wdXBfNDM0NTVjY2ZjMjMzNDcyNmI2MzNmYTQ4ZjE4ZjFiNWIpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzI4ZmQxYzE2ZDk3NjRlNWFiOTFlNWVlZDE0OWVkY2RhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzIuNzU1NDg4MywgLTk3LjMzMDc2NThdLAogICAgICAgICAgICAgICAgeyJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwgImNvbG9yIjogIiNlYjdhMzQiLCAiZGFzaEFycmF5IjogbnVsbCwgImRhc2hPZmZzZXQiOiBudWxsLCAiZmlsbCI6IHRydWUsICJmaWxsQ29sb3IiOiAiI2ViN2EzNCIsICJmaWxsT3BhY2l0eSI6IDAuOCwgImZpbGxSdWxlIjogImV2ZW5vZGQiLCAibGluZUNhcCI6ICJyb3VuZCIsICJsaW5lSm9pbiI6ICJyb3VuZCIsICJvcGFjaXR5IjogMS4wLCAicmFkaXVzIjogMSwgInN0cm9rZSI6IHRydWUsICJ3ZWlnaHQiOiAzfQogICAgICAgICAgICApLmFkZFRvKG1hcF80NGQ1YWFiOWVlZjk0MjcyOTQ1Yjc5MTZiNzI4OGNiMCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfNmZkYTRlNjg2ZmJiNDljMDk3Y2Y4Y2M0ZjQ5ZTZjNDkgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sXzEzY2U0ZjIyMGNkNzQ2NGQ4NmYxMjY2NjYwYWE3YzlmID0gJChgPGRpdiBpZD0iaHRtbF8xM2NlNGYyMjBjZDc0NjRkODZmMTI2NjY2MGFhN2M5ZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Rm9ydCBXb3J0aDwvZGl2PmApWzBdOwogICAgICAgICAgICBwb3B1cF82ZmRhNGU2ODZmYmI0OWMwOTdjZjhjYzRmNDllNmM0OS5zZXRDb250ZW50KGh0bWxfMTNjZTRmMjIwY2Q3NDY0ZDg2ZjEyNjY2NjBhYTdjOWYpOwogICAgICAgIAoKICAgICAgICBjaXJjbGVfbWFya2VyXzI4ZmQxYzE2ZDk3NjRlNWFiOTFlNWVlZDE0OWVkY2RhLmJpbmRQb3B1cChwb3B1cF82ZmRhNGU2ODZmYmI0OWMwOTdjZjhjYzRmNDllNmM0OSkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNTRkMmRmNjRmZmNlNDgxMGE5ZTc1OTM1Yjc2YzhjNTggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNi43NDY4NDIyLCAtMTE5Ljc3MjU4NjhdLAogICAgICAgICAgICAgICAgeyJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwgImNvbG9yIjogIiNlYjdhMzQiLCAiZGFzaEFycmF5IjogbnVsbCwgImRhc2hPZmZzZXQiOiBudWxsLCAiZmlsbCI6IHRydWUsICJmaWxsQ29sb3IiOiAiI2ViN2EzNCIsICJmaWxsT3BhY2l0eSI6IDAuOCwgImZpbGxSdWxlIjogImV2ZW5vZGQiLCAibGluZUNhcCI6ICJyb3VuZCIsICJsaW5lSm9pbiI6ICJyb3VuZCIsICJvcGFjaXR5IjogMS4wLCAicmFkaXVzIjogMSwgInN0cm9rZSI6IHRydWUsICJ3ZWlnaHQiOiAzfQogICAgICAgICAgICApLmFkZFRvKG1hcF80NGQ1YWFiOWVlZjk0MjcyOTQ1Yjc5MTZiNzI4OGNiMCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfZGUzNmYyZDgzZDI1NDY4ZmFkYzg3NTUxMzNlNTc3NzQgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sXzI4MWJiNGEzNGJmODQwNjRhY2Q0YTY0ZTMzOGQ0MWZkID0gJChgPGRpdiBpZD0iaHRtbF8yODFiYjRhMzRiZjg0MDY0YWNkNGE2NGUzMzhkNDFmZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+RnJlc25vPC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwX2RlMzZmMmQ4M2QyNTQ2OGZhZGM4NzU1MTMzZTU3Nzc0LnNldENvbnRlbnQoaHRtbF8yODFiYjRhMzRiZjg0MDY0YWNkNGE2NGUzMzhkNDFmZCk7CiAgICAgICAgCgogICAgICAgIGNpcmNsZV9tYXJrZXJfNTRkMmRmNjRmZmNlNDgxMGE5ZTc1OTM1Yjc2YzhjNTguYmluZFBvcHVwKHBvcHVwX2RlMzZmMmQ4M2QyNTQ2OGZhZGM4NzU1MTMzZTU3Nzc0KQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9hYjA0YjcyOTFkZWI0ZTY2YjdlZjgxMWRhM2E5NzI0YSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzMzLjg4ODM0ODcsIC0xMTguMzA4OTYyNF0sCiAgICAgICAgICAgICAgICB7ImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLCAiY29sb3IiOiAiI2ViN2EzNCIsICJkYXNoQXJyYXkiOiBudWxsLCAiZGFzaE9mZnNldCI6IG51bGwsICJmaWxsIjogdHJ1ZSwgImZpbGxDb2xvciI6ICIjZWI3YTM0IiwgImZpbGxPcGFjaXR5IjogMC44LCAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsICJsaW5lQ2FwIjogInJvdW5kIiwgImxpbmVKb2luIjogInJvdW5kIiwgIm9wYWNpdHkiOiAxLjAsICJyYWRpdXMiOiAxLCAic3Ryb2tlIjogdHJ1ZSwgIndlaWdodCI6IDN9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0ZDVhYWI5ZWVmOTQyNzI5NDViNzkxNmI3Mjg4Y2IwKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF9kMjI2YTgwMzQzZmM0YmI3YjkyMThlMmRiOWY2NzU0NSA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfNjJmYzAzMDg2NGIxNDhhZThiZDM2ZDM4Yzc1ZjNkZmQgPSAkKGA8ZGl2IGlkPSJodG1sXzYyZmMwMzA4NjRiMTQ4YWU4YmQzNmQzOGM3NWYzZGZkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5HYXJkZW5hPC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwX2QyMjZhODAzNDNmYzRiYjdiOTIxOGUyZGI5ZjY3NTQ1LnNldENvbnRlbnQoaHRtbF82MmZjMDMwODY0YjE0OGFlOGJkMzZkMzhjNzVmM2RmZCk7CiAgICAgICAgCgogICAgICAgIGNpcmNsZV9tYXJrZXJfYWIwNGI3MjkxZGViNGU2NmI3ZWY4MTFkYTNhOTcyNGEuYmluZFBvcHVwKHBvcHVwX2QyMjZhODAzNDNmYzRiYjdiOTIxOGUyZGI5ZjY3NTQ1KQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8wNDZhNTg5ODk3MjQ0NGVlYmJmODRkMTc5NWM2YjI0ZiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzMyLjkxMjYyNCwgLTk2LjYzODg4MzNdLAogICAgICAgICAgICAgICAgeyJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwgImNvbG9yIjogIiNlYjdhMzQiLCAiZGFzaEFycmF5IjogbnVsbCwgImRhc2hPZmZzZXQiOiBudWxsLCAiZmlsbCI6IHRydWUsICJmaWxsQ29sb3IiOiAiI2ViN2EzNCIsICJmaWxsT3BhY2l0eSI6IDAuOCwgImZpbGxSdWxlIjogImV2ZW5vZGQiLCAibGluZUNhcCI6ICJyb3VuZCIsICJsaW5lSm9pbiI6ICJyb3VuZCIsICJvcGFjaXR5IjogMS4wLCAicmFkaXVzIjogMSwgInN0cm9rZSI6IHRydWUsICJ3ZWlnaHQiOiAzfQogICAgICAgICAgICApLmFkZFRvKG1hcF80NGQ1YWFiOWVlZjk0MjcyOTQ1Yjc5MTZiNzI4OGNiMCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfYzA5NzA5MTIxMDRjNDcwY2FjMDNiZjk4NzhiNTE2NTkgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sX2ZhMzEwMWI5NzhlODQ0NDBhYmM4ZjA0ZmU1NGZjNTMyID0gJChgPGRpdiBpZD0iaHRtbF9mYTMxMDFiOTc4ZTg0NDQwYWJjOGYwNGZlNTRmYzUzMiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+R2FybGFuZDwvZGl2PmApWzBdOwogICAgICAgICAgICBwb3B1cF9jMDk3MDkxMjEwNGM0NzBjYWMwM2JmOTg3OGI1MTY1OS5zZXRDb250ZW50KGh0bWxfZmEzMTAxYjk3OGU4NDQ0MGFiYzhmMDRmZTU0ZmM1MzIpOwogICAgICAgIAoKICAgICAgICBjaXJjbGVfbWFya2VyXzA0NmE1ODk4OTcyNDQ0ZWViYmY4NGQxNzk1YzZiMjRmLmJpbmRQb3B1cChwb3B1cF9jMDk3MDkxMjEwNGM0NzBjYWMwM2JmOTg3OGI1MTY1OSkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMGE0YzJjNTliMDNkNDU3N2FmNTU1MmRhYzAyOGQxMzYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Mi45NjMzNTk5LCAtODUuNjY4MDg2M10sCiAgICAgICAgICAgICAgICB7ImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLCAiY29sb3IiOiAiI2ViN2EzNCIsICJkYXNoQXJyYXkiOiBudWxsLCAiZGFzaE9mZnNldCI6IG51bGwsICJmaWxsIjogdHJ1ZSwgImZpbGxDb2xvciI6ICIjZWI3YTM0IiwgImZpbGxPcGFjaXR5IjogMC44LCAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsICJsaW5lQ2FwIjogInJvdW5kIiwgImxpbmVKb2luIjogInJvdW5kIiwgIm9wYWNpdHkiOiAxLjAsICJyYWRpdXMiOiAxLCAic3Ryb2tlIjogdHJ1ZSwgIndlaWdodCI6IDN9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0ZDVhYWI5ZWVmOTQyNzI5NDViNzkxNmI3Mjg4Y2IwKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF9jZDg3NDM3Mzg3ZmU0MDJiYTA0ODVmZDg0NmUwNTIxZCA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfYWY1YTYyN2QyNDYxNDFkZmI4NTY5NDM3ODBkNDhlNWUgPSAkKGA8ZGl2IGlkPSJodG1sX2FmNWE2MjdkMjQ2MTQxZGZiODU2OTQzNzgwZDQ4ZTVlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5HcmFuZCBSYXBpZHM8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfY2Q4NzQzNzM4N2ZlNDAyYmEwNDg1ZmQ4NDZlMDUyMWQuc2V0Q29udGVudChodG1sX2FmNWE2MjdkMjQ2MTQxZGZiODU2OTQzNzgwZDQ4ZTVlKTsKICAgICAgICAKCiAgICAgICAgY2lyY2xlX21hcmtlcl8wYTRjMmM1OWIwM2Q0NTc3YWY1NTUyZGFjMDI4ZDEzNi5iaW5kUG9wdXAocG9wdXBfY2Q4NzQzNzM4N2ZlNDAyYmEwNDg1ZmQ4NDZlMDUyMWQpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzAxNzEzYWRiYjc3MzQ1Y2I4ZGJkODkwNjY4MzFhOWMxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDQuNTE5MTU5LCAtODguMDE5ODI2XSwKICAgICAgICAgICAgICAgIHsiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsICJjb2xvciI6ICIjZWI3YTM0IiwgImRhc2hBcnJheSI6IG51bGwsICJkYXNoT2Zmc2V0IjogbnVsbCwgImZpbGwiOiB0cnVlLCAiZmlsbENvbG9yIjogIiNlYjdhMzQiLCAiZmlsbE9wYWNpdHkiOiAwLjgsICJmaWxsUnVsZSI6ICJldmVub2RkIiwgImxpbmVDYXAiOiAicm91bmQiLCAibGluZUpvaW4iOiAicm91bmQiLCAib3BhY2l0eSI6IDEuMCwgInJhZGl1cyI6IDEsICJzdHJva2UiOiB0cnVlLCAid2VpZ2h0IjogM30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDRkNWFhYjllZWY5NDI3Mjk0NWI3OTE2YjcyODhjYjApOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwX2MzMDZjMmZjZWU5MTQ2Nzk5ODEzOTA0MWRmZWYzZjVmID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF8yMzg5ODQwOGRmMDQ0Nzc4ODAwNGM0YWQwMjdhNTE2ZSA9ICQoYDxkaXYgaWQ9Imh0bWxfMjM4OTg0MDhkZjA0NDc3ODgwMDRjNGFkMDI3YTUxNmUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkdyZWVuIEJheTwvZGl2PmApWzBdOwogICAgICAgICAgICBwb3B1cF9jMzA2YzJmY2VlOTE0Njc5OTgxMzkwNDFkZmVmM2Y1Zi5zZXRDb250ZW50KGh0bWxfMjM4OTg0MDhkZjA0NDc3ODgwMDRjNGFkMDI3YTUxNmUpOwogICAgICAgIAoKICAgICAgICBjaXJjbGVfbWFya2VyXzAxNzEzYWRiYjc3MzQ1Y2I4ZGJkODkwNjY4MzFhOWMxLmJpbmRQb3B1cChwb3B1cF9jMzA2YzJmY2VlOTE0Njc5OTgxMzkwNDFkZmVmM2Y1ZikKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNjQ2OTU2ZjlkMTFmNDg5ZmE0NDgwODEwM2M0MmI4ZGQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszOS42NDE3NjI5LCAtNzcuNzE5OTkzMl0sCiAgICAgICAgICAgICAgICB7ImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLCAiY29sb3IiOiAiI2ViN2EzNCIsICJkYXNoQXJyYXkiOiBudWxsLCAiZGFzaE9mZnNldCI6IG51bGwsICJmaWxsIjogdHJ1ZSwgImZpbGxDb2xvciI6ICIjZWI3YTM0IiwgImZpbGxPcGFjaXR5IjogMC44LCAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsICJsaW5lQ2FwIjogInJvdW5kIiwgImxpbmVKb2luIjogInJvdW5kIiwgIm9wYWNpdHkiOiAxLjAsICJyYWRpdXMiOiAxLCAic3Ryb2tlIjogdHJ1ZSwgIndlaWdodCI6IDN9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0ZDVhYWI5ZWVmOTQyNzI5NDViNzkxNmI3Mjg4Y2IwKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF9kOWIyOGE0ZDYxMzU0NzI3OTVhNTNmMDE5MmY4MDhmYiA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfMGYyOTZiZjM4ZWJkNGE3MGI1NzFiNTRjMWEyZmZkYWIgPSAkKGA8ZGl2IGlkPSJodG1sXzBmMjk2YmYzOGViZDRhNzBiNTcxYjU0YzFhMmZmZGFiIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5IYWdlcnN0b3duPC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwX2Q5YjI4YTRkNjEzNTQ3Mjc5NWE1M2YwMTkyZjgwOGZiLnNldENvbnRlbnQoaHRtbF8wZjI5NmJmMzhlYmQ0YTcwYjU3MWI1NGMxYTJmZmRhYik7CiAgICAgICAgCgogICAgICAgIGNpcmNsZV9tYXJrZXJfNjQ2OTU2ZjlkMTFmNDg5ZmE0NDgwODEwM2M0MmI4ZGQuYmluZFBvcHVwKHBvcHVwX2Q5YjI4YTRkNjEzNTQ3Mjc5NWE1M2YwMTkyZjgwOGZiKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl83NDQ3MjIwMjI0OWE0NmYzYTg2MzYwZTIzYzViYzg5OCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzI2LjE5MDYzMDYsIC05Ny42OTYxMDI2XSwKICAgICAgICAgICAgICAgIHsiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsICJjb2xvciI6ICIjZWI3YTM0IiwgImRhc2hBcnJheSI6IG51bGwsICJkYXNoT2Zmc2V0IjogbnVsbCwgImZpbGwiOiB0cnVlLCAiZmlsbENvbG9yIjogIiNlYjdhMzQiLCAiZmlsbE9wYWNpdHkiOiAwLjgsICJmaWxsUnVsZSI6ICJldmVub2RkIiwgImxpbmVDYXAiOiAicm91bmQiLCAibGluZUpvaW4iOiAicm91bmQiLCAib3BhY2l0eSI6IDEuMCwgInJhZGl1cyI6IDEsICJzdHJva2UiOiB0cnVlLCAid2VpZ2h0IjogM30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDRkNWFhYjllZWY5NDI3Mjk0NWI3OTE2YjcyODhjYjApOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzliMTgzNDQ5M2MyMjQ1MjRhNmJjM2JlYzc5ODNiOGE1ID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF9lYzZlM2ExNTlmMWQ0ODc3OGEzMDBhMTIxYzIyMDc5ZiA9ICQoYDxkaXYgaWQ9Imh0bWxfZWM2ZTNhMTU5ZjFkNDg3NzhhMzAwYTEyMWMyMjA3OWYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkhhcmxpbmdlbjwvZGl2PmApWzBdOwogICAgICAgICAgICBwb3B1cF85YjE4MzQ0OTNjMjI0NTI0YTZiYzNiZWM3OTgzYjhhNS5zZXRDb250ZW50KGh0bWxfZWM2ZTNhMTU5ZjFkNDg3NzhhMzAwYTEyMWMyMjA3OWYpOwogICAgICAgIAoKICAgICAgICBjaXJjbGVfbWFya2VyXzc0NDcyMjAyMjQ5YTQ2ZjNhODYzNjBlMjNjNWJjODk4LmJpbmRQb3B1cChwb3B1cF85YjE4MzQ0OTNjMjI0NTI0YTZiYzNiZWM3OTgzYjhhNSkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNGIxODY5YmVlMTVmNDhjNWI5ODQ4Zjc3Nzc0ZDFjZTAgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNi4wMzk1MjQ3LCAtMTE0Ljk4MTcyMTNdLAogICAgICAgICAgICAgICAgeyJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwgImNvbG9yIjogIiNlYjdhMzQiLCAiZGFzaEFycmF5IjogbnVsbCwgImRhc2hPZmZzZXQiOiBudWxsLCAiZmlsbCI6IHRydWUsICJmaWxsQ29sb3IiOiAiI2ViN2EzNCIsICJmaWxsT3BhY2l0eSI6IDAuOCwgImZpbGxSdWxlIjogImV2ZW5vZGQiLCAibGluZUNhcCI6ICJyb3VuZCIsICJsaW5lSm9pbiI6ICJyb3VuZCIsICJvcGFjaXR5IjogMS4wLCAicmFkaXVzIjogMSwgInN0cm9rZSI6IHRydWUsICJ3ZWlnaHQiOiAzfQogICAgICAgICAgICApLmFkZFRvKG1hcF80NGQ1YWFiOWVlZjk0MjcyOTQ1Yjc5MTZiNzI4OGNiMCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfZjVlODUyZGZjNzY4NDg2YzhkNTFkMTZlZmVlZTliMjggPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sXzFmOGJjMjI2ZGE5MDRkYWRhOTBhMjAxYTQ3NGM2NmQ3ID0gJChgPGRpdiBpZD0iaHRtbF8xZjhiYzIyNmRhOTA0ZGFkYTkwYTIwMWE0NzRjNjZkNyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+SGVuZGVyc29uPC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwX2Y1ZTg1MmRmYzc2ODQ4NmM4ZDUxZDE2ZWZlZWU5YjI4LnNldENvbnRlbnQoaHRtbF8xZjhiYzIyNmRhOTA0ZGFkYTkwYTIwMWE0NzRjNjZkNyk7CiAgICAgICAgCgogICAgICAgIGNpcmNsZV9tYXJrZXJfNGIxODY5YmVlMTVmNDhjNWI5ODQ4Zjc3Nzc0ZDFjZTAuYmluZFBvcHVwKHBvcHVwX2Y1ZTg1MmRmYzc2ODQ4NmM4ZDUxZDE2ZWZlZWU5YjI4KQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9iNjA5ZDA2NTZkYjU0YzE1OWM2MDQ5YWM2YzUwZGFiNyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ1LjUyMjg5MzksIC0xMjIuOTg5ODI3XSwKICAgICAgICAgICAgICAgIHsiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsICJjb2xvciI6ICIjZWI3YTM0IiwgImRhc2hBcnJheSI6IG51bGwsICJkYXNoT2Zmc2V0IjogbnVsbCwgImZpbGwiOiB0cnVlLCAiZmlsbENvbG9yIjogIiNlYjdhMzQiLCAiZmlsbE9wYWNpdHkiOiAwLjgsICJmaWxsUnVsZSI6ICJldmVub2RkIiwgImxpbmVDYXAiOiAicm91bmQiLCAibGluZUpvaW4iOiAicm91bmQiLCAib3BhY2l0eSI6IDEuMCwgInJhZGl1cyI6IDEsICJzdHJva2UiOiB0cnVlLCAid2VpZ2h0IjogM30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDRkNWFhYjllZWY5NDI3Mjk0NWI3OTE2YjcyODhjYjApOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwX2M3NDJlODFkY2Y3NzRkOGQ4NWIzOWJjYTY1NjVkNTMyID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF83Y2UwMzUxMmY0YjM0NWY0OWIyNjYwYzI0NzhlMWJkYyA9ICQoYDxkaXYgaWQ9Imh0bWxfN2NlMDM1MTJmNGIzNDVmNDliMjY2MGMyNDc4ZTFiZGMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkhpbGxzYm9ybzwvZGl2PmApWzBdOwogICAgICAgICAgICBwb3B1cF9jNzQyZTgxZGNmNzc0ZDhkODViMzliY2E2NTY1ZDUzMi5zZXRDb250ZW50KGh0bWxfN2NlMDM1MTJmNGIzNDVmNDliMjY2MGMyNDc4ZTFiZGMpOwogICAgICAgIAoKICAgICAgICBjaXJjbGVfbWFya2VyX2I2MDlkMDY1NmRiNTRjMTU5YzYwNDlhYzZjNTBkYWI3LmJpbmRQb3B1cChwb3B1cF9jNzQyZTgxZGNmNzc0ZDhkODViMzliY2E2NTY1ZDUzMikKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYzMzZjE5ZTI3NmZkNDBkNThkMTA0NDMxOGRlY2MyNDEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Mi4yMDQyNTg2LCAtNzIuNjE2MjAwOV0sCiAgICAgICAgICAgICAgICB7ImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLCAiY29sb3IiOiAiI2ViN2EzNCIsICJkYXNoQXJyYXkiOiBudWxsLCAiZGFzaE9mZnNldCI6IG51bGwsICJmaWxsIjogdHJ1ZSwgImZpbGxDb2xvciI6ICIjZWI3YTM0IiwgImZpbGxPcGFjaXR5IjogMC44LCAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsICJsaW5lQ2FwIjogInJvdW5kIiwgImxpbmVKb2luIjogInJvdW5kIiwgIm9wYWNpdHkiOiAxLjAsICJyYWRpdXMiOiAxLCAic3Ryb2tlIjogdHJ1ZSwgIndlaWdodCI6IDN9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0ZDVhYWI5ZWVmOTQyNzI5NDViNzkxNmI3Mjg4Y2IwKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF9kNTZlMTc0MTQ2M2M0YzRiYjlhMDZmM2JlZGEyZmMyMSA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfNzFiODljMzMzNzg0NDk1Zjg4NTY3ZmMyNDE4NzM2YjkgPSAkKGA8ZGl2IGlkPSJodG1sXzcxYjg5YzMzMzc4NDQ5NWY4ODU2N2ZjMjQxODczNmI5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Ib2x5b2tlPC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwX2Q1NmUxNzQxNDYzYzRjNGJiOWEwNmYzYmVkYTJmYzIxLnNldENvbnRlbnQoaHRtbF83MWI4OWMzMzM3ODQ0OTVmODg1NjdmYzI0MTg3MzZiOSk7CiAgICAgICAgCgogICAgICAgIGNpcmNsZV9tYXJrZXJfYzMzZjE5ZTI3NmZkNDBkNThkMTA0NDMxOGRlY2MyNDEuYmluZFBvcHVwKHBvcHVwX2Q1NmUxNzQxNDYzYzRjNGJiOWEwNmYzYmVkYTJmYzIxKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8zNmU4NTBkNDNjZmU0MDYwOTUxYmUyZTIwMmUzYzRjYyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzIxLjMwNjk0NDQsIC0xNTcuODU4MzMzM10sCiAgICAgICAgICAgICAgICB7ImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLCAiY29sb3IiOiAiI2ViN2EzNCIsICJkYXNoQXJyYXkiOiBudWxsLCAiZGFzaE9mZnNldCI6IG51bGwsICJmaWxsIjogdHJ1ZSwgImZpbGxDb2xvciI6ICIjZWI3YTM0IiwgImZpbGxPcGFjaXR5IjogMC44LCAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsICJsaW5lQ2FwIjogInJvdW5kIiwgImxpbmVKb2luIjogInJvdW5kIiwgIm9wYWNpdHkiOiAxLjAsICJyYWRpdXMiOiAxLCAic3Ryb2tlIjogdHJ1ZSwgIndlaWdodCI6IDN9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0ZDVhYWI5ZWVmOTQyNzI5NDViNzkxNmI3Mjg4Y2IwKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF8zMTk5YzljMTU3OWU0MzQyYjA3OWZiMWUwZWZkYjRkNyA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfODhkYWI4NDkzMGM4NDhmNzljYmVkZmM3Y2QwZjQ5ZmEgPSAkKGA8ZGl2IGlkPSJodG1sXzg4ZGFiODQ5MzBjODQ4Zjc5Y2JlZGZjN2NkMGY0OWZhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Ib25vbHVsdTwvZGl2PmApWzBdOwogICAgICAgICAgICBwb3B1cF8zMTk5YzljMTU3OWU0MzQyYjA3OWZiMWUwZWZkYjRkNy5zZXRDb250ZW50KGh0bWxfODhkYWI4NDkzMGM4NDhmNzljYmVkZmM3Y2QwZjQ5ZmEpOwogICAgICAgIAoKICAgICAgICBjaXJjbGVfbWFya2VyXzM2ZTg1MGQ0M2NmZTQwNjA5NTFiZTJlMjAyZTNjNGNjLmJpbmRQb3B1cChwb3B1cF8zMTk5YzljMTU3OWU0MzQyYjA3OWZiMWUwZWZkYjRkNykKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNGQ5ZTU3ZjhiMzhlNDNiOWJlMWY1YjlhNWJhOTZmYTggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFsyOS43NjA0MjY3LCAtOTUuMzY5ODAyOF0sCiAgICAgICAgICAgICAgICB7ImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLCAiY29sb3IiOiAiI2ViN2EzNCIsICJkYXNoQXJyYXkiOiBudWxsLCAiZGFzaE9mZnNldCI6IG51bGwsICJmaWxsIjogdHJ1ZSwgImZpbGxDb2xvciI6ICIjZWI3YTM0IiwgImZpbGxPcGFjaXR5IjogMC44LCAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsICJsaW5lQ2FwIjogInJvdW5kIiwgImxpbmVKb2luIjogInJvdW5kIiwgIm9wYWNpdHkiOiAxLjAsICJyYWRpdXMiOiA1LCAic3Ryb2tlIjogdHJ1ZSwgIndlaWdodCI6IDN9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0ZDVhYWI5ZWVmOTQyNzI5NDViNzkxNmI3Mjg4Y2IwKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF82MjhiZWEwMjk0Yjg0M2Q1OGM1ZGQ0MWRjNTBjOTljMyA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfYmZiODZjMjU4NGU2NDFjMjgxMjRkYjM3YzIyYWQ1OGEgPSAkKGA8ZGl2IGlkPSJodG1sX2JmYjg2YzI1ODRlNjQxYzI4MTI0ZGIzN2MyMmFkNThhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Ib3VzdG9uPC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzYyOGJlYTAyOTRiODQzZDU4YzVkZDQxZGM1MGM5OWMzLnNldENvbnRlbnQoaHRtbF9iZmI4NmMyNTg0ZTY0MWMyODEyNGRiMzdjMjJhZDU4YSk7CiAgICAgICAgCgogICAgICAgIGNpcmNsZV9tYXJrZXJfNGQ5ZTU3ZjhiMzhlNDNiOWJlMWY1YjlhNWJhOTZmYTguYmluZFBvcHVwKHBvcHVwXzYyOGJlYTAyOTRiODQzZDU4YzVkZDQxZGM1MGM5OWMzKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl82YjgyMTU4MzdmNjk0YTA3OTllNzgyMTk0NDBkYmQxMiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM5Ljc2ODQwMywgLTg2LjE1ODA2OF0sCiAgICAgICAgICAgICAgICB7ImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLCAiY29sb3IiOiAiI2ViN2EzNCIsICJkYXNoQXJyYXkiOiBudWxsLCAiZGFzaE9mZnNldCI6IG51bGwsICJmaWxsIjogdHJ1ZSwgImZpbGxDb2xvciI6ICIjZWI3YTM0IiwgImZpbGxPcGFjaXR5IjogMC44LCAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsICJsaW5lQ2FwIjogInJvdW5kIiwgImxpbmVKb2luIjogInJvdW5kIiwgIm9wYWNpdHkiOiAxLjAsICJyYWRpdXMiOiAzLCAic3Ryb2tlIjogdHJ1ZSwgIndlaWdodCI6IDN9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0ZDVhYWI5ZWVmOTQyNzI5NDViNzkxNmI3Mjg4Y2IwKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF80ZTBkYjJlNzQ1ZTc0MDAxYWRhYzE4ODkxMDQyYjM3NyA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfZGYxZmY3YjcxYWYzNGM1ZmIzYjQxYmYyNDViMjk3NWUgPSAkKGA8ZGl2IGlkPSJodG1sX2RmMWZmN2I3MWFmMzRjNWZiM2I0MWJmMjQ1YjI5NzVlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5JbmRpYW5hcG9saXM8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfNGUwZGIyZTc0NWU3NDAwMWFkYWMxODg5MTA0MmIzNzcuc2V0Q29udGVudChodG1sX2RmMWZmN2I3MWFmMzRjNWZiM2I0MWJmMjQ1YjI5NzVlKTsKICAgICAgICAKCiAgICAgICAgY2lyY2xlX21hcmtlcl82YjgyMTU4MzdmNjk0YTA3OTllNzgyMTk0NDBkYmQxMi5iaW5kUG9wdXAocG9wdXBfNGUwZGIyZTc0NWU3NDAwMWFkYWMxODg5MTA0MmIzNzcpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2Y0OGRmZTMxMGVkYTQ0YTM4MDJlOWVhZWM1MTIzNmQwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzMuNzIwNTc3MSwgLTExNi4yMTU1NjE5XSwKICAgICAgICAgICAgICAgIHsiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsICJjb2xvciI6ICIjZWI3YTM0IiwgImRhc2hBcnJheSI6IG51bGwsICJkYXNoT2Zmc2V0IjogbnVsbCwgImZpbGwiOiB0cnVlLCAiZmlsbENvbG9yIjogIiNlYjdhMzQiLCAiZmlsbE9wYWNpdHkiOiAwLjgsICJmaWxsUnVsZSI6ICJldmVub2RkIiwgImxpbmVDYXAiOiAicm91bmQiLCAibGluZUpvaW4iOiAicm91bmQiLCAib3BhY2l0eSI6IDEuMCwgInJhZGl1cyI6IDEsICJzdHJva2UiOiB0cnVlLCAid2VpZ2h0IjogM30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDRkNWFhYjllZWY5NDI3Mjk0NWI3OTE2YjcyODhjYjApOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzhiYzg5YjQxOTE3ZjQ0YWM4NjNhZmE2NWE3NGQzMWNkID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF83ZDFlMWUzZmU1YjU0NjFkYmQ1NDNiMjczY2I2Yjc1MyA9ICQoYDxkaXYgaWQ9Imh0bWxfN2QxZTFlM2ZlNWI1NDYxZGJkNTQzYjI3M2NiNmI3NTMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkluZGlvPC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzhiYzg5YjQxOTE3ZjQ0YWM4NjNhZmE2NWE3NGQzMWNkLnNldENvbnRlbnQoaHRtbF83ZDFlMWUzZmU1YjU0NjFkYmQ1NDNiMjczY2I2Yjc1Myk7CiAgICAgICAgCgogICAgICAgIGNpcmNsZV9tYXJrZXJfZjQ4ZGZlMzEwZWRhNDRhMzgwMmU5ZWFlYzUxMjM2ZDAuYmluZFBvcHVwKHBvcHVwXzhiYzg5YjQxOTE3ZjQ0YWM4NjNhZmE2NWE3NGQzMWNkKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85NDhmMTUzZWJiYmU0NTQ0YjcxY2MwZGRhOWM4ZjhiNiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQxLjY2MTEyNzcsIC05MS41MzAxNjgzXSwKICAgICAgICAgICAgICAgIHsiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsICJjb2xvciI6ICIjZWI3YTM0IiwgImRhc2hBcnJheSI6IG51bGwsICJkYXNoT2Zmc2V0IjogbnVsbCwgImZpbGwiOiB0cnVlLCAiZmlsbENvbG9yIjogIiNlYjdhMzQiLCAiZmlsbE9wYWNpdHkiOiAwLjgsICJmaWxsUnVsZSI6ICJldmVub2RkIiwgImxpbmVDYXAiOiAicm91bmQiLCAibGluZUpvaW4iOiAicm91bmQiLCAib3BhY2l0eSI6IDEuMCwgInJhZGl1cyI6IDEsICJzdHJva2UiOiB0cnVlLCAid2VpZ2h0IjogM30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDRkNWFhYjllZWY5NDI3Mjk0NWI3OTE2YjcyODhjYjApOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzc3OWU0YWI1YmViOTRlOTI5MTBlYWRmYjg3ZjM3NzRhID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF9jOTY4YzVjMTI3YmU0ZDZiYTg2MzE2YmQ0MDYwMzAyZSA9ICQoYDxkaXYgaWQ9Imh0bWxfYzk2OGM1YzEyN2JlNGQ2YmE4NjMxNmJkNDA2MDMwMmUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPklvd2EgQ2l0eTwvZGl2PmApWzBdOwogICAgICAgICAgICBwb3B1cF83NzllNGFiNWJlYjk0ZTkyOTEwZWFkZmI4N2YzNzc0YS5zZXRDb250ZW50KGh0bWxfYzk2OGM1YzEyN2JlNGQ2YmE4NjMxNmJkNDA2MDMwMmUpOwogICAgICAgIAoKICAgICAgICBjaXJjbGVfbWFya2VyXzk0OGYxNTNlYmJiZTQ1NDRiNzFjYzBkZGE5YzhmOGI2LmJpbmRQb3B1cChwb3B1cF83NzllNGFiNWJlYjk0ZTkyOTEwZWFkZmI4N2YzNzc0YSkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZmEzZTdkOWRkNmQzNDE5NjhkZmMxODE5YTlmZTY1ZTggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszMi44MTQwMTc3LCAtOTYuOTQ4ODk0NV0sCiAgICAgICAgICAgICAgICB7ImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLCAiY29sb3IiOiAiI2ViN2EzNCIsICJkYXNoQXJyYXkiOiBudWxsLCAiZGFzaE9mZnNldCI6IG51bGwsICJmaWxsIjogdHJ1ZSwgImZpbGxDb2xvciI6ICIjZWI3YTM0IiwgImZpbGxPcGFjaXR5IjogMC44LCAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsICJsaW5lQ2FwIjogInJvdW5kIiwgImxpbmVKb2luIjogInJvdW5kIiwgIm9wYWNpdHkiOiAxLjAsICJyYWRpdXMiOiAxLCAic3Ryb2tlIjogdHJ1ZSwgIndlaWdodCI6IDN9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0ZDVhYWI5ZWVmOTQyNzI5NDViNzkxNmI3Mjg4Y2IwKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF9lOTc1OWYzMjZkNzM0YTA3YjAzMzU2YjI2YmFhMTEwNSA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfZDRlODI0ZThlOGZhNDEyNDg3NjgxOWI0ZWU0ZjYxYjEgPSAkKGA8ZGl2IGlkPSJodG1sX2Q0ZTgyNGU4ZThmYTQxMjQ4NzY4MTliNGVlNGY2MWIxIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5JcnZpbmc8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfZTk3NTlmMzI2ZDczNGEwN2IwMzM1NmIyNmJhYTExMDUuc2V0Q29udGVudChodG1sX2Q0ZTgyNGU4ZThmYTQxMjQ4NzY4MTliNGVlNGY2MWIxKTsKICAgICAgICAKCiAgICAgICAgY2lyY2xlX21hcmtlcl9mYTNlN2Q5ZGQ2ZDM0MTk2OGRmYzE4MTlhOWZlNjVlOC5iaW5kUG9wdXAocG9wdXBfZTk3NTlmMzI2ZDczNGEwN2IwMzM1NmIyNmJhYTExMDUpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2Y0YmYxMWE2ZGEzZjRlNTc5NmU1MGMyNTQ0M2Y5YjNkID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzAuMzMyMTgzOCwgLTgxLjY1NTY1MV0sCiAgICAgICAgICAgICAgICB7ImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLCAiY29sb3IiOiAiI2ViN2EzNCIsICJkYXNoQXJyYXkiOiBudWxsLCAiZGFzaE9mZnNldCI6IG51bGwsICJmaWxsIjogdHJ1ZSwgImZpbGxDb2xvciI6ICIjZWI3YTM0IiwgImZpbGxPcGFjaXR5IjogMC44LCAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsICJsaW5lQ2FwIjogInJvdW5kIiwgImxpbmVKb2luIjogInJvdW5kIiwgIm9wYWNpdHkiOiAxLjAsICJyYWRpdXMiOiAyLCAic3Ryb2tlIjogdHJ1ZSwgIndlaWdodCI6IDN9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0ZDVhYWI5ZWVmOTQyNzI5NDViNzkxNmI3Mjg4Y2IwKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF9kOGU0YTBiN2IwMWE0N2JlYmEyMjE2YmEyMjM0OTM3NCA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfM2IyM2IzZWQ3MThhNDdiM2EyNjFiMWNlYmZlYWMxNDIgPSAkKGA8ZGl2IGlkPSJodG1sXzNiMjNiM2VkNzE4YTQ3YjNhMjYxYjFjZWJmZWFjMTQyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5KYWNrc29udmlsbGU8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfZDhlNGEwYjdiMDFhNDdiZWJhMjIxNmJhMjIzNDkzNzQuc2V0Q29udGVudChodG1sXzNiMjNiM2VkNzE4YTQ3YjNhMjYxYjFjZWJmZWFjMTQyKTsKICAgICAgICAKCiAgICAgICAgY2lyY2xlX21hcmtlcl9mNGJmMTFhNmRhM2Y0ZTU3OTZlNTBjMjU0NDNmOWIzZC5iaW5kUG9wdXAocG9wdXBfZDhlNGEwYjdiMDFhNDdiZWJhMjIxNmJhMjIzNDkzNzQpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzcxMDE5MzE1MDgzMTRjY2Y4MzM5MjA0ODcwOWI1NWI5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzguNTc2NzAxNywgLTkyLjE3MzUxNjRdLAogICAgICAgICAgICAgICAgeyJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwgImNvbG9yIjogIiNlYjdhMzQiLCAiZGFzaEFycmF5IjogbnVsbCwgImRhc2hPZmZzZXQiOiBudWxsLCAiZmlsbCI6IHRydWUsICJmaWxsQ29sb3IiOiAiI2ViN2EzNCIsICJmaWxsT3BhY2l0eSI6IDAuOCwgImZpbGxSdWxlIjogImV2ZW5vZGQiLCAibGluZUNhcCI6ICJyb3VuZCIsICJsaW5lSm9pbiI6ICJyb3VuZCIsICJvcGFjaXR5IjogMS4wLCAicmFkaXVzIjogMSwgInN0cm9rZSI6IHRydWUsICJ3ZWlnaHQiOiAzfQogICAgICAgICAgICApLmFkZFRvKG1hcF80NGQ1YWFiOWVlZjk0MjcyOTQ1Yjc5MTZiNzI4OGNiMCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfMzcwMzY4ZDdhZTc1NGJmYzgzYTBhNzI0MzI3MTViOTEgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sXzc4OTQxYzQ5YzEwMTQ2NTQ4YTA0MTAzNTM0ZGRhYWEzID0gJChgPGRpdiBpZD0iaHRtbF83ODk0MWM0OWMxMDE0NjU0OGEwNDEwMzUzNGRkYWFhMyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+SmVmZmVyc29uIENpdHk8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfMzcwMzY4ZDdhZTc1NGJmYzgzYTBhNzI0MzI3MTViOTEuc2V0Q29udGVudChodG1sXzc4OTQxYzQ5YzEwMTQ2NTQ4YTA0MTAzNTM0ZGRhYWEzKTsKICAgICAgICAKCiAgICAgICAgY2lyY2xlX21hcmtlcl83MTAxOTMxNTA4MzE0Y2NmODMzOTIwNDg3MDliNTViOS5iaW5kUG9wdXAocG9wdXBfMzcwMzY4ZDdhZTc1NGJmYzgzYTBhNzI0MzI3MTViOTEpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2JhMTViMTEwZmFjNzQzOTlhM2RjYzExZmEwYTQ1NDhjID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzI4MTU3NSwgLTc0LjA3NzY0MTddLAogICAgICAgICAgICAgICAgeyJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwgImNvbG9yIjogIiNlYjdhMzQiLCAiZGFzaEFycmF5IjogbnVsbCwgImRhc2hPZmZzZXQiOiBudWxsLCAiZmlsbCI6IHRydWUsICJmaWxsQ29sb3IiOiAiI2ViN2EzNCIsICJmaWxsT3BhY2l0eSI6IDAuOCwgImZpbGxSdWxlIjogImV2ZW5vZGQiLCAibGluZUNhcCI6ICJyb3VuZCIsICJsaW5lSm9pbiI6ICJyb3VuZCIsICJvcGFjaXR5IjogMS4wLCAicmFkaXVzIjogMSwgInN0cm9rZSI6IHRydWUsICJ3ZWlnaHQiOiAzfQogICAgICAgICAgICApLmFkZFRvKG1hcF80NGQ1YWFiOWVlZjk0MjcyOTQ1Yjc5MTZiNzI4OGNiMCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfNGQ0MTI4ZTYwNGQxNDhmZDkwZTg1NjQ0MDQ2OGVjYjUgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sXzY0NWI4ZTk5NWQyNzQ2ZWFhYTgyNGMzYTk4NzBhOGIwID0gJChgPGRpdiBpZD0iaHRtbF82NDViOGU5OTVkMjc0NmVhYWE4MjRjM2E5ODcwYThiMCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+SmVyc2V5IENpdHk8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfNGQ0MTI4ZTYwNGQxNDhmZDkwZTg1NjQ0MDQ2OGVjYjUuc2V0Q29udGVudChodG1sXzY0NWI4ZTk5NWQyNzQ2ZWFhYTgyNGMzYTk4NzBhOGIwKTsKICAgICAgICAKCiAgICAgICAgY2lyY2xlX21hcmtlcl9iYTE1YjExMGZhYzc0Mzk5YTNkY2MxMWZhMGE0NTQ4Yy5iaW5kUG9wdXAocG9wdXBfNGQ0MTI4ZTYwNGQxNDhmZDkwZTg1NjQ0MDQ2OGVjYjUpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzNjNGE1N2ZmZmY0YzQ0Yjg5NWM2Yjc0YTJhZDQyNzI4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzkuMDk5NzI2NSwgLTk0LjU3ODU2NjddLAogICAgICAgICAgICAgICAgeyJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwgImNvbG9yIjogIiNlYjdhMzQiLCAiZGFzaEFycmF5IjogbnVsbCwgImRhc2hPZmZzZXQiOiBudWxsLCAiZmlsbCI6IHRydWUsICJmaWxsQ29sb3IiOiAiI2ViN2EzNCIsICJmaWxsT3BhY2l0eSI6IDAuOCwgImZpbGxSdWxlIjogImV2ZW5vZGQiLCAibGluZUNhcCI6ICJyb3VuZCIsICJsaW5lSm9pbiI6ICJyb3VuZCIsICJvcGFjaXR5IjogMS4wLCAicmFkaXVzIjogMSwgInN0cm9rZSI6IHRydWUsICJ3ZWlnaHQiOiAzfQogICAgICAgICAgICApLmFkZFRvKG1hcF80NGQ1YWFiOWVlZjk0MjcyOTQ1Yjc5MTZiNzI4OGNiMCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfOTVkMmNmZWYxZTY2NDNiMzhkMjBlMzFiMDczMzgxMTAgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sXzJlYmMyN2FlZWI1NDQ2MDdhYTM5YTVjZTFmZWIwOTcwID0gJChgPGRpdiBpZD0iaHRtbF8yZWJjMjdhZWViNTQ0NjA3YWEzOWE1Y2UxZmViMDk3MCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+S2Fuc2FzIENpdHk8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfOTVkMmNmZWYxZTY2NDNiMzhkMjBlMzFiMDczMzgxMTAuc2V0Q29udGVudChodG1sXzJlYmMyN2FlZWI1NDQ2MDdhYTM5YTVjZTFmZWIwOTcwKTsKICAgICAgICAKCiAgICAgICAgY2lyY2xlX21hcmtlcl8zYzRhNTdmZmZmNGM0NGI4OTVjNmI3NGEyYWQ0MjcyOC5iaW5kUG9wdXAocG9wdXBfOTVkMmNmZWYxZTY2NDNiMzhkMjBlMzFiMDczMzgxMTApCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzRlMDE3MmQ4MDVhZjRhNTJhN2Q5NjFhYzE5ZmY4NTA4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDIuODY5NDczMSwgLTg1LjY0NDc0OTJdLAogICAgICAgICAgICAgICAgeyJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwgImNvbG9yIjogIiNlYjdhMzQiLCAiZGFzaEFycmF5IjogbnVsbCwgImRhc2hPZmZzZXQiOiBudWxsLCAiZmlsbCI6IHRydWUsICJmaWxsQ29sb3IiOiAiI2ViN2EzNCIsICJmaWxsT3BhY2l0eSI6IDAuOCwgImZpbGxSdWxlIjogImV2ZW5vZGQiLCAibGluZUNhcCI6ICJyb3VuZCIsICJsaW5lSm9pbiI6ICJyb3VuZCIsICJvcGFjaXR5IjogMS4wLCAicmFkaXVzIjogMSwgInN0cm9rZSI6IHRydWUsICJ3ZWlnaHQiOiAzfQogICAgICAgICAgICApLmFkZFRvKG1hcF80NGQ1YWFiOWVlZjk0MjcyOTQ1Yjc5MTZiNzI4OGNiMCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfZDgzN2M0OTA1ZTZkNDBlZTk3ZGUxNmEwMmZjNGJmMzAgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sX2Y0ZWVmOTlkM2Y5MzRkMjJiYTUzZGE2NDdkYmE2YTdkID0gJChgPGRpdiBpZD0iaHRtbF9mNGVlZjk5ZDNmOTM0ZDIyYmE1M2RhNjQ3ZGJhNmE3ZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+S2VudHdvb2Q8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfZDgzN2M0OTA1ZTZkNDBlZTk3ZGUxNmEwMmZjNGJmMzAuc2V0Q29udGVudChodG1sX2Y0ZWVmOTlkM2Y5MzRkMjJiYTUzZGE2NDdkYmE2YTdkKTsKICAgICAgICAKCiAgICAgICAgY2lyY2xlX21hcmtlcl80ZTAxNzJkODA1YWY0YTUyYTdkOTYxYWMxOWZmODUwOC5iaW5kUG9wdXAocG9wdXBfZDgzN2M0OTA1ZTZkNDBlZTk3ZGUxNmEwMmZjNGJmMzApCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzFlMzUyODgyMjI1MTQyYzhiZGY2MzlkNjg0MjUyZjQzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzEuMTE3MTE5NCwgLTk3LjcyNzc5NTldLAogICAgICAgICAgICAgICAgeyJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwgImNvbG9yIjogIiNlYjdhMzQiLCAiZGFzaEFycmF5IjogbnVsbCwgImRhc2hPZmZzZXQiOiBudWxsLCAiZmlsbCI6IHRydWUsICJmaWxsQ29sb3IiOiAiI2ViN2EzNCIsICJmaWxsT3BhY2l0eSI6IDAuOCwgImZpbGxSdWxlIjogImV2ZW5vZGQiLCAibGluZUNhcCI6ICJyb3VuZCIsICJsaW5lSm9pbiI6ICJyb3VuZCIsICJvcGFjaXR5IjogMS4wLCAicmFkaXVzIjogMSwgInN0cm9rZSI6IHRydWUsICJ3ZWlnaHQiOiAzfQogICAgICAgICAgICApLmFkZFRvKG1hcF80NGQ1YWFiOWVlZjk0MjcyOTQ1Yjc5MTZiNzI4OGNiMCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfZjE5NDFmYThiNzU4NDE3OGFiOTI4N2JiYzRlMDkwYTMgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sXzEyMjYzZGVjODVjYzQ1YTE4ODM1YjY0MWM4Zjk2N2U2ID0gJChgPGRpdiBpZD0iaHRtbF8xMjI2M2RlYzg1Y2M0NWExODgzNWI2NDFjOGY5NjdlNiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+S2lsbGVlbjwvZGl2PmApWzBdOwogICAgICAgICAgICBwb3B1cF9mMTk0MWZhOGI3NTg0MTc4YWI5Mjg3YmJjNGUwOTBhMy5zZXRDb250ZW50KGh0bWxfMTIyNjNkZWM4NWNjNDVhMTg4MzViNjQxYzhmOTY3ZTYpOwogICAgICAgIAoKICAgICAgICBjaXJjbGVfbWFya2VyXzFlMzUyODgyMjI1MTQyYzhiZGY2MzlkNjg0MjUyZjQzLmJpbmRQb3B1cChwb3B1cF9mMTk0MWZhOGI3NTg0MTc4YWI5Mjg3YmJjNGUwOTBhMykKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMDkwYTcyOGQxOGRiNGQ2YWE2MjAwOTk0Mjk3NzY3MTAgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNS45NjA2Mzg0LCAtODMuOTIwNzM5Ml0sCiAgICAgICAgICAgICAgICB7ImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLCAiY29sb3IiOiAiI2ViN2EzNCIsICJkYXNoQXJyYXkiOiBudWxsLCAiZGFzaE9mZnNldCI6IG51bGwsICJmaWxsIjogdHJ1ZSwgImZpbGxDb2xvciI6ICIjZWI3YTM0IiwgImZpbGxPcGFjaXR5IjogMC44LCAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsICJsaW5lQ2FwIjogInJvdW5kIiwgImxpbmVKb2luIjogInJvdW5kIiwgIm9wYWNpdHkiOiAxLjAsICJyYWRpdXMiOiAxLCAic3Ryb2tlIjogdHJ1ZSwgIndlaWdodCI6IDN9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0ZDVhYWI5ZWVmOTQyNzI5NDViNzkxNmI3Mjg4Y2IwKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF80MDEyNjgwMGY4ZWQ0MjM2OWY2NWY2MWZlNjMxMTc0MCA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfODg0Mzc3MmE4OWIzNGE4ZWI0N2I2YTA4NjUwMjM4NzQgPSAkKGA8ZGl2IGlkPSJodG1sXzg4NDM3NzJhODliMzRhOGViNDdiNmEwODY1MDIzODc0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Lbm94dmlsbGU8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfNDAxMjY4MDBmOGVkNDIzNjlmNjVmNjFmZTYzMTE3NDAuc2V0Q29udGVudChodG1sXzg4NDM3NzJhODliMzRhOGViNDdiNmEwODY1MDIzODc0KTsKICAgICAgICAKCiAgICAgICAgY2lyY2xlX21hcmtlcl8wOTBhNzI4ZDE4ZGI0ZDZhYTYyMDA5OTQyOTc3NjcxMC5iaW5kUG9wdXAocG9wdXBfNDAxMjY4MDBmOGVkNDIzNjlmNjVmNjFmZTYzMTE3NDApCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzY2ZmU0ZjQzNDZjZTQ3OTQ4OTkwMTBiNTM2M2Q5NzhlID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuODAxMzU1NiwgLTkxLjIzOTU4MDddLAogICAgICAgICAgICAgICAgeyJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwgImNvbG9yIjogIiNlYjdhMzQiLCAiZGFzaEFycmF5IjogbnVsbCwgImRhc2hPZmZzZXQiOiBudWxsLCAiZmlsbCI6IHRydWUsICJmaWxsQ29sb3IiOiAiI2ViN2EzNCIsICJmaWxsT3BhY2l0eSI6IDAuOCwgImZpbGxSdWxlIjogImV2ZW5vZGQiLCAibGluZUNhcCI6ICJyb3VuZCIsICJsaW5lSm9pbiI6ICJyb3VuZCIsICJvcGFjaXR5IjogMS4wLCAicmFkaXVzIjogMSwgInN0cm9rZSI6IHRydWUsICJ3ZWlnaHQiOiAzfQogICAgICAgICAgICApLmFkZFRvKG1hcF80NGQ1YWFiOWVlZjk0MjcyOTQ1Yjc5MTZiNzI4OGNiMCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfZmVjMDIyNjk0MTlhNDJhYzlmYTk5YmE0NjI4ZTZiMDYgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sXzIwNDE5ZjQ3Y2MzMDRlNWM4MDA5ZGFjNjk4NzUzNGEyID0gJChgPGRpdiBpZD0iaHRtbF8yMDQxOWY0N2NjMzA0ZTVjODAwOWRhYzY5ODc1MzRhMiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TGEgQ3Jvc3NlPC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwX2ZlYzAyMjY5NDE5YTQyYWM5ZmE5OWJhNDYyOGU2YjA2LnNldENvbnRlbnQoaHRtbF8yMDQxOWY0N2NjMzA0ZTVjODAwOWRhYzY5ODc1MzRhMik7CiAgICAgICAgCgogICAgICAgIGNpcmNsZV9tYXJrZXJfNjZmZTRmNDM0NmNlNDc5NDg5OTAxMGI1MzYzZDk3OGUuYmluZFBvcHVwKHBvcHVwX2ZlYzAyMjY5NDE5YTQyYWM5ZmE5OWJhNDYyOGU2YjA2KQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xMGM0MTU1NTEyZmM0MmY1YTcxNDdiMDRmZWI0Y2VjOSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQxLjQ4MTk5MzIsIC04MS43OTgxOTA4XSwKICAgICAgICAgICAgICAgIHsiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsICJjb2xvciI6ICIjZWI3YTM0IiwgImRhc2hBcnJheSI6IG51bGwsICJkYXNoT2Zmc2V0IjogbnVsbCwgImZpbGwiOiB0cnVlLCAiZmlsbENvbG9yIjogIiNlYjdhMzQiLCAiZmlsbE9wYWNpdHkiOiAwLjgsICJmaWxsUnVsZSI6ICJldmVub2RkIiwgImxpbmVDYXAiOiAicm91bmQiLCAibGluZUpvaW4iOiAicm91bmQiLCAib3BhY2l0eSI6IDEuMCwgInJhZGl1cyI6IDEsICJzdHJva2UiOiB0cnVlLCAid2VpZ2h0IjogM30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDRkNWFhYjllZWY5NDI3Mjk0NWI3OTE2YjcyODhjYjApOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzFlNmRiYzhkOGMyNjRhMWZiNGI0NmE4MDAwNzk1ZjZmID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF9hMGI5YzAwMjYyMDQ0NzY3OTM4ZWZhZTVhYjMzM2ZkNSA9ICQoYDxkaXYgaWQ9Imh0bWxfYTBiOWMwMDI2MjA0NDc2NzkzOGVmYWU1YWIzMzNmZDUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkxha2V3b29kPC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzFlNmRiYzhkOGMyNjRhMWZiNGI0NmE4MDAwNzk1ZjZmLnNldENvbnRlbnQoaHRtbF9hMGI5YzAwMjYyMDQ0NzY3OTM4ZWZhZTVhYjMzM2ZkNSk7CiAgICAgICAgCgogICAgICAgIGNpcmNsZV9tYXJrZXJfMTBjNDE1NTUxMmZjNDJmNWE3MTQ3YjA0ZmViNGNlYzkuYmluZFBvcHVwKHBvcHVwXzFlNmRiYzhkOGMyNjRhMWZiNGI0NmE4MDAwNzk1ZjZmKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9iYTEyOWE5MmQ2NTM0ZjRhOGIzYTVkYWUxYzUyZmY4ZiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM2LjE2OTk0MTIsIC0xMTUuMTM5ODI5Nl0sCiAgICAgICAgICAgICAgICB7ImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLCAiY29sb3IiOiAiI2ViN2EzNCIsICJkYXNoQXJyYXkiOiBudWxsLCAiZGFzaE9mZnNldCI6IG51bGwsICJmaWxsIjogdHJ1ZSwgImZpbGxDb2xvciI6ICIjZWI3YTM0IiwgImZpbGxPcGFjaXR5IjogMC44LCAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsICJsaW5lQ2FwIjogInJvdW5kIiwgImxpbmVKb2luIjogInJvdW5kIiwgIm9wYWNpdHkiOiAxLjAsICJyYWRpdXMiOiAyLCAic3Ryb2tlIjogdHJ1ZSwgIndlaWdodCI6IDN9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0ZDVhYWI5ZWVmOTQyNzI5NDViNzkxNmI3Mjg4Y2IwKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF81NGFhZTA3YzhjOTU0YmI1YmIwYTI2NTBmN2RlMjljMCA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfYjEyNTkzMjY4YzYzNDQ3NGI1OWVhNjM1ZWNiYWM2NWQgPSAkKGA8ZGl2IGlkPSJodG1sX2IxMjU5MzI2OGM2MzQ0NzRiNTllYTYzNWVjYmFjNjVkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5MYXMgVmVnYXM8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfNTRhYWUwN2M4Yzk1NGJiNWJiMGEyNjUwZjdkZTI5YzAuc2V0Q29udGVudChodG1sX2IxMjU5MzI2OGM2MzQ0NzRiNTllYTYzNWVjYmFjNjVkKTsKICAgICAgICAKCiAgICAgICAgY2lyY2xlX21hcmtlcl9iYTEyOWE5MmQ2NTM0ZjRhOGIzYTVkYWUxYzUyZmY4Zi5iaW5kUG9wdXAocG9wdXBfNTRhYWUwN2M4Yzk1NGJiNWJiMGEyNjUwZjdkZTI5YzApCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2VkMjM4YTZkNzRlMjQzMTg5MzY1NGQ4YWM1NzIwNTdkID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDIuNzA3MDM1NCwgLTcxLjE2MzExMzddLAogICAgICAgICAgICAgICAgeyJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwgImNvbG9yIjogIiNlYjdhMzQiLCAiZGFzaEFycmF5IjogbnVsbCwgImRhc2hPZmZzZXQiOiBudWxsLCAiZmlsbCI6IHRydWUsICJmaWxsQ29sb3IiOiAiI2ViN2EzNCIsICJmaWxsT3BhY2l0eSI6IDAuOCwgImZpbGxSdWxlIjogImV2ZW5vZGQiLCAibGluZUNhcCI6ICJyb3VuZCIsICJsaW5lSm9pbiI6ICJyb3VuZCIsICJvcGFjaXR5IjogMS4wLCAicmFkaXVzIjogMSwgInN0cm9rZSI6IHRydWUsICJ3ZWlnaHQiOiAzfQogICAgICAgICAgICApLmFkZFRvKG1hcF80NGQ1YWFiOWVlZjk0MjcyOTQ1Yjc5MTZiNzI4OGNiMCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfYWY5ZTg1Y2E0ZmUwNGJhODg1NjlkMDNjMmI5NjFiOTEgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sXzFhZjNhMTJjNWJkMDRhMjk4MWQ2ZTUxZDA1NjFkNzNmID0gJChgPGRpdiBpZD0iaHRtbF8xYWYzYTEyYzViZDA0YTI5ODFkNmU1MWQwNTYxZDczZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TGF3cmVuY2U8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfYWY5ZTg1Y2E0ZmUwNGJhODg1NjlkMDNjMmI5NjFiOTEuc2V0Q29udGVudChodG1sXzFhZjNhMTJjNWJkMDRhMjk4MWQ2ZTUxZDA1NjFkNzNmKTsKICAgICAgICAKCiAgICAgICAgY2lyY2xlX21hcmtlcl9lZDIzOGE2ZDc0ZTI0MzE4OTM2NTRkOGFjNTcyMDU3ZC5iaW5kUG9wdXAocG9wdXBfYWY5ZTg1Y2E0ZmUwNGJhODg1NjlkMDNjMmI5NjFiOTEpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzM4NjBkY2IyOTQ2NjQ5OWU4NTYxMzhhMDlmZDVmMjkxID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuODI1NzYyNSwgLTk2LjY4NTE5ODJdLAogICAgICAgICAgICAgICAgeyJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwgImNvbG9yIjogIiNlYjdhMzQiLCAiZGFzaEFycmF5IjogbnVsbCwgImRhc2hPZmZzZXQiOiBudWxsLCAiZmlsbCI6IHRydWUsICJmaWxsQ29sb3IiOiAiI2ViN2EzNCIsICJmaWxsT3BhY2l0eSI6IDAuOCwgImZpbGxSdWxlIjogImV2ZW5vZGQiLCAibGluZUNhcCI6ICJyb3VuZCIsICJsaW5lSm9pbiI6ICJyb3VuZCIsICJvcGFjaXR5IjogMS4wLCAicmFkaXVzIjogMSwgInN0cm9rZSI6IHRydWUsICJ3ZWlnaHQiOiAzfQogICAgICAgICAgICApLmFkZFRvKG1hcF80NGQ1YWFiOWVlZjk0MjcyOTQ1Yjc5MTZiNzI4OGNiMCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfOTJmZGY0ZDIzMmY2NDJjY2E0MTBmMDI2YTcwMmE4ODUgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sXzUyNjU3ZmU4NDZiOTQxNmM5ZWVkYjQxYmY0NzY1NWRmID0gJChgPGRpdiBpZD0iaHRtbF81MjY1N2ZlODQ2Yjk0MTZjOWVlZGI0MWJmNDc2NTVkZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TGluY29sbjwvZGl2PmApWzBdOwogICAgICAgICAgICBwb3B1cF85MmZkZjRkMjMyZjY0MmNjYTQxMGYwMjZhNzAyYTg4NS5zZXRDb250ZW50KGh0bWxfNTI2NTdmZTg0NmI5NDE2YzllZWRiNDFiZjQ3NjU1ZGYpOwogICAgICAgIAoKICAgICAgICBjaXJjbGVfbWFya2VyXzM4NjBkY2IyOTQ2NjQ5OWU4NTYxMzhhMDlmZDVmMjkxLmJpbmRQb3B1cChwb3B1cF85MmZkZjRkMjMyZjY0MmNjYTQxMGYwMjZhNzAyYTg4NSkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNzU3ODViMTI5NDYwNGI4ZmJlMmE1YjA3NGRhYjAwM2UgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MS43MzY5ODAzLCAtMTExLjgzMzgzNTldLAogICAgICAgICAgICAgICAgeyJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwgImNvbG9yIjogIiNlYjdhMzQiLCAiZGFzaEFycmF5IjogbnVsbCwgImRhc2hPZmZzZXQiOiBudWxsLCAiZmlsbCI6IHRydWUsICJmaWxsQ29sb3IiOiAiI2ViN2EzNCIsICJmaWxsT3BhY2l0eSI6IDAuOCwgImZpbGxSdWxlIjogImV2ZW5vZGQiLCAibGluZUNhcCI6ICJyb3VuZCIsICJsaW5lSm9pbiI6ICJyb3VuZCIsICJvcGFjaXR5IjogMS4wLCAicmFkaXVzIjogMiwgInN0cm9rZSI6IHRydWUsICJ3ZWlnaHQiOiAzfQogICAgICAgICAgICApLmFkZFRvKG1hcF80NGQ1YWFiOWVlZjk0MjcyOTQ1Yjc5MTZiNzI4OGNiMCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfMjZjN2JmYTZkMWFkNDY3NWFjNzMwNmRmZjA5YzEwMTQgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sX2Q4NWZjNjQyY2NkZDQ2NGFhZjgyMzNkN2UxODZjNmI0ID0gJChgPGRpdiBpZD0iaHRtbF9kODVmYzY0MmNjZGQ0NjRhYWY4MjMzZDdlMTg2YzZiNCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TG9nYW48L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfMjZjN2JmYTZkMWFkNDY3NWFjNzMwNmRmZjA5YzEwMTQuc2V0Q29udGVudChodG1sX2Q4NWZjNjQyY2NkZDQ2NGFhZjgyMzNkN2UxODZjNmI0KTsKICAgICAgICAKCiAgICAgICAgY2lyY2xlX21hcmtlcl83NTc4NWIxMjk0NjA0YjhmYmUyYTViMDc0ZGFiMDAzZS5iaW5kUG9wdXAocG9wdXBfMjZjN2JmYTZkMWFkNDY3NWFjNzMwNmRmZjA5YzEwMTQpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzFmOWRiMzRmOGFjYzQ0ODJiNTExYjMxYmQzMjMzNjY4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzMuNzcwMDUwNCwgLTExOC4xOTM3Mzk1XSwKICAgICAgICAgICAgICAgIHsiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsICJjb2xvciI6ICIjZWI3YTM0IiwgImRhc2hBcnJheSI6IG51bGwsICJkYXNoT2Zmc2V0IjogbnVsbCwgImZpbGwiOiB0cnVlLCAiZmlsbENvbG9yIjogIiNlYjdhMzQiLCAiZmlsbE9wYWNpdHkiOiAwLjgsICJmaWxsUnVsZSI6ICJldmVub2RkIiwgImxpbmVDYXAiOiAicm91bmQiLCAibGluZUpvaW4iOiAicm91bmQiLCAib3BhY2l0eSI6IDEuMCwgInJhZGl1cyI6IDIsICJzdHJva2UiOiB0cnVlLCAid2VpZ2h0IjogM30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDRkNWFhYjllZWY5NDI3Mjk0NWI3OTE2YjcyODhjYjApOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzZkZTVjNDRkYzA5NDQzY2I4MTFjYjk4MGZiZWQxM2ZhID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF85M2M3N2JlMTZkMjA0ZTJhOGVjZTFiOTc2NjgwZTRhNCA9ICQoYDxkaXYgaWQ9Imh0bWxfOTNjNzdiZTE2ZDIwNGUyYThlY2UxYjk3NjY4MGU0YTQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkxvbmcgQmVhY2g8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfNmRlNWM0NGRjMDk0NDNjYjgxMWNiOTgwZmJlZDEzZmEuc2V0Q29udGVudChodG1sXzkzYzc3YmUxNmQyMDRlMmE4ZWNlMWI5NzY2ODBlNGE0KTsKICAgICAgICAKCiAgICAgICAgY2lyY2xlX21hcmtlcl8xZjlkYjM0ZjhhY2M0NDgyYjUxMWIzMWJkMzIzMzY2OC5iaW5kUG9wdXAocG9wdXBfNmRlNWM0NGRjMDk0NDNjYjgxMWNiOTgwZmJlZDEzZmEpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2Q4MzY5MjhkNjJhZDQ1NDFiODAwNTUxZDQyM2IxMWQyID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzQuMDUyMjM0MiwgLTExOC4yNDM2ODQ5XSwKICAgICAgICAgICAgICAgIHsiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsICJjb2xvciI6ICIjZWI3YTM0IiwgImRhc2hBcnJheSI6IG51bGwsICJkYXNoT2Zmc2V0IjogbnVsbCwgImZpbGwiOiB0cnVlLCAiZmlsbENvbG9yIjogIiNlYjdhMzQiLCAiZmlsbE9wYWNpdHkiOiAwLjgsICJmaWxsUnVsZSI6ICJldmVub2RkIiwgImxpbmVDYXAiOiAicm91bmQiLCAibGluZUpvaW4iOiAicm91bmQiLCAib3BhY2l0eSI6IDEuMCwgInJhZGl1cyI6IDYsICJzdHJva2UiOiB0cnVlLCAid2VpZ2h0IjogM30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDRkNWFhYjllZWY5NDI3Mjk0NWI3OTE2YjcyODhjYjApOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzEyYTk4NGIwMzhlNzRjN2ZhNzIwYzU3NTQ4MjBlMzU0ID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF84NzhkODhhZDQ1OTQ0MDc0Yjk4YzA3MjMzYzA5ZWU4NSA9ICQoYDxkaXYgaWQ9Imh0bWxfODc4ZDg4YWQ0NTk0NDA3NGI5OGMwNzIzM2MwOWVlODUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkxvcyBBbmdlbGVzPC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzEyYTk4NGIwMzhlNzRjN2ZhNzIwYzU3NTQ4MjBlMzU0LnNldENvbnRlbnQoaHRtbF84NzhkODhhZDQ1OTQ0MDc0Yjk4YzA3MjMzYzA5ZWU4NSk7CiAgICAgICAgCgogICAgICAgIGNpcmNsZV9tYXJrZXJfZDgzNjkyOGQ2MmFkNDU0MWI4MDA1NTFkNDIzYjExZDIuYmluZFBvcHVwKHBvcHVwXzEyYTk4NGIwMzhlNzRjN2ZhNzIwYzU3NTQ4MjBlMzU0KQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lNGEzMGJlNGJkZGI0ZWEyYjU3NGQwZGMxYjExZDVjZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQyLjYzMzQyNDcsIC03MS4zMTYxNzE4XSwKICAgICAgICAgICAgICAgIHsiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsICJjb2xvciI6ICIjZWI3YTM0IiwgImRhc2hBcnJheSI6IG51bGwsICJkYXNoT2Zmc2V0IjogbnVsbCwgImZpbGwiOiB0cnVlLCAiZmlsbENvbG9yIjogIiNlYjdhMzQiLCAiZmlsbE9wYWNpdHkiOiAwLjgsICJmaWxsUnVsZSI6ICJldmVub2RkIiwgImxpbmVDYXAiOiAicm91bmQiLCAibGluZUpvaW4iOiAicm91bmQiLCAib3BhY2l0eSI6IDEuMCwgInJhZGl1cyI6IDIsICJzdHJva2UiOiB0cnVlLCAid2VpZ2h0IjogM30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDRkNWFhYjllZWY5NDI3Mjk0NWI3OTE2YjcyODhjYjApOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwX2FhNDlhZDhjZWQyZjQyNGM5MmEwNjUwNjE3YWE2MThmID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF84MDE1YjljN2JlMDI0YWVjOTU3Y2Q3ODYwZDJkZmE0YyA9ICQoYDxkaXYgaWQ9Imh0bWxfODAxNWI5YzdiZTAyNGFlYzk1N2NkNzg2MGQyZGZhNGMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkxvd2VsbDwvZGl2PmApWzBdOwogICAgICAgICAgICBwb3B1cF9hYTQ5YWQ4Y2VkMmY0MjRjOTJhMDY1MDYxN2FhNjE4Zi5zZXRDb250ZW50KGh0bWxfODAxNWI5YzdiZTAyNGFlYzk1N2NkNzg2MGQyZGZhNGMpOwogICAgICAgIAoKICAgICAgICBjaXJjbGVfbWFya2VyX2U0YTMwYmU0YmRkYjRlYTJiNTc0ZDBkYzFiMTFkNWNlLmJpbmRQb3B1cChwb3B1cF9hYTQ5YWQ4Y2VkMmY0MjRjOTJhMDY1MDYxN2FhNjE4ZikKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYTU4NzYxNjdhMWRlNDI2Zjg1NTIzODU3ODI4YTk0M2YgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Mi40NjY3NjMsIC03MC45NDk0OTM4XSwKICAgICAgICAgICAgICAgIHsiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsICJjb2xvciI6ICIjZWI3YTM0IiwgImRhc2hBcnJheSI6IG51bGwsICJkYXNoT2Zmc2V0IjogbnVsbCwgImZpbGwiOiB0cnVlLCAiZmlsbENvbG9yIjogIiNlYjdhMzQiLCAiZmlsbE9wYWNpdHkiOiAwLjgsICJmaWxsUnVsZSI6ICJldmVub2RkIiwgImxpbmVDYXAiOiAicm91bmQiLCAibGluZUpvaW4iOiAicm91bmQiLCAib3BhY2l0eSI6IDEuMCwgInJhZGl1cyI6IDEsICJzdHJva2UiOiB0cnVlLCAid2VpZ2h0IjogM30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDRkNWFhYjllZWY5NDI3Mjk0NWI3OTE2YjcyODhjYjApOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzY5NTg3YWU5N2RjOTRiNWRhYmYyOTlmNDY1OGU3NjEwID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF84Mjc1Yjg2ZThhNWI0YTBhOTczNjcyYjM2ZWMwNDY4OSA9ICQoYDxkaXYgaWQ9Imh0bWxfODI3NWI4NmU4YTViNGEwYTk3MzY3MmIzNmVjMDQ2ODkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPkx5bm48L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfNjk1ODdhZTk3ZGM5NGI1ZGFiZjI5OWY0NjU4ZTc2MTAuc2V0Q29udGVudChodG1sXzgyNzViODZlOGE1YjRhMGE5NzM2NzJiMzZlYzA0Njg5KTsKICAgICAgICAKCiAgICAgICAgY2lyY2xlX21hcmtlcl9hNTg3NjE2N2ExZGU0MjZmODU1MjM4NTc4MjhhOTQzZi5iaW5kUG9wdXAocG9wdXBfNjk1ODdhZTk3ZGM5NGI1ZGFiZjI5OWY0NjU4ZTc2MTApCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzBjNjg4ZGM1MGI4YTQzYTE4YWRkNTI3ZjJkMmRlNWZhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDIuNDI1MDk2NCwgLTcxLjA2NjE2M10sCiAgICAgICAgICAgICAgICB7ImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLCAiY29sb3IiOiAiI2ViN2EzNCIsICJkYXNoQXJyYXkiOiBudWxsLCAiZGFzaE9mZnNldCI6IG51bGwsICJmaWxsIjogdHJ1ZSwgImZpbGxDb2xvciI6ICIjZWI3YTM0IiwgImZpbGxPcGFjaXR5IjogMC44LCAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsICJsaW5lQ2FwIjogInJvdW5kIiwgImxpbmVKb2luIjogInJvdW5kIiwgIm9wYWNpdHkiOiAxLjAsICJyYWRpdXMiOiAxLCAic3Ryb2tlIjogdHJ1ZSwgIndlaWdodCI6IDN9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0ZDVhYWI5ZWVmOTQyNzI5NDViNzkxNmI3Mjg4Y2IwKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF83MTljMGZiYTA3YTI0MWY5OTA1YjcyN2Q3MTk2ZTI5YyA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfN2UwNTQwMjJhNmNmNDZhZWIxNzhjNjFmNzc2N2Y3NWIgPSAkKGA8ZGl2IGlkPSJodG1sXzdlMDU0MDIyYTZjZjQ2YWViMTc4YzYxZjc3NjdmNzViIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NYWxkZW48L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfNzE5YzBmYmEwN2EyNDFmOTkwNWI3MjdkNzE5NmUyOWMuc2V0Q29udGVudChodG1sXzdlMDU0MDIyYTZjZjQ2YWViMTc4YzYxZjc3NjdmNzViKTsKICAgICAgICAKCiAgICAgICAgY2lyY2xlX21hcmtlcl8wYzY4OGRjNTBiOGE0M2ExOGFkZDUyN2YyZDJkZTVmYS5iaW5kUG9wdXAocG9wdXBfNzE5YzBmYmEwN2EyNDFmOTkwNWI3MjdkNzE5NmUyOWMpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzdkYmM0NmY5ZTYwNTQ2MmRiMWNmZDA2YzI4NGJiMmFhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzIuNTYzMTkyNCwgLTk3LjE0MTY3NjhdLAogICAgICAgICAgICAgICAgeyJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwgImNvbG9yIjogIiNlYjdhMzQiLCAiZGFzaEFycmF5IjogbnVsbCwgImRhc2hPZmZzZXQiOiBudWxsLCAiZmlsbCI6IHRydWUsICJmaWxsQ29sb3IiOiAiI2ViN2EzNCIsICJmaWxsT3BhY2l0eSI6IDAuOCwgImZpbGxSdWxlIjogImV2ZW5vZGQiLCAibGluZUNhcCI6ICJyb3VuZCIsICJsaW5lSm9pbiI6ICJyb3VuZCIsICJvcGFjaXR5IjogMS4wLCAicmFkaXVzIjogMSwgInN0cm9rZSI6IHRydWUsICJ3ZWlnaHQiOiAzfQogICAgICAgICAgICApLmFkZFRvKG1hcF80NGQ1YWFiOWVlZjk0MjcyOTQ1Yjc5MTZiNzI4OGNiMCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfYTVhOTQxZmUwYWIxNDUzN2IwZDU3MWUyYjVhY2JkYTIgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sX2RmNWExNDA1MWJkNzRlZTU4MWQ3OTgxN2U2NzhjNDkwID0gJChgPGRpdiBpZD0iaHRtbF9kZjVhMTQwNTFiZDc0ZWU1ODFkNzk4MTdlNjc4YzQ5MCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TWFuc2ZpZWxkPC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwX2E1YTk0MWZlMGFiMTQ1MzdiMGQ1NzFlMmI1YWNiZGEyLnNldENvbnRlbnQoaHRtbF9kZjVhMTQwNTFiZDc0ZWU1ODFkNzk4MTdlNjc4YzQ5MCk7CiAgICAgICAgCgogICAgICAgIGNpcmNsZV9tYXJrZXJfN2RiYzQ2ZjllNjA1NDYyZGIxY2ZkMDZjMjg0YmIyYWEuYmluZFBvcHVwKHBvcHVwX2E1YTk0MWZlMGFiMTQ1MzdiMGQ1NzFlMmI1YWNiZGEyKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl80YmM5OGEyOWMyZmY0OGZkOGE3NDkyMTllZjEzZTVmMCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzI1Ljc2MTY3OTgsIC04MC4xOTE3OTAyXSwKICAgICAgICAgICAgICAgIHsiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsICJjb2xvciI6ICIjZWI3YTM0IiwgImRhc2hBcnJheSI6IG51bGwsICJkYXNoT2Zmc2V0IjogbnVsbCwgImZpbGwiOiB0cnVlLCAiZmlsbENvbG9yIjogIiNlYjdhMzQiLCAiZmlsbE9wYWNpdHkiOiAwLjgsICJmaWxsUnVsZSI6ICJldmVub2RkIiwgImxpbmVDYXAiOiAicm91bmQiLCAibGluZUpvaW4iOiAicm91bmQiLCAib3BhY2l0eSI6IDEuMCwgInJhZGl1cyI6IDQsICJzdHJva2UiOiB0cnVlLCAid2VpZ2h0IjogM30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDRkNWFhYjllZWY5NDI3Mjk0NWI3OTE2YjcyODhjYjApOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzk0YmNkODA3YWUwNjQ2NjBiNWQ4MDZiODFmZjRhZTdhID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF82YzBiNDA4ODE5ODc0Y2U5YjYwYTg5OGUzZWIzZDAzNiA9ICQoYDxkaXYgaWQ9Imh0bWxfNmMwYjQwODgxOTg3NGNlOWI2MGE4OThlM2ViM2QwMzYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk1pYW1pPC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzk0YmNkODA3YWUwNjQ2NjBiNWQ4MDZiODFmZjRhZTdhLnNldENvbnRlbnQoaHRtbF82YzBiNDA4ODE5ODc0Y2U5YjYwYTg5OGUzZWIzZDAzNik7CiAgICAgICAgCgogICAgICAgIGNpcmNsZV9tYXJrZXJfNGJjOThhMjljMmZmNDhmZDhhNzQ5MjE5ZWYxM2U1ZjAuYmluZFBvcHVwKHBvcHVwXzk0YmNkODA3YWUwNjQ2NjBiNWQ4MDZiODFmZjRhZTdhKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9kNDQ2MzljNDc4NWY0MjYxYjY1Y2EzOGFhZjE1Mzk4MCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQzLjAzODkwMjUsIC04Ny45MDY0NzM2XSwKICAgICAgICAgICAgICAgIHsiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsICJjb2xvciI6ICIjZWI3YTM0IiwgImRhc2hBcnJheSI6IG51bGwsICJkYXNoT2Zmc2V0IjogbnVsbCwgImZpbGwiOiB0cnVlLCAiZmlsbENvbG9yIjogIiNlYjdhMzQiLCAiZmlsbE9wYWNpdHkiOiAwLjgsICJmaWxsUnVsZSI6ICJldmVub2RkIiwgImxpbmVDYXAiOiAicm91bmQiLCAibGluZUpvaW4iOiAicm91bmQiLCAib3BhY2l0eSI6IDEuMCwgInJhZGl1cyI6IDIsICJzdHJva2UiOiB0cnVlLCAid2VpZ2h0IjogM30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDRkNWFhYjllZWY5NDI3Mjk0NWI3OTE2YjcyODhjYjApOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwX2I4YjQ3YTY3ODRhNjQyNDNhYTY0Yjk3ZTg2NTMxZDcxID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF84N2NlMDVmNjE5Mjk0NjE2OTcxNmZjYWJmYWQ0MjU1YSA9ICQoYDxkaXYgaWQ9Imh0bWxfODdjZTA1ZjYxOTI5NDYxNjk3MTZmY2FiZmFkNDI1NWEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk1pbHdhdWtlZTwvZGl2PmApWzBdOwogICAgICAgICAgICBwb3B1cF9iOGI0N2E2Nzg0YTY0MjQzYWE2NGI5N2U4NjUzMWQ3MS5zZXRDb250ZW50KGh0bWxfODdjZTA1ZjYxOTI5NDYxNjk3MTZmY2FiZmFkNDI1NWEpOwogICAgICAgIAoKICAgICAgICBjaXJjbGVfbWFya2VyX2Q0NDYzOWM0Nzg1ZjQyNjFiNjVjYTM4YWFmMTUzOTgwLmJpbmRQb3B1cChwb3B1cF9iOGI0N2E2Nzg0YTY0MjQzYWE2NGI5N2U4NjUzMWQ3MSkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZTkwMDJlYTc5ZGJiNGI5NWI5ODI4MjA0ZDIzNjAzNDEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0OC4yMzI5NjY4LCAtMTAxLjI5MjI5MDZdLAogICAgICAgICAgICAgICAgeyJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwgImNvbG9yIjogIiNlYjdhMzQiLCAiZGFzaEFycmF5IjogbnVsbCwgImRhc2hPZmZzZXQiOiBudWxsLCAiZmlsbCI6IHRydWUsICJmaWxsQ29sb3IiOiAiI2ViN2EzNCIsICJmaWxsT3BhY2l0eSI6IDAuOCwgImZpbGxSdWxlIjogImV2ZW5vZGQiLCAibGluZUNhcCI6ICJyb3VuZCIsICJsaW5lSm9pbiI6ICJyb3VuZCIsICJvcGFjaXR5IjogMS4wLCAicmFkaXVzIjogMSwgInN0cm9rZSI6IHRydWUsICJ3ZWlnaHQiOiAzfQogICAgICAgICAgICApLmFkZFRvKG1hcF80NGQ1YWFiOWVlZjk0MjcyOTQ1Yjc5MTZiNzI4OGNiMCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfMTliMzg3NWFiMGQzNDljNmJlMWMxMWM2N2VhM2IxODcgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sXzQ5ZmMyYjJlZTNhYzRkNWY4NzA5MzA1ZGU0ZmExMDgwID0gJChgPGRpdiBpZD0iaHRtbF80OWZjMmIyZWUzYWM0ZDVmODcwOTMwNWRlNGZhMTA4MCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TWlub3Q8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfMTliMzg3NWFiMGQzNDljNmJlMWMxMWM2N2VhM2IxODcuc2V0Q29udGVudChodG1sXzQ5ZmMyYjJlZTNhYzRkNWY4NzA5MzA1ZGU0ZmExMDgwKTsKICAgICAgICAKCiAgICAgICAgY2lyY2xlX21hcmtlcl9lOTAwMmVhNzlkYmI0Yjk1Yjk4MjgyMDRkMjM2MDM0MS5iaW5kUG9wdXAocG9wdXBfMTliMzg3NWFiMGQzNDljNmJlMWMxMWM2N2VhM2IxODcpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzI5NDExMzhhNzkzZjQ0N2Q4MjFhNzlkYTk0YmIzMjU1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDYuODc4NzE3NiwgLTExMy45OTY1ODZdLAogICAgICAgICAgICAgICAgeyJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwgImNvbG9yIjogIiNlYjdhMzQiLCAiZGFzaEFycmF5IjogbnVsbCwgImRhc2hPZmZzZXQiOiBudWxsLCAiZmlsbCI6IHRydWUsICJmaWxsQ29sb3IiOiAiI2ViN2EzNCIsICJmaWxsT3BhY2l0eSI6IDAuOCwgImZpbGxSdWxlIjogImV2ZW5vZGQiLCAibGluZUNhcCI6ICJyb3VuZCIsICJsaW5lSm9pbiI6ICJyb3VuZCIsICJvcGFjaXR5IjogMS4wLCAicmFkaXVzIjogMSwgInN0cm9rZSI6IHRydWUsICJ3ZWlnaHQiOiAzfQogICAgICAgICAgICApLmFkZFRvKG1hcF80NGQ1YWFiOWVlZjk0MjcyOTQ1Yjc5MTZiNzI4OGNiMCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfNzlhNmViNzdmYTZlNDNjMWI2MzRjYTQ0MzVmMDAyNzYgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sXzNmNWYxMGMyNjQzNTQxYmZiODA5NTU3ZmRiOWVkNDEwID0gJChgPGRpdiBpZD0iaHRtbF8zZjVmMTBjMjY0MzU0MWJmYjgwOTU1N2ZkYjllZDQxMCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TWlzc291bGE8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfNzlhNmViNzdmYTZlNDNjMWI2MzRjYTQ0MzVmMDAyNzYuc2V0Q29udGVudChodG1sXzNmNWYxMGMyNjQzNTQxYmZiODA5NTU3ZmRiOWVkNDEwKTsKICAgICAgICAKCiAgICAgICAgY2lyY2xlX21hcmtlcl8yOTQxMTM4YTc5M2Y0NDdkODIxYTc5ZGE5NGJiMzI1NS5iaW5kUG9wdXAocG9wdXBfNzlhNmViNzdmYTZlNDNjMWI2MzRjYTQ0MzVmMDAyNzYpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzg1ZDlhMTk5MTQzMzQzZWJiY2JlMmE2YWYyNWJiODI4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzQuMDYyNTEwNiwgLTExOC4xMjI4NDc2XSwKICAgICAgICAgICAgICAgIHsiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsICJjb2xvciI6ICIjZWI3YTM0IiwgImRhc2hBcnJheSI6IG51bGwsICJkYXNoT2Zmc2V0IjogbnVsbCwgImZpbGwiOiB0cnVlLCAiZmlsbENvbG9yIjogIiNlYjdhMzQiLCAiZmlsbE9wYWNpdHkiOiAwLjgsICJmaWxsUnVsZSI6ICJldmVub2RkIiwgImxpbmVDYXAiOiAicm91bmQiLCAibGluZUpvaW4iOiAicm91bmQiLCAib3BhY2l0eSI6IDEuMCwgInJhZGl1cyI6IDEsICJzdHJva2UiOiB0cnVlLCAid2VpZ2h0IjogM30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDRkNWFhYjllZWY5NDI3Mjk0NWI3OTE2YjcyODhjYjApOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwX2RkZmI5ZWNhNTcyYzRiYTZiMDkyOGUzZGE3YjlmYjk2ID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF83MTljYTg2ZDhlNjk0MmU4YTdhMTc2MGY4NTY5OTQ5MCA9ICQoYDxkaXYgaWQ9Imh0bWxfNzE5Y2E4NmQ4ZTY5NDJlOGE3YTE3NjBmODU2OTk0OTAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk1vbnRlcmV5IFBhcms8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfZGRmYjllY2E1NzJjNGJhNmIwOTI4ZTNkYTdiOWZiOTYuc2V0Q29udGVudChodG1sXzcxOWNhODZkOGU2OTQyZThhN2ExNzYwZjg1Njk5NDkwKTsKICAgICAgICAKCiAgICAgICAgY2lyY2xlX21hcmtlcl84NWQ5YTE5OTE0MzM0M2ViYmNiZTJhNmFmMjViYjgyOC5iaW5kUG9wdXAocG9wdXBfZGRmYjllY2E1NzJjNGJhNmIwOTI4ZTNkYTdiOWZiOTYpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzRjNDVkZmUwNjRmYTRmYzY4YjUyZDRjZTk3NjMxOGYwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzIuODMyMzIyNSwgLTc5LjgyODQyNThdLAogICAgICAgICAgICAgICAgeyJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwgImNvbG9yIjogIiNlYjdhMzQiLCAiZGFzaEFycmF5IjogbnVsbCwgImRhc2hPZmZzZXQiOiBudWxsLCAiZmlsbCI6IHRydWUsICJmaWxsQ29sb3IiOiAiI2ViN2EzNCIsICJmaWxsT3BhY2l0eSI6IDAuOCwgImZpbGxSdWxlIjogImV2ZW5vZGQiLCAibGluZUNhcCI6ICJyb3VuZCIsICJsaW5lSm9pbiI6ICJyb3VuZCIsICJvcGFjaXR5IjogMS4wLCAicmFkaXVzIjogMSwgInN0cm9rZSI6IHRydWUsICJ3ZWlnaHQiOiAzfQogICAgICAgICAgICApLmFkZFRvKG1hcF80NGQ1YWFiOWVlZjk0MjcyOTQ1Yjc5MTZiNzI4OGNiMCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfM2I5NDBkZWVmYjQyNDgyNTgxZmEzNWJkYWU1NzRlOGIgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sXzI5YjM4ZDFmYzQ0NTQ0MjE5ZDU0ZTQ2N2RlM2Q5ZmQ3ID0gJChgPGRpdiBpZD0iaHRtbF8yOWIzOGQxZmM0NDU0NDIxOWQ1NGU0NjdkZTNkOWZkNyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TW91bnQgUGxlYXNhbnQ8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfM2I5NDBkZWVmYjQyNDgyNTgxZmEzNWJkYWU1NzRlOGIuc2V0Q29udGVudChodG1sXzI5YjM4ZDFmYzQ0NTQ0MjE5ZDU0ZTQ2N2RlM2Q5ZmQ3KTsKICAgICAgICAKCiAgICAgICAgY2lyY2xlX21hcmtlcl80YzQ1ZGZlMDY0ZmE0ZmM2OGI1MmQ0Y2U5NzYzMThmMC5iaW5kUG9wdXAocG9wdXBfM2I5NDBkZWVmYjQyNDgyNTgxZmEzNWJkYWU1NzRlOGIpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzk0OWVkZjc2OThjMTQ5MGRhZDY1ZDYxMjJmOTcyNDgwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuMTkzMzc2NywgLTg1LjM4NjM1OTldLAogICAgICAgICAgICAgICAgeyJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwgImNvbG9yIjogIiNlYjdhMzQiLCAiZGFzaEFycmF5IjogbnVsbCwgImRhc2hPZmZzZXQiOiBudWxsLCAiZmlsbCI6IHRydWUsICJmaWxsQ29sb3IiOiAiI2ViN2EzNCIsICJmaWxsT3BhY2l0eSI6IDAuOCwgImZpbGxSdWxlIjogImV2ZW5vZGQiLCAibGluZUNhcCI6ICJyb3VuZCIsICJsaW5lSm9pbiI6ICJyb3VuZCIsICJvcGFjaXR5IjogMS4wLCAicmFkaXVzIjogMSwgInN0cm9rZSI6IHRydWUsICJ3ZWlnaHQiOiAzfQogICAgICAgICAgICApLmFkZFRvKG1hcF80NGQ1YWFiOWVlZjk0MjcyOTQ1Yjc5MTZiNzI4OGNiMCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfMmFkMDhhNGNlYjM1NGE5Zjk3NjIyZjY4NWRkYzA1M2IgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sXzQ0ODM3ZWM4ODBiMjQ3OTc4NGE4NmI2ODE4MzMyNTkxID0gJChgPGRpdiBpZD0iaHRtbF80NDgzN2VjODgwYjI0Nzk3ODRhODZiNjgxODMzMjU5MSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TXVuY2llPC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzJhZDA4YTRjZWIzNTRhOWY5NzYyMmY2ODVkZGMwNTNiLnNldENvbnRlbnQoaHRtbF80NDgzN2VjODgwYjI0Nzk3ODRhODZiNjgxODMzMjU5MSk7CiAgICAgICAgCgogICAgICAgIGNpcmNsZV9tYXJrZXJfOTQ5ZWRmNzY5OGMxNDkwZGFkNjVkNjEyMmY5NzI0ODAuYmluZFBvcHVwKHBvcHVwXzJhZDA4YTRjZWIzNTRhOWY5NzYyMmY2ODVkZGMwNTNiKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9hYzM0MTkwNTJhNzg0NzgxODI5MmQ2MmU4NTQ2MTUyYyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM1Ljg0NTYyMTMsIC04Ni4zOTAyN10sCiAgICAgICAgICAgICAgICB7ImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLCAiY29sb3IiOiAiI2ViN2EzNCIsICJkYXNoQXJyYXkiOiBudWxsLCAiZGFzaE9mZnNldCI6IG51bGwsICJmaWxsIjogdHJ1ZSwgImZpbGxDb2xvciI6ICIjZWI3YTM0IiwgImZpbGxPcGFjaXR5IjogMC44LCAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsICJsaW5lQ2FwIjogInJvdW5kIiwgImxpbmVKb2luIjogInJvdW5kIiwgIm9wYWNpdHkiOiAxLjAsICJyYWRpdXMiOiAxLCAic3Ryb2tlIjogdHJ1ZSwgIndlaWdodCI6IDN9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0ZDVhYWI5ZWVmOTQyNzI5NDViNzkxNmI3Mjg4Y2IwKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF8yYTI5ZThhNjY3MDU0YWYyODg2ZDA1ZjBjNjUzYTI1NyA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfOWE4ZjU1YWQ1NDZlNDk5YWI3NTNiY2RiYTBhYTFjOGQgPSAkKGA8ZGl2IGlkPSJodG1sXzlhOGY1NWFkNTQ2ZTQ5OWFiNzUzYmNkYmEwYWExYzhkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5NdXJmcmVlc2Jvcm88L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfMmEyOWU4YTY2NzA1NGFmMjg4NmQwNWYwYzY1M2EyNTcuc2V0Q29udGVudChodG1sXzlhOGY1NWFkNTQ2ZTQ5OWFiNzUzYmNkYmEwYWExYzhkKTsKICAgICAgICAKCiAgICAgICAgY2lyY2xlX21hcmtlcl9hYzM0MTkwNTJhNzg0NzgxODI5MmQ2MmU4NTQ2MTUyYy5iaW5kUG9wdXAocG9wdXBfMmEyOWU4YTY2NzA1NGFmMjg4NmQwNWYwYzY1M2EyNTcpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2MyM2U4MGU0YTc5YTRkNDA5YjRlMDYzZTM4NjQ4N2M1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzMuNTUzOTE0MywgLTExNy4yMTM5MjMyXSwKICAgICAgICAgICAgICAgIHsiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsICJjb2xvciI6ICIjZWI3YTM0IiwgImRhc2hBcnJheSI6IG51bGwsICJkYXNoT2Zmc2V0IjogbnVsbCwgImZpbGwiOiB0cnVlLCAiZmlsbENvbG9yIjogIiNlYjdhMzQiLCAiZmlsbE9wYWNpdHkiOiAwLjgsICJmaWxsUnVsZSI6ICJldmVub2RkIiwgImxpbmVDYXAiOiAicm91bmQiLCAibGluZUpvaW4iOiAicm91bmQiLCAib3BhY2l0eSI6IDEuMCwgInJhZGl1cyI6IDEsICJzdHJva2UiOiB0cnVlLCAid2VpZ2h0IjogM30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDRkNWFhYjllZWY5NDI3Mjk0NWI3OTE2YjcyODhjYjApOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwX2MwZjE5NzdmNDE4MzQ5OGE5MDZmMGY5NTZlZTIzMTVhID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF9iZWI2NTI2MTQ1ODk0OTkyOGMwOWQxOTVmOGJlODY3OSA9ICQoYDxkaXYgaWQ9Imh0bWxfYmViNjUyNjE0NTg5NDk5MjhjMDlkMTk1ZjhiZTg2NzkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk11cnJpZXRhPC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwX2MwZjE5NzdmNDE4MzQ5OGE5MDZmMGY5NTZlZTIzMTVhLnNldENvbnRlbnQoaHRtbF9iZWI2NTI2MTQ1ODk0OTkyOGMwOWQxOTVmOGJlODY3OSk7CiAgICAgICAgCgogICAgICAgIGNpcmNsZV9tYXJrZXJfYzIzZTgwZTRhNzlhNGQ0MDliNGUwNjNlMzg2NDg3YzUuYmluZFBvcHVwKHBvcHVwX2MwZjE5NzdmNDE4MzQ5OGE5MDZmMGY5NTZlZTIzMTVhKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xMzhlMDQ0Y2FmMmM0N2FiYjIxZmRjNTExNzFkZWVmOCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM4LjI5NzUzODEsIC0xMjIuMjg2ODY1XSwKICAgICAgICAgICAgICAgIHsiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsICJjb2xvciI6ICIjZWI3YTM0IiwgImRhc2hBcnJheSI6IG51bGwsICJkYXNoT2Zmc2V0IjogbnVsbCwgImZpbGwiOiB0cnVlLCAiZmlsbENvbG9yIjogIiNlYjdhMzQiLCAiZmlsbE9wYWNpdHkiOiAwLjgsICJmaWxsUnVsZSI6ICJldmVub2RkIiwgImxpbmVDYXAiOiAicm91bmQiLCAibGluZUpvaW4iOiAicm91bmQiLCAib3BhY2l0eSI6IDEuMCwgInJhZGl1cyI6IDEsICJzdHJva2UiOiB0cnVlLCAid2VpZ2h0IjogM30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDRkNWFhYjllZWY5NDI3Mjk0NWI3OTE2YjcyODhjYjApOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzVjMDNmZWM4ODdhMTQ3N2VhZDFjNjhjODNlZDZjOTFjID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF8wNTA5OTMxYzliZTg0MGUyYTY3YmJjNjIwMDljZmYyNSA9ICQoYDxkaXYgaWQ9Imh0bWxfMDUwOTkzMWM5YmU4NDBlMmE2N2JiYzYyMDA5Y2ZmMjUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk5hcGE8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfNWMwM2ZlYzg4N2ExNDc3ZWFkMWM2OGM4M2VkNmM5MWMuc2V0Q29udGVudChodG1sXzA1MDk5MzFjOWJlODQwZTJhNjdiYmM2MjAwOWNmZjI1KTsKICAgICAgICAKCiAgICAgICAgY2lyY2xlX21hcmtlcl8xMzhlMDQ0Y2FmMmM0N2FiYjIxZmRjNTExNzFkZWVmOC5iaW5kUG9wdXAocG9wdXBfNWMwM2ZlYzg4N2ExNDc3ZWFkMWM2OGM4M2VkNmM5MWMpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2M0Zjg0OTBjNzliYTQwZTFhZjMwNGUxZTYxY2MzMDE1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzYuMTYyNjYzOCwgLTg2Ljc4MTYwMTZdLAogICAgICAgICAgICAgICAgeyJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwgImNvbG9yIjogIiNlYjdhMzQiLCAiZGFzaEFycmF5IjogbnVsbCwgImRhc2hPZmZzZXQiOiBudWxsLCAiZmlsbCI6IHRydWUsICJmaWxsQ29sb3IiOiAiI2ViN2EzNCIsICJmaWxsT3BhY2l0eSI6IDAuOCwgImZpbGxSdWxlIjogImV2ZW5vZGQiLCAibGluZUNhcCI6ICJyb3VuZCIsICJsaW5lSm9pbiI6ICJyb3VuZCIsICJvcGFjaXR5IjogMS4wLCAicmFkaXVzIjogMywgInN0cm9rZSI6IHRydWUsICJ3ZWlnaHQiOiAzfQogICAgICAgICAgICApLmFkZFRvKG1hcF80NGQ1YWFiOWVlZjk0MjcyOTQ1Yjc5MTZiNzI4OGNiMCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfM2M4MGY5Njk3NjBjNDEwM2I3NTA5MjA1MWMwODhmYjkgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sX2FmY2U1ZDg2MTM3MDQ1ZTZhZTlkY2YxZTEwMGM0YWVkID0gJChgPGRpdiBpZD0iaHRtbF9hZmNlNWQ4NjEzNzA0NWU2YWU5ZGNmMWUxMDBjNGFlZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TmFzaHZpbGxlPC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzNjODBmOTY5NzYwYzQxMDNiNzUwOTIwNTFjMDg4ZmI5LnNldENvbnRlbnQoaHRtbF9hZmNlNWQ4NjEzNzA0NWU2YWU5ZGNmMWUxMDBjNGFlZCk7CiAgICAgICAgCgogICAgICAgIGNpcmNsZV9tYXJrZXJfYzRmODQ5MGM3OWJhNDBlMWFmMzA0ZTFlNjFjYzMwMTUuYmluZFBvcHVwKHBvcHVwXzNjODBmOTY5NzYwYzQxMDNiNzUwOTIwNTFjMDg4ZmI5KQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lMjE2OWZiNjczYjE0Yjc0YTgyNmU0MDY2YjE2MGJjZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzI5LjcwMzAwMjQsIC05OC4xMjQ0NTMxXSwKICAgICAgICAgICAgICAgIHsiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsICJjb2xvciI6ICIjZWI3YTM0IiwgImRhc2hBcnJheSI6IG51bGwsICJkYXNoT2Zmc2V0IjogbnVsbCwgImZpbGwiOiB0cnVlLCAiZmlsbENvbG9yIjogIiNlYjdhMzQiLCAiZmlsbE9wYWNpdHkiOiAwLjgsICJmaWxsUnVsZSI6ICJldmVub2RkIiwgImxpbmVDYXAiOiAicm91bmQiLCAibGluZUpvaW4iOiAicm91bmQiLCAib3BhY2l0eSI6IDEuMCwgInJhZGl1cyI6IDEsICJzdHJva2UiOiB0cnVlLCAid2VpZ2h0IjogM30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDRkNWFhYjllZWY5NDI3Mjk0NWI3OTE2YjcyODhjYjApOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzc3OGFmMmNjOGYyYzRjMGU5ZDI0MDcyYzkxZTc2MTg1ID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF9iZTMxMDQ2MWQwYWI0ZjhiOTQ4MTYwZWRiN2RjOTE3NCA9ICQoYDxkaXYgaWQ9Imh0bWxfYmUzMTA0NjFkMGFiNGY4Yjk0ODE2MGVkYjdkYzkxNzQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk5ldyBCcmF1bmZlbHM8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfNzc4YWYyY2M4ZjJjNGMwZTlkMjQwNzJjOTFlNzYxODUuc2V0Q29udGVudChodG1sX2JlMzEwNDYxZDBhYjRmOGI5NDgxNjBlZGI3ZGM5MTc0KTsKICAgICAgICAKCiAgICAgICAgY2lyY2xlX21hcmtlcl9lMjE2OWZiNjczYjE0Yjc0YTgyNmU0MDY2YjE2MGJjZC5iaW5kUG9wdXAocG9wdXBfNzc4YWYyY2M4ZjJjNGMwZTlkMjQwNzJjOTFlNzYxODUpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzkyNGQzMmFjNDYxOTRlZmFiYzc3ODlhMjVhYTZiOWRjID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzcuMDg3MDgyMSwgLTc2LjQ3MzAxMjJdLAogICAgICAgICAgICAgICAgeyJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwgImNvbG9yIjogIiNlYjdhMzQiLCAiZGFzaEFycmF5IjogbnVsbCwgImRhc2hPZmZzZXQiOiBudWxsLCAiZmlsbCI6IHRydWUsICJmaWxsQ29sb3IiOiAiI2ViN2EzNCIsICJmaWxsT3BhY2l0eSI6IDAuOCwgImZpbGxSdWxlIjogImV2ZW5vZGQiLCAibGluZUNhcCI6ICJyb3VuZCIsICJsaW5lSm9pbiI6ICJyb3VuZCIsICJvcGFjaXR5IjogMS4wLCAicmFkaXVzIjogMSwgInN0cm9rZSI6IHRydWUsICJ3ZWlnaHQiOiAzfQogICAgICAgICAgICApLmFkZFRvKG1hcF80NGQ1YWFiOWVlZjk0MjcyOTQ1Yjc5MTZiNzI4OGNiMCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfOTNkYmM2MjUzMWVkNDNkMjkyNTQ3NDg5OWM4M2QyNjAgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sXzlmYmRiMWFmYTc2MDQzMzdhZGE4Yjc2YmVhYjQ0Yzk5ID0gJChgPGRpdiBpZD0iaHRtbF85ZmJkYjFhZmE3NjA0MzM3YWRhOGI3NmJlYWI0NGM5OSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+TmV3cG9ydCBOZXdzPC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzkzZGJjNjI1MzFlZDQzZDI5MjU0NzQ4OTljODNkMjYwLnNldENvbnRlbnQoaHRtbF85ZmJkYjFhZmE3NjA0MzM3YWRhOGI3NmJlYWI0NGM5OSk7CiAgICAgICAgCgogICAgICAgIGNpcmNsZV9tYXJrZXJfOTI0ZDMyYWM0NjE5NGVmYWJjNzc4OWEyNWFhNmI5ZGMuYmluZFBvcHVwKHBvcHVwXzkzZGJjNjI1MzFlZDQzZDI5MjU0NzQ4OTljODNkMjYwKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl82ZDgzNTNjY2MxYzQ0Yzk5YWEyZGY4ZDI1OTA5MWMxNiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjcxMjc4MzcsIC03NC4wMDU5NDEzXSwKICAgICAgICAgICAgICAgIHsiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsICJjb2xvciI6ICIjZWI3YTM0IiwgImRhc2hBcnJheSI6IG51bGwsICJkYXNoT2Zmc2V0IjogbnVsbCwgImZpbGwiOiB0cnVlLCAiZmlsbENvbG9yIjogIiNlYjdhMzQiLCAiZmlsbE9wYWNpdHkiOiAwLjgsICJmaWxsUnVsZSI6ICJldmVub2RkIiwgImxpbmVDYXAiOiAicm91bmQiLCAibGluZUpvaW4iOiAicm91bmQiLCAib3BhY2l0eSI6IDEuMCwgInJhZGl1cyI6IDYsICJzdHJva2UiOiB0cnVlLCAid2VpZ2h0IjogM30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDRkNWFhYjllZWY5NDI3Mjk0NWI3OTE2YjcyODhjYjApOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwX2QxZWQxNTY4NWI4NDQyNjA5MTM5ODkwODcxODAwN2U3ID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF8xYjYxODJlMzliMTM0NTk5YjhjZTAyMTlkYmRiNDBiMyA9ICQoYDxkaXYgaWQ9Imh0bWxfMWI2MTgyZTM5YjEzNDU5OWI4Y2UwMjE5ZGJkYjQwYjMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk5ldyBZb3JrPC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwX2QxZWQxNTY4NWI4NDQyNjA5MTM5ODkwODcxODAwN2U3LnNldENvbnRlbnQoaHRtbF8xYjYxODJlMzliMTM0NTk5YjhjZTAyMTlkYmRiNDBiMyk7CiAgICAgICAgCgogICAgICAgIGNpcmNsZV9tYXJrZXJfNmQ4MzUzY2NjMWM0NGM5OWFhMmRmOGQyNTkwOTFjMTYuYmluZFBvcHVwKHBvcHVwX2QxZWQxNTY4NWI4NDQyNjA5MTM5ODkwODcxODAwN2U3KQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jMDAxNjdlZGVjMjA0NmE0OWE3NTVlYzZjOGRiOTQzMSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjA0NTU5MTcsIC04Ni4wMDg1OTU1XSwKICAgICAgICAgICAgICAgIHsiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsICJjb2xvciI6ICIjZWI3YTM0IiwgImRhc2hBcnJheSI6IG51bGwsICJkYXNoT2Zmc2V0IjogbnVsbCwgImZpbGwiOiB0cnVlLCAiZmlsbENvbG9yIjogIiNlYjdhMzQiLCAiZmlsbE9wYWNpdHkiOiAwLjgsICJmaWxsUnVsZSI6ICJldmVub2RkIiwgImxpbmVDYXAiOiAicm91bmQiLCAibGluZUpvaW4iOiAicm91bmQiLCAib3BhY2l0eSI6IDEuMCwgInJhZGl1cyI6IDEsICJzdHJva2UiOiB0cnVlLCAid2VpZ2h0IjogM30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDRkNWFhYjllZWY5NDI3Mjk0NWI3OTE2YjcyODhjYjApOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwX2QwMzNiMjJhMTBlMzQwZjI5YzlmNTdjOWJjNmY3NzYwID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF9lZTA2Y2RkZDAwNzg0NmFlYjYxNGE5MGIzZDllMzkxMSA9ICQoYDxkaXYgaWQ9Imh0bWxfZWUwNmNkZGQwMDc4NDZhZWI2MTRhOTBiM2Q5ZTM5MTEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk5vYmxlc3ZpbGxlPC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwX2QwMzNiMjJhMTBlMzQwZjI5YzlmNTdjOWJjNmY3NzYwLnNldENvbnRlbnQoaHRtbF9lZTA2Y2RkZDAwNzg0NmFlYjYxNGE5MGIzZDllMzkxMSk7CiAgICAgICAgCgogICAgICAgIGNpcmNsZV9tYXJrZXJfYzAwMTY3ZWRlYzIwNDZhNDlhNzU1ZWM2YzhkYjk0MzEuYmluZFBvcHVwKHBvcHVwX2QwMzNiMjJhMTBlMzQwZjI5YzlmNTdjOWJjNmY3NzYwKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9lYjExYWQyNzc4NTg0YjdkOWVmNmYyM2NkZDA4NTg3ZiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM2Ljg1MDc2ODksIC03Ni4yODU4NzI2XSwKICAgICAgICAgICAgICAgIHsiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsICJjb2xvciI6ICIjZWI3YTM0IiwgImRhc2hBcnJheSI6IG51bGwsICJkYXNoT2Zmc2V0IjogbnVsbCwgImZpbGwiOiB0cnVlLCAiZmlsbENvbG9yIjogIiNlYjdhMzQiLCAiZmlsbE9wYWNpdHkiOiAwLjgsICJmaWxsUnVsZSI6ICJldmVub2RkIiwgImxpbmVDYXAiOiAicm91bmQiLCAibGluZUpvaW4iOiAicm91bmQiLCAib3BhY2l0eSI6IDEuMCwgInJhZGl1cyI6IDEsICJzdHJva2UiOiB0cnVlLCAid2VpZ2h0IjogM30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDRkNWFhYjllZWY5NDI3Mjk0NWI3OTE2YjcyODhjYjApOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzkzNTdiYmIwYmViYTQzYzhiN2I1OTQ2NDA0YTQ2NDcwID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF80NzRmOWVlMWExMzg0YmI3YmVjMjJhMzdkNGY2YjFkZSA9ICQoYDxkaXYgaWQ9Imh0bWxfNDc0ZjllZTFhMTM4NGJiN2JlYzIyYTM3ZDRmNmIxZGUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk5vcmZvbGs8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfOTM1N2JiYjBiZWJhNDNjOGI3YjU5NDY0MDRhNDY0NzAuc2V0Q29udGVudChodG1sXzQ3NGY5ZWUxYTEzODRiYjdiZWMyMmEzN2Q0ZjZiMWRlKTsKICAgICAgICAKCiAgICAgICAgY2lyY2xlX21hcmtlcl9lYjExYWQyNzc4NTg0YjdkOWVmNmYyM2NkZDA4NTg3Zi5iaW5kUG9wdXAocG9wdXBfOTM1N2JiYjBiZWJhNDNjOGI3YjU5NDY0MDRhNDY0NzApCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2U0MDBkNDY4NTZhODQwMTNiZGMzMTJjN2UxMDUzZDgyID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzMuOTAyMjM2NywgLTExOC4wODE3MzNdLAogICAgICAgICAgICAgICAgeyJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwgImNvbG9yIjogIiNlYjdhMzQiLCAiZGFzaEFycmF5IjogbnVsbCwgImRhc2hPZmZzZXQiOiBudWxsLCAiZmlsbCI6IHRydWUsICJmaWxsQ29sb3IiOiAiI2ViN2EzNCIsICJmaWxsT3BhY2l0eSI6IDAuOCwgImZpbGxSdWxlIjogImV2ZW5vZGQiLCAibGluZUNhcCI6ICJyb3VuZCIsICJsaW5lSm9pbiI6ICJyb3VuZCIsICJvcGFjaXR5IjogMS4wLCAicmFkaXVzIjogMSwgInN0cm9rZSI6IHRydWUsICJ3ZWlnaHQiOiAzfQogICAgICAgICAgICApLmFkZFRvKG1hcF80NGQ1YWFiOWVlZjk0MjcyOTQ1Yjc5MTZiNzI4OGNiMCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfM2U5Y2ZiZGU2NWFmNGFlODg0MzlkZTU3MjYzMmMwZmUgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sX2FjN2EwOWUyMTA5ZjQ5ZTRhZDFjYjRkYmI3YWU4OWFmID0gJChgPGRpdiBpZD0iaHRtbF9hYzdhMDllMjEwOWY0OWU0YWQxY2I0ZGJiN2FlODlhZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Tm9yd2FsazwvZGl2PmApWzBdOwogICAgICAgICAgICBwb3B1cF8zZTljZmJkZTY1YWY0YWU4ODQzOWRlNTcyNjMyYzBmZS5zZXRDb250ZW50KGh0bWxfYWM3YTA5ZTIxMDlmNDllNGFkMWNiNGRiYjdhZTg5YWYpOwogICAgICAgIAoKICAgICAgICBjaXJjbGVfbWFya2VyX2U0MDBkNDY4NTZhODQwMTNiZGMzMTJjN2UxMDUzZDgyLmJpbmRQb3B1cChwb3B1cF8zZTljZmJkZTY1YWY0YWU4ODQzOWRlNTcyNjMyYzBmZSkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZmJiOTc2MGM3YTZiNDk4NTgzZGQyYWE0NmU2MDRiNWEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0MS4yMjMsIC0xMTEuOTczODMwNF0sCiAgICAgICAgICAgICAgICB7ImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLCAiY29sb3IiOiAiI2ViN2EzNCIsICJkYXNoQXJyYXkiOiBudWxsLCAiZGFzaE9mZnNldCI6IG51bGwsICJmaWxsIjogdHJ1ZSwgImZpbGxDb2xvciI6ICIjZWI3YTM0IiwgImZpbGxPcGFjaXR5IjogMC44LCAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsICJsaW5lQ2FwIjogInJvdW5kIiwgImxpbmVKb2luIjogInJvdW5kIiwgIm9wYWNpdHkiOiAxLjAsICJyYWRpdXMiOiAxLCAic3Ryb2tlIjogdHJ1ZSwgIndlaWdodCI6IDN9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0ZDVhYWI5ZWVmOTQyNzI5NDViNzkxNmI3Mjg4Y2IwKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF8wYTFmOTgxYTg1OTQ0ZmVjYjUxZmEwNmUzOGJlOGQ4YSA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfMWVjMDE2MWZjNDM3NGQ3OTliZjEyYzNmMWZkZmQ5NTcgPSAkKGA8ZGl2IGlkPSJodG1sXzFlYzAxNjFmYzQzNzRkNzk5YmYxMmMzZjFmZGZkOTU3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5PZ2RlbjwvZGl2PmApWzBdOwogICAgICAgICAgICBwb3B1cF8wYTFmOTgxYTg1OTQ0ZmVjYjUxZmEwNmUzOGJlOGQ4YS5zZXRDb250ZW50KGh0bWxfMWVjMDE2MWZjNDM3NGQ3OTliZjEyYzNmMWZkZmQ5NTcpOwogICAgICAgIAoKICAgICAgICBjaXJjbGVfbWFya2VyX2ZiYjk3NjBjN2E2YjQ5ODU4M2RkMmFhNDZlNjA0YjVhLmJpbmRQb3B1cChwb3B1cF8wYTFmOTgxYTg1OTQ0ZmVjYjUxZmEwNmUzOGJlOGQ4YSkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfM2UzZDI4MjBkYTQ0NDUyZTgwZGM3MjI2N2I3MmFjOGQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNS40Njc1NjAyLCAtOTcuNTE2NDI3Nl0sCiAgICAgICAgICAgICAgICB7ImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLCAiY29sb3IiOiAiI2ViN2EzNCIsICJkYXNoQXJyYXkiOiBudWxsLCAiZGFzaE9mZnNldCI6IG51bGwsICJmaWxsIjogdHJ1ZSwgImZpbGxDb2xvciI6ICIjZWI3YTM0IiwgImZpbGxPcGFjaXR5IjogMC44LCAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsICJsaW5lQ2FwIjogInJvdW5kIiwgImxpbmVKb2luIjogInJvdW5kIiwgIm9wYWNpdHkiOiAxLjAsICJyYWRpdXMiOiAxLCAic3Ryb2tlIjogdHJ1ZSwgIndlaWdodCI6IDN9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0ZDVhYWI5ZWVmOTQyNzI5NDViNzkxNmI3Mjg4Y2IwKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF85YjI0ZDlhZWM4YWU0YmIxYjg5N2RhMTY1ODkwOWY3MSA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfZTEwMGY3MzJiMWIxNGUxM2JhOGFiZDJmNjc1Njk3MWMgPSAkKGA8ZGl2IGlkPSJodG1sX2UxMDBmNzMyYjFiMTRlMTNiYThhYmQyZjY3NTY5NzFjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Pa2xhaG9tYSBDaXR5PC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzliMjRkOWFlYzhhZTRiYjFiODk3ZGExNjU4OTA5ZjcxLnNldENvbnRlbnQoaHRtbF9lMTAwZjczMmIxYjE0ZTEzYmE4YWJkMmY2NzU2OTcxYyk7CiAgICAgICAgCgogICAgICAgIGNpcmNsZV9tYXJrZXJfM2UzZDI4MjBkYTQ0NDUyZTgwZGM3MjI2N2I3MmFjOGQuYmluZFBvcHVwKHBvcHVwXzliMjRkOWFlYzhhZTRiYjFiODk3ZGExNjU4OTA5ZjcxKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9iNGM3M2EzYjk3Njk0OTkxOTFhNGFjYjhiOTk2N2FjMyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM4Ljg4MTM5NTgsIC05NC44MTkxMjg1XSwKICAgICAgICAgICAgICAgIHsiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsICJjb2xvciI6ICIjZWI3YTM0IiwgImRhc2hBcnJheSI6IG51bGwsICJkYXNoT2Zmc2V0IjogbnVsbCwgImZpbGwiOiB0cnVlLCAiZmlsbENvbG9yIjogIiNlYjdhMzQiLCAiZmlsbE9wYWNpdHkiOiAwLjgsICJmaWxsUnVsZSI6ICJldmVub2RkIiwgImxpbmVDYXAiOiAicm91bmQiLCAibGluZUpvaW4iOiAicm91bmQiLCAib3BhY2l0eSI6IDEuMCwgInJhZGl1cyI6IDEsICJzdHJva2UiOiB0cnVlLCAid2VpZ2h0IjogM30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDRkNWFhYjllZWY5NDI3Mjk0NWI3OTE2YjcyODhjYjApOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzg2MGMzN2I0NGYwYzQxYTQ5N2UwODliYjI5OTU4Nzg0ID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF8xYTU1NGFmNmNhZGM0NjBkYmQ5ZGVhZTI3ZDVmZWNlYiA9ICQoYDxkaXYgaWQ9Imh0bWxfMWE1NTRhZjZjYWRjNDYwZGJkOWRlYWUyN2Q1ZmVjZWIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk9sYXRoZTwvZGl2PmApWzBdOwogICAgICAgICAgICBwb3B1cF84NjBjMzdiNDRmMGM0MWE0OTdlMDg5YmIyOTk1ODc4NC5zZXRDb250ZW50KGh0bWxfMWE1NTRhZjZjYWRjNDYwZGJkOWRlYWUyN2Q1ZmVjZWIpOwogICAgICAgIAoKICAgICAgICBjaXJjbGVfbWFya2VyX2I0YzczYTNiOTc2OTQ5OTE5MWE0YWNiOGI5OTY3YWMzLmJpbmRQb3B1cChwb3B1cF84NjBjMzdiNDRmMGM0MWE0OTdlMDg5YmIyOTk1ODc4NCkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfM2QyOWJhMTBkMTc2NGFkMDk3Mzc5NjQxY2YzYTAwODEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny4wMzc4NzQxLCAtMTIyLjkwMDY5NTFdLAogICAgICAgICAgICAgICAgeyJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwgImNvbG9yIjogIiNlYjdhMzQiLCAiZGFzaEFycmF5IjogbnVsbCwgImRhc2hPZmZzZXQiOiBudWxsLCAiZmlsbCI6IHRydWUsICJmaWxsQ29sb3IiOiAiI2ViN2EzNCIsICJmaWxsT3BhY2l0eSI6IDAuOCwgImZpbGxSdWxlIjogImV2ZW5vZGQiLCAibGluZUNhcCI6ICJyb3VuZCIsICJsaW5lSm9pbiI6ICJyb3VuZCIsICJvcGFjaXR5IjogMS4wLCAicmFkaXVzIjogMiwgInN0cm9rZSI6IHRydWUsICJ3ZWlnaHQiOiAzfQogICAgICAgICAgICApLmFkZFRvKG1hcF80NGQ1YWFiOWVlZjk0MjcyOTQ1Yjc5MTZiNzI4OGNiMCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfZjI0YjIwM2M1MTQ3NDA4Zjk4NjFlMDM3NTE2OTM4YmUgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sX2VmN2IzNDUyZTA5MDRjZGU4OWI5MWZkYTNjZDJhOGEzID0gJChgPGRpdiBpZD0iaHRtbF9lZjdiMzQ1MmUwOTA0Y2RlODliOTFmZGEzY2QyYThhMyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+T2x5bXBpYTwvZGl2PmApWzBdOwogICAgICAgICAgICBwb3B1cF9mMjRiMjAzYzUxNDc0MDhmOTg2MWUwMzc1MTY5MzhiZS5zZXRDb250ZW50KGh0bWxfZWY3YjM0NTJlMDkwNGNkZTg5YjkxZmRhM2NkMmE4YTMpOwogICAgICAgIAoKICAgICAgICBjaXJjbGVfbWFya2VyXzNkMjliYTEwZDE3NjRhZDA5NzM3OTY0MWNmM2EwMDgxLmJpbmRQb3B1cChwb3B1cF9mMjRiMjAzYzUxNDc0MDhmOTg2MWUwMzc1MTY5MzhiZSkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNzBhOTJkN2ViOTY2NDJmNjkyODZkYTllM2MwN2FmMTIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNC4wNjMzNDQzLCAtMTE3LjY1MDg4NzZdLAogICAgICAgICAgICAgICAgeyJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwgImNvbG9yIjogIiNlYjdhMzQiLCAiZGFzaEFycmF5IjogbnVsbCwgImRhc2hPZmZzZXQiOiBudWxsLCAiZmlsbCI6IHRydWUsICJmaWxsQ29sb3IiOiAiI2ViN2EzNCIsICJmaWxsT3BhY2l0eSI6IDAuOCwgImZpbGxSdWxlIjogImV2ZW5vZGQiLCAibGluZUNhcCI6ICJyb3VuZCIsICJsaW5lSm9pbiI6ICJyb3VuZCIsICJvcGFjaXR5IjogMS4wLCAicmFkaXVzIjogMSwgInN0cm9rZSI6IHRydWUsICJ3ZWlnaHQiOiAzfQogICAgICAgICAgICApLmFkZFRvKG1hcF80NGQ1YWFiOWVlZjk0MjcyOTQ1Yjc5MTZiNzI4OGNiMCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfMWI0MzA1ZWQyYTliNGNlMWFiZDY4N2M3YjBiMDAyZGIgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sXzhkYjVlMzQyNjE0MTQ1NDliNjk2NDlkY2RmMzBiMmEyID0gJChgPGRpdiBpZD0iaHRtbF84ZGI1ZTM0MjYxNDE0NTQ5YjY5NjQ5ZGNkZjMwYjJhMiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+T250YXJpbzwvZGl2PmApWzBdOwogICAgICAgICAgICBwb3B1cF8xYjQzMDVlZDJhOWI0Y2UxYWJkNjg3YzdiMGIwMDJkYi5zZXRDb250ZW50KGh0bWxfOGRiNWUzNDI2MTQxNDU0OWI2OTY0OWRjZGYzMGIyYTIpOwogICAgICAgIAoKICAgICAgICBjaXJjbGVfbWFya2VyXzcwYTkyZDdlYjk2NjQyZjY5Mjg2ZGE5ZTNjMDdhZjEyLmJpbmRQb3B1cChwb3B1cF8xYjQzMDVlZDJhOWI0Y2UxYWJkNjg3YzdiMGIwMDJkYikKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZDE5YjRiODhhZmQxNGRiNTk1ZDVjNjQwOGU4ZGRiMTIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFsyOC41MzgzMzU1LCAtODEuMzc5MjM2NV0sCiAgICAgICAgICAgICAgICB7ImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLCAiY29sb3IiOiAiI2ViN2EzNCIsICJkYXNoQXJyYXkiOiBudWxsLCAiZGFzaE9mZnNldCI6IG51bGwsICJmaWxsIjogdHJ1ZSwgImZpbGxDb2xvciI6ICIjZWI3YTM0IiwgImZpbGxPcGFjaXR5IjogMC44LCAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsICJsaW5lQ2FwIjogInJvdW5kIiwgImxpbmVKb2luIjogInJvdW5kIiwgIm9wYWNpdHkiOiAxLjAsICJyYWRpdXMiOiAyLCAic3Ryb2tlIjogdHJ1ZSwgIndlaWdodCI6IDN9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0ZDVhYWI5ZWVmOTQyNzI5NDViNzkxNmI3Mjg4Y2IwKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF8zMzM1ZmJkNmNjZTI0MjBiYjBkM2FlNGY4MmU2YzFiMCA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfY2EzYzJlN2ZiNjFmNDcxODgyMDdlOWQ0MTM1YmE1YjggPSAkKGA8ZGl2IGlkPSJodG1sX2NhM2MyZTdmYjYxZjQ3MTg4MjA3ZTlkNDEzNWJhNWI4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5PcmxhbmRvPC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzMzMzVmYmQ2Y2NlMjQyMGJiMGQzYWU0ZjgyZTZjMWIwLnNldENvbnRlbnQoaHRtbF9jYTNjMmU3ZmI2MWY0NzE4ODIwN2U5ZDQxMzViYTViOCk7CiAgICAgICAgCgogICAgICAgIGNpcmNsZV9tYXJrZXJfZDE5YjRiODhhZmQxNGRiNTk1ZDVjNjQwOGU4ZGRiMTIuYmluZFBvcHVwKHBvcHVwXzMzMzVmYmQ2Y2NlMjQyMGJiMGQzYWU0ZjgyZTZjMWIwKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81ODc3ZGIxMWM1NGU0MGVmODRmNzRjMDNiYmYzMmRmMSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM4Ljk4MjIyODIsIC05NC42NzA3OTE3XSwKICAgICAgICAgICAgICAgIHsiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsICJjb2xvciI6ICIjZWI3YTM0IiwgImRhc2hBcnJheSI6IG51bGwsICJkYXNoT2Zmc2V0IjogbnVsbCwgImZpbGwiOiB0cnVlLCAiZmlsbENvbG9yIjogIiNlYjdhMzQiLCAiZmlsbE9wYWNpdHkiOiAwLjgsICJmaWxsUnVsZSI6ICJldmVub2RkIiwgImxpbmVDYXAiOiAicm91bmQiLCAibGluZUpvaW4iOiAicm91bmQiLCAib3BhY2l0eSI6IDEuMCwgInJhZGl1cyI6IDEsICJzdHJva2UiOiB0cnVlLCAid2VpZ2h0IjogM30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDRkNWFhYjllZWY5NDI3Mjk0NWI3OTE2YjcyODhjYjApOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzUxNzcyOWFjMzY3NzRmNmQ4YzIwZTg4ZWIwZjc5ZTRjID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF85YjAyYTc1ODZiODQ0MDljOGVhMjNhYzk0ZDg2ODQ3NSA9ICQoYDxkaXYgaWQ9Imh0bWxfOWIwMmE3NTg2Yjg0NDA5YzhlYTIzYWM5NGQ4Njg0NzUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk92ZXJsYW5kIFBhcms8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfNTE3NzI5YWMzNjc3NGY2ZDhjMjBlODhlYjBmNzllNGMuc2V0Q29udGVudChodG1sXzliMDJhNzU4NmI4NDQwOWM4ZWEyM2FjOTRkODY4NDc1KTsKICAgICAgICAKCiAgICAgICAgY2lyY2xlX21hcmtlcl81ODc3ZGIxMWM1NGU0MGVmODRmNzRjMDNiYmYzMmRmMS5iaW5kUG9wdXAocG9wdXBfNTE3NzI5YWMzNjc3NGY2ZDhjMjBlODhlYjBmNzllNGMpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzNmMjJmMDc2YTA5OTRiZGRiZDc1NWJlNzAzODM1ZWVhID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzQuMTk3NTA0OCwgLTExOS4xNzcwNTE2XSwKICAgICAgICAgICAgICAgIHsiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsICJjb2xvciI6ICIjZWI3YTM0IiwgImRhc2hBcnJheSI6IG51bGwsICJkYXNoT2Zmc2V0IjogbnVsbCwgImZpbGwiOiB0cnVlLCAiZmlsbENvbG9yIjogIiNlYjdhMzQiLCAiZmlsbE9wYWNpdHkiOiAwLjgsICJmaWxsUnVsZSI6ICJldmVub2RkIiwgImxpbmVDYXAiOiAicm91bmQiLCAibGluZUpvaW4iOiAicm91bmQiLCAib3BhY2l0eSI6IDEuMCwgInJhZGl1cyI6IDEsICJzdHJva2UiOiB0cnVlLCAid2VpZ2h0IjogM30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDRkNWFhYjllZWY5NDI3Mjk0NWI3OTE2YjcyODhjYjApOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzE2MTQ2ZDAxODY2MDRhNWU5NmY1ZmFlMjlkNTcwZGIzID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF82YWFmMjM3MDE0ODM0MjMwOTkwMWQ3MzczOGRjZDMxNSA9ICQoYDxkaXYgaWQ9Imh0bWxfNmFhZjIzNzAxNDgzNDIzMDk5MDFkNzM3MzhkY2QzMTUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPk94bmFyZDwvZGl2PmApWzBdOwogICAgICAgICAgICBwb3B1cF8xNjE0NmQwMTg2NjA0YTVlOTZmNWZhZTI5ZDU3MGRiMy5zZXRDb250ZW50KGh0bWxfNmFhZjIzNzAxNDgzNDIzMDk5MDFkNzM3MzhkY2QzMTUpOwogICAgICAgIAoKICAgICAgICBjaXJjbGVfbWFya2VyXzNmMjJmMDc2YTA5OTRiZGRiZDc1NWJlNzAzODM1ZWVhLmJpbmRQb3B1cChwb3B1cF8xNjE0NmQwMTg2NjA0YTVlOTZmNWZhZTI5ZDU3MGRiMykKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNDcwY2MzMDlkMzZlNGRkMTgzZWI0ODZhM2ZiYmYxOTYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNy42MTM4MjUzLCAtMTIyLjQ4NjkxOTRdLAogICAgICAgICAgICAgICAgeyJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwgImNvbG9yIjogIiNlYjdhMzQiLCAiZGFzaEFycmF5IjogbnVsbCwgImRhc2hPZmZzZXQiOiBudWxsLCAiZmlsbCI6IHRydWUsICJmaWxsQ29sb3IiOiAiI2ViN2EzNCIsICJmaWxsT3BhY2l0eSI6IDAuOCwgImZpbGxSdWxlIjogImV2ZW5vZGQiLCAibGluZUNhcCI6ICJyb3VuZCIsICJsaW5lSm9pbiI6ICJyb3VuZCIsICJvcGFjaXR5IjogMS4wLCAicmFkaXVzIjogMSwgInN0cm9rZSI6IHRydWUsICJ3ZWlnaHQiOiAzfQogICAgICAgICAgICApLmFkZFRvKG1hcF80NGQ1YWFiOWVlZjk0MjcyOTQ1Yjc5MTZiNzI4OGNiMCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfMGFlMjI2ZmYzNWJlNGZmYWEwMTBiZGRkNjBkMTI3OWIgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sXzliZTNjMzU0N2E0MjRjNzc4OTZlNzIyOGVkZjAzYmIwID0gJChgPGRpdiBpZD0iaHRtbF85YmUzYzM1NDdhNDI0Yzc3ODk2ZTcyMjhlZGYwM2JiMCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UGFjaWZpY2E8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfMGFlMjI2ZmYzNWJlNGZmYWEwMTBiZGRkNjBkMTI3OWIuc2V0Q29udGVudChodG1sXzliZTNjMzU0N2E0MjRjNzc4OTZlNzIyOGVkZjAzYmIwKTsKICAgICAgICAKCiAgICAgICAgY2lyY2xlX21hcmtlcl80NzBjYzMwOWQzNmU0ZGQxODNlYjQ4NmEzZmJiZjE5Ni5iaW5kUG9wdXAocG9wdXBfMGFlMjI2ZmYzNWJlNGZmYWEwMTBiZGRkNjBkMTI3OWIpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2Y5NWE0MTViZTViZTQzYTU5M2ExZGVmYTU3ZjFjNDUwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDIuMTEwMzA0MSwgLTg4LjAzNDI0XSwKICAgICAgICAgICAgICAgIHsiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsICJjb2xvciI6ICIjZWI3YTM0IiwgImRhc2hBcnJheSI6IG51bGwsICJkYXNoT2Zmc2V0IjogbnVsbCwgImZpbGwiOiB0cnVlLCAiZmlsbENvbG9yIjogIiNlYjdhMzQiLCAiZmlsbE9wYWNpdHkiOiAwLjgsICJmaWxsUnVsZSI6ICJldmVub2RkIiwgImxpbmVDYXAiOiAicm91bmQiLCAibGluZUpvaW4iOiAicm91bmQiLCAib3BhY2l0eSI6IDEuMCwgInJhZGl1cyI6IDEsICJzdHJva2UiOiB0cnVlLCAid2VpZ2h0IjogM30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDRkNWFhYjllZWY5NDI3Mjk0NWI3OTE2YjcyODhjYjApOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwX2VkYThmMzRhMzkwNTRmYWFiMGVjMDg4N2MxMmEyZTM4ID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF9mYzg1NjMzNWVkNWI0NDc5OTRiY2VlYzljMDMwMTExMCA9ICQoYDxkaXYgaWQ9Imh0bWxfZmM4NTYzMzVlZDViNDQ3OTk0YmNlZWM5YzAzMDExMTAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlBhbGF0aW5lPC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwX2VkYThmMzRhMzkwNTRmYWFiMGVjMDg4N2MxMmEyZTM4LnNldENvbnRlbnQoaHRtbF9mYzg1NjMzNWVkNWI0NDc5OTRiY2VlYzljMDMwMTExMCk7CiAgICAgICAgCgogICAgICAgIGNpcmNsZV9tYXJrZXJfZjk1YTQxNWJlNWJlNDNhNTkzYTFkZWZhNTdmMWM0NTAuYmluZFBvcHVwKHBvcHVwX2VkYThmMzRhMzkwNTRmYWFiMGVjMDg4N2MxMmEyZTM4KQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl84NmQyNzU4OWZmY2M0YjRjYmRkY2U0N2VlYzNhZjU0NSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzMwLjE1ODgxMjksIC04NS42NjAyMDU4XSwKICAgICAgICAgICAgICAgIHsiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsICJjb2xvciI6ICIjZWI3YTM0IiwgImRhc2hBcnJheSI6IG51bGwsICJkYXNoT2Zmc2V0IjogbnVsbCwgImZpbGwiOiB0cnVlLCAiZmlsbENvbG9yIjogIiNlYjdhMzQiLCAiZmlsbE9wYWNpdHkiOiAwLjgsICJmaWxsUnVsZSI6ICJldmVub2RkIiwgImxpbmVDYXAiOiAicm91bmQiLCAibGluZUpvaW4iOiAicm91bmQiLCAib3BhY2l0eSI6IDEuMCwgInJhZGl1cyI6IDEsICJzdHJva2UiOiB0cnVlLCAid2VpZ2h0IjogM30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDRkNWFhYjllZWY5NDI3Mjk0NWI3OTE2YjcyODhjYjApOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwX2RjYzBjOGRjZjU3ODQwNDM5MTg4ZmNkM2U3MTM2MjUxID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF8xOTlkODhiNDUxOTM0ZGE2OTY4YzA1YWUxMTJhMzE4OCA9ICQoYDxkaXYgaWQ9Imh0bWxfMTk5ZDg4YjQ1MTkzNGRhNjk2OGMwNWFlMTEyYTMxODgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlBhbmFtYSBDaXR5PC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwX2RjYzBjOGRjZjU3ODQwNDM5MTg4ZmNkM2U3MTM2MjUxLnNldENvbnRlbnQoaHRtbF8xOTlkODhiNDUxOTM0ZGE2OTY4YzA1YWUxMTJhMzE4OCk7CiAgICAgICAgCgogICAgICAgIGNpcmNsZV9tYXJrZXJfODZkMjc1ODlmZmNjNGI0Y2JkZGNlNDdlZWMzYWY1NDUuYmluZFBvcHVwKHBvcHVwX2RjYzBjOGRjZjU3ODQwNDM5MTg4ZmNkM2U3MTM2MjUxKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8yYjRhNzEzZTVhODM0ODIxYTAzYjQxOTJkYWE4YWUwOSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzMzLjg4OTQ1OTgsIC0xMTguMTU5NzkxMV0sCiAgICAgICAgICAgICAgICB7ImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLCAiY29sb3IiOiAiI2ViN2EzNCIsICJkYXNoQXJyYXkiOiBudWxsLCAiZGFzaE9mZnNldCI6IG51bGwsICJmaWxsIjogdHJ1ZSwgImZpbGxDb2xvciI6ICIjZWI3YTM0IiwgImZpbGxPcGFjaXR5IjogMC44LCAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsICJsaW5lQ2FwIjogInJvdW5kIiwgImxpbmVKb2luIjogInJvdW5kIiwgIm9wYWNpdHkiOiAxLjAsICJyYWRpdXMiOiAxLCAic3Ryb2tlIjogdHJ1ZSwgIndlaWdodCI6IDN9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0ZDVhYWI5ZWVmOTQyNzI5NDViNzkxNmI3Mjg4Y2IwKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF9iNWE0YzBlZjEwMzA0NjI2ODZjNjYwMTdiZmZkYWZkYyA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfMWE0MDcyOTkzZGFlNDEyN2JiZDA2NjM1OWE4ZWFlNjQgPSAkKGA8ZGl2IGlkPSJodG1sXzFhNDA3Mjk5M2RhZTQxMjdiYmQwNjYzNTlhOGVhZTY0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5QYXJhbW91bnQ8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfYjVhNGMwZWYxMDMwNDYyNjg2YzY2MDE3YmZmZGFmZGMuc2V0Q29udGVudChodG1sXzFhNDA3Mjk5M2RhZTQxMjdiYmQwNjYzNTlhOGVhZTY0KTsKICAgICAgICAKCiAgICAgICAgY2lyY2xlX21hcmtlcl8yYjRhNzEzZTVhODM0ODIxYTAzYjQxOTJkYWE4YWUwOS5iaW5kUG9wdXAocG9wdXBfYjVhNGMwZWYxMDMwNDYyNjg2YzY2MDE3YmZmZGFmZGMpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzZiMTI2OTgyZGI4MjQ1OTA4ODFkODQzOGU5OGVmYjBmID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzkuOTUyNTgzOSwgLTc1LjE2NTIyMTVdLAogICAgICAgICAgICAgICAgeyJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwgImNvbG9yIjogIiNlYjdhMzQiLCAiZGFzaEFycmF5IjogbnVsbCwgImRhc2hPZmZzZXQiOiBudWxsLCAiZmlsbCI6IHRydWUsICJmaWxsQ29sb3IiOiAiI2ViN2EzNCIsICJmaWxsT3BhY2l0eSI6IDAuOCwgImZpbGxSdWxlIjogImV2ZW5vZGQiLCAibGluZUNhcCI6ICJyb3VuZCIsICJsaW5lSm9pbiI6ICJyb3VuZCIsICJvcGFjaXR5IjogMS4wLCAicmFkaXVzIjogMiwgInN0cm9rZSI6IHRydWUsICJ3ZWlnaHQiOiAzfQogICAgICAgICAgICApLmFkZFRvKG1hcF80NGQ1YWFiOWVlZjk0MjcyOTQ1Yjc5MTZiNzI4OGNiMCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfOWVmZDUyZDAxMGNjNDdkYzlhMDBjNzQzNDdkZGE5OWIgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sX2ZkMTQ3YWY1YWM5MjQzOWViY2YwZWI1MzU0YjUzNjJiID0gJChgPGRpdiBpZD0iaHRtbF9mZDE0N2FmNWFjOTI0MzllYmNmMGViNTM1NGI1MzYyYiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UGhpbGFkZWxwaGlhPC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzllZmQ1MmQwMTBjYzQ3ZGM5YTAwYzc0MzQ3ZGRhOTliLnNldENvbnRlbnQoaHRtbF9mZDE0N2FmNWFjOTI0MzllYmNmMGViNTM1NGI1MzYyYik7CiAgICAgICAgCgogICAgICAgIGNpcmNsZV9tYXJrZXJfNmIxMjY5ODJkYjgyNDU5MDg4MWQ4NDM4ZTk4ZWZiMGYuYmluZFBvcHVwKHBvcHVwXzllZmQ1MmQwMTBjYzQ3ZGM5YTAwYzc0MzQ3ZGRhOTliKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81OGRlNTM2NDkzMTE0NTkwODg5ZGMyYzQ1MTA4NTgwZSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzMzLjQ0ODM3NzEsIC0xMTIuMDc0MDM3M10sCiAgICAgICAgICAgICAgICB7ImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLCAiY29sb3IiOiAiI2ViN2EzNCIsICJkYXNoQXJyYXkiOiBudWxsLCAiZGFzaE9mZnNldCI6IG51bGwsICJmaWxsIjogdHJ1ZSwgImZpbGxDb2xvciI6ICIjZWI3YTM0IiwgImZpbGxPcGFjaXR5IjogMC44LCAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsICJsaW5lQ2FwIjogInJvdW5kIiwgImxpbmVKb2luIjogInJvdW5kIiwgIm9wYWNpdHkiOiAxLjAsICJyYWRpdXMiOiAxLCAic3Ryb2tlIjogdHJ1ZSwgIndlaWdodCI6IDN9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0ZDVhYWI5ZWVmOTQyNzI5NDViNzkxNmI3Mjg4Y2IwKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF84ZmI0ZmVhM2Q1YTc0OTY0YWE1YjA0N2I2OTA1MTJiZiA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfY2RhZmE3NmE3NmJkNDMwZjllNzA3Y2I5ZGNhODU3NGEgPSAkKGA8ZGl2IGlkPSJodG1sX2NkYWZhNzZhNzZiZDQzMGY5ZTcwN2NiOWRjYTg1NzRhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5QaG9lbml4PC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzhmYjRmZWEzZDVhNzQ5NjRhYTViMDQ3YjY5MDUxMmJmLnNldENvbnRlbnQoaHRtbF9jZGFmYTc2YTc2YmQ0MzBmOWU3MDdjYjlkY2E4NTc0YSk7CiAgICAgICAgCgogICAgICAgIGNpcmNsZV9tYXJrZXJfNThkZTUzNjQ5MzExNDU5MDg4OWRjMmM0NTEwODU4MGUuYmluZFBvcHVwKHBvcHVwXzhmYjRmZWEzZDVhNzQ5NjRhYTViMDQ3YjY5MDUxMmJmKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8yODU2ZDAxZDVlMzE0ZDVjYmM0YzFhNjMxN2NmZjJiYiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjQ0MDYyNDgsIC03OS45OTU4ODY0XSwKICAgICAgICAgICAgICAgIHsiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsICJjb2xvciI6ICIjZWI3YTM0IiwgImRhc2hBcnJheSI6IG51bGwsICJkYXNoT2Zmc2V0IjogbnVsbCwgImZpbGwiOiB0cnVlLCAiZmlsbENvbG9yIjogIiNlYjdhMzQiLCAiZmlsbE9wYWNpdHkiOiAwLjgsICJmaWxsUnVsZSI6ICJldmVub2RkIiwgImxpbmVDYXAiOiAicm91bmQiLCAibGluZUpvaW4iOiAicm91bmQiLCAib3BhY2l0eSI6IDEuMCwgInJhZGl1cyI6IDEsICJzdHJva2UiOiB0cnVlLCAid2VpZ2h0IjogM30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDRkNWFhYjllZWY5NDI3Mjk0NWI3OTE2YjcyODhjYjApOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzg4ZjA3YTk0ODYwMjRjYmU4ZTY5OTNiMWVjNzkzMDkzID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF9jYjgzODM0ZTkzMmM0NDI2ODMwOGEzNzBhOTUxYTAxNCA9ICQoYDxkaXYgaWQ9Imh0bWxfY2I4MzgzNGU5MzJjNDQyNjgzMDhhMzcwYTk1MWEwMTQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlBpdHRzYnVyZ2g8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfODhmMDdhOTQ4NjAyNGNiZThlNjk5M2IxZWM3OTMwOTMuc2V0Q29udGVudChodG1sX2NiODM4MzRlOTMyYzQ0MjY4MzA4YTM3MGE5NTFhMDE0KTsKICAgICAgICAKCiAgICAgICAgY2lyY2xlX21hcmtlcl8yODU2ZDAxZDVlMzE0ZDVjYmM0YzFhNjMxN2NmZjJiYi5iaW5kUG9wdXAocG9wdXBfODhmMDdhOTQ4NjAyNGNiZThlNjk5M2IxZWM3OTMwOTMpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzhiY2QwOGM1OWJlYTRmYjE5MTQ5NDI3YTI3NDA2ZGQ5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzMuMDE5ODQzMSwgLTk2LjY5ODg4NTZdLAogICAgICAgICAgICAgICAgeyJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwgImNvbG9yIjogIiNlYjdhMzQiLCAiZGFzaEFycmF5IjogbnVsbCwgImRhc2hPZmZzZXQiOiBudWxsLCAiZmlsbCI6IHRydWUsICJmaWxsQ29sb3IiOiAiI2ViN2EzNCIsICJmaWxsT3BhY2l0eSI6IDAuOCwgImZpbGxSdWxlIjogImV2ZW5vZGQiLCAibGluZUNhcCI6ICJyb3VuZCIsICJsaW5lSm9pbiI6ICJyb3VuZCIsICJvcGFjaXR5IjogMS4wLCAicmFkaXVzIjogMiwgInN0cm9rZSI6IHRydWUsICJ3ZWlnaHQiOiAzfQogICAgICAgICAgICApLmFkZFRvKG1hcF80NGQ1YWFiOWVlZjk0MjcyOTQ1Yjc5MTZiNzI4OGNiMCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfYTE2YjUwNmQ1MDkwNDk4MjgzYWRjYWZiNjkwMDhkYjcgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sX2M2NjA5ZTYwMzUwMjQ0OWY5MDc0ZWNjZTljZDE2ODQ0ID0gJChgPGRpdiBpZD0iaHRtbF9jNjYwOWU2MDM1MDI0NDlmOTA3NGVjY2U5Y2QxNjg0NCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UGxhbm88L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfYTE2YjUwNmQ1MDkwNDk4MjgzYWRjYWZiNjkwMDhkYjcuc2V0Q29udGVudChodG1sX2M2NjA5ZTYwMzUwMjQ0OWY5MDc0ZWNjZTljZDE2ODQ0KTsKICAgICAgICAKCiAgICAgICAgY2lyY2xlX21hcmtlcl84YmNkMDhjNTliZWE0ZmIxOTE0OTQyN2EyNzQwNmRkOS5iaW5kUG9wdXAocG9wdXBfYTE2YjUwNmQ1MDkwNDk4MjgzYWRjYWZiNjkwMDhkYjcpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2JlOTNlNjJlMzU2MDRlNTA5MzI3ZWI5NWNhMDE5OGRkID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzQuMDU1MTAzLCAtMTE3Ljc0OTk5MDldLAogICAgICAgICAgICAgICAgeyJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwgImNvbG9yIjogIiNlYjdhMzQiLCAiZGFzaEFycmF5IjogbnVsbCwgImRhc2hPZmZzZXQiOiBudWxsLCAiZmlsbCI6IHRydWUsICJmaWxsQ29sb3IiOiAiI2ViN2EzNCIsICJmaWxsT3BhY2l0eSI6IDAuOCwgImZpbGxSdWxlIjogImV2ZW5vZGQiLCAibGluZUNhcCI6ICJyb3VuZCIsICJsaW5lSm9pbiI6ICJyb3VuZCIsICJvcGFjaXR5IjogMS4wLCAicmFkaXVzIjogMSwgInN0cm9rZSI6IHRydWUsICJ3ZWlnaHQiOiAzfQogICAgICAgICAgICApLmFkZFRvKG1hcF80NGQ1YWFiOWVlZjk0MjcyOTQ1Yjc5MTZiNzI4OGNiMCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfNjg1OGZjNWYwNmQzNDM0MjhkNWFlNzU1YmQ3MDM1M2IgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sX2U5ZGNkMTI5NzY5MDQ2MzFiYWVhNGJjMTllYjAwNmEzID0gJChgPGRpdiBpZD0iaHRtbF9lOWRjZDEyOTc2OTA0NjMxYmFlYTRiYzE5ZWIwMDZhMyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UG9tb25hPC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzY4NThmYzVmMDZkMzQzNDI4ZDVhZTc1NWJkNzAzNTNiLnNldENvbnRlbnQoaHRtbF9lOWRjZDEyOTc2OTA0NjMxYmFlYTRiYzE5ZWIwMDZhMyk7CiAgICAgICAgCgogICAgICAgIGNpcmNsZV9tYXJrZXJfYmU5M2U2MmUzNTYwNGU1MDkzMjdlYjk1Y2EwMTk4ZGQuYmluZFBvcHVwKHBvcHVwXzY4NThmYzVmMDZkMzQzNDI4ZDVhZTc1NWJkNzAzNTNiKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl82NTQwOGJkOWFjNzQ0NTljYWJmNDQ3ZjExZjIyN2QyOCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ1LjUyMzA2MjIsIC0xMjIuNjc2NDgxNl0sCiAgICAgICAgICAgICAgICB7ImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLCAiY29sb3IiOiAiI2ViN2EzNCIsICJkYXNoQXJyYXkiOiBudWxsLCAiZGFzaE9mZnNldCI6IG51bGwsICJmaWxsIjogdHJ1ZSwgImZpbGxDb2xvciI6ICIjZWI3YTM0IiwgImZpbGxPcGFjaXR5IjogMC44LCAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsICJsaW5lQ2FwIjogInJvdW5kIiwgImxpbmVKb2luIjogInJvdW5kIiwgIm9wYWNpdHkiOiAxLjAsICJyYWRpdXMiOiA0LCAic3Ryb2tlIjogdHJ1ZSwgIndlaWdodCI6IDN9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0ZDVhYWI5ZWVmOTQyNzI5NDViNzkxNmI3Mjg4Y2IwKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF8wZmRhNDQzOTFjOWM0MjY3YWZhNDQ1OGNhMmY2YzMzZCA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfMTAyNTRlYTk5M2QzNGQ0MjgyN2RkZTlmYjRmY2QyYTIgPSAkKGA8ZGl2IGlkPSJodG1sXzEwMjU0ZWE5OTNkMzRkNDI4MjdkZGU5ZmI0ZmNkMmEyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Qb3J0bGFuZDwvZGl2PmApWzBdOwogICAgICAgICAgICBwb3B1cF8wZmRhNDQzOTFjOWM0MjY3YWZhNDQ1OGNhMmY2YzMzZC5zZXRDb250ZW50KGh0bWxfMTAyNTRlYTk5M2QzNGQ0MjgyN2RkZTlmYjRmY2QyYTIpOwogICAgICAgIAoKICAgICAgICBjaXJjbGVfbWFya2VyXzY1NDA4YmQ5YWM3NDQ1OWNhYmY0NDdmMTFmMjI3ZDI4LmJpbmRQb3B1cChwb3B1cF8wZmRhNDQzOTFjOWM0MjY3YWZhNDQ1OGNhMmY2YzMzZCkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMmIzZGEwNGM2ODBhNDg1ZmFkMzMyYTE0Y2QxNGYzZDcgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNC41NDAwMjQyLCAtMTEyLjQ2ODUwMjVdLAogICAgICAgICAgICAgICAgeyJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwgImNvbG9yIjogIiNlYjdhMzQiLCAiZGFzaEFycmF5IjogbnVsbCwgImRhc2hPZmZzZXQiOiBudWxsLCAiZmlsbCI6IHRydWUsICJmaWxsQ29sb3IiOiAiI2ViN2EzNCIsICJmaWxsT3BhY2l0eSI6IDAuOCwgImZpbGxSdWxlIjogImV2ZW5vZGQiLCAibGluZUNhcCI6ICJyb3VuZCIsICJsaW5lSm9pbiI6ICJyb3VuZCIsICJvcGFjaXR5IjogMS4wLCAicmFkaXVzIjogMSwgInN0cm9rZSI6IHRydWUsICJ3ZWlnaHQiOiAzfQogICAgICAgICAgICApLmFkZFRvKG1hcF80NGQ1YWFiOWVlZjk0MjcyOTQ1Yjc5MTZiNzI4OGNiMCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfZjVmNjYyZTVkZjIzNDk4ZDgwZTlmYmNmMDcxZTk3YjUgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sX2EzZDI5YjVhNWEwMzQzM2NhZDg4YThhMjBmMmUyYjYzID0gJChgPGRpdiBpZD0iaHRtbF9hM2QyOWI1YTVhMDM0MzNjYWQ4OGE4YTIwZjJlMmI2MyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UHJlc2NvdHQ8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfZjVmNjYyZTVkZjIzNDk4ZDgwZTlmYmNmMDcxZTk3YjUuc2V0Q29udGVudChodG1sX2EzZDI5YjVhNWEwMzQzM2NhZDg4YThhMjBmMmUyYjYzKTsKICAgICAgICAKCiAgICAgICAgY2lyY2xlX21hcmtlcl8yYjNkYTA0YzY4MGE0ODVmYWQzMzJhMTRjZDE0ZjNkNy5iaW5kUG9wdXAocG9wdXBfZjVmNjYyZTVkZjIzNDk4ZDgwZTlmYmNmMDcxZTk3YjUpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2IzZjJlNjJkNTFiNzQwMDY4Mjc5Yzk5YWQ3MTI3MWQwID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzQuNjEwMDI0MywgLTExMi4zMTU3MjFdLAogICAgICAgICAgICAgICAgeyJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwgImNvbG9yIjogIiNlYjdhMzQiLCAiZGFzaEFycmF5IjogbnVsbCwgImRhc2hPZmZzZXQiOiBudWxsLCAiZmlsbCI6IHRydWUsICJmaWxsQ29sb3IiOiAiI2ViN2EzNCIsICJmaWxsT3BhY2l0eSI6IDAuOCwgImZpbGxSdWxlIjogImV2ZW5vZGQiLCAibGluZUNhcCI6ICJyb3VuZCIsICJsaW5lSm9pbiI6ICJyb3VuZCIsICJvcGFjaXR5IjogMS4wLCAicmFkaXVzIjogMSwgInN0cm9rZSI6IHRydWUsICJ3ZWlnaHQiOiAzfQogICAgICAgICAgICApLmFkZFRvKG1hcF80NGQ1YWFiOWVlZjk0MjcyOTQ1Yjc5MTZiNzI4OGNiMCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfOTg2ODQ1OWU2Mzg0NGQxMDk2NWFhMjkxNzU0YzkwN2UgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sXzZmMjBiMTdiZTg1MTQzNzE5OGI5OWI4M2FhZmNlN2E5ID0gJChgPGRpdiBpZD0iaHRtbF82ZjIwYjE3YmU4NTE0MzcxOThiOTliODNhYWZjZTdhOSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UHJlc2NvdHQgVmFsbGV5PC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzk4Njg0NTllNjM4NDRkMTA5NjVhYTI5MTc1NGM5MDdlLnNldENvbnRlbnQoaHRtbF82ZjIwYjE3YmU4NTE0MzcxOThiOTliODNhYWZjZTdhOSk7CiAgICAgICAgCgogICAgICAgIGNpcmNsZV9tYXJrZXJfYjNmMmU2MmQ1MWI3NDAwNjgyNzljOTlhZDcxMjcxZDAuYmluZFBvcHVwKHBvcHVwXzk4Njg0NTllNjM4NDRkMTA5NjVhYTI5MTc1NGM5MDdlKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85OWY2MjgzMzM3OWY0ZjgwODEzZWE5ZmI5OWRhMGIyMiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjIzMzg0MzgsIC0xMTEuNjU4NTMzN10sCiAgICAgICAgICAgICAgICB7ImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLCAiY29sb3IiOiAiI2ViN2EzNCIsICJkYXNoQXJyYXkiOiBudWxsLCAiZGFzaE9mZnNldCI6IG51bGwsICJmaWxsIjogdHJ1ZSwgImZpbGxDb2xvciI6ICIjZWI3YTM0IiwgImZpbGxPcGFjaXR5IjogMC44LCAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsICJsaW5lQ2FwIjogInJvdW5kIiwgImxpbmVKb2luIjogInJvdW5kIiwgIm9wYWNpdHkiOiAxLjAsICJyYWRpdXMiOiAxLCAic3Ryb2tlIjogdHJ1ZSwgIndlaWdodCI6IDN9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0ZDVhYWI5ZWVmOTQyNzI5NDViNzkxNmI3Mjg4Y2IwKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF84OTk1Y2E5NDRiODg0NjVmYTZkMjExOTdmM2YyMjBjMiA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfYmY0N2NmZmUyMmU0NDlmZmE2ZWRkMmJiNzM3OGQ5MzkgPSAkKGA8ZGl2IGlkPSJodG1sX2JmNDdjZmZlMjJlNDQ5ZmZhNmVkZDJiYjczNzhkOTM5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5Qcm92bzwvZGl2PmApWzBdOwogICAgICAgICAgICBwb3B1cF84OTk1Y2E5NDRiODg0NjVmYTZkMjExOTdmM2YyMjBjMi5zZXRDb250ZW50KGh0bWxfYmY0N2NmZmUyMmU0NDlmZmE2ZWRkMmJiNzM3OGQ5MzkpOwogICAgICAgIAoKICAgICAgICBjaXJjbGVfbWFya2VyXzk5ZjYyODMzMzc5ZjRmODA4MTNlYTlmYjk5ZGEwYjIyLmJpbmRQb3B1cChwb3B1cF84OTk1Y2E5NDRiODg0NjVmYTZkMjExOTdmM2YyMjBjMikKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZTFjNTJjYzQ1YTA2NDczMWJlNjZhMDkyNWU3MmY0NTggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Mi43MjYxMzA5LCAtODcuNzgyODUyM10sCiAgICAgICAgICAgICAgICB7ImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLCAiY29sb3IiOiAiI2ViN2EzNCIsICJkYXNoQXJyYXkiOiBudWxsLCAiZGFzaE9mZnNldCI6IG51bGwsICJmaWxsIjogdHJ1ZSwgImZpbGxDb2xvciI6ICIjZWI3YTM0IiwgImZpbGxPcGFjaXR5IjogMC44LCAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsICJsaW5lQ2FwIjogInJvdW5kIiwgImxpbmVKb2luIjogInJvdW5kIiwgIm9wYWNpdHkiOiAxLjAsICJyYWRpdXMiOiAxLCAic3Ryb2tlIjogdHJ1ZSwgIndlaWdodCI6IDN9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0ZDVhYWI5ZWVmOTQyNzI5NDViNzkxNmI3Mjg4Y2IwKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF8wMjA5Zjg1NzgyYzg0ZmNiOWNjYzlmMmMzMDhmOGExNCA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfYTM3ZWM3ZmMwYWRmNGUzZWIwOWE3ZGEyNjM1NmY2NzAgPSAkKGA8ZGl2IGlkPSJodG1sX2EzN2VjN2ZjMGFkZjRlM2ViMDlhN2RhMjYzNTZmNjcwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5SYWNpbmU8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfMDIwOWY4NTc4MmM4NGZjYjljY2M5ZjJjMzA4ZjhhMTQuc2V0Q29udGVudChodG1sX2EzN2VjN2ZjMGFkZjRlM2ViMDlhN2RhMjYzNTZmNjcwKTsKICAgICAgICAKCiAgICAgICAgY2lyY2xlX21hcmtlcl9lMWM1MmNjNDVhMDY0NzMxYmU2NmEwOTI1ZTcyZjQ1OC5iaW5kUG9wdXAocG9wdXBfMDIwOWY4NTc4MmM4NGZjYjljY2M5ZjJjMzA4ZjhhMTQpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzZiOWRmMWE1NzZmYTRlNzdhMGJmNjNiMjAyMzFjNGQ5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzUuNzc5NTg5NywgLTc4LjYzODE3ODddLAogICAgICAgICAgICAgICAgeyJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwgImNvbG9yIjogIiNlYjdhMzQiLCAiZGFzaEFycmF5IjogbnVsbCwgImRhc2hPZmZzZXQiOiBudWxsLCAiZmlsbCI6IHRydWUsICJmaWxsQ29sb3IiOiAiI2ViN2EzNCIsICJmaWxsT3BhY2l0eSI6IDAuOCwgImZpbGxSdWxlIjogImV2ZW5vZGQiLCAibGluZUNhcCI6ICJyb3VuZCIsICJsaW5lSm9pbiI6ICJyb3VuZCIsICJvcGFjaXR5IjogMS4wLCAicmFkaXVzIjogMSwgInN0cm9rZSI6IHRydWUsICJ3ZWlnaHQiOiAzfQogICAgICAgICAgICApLmFkZFRvKG1hcF80NGQ1YWFiOWVlZjk0MjcyOTQ1Yjc5MTZiNzI4OGNiMCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfOTViZTcyYzEyNGRjNDlkNWI5NDM1NTU4N2Y2Y2FiYWUgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sX2U1NzFhMzU1Y2FjMTQ3ZmE5ZmRjODc3MDM3OWU3NmMzID0gJChgPGRpdiBpZD0iaHRtbF9lNTcxYTM1NWNhYzE0N2ZhOWZkYzg3NzAzNzllNzZjMyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UmFsZWlnaDwvZGl2PmApWzBdOwogICAgICAgICAgICBwb3B1cF85NWJlNzJjMTI0ZGM0OWQ1Yjk0MzU1NTg3ZjZjYWJhZS5zZXRDb250ZW50KGh0bWxfZTU3MWEzNTVjYWMxNDdmYTlmZGM4NzcwMzc5ZTc2YzMpOwogICAgICAgIAoKICAgICAgICBjaXJjbGVfbWFya2VyXzZiOWRmMWE1NzZmYTRlNzdhMGJmNjNiMjAyMzFjNGQ5LmJpbmRQb3B1cChwb3B1cF85NWJlNzJjMTI0ZGM0OWQ1Yjk0MzU1NTg3ZjZjYWJhZSkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZTY3ZGQ4YmFlZWJiNGE5YjlhZGY2ZjM0NzlkZmU0ZjEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0NC4wODA1NDM0LCAtMTAzLjIzMTAxNDldLAogICAgICAgICAgICAgICAgeyJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwgImNvbG9yIjogIiNlYjdhMzQiLCAiZGFzaEFycmF5IjogbnVsbCwgImRhc2hPZmZzZXQiOiBudWxsLCAiZmlsbCI6IHRydWUsICJmaWxsQ29sb3IiOiAiI2ViN2EzNCIsICJmaWxsT3BhY2l0eSI6IDAuOCwgImZpbGxSdWxlIjogImV2ZW5vZGQiLCAibGluZUNhcCI6ICJyb3VuZCIsICJsaW5lSm9pbiI6ICJyb3VuZCIsICJvcGFjaXR5IjogMS4wLCAicmFkaXVzIjogMSwgInN0cm9rZSI6IHRydWUsICJ3ZWlnaHQiOiAzfQogICAgICAgICAgICApLmFkZFRvKG1hcF80NGQ1YWFiOWVlZjk0MjcyOTQ1Yjc5MTZiNzI4OGNiMCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfY2RmZjU5YWNlMTMwNDRmNjkxYTAxNWU1MmRmZDdmNGEgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sX2U3MTA5NTljNmNmMzRlOThiYmMxZjQzZjUyZTRmMjc3ID0gJChgPGRpdiBpZD0iaHRtbF9lNzEwOTU5YzZjZjM0ZTk4YmJjMWY0M2Y1MmU0ZjI3NyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+UmFwaWQgQ2l0eTwvZGl2PmApWzBdOwogICAgICAgICAgICBwb3B1cF9jZGZmNTlhY2UxMzA0NGY2OTFhMDE1ZTUyZGZkN2Y0YS5zZXRDb250ZW50KGh0bWxfZTcxMDk1OWM2Y2YzNGU5OGJiYzFmNDNmNTJlNGYyNzcpOwogICAgICAgIAoKICAgICAgICBjaXJjbGVfbWFya2VyX2U2N2RkOGJhZWViYjRhOWI5YWRmNmYzNDc5ZGZlNGYxLmJpbmRQb3B1cChwb3B1cF9jZGZmNTlhY2UxMzA0NGY2OTFhMDE1ZTUyZGZkN2Y0YSkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMWVkYTdhMDhkY2ZkNDdmNGI5YTMyZjliZDA3ZmViZDEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszMi45NDgzMzM1LCAtOTYuNzI5ODUxOV0sCiAgICAgICAgICAgICAgICB7ImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLCAiY29sb3IiOiAiI2ViN2EzNCIsICJkYXNoQXJyYXkiOiBudWxsLCAiZGFzaE9mZnNldCI6IG51bGwsICJmaWxsIjogdHJ1ZSwgImZpbGxDb2xvciI6ICIjZWI3YTM0IiwgImZpbGxPcGFjaXR5IjogMC44LCAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsICJsaW5lQ2FwIjogInJvdW5kIiwgImxpbmVKb2luIjogInJvdW5kIiwgIm9wYWNpdHkiOiAxLjAsICJyYWRpdXMiOiAyLCAic3Ryb2tlIjogdHJ1ZSwgIndlaWdodCI6IDN9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0ZDVhYWI5ZWVmOTQyNzI5NDViNzkxNmI3Mjg4Y2IwKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF9lOWQ2NjRkNDc0N2Y0MjU0ODBmNTJjYWQzYTk0YWRlZiA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfYjk5ODZkOGM0ZTAzNDU4M2E1N2E1ZWMyY2UxMmU2NzEgPSAkKGA8ZGl2IGlkPSJodG1sX2I5OTg2ZDhjNGUwMzQ1ODNhNTdhNWVjMmNlMTJlNjcxIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5SaWNoYXJkc29uPC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwX2U5ZDY2NGQ0NzQ3ZjQyNTQ4MGY1MmNhZDNhOTRhZGVmLnNldENvbnRlbnQoaHRtbF9iOTk4NmQ4YzRlMDM0NTgzYTU3YTVlYzJjZTEyZTY3MSk7CiAgICAgICAgCgogICAgICAgIGNpcmNsZV9tYXJrZXJfMWVkYTdhMDhkY2ZkNDdmNGI5YTMyZjliZDA3ZmViZDEuYmluZFBvcHVwKHBvcHVwX2U5ZDY2NGQ0NzQ3ZjQyNTQ4MGY1MmNhZDNhOTRhZGVmKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl83ZTMyMmMwMzU3YWU0MmQzYjU5Njc5NWU4NjFiZjBhMyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjU0MDcyNDYsIC03Ny40MzYwNDgxXSwKICAgICAgICAgICAgICAgIHsiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsICJjb2xvciI6ICIjZWI3YTM0IiwgImRhc2hBcnJheSI6IG51bGwsICJkYXNoT2Zmc2V0IjogbnVsbCwgImZpbGwiOiB0cnVlLCAiZmlsbENvbG9yIjogIiNlYjdhMzQiLCAiZmlsbE9wYWNpdHkiOiAwLjgsICJmaWxsUnVsZSI6ICJldmVub2RkIiwgImxpbmVDYXAiOiAicm91bmQiLCAibGluZUpvaW4iOiAicm91bmQiLCAib3BhY2l0eSI6IDEuMCwgInJhZGl1cyI6IDEsICJzdHJva2UiOiB0cnVlLCAid2VpZ2h0IjogM30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDRkNWFhYjllZWY5NDI3Mjk0NWI3OTE2YjcyODhjYjApOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwX2MzMmE5MWY1OGQ2MjRkMWU5ZTk5YTllZDI3ODRmNTM2ID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF80NzVjNzllMjRiMzM0ZmY3YmE5MTQ0ODc5NGIwNWFlNiA9ICQoYDxkaXYgaWQ9Imh0bWxfNDc1Yzc5ZTI0YjMzNGZmN2JhOTE0NDg3OTRiMDVhZTYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlJpY2htb25kPC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwX2MzMmE5MWY1OGQ2MjRkMWU5ZTk5YTllZDI3ODRmNTM2LnNldENvbnRlbnQoaHRtbF80NzVjNzllMjRiMzM0ZmY3YmE5MTQ0ODc5NGIwNWFlNik7CiAgICAgICAgCgogICAgICAgIGNpcmNsZV9tYXJrZXJfN2UzMjJjMDM1N2FlNDJkM2I1OTY3OTVlODYxYmYwYTMuYmluZFBvcHVwKHBvcHVwX2MzMmE5MWY1OGQ2MjRkMWU5ZTk5YTllZDI3ODRmNTM2KQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl81Nzg0N2E1MWE1ZGU0ZjM1YWI5NzRkYzJmZGE1NmM5NyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzMzLjk1MzM0ODcsIC0xMTcuMzk2MTU2NF0sCiAgICAgICAgICAgICAgICB7ImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLCAiY29sb3IiOiAiI2ViN2EzNCIsICJkYXNoQXJyYXkiOiBudWxsLCAiZGFzaE9mZnNldCI6IG51bGwsICJmaWxsIjogdHJ1ZSwgImZpbGxDb2xvciI6ICIjZWI3YTM0IiwgImZpbGxPcGFjaXR5IjogMC44LCAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsICJsaW5lQ2FwIjogInJvdW5kIiwgImxpbmVKb2luIjogInJvdW5kIiwgIm9wYWNpdHkiOiAxLjAsICJyYWRpdXMiOiAxLCAic3Ryb2tlIjogdHJ1ZSwgIndlaWdodCI6IDN9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0ZDVhYWI5ZWVmOTQyNzI5NDViNzkxNmI3Mjg4Y2IwKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF9hM2E3YmE1NzQ5NGQ0ZWVmYWFkMjEzMWRjMjgyZTViZCA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfMDdjYTI3NTVjZWRmNDU3ZmEyYzEyNjMzYTNjZWVmNTEgPSAkKGA8ZGl2IGlkPSJodG1sXzA3Y2EyNzU1Y2VkZjQ1N2ZhMmMxMjYzM2EzY2VlZjUxIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5SaXZlcnNpZGU8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfYTNhN2JhNTc0OTRkNGVlZmFhZDIxMzFkYzI4MmU1YmQuc2V0Q29udGVudChodG1sXzA3Y2EyNzU1Y2VkZjQ1N2ZhMmMxMjYzM2EzY2VlZjUxKTsKICAgICAgICAKCiAgICAgICAgY2lyY2xlX21hcmtlcl81Nzg0N2E1MWE1ZGU0ZjM1YWI5NzRkYzJmZGE1NmM5Ny5iaW5kUG9wdXAocG9wdXBfYTNhN2JhNTc0OTRkNGVlZmFhZDIxMzFkYzI4MmU1YmQpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzVmY2U4YjY4YjAzNzRmMjRhODZhMTczMzQyYzNkMWY5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDIuMjcxMTMxMSwgLTg5LjA5Mzk5NTJdLAogICAgICAgICAgICAgICAgeyJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwgImNvbG9yIjogIiNlYjdhMzQiLCAiZGFzaEFycmF5IjogbnVsbCwgImRhc2hPZmZzZXQiOiBudWxsLCAiZmlsbCI6IHRydWUsICJmaWxsQ29sb3IiOiAiI2ViN2EzNCIsICJmaWxsT3BhY2l0eSI6IDAuOCwgImZpbGxSdWxlIjogImV2ZW5vZGQiLCAibGluZUNhcCI6ICJyb3VuZCIsICJsaW5lSm9pbiI6ICJyb3VuZCIsICJvcGFjaXR5IjogMS4wLCAicmFkaXVzIjogMSwgInN0cm9rZSI6IHRydWUsICJ3ZWlnaHQiOiAzfQogICAgICAgICAgICApLmFkZFRvKG1hcF80NGQ1YWFiOWVlZjk0MjcyOTQ1Yjc5MTZiNzI4OGNiMCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfZWIxNjM0MDRlMzQyNDBjMmFlYjcxYmY0YjMxMmU1MTcgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sX2I5ZDljOGFhYWVmYTRhMjBiYzY3ZjRiMWVhNWRjMDJkID0gJChgPGRpdiBpZD0iaHRtbF9iOWQ5YzhhYWFlZmE0YTIwYmM2N2Y0YjFlYTVkYzAyZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+Um9ja2ZvcmQ8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfZWIxNjM0MDRlMzQyNDBjMmFlYjcxYmY0YjMxMmU1MTcuc2V0Q29udGVudChodG1sX2I5ZDljOGFhYWVmYTRhMjBiYzY3ZjRiMWVhNWRjMDJkKTsKICAgICAgICAKCiAgICAgICAgY2lyY2xlX21hcmtlcl81ZmNlOGI2OGIwMzc0ZjI0YTg2YTE3MzM0MmMzZDFmOS5iaW5kUG9wdXAocG9wdXBfZWIxNjM0MDRlMzQyNDBjMmFlYjcxYmY0YjMxMmU1MTcpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzkwZWFhNjkwNTkzODRmZTViM2MwODRhZGJjMjNhN2Q2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzguNTgxNTcxOSwgLTEyMS40OTQzOTk2XSwKICAgICAgICAgICAgICAgIHsiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsICJjb2xvciI6ICIjZWI3YTM0IiwgImRhc2hBcnJheSI6IG51bGwsICJkYXNoT2Zmc2V0IjogbnVsbCwgImZpbGwiOiB0cnVlLCAiZmlsbENvbG9yIjogIiNlYjdhMzQiLCAiZmlsbE9wYWNpdHkiOiAwLjgsICJmaWxsUnVsZSI6ICJldmVub2RkIiwgImxpbmVDYXAiOiAicm91bmQiLCAibGluZUpvaW4iOiAicm91bmQiLCAib3BhY2l0eSI6IDEuMCwgInJhZGl1cyI6IDEsICJzdHJva2UiOiB0cnVlLCAid2VpZ2h0IjogM30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDRkNWFhYjllZWY5NDI3Mjk0NWI3OTE2YjcyODhjYjApOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwX2VkZTU0ZjFmNjJmNDQ2N2Y4MzYxNzFlYWNiODIzMzc4ID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF9mYzBiZjVhMTg1ZGQ0ZjdjOWQxZjI1ZmM5NWQ3ZmU4ZCA9ICQoYDxkaXYgaWQ9Imh0bWxfZmMwYmY1YTE4NWRkNGY3YzlkMWYyNWZjOTVkN2ZlOGQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlNhY3JhbWVudG88L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfZWRlNTRmMWY2MmY0NDY3ZjgzNjE3MWVhY2I4MjMzNzguc2V0Q29udGVudChodG1sX2ZjMGJmNWExODVkZDRmN2M5ZDFmMjVmYzk1ZDdmZThkKTsKICAgICAgICAKCiAgICAgICAgY2lyY2xlX21hcmtlcl85MGVhYTY5MDU5Mzg0ZmU1YjNjMDg0YWRiYzIzYTdkNi5iaW5kUG9wdXAocG9wdXBfZWRlNTRmMWY2MmY0NDY3ZjgzNjE3MWVhY2I4MjMzNzgpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzlkMjgwMjE2ZjM1ZTQ5OTdiY2Q3MGExMWNmMjZmZTc3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDIuNTE5NTQsIC03MC44OTY3MTU1XSwKICAgICAgICAgICAgICAgIHsiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsICJjb2xvciI6ICIjZWI3YTM0IiwgImRhc2hBcnJheSI6IG51bGwsICJkYXNoT2Zmc2V0IjogbnVsbCwgImZpbGwiOiB0cnVlLCAiZmlsbENvbG9yIjogIiNlYjdhMzQiLCAiZmlsbE9wYWNpdHkiOiAwLjgsICJmaWxsUnVsZSI6ICJldmVub2RkIiwgImxpbmVDYXAiOiAicm91bmQiLCAibGluZUpvaW4iOiAicm91bmQiLCAib3BhY2l0eSI6IDEuMCwgInJhZGl1cyI6IDEsICJzdHJva2UiOiB0cnVlLCAid2VpZ2h0IjogM30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDRkNWFhYjllZWY5NDI3Mjk0NWI3OTE2YjcyODhjYjApOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzhmNzM1MTk0M2JiMjQyNDVhODhlOTI5MGUzNjdjYjRiID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF81OGE1MDE0MjcxNDc0ZTMwOTBiMWFhYTJlYzI5MDliMCA9ICQoYDxkaXYgaWQ9Imh0bWxfNThhNTAxNDI3MTQ3NGUzMDkwYjFhYWEyZWMyOTA5YjAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlNhbGVtPC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzhmNzM1MTk0M2JiMjQyNDVhODhlOTI5MGUzNjdjYjRiLnNldENvbnRlbnQoaHRtbF81OGE1MDE0MjcxNDc0ZTMwOTBiMWFhYTJlYzI5MDliMCk7CiAgICAgICAgCgogICAgICAgIGNpcmNsZV9tYXJrZXJfOWQyODAyMTZmMzVlNDk5N2JjZDcwYTExY2YyNmZlNzcuYmluZFBvcHVwKHBvcHVwXzhmNzM1MTk0M2JiMjQyNDVhODhlOTI5MGUzNjdjYjRiKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8zMDczY2Y5NGVhNWY0MzlhODUwZDcyZmFkZWZjY2Q1ZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQwLjc2MDc3OTMsIC0xMTEuODkxMDQ3NF0sCiAgICAgICAgICAgICAgICB7ImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLCAiY29sb3IiOiAiI2ViN2EzNCIsICJkYXNoQXJyYXkiOiBudWxsLCAiZGFzaE9mZnNldCI6IG51bGwsICJmaWxsIjogdHJ1ZSwgImZpbGxDb2xvciI6ICIjZWI3YTM0IiwgImZpbGxPcGFjaXR5IjogMC44LCAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsICJsaW5lQ2FwIjogInJvdW5kIiwgImxpbmVKb2luIjogInJvdW5kIiwgIm9wYWNpdHkiOiAxLjAsICJyYWRpdXMiOiAxLCAic3Ryb2tlIjogdHJ1ZSwgIndlaWdodCI6IDN9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0ZDVhYWI5ZWVmOTQyNzI5NDViNzkxNmI3Mjg4Y2IwKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF80NjlhNzJiY2VhMTQ0OWMzYmJmMDlmMzQzNjcxNDYxYSA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfODI2MmIxNTg0M2U0NDFmOThhYzc4OTdmMTlkZjMyNmIgPSAkKGA8ZGl2IGlkPSJodG1sXzgyNjJiMTU4NDNlNDQxZjk4YWM3ODk3ZjE5ZGYzMjZiIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5TYWx0IExha2UgQ2l0eTwvZGl2PmApWzBdOwogICAgICAgICAgICBwb3B1cF80NjlhNzJiY2VhMTQ0OWMzYmJmMDlmMzQzNjcxNDYxYS5zZXRDb250ZW50KGh0bWxfODI2MmIxNTg0M2U0NDFmOThhYzc4OTdmMTlkZjMyNmIpOwogICAgICAgIAoKICAgICAgICBjaXJjbGVfbWFya2VyXzMwNzNjZjk0ZWE1ZjQzOWE4NTBkNzJmYWRlZmNjZDVkLmJpbmRQb3B1cChwb3B1cF80NjlhNzJiY2VhMTQ0OWMzYmJmMDlmMzQzNjcxNDYxYSkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNzU5N2EwODQ5OGRjNDU0NGEzYjU4NjYyZTQ4ZTBiNzEgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFsyOS40MjQxMjE5LCAtOTguNDkzNjI4Ml0sCiAgICAgICAgICAgICAgICB7ImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLCAiY29sb3IiOiAiI2ViN2EzNCIsICJkYXNoQXJyYXkiOiBudWxsLCAiZGFzaE9mZnNldCI6IG51bGwsICJmaWxsIjogdHJ1ZSwgImZpbGxDb2xvciI6ICIjZWI3YTM0IiwgImZpbGxPcGFjaXR5IjogMC44LCAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsICJsaW5lQ2FwIjogInJvdW5kIiwgImxpbmVKb2luIjogInJvdW5kIiwgIm9wYWNpdHkiOiAxLjAsICJyYWRpdXMiOiA0LCAic3Ryb2tlIjogdHJ1ZSwgIndlaWdodCI6IDN9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0ZDVhYWI5ZWVmOTQyNzI5NDViNzkxNmI3Mjg4Y2IwKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF9hNWMzZTIxNTM1YzU0ZTg4YjdhM2IzMzJiNzNmNjgxOSA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfZjU5ODVjMzQzMzQ4NDNiZDhlMDU5ODczZWNkOWY3YzcgPSAkKGA8ZGl2IGlkPSJodG1sX2Y1OTg1YzM0MzM0ODQzYmQ4ZTA1OTg3M2VjZDlmN2M3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5TYW4gQW50b25pbzwvZGl2PmApWzBdOwogICAgICAgICAgICBwb3B1cF9hNWMzZTIxNTM1YzU0ZTg4YjdhM2IzMzJiNzNmNjgxOS5zZXRDb250ZW50KGh0bWxfZjU5ODVjMzQzMzQ4NDNiZDhlMDU5ODczZWNkOWY3YzcpOwogICAgICAgIAoKICAgICAgICBjaXJjbGVfbWFya2VyXzc1OTdhMDg0OThkYzQ1NDRhM2I1ODY2MmU0OGUwYjcxLmJpbmRQb3B1cChwb3B1cF9hNWMzZTIxNTM1YzU0ZTg4YjdhM2IzMzJiNzNmNjgxOSkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNTU1YjJlMjMwZmM2NGZiMDg3MmY1NTA2MmQ3N2I2NDkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszMi43MTU3MzgsIC0xMTcuMTYxMDgzOF0sCiAgICAgICAgICAgICAgICB7ImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLCAiY29sb3IiOiAiI2ViN2EzNCIsICJkYXNoQXJyYXkiOiBudWxsLCAiZGFzaE9mZnNldCI6IG51bGwsICJmaWxsIjogdHJ1ZSwgImZpbGxDb2xvciI6ICIjZWI3YTM0IiwgImZpbGxPcGFjaXR5IjogMC44LCAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsICJsaW5lQ2FwIjogInJvdW5kIiwgImxpbmVKb2luIjogInJvdW5kIiwgIm9wYWNpdHkiOiAxLjAsICJyYWRpdXMiOiAxMCwgInN0cm9rZSI6IHRydWUsICJ3ZWlnaHQiOiAzfQogICAgICAgICAgICApLmFkZFRvKG1hcF80NGQ1YWFiOWVlZjk0MjcyOTQ1Yjc5MTZiNzI4OGNiMCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfN2MzOGMxY2RiMTE4NDM5MWE3YTM0NDhkZDg5NjNiYWYgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sX2NhNjBkNzVmMzk3NDRlNjE4YjlhNTk5Y2ZmNDMyZmVmID0gJChgPGRpdiBpZD0iaHRtbF9jYTYwZDc1ZjM5NzQ0ZTYxOGI5YTU5OWNmZjQzMmZlZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U2FuIERpZWdvPC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzdjMzhjMWNkYjExODQzOTFhN2EzNDQ4ZGQ4OTYzYmFmLnNldENvbnRlbnQoaHRtbF9jYTYwZDc1ZjM5NzQ0ZTYxOGI5YTU5OWNmZjQzMmZlZik7CiAgICAgICAgCgogICAgICAgIGNpcmNsZV9tYXJrZXJfNTU1YjJlMjMwZmM2NGZiMDg3MmY1NTA2MmQ3N2I2NDkuYmluZFBvcHVwKHBvcHVwXzdjMzhjMWNkYjExODQzOTFhN2EzNDQ4ZGQ4OTYzYmFmKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9hYzdiMTExZDEwNmQ0YWUxODBlMmI4Zjk2YmU0ODAyMSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3Ljc3NDkyOTUsIC0xMjIuNDE5NDE1NV0sCiAgICAgICAgICAgICAgICB7ImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLCAiY29sb3IiOiAiI2ViN2EzNCIsICJkYXNoQXJyYXkiOiBudWxsLCAiZGFzaE9mZnNldCI6IG51bGwsICJmaWxsIjogdHJ1ZSwgImZpbGxDb2xvciI6ICIjZWI3YTM0IiwgImZpbGxPcGFjaXR5IjogMC44LCAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsICJsaW5lQ2FwIjogInJvdW5kIiwgImxpbmVKb2luIjogInJvdW5kIiwgIm9wYWNpdHkiOiAxLjAsICJyYWRpdXMiOiAyLCAic3Ryb2tlIjogdHJ1ZSwgIndlaWdodCI6IDN9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0ZDVhYWI5ZWVmOTQyNzI5NDViNzkxNmI3Mjg4Y2IwKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF82NTAwYTBhMmJhOGI0YTA2ODk5YzNmMGM4OWY1MWQyYSA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfODZlZjg3MjJjNTQ4NGFmNzk1MGJjMmM3NmUzN2QxMTUgPSAkKGA8ZGl2IGlkPSJodG1sXzg2ZWY4NzIyYzU0ODRhZjc5NTBiYzJjNzZlMzdkMTE1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5TYW4gRnJhbmNpc2NvPC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzY1MDBhMGEyYmE4YjRhMDY4OTljM2YwYzg5ZjUxZDJhLnNldENvbnRlbnQoaHRtbF84NmVmODcyMmM1NDg0YWY3OTUwYmMyYzc2ZTM3ZDExNSk7CiAgICAgICAgCgogICAgICAgIGNpcmNsZV9tYXJrZXJfYWM3YjExMWQxMDZkNGFlMTgwZTJiOGY5NmJlNDgwMjEuYmluZFBvcHVwKHBvcHVwXzY1MDBhMGEyYmE4YjRhMDY4OTljM2YwYzg5ZjUxZDJhKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mOTdkYWZlYzc1NDk0NzE2OWViMjRlMjVhYzJhN2EwMCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM3LjMzODIwODIsIC0xMjEuODg2MzI4Nl0sCiAgICAgICAgICAgICAgICB7ImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLCAiY29sb3IiOiAiI2ViN2EzNCIsICJkYXNoQXJyYXkiOiBudWxsLCAiZGFzaE9mZnNldCI6IG51bGwsICJmaWxsIjogdHJ1ZSwgImZpbGxDb2xvciI6ICIjZWI3YTM0IiwgImZpbGxPcGFjaXR5IjogMC44LCAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsICJsaW5lQ2FwIjogInJvdW5kIiwgImxpbmVKb2luIjogInJvdW5kIiwgIm9wYWNpdHkiOiAxLjAsICJyYWRpdXMiOiAzLCAic3Ryb2tlIjogdHJ1ZSwgIndlaWdodCI6IDN9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0ZDVhYWI5ZWVmOTQyNzI5NDViNzkxNmI3Mjg4Y2IwKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF84MGZlOGI5YTMzZjQ0NWEzYjU0MGY4MTMwZGZjNTU4ZCA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfMjA5MjVkODRkMWVkNGU4NmE1Yzg4OWM1OGYwZWYwNTMgPSAkKGA8ZGl2IGlkPSJodG1sXzIwOTI1ZDg0ZDFlZDRlODZhNWM4ODljNThmMGVmMDUzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5TYW4gSm9zZTwvZGl2PmApWzBdOwogICAgICAgICAgICBwb3B1cF84MGZlOGI5YTMzZjQ0NWEzYjU0MGY4MTMwZGZjNTU4ZC5zZXRDb250ZW50KGh0bWxfMjA5MjVkODRkMWVkNGU4NmE1Yzg4OWM1OGYwZWYwNTMpOwogICAgICAgIAoKICAgICAgICBjaXJjbGVfbWFya2VyX2Y5N2RhZmVjNzU0OTQ3MTY5ZWIyNGUyNWFjMmE3YTAwLmJpbmRQb3B1cChwb3B1cF84MGZlOGI5YTMzZjQ0NWEzYjU0MGY4MTMwZGZjNTU4ZCkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMGY1MjNkZWJjNjFmNDc3ZDljZjY0MWUwZTQ0ZDE3NmIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNS4yODI3NTI0LCAtMTIwLjY1OTYxNTZdLAogICAgICAgICAgICAgICAgeyJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwgImNvbG9yIjogIiNlYjdhMzQiLCAiZGFzaEFycmF5IjogbnVsbCwgImRhc2hPZmZzZXQiOiBudWxsLCAiZmlsbCI6IHRydWUsICJmaWxsQ29sb3IiOiAiI2ViN2EzNCIsICJmaWxsT3BhY2l0eSI6IDAuOCwgImZpbGxSdWxlIjogImV2ZW5vZGQiLCAibGluZUNhcCI6ICJyb3VuZCIsICJsaW5lSm9pbiI6ICJyb3VuZCIsICJvcGFjaXR5IjogMS4wLCAicmFkaXVzIjogMSwgInN0cm9rZSI6IHRydWUsICJ3ZWlnaHQiOiAzfQogICAgICAgICAgICApLmFkZFRvKG1hcF80NGQ1YWFiOWVlZjk0MjcyOTQ1Yjc5MTZiNzI4OGNiMCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfZWZlZTYzNGNkMTY3NGE5ZjgzYmFiYTRlNDE4OWEwZmYgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sXzVmM2YwY2UzYTY1NjQzYzA4MzEzZGM5Mjg0ZTQwZmJjID0gJChgPGRpdiBpZD0iaHRtbF81ZjNmMGNlM2E2NTY0M2MwODMxM2RjOTI4NGU0MGZiYyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U2FuIEx1aXMgT2Jpc3BvPC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwX2VmZWU2MzRjZDE2NzRhOWY4M2JhYmE0ZTQxODlhMGZmLnNldENvbnRlbnQoaHRtbF81ZjNmMGNlM2E2NTY0M2MwODMxM2RjOTI4NGU0MGZiYyk7CiAgICAgICAgCgogICAgICAgIGNpcmNsZV9tYXJrZXJfMGY1MjNkZWJjNjFmNDc3ZDljZjY0MWUwZTQ0ZDE3NmIuYmluZFBvcHVwKHBvcHVwX2VmZWU2MzRjZDE2NzRhOWY4M2JhYmE0ZTQxODlhMGZmKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9kZWQ2ZTRjM2JlMzM0ZDcxOGJkNWEzZGQ0ZmIzNDY0YyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzMzLjc0NTU3MzEsIC0xMTcuODY3ODMzOF0sCiAgICAgICAgICAgICAgICB7ImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLCAiY29sb3IiOiAiI2ViN2EzNCIsICJkYXNoQXJyYXkiOiBudWxsLCAiZGFzaE9mZnNldCI6IG51bGwsICJmaWxsIjogdHJ1ZSwgImZpbGxDb2xvciI6ICIjZWI3YTM0IiwgImZpbGxPcGFjaXR5IjogMC44LCAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsICJsaW5lQ2FwIjogInJvdW5kIiwgImxpbmVKb2luIjogInJvdW5kIiwgIm9wYWNpdHkiOiAxLjAsICJyYWRpdXMiOiAxLCAic3Ryb2tlIjogdHJ1ZSwgIndlaWdodCI6IDN9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0ZDVhYWI5ZWVmOTQyNzI5NDViNzkxNmI3Mjg4Y2IwKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF8wNDA1YTU3ODY2OTg0MzEzYjA5OWM3N2Y5NTk5NDgzNiA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfYjBmODc5MDFhZDA1NDhiYjhhY2QwYWQ4YzgxNzQ2MjAgPSAkKGA8ZGl2IGlkPSJodG1sX2IwZjg3OTAxYWQwNTQ4YmI4YWNkMGFkOGM4MTc0NjIwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5TYW50YSBBbmE8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfMDQwNWE1Nzg2Njk4NDMxM2IwOTljNzdmOTU5OTQ4MzYuc2V0Q29udGVudChodG1sX2IwZjg3OTAxYWQwNTQ4YmI4YWNkMGFkOGM4MTc0NjIwKTsKICAgICAgICAKCiAgICAgICAgY2lyY2xlX21hcmtlcl9kZWQ2ZTRjM2JlMzM0ZDcxOGJkNWEzZGQ0ZmIzNDY0Yy5iaW5kUG9wdXAocG9wdXBfMDQwNWE1Nzg2Njk4NDMxM2IwOTljNzdmOTU5OTQ4MzYpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzk3ODk5ZjI0MjI2ZjQ3ZDA5N2RiMGNmNTljYjg4NjA4ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzQuNDIwODMwNSwgLTExOS42OTgxOTAxXSwKICAgICAgICAgICAgICAgIHsiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsICJjb2xvciI6ICIjZWI3YTM0IiwgImRhc2hBcnJheSI6IG51bGwsICJkYXNoT2Zmc2V0IjogbnVsbCwgImZpbGwiOiB0cnVlLCAiZmlsbENvbG9yIjogIiNlYjdhMzQiLCAiZmlsbE9wYWNpdHkiOiAwLjgsICJmaWxsUnVsZSI6ICJldmVub2RkIiwgImxpbmVDYXAiOiAicm91bmQiLCAibGluZUpvaW4iOiAicm91bmQiLCAib3BhY2l0eSI6IDEuMCwgInJhZGl1cyI6IDEsICJzdHJva2UiOiB0cnVlLCAid2VpZ2h0IjogM30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDRkNWFhYjllZWY5NDI3Mjk0NWI3OTE2YjcyODhjYjApOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwX2NlNWM0ZDIxNWIzNzQzZTVhNjdjNDhhMTRkZGZkMzdkID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF9mMDZjYzYxYTAyNjg0NDNhODEwMjNmMzYwNDI5ZjE0MiA9ICQoYDxkaXYgaWQ9Imh0bWxfZjA2Y2M2MWEwMjY4NDQzYTgxMDIzZjM2MDQyOWYxNDIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlNhbnRhIEJhcmJhcmE8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfY2U1YzRkMjE1YjM3NDNlNWE2N2M0OGExNGRkZmQzN2Quc2V0Q29udGVudChodG1sX2YwNmNjNjFhMDI2ODQ0M2E4MTAyM2YzNjA0MjlmMTQyKTsKICAgICAgICAKCiAgICAgICAgY2lyY2xlX21hcmtlcl85Nzg5OWYyNDIyNmY0N2QwOTdkYjBjZjU5Y2I4ODYwOC5iaW5kUG9wdXAocG9wdXBfY2U1YzRkMjE1YjM3NDNlNWE2N2M0OGExNGRkZmQzN2QpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzQzOTYxMzJhOTY5MTRmNGNiNzBhOGQzZjY3OGIzMDQ1ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzYuOTc0MTE3MSwgLTEyMi4wMzA3OTYzXSwKICAgICAgICAgICAgICAgIHsiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsICJjb2xvciI6ICIjZWI3YTM0IiwgImRhc2hBcnJheSI6IG51bGwsICJkYXNoT2Zmc2V0IjogbnVsbCwgImZpbGwiOiB0cnVlLCAiZmlsbENvbG9yIjogIiNlYjdhMzQiLCAiZmlsbE9wYWNpdHkiOiAwLjgsICJmaWxsUnVsZSI6ICJldmVub2RkIiwgImxpbmVDYXAiOiAicm91bmQiLCAibGluZUpvaW4iOiAicm91bmQiLCAib3BhY2l0eSI6IDEuMCwgInJhZGl1cyI6IDEsICJzdHJva2UiOiB0cnVlLCAid2VpZ2h0IjogM30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDRkNWFhYjllZWY5NDI3Mjk0NWI3OTE2YjcyODhjYjApOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzVlMDkxNzIwYTg5NTQwZjNiMGI2ZDM4OTFmM2U2NDc1ID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF9mZDBiYzYzY2U4OGM0M2JlOWI3MzZjODZhYjVmM2RmYiA9ICQoYDxkaXYgaWQ9Imh0bWxfZmQwYmM2M2NlODhjNDNiZTliNzM2Yzg2YWI1ZjNkZmIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlNhbnRhIENydXo8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfNWUwOTE3MjBhODk1NDBmM2IwYjZkMzg5MWYzZTY0NzUuc2V0Q29udGVudChodG1sX2ZkMGJjNjNjZTg4YzQzYmU5YjczNmM4NmFiNWYzZGZiKTsKICAgICAgICAKCiAgICAgICAgY2lyY2xlX21hcmtlcl80Mzk2MTMyYTk2OTE0ZjRjYjcwYThkM2Y2NzhiMzA0NS5iaW5kUG9wdXAocG9wdXBfNWUwOTE3MjBhODk1NDBmM2IwYjZkMzg5MWYzZTY0NzUpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzhlZDBmMmY5M2VmOTQ3MjM5Y2FkNTNhZTlkY2ZlZWE5ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzQuMDE5NDU0MywgLTExOC40OTExOTEyXSwKICAgICAgICAgICAgICAgIHsiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsICJjb2xvciI6ICIjZWI3YTM0IiwgImRhc2hBcnJheSI6IG51bGwsICJkYXNoT2Zmc2V0IjogbnVsbCwgImZpbGwiOiB0cnVlLCAiZmlsbENvbG9yIjogIiNlYjdhMzQiLCAiZmlsbE9wYWNpdHkiOiAwLjgsICJmaWxsUnVsZSI6ICJldmVub2RkIiwgImxpbmVDYXAiOiAicm91bmQiLCAibGluZUpvaW4iOiAicm91bmQiLCAib3BhY2l0eSI6IDEuMCwgInJhZGl1cyI6IDEsICJzdHJva2UiOiB0cnVlLCAid2VpZ2h0IjogM30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDRkNWFhYjllZWY5NDI3Mjk0NWI3OTE2YjcyODhjYjApOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwX2FjNmZjNTAzMWExYzRiMjI5ZGJkMDY3MzE1MTU2ZWYyID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF8xM2FhY2M4MGJjMTY0ODkzODc3ODNiMTNjNTgyY2YyMSA9ICQoYDxkaXYgaWQ9Imh0bWxfMTNhYWNjODBiYzE2NDg5Mzg3NzgzYjEzYzU4MmNmMjEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlNhbnRhIE1vbmljYTwvZGl2PmApWzBdOwogICAgICAgICAgICBwb3B1cF9hYzZmYzUwMzFhMWM0YjIyOWRiZDA2NzMxNTE1NmVmMi5zZXRDb250ZW50KGh0bWxfMTNhYWNjODBiYzE2NDg5Mzg3NzgzYjEzYzU4MmNmMjEpOwogICAgICAgIAoKICAgICAgICBjaXJjbGVfbWFya2VyXzhlZDBmMmY5M2VmOTQ3MjM5Y2FkNTNhZTlkY2ZlZWE5LmJpbmRQb3B1cChwb3B1cF9hYzZmYzUwMzFhMWM0YjIyOWRiZDA2NzMxNTE1NmVmMikKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfYTFiYjU2MmU1N2ZkNDAzMzlkYWEwZWUxOGEyNjExYjIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFsyNy4zMzY0MzQ3LCAtODIuNTMwNjUyN10sCiAgICAgICAgICAgICAgICB7ImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLCAiY29sb3IiOiAiI2ViN2EzNCIsICJkYXNoQXJyYXkiOiBudWxsLCAiZGFzaE9mZnNldCI6IG51bGwsICJmaWxsIjogdHJ1ZSwgImZpbGxDb2xvciI6ICIjZWI3YTM0IiwgImZpbGxPcGFjaXR5IjogMC44LCAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsICJsaW5lQ2FwIjogInJvdW5kIiwgImxpbmVKb2luIjogInJvdW5kIiwgIm9wYWNpdHkiOiAxLjAsICJyYWRpdXMiOiAxLCAic3Ryb2tlIjogdHJ1ZSwgIndlaWdodCI6IDN9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0ZDVhYWI5ZWVmOTQyNzI5NDViNzkxNmI3Mjg4Y2IwKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF9hZTJlOTFlMDg3NTU0NDhjOTAzZWM4N2U2MzY4NjA2ZiA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfNTY2YTMxMjY2YzUxNGI1MWI2NGZjNjdjYzJjOWU1ZGIgPSAkKGA8ZGl2IGlkPSJodG1sXzU2NmEzMTI2NmM1MTRiNTFiNjRmYzY3Y2MyYzllNWRiIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5TYXJhc290YTwvZGl2PmApWzBdOwogICAgICAgICAgICBwb3B1cF9hZTJlOTFlMDg3NTU0NDhjOTAzZWM4N2U2MzY4NjA2Zi5zZXRDb250ZW50KGh0bWxfNTY2YTMxMjY2YzUxNGI1MWI2NGZjNjdjYzJjOWU1ZGIpOwogICAgICAgIAoKICAgICAgICBjaXJjbGVfbWFya2VyX2ExYmI1NjJlNTdmZDQwMzM5ZGFhMGVlMThhMjYxMWIyLmJpbmRQb3B1cChwb3B1cF9hZTJlOTFlMDg3NTU0NDhjOTAzZWM4N2U2MzY4NjA2ZikKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfZTBmZjliYzQ0NjE5NDNjMmE3Yzk2NzI0YmE0ODlmNTggPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszMi4wODM1NDA3LCAtODEuMDk5ODM0Ml0sCiAgICAgICAgICAgICAgICB7ImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLCAiY29sb3IiOiAiI2ViN2EzNCIsICJkYXNoQXJyYXkiOiBudWxsLCAiZGFzaE9mZnNldCI6IG51bGwsICJmaWxsIjogdHJ1ZSwgImZpbGxDb2xvciI6ICIjZWI3YTM0IiwgImZpbGxPcGFjaXR5IjogMC44LCAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsICJsaW5lQ2FwIjogInJvdW5kIiwgImxpbmVKb2luIjogInJvdW5kIiwgIm9wYWNpdHkiOiAxLjAsICJyYWRpdXMiOiAxLCAic3Ryb2tlIjogdHJ1ZSwgIndlaWdodCI6IDN9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0ZDVhYWI5ZWVmOTQyNzI5NDViNzkxNmI3Mjg4Y2IwKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF80MDQ4Y2U5YzA5OWI0YzQ3YmUzOTFlZmFmMDJjNmI5YSA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfODUzNjc4MTJhNjU2NGQ3MWFjZGFmODgxZjU5MzY3ZTYgPSAkKGA8ZGl2IGlkPSJodG1sXzg1MzY3ODEyYTY1NjRkNzFhY2RhZjg4MWY1OTM2N2U2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5TYXZhbm5haDwvZGl2PmApWzBdOwogICAgICAgICAgICBwb3B1cF80MDQ4Y2U5YzA5OWI0YzQ3YmUzOTFlZmFmMDJjNmI5YS5zZXRDb250ZW50KGh0bWxfODUzNjc4MTJhNjU2NGQ3MWFjZGFmODgxZjU5MzY3ZTYpOwogICAgICAgIAoKICAgICAgICBjaXJjbGVfbWFya2VyX2UwZmY5YmM0NDYxOTQzYzJhN2M5NjcyNGJhNDg5ZjU4LmJpbmRQb3B1cChwb3B1cF80MDQ4Y2U5YzA5OWI0YzQ3YmUzOTFlZmFmMDJjNmI5YSkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMWYxYmFhZWMxY2Y0NDdiZjg5N2Y0MmRjNzM0YzJkYjMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszMy40OTQxNzA0LCAtMTExLjkyNjA1MTldLAogICAgICAgICAgICAgICAgeyJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwgImNvbG9yIjogIiNlYjdhMzQiLCAiZGFzaEFycmF5IjogbnVsbCwgImRhc2hPZmZzZXQiOiBudWxsLCAiZmlsbCI6IHRydWUsICJmaWxsQ29sb3IiOiAiI2ViN2EzNCIsICJmaWxsT3BhY2l0eSI6IDAuOCwgImZpbGxSdWxlIjogImV2ZW5vZGQiLCAibGluZUNhcCI6ICJyb3VuZCIsICJsaW5lSm9pbiI6ICJyb3VuZCIsICJvcGFjaXR5IjogMS4wLCAicmFkaXVzIjogMiwgInN0cm9rZSI6IHRydWUsICJ3ZWlnaHQiOiAzfQogICAgICAgICAgICApLmFkZFRvKG1hcF80NGQ1YWFiOWVlZjk0MjcyOTQ1Yjc5MTZiNzI4OGNiMCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfOWRiZmEwZDRmYTkyNDczNDhlZjU3ODBjZmU3ODFhMGYgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sXzlkYmRkOTk5MGVlODQ0ODRiOWY1ZmIzNWRhMDkwMDVmID0gJChgPGRpdiBpZD0iaHRtbF85ZGJkZDk5OTBlZTg0NDg0YjlmNWZiMzVkYTA5MDA1ZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U2NvdHRzZGFsZTwvZGl2PmApWzBdOwogICAgICAgICAgICBwb3B1cF85ZGJmYTBkNGZhOTI0NzM0OGVmNTc4MGNmZTc4MWEwZi5zZXRDb250ZW50KGh0bWxfOWRiZGQ5OTkwZWU4NDQ4NGI5ZjVmYjM1ZGEwOTAwNWYpOwogICAgICAgIAoKICAgICAgICBjaXJjbGVfbWFya2VyXzFmMWJhYWVjMWNmNDQ3YmY4OTdmNDJkYzczNGMyZGIzLmJpbmRQb3B1cChwb3B1cF85ZGJmYTBkNGZhOTI0NzM0OGVmNTc4MGNmZTc4MWEwZikKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfOTBiMDJlOTE1ZGZjNGMzMzhjYjI0MmM2NWI1MTYyMzIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0Ny42MDYyMDk1LCAtMTIyLjMzMjA3MDhdLAogICAgICAgICAgICAgICAgeyJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwgImNvbG9yIjogIiNlYjdhMzQiLCAiZGFzaEFycmF5IjogbnVsbCwgImRhc2hPZmZzZXQiOiBudWxsLCAiZmlsbCI6IHRydWUsICJmaWxsQ29sb3IiOiAiI2ViN2EzNCIsICJmaWxsT3BhY2l0eSI6IDAuOCwgImZpbGxSdWxlIjogImV2ZW5vZGQiLCAibGluZUNhcCI6ICJyb3VuZCIsICJsaW5lSm9pbiI6ICJyb3VuZCIsICJvcGFjaXR5IjogMS4wLCAicmFkaXVzIjogMSwgInN0cm9rZSI6IHRydWUsICJ3ZWlnaHQiOiAzfQogICAgICAgICAgICApLmFkZFRvKG1hcF80NGQ1YWFiOWVlZjk0MjcyOTQ1Yjc5MTZiNzI4OGNiMCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfOTMxNjhmMDdiZTQ4NGE5OWFiMzEyMjZjN2Y5OTRmOGMgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sXzY4NTZlMTYxMTBjNjRjMzE4MDI2Mzk0MWU2ZGU5MjkwID0gJChgPGRpdiBpZD0iaHRtbF82ODU2ZTE2MTEwYzY0YzMxODAyNjM5NDFlNmRlOTI5MCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U2VhdHRsZTwvZGl2PmApWzBdOwogICAgICAgICAgICBwb3B1cF85MzE2OGYwN2JlNDg0YTk5YWIzMTIyNmM3Zjk5NGY4Yy5zZXRDb250ZW50KGh0bWxfNjg1NmUxNjExMGM2NGMzMTgwMjYzOTQxZTZkZTkyOTApOwogICAgICAgIAoKICAgICAgICBjaXJjbGVfbWFya2VyXzkwYjAyZTkxNWRmYzRjMzM4Y2IyNDJjNjViNTE2MjMyLmJpbmRQb3B1cChwb3B1cF85MzE2OGYwN2JlNDg0YTk5YWIzMTIyNmM3Zjk5NGY4YykKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNWQ1NWU5ZThjNjBlNDcyODhmM2U5ZDFkOThmNmU3YTkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszOS4wMjI4NDg1LCAtOTQuNzE1MTg2NV0sCiAgICAgICAgICAgICAgICB7ImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLCAiY29sb3IiOiAiI2ViN2EzNCIsICJkYXNoQXJyYXkiOiBudWxsLCAiZGFzaE9mZnNldCI6IG51bGwsICJmaWxsIjogdHJ1ZSwgImZpbGxDb2xvciI6ICIjZWI3YTM0IiwgImZpbGxPcGFjaXR5IjogMC44LCAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsICJsaW5lQ2FwIjogInJvdW5kIiwgImxpbmVKb2luIjogInJvdW5kIiwgIm9wYWNpdHkiOiAxLjAsICJyYWRpdXMiOiAxLCAic3Ryb2tlIjogdHJ1ZSwgIndlaWdodCI6IDN9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0ZDVhYWI5ZWVmOTQyNzI5NDViNzkxNmI3Mjg4Y2IwKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF80ODFhNTY2ODIyYTk0YmQ3YTAyNDU2NjExNTcxNTAwZCA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfYjk3Njk1YzUzMDRlNDBlNWFmOWIxZWE2YjVmODg3YzMgPSAkKGA8ZGl2IGlkPSJodG1sX2I5NzY5NWM1MzA0ZTQwZTVhZjliMWVhNmI1Zjg4N2MzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5TaGF3bmVlPC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzQ4MWE1NjY4MjJhOTRiZDdhMDI0NTY2MTE1NzE1MDBkLnNldENvbnRlbnQoaHRtbF9iOTc2OTVjNTMwNGU0MGU1YWY5YjFlYTZiNWY4ODdjMyk7CiAgICAgICAgCgogICAgICAgIGNpcmNsZV9tYXJrZXJfNWQ1NWU5ZThjNjBlNDcyODhmM2U5ZDFkOThmNmU3YTkuYmluZFBvcHVwKHBvcHVwXzQ4MWE1NjY4MjJhOTRiZDdhMDI0NTY2MTE1NzE1MDBkKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8wYTVhMmExNWI2ZDM0ZTQ3YTk2NDBiYWM0NTE2YzE5ZiA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM0LjI2OTQ0NzQsIC0xMTguNzgxNDgyXSwKICAgICAgICAgICAgICAgIHsiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsICJjb2xvciI6ICIjZWI3YTM0IiwgImRhc2hBcnJheSI6IG51bGwsICJkYXNoT2Zmc2V0IjogbnVsbCwgImZpbGwiOiB0cnVlLCAiZmlsbENvbG9yIjogIiNlYjdhMzQiLCAiZmlsbE9wYWNpdHkiOiAwLjgsICJmaWxsUnVsZSI6ICJldmVub2RkIiwgImxpbmVDYXAiOiAicm91bmQiLCAibGluZUpvaW4iOiAicm91bmQiLCAib3BhY2l0eSI6IDEuMCwgInJhZGl1cyI6IDEsICJzdHJva2UiOiB0cnVlLCAid2VpZ2h0IjogM30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDRkNWFhYjllZWY5NDI3Mjk0NWI3OTE2YjcyODhjYjApOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwX2EyMzRhZWI5YzEzYTRiYTdhNDcwNmQwYmE3ZjIyNWY1ID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF9kZWNiZWVmNDgwZWU0NzEzOWIzZTk3NWE1ZmZiMjUzYSA9ICQoYDxkaXYgaWQ9Imh0bWxfZGVjYmVlZjQ4MGVlNDcxMzliM2U5NzVhNWZmYjI1M2EiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlNpbWkgVmFsbGV5PC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwX2EyMzRhZWI5YzEzYTRiYTdhNDcwNmQwYmE3ZjIyNWY1LnNldENvbnRlbnQoaHRtbF9kZWNiZWVmNDgwZWU0NzEzOWIzZTk3NWE1ZmZiMjUzYSk7CiAgICAgICAgCgogICAgICAgIGNpcmNsZV9tYXJrZXJfMGE1YTJhMTViNmQzNGU0N2E5NjQwYmFjNDUxNmMxOWYuYmluZFBvcHVwKHBvcHVwX2EyMzRhZWI5YzEzYTRiYTdhNDcwNmQwYmE3ZjIyNWY1KQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl8xZGU1YWEyZjE2MzU0YWQyOWZmNmM5MjI0NWJkOTFmMCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM5LjUzNDkxMTIsIC0xMTkuNzUyNjg4Nl0sCiAgICAgICAgICAgICAgICB7ImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLCAiY29sb3IiOiAiI2ViN2EzNCIsICJkYXNoQXJyYXkiOiBudWxsLCAiZGFzaE9mZnNldCI6IG51bGwsICJmaWxsIjogdHJ1ZSwgImZpbGxDb2xvciI6ICIjZWI3YTM0IiwgImZpbGxPcGFjaXR5IjogMC44LCAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsICJsaW5lQ2FwIjogInJvdW5kIiwgImxpbmVKb2luIjogInJvdW5kIiwgIm9wYWNpdHkiOiAxLjAsICJyYWRpdXMiOiAxLCAic3Ryb2tlIjogdHJ1ZSwgIndlaWdodCI6IDN9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0ZDVhYWI5ZWVmOTQyNzI5NDViNzkxNmI3Mjg4Y2IwKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF8yMDFmYjllYzc4NmQ0MjBiYjBlM2UyYmY0NzQwN2ExMSA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfZmVkNDVlNTdiNWMxNDMwMDkyMmQ0NWM0YzI4ZTI3MDEgPSAkKGA8ZGl2IGlkPSJodG1sX2ZlZDQ1ZTU3YjVjMTQzMDA5MjJkNDVjNGMyOGUyNzAxIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5TcGFya3M8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfMjAxZmI5ZWM3ODZkNDIwYmIwZTNlMmJmNDc0MDdhMTEuc2V0Q29udGVudChodG1sX2ZlZDQ1ZTU3YjVjMTQzMDA5MjJkNDVjNGMyOGUyNzAxKTsKICAgICAgICAKCiAgICAgICAgY2lyY2xlX21hcmtlcl8xZGU1YWEyZjE2MzU0YWQyOWZmNmM5MjI0NWJkOTFmMC5iaW5kUG9wdXAocG9wdXBfMjAxZmI5ZWM3ODZkNDIwYmIwZTNlMmJmNDc0MDdhMTEpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2M4Nzk0NmRiNDA4NjRhOTg5Zjg5OTg4OTYyOTRmN2ViID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDAuNzkzMzk0OSwgLTc3Ljg2MDAwMTJdLAogICAgICAgICAgICAgICAgeyJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwgImNvbG9yIjogIiNlYjdhMzQiLCAiZGFzaEFycmF5IjogbnVsbCwgImRhc2hPZmZzZXQiOiBudWxsLCAiZmlsbCI6IHRydWUsICJmaWxsQ29sb3IiOiAiI2ViN2EzNCIsICJmaWxsT3BhY2l0eSI6IDAuOCwgImZpbGxSdWxlIjogImV2ZW5vZGQiLCAibGluZUNhcCI6ICJyb3VuZCIsICJsaW5lSm9pbiI6ICJyb3VuZCIsICJvcGFjaXR5IjogMS4wLCAicmFkaXVzIjogMSwgInN0cm9rZSI6IHRydWUsICJ3ZWlnaHQiOiAzfQogICAgICAgICAgICApLmFkZFRvKG1hcF80NGQ1YWFiOWVlZjk0MjcyOTQ1Yjc5MTZiNzI4OGNiMCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfNDZlY2YzYmFlMTZhNDAwZGJmNDMxYzNmOTk1OWU4ZTIgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sXzIwY2U1NjgwYzhjNDQ5Zjk4NTZjYjQ0ZTIyMzEwYjY2ID0gJChgPGRpdiBpZD0iaHRtbF8yMGNlNTY4MGM4YzQ0OWY5ODU2Y2I0NGUyMjMxMGI2NiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U3RhdGUgQ29sbGVnZTwvZGl2PmApWzBdOwogICAgICAgICAgICBwb3B1cF80NmVjZjNiYWUxNmE0MDBkYmY0MzFjM2Y5OTU5ZThlMi5zZXRDb250ZW50KGh0bWxfMjBjZTU2ODBjOGM0NDlmOTg1NmNiNDRlMjIzMTBiNjYpOwogICAgICAgIAoKICAgICAgICBjaXJjbGVfbWFya2VyX2M4Nzk0NmRiNDA4NjRhOTg5Zjg5OTg4OTYyOTRmN2ViLmJpbmRQb3B1cChwb3B1cF80NmVjZjNiYWUxNmE0MDBkYmY0MzFjM2Y5OTU5ZThlMikKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMGIyYmVhZmUzOGU1NGIxMTkxMzUyNmYwNjI1YWM4Y2UgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszOC42MjcwMDI1LCAtOTAuMTk5NDA0Ml0sCiAgICAgICAgICAgICAgICB7ImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLCAiY29sb3IiOiAiI2ViN2EzNCIsICJkYXNoQXJyYXkiOiBudWxsLCAiZGFzaE9mZnNldCI6IG51bGwsICJmaWxsIjogdHJ1ZSwgImZpbGxDb2xvciI6ICIjZWI3YTM0IiwgImZpbGxPcGFjaXR5IjogMC44LCAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsICJsaW5lQ2FwIjogInJvdW5kIiwgImxpbmVKb2luIjogInJvdW5kIiwgIm9wYWNpdHkiOiAxLjAsICJyYWRpdXMiOiAzLCAic3Ryb2tlIjogdHJ1ZSwgIndlaWdodCI6IDN9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0ZDVhYWI5ZWVmOTQyNzI5NDViNzkxNmI3Mjg4Y2IwKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF8xNTQ4NTY5OGJhYjA0YmJiOWI4MDc1ZDRhYmUxYjFlZiA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfY2Y4ODk4ZWFjOGJlNDJjYThlOTFjOTQyOGFjNWMxNzAgPSAkKGA8ZGl2IGlkPSJodG1sX2NmODg5OGVhYzhiZTQyY2E4ZTkxYzk0MjhhYzVjMTcwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5TdC4gTG91aXM8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfMTU0ODU2OThiYWIwNGJiYjliODA3NWQ0YWJlMWIxZWYuc2V0Q29udGVudChodG1sX2NmODg5OGVhYzhiZTQyY2E4ZTkxYzk0MjhhYzVjMTcwKTsKICAgICAgICAKCiAgICAgICAgY2lyY2xlX21hcmtlcl8wYjJiZWFmZTM4ZTU0YjExOTEzNTI2ZjA2MjVhYzhjZS5iaW5kUG9wdXAocG9wdXBfMTU0ODU2OThiYWIwNGJiYjliODA3NWQ0YWJlMWIxZWYpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzhlZDAzOTJlNTdhZjQ4NGJhZDA5ZmJjOGU5M2IxN2Y3ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbNDMuMDQ4MTIyMSwgLTc2LjE0NzQyNDRdLAogICAgICAgICAgICAgICAgeyJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwgImNvbG9yIjogIiNlYjdhMzQiLCAiZGFzaEFycmF5IjogbnVsbCwgImRhc2hPZmZzZXQiOiBudWxsLCAiZmlsbCI6IHRydWUsICJmaWxsQ29sb3IiOiAiI2ViN2EzNCIsICJmaWxsT3BhY2l0eSI6IDAuOCwgImZpbGxSdWxlIjogImV2ZW5vZGQiLCAibGluZUNhcCI6ICJyb3VuZCIsICJsaW5lSm9pbiI6ICJyb3VuZCIsICJvcGFjaXR5IjogMS4wLCAicmFkaXVzIjogMSwgInN0cm9rZSI6IHRydWUsICJ3ZWlnaHQiOiAzfQogICAgICAgICAgICApLmFkZFRvKG1hcF80NGQ1YWFiOWVlZjk0MjcyOTQ1Yjc5MTZiNzI4OGNiMCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfZTc4MjA4Yzk5YmE5NGY5NDhiNGZjZjgwOGI1YTkwMjcgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sX2U2YmM2ZjlhOWU3ZTQ0NDY4NTI3OWFiOGQzZTk4NzdkID0gJChgPGRpdiBpZD0iaHRtbF9lNmJjNmY5YTllN2U0NDQ2ODUyNzlhYjhkM2U5ODc3ZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+U3lyYWN1c2U8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfZTc4MjA4Yzk5YmE5NGY5NDhiNGZjZjgwOGI1YTkwMjcuc2V0Q29udGVudChodG1sX2U2YmM2ZjlhOWU3ZTQ0NDY4NTI3OWFiOGQzZTk4NzdkKTsKICAgICAgICAKCiAgICAgICAgY2lyY2xlX21hcmtlcl84ZWQwMzkyZTU3YWY0ODRiYWQwOWZiYzhlOTNiMTdmNy5iaW5kUG9wdXAocG9wdXBfZTc4MjA4Yzk5YmE5NGY5NDhiNGZjZjgwOGI1YTkwMjcpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzBmMzg2YzRmYmQyZDRiMGVhNGFjZWMxYjg5NGI0ZTIyID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMjYuMjEyODYwOSwgLTgwLjI0OTc3MDddLAogICAgICAgICAgICAgICAgeyJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwgImNvbG9yIjogIiNlYjdhMzQiLCAiZGFzaEFycmF5IjogbnVsbCwgImRhc2hPZmZzZXQiOiBudWxsLCAiZmlsbCI6IHRydWUsICJmaWxsQ29sb3IiOiAiI2ViN2EzNCIsICJmaWxsT3BhY2l0eSI6IDAuOCwgImZpbGxSdWxlIjogImV2ZW5vZGQiLCAibGluZUNhcCI6ICJyb3VuZCIsICJsaW5lSm9pbiI6ICJyb3VuZCIsICJvcGFjaXR5IjogMS4wLCAicmFkaXVzIjogMSwgInN0cm9rZSI6IHRydWUsICJ3ZWlnaHQiOiAzfQogICAgICAgICAgICApLmFkZFRvKG1hcF80NGQ1YWFiOWVlZjk0MjcyOTQ1Yjc5MTZiNzI4OGNiMCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfMjIyYjAzM2Y0NDM1NDZjOWJlNzVjMmJmYzM3MzA3ODcgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sXzFhNGEwNTRkN2E3MjRlZWY4NzFlODVmZDZlMDA5MzM3ID0gJChgPGRpdiBpZD0iaHRtbF8xYTRhMDU0ZDdhNzI0ZWVmODcxZTg1ZmQ2ZTAwOTMzNyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+VGFtYXJhYzwvZGl2PmApWzBdOwogICAgICAgICAgICBwb3B1cF8yMjJiMDMzZjQ0MzU0NmM5YmU3NWMyYmZjMzczMDc4Ny5zZXRDb250ZW50KGh0bWxfMWE0YTA1NGQ3YTcyNGVlZjg3MWU4NWZkNmUwMDkzMzcpOwogICAgICAgIAoKICAgICAgICBjaXJjbGVfbWFya2VyXzBmMzg2YzRmYmQyZDRiMGVhNGFjZWMxYjg5NGI0ZTIyLmJpbmRQb3B1cChwb3B1cF8yMjJiMDMzZjQ0MzU0NmM5YmU3NWMyYmZjMzczMDc4NykKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNjk4YmU3NThkYzM3NDkwNjkxY2FkYTIwZjUxMzY1YmQgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFsyNy45NTA1NzUsIC04Mi40NTcxNzc2XSwKICAgICAgICAgICAgICAgIHsiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsICJjb2xvciI6ICIjZWI3YTM0IiwgImRhc2hBcnJheSI6IG51bGwsICJkYXNoT2Zmc2V0IjogbnVsbCwgImZpbGwiOiB0cnVlLCAiZmlsbENvbG9yIjogIiNlYjdhMzQiLCAiZmlsbE9wYWNpdHkiOiAwLjgsICJmaWxsUnVsZSI6ICJldmVub2RkIiwgImxpbmVDYXAiOiAicm91bmQiLCAibGluZUpvaW4iOiAicm91bmQiLCAib3BhY2l0eSI6IDEuMCwgInJhZGl1cyI6IDIsICJzdHJva2UiOiB0cnVlLCAid2VpZ2h0IjogM30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDRkNWFhYjllZWY5NDI3Mjk0NWI3OTE2YjcyODhjYjApOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzcwZWY4ZDM4YzQ5YzRiM2ZhNjQ1OTE0Y2Q0NDhhYjFkID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF9kYmJkMmQ4ODFkYjU0MjFhYjRjOTQ3MmRhZGJkYWI0OSA9ICQoYDxkaXYgaWQ9Imh0bWxfZGJiZDJkODgxZGI1NDIxYWI0Yzk0NzJkYWRiZGFiNDkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlRhbXBhPC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzcwZWY4ZDM4YzQ5YzRiM2ZhNjQ1OTE0Y2Q0NDhhYjFkLnNldENvbnRlbnQoaHRtbF9kYmJkMmQ4ODFkYjU0MjFhYjRjOTQ3MmRhZGJkYWI0OSk7CiAgICAgICAgCgogICAgICAgIGNpcmNsZV9tYXJrZXJfNjk4YmU3NThkYzM3NDkwNjkxY2FkYTIwZjUxMzY1YmQuYmluZFBvcHVwKHBvcHVwXzcwZWY4ZDM4YzQ5YzRiM2ZhNjQ1OTE0Y2Q0NDhhYjFkKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9jOGJhMjA4YTU0Mjk0MTBmODZiZDNlMjQwYjg0MzMxNyA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzMzLjQ5MzYzOTEsIC0xMTcuMTQ4MzY0OF0sCiAgICAgICAgICAgICAgICB7ImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLCAiY29sb3IiOiAiI2ViN2EzNCIsICJkYXNoQXJyYXkiOiBudWxsLCAiZGFzaE9mZnNldCI6IG51bGwsICJmaWxsIjogdHJ1ZSwgImZpbGxDb2xvciI6ICIjZWI3YTM0IiwgImZpbGxPcGFjaXR5IjogMC44LCAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsICJsaW5lQ2FwIjogInJvdW5kIiwgImxpbmVKb2luIjogInJvdW5kIiwgIm9wYWNpdHkiOiAxLjAsICJyYWRpdXMiOiAxLCAic3Ryb2tlIjogdHJ1ZSwgIndlaWdodCI6IDN9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0ZDVhYWI5ZWVmOTQyNzI5NDViNzkxNmI3Mjg4Y2IwKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF9mZGRlMjNlMTdmNzg0Y2FiODU3MDMyMjgxYjEzNjI1YSA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfZWMwZGQxZmJmM2M4NDU2Y2E0N2U3MTQ0MjkzNjY0ZmYgPSAkKGA8ZGl2IGlkPSJodG1sX2VjMGRkMWZiZjNjODQ1NmNhNDdlNzE0NDI5MzY2NGZmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5UZW1lY3VsYTwvZGl2PmApWzBdOwogICAgICAgICAgICBwb3B1cF9mZGRlMjNlMTdmNzg0Y2FiODU3MDMyMjgxYjEzNjI1YS5zZXRDb250ZW50KGh0bWxfZWMwZGQxZmJmM2M4NDU2Y2E0N2U3MTQ0MjkzNjY0ZmYpOwogICAgICAgIAoKICAgICAgICBjaXJjbGVfbWFya2VyX2M4YmEyMDhhNTQyOTQxMGY4NmJkM2UyNDBiODQzMzE3LmJpbmRQb3B1cChwb3B1cF9mZGRlMjNlMTdmNzg0Y2FiODU3MDMyMjgxYjEzNjI1YSkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNDc4MzVkNzE4NDc2NDIzNmFjMzUwZWM1MjZiNzI1ZWMgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszMy44MzU4NDkyLCAtMTE4LjM0MDYyODhdLAogICAgICAgICAgICAgICAgeyJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwgImNvbG9yIjogIiNlYjdhMzQiLCAiZGFzaEFycmF5IjogbnVsbCwgImRhc2hPZmZzZXQiOiBudWxsLCAiZmlsbCI6IHRydWUsICJmaWxsQ29sb3IiOiAiI2ViN2EzNCIsICJmaWxsT3BhY2l0eSI6IDAuOCwgImZpbGxSdWxlIjogImV2ZW5vZGQiLCAibGluZUNhcCI6ICJyb3VuZCIsICJsaW5lSm9pbiI6ICJyb3VuZCIsICJvcGFjaXR5IjogMS4wLCAicmFkaXVzIjogMSwgInN0cm9rZSI6IHRydWUsICJ3ZWlnaHQiOiAzfQogICAgICAgICAgICApLmFkZFRvKG1hcF80NGQ1YWFiOWVlZjk0MjcyOTQ1Yjc5MTZiNzI4OGNiMCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfYmFiODMyNzliNmE2NDVmMDkxZDAyZjEwNjcyZjY4NGUgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sXzU3ZDg4M2U1ZDY4NTQ1ZmZhNDhjNGFmMDE4ODk4Nzk5ID0gJChgPGRpdiBpZD0iaHRtbF81N2Q4ODNlNWQ2ODU0NWZmYTQ4YzRhZjAxODg5ODc5OSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+VG9ycmFuY2U8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfYmFiODMyNzliNmE2NDVmMDkxZDAyZjEwNjcyZjY4NGUuc2V0Q29udGVudChodG1sXzU3ZDg4M2U1ZDY4NTQ1ZmZhNDhjNGFmMDE4ODk4Nzk5KTsKICAgICAgICAKCiAgICAgICAgY2lyY2xlX21hcmtlcl80NzgzNWQ3MTg0NzY0MjM2YWMzNTBlYzUyNmI3MjVlYy5iaW5kUG9wdXAocG9wdXBfYmFiODMyNzliNmE2NDVmMDkxZDAyZjEwNjcyZjY4NGUpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyX2I5ZWFlOGQwYzMzYzQ3ZjhiMTQ1MjA3YjdiZmM2ZTZkID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzIuMjIxNzQyOSwgLTExMC45MjY0NzldLAogICAgICAgICAgICAgICAgeyJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwgImNvbG9yIjogIiNlYjdhMzQiLCAiZGFzaEFycmF5IjogbnVsbCwgImRhc2hPZmZzZXQiOiBudWxsLCAiZmlsbCI6IHRydWUsICJmaWxsQ29sb3IiOiAiI2ViN2EzNCIsICJmaWxsT3BhY2l0eSI6IDAuOCwgImZpbGxSdWxlIjogImV2ZW5vZGQiLCAibGluZUNhcCI6ICJyb3VuZCIsICJsaW5lSm9pbiI6ICJyb3VuZCIsICJvcGFjaXR5IjogMS4wLCAicmFkaXVzIjogNSwgInN0cm9rZSI6IHRydWUsICJ3ZWlnaHQiOiAzfQogICAgICAgICAgICApLmFkZFRvKG1hcF80NGQ1YWFiOWVlZjk0MjcyOTQ1Yjc5MTZiNzI4OGNiMCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfMDk1Mzk4OWVhMzIyNGI1NDllZThjYmI2MTdhYjBkYmYgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sXzdjNTI2Y2JmNzkzMjRjZTY4NGY0Yzg5ZGExMzgxNjk0ID0gJChgPGRpdiBpZD0iaHRtbF83YzUyNmNiZjc5MzI0Y2U2ODRmNGM4OWRhMTM4MTY5NCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+VHVjc29uPC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzA5NTM5ODllYTMyMjRiNTQ5ZWU4Y2JiNjE3YWIwZGJmLnNldENvbnRlbnQoaHRtbF83YzUyNmNiZjc5MzI0Y2U2ODRmNGM4OWRhMTM4MTY5NCk7CiAgICAgICAgCgogICAgICAgIGNpcmNsZV9tYXJrZXJfYjllYWU4ZDBjMzNjNDdmOGIxNDUyMDdiN2JmYzZlNmQuYmluZFBvcHVwKHBvcHVwXzA5NTM5ODllYTMyMjRiNTQ5ZWU4Y2JiNjE3YWIwZGJmKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl85ZmNmZDY5MjgxNGI0MzcxOTMzMjhkNjA2ZTczMmI5NCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzM2LjE1Mzk4MTYsIC05NS45OTI3NzVdLAogICAgICAgICAgICAgICAgeyJidWJibGluZ01vdXNlRXZlbnRzIjogdHJ1ZSwgImNvbG9yIjogIiNlYjdhMzQiLCAiZGFzaEFycmF5IjogbnVsbCwgImRhc2hPZmZzZXQiOiBudWxsLCAiZmlsbCI6IHRydWUsICJmaWxsQ29sb3IiOiAiI2ViN2EzNCIsICJmaWxsT3BhY2l0eSI6IDAuOCwgImZpbGxSdWxlIjogImV2ZW5vZGQiLCAibGluZUNhcCI6ICJyb3VuZCIsICJsaW5lSm9pbiI6ICJyb3VuZCIsICJvcGFjaXR5IjogMS4wLCAicmFkaXVzIjogMSwgInN0cm9rZSI6IHRydWUsICJ3ZWlnaHQiOiAzfQogICAgICAgICAgICApLmFkZFRvKG1hcF80NGQ1YWFiOWVlZjk0MjcyOTQ1Yjc5MTZiNzI4OGNiMCk7CiAgICAgICAgCiAgICAKICAgICAgICB2YXIgcG9wdXBfZjBmYzUwMzg1MTE0NDZiOTg4NDZlMTI5MzUxMDQ0NWQgPSBMLnBvcHVwKHsibWF4V2lkdGgiOiAiMTAwJSJ9KTsKCiAgICAgICAgCiAgICAgICAgICAgIHZhciBodG1sXzlhZjIyYThiZTE2YTQyYWQ4NWM4ZjgwNmJlMzJhOTMyID0gJChgPGRpdiBpZD0iaHRtbF85YWYyMmE4YmUxNmE0MmFkODVjOGY4MDZiZTMyYTkzMiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+VHVsc2E8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfZjBmYzUwMzg1MTE0NDZiOTg4NDZlMTI5MzUxMDQ0NWQuc2V0Q29udGVudChodG1sXzlhZjIyYThiZTE2YTQyYWQ4NWM4ZjgwNmJlMzJhOTMyKTsKICAgICAgICAKCiAgICAgICAgY2lyY2xlX21hcmtlcl85ZmNmZDY5MjgxNGI0MzcxOTMzMjhkNjA2ZTczMmI5NC5iaW5kUG9wdXAocG9wdXBfZjBmYzUwMzg1MTE0NDZiOTg4NDZlMTI5MzUxMDQ0NWQpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzY1OWM3NTcyZGM3YjQ3ZDdiNzk5MmEwYzJkMzU4OTE0ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzQuMDk3NTEsIC0xMTcuNjQ4Mzg3Nl0sCiAgICAgICAgICAgICAgICB7ImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLCAiY29sb3IiOiAiI2ViN2EzNCIsICJkYXNoQXJyYXkiOiBudWxsLCAiZGFzaE9mZnNldCI6IG51bGwsICJmaWxsIjogdHJ1ZSwgImZpbGxDb2xvciI6ICIjZWI3YTM0IiwgImZpbGxPcGFjaXR5IjogMC44LCAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsICJsaW5lQ2FwIjogInJvdW5kIiwgImxpbmVKb2luIjogInJvdW5kIiwgIm9wYWNpdHkiOiAxLjAsICJyYWRpdXMiOiAyLCAic3Ryb2tlIjogdHJ1ZSwgIndlaWdodCI6IDN9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0ZDVhYWI5ZWVmOTQyNzI5NDViNzkxNmI3Mjg4Y2IwKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF8zYmZlOTAyNGM3ODI0NDhhOTc2NjIyM2Q4YzBlNjc5NyA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfN2E1ZjJkNDRlZWIzNDExM2JjNjM1MmNjOWMzODZkMTAgPSAkKGA8ZGl2IGlkPSJodG1sXzdhNWYyZDQ0ZWViMzQxMTNiYzYzNTJjYzljMzg2ZDEwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5VcGxhbmQ8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfM2JmZTkwMjRjNzgyNDQ4YTk3NjYyMjNkOGMwZTY3OTcuc2V0Q29udGVudChodG1sXzdhNWYyZDQ0ZWViMzQxMTNiYzYzNTJjYzljMzg2ZDEwKTsKICAgICAgICAKCiAgICAgICAgY2lyY2xlX21hcmtlcl82NTljNzU3MmRjN2I0N2Q3Yjc5OTJhMGMyZDM1ODkxNC5iaW5kUG9wdXAocG9wdXBfM2JmZTkwMjRjNzgyNDQ4YTk3NjYyMjNkOGMwZTY3OTcpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzZkMGIyNDJjYjYzYzQyOThhMmYxYTA1Mzk5ZGQ4OGMzID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzYuODUyOTI2MywgLTc1Ljk3Nzk4NV0sCiAgICAgICAgICAgICAgICB7ImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLCAiY29sb3IiOiAiI2ViN2EzNCIsICJkYXNoQXJyYXkiOiBudWxsLCAiZGFzaE9mZnNldCI6IG51bGwsICJmaWxsIjogdHJ1ZSwgImZpbGxDb2xvciI6ICIjZWI3YTM0IiwgImZpbGxPcGFjaXR5IjogMC44LCAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsICJsaW5lQ2FwIjogInJvdW5kIiwgImxpbmVKb2luIjogInJvdW5kIiwgIm9wYWNpdHkiOiAxLjAsICJyYWRpdXMiOiAxLCAic3Ryb2tlIjogdHJ1ZSwgIndlaWdodCI6IDN9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0ZDVhYWI5ZWVmOTQyNzI5NDViNzkxNmI3Mjg4Y2IwKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF85ODk3YTExMDNmOGE0MDdkOGFiZjdjNDQ0NWE0Zjc3ZiA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfMWFhNzM5YjJlOWMyNDEzMWFiYjM1NzkzZDNmNDY2MGYgPSAkKGA8ZGl2IGlkPSJodG1sXzFhYTczOWIyZTljMjQxMzFhYmIzNTc5M2QzZjQ2NjBmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5WaXJnaW5pYSBCZWFjaDwvZGl2PmApWzBdOwogICAgICAgICAgICBwb3B1cF85ODk3YTExMDNmOGE0MDdkOGFiZjdjNDQ0NWE0Zjc3Zi5zZXRDb250ZW50KGh0bWxfMWFhNzM5YjJlOWMyNDEzMWFiYjM1NzkzZDNmNDY2MGYpOwogICAgICAgIAoKICAgICAgICBjaXJjbGVfbWFya2VyXzZkMGIyNDJjYjYzYzQyOThhMmYxYTA1Mzk5ZGQ4OGMzLmJpbmRQb3B1cChwb3B1cF85ODk3YTExMDNmOGE0MDdkOGFiZjdjNDQ0NWE0Zjc3ZikKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfY2I1MjM1ZWVhODJhNGQyOWJjMjQ5MWNjZmY1MGY5Y2YgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszOC45MDcxOTIzLCAtNzcuMDM2ODcwN10sCiAgICAgICAgICAgICAgICB7ImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLCAiY29sb3IiOiAiI2ViN2EzNCIsICJkYXNoQXJyYXkiOiBudWxsLCAiZGFzaE9mZnNldCI6IG51bGwsICJmaWxsIjogdHJ1ZSwgImZpbGxDb2xvciI6ICIjZWI3YTM0IiwgImZpbGxPcGFjaXR5IjogMC44LCAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsICJsaW5lQ2FwIjogInJvdW5kIiwgImxpbmVKb2luIjogInJvdW5kIiwgIm9wYWNpdHkiOiAxLjAsICJyYWRpdXMiOiAyLCAic3Ryb2tlIjogdHJ1ZSwgIndlaWdodCI6IDN9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0ZDVhYWI5ZWVmOTQyNzI5NDViNzkxNmI3Mjg4Y2IwKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF9iODUzYzJiNjgzODE0MmJhOTczYjcwMWVkZTJmMmYzYiA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfYzRiZGU1ZTE2Njk1NDkzNjg1YWM4YWU0ZGEzZWRmNGEgPSAkKGA8ZGl2IGlkPSJodG1sX2M0YmRlNWUxNjY5NTQ5MzY4NWFjOGFlNGRhM2VkZjRhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5XYXNoaW5ndG9uPC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwX2I4NTNjMmI2ODM4MTQyYmE5NzNiNzAxZWRlMmYyZjNiLnNldENvbnRlbnQoaHRtbF9jNGJkZTVlMTY2OTU0OTM2ODVhYzhhZTRkYTNlZGY0YSk7CiAgICAgICAgCgogICAgICAgIGNpcmNsZV9tYXJrZXJfY2I1MjM1ZWVhODJhNGQyOWJjMjQ5MWNjZmY1MGY5Y2YuYmluZFBvcHVwKHBvcHVwX2I4NTNjMmI2ODM4MTQyYmE5NzNiNzAxZWRlMmYyZjNiKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mZThkNmI4NGJkOWM0ZmU5ODljOWE3ZjEzMGMxNTA3NCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQ0Ljk1OTEzNTIsIC04OS42MzAxMjIxXSwKICAgICAgICAgICAgICAgIHsiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsICJjb2xvciI6ICIjZWI3YTM0IiwgImRhc2hBcnJheSI6IG51bGwsICJkYXNoT2Zmc2V0IjogbnVsbCwgImZpbGwiOiB0cnVlLCAiZmlsbENvbG9yIjogIiNlYjdhMzQiLCAiZmlsbE9wYWNpdHkiOiAwLjgsICJmaWxsUnVsZSI6ICJldmVub2RkIiwgImxpbmVDYXAiOiAicm91bmQiLCAibGluZUpvaW4iOiAicm91bmQiLCAib3BhY2l0eSI6IDEuMCwgInJhZGl1cyI6IDEsICJzdHJva2UiOiB0cnVlLCAid2VpZ2h0IjogM30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDRkNWFhYjllZWY5NDI3Mjk0NWI3OTE2YjcyODhjYjApOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzBlMzBmNTRiZTQ2NDRjODM5MTA2MzY1NzU5NDM2ODg2ID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF9jZTBlOGI0YjI2MjM0ZDFlYTkwM2NiN2EzMGQyMDFkOSA9ICQoYDxkaXYgaWQ9Imh0bWxfY2UwZThiNGIyNjIzNGQxZWE5MDNjYjdhMzBkMjAxZDkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPldhdXNhdTwvZGl2PmApWzBdOwogICAgICAgICAgICBwb3B1cF8wZTMwZjU0YmU0NjQ0YzgzOTEwNjM2NTc1OTQzNjg4Ni5zZXRDb250ZW50KGh0bWxfY2UwZThiNGIyNjIzNGQxZWE5MDNjYjdhMzBkMjAxZDkpOwogICAgICAgIAoKICAgICAgICBjaXJjbGVfbWFya2VyX2ZlOGQ2Yjg0YmQ5YzRmZTk4OWM5YTdmMTMwYzE1MDc0LmJpbmRQb3B1cChwb3B1cF8wZTMwZjU0YmU0NjQ0YzgzOTEwNjM2NTc1OTQzNjg4NikKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfNDVmNTlhN2Q5ZDE2NGExMGJjODY3YTFhNjEyZTM2MTIgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFs0My4wNDk0NTcyLCAtODguMDA3NTg3NV0sCiAgICAgICAgICAgICAgICB7ImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLCAiY29sb3IiOiAiI2ViN2EzNCIsICJkYXNoQXJyYXkiOiBudWxsLCAiZGFzaE9mZnNldCI6IG51bGwsICJmaWxsIjogdHJ1ZSwgImZpbGxDb2xvciI6ICIjZWI3YTM0IiwgImZpbGxPcGFjaXR5IjogMC44LCAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsICJsaW5lQ2FwIjogInJvdW5kIiwgImxpbmVKb2luIjogInJvdW5kIiwgIm9wYWNpdHkiOiAxLjAsICJyYWRpdXMiOiAxLCAic3Ryb2tlIjogdHJ1ZSwgIndlaWdodCI6IDN9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0ZDVhYWI5ZWVmOTQyNzI5NDViNzkxNmI3Mjg4Y2IwKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF9kNzc1ZGMxOThjMzA0NTk1OGEwNjY1YjY4N2QyMjk0NyA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfZDA2OWNmY2MxMGJjNDFhNThjMDRmNmVlMzlmMGM2MzUgPSAkKGA8ZGl2IGlkPSJodG1sX2QwNjljZmNjMTBiYzQxYTU4YzA0ZjZlZTM5ZjBjNjM1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5XYXV3YXRvc2E8L2Rpdj5gKVswXTsKICAgICAgICAgICAgcG9wdXBfZDc3NWRjMTk4YzMwNDU5NThhMDY2NWI2ODdkMjI5NDcuc2V0Q29udGVudChodG1sX2QwNjljZmNjMTBiYzQxYTU4YzA0ZjZlZTM5ZjBjNjM1KTsKICAgICAgICAKCiAgICAgICAgY2lyY2xlX21hcmtlcl80NWY1OWE3ZDlkMTY0YTEwYmM4NjdhMWE2MTJlMzYxMi5iaW5kUG9wdXAocG9wdXBfZDc3NWRjMTk4YzMwNDU5NThhMDY2NWI2ODdkMjI5NDcpCiAgICAgICAgOwoKICAgICAgICAKICAgIAogICAgCiAgICAgICAgICAgIHZhciBjaXJjbGVfbWFya2VyXzI2MWJkOThjYmI1ZDRlNTE4MDJiODM5MDQxNjMzYzA2ID0gTC5jaXJjbGVNYXJrZXIoCiAgICAgICAgICAgICAgICBbMzkuODM2NjUyOCwgLTEwNS4wMzcyMDQ2XSwKICAgICAgICAgICAgICAgIHsiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsICJjb2xvciI6ICIjZWI3YTM0IiwgImRhc2hBcnJheSI6IG51bGwsICJkYXNoT2Zmc2V0IjogbnVsbCwgImZpbGwiOiB0cnVlLCAiZmlsbENvbG9yIjogIiNlYjdhMzQiLCAiZmlsbE9wYWNpdHkiOiAwLjgsICJmaWxsUnVsZSI6ICJldmVub2RkIiwgImxpbmVDYXAiOiAicm91bmQiLCAibGluZUpvaW4iOiAicm91bmQiLCAib3BhY2l0eSI6IDEuMCwgInJhZGl1cyI6IDEsICJzdHJva2UiOiB0cnVlLCAid2VpZ2h0IjogM30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDRkNWFhYjllZWY5NDI3Mjk0NWI3OTE2YjcyODhjYjApOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzZiMTJlNGVkNTU2ODRjMDlhNjNjMTk4ZGRiOGE5OGU4ID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF9kNTVhZThhZDM2NzA0MWY3ODZkNDNiNzBjMWMyODg0YiA9ICQoYDxkaXYgaWQ9Imh0bWxfZDU1YWU4YWQzNjcwNDFmNzg2ZDQzYjcwYzFjMjg4NGIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPldlc3RtaW5zdGVyPC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwXzZiMTJlNGVkNTU2ODRjMDlhNjNjMTk4ZGRiOGE5OGU4LnNldENvbnRlbnQoaHRtbF9kNTVhZThhZDM2NzA0MWY3ODZkNDNiNzBjMWMyODg0Yik7CiAgICAgICAgCgogICAgICAgIGNpcmNsZV9tYXJrZXJfMjYxYmQ5OGNiYjVkNGU1MTgwMmI4MzkwNDE2MzNjMDYuYmluZFBvcHVwKHBvcHVwXzZiMTJlNGVkNTU2ODRjMDlhNjNjMTk4ZGRiOGE5OGU4KQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9kMGU2YTAyNzNiNzE0ZDUyYTdhMjZjMzQxODZkNDc2ZCA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzI2LjcxNTM0MjQsIC04MC4wNTMzNzQ2XSwKICAgICAgICAgICAgICAgIHsiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsICJjb2xvciI6ICIjZWI3YTM0IiwgImRhc2hBcnJheSI6IG51bGwsICJkYXNoT2Zmc2V0IjogbnVsbCwgImZpbGwiOiB0cnVlLCAiZmlsbENvbG9yIjogIiNlYjdhMzQiLCAiZmlsbE9wYWNpdHkiOiAwLjgsICJmaWxsUnVsZSI6ICJldmVub2RkIiwgImxpbmVDYXAiOiAicm91bmQiLCAibGluZUpvaW4iOiAicm91bmQiLCAib3BhY2l0eSI6IDEuMCwgInJhZGl1cyI6IDEsICJzdHJva2UiOiB0cnVlLCAid2VpZ2h0IjogM30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDRkNWFhYjllZWY5NDI3Mjk0NWI3OTE2YjcyODhjYjApOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzM1ZTVhODcwNjMyOTQ4OWQ5YzQwMDk5OWRhOTEyNmY4ID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF8yMzA0OTY5OTU2Njg0ZmQ2YWM0ZjMxM2MzZmU3NDNjZSA9ICQoYDxkaXYgaWQ9Imh0bWxfMjMwNDk2OTk1NjY4NGZkNmFjNGYzMTNjM2ZlNzQzY2UiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPldlc3QgUGFsbSBCZWFjaDwvZGl2PmApWzBdOwogICAgICAgICAgICBwb3B1cF8zNWU1YTg3MDYzMjk0ODlkOWM0MDA5OTlkYTkxMjZmOC5zZXRDb250ZW50KGh0bWxfMjMwNDk2OTk1NjY4NGZkNmFjNGYzMTNjM2ZlNzQzY2UpOwogICAgICAgIAoKICAgICAgICBjaXJjbGVfbWFya2VyX2QwZTZhMDI3M2I3MTRkNTJhN2EyNmMzNDE4NmQ0NzZkLmJpbmRQb3B1cChwb3B1cF8zNWU1YTg3MDYzMjk0ODlkOWM0MDA5OTlkYTkxMjZmOCkKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMGM2NzY4ZjZjNzE1NDI3MGJlYWRiYmVkMjU2Njc4YzYgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszMy45NzkxNzkzLCAtMTE4LjAzMjg0NF0sCiAgICAgICAgICAgICAgICB7ImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLCAiY29sb3IiOiAiI2ViN2EzNCIsICJkYXNoQXJyYXkiOiBudWxsLCAiZGFzaE9mZnNldCI6IG51bGwsICJmaWxsIjogdHJ1ZSwgImZpbGxDb2xvciI6ICIjZWI3YTM0IiwgImZpbGxPcGFjaXR5IjogMC44LCAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsICJsaW5lQ2FwIjogInJvdW5kIiwgImxpbmVKb2luIjogInJvdW5kIiwgIm9wYWNpdHkiOiAxLjAsICJyYWRpdXMiOiAxLCAic3Ryb2tlIjogdHJ1ZSwgIndlaWdodCI6IDN9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0ZDVhYWI5ZWVmOTQyNzI5NDViNzkxNmI3Mjg4Y2IwKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF8yZWYyZjZmNmRjZWI0ZmVhODA4NzMzYTZiMDE1MDBhMyA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfOGVkNjY0ZWJlODU2NDA1NDhjZDI5OTgzMjRmYmJjNTQgPSAkKGA8ZGl2IGlkPSJodG1sXzhlZDY2NGViZTg1NjQwNTQ4Y2QyOTk4MzI0ZmJiYzU0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5XaGl0dGllcjwvZGl2PmApWzBdOwogICAgICAgICAgICBwb3B1cF8yZWYyZjZmNmRjZWI0ZmVhODA4NzMzYTZiMDE1MDBhMy5zZXRDb250ZW50KGh0bWxfOGVkNjY0ZWJlODU2NDA1NDhjZDI5OTgzMjRmYmJjNTQpOwogICAgICAgIAoKICAgICAgICBjaXJjbGVfbWFya2VyXzBjNjc2OGY2YzcxNTQyNzBiZWFkYmJlZDI1NjY3OGM2LmJpbmRQb3B1cChwb3B1cF8yZWYyZjZmNmRjZWI0ZmVhODA4NzMzYTZiMDE1MDBhMykKICAgICAgICA7CgogICAgICAgIAogICAgCiAgICAKICAgICAgICAgICAgdmFyIGNpcmNsZV9tYXJrZXJfMTZmMWQ0YmM1MWZiNDFhMmJlNmNiY2JkZjk1YmQwYTkgPSBMLmNpcmNsZU1hcmtlcigKICAgICAgICAgICAgICAgIFszNC4yMjU3MjU1LCAtNzcuOTQ0NzEwMl0sCiAgICAgICAgICAgICAgICB7ImJ1YmJsaW5nTW91c2VFdmVudHMiOiB0cnVlLCAiY29sb3IiOiAiI2ViN2EzNCIsICJkYXNoQXJyYXkiOiBudWxsLCAiZGFzaE9mZnNldCI6IG51bGwsICJmaWxsIjogdHJ1ZSwgImZpbGxDb2xvciI6ICIjZWI3YTM0IiwgImZpbGxPcGFjaXR5IjogMC44LCAiZmlsbFJ1bGUiOiAiZXZlbm9kZCIsICJsaW5lQ2FwIjogInJvdW5kIiwgImxpbmVKb2luIjogInJvdW5kIiwgIm9wYWNpdHkiOiAxLjAsICJyYWRpdXMiOiAxLCAic3Ryb2tlIjogdHJ1ZSwgIndlaWdodCI6IDN9CiAgICAgICAgICAgICkuYWRkVG8obWFwXzQ0ZDVhYWI5ZWVmOTQyNzI5NDViNzkxNmI3Mjg4Y2IwKTsKICAgICAgICAKICAgIAogICAgICAgIHZhciBwb3B1cF9kNTEyMjAzNTg4ZDg0MzM0ODczYTc3ZGJiYzFjYjkwMyA9IEwucG9wdXAoeyJtYXhXaWR0aCI6ICIxMDAlIn0pOwoKICAgICAgICAKICAgICAgICAgICAgdmFyIGh0bWxfOGUwMThlOTJlNTM0NDgxZDk5Nzk0MjkxM2EwOTNjMzQgPSAkKGA8ZGl2IGlkPSJodG1sXzhlMDE4ZTkyZTUzNDQ4MWQ5OTc5NDI5MTNhMDkzYzM0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5XaWxtaW5ndG9uPC9kaXY+YClbMF07CiAgICAgICAgICAgIHBvcHVwX2Q1MTIyMDM1ODhkODQzMzQ4NzNhNzdkYmJjMWNiOTAzLnNldENvbnRlbnQoaHRtbF84ZTAxOGU5MmU1MzQ0ODFkOTk3OTQyOTEzYTA5M2MzNCk7CiAgICAgICAgCgogICAgICAgIGNpcmNsZV9tYXJrZXJfMTZmMWQ0YmM1MWZiNDFhMmJlNmNiY2JkZjk1YmQwYTkuYmluZFBvcHVwKHBvcHVwX2Q1MTIyMDM1ODhkODQzMzQ4NzNhNzdkYmJjMWNiOTAzKQogICAgICAgIDsKCiAgICAgICAgCiAgICAKICAgIAogICAgICAgICAgICB2YXIgY2lyY2xlX21hcmtlcl9mNGI4YmI5NGNlNTQ0NjEwYmM4YzA0ZGE0OWNhOWJmOSA9IEwuY2lyY2xlTWFya2VyKAogICAgICAgICAgICAgICAgWzQyLjI2MjU5MzIsIC03MS44MDIyOTM0XSwKICAgICAgICAgICAgICAgIHsiYnViYmxpbmdNb3VzZUV2ZW50cyI6IHRydWUsICJjb2xvciI6ICIjZWI3YTM0IiwgImRhc2hBcnJheSI6IG51bGwsICJkYXNoT2Zmc2V0IjogbnVsbCwgImZpbGwiOiB0cnVlLCAiZmlsbENvbG9yIjogIiNlYjdhMzQiLCAiZmlsbE9wYWNpdHkiOiAwLjgsICJmaWxsUnVsZSI6ICJldmVub2RkIiwgImxpbmVDYXAiOiAicm91bmQiLCAibGluZUpvaW4iOiAicm91bmQiLCAib3BhY2l0eSI6IDEuMCwgInJhZGl1cyI6IDEsICJzdHJva2UiOiB0cnVlLCAid2VpZ2h0IjogM30KICAgICAgICAgICAgKS5hZGRUbyhtYXBfNDRkNWFhYjllZWY5NDI3Mjk0NWI3OTE2YjcyODhjYjApOwogICAgICAgIAogICAgCiAgICAgICAgdmFyIHBvcHVwXzFlNTA4MDc0NTMwYTQ4MTNiYmExYjQ2MmNlMzEzZTI2ID0gTC5wb3B1cCh7Im1heFdpZHRoIjogIjEwMCUifSk7CgogICAgICAgIAogICAgICAgICAgICB2YXIgaHRtbF80MGRkNDNkMWMwM2E0NjIyOTFjOTc5YzEwYjU1YTMyYiA9ICQoYDxkaXYgaWQ9Imh0bWxfNDBkZDQzZDFjMDNhNDYyMjkxYzk3OWMxMGI1NWEzMmIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPldvcmNlc3RlcjwvZGl2PmApWzBdOwogICAgICAgICAgICBwb3B1cF8xZTUwODA3NDUzMGE0ODEzYmJhMWI0NjJjZTMxM2UyNi5zZXRDb250ZW50KGh0bWxfNDBkZDQzZDFjMDNhNDYyMjkxYzk3OWMxMGI1NWEzMmIpOwogICAgICAgIAoKICAgICAgICBjaXJjbGVfbWFya2VyX2Y0YjhiYjk0Y2U1NDQ2MTBiYzhjMDRkYTQ5Y2E5YmY5LmJpbmRQb3B1cChwb3B1cF8xZTUwODA3NDUzMGE0ODEzYmJhMWI0NjJjZTMxM2UyNikKICAgICAgICA7CgogICAgICAgIAogICAgCjwvc2NyaXB0Pg== onload=\"this.contentDocument.open();this.contentDocument.write(atob(this.getAttribute('data-html')));this.contentDocument.close();\" allowfullscreen webkitallowfullscreen mozallowfullscreen></iframe></div></div>"
      ],
      "text/plain": [
       "<folium.folium.Map at 0x7fda090e60f0>"
      ]
     },
     "execution_count": 32,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# plot RFM CLUSTER RESULTS\n",
    "rfm_segment=\"Lose\"\n",
    "plot_us_cities(schema,customer,rfm_segment)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# let's plot most popular items by for hour 12-13 and dow 1\n",
    "engine = get_rds_engine() \n",
    "\n",
    "query7 = f\"\"\"\n",
    "select extract(year from merch_purchase_date::timestamp)as year,\n",
    "substring(merch_name from '(^.+)(( -)|(,))') as item,\n",
    "count(fan_id) as count from ace3c2bb4abd9fcaf9807975e6ab940131386dc9ecddb2b7e31288ff8.fan_merch_data_temp\n",
    "where merch_purchase_date is not null and CAST(merch_purchase_quantity AS INTEGER)>0 and\n",
    "extract(isodow from merch_purchase_date::timestamp)=3 and \n",
    "extract(hour from merch_purchase_date::timestamp) in(6,7,8,9) and\n",
    "extract(year from merch_purchase_date::timestamp)=2018\n",
    "group by 1,2\n",
    "order by 3 desc\n",
    "\"\"\"\n",
    "dowitems = pd.read_sql(query7, engine)\n",
    "print(dowitems.head(20))\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "engine = get_rds_engine() \n",
    "\n",
    "queryX = f\"\"\"\n",
    "select count(s.fan_id), s.rfm_segment,t.\"City\" from {schema}.rfm_segments s\n",
    "inner join {schema}.fan_address_geocoded fag on s.fan_id=fag.fan_id\n",
    "inner join {schema}.top1000_us_cities t on t.\"City\"= fag.locality\n",
    "and t.\"State\"=fag.administrative_area_level_1 where s.rfm_segment in ('Champions','Loyal Customers') or\n",
    "s.rfm_segment like '%%Lose%%'\n",
    "group by s.rfm_segment, t.\"City\" order by 2, 1 desc\n",
    "\"\"\"\n",
    "rfm_by_city= pd.read_sql(queryX, engine)\n",
    "print(rfm_by_city.head(5))\n",
    "print(rfm_by_city.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "aa=rfm_by_city[rfm_by_city['rfm_segment']=='Champions']\n",
    "aa['perc']= aa['count']/aa['count'].sum()\n",
    "aa=aa.head(5)\n",
    "print(aa)\n",
    "\n",
    "bb=rfm_by_city[rfm_by_city['rfm_segment']==\"Can't Lose Them\"]\n",
    "bb['perc']= bb['count']/bb['count'].sum()\n",
    "bb=bb.head(5)\n",
    "print(bb)\n",
    "\n",
    "\n",
    "cc=rfm_by_city[rfm_by_city['rfm_segment']=='Loyal Customers']\n",
    "cc['perc']= cc['count']/cc['count'].sum()\n",
    "cc=cc.head(5)\n",
    "print(cc)\n",
    "\n",
    "total=aa.append(bb) \n",
    "total=total.append(cc)\n",
    "total['perc']=total['perc'].round(decimals=2)\n",
    "print(total.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "dfPivot=total.pivot(index=\"rfm_segment\",columns=\"City\",values=\"perc\")\n",
    "dfPivot.fillna(0,inplace=True)\n",
    "dfPivot\n",
    "plt.figure(figsize=(16, 6))\n",
    "\n",
    "plt.title(\"RFM segment and City heatmap(top 5 cities in percentage)\",fontsize=18)\n",
    "plt.xlabel(\"\")\n",
    "plt.ylabel('')\n",
    "redpink = [\"#fac1c0\", \"#fdb2b1\", \"#ffa3a3\", \"#ff9494\", \"#ff8486\", \"#ff7377\",\"#ff6169\",\"#ff4d5b\"]\n",
    "# sns.heatmap(dfPivot,fmt=\"\",cmap='YlGn', annot=True)\n",
    "sns.heatmap(dfPivot,fmt=\"\",cmap=sns.color_palette(redpink), annot=True,linewidths=0.1, linecolor='gray')"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "conda_python3",
   "language": "python",
   "name": "conda_python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.10"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
