diff --git a/tutorial/Logica_DuckDB_tutorial.ipynb b/tutorial/Logica_DuckDB_tutorial.ipynb new file mode 100644 index 0000000..4fd1759 --- /dev/null +++ b/tutorial/Logica_DuckDB_tutorial.ipynb @@ -0,0 +1,48909 @@ +{ + "nbformat": 4, + "nbformat_minor": 0, + "metadata": { + "colab": { + "name": "Logica tutorial.ipynb", + "provenance": [], + "toc_visible": true, + "include_colab_link": true + }, + "kernelspec": { + "display_name": "Python 3", + "name": "python3" + } + }, + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "view-in-github", + "colab_type": "text" + }, + "source": [ + "\"Open" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "M8o3uXNEiYRw" + }, + "source": [ + "# Logica Tutorial\n", + "\n", + "\n", + "Logica is a language of Datalog family that can be compiled to StandardSQL. In most of its syntax Logica follows Yedalog, a language developed at Google earlier. Logica is created to enjoy concise clarity of logic programming and full power of SQL ecosystem. Logica runs across the spectrum of databases, from in-process SQLite and DuckDB, to server hosted Postgres to distributed data warehouse BigQuery.\n", + "\n", + "Logica allows you to write any analysis expressable in SQL. It is easy to write and most importantly read queries written in Logica. It's as easy as SQL on\n", + "small querries, it's substantially easier to read than SQL when you need a\n", + "medium query, and the benefit reaches maximum if\n", + "you need a large query or a pipeline.\n", + "\n", + "Logica compiles to SQL and runs on your database natively.\n", + "\n", + "\n", + "**Why learn Logica?**\n", + "\n", + "Learning new language is an investment.\n", + "Logica brings **readability and good engineering practices** common for languages like Python, C++, Java etc. to your queries.\n", + "Once you learn Logica you will be able to do the following **easily**:\n", + "\n", + "1. **Read** your queries, not just write them! Even if you wrote it a long time ago you will be able to read and recall logic very fast.\n", + "\n", + "2. **Re-use** sub-queries. Define and re-use functions.\n", + "\n", + "3. **Test** your queries.\n", + "\n", + "4. **CoLab** integration allows you to run a single, or multiple (potentially interdependent ) queries and populates Python variables with the results. This approach lets you express your data accumulation logic concisely in Logica and focus your Python code on what Python does best (visualization, timeseries analysis, machine learning etc)\n", + "\n", + "5. **Enjoy** writing queries. For the reasons above Logica is much more fun than SQL!\n", + "\n", + "In C, Python, C++, Java etc. a basic building block of your program is _function_.\n", + "\n", + "In SQL a common building block in a _query_.\n", + "\n", + "In Logica a basic building block is _predicate_.\n", + "\n", + "**Definition**: Predicate is a statement that contains variables.\n", + "\n", + "Predicate is a very general notion. Functions and queries (as well as tables) can be thought of as special kinds of predicates.\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "zfzQ5KXCcHUC" + }, + "source": [ + "![predicates_diagram.png](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAA8AAAALQCAYAAABfdxm0AACAAElEQVR42uzdDZhV5Xno/bmSAUcZmAEGho9BZhgYBhkRgfChKIiTiDJVEjGgzlGqRLFipYZGjPg67ylJuBLa0IYmeKQt7aGnNOFtOS2noS05ti9t6dvpdUhDW3pKG64e2pCGGDSoqHzsd/2XLLrd7hlmhpnZa639/13XvnSG/TX7Y63nfu77uZ+SEkmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJEmSJElS4pUGl9qnnnpq7j333PPx5cuX/+SqVat+tqWl5QuPPvroy3feeefuu++++5tLliz585tvvvnQ7bff/g8f+9jHji5YsOC7TU1NJ7IvN9xwww9mzpx5iktNTc1bo0ePPpN9CX539uLl3ezfX3/99a9G9zFjxox/vfXWW7/DY3FZvHjxweDxfje6BM/vqzw3LsHz3cjzDX6/gssDDzxwF39L1qXMt1eSJEmSUhjIBoHqtAcffPDjBLBBMPiVIEAkeD1A0HrjjTd+n8D0YiD67jXXXHM+uE0m+1JeXp6pra29dJk1a1Zm4cKFly4rV668dFm9enWmra3t0mXr1q2ZHTt2XLrs378/88orr4SXgwcPZo4dO9aly5EjRy7dLt9l586d73ucTZs2hY+/fv36S8+tubk5fL5BMH0+Cro//OEPXxgzZszbUdDd0NBwmoA7eE2OBoH2ny1atOgbBNXBa/VgfX39zOD1qPIjJUmSJEn9KAhmp/1koLW1ddO99977m8uWLfvWggULDs+bN+9fggDvR2PHjn0nO5gdNWpUZvr06ZnFixeHwSDB4fbt2zN79+4NA0gCzOyAs9icOnUq/LuPHj0avh68LgTSGzduzKxbty58zQier7/++rMTJkx4O3g93yJQnj179t/ecsst+z/60Y/+avDavkjGOXi9JwaXcj+lkiRJknR5ZY899tj8T33qU08HAe7Ln/jEJ/74Yrb2VQLb0tLSS9nZysrKTGNj46VMLBlPsq67d+/OHDhwIAzqzp49m1HvO3ny5KWAmdebCQUmFsiC33333W/Nmzfv9eA9++HUqVO/R9l28B7tveOOO7YGl0/PnDlzScl75dilftwlSZIkpRoB7iOPPPLZ+++/f+dP/MRPHAwCpGNNTU2vjxgx4hyBbVlZWVhuTGC7YsWKzNq1azObN28OS30JuAi8Tp8+bRSaAGfOnAkz7JR/EyRv2LAhnKxYsGDBBcqwhw0b9s6ECRNOTZs27VjwOfgr1jR/9KMf3TR9+vR7Siy5liRJkpSQILdqzZo1Dzz00ENbWHN76623/p9JkyadIbilJJlyZLKFlNlG62MPHz4cZhZVXI4fPx5m7JngYP0ynwvWLI8cOfL8kCFD3rkYHP9RcPn8lClTbi2xxFqSJElSIXzqU5/6CA2m7r///m8sWbLk2x/5yEd+GGVyKVGeP39+JgiEw9JksresN5W6ikx/e3t7GBxT4r5s2bLM5MmT36mpqfnxjTfe+L+DoHjPwoUL11VUVNCky5JqSZIkSVfus5/9bPVjjz226qGHHvrtxYsX/0NjY+ObgwYNulBysWSZ7siUtlKqvG/fvsyJEyeM3tSnKIWnYRefuccff/z8nDlz3mDbqeDyndtvv/3Xb7nlltXB57PRb68kSZKkDj333HMNQUDx7AMPPPB7UekygS4NqJqamsIsHKXLe/bsCdd3SnHrak1J9ZYtWzL333//2RkzZpxuaGj4wUc+8pH/r7m5+Ws33ngj3apH+U2XJEmSigwNqZ544onPB0HtgXnz5p0YPXp0WL5ME6qWlpaw7HTXrl2ZQ4cO2VFZiW7GRSk1jbgoyQ+C4bMjR458e8qUKf86f/78Pwkum6+//vrm4LNf6VFBkiRJSoHnn39+/JNPPvlZgt3Zs2e/WlFRcaGqqipsSEWn5W3btoVBgh2WVSxovMYED/sd03hr2LBh54cOHfp2EAz/7bx58758cW2xJEmSpLj72Z/92bseffTRl++6666/o4yZEua5c+eGWV3W6dpxWcrflZq9jZkUmj179jk6URMQz58//xdrampme2SRJEmSCqytra3y6aef/qkVK1b8wS233PI9Mlk0p6ILcxTwmtmVelY+TQdztmi6++67z40ePfrMddddd3TevHkvBf/Ptkx2n5YkSZL60tatWxuefPLJTcGA/H9NmzbtNNldAt6FCxdmgmA4HLAzcJfU+2j+xv7VjzzyyLmmpqbXCYhvvvnml+vr628zIJYkSZKu0EsvvVTF+t377rvvrxobG98KfpUpLy8P1+8a8EqFRedptmR69tlnzy9YsOBHQVD8z3Pnzv2v48ePvzP4rpZ5BJMkSZI6EQS1ZWvXrl11//33f2vmzJmnyO5GAS+lmAcPHrQrsxRTLDdg2cGnP/3p81RoTJ48+V9uvvnm32xsbGwxIJYkSZJK3mta9fDDD3/j1ltvPUGH5srKyszSpUszmzdvNuCVEuzEiRNht+mVK1dm6urqzgSB8PE5c+bsnjRp0r3BV7/co58kSZJSb8uWLdPo0nzHHXf8E/vvRgFv8Ptw311J6XT06NFw27Fly5Zlgu/92QkTJnyPgPi66667r8QMsSRJktKira1t6fLly/94xowZpylpXrFihQGvVOSo8GBpw4IFCy4Ex4Wz06ZNO9jQ0PCfDIYlSZKUKF//+tfL165d+8zSpUu/XVdXd7aqqiqzatWqzJ49e2xaJekDaKi1c+fOTGtra6aiouLdqVOnfue66657qsRSaUmSJMXR9u3bxwdB7lc/+tGPHmMt76hRo8Kgd//+/a7jldRlHC84bqxduzZTW1v71rRp0/4+uDwXHGaqPNJKkiSpYF544YUFDz300J45c+b8iD15a2pqwkHrgQMHHMVL6hWHDx/ObNy4MTNz5sw3Ghoa/mnGjBnPGwxLkiSpX2zatOknHnzwwVcmT578TvBjZuLEiZkNGzaE6/kkqS/RWXr79u2Z5ubmNxobG78bBMNfDI5DNR6ZJUmS1JtB7/wg6P3DKVOmnCHonT59ehj02sRKUqHQT4C+AkuXLj09derUf5k9e/bXguPTRI/YkiRJ6rb169d/hPJmyg6joJcyRLYykaQ4OX36dNhE66677nqL7ZWCYHh7VVXVZI/kkiRJ6tBzzz3XsHr16t+aM2fOKdb0zp8/P9yu6Pjx446wJSXCyZMnwzLphQsXvjtmzJhTM2fO3FlRUTHTI7wkSZLC7s1PPPHEy/PmzfthWVkZa+syW7duNeiVlIpgmEm84Ph2dtSoUT+eM2fO7urq6kUe+SVJkopIW1tb2TPPPNN22223/RtbFhH0kjFhsChJacSk3ubNmzPTpk07P3z48DeD//5miQ20JEmS0utzn/vc7cuXLz84evToc6zp3bZtW7h2TpKKyZEjRzLr16/PVFdXvzt58uTDdXV1n/QMIUmSlAIvvfRS1ZNPPvlV1vVS4rxy5Uq3LJKkwNmzZzN79+7NLFmy5PzIkSNfu/HGG78SHDZHeeaQJElKmM985jM/ec899/wdJc6NjY1h6d+pU6cc8UpSHuwxvGnTpkxwvHzzuuuu+8sgIP6YZxJJkqQY++IXv1j/yCOP/A779dLFedmyZZn9+/c7spWkbnjllVcyra2t79TV1f379ddf/5+Dw2ulZxhJkqSYWLdu3c/efvvt/4cS55qamjCLQTZDktRz9EigV8L06dNfCy5/NGTIkDmecSRJkgqAtb2PPPLIb02ePPmd4MdMS0tLuJaNNW2SpN51+PDhzGOPPfbmlClTjjU1NX06OO6WeSaSJEnqY5s2bZp/3333/RVre0eNGhV2Mj127JijU0nqp6zwV77ylfOTJ08mK7xn2LBhUz0zSZIk9bLnnnvumdtuu+17rO1duHBhZteuXWZ7JamAqLpZtGjRmfr6+n+eMmXKo8GhutSzlSRJUg+1tbVVPvroo79BU6vKysrMmjVrwv0rJUnxwXH5ySefZCulN6ZNm/abweG7xjOYJElSF7344otz77333r8cPnz4hVmzZmV27NiROXPmjKNMSYoxtppjy7nx48e/09jY+Ld1dXWf9IwmSZLUgc997nOrbr/99uPl5eWZ1atXZ9rb2x1RSlLCsDxlz549meB4fn7EiBGnp02b9oslNs2SJEl6D9sYzZkz50c0tdqyZUuYRZAkJd+hQ4cyK1euzFRVVb01Y8aMLxoIS5KkovXEE098fubMmW9Ega9lzpKUTkePHg3XCZMRnjx58s8ZCEuSpKLQ1tZW9vTTT3+FxlYGvpJUXE6cOJEJzgHnq6urXzcQliRJqfX1r3+9/IknnviN2tradw18Jam4sdTlxRdfPD927NjXDIQlSVJqvPTSS1Wtra2/M3r06HMGvuotrCt85ZVX8l6OHTvW78/l4MGDl37m8Xkefs6lrgXCX/rSl87X1ta+aiAsSZIS6/nnnx9///33f2vkyJHnDXzV2xYuXJgJPmYdXqZPn95ve0bzXILB+6Wf29rawufQV4E436MNGza8L+iWko7P9Ze//OXzDQ0NPzAQliRJiREM/isfeeSRvRUVFRcMfNXXAXBu9nfXrl3hFlr8W01NTb989nIDYLZ/oevtyZMn++Tx2Bc7+tultGELpV/7tV87N2XKlO8bCEuSpDgHvmVr1qz5TTO+6s8AuCOrVq0K/52AuL8D4L5mAKxiCYS/9rWvWRotSZLiJRinlD755JNftbmV4hQAR0Ei5cjZWVnKkpcuXZqZP39+ZufOnZeuv2/fvsyyZcsys2bNyjQ3N2c2bdqU93N84MCBzIoVK8LrcT/83NUMMI/X0tIS3nbx4sWZ7du3f+D+uS33P3fu3PDCc9q7d++lf+c2PHf+Nu5j3bp17wsY+Lujx+C/2X9jhNdg7dq14f3wGDwef78UR3wPv/CFL5yvr68/OWPGjM8En/1Sz7ySJKkgnnnmmbbGxsa3DHwVtwB448aN4b9HQWa0LpfAsLKyMrwQ5IL1tCUX1w2vX78+DAhLS0vDAPH06dPvC075PaXVBJAEp/xcVVV12TXAXJffcZ88HkE2P5OpjvDY0XUIbPk3vlslWZnsjgJggl8C8uj3PAf+y88E4xG2oOE+ufA38JhNTU3h9QiepbiiWdbzzz9/fty4cT8yEJYkSf3qqaeeWhsEEq8Z+CpuATCBIIEqAW5ZWVkY8GUHpQSefF65HsEtjaT4fWtra/i7COXF/J4AMcpC8XlvbGx8X1BMhpXrdRYA83z4mYAzG4Epvz98+HDm6NGj4f8TfGfj+fN3EMzmZrezS6D5HvK7zZs3550I4DmAf+dnOldH+Ht4/mSDpbjjO/Hkk0+G2ycZCEuSpD71zDPPLF+wYMH3DXwVlwCYwC37UnKxCzSZ2d27d38gKI0CwUjUMOv48eMfeAwyrXzWQYkw19u6desHrjdx4sROA+AoU5wdOIOgl4wuA3r+bf/+/Xk7R3Pf/L2dBcBktqPnmls+Wl5eHj4H8PyjwD77+ZBdk5KE78/DDz98vrq6+vUpU6b8jIGwJEnqNS+88MKCO++88xhZNQb3uQN5qVABMFnU7Atlw2Q5cwPJKChl0Jzvfvhv7iUqPyY4jDKn+RpPkT3uLAAma0yQ3BVs3bRt27awtJmSZsqto+fXWQBMgM33M9/fQQY5enzWJfN8uD2/59/JEue+LlJSUM1w9913nxsxYsSpurq6VZ6xJUlSj7300ktVy5cv/1O2NGJQb5ZIcQuAu6qjvXm5HzKkuYF09oWgMbp9vgCY63QWAPNvZGg7Q/l1VBJNMMu6XLK2ZGwJxC8XAPMzQW5Hf0N2syy+xwTZlIMTBJdczJpnX0dKGr4PM2bMODd+/Pi/Cz7PEz2DS5Kkblm9evVXampqzrL20OyQ0hoA8/kmCLxcOX+01je3hBpkajsLgFlbS6OsXFRSEIjy/YqCWkqycyssuhIAk/29XJCdD3835d1RVpj1yFKSsaxgzJgxbzc0NPyXErdOkiRJl/Pss88+QIMrSi+z11BKaQyA6QRdkqcDMhlZMqp0hgZrhMnM5japIptK8NlZABx1mabhVja+X9FjR9lfSqCzEZDy++wGVfkCYIJwnl/u7XkO/D7qNk2ATcY7t5ojKvFmWycp6fh8f/rTn2ZP+lcnTZp0r2d2SZL0Ac8991zDkiVL/p5sGKWQrvNVMQTADJSZ7CEoJLDkZzKy0ZZC2V2V16xZE/6OgJayaILTaEuizgJgmlwRJJNlpdEVj8F/yexyO7KwZIJLLm6LxHePAJzrEITn3n/UVZq1x9E+v6yDJNDl+twu6nBNAM/vo8A2ui1/H8+fx+bfuB2vg43tlCZMCC1atOhMEAT/ZfC5r/FML0mSSoLBetnDDz/8Ddb5Mpi3BFLFFABHg2QyrCUX18KWXGwQxW1ys8JR1+jowvNgre7l9gFub2+/FMxGF0qWo4xt9j6+0YWgmQCcxySIJeiOgvaoZLnkYpMuUMqc+xiUXueWbfP8stf+llxcP8xzlNJo7969mSAI/vHkyZN/rsRu0ZIkFa81a9asa2hoeJtBcm4JqBRnZFXzBbOdlURy/ey9fvMFwpQVkxHtrAKCcmiuFwWMBKbZ2yh19lhkarlt9j682cg+8+9kb6NsLM+F+8vOznLfTFbxnHMfJ3qM7PvIxX3yd3b2XKQ04bvw+c9//mxtbe2/jh49+lZHAJIkFZFnn312/i233PK9kotNd+zuLEkqlsmze++9l2zwN4NzYJUjAkmSUiwqdx40aNAFyi9zm/JIklQMOP/dcMMNP5g0adI6RweSJKXQc889t2zatGmnWVe4ZcuWTktBJUlKO86DL7zwwjsTJ078x+DceIMjBUmS0pH1rVy+fPmf0kSHrrGUf0mSpPewln7WrFlvTpky5b8Fp81yRw6SJCXU008//VP19fXvRNuvSJKk/LZu3ZoZM2bMqYaGhv/kCEKSpAR5/vnnx7e0tPwNW51s3LjRcmdJkrqAju6LFy9+d8KECYeD02mtIwpJkmLuiSee+Pzo0aPPBQFwt7aJkSRJ79m1a1emurr6nalTp24NTq1lji4kSYqZz372s9MWLFhwvLa2NrNnzx5HL5IkXQH2+H744YfPjxo16tXJkyff40hDkqSYePzxx780fPjwC+vXr8+cPn3aUYskSb2EHho1NTVn6+vrf9dssCRJhc36Vi9atOifyPq2t7c7SpEkqQ8wuXwxG/xvwel3oiMQSZL62U/91E89zoz00qVLM6dOnXJ0IklSH9u9e3dmxIgRZ+rq6lY5EpEkqR+0tbWVBUHvn5eXl2e2bdvmaESSpH5Ep+gFCxa8U19fv6/EfYMlSeo7Tz311MemTp36Bvv6Hjp0yFGIJEkF8qUvfen8mDFjTlRWVt7gCEWSpF52//337xw0aNCFlStX2uhKkqQYYDL6+uuv//GkSZPWOVKRJKkXPPfccw3z5s07Qcnzjh07HG1IkhQjZ86cyTz++OOsC/6TEkuiJUnquccee+yFYcOGnZ8+fXrm6NGjjjIkSYqpffv2ZRoaGv6toqJipiMYSZK6IWp0FfxvZvXq1eHssiRJireTJ09mmpubTwWB8P/laEaSpC546qmnrpsxY8aPKisrM3v27HE0IUlSwrS1tZ2pr6//i+C0XunIRpKkDjz22GOrRowYcW7WrFmZY8eOOYKQJCmh9u/fn5kwYcIPxowZc5MjHEmScqxYseK3S0tLM+vXr8+cPXvWkYMkSQnHnsE33HDDGw0NDZsd6UiSFPjsZz9bvWDBgu9WVVWFDTQkSVJ6MKn9qU996t26urrvBKf9Kkc+kqSi9fjjj98VnBDPNDc3Z06cOOEoQZKklGIrw7Fjx74WnPc/6ghIklR0WltbN1VUVFxoa2uz5FmSpCJw6NChTH19/TtTpkz5WjAUKHU0JElKPbY4uuuuu/6qpqYmc+DAAUcDkiQVkVOnTmWWLFlyvra29u+DYcEoR0aSpNR64IEHxt94442vLl68ONwrUJIkFaeNGzdmhg0b9saQIUPmOEKSJKXOypUrF06YMOFtuzxLkiTs2bOHIPid8ePHP+BISZKUGuzvO3LkyPPbt2/3bC9Jki5pb2/PjBo16mxDQ8MXHDFJkhKvtbX1F2h2tX//fs/ykiTpA9gveMqUKWfr6+t/t8TmWJKkpFq6dOkfjh8//sKRI0c8u0uSpA6dPn06c8cdd5wPxg3fDoYQ5Y6iJEmJcd9995XfcsstR+fOnev+vpIkqUvoEbJ69epMdXX194PhRI0jKklSErK+9dOmTfvRihUrwtlcSZKk7ti8ebMdoiVJ8Uen5/Hjx7+zYcMGz96SJKnH7BAtSYo1Oj0HJ6rzO3bs8KwtSZKu2MGDB8MO0ZMnT/45R1qSpNhYvnz5+urq6guvvPKKZ2tJktRrjh07lpk0adLZ4LLFEZckqeAeeOCBtuHDh184cOCAZ+k+QEMQTv7sk8hWUmTYN23alFm/fn1m5cqV4WXp0qWZhQsXvu9SW1ub99LU1BT+e3Nz86XbU7Le1taW2bp1a3j/u3fvzjCZwXvKY3PheUiSVAg01CQIrqur2+nIS5JUMJ/4xCe21dTUZNzmqOdOnjwZlnjt3LkzDERpHjZ//vwwWC0vL88EL3N4KSsruxTERkEu1yWAXbt2bRjAEhgTwHIhgOXCexMFsdmXo0ePXrpOdCHwjW6/cePGzLp168L757GmT58ePnZVVdX7Amm6dW7ZsiWzb98+O35Lkvr0fHnTTTedmzx58m+XuFewJKm/tbS0/OqoUaMMfruYxT106ND7gtxZs2ZlKisrw+CWSYTg9QwDzih4jQLXU6dOxe7v4Tnx3HieuX/TxIkTw8B4zZo1YUaZ4D6Of4MkKXnYXYIgeOzYsa8YBEuS+s3dd9/9zcbGRjN+nQS727dvD4NAgkKytwS6ZE+j4HDbtm2pDQ7zZbUpuV68ePGlIJ+SbrfJkiT1JAhesmTJhfr6+r8wCJYk9bnbbrvtTwx+/8Px48fDQI8y5CjYpXR57ty57ysPJih00HI6XFfMa7Js2bIwW8xniTXMrGmmBNtssSSpK5PN995774WxY8f+TTA0KXd0JknqC6Uf+9jHvs361GIOUgji2JuQLC7BG2XMBHObN2/O7N27NywNVtfxWaK5F68fgTBZcrLFBMmsU5YkqaMgePny5ReuvfbafzYIliT1evA7Z86cfyT4LbayVU6wrHWlyRRZ3dLS0jBzSSkvv7c7cu+jfJqGXlHzLbLDZI59rSVJuajAGjt27LFgrDLK4ZokqdeCX7KcZ86cKYqTKX8nWd7W1tawnJmgl2CMLKVZyf7FhAsl5Ew4kBnmPdm1a5frhyVJ7wuCq6qq/t0gWJLUa8Fv2rNvuUEvF/6f9b2uS40P1lxTHh3tZWyptCQpCoKrq6v/tcRyaElSTxH8EmikNfjNDXopbeYEyppUy22TEwxTms96bEulJckg2DXBkqQeodtzWtf8ssfuxXKpMHhivan7GacnGGZ/arZf4neSpOLy6KOPng/OA0cMgiVJRR38khVkmx32ojVASrfsCQ7K91lDLClex2M65tNIkDX97ItOo8HoQpf9lStXXrqw3IFqJC40I6ytre3wwrkrui7H++z74biQ/Tjs1855gcoRO/in6/PFFknuEyxJ6pKPfexj/4Ny0rTsW8t+xRs3bszU1NSEAyIGW5bIFgdK3BlYsz8zn2kyxK7nlvoWE4t0cmd5SRTYRkFsU1NTODFFY8EoWF2xYkW4Z3p2YLp169bMjh07Ll1YlkKwzIX7Jljt6EIwG12Xya/s++EYkP04q1atCifJoqA6OAWGE6R0n29paQn/PQqUua9Dhw6F5xQlJwiuq6v7M4NgSVKHghP+r06ePPlCGk7wDFQY2LBPL9mEw4cPOyIoYgyaWevN54FBrY2zpCubXOIYS1BJh3aCxSiAZLKRSSf29Y4CW65HAMlxOO6Tq5z/2tvbw33dCXyjQJlsMoExATJ/J5Nq/I1UE5FF5m9zcjV+n9ObbrrpXPDZ/ANHeJKk1Aa/DMoYlDBIYbbf7XKUjcE3A1qyUGSlDISlzhHYEeDxveHYSuBXVlYWBoNkb9kejmCxmEqICXRZahG9Lky2kt3Ofl3oLVFsr0scMQYgCA7GN7/tSE+SlB38foGAMcmNoHID32LZs1g9Qym0gbD0/qCOSgkCWgI4AjkCuijTyfclynSq44wj5yK2z4sy42TE2WWAMmsy4pSF23Sx/4PgadOmnR83btyvO+KTJJXce++9z48dO/ZCUk/IBC6Uthr46koDYUrlXd+nYgrWWCfL55/yXpYHULpMoyhKlgnkPJ723nGGyQXWNhMEM6nAMYeJBc5bvNbqWxzbJ02adLapqenzjvwkqYh9/OMfXzFs2LDzSTz5UsrKuixm1w181VuBMBMp7Cds6bzSHPDSEDDKSvJ5Z32un/n+D8hoyhgFxExAGBD3/WteVVV1tq6ubpUjQEkqQnfccceMYLB/ljVKSUNjEgIVMhV29VVvD5CoKKChD11spSQHvAS2BLh0WybA4r8GvPEPiFlPnB0Qkz1W72ByoaKi4t3Bgwff7EhQkorIzJkzq8aPH/8m5VhJO3GRseDiOjT1JbZSIStDaahNbJQUBLWsPyVwIsNLppeML5lfq2SShcldJuGY6CUgptqJ4Jgtoew2fWWY+B8+fPibwXCo1hGhJBWH0uBkeoL1jkkaCDAIIOtL9lfqDwwy6eTKWj32kjaAUByxHITjIg2XoqwhQbAZ3nSh3wUNysjic0xiCZDBcM+RWR85cuTJYExU7rBQklJu7ty5f81AKSknTUr1CHw52cd9/0ilExlggoqJEyeG+4NKhXb8+PGwm3Bzc3MY9FK2T4dmg97ief8J4KLSdt5/ssVO0nUPGfWamprvkBhwdChJKbVo0aL/xtYWSRgkEaCzVo2yL8r3pEIjwCDzwsBTKmTQE23fZdAj1g5TAeBkSM/GGXfcccf5CRMm/L4jRElKoZaWlg3V1dUXkrDNCxk3BnmsvzTrq7h9Ntkqhoywn031NYJbGiPR98CyV11OVA4fbWvFJIlVK51jomDKlClnGxoavuBIUZJS5M4771yWlO2OyGgw0GPtpRTXrAFr0qlOoFmW1NtY77lu3brwWMiSFZr2GPSqu8Ewa4Zp5sekHSXzVgvkR3UFu2KMHz/+AUeMkpQCc+bMmZaE7Y6ioILtZ9zyQUnAd4r16U7WqLeOgZSukr2L9qO2A7l6A700li1bFk6o0ADzyJEjvig5GHcMGzbsnSFDhsxx5ChJyVZeX1//WtzXLFKCxPolMh3u66ukZQ4oT2XdnRk69fQztGHDhjDoZdsiSp79LKmvPmtsi+VnLT9ej6FDh54Oxk5VDh8lKaFmz579VytWrIj1CYc1yaz3Za2SJ2IlERM4ZO1YF2zjGXUVFQRM+pGVo/rFrJz6S75qA4JjZaLlLf/LEaQkJdCdd975ualTp16I84CcEy7rk1jrJiV9QMlkE5M5VjGos8/Jjh07wi21qBzg/12XqUJi4iVab85ENOvPi/07etNNN52bMGHCLziSlKQEWRig6dXhw4djfdJl5tktZZS27AGTOknotq7CBL6Unrq1m+KGiRjOxwbC703ODx8+/N0RI0bc6YhSkpIR/FaOHTv2TQZbcUXnXE6yrLeR0obOq3SItqRVBr5KGipYWCdc7IEwjcMqKyvfCoZVoxxZSlLMzZgx4+9Wr14d25MKQQHBAeuPpLQik2Im2MDXwFcGwsnF33/ttdf+bTC0KnV0KUkxddttt/3yDTfccCGua8rYl5CgYOvWrY4ulHqsq2NNsGs8DXwlA+Fkfp8XLVp0rr6+fpsjTEmKocWLF9/Nut+47htJEEAwYMMrFRP23uSi9DPwVTEFwsXSNZoqnhEjRpwbN27cUkeakhQjU6dOHTVy5Mi39+zZYyAgOfGjftTe3h52dOZ9NvBVMQXCmzZtKortC/leDx069Eww3KpxxClJMdHU1PTPcR5gs8egpaAqVlHp/7Zt23wxUhYI0PWbbvbbt2/3BVFRodqMfYSD8UfY2DLtCPbHjBnz3RLXA0tS4QWB5eY5c+ZciOssLDOnNL2yGZCKGc3fyJjYGToddu7cGQa+NBx032cVMxpaco5ftWpVONmXZrfeeiul0F925ClJBXTLLbdcN3To0HNxHVSfPn06U1tbm9m7d6+jBBU9mr9RKlsMJYNpnshobm7OzJo1K3Pw4EFfEOniub4YqiHIeldWVp6tqKiY6QhUkgqjdMqUKf/KnqNxtWbNmrBZhqT30CApzt9Z5cfyDZZykMVnIsNJDOmDDh8+HE7yceH/04hmd0Gg/28llkJLUv+7+eabvxrnbBKlzwwW014SJXUHGcTKykpLoROE5oJUsrS2trqUQ+oCssCc/+lNQnY4bZYsWXK+vr7+K45EJakfzZw5cwalz3Hdj49sCU1/WBsk6f3IAJMJVryxtnfp0qXhsczuzlL3MPlNBRjrg9PWJIstoCyFlqT+VVpfX3+CMry42rhxo1seSR2gaoPqDRopKZ4YsDNwZ12j5c5Sz+3bty9cG5y2LZMshZakfkTpc5yzR2R/OdkdOnTIM7/UAcpqp0+f7gsRw8kJJvA4hjFwl3TlyJjSPI5LmpYRWAotSf0gKn2mE2FckZmmbFBS5wiA7ZAeHwzMo0E6A3ZJvTu51NbWFlZW7N+/PzWBvaXQktS3SidMmPCDOJc+c4KbOHGi6+WkLqCEzrXA8RCVaTJAt+RZ6jsEvwTBGzZsSMV3jeP46NGjv1diKbQk9b65c+f+17gPlml6xdpGSV2bMGIg2N7e7otRwPeATrVpbNQjxVVUbTF//vxUVFssWbLkQkNDwy87UpWkXjRy5Mj6wYMHx7r0GbNmzQrXNkrqmi1bttgwrkA4nnLMamlpcbs2qQBojJWG9fYE8eXl5WeD4dpER6yS1EtuuOGG79CYJe6DSfb9k9R1bLUTDJzC5nHqP5RhcrxiAkJS4UQd11l+kPRgfvz48d92xCpJvWD27Nn3XXvttefjPkBm4/vW1lbP5lI3UQaYlqYwScD2U2SdLHmW4oGSaKoxVq9endh1wYzRamtr362qqvoJR66SdGVKx44d+1oSyoop46QZhKTuIfPBOlT1T5aGbNORI0d8MaQYOX36dLgumLEE/59EdPUfPnz4qyU2xJKknps3b96XOSHEHTO2lZWVqdrfT+ovBw8ezDQ1NflC9PExau3ateHr7HFKiu/3dMWKFWFVDMtDkuiOO+44X1tbu8kRrCT1zCj2l0tCpoIBPHuaSuoZJ5D6DqWJZJUYVCc1syQVEyarGhsbE3lMZMw2ePDgtxnDOYyVpG6aOXPm/8tJIAkoK7SEs/tqa2u7dGF7qe7gveB2XZm46Mn9q/cRoO3atcsXopeRRSLw5fV1f18pOTZv3pzY5Qrr16/P1NfX73MkK0ndcP311zePHDnyfFJKgFatWhU2wVL3sK9z9oUsYPD2f+D33d0iYuXKleH9XM4rr7wSXs+124W3YcOGTNw7vScN2SOySEmZSJT0fkltWMfYraqq6uzgwYNvdkQrSV00YcKE7yUpoFy6dKn7//ZSQNyVwNUAOH3YjsdArfeQNWLg7DZHUrIxAcx3OWljDM6rY8aM+T+OaCWpC2bMmPH8nDlzLiTpQE+JoVuK9F8AfOjQobBclhMsZcy5pZ3ZAfDRo0fDWXQGEblbaXUWAB8+fDi8HeXRHa3D4v7Yvofbc/+ur7yyTAfNX9Q7wS+lk5aUS+nA+IJ9u5O2XdxHPvKRs8Gx6GlHtpLUubKhQ4eeIahJEtaRHjt2zLN0HwfADOxpNsZ1si8TJ0583zqpKABmHVL29QgKsicq8gXABLuLFy9+3+1KS0vDEt3cAQmz8tnXKysrsxS+h3gveP91Zfj8cjzycyilLwjmnJOk8RHPdciQIW8wtnN4K0kdZ3+/SDlx0hD45GYX1fsBMIFu9iw4Gddt27aFt6HJT24AzGAhui4nYn5mnXG0tjxfAEw2n4CX++U95TEIfrkeTUki3NesWbMuTXwcP348/Jnb8v/qHiYweH/Vc3xWWfNLUz5J6UNFUtIaY919993nxo0b94IjXEnqJPtLeWvSlPTCulV1HgATVLa0tOTNbJEVzu76HAXAuWumKFPODmRzA2CCZX5ua2vL+9wIvim3JsvG9dasWfO+67S3t4fBh9v5dB/vLwM79Tz4ZfLGddRSujE5y2RhUs4zjOnMAktSyrK/IOvnFiN9GwDnOnnyZBhwbt26NczG5gbAZOVz3xN+5r0ikM4XAEeZXgYY/Fv2JQqqeUw0NTWFP3NfXN8S+CvDWm0zwD3D55pjp2uopeLAJC0Tv0npO2EWWJJSlv2Fa4D7JwCmMRWlztF2SVGZM5nZ3AC4o32A+X201jQ3AI6C3M4u3CYK2FgrTEAd/RtBMQG5us81wD3H55bPopNwUvFYvXp1eMxMwvfeLLAkpSz7i7lz52aS1rgraQEwEwzl5eVhsMvs9969e8MgNHr9cwNgrpcPwXNzc3PeAJgBBT/TbITHy3fJXetNJppuu+wFHQXmNiDqPl5DM5jdt27durD02Q7kUnEh8GVCOLv/RZyZBZakFGV/QRksAZn6LgBmbW1JnnW9DALyZYC5bm4zKhqHlFzsDp0vACZ7y8/5to/h/eU50ECLQHjjxo2XyqEjPB635/HVPbz2uWuq1Tn2+KXplWvOpeKUpLX/ZoElKUXZ3yjgyreXrHo/AGa/2GwEovw+XwDc2tr6vkCZiQpKlqMOmrkBMIEEWebcBiNkmgmyadLE/RAAczs+t9nlZwTE2QG2uo6sfr7mY8qPCRnK/+04LhU3JmWZCEtC5ZFZYElKSfY3CsIMevo2AI5KoLkQ4FL6SekzQWm0/VBUnhyVQBPI0iiEn/l/7jt7jW6+bZDYZoL7opyZklwu/D+Pm72HcLTHMOt+uX/K0Gi8RSBOWbS6h9c5d3JD+TE5Q/AbrUeXVNzoj8E5L1oWFFdmgSUpJdnfKJAiGNOVIRDtLAtI5pYyWQJlsrlRSTLrr7ld1IiMMmnKQwkUKA3j+gSp2QFsFFRzu9wJGAYRBNisFebC/+cbWPA4ZJlzn4+6j4DORnJdw2eSjuWSFGFyl8nguDfFMgssyexvCrK/IPNIltDgR+pZ9sItkLqGPayZbLPjs6RcTMTGvRotKwtc6jBYUtGZNGnSuiVLllxIy4mHbUjyNU+S1Dky53TgVudYY06Zo5lySfmw/IZlQXFfHnHbbbedDYLgVkfCkorO2LFjv5+mzsmUH7EVjqTuoaTXLuqdo9srWXIn2SR1Zt++fWEQHOeKNHptjBkz5ruOhCUVldGjR99aV1d3Lk0nHdanctKR1L3AjgZj7mPbOdawu72WpK6g90Wc9wdmCUd1dfW7wXBwuiNiSUWjsbHxL2hSlDZsRWBnVqnraHzG8gF1jKwv2V8nCSR1BX1J2AEhzlsjsfRlwoQJv++IWFKxGHXNNdecT2PDKE42Dual7k0a7d+/3xeiA6z3Zd0v638lqavivjUSuzQMGjSILHClw2JJqdfU1PSraW14w6wr27mkobO11NfYRooshTrGNnHsMy5J3UXXeDpDx9WDDz54Ydy4cf/ZkbGktCutrKx8i5nJtKKsh71hJXVu/vz5NnXqBPtW01eAiTVJ6i6OHSyfiOvSrIMHD2aGDh16yqGxpFRrbGx8/Pbbbz+f5hMOpd1xLjuS4oABGQMz97PtfIKANdKS1FMcQ2bNmhXb5zd9+vR3hw8f/nFHyJJSa9y4cf9C+/u0W7dunfuaSp1grTxbhyk/jpOUhztBIKkXgsxMXMde9E6pra39G0fIklJpyJAhc0aPHn2uGAZ0ZIGTsBm9VKiMhMFdx3hdyI7bHExSb+BYEteKG8q0KysrzwbDxImOlCWlzuTJk3+vmJq5MNtaW1vr1iVSluPHj4dLBFj7pfzIjDc3N/tCSOo1HFPiWnVD1dz48eN/2ZGypLQpLS8vP1Ns62LZiJ4DuyS/E11B9Yid5CX1No4pHFviOCnPc7MZlqTUGTFixJ2zZ88+V2wnnJMnT4YnHLNd0ntVEez7a1fjjm3YsCGzcuVKXwhJvY4dKtra2mL53Gpra9kTeL4jZkmpEQx6v7Vly5aiHvRbCq1iduLECSeDLoPy8MrKyvC/ktTbqMJjCQrH4zhO/tXV1e10xCwpLcoCZ4t5UMes69KlS236o6LE5M/cuXPDAY46Rmn42rVrfSEk9Zk1a9bEMgt85MiRTEVFxesOmSWlwrBhw+676aabzhXzCYfAlz09HdyqGD/7rPtdsWKFL8ZlXicy5AwCJamvtLe3h7tUxNF11133tmXQklJh6tSpf8Y+b8WO5jaUQhdrKbiKE5M+TP5Y/dC5PXv2hFlySeprbEMXx23W2Clk0qRJux05S0q68kGDBr1LMyhlMseOHQtnXuO6Ib3Um5jsYdKHyR91rqWlJdwfWZL6GtshxbEqhzXKwZjxrWDsWOrwWVJijRgx4tHbb7/9vKeb/0ATIEodDxw44Iuh1GKSh8meYtv6rCdoSEPzKxvlSeoPJCU45sRxcrKpqYlu0Lc7gpaUWBMnTvxry58/iHJHTj4GwUpr8Mvn247PXbNp06bMqlWrfCEk9Rt6M2zbti12z4vKoQkTJvy+I2hJiS5/NquRH8EvQYLl0EoTBi82c+qeiRMnOlkgqV/t27cvM2vWrNg9L3YMKS8vP2MZtKREGjJkSOuSJUssf+7EoUOHwjJR1uNISbd+/fpwzS9r3dU1r7zyCiV/vhCS+hWNCRl/HD58OHbPbcaMGXSDXuhIWlLiTJo06X/Y8fjyyJQRNMRxXz6pqwMpSnjpYsx6VnXdypUrM5s3b/aFkFSQSUv2H48b9owfN27cNkfSkhJn2LBhr1kG2TUEDWSBVq9e7XYxShSWOCxdujSzcOFCmzj14LUrLy/P2CVfUiHQpLCqqip2z4vKmDFjxnzXkbSkpJk4fPjwdz29dD+QYE2OJaRKAkr4Wb/qxE3PB3nu/SupkDiGx60M+syZM5kBAwacC8aSlQ6nJSVGdXX1z1Dap+6jbJzmWLt27fLFkJ/TFKP789q1a30hUojqJyY4mCRiMC/FVWtrayaOu3U0NzezHdI9jqglJcakSZP+cseOHZ5Zeqi9vf1SZs3Bk+KEfSOjSgX3+L0yLS0t4ZZoSgeqIDZu3Bg2FgpOg5cuZWVl4Rr5Qpe619bWhksVpGw04YzjNmxMEE6YMOF3HFFLSoyrr776bZvhXBlKolesWJGZPn26W8ooFtiqh0E0WUtLnq8cGXSPk+k5Xs+fPz8MeDlmUyGxf//+DBPBTBjx+0JvD8bz45wiZaNKgUaccXxeI0aM+IEjaklJMbe+vv4dTyu9g43qGSiTWTAbrEIg60vQS7MUM5a9gzV3VHkoHajWIcjtaHKI/d5LS0vDCSSP44obmvFxnI/h8zobfK9qHVZLir3gBL/JdW29i6ZYZBGYpSWrIPUX1vhS0hmHEs60TWzZJyE9x2eCWzKsnWFrF4Lk7H3fCYz37dv3geseOHAgk28Z0fHjx8PsMtvm8d98DRO5HcsTuA+ux3eYoLyjx6Kyg3JTrstt8wVCBO3cD9fhsnfvXgP5FGlubg7f07j55Cc/eW7w4MGrHFlLir3x48f/XRwPpGnA60oGgTI2SyfVlxhAMyhiey4GyOpdBL8EwUo+gkcC2507d3Z6PYJXrpcdKHe0LpfPB9fNnTRhPTEXvpdk7Qi8swNqcDsy0vwb/8/1KNHOfaxo/26uQ3UH98ltmPAieM5+3tyWf2MSlsoFbsP1nRRLByY12BM4jhOFdXV1f+zIWlLcBefmsrPuB9p3mHUnk8B6MjIArsWUn6/kiePWI+qZZcuWhQFhV9b3ElwSwHY3ACYgJQBdvHjxpQwt39XosbMDVn7mugQ1fMaiqqHcx2JZDdfletH3nGCXIJfnGT0OFV085+y/j2wwt+VYoeSjMiCODdKocBgyZMgbDq0lxd38adOmve3ppO8xGIkydK7L1JViAEz5Y1RhwEBYfYOsGev6lQ4EDgSDXdm/PbpudwNgAl2C2tzKH4JUglP+PTsA5ryQK/exyPrm24eaYIj7iLbGYfkNWeTcYwIl1TZoTAc+R7zHcZzwHDly5NvB53Giw2tJsTV8+PD1a9as8WzSj9hrkpI6Oo8aCKungS8ZSbblofOm+j7bQiZP6cB72dUAmOxqTwJgMrIErHxXcy/cR3ZDNW6Xb3159mMRuHI9JlFz74+Sav4t2honyvYSaHOMoCzVLdDSh0mTOB7/g88c+wHf6whbUmzV19fvc11bYRD8EgQbCKu7gS+DYiZS1D943W2AlR6UCBMgXq73BSXLBJHZwWpXA+AoAOX6+S7ZGd+uBMB837kelQgd3ee6desu3ZZsb7TNU3RhL3AzwOkR1/MAJfrjxo3b5ghbUmxVV1f/a3t7u2cSA2EZ+KoDmzdvfl9woWRjjW1HQWf2+ZAgsuRig6rsoDRf9+jW1tb3BcCsySfg7IquBMBk+rhedxsfUSpLRjh6fm7llR4sfeG9jeOY5tprr213hC0prkoHDBhwzq0R4nPSYMDEoIcBt906ixvr96LmVpQ9GvgWNqPBRenBsZY1utnfK8qECRKZjIw6+HOd7PJhMreUN+fi99kBMGXW+dYAM6HF+t/sZlRdCYA5T7Pmk+eWi8ZZrPslYAeTNfm2NowacHnOTwdK3qN133HC0oLBgwefdogtKa6mT5o0yTNhzJCB4MRGqRuDIre0KS6sN2WgyvpBBrGWLBYe38N8e7wquQgaCSi5ZE84EhAT4EZlw7lLhKJMahRsEtBG2yplB8AE0PxMABt1Z+a6Ufk1t+lOABwFtiUXOzlHzY+4bxpjEWxH60GjBlzZwT2BeO7aYzkx11cGDRrEOuAqh9mSYic48a9+8MEHL3gaiScGNgzMaMJCtoKZXmfu0/tes4VR9F4z6Pa9jg8CiijgUbqCYL5vUfDKpFP0/1ReEERS7pzdaIj/J2jmOgTKTFRyXcpRS3L2ASbI5T64PvfD9bgO183u3tvVAJhjAk2toufHfUZ7C3P8iJCB47YlF7tLEyCzHpnnmr39kpKN9zxfpj8OFixYQCfoOxxpS4qdurq6ndknTcUXWUFK3BigkR1mDZv7vSYbGSeyigRXDEzJLJntjyfXXqcbQSF77BKEssaWdZUEm3wfowA5e0shsqlMThJ80IGZCSwC43xVApRPc112W+Ax8gWg3C7f75l04difi88i98XaZO47X4dnnj/3y9/D82RSLbccW8kW5+Z8fOaGDx++wZG2pNgZO3bsPxJIKTkYhJEJJgtA9sFgOHkZJwauZG7I2rC2l/fT9d7xRmbeUvTiZaNIxVGct2fbuXNnZvz48f/Tkbak2LnqqqvejdYmKXmY4WedGUEwjVEMhuOH94L3hNnwqKGOQW/yMNmUnQGUpEKjaiBfR/I4oCJi5MiRJxxpS4qbicHB6W1PIenKUtAQgxlh1pgRZLEWTP2LwJbZb96DaH2eQW+yleSs7ZSkQovWescRk7/sMhIcO8scbkuKk3tbWlre8RSSTtml0jRBYa0Y2yyZ8e8blMfS8CYqbWZQwmvOWkJfcwNgSeqL83y+LbniorGx8c3g2DnL4bak2Bg0aNC6uHYPVO/KLpUmMKMjKI1RCIgt6+zZ60l5F1leGtuwrQhNrMj40mjGrLsBsCT1tThngHHXXXedIdniiFtSbIwbN+5X6B6p4kNnUxox0X2Y7DDbaZApZm9JAmXLdN9DCRdNq+jESmk5rxfNkEoubn/Cz3yHbJCTfnxH7KArKW7ncia044okC8kWR9yS4hQA/ynlmRKBHhlNPg9khtluiVJe/ktQTKaTE22aA2Nm0gn+KWMmk0tTMfbNjIJdXgsmDZwgKE5k+fNtNSNJhUKDRfpLxBUTxGPGjHnZEbek2Bg1atQ/5dt3UIqcPn06zG6y1yAzuTTXIgPKvpgEidnBcRJKqfl7CHTZOoL9r1mjy99CoyoCXbJ8BP6UihMIG+wq4j7AkuImzvsAg0n1a6+99luOuCXFRkVFxeuuVVRP0NSJYGDr1q3hGliCA9YhkTGtqqoKs2X8jhJhgknKh1kby8mQ23Eh48znL/tyucCVDFx0ewJvTv7MMHP/69atCwcCra2t4WNz4XnwvKIAlws/Zwe5lDfzXHgMqSNUALBmXpLigolczsFxRZKFZIsjbklx4tlDfRYgE7DSGTkKWAlWuRB0ErCSUSZgJZMcBawEp1EgHQWs2Zeou3L2hQxudHuCXwYD3D+PRcDCY/Nc7MSsK8Fnlc+UJMUF5zouccW5l2SLw21JcVE7atSotzx9SNLlUe7PGnBJiguW8VBdFWcXJ7AlKRbmz5o1601PH5J0eVQu0CBOkuKCqieWA8XZiBEj2Aqp1mG3pDhYvmzZsnc8fUjS5cW92Yyk4pOE5nzTp09/k6SLw25JBTds2LA2mgZJki6P9eTslS1JMQouY78PPckWki6OvCUV3JgxY3bSPVCSdHls80WHc0mKA3YuYIeDM2fOxPp5kmy5+uqrn3XkLang6urqvmlHU6URgwE6T1IWxhZHNAiJOmVyoWkIpazRhb2Noy7SXJqamj7QaTr7wox79vXJCmbfX9SFOrps3749zB6yHQTP6+zZs75JCcX7z1ZcklRonOPmzp0b++fJeXDcuHFfduQtqeBqamr+hOBASgqCx4MHD2b27t0brseMgln2Go62UGI2nC2U+P9oH2Kukx2QEhBHWzJx2bdv36WtmrgcPnz4A/sTZ1/YMzj7+tHziS7sjZz9eOw3zB6yDFR4XmzlVFlZeWmvZLaBYksoOgxHz4eSNjKOihfeKycOJcUBjfk4d8Qd1YbV1dW/4shbUsFVVVUdinvjBBUfSroI/uhqScddAlgystH+vwSRUcaV4JJgk4mcaK9fbp8E7ElMJpHnzd/KAIFtdqKMNHsb19TUhAE9GWcCLwJk/lYC8LiXvKUV7xMTKpJUaJwLqS6KOyYNhw0b9g1H3pIKbuzYsX9vAKxCIbtJppOAgpLh5ubmzKhRo8KAj+CPgI/ZbQI+MrLFGvBFEwK7du0KA+RoQoAsNxlkBkBkAMhqU2J98uRJP1x9iMkHXn9JKjQqiU6cOJGIALi2tvYPHHlLKrgxY8b8bwbMUl8jM0sAR6BGcEuQS7BLppPglywuwXASTuRxcuTIkbD8evPmzWFWkuw4TZq4UFpNBp3sgEFx72H9Np9fMviSVMjjP1VRSUCVU/Bc/8iRt6SCGzx48EkCE6k3kbGksoDsLeteCXQp5SVzSbaXNbxJKVNOKgLe/fv3hyXTZIij9catra3hZANZTPUc1QpMPEhSoZBVpVIqCRgTsOzOkbekgquoqHjVAFhXinWszO6SyWWtKtkxMpFkeylftpFTfLIFDJhoyEUJL+8TgRxl1QRzZjS7jrXnZNclqVA4ljOhmZQAeNSoUYcdeUsquKFDh54yAFZ3UaZMIEVGl1Lb3OyuzZmSgYCXsnOCOUrRyRI3NjaGpdQExL6PHeN1o8RckgqFicykVPMQAAdjhSOOvCUVXGlp6VkHueoKAlsCJdbvEvRSSkvW1+xuutBsjIkMMsMExATGNNdyouz9KOEng24pv6RC4NzLMSgpe8pTgTRkyJDvO/KWFAeeRdThAJ+mVWzJQ8DLTDOlsjRNS8oJV1f+GaCEnTI71nHzGaDs18/Ae6h6YHJAkvobPTaStB0bk6hBAPxDh92SDIAVuxlaTqqUdpL9o3nS9u3bzfIqxFZMVAGwvpvPR1QFUKwdpikT57WQpP5GU0Mqs5IUALPszmG3JANgFRwNrMjscjLlQiMr1jdaGq/OZK8DJxhm0oSfi6kkmCw4698pG5ek/kIVDv0akoSJ9IqKitcddksyAFZB0PyI0s358+eHA/h169a5LY6uKBBkr2G2vKJcnrJ5tmAqBpSE0+1ckvoLx1j2fk8SMsDsPOKwW5IBsPo1SKFkM8rYsXcgmV7Xcqo3UQ7Nthw0S2NyheoCqgzSikEdQb8VE5L6A1U2nMOpwknasXLw4MEnHXZLKrgPfehD5w2A0o3MLhkqBulkfFnTa+da9QdKg8mQEgizVpaqgzTuNUz5N83CJKmvsdSE/hxJw0SoXaAlxUJlZeWP3N4kfcjCUR5F117W9dK4yPdZhcIkG9UGVB1E1QdUI6QFjcDYLkqS+hoT2Sw5SRr2AR47duzfO/KWVHCUoxgYpQczrGyLQJDB1jU0ypDihOoDqhAokaaJC9mMpJcP8/ypsLBbuqS+PsdzrEli5R4BcPDcDznylmQArF5BoEsDIvZqJdtbrNvSKHkDouhzy/ZbSS6PZuKJ9c6S1FdYUkLTyqQe7w2AJcVCMPD8pyTtI6f/EHXeZW0lZc6sr7QRj5KItcJ0NSWzwXr1JGZS2UOb55/GNc6SCo+mVxxjktpUcNeuXZlrr732W468JRXciBEjvs2snJKDIJcuuwS9SV0LJHU0wCO7wSCvtbU1cVtzkQV2SyRJfWHNmjWJPr6w3CUYc/4/jrwlFRzlKAbAyQkOKG+mXJSyUTP3SiuyqFu2bAk/6zSXSsqewknP0EiKp2jtb5KXNxEADxs27BuOvCUV3JgxYw6YQYx/MMDaQhpbMQPs4FrFgjJ/Bk3Tp08PS/2T0NSNSSq6XEtSb1m2bFl4bEkyJjWrq6t/xZG3pDgEwP+dAabiOfin1Jk9VFkfmbRN76XexFZDtbW1YXAZ50kgliiQuW5vb/dNk3TFOJZwTEl6jw8C+IqKii848pZUcJWVlb9OkKV4ISvPGl/KP2kQJOm94JJu0QwGWSsc14ZTbPO0cOFC3zBJV4xjCceUpPvMZz5zNhh2PuvIW1IcPP/ss8+e9xQTD6zr5WRHyWdS1j1K/Y1qCBpOsSaOsrq47YnJ82GPY5eXSLoSe/fuDSfDk7jvb66lS5eeDsacDzrslhQHDy5btuy0p5nCoqST0k7KnSlJT8PJTuprbD3U0tISDhB3794du4ErQbDfZUk9nUhrampKzUTa9OnTXwvGnAsddkuKg4UzZ85048oCoYSTbQ3IZG3cuNF9fKUeoJM9VRNsCxan7uhUc7A/tyR1F5PhHNPSYsSIEWSAax12S4qDWg5Knmr6Hxkr1jLS2dkGV1LvDBipouA7dfp04Q9r7GPstkiSuuv48ePhsSNNzfSC8SaXUofdkuKg9EMf+pBrgPsR+/ixpQHlke7lK/Uuqiromk7H6Djscc4a5VmzZlkKLalLOFZQPULDvzQF9Ndcc81rDrklxcagQYNe5+Ckvhdlfelga7mz1HdYg0s2OA7fNbq5r1+/3jdF0mUR+BIAp2nSjMn+4cOHH3HELSk2hg0b9o9mIvuWWV+p/5ENprlcob93fP+Z+LKzu6TOUPJM6XPakhJM/gcB8B864pYUG8HB9n/GrYNq2g78fZH1pQMupZ5cdu7c2el12TKG6/WkmyS34bYM4rNlr1vm33p6/1caWBTicSM8dk/3Z4w6GFOqSwOnQq8Dz31/r+RvK5bvYHfs27cvzEjnvs6SBPoWxLGjfW9gKUh5eflXHXFLio2KioptHJzU+wFFX2Z9Wd9Y8l5TifCk2ZEDBw5cul5bW1u3H4fbcNtjx45d+h1ZNQKkCP/W0/u/EoV63AiPnf06dAfrQktLS9kbMdPa2lrQzyrluc3Nzb32t8X9+1ioxjIE4Ex6SFKuVatWhZc0+pmf+Zl3g3PKpx1xS4qTTz/zzDN2aOlFrD/s64xTFABTLsV/6TibDx1xy8vLezUAzg2O+Bt5PtnXMQC+/G0JfuOALDRrznI/X2Sp0ybKBrPtWH+vsePxyPZv3brVg6Sk9x2XmMiOQ/f6vnDXXXe9HpzzljvclhQny++88073Au4lDKwZYJN57UtRAMyMMf/dsGFD3gE3AXJ0nb4KgPsSpcE8dr7gurcC4OgxWDPaGbKIXC+a1LjSALg3XkMGTDyny5VQR889XwluvgD4chMP2a9DZ1jLxnU7Czaj++uvwR/Pib+XbGx/DzjZEonvZEcTVpKKSxq3PMrV0NBwKjjnzXW4LSlOmoKA7ceehq48EKHEcu7cuf2ynjMKgAn+5s+fn7cMmqY7XCf6b3ag2FHQQ1DGdfMFwNll19Elyvx2JRAlG8318u2LSgkug4AoUCKLTrlq9mPx79u2bes0AO4osORv5W/ORhBCKXL2Y5CVzX3/+JnbR9eprKwM18f2JIiNXs/sC7+LXlv2ss0X5Gc/Dn8HP3O7srKyS/fDc8x97gyq+Hx09DfmPpfo8fP9bWQuo4oDLjw2VQ7ZwW3091H2z2cy+73L/dt4DZksiq5DSTjfof4ISnnOTAw1NTX1+z69vA58ti834SIp3ZhEZMyQpi2P8hk4cOA7wTG+0uG2pFj58Ic//G5aS2/6A0EKpY0EDP3VZCc7AGYNd74yaAb4PK98gWJPAmAG7NHjsrUL/8/vuhoAE4zlux4z4Px+7dq14c9kzwmGGBjQPIhSXErEooD48OHDVxwAE/RQGs7vdu3aFf5MQEagRlAUvY8ESvzMdQkAeY35b1RW3t0AOHsiIXoNs3/X1QA4eu40QOO20eRCdlk1t+V6BJn8jbyOPPfotY0+R/w7nxP+Pzswzn5MKhv4HVlTJlR4L6PHZE147ueF15H3k+vyHHkMHjfK5PM6cj0CXu6L9zR6jP5cB8eESiE6NPPaMDHhcVcqTpxbOP5xSfM+4Rzbg/PQ9xxpS4qdioqKf+jrkt20igKI/m4klh0AE7QQXGSXQRPAkancvHlzrwXAHQWZ3SlFJtDKzVYz+50dwHM/PPfcbCZBcHaQeCUBMEEbr1nuOlcCbu4jWqdJ4MjP2ZnnKHvZmyXQ3Q2A82XSyWaTlY3Q/Zvr5ZbW8Tnhb49un++zkP2YlE1zvwRsuQO16DGi40f0eSEznBto8vuoY3n0nkeTGdmBYX/vmUvwy3c49z3ua3wGmbBI8+BXUn5MIOY7pqYN5+2hQ4d+05G2pNgpLy//LzZm6T5es0Lt75kdAIMS4uzAkq2B+PdoDWZcAuAoW5094UJQzKUzPEaUIeyNAJgAO8qC5uLfom690euRW67KBANBZKECYLLhl3vvuE6+1zU363i5ADj6LOULEKOsfjT5En1ecr8TuX9fNNFAdp377e8GarmYDOC5kH3urwEpj0MVQJq6bUu6PM5lHJuLoQJk7dq1bwfH+ucdaUuKoydbW1tdB9yNgWuh1g92FABHGckoi8rWOswudxQo9mUAHN1HSZ61pVE2kdlvRKWwuRl0/j4yZFH5ccnFNae9EQATzOY+v9wLjxvdLvv1yA0cCxUAd+W9K7m4LvhyLhcA85xKLq73zhW9ltF1o89L7nXz/X25a5iZwCGQLtReuQxGmfjIt5a6Lx+T72lU/i8p3ThXc6wr9N7v/eWmm256NTi+L3GYLSmOZtXX17/mqenyOGmROaR0sZCzt7kBMEFDVAZNdpKgMcrY9XcATHkr9519IeMXYc1T1PCKUlmCoOygJwrmeY4EBmTayTRGzbwuFwDn214oXwAcrcHNd4n2biazntQAmNe1NwPg7PcwEq3f7kkAHAWAlEVz+5qamkvve3+tpc+H7xDPob+2geKYQrbe/dildKOahuNcGreY68igQYPeCo7rNQ6zJcWyCjoIns66Fq1rA9U4ZGtyA+AoWGNmmZMswXAUVHYUALNmNBfBfV+WQIMOz1FARQk5AXE2fscgIXeCIVqP21kA3FHQx+uSXQLNY0RZ3lwEZFEmnfe6JM96W55bX5RAE/xnY41sTwNgSuxyO1+D4J7bR2XolwuAo+eWr1NpNCnBWvPuBMC8vryfuaItu/Jlm/sTn4H+HKhybOEzGa2RlpQuHG/5jkeTq8UyZrrqqqt+7BBbUmxVVlb+i3tTJiP47SgAjjKnBLYEw50FqJRd5mZeCbYI6roSAGd3/u1uAMxEC8EFARq3IyDOxvPKDU65TbSdT2eZbd4jBhnZwXP0WmUHg1EH49wgLMp2Rk2cojWuuYFu9Lr0VgAclYJTup4vIOxJABytmc59fXmM7I7M3F/ueujsxyQby2vK9bLL9nhPeB7ZDbW6GgDz+pbkadAV3T4Oe2LSvKU/g2Aeh9c59/2SlGzRdztfFU2acSwbOnToXzrClhRbQ4YM+e+55YmKZ/DbUQAclUHnlprmCxSjrrwENZR8EhBSNh0FpZ0FwNyGxyH4IQPY3QAYdPrlNgwKcisPokCOzDB/B6WhBMTRNkhRl+B8jxsFfVyf3xNA8ndx2+wAmNeK30VZXF4POhrzc+4erVGwxvpQyrEJILlPmmX1VgCMaE9i/u5of2eeC+XiPQmAmQSI/kb+Nv5G/obs1xCUgvM7Hq+jfYAZyHA/PHa09Vb0Wcku3e1qABxt0cRryOvL5E30+mdP3hRbEBxliezKL6Un+OUYUozVHZ///OfPBsf0n3eELSnOPh0EQW97uop/8BtlDAmCcicteJ78PjsDyt+Q77oERARdBDUEP5ROc53s4Cr6OTvzx+CcIIXXhQxqR/d/uUEBt4lKZ7Px3AmKoqCV7CRBFoEy63uj9yLf43IdSnUJgKO/i+CL32VnrUGQy+NE1+Xx+DlfE6bc14oyNu4vX1lwV/C8c2/L30PAHpVr8//8Lvdx+Dnf5zFae53vtYz+Rv6G3G7OvBcExjxu9H7ke378zQTn3A8XAufcjEb0ecmtJok+r9nX53GZTIj+XgJqJjAKuf43n2gf4/4MgpkYIPiWlFwc9wh+i3WXjTvvvPNUMLZ80OG1pDi7fdq0aT/ylBX/4FdS/2ICpj+DYJYjMHC2MZaUTEy8Ur1TzBNZI0eOfC0YWzY5vJYUZ+UDBw58J27ZF4NfScUYBFMmHlUlSEoOgl6qOIp5KQNjqAEDBrzh0FpS7A0ePPg7rOk0+DX4lVT4IJhyfEruKXu3S7/kMSIpWA5zzTXX/J4ja0lJ8OK6deuKOgXMmknWIhr8SupogMua5XxrxfvqmMTaa9bdF3LvcUmdo7kgk+fZTSOLVXDMejUYUz7usFpSEixsaGgo6nXANOXJ3YpGkrJRlkxA2l9ZWR6HLtlMzmU3pJNUeHw/6ZpPtYbfz/cMGTKE8ueJDqslJUHpgAED3s7eAqaY0KmRAaZZFkmXG/DS1ZotxPoTXbLpml3s5ZVSXDBeoIs+F8cO7+H4dM0113zfIbWkxBg8ePCfsrVNsYk6Nh49etSzl6TLItNDp2b2SO5PrK3jWMW2ZZIKh/ECk+ZUjblG/z/80i/90rtlZWU7HVFLSpKnV65c+eNiOlgfP348HMjm7mkqSZ1hb2S6vfb3xFl7e3u4DnnNmjUZO/dL/Y9EARNRufuqK5O57bbbTgZjyeUOpyUlSVNwUC+aAJhZ21mzZoWlhZLUXSydaGpq6vfyR5aq0ByLDJSVK1L/4Hu+atWqcCnCoUOHfEHyjKnKysrOBGPJUQ6nJSXK1VdffapYuhhyIlu6dKlnLUk9RgOcQjXPIwNFJorSaEl95/Dhw+FkF9931/vmR1XM4MGD/9GRtKTECQ5eu4uhrGf79u3hlgWeyCRdiWj7NLZIcmAupQ8TTOzv60RT59ra2s6Ulpb+oiNpSUn08JIlS15N+0wua/fspiqpN1CGTCaW9bmFCsItzZR6/3tFdQcTTIwb1LkbbrjhB8EY8g6H0ZKSqIo1HGlursJ+fTavkNSbqCqZO3duQZ9D1JynUNloKS2YSGJCiT24ray4vJMnT2YGDhz4ZjCGLHMYLSmpZdB/ntbtkHbu3Bk2vnLbAkm9jWMLgXAh0cOB59Hc3GyDLKmbmPxva2sLJ5KKcVvInvrqV7/6bhAA/5YjaElJ9uiiRYt+mLYDNJ1TWcdDowZJ6m0cWzjGcKwpJCb4yALzXDZs2OB2SVIX7N+/P8z60mGdLRLVddddd92/B2PHexw+S0p0GfRVV131VtrKftauXRuuk5OkvsIxhmNNHDCIX7FiRbhvsHudS/mdOHHC78kVHmdKS0vPWP4sKfHKy8v3US6cFjSwoKSJdSqS1Fc4xnCsiVPTHDJbdL1n27di2eZOuhwrJXrHz//8z789YMCA33DkLCkNHrz55pt/lJYDtI2vJPUXjjUcc+I22N+4cWMYnG/atMk+CCpqLFeI1sq7I8SVuVj+fLvDZkmpSAIPGDDg7TRkTG18Jam/g022ToljEx0ywGSCyQi/8sorvlkqKqzPp7NzTU1NJk1VboU8ngRjxdeCMWOpw2ZJqXDNNdf83ssvv3w+6Sc7G19J6m8HDhwIB9lx7aWwZ8+ecM0j+5zaLVrFMCm1Y8eO8Du5Zs2agjeqS4sXX3zxzQ9/+MO/4ohZUprcM3v27FeTfHDevHlzOMCTpP5GpnXr1q2xfX7ZW76sXLnSQFipDXzp7rxw4cJMe3u7L0ovGj9+/A8tf5aUNmWUQSd1OwBOfGQ4POFJKgRKjCk1jjuyYQbCSnPga7l/7+M4MXDgwFctf5aUOldfffVv/8Iv/MK7STw4U+LH2l9JKhTWAtOFOQkMhGXgq6564YUXXi8tLf1FR8qS0mjhmDFjErlYZvHixTa5kFRQlEAvW7YsUc/ZQFgGvrrc6z1kyBCaX013mCwprVngo0nbHJ5tDWh+5b5+kgqJJliVlZWZJC4lMRBWElDtZeDbv77+9a+/O3DgwL92hCwpzR5ftGjRD5N0cKbL4/r16z1LSYrF8WjDhg2Jff7ZgfCKFSsMMhSLzyTVFayxN/Dtf9OnT/9eMDZc7vBYUpqVXXXVVT9mv7ekZFwYqCW1eZekdDl8+HBYkZL0vcg5thJ0sK6ZwGPLli1uJ6N+RVNL9vGlqoLJGLc4LMzxbMCAAXR/tvmVpHSj0cFP//RPv5GEg3MS19xJSjeyVLt27UrN30PgQVk0gQj/NRBRX2EpE+t7aWrJzg6bNm3KnDx50hemQB566KF/D4aFP+fIWFIxmFhWVnYmCWtqyUxYDiUpTnbv3h0GwWlDIMJ+6xx3CVC2bdsWZoqlK0Uvj3Xr1oUVXS0tLZmk9SJJIyo+Bg4c+GYwJhzlsFhSUbjmmmv+6OWXXz4f54MzZdqUGkpSnFD+XF5enuqSYbZ7ovqGrDDrnimVlLr7PWGyiF0cOJezdt7lTPHx5S9/+XRpaenvOCKWVEyW1NXV/SjOB2fKpFgXJElxw6CejrVpd+LEibBMtaamhmY5mY0bN9pBWp0GvUyesLaXoJdKCYLgpK+ZT6Pq6mrW/s53OCypqFx99dXHDxw4ENuDM2vRKMGTpLihk/LatWuLKrDhfMHfHAXDvAaHDh3yw2DQGwa9q1atCkuc58+fH5bSO1ESX9/85jfPDRw48B8cCUsqRk+3tLTENgvMIIt1Q5IUN/QmYJ1ssSIYZns69mzlQnkrXX1VHOghQgVEa2truByAoJdO4pY4J0Pwfv1bMAZ83GGwpGJUyZZIcZylJfB1/a+kOAcADPxtEpUJs8AEwGypxMQlWeI4VxepZ/isU85M0Mva8Obm5sz27dvt4pwwjPkGDBjwWjAGLHMYLKkolZaW/t+f/OQnX4vbAZrSZ9f/Sooz1jfazfaDg2vWCVMizSQmS1no55CUvef1wckNMrt0biboZe27QW+y3XPPPSeC4d+LjoAlFXUWeODAga/HLQtM8Ov6X0lxxhpYyoCVH0FvNJlJZph9X8ke8juXt8QPa3nZA5qmZ1HAy0QGGX32vbbaIR0TVKWlpacY+zn8lVTsXly2bNmrcTpIkzmwgYak/7+9u4GSuyzvBjz7vZEkRIwYNcWo4UMNAho11KC0IEahhaIIqQi0IHBoesQDPaDBkiM5goVXsKaVVj5sS5ECQpRUeIEaTQoBAwQIZMmHCRAgmISEzzdYOGff/292xy4xgWwyuzu7c13nPIdkmczOzszO/7mf+37up5ZlH/CkSZM8Eb0IiJMNTlY4wXA+5yuLnQLigQ14k9lNSX8l4M3+3qF8zFe9OvTQQx+T/QWowSxwJkKZHAHUMvuAqxcQ77XXXuWAOGcPp+Q2iwsCsOrKkVZz5swR8NYp2V+AGs4C50J8xBFHuFoBNS+doHU/rl6AllLbadOmlTPrKcFNUJxgLUFaguU81xYcXl8C2TQhmzVrVvm5TIfmns9lyvazd93zWF9kfwFqOAtcyQgA1Lp0ws0ZqPRdUJysZc6VzXUhGcv29vZyxjgLpQnm0pl48eLF5ZLeepIKhCwI5Jp55plnlvftJshNsJsFhFNPPbUcBCebrmlVfZP9BajxLHAay2QA1LpKl2P6V7bKpFoo14qUTecIpgTG2T6TjGe+lqxxyn3z+iQIzL8ZLFnPBKwJ6rO4ksefztoJaBP0J7hNU7H8vFkQSGOxLBBkocA5vGyJ7C9AjWeBM2nJHjCAWpfPqwQfDLxkgLOvOOW/KaXOdSQZ4ixS5Miq8ePHl/e9ZuTP+VqCx9ymEihXRoLJBM2Vketi7jsjWenXkyC0ctsE3T3vJ0F7z++TwDbZ2zQDy+NJAJ/ANlncBPWpMMjjzznLaRaWf5/GVY6VYlvJ/gIMgiywjApbk5K/yoQyE9ycR5kMUIKQvG+yvy2TyIxkRjKZ3NKoTH4zkinKvz3ppJN+V32QssG8B/M9KhNXE062RMXK4JMscIKC/F7n9zzBbyVQroyUE1c+IyrBc+XzI2XGxbVyq6Ny5FNGSrV73k8yuD2/TwLbLKBcddVVv/ucyeccVIvsL8A2ZoEH8kiKTBIyEaA+pYFLXv8Et5kcJjOSkr9MOpubm18zoaxMIhMAVwKRSmYlmZKewevWRvbQVW6XrE9lQpzvnfvOhLVn9iiBdYLmfK8EyIsWLTJhrWN6FgC1qpjLvSr7C7Btztp///3XD9QHdgKMBBXUxcW53MAmwWYCzWROkkGpNHFJYJFgNMFsblsLTW4SNFcyR3ncKaFMJ+AE5pVutSlV1HimPuhaD9Sq/fbbb3XmdKa1AG+sua2t7dc33njjqwPxgZ2yMeWmQ0+C1+xdy768BAwJcvNap9SwZ9D4RvvravnnS9OaZIWzpy/B8OjRo8uBcX6+HDsiUzz05D2bCgGAWvKTn/zkxebm5mWZ05nWAmybT7/1rW/dOBAT9mQAGRoSECaDm2Aw5cMJCFPSnOxpvXQrTeY6wX1+7gTDaWqT50SVw9CQxbos5ADUiszd3vzmN6/LXM50FqAX2tra5vzt3/5tv58ZIQAevJIFzbEdyXhmz2y6mSY7loAve23pCpiyAJCAOM9RyrzTAGewZr7rXRZyUroPUCvOOeecpxsaGuaYyQL03vjW1taX+jtTJwAefBL0Zi9sypp7lvwOljM3B3KVPs9TOlAniMr+93SETSMwBs+ChgwwUCuymNrS0vJs5nCmsQDb57xDDz20X49FSiBQL+Wxg1mOEUkTqLxeCXpzdJDXbcfk/NJp06aVO14nKFYmPThes8mTJ3sigJpwyCGH5Nij801fAbZfe1tb228yyesvEyZMKO8dpfakxDnlupnw50iiHAfkyKrqS2Y4zbSydzrdsPPnWuiAze/L0Vlp5AYw0ObNm/fbpqamtcXcbbjpK8COOfoP/uAPNvTXBNw5wLUnJbnp3pxsb7KTOQPXntX+kax6Mu3Jsue/nvfa4hxgoBZkjlbM1Z4s5mxfNG0FqEYauL39jlmzZr3UHx/i2UuaLCMDL8FWjvTJ3t4sTOTMXpnIgV+ESOa9P6sy2LqZM2eWFyYABlIxR1vX1NR0txkrQPVMGDZs2Ivr1q3r8w/x7IHMflIGTppXJcubwDevR47yoXZW+ZN1TAfpdJK273pgZYEoXc4BBnKBtK2t7flirjbRdBWgipqamv7h05/+dJ83xErglcHABFc5szZlztl/mkZX1O5rlYxwOhBnwUhmfmCk/DkLEgAD5TOf+cyqYpr2PTNVgOob3tbW9ti11177P335QX7ZZZeVO+DSv7LvOvtMU2KbpksMnpX/ZOnTmEzX6P6XhaIcZQUwEGbPnv1cU1PT4yWNrwD6zKThw4c/35el0Nlnmj2O9I+UOyeASlfnnN/r7N7BKdn6BMEpyfUa9p906V6wYIEnAhiQBdA3velN64u52YGmpwB9qAiU/k9flkIni5VMJH0vjZRSQptJvKOnBr+UQV900UXl/cE5noe+f76HDx9enoQC9DelzwD9J2cD/7ovS6HTfMlxL307cU/n2uz1Tck5Q0sWkfbdd99yR3V7g/tOMr95ngH6m9JngP5XLoXuqw60RxxxhH2ofSTlsYcddljnxIkTLTIMYZs2bSoHwNmjqiS6b6T7c7YNAPQnpc8AA+fCT3ziE+v74sM93W1PPfVUV7kqW7VqVeeECRPKe0UFRfUh59R6vftGFhdmz57tiQD61SGHHLK8pPQZYECkFPrhyy+/fFO1P9ztA66+PKcpeU52XTBUX1JNcfDBB3vdqyz7f1VRAP3phhtuWNfY2PhYSekzwIDZt729/YW+KIW2D7h6Ojo6ysFvumvbE1qf0vBM2btFOmDwygkcxZxrQ0npM8CAO/eAAw6o+rlI9gFXN/i1V5EcMZYSeEHwjrNNA+hvH//4x1eWlD4D1ITm1tbW+7/1rW89b4JZWxLo5JijdHyGyKJSMpd91cCuXligA/rTrFmzVjc2Ni4tKX0GqBnjWlpanp03b96r1fqwV2K4Y1LqfOCBB3bOmDHDk8FrVBpjKYfffrZoAP3lgQceeKm5uXldMdeaYLoJUFsO3XnnnZ/LHpVqGTt2bOfixYtd/bZDjmgR5PB6iyN5j9B7t99+u/N/gX6R5oUjR458uphjHW+aCVCbzv/IRz6yvlpBVzJVyqB7b8GCBZ2jR49W5spW5UisvEcWLlzoyeilNJObNWuWJwLocwcccECOPLrS9BKgdjW3tbX999e+9rXnqvHBnxLDHDWSQ9/ZNll8GD9+vPNJeUNXXXWVTGYvZVEp5c+OlAL62oUXXvh4Y2PjA8Xcqt30EqC2jSmC4N/cfPPNVdkPfMwxx5QbYrFtfvjDH5bLW2FbJAC2WLLtsqd+2rRpngigT911113PF8Hvc8WcarxpJcDgcNBOO+30XDVKcFPOm4wmb6yS/Z07d64ng22S4FcWeNt/v3KkmL4EQF9K1Vsxh/pNMZc62nQSYHCZ/r73ve+ZauwHzgT9lltucVV8A7K/bO/vlyzwG8s5ymksB9CXPvzhD2ffr/N+AQaj5ubmW08++eQd3sB76aWXdh522GGuim/g4IMPFsjQa5dddll5qwGvL4tLzv4F+tL06dNXNjQ03JMplFkkwOA0uq2t7cl///d/37QjF4RNmzaVG8+kcy1blqY8aRg2UM15zjzzzM5x48a97kgGbaDlvZQzpitSYl8rj22gVBo7OTJr61L2nPJnzxHQV2699dZnGhsbnynmTuNMHwEGt4nt7e0b7rzzzh1qipUAK4MtS2ZqypQpA/b9TzjhhM7ite6cNGlSOVO2pTHQZew5ozrBbhoZVWS/dB53ysfrWcqg58+f7xdpK9L46pxzzvFEAH3i4YcffqmlpWV9cT36tGkjwNBw+IgRIzbuSAZ3+fLlzrZ9gwA0peIDHQDXcpY+jy2PsWcATJcEdwK8rX/2JEOeY9kAqm3jxo2vFHOk1cX16RTTRYCh5Yy3v/3tG3akRDcTdHsVtywZ1oHs/tybADgdLnO7zctJ897I11OmHPn/+Xu+nj/ffvvt5Uxtypa3JlnelDPnjNue3XpzH8lw5jGefvrpv/v++V6V77G5/Pt8v9zfloKffK3y9QRJ+Z7Zg72193juL7fJ/eX2tSQ/Z15Dft8RRxzROXPmTE8EUHW5Dr3nPe9ZUVybLjRNBBiCmpqa/mnixInrtncfXYKVlLAmEOK18rwMZPa1NwFwMrBbum2CsHy9EshXMrZnn31251577VX+c2Wk1LpnoJn3VErkm5ubX3O7lIXndpX77jly/1sqgU5wmvvvedvcbx5Hz/dupbT71FNPfc1tky2cM2fOawL+dA/e/PtnMadW9pTmedBB/PelbD9Hi1UWZQCq6aCDDnqkuB7cVNL0CmDIak5n6KlTp27Y3otFMmwJhjSjea329vYBnaRXAuBkWRNYbj56Bqu9DYATfCa4TWCaEviTTjqp/PULLrjgd/82f87XEowmC5z3xyWXXPK7r20tA7x5AJznMAFPGoolU5vb5P4q37NnmXACxjy2vB9z35Xsc/7t2LFjf3e7SmBeCYrzPXI/ub9Zs2bVxPuno6Oj/HPw2sxMnpOeixkA1VJci1Y0NDTcX1wLhpseAgxtw1tbWx/55je/+fz2XjSS1esZ/NBZDqYGUiUA3tromWHtbQCcbGxPCSDz9crRWAlUsj88jZw2lyxrjofqeX+v1wQrRwLl71vaT53HkYWGSjCfADi37dlVuudzUdmvntvl8fVctMmfEwTXSuOpPNaeQTtdiyoD2VgOGLquuOKKJ4vg9+niWjHGtBCgPoxNt8P/+I//2K6UpYZYvy8ZxoHMileCvmRXE2BuPnoGib0NgLfU/Tsl35WS3eytLXWXSr+ebQmAK5nelC1vrpJRrnSzzvdPtndzm/982T+avyebmP+XoLfWKhjyO5XMN12ytzul7LW2VxsY/ObNm7e+qalpbXFd2Nd0EKC+7NDxSBpi/X5AOFT3AG+pa3PPAHhbjzLalgC4ktXdksrj63nbPI43+vkS7CY4z6JNJSOeP1fKtWuBPcCvdeyxx77hggpAb61cufKltra23xTXgUNNAwHq03Yfj5Qy2JRsaojVJU2WBrKcdiAD4Mre3osuumiHA+DPf/7z5b9vaT91pTw6+9B7EwBXVPYc5/9PmDChfJtKefZAS3dqC0qdv3s/jRkzpnNHOtYDbK74THll5513fqL47D/D9A+gvn2lmGw+sz1nbF5zzTXlslIT1a69rgliBlMAvHl5aeXrvQ2AU66cEvBk7TY3bdq08kJJ5eilNwqAK49hS4sJlfLoNIzqTQCc0ukEz1tatCgN8N7tipRpb6nUvN5k4SOLEwP5uwQMyeC3c7fddvt18Zl/sWkfADF9e4PgBF4yV13Z04F8HnoTAKfBVGmzLs75dwlUtycAjpzVmgZVPQPXvJ9Saly5XeX+sk95awFwgvIE05sfs5T7zf0naK3Y1gA4/yb7SXvuWc99Z/GmVhpP5TGqpvB5AlRfqn/e+973Li2uC9eZ7gHQ08W77777b3qbzU3GJt1/36j8dahLsJeGTAPVXKk3AXCysSkxze0TRFaC12RwtzcATnCZr+V+Usac+0rQme9TydjmucnXcp+57cKFC7e4fzjZ2gTB+be5n3Sbzt/zb3pmrbc1AF6wYEH5tcn3TnCV5yr/LvdZKaceSHk98tjq/azbvO7J/qooAaoZ/O63334PdQe/zvoF4LWKgOC7H/jAB9b1dgKaQCPBSiVwqlfJWg5UFi+BXAK/LXVP3pIErGkyVAmAc9Zq/m3uoxI4Vv6+pdc1ZcWbN73K7ZNVTsCavbVplLZ5VUGC3jSfShCaztT5Xpt3qY78PeXTeXy5v3y/zd+X+f75+uYq+3x7PhcJnFNinMeV+8x9b/49B0rKfStHStWrvC9SLVBZLAGoRvD7sY99bFkxvblZ8AvAVjU1Nf3L9gTBOZom5aT1fDRSgrEEk9AbCcjrec9rOnEnI3/99dd7MwBV86d/+qf3FdOa+cUYbnYHwOsmghsaGq7/1Kc+tba35bxp5JMsaK2dsdpfUsKaTHitZBapfclW5/zfev2dyc89ZcqU1+wLB9hRX/jCFx4R/ALQqyC4tbX1xiIIXtfbiXlKOVPiWq9kgent78usWbPq9udPqXoagNXrAgBQfaeccsrDDQ0NCYBHm84B0KsguHDnZz7zmbW9ufCkdDoZrc33h9aLShY4exrh9aQ5V94r9dr8Ktsm8vNvT/d5gC0566yz7u8OfseYxgGwPYa3t7ff/eUvf/mZ3lyAFi9eXG5os6WzXOtB9nPmiJ167+rL6y8U5T1Sr/te0+xK4zygms4999xfNzY2Pib4BaAqQfCJJ57Yq0xwuhLnaJd6DYJz3E46DcOW5L1Rr+fdVoLfa665xhsBqIpvfOMbSxsaGp4u5ix7mbYBUJUgOOXQvd0TnOxWvQbBOYInXbFzvBD0VOmYvq1HVg3F4HdLx1cBbI9jjz02we8KwS8AVQ+CW1tbb+5td+h6DoJT3pmfPSXhEPk9yHsiQXC9yV7fBP6CX6AaMhcp5iSr7PkFoC+Vj0jq7TnBlSC4HhtD5WfPpD+ZLwS/w4cPr8sGcQl+s+dZ8AtUQ+YgH/zgB1cV85LFgl8A+jwIbmpq+pftCYLrNRC89NJLyz+7breC34suukjwC7CDnyl77LHHkyXn/ALQr1Fwc/N33/nOd67vTVBXz0FwJv8JAmSC6zf4Pf300wW/ADtg1apVnW95y1ueFvwCMFDOHzNmzDOC4G2TTHAaANVrZ+x6lH3gCX7POeecug1+6/FnB6ov/TR22mmn54q5x3WCXwAG0ldGjRq1oTcBbYLgej0DNM2Psh86ZwUztOV93t7e3nnZZZfV3c++fPnycvBbj1lvoPrmzZv3anNz86bu4LfZ1AuAgfZXI0aM2NibIPj2228vB8HJitbjKva4ceM6zzzzzM7edNRmcMhrOmvWrLrt9pyFrXr93Qaq77rrrnu1oaHh1WKu8QPBLwC15HMtLS0v3nrrrf+vt1miU089te4CwXXr1nWecMIJnfvuu2/nokWLzHCGiCwCTZo0qfy61nOZfz1WdwDVd+GFF77YHfxebJoFQC2aXATB6//xH//x2W29uKWT9GGHHdZ54IEHloPCepNM+IQJE+qyO/BQkgWcGTNmlEue6zGzn583C1lZ0MrCFsCO+upXv7q+O/j9K9MrAGrZXq2trSv++q//ev22BgG53dlnn10uC055cL3ZtGlT+efPIkA9npU82C1YsKC8iJHmblnQqDcbN27sPPjggzunTJnS2Zuj0QC2Nif4/Oc/v6YIfl8s5hSHmlYBMBiMbm5uvrMI6Nb2ZkKcxlCjR4/unDNnTl1e9BP8T548ufOkk05yZvAgkPd2sr3J+qbZUwLBepMy70qzK/vZgWp8rv7hH/7h48U8Yk0x9jWdAmAwaW5qavqX9773vet6E8wlA5o9hDNnzqzbCUAaKCUbfsEFF5Szw9SeZHrzGiXzWa9nO+c5yIJVPXa5Bqov26De8573PFbMHxYVY4xpFACD1fSRI0c+++CDD766rRfBBMwTJ05MCVRd7guO1atXdx5zzDHlxYBLLrlEaWkNSIYzRxulydX48ePLf67X5yELVJpdAdXy+OOPvzxq1KgniznDTSVn/AIwBBzd2tr63H/+539uc4foZD5TXppJdr0GGpGGQtOmTSvvL02TpXossx1oec7TpCyvQQLfH/7wh3Vb7lvpcp39vlmkAdhRDz300LpijvBMMVf4XskxRwAMIZPb2tp+8/d///fP9ebCmAZD2WOYbGg9B3/52ZMJzvE6CYjrsVnYQC0+DB8+vPy8z549u66fj5Tmp+Q5/wWohttuu+3RxsbG50o6PQMwRI1vaWlZPnXq1Kd7k0FLNriSBa3XBlk95TlIBi6ZuJy7qjy6urK39Ygjjuhsbm4uH9FV7++5VatWlTuU5/2WPwNUw0UXXfRgEfz+pqTTMwBD3PDignfNu9/97id7W0KZ/YZpPHTCCScI+jq7ylGzMJCsXDpHJ3DTiXf7g7xkNpPprTQg04m7s1zunW0IKQH33gKqobh+v/Lxj398UUNDw4piTjDBtAiAenHKsGHD1t1yyy3P9vLCWQ76EqRowNOlUh6dLF2ClSwQpFxXB+mtSzCX90/OX06Jfcqcjz322M7i/ejJ6ezqxprsdxYEFi1a5AkBquKee+7ZWHze5pijG0uaXQFQhya0trY+dPrpp6/o7UU0ZakpiU4wLBv82gWCNA1LRriydzrH1Chd7eounuci3cUT8PbMnFss+F95/2Qh5ZxzzpH1Barm7/7u77Lf96Xi2n+W6Q8A9Wx4zgvee++9l27cuLFXs+1kPhPAZLKewMZk/felWVbKV3NebQLiZIdT1loPAXHeD/Pnzy8HcjlWq3ivlf+brK9y8d+XTG/eJxMmTCg3nwOohlyrDzjggBUNDQ1PF5/DB5n2AECXo0eMGLHsV7/61dPbM3FP+W/KNRPYsPXscDLnp556armEPBn0NHtKgJiS6cF8rE0C+vxsCfbz86Vh06hRo8rvidNPP7388zlCauuZ8cpCUpqqWRgAqqW4pv+2uLavK67xC4ox1lQHAF4rXaIXpjPk9lxoE+TknNZ0SE6DKN448Mme1+wfrgSNyRInC5jS8nw9QWWyyLVSItwz0E02OxndlDMnu5vMZcqb8/+yECLgfX15TWfOnFkOfJMV93wB1XTBBRc809DQ8GrJ+b4A8Lrai3Hx/vvvf1cxQe91KirZqwRu2d+ZoC7NfOidPGdpEJWuyAmEk13P85lAafLkyeV9xXluZ8yYUc4YXnXVVeXbJ1BOgJrxeh2UE3hVbpcS5fzbLF6kNDv3l/vNSFYyQW6y1JVAt5LVTaCboC23z33YB94711xzTbkKIM9jzjsGqOY15JOf/OTTRfD7YnE9/6JpDQBsm8N32WWXuzs6Op7YngtwsllnnnlmOXDLkTaaHO24PKfZG5omSVsLVtM5uHJmbAKsjJynmwztlkbKsCu3S2Cbf5v7SeCd+83e7ny/fF+LGTsuz2NemywoZOEAoJrmzZv36siRI58tPt+XF2NfUxkA6J2xbW1tt5977rn3bu/FONmtZLkSYCXrBfUovwc55ikLDlm8AKi2b3zjG2u7S55/VIxRpjAAsH2yb+j8Pffcc9HatWtf3t4Lc7JdKd/NHuFkFWWEqQdpEJeMeiohklH3vgeqLVte9ttvv8eL4DeZXyXPAFAlB+20006PzJ49+8kduVBnv2n2lGY/a0qjNf5hKMr7POXoeZ+nKZj3OdAXbrnllmfb29s3FNfo+cUYZ6oCANU1prm5+edFALtkRzNZadiUzFgChByT83pNm2CwSDOx7PFNpUNKnWV8gb6QhpOnnXba0oaGhpeLa/P0ki7PANCnztpll11W33vvvS9Vo3Sr0iwrAXECYxhsE9EEuznCKsFvgmCAvvL444+/PG7cuGWlrkZXE01JAKB/TG5tbX3i3HPPfTIBwI5KiWhKRZMRTol0SkihluXopxz5lfdsyp29Z4G+9uMf/3hFU1NTSp6/X4zhpiIA0L9GNTc3//T973//kzlTthpSMlrJpuWomJyF6/gdasnChQvLx0SlaiGdndPoCqAvvVL43Oc+d1dx3V1XjMNNPwBgYH2ltbX1uX/4h3/YUM0L/u23314OMEaNGlU+SmnOnDmd1cg2Q29lESYVChMmTCjv7505c2bn6tWrPTFAn7vrrrtWvfnNb364uNbeXIwxphwAUBsmNDc337nnnns+tnz58lerefFPqWmOTsoxSik3Pfvsszs7OjrMiujrjEt5P29K8rMIc9JJJ5WP8wLoDxs3bnzls5/97K8aGhrWF9fYU0wzAKA2Hd/S0vL0WWedtaovsrVFcN15zjnndI4dO7bccOjSSy91xAxVlUZslcZsBx54oG7OQL/7p3/6p2W5lhbX1BuLMdbUAgBq26hifH/XXXddedddd/VZdNqzRPqYY47JeYhKpNkuKXHOfvPsOx83blznjBkzOqu1rx1gWy1btuylPfbYo6O4hq4pxudMJwBgcJnU0tKy8Kijjro/Zcx9pWeJdGW/cLJ2mmfxRpne7OXN+2b48OHlxZQsqgD0t1SZTJs27dfd5/pe2b2QDAAMQs3F+KsRI0Ysmz179tL+yORdddVV5YxwgpoENwlynC9MJpgJcNPBOVneNLM6/fTTy19TOQAMlFtuueXZkSNHptw55/oeaNoAAEPDmMbGxqs+8pGP3L1hw4Zn+2NSkaAmwU32cybYSdBz6qmnlkul7emsD1kQSTVAqgJSHZAFkQsuuEATNWDApZP8H//xHz9WXB9fKcaFxWg3VQCAoeeg9vb2u7/zne/c0d+TjTTQylE2aWyUYCjdfVM6na8zNGTRI+fy9ixtTjVAqgKUxAO18jl1wQUXPNPS0vJicU1cVIx9TQ0AYGhLWfRZu+66670533AgJiDpHJ2gKPs+kxnO8UoJiBMgL1iwQIZ4kMjrmIx+OoNnYSMB77777qu0GahJd95552/f8Y53pMHVC8U4o/t6CADUiXHNzc03TJ48eeHatWtfHuhStOuvv74cOKUTcAKpHLOU8umcBbtmzRoztxqQ0uWUNKeUfcKECeXX6eCDDy53bU4g3JfN1gB2ZLHu8MMPzx7fzmL8WzHGmAIAQP06vK2t7eHp06cvqZWMXTLAc+fOLe8XTWY4JdPZR5yMcc4eTpmt7GLfSjA7f/78clY+r0HO5U22Pq9BjizKawBQ6773ve891tLS8mxxrVtYjMku+QBApPnH+UWg+djPfvaztYMh+9jc3Ny51157lYOzs88+u/z/Fi5cWF7pZ9tlb24WG7KwkAz8lClTOseOHfu7LHy+JgsPDDYPPfTQhuKzLFnfdcU4saTcGQDYgr2KwPLn++2339Lly5e/WsuTm2SAExQnOEumOJnJSvl09hQnkMuRO8lWJsCr9wBu1apVnXPmzOm85JJLyosICW6T1c1Iw6p8Lf8vpcy5LcBg9MILL7zyhS984Z7uM30vLjnTFwDYBl9sa2t78pRTTlk9GPd1Zk9xArkEdAmC06ApgV5KqRMkJzg+4YQTyntXEyBn/3GC5AR+g60BVzLe6aSdx3/NNdeUf+Y0pcrPl/25aUqVRYGUL+fnTkY32d6UN+vMDAwlV1xxxf25dhXXsNuyoOtSDgD0RlbNv7fTTjs988///M/PDoXJUYLFlEknE5qS6QTACZBzTm2C5ASJ7e3t5YAxe47ztRzjk6AxR/vk31RGMs8JOisje2ITQFfGG5ViJ/jsefs8rp73l6C85/fLY02WNo81GdtteazpxJzHpTkVMJQtWbLk0Xe/+913F9eslDwf7vINAOyIiU1NTb9829ve9sS11167oU5K6LaaVa2M7D1O0FkZybQmKK2MZJtLXR1HtzgqTaUqI5npnveXQLfn9xsK2WqAanrkkUfWfvjDH15Q6trnO73U1c8CAKAqDkwg/O53v3v5rbfe+oypFwADYenSpc/tv//+95a6zvO1zxcA6PtAePfdd1+ycOHC9aZiAPSHp5566uWDDz74vu4GV1eWnOcLAPR3ILzPPvvc+8gjj2wwNQOgL6xZs+aVP/uzP3ugO/C9rhjjXYIBgAELhFtaWuZ+/OMfX/TUU089Z6oGQJUC3/RDeLg78E1n531dcgGAWnF4EQgvnDJlyoINGzY8a+oGwPYGvlOnTl3R2Nj42+LakiZXB7rEAgC1HAjPP+qoo+YKhAHoTeB73HHHre4OfBeXHGkEAAyyQHhBMsJKowHYxoxvRzGOL0azyygAMFgD4YWf+tSn7s7RFaZ6AHQHvq9kj2934LuoJOMLAAylQLi5ufm+NMt64IEHnjf1A6hPOc7oyCOPXNzd3GpuMQ51iQQAhnIg/OA+++zTcc899wiEAerExo0bXz722GMXFIHvi8W14OaS5lYAQL0Fwnvuueevb7/99hdMDQGGpjRETGPEIvB9tvjsv7HkOCMAoN4D4d13333V9ddf/6KpIsDQ8OSTT/7myCOPvK0IfNcXn/VXFmOCSx4AQHcg3NTUdPfIkSOfnjFjxqqNGzeaPQIMQjfddNMje+655x3F5/oLxfh+Mca7xAEAbFkyBN9vaWlZ/yd/8ieLly1b9pLpJEBt27hx4ytf+9rX7nnTm970aPEZvqoYZxRjlEsaAMC2GV6MUxobGx/Yc889F99www2rTDEBasuCBQvWf/KTn7yvu6Pz/GJ8ruQMXwCAHTKpGFeOGDFiWTIML7zwwibTToCBsWnTps6LL7748V133XVl8dm8qRg/KGlsBQBQdaOLcUZLS8vCgw46aF5HR8cTpqIA/aP4zH31mGOOWdbc3Jy9vWuKcVb35zIAAH3soGJcN3bs2Dsuv/zy/36lYHoKUF35aL366qs37rnnno8Vn7mdxVhQjKNLypwBAAbEmGJMb2tru/fII4/85YoVK9aYsgLsmNWrV7/yl3/5l8vb29s3lLq6OecYo4kuOQAAtSHZiEMbGhrmvP3tb3/okksueSD71ADYdtddd93q97///UuKz9NXSl3Z3lNKXU0JAQCoUeOKcX5bW9uvP/OZz9x31113OVQYYCueeuqpl0877bR7hg0bln2964pxYanrSDoAAAaRZIWPbmpq+uVb3vKWR2fOnLly3bp1ZrsAhZ/+9KcP77333gtLXZ2cby51HWHU7tIBADD47VWM7zU3N6+bPHnysltvvfX/mf4C9WbDhg3rv/KVr/x82LBhy4vPxFXFOLcYY10iAACGpmQ3jm9sbLz3TW960/qjjjqq44477hAMA0PW2rVrX5wxY8aCd73rXdnTu7EYPyrGp10OAADqy/hinNHU1HRHEQw/8aUvfem+e+65x35hYCgEvS/PnDnzvne84x33l7pKnG8rxhdLGloBAFDqKgH8SkNDwy9Gjhy56sQTT7y7o6PDkUrAoJGji772ta899Pa3v/2RUlcX57nFOLEYo33EAwCwNaO7J423FcFwRxEMz3/00UefMr0Gas3y5ctfPfvss5e9853vXFZ8ZnUWY34W80r29QIAsB1GlbrKBm/cZZdd7j755JP/76qCaTcwgEFv5xlnnPHo2972tie6g95FxZhe6trWAQAAVTG8Oxj+tyIYvmPq1Kn/tXDhwg7TcaCv3Xfffb89+eSTlxWfPWu6g950cT6v1NXhHgAA+lS6SR+eYLi9vX3JIa/YK10AAAm7SURBVIcccsdPfvKTFa+88oqZOlAVc+fOfTbN+YYPH/5U6X/Lm88S9AIAMJCai3FQMX7Q3Ny8+kMf+tDCWbNmPbJxo4bSQO/cdtttj372s5+9u729fW3xmfJCMW4sxvEljawAAKjRYPjAYlycYPhd73rX0m984xtL06jG1B7Y3CuFH//4x/dPmjRpQfGZkfLm1VlMK3Wd09vuIxUAgMFkcjEubGpqWpm9e8cdd9ySm266acOmTZvM/KFOrVixYu155503f++99/5lQ0PD+lJXE6vs553oIxMAgKFi31LX/r2bi4B4w9ixYztOO+20e375y18+Ze8wDF0rV6586dvf/va9H/7whxe0tramc/PGYlxXjFNKjisCAKAOpFR6UiUgTunj7rvvfu/Xv/71Ox988MEnhAwweC1ZsuTlb33rW0snTZr0QHt7expYbSrG3O7f90k+/gAAoCtD/JVi3NjW1rZ0woQJv5g5c+btq1evXi6kgNrV0dHReeGFFz6+//77dxQB74ZSV8fmhcU4v2QvLwAA9C4gLibVd3/0ox/9zwsuuODWlStXCohhAC1atKjzvPPOe+KAAw5YPmzYsI3dAe+qYny/GEcXY5SPLwAA2DE5+zN7Bn/U2tp6/3vf+95506ZN+8W8efOW2kMMfefee+99Kd3c99lnn47m5uYXugPejmJcWYwTizHOxxMAAPRTQFxMypeMGTNm8dSpU+++5pprfu0MYtg+WUy64447njrzzDMXvu9973ugqanp+VLXHt75pa6S5sNLzuQFAIABN64YxxfjysbGxsd23nnnR//oj/7o/u9+97srOjo6nEMMWw54N912222LTzzxxPnvfOc7721oaHix+B3Kebzp0pwtCGla1ezjBQAABkdA/IMiIF6aTNY73vGOpYcddtg9F1100YMLFy5cr3SaepLjiK6++uqOL3/5y3d84AMfuHv48OFLi9+PV0pd5/B+rxhfLClnBgCAISGNeZLNStn0xcWYWwTGT44cOXL5Rz/60Tu++tWv/uJnP/vZA88///yzQiUGs3Xr1nXecsstz06fPn3JIYcccv/o0aNXFO/1l0pdpcwLu4PdvyrGxJIOzQAAUFeyn/GgUle5Z7rYLmxtbb1nt912m/fnf/7nP73iiitufeqppxYVccUmoRW15IUXXuhcsGBB5yWXXLJ+6tSpK8aPH7+yeO8+V+pqUpXuzLd1L/YkszuhpJQZAADYinHFOLQYZxXjRwkmRo4ceefee+998/HHH3/z5Zdf/t/333//smyjFIrRlzZt2tR53333vVq85x7/0pe+tHyfffZZPmLEiHXdgW7G6mLcVIzzSl1Nqsb59QUAAHZUMmjJpH2uO9i4sbGx8YFhw4Yt33333e868sgjF3znO9+5L110daJmezz00EMb/vVf//WRv/iLv7j3gx/84AOjRo16rKGh4dVS117dxXnPlbq6MWd/e0r6nbkLAAD0q+yjnNgdlFxYjJuKoOXplpaW9ePGjVty6KGH3n/GGWc8cPnll3ckOF6zZo2scZ3KwkgR5K6bPXv20vPPP/9Xxx133PwPfehDd44YMWJJ8Z55uXjvJLO7oBg/KMYZpa6M7l5+xQAAgFqX7NzkUlfDoQTG/1aMucVY3tjY+MywYcNWjRkz5r799tvvF1OnTv2vGTNm/PzHP/7xnY888siDRay0Wrg4uMqUV61a1Tl37tzOyy67bO3Xv/71FUcfffTi/fff/8HddtvtkeK1XtMd4FZKlnOubkrrk809pft94nxdAABgSAfIye4dWOrKHme/cTr0XtcdIM0vAqc7x44de/PHPvax64866qjr/+Zv/ubGq6+++uZ58+bdtbSQpr/Cz76VwDbNpq699toN3/72t58+7bTTHp0yZcrKvffee/Vb3/rWta2trS+V/nc/bkqVl5e6GlBdWYxzu1/bvMbjShpRAQAAvK4xxdi3GJ/uDqYSVKVENo2PFjY0NNxfBGGPjh49elH2Ik+aNGnB1KlT559zzjl3ff/733/45ptvfuLhhx9+KYEc/1uKnHNxf/WrXz1ZBLYPzZw5874TTzxx0Sc+8Yl799prr4d23XXXdFR+ZrPAdlWp6xihSnCb7G3KlI8ude3HHeOtCgAA0D/GdQdi2TeastrzugO1BGyLuwO4nAXb2dTUtKG5uXl1JXDO2G233f5rjz32uG3ixIk/P+SQQ27MmDZtWjnr/M1vfvM/Lr300iuTfc6YPXv2nAcffPBnS5YsWVAZyUgvX758dcb//M//PLqtwejq1avLWdaMjo6OchlxZdxwww2/Lb7vusqYPn36hrPOOmtj8ZjWJRN7+OGHr0k2tnisOc955e67774qI2XHb37zm5/aaaedfpPy4/b29rU9gtmeAW2el5Slpzz9e92LCyd2P4cHdj+nGk0BAAAMkaC5MiZ0B32VkW7Xx/cY5/YY53cH15VxU3cgWRnLuwPMjDWbBZ+vNzb1+HdbGvM3+z4/6v7+3+/x2E7sfryf6/GzjBPMAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9e7/A8f6z2EpBK7BAAAAAElFTkSuQmCC)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "OwMOonQIbxK8" + }, + "source": [ + "\n", + "Thus Logica can easily express logic of SQL queries. Logica can also express computational instructions by defining functions and auxiliary variables similar to languages like C++ and Python.\n", + "\n", + "\n", + "\n", + "Logica syntax is similar to set-theory and logical notation used in mathematics. Consider the definition of a set of even numbers:\n", + "\n", + "$$EvenNumbers = \\{x | x \\in \\mathbb{Z} \\wedge x / 2 \\in \\mathbb{Z} \\}$$\n", + "\n", + "Formal logic assertion which number is even:\n", + "\n", + "$$x \\in \\mathbb{Z} \\wedge x / 2 \\in \\mathbb{Z} \\vdash Even(x) $$\n", + "\n", + "If $Z$ is a predicate corresponding to the set $\\mathbb{Z}$ then we could write\n", + "\n", + "$$Z(x) \\wedge Z(x /2) \\vdash Even(x) $$\n", + "\n", + "Logica rule defining Even predicate from a predicate Z looks as follows.\n", + "\n", + "```\n", + "\n", + "Even(x) :- Z(x), Z(x / 2);\n", + "\n", + "```\n", + "\n", + "Unlike mathematics in Logica we do have to worry about computability, so we can't easily define a predicate as a subset of all integer numbers. But we can easily define Even predicate defined for a subset of positive integer numbers from 0 to 20.\n", + "\n", + "First we need to install and import Logica into this CoLab." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "L8t0orNYD2Kl", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "20645da3-9bf6-49b4-8bcc-066c828b450d" + }, + "source": [ + "#@title Install Logica.\n", + "!git clone https://github.com/evgskv/logica" + ], + "execution_count": 1, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Cloning into 'logica'...\n", + "remote: Enumerating objects: 4947, done.\u001b[K\n", + "remote: Counting objects: 100% (1169/1169), done.\u001b[K\n", + "remote: Compressing objects: 100% (255/255), done.\u001b[K\n", + "remote: Total 4947 (delta 992), reused 929 (delta 913), pack-reused 3778 (from 3)\u001b[K\n", + "Receiving objects: 100% (4947/4947), 5.69 MiB | 10.52 MiB/s, done.\n", + "Resolving deltas: 100% (3175/3175), done.\n" + ] + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "QkRBUpB-nHKy" + }, + "source": [ + "#@title Import Logica.\n", + "from google.colab import auth\n", + "from logica import colab_logica\n", + "# Use this for manual authentification, otherwise\n", + "# logica will authenticate when the first cell runs.\n", + "# auth.authenticate_user()\n", + "# colab_logica.SetProject('YOUR_PROJECT')" + ], + "execution_count": 2, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "ptokgaE8FDKO" + }, + "source": [ + "Now we can define the Even predicate." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "HempOoVrUnLq", + "colab": { + "resources": { + "http://localhost:8080/nbextensions/google.colab/tabbar.css": { + "data": "Lmdvb2ctdGFie3Bvc2l0aW9uOnJlbGF0aXZlO3BhZGRpbmc6NHB4IDhweDtjb2xvcjojMDBjO3RleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7Y3Vyc29yOmRlZmF1bHR9Lmdvb2ctdGFiLWJhci10b3AgLmdvb2ctdGFie21hcmdpbjoxcHggNHB4IDAgMDtib3JkZXItYm90dG9tOjA7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLXRvcDphZnRlciwuZ29vZy10YWItYmFyLWJvdHRvbTphZnRlcntjb250ZW50OiIgIjtkaXNwbGF5OmJsb2NrO2hlaWdodDowO2NsZWFyOmJvdGg7dmlzaWJpbGl0eTpoaWRkZW59Lmdvb2ctdGFiLWJhci1ib3R0b20gLmdvb2ctdGFie21hcmdpbjowIDRweCAxcHggMDtib3JkZXItdG9wOjA7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLXN0YXJ0IC5nb29nLXRhYnttYXJnaW46MCAwIDRweCAxcHg7Ym9yZGVyLXJpZ2h0OjB9Lmdvb2ctdGFiLWJhci1lbmQgLmdvb2ctdGFie21hcmdpbjowIDFweCA0cHggMDtib3JkZXItbGVmdDowfS5nb29nLXRhYi1ob3ZlcntiYWNrZ3JvdW5kOiNlZWV9Lmdvb2ctdGFiLWRpc2FibGVke2NvbG9yOiM2NjZ9Lmdvb2ctdGFiLXNlbGVjdGVke2NvbG9yOiMwMDA7YmFja2dyb3VuZDojZmZmO3RleHQtZGVjb3JhdGlvbjpub25lO2ZvbnQtd2VpZ2h0OmJvbGQ7Ym9yZGVyOjFweCBzb2xpZCAjNmI5MGRhfS5nb29nLXRhYi1iYXItdG9we3BhZGRpbmctdG9wOjVweCFpbXBvcnRhbnQ7cGFkZGluZy1sZWZ0OjVweCFpbXBvcnRhbnQ7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgIzZiOTBkYSFpbXBvcnRhbnR9Lmdvb2ctdGFiLWJhci10b3AgLmdvb2ctdGFiLXNlbGVjdGVke3RvcDoxcHg7bWFyZ2luLXRvcDowO3BhZGRpbmctYm90dG9tOjVweH0uZ29vZy10YWItYmFyLWJvdHRvbSAuZ29vZy10YWItc2VsZWN0ZWR7dG9wOi0xcHg7bWFyZ2luLWJvdHRvbTowO3BhZGRpbmctdG9wOjVweH0uZ29vZy10YWItYmFyLXN0YXJ0IC5nb29nLXRhYi1zZWxlY3RlZHtsZWZ0OjFweDttYXJnaW4tbGVmdDowO3BhZGRpbmctcmlnaHQ6OXB4fS5nb29nLXRhYi1iYXItZW5kIC5nb29nLXRhYi1zZWxlY3RlZHtsZWZ0Oi0xcHg7bWFyZ2luLXJpZ2h0OjA7cGFkZGluZy1sZWZ0OjlweH0uZ29vZy10YWItYmFye21hcmdpbjowO2JvcmRlcjowO3BhZGRpbmc6MDtsaXN0LXN0eWxlOm5vbmU7Y3Vyc29yOmRlZmF1bHQ7b3V0bGluZTpub25lO2JhY2tncm91bmQ6I2ViZWZmOX0uZ29vZy10YWItYmFyLWNsZWFye2NsZWFyOmJvdGg7aGVpZ2h0OjA7b3ZlcmZsb3c6aGlkZGVufS5nb29nLXRhYi1iYXItc3RhcnR7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLWVuZHtmbG9hdDpyaWdodH0qIGh0bWwgLmdvb2ctdGFiLWJhci1zdGFydHttYXJnaW4tcmlnaHQ6LTNweH0qIGh0bWwgLmdvb2ctdGFiLWJhci1lbmR7bWFyZ2luLWxlZnQ6LTNweH1zZW50aW5lbHt9", + "ok": true, + "headers": [ + [ + "content-length", + "1404" + ], + [ + "content-type", + "text/css" + ] + ], + "status": 200, + "status_text": "" + }, + "http://localhost:8080/nbextensions/google.colab/tabbar_main.min.js": { + "data": "Ly8gY2xhbmctZm9ybWF0IG9mZgooZnVuY3Rpb24oKXt2YXIgZyxhYT1mdW5jdGlvbihhKXt2YXIgYj0wO3JldHVybiBmdW5jdGlvbigpe3JldHVybiBiPGEubGVuZ3RoP3tkb25lOiExLHZhbHVlOmFbYisrXX06e2RvbmU6ITB9fX0sYmE9dHlwZW9mIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzPT0iZnVuY3Rpb24iP09iamVjdC5kZWZpbmVQcm9wZXJ0eTpmdW5jdGlvbihhLGIsYyl7aWYoYT09QXJyYXkucHJvdG90eXBlfHxhPT1PYmplY3QucHJvdG90eXBlKXJldHVybiBhO2FbYl09Yy52YWx1ZTtyZXR1cm4gYX0sY2E9ZnVuY3Rpb24oYSl7YT1bIm9iamVjdCI9PXR5cGVvZiBnbG9iYWxUaGlzJiZnbG9iYWxUaGlzLGEsIm9iamVjdCI9PXR5cGVvZiB3aW5kb3cmJndpbmRvdywib2JqZWN0Ij09dHlwZW9mIHNlbGYmJnNlbGYsIm9iamVjdCI9PXR5cGVvZiBnbG9iYWwmJmdsb2JhbF07Zm9yKHZhciBiPTA7YjxhLmxlbmd0aDsrK2Ipe3ZhciBjPWFbYl07aWYoYyYmYy5NYXRoPT1NYXRoKXJldHVybiBjfXRocm93IEVycm9yKCJDYW5ub3QgZmluZCBnbG9iYWwgb2JqZWN0Iik7Cn0sZGE9Y2EodGhpcyksZWE9ZnVuY3Rpb24oYSxiKXtpZihiKWE6e3ZhciBjPWRhO2E9YS5zcGxpdCgiLiIpO2Zvcih2YXIgZD0wO2Q8YS5sZW5ndGgtMTtkKyspe3ZhciBlPWFbZF07aWYoIShlIGluIGMpKWJyZWFrIGE7Yz1jW2VdfWE9YVthLmxlbmd0aC0xXTtkPWNbYV07Yj1iKGQpO2IhPWQmJmIhPW51bGwmJmJhKGMsYSx7Y29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOmJ9KX19OwplYSgiU3ltYm9sIixmdW5jdGlvbihhKXtpZihhKXJldHVybiBhO3ZhciBiPWZ1bmN0aW9uKGYsaCl7dGhpcy5nPWY7YmEodGhpcywiZGVzY3JpcHRpb24iLHtjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6aH0pfTtiLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmd9O3ZhciBjPSJqc2NvbXBfc3ltYm9sXyIrKE1hdGgucmFuZG9tKCkqMUU5Pj4+MCkrIl8iLGQ9MCxlPWZ1bmN0aW9uKGYpe2lmKHRoaXMgaW5zdGFuY2VvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoIlN5bWJvbCBpcyBub3QgYSBjb25zdHJ1Y3RvciIpO3JldHVybiBuZXcgYihjKyhmfHwiIikrIl8iK2QrKyxmKX07cmV0dXJuIGV9KTsKdmFyIGZhPWZ1bmN0aW9uKGEpe3ZhciBiPXR5cGVvZiBTeW1ib2whPSJ1bmRlZmluZWQiJiZTeW1ib2wuaXRlcmF0b3ImJmFbU3ltYm9sLml0ZXJhdG9yXTtpZihiKXJldHVybiBiLmNhbGwoYSk7aWYodHlwZW9mIGEubGVuZ3RoPT0ibnVtYmVyIilyZXR1cm57bmV4dDphYShhKX07dGhyb3cgRXJyb3IoU3RyaW5nKGEpKyIgaXMgbm90IGFuIGl0ZXJhYmxlIG9yIEFycmF5TGlrZSIpO307ZWEoIlN5bWJvbC5kaXNwb3NlIixmdW5jdGlvbihhKXtyZXR1cm4gYT9hOlN5bWJvbCgiU3ltYm9sLmRpc3Bvc2UiKX0pOy8qCgogQ29weXJpZ2h0IFRoZSBDbG9zdXJlIExpYnJhcnkgQXV0aG9ycy4KIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wCiovCnZhciBsPXRoaXN8fHNlbGYsaWE9ZnVuY3Rpb24oYSl7YS5JYT12b2lkIDA7YS5WPWZ1bmN0aW9uKCl7cmV0dXJuIGEuSWE/YS5JYTphLklhPW5ldyBhfX0samE9ZnVuY3Rpb24oYSl7dmFyIGI9dHlwZW9mIGE7cmV0dXJuIGIhPSJvYmplY3QiP2I6YT9BcnJheS5pc0FycmF5KGEpPyJhcnJheSI6YjoibnVsbCJ9LGthPWZ1bmN0aW9uKGEpe3ZhciBiPWphKGEpO3JldHVybiBiPT0iYXJyYXkifHxiPT0ib2JqZWN0IiYmdHlwZW9mIGEubGVuZ3RoPT0ibnVtYmVyIn0sbT1mdW5jdGlvbihhKXt2YXIgYj10eXBlb2YgYTtyZXR1cm4gYj09Im9iamVjdCImJmEhPW51bGx8fGI9PSJmdW5jdGlvbiJ9LG5hPWZ1bmN0aW9uKGEpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYSxsYSkmJmFbbGFdfHwoYVtsYV09KyttYSl9LGxhPSJjbG9zdXJlX3VpZF8iKyhNYXRoLnJhbmRvbSgpKjFFOT4+PjApLG1hPTAsbj1mdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoKXt9Yy5wcm90b3R5cGU9CmIucHJvdG90eXBlO2EubD1iLnByb3RvdHlwZTthLnByb3RvdHlwZT1uZXcgYzthLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1hO2EucWQ9ZnVuY3Rpb24oZCxlLGYpe2Zvcih2YXIgaD1BcnJheShhcmd1bWVudHMubGVuZ3RoLTIpLGs9MjtrPGFyZ3VtZW50cy5sZW5ndGg7aysrKWhbay0yXT1hcmd1bWVudHNba107cmV0dXJuIGIucHJvdG90eXBlW2VdLmFwcGx5KGQsaCl9fTtmdW5jdGlvbiBvYShhLGIpe2lmKEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKUVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsb2EpO2Vsc2V7dmFyIGM9RXJyb3IoKS5zdGFjaztjJiYodGhpcy5zdGFjaz1jKX1hJiYodGhpcy5tZXNzYWdlPVN0cmluZyhhKSk7YiE9PXZvaWQgMCYmKHRoaXMuY2F1c2U9Yil9bihvYSxFcnJvcik7b2EucHJvdG90eXBlLm5hbWU9IkN1c3RvbUVycm9yIjt2YXIgcGE7ZnVuY3Rpb24gcWEoYSxiKXthPWEuc3BsaXQoIiVzIik7Zm9yKHZhciBjPSIiLGQ9YS5sZW5ndGgtMSxlPTA7ZTxkO2UrKyljKz1hW2VdKyhlPGIubGVuZ3RoP2JbZV06IiVzIik7b2EuY2FsbCh0aGlzLGMrYVtkXSl9bihxYSxvYSk7cWEucHJvdG90eXBlLm5hbWU9IkFzc2VydGlvbkVycm9yIjtmdW5jdGlvbiByYShhLGIsYyxkKXt2YXIgZT0iQXNzZXJ0aW9uIGZhaWxlZCI7aWYoYyl7ZSs9IjogIitjO3ZhciBmPWR9ZWxzZSBhJiYoZSs9IjogIithLGY9Yik7dGhyb3cgbmV3IHFhKCIiK2UsZnx8W10pO30KdmFyIHA9ZnVuY3Rpb24oYSxiLGMpe2F8fHJhKCIiLG51bGwsYixBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMikpO3JldHVybiBhfSxzYT1mdW5jdGlvbihhLGIsYyl7bShhKSYmYS5ub2RlVHlwZT09MXx8cmEoIkV4cGVjdGVkIEVsZW1lbnQgYnV0IGdvdCAlczogJXMuIixbamEoYSksYV0sYixBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMikpfSx1YT1mdW5jdGlvbihhLGIsYyxkKXthIGluc3RhbmNlb2YgYnx8cmEoIkV4cGVjdGVkIGluc3RhbmNlb2YgJXMgYnV0IGdvdCAlcy4iLFt0YShiKSx0YShhKV0sYyxBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMykpfTsKZnVuY3Rpb24gdGEoYSl7cmV0dXJuIGEgaW5zdGFuY2VvZiBGdW5jdGlvbj9hLmRpc3BsYXlOYW1lfHxhLm5hbWV8fCJ1bmtub3duIHR5cGUgbmFtZSI6YSBpbnN0YW5jZW9mIE9iamVjdD9hLmNvbnN0cnVjdG9yLmRpc3BsYXlOYW1lfHxhLmNvbnN0cnVjdG9yLm5hbWV8fE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhKTphPT09bnVsbD8ibnVsbCI6dHlwZW9mIGF9O3ZhciB2YT1BcnJheS5wcm90b3R5cGUuaW5kZXhPZj9mdW5jdGlvbihhLGIpe3AoYS5sZW5ndGghPW51bGwpO3JldHVybiBBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKGEsYix2b2lkIDApfTpmdW5jdGlvbihhLGIpe2lmKHR5cGVvZiBhPT09InN0cmluZyIpcmV0dXJuIHR5cGVvZiBiIT09InN0cmluZyJ8fGIubGVuZ3RoIT0xPy0xOmEuaW5kZXhPZihiLDApO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWlmKGMgaW4gYSYmYVtjXT09PWIpcmV0dXJuIGM7cmV0dXJuLTF9LHdhPUFycmF5LnByb3RvdHlwZS5mb3JFYWNoP2Z1bmN0aW9uKGEsYil7cChhLmxlbmd0aCE9bnVsbCk7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChhLGIsdm9pZCAwKX06ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9YS5sZW5ndGgsZD10eXBlb2YgYT09PSJzdHJpbmciP2Euc3BsaXQoIiIpOmEsZT0wO2U8YztlKyspZSBpbiBkJiZiLmNhbGwodm9pZCAwLGRbZV0sZSxhKX07CmZ1bmN0aW9uIHhhKGEsYil7Yj12YShhLGIpO3ZhciBjO2lmKGM9Yj49MClwKGEubGVuZ3RoIT1udWxsKSxBcnJheS5wcm90b3R5cGUuc3BsaWNlLmNhbGwoYSxiLDEpO3JldHVybiBjfWZ1bmN0aW9uIHlhKGEpe3ZhciBiPWEubGVuZ3RoO2lmKGI+MCl7Zm9yKHZhciBjPUFycmF5KGIpLGQ9MDtkPGI7ZCsrKWNbZF09YVtkXTtyZXR1cm4gY31yZXR1cm5bXX1mdW5jdGlvbiB6YShhLGIsYyxkKXtwKGEubGVuZ3RoIT1udWxsKTtBcnJheS5wcm90b3R5cGUuc3BsaWNlLmFwcGx5KGEsQWEoYXJndW1lbnRzLDEpKX1mdW5jdGlvbiBBYShhLGIsYyl7cChhLmxlbmd0aCE9bnVsbCk7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg8PTI/QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYSxiKTpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhLGIsYyl9O2Z1bmN0aW9uIEJhKGEsYixjKXtmb3IodmFyIGQgaW4gYSliLmNhbGwoYyxhW2RdLGQsYSl9ZnVuY3Rpb24gQ2EoYSxiKXtmb3IodmFyIGMgaW4gYSlpZihhW2NdPT1iKXJldHVybiEwO3JldHVybiExfWZ1bmN0aW9uIERhKGEsYixjKXtpZihhIT09bnVsbCYmYiBpbiBhKXRocm93IEVycm9yKCdUaGUgb2JqZWN0IGFscmVhZHkgY29udGFpbnMgdGhlIGtleSAiJytiKyciJyk7YVtiXT1jfWZ1bmN0aW9uIEVhKGEpe3ZhciBiPXt9LGM7Zm9yKGMgaW4gYSliW2FbY11dPWM7cmV0dXJuIGJ9dmFyIEZhPSJjb25zdHJ1Y3RvciBoYXNPd25Qcm9wZXJ0eSBpc1Byb3RvdHlwZU9mIHByb3BlcnR5SXNFbnVtZXJhYmxlIHRvTG9jYWxlU3RyaW5nIHRvU3RyaW5nIHZhbHVlT2YiLnNwbGl0KCIgIik7CmZ1bmN0aW9uIEdhKGEsYil7Zm9yKHZhciBjLGQsZT0xO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspe2Q9YXJndW1lbnRzW2VdO2ZvcihjIGluIGQpYVtjXT1kW2NdO2Zvcih2YXIgZj0wO2Y8RmEubGVuZ3RoO2YrKyljPUZhW2ZdLE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChkLGMpJiYoYVtjXT1kW2NdKX19O3ZhciBIYT1TdHJpbmcucHJvdG90eXBlLnRyaW0/ZnVuY3Rpb24oYSl7cmV0dXJuIGEudHJpbSgpfTpmdW5jdGlvbihhKXtyZXR1cm4vXltcc1x4YTBdKihbXHNcU10qPylbXHNceGEwXSokLy5leGVjKGEpWzFdfTsvKgoKIENvcHlyaWdodCBHb29nbGUgTExDCiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMAoqLwp2YXIgSWE9e307dmFyIEphPWZ1bmN0aW9uKGEpe2lmKElhIT09SWEpdGhyb3cgRXJyb3IoIkJhZCBzZWNyZXQiKTt0aGlzLmc9YX07SmEucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ307bmV3IEphKCJhYm91dDpibGFuayIpO25ldyBKYSgiYWJvdXQ6aW52YWxpZCN6Q2xvc3VyZXoiKTt2YXIgS2E9W10sTGE9ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJBIFVSTCB3aXRoIGNvbnRlbnQgJyIrYSsiJyB3YXMgc2FuaXRpemVkIGF3YXkuIil9O0thLmluZGV4T2YoTGEpPT09LTEmJkthLnB1c2goTGEpO3ZhciBNYSxOYTthOntmb3IodmFyIE9hPVsiQ0xPU1VSRV9GTEFHUyJdLFBhPWwsUWE9MDtRYTxPYS5sZW5ndGg7UWErKylpZihQYT1QYVtPYVtRYV1dLFBhPT1udWxsKXtOYT1udWxsO2JyZWFrIGF9TmE9UGF9dmFyIFJhPU5hJiZOYVs2MTA0MDEzMDFdO01hPVJhIT1udWxsP1JhOiExO2Z1bmN0aW9uIFNhKCl7dmFyIGE9bC5uYXZpZ2F0b3I7cmV0dXJuIGEmJihhPWEudXNlckFnZW50KT9hOiIifXZhciBUYSxVYT1sLm5hdmlnYXRvcjtUYT1VYT9VYS51c2VyQWdlbnREYXRhfHxudWxsOm51bGw7ZnVuY3Rpb24gcihhKXtyZXR1cm4gU2EoKS5pbmRleE9mKGEpIT0tMX07dmFyIFZhPXIoIkVkZ2UiKSx0PXIoIkdlY2tvIikmJiEoU2EoKS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoIndlYmtpdCIpIT0tMSYmIXIoIkVkZ2UiKSkmJiEocigiVHJpZGVudCIpfHxyKCJNU0lFIikpJiYhcigiRWRnZSIpLHU9U2EoKS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoIndlYmtpdCIpIT0tMSYmIXIoIkVkZ2UiKSx2PU1hJiZUYSYmVGEucGxhdGZvcm0/VGEucGxhdGZvcm09PT0ibWFjT1MiOnIoIk1hY2ludG9zaCIpO3ZhciBYYT1mdW5jdGlvbihhLGIpe0JhKGIsZnVuY3Rpb24oYyxkKXtkPT0ic3R5bGUiP2Euc3R5bGUuY3NzVGV4dD1jOmQ9PSJjbGFzcyI/YS5jbGFzc05hbWU9YzpkPT0iZm9yIj9hLmh0bWxGb3I9YzpXYS5oYXNPd25Qcm9wZXJ0eShkKT9hLnNldEF0dHJpYnV0ZShXYVtkXSxjKTpkLmxhc3RJbmRleE9mKCJhcmlhLSIsMCk9PTB8fGQubGFzdEluZGV4T2YoImRhdGEtIiwwKT09MD9hLnNldEF0dHJpYnV0ZShkLGMpOmFbZF09Y30pfSxXYT17Y2VsbHBhZGRpbmc6ImNlbGxQYWRkaW5nIixjZWxsc3BhY2luZzoiY2VsbFNwYWNpbmciLGNvbHNwYW46ImNvbFNwYW4iLGZyYW1lYm9yZGVyOiJmcmFtZUJvcmRlciIsaGVpZ2h0OiJoZWlnaHQiLG1heGxlbmd0aDoibWF4TGVuZ3RoIixub25jZToibm9uY2UiLHJvbGU6InJvbGUiLHJvd3NwYW46InJvd1NwYW4iLHR5cGU6InR5cGUiLHVzZW1hcDoidXNlTWFwIix2YWxpZ246InZBbGlnbiIsd2lkdGg6IndpZHRoIn0sWWE9ZnVuY3Rpb24oYSwKYixjKXtmdW5jdGlvbiBkKGspe2smJmIuYXBwZW5kQ2hpbGQodHlwZW9mIGs9PT0ic3RyaW5nIj9hLmNyZWF0ZVRleHROb2RlKGspOmspfWZvcih2YXIgZT0yO2U8Yy5sZW5ndGg7ZSsrKXt2YXIgZj1jW2VdO2lmKCFrYShmKXx8bShmKSYmZi5ub2RlVHlwZT4wKWQoZik7ZWxzZXthOntpZihmJiZ0eXBlb2YgZi5sZW5ndGg9PSJudW1iZXIiKXtpZihtKGYpKXt2YXIgaD10eXBlb2YgZi5pdGVtPT0iZnVuY3Rpb24ifHx0eXBlb2YgZi5pdGVtPT0ic3RyaW5nIjticmVhayBhfWlmKHR5cGVvZiBmPT09ImZ1bmN0aW9uIil7aD10eXBlb2YgZi5pdGVtPT0iZnVuY3Rpb24iO2JyZWFrIGF9fWg9ITF9d2EoaD95YShmKTpmLGQpfX19LFphPWZ1bmN0aW9uKGEsYil7Yj1TdHJpbmcoYik7YS5jb250ZW50VHlwZT09PSJhcHBsaWNhdGlvbi94aHRtbCt4bWwiJiYoYj1iLnRvTG93ZXJDYXNlKCkpO3JldHVybiBhLmNyZWF0ZUVsZW1lbnQoYil9LCRhPWZ1bmN0aW9uKGEpe2EmJmEucGFyZW50Tm9kZSYmCmEucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhKX0sYWI9ZnVuY3Rpb24oYSxiKXtpZighYXx8IWIpcmV0dXJuITE7aWYoYS5jb250YWlucyYmYi5ub2RlVHlwZT09MSlyZXR1cm4gYT09Ynx8YS5jb250YWlucyhiKTtpZih0eXBlb2YgYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiE9InVuZGVmaW5lZCIpcmV0dXJuIGE9PWJ8fCEhKGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24oYikmMTYpO2Zvcig7YiYmYSE9YjspYj1iLnBhcmVudE5vZGU7cmV0dXJuIGI9PWF9LGJiPWZ1bmN0aW9uKGEpe3AoYSwiTm9kZSBjYW5ub3QgYmUgbnVsbCBvciB1bmRlZmluZWQuIik7cmV0dXJuIGEubm9kZVR5cGU9PTk/YTphLm93bmVyRG9jdW1lbnR8fGEuZG9jdW1lbnR9LGNiPWZ1bmN0aW9uKGEsYil7Yj9hLnRhYkluZGV4PTA6KGEudGFiSW5kZXg9LTEsYS5yZW1vdmVBdHRyaWJ1dGUoInRhYkluZGV4IikpfSxkYj1mdW5jdGlvbihhKXtyZXR1cm4gYS5oYXNBdHRyaWJ1dGUoInRhYmluZGV4Iil9LGViPQpmdW5jdGlvbihhKXthPWEudGFiSW5kZXg7cmV0dXJuIHR5cGVvZiBhPT09Im51bWJlciImJmE+PTAmJmE8MzI3Njh9LGZiPWZ1bmN0aW9uKGEpe3RoaXMuZz1hfHxsLmRvY3VtZW50fHxkb2N1bWVudH07ZmIucHJvdG90eXBlLmk9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nO3JldHVybiB0eXBlb2YgYT09PSJzdHJpbmciP2IuZ2V0RWxlbWVudEJ5SWQoYSk6YX07ZmIucHJvdG90eXBlLmg9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXMuZyxlPWFyZ3VtZW50cyxmPWVbMV0saD1aYShkLFN0cmluZyhlWzBdKSk7ZiYmKHR5cGVvZiBmPT09InN0cmluZyI/aC5jbGFzc05hbWU9ZjpBcnJheS5pc0FycmF5KGYpP2guY2xhc3NOYW1lPWYuam9pbigiICIpOlhhKGgsZikpO2UubGVuZ3RoPjImJllhKGQsaCxlKTtyZXR1cm4gaH07dmFyIHc9ZnVuY3Rpb24oKXt0aGlzLmJhPXRoaXMuYmE7dGhpcy5rYT10aGlzLmthfTt3LnByb3RvdHlwZS5iYT0hMTt3LnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7dGhpcy5iYXx8KHRoaXMuYmE9ITAsdGhpcy5DKCkpfTt3LnByb3RvdHlwZVtTeW1ib2wuZGlzcG9zZV09ZnVuY3Rpb24oKXt0aGlzLmRpc3Bvc2UoKX07dy5wcm90b3R5cGUuQz1mdW5jdGlvbigpe2lmKHRoaXMua2EpZm9yKDt0aGlzLmthLmxlbmd0aDspdGhpcy5rYS5zaGlmdCgpKCl9O3ZhciB5PWZ1bmN0aW9uKGEsYil7dGhpcy50eXBlPWE7dGhpcy51PXRoaXMudGFyZ2V0PWI7dGhpcy5kZWZhdWx0UHJldmVudGVkPXRoaXMuQT0hMX07eS5wcm90b3R5cGUudj1mdW5jdGlvbigpe3RoaXMuQT0hMH07eS5wcm90b3R5cGUuaj1mdW5jdGlvbigpe3RoaXMuZGVmYXVsdFByZXZlbnRlZD0hMH07dmFyIGdiPWZ1bmN0aW9uKCl7aWYoIWwuYWRkRXZlbnRMaXN0ZW5lcnx8IU9iamVjdC5kZWZpbmVQcm9wZXJ0eSlyZXR1cm4hMTt2YXIgYT0hMSxiPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwicGFzc2l2ZSIse2dldDpmdW5jdGlvbigpe2E9ITB9fSk7dHJ5e3ZhciBjPWZ1bmN0aW9uKCl7fTtsLmFkZEV2ZW50TGlzdGVuZXIoInRlc3QiLGMsYik7bC5yZW1vdmVFdmVudExpc3RlbmVyKCJ0ZXN0IixjLGIpfWNhdGNoKGQpe31yZXR1cm4gYX0oKTt2YXIgej1mdW5jdGlvbihhLGIpe3kuY2FsbCh0aGlzLGE/YS50eXBlOiIiKTt0aGlzLnJlbGF0ZWRUYXJnZXQ9dGhpcy51PXRoaXMudGFyZ2V0PW51bGw7dGhpcy5idXR0b249dGhpcy5zY3JlZW5ZPXRoaXMuc2NyZWVuWD10aGlzLmNsaWVudFk9dGhpcy5jbGllbnRYPTA7dGhpcy5rZXk9IiI7dGhpcy5nPTA7dGhpcy5tZXRhS2V5PXRoaXMuc2hpZnRLZXk9dGhpcy5hbHRLZXk9dGhpcy5jdHJsS2V5PSExO3RoaXMuc3RhdGU9bnVsbDt0aGlzLkc9ITE7dGhpcy5wb2ludGVySWQ9MDt0aGlzLnBvaW50ZXJUeXBlPSIiO3RoaXMudGltZVN0YW1wPTA7dGhpcy5oPW51bGw7aWYoYSl7dmFyIGM9dGhpcy50eXBlPWEudHlwZSxkPWEuY2hhbmdlZFRvdWNoZXMmJmEuY2hhbmdlZFRvdWNoZXMubGVuZ3RoP2EuY2hhbmdlZFRvdWNoZXNbMF06bnVsbDt0aGlzLnRhcmdldD1hLnRhcmdldHx8YS5zcmNFbGVtZW50O3RoaXMudT1iO2I9YS5yZWxhdGVkVGFyZ2V0O2J8fChjPT0ibW91c2VvdmVyIj8KYj1hLmZyb21FbGVtZW50OmM9PSJtb3VzZW91dCImJihiPWEudG9FbGVtZW50KSk7dGhpcy5yZWxhdGVkVGFyZ2V0PWI7ZD8odGhpcy5jbGllbnRYPWQuY2xpZW50WCE9PXZvaWQgMD9kLmNsaWVudFg6ZC5wYWdlWCx0aGlzLmNsaWVudFk9ZC5jbGllbnRZIT09dm9pZCAwP2QuY2xpZW50WTpkLnBhZ2VZLHRoaXMuc2NyZWVuWD1kLnNjcmVlblh8fDAsdGhpcy5zY3JlZW5ZPWQuc2NyZWVuWXx8MCk6KHRoaXMuY2xpZW50WD1hLmNsaWVudFghPT12b2lkIDA/YS5jbGllbnRYOmEucGFnZVgsdGhpcy5jbGllbnRZPWEuY2xpZW50WSE9PXZvaWQgMD9hLmNsaWVudFk6YS5wYWdlWSx0aGlzLnNjcmVlblg9YS5zY3JlZW5YfHwwLHRoaXMuc2NyZWVuWT1hLnNjcmVlbll8fDApO3RoaXMuYnV0dG9uPWEuYnV0dG9uO3RoaXMuZz1hLmtleUNvZGV8fDA7dGhpcy5rZXk9YS5rZXl8fCIiO3RoaXMuY3RybEtleT1hLmN0cmxLZXk7dGhpcy5hbHRLZXk9YS5hbHRLZXk7dGhpcy5zaGlmdEtleT1hLnNoaWZ0S2V5Owp0aGlzLm1ldGFLZXk9YS5tZXRhS2V5O3RoaXMuRz12P2EubWV0YUtleTphLmN0cmxLZXk7dGhpcy5wb2ludGVySWQ9YS5wb2ludGVySWR8fDA7dGhpcy5wb2ludGVyVHlwZT1hLnBvaW50ZXJUeXBlO3RoaXMuc3RhdGU9YS5zdGF0ZTt0aGlzLnRpbWVTdGFtcD1hLnRpbWVTdGFtcDt0aGlzLmg9YTthLmRlZmF1bHRQcmV2ZW50ZWQmJnoubC5qLmNhbGwodGhpcyl9fTtuKHoseSk7ei5wcm90b3R5cGUudj1mdW5jdGlvbigpe3oubC52LmNhbGwodGhpcyk7dGhpcy5oLnN0b3BQcm9wYWdhdGlvbj90aGlzLmguc3RvcFByb3BhZ2F0aW9uKCk6dGhpcy5oLmNhbmNlbEJ1YmJsZT0hMH07ei5wcm90b3R5cGUuaj1mdW5jdGlvbigpe3oubC5qLmNhbGwodGhpcyk7dmFyIGE9dGhpcy5oO2EucHJldmVudERlZmF1bHQ/YS5wcmV2ZW50RGVmYXVsdCgpOmEucmV0dXJuVmFsdWU9ITF9O3ZhciBoYj0iY2xvc3VyZV9saXN0ZW5hYmxlXyIrKE1hdGgucmFuZG9tKCkqMUU2fDApLGliPWZ1bmN0aW9uKGEpe3JldHVybiEoIWF8fCFhW2hiXSl9O3ZhciBqYj0wO3ZhciBrYj1mdW5jdGlvbihhLGIsYyxkLGUpe3RoaXMubGlzdGVuZXI9YTt0aGlzLnByb3h5PW51bGw7dGhpcy5zcmM9Yjt0aGlzLnR5cGU9Yzt0aGlzLmNhcHR1cmU9ISFkO3RoaXMucGE9ZTt0aGlzLmtleT0rK2piO3RoaXMuamE9dGhpcy5vYT0hMX0sbGI9ZnVuY3Rpb24oYSl7YS5qYT0hMDthLmxpc3RlbmVyPW51bGw7YS5wcm94eT1udWxsO2Euc3JjPW51bGw7YS5wYT1udWxsfTt2YXIgbWI9ZnVuY3Rpb24oYSl7dGhpcy5zcmM9YTt0aGlzLmc9e307dGhpcy5oPTB9O21iLnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZj1hLnRvU3RyaW5nKCk7YT10aGlzLmdbZl07YXx8KGE9dGhpcy5nW2ZdPVtdLHRoaXMuaCsrKTt2YXIgaD1uYihhLGIsZCxlKTtoPi0xPyhiPWFbaF0sY3x8KGIub2E9ITEpKTooYj1uZXcga2IoYix0aGlzLnNyYyxmLCEhZCxlKSxiLm9hPWMsYS5wdXNoKGIpKTtyZXR1cm4gYn07CnZhciBvYj1mdW5jdGlvbihhLGIpe3ZhciBjPWIudHlwZTtjIGluIGEuZyYmeGEoYS5nW2NdLGIpJiYobGIoYiksYS5nW2NdLmxlbmd0aD09MCYmKGRlbGV0ZSBhLmdbY10sYS5oLS0pKX0scGI9ZnVuY3Rpb24oYSxiLGMsZCxlKXthPWEuZ1tiLnRvU3RyaW5nKCldO2I9LTE7YSYmKGI9bmIoYSxjLGQsZSkpO3JldHVybiBiPi0xP2FbYl06bnVsbH0sbmI9ZnVuY3Rpb24oYSxiLGMsZCl7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDsrK2Upe3ZhciBmPWFbZV07aWYoIWYuamEmJmYubGlzdGVuZXI9PWImJmYuY2FwdHVyZT09ISFjJiZmLnBhPT1kKXJldHVybiBlfXJldHVybi0xfTt2YXIgcWI9ImNsb3N1cmVfbG1fIisoTWF0aC5yYW5kb20oKSoxRTZ8MCkscmI9e30sc2I9MCx1Yj1mdW5jdGlvbihhLGIsYyxkLGUpe2lmKGQmJmQub25jZSlyZXR1cm4gdGIoYSxiLGMsZCxlKTtpZihBcnJheS5pc0FycmF5KGIpKXtmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKyl1YihhLGJbZl0sYyxkLGUpO3JldHVybiBudWxsfWM9dmIoYyk7cmV0dXJuIGliKGEpP3diKGEsYixjLG0oZCk/ISFkLmNhcHR1cmU6ISFkLGUpOnhiKGEsYixjLCExLGQsZSl9LHhiPWZ1bmN0aW9uKGEsYixjLGQsZSxmKXtpZighYil0aHJvdyBFcnJvcigiSW52YWxpZCBldmVudCB0eXBlIik7dmFyIGg9bShlKT8hIWUuY2FwdHVyZTohIWUsaz15YihhKTtrfHwoYVtxYl09az1uZXcgbWIoYSkpO2M9ay5hZGQoYixjLGQsaCxmKTtpZihjLnByb3h5KXJldHVybiBjO2Q9emIoKTtjLnByb3h5PWQ7ZC5zcmM9YTtkLmxpc3RlbmVyPWM7aWYoYS5hZGRFdmVudExpc3RlbmVyKWdifHwoZT1oKSxlPT09dm9pZCAwJiYKKGU9ITEpLGEuYWRkRXZlbnRMaXN0ZW5lcihiLnRvU3RyaW5nKCksZCxlKTtlbHNlIGlmKGEuYXR0YWNoRXZlbnQpYS5hdHRhY2hFdmVudChBYihiLnRvU3RyaW5nKCkpLGQpO2Vsc2UgaWYoYS5hZGRMaXN0ZW5lciYmYS5yZW1vdmVMaXN0ZW5lcilwKGI9PT0iY2hhbmdlIiwiTWVkaWFRdWVyeUxpc3Qgb25seSBoYXMgYSBjaGFuZ2UgZXZlbnQiKSxhLmFkZExpc3RlbmVyKGQpO2Vsc2UgdGhyb3cgRXJyb3IoImFkZEV2ZW50TGlzdGVuZXIgYW5kIGF0dGFjaEV2ZW50IGFyZSB1bmF2YWlsYWJsZS4iKTtzYisrO3JldHVybiBjfSx6Yj1mdW5jdGlvbigpe3ZhciBhPUJiLGI9ZnVuY3Rpb24oYyl7cmV0dXJuIGEuY2FsbChiLnNyYyxiLmxpc3RlbmVyLGMpfTtyZXR1cm4gYn0sdGI9ZnVuY3Rpb24oYSxiLGMsZCxlKXtpZihBcnJheS5pc0FycmF5KGIpKXtmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKyl0YihhLGJbZl0sYyxkLGUpO3JldHVybiBudWxsfWM9dmIoYyk7cmV0dXJuIGliKGEpPwphLkEuYWRkKFN0cmluZyhiKSxjLCEwLG0oZCk/ISFkLmNhcHR1cmU6ISFkLGUpOnhiKGEsYixjLCEwLGQsZSl9LENiPWZ1bmN0aW9uKGEsYixjLGQsZSl7aWYoQXJyYXkuaXNBcnJheShiKSlmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKylDYihhLGJbZl0sYyxkLGUpO2Vsc2UgZD1tKGQpPyEhZC5jYXB0dXJlOiEhZCxjPXZiKGMpLGliKGEpPyhhPWEuQSxiPVN0cmluZyhiKS50b1N0cmluZygpLGIgaW4gYS5nJiYoZj1hLmdbYl0sYz1uYihmLGMsZCxlKSxjPi0xJiYobGIoZltjXSkscChmLmxlbmd0aCE9bnVsbCksQXJyYXkucHJvdG90eXBlLnNwbGljZS5jYWxsKGYsYywxKSxmLmxlbmd0aD09MCYmKGRlbGV0ZSBhLmdbYl0sYS5oLS0pKSkpOmEmJihhPXliKGEpKSYmKGM9cGIoYSxiLGMsZCxlKSkmJkEoYyl9LEE9ZnVuY3Rpb24oYSl7aWYodHlwZW9mIGEhPT0ibnVtYmVyIiYmYSYmIWEuamEpe3ZhciBiPWEuc3JjO2lmKGliKGIpKW9iKGIuQSxhKTtlbHNle3ZhciBjPWEudHlwZSwKZD1hLnByb3h5O2IucmVtb3ZlRXZlbnRMaXN0ZW5lcj9iLnJlbW92ZUV2ZW50TGlzdGVuZXIoYyxkLGEuY2FwdHVyZSk6Yi5kZXRhY2hFdmVudD9iLmRldGFjaEV2ZW50KEFiKGMpLGQpOmIuYWRkTGlzdGVuZXImJmIucmVtb3ZlTGlzdGVuZXImJmIucmVtb3ZlTGlzdGVuZXIoZCk7c2ItLTsoYz15YihiKSk/KG9iKGMsYSksYy5oPT0wJiYoYy5zcmM9bnVsbCxiW3FiXT1udWxsKSk6bGIoYSl9fX0sQWI9ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW4gcmI/cmJbYV06cmJbYV09Im9uIithfSxCYj1mdW5jdGlvbihhLGIpe2lmKGEuamEpYT0hMDtlbHNle2I9bmV3IHooYix0aGlzKTt2YXIgYz1hLmxpc3RlbmVyLGQ9YS5wYXx8YS5zcmM7YS5vYSYmQShhKTthPWMuY2FsbChkLGIpfXJldHVybiBhfSx5Yj1mdW5jdGlvbihhKXthPWFbcWJdO3JldHVybiBhIGluc3RhbmNlb2YgbWI/YTpudWxsfSxEYj0iX19jbG9zdXJlX2V2ZW50c19mbl8iKyhNYXRoLnJhbmRvbSgpKjFFOT4+PjApLHZiPWZ1bmN0aW9uKGEpe3AoYSwKIkxpc3RlbmVyIGNhbiBub3QgYmUgbnVsbC4iKTtpZih0eXBlb2YgYT09PSJmdW5jdGlvbiIpcmV0dXJuIGE7cChhLmhhbmRsZUV2ZW50LCJBbiBvYmplY3QgbGlzdGVuZXIgbXVzdCBoYXZlIGhhbmRsZUV2ZW50IG1ldGhvZC4iKTthW0RiXXx8KGFbRGJdPWZ1bmN0aW9uKGIpe3JldHVybiBhLmhhbmRsZUV2ZW50KGIpfSk7cmV0dXJuIGFbRGJdfTt2YXIgRWI9ZnVuY3Rpb24oYSl7dy5jYWxsKHRoaXMpO3RoaXMuaD1hO3RoaXMuZz17fX07bihFYix3KTsKdmFyIEZiPVtdLEI9ZnVuY3Rpb24oYSxiLGMsZCl7QXJyYXkuaXNBcnJheShjKXx8KGMmJihGYlswXT1jLnRvU3RyaW5nKCkpLGM9RmIpO2Zvcih2YXIgZT0wO2U8Yy5sZW5ndGg7ZSsrKXt2YXIgZj11YihiLGNbZV0sZHx8YS5oYW5kbGVFdmVudCwhMSxhLmh8fGEpO2lmKCFmKWJyZWFrO2EuZ1tmLmtleV09Zn1yZXR1cm4gYX0sQz1mdW5jdGlvbihhLGIsYyxkLGUsZil7aWYoQXJyYXkuaXNBcnJheShjKSlmb3IodmFyIGg9MDtoPGMubGVuZ3RoO2grKylDKGEsYixjW2hdLGQsZSxmKTtlbHNlIGQ9ZHx8YS5oYW5kbGVFdmVudCxlPW0oZSk/ISFlLmNhcHR1cmU6ISFlLGY9Znx8YS5ofHxhLGQ9dmIoZCksZT0hIWUsYz1pYihiKT9wYihiLkEsU3RyaW5nKGMpLGQsZSxmKTpiPyhiPXliKGIpKT9wYihiLGMsZCxlLGYpOm51bGw6bnVsbCxjJiYoQShjKSxkZWxldGUgYS5nW2Mua2V5XSk7cmV0dXJuIGF9LEdiPWZ1bmN0aW9uKGEpe0JhKGEuZyxmdW5jdGlvbihiLGMpe3RoaXMuZy5oYXNPd25Qcm9wZXJ0eShjKSYmCkEoYil9LGEpO2EuZz17fX07RWIucHJvdG90eXBlLkM9ZnVuY3Rpb24oKXtFYi5sLkMuY2FsbCh0aGlzKTtHYih0aGlzKX07RWIucHJvdG90eXBlLmhhbmRsZUV2ZW50PWZ1bmN0aW9uKCl7dGhyb3cgRXJyb3IoIkV2ZW50SGFuZGxlci5oYW5kbGVFdmVudCBub3QgaW1wbGVtZW50ZWQiKTt9O3ZhciBEPWZ1bmN0aW9uKCl7dy5jYWxsKHRoaXMpO3RoaXMuQT1uZXcgbWIodGhpcyk7dGhpcy5ZYT10aGlzO3RoaXMubGE9bnVsbH07bihELHcpO0QucHJvdG90eXBlW2hiXT0hMDtELnByb3RvdHlwZS5BYT1mdW5jdGlvbihhKXt0aGlzLmxhPWF9O0QucHJvdG90eXBlLnJlbW92ZUV2ZW50TGlzdGVuZXI9ZnVuY3Rpb24oYSxiLGMsZCl7Q2IodGhpcyxhLGIsYyxkKX07CnZhciBFPWZ1bmN0aW9uKGEsYil7SGIoYSk7dmFyIGM9YS5sYTtpZihjKXt2YXIgZD1bXTtmb3IodmFyIGU9MTtjO2M9Yy5sYSlkLnB1c2goYykscCgrK2U8MUUzLCJpbmZpbml0ZSBsb29wIil9YT1hLllhO2M9Yi50eXBlfHxiO3R5cGVvZiBiPT09InN0cmluZyI/Yj1uZXcgeShiLGEpOmIgaW5zdGFuY2VvZiB5P2IudGFyZ2V0PWIudGFyZ2V0fHxhOihlPWIsYj1uZXcgeShjLGEpLEdhKGIsZSkpO2U9ITA7dmFyIGY7aWYoZClmb3IoZj1kLmxlbmd0aC0xOyFiLkEmJmY+PTA7Zi0tKXt2YXIgaD1iLnU9ZFtmXTtlPUliKGgsYywhMCxiKSYmZX1iLkF8fChoPWIudT1hLGU9SWIoaCxjLCEwLGIpJiZlLGIuQXx8KGU9SWIoaCxjLCExLGIpJiZlKSk7aWYoZClmb3IoZj0wOyFiLkEmJmY8ZC5sZW5ndGg7ZisrKWg9Yi51PWRbZl0sZT1JYihoLGMsITEsYikmJmU7cmV0dXJuIGV9OwpELnByb3RvdHlwZS5DPWZ1bmN0aW9uKCl7RC5sLkMuY2FsbCh0aGlzKTtpZih0aGlzLkEpe3ZhciBhPXRoaXMuQSxiPTAsYztmb3IoYyBpbiBhLmcpe2Zvcih2YXIgZD1hLmdbY10sZT0wO2U8ZC5sZW5ndGg7ZSsrKSsrYixsYihkW2VdKTtkZWxldGUgYS5nW2NdO2EuaC0tfX10aGlzLmxhPW51bGx9O3ZhciB3Yj1mdW5jdGlvbihhLGIsYyxkLGUpe0hiKGEpO3JldHVybiBhLkEuYWRkKFN0cmluZyhiKSxjLCExLGQsZSl9LEliPWZ1bmN0aW9uKGEsYixjLGQpe2I9YS5BLmdbU3RyaW5nKGIpXTtpZighYilyZXR1cm4hMDtiPWIuY29uY2F0KCk7Zm9yKHZhciBlPSEwLGY9MDtmPGIubGVuZ3RoOysrZil7dmFyIGg9YltmXTtpZihoJiYhaC5qYSYmaC5jYXB0dXJlPT1jKXt2YXIgaz1oLmxpc3RlbmVyLHE9aC5wYXx8aC5zcmM7aC5vYSYmb2IoYS5BLGgpO2U9ay5jYWxsKHEsZCkhPT0hMSYmZX19cmV0dXJuIGUmJiFkLmRlZmF1bHRQcmV2ZW50ZWR9LEhiPWZ1bmN0aW9uKGEpe3AoYS5BLCJFdmVudCB0YXJnZXQgaXMgbm90IGluaXRpYWxpemVkLiBEaWQgeW91IGNhbGwgdGhlIHN1cGVyY2xhc3MgKGdvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0KSBjb25zdHJ1Y3Rvcj8iKX07dmFyIEpiPXQ/Ik1velVzZXJTZWxlY3QiOnV8fFZhPyJXZWJraXRVc2VyU2VsZWN0IjpudWxsLEtiPWZ1bmN0aW9uKGEsYil7Yj1iP251bGw6YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpO2lmKEpiJiYoYS5zdHlsZSYmKGEuc3R5bGVbSmJdPSJub25lIiksYikpZm9yKHZhciBjPTA7YT1iW2NdO2MrKylhLnN0eWxlJiYoYS5zdHlsZVtKYl09Im5vbmUiKX07dmFyIExiPWZ1bmN0aW9uKCl7fTtpYShMYik7TGIucHJvdG90eXBlLmc9MDt2YXIgRj1mdW5jdGlvbihhKXtELmNhbGwodGhpcyk7dGhpcy5HPWF8fHBhfHwocGE9bmV3IGZiKTt0aGlzLnphPU1iO3RoaXMuWT1udWxsO3RoaXMucz0hMTt0aGlzLmc9bnVsbDt0aGlzLk09dm9pZCAwO3RoaXMudT10aGlzLmo9dGhpcy5oPW51bGw7dGhpcy5TYT0hMX07bihGLEQpO0YucHJvdG90eXBlLlphPUxiLlYoKTsKdmFyIE1iPW51bGwsTmI9ZnVuY3Rpb24oYSxiKXtzd2l0Y2goYSl7Y2FzZSAxOnJldHVybiBiPyJkaXNhYmxlIjoiZW5hYmxlIjtjYXNlIDI6cmV0dXJuIGI/ImhpZ2hsaWdodCI6InVuaGlnaGxpZ2h0IjtjYXNlIDQ6cmV0dXJuIGI/ImFjdGl2YXRlIjoiZGVhY3RpdmF0ZSI7Y2FzZSA4OnJldHVybiBiPyJzZWxlY3QiOiJ1bnNlbGVjdCI7Y2FzZSAxNjpyZXR1cm4gYj8iY2hlY2siOiJ1bmNoZWNrIjtjYXNlIDMyOnJldHVybiBiPyJmb2N1cyI6ImJsdXIiO2Nhc2UgNjQ6cmV0dXJuIGI/Im9wZW4iOiJjbG9zZSJ9dGhyb3cgRXJyb3IoIkludmFsaWQgY29tcG9uZW50IHN0YXRlIik7fSxPYj1mdW5jdGlvbihhKXtyZXR1cm4gYS5ZfHwoYS5ZPSI6IisoYS5aYS5nKyspLnRvU3RyaW5nKDM2KSl9LFBiPWZ1bmN0aW9uKGEsYil7aWYoYS5oJiZhLmgudSl7dmFyIGM9YS5oLnUsZD1hLlk7ZCBpbiBjJiZkZWxldGUgY1tkXTtEYShhLmgudSxiLGEpfWEuWT1ifTtGLnByb3RvdHlwZS5pPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ307CnZhciBRYj1mdW5jdGlvbihhKXthLk18fChhLk09bmV3IEViKGEpKTtyZXR1cm4gcChhLk0pfTtGLnByb3RvdHlwZS5BYT1mdW5jdGlvbihhKXtpZih0aGlzLmgmJnRoaXMuaCE9YSl0aHJvdyBFcnJvcigiTWV0aG9kIG5vdCBzdXBwb3J0ZWQiKTtGLmwuQWEuY2FsbCh0aGlzLGEpfTtGLnByb3RvdHlwZS5tYT1mdW5jdGlvbigpe3RoaXMuZz1aYSh0aGlzLkcuZywiRElWIil9O0YucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbihhKXtSYih0aGlzLGEpfTsKdmFyIFJiPWZ1bmN0aW9uKGEsYixjKXtpZihhLnMpdGhyb3cgRXJyb3IoIkNvbXBvbmVudCBhbHJlYWR5IHJlbmRlcmVkIik7YS5nfHxhLm1hKCk7Yj9iLmluc2VydEJlZm9yZShhLmcsY3x8bnVsbCk6YS5HLmcuYm9keS5hcHBlbmRDaGlsZChhLmcpO2EuaCYmIWEuaC5zfHxhLkkoKX0sU2I9ZnVuY3Rpb24oYSxiKXtpZihhLnMpdGhyb3cgRXJyb3IoIkNvbXBvbmVudCBhbHJlYWR5IHJlbmRlcmVkIik7aWYoYiYmYS53YShiKSl7YS5TYT0hMDt2YXIgYz1iYihiKTthLkcmJmEuRy5nPT1jfHwoYS5HPWI/bmV3IGZiKGJiKGIpKTpwYXx8KHBhPW5ldyBmYikpO2EuRWEoYik7YS5JKCl9ZWxzZSB0aHJvdyBFcnJvcigiSW52YWxpZCBlbGVtZW50IHRvIGRlY29yYXRlIik7fTtnPUYucHJvdG90eXBlO2cud2E9ZnVuY3Rpb24oKXtyZXR1cm4hMH07Zy5FYT1mdW5jdGlvbihhKXt0aGlzLmc9YX07CmcuST1mdW5jdGlvbigpe3RoaXMucz0hMDtUYih0aGlzLGZ1bmN0aW9uKGEpeyFhLnMmJmEuaSgpJiZhLkkoKX0pfTtnLlU9ZnVuY3Rpb24oKXtUYih0aGlzLGZ1bmN0aW9uKGEpe2EucyYmYS5VKCl9KTt0aGlzLk0mJkdiKHRoaXMuTSk7dGhpcy5zPSExfTtnLkM9ZnVuY3Rpb24oKXt0aGlzLnMmJnRoaXMuVSgpO3RoaXMuTSYmKHRoaXMuTS5kaXNwb3NlKCksZGVsZXRlIHRoaXMuTSk7VGIodGhpcyxmdW5jdGlvbihhKXthLmRpc3Bvc2UoKX0pOyF0aGlzLlNhJiZ0aGlzLmcmJiRhKHRoaXMuZyk7dGhpcy5oPXRoaXMuZz10aGlzLnU9dGhpcy5qPW51bGw7Ri5sLkMuY2FsbCh0aGlzKX07Zy5CYT1mdW5jdGlvbihhLGIpe3RoaXMuQ2EoYSxIKHRoaXMpLGIpfTsKZy5DYT1mdW5jdGlvbihhLGIsYyl7cCghIWEsIlByb3ZpZGVkIGVsZW1lbnQgbXVzdCBub3QgYmUgbnVsbC4iKTtpZihhLnMmJihjfHwhdGhpcy5zKSl0aHJvdyBFcnJvcigiQ29tcG9uZW50IGFscmVhZHkgcmVuZGVyZWQiKTtpZihiPDB8fGI+SCh0aGlzKSl0aHJvdyBFcnJvcigiQ2hpbGQgY29tcG9uZW50IGluZGV4IG91dCBvZiBib3VuZHMiKTt0aGlzLnUmJnRoaXMuanx8KHRoaXMudT17fSx0aGlzLmo9W10pO2lmKGEuaD09dGhpcyl7dmFyIGQ9dGhpcy51LGU9T2IoYSk7ZFtlXT1hO3hhKHRoaXMuaixhKX1lbHNlIERhKHRoaXMudSxPYihhKSxhKTtpZihhPT10aGlzKXRocm93IEVycm9yKCJVbmFibGUgdG8gc2V0IHBhcmVudCBjb21wb25lbnQiKTtpZihkPXRoaXMmJmEuaCYmYS5ZKWU9YS5oLGQ9YS5ZLGUudSYmZD8oZT1lLnUsZD0oZSE9PW51bGwmJmQgaW4gZT9lW2RdOnZvaWQgMCl8fG51bGwpOmQ9bnVsbDtpZihkJiZhLmghPXRoaXMpdGhyb3cgRXJyb3IoIlVuYWJsZSB0byBzZXQgcGFyZW50IGNvbXBvbmVudCIpOwphLmg9dGhpcztGLmwuQWEuY2FsbChhLHRoaXMpO3phKHRoaXMuaixiLDAsYSk7YS5zJiZ0aGlzLnMmJmEuaD09dGhpcz8oYz10aGlzLm5hKCksKGMuY2hpbGROb2Rlc1tiXXx8bnVsbCkhPWEuaSgpJiYoYS5pKCkucGFyZW50RWxlbWVudD09YyYmYy5yZW1vdmVDaGlsZChhLmkoKSksYj1jLmNoaWxkTm9kZXNbYl18fG51bGwsYy5pbnNlcnRCZWZvcmUoYS5pKCksYikpKTpjPyh0aGlzLmd8fHRoaXMubWEoKSxiPUkodGhpcyxiKzEpLFJiKGEsdGhpcy5uYSgpLGI/Yi5nOm51bGwpKTp0aGlzLnMmJiFhLnMmJmEuZyYmYS5nLnBhcmVudE5vZGUmJmEuZy5wYXJlbnROb2RlLm5vZGVUeXBlPT0xJiZhLkkoKX07Zy5uYT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmd9Owp2YXIgVWI9ZnVuY3Rpb24oYSl7aWYoYS56YT09bnVsbCl7dmFyIGI9YS5zP2EuZzphLkcuZy5ib2R5O2E6e3ZhciBjPWJiKGIpO2lmKGMuZGVmYXVsdFZpZXcmJmMuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSYmKGM9Yy5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKGIsbnVsbCkpKXtjPWMuZGlyZWN0aW9ufHxjLmdldFByb3BlcnR5VmFsdWUoImRpcmVjdGlvbiIpfHwiIjticmVhayBhfWM9IiJ9YS56YT0icnRsIj09KGN8fChiLmN1cnJlbnRTdHlsZT9iLmN1cnJlbnRTdHlsZS5kaXJlY3Rpb246bnVsbCl8fGIuc3R5bGUmJmIuc3R5bGUuZGlyZWN0aW9uKX1yZXR1cm4gYS56YX0sSD1mdW5jdGlvbihhKXtyZXR1cm4gYS5qP2Euai5sZW5ndGg6MH0sST1mdW5jdGlvbihhLGIpe3JldHVybiBhLmo/YS5qW2JdfHxudWxsOm51bGx9LFRiPWZ1bmN0aW9uKGEsYixjKXthLmomJmEuai5mb3JFYWNoKGIsYyl9LFZiPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuaiYmYj9hLmouaW5kZXhPZihiKToKLTF9O3ZhciBXYj17bWI6ImFjdGl2ZWRlc2NlbmRhbnQiLHJiOiJhdG9taWMiLHNiOiJhdXRvY29tcGxldGUiLHViOiJidXN5Iix4YjoiY2hlY2tlZCIseWI6ImNvbGluZGV4IixEYjoiY29udHJvbHMiLEViOiJjdXJyZW50IixHYjoiZGVzY3JpYmVkYnkiLEpiOiJkaXNhYmxlZCIsTGI6ImRyb3BlZmZlY3QiLE1iOiJleHBhbmRlZCIsTmI6ImZsb3d0byIsUGI6ImdyYWJiZWQiLFRiOiJoYXNwb3B1cCIsVmI6ImhpZGRlbiIsWGI6ImludmFsaWQiLFliOiJsYWJlbCIsWmI6ImxhYmVsbGVkYnkiLGFjOiJsZXZlbCIsZmM6ImxpdmUiLHZjOiJtdWx0aWxpbmUiLHdjOiJtdWx0aXNlbGVjdGFibGUiLEFjOiJvcmllbnRhdGlvbiIsQmM6Im93bnMiLENjOiJwb3NpbnNldCIsRWM6InByZXNzZWQiLEljOiJyZWFkb25seSIsS2M6InJlbGV2YW50IixMYzoicmVxdWlyZWQiLFBjOiJyb3dpbmRleCIsU2M6InNlbGVjdGVkIixVYzoic2V0c2l6ZSIsV2M6InNvcnQiLG1kOiJ2YWx1ZW1heCIsbmQ6InZhbHVlbWluIiwKb2Q6InZhbHVlbm93IixwZDoidmFsdWV0ZXh0In07dmFyIFhiO3ZhciBZYj17bmI6ImFsZXJ0IixvYjoiYWxlcnRkaWFsb2ciLHBiOiJhcHBsaWNhdGlvbiIscWI6ImFydGljbGUiLHRiOiJiYW5uZXIiLHZiOiJidXR0b24iLHdiOiJjaGVja2JveCIsemI6ImNvbHVtbmhlYWRlciIsQWI6ImNvbWJvYm94IixCYjoiY29tcGxlbWVudGFyeSIsQ2I6ImNvbnRlbnRpbmZvIixGYjoiZGVmaW5pdGlvbiIsSGI6ImRpYWxvZyIsSWI6ImRpcmVjdG9yeSIsS2I6ImRvY3VtZW50IixPYjoiZm9ybSIsUWI6ImdyaWQiLFJiOiJncmlkY2VsbCIsU2I6Imdyb3VwIixVYjoiaGVhZGluZyIsV2I6ImltZyIsYmM6ImxpbmsiLGNjOiJsaXN0IixkYzoibGlzdGJveCIsZWM6Imxpc3RpdGVtIixoYzoibG9nIixpYzoibWFpbiIsamM6Im1hcnF1ZWUiLGtjOiJtYXRoIixsYzoibWVudSIsbWM6Im1lbnViYXIiLG5jOiJtZW51aXRlbSIsb2M6Im1lbnVpdGVtY2hlY2tib3giLHBjOiJtZW51aXRlbXJhZGlvIix4YzoibmF2aWdhdGlvbiIseWM6Im5vdGUiLHpjOiJvcHRpb24iLApEYzoicHJlc2VudGF0aW9uIixGYzoicHJvZ3Jlc3NiYXIiLEdjOiJyYWRpbyIsSGM6InJhZGlvZ3JvdXAiLEpjOiJyZWdpb24iLE1jOiJyb3ciLE5jOiJyb3dncm91cCIsT2M6InJvd2hlYWRlciIsUWM6InNjcm9sbGJhciIsUmM6InNlYXJjaCIsVGM6InNlcGFyYXRvciIsVmM6InNsaWRlciIsWGM6InNwaW5idXR0b24iLFljOiJzdGF0dXMiLFpjOiJzd2l0Y2giLGFkOiJ0YWIiLGJkOiJ0YWJsaXN0IixjZDoidGFicGFuZWwiLGRkOiJ0ZXh0Ym94IixlZDoidGV4dGluZm8iLGZkOiJ0aW1lciIsZ2Q6InRvb2xiYXIiLGhkOiJ0b29sdGlwIixqZDoidHJlZSIsa2Q6InRyZWVncmlkIixsZDoidHJlZWl0ZW0ifTt2YXIgWmI9ZnVuY3Rpb24oYSxiKXtiPyhwKENhKFliLGIpLCJObyBzdWNoIEFSSUEgcm9sZSAiK2IpLGEuc2V0QXR0cmlidXRlKCJyb2xlIixiKSk6YS5yZW1vdmVBdHRyaWJ1dGUoInJvbGUiKX0sYWM9ZnVuY3Rpb24oYSxiLGMpe0FycmF5LmlzQXJyYXkoYykmJihjPWMuam9pbigiICIpKTt2YXIgZD0kYihiKTtjPT09IiJ8fGM9PXZvaWQgMD8oWGJ8fChjPXt9LFhiPShjLmF0b21pYz0hMSxjLmF1dG9jb21wbGV0ZT0ibm9uZSIsYy5kcm9wZWZmZWN0PSJub25lIixjLmhhc3BvcHVwPSExLGMubGl2ZT0ib2ZmIixjLm11bHRpbGluZT0hMSxjLm11bHRpc2VsZWN0YWJsZT0hMSxjLm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIsYy5yZWFkb25seT0hMSxjLnJlbGV2YW50PSJhZGRpdGlvbnMgdGV4dCIsYy5yZXF1aXJlZD0hMSxjLnNvcnQ9Im5vbmUiLGMuYnVzeT0hMSxjLmRpc2FibGVkPSExLGMuaGlkZGVuPSExLGMuaW52YWxpZD0iZmFsc2UiLGMpKSxjPVhiLGIgaW4gYz9hLnNldEF0dHJpYnV0ZShkLApjW2JdKTphLnJlbW92ZUF0dHJpYnV0ZShkKSk6YS5zZXRBdHRyaWJ1dGUoZCxjKX0sJGI9ZnVuY3Rpb24oYSl7cChhLCJBUklBIGF0dHJpYnV0ZSBjYW5ub3QgYmUgZW1wdHkuIik7cChDYShXYixhKSwiTm8gc3VjaCBBUklBIGF0dHJpYnV0ZSAiK2EpO3JldHVybiJhcmlhLSIrYX07dmFyIGRjPWZ1bmN0aW9uKGEsYixjLGQsZSxmKXtpZih2JiZlKXJldHVybiBiYyhhKTtpZihlJiYhZClyZXR1cm4hMTtpZighdCl7dHlwZW9mIGI9PT0ibnVtYmVyIiYmKGI9Y2MoYikpO3ZhciBoPWI9PTE3fHxiPT0xOHx8diYmYj09OTE7aWYoKCFjfHx2KSYmaHx8diYmYj09MTYmJihkfHxmKSlyZXR1cm4hMX1pZih1JiZkJiZjKXN3aXRjaChhKXtjYXNlIDIyMDpjYXNlIDIxOTpjYXNlIDIyMTpjYXNlIDE5MjpjYXNlIDE4NjpjYXNlIDE4OTpjYXNlIDE4NzpjYXNlIDE4ODpjYXNlIDE5MDpjYXNlIDE5MTpjYXNlIDE5MjpjYXNlIDIyMjpyZXR1cm4hMX1zd2l0Y2goYSl7Y2FzZSAxMzpyZXR1cm4gdD9mfHxlPyExOiEoYyYmZCk6ITA7Y2FzZSAyNzpyZXR1cm4hdSYmIXR9cmV0dXJuIHQmJihkfHxlfHxmKT8hMTpiYyhhKX0sYmM9ZnVuY3Rpb24oYSl7aWYoYT49NDgmJmE8PTU3fHxhPj05NiYmYTw9MTA2fHxhPj02NSYmYTw9OTB8fHUmJmE9PTApcmV0dXJuITA7c3dpdGNoKGEpe2Nhc2UgMzI6Y2FzZSA0MzpjYXNlIDYzOmNhc2UgNjQ6Y2FzZSAxMDc6Y2FzZSAxMDk6Y2FzZSAxMTA6Y2FzZSAxMTE6Y2FzZSAxODY6Y2FzZSA1OTpjYXNlIDE4OTpjYXNlIDE4NzpjYXNlIDYxOmNhc2UgMTg4OmNhc2UgMTkwOmNhc2UgMTkxOmNhc2UgMTkyOmNhc2UgMjIyOmNhc2UgMjE5OmNhc2UgMjIwOmNhc2UgMjIxOmNhc2UgMTYzOmNhc2UgNTg6cmV0dXJuITA7CmNhc2UgMTczOmNhc2UgMTcxOnJldHVybiB0O2RlZmF1bHQ6cmV0dXJuITF9fSxjYz1mdW5jdGlvbihhKXtpZih0KWE9ZWMoYSk7ZWxzZSBpZih2JiZ1KXN3aXRjaChhKXtjYXNlIDkzOmE9OTF9cmV0dXJuIGF9LGVjPWZ1bmN0aW9uKGEpe3N3aXRjaChhKXtjYXNlIDYxOnJldHVybiAxODc7Y2FzZSA1OTpyZXR1cm4gMTg2O2Nhc2UgMTczOnJldHVybiAxODk7Y2FzZSAyMjQ6cmV0dXJuIDkxO2Nhc2UgMDpyZXR1cm4gMjI0O2RlZmF1bHQ6cmV0dXJuIGF9fTt2YXIgZmM9ZnVuY3Rpb24oYSxiLGMsZCl7ei5jYWxsKHRoaXMsZCk7dGhpcy50eXBlPSJrZXkiO3RoaXMuZz1hO3RoaXMucmVwZWF0PWN9O24oZmMseik7dmFyIEo9ZnVuY3Rpb24oYSxiKXtELmNhbGwodGhpcyk7YSYmZ2ModGhpcyxhLGIpfTtuKEosRCk7Zz1KLnByb3RvdHlwZTtnLlI9bnVsbDtnLnFhPW51bGw7Zy5KYT1udWxsO2cucmE9bnVsbDtnLkY9LTE7Zy5LPS0xO2cuRGE9ITE7CnZhciBoYz17MzoxMywxMjoxNDQsNjMyMzI6MzgsNjMyMzM6NDAsNjMyMzQ6MzcsNjMyMzU6MzksNjMyMzY6MTEyLDYzMjM3OjExMyw2MzIzODoxMTQsNjMyMzk6MTE1LDYzMjQwOjExNiw2MzI0MToxMTcsNjMyNDI6MTE4LDYzMjQzOjExOSw2MzI0NDoxMjAsNjMyNDU6MTIxLDYzMjQ2OjEyMiw2MzI0NzoxMjMsNjMyNDg6NDQsNjMyNzI6NDYsNjMyNzM6MzYsNjMyNzU6MzUsNjMyNzY6MzMsNjMyNzc6MzQsNjMyODk6MTQ0LDYzMzAyOjQ1fSxpYz17VXA6MzgsRG93bjo0MCxMZWZ0OjM3LFJpZ2h0OjM5LEVudGVyOjEzLEYxOjExMixGMjoxMTMsRjM6MTE0LEY0OjExNSxGNToxMTYsRjY6MTE3LEY3OjExOCxGODoxMTksRjk6MTIwLEYxMDoxMjEsRjExOjEyMixGMTI6MTIzLCJVKzAwN0YiOjQ2LEhvbWU6MzYsRW5kOjM1LFBhZ2VVcDozMyxQYWdlRG93bjozNCxJbnNlcnQ6NDV9LGpjPXYmJnQ7CkoucHJvdG90eXBlLmc9ZnVuY3Rpb24oYSl7dSYmKHRoaXMuRj09MTcmJiFhLmN0cmxLZXl8fHRoaXMuRj09MTgmJiFhLmFsdEtleXx8diYmdGhpcy5GPT05MSYmIWEubWV0YUtleSkmJih0aGlzLks9dGhpcy5GPS0xKTt0aGlzLkY9PS0xJiYoYS5jdHJsS2V5JiZhLmchPTE3P3RoaXMuRj0xNzphLmFsdEtleSYmYS5nIT0xOD90aGlzLkY9MTg6YS5tZXRhS2V5JiZhLmchPTkxJiYodGhpcy5GPTkxKSk7ZGMoYS5nLHRoaXMuRixhLnNoaWZ0S2V5LGEuY3RybEtleSxhLmFsdEtleSxhLm1ldGFLZXkpPyh0aGlzLks9Y2MoYS5nKSxqYyYmKHRoaXMuRGE9YS5hbHRLZXkpKTp0aGlzLmhhbmRsZUV2ZW50KGEpfTtKLnByb3RvdHlwZS5oPWZ1bmN0aW9uKGEpe3RoaXMuSz10aGlzLkY9LTE7dGhpcy5EYT1hLmFsdEtleX07CkoucHJvdG90eXBlLmhhbmRsZUV2ZW50PWZ1bmN0aW9uKGEpe3ZhciBiPWEuaCxjPWIuYWx0S2V5O2lmKHUmJmEudHlwZT09ImtleXByZXNzIil7dmFyIGQ9dGhpcy5LO3ZhciBlPWIuY2hhckNvZGU+PTAmJmIuY2hhckNvZGU8NjMyMzImJmJjKGQpP2IuY2hhckNvZGU6MH1lbHNlIGEudHlwZT09ImtleXByZXNzIj8oamMmJihjPXRoaXMuRGEpLGIua2V5Q29kZT09Yi5jaGFyQ29kZT9iLmtleUNvZGU8MzI/KGQ9Yi5rZXlDb2RlLGU9MCk6KGQ9dGhpcy5LLGU9Yi5jaGFyQ29kZSk6KGQ9Yi5rZXlDb2RlfHx0aGlzLkssZT1iLmNoYXJDb2RlfHwwKSk6KGQ9Yi5rZXlDb2RlfHx0aGlzLkssZT1iLmNoYXJDb2RlfHwwKSx2JiZlPT02MyYmZD09MjI0JiYoZD0xOTEpO3ZhciBmPWQ9Y2MoZCk7ZD9kPj02MzIzMiYmZCBpbiBoYz9mPWhjW2RdOmQ9PTI1JiZhLnNoaWZ0S2V5JiYoZj05KTpiLmtleUlkZW50aWZpZXImJmIua2V5SWRlbnRpZmllciBpbiBpYyYmKGY9aWNbYi5rZXlJZGVudGlmaWVyXSk7CmlmKCF0fHxhLnR5cGUhPSJrZXlwcmVzcyJ8fGRjKGYsdGhpcy5GLGEuc2hpZnRLZXksYS5jdHJsS2V5LGMsYS5tZXRhS2V5KSlhPWY9PXRoaXMuRix0aGlzLkY9ZixiPW5ldyBmYyhmLGUsYSxiKSxiLmFsdEtleT1jLEUodGhpcyxiKX07Si5wcm90b3R5cGUuaT1mdW5jdGlvbigpe3JldHVybiB0aGlzLlJ9O3ZhciBnYz1mdW5jdGlvbihhLGIsYyl7YS5yYSYma2MoYSk7YS5SPWI7YS5xYT11YihhLlIsImtleXByZXNzIixhLGMpO2EuSmE9dWIoYS5SLCJrZXlkb3duIixhLmcsYyxhKTthLnJhPXViKGEuUiwia2V5dXAiLGEuaCxjLGEpfSxrYz1mdW5jdGlvbihhKXthLnFhJiYoQShhLnFhKSxBKGEuSmEpLEEoYS5yYSksYS5xYT1udWxsLGEuSmE9bnVsbCxhLnJhPW51bGwpO2EuUj1udWxsO2EuRj0tMTthLks9LTF9O0oucHJvdG90eXBlLkM9ZnVuY3Rpb24oKXtKLmwuQy5jYWxsKHRoaXMpO2tjKHRoaXMpfTt2YXIgSz17Z2E6Im1vdXNlZG93biIsaGE6Im1vdXNldXAiLGZhOiJtb3VzZWNhbmNlbCIsc2M6Im1vdXNlbW92ZSIsdWM6Im1vdXNlb3ZlciIsdGM6Im1vdXNlb3V0IixxYzoibW91c2VlbnRlciIscmM6Im1vdXNlbGVhdmUifTt2YXIgbGM9ZnVuY3Rpb24oYSl7cmV0dXJuIHR5cGVvZiBhLmNsYXNzTmFtZT09InN0cmluZyI/YS5jbGFzc05hbWU6YS5nZXRBdHRyaWJ1dGUmJmEuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIn0sTD1mdW5jdGlvbihhKXtyZXR1cm4gYS5jbGFzc0xpc3Q/YS5jbGFzc0xpc3Q6bGMoYSkubWF0Y2goL1xTKy9nKXx8W119LG1jPWZ1bmN0aW9uKGEsYil7dHlwZW9mIGEuY2xhc3NOYW1lPT0ic3RyaW5nIj9hLmNsYXNzTmFtZT1iOmEuc2V0QXR0cmlidXRlJiZhLnNldEF0dHJpYnV0ZSgiY2xhc3MiLGIpfSxuYz1mdW5jdGlvbihhLGIpe2EuY2xhc3NMaXN0P2I9YS5jbGFzc0xpc3QuY29udGFpbnMoYik6KGE9TChhKSxiPXZhKGEsYik+PTApO3JldHVybiBifSxvYz1mdW5jdGlvbihhLGIpe2lmKGEuY2xhc3NMaXN0KWEuY2xhc3NMaXN0LmFkZChiKTtlbHNlIGlmKCFuYyhhLGIpKXt2YXIgYz1sYyhhKTttYyhhLGMrKGMubGVuZ3RoPjA/IiAiK2I6YikpfX0scGM9ZnVuY3Rpb24oYSxiKXtpZihhLmNsYXNzTGlzdClBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGIsCmZ1bmN0aW9uKGUpe29jKGEsZSl9KTtlbHNle3ZhciBjPXt9O0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoTChhKSxmdW5jdGlvbihlKXtjW2VdPSEwfSk7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChiLGZ1bmN0aW9uKGUpe2NbZV09ITB9KTtiPSIiO2Zvcih2YXIgZCBpbiBjKWIrPWIubGVuZ3RoPjA/IiAiK2Q6ZDttYyhhLGIpfX0scWM9ZnVuY3Rpb24oYSxiKXthLmNsYXNzTGlzdD9hLmNsYXNzTGlzdC5yZW1vdmUoYik6bmMoYSxiKSYmbWMoYSxBcnJheS5wcm90b3R5cGUuZmlsdGVyLmNhbGwoTChhKSxmdW5jdGlvbihjKXtyZXR1cm4gYyE9Yn0pLmpvaW4oIiAiKSl9LHJjPWZ1bmN0aW9uKGEsYil7YS5jbGFzc0xpc3Q/QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChiLGZ1bmN0aW9uKGMpe3FjKGEsYyl9KTptYyhhLEFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbChMKGEpLGZ1bmN0aW9uKGMpe3JldHVybiEodmEoYixjKT49MCl9KS5qb2luKCIgIikpfTt2YXIgdGM9ZnVuY3Rpb24oYSxiKXtpZighYSl0aHJvdyBFcnJvcigiSW52YWxpZCBjbGFzcyBuYW1lICIrYSk7aWYodHlwZW9mIGIhPT0iZnVuY3Rpb24iKXRocm93IEVycm9yKCJJbnZhbGlkIGRlY29yYXRvciBmdW5jdGlvbiAiK2IpO3NjW2FdPWJ9LHVjPXt9LHNjPXt9O3ZhciB2Yz1mdW5jdGlvbihhKXt0aGlzLkE9YX07aWEodmMpO3ZhciB3Yz1mdW5jdGlvbihhLGIpe2EmJihhLnRhYkluZGV4PWI/MDotMSl9LHljPWZ1bmN0aW9uKGEsYixjKXtjLmlkJiZQYihiLGMuaWQpO3ZhciBkPWEuZygpLGU9ITEsZj1MKGMpO2YmJkFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoZixmdW5jdGlvbihoKXtoPT1kP2U9ITA6aCYmdGhpcy51KGIsaCxkKX0sYSk7ZXx8b2MoYyxkKTt4YyhiLGMpO3JldHVybiBjfTt2Yy5wcm90b3R5cGUudT1mdW5jdGlvbihhLGIsYyl7Yj09YysiLWRpc2FibGVkIj9hLlgoITEpOmI9PWMrIi1ob3Jpem9udGFsIj96YyhhLCJob3Jpem9udGFsIik6Yj09YysiLXZlcnRpY2FsIiYmemMoYSwidmVydGljYWwiKX07CnZhciB4Yz1mdW5jdGlvbihhLGIpe2lmKGIpZm9yKHZhciBjPWIuZmlyc3RDaGlsZCxkO2MmJmMucGFyZW50Tm9kZT09Yjspe2Q9Yy5uZXh0U2libGluZztpZihjLm5vZGVUeXBlPT0xKXthOnt2YXIgZT1jO3AoZSk7ZT1MKGUpO2Zvcih2YXIgZj1lLmxlbmd0aCxoPTA7aDxmO2grKyl7dmFyIGs9ZVtoXTtpZihrPWsgaW4gc2M/c2Nba10oKTpudWxsKXtlPWs7YnJlYWsgYX19ZT1udWxsfWUmJihlLmc9YyxhLmlzRW5hYmxlZCgpfHxlLlgoITEpLGEuQmEoZSksU2IoZSxjKSl9ZWxzZSBjLm5vZGVWYWx1ZSYmSGEoYy5ub2RlVmFsdWUpIT0iInx8Yi5yZW1vdmVDaGlsZChjKTtjPWR9fSxBYz1mdW5jdGlvbihhLGIpe2I9Yi5pKCk7cChiLCJUaGUgY29udGFpbmVyIERPTSBlbGVtZW50IGNhbm5vdCBiZSBudWxsLiIpO0tiKGIsdCk7KGE9YS5BKSYmWmIoYixhKX07dmMucHJvdG90eXBlLmc9ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy1jb250YWluZXIifTsKdmMucHJvdG90eXBlLmo9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nKCksYz1bYixhLkw9PSJob3Jpem9udGFsIj9iKyItaG9yaXpvbnRhbCI6YisiLXZlcnRpY2FsIl07YS5pc0VuYWJsZWQoKXx8Yy5wdXNoKGIrIi1kaXNhYmxlZCIpO3JldHVybiBjfTt2YXIgQmM9ZnVuY3Rpb24oKXt9O3ZhciBNPWZ1bmN0aW9uKCl7fSxDYztpYShNKTt2YXIgRGM9e2J1dHRvbjoicHJlc3NlZCIsY2hlY2tib3g6ImNoZWNrZWQiLG1lbnVpdGVtOiJzZWxlY3RlZCIsbWVudWl0ZW1jaGVja2JveDoiY2hlY2tlZCIsbWVudWl0ZW1yYWRpbzoiY2hlY2tlZCIscmFkaW86ImNoZWNrZWQiLHRhYjoic2VsZWN0ZWQiLHRyZWVpdGVtOiJzZWxlY3RlZCJ9O00ucHJvdG90eXBlLk5hPWZ1bmN0aW9uKCl7fTtNLnByb3RvdHlwZS54YT1mdW5jdGlvbihhKXt2YXIgYj1hLkcsYz1iLmgsZD10aGlzLk4oKSxlPVtkXSxmPXRoaXMuTigpO2YhPWQmJmUucHVzaChmKTtkPWEubTtmb3IoZj1bXTtkOyl7dmFyIGg9ZCYtZDtmLnB1c2goRWModGhpcyxoKSk7ZCY9fmh9ZS5wdXNoLmFwcGx5KGUsZik7KGQ9YS5GYSkmJmUucHVzaC5hcHBseShlLGQpO3JldHVybiBjLmNhbGwoYiwiRElWIixlLmpvaW4oIiAiKSxhLmlhKX07Ck0ucHJvdG90eXBlLnlhPWZ1bmN0aW9uKGEsYil7Yi5pZCYmUGIoYSxiLmlkKTtiJiZiLmZpcnN0Q2hpbGQ/RmMoYSxiLmZpcnN0Q2hpbGQubmV4dFNpYmxpbmc/eWEoYi5jaGlsZE5vZGVzKTpiLmZpcnN0Q2hpbGQpOmEuaWE9bnVsbDt2YXIgYz0wLGQ9dGhpcy5OKCksZT10aGlzLk4oKSxmPSExLGg9ITEsaz15YShMKGIpKTtrLmZvckVhY2goZnVuY3Rpb24ocSl7Znx8cSE9ZD9ofHxxIT1lP2N8PUdjKHRoaXMscSk6aD0hMDooZj0hMCxlPT1kJiYoaD0hMCkpO0djKHRoaXMscSk9PTEmJihzYShiKSxkYihiKSYmZWIoYikmJmNiKGIsITEpKX0sdGhpcyk7YS5tPWM7Znx8KGsucHVzaChkKSxlPT1kJiYoaD0hMCkpO2h8fGsucHVzaChlKTsoYT1hLkZhKSYmay5wdXNoLmFwcGx5KGssYSk7ZiYmaCYmIWF8fG1jKGIsay5qb2luKCIgIikpO3JldHVybiBifTsKdmFyIEhjPWZ1bmN0aW9uKGEsYil7aWYoYT1hLk5hKCkpe3AoYiwiVGhlIGVsZW1lbnQgcGFzc2VkIGFzIGEgZmlyc3QgcGFyYW1ldGVyIGNhbm5vdCBiZSBudWxsLiIpO3ZhciBjPWIuZ2V0QXR0cmlidXRlKCJyb2xlIil8fG51bGw7YSE9YyYmWmIoYixhKX19LEljPWZ1bmN0aW9uKGEsYil7dmFyIGM7aWYoYS5EJjMyJiYoYz1hLmkoKSkpe2lmKCFiJiZhLm0mMzIpe3RyeXtjLmJsdXIoKX1jYXRjaChkKXt9YS5tJjMyJiZhLlFhKG51bGwpfShkYihjKSYmZWIoYykpIT1iJiZjYihjLGIpfX0sSmM9ZnVuY3Rpb24oYSxiLGMpe0NjfHwoQ2M9ezE6ImRpc2FibGVkIiw4OiJzZWxlY3RlZCIsMTY6ImNoZWNrZWQiLDY0OiJleHBhbmRlZCJ9KTtwKGEsIlRoZSBlbGVtZW50IHBhc3NlZCBhcyBhIGZpcnN0IHBhcmFtZXRlciBjYW5ub3QgYmUgbnVsbC4iKTtiPUNjW2JdO3ZhciBkPWEuZ2V0QXR0cmlidXRlKCJyb2xlIil8fG51bGw7ZCYmKGQ9RGNbZF18fGIsYj1iPT0iY2hlY2tlZCJ8fGI9PQoic2VsZWN0ZWQiP2Q6Yik7YiYmYWMoYSxiLGMpfTtNLnByb3RvdHlwZS5OPWZ1bmN0aW9uKCl7cmV0dXJuImdvb2ctY29udHJvbCJ9O3ZhciBFYz1mdW5jdGlvbihhLGIpe2EuZ3x8S2MoYSk7cmV0dXJuIGEuZ1tiXX0sR2M9ZnVuY3Rpb24oYSxiKXthLmh8fChhLmd8fEtjKGEpLGEuaD1FYShhLmcpKTthPXBhcnNlSW50KGEuaFtiXSwxMCk7cmV0dXJuIGlzTmFOKGEpPzA6YX0sS2M9ZnVuY3Rpb24oYSl7dmFyIGI9YS5OKCk7dmFyIGM9Yi5yZXBsYWNlKC9ceGEwfFxzL2csIiAiKS5pbmRleE9mKCIgIikhPS0xO3AoIWMsIkNvbnRyb2xSZW5kZXJlciBoYXMgYW4gaW52YWxpZCBjc3MgY2xhc3M6ICciK2IrIiciKTthLmc9ezE6YisiLWRpc2FibGVkIiwyOmIrIi1ob3ZlciIsNDpiKyItYWN0aXZlIiw4OmIrIi1zZWxlY3RlZCIsMTY6YisiLWNoZWNrZWQiLDMyOmIrIi1mb2N1c2VkIiw2NDpiKyItb3BlbiJ9fTt2YXIgTj1mdW5jdGlvbihhLGIsYyl7Ri5jYWxsKHRoaXMsYyk7aWYoIWIpe2ZvcihiPXRoaXMuY29uc3RydWN0b3I7Yjspe3ZhciBkPW5hKGIpO2lmKGQ9dWNbZF0pYnJlYWs7Yj0oYj1PYmplY3QuZ2V0UHJvdG90eXBlT2YoYi5wcm90b3R5cGUpKSYmYi5jb25zdHJ1Y3Rvcn1iPWQ/dHlwZW9mIGQuVj09PSJmdW5jdGlvbiI/ZC5WKCk6bmV3IGQ6bnVsbH10aGlzLnY9Yjt0aGlzLmlhPWEhPT12b2lkIDA/YTpudWxsfTtuKE4sRik7Zz1OLnByb3RvdHlwZTtnLmlhPW51bGw7Zy5tPTA7Zy5EPTM5O2cuUD0wO2cuT2E9ITA7Zy5GYT1udWxsO2cuSGE9ITA7Zy5tYT1mdW5jdGlvbigpe3ZhciBhPXRoaXMudi54YSh0aGlzKTt0aGlzLmc9YTtIYyh0aGlzLnYsYSk7S2IoYSwhMCk7dGhpcy5pc1Zpc2libGUoKXx8KGEuc3R5bGUuZGlzcGxheT0ibm9uZSIsYSYmYWMoYSwiaGlkZGVuIiwhMCkpfTtnLm5hPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaSgpfTtnLndhPWZ1bmN0aW9uKCl7cmV0dXJuITB9OwpnLkVhPWZ1bmN0aW9uKGEpe3RoaXMuZz1hPXRoaXMudi55YSh0aGlzLGEpO0hjKHRoaXMudixhKTtLYihhLCEwKTt0aGlzLk9hPWEuc3R5bGUuZGlzcGxheSE9Im5vbmUifTsKZy5JPWZ1bmN0aW9uKCl7Ti5sLkkuY2FsbCh0aGlzKTt2YXIgYT10aGlzLmc7cChhLCJDYW4gbm90IGNhbGwgZ2V0RWxlbWVudFN0cmljdCBiZWZvcmUgcmVuZGVyaW5nL2RlY29yYXRpbmcuIik7cCh0aGlzKTtwKGEpO3RoaXMuaXNWaXNpYmxlKCl8fGFjKGEsImhpZGRlbiIsIXRoaXMuaXNWaXNpYmxlKCkpO3RoaXMuaXNFbmFibGVkKCl8fEpjKGEsMSwhdGhpcy5pc0VuYWJsZWQoKSk7dGhpcy5EJjgmJkpjKGEsOCwhISh0aGlzLm0mOCkpO3RoaXMuRCYxNiYmSmMoYSwxNiwhISh0aGlzLm0mMTYpKTt0aGlzLkQmNjQmJkpjKGEsNjQsISEodGhpcy5tJjY0KSk7dmFyIGI9dGhpcy52O1ViKHRoaXMpJiYoYT10aGlzLmkoKSxiPWIuTigpKyItcnRsIiwoYT1hLmk/YS5pKCk6YSkmJnBjKGEsW2JdKSk7dGhpcy5pc0VuYWJsZWQoKSYmSWModGhpcyx0aGlzLmlzVmlzaWJsZSgpKTt0aGlzLkQmLTImJih0aGlzLkhhJiZMYyh0aGlzLCEwKSx0aGlzLkQmMzImJihhPXRoaXMuaSgpKSkmJihiPQp0aGlzLlp8fCh0aGlzLlo9bmV3IEopLGdjKGIsYSksQihCKEIoUWIodGhpcyksYiwia2V5Iix0aGlzLmFhKSxhLCJmb2N1cyIsdGhpcy5YYSksYSwiYmx1ciIsdGhpcy5RYSkpfTt2YXIgTGM9ZnVuY3Rpb24oYSxiKXt2YXIgYz1RYihhKSxkPWEuaSgpO2I/KEIoQihCKEIoYyxkLEsuZ2EsYS5zYSksZCxbSy5oYSxLLmZhXSxhLnZhKSxkLCJtb3VzZW92ZXIiLGEudWEpLGQsIm1vdXNlb3V0IixhLnRhKSxhLmNhIT1CYyYmQihjLGQsImNvbnRleHRtZW51IixhLmNhKSk6KEMoQyhDKEMoYyxkLEsuZ2EsYS5zYSksZCxbSy5oYSxLLmZhXSxhLnZhKSxkLCJtb3VzZW92ZXIiLGEudWEpLGQsIm1vdXNlb3V0IixhLnRhKSxhLmNhIT1CYyYmQyhjLGQsImNvbnRleHRtZW51IixhLmNhKSl9O04ucHJvdG90eXBlLlU9ZnVuY3Rpb24oKXtOLmwuVS5jYWxsKHRoaXMpO3RoaXMuWiYma2ModGhpcy5aKTt0aGlzLmlzVmlzaWJsZSgpJiZ0aGlzLmlzRW5hYmxlZCgpJiZJYyh0aGlzLCExKX07Ck4ucHJvdG90eXBlLkM9ZnVuY3Rpb24oKXtOLmwuQy5jYWxsKHRoaXMpO3RoaXMuWiYmKHRoaXMuWi5kaXNwb3NlKCksZGVsZXRlIHRoaXMuWik7ZGVsZXRlIHRoaXMudjt0aGlzLkZhPXRoaXMuaWE9bnVsbH07dmFyIEZjPWZ1bmN0aW9uKGEsYil7YS5pYT1ifTtOLnByb3RvdHlwZS5pc1Zpc2libGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5PYX07Ti5wcm90b3R5cGUuaXNFbmFibGVkPWZ1bmN0aW9uKCl7cmV0dXJuISh0aGlzLm0mMSl9O04ucHJvdG90eXBlLlg9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5oO2ImJnR5cGVvZiBiLmlzRW5hYmxlZD09ImZ1bmN0aW9uIiYmIWIuaXNFbmFibGVkKCl8fCFPKHRoaXMsMSwhYSl8fChhfHwoTWModGhpcywhMSksUCh0aGlzLCExKSksdGhpcy5pc1Zpc2libGUoKSYmSWModGhpcyxhKSxUKHRoaXMsMSwhYSwhMCkpfTt2YXIgUD1mdW5jdGlvbihhLGIpe08oYSwyLGIpJiZUKGEsMixiKX07Ck4ucHJvdG90eXBlLmlzQWN0aXZlPWZ1bmN0aW9uKCl7cmV0dXJuISEodGhpcy5tJjQpfTsKdmFyIE1jPWZ1bmN0aW9uKGEsYil7TyhhLDQsYikmJlQoYSw0LGIpfSxOYz1mdW5jdGlvbihhLGIpe08oYSw4LGIpJiZUKGEsOCxiKX0sT2M9ZnVuY3Rpb24oYSxiKXtPKGEsNjQsYikmJlQoYSw2NCxiKX0sVD1mdW5jdGlvbihhLGIsYyxkKXtpZighZCYmYj09MSlhLlgoIWMpO2Vsc2UgaWYoYS5EJmImJmMhPSEhKGEubSZiKSl7dmFyIGU9YS52O2lmKGQ9YS5pKCkpe2lmKGU9RWMoZSxiKSl7dmFyIGY9YS5pP2EuaSgpOmE7ZiYmKGM/cGM6cmMpKGYsW2VdKX1KYyhkLGIsYyl9YS5tPWM/YS5tfGI6YS5tJn5ifX0sUGM9ZnVuY3Rpb24oYSxiLGMpe2lmKGEucyYmYS5tJmImJiFjKXRocm93IEVycm9yKCJDb21wb25lbnQgYWxyZWFkeSByZW5kZXJlZCIpOyFjJiZhLm0mYiYmVChhLGIsITEpO2EuRD1jP2EuRHxiOmEuRCZ+Yn0sVT1mdW5jdGlvbihhLGIpe3JldHVybiEhKDI1NSZiKSYmISEoYS5EJmIpfSxPPWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4hIShhLkQmYikmJiEhKGEubSZiKSE9CmMmJighKGEuUCZiKXx8RShhLE5iKGIsYykpKSYmIWEuYmF9O04ucHJvdG90eXBlLnVhPWZ1bmN0aW9uKGEpeyFRYyhhLHRoaXMuaSgpKSYmRSh0aGlzLCJlbnRlciIpJiZ0aGlzLmlzRW5hYmxlZCgpJiZVKHRoaXMsMikmJlAodGhpcywhMCl9O04ucHJvdG90eXBlLnRhPWZ1bmN0aW9uKGEpeyFRYyhhLHRoaXMuaSgpKSYmRSh0aGlzLCJsZWF2ZSIpJiYoVSh0aGlzLDQpJiZNYyh0aGlzLCExKSxVKHRoaXMsMikmJlAodGhpcywhMSkpfTtOLnByb3RvdHlwZS5jYT1CYzt2YXIgUWM9ZnVuY3Rpb24oYSxiKXtyZXR1cm4hIWEucmVsYXRlZFRhcmdldCYmYWIoYixhLnJlbGF0ZWRUYXJnZXQpfTsKTi5wcm90b3R5cGUuc2E9ZnVuY3Rpb24oYSl7aWYodGhpcy5pc0VuYWJsZWQoKSYmKFUodGhpcywyKSYmUCh0aGlzLCEwKSwhKGEuaC5idXR0b24hPTB8fHYmJmEuY3RybEtleSkpKXtVKHRoaXMsNCkmJk1jKHRoaXMsITApO3ZhciBiO2lmKGI9dGhpcy52KXt2YXIgYztiPXRoaXMuRCYzMiYmKGM9dGhpcy5pKCkpP2RiKGMpJiZlYihjKTohMX1iJiZ0aGlzLmkoKS5mb2N1cygpfWEuaC5idXR0b24hPTB8fHYmJmEuY3RybEtleXx8YS5qKCl9O04ucHJvdG90eXBlLnZhPWZ1bmN0aW9uKGEpe3RoaXMuaXNFbmFibGVkKCkmJihVKHRoaXMsMikmJlAodGhpcywhMCksdGhpcy5pc0FjdGl2ZSgpJiZSYyh0aGlzLGEpJiZVKHRoaXMsNCkmJk1jKHRoaXMsITEpKX07CnZhciBSYz1mdW5jdGlvbihhLGIpe2lmKFUoYSwxNikpe3ZhciBjPSEoYS5tJjE2KTtPKGEsMTYsYykmJlQoYSwxNixjKX1VKGEsOCkmJk5jKGEsITApO1UoYSw2NCkmJk9jKGEsIShhLm0mNjQpKTtjPW5ldyB5KCJhY3Rpb24iLGEpO2ImJihjLmFsdEtleT1iLmFsdEtleSxjLmN0cmxLZXk9Yi5jdHJsS2V5LGMubWV0YUtleT1iLm1ldGFLZXksYy5zaGlmdEtleT1iLnNoaWZ0S2V5LGMuRz1iLkcsYy50aW1lU3RhbXA9Yi50aW1lU3RhbXApO3JldHVybiBFKGEsYyl9O04ucHJvdG90eXBlLlhhPWZ1bmN0aW9uKCl7VSh0aGlzLDMyKSYmTyh0aGlzLDMyLCEwKSYmVCh0aGlzLDMyLCEwKX07Ti5wcm90b3R5cGUuUWE9ZnVuY3Rpb24oKXtVKHRoaXMsNCkmJk1jKHRoaXMsITEpO1UodGhpcywzMikmJk8odGhpcywzMiwhMSkmJlQodGhpcywzMiwhMSl9OwpOLnByb3RvdHlwZS5hYT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5pc1Zpc2libGUoKSYmdGhpcy5pc0VuYWJsZWQoKSYmYS5nPT0xMyYmUmModGhpcyxhKT8oYS5qKCksYS52KCksITApOiExfTtpZih0eXBlb2YgTiE9PSJmdW5jdGlvbiIpdGhyb3cgRXJyb3IoIkludmFsaWQgY29tcG9uZW50IGNsYXNzICIrTik7aWYodHlwZW9mIE0hPT0iZnVuY3Rpb24iKXRocm93IEVycm9yKCJJbnZhbGlkIHJlbmRlcmVyIGNsYXNzICIrTSk7dmFyIFNjPW5hKE4pO3VjW1NjXT1NO3RjKCJnb29nLWNvbnRyb2wiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBOKG51bGwpfSk7dmFyIFY9ZnVuY3Rpb24oYSxiLGMpe0YuY2FsbCh0aGlzLGMpO3RoaXMuZWE9Ynx8dmMuVigpO3RoaXMuTD1hfHwidmVydGljYWwifTtuKFYsRik7Zz1WLnByb3RvdHlwZTtnLkthPW51bGw7Zy5kYT1udWxsO2cuZWE9bnVsbDtnLkw9bnVsbDtnLlM9ITA7Zy5UPSEwO2cubz0tMTtnLkI9bnVsbDtnLlc9ITE7Zy5PPW51bGw7dmFyIFRjPWZ1bmN0aW9uKGEpe3JldHVybiBhLkthfHxhLmkoKX07Zz1WLnByb3RvdHlwZTtnLm1hPWZ1bmN0aW9uKCl7dGhpcy5nPXRoaXMuRy5oKCJESVYiLHRoaXMuZWEuaih0aGlzKS5qb2luKCIgIikpfTtnLm5hPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaSgpfTtnLndhPWZ1bmN0aW9uKGEpe3JldHVybiBhLnRhZ05hbWU9PSJESVYifTtnLkVhPWZ1bmN0aW9uKGEpe3RoaXMuZz15Yyh0aGlzLmVhLHRoaXMsYSk7YS5zdHlsZS5kaXNwbGF5PT0ibm9uZSImJih0aGlzLlM9ITEpfTsKZy5JPWZ1bmN0aW9uKCl7Vi5sLkkuY2FsbCh0aGlzKTtUYih0aGlzLGZ1bmN0aW9uKGIpe2IucyYmVWModGhpcyxiKX0sdGhpcyk7dmFyIGE9dGhpcy5pKCk7QWModGhpcy5lYSx0aGlzKTtWYyh0aGlzLHRoaXMuUyk7QihCKEIoQihCKEIoQihCKFFiKHRoaXMpLHRoaXMsImVudGVyIix0aGlzLmViKSx0aGlzLCJoaWdobGlnaHQiLHRoaXMuZmIpLHRoaXMsInVuaGlnaGxpZ2h0Iix0aGlzLmxiKSx0aGlzLCJvcGVuIix0aGlzLmdiKSx0aGlzLCJjbG9zZSIsdGhpcy5iYiksYSxLLmdhLHRoaXMuV2EpLGJiKGEpLFtLLmhhLEsuZmFdLHRoaXMuY2IpLGEsW0suZ2EsSy5oYSxLLmZhLCJtb3VzZW92ZXIiLCJtb3VzZW91dCIsImNvbnRleHRtZW51Il0sdGhpcy5hYik7V2ModGhpcyl9O3ZhciBXYz1mdW5jdGlvbihhKXt2YXIgYj1RYihhKSxjPVRjKGEpO0IoQihCKGIsYywiZm9jdXMiLGEuUGEpLGMsImJsdXIiLGEuVWEpLGEuZGF8fChhLmRhPW5ldyBKKFRjKGEpKSksImtleSIsYS5WYSl9OwpnPVYucHJvdG90eXBlO2cuVT1mdW5jdGlvbigpe1hjKHRoaXMsLTEpO3RoaXMuQiYmT2ModGhpcy5CLCExKTt0aGlzLlc9ITE7Vi5sLlUuY2FsbCh0aGlzKX07Zy5DPWZ1bmN0aW9uKCl7Vi5sLkMuY2FsbCh0aGlzKTt0aGlzLmRhJiYodGhpcy5kYS5kaXNwb3NlKCksdGhpcy5kYT1udWxsKTt0aGlzLmVhPXRoaXMuQj10aGlzLk89dGhpcy5LYT1udWxsfTtnLmViPWZ1bmN0aW9uKCl7cmV0dXJuITB9OwpnLmZiPWZ1bmN0aW9uKGEpe3ZhciBiPVZiKHRoaXMsYS50YXJnZXQpO2lmKGI+LTEmJmIhPXRoaXMubyl7dmFyIGM9SSh0aGlzLHRoaXMubyk7YyYmUChjLCExKTt0aGlzLm89YjtjPUkodGhpcyx0aGlzLm8pO3RoaXMuVyYmTWMoYywhMCk7dGhpcy5CJiZjIT10aGlzLkImJihjLkQmNjQ/T2MoYywhMCk6T2ModGhpcy5CLCExKSl9Yj10aGlzLmkoKTtwKGIsIlRoZSBET00gZWxlbWVudCBmb3IgdGhlIGNvbnRhaW5lciBjYW5ub3QgYmUgbnVsbC4iKTthLnRhcmdldC5pKCkhPW51bGwmJmFjKGIsImFjdGl2ZWRlc2NlbmRhbnQiLGEudGFyZ2V0LmkoKS5pZCl9O2cubGI9ZnVuY3Rpb24oYSl7YS50YXJnZXQ9PUkodGhpcyx0aGlzLm8pJiYodGhpcy5vPS0xKTthPXRoaXMuaSgpO3AoYSwiVGhlIERPTSBlbGVtZW50IGZvciB0aGUgY29udGFpbmVyIGNhbm5vdCBiZSBudWxsLiIpO2EucmVtb3ZlQXR0cmlidXRlKCRiKCJhY3RpdmVkZXNjZW5kYW50IikpfTsKZy5nYj1mdW5jdGlvbihhKXsoYT1hLnRhcmdldCkmJmEhPXRoaXMuQiYmYS5oPT10aGlzJiYodGhpcy5CJiZPYyh0aGlzLkIsITEpLHRoaXMuQj1hKX07Zy5iYj1mdW5jdGlvbihhKXthLnRhcmdldD09dGhpcy5CJiYodGhpcy5CPW51bGwpO3ZhciBiPXRoaXMuaSgpLGM9YS50YXJnZXQuaSgpO2ImJmEudGFyZ2V0Lm0mMiYmYyYmKGE9IiIsYyYmKGE9Yy5pZCxwKGEsIlRoZSBhY3RpdmUgZWxlbWVudCBzaG91bGQgaGF2ZSBhbiBpZC4iKSksYWMoYiwiYWN0aXZlZGVzY2VuZGFudCIsYSkpfTtnLldhPWZ1bmN0aW9uKGEpe3RoaXMuVCYmKHRoaXMuVz0hMCk7dmFyIGI9VGModGhpcyk7YiYmZGIoYikmJmViKGIpP2IuZm9jdXMoKTphLmooKX07Zy5jYj1mdW5jdGlvbigpe3RoaXMuVz0hMX07CmcuYWI9ZnVuY3Rpb24oYSl7YTp7dmFyIGI9YS50YXJnZXQ7aWYodGhpcy5PKWZvcih2YXIgYz10aGlzLmkoKTtiJiZiIT09Yzspe3ZhciBkPWIuaWQ7aWYoZCBpbiB0aGlzLk8pe2I9dGhpcy5PW2RdO2JyZWFrIGF9Yj1iLnBhcmVudE5vZGV9Yj1udWxsfWlmKGIpc3dpdGNoKGEudHlwZSl7Y2FzZSBLLmdhOmIuc2EoYSk7YnJlYWs7Y2FzZSBLLmhhOmNhc2UgSy5mYTpiLnZhKGEpO2JyZWFrO2Nhc2UgIm1vdXNlb3ZlciI6Yi51YShhKTticmVhaztjYXNlICJtb3VzZW91dCI6Yi50YShhKTticmVhaztjYXNlICJjb250ZXh0bWVudSI6Yi5jYShhKX19O2cuUGE9ZnVuY3Rpb24oKXt9O2cuVWE9ZnVuY3Rpb24oKXtYYyh0aGlzLC0xKTt0aGlzLlc9ITE7dGhpcy5CJiZPYyh0aGlzLkIsITEpfTsKZy5WYT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5pc0VuYWJsZWQoKSYmdGhpcy5pc1Zpc2libGUoKSYmKEgodGhpcykhPTB8fHRoaXMuS2EpJiZZYyh0aGlzLGEpPyhhLmooKSxhLnYoKSwhMCk6ITF9Owp2YXIgWWM9ZnVuY3Rpb24oYSxiKXt2YXIgYz1JKGEsYS5vKTtpZihjJiZ0eXBlb2YgYy5hYT09ImZ1bmN0aW9uIiYmYy5hYShiKXx8YS5CJiZhLkIhPWMmJnR5cGVvZiBhLkIuYWE9PSJmdW5jdGlvbiImJmEuQi5hYShiKSlyZXR1cm4hMDtpZihiLnNoaWZ0S2V5fHxiLmN0cmxLZXl8fGIubWV0YUtleXx8Yi5hbHRLZXkpcmV0dXJuITE7c3dpdGNoKGIuZyl7Y2FzZSAyNzpUYyhhKS5ibHVyKCk7YnJlYWs7Y2FzZSAzNjpaYyhhKTticmVhaztjYXNlIDM1OiRjKGEpO2JyZWFrO2Nhc2UgMzg6aWYoYS5MPT0idmVydGljYWwiKWFkKGEpO2Vsc2UgcmV0dXJuITE7YnJlYWs7Y2FzZSAzNzppZihhLkw9PSJob3Jpem9udGFsIilVYihhKT9iZChhKTphZChhKTtlbHNlIHJldHVybiExO2JyZWFrO2Nhc2UgNDA6aWYoYS5MPT0idmVydGljYWwiKWJkKGEpO2Vsc2UgcmV0dXJuITE7YnJlYWs7Y2FzZSAzOTppZihhLkw9PSJob3Jpem9udGFsIilVYihhKT9hZChhKTpiZChhKTtlbHNlIHJldHVybiExOwpicmVhaztkZWZhdWx0OnJldHVybiExfXJldHVybiEwfSxVYz1mdW5jdGlvbihhLGIpe3ZhciBjPWIuaSgpO2M9Yy5pZHx8KGMuaWQ9T2IoYikpO2EuT3x8KGEuTz17fSk7YS5PW2NdPWJ9O1YucHJvdG90eXBlLkJhPWZ1bmN0aW9uKGEsYil7dWEoYSxOLCJUaGUgY2hpbGQgb2YgYSBjb250YWluZXIgbXVzdCBiZSBhIGNvbnRyb2wiKTtWLmwuQmEuY2FsbCh0aGlzLGEsYil9O1YucHJvdG90eXBlLkNhPWZ1bmN0aW9uKGEsYixjKXt1YShhLE4pO2EuUHw9MjthLlB8PTY0O1BjKGEsMzIsITEpO2EucyYmMCE9YS5IYSYmTGMoYSwhMSk7YS5IYT0hMTt2YXIgZD1hLmg9PXRoaXM/VmIodGhpcyxhKTotMTtWLmwuQ2EuY2FsbCh0aGlzLGEsYixjKTthLnMmJnRoaXMucyYmVWModGhpcyxhKTthPWQ7YT09LTEmJihhPUgodGhpcykpO2E9PXRoaXMubz90aGlzLm89TWF0aC5taW4oSCh0aGlzKS0xLGIpOmE+dGhpcy5vJiZiPD10aGlzLm8/dGhpcy5vKys6YTx0aGlzLm8mJmI+dGhpcy5vJiZ0aGlzLm8tLX07CnZhciB6Yz1mdW5jdGlvbihhLGIpe2lmKGEuaSgpKXRocm93IEVycm9yKCJDb21wb25lbnQgYWxyZWFkeSByZW5kZXJlZCIpO2EuTD1ifTtWLnByb3RvdHlwZS5pc1Zpc2libGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5TfTt2YXIgVmM9ZnVuY3Rpb24oYSxiKXthLlM9Yjt2YXIgYz1hLmkoKTtjJiYoYy5zdHlsZS5kaXNwbGF5PWI/IiI6Im5vbmUiLHdjKFRjKGEpLGEuVCYmYS5TKSl9O1YucHJvdG90eXBlLmlzRW5hYmxlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLlR9O1YucHJvdG90eXBlLlg9ZnVuY3Rpb24oYSl7dGhpcy5UIT1hJiZFKHRoaXMsYT8iZW5hYmxlIjoiZGlzYWJsZSIpJiYoYT8odGhpcy5UPSEwLFRiKHRoaXMsZnVuY3Rpb24oYil7Yi5UYT9kZWxldGUgYi5UYTpiLlgoITApfSkpOihUYih0aGlzLGZ1bmN0aW9uKGIpe2IuaXNFbmFibGVkKCk/Yi5YKCExKTpiLlRhPSEwfSksdGhpcy5XPXRoaXMuVD0hMSksd2MoVGModGhpcyksYSYmdGhpcy5TKSl9Owp2YXIgWGM9ZnVuY3Rpb24oYSxiKXsoYj1JKGEsYikpP1AoYiwhMCk6YS5vPi0xJiZQKEkoYSxhLm8pLCExKX0sWmM9ZnVuY3Rpb24oYSl7Y2QoYSxmdW5jdGlvbihiLGMpe3JldHVybihiKzEpJWN9LEgoYSktMSl9LCRjPWZ1bmN0aW9uKGEpe2NkKGEsZnVuY3Rpb24oYixjKXtiLS07cmV0dXJuIGI8MD9jLTE6Yn0sMCl9LGJkPWZ1bmN0aW9uKGEpe2NkKGEsZnVuY3Rpb24oYixjKXtyZXR1cm4oYisxKSVjfSxhLm8pfSxhZD1mdW5jdGlvbihhKXtjZChhLGZ1bmN0aW9uKGIsYyl7Yi0tO3JldHVybiBiPDA/Yy0xOmJ9LGEubyl9LGNkPWZ1bmN0aW9uKGEsYixjKXtjPWM8MD9WYihhLGEuQik6Yzt2YXIgZD1IKGEpO2M9Yi5jYWxsKGEsYyxkKTtmb3IodmFyIGU9MDtlPD1kOyl7dmFyIGY9SShhLGMpO2lmKGYmJmYuaXNWaXNpYmxlKCkmJmYuaXNFbmFibGVkKCkmJmYuRCYyKXthLkxhKGMpO2JyZWFrfWUrKztjPWIuY2FsbChhLGMsZCl9fTsKVi5wcm90b3R5cGUuTGE9ZnVuY3Rpb24oYSl7WGModGhpcyxhKX07dmFyIGRkPWZ1bmN0aW9uKCl7fTtuKGRkLE0pO2lhKGRkKTtnPWRkLnByb3RvdHlwZTtnLk49ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy10YWIifTtnLk5hPWZ1bmN0aW9uKCl7cmV0dXJuInRhYiJ9O2cueGE9ZnVuY3Rpb24oYSl7dmFyIGI9ZGQubC54YS5jYWxsKHRoaXMsYSk7KGE9YS5HYSgpKSYmdGhpcy5NYShiLGEpO3JldHVybiBifTtnLnlhPWZ1bmN0aW9uKGEsYil7Yj1kZC5sLnlhLmNhbGwodGhpcyxhLGIpO3ZhciBjPXRoaXMuR2EoYik7YyYmKGEuUmE9Yyk7YS5tJjgmJihjPWEuaCkmJnR5cGVvZiBjLko9PT0iZnVuY3Rpb24iJiYoVChhLDgsITEpLGMuSihhKSk7cmV0dXJuIGJ9O2cuR2E9ZnVuY3Rpb24oYSl7cmV0dXJuIGEudGl0bGV8fCIifTtnLk1hPWZ1bmN0aW9uKGEsYil7YSYmKGEudGl0bGU9Ynx8IiIpfTt2YXIgZWQ9ZnVuY3Rpb24oYSxiLGMpe04uY2FsbCh0aGlzLGEsYnx8ZGQuVigpLGMpO1BjKHRoaXMsOCwhMCk7dGhpcy5QfD05fTtuKGVkLE4pO2VkLnByb3RvdHlwZS5HYT1mdW5jdGlvbigpe3JldHVybiB0aGlzLlJhfTtlZC5wcm90b3R5cGUuTWE9ZnVuY3Rpb24oYSl7dGhpcy52Lk1hKHRoaXMuaSgpLGEpO3RoaXMuUmE9YX07dGMoImdvb2ctdGFiIixmdW5jdGlvbigpe3JldHVybiBuZXcgZWQobnVsbCl9KTt2YXIgVz1mdW5jdGlvbigpe3RoaXMuQT0idGFibGlzdCJ9O24oVyx2Yyk7aWEoVyk7Vy5wcm90b3R5cGUuZz1mdW5jdGlvbigpe3JldHVybiJnb29nLXRhYi1iYXIifTtXLnByb3RvdHlwZS51PWZ1bmN0aW9uKGEsYixjKXt0aGlzLnZ8fCh0aGlzLmh8fGZkKHRoaXMpLHRoaXMudj1FYSh0aGlzLmgpKTt2YXIgZD10aGlzLnZbYl07ZD8oemMoYSxnZChkKSksYS52PWQpOlcubC51LmNhbGwodGhpcyxhLGIsYyl9O1cucHJvdG90eXBlLmo9ZnVuY3Rpb24oYSl7dmFyIGI9Vy5sLmouY2FsbCh0aGlzLGEpO3RoaXMuaHx8ZmQodGhpcyk7Yi5wdXNoKHRoaXMuaFthLnZdKTtyZXR1cm4gYn07dmFyIGZkPWZ1bmN0aW9uKGEpe3ZhciBiPWEuZygpO2EuaD17dG9wOmIrIi10b3AiLGJvdHRvbTpiKyItYm90dG9tIixzdGFydDpiKyItc3RhcnQiLGVuZDpiKyItZW5kIn19O3ZhciBYPWZ1bmN0aW9uKGEsYixjKXthPWF8fCJ0b3AiO3pjKHRoaXMsZ2QoYSkpO3RoaXMudj1hO1YuY2FsbCh0aGlzLHRoaXMuTCxifHxXLlYoKSxjKTtoZCh0aGlzKX07bihYLFYpO2c9WC5wcm90b3R5cGU7Zy5IPW51bGw7Zy5JPWZ1bmN0aW9uKCl7WC5sLkkuY2FsbCh0aGlzKTtoZCh0aGlzKX07Zy5DPWZ1bmN0aW9uKCl7WC5sLkMuY2FsbCh0aGlzKTt0aGlzLkg9bnVsbH07Zy5MYT1mdW5jdGlvbihhKXtYLmwuTGEuY2FsbCh0aGlzLGEpO3RoaXMuSihJKHRoaXMsYSkpfTtnLko9ZnVuY3Rpb24oYSl7YT9OYyhhLCEwKTp0aGlzLkgmJk5jKHRoaXMuSCwhMSl9Owp2YXIgaWQ9ZnVuY3Rpb24oYSxiKXtpZihiJiZiPT1hLkgpe2Zvcih2YXIgYz1WYihhLGIpLGQ9Yy0xO2I9SShhLGQpO2QtLSl7dmFyIGU9YjtpZihlLmlzVmlzaWJsZSgpJiZlLmlzRW5hYmxlZCgpKXthLkooYik7cmV0dXJufX1mb3IoYys9MTtiPUkoYSxjKTtjKyspaWYoZD1iLGQuaXNWaXNpYmxlKCkmJmQuaXNFbmFibGVkKCkpe2EuSihiKTtyZXR1cm59YS5KKG51bGwpfX07Zz1YLnByb3RvdHlwZTtnLmpiPWZ1bmN0aW9uKGEpe3RoaXMuSCYmdGhpcy5IIT1hLnRhcmdldCYmTmModGhpcy5ILCExKTt0aGlzLkg9YS50YXJnZXR9O2cua2I9ZnVuY3Rpb24oYSl7YS50YXJnZXQ9PXRoaXMuSCYmKHRoaXMuSD1udWxsKX07Zy5oYj1mdW5jdGlvbihhKXtpZCh0aGlzLGEudGFyZ2V0KX07Zy5pYj1mdW5jdGlvbihhKXtpZCh0aGlzLGEudGFyZ2V0KX07Zy5QYT1mdW5jdGlvbigpe0kodGhpcyx0aGlzLm8pfHxYYyh0aGlzLFZiKHRoaXMsdGhpcy5IfHxJKHRoaXMsMCkpKX07CnZhciBoZD1mdW5jdGlvbihhKXtCKEIoQihCKFFiKGEpLGEsInNlbGVjdCIsYS5qYiksYSwidW5zZWxlY3QiLGEua2IpLGEsImRpc2FibGUiLGEuaGIpLGEsImhpZGUiLGEuaWIpfSxnZD1mdW5jdGlvbihhKXtyZXR1cm4gYT09InN0YXJ0Inx8YT09ImVuZCI/InZlcnRpY2FsIjoiaG9yaXpvbnRhbCJ9O3RjKCJnb29nLXRhYi1iYXIiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBYfSk7ZnVuY3Rpb24gamQoYSl7dmFyIGI9e3RvcDoiYm90dG9tIixib3R0b206InRvcCIsc3RhcnQ6InJpZ2h0IixlbmQ6ImxlZnQifVthLmxvY2F0aW9uXSxjPWEuZWxlbWVudElkLGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTtkLnRleHRDb250ZW50PSJcbiAgICBmaWVsZHNldCB7XG4gICAgICBwYWRkaW5nOiAxMHB4O1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgIzM2OTtcbiAgICB9XG5cbiAgICAjIitjKyIgLmdvb2ctdGFiLWNvbnRlbnQge1xuICAgICAgbWluLWhlaWdodDogM2VtO1xuICAgICAgbWFyZ2luOiAwO1xuICAgICAgYm9yZGVyOiAiK2EuYm9yZGVyKyIgc29saWQgIithLmJvcmRlckNvbG9yKyI7XG4gICAgICBib3JkZXItdG9wOiAwO1xuICAgICAgaGVpZ2h0OiAiK2EuY29udGVudEhlaWdodCsiO1xuICAgICAgcGFkZGluZzogNHB4IDhweDtcbiAgICAgIG1hcmdpbi1yaWdodDogNHB4O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgIG92ZXJmbG93OiBhdXRvO1xuICAgIH1cblxuICAgICMiKwpjKyIgLmdvb2ctdGFiLWJhci0iK2EubG9jYXRpb24rIiAuZ29vZy10YWItc2VsZWN0ZWQge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICIrYS5ib3JkZXJDb2xvcisiO1xuICAgICAgYm9yZGVyLSIrYisiOiAwcHg7XG4gICAgfVxuXG4gICAgIyIrYysiIC5nb29nLXRhYi1iYXItIithLmxvY2F0aW9uKyIge1xuICAgICAgcGFkZGluZy0iK2EubG9jYXRpb24rIjogNXB4ICFpbXBvcnRhbnQ7XG4gICAgICBib3JkZXItIitiKyI6IDFweCBzb2xpZCAiK2EuYm9yZGVyQ29sb3IrIiAhaW1wb3J0YW50O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICB9XG5cbiAgICAjIitjKyIgLmdvb2ctdGFiLWJhciB7XG4gICAgICAgbWFyZ2luOiAwO1xuICAgICAgIGJvcmRlcjogMDtcbiAgICAgICBwYWRkaW5nOiAwO1xuICAgICAgIGxpc3Qtc3R5bGU6IG5vbmU7XG4gICAgICAgY3Vyc29yOiBkZWZhdWx0O1xuICAgICAgIG91dGxpbmU6IG5vbmU7XG4gICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgICBtYXJnaW4tcmlnaHQ6IDRweDtcbiAgICAgIH1cblxuICAgICAjIisKYysiIC5nb29nLXRhYiB7XG4gICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgIHBhZGRpbmc6IDRweCA4cHg7XG4gICAgICAgY29sb3I6IHZhcigtLWNvbGFiLXByaW1hcnktdGV4dC1jb2xvcik7XG4gICAgICAgdGV4dC1kZWNvcmF0aW9uOiBpbml0aWFsO1xuICAgICAgIGN1cnNvcjogZGVmYXVsdDtcbiAgICAgIH1cblxuICAgICAgIyIrYysiIC5nb29nLXRhYi1ob3ZlciB7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWNvbGFiLWhpZ2hsaWdodGVkLXN1cmZhY2UtY29sb3IpO1xuICAgICAgfVxuICAgICAgIjtyZXR1cm4gZH0KdmFyIGtkPWZ1bmN0aW9uKGEpe3ZhciBiPWEuZWxlbWVudElkLGM9YS50YWJOYW1lcyxkPWEuc2VsZWN0ZWRJbmRleDsiY29udGVudEJvcmRlciJpbiBhfHwoYS5jb250ZW50Qm9yZGVyPSIwcHgiKTsiY29udGVudEhlaWdodCJpbiBhfHwoYS5jb250ZW50SGVpZ2h0PSJpbml0aWFsIik7ImJvcmRlckNvbG9yImluIGF8fChhLmJvcmRlckNvbG9yPSJ2YXIoLS1jb2xhYi1ib3JkZXItY29sb3IpIik7YS5sb2NhdGlvbnx8KGEubG9jYXRpb249InRvcCIpO3ZhciBlPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiMiK2IpLGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zi5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYi1iYXIiKTt2YXIgaD1hLmxvY2F0aW9uO2YuY2xhc3NMaXN0LmFkZCgiZ29vZy10YWItYmFyLSIraCk7Zm9yKHZhciBrPVtdLHE9ZmEoYyksRz1xLm5leHQoKTshRy5kb25lO0c9cS5uZXh0KCkpe0c9Ry52YWx1ZTt2YXIgeD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKeC5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYiIpO3gudGV4dENvbnRlbnQ9RztmLmFwcGVuZENoaWxkKHgpO2sucHVzaCh4KX1oIT0iYm90dG9tIiYmZS5hcHBlbmRDaGlsZChmKTtxPW51bGw7aWYoaD09InRvcCJ8fGg9PSJib3R0b20iKXE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikscS5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYi1iYXItY2xlYXIiKTtoPT0idG9wIiYmcSYmZS5hcHBlbmRDaGlsZChxKTtHPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO0cuY2xhc3NMaXN0LmFkZCgiZ29vZy10YWItY29udGVudCIpO3ZhciBoYT1bXTtjPWZhKGMpO2Zvcih4PWMubmV4dCgpOyF4LmRvbmU7eD1jLm5leHQoKSl4PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHguaWQ9ZS5pZCsiX2NvbnRlbnRfIitoYS5sZW5ndGgseC5zdHlsZS5kaXNwbGF5PSJub25lIixHLmFwcGVuZENoaWxkKHgpLGhhLnB1c2goeCk7ZS5hcHBlbmRDaGlsZChHKTtoPT0iYm90dG9tIiYmKHEmJgplLmFwcGVuZENoaWxkKHEpLGUuYXBwZW5kQ2hpbGQoZikpO3ZhciBRPW5ldyBYKGgpO1NiKFEsZik7dmFyIFI9LTE7d2IoUSwic2VsZWN0IixmdW5jdGlvbihTKXtTPWsuaW5kZXhPZihTLnRhcmdldC5pKCkpO1MhPVImJihSPj0wJiZSPGhhLmxlbmd0aCYmKGhhW1JdLnN0eWxlLmRpc3BsYXk9Im5vbmUiLFI9LTEpLFM+PTAmJlM8aGEubGVuZ3RoJiYoUj1TLGhhW1JdLnN0eWxlLmRpc3BsYXk9ImlubGluZSIsd2luZG93LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCJyZXNpemUiKSksZ29vZ2xlLmNvbGFiLm91dHB1dC5yZXNpemVJZnJhbWVUb0NvbnRlbnQoKSksUS5KKEkoUSxSKSkpfSk7US5KKEkoUSxkKSk7d2luZG93W2JdPXtzZXRTZWxlY3RlZFRhYkluZGV4OmZ1bmN0aW9uKFMpe1EuSihJKFEsUykpfX07ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChqZChhKSl9LGxkPVsiY29sYWJfbGliIiwiY3JlYXRlVGFiQmFyIl0sWT1sOwpsZFswXWluIFl8fHR5cGVvZiBZLmV4ZWNTY3JpcHQ9PSJ1bmRlZmluZWQifHxZLmV4ZWNTY3JpcHQoInZhciAiK2xkWzBdKTtmb3IodmFyIFo7bGQubGVuZ3RoJiYoWj1sZC5zaGlmdCgpKTspbGQubGVuZ3RofHxrZD09PXZvaWQgMD9ZW1pdJiZZW1pdIT09T2JqZWN0LnByb3RvdHlwZVtaXT9ZPVlbWl06WT1ZW1pdPXt9OllbWl09a2Q7fSkuY2FsbCh0aGlzKTsKLy8gY2xhbmctZm9ybWF0IG9uCg==", + "ok": true, + "headers": [ + [ + "content-length", + "41785" + ], + [ + "content-type", + "application/javascript" + ] + ], + "status": 200, + "status_text": "" + } + }, + "base_uri": "https://localhost:8080/", + "height": 479 + }, + "outputId": "4d7d0e70-82ee-4835-d016-d5329068f4c1" + }, + "source": [ + "%%logica Even\n", + "\n", + "Z(x) :- x in Range(20);\n", + "\n", + "Even(x) :- Z(x), Z(x / 2);" + ], + "execution_count": 3, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"d8d5917a-d22c-11ef-a7c0-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id1\", \"tabNames\": [\"Even\", \"(Log)\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_72d67d91e6" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"d8d6290a-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id1\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_0f250f299c" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"d8da5660-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_c738362967" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"d8dac992-d22c-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id1_content_1\");\n", + "//# sourceURL=js_20b8c16431" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"d8db4016-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"d8dac992-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_adcd529422" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"d8dc376e-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id1\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_407e856f16" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"d8e13782-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"d8da5660-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_37d10eeacc" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"d8e4ed78-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_c994ca8569" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"d8e5f150-d22c-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id1_content_0\");\n", + "//# sourceURL=js_855ef48080" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"d8e65bd6-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"d8e5f150-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_2a43fb45f6" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"d8e6c4e0-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id1\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_b2f964b4b4" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"d8e9f610-d22c-11ef-a7c0-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id2\", \"tabNames\": [\"SQL\", \"Result\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_6e85ed137f" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"d8ead88c-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id2\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_2eaa35e964" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"d8ededba-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_8e96e13962" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"d8ee4e72-d22c-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id2_content_0\");\n", + "//# sourceURL=js_651dc3e6c2" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"d8ee9c6a-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"d8ee4e72-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_460fef8c86" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"d8eee36e-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id2\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_e07c5196e8" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The following query is stored at \u001b[1mEven_sql\u001b[0m variable.\n", + "-- Initializing DuckDB environment.\n", + "create schema if not exists logica_home;\n", + "-- Empty record, has to have a field by DuckDB syntax.\n", + "drop type if exists logicarecord893574736 cascade; create type logicarecord893574736 as struct(nirvana numeric);\n", + "create sequence if not exists eternal_logical_sequence;\n", + "\n", + "\n", + "-- Logica type: logicarecord481217614\n", + "drop type if exists logicarecord481217614 cascade; create type logicarecord481217614 as struct(r logicarecord893574736);\n", + "\n", + "-- Logica type: logicarecord383307722\n", + "drop type if exists logicarecord383307722 cascade; create type logicarecord383307722 as struct(a timestamp);\n", + "SELECT\n", + " x_4.unnested_pod AS col0\n", + "FROM\n", + " (select unnest(Range(20)) as unnested_pod) as x_4, (select unnest(Range(20)) as unnested_pod) as x_6\n", + "WHERE\n", + " (x_6.unnested_pod = ((x_4.unnested_pod) / (2)));\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"d8f0663a-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"d8ededba-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_a0a583891e" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"d8f2d7bc-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_6845949f90" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"d8f32c44-d22c-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id2_content_1\");\n", + "//# sourceURL=js_bc9cb5bf81" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"d8f37dfc-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"d8f32c44-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_34b4e2532d" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"d8f3cd48-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id2\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_a258cf0cef" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The following table is stored at \u001b[1mEven\u001b[0m variable.\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
col0
00
12
24
36
48
510
612
714
816
918
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"d8f5b022-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"d8f2d7bc-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_c7a966877d" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"d8f7dd2a-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"d8e4ed78-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_6fc3ddd8e3" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"d8fabb9e-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_0c46c4bdb6" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"d8fb1468-d22c-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id1_content_1\");\n", + "//# sourceURL=js_b8a463fb13" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"d8fb663e-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"d8fb1468-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_5dbbc44e8e" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"d8fc0706-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id1\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_99034b80a3" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "image/svg+xml": "\n\n\n\n\n\nConcertina\n\n\n\nEven\n\nEven\n\n\n\n", + "text/plain": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Running predicate: Even (34 ms)\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"d93a3436-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"d8fabb9e-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_6b5090664c" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"d93d8e74-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_32c59c7a59" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"d93de70c-d22c-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id1_content_0\");\n", + "//# sourceURL=js_1ce3c80aee" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"d93e37fc-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"d93de70c-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_e0b45e9d88" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"d93e83ba-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id1\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_8bf70e05f6" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"d940b7de-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_669538e899" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"d9410c16-d22c-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id2_content_1\");\n", + "//# sourceURL=js_adbda08dd6" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"d941d966-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"d9410c16-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_16b924930e" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"d9422cea-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id2\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_e5da800df5" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"d9458ea8-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"d940b7de-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_4fccf7275a" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + " \n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"d9480b92-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"d93d8e74-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_72a7e264a9" + ] + }, + "metadata": {} + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "pmdQtLQQy4eJ" + }, + "source": [ + "In CoLab any evaluated predicate can be accessed from Python via a dataframe variable of the same name.\n", + "\n" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "Po5bJhuny4vF", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "5586d7bc-a4ad-4fff-fc6d-048c8edd5116" + }, + "source": [ + "print('Even numbers:', ', '.join(map(str, Even['col0'])))" + ], + "execution_count": 4, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Even numbers: 0, 2, 4, 6, 8, 10, 12, 14, 16, 18\n" + ] + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Qr42t7sX18PI" + }, + "source": [ + "You can **create a copy of this tutorial** and tweak the querries. Querries run instantly via BigQuery." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "WNvuoVPJVzHg" + }, + "source": [ + "## Facts (aka Tables)\n", + "\n", + "You can specify a table row-by-row as follows." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "E5CxNQgaRoNU", + "colab": { + "resources": { + "http://localhost:8080/nbextensions/google.colab/tabbar.css": { + "data": "Lmdvb2ctdGFie3Bvc2l0aW9uOnJlbGF0aXZlO3BhZGRpbmc6NHB4IDhweDtjb2xvcjojMDBjO3RleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7Y3Vyc29yOmRlZmF1bHR9Lmdvb2ctdGFiLWJhci10b3AgLmdvb2ctdGFie21hcmdpbjoxcHggNHB4IDAgMDtib3JkZXItYm90dG9tOjA7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLXRvcDphZnRlciwuZ29vZy10YWItYmFyLWJvdHRvbTphZnRlcntjb250ZW50OiIgIjtkaXNwbGF5OmJsb2NrO2hlaWdodDowO2NsZWFyOmJvdGg7dmlzaWJpbGl0eTpoaWRkZW59Lmdvb2ctdGFiLWJhci1ib3R0b20gLmdvb2ctdGFie21hcmdpbjowIDRweCAxcHggMDtib3JkZXItdG9wOjA7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLXN0YXJ0IC5nb29nLXRhYnttYXJnaW46MCAwIDRweCAxcHg7Ym9yZGVyLXJpZ2h0OjB9Lmdvb2ctdGFiLWJhci1lbmQgLmdvb2ctdGFie21hcmdpbjowIDFweCA0cHggMDtib3JkZXItbGVmdDowfS5nb29nLXRhYi1ob3ZlcntiYWNrZ3JvdW5kOiNlZWV9Lmdvb2ctdGFiLWRpc2FibGVke2NvbG9yOiM2NjZ9Lmdvb2ctdGFiLXNlbGVjdGVke2NvbG9yOiMwMDA7YmFja2dyb3VuZDojZmZmO3RleHQtZGVjb3JhdGlvbjpub25lO2ZvbnQtd2VpZ2h0OmJvbGQ7Ym9yZGVyOjFweCBzb2xpZCAjNmI5MGRhfS5nb29nLXRhYi1iYXItdG9we3BhZGRpbmctdG9wOjVweCFpbXBvcnRhbnQ7cGFkZGluZy1sZWZ0OjVweCFpbXBvcnRhbnQ7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgIzZiOTBkYSFpbXBvcnRhbnR9Lmdvb2ctdGFiLWJhci10b3AgLmdvb2ctdGFiLXNlbGVjdGVke3RvcDoxcHg7bWFyZ2luLXRvcDowO3BhZGRpbmctYm90dG9tOjVweH0uZ29vZy10YWItYmFyLWJvdHRvbSAuZ29vZy10YWItc2VsZWN0ZWR7dG9wOi0xcHg7bWFyZ2luLWJvdHRvbTowO3BhZGRpbmctdG9wOjVweH0uZ29vZy10YWItYmFyLXN0YXJ0IC5nb29nLXRhYi1zZWxlY3RlZHtsZWZ0OjFweDttYXJnaW4tbGVmdDowO3BhZGRpbmctcmlnaHQ6OXB4fS5nb29nLXRhYi1iYXItZW5kIC5nb29nLXRhYi1zZWxlY3RlZHtsZWZ0Oi0xcHg7bWFyZ2luLXJpZ2h0OjA7cGFkZGluZy1sZWZ0OjlweH0uZ29vZy10YWItYmFye21hcmdpbjowO2JvcmRlcjowO3BhZGRpbmc6MDtsaXN0LXN0eWxlOm5vbmU7Y3Vyc29yOmRlZmF1bHQ7b3V0bGluZTpub25lO2JhY2tncm91bmQ6I2ViZWZmOX0uZ29vZy10YWItYmFyLWNsZWFye2NsZWFyOmJvdGg7aGVpZ2h0OjA7b3ZlcmZsb3c6aGlkZGVufS5nb29nLXRhYi1iYXItc3RhcnR7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLWVuZHtmbG9hdDpyaWdodH0qIGh0bWwgLmdvb2ctdGFiLWJhci1zdGFydHttYXJnaW4tcmlnaHQ6LTNweH0qIGh0bWwgLmdvb2ctdGFiLWJhci1lbmR7bWFyZ2luLWxlZnQ6LTNweH1zZW50aW5lbHt9", + "ok": true, + "headers": [ + [ + "content-length", + "1404" + ], + [ + "content-type", + "text/css" + ] + ], + "status": 200, + "status_text": "" + }, + "http://localhost:8080/nbextensions/google.colab/tabbar_main.min.js": { + "data": "Ly8gY2xhbmctZm9ybWF0IG9mZgooZnVuY3Rpb24oKXt2YXIgZyxhYT1mdW5jdGlvbihhKXt2YXIgYj0wO3JldHVybiBmdW5jdGlvbigpe3JldHVybiBiPGEubGVuZ3RoP3tkb25lOiExLHZhbHVlOmFbYisrXX06e2RvbmU6ITB9fX0sYmE9dHlwZW9mIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzPT0iZnVuY3Rpb24iP09iamVjdC5kZWZpbmVQcm9wZXJ0eTpmdW5jdGlvbihhLGIsYyl7aWYoYT09QXJyYXkucHJvdG90eXBlfHxhPT1PYmplY3QucHJvdG90eXBlKXJldHVybiBhO2FbYl09Yy52YWx1ZTtyZXR1cm4gYX0sY2E9ZnVuY3Rpb24oYSl7YT1bIm9iamVjdCI9PXR5cGVvZiBnbG9iYWxUaGlzJiZnbG9iYWxUaGlzLGEsIm9iamVjdCI9PXR5cGVvZiB3aW5kb3cmJndpbmRvdywib2JqZWN0Ij09dHlwZW9mIHNlbGYmJnNlbGYsIm9iamVjdCI9PXR5cGVvZiBnbG9iYWwmJmdsb2JhbF07Zm9yKHZhciBiPTA7YjxhLmxlbmd0aDsrK2Ipe3ZhciBjPWFbYl07aWYoYyYmYy5NYXRoPT1NYXRoKXJldHVybiBjfXRocm93IEVycm9yKCJDYW5ub3QgZmluZCBnbG9iYWwgb2JqZWN0Iik7Cn0sZGE9Y2EodGhpcyksZWE9ZnVuY3Rpb24oYSxiKXtpZihiKWE6e3ZhciBjPWRhO2E9YS5zcGxpdCgiLiIpO2Zvcih2YXIgZD0wO2Q8YS5sZW5ndGgtMTtkKyspe3ZhciBlPWFbZF07aWYoIShlIGluIGMpKWJyZWFrIGE7Yz1jW2VdfWE9YVthLmxlbmd0aC0xXTtkPWNbYV07Yj1iKGQpO2IhPWQmJmIhPW51bGwmJmJhKGMsYSx7Y29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOmJ9KX19OwplYSgiU3ltYm9sIixmdW5jdGlvbihhKXtpZihhKXJldHVybiBhO3ZhciBiPWZ1bmN0aW9uKGYsaCl7dGhpcy5nPWY7YmEodGhpcywiZGVzY3JpcHRpb24iLHtjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6aH0pfTtiLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmd9O3ZhciBjPSJqc2NvbXBfc3ltYm9sXyIrKE1hdGgucmFuZG9tKCkqMUU5Pj4+MCkrIl8iLGQ9MCxlPWZ1bmN0aW9uKGYpe2lmKHRoaXMgaW5zdGFuY2VvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoIlN5bWJvbCBpcyBub3QgYSBjb25zdHJ1Y3RvciIpO3JldHVybiBuZXcgYihjKyhmfHwiIikrIl8iK2QrKyxmKX07cmV0dXJuIGV9KTsKdmFyIGZhPWZ1bmN0aW9uKGEpe3ZhciBiPXR5cGVvZiBTeW1ib2whPSJ1bmRlZmluZWQiJiZTeW1ib2wuaXRlcmF0b3ImJmFbU3ltYm9sLml0ZXJhdG9yXTtpZihiKXJldHVybiBiLmNhbGwoYSk7aWYodHlwZW9mIGEubGVuZ3RoPT0ibnVtYmVyIilyZXR1cm57bmV4dDphYShhKX07dGhyb3cgRXJyb3IoU3RyaW5nKGEpKyIgaXMgbm90IGFuIGl0ZXJhYmxlIG9yIEFycmF5TGlrZSIpO307ZWEoIlN5bWJvbC5kaXNwb3NlIixmdW5jdGlvbihhKXtyZXR1cm4gYT9hOlN5bWJvbCgiU3ltYm9sLmRpc3Bvc2UiKX0pOy8qCgogQ29weXJpZ2h0IFRoZSBDbG9zdXJlIExpYnJhcnkgQXV0aG9ycy4KIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wCiovCnZhciBsPXRoaXN8fHNlbGYsaWE9ZnVuY3Rpb24oYSl7YS5JYT12b2lkIDA7YS5WPWZ1bmN0aW9uKCl7cmV0dXJuIGEuSWE/YS5JYTphLklhPW5ldyBhfX0samE9ZnVuY3Rpb24oYSl7dmFyIGI9dHlwZW9mIGE7cmV0dXJuIGIhPSJvYmplY3QiP2I6YT9BcnJheS5pc0FycmF5KGEpPyJhcnJheSI6YjoibnVsbCJ9LGthPWZ1bmN0aW9uKGEpe3ZhciBiPWphKGEpO3JldHVybiBiPT0iYXJyYXkifHxiPT0ib2JqZWN0IiYmdHlwZW9mIGEubGVuZ3RoPT0ibnVtYmVyIn0sbT1mdW5jdGlvbihhKXt2YXIgYj10eXBlb2YgYTtyZXR1cm4gYj09Im9iamVjdCImJmEhPW51bGx8fGI9PSJmdW5jdGlvbiJ9LG5hPWZ1bmN0aW9uKGEpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYSxsYSkmJmFbbGFdfHwoYVtsYV09KyttYSl9LGxhPSJjbG9zdXJlX3VpZF8iKyhNYXRoLnJhbmRvbSgpKjFFOT4+PjApLG1hPTAsbj1mdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoKXt9Yy5wcm90b3R5cGU9CmIucHJvdG90eXBlO2EubD1iLnByb3RvdHlwZTthLnByb3RvdHlwZT1uZXcgYzthLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1hO2EucWQ9ZnVuY3Rpb24oZCxlLGYpe2Zvcih2YXIgaD1BcnJheShhcmd1bWVudHMubGVuZ3RoLTIpLGs9MjtrPGFyZ3VtZW50cy5sZW5ndGg7aysrKWhbay0yXT1hcmd1bWVudHNba107cmV0dXJuIGIucHJvdG90eXBlW2VdLmFwcGx5KGQsaCl9fTtmdW5jdGlvbiBvYShhLGIpe2lmKEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKUVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsb2EpO2Vsc2V7dmFyIGM9RXJyb3IoKS5zdGFjaztjJiYodGhpcy5zdGFjaz1jKX1hJiYodGhpcy5tZXNzYWdlPVN0cmluZyhhKSk7YiE9PXZvaWQgMCYmKHRoaXMuY2F1c2U9Yil9bihvYSxFcnJvcik7b2EucHJvdG90eXBlLm5hbWU9IkN1c3RvbUVycm9yIjt2YXIgcGE7ZnVuY3Rpb24gcWEoYSxiKXthPWEuc3BsaXQoIiVzIik7Zm9yKHZhciBjPSIiLGQ9YS5sZW5ndGgtMSxlPTA7ZTxkO2UrKyljKz1hW2VdKyhlPGIubGVuZ3RoP2JbZV06IiVzIik7b2EuY2FsbCh0aGlzLGMrYVtkXSl9bihxYSxvYSk7cWEucHJvdG90eXBlLm5hbWU9IkFzc2VydGlvbkVycm9yIjtmdW5jdGlvbiByYShhLGIsYyxkKXt2YXIgZT0iQXNzZXJ0aW9uIGZhaWxlZCI7aWYoYyl7ZSs9IjogIitjO3ZhciBmPWR9ZWxzZSBhJiYoZSs9IjogIithLGY9Yik7dGhyb3cgbmV3IHFhKCIiK2UsZnx8W10pO30KdmFyIHA9ZnVuY3Rpb24oYSxiLGMpe2F8fHJhKCIiLG51bGwsYixBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMikpO3JldHVybiBhfSxzYT1mdW5jdGlvbihhLGIsYyl7bShhKSYmYS5ub2RlVHlwZT09MXx8cmEoIkV4cGVjdGVkIEVsZW1lbnQgYnV0IGdvdCAlczogJXMuIixbamEoYSksYV0sYixBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMikpfSx1YT1mdW5jdGlvbihhLGIsYyxkKXthIGluc3RhbmNlb2YgYnx8cmEoIkV4cGVjdGVkIGluc3RhbmNlb2YgJXMgYnV0IGdvdCAlcy4iLFt0YShiKSx0YShhKV0sYyxBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMykpfTsKZnVuY3Rpb24gdGEoYSl7cmV0dXJuIGEgaW5zdGFuY2VvZiBGdW5jdGlvbj9hLmRpc3BsYXlOYW1lfHxhLm5hbWV8fCJ1bmtub3duIHR5cGUgbmFtZSI6YSBpbnN0YW5jZW9mIE9iamVjdD9hLmNvbnN0cnVjdG9yLmRpc3BsYXlOYW1lfHxhLmNvbnN0cnVjdG9yLm5hbWV8fE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhKTphPT09bnVsbD8ibnVsbCI6dHlwZW9mIGF9O3ZhciB2YT1BcnJheS5wcm90b3R5cGUuaW5kZXhPZj9mdW5jdGlvbihhLGIpe3AoYS5sZW5ndGghPW51bGwpO3JldHVybiBBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKGEsYix2b2lkIDApfTpmdW5jdGlvbihhLGIpe2lmKHR5cGVvZiBhPT09InN0cmluZyIpcmV0dXJuIHR5cGVvZiBiIT09InN0cmluZyJ8fGIubGVuZ3RoIT0xPy0xOmEuaW5kZXhPZihiLDApO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWlmKGMgaW4gYSYmYVtjXT09PWIpcmV0dXJuIGM7cmV0dXJuLTF9LHdhPUFycmF5LnByb3RvdHlwZS5mb3JFYWNoP2Z1bmN0aW9uKGEsYil7cChhLmxlbmd0aCE9bnVsbCk7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChhLGIsdm9pZCAwKX06ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9YS5sZW5ndGgsZD10eXBlb2YgYT09PSJzdHJpbmciP2Euc3BsaXQoIiIpOmEsZT0wO2U8YztlKyspZSBpbiBkJiZiLmNhbGwodm9pZCAwLGRbZV0sZSxhKX07CmZ1bmN0aW9uIHhhKGEsYil7Yj12YShhLGIpO3ZhciBjO2lmKGM9Yj49MClwKGEubGVuZ3RoIT1udWxsKSxBcnJheS5wcm90b3R5cGUuc3BsaWNlLmNhbGwoYSxiLDEpO3JldHVybiBjfWZ1bmN0aW9uIHlhKGEpe3ZhciBiPWEubGVuZ3RoO2lmKGI+MCl7Zm9yKHZhciBjPUFycmF5KGIpLGQ9MDtkPGI7ZCsrKWNbZF09YVtkXTtyZXR1cm4gY31yZXR1cm5bXX1mdW5jdGlvbiB6YShhLGIsYyxkKXtwKGEubGVuZ3RoIT1udWxsKTtBcnJheS5wcm90b3R5cGUuc3BsaWNlLmFwcGx5KGEsQWEoYXJndW1lbnRzLDEpKX1mdW5jdGlvbiBBYShhLGIsYyl7cChhLmxlbmd0aCE9bnVsbCk7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg8PTI/QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYSxiKTpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhLGIsYyl9O2Z1bmN0aW9uIEJhKGEsYixjKXtmb3IodmFyIGQgaW4gYSliLmNhbGwoYyxhW2RdLGQsYSl9ZnVuY3Rpb24gQ2EoYSxiKXtmb3IodmFyIGMgaW4gYSlpZihhW2NdPT1iKXJldHVybiEwO3JldHVybiExfWZ1bmN0aW9uIERhKGEsYixjKXtpZihhIT09bnVsbCYmYiBpbiBhKXRocm93IEVycm9yKCdUaGUgb2JqZWN0IGFscmVhZHkgY29udGFpbnMgdGhlIGtleSAiJytiKyciJyk7YVtiXT1jfWZ1bmN0aW9uIEVhKGEpe3ZhciBiPXt9LGM7Zm9yKGMgaW4gYSliW2FbY11dPWM7cmV0dXJuIGJ9dmFyIEZhPSJjb25zdHJ1Y3RvciBoYXNPd25Qcm9wZXJ0eSBpc1Byb3RvdHlwZU9mIHByb3BlcnR5SXNFbnVtZXJhYmxlIHRvTG9jYWxlU3RyaW5nIHRvU3RyaW5nIHZhbHVlT2YiLnNwbGl0KCIgIik7CmZ1bmN0aW9uIEdhKGEsYil7Zm9yKHZhciBjLGQsZT0xO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspe2Q9YXJndW1lbnRzW2VdO2ZvcihjIGluIGQpYVtjXT1kW2NdO2Zvcih2YXIgZj0wO2Y8RmEubGVuZ3RoO2YrKyljPUZhW2ZdLE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChkLGMpJiYoYVtjXT1kW2NdKX19O3ZhciBIYT1TdHJpbmcucHJvdG90eXBlLnRyaW0/ZnVuY3Rpb24oYSl7cmV0dXJuIGEudHJpbSgpfTpmdW5jdGlvbihhKXtyZXR1cm4vXltcc1x4YTBdKihbXHNcU10qPylbXHNceGEwXSokLy5leGVjKGEpWzFdfTsvKgoKIENvcHlyaWdodCBHb29nbGUgTExDCiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMAoqLwp2YXIgSWE9e307dmFyIEphPWZ1bmN0aW9uKGEpe2lmKElhIT09SWEpdGhyb3cgRXJyb3IoIkJhZCBzZWNyZXQiKTt0aGlzLmc9YX07SmEucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ307bmV3IEphKCJhYm91dDpibGFuayIpO25ldyBKYSgiYWJvdXQ6aW52YWxpZCN6Q2xvc3VyZXoiKTt2YXIgS2E9W10sTGE9ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJBIFVSTCB3aXRoIGNvbnRlbnQgJyIrYSsiJyB3YXMgc2FuaXRpemVkIGF3YXkuIil9O0thLmluZGV4T2YoTGEpPT09LTEmJkthLnB1c2goTGEpO3ZhciBNYSxOYTthOntmb3IodmFyIE9hPVsiQ0xPU1VSRV9GTEFHUyJdLFBhPWwsUWE9MDtRYTxPYS5sZW5ndGg7UWErKylpZihQYT1QYVtPYVtRYV1dLFBhPT1udWxsKXtOYT1udWxsO2JyZWFrIGF9TmE9UGF9dmFyIFJhPU5hJiZOYVs2MTA0MDEzMDFdO01hPVJhIT1udWxsP1JhOiExO2Z1bmN0aW9uIFNhKCl7dmFyIGE9bC5uYXZpZ2F0b3I7cmV0dXJuIGEmJihhPWEudXNlckFnZW50KT9hOiIifXZhciBUYSxVYT1sLm5hdmlnYXRvcjtUYT1VYT9VYS51c2VyQWdlbnREYXRhfHxudWxsOm51bGw7ZnVuY3Rpb24gcihhKXtyZXR1cm4gU2EoKS5pbmRleE9mKGEpIT0tMX07dmFyIFZhPXIoIkVkZ2UiKSx0PXIoIkdlY2tvIikmJiEoU2EoKS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoIndlYmtpdCIpIT0tMSYmIXIoIkVkZ2UiKSkmJiEocigiVHJpZGVudCIpfHxyKCJNU0lFIikpJiYhcigiRWRnZSIpLHU9U2EoKS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoIndlYmtpdCIpIT0tMSYmIXIoIkVkZ2UiKSx2PU1hJiZUYSYmVGEucGxhdGZvcm0/VGEucGxhdGZvcm09PT0ibWFjT1MiOnIoIk1hY2ludG9zaCIpO3ZhciBYYT1mdW5jdGlvbihhLGIpe0JhKGIsZnVuY3Rpb24oYyxkKXtkPT0ic3R5bGUiP2Euc3R5bGUuY3NzVGV4dD1jOmQ9PSJjbGFzcyI/YS5jbGFzc05hbWU9YzpkPT0iZm9yIj9hLmh0bWxGb3I9YzpXYS5oYXNPd25Qcm9wZXJ0eShkKT9hLnNldEF0dHJpYnV0ZShXYVtkXSxjKTpkLmxhc3RJbmRleE9mKCJhcmlhLSIsMCk9PTB8fGQubGFzdEluZGV4T2YoImRhdGEtIiwwKT09MD9hLnNldEF0dHJpYnV0ZShkLGMpOmFbZF09Y30pfSxXYT17Y2VsbHBhZGRpbmc6ImNlbGxQYWRkaW5nIixjZWxsc3BhY2luZzoiY2VsbFNwYWNpbmciLGNvbHNwYW46ImNvbFNwYW4iLGZyYW1lYm9yZGVyOiJmcmFtZUJvcmRlciIsaGVpZ2h0OiJoZWlnaHQiLG1heGxlbmd0aDoibWF4TGVuZ3RoIixub25jZToibm9uY2UiLHJvbGU6InJvbGUiLHJvd3NwYW46InJvd1NwYW4iLHR5cGU6InR5cGUiLHVzZW1hcDoidXNlTWFwIix2YWxpZ246InZBbGlnbiIsd2lkdGg6IndpZHRoIn0sWWE9ZnVuY3Rpb24oYSwKYixjKXtmdW5jdGlvbiBkKGspe2smJmIuYXBwZW5kQ2hpbGQodHlwZW9mIGs9PT0ic3RyaW5nIj9hLmNyZWF0ZVRleHROb2RlKGspOmspfWZvcih2YXIgZT0yO2U8Yy5sZW5ndGg7ZSsrKXt2YXIgZj1jW2VdO2lmKCFrYShmKXx8bShmKSYmZi5ub2RlVHlwZT4wKWQoZik7ZWxzZXthOntpZihmJiZ0eXBlb2YgZi5sZW5ndGg9PSJudW1iZXIiKXtpZihtKGYpKXt2YXIgaD10eXBlb2YgZi5pdGVtPT0iZnVuY3Rpb24ifHx0eXBlb2YgZi5pdGVtPT0ic3RyaW5nIjticmVhayBhfWlmKHR5cGVvZiBmPT09ImZ1bmN0aW9uIil7aD10eXBlb2YgZi5pdGVtPT0iZnVuY3Rpb24iO2JyZWFrIGF9fWg9ITF9d2EoaD95YShmKTpmLGQpfX19LFphPWZ1bmN0aW9uKGEsYil7Yj1TdHJpbmcoYik7YS5jb250ZW50VHlwZT09PSJhcHBsaWNhdGlvbi94aHRtbCt4bWwiJiYoYj1iLnRvTG93ZXJDYXNlKCkpO3JldHVybiBhLmNyZWF0ZUVsZW1lbnQoYil9LCRhPWZ1bmN0aW9uKGEpe2EmJmEucGFyZW50Tm9kZSYmCmEucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhKX0sYWI9ZnVuY3Rpb24oYSxiKXtpZighYXx8IWIpcmV0dXJuITE7aWYoYS5jb250YWlucyYmYi5ub2RlVHlwZT09MSlyZXR1cm4gYT09Ynx8YS5jb250YWlucyhiKTtpZih0eXBlb2YgYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiE9InVuZGVmaW5lZCIpcmV0dXJuIGE9PWJ8fCEhKGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24oYikmMTYpO2Zvcig7YiYmYSE9YjspYj1iLnBhcmVudE5vZGU7cmV0dXJuIGI9PWF9LGJiPWZ1bmN0aW9uKGEpe3AoYSwiTm9kZSBjYW5ub3QgYmUgbnVsbCBvciB1bmRlZmluZWQuIik7cmV0dXJuIGEubm9kZVR5cGU9PTk/YTphLm93bmVyRG9jdW1lbnR8fGEuZG9jdW1lbnR9LGNiPWZ1bmN0aW9uKGEsYil7Yj9hLnRhYkluZGV4PTA6KGEudGFiSW5kZXg9LTEsYS5yZW1vdmVBdHRyaWJ1dGUoInRhYkluZGV4IikpfSxkYj1mdW5jdGlvbihhKXtyZXR1cm4gYS5oYXNBdHRyaWJ1dGUoInRhYmluZGV4Iil9LGViPQpmdW5jdGlvbihhKXthPWEudGFiSW5kZXg7cmV0dXJuIHR5cGVvZiBhPT09Im51bWJlciImJmE+PTAmJmE8MzI3Njh9LGZiPWZ1bmN0aW9uKGEpe3RoaXMuZz1hfHxsLmRvY3VtZW50fHxkb2N1bWVudH07ZmIucHJvdG90eXBlLmk9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nO3JldHVybiB0eXBlb2YgYT09PSJzdHJpbmciP2IuZ2V0RWxlbWVudEJ5SWQoYSk6YX07ZmIucHJvdG90eXBlLmg9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXMuZyxlPWFyZ3VtZW50cyxmPWVbMV0saD1aYShkLFN0cmluZyhlWzBdKSk7ZiYmKHR5cGVvZiBmPT09InN0cmluZyI/aC5jbGFzc05hbWU9ZjpBcnJheS5pc0FycmF5KGYpP2guY2xhc3NOYW1lPWYuam9pbigiICIpOlhhKGgsZikpO2UubGVuZ3RoPjImJllhKGQsaCxlKTtyZXR1cm4gaH07dmFyIHc9ZnVuY3Rpb24oKXt0aGlzLmJhPXRoaXMuYmE7dGhpcy5rYT10aGlzLmthfTt3LnByb3RvdHlwZS5iYT0hMTt3LnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7dGhpcy5iYXx8KHRoaXMuYmE9ITAsdGhpcy5DKCkpfTt3LnByb3RvdHlwZVtTeW1ib2wuZGlzcG9zZV09ZnVuY3Rpb24oKXt0aGlzLmRpc3Bvc2UoKX07dy5wcm90b3R5cGUuQz1mdW5jdGlvbigpe2lmKHRoaXMua2EpZm9yKDt0aGlzLmthLmxlbmd0aDspdGhpcy5rYS5zaGlmdCgpKCl9O3ZhciB5PWZ1bmN0aW9uKGEsYil7dGhpcy50eXBlPWE7dGhpcy51PXRoaXMudGFyZ2V0PWI7dGhpcy5kZWZhdWx0UHJldmVudGVkPXRoaXMuQT0hMX07eS5wcm90b3R5cGUudj1mdW5jdGlvbigpe3RoaXMuQT0hMH07eS5wcm90b3R5cGUuaj1mdW5jdGlvbigpe3RoaXMuZGVmYXVsdFByZXZlbnRlZD0hMH07dmFyIGdiPWZ1bmN0aW9uKCl7aWYoIWwuYWRkRXZlbnRMaXN0ZW5lcnx8IU9iamVjdC5kZWZpbmVQcm9wZXJ0eSlyZXR1cm4hMTt2YXIgYT0hMSxiPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwicGFzc2l2ZSIse2dldDpmdW5jdGlvbigpe2E9ITB9fSk7dHJ5e3ZhciBjPWZ1bmN0aW9uKCl7fTtsLmFkZEV2ZW50TGlzdGVuZXIoInRlc3QiLGMsYik7bC5yZW1vdmVFdmVudExpc3RlbmVyKCJ0ZXN0IixjLGIpfWNhdGNoKGQpe31yZXR1cm4gYX0oKTt2YXIgej1mdW5jdGlvbihhLGIpe3kuY2FsbCh0aGlzLGE/YS50eXBlOiIiKTt0aGlzLnJlbGF0ZWRUYXJnZXQ9dGhpcy51PXRoaXMudGFyZ2V0PW51bGw7dGhpcy5idXR0b249dGhpcy5zY3JlZW5ZPXRoaXMuc2NyZWVuWD10aGlzLmNsaWVudFk9dGhpcy5jbGllbnRYPTA7dGhpcy5rZXk9IiI7dGhpcy5nPTA7dGhpcy5tZXRhS2V5PXRoaXMuc2hpZnRLZXk9dGhpcy5hbHRLZXk9dGhpcy5jdHJsS2V5PSExO3RoaXMuc3RhdGU9bnVsbDt0aGlzLkc9ITE7dGhpcy5wb2ludGVySWQ9MDt0aGlzLnBvaW50ZXJUeXBlPSIiO3RoaXMudGltZVN0YW1wPTA7dGhpcy5oPW51bGw7aWYoYSl7dmFyIGM9dGhpcy50eXBlPWEudHlwZSxkPWEuY2hhbmdlZFRvdWNoZXMmJmEuY2hhbmdlZFRvdWNoZXMubGVuZ3RoP2EuY2hhbmdlZFRvdWNoZXNbMF06bnVsbDt0aGlzLnRhcmdldD1hLnRhcmdldHx8YS5zcmNFbGVtZW50O3RoaXMudT1iO2I9YS5yZWxhdGVkVGFyZ2V0O2J8fChjPT0ibW91c2VvdmVyIj8KYj1hLmZyb21FbGVtZW50OmM9PSJtb3VzZW91dCImJihiPWEudG9FbGVtZW50KSk7dGhpcy5yZWxhdGVkVGFyZ2V0PWI7ZD8odGhpcy5jbGllbnRYPWQuY2xpZW50WCE9PXZvaWQgMD9kLmNsaWVudFg6ZC5wYWdlWCx0aGlzLmNsaWVudFk9ZC5jbGllbnRZIT09dm9pZCAwP2QuY2xpZW50WTpkLnBhZ2VZLHRoaXMuc2NyZWVuWD1kLnNjcmVlblh8fDAsdGhpcy5zY3JlZW5ZPWQuc2NyZWVuWXx8MCk6KHRoaXMuY2xpZW50WD1hLmNsaWVudFghPT12b2lkIDA/YS5jbGllbnRYOmEucGFnZVgsdGhpcy5jbGllbnRZPWEuY2xpZW50WSE9PXZvaWQgMD9hLmNsaWVudFk6YS5wYWdlWSx0aGlzLnNjcmVlblg9YS5zY3JlZW5YfHwwLHRoaXMuc2NyZWVuWT1hLnNjcmVlbll8fDApO3RoaXMuYnV0dG9uPWEuYnV0dG9uO3RoaXMuZz1hLmtleUNvZGV8fDA7dGhpcy5rZXk9YS5rZXl8fCIiO3RoaXMuY3RybEtleT1hLmN0cmxLZXk7dGhpcy5hbHRLZXk9YS5hbHRLZXk7dGhpcy5zaGlmdEtleT1hLnNoaWZ0S2V5Owp0aGlzLm1ldGFLZXk9YS5tZXRhS2V5O3RoaXMuRz12P2EubWV0YUtleTphLmN0cmxLZXk7dGhpcy5wb2ludGVySWQ9YS5wb2ludGVySWR8fDA7dGhpcy5wb2ludGVyVHlwZT1hLnBvaW50ZXJUeXBlO3RoaXMuc3RhdGU9YS5zdGF0ZTt0aGlzLnRpbWVTdGFtcD1hLnRpbWVTdGFtcDt0aGlzLmg9YTthLmRlZmF1bHRQcmV2ZW50ZWQmJnoubC5qLmNhbGwodGhpcyl9fTtuKHoseSk7ei5wcm90b3R5cGUudj1mdW5jdGlvbigpe3oubC52LmNhbGwodGhpcyk7dGhpcy5oLnN0b3BQcm9wYWdhdGlvbj90aGlzLmguc3RvcFByb3BhZ2F0aW9uKCk6dGhpcy5oLmNhbmNlbEJ1YmJsZT0hMH07ei5wcm90b3R5cGUuaj1mdW5jdGlvbigpe3oubC5qLmNhbGwodGhpcyk7dmFyIGE9dGhpcy5oO2EucHJldmVudERlZmF1bHQ/YS5wcmV2ZW50RGVmYXVsdCgpOmEucmV0dXJuVmFsdWU9ITF9O3ZhciBoYj0iY2xvc3VyZV9saXN0ZW5hYmxlXyIrKE1hdGgucmFuZG9tKCkqMUU2fDApLGliPWZ1bmN0aW9uKGEpe3JldHVybiEoIWF8fCFhW2hiXSl9O3ZhciBqYj0wO3ZhciBrYj1mdW5jdGlvbihhLGIsYyxkLGUpe3RoaXMubGlzdGVuZXI9YTt0aGlzLnByb3h5PW51bGw7dGhpcy5zcmM9Yjt0aGlzLnR5cGU9Yzt0aGlzLmNhcHR1cmU9ISFkO3RoaXMucGE9ZTt0aGlzLmtleT0rK2piO3RoaXMuamE9dGhpcy5vYT0hMX0sbGI9ZnVuY3Rpb24oYSl7YS5qYT0hMDthLmxpc3RlbmVyPW51bGw7YS5wcm94eT1udWxsO2Euc3JjPW51bGw7YS5wYT1udWxsfTt2YXIgbWI9ZnVuY3Rpb24oYSl7dGhpcy5zcmM9YTt0aGlzLmc9e307dGhpcy5oPTB9O21iLnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZj1hLnRvU3RyaW5nKCk7YT10aGlzLmdbZl07YXx8KGE9dGhpcy5nW2ZdPVtdLHRoaXMuaCsrKTt2YXIgaD1uYihhLGIsZCxlKTtoPi0xPyhiPWFbaF0sY3x8KGIub2E9ITEpKTooYj1uZXcga2IoYix0aGlzLnNyYyxmLCEhZCxlKSxiLm9hPWMsYS5wdXNoKGIpKTtyZXR1cm4gYn07CnZhciBvYj1mdW5jdGlvbihhLGIpe3ZhciBjPWIudHlwZTtjIGluIGEuZyYmeGEoYS5nW2NdLGIpJiYobGIoYiksYS5nW2NdLmxlbmd0aD09MCYmKGRlbGV0ZSBhLmdbY10sYS5oLS0pKX0scGI9ZnVuY3Rpb24oYSxiLGMsZCxlKXthPWEuZ1tiLnRvU3RyaW5nKCldO2I9LTE7YSYmKGI9bmIoYSxjLGQsZSkpO3JldHVybiBiPi0xP2FbYl06bnVsbH0sbmI9ZnVuY3Rpb24oYSxiLGMsZCl7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDsrK2Upe3ZhciBmPWFbZV07aWYoIWYuamEmJmYubGlzdGVuZXI9PWImJmYuY2FwdHVyZT09ISFjJiZmLnBhPT1kKXJldHVybiBlfXJldHVybi0xfTt2YXIgcWI9ImNsb3N1cmVfbG1fIisoTWF0aC5yYW5kb20oKSoxRTZ8MCkscmI9e30sc2I9MCx1Yj1mdW5jdGlvbihhLGIsYyxkLGUpe2lmKGQmJmQub25jZSlyZXR1cm4gdGIoYSxiLGMsZCxlKTtpZihBcnJheS5pc0FycmF5KGIpKXtmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKyl1YihhLGJbZl0sYyxkLGUpO3JldHVybiBudWxsfWM9dmIoYyk7cmV0dXJuIGliKGEpP3diKGEsYixjLG0oZCk/ISFkLmNhcHR1cmU6ISFkLGUpOnhiKGEsYixjLCExLGQsZSl9LHhiPWZ1bmN0aW9uKGEsYixjLGQsZSxmKXtpZighYil0aHJvdyBFcnJvcigiSW52YWxpZCBldmVudCB0eXBlIik7dmFyIGg9bShlKT8hIWUuY2FwdHVyZTohIWUsaz15YihhKTtrfHwoYVtxYl09az1uZXcgbWIoYSkpO2M9ay5hZGQoYixjLGQsaCxmKTtpZihjLnByb3h5KXJldHVybiBjO2Q9emIoKTtjLnByb3h5PWQ7ZC5zcmM9YTtkLmxpc3RlbmVyPWM7aWYoYS5hZGRFdmVudExpc3RlbmVyKWdifHwoZT1oKSxlPT09dm9pZCAwJiYKKGU9ITEpLGEuYWRkRXZlbnRMaXN0ZW5lcihiLnRvU3RyaW5nKCksZCxlKTtlbHNlIGlmKGEuYXR0YWNoRXZlbnQpYS5hdHRhY2hFdmVudChBYihiLnRvU3RyaW5nKCkpLGQpO2Vsc2UgaWYoYS5hZGRMaXN0ZW5lciYmYS5yZW1vdmVMaXN0ZW5lcilwKGI9PT0iY2hhbmdlIiwiTWVkaWFRdWVyeUxpc3Qgb25seSBoYXMgYSBjaGFuZ2UgZXZlbnQiKSxhLmFkZExpc3RlbmVyKGQpO2Vsc2UgdGhyb3cgRXJyb3IoImFkZEV2ZW50TGlzdGVuZXIgYW5kIGF0dGFjaEV2ZW50IGFyZSB1bmF2YWlsYWJsZS4iKTtzYisrO3JldHVybiBjfSx6Yj1mdW5jdGlvbigpe3ZhciBhPUJiLGI9ZnVuY3Rpb24oYyl7cmV0dXJuIGEuY2FsbChiLnNyYyxiLmxpc3RlbmVyLGMpfTtyZXR1cm4gYn0sdGI9ZnVuY3Rpb24oYSxiLGMsZCxlKXtpZihBcnJheS5pc0FycmF5KGIpKXtmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKyl0YihhLGJbZl0sYyxkLGUpO3JldHVybiBudWxsfWM9dmIoYyk7cmV0dXJuIGliKGEpPwphLkEuYWRkKFN0cmluZyhiKSxjLCEwLG0oZCk/ISFkLmNhcHR1cmU6ISFkLGUpOnhiKGEsYixjLCEwLGQsZSl9LENiPWZ1bmN0aW9uKGEsYixjLGQsZSl7aWYoQXJyYXkuaXNBcnJheShiKSlmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKylDYihhLGJbZl0sYyxkLGUpO2Vsc2UgZD1tKGQpPyEhZC5jYXB0dXJlOiEhZCxjPXZiKGMpLGliKGEpPyhhPWEuQSxiPVN0cmluZyhiKS50b1N0cmluZygpLGIgaW4gYS5nJiYoZj1hLmdbYl0sYz1uYihmLGMsZCxlKSxjPi0xJiYobGIoZltjXSkscChmLmxlbmd0aCE9bnVsbCksQXJyYXkucHJvdG90eXBlLnNwbGljZS5jYWxsKGYsYywxKSxmLmxlbmd0aD09MCYmKGRlbGV0ZSBhLmdbYl0sYS5oLS0pKSkpOmEmJihhPXliKGEpKSYmKGM9cGIoYSxiLGMsZCxlKSkmJkEoYyl9LEE9ZnVuY3Rpb24oYSl7aWYodHlwZW9mIGEhPT0ibnVtYmVyIiYmYSYmIWEuamEpe3ZhciBiPWEuc3JjO2lmKGliKGIpKW9iKGIuQSxhKTtlbHNle3ZhciBjPWEudHlwZSwKZD1hLnByb3h5O2IucmVtb3ZlRXZlbnRMaXN0ZW5lcj9iLnJlbW92ZUV2ZW50TGlzdGVuZXIoYyxkLGEuY2FwdHVyZSk6Yi5kZXRhY2hFdmVudD9iLmRldGFjaEV2ZW50KEFiKGMpLGQpOmIuYWRkTGlzdGVuZXImJmIucmVtb3ZlTGlzdGVuZXImJmIucmVtb3ZlTGlzdGVuZXIoZCk7c2ItLTsoYz15YihiKSk/KG9iKGMsYSksYy5oPT0wJiYoYy5zcmM9bnVsbCxiW3FiXT1udWxsKSk6bGIoYSl9fX0sQWI9ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW4gcmI/cmJbYV06cmJbYV09Im9uIithfSxCYj1mdW5jdGlvbihhLGIpe2lmKGEuamEpYT0hMDtlbHNle2I9bmV3IHooYix0aGlzKTt2YXIgYz1hLmxpc3RlbmVyLGQ9YS5wYXx8YS5zcmM7YS5vYSYmQShhKTthPWMuY2FsbChkLGIpfXJldHVybiBhfSx5Yj1mdW5jdGlvbihhKXthPWFbcWJdO3JldHVybiBhIGluc3RhbmNlb2YgbWI/YTpudWxsfSxEYj0iX19jbG9zdXJlX2V2ZW50c19mbl8iKyhNYXRoLnJhbmRvbSgpKjFFOT4+PjApLHZiPWZ1bmN0aW9uKGEpe3AoYSwKIkxpc3RlbmVyIGNhbiBub3QgYmUgbnVsbC4iKTtpZih0eXBlb2YgYT09PSJmdW5jdGlvbiIpcmV0dXJuIGE7cChhLmhhbmRsZUV2ZW50LCJBbiBvYmplY3QgbGlzdGVuZXIgbXVzdCBoYXZlIGhhbmRsZUV2ZW50IG1ldGhvZC4iKTthW0RiXXx8KGFbRGJdPWZ1bmN0aW9uKGIpe3JldHVybiBhLmhhbmRsZUV2ZW50KGIpfSk7cmV0dXJuIGFbRGJdfTt2YXIgRWI9ZnVuY3Rpb24oYSl7dy5jYWxsKHRoaXMpO3RoaXMuaD1hO3RoaXMuZz17fX07bihFYix3KTsKdmFyIEZiPVtdLEI9ZnVuY3Rpb24oYSxiLGMsZCl7QXJyYXkuaXNBcnJheShjKXx8KGMmJihGYlswXT1jLnRvU3RyaW5nKCkpLGM9RmIpO2Zvcih2YXIgZT0wO2U8Yy5sZW5ndGg7ZSsrKXt2YXIgZj11YihiLGNbZV0sZHx8YS5oYW5kbGVFdmVudCwhMSxhLmh8fGEpO2lmKCFmKWJyZWFrO2EuZ1tmLmtleV09Zn1yZXR1cm4gYX0sQz1mdW5jdGlvbihhLGIsYyxkLGUsZil7aWYoQXJyYXkuaXNBcnJheShjKSlmb3IodmFyIGg9MDtoPGMubGVuZ3RoO2grKylDKGEsYixjW2hdLGQsZSxmKTtlbHNlIGQ9ZHx8YS5oYW5kbGVFdmVudCxlPW0oZSk/ISFlLmNhcHR1cmU6ISFlLGY9Znx8YS5ofHxhLGQ9dmIoZCksZT0hIWUsYz1pYihiKT9wYihiLkEsU3RyaW5nKGMpLGQsZSxmKTpiPyhiPXliKGIpKT9wYihiLGMsZCxlLGYpOm51bGw6bnVsbCxjJiYoQShjKSxkZWxldGUgYS5nW2Mua2V5XSk7cmV0dXJuIGF9LEdiPWZ1bmN0aW9uKGEpe0JhKGEuZyxmdW5jdGlvbihiLGMpe3RoaXMuZy5oYXNPd25Qcm9wZXJ0eShjKSYmCkEoYil9LGEpO2EuZz17fX07RWIucHJvdG90eXBlLkM9ZnVuY3Rpb24oKXtFYi5sLkMuY2FsbCh0aGlzKTtHYih0aGlzKX07RWIucHJvdG90eXBlLmhhbmRsZUV2ZW50PWZ1bmN0aW9uKCl7dGhyb3cgRXJyb3IoIkV2ZW50SGFuZGxlci5oYW5kbGVFdmVudCBub3QgaW1wbGVtZW50ZWQiKTt9O3ZhciBEPWZ1bmN0aW9uKCl7dy5jYWxsKHRoaXMpO3RoaXMuQT1uZXcgbWIodGhpcyk7dGhpcy5ZYT10aGlzO3RoaXMubGE9bnVsbH07bihELHcpO0QucHJvdG90eXBlW2hiXT0hMDtELnByb3RvdHlwZS5BYT1mdW5jdGlvbihhKXt0aGlzLmxhPWF9O0QucHJvdG90eXBlLnJlbW92ZUV2ZW50TGlzdGVuZXI9ZnVuY3Rpb24oYSxiLGMsZCl7Q2IodGhpcyxhLGIsYyxkKX07CnZhciBFPWZ1bmN0aW9uKGEsYil7SGIoYSk7dmFyIGM9YS5sYTtpZihjKXt2YXIgZD1bXTtmb3IodmFyIGU9MTtjO2M9Yy5sYSlkLnB1c2goYykscCgrK2U8MUUzLCJpbmZpbml0ZSBsb29wIil9YT1hLllhO2M9Yi50eXBlfHxiO3R5cGVvZiBiPT09InN0cmluZyI/Yj1uZXcgeShiLGEpOmIgaW5zdGFuY2VvZiB5P2IudGFyZ2V0PWIudGFyZ2V0fHxhOihlPWIsYj1uZXcgeShjLGEpLEdhKGIsZSkpO2U9ITA7dmFyIGY7aWYoZClmb3IoZj1kLmxlbmd0aC0xOyFiLkEmJmY+PTA7Zi0tKXt2YXIgaD1iLnU9ZFtmXTtlPUliKGgsYywhMCxiKSYmZX1iLkF8fChoPWIudT1hLGU9SWIoaCxjLCEwLGIpJiZlLGIuQXx8KGU9SWIoaCxjLCExLGIpJiZlKSk7aWYoZClmb3IoZj0wOyFiLkEmJmY8ZC5sZW5ndGg7ZisrKWg9Yi51PWRbZl0sZT1JYihoLGMsITEsYikmJmU7cmV0dXJuIGV9OwpELnByb3RvdHlwZS5DPWZ1bmN0aW9uKCl7RC5sLkMuY2FsbCh0aGlzKTtpZih0aGlzLkEpe3ZhciBhPXRoaXMuQSxiPTAsYztmb3IoYyBpbiBhLmcpe2Zvcih2YXIgZD1hLmdbY10sZT0wO2U8ZC5sZW5ndGg7ZSsrKSsrYixsYihkW2VdKTtkZWxldGUgYS5nW2NdO2EuaC0tfX10aGlzLmxhPW51bGx9O3ZhciB3Yj1mdW5jdGlvbihhLGIsYyxkLGUpe0hiKGEpO3JldHVybiBhLkEuYWRkKFN0cmluZyhiKSxjLCExLGQsZSl9LEliPWZ1bmN0aW9uKGEsYixjLGQpe2I9YS5BLmdbU3RyaW5nKGIpXTtpZighYilyZXR1cm4hMDtiPWIuY29uY2F0KCk7Zm9yKHZhciBlPSEwLGY9MDtmPGIubGVuZ3RoOysrZil7dmFyIGg9YltmXTtpZihoJiYhaC5qYSYmaC5jYXB0dXJlPT1jKXt2YXIgaz1oLmxpc3RlbmVyLHE9aC5wYXx8aC5zcmM7aC5vYSYmb2IoYS5BLGgpO2U9ay5jYWxsKHEsZCkhPT0hMSYmZX19cmV0dXJuIGUmJiFkLmRlZmF1bHRQcmV2ZW50ZWR9LEhiPWZ1bmN0aW9uKGEpe3AoYS5BLCJFdmVudCB0YXJnZXQgaXMgbm90IGluaXRpYWxpemVkLiBEaWQgeW91IGNhbGwgdGhlIHN1cGVyY2xhc3MgKGdvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0KSBjb25zdHJ1Y3Rvcj8iKX07dmFyIEpiPXQ/Ik1velVzZXJTZWxlY3QiOnV8fFZhPyJXZWJraXRVc2VyU2VsZWN0IjpudWxsLEtiPWZ1bmN0aW9uKGEsYil7Yj1iP251bGw6YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpO2lmKEpiJiYoYS5zdHlsZSYmKGEuc3R5bGVbSmJdPSJub25lIiksYikpZm9yKHZhciBjPTA7YT1iW2NdO2MrKylhLnN0eWxlJiYoYS5zdHlsZVtKYl09Im5vbmUiKX07dmFyIExiPWZ1bmN0aW9uKCl7fTtpYShMYik7TGIucHJvdG90eXBlLmc9MDt2YXIgRj1mdW5jdGlvbihhKXtELmNhbGwodGhpcyk7dGhpcy5HPWF8fHBhfHwocGE9bmV3IGZiKTt0aGlzLnphPU1iO3RoaXMuWT1udWxsO3RoaXMucz0hMTt0aGlzLmc9bnVsbDt0aGlzLk09dm9pZCAwO3RoaXMudT10aGlzLmo9dGhpcy5oPW51bGw7dGhpcy5TYT0hMX07bihGLEQpO0YucHJvdG90eXBlLlphPUxiLlYoKTsKdmFyIE1iPW51bGwsTmI9ZnVuY3Rpb24oYSxiKXtzd2l0Y2goYSl7Y2FzZSAxOnJldHVybiBiPyJkaXNhYmxlIjoiZW5hYmxlIjtjYXNlIDI6cmV0dXJuIGI/ImhpZ2hsaWdodCI6InVuaGlnaGxpZ2h0IjtjYXNlIDQ6cmV0dXJuIGI/ImFjdGl2YXRlIjoiZGVhY3RpdmF0ZSI7Y2FzZSA4OnJldHVybiBiPyJzZWxlY3QiOiJ1bnNlbGVjdCI7Y2FzZSAxNjpyZXR1cm4gYj8iY2hlY2siOiJ1bmNoZWNrIjtjYXNlIDMyOnJldHVybiBiPyJmb2N1cyI6ImJsdXIiO2Nhc2UgNjQ6cmV0dXJuIGI/Im9wZW4iOiJjbG9zZSJ9dGhyb3cgRXJyb3IoIkludmFsaWQgY29tcG9uZW50IHN0YXRlIik7fSxPYj1mdW5jdGlvbihhKXtyZXR1cm4gYS5ZfHwoYS5ZPSI6IisoYS5aYS5nKyspLnRvU3RyaW5nKDM2KSl9LFBiPWZ1bmN0aW9uKGEsYil7aWYoYS5oJiZhLmgudSl7dmFyIGM9YS5oLnUsZD1hLlk7ZCBpbiBjJiZkZWxldGUgY1tkXTtEYShhLmgudSxiLGEpfWEuWT1ifTtGLnByb3RvdHlwZS5pPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ307CnZhciBRYj1mdW5jdGlvbihhKXthLk18fChhLk09bmV3IEViKGEpKTtyZXR1cm4gcChhLk0pfTtGLnByb3RvdHlwZS5BYT1mdW5jdGlvbihhKXtpZih0aGlzLmgmJnRoaXMuaCE9YSl0aHJvdyBFcnJvcigiTWV0aG9kIG5vdCBzdXBwb3J0ZWQiKTtGLmwuQWEuY2FsbCh0aGlzLGEpfTtGLnByb3RvdHlwZS5tYT1mdW5jdGlvbigpe3RoaXMuZz1aYSh0aGlzLkcuZywiRElWIil9O0YucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbihhKXtSYih0aGlzLGEpfTsKdmFyIFJiPWZ1bmN0aW9uKGEsYixjKXtpZihhLnMpdGhyb3cgRXJyb3IoIkNvbXBvbmVudCBhbHJlYWR5IHJlbmRlcmVkIik7YS5nfHxhLm1hKCk7Yj9iLmluc2VydEJlZm9yZShhLmcsY3x8bnVsbCk6YS5HLmcuYm9keS5hcHBlbmRDaGlsZChhLmcpO2EuaCYmIWEuaC5zfHxhLkkoKX0sU2I9ZnVuY3Rpb24oYSxiKXtpZihhLnMpdGhyb3cgRXJyb3IoIkNvbXBvbmVudCBhbHJlYWR5IHJlbmRlcmVkIik7aWYoYiYmYS53YShiKSl7YS5TYT0hMDt2YXIgYz1iYihiKTthLkcmJmEuRy5nPT1jfHwoYS5HPWI/bmV3IGZiKGJiKGIpKTpwYXx8KHBhPW5ldyBmYikpO2EuRWEoYik7YS5JKCl9ZWxzZSB0aHJvdyBFcnJvcigiSW52YWxpZCBlbGVtZW50IHRvIGRlY29yYXRlIik7fTtnPUYucHJvdG90eXBlO2cud2E9ZnVuY3Rpb24oKXtyZXR1cm4hMH07Zy5FYT1mdW5jdGlvbihhKXt0aGlzLmc9YX07CmcuST1mdW5jdGlvbigpe3RoaXMucz0hMDtUYih0aGlzLGZ1bmN0aW9uKGEpeyFhLnMmJmEuaSgpJiZhLkkoKX0pfTtnLlU9ZnVuY3Rpb24oKXtUYih0aGlzLGZ1bmN0aW9uKGEpe2EucyYmYS5VKCl9KTt0aGlzLk0mJkdiKHRoaXMuTSk7dGhpcy5zPSExfTtnLkM9ZnVuY3Rpb24oKXt0aGlzLnMmJnRoaXMuVSgpO3RoaXMuTSYmKHRoaXMuTS5kaXNwb3NlKCksZGVsZXRlIHRoaXMuTSk7VGIodGhpcyxmdW5jdGlvbihhKXthLmRpc3Bvc2UoKX0pOyF0aGlzLlNhJiZ0aGlzLmcmJiRhKHRoaXMuZyk7dGhpcy5oPXRoaXMuZz10aGlzLnU9dGhpcy5qPW51bGw7Ri5sLkMuY2FsbCh0aGlzKX07Zy5CYT1mdW5jdGlvbihhLGIpe3RoaXMuQ2EoYSxIKHRoaXMpLGIpfTsKZy5DYT1mdW5jdGlvbihhLGIsYyl7cCghIWEsIlByb3ZpZGVkIGVsZW1lbnQgbXVzdCBub3QgYmUgbnVsbC4iKTtpZihhLnMmJihjfHwhdGhpcy5zKSl0aHJvdyBFcnJvcigiQ29tcG9uZW50IGFscmVhZHkgcmVuZGVyZWQiKTtpZihiPDB8fGI+SCh0aGlzKSl0aHJvdyBFcnJvcigiQ2hpbGQgY29tcG9uZW50IGluZGV4IG91dCBvZiBib3VuZHMiKTt0aGlzLnUmJnRoaXMuanx8KHRoaXMudT17fSx0aGlzLmo9W10pO2lmKGEuaD09dGhpcyl7dmFyIGQ9dGhpcy51LGU9T2IoYSk7ZFtlXT1hO3hhKHRoaXMuaixhKX1lbHNlIERhKHRoaXMudSxPYihhKSxhKTtpZihhPT10aGlzKXRocm93IEVycm9yKCJVbmFibGUgdG8gc2V0IHBhcmVudCBjb21wb25lbnQiKTtpZihkPXRoaXMmJmEuaCYmYS5ZKWU9YS5oLGQ9YS5ZLGUudSYmZD8oZT1lLnUsZD0oZSE9PW51bGwmJmQgaW4gZT9lW2RdOnZvaWQgMCl8fG51bGwpOmQ9bnVsbDtpZihkJiZhLmghPXRoaXMpdGhyb3cgRXJyb3IoIlVuYWJsZSB0byBzZXQgcGFyZW50IGNvbXBvbmVudCIpOwphLmg9dGhpcztGLmwuQWEuY2FsbChhLHRoaXMpO3phKHRoaXMuaixiLDAsYSk7YS5zJiZ0aGlzLnMmJmEuaD09dGhpcz8oYz10aGlzLm5hKCksKGMuY2hpbGROb2Rlc1tiXXx8bnVsbCkhPWEuaSgpJiYoYS5pKCkucGFyZW50RWxlbWVudD09YyYmYy5yZW1vdmVDaGlsZChhLmkoKSksYj1jLmNoaWxkTm9kZXNbYl18fG51bGwsYy5pbnNlcnRCZWZvcmUoYS5pKCksYikpKTpjPyh0aGlzLmd8fHRoaXMubWEoKSxiPUkodGhpcyxiKzEpLFJiKGEsdGhpcy5uYSgpLGI/Yi5nOm51bGwpKTp0aGlzLnMmJiFhLnMmJmEuZyYmYS5nLnBhcmVudE5vZGUmJmEuZy5wYXJlbnROb2RlLm5vZGVUeXBlPT0xJiZhLkkoKX07Zy5uYT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmd9Owp2YXIgVWI9ZnVuY3Rpb24oYSl7aWYoYS56YT09bnVsbCl7dmFyIGI9YS5zP2EuZzphLkcuZy5ib2R5O2E6e3ZhciBjPWJiKGIpO2lmKGMuZGVmYXVsdFZpZXcmJmMuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSYmKGM9Yy5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKGIsbnVsbCkpKXtjPWMuZGlyZWN0aW9ufHxjLmdldFByb3BlcnR5VmFsdWUoImRpcmVjdGlvbiIpfHwiIjticmVhayBhfWM9IiJ9YS56YT0icnRsIj09KGN8fChiLmN1cnJlbnRTdHlsZT9iLmN1cnJlbnRTdHlsZS5kaXJlY3Rpb246bnVsbCl8fGIuc3R5bGUmJmIuc3R5bGUuZGlyZWN0aW9uKX1yZXR1cm4gYS56YX0sSD1mdW5jdGlvbihhKXtyZXR1cm4gYS5qP2Euai5sZW5ndGg6MH0sST1mdW5jdGlvbihhLGIpe3JldHVybiBhLmo/YS5qW2JdfHxudWxsOm51bGx9LFRiPWZ1bmN0aW9uKGEsYixjKXthLmomJmEuai5mb3JFYWNoKGIsYyl9LFZiPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuaiYmYj9hLmouaW5kZXhPZihiKToKLTF9O3ZhciBXYj17bWI6ImFjdGl2ZWRlc2NlbmRhbnQiLHJiOiJhdG9taWMiLHNiOiJhdXRvY29tcGxldGUiLHViOiJidXN5Iix4YjoiY2hlY2tlZCIseWI6ImNvbGluZGV4IixEYjoiY29udHJvbHMiLEViOiJjdXJyZW50IixHYjoiZGVzY3JpYmVkYnkiLEpiOiJkaXNhYmxlZCIsTGI6ImRyb3BlZmZlY3QiLE1iOiJleHBhbmRlZCIsTmI6ImZsb3d0byIsUGI6ImdyYWJiZWQiLFRiOiJoYXNwb3B1cCIsVmI6ImhpZGRlbiIsWGI6ImludmFsaWQiLFliOiJsYWJlbCIsWmI6ImxhYmVsbGVkYnkiLGFjOiJsZXZlbCIsZmM6ImxpdmUiLHZjOiJtdWx0aWxpbmUiLHdjOiJtdWx0aXNlbGVjdGFibGUiLEFjOiJvcmllbnRhdGlvbiIsQmM6Im93bnMiLENjOiJwb3NpbnNldCIsRWM6InByZXNzZWQiLEljOiJyZWFkb25seSIsS2M6InJlbGV2YW50IixMYzoicmVxdWlyZWQiLFBjOiJyb3dpbmRleCIsU2M6InNlbGVjdGVkIixVYzoic2V0c2l6ZSIsV2M6InNvcnQiLG1kOiJ2YWx1ZW1heCIsbmQ6InZhbHVlbWluIiwKb2Q6InZhbHVlbm93IixwZDoidmFsdWV0ZXh0In07dmFyIFhiO3ZhciBZYj17bmI6ImFsZXJ0IixvYjoiYWxlcnRkaWFsb2ciLHBiOiJhcHBsaWNhdGlvbiIscWI6ImFydGljbGUiLHRiOiJiYW5uZXIiLHZiOiJidXR0b24iLHdiOiJjaGVja2JveCIsemI6ImNvbHVtbmhlYWRlciIsQWI6ImNvbWJvYm94IixCYjoiY29tcGxlbWVudGFyeSIsQ2I6ImNvbnRlbnRpbmZvIixGYjoiZGVmaW5pdGlvbiIsSGI6ImRpYWxvZyIsSWI6ImRpcmVjdG9yeSIsS2I6ImRvY3VtZW50IixPYjoiZm9ybSIsUWI6ImdyaWQiLFJiOiJncmlkY2VsbCIsU2I6Imdyb3VwIixVYjoiaGVhZGluZyIsV2I6ImltZyIsYmM6ImxpbmsiLGNjOiJsaXN0IixkYzoibGlzdGJveCIsZWM6Imxpc3RpdGVtIixoYzoibG9nIixpYzoibWFpbiIsamM6Im1hcnF1ZWUiLGtjOiJtYXRoIixsYzoibWVudSIsbWM6Im1lbnViYXIiLG5jOiJtZW51aXRlbSIsb2M6Im1lbnVpdGVtY2hlY2tib3giLHBjOiJtZW51aXRlbXJhZGlvIix4YzoibmF2aWdhdGlvbiIseWM6Im5vdGUiLHpjOiJvcHRpb24iLApEYzoicHJlc2VudGF0aW9uIixGYzoicHJvZ3Jlc3NiYXIiLEdjOiJyYWRpbyIsSGM6InJhZGlvZ3JvdXAiLEpjOiJyZWdpb24iLE1jOiJyb3ciLE5jOiJyb3dncm91cCIsT2M6InJvd2hlYWRlciIsUWM6InNjcm9sbGJhciIsUmM6InNlYXJjaCIsVGM6InNlcGFyYXRvciIsVmM6InNsaWRlciIsWGM6InNwaW5idXR0b24iLFljOiJzdGF0dXMiLFpjOiJzd2l0Y2giLGFkOiJ0YWIiLGJkOiJ0YWJsaXN0IixjZDoidGFicGFuZWwiLGRkOiJ0ZXh0Ym94IixlZDoidGV4dGluZm8iLGZkOiJ0aW1lciIsZ2Q6InRvb2xiYXIiLGhkOiJ0b29sdGlwIixqZDoidHJlZSIsa2Q6InRyZWVncmlkIixsZDoidHJlZWl0ZW0ifTt2YXIgWmI9ZnVuY3Rpb24oYSxiKXtiPyhwKENhKFliLGIpLCJObyBzdWNoIEFSSUEgcm9sZSAiK2IpLGEuc2V0QXR0cmlidXRlKCJyb2xlIixiKSk6YS5yZW1vdmVBdHRyaWJ1dGUoInJvbGUiKX0sYWM9ZnVuY3Rpb24oYSxiLGMpe0FycmF5LmlzQXJyYXkoYykmJihjPWMuam9pbigiICIpKTt2YXIgZD0kYihiKTtjPT09IiJ8fGM9PXZvaWQgMD8oWGJ8fChjPXt9LFhiPShjLmF0b21pYz0hMSxjLmF1dG9jb21wbGV0ZT0ibm9uZSIsYy5kcm9wZWZmZWN0PSJub25lIixjLmhhc3BvcHVwPSExLGMubGl2ZT0ib2ZmIixjLm11bHRpbGluZT0hMSxjLm11bHRpc2VsZWN0YWJsZT0hMSxjLm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIsYy5yZWFkb25seT0hMSxjLnJlbGV2YW50PSJhZGRpdGlvbnMgdGV4dCIsYy5yZXF1aXJlZD0hMSxjLnNvcnQ9Im5vbmUiLGMuYnVzeT0hMSxjLmRpc2FibGVkPSExLGMuaGlkZGVuPSExLGMuaW52YWxpZD0iZmFsc2UiLGMpKSxjPVhiLGIgaW4gYz9hLnNldEF0dHJpYnV0ZShkLApjW2JdKTphLnJlbW92ZUF0dHJpYnV0ZShkKSk6YS5zZXRBdHRyaWJ1dGUoZCxjKX0sJGI9ZnVuY3Rpb24oYSl7cChhLCJBUklBIGF0dHJpYnV0ZSBjYW5ub3QgYmUgZW1wdHkuIik7cChDYShXYixhKSwiTm8gc3VjaCBBUklBIGF0dHJpYnV0ZSAiK2EpO3JldHVybiJhcmlhLSIrYX07dmFyIGRjPWZ1bmN0aW9uKGEsYixjLGQsZSxmKXtpZih2JiZlKXJldHVybiBiYyhhKTtpZihlJiYhZClyZXR1cm4hMTtpZighdCl7dHlwZW9mIGI9PT0ibnVtYmVyIiYmKGI9Y2MoYikpO3ZhciBoPWI9PTE3fHxiPT0xOHx8diYmYj09OTE7aWYoKCFjfHx2KSYmaHx8diYmYj09MTYmJihkfHxmKSlyZXR1cm4hMX1pZih1JiZkJiZjKXN3aXRjaChhKXtjYXNlIDIyMDpjYXNlIDIxOTpjYXNlIDIyMTpjYXNlIDE5MjpjYXNlIDE4NjpjYXNlIDE4OTpjYXNlIDE4NzpjYXNlIDE4ODpjYXNlIDE5MDpjYXNlIDE5MTpjYXNlIDE5MjpjYXNlIDIyMjpyZXR1cm4hMX1zd2l0Y2goYSl7Y2FzZSAxMzpyZXR1cm4gdD9mfHxlPyExOiEoYyYmZCk6ITA7Y2FzZSAyNzpyZXR1cm4hdSYmIXR9cmV0dXJuIHQmJihkfHxlfHxmKT8hMTpiYyhhKX0sYmM9ZnVuY3Rpb24oYSl7aWYoYT49NDgmJmE8PTU3fHxhPj05NiYmYTw9MTA2fHxhPj02NSYmYTw9OTB8fHUmJmE9PTApcmV0dXJuITA7c3dpdGNoKGEpe2Nhc2UgMzI6Y2FzZSA0MzpjYXNlIDYzOmNhc2UgNjQ6Y2FzZSAxMDc6Y2FzZSAxMDk6Y2FzZSAxMTA6Y2FzZSAxMTE6Y2FzZSAxODY6Y2FzZSA1OTpjYXNlIDE4OTpjYXNlIDE4NzpjYXNlIDYxOmNhc2UgMTg4OmNhc2UgMTkwOmNhc2UgMTkxOmNhc2UgMTkyOmNhc2UgMjIyOmNhc2UgMjE5OmNhc2UgMjIwOmNhc2UgMjIxOmNhc2UgMTYzOmNhc2UgNTg6cmV0dXJuITA7CmNhc2UgMTczOmNhc2UgMTcxOnJldHVybiB0O2RlZmF1bHQ6cmV0dXJuITF9fSxjYz1mdW5jdGlvbihhKXtpZih0KWE9ZWMoYSk7ZWxzZSBpZih2JiZ1KXN3aXRjaChhKXtjYXNlIDkzOmE9OTF9cmV0dXJuIGF9LGVjPWZ1bmN0aW9uKGEpe3N3aXRjaChhKXtjYXNlIDYxOnJldHVybiAxODc7Y2FzZSA1OTpyZXR1cm4gMTg2O2Nhc2UgMTczOnJldHVybiAxODk7Y2FzZSAyMjQ6cmV0dXJuIDkxO2Nhc2UgMDpyZXR1cm4gMjI0O2RlZmF1bHQ6cmV0dXJuIGF9fTt2YXIgZmM9ZnVuY3Rpb24oYSxiLGMsZCl7ei5jYWxsKHRoaXMsZCk7dGhpcy50eXBlPSJrZXkiO3RoaXMuZz1hO3RoaXMucmVwZWF0PWN9O24oZmMseik7dmFyIEo9ZnVuY3Rpb24oYSxiKXtELmNhbGwodGhpcyk7YSYmZ2ModGhpcyxhLGIpfTtuKEosRCk7Zz1KLnByb3RvdHlwZTtnLlI9bnVsbDtnLnFhPW51bGw7Zy5KYT1udWxsO2cucmE9bnVsbDtnLkY9LTE7Zy5LPS0xO2cuRGE9ITE7CnZhciBoYz17MzoxMywxMjoxNDQsNjMyMzI6MzgsNjMyMzM6NDAsNjMyMzQ6MzcsNjMyMzU6MzksNjMyMzY6MTEyLDYzMjM3OjExMyw2MzIzODoxMTQsNjMyMzk6MTE1LDYzMjQwOjExNiw2MzI0MToxMTcsNjMyNDI6MTE4LDYzMjQzOjExOSw2MzI0NDoxMjAsNjMyNDU6MTIxLDYzMjQ2OjEyMiw2MzI0NzoxMjMsNjMyNDg6NDQsNjMyNzI6NDYsNjMyNzM6MzYsNjMyNzU6MzUsNjMyNzY6MzMsNjMyNzc6MzQsNjMyODk6MTQ0LDYzMzAyOjQ1fSxpYz17VXA6MzgsRG93bjo0MCxMZWZ0OjM3LFJpZ2h0OjM5LEVudGVyOjEzLEYxOjExMixGMjoxMTMsRjM6MTE0LEY0OjExNSxGNToxMTYsRjY6MTE3LEY3OjExOCxGODoxMTksRjk6MTIwLEYxMDoxMjEsRjExOjEyMixGMTI6MTIzLCJVKzAwN0YiOjQ2LEhvbWU6MzYsRW5kOjM1LFBhZ2VVcDozMyxQYWdlRG93bjozNCxJbnNlcnQ6NDV9LGpjPXYmJnQ7CkoucHJvdG90eXBlLmc9ZnVuY3Rpb24oYSl7dSYmKHRoaXMuRj09MTcmJiFhLmN0cmxLZXl8fHRoaXMuRj09MTgmJiFhLmFsdEtleXx8diYmdGhpcy5GPT05MSYmIWEubWV0YUtleSkmJih0aGlzLks9dGhpcy5GPS0xKTt0aGlzLkY9PS0xJiYoYS5jdHJsS2V5JiZhLmchPTE3P3RoaXMuRj0xNzphLmFsdEtleSYmYS5nIT0xOD90aGlzLkY9MTg6YS5tZXRhS2V5JiZhLmchPTkxJiYodGhpcy5GPTkxKSk7ZGMoYS5nLHRoaXMuRixhLnNoaWZ0S2V5LGEuY3RybEtleSxhLmFsdEtleSxhLm1ldGFLZXkpPyh0aGlzLks9Y2MoYS5nKSxqYyYmKHRoaXMuRGE9YS5hbHRLZXkpKTp0aGlzLmhhbmRsZUV2ZW50KGEpfTtKLnByb3RvdHlwZS5oPWZ1bmN0aW9uKGEpe3RoaXMuSz10aGlzLkY9LTE7dGhpcy5EYT1hLmFsdEtleX07CkoucHJvdG90eXBlLmhhbmRsZUV2ZW50PWZ1bmN0aW9uKGEpe3ZhciBiPWEuaCxjPWIuYWx0S2V5O2lmKHUmJmEudHlwZT09ImtleXByZXNzIil7dmFyIGQ9dGhpcy5LO3ZhciBlPWIuY2hhckNvZGU+PTAmJmIuY2hhckNvZGU8NjMyMzImJmJjKGQpP2IuY2hhckNvZGU6MH1lbHNlIGEudHlwZT09ImtleXByZXNzIj8oamMmJihjPXRoaXMuRGEpLGIua2V5Q29kZT09Yi5jaGFyQ29kZT9iLmtleUNvZGU8MzI/KGQ9Yi5rZXlDb2RlLGU9MCk6KGQ9dGhpcy5LLGU9Yi5jaGFyQ29kZSk6KGQ9Yi5rZXlDb2RlfHx0aGlzLkssZT1iLmNoYXJDb2RlfHwwKSk6KGQ9Yi5rZXlDb2RlfHx0aGlzLkssZT1iLmNoYXJDb2RlfHwwKSx2JiZlPT02MyYmZD09MjI0JiYoZD0xOTEpO3ZhciBmPWQ9Y2MoZCk7ZD9kPj02MzIzMiYmZCBpbiBoYz9mPWhjW2RdOmQ9PTI1JiZhLnNoaWZ0S2V5JiYoZj05KTpiLmtleUlkZW50aWZpZXImJmIua2V5SWRlbnRpZmllciBpbiBpYyYmKGY9aWNbYi5rZXlJZGVudGlmaWVyXSk7CmlmKCF0fHxhLnR5cGUhPSJrZXlwcmVzcyJ8fGRjKGYsdGhpcy5GLGEuc2hpZnRLZXksYS5jdHJsS2V5LGMsYS5tZXRhS2V5KSlhPWY9PXRoaXMuRix0aGlzLkY9ZixiPW5ldyBmYyhmLGUsYSxiKSxiLmFsdEtleT1jLEUodGhpcyxiKX07Si5wcm90b3R5cGUuaT1mdW5jdGlvbigpe3JldHVybiB0aGlzLlJ9O3ZhciBnYz1mdW5jdGlvbihhLGIsYyl7YS5yYSYma2MoYSk7YS5SPWI7YS5xYT11YihhLlIsImtleXByZXNzIixhLGMpO2EuSmE9dWIoYS5SLCJrZXlkb3duIixhLmcsYyxhKTthLnJhPXViKGEuUiwia2V5dXAiLGEuaCxjLGEpfSxrYz1mdW5jdGlvbihhKXthLnFhJiYoQShhLnFhKSxBKGEuSmEpLEEoYS5yYSksYS5xYT1udWxsLGEuSmE9bnVsbCxhLnJhPW51bGwpO2EuUj1udWxsO2EuRj0tMTthLks9LTF9O0oucHJvdG90eXBlLkM9ZnVuY3Rpb24oKXtKLmwuQy5jYWxsKHRoaXMpO2tjKHRoaXMpfTt2YXIgSz17Z2E6Im1vdXNlZG93biIsaGE6Im1vdXNldXAiLGZhOiJtb3VzZWNhbmNlbCIsc2M6Im1vdXNlbW92ZSIsdWM6Im1vdXNlb3ZlciIsdGM6Im1vdXNlb3V0IixxYzoibW91c2VlbnRlciIscmM6Im1vdXNlbGVhdmUifTt2YXIgbGM9ZnVuY3Rpb24oYSl7cmV0dXJuIHR5cGVvZiBhLmNsYXNzTmFtZT09InN0cmluZyI/YS5jbGFzc05hbWU6YS5nZXRBdHRyaWJ1dGUmJmEuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIn0sTD1mdW5jdGlvbihhKXtyZXR1cm4gYS5jbGFzc0xpc3Q/YS5jbGFzc0xpc3Q6bGMoYSkubWF0Y2goL1xTKy9nKXx8W119LG1jPWZ1bmN0aW9uKGEsYil7dHlwZW9mIGEuY2xhc3NOYW1lPT0ic3RyaW5nIj9hLmNsYXNzTmFtZT1iOmEuc2V0QXR0cmlidXRlJiZhLnNldEF0dHJpYnV0ZSgiY2xhc3MiLGIpfSxuYz1mdW5jdGlvbihhLGIpe2EuY2xhc3NMaXN0P2I9YS5jbGFzc0xpc3QuY29udGFpbnMoYik6KGE9TChhKSxiPXZhKGEsYik+PTApO3JldHVybiBifSxvYz1mdW5jdGlvbihhLGIpe2lmKGEuY2xhc3NMaXN0KWEuY2xhc3NMaXN0LmFkZChiKTtlbHNlIGlmKCFuYyhhLGIpKXt2YXIgYz1sYyhhKTttYyhhLGMrKGMubGVuZ3RoPjA/IiAiK2I6YikpfX0scGM9ZnVuY3Rpb24oYSxiKXtpZihhLmNsYXNzTGlzdClBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGIsCmZ1bmN0aW9uKGUpe29jKGEsZSl9KTtlbHNle3ZhciBjPXt9O0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoTChhKSxmdW5jdGlvbihlKXtjW2VdPSEwfSk7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChiLGZ1bmN0aW9uKGUpe2NbZV09ITB9KTtiPSIiO2Zvcih2YXIgZCBpbiBjKWIrPWIubGVuZ3RoPjA/IiAiK2Q6ZDttYyhhLGIpfX0scWM9ZnVuY3Rpb24oYSxiKXthLmNsYXNzTGlzdD9hLmNsYXNzTGlzdC5yZW1vdmUoYik6bmMoYSxiKSYmbWMoYSxBcnJheS5wcm90b3R5cGUuZmlsdGVyLmNhbGwoTChhKSxmdW5jdGlvbihjKXtyZXR1cm4gYyE9Yn0pLmpvaW4oIiAiKSl9LHJjPWZ1bmN0aW9uKGEsYil7YS5jbGFzc0xpc3Q/QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChiLGZ1bmN0aW9uKGMpe3FjKGEsYyl9KTptYyhhLEFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbChMKGEpLGZ1bmN0aW9uKGMpe3JldHVybiEodmEoYixjKT49MCl9KS5qb2luKCIgIikpfTt2YXIgdGM9ZnVuY3Rpb24oYSxiKXtpZighYSl0aHJvdyBFcnJvcigiSW52YWxpZCBjbGFzcyBuYW1lICIrYSk7aWYodHlwZW9mIGIhPT0iZnVuY3Rpb24iKXRocm93IEVycm9yKCJJbnZhbGlkIGRlY29yYXRvciBmdW5jdGlvbiAiK2IpO3NjW2FdPWJ9LHVjPXt9LHNjPXt9O3ZhciB2Yz1mdW5jdGlvbihhKXt0aGlzLkE9YX07aWEodmMpO3ZhciB3Yz1mdW5jdGlvbihhLGIpe2EmJihhLnRhYkluZGV4PWI/MDotMSl9LHljPWZ1bmN0aW9uKGEsYixjKXtjLmlkJiZQYihiLGMuaWQpO3ZhciBkPWEuZygpLGU9ITEsZj1MKGMpO2YmJkFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoZixmdW5jdGlvbihoKXtoPT1kP2U9ITA6aCYmdGhpcy51KGIsaCxkKX0sYSk7ZXx8b2MoYyxkKTt4YyhiLGMpO3JldHVybiBjfTt2Yy5wcm90b3R5cGUudT1mdW5jdGlvbihhLGIsYyl7Yj09YysiLWRpc2FibGVkIj9hLlgoITEpOmI9PWMrIi1ob3Jpem9udGFsIj96YyhhLCJob3Jpem9udGFsIik6Yj09YysiLXZlcnRpY2FsIiYmemMoYSwidmVydGljYWwiKX07CnZhciB4Yz1mdW5jdGlvbihhLGIpe2lmKGIpZm9yKHZhciBjPWIuZmlyc3RDaGlsZCxkO2MmJmMucGFyZW50Tm9kZT09Yjspe2Q9Yy5uZXh0U2libGluZztpZihjLm5vZGVUeXBlPT0xKXthOnt2YXIgZT1jO3AoZSk7ZT1MKGUpO2Zvcih2YXIgZj1lLmxlbmd0aCxoPTA7aDxmO2grKyl7dmFyIGs9ZVtoXTtpZihrPWsgaW4gc2M/c2Nba10oKTpudWxsKXtlPWs7YnJlYWsgYX19ZT1udWxsfWUmJihlLmc9YyxhLmlzRW5hYmxlZCgpfHxlLlgoITEpLGEuQmEoZSksU2IoZSxjKSl9ZWxzZSBjLm5vZGVWYWx1ZSYmSGEoYy5ub2RlVmFsdWUpIT0iInx8Yi5yZW1vdmVDaGlsZChjKTtjPWR9fSxBYz1mdW5jdGlvbihhLGIpe2I9Yi5pKCk7cChiLCJUaGUgY29udGFpbmVyIERPTSBlbGVtZW50IGNhbm5vdCBiZSBudWxsLiIpO0tiKGIsdCk7KGE9YS5BKSYmWmIoYixhKX07dmMucHJvdG90eXBlLmc9ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy1jb250YWluZXIifTsKdmMucHJvdG90eXBlLmo9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nKCksYz1bYixhLkw9PSJob3Jpem9udGFsIj9iKyItaG9yaXpvbnRhbCI6YisiLXZlcnRpY2FsIl07YS5pc0VuYWJsZWQoKXx8Yy5wdXNoKGIrIi1kaXNhYmxlZCIpO3JldHVybiBjfTt2YXIgQmM9ZnVuY3Rpb24oKXt9O3ZhciBNPWZ1bmN0aW9uKCl7fSxDYztpYShNKTt2YXIgRGM9e2J1dHRvbjoicHJlc3NlZCIsY2hlY2tib3g6ImNoZWNrZWQiLG1lbnVpdGVtOiJzZWxlY3RlZCIsbWVudWl0ZW1jaGVja2JveDoiY2hlY2tlZCIsbWVudWl0ZW1yYWRpbzoiY2hlY2tlZCIscmFkaW86ImNoZWNrZWQiLHRhYjoic2VsZWN0ZWQiLHRyZWVpdGVtOiJzZWxlY3RlZCJ9O00ucHJvdG90eXBlLk5hPWZ1bmN0aW9uKCl7fTtNLnByb3RvdHlwZS54YT1mdW5jdGlvbihhKXt2YXIgYj1hLkcsYz1iLmgsZD10aGlzLk4oKSxlPVtkXSxmPXRoaXMuTigpO2YhPWQmJmUucHVzaChmKTtkPWEubTtmb3IoZj1bXTtkOyl7dmFyIGg9ZCYtZDtmLnB1c2goRWModGhpcyxoKSk7ZCY9fmh9ZS5wdXNoLmFwcGx5KGUsZik7KGQ9YS5GYSkmJmUucHVzaC5hcHBseShlLGQpO3JldHVybiBjLmNhbGwoYiwiRElWIixlLmpvaW4oIiAiKSxhLmlhKX07Ck0ucHJvdG90eXBlLnlhPWZ1bmN0aW9uKGEsYil7Yi5pZCYmUGIoYSxiLmlkKTtiJiZiLmZpcnN0Q2hpbGQ/RmMoYSxiLmZpcnN0Q2hpbGQubmV4dFNpYmxpbmc/eWEoYi5jaGlsZE5vZGVzKTpiLmZpcnN0Q2hpbGQpOmEuaWE9bnVsbDt2YXIgYz0wLGQ9dGhpcy5OKCksZT10aGlzLk4oKSxmPSExLGg9ITEsaz15YShMKGIpKTtrLmZvckVhY2goZnVuY3Rpb24ocSl7Znx8cSE9ZD9ofHxxIT1lP2N8PUdjKHRoaXMscSk6aD0hMDooZj0hMCxlPT1kJiYoaD0hMCkpO0djKHRoaXMscSk9PTEmJihzYShiKSxkYihiKSYmZWIoYikmJmNiKGIsITEpKX0sdGhpcyk7YS5tPWM7Znx8KGsucHVzaChkKSxlPT1kJiYoaD0hMCkpO2h8fGsucHVzaChlKTsoYT1hLkZhKSYmay5wdXNoLmFwcGx5KGssYSk7ZiYmaCYmIWF8fG1jKGIsay5qb2luKCIgIikpO3JldHVybiBifTsKdmFyIEhjPWZ1bmN0aW9uKGEsYil7aWYoYT1hLk5hKCkpe3AoYiwiVGhlIGVsZW1lbnQgcGFzc2VkIGFzIGEgZmlyc3QgcGFyYW1ldGVyIGNhbm5vdCBiZSBudWxsLiIpO3ZhciBjPWIuZ2V0QXR0cmlidXRlKCJyb2xlIil8fG51bGw7YSE9YyYmWmIoYixhKX19LEljPWZ1bmN0aW9uKGEsYil7dmFyIGM7aWYoYS5EJjMyJiYoYz1hLmkoKSkpe2lmKCFiJiZhLm0mMzIpe3RyeXtjLmJsdXIoKX1jYXRjaChkKXt9YS5tJjMyJiZhLlFhKG51bGwpfShkYihjKSYmZWIoYykpIT1iJiZjYihjLGIpfX0sSmM9ZnVuY3Rpb24oYSxiLGMpe0NjfHwoQ2M9ezE6ImRpc2FibGVkIiw4OiJzZWxlY3RlZCIsMTY6ImNoZWNrZWQiLDY0OiJleHBhbmRlZCJ9KTtwKGEsIlRoZSBlbGVtZW50IHBhc3NlZCBhcyBhIGZpcnN0IHBhcmFtZXRlciBjYW5ub3QgYmUgbnVsbC4iKTtiPUNjW2JdO3ZhciBkPWEuZ2V0QXR0cmlidXRlKCJyb2xlIil8fG51bGw7ZCYmKGQ9RGNbZF18fGIsYj1iPT0iY2hlY2tlZCJ8fGI9PQoic2VsZWN0ZWQiP2Q6Yik7YiYmYWMoYSxiLGMpfTtNLnByb3RvdHlwZS5OPWZ1bmN0aW9uKCl7cmV0dXJuImdvb2ctY29udHJvbCJ9O3ZhciBFYz1mdW5jdGlvbihhLGIpe2EuZ3x8S2MoYSk7cmV0dXJuIGEuZ1tiXX0sR2M9ZnVuY3Rpb24oYSxiKXthLmh8fChhLmd8fEtjKGEpLGEuaD1FYShhLmcpKTthPXBhcnNlSW50KGEuaFtiXSwxMCk7cmV0dXJuIGlzTmFOKGEpPzA6YX0sS2M9ZnVuY3Rpb24oYSl7dmFyIGI9YS5OKCk7dmFyIGM9Yi5yZXBsYWNlKC9ceGEwfFxzL2csIiAiKS5pbmRleE9mKCIgIikhPS0xO3AoIWMsIkNvbnRyb2xSZW5kZXJlciBoYXMgYW4gaW52YWxpZCBjc3MgY2xhc3M6ICciK2IrIiciKTthLmc9ezE6YisiLWRpc2FibGVkIiwyOmIrIi1ob3ZlciIsNDpiKyItYWN0aXZlIiw4OmIrIi1zZWxlY3RlZCIsMTY6YisiLWNoZWNrZWQiLDMyOmIrIi1mb2N1c2VkIiw2NDpiKyItb3BlbiJ9fTt2YXIgTj1mdW5jdGlvbihhLGIsYyl7Ri5jYWxsKHRoaXMsYyk7aWYoIWIpe2ZvcihiPXRoaXMuY29uc3RydWN0b3I7Yjspe3ZhciBkPW5hKGIpO2lmKGQ9dWNbZF0pYnJlYWs7Yj0oYj1PYmplY3QuZ2V0UHJvdG90eXBlT2YoYi5wcm90b3R5cGUpKSYmYi5jb25zdHJ1Y3Rvcn1iPWQ/dHlwZW9mIGQuVj09PSJmdW5jdGlvbiI/ZC5WKCk6bmV3IGQ6bnVsbH10aGlzLnY9Yjt0aGlzLmlhPWEhPT12b2lkIDA/YTpudWxsfTtuKE4sRik7Zz1OLnByb3RvdHlwZTtnLmlhPW51bGw7Zy5tPTA7Zy5EPTM5O2cuUD0wO2cuT2E9ITA7Zy5GYT1udWxsO2cuSGE9ITA7Zy5tYT1mdW5jdGlvbigpe3ZhciBhPXRoaXMudi54YSh0aGlzKTt0aGlzLmc9YTtIYyh0aGlzLnYsYSk7S2IoYSwhMCk7dGhpcy5pc1Zpc2libGUoKXx8KGEuc3R5bGUuZGlzcGxheT0ibm9uZSIsYSYmYWMoYSwiaGlkZGVuIiwhMCkpfTtnLm5hPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaSgpfTtnLndhPWZ1bmN0aW9uKCl7cmV0dXJuITB9OwpnLkVhPWZ1bmN0aW9uKGEpe3RoaXMuZz1hPXRoaXMudi55YSh0aGlzLGEpO0hjKHRoaXMudixhKTtLYihhLCEwKTt0aGlzLk9hPWEuc3R5bGUuZGlzcGxheSE9Im5vbmUifTsKZy5JPWZ1bmN0aW9uKCl7Ti5sLkkuY2FsbCh0aGlzKTt2YXIgYT10aGlzLmc7cChhLCJDYW4gbm90IGNhbGwgZ2V0RWxlbWVudFN0cmljdCBiZWZvcmUgcmVuZGVyaW5nL2RlY29yYXRpbmcuIik7cCh0aGlzKTtwKGEpO3RoaXMuaXNWaXNpYmxlKCl8fGFjKGEsImhpZGRlbiIsIXRoaXMuaXNWaXNpYmxlKCkpO3RoaXMuaXNFbmFibGVkKCl8fEpjKGEsMSwhdGhpcy5pc0VuYWJsZWQoKSk7dGhpcy5EJjgmJkpjKGEsOCwhISh0aGlzLm0mOCkpO3RoaXMuRCYxNiYmSmMoYSwxNiwhISh0aGlzLm0mMTYpKTt0aGlzLkQmNjQmJkpjKGEsNjQsISEodGhpcy5tJjY0KSk7dmFyIGI9dGhpcy52O1ViKHRoaXMpJiYoYT10aGlzLmkoKSxiPWIuTigpKyItcnRsIiwoYT1hLmk/YS5pKCk6YSkmJnBjKGEsW2JdKSk7dGhpcy5pc0VuYWJsZWQoKSYmSWModGhpcyx0aGlzLmlzVmlzaWJsZSgpKTt0aGlzLkQmLTImJih0aGlzLkhhJiZMYyh0aGlzLCEwKSx0aGlzLkQmMzImJihhPXRoaXMuaSgpKSkmJihiPQp0aGlzLlp8fCh0aGlzLlo9bmV3IEopLGdjKGIsYSksQihCKEIoUWIodGhpcyksYiwia2V5Iix0aGlzLmFhKSxhLCJmb2N1cyIsdGhpcy5YYSksYSwiYmx1ciIsdGhpcy5RYSkpfTt2YXIgTGM9ZnVuY3Rpb24oYSxiKXt2YXIgYz1RYihhKSxkPWEuaSgpO2I/KEIoQihCKEIoYyxkLEsuZ2EsYS5zYSksZCxbSy5oYSxLLmZhXSxhLnZhKSxkLCJtb3VzZW92ZXIiLGEudWEpLGQsIm1vdXNlb3V0IixhLnRhKSxhLmNhIT1CYyYmQihjLGQsImNvbnRleHRtZW51IixhLmNhKSk6KEMoQyhDKEMoYyxkLEsuZ2EsYS5zYSksZCxbSy5oYSxLLmZhXSxhLnZhKSxkLCJtb3VzZW92ZXIiLGEudWEpLGQsIm1vdXNlb3V0IixhLnRhKSxhLmNhIT1CYyYmQyhjLGQsImNvbnRleHRtZW51IixhLmNhKSl9O04ucHJvdG90eXBlLlU9ZnVuY3Rpb24oKXtOLmwuVS5jYWxsKHRoaXMpO3RoaXMuWiYma2ModGhpcy5aKTt0aGlzLmlzVmlzaWJsZSgpJiZ0aGlzLmlzRW5hYmxlZCgpJiZJYyh0aGlzLCExKX07Ck4ucHJvdG90eXBlLkM9ZnVuY3Rpb24oKXtOLmwuQy5jYWxsKHRoaXMpO3RoaXMuWiYmKHRoaXMuWi5kaXNwb3NlKCksZGVsZXRlIHRoaXMuWik7ZGVsZXRlIHRoaXMudjt0aGlzLkZhPXRoaXMuaWE9bnVsbH07dmFyIEZjPWZ1bmN0aW9uKGEsYil7YS5pYT1ifTtOLnByb3RvdHlwZS5pc1Zpc2libGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5PYX07Ti5wcm90b3R5cGUuaXNFbmFibGVkPWZ1bmN0aW9uKCl7cmV0dXJuISh0aGlzLm0mMSl9O04ucHJvdG90eXBlLlg9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5oO2ImJnR5cGVvZiBiLmlzRW5hYmxlZD09ImZ1bmN0aW9uIiYmIWIuaXNFbmFibGVkKCl8fCFPKHRoaXMsMSwhYSl8fChhfHwoTWModGhpcywhMSksUCh0aGlzLCExKSksdGhpcy5pc1Zpc2libGUoKSYmSWModGhpcyxhKSxUKHRoaXMsMSwhYSwhMCkpfTt2YXIgUD1mdW5jdGlvbihhLGIpe08oYSwyLGIpJiZUKGEsMixiKX07Ck4ucHJvdG90eXBlLmlzQWN0aXZlPWZ1bmN0aW9uKCl7cmV0dXJuISEodGhpcy5tJjQpfTsKdmFyIE1jPWZ1bmN0aW9uKGEsYil7TyhhLDQsYikmJlQoYSw0LGIpfSxOYz1mdW5jdGlvbihhLGIpe08oYSw4LGIpJiZUKGEsOCxiKX0sT2M9ZnVuY3Rpb24oYSxiKXtPKGEsNjQsYikmJlQoYSw2NCxiKX0sVD1mdW5jdGlvbihhLGIsYyxkKXtpZighZCYmYj09MSlhLlgoIWMpO2Vsc2UgaWYoYS5EJmImJmMhPSEhKGEubSZiKSl7dmFyIGU9YS52O2lmKGQ9YS5pKCkpe2lmKGU9RWMoZSxiKSl7dmFyIGY9YS5pP2EuaSgpOmE7ZiYmKGM/cGM6cmMpKGYsW2VdKX1KYyhkLGIsYyl9YS5tPWM/YS5tfGI6YS5tJn5ifX0sUGM9ZnVuY3Rpb24oYSxiLGMpe2lmKGEucyYmYS5tJmImJiFjKXRocm93IEVycm9yKCJDb21wb25lbnQgYWxyZWFkeSByZW5kZXJlZCIpOyFjJiZhLm0mYiYmVChhLGIsITEpO2EuRD1jP2EuRHxiOmEuRCZ+Yn0sVT1mdW5jdGlvbihhLGIpe3JldHVybiEhKDI1NSZiKSYmISEoYS5EJmIpfSxPPWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4hIShhLkQmYikmJiEhKGEubSZiKSE9CmMmJighKGEuUCZiKXx8RShhLE5iKGIsYykpKSYmIWEuYmF9O04ucHJvdG90eXBlLnVhPWZ1bmN0aW9uKGEpeyFRYyhhLHRoaXMuaSgpKSYmRSh0aGlzLCJlbnRlciIpJiZ0aGlzLmlzRW5hYmxlZCgpJiZVKHRoaXMsMikmJlAodGhpcywhMCl9O04ucHJvdG90eXBlLnRhPWZ1bmN0aW9uKGEpeyFRYyhhLHRoaXMuaSgpKSYmRSh0aGlzLCJsZWF2ZSIpJiYoVSh0aGlzLDQpJiZNYyh0aGlzLCExKSxVKHRoaXMsMikmJlAodGhpcywhMSkpfTtOLnByb3RvdHlwZS5jYT1CYzt2YXIgUWM9ZnVuY3Rpb24oYSxiKXtyZXR1cm4hIWEucmVsYXRlZFRhcmdldCYmYWIoYixhLnJlbGF0ZWRUYXJnZXQpfTsKTi5wcm90b3R5cGUuc2E9ZnVuY3Rpb24oYSl7aWYodGhpcy5pc0VuYWJsZWQoKSYmKFUodGhpcywyKSYmUCh0aGlzLCEwKSwhKGEuaC5idXR0b24hPTB8fHYmJmEuY3RybEtleSkpKXtVKHRoaXMsNCkmJk1jKHRoaXMsITApO3ZhciBiO2lmKGI9dGhpcy52KXt2YXIgYztiPXRoaXMuRCYzMiYmKGM9dGhpcy5pKCkpP2RiKGMpJiZlYihjKTohMX1iJiZ0aGlzLmkoKS5mb2N1cygpfWEuaC5idXR0b24hPTB8fHYmJmEuY3RybEtleXx8YS5qKCl9O04ucHJvdG90eXBlLnZhPWZ1bmN0aW9uKGEpe3RoaXMuaXNFbmFibGVkKCkmJihVKHRoaXMsMikmJlAodGhpcywhMCksdGhpcy5pc0FjdGl2ZSgpJiZSYyh0aGlzLGEpJiZVKHRoaXMsNCkmJk1jKHRoaXMsITEpKX07CnZhciBSYz1mdW5jdGlvbihhLGIpe2lmKFUoYSwxNikpe3ZhciBjPSEoYS5tJjE2KTtPKGEsMTYsYykmJlQoYSwxNixjKX1VKGEsOCkmJk5jKGEsITApO1UoYSw2NCkmJk9jKGEsIShhLm0mNjQpKTtjPW5ldyB5KCJhY3Rpb24iLGEpO2ImJihjLmFsdEtleT1iLmFsdEtleSxjLmN0cmxLZXk9Yi5jdHJsS2V5LGMubWV0YUtleT1iLm1ldGFLZXksYy5zaGlmdEtleT1iLnNoaWZ0S2V5LGMuRz1iLkcsYy50aW1lU3RhbXA9Yi50aW1lU3RhbXApO3JldHVybiBFKGEsYyl9O04ucHJvdG90eXBlLlhhPWZ1bmN0aW9uKCl7VSh0aGlzLDMyKSYmTyh0aGlzLDMyLCEwKSYmVCh0aGlzLDMyLCEwKX07Ti5wcm90b3R5cGUuUWE9ZnVuY3Rpb24oKXtVKHRoaXMsNCkmJk1jKHRoaXMsITEpO1UodGhpcywzMikmJk8odGhpcywzMiwhMSkmJlQodGhpcywzMiwhMSl9OwpOLnByb3RvdHlwZS5hYT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5pc1Zpc2libGUoKSYmdGhpcy5pc0VuYWJsZWQoKSYmYS5nPT0xMyYmUmModGhpcyxhKT8oYS5qKCksYS52KCksITApOiExfTtpZih0eXBlb2YgTiE9PSJmdW5jdGlvbiIpdGhyb3cgRXJyb3IoIkludmFsaWQgY29tcG9uZW50IGNsYXNzICIrTik7aWYodHlwZW9mIE0hPT0iZnVuY3Rpb24iKXRocm93IEVycm9yKCJJbnZhbGlkIHJlbmRlcmVyIGNsYXNzICIrTSk7dmFyIFNjPW5hKE4pO3VjW1NjXT1NO3RjKCJnb29nLWNvbnRyb2wiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBOKG51bGwpfSk7dmFyIFY9ZnVuY3Rpb24oYSxiLGMpe0YuY2FsbCh0aGlzLGMpO3RoaXMuZWE9Ynx8dmMuVigpO3RoaXMuTD1hfHwidmVydGljYWwifTtuKFYsRik7Zz1WLnByb3RvdHlwZTtnLkthPW51bGw7Zy5kYT1udWxsO2cuZWE9bnVsbDtnLkw9bnVsbDtnLlM9ITA7Zy5UPSEwO2cubz0tMTtnLkI9bnVsbDtnLlc9ITE7Zy5PPW51bGw7dmFyIFRjPWZ1bmN0aW9uKGEpe3JldHVybiBhLkthfHxhLmkoKX07Zz1WLnByb3RvdHlwZTtnLm1hPWZ1bmN0aW9uKCl7dGhpcy5nPXRoaXMuRy5oKCJESVYiLHRoaXMuZWEuaih0aGlzKS5qb2luKCIgIikpfTtnLm5hPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaSgpfTtnLndhPWZ1bmN0aW9uKGEpe3JldHVybiBhLnRhZ05hbWU9PSJESVYifTtnLkVhPWZ1bmN0aW9uKGEpe3RoaXMuZz15Yyh0aGlzLmVhLHRoaXMsYSk7YS5zdHlsZS5kaXNwbGF5PT0ibm9uZSImJih0aGlzLlM9ITEpfTsKZy5JPWZ1bmN0aW9uKCl7Vi5sLkkuY2FsbCh0aGlzKTtUYih0aGlzLGZ1bmN0aW9uKGIpe2IucyYmVWModGhpcyxiKX0sdGhpcyk7dmFyIGE9dGhpcy5pKCk7QWModGhpcy5lYSx0aGlzKTtWYyh0aGlzLHRoaXMuUyk7QihCKEIoQihCKEIoQihCKFFiKHRoaXMpLHRoaXMsImVudGVyIix0aGlzLmViKSx0aGlzLCJoaWdobGlnaHQiLHRoaXMuZmIpLHRoaXMsInVuaGlnaGxpZ2h0Iix0aGlzLmxiKSx0aGlzLCJvcGVuIix0aGlzLmdiKSx0aGlzLCJjbG9zZSIsdGhpcy5iYiksYSxLLmdhLHRoaXMuV2EpLGJiKGEpLFtLLmhhLEsuZmFdLHRoaXMuY2IpLGEsW0suZ2EsSy5oYSxLLmZhLCJtb3VzZW92ZXIiLCJtb3VzZW91dCIsImNvbnRleHRtZW51Il0sdGhpcy5hYik7V2ModGhpcyl9O3ZhciBXYz1mdW5jdGlvbihhKXt2YXIgYj1RYihhKSxjPVRjKGEpO0IoQihCKGIsYywiZm9jdXMiLGEuUGEpLGMsImJsdXIiLGEuVWEpLGEuZGF8fChhLmRhPW5ldyBKKFRjKGEpKSksImtleSIsYS5WYSl9OwpnPVYucHJvdG90eXBlO2cuVT1mdW5jdGlvbigpe1hjKHRoaXMsLTEpO3RoaXMuQiYmT2ModGhpcy5CLCExKTt0aGlzLlc9ITE7Vi5sLlUuY2FsbCh0aGlzKX07Zy5DPWZ1bmN0aW9uKCl7Vi5sLkMuY2FsbCh0aGlzKTt0aGlzLmRhJiYodGhpcy5kYS5kaXNwb3NlKCksdGhpcy5kYT1udWxsKTt0aGlzLmVhPXRoaXMuQj10aGlzLk89dGhpcy5LYT1udWxsfTtnLmViPWZ1bmN0aW9uKCl7cmV0dXJuITB9OwpnLmZiPWZ1bmN0aW9uKGEpe3ZhciBiPVZiKHRoaXMsYS50YXJnZXQpO2lmKGI+LTEmJmIhPXRoaXMubyl7dmFyIGM9SSh0aGlzLHRoaXMubyk7YyYmUChjLCExKTt0aGlzLm89YjtjPUkodGhpcyx0aGlzLm8pO3RoaXMuVyYmTWMoYywhMCk7dGhpcy5CJiZjIT10aGlzLkImJihjLkQmNjQ/T2MoYywhMCk6T2ModGhpcy5CLCExKSl9Yj10aGlzLmkoKTtwKGIsIlRoZSBET00gZWxlbWVudCBmb3IgdGhlIGNvbnRhaW5lciBjYW5ub3QgYmUgbnVsbC4iKTthLnRhcmdldC5pKCkhPW51bGwmJmFjKGIsImFjdGl2ZWRlc2NlbmRhbnQiLGEudGFyZ2V0LmkoKS5pZCl9O2cubGI9ZnVuY3Rpb24oYSl7YS50YXJnZXQ9PUkodGhpcyx0aGlzLm8pJiYodGhpcy5vPS0xKTthPXRoaXMuaSgpO3AoYSwiVGhlIERPTSBlbGVtZW50IGZvciB0aGUgY29udGFpbmVyIGNhbm5vdCBiZSBudWxsLiIpO2EucmVtb3ZlQXR0cmlidXRlKCRiKCJhY3RpdmVkZXNjZW5kYW50IikpfTsKZy5nYj1mdW5jdGlvbihhKXsoYT1hLnRhcmdldCkmJmEhPXRoaXMuQiYmYS5oPT10aGlzJiYodGhpcy5CJiZPYyh0aGlzLkIsITEpLHRoaXMuQj1hKX07Zy5iYj1mdW5jdGlvbihhKXthLnRhcmdldD09dGhpcy5CJiYodGhpcy5CPW51bGwpO3ZhciBiPXRoaXMuaSgpLGM9YS50YXJnZXQuaSgpO2ImJmEudGFyZ2V0Lm0mMiYmYyYmKGE9IiIsYyYmKGE9Yy5pZCxwKGEsIlRoZSBhY3RpdmUgZWxlbWVudCBzaG91bGQgaGF2ZSBhbiBpZC4iKSksYWMoYiwiYWN0aXZlZGVzY2VuZGFudCIsYSkpfTtnLldhPWZ1bmN0aW9uKGEpe3RoaXMuVCYmKHRoaXMuVz0hMCk7dmFyIGI9VGModGhpcyk7YiYmZGIoYikmJmViKGIpP2IuZm9jdXMoKTphLmooKX07Zy5jYj1mdW5jdGlvbigpe3RoaXMuVz0hMX07CmcuYWI9ZnVuY3Rpb24oYSl7YTp7dmFyIGI9YS50YXJnZXQ7aWYodGhpcy5PKWZvcih2YXIgYz10aGlzLmkoKTtiJiZiIT09Yzspe3ZhciBkPWIuaWQ7aWYoZCBpbiB0aGlzLk8pe2I9dGhpcy5PW2RdO2JyZWFrIGF9Yj1iLnBhcmVudE5vZGV9Yj1udWxsfWlmKGIpc3dpdGNoKGEudHlwZSl7Y2FzZSBLLmdhOmIuc2EoYSk7YnJlYWs7Y2FzZSBLLmhhOmNhc2UgSy5mYTpiLnZhKGEpO2JyZWFrO2Nhc2UgIm1vdXNlb3ZlciI6Yi51YShhKTticmVhaztjYXNlICJtb3VzZW91dCI6Yi50YShhKTticmVhaztjYXNlICJjb250ZXh0bWVudSI6Yi5jYShhKX19O2cuUGE9ZnVuY3Rpb24oKXt9O2cuVWE9ZnVuY3Rpb24oKXtYYyh0aGlzLC0xKTt0aGlzLlc9ITE7dGhpcy5CJiZPYyh0aGlzLkIsITEpfTsKZy5WYT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5pc0VuYWJsZWQoKSYmdGhpcy5pc1Zpc2libGUoKSYmKEgodGhpcykhPTB8fHRoaXMuS2EpJiZZYyh0aGlzLGEpPyhhLmooKSxhLnYoKSwhMCk6ITF9Owp2YXIgWWM9ZnVuY3Rpb24oYSxiKXt2YXIgYz1JKGEsYS5vKTtpZihjJiZ0eXBlb2YgYy5hYT09ImZ1bmN0aW9uIiYmYy5hYShiKXx8YS5CJiZhLkIhPWMmJnR5cGVvZiBhLkIuYWE9PSJmdW5jdGlvbiImJmEuQi5hYShiKSlyZXR1cm4hMDtpZihiLnNoaWZ0S2V5fHxiLmN0cmxLZXl8fGIubWV0YUtleXx8Yi5hbHRLZXkpcmV0dXJuITE7c3dpdGNoKGIuZyl7Y2FzZSAyNzpUYyhhKS5ibHVyKCk7YnJlYWs7Y2FzZSAzNjpaYyhhKTticmVhaztjYXNlIDM1OiRjKGEpO2JyZWFrO2Nhc2UgMzg6aWYoYS5MPT0idmVydGljYWwiKWFkKGEpO2Vsc2UgcmV0dXJuITE7YnJlYWs7Y2FzZSAzNzppZihhLkw9PSJob3Jpem9udGFsIilVYihhKT9iZChhKTphZChhKTtlbHNlIHJldHVybiExO2JyZWFrO2Nhc2UgNDA6aWYoYS5MPT0idmVydGljYWwiKWJkKGEpO2Vsc2UgcmV0dXJuITE7YnJlYWs7Y2FzZSAzOTppZihhLkw9PSJob3Jpem9udGFsIilVYihhKT9hZChhKTpiZChhKTtlbHNlIHJldHVybiExOwpicmVhaztkZWZhdWx0OnJldHVybiExfXJldHVybiEwfSxVYz1mdW5jdGlvbihhLGIpe3ZhciBjPWIuaSgpO2M9Yy5pZHx8KGMuaWQ9T2IoYikpO2EuT3x8KGEuTz17fSk7YS5PW2NdPWJ9O1YucHJvdG90eXBlLkJhPWZ1bmN0aW9uKGEsYil7dWEoYSxOLCJUaGUgY2hpbGQgb2YgYSBjb250YWluZXIgbXVzdCBiZSBhIGNvbnRyb2wiKTtWLmwuQmEuY2FsbCh0aGlzLGEsYil9O1YucHJvdG90eXBlLkNhPWZ1bmN0aW9uKGEsYixjKXt1YShhLE4pO2EuUHw9MjthLlB8PTY0O1BjKGEsMzIsITEpO2EucyYmMCE9YS5IYSYmTGMoYSwhMSk7YS5IYT0hMTt2YXIgZD1hLmg9PXRoaXM/VmIodGhpcyxhKTotMTtWLmwuQ2EuY2FsbCh0aGlzLGEsYixjKTthLnMmJnRoaXMucyYmVWModGhpcyxhKTthPWQ7YT09LTEmJihhPUgodGhpcykpO2E9PXRoaXMubz90aGlzLm89TWF0aC5taW4oSCh0aGlzKS0xLGIpOmE+dGhpcy5vJiZiPD10aGlzLm8/dGhpcy5vKys6YTx0aGlzLm8mJmI+dGhpcy5vJiZ0aGlzLm8tLX07CnZhciB6Yz1mdW5jdGlvbihhLGIpe2lmKGEuaSgpKXRocm93IEVycm9yKCJDb21wb25lbnQgYWxyZWFkeSByZW5kZXJlZCIpO2EuTD1ifTtWLnByb3RvdHlwZS5pc1Zpc2libGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5TfTt2YXIgVmM9ZnVuY3Rpb24oYSxiKXthLlM9Yjt2YXIgYz1hLmkoKTtjJiYoYy5zdHlsZS5kaXNwbGF5PWI/IiI6Im5vbmUiLHdjKFRjKGEpLGEuVCYmYS5TKSl9O1YucHJvdG90eXBlLmlzRW5hYmxlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLlR9O1YucHJvdG90eXBlLlg9ZnVuY3Rpb24oYSl7dGhpcy5UIT1hJiZFKHRoaXMsYT8iZW5hYmxlIjoiZGlzYWJsZSIpJiYoYT8odGhpcy5UPSEwLFRiKHRoaXMsZnVuY3Rpb24oYil7Yi5UYT9kZWxldGUgYi5UYTpiLlgoITApfSkpOihUYih0aGlzLGZ1bmN0aW9uKGIpe2IuaXNFbmFibGVkKCk/Yi5YKCExKTpiLlRhPSEwfSksdGhpcy5XPXRoaXMuVD0hMSksd2MoVGModGhpcyksYSYmdGhpcy5TKSl9Owp2YXIgWGM9ZnVuY3Rpb24oYSxiKXsoYj1JKGEsYikpP1AoYiwhMCk6YS5vPi0xJiZQKEkoYSxhLm8pLCExKX0sWmM9ZnVuY3Rpb24oYSl7Y2QoYSxmdW5jdGlvbihiLGMpe3JldHVybihiKzEpJWN9LEgoYSktMSl9LCRjPWZ1bmN0aW9uKGEpe2NkKGEsZnVuY3Rpb24oYixjKXtiLS07cmV0dXJuIGI8MD9jLTE6Yn0sMCl9LGJkPWZ1bmN0aW9uKGEpe2NkKGEsZnVuY3Rpb24oYixjKXtyZXR1cm4oYisxKSVjfSxhLm8pfSxhZD1mdW5jdGlvbihhKXtjZChhLGZ1bmN0aW9uKGIsYyl7Yi0tO3JldHVybiBiPDA/Yy0xOmJ9LGEubyl9LGNkPWZ1bmN0aW9uKGEsYixjKXtjPWM8MD9WYihhLGEuQik6Yzt2YXIgZD1IKGEpO2M9Yi5jYWxsKGEsYyxkKTtmb3IodmFyIGU9MDtlPD1kOyl7dmFyIGY9SShhLGMpO2lmKGYmJmYuaXNWaXNpYmxlKCkmJmYuaXNFbmFibGVkKCkmJmYuRCYyKXthLkxhKGMpO2JyZWFrfWUrKztjPWIuY2FsbChhLGMsZCl9fTsKVi5wcm90b3R5cGUuTGE9ZnVuY3Rpb24oYSl7WGModGhpcyxhKX07dmFyIGRkPWZ1bmN0aW9uKCl7fTtuKGRkLE0pO2lhKGRkKTtnPWRkLnByb3RvdHlwZTtnLk49ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy10YWIifTtnLk5hPWZ1bmN0aW9uKCl7cmV0dXJuInRhYiJ9O2cueGE9ZnVuY3Rpb24oYSl7dmFyIGI9ZGQubC54YS5jYWxsKHRoaXMsYSk7KGE9YS5HYSgpKSYmdGhpcy5NYShiLGEpO3JldHVybiBifTtnLnlhPWZ1bmN0aW9uKGEsYil7Yj1kZC5sLnlhLmNhbGwodGhpcyxhLGIpO3ZhciBjPXRoaXMuR2EoYik7YyYmKGEuUmE9Yyk7YS5tJjgmJihjPWEuaCkmJnR5cGVvZiBjLko9PT0iZnVuY3Rpb24iJiYoVChhLDgsITEpLGMuSihhKSk7cmV0dXJuIGJ9O2cuR2E9ZnVuY3Rpb24oYSl7cmV0dXJuIGEudGl0bGV8fCIifTtnLk1hPWZ1bmN0aW9uKGEsYil7YSYmKGEudGl0bGU9Ynx8IiIpfTt2YXIgZWQ9ZnVuY3Rpb24oYSxiLGMpe04uY2FsbCh0aGlzLGEsYnx8ZGQuVigpLGMpO1BjKHRoaXMsOCwhMCk7dGhpcy5QfD05fTtuKGVkLE4pO2VkLnByb3RvdHlwZS5HYT1mdW5jdGlvbigpe3JldHVybiB0aGlzLlJhfTtlZC5wcm90b3R5cGUuTWE9ZnVuY3Rpb24oYSl7dGhpcy52Lk1hKHRoaXMuaSgpLGEpO3RoaXMuUmE9YX07dGMoImdvb2ctdGFiIixmdW5jdGlvbigpe3JldHVybiBuZXcgZWQobnVsbCl9KTt2YXIgVz1mdW5jdGlvbigpe3RoaXMuQT0idGFibGlzdCJ9O24oVyx2Yyk7aWEoVyk7Vy5wcm90b3R5cGUuZz1mdW5jdGlvbigpe3JldHVybiJnb29nLXRhYi1iYXIifTtXLnByb3RvdHlwZS51PWZ1bmN0aW9uKGEsYixjKXt0aGlzLnZ8fCh0aGlzLmh8fGZkKHRoaXMpLHRoaXMudj1FYSh0aGlzLmgpKTt2YXIgZD10aGlzLnZbYl07ZD8oemMoYSxnZChkKSksYS52PWQpOlcubC51LmNhbGwodGhpcyxhLGIsYyl9O1cucHJvdG90eXBlLmo9ZnVuY3Rpb24oYSl7dmFyIGI9Vy5sLmouY2FsbCh0aGlzLGEpO3RoaXMuaHx8ZmQodGhpcyk7Yi5wdXNoKHRoaXMuaFthLnZdKTtyZXR1cm4gYn07dmFyIGZkPWZ1bmN0aW9uKGEpe3ZhciBiPWEuZygpO2EuaD17dG9wOmIrIi10b3AiLGJvdHRvbTpiKyItYm90dG9tIixzdGFydDpiKyItc3RhcnQiLGVuZDpiKyItZW5kIn19O3ZhciBYPWZ1bmN0aW9uKGEsYixjKXthPWF8fCJ0b3AiO3pjKHRoaXMsZ2QoYSkpO3RoaXMudj1hO1YuY2FsbCh0aGlzLHRoaXMuTCxifHxXLlYoKSxjKTtoZCh0aGlzKX07bihYLFYpO2c9WC5wcm90b3R5cGU7Zy5IPW51bGw7Zy5JPWZ1bmN0aW9uKCl7WC5sLkkuY2FsbCh0aGlzKTtoZCh0aGlzKX07Zy5DPWZ1bmN0aW9uKCl7WC5sLkMuY2FsbCh0aGlzKTt0aGlzLkg9bnVsbH07Zy5MYT1mdW5jdGlvbihhKXtYLmwuTGEuY2FsbCh0aGlzLGEpO3RoaXMuSihJKHRoaXMsYSkpfTtnLko9ZnVuY3Rpb24oYSl7YT9OYyhhLCEwKTp0aGlzLkgmJk5jKHRoaXMuSCwhMSl9Owp2YXIgaWQ9ZnVuY3Rpb24oYSxiKXtpZihiJiZiPT1hLkgpe2Zvcih2YXIgYz1WYihhLGIpLGQ9Yy0xO2I9SShhLGQpO2QtLSl7dmFyIGU9YjtpZihlLmlzVmlzaWJsZSgpJiZlLmlzRW5hYmxlZCgpKXthLkooYik7cmV0dXJufX1mb3IoYys9MTtiPUkoYSxjKTtjKyspaWYoZD1iLGQuaXNWaXNpYmxlKCkmJmQuaXNFbmFibGVkKCkpe2EuSihiKTtyZXR1cm59YS5KKG51bGwpfX07Zz1YLnByb3RvdHlwZTtnLmpiPWZ1bmN0aW9uKGEpe3RoaXMuSCYmdGhpcy5IIT1hLnRhcmdldCYmTmModGhpcy5ILCExKTt0aGlzLkg9YS50YXJnZXR9O2cua2I9ZnVuY3Rpb24oYSl7YS50YXJnZXQ9PXRoaXMuSCYmKHRoaXMuSD1udWxsKX07Zy5oYj1mdW5jdGlvbihhKXtpZCh0aGlzLGEudGFyZ2V0KX07Zy5pYj1mdW5jdGlvbihhKXtpZCh0aGlzLGEudGFyZ2V0KX07Zy5QYT1mdW5jdGlvbigpe0kodGhpcyx0aGlzLm8pfHxYYyh0aGlzLFZiKHRoaXMsdGhpcy5IfHxJKHRoaXMsMCkpKX07CnZhciBoZD1mdW5jdGlvbihhKXtCKEIoQihCKFFiKGEpLGEsInNlbGVjdCIsYS5qYiksYSwidW5zZWxlY3QiLGEua2IpLGEsImRpc2FibGUiLGEuaGIpLGEsImhpZGUiLGEuaWIpfSxnZD1mdW5jdGlvbihhKXtyZXR1cm4gYT09InN0YXJ0Inx8YT09ImVuZCI/InZlcnRpY2FsIjoiaG9yaXpvbnRhbCJ9O3RjKCJnb29nLXRhYi1iYXIiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBYfSk7ZnVuY3Rpb24gamQoYSl7dmFyIGI9e3RvcDoiYm90dG9tIixib3R0b206InRvcCIsc3RhcnQ6InJpZ2h0IixlbmQ6ImxlZnQifVthLmxvY2F0aW9uXSxjPWEuZWxlbWVudElkLGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTtkLnRleHRDb250ZW50PSJcbiAgICBmaWVsZHNldCB7XG4gICAgICBwYWRkaW5nOiAxMHB4O1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgIzM2OTtcbiAgICB9XG5cbiAgICAjIitjKyIgLmdvb2ctdGFiLWNvbnRlbnQge1xuICAgICAgbWluLWhlaWdodDogM2VtO1xuICAgICAgbWFyZ2luOiAwO1xuICAgICAgYm9yZGVyOiAiK2EuYm9yZGVyKyIgc29saWQgIithLmJvcmRlckNvbG9yKyI7XG4gICAgICBib3JkZXItdG9wOiAwO1xuICAgICAgaGVpZ2h0OiAiK2EuY29udGVudEhlaWdodCsiO1xuICAgICAgcGFkZGluZzogNHB4IDhweDtcbiAgICAgIG1hcmdpbi1yaWdodDogNHB4O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgIG92ZXJmbG93OiBhdXRvO1xuICAgIH1cblxuICAgICMiKwpjKyIgLmdvb2ctdGFiLWJhci0iK2EubG9jYXRpb24rIiAuZ29vZy10YWItc2VsZWN0ZWQge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICIrYS5ib3JkZXJDb2xvcisiO1xuICAgICAgYm9yZGVyLSIrYisiOiAwcHg7XG4gICAgfVxuXG4gICAgIyIrYysiIC5nb29nLXRhYi1iYXItIithLmxvY2F0aW9uKyIge1xuICAgICAgcGFkZGluZy0iK2EubG9jYXRpb24rIjogNXB4ICFpbXBvcnRhbnQ7XG4gICAgICBib3JkZXItIitiKyI6IDFweCBzb2xpZCAiK2EuYm9yZGVyQ29sb3IrIiAhaW1wb3J0YW50O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICB9XG5cbiAgICAjIitjKyIgLmdvb2ctdGFiLWJhciB7XG4gICAgICAgbWFyZ2luOiAwO1xuICAgICAgIGJvcmRlcjogMDtcbiAgICAgICBwYWRkaW5nOiAwO1xuICAgICAgIGxpc3Qtc3R5bGU6IG5vbmU7XG4gICAgICAgY3Vyc29yOiBkZWZhdWx0O1xuICAgICAgIG91dGxpbmU6IG5vbmU7XG4gICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgICBtYXJnaW4tcmlnaHQ6IDRweDtcbiAgICAgIH1cblxuICAgICAjIisKYysiIC5nb29nLXRhYiB7XG4gICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgIHBhZGRpbmc6IDRweCA4cHg7XG4gICAgICAgY29sb3I6IHZhcigtLWNvbGFiLXByaW1hcnktdGV4dC1jb2xvcik7XG4gICAgICAgdGV4dC1kZWNvcmF0aW9uOiBpbml0aWFsO1xuICAgICAgIGN1cnNvcjogZGVmYXVsdDtcbiAgICAgIH1cblxuICAgICAgIyIrYysiIC5nb29nLXRhYi1ob3ZlciB7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWNvbGFiLWhpZ2hsaWdodGVkLXN1cmZhY2UtY29sb3IpO1xuICAgICAgfVxuICAgICAgIjtyZXR1cm4gZH0KdmFyIGtkPWZ1bmN0aW9uKGEpe3ZhciBiPWEuZWxlbWVudElkLGM9YS50YWJOYW1lcyxkPWEuc2VsZWN0ZWRJbmRleDsiY29udGVudEJvcmRlciJpbiBhfHwoYS5jb250ZW50Qm9yZGVyPSIwcHgiKTsiY29udGVudEhlaWdodCJpbiBhfHwoYS5jb250ZW50SGVpZ2h0PSJpbml0aWFsIik7ImJvcmRlckNvbG9yImluIGF8fChhLmJvcmRlckNvbG9yPSJ2YXIoLS1jb2xhYi1ib3JkZXItY29sb3IpIik7YS5sb2NhdGlvbnx8KGEubG9jYXRpb249InRvcCIpO3ZhciBlPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiMiK2IpLGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zi5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYi1iYXIiKTt2YXIgaD1hLmxvY2F0aW9uO2YuY2xhc3NMaXN0LmFkZCgiZ29vZy10YWItYmFyLSIraCk7Zm9yKHZhciBrPVtdLHE9ZmEoYyksRz1xLm5leHQoKTshRy5kb25lO0c9cS5uZXh0KCkpe0c9Ry52YWx1ZTt2YXIgeD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKeC5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYiIpO3gudGV4dENvbnRlbnQ9RztmLmFwcGVuZENoaWxkKHgpO2sucHVzaCh4KX1oIT0iYm90dG9tIiYmZS5hcHBlbmRDaGlsZChmKTtxPW51bGw7aWYoaD09InRvcCJ8fGg9PSJib3R0b20iKXE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikscS5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYi1iYXItY2xlYXIiKTtoPT0idG9wIiYmcSYmZS5hcHBlbmRDaGlsZChxKTtHPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO0cuY2xhc3NMaXN0LmFkZCgiZ29vZy10YWItY29udGVudCIpO3ZhciBoYT1bXTtjPWZhKGMpO2Zvcih4PWMubmV4dCgpOyF4LmRvbmU7eD1jLm5leHQoKSl4PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHguaWQ9ZS5pZCsiX2NvbnRlbnRfIitoYS5sZW5ndGgseC5zdHlsZS5kaXNwbGF5PSJub25lIixHLmFwcGVuZENoaWxkKHgpLGhhLnB1c2goeCk7ZS5hcHBlbmRDaGlsZChHKTtoPT0iYm90dG9tIiYmKHEmJgplLmFwcGVuZENoaWxkKHEpLGUuYXBwZW5kQ2hpbGQoZikpO3ZhciBRPW5ldyBYKGgpO1NiKFEsZik7dmFyIFI9LTE7d2IoUSwic2VsZWN0IixmdW5jdGlvbihTKXtTPWsuaW5kZXhPZihTLnRhcmdldC5pKCkpO1MhPVImJihSPj0wJiZSPGhhLmxlbmd0aCYmKGhhW1JdLnN0eWxlLmRpc3BsYXk9Im5vbmUiLFI9LTEpLFM+PTAmJlM8aGEubGVuZ3RoJiYoUj1TLGhhW1JdLnN0eWxlLmRpc3BsYXk9ImlubGluZSIsd2luZG93LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCJyZXNpemUiKSksZ29vZ2xlLmNvbGFiLm91dHB1dC5yZXNpemVJZnJhbWVUb0NvbnRlbnQoKSksUS5KKEkoUSxSKSkpfSk7US5KKEkoUSxkKSk7d2luZG93W2JdPXtzZXRTZWxlY3RlZFRhYkluZGV4OmZ1bmN0aW9uKFMpe1EuSihJKFEsUykpfX07ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChqZChhKSl9LGxkPVsiY29sYWJfbGliIiwiY3JlYXRlVGFiQmFyIl0sWT1sOwpsZFswXWluIFl8fHR5cGVvZiBZLmV4ZWNTY3JpcHQ9PSJ1bmRlZmluZWQifHxZLmV4ZWNTY3JpcHQoInZhciAiK2xkWzBdKTtmb3IodmFyIFo7bGQubGVuZ3RoJiYoWj1sZC5zaGlmdCgpKTspbGQubGVuZ3RofHxrZD09PXZvaWQgMD9ZW1pdJiZZW1pdIT09T2JqZWN0LnByb3RvdHlwZVtaXT9ZPVlbWl06WT1ZW1pdPXt9OllbWl09a2Q7fSkuY2FsbCh0aGlzKTsKLy8gY2xhbmctZm9ybWF0IG9uCg==", + "ok": true, + "headers": [ + [ + "content-length", + "41785" + ], + [ + "content-type", + "application/javascript" + ] + ], + "status": 200, + "status_text": "" + } + }, + "base_uri": "https://localhost:8080/", + "height": 323 + }, + "outputId": "f8a39d5d-406c-4efd-a20a-a30cf4d7ce23" + }, + "source": [ + "%%logica Employee\n", + "\n", + "Employee(name: \"Alice\", role: \"Product Manager\");\n", + "Employee(name: \"Bob\", role: \"Engineer\");\n", + "Employee(name: \"Caroline\", role: \"Engineer\");\n", + "Employee(name: \"David\", role: \"Data Scientist\");\n", + "Employee(name: \"Eve\", role: \"Data Scientist\");\n", + "\n" + ], + "execution_count": 5, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"dd426832-d22c-11ef-a7c0-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id3\", \"tabNames\": [\"Employee\", \"(Log)\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_a51cd159ac" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"dd42d330-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id3\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_498ffd7769" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"dd45755e-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_873ffc793e" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"dd466932-d22c-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id3_content_1\");\n", + "//# sourceURL=js_1b8f542343" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"dd46f546-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"dd466932-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_e47fdf5dc9" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"dd476fee-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id3\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_48a0d5f679" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"dd4c0c8e-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"dd45755e-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_edeb21d0e9" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"dd4ee7d8-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_51aae2b145" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"dd4f54de-d22c-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id3_content_0\");\n", + "//# sourceURL=js_0555daa7fe" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"dd4fc5f4-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"dd4f54de-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_9974c65445" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"dd502ca6-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id3\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_248c445373" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"dd528640-d22c-11ef-a7c0-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id4\", \"tabNames\": [\"SQL\", \"Result\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_6660403303" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"dd52e0f4-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id4\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_389092dd47" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"dd5474c8-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_70f9968dce" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"dd558b2e-d22c-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id4_content_0\");\n", + "//# sourceURL=js_799bfd6e09" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"dd561c38-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"dd558b2e-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_c4652c3e27" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"dd569212-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id4\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_8476bf80c1" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The following query is stored at \u001b[1mEmployee_sql\u001b[0m variable.\n", + "-- Initializing DuckDB environment.\n", + "create schema if not exists logica_home;\n", + "-- Empty record, has to have a field by DuckDB syntax.\n", + "drop type if exists logicarecord893574736 cascade; create type logicarecord893574736 as struct(nirvana numeric);\n", + "create sequence if not exists eternal_logical_sequence;\n", + "\n", + "\n", + "-- Logica type: logicarecord481217614\n", + "drop type if exists logicarecord481217614 cascade; create type logicarecord481217614 as struct(r logicarecord893574736);\n", + "\n", + "-- Logica type: logicarecord383307722\n", + "drop type if exists logicarecord383307722 cascade; create type logicarecord383307722 as struct(a timestamp);\n", + "SELECT * FROM (\n", + " \n", + " SELECT\n", + " 'Alice' AS name,\n", + " 'Product Manager' AS role\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " 'Bob' AS name,\n", + " 'Engineer' AS role\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " 'Caroline' AS name,\n", + " 'Engineer' AS role\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " 'David' AS name,\n", + " 'Data Scientist' AS role\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " 'Eve' AS name,\n", + " 'Data Scientist' AS role\n", + " \n", + ") AS UNUSED_TABLE_NAME ;\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"dd590416-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"dd5474c8-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_c86cb19288" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"dd5dcf00-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_85670a2cc5" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"dd5e73e2-d22c-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id4_content_1\");\n", + "//# sourceURL=js_e6620966c1" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"dd5f0ee2-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"dd5e73e2-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_39db8868e4" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"dd5f6bd0-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id4\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_5b5fb6633d" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The following table is stored at \u001b[1mEmployee\u001b[0m variable.\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
namerole
0AliceProduct Manager
1BobEngineer
2CarolineEngineer
3DavidData Scientist
4EveData Scientist
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"dd6230ae-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"dd5dcf00-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_de96a8dc05" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"dd659168-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"dd4ee7d8-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_7c7a25a89f" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"dd68908e-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_14313500c4" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"dd6969a0-d22c-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id3_content_1\");\n", + "//# sourceURL=js_8b88032adc" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"dd69c206-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"dd6969a0-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_ac9ecc4c9a" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"dd6a14f4-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id3\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_ae32d7944d" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "image/svg+xml": "\n\n\n\n\n\nConcertina\n\n\n\nEmployee\n\nEmployee\n\n\n\n", + "text/plain": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Running predicate: Employee (4 ms)\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"dd85c97e-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"dd68908e-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_17179d8256" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"dd87a794-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_7d25b0f392" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"dd87f92e-d22c-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id3_content_0\");\n", + "//# sourceURL=js_05a4da71d3" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"dd887368-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"dd87f92e-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_6b1b9778aa" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"dd88c2f0-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id3\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_d9f1836e00" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"dd8a313a-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_f9824728a0" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"dd8a81ee-d22c-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id4_content_1\");\n", + "//# sourceURL=js_913da5cf8e" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"dd8acd16-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"dd8a81ee-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_493a00f3e1" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"dd8b464c-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id4\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_d1790ec853" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"dd8d717e-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"dd8a313a-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_df4d24575c" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + " \n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"dd8ee07c-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"dd87a794-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_6ee133c7a3" + ] + }, + "metadata": {} + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "nZJZo1ISV29Z" + }, + "source": [ + "## Rules (aka Queries)\n", + "\n", + "Rules define new predicates from existing. The building block-predicates are tables defined in Logica (see above), or existing BigQuery tables, which can be used directly (see Example below)." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "rYi7f2pIZTRs" + }, + "source": [ + "### Expressions\n", + "\n", + "You can use basic operators as in most popular languages. String concatenation is done via `++`." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "2FbNzkaLWNEv", + "colab": { + "resources": { + "http://localhost:8080/nbextensions/google.colab/tabbar.css": { + "data": "Lmdvb2ctdGFie3Bvc2l0aW9uOnJlbGF0aXZlO3BhZGRpbmc6NHB4IDhweDtjb2xvcjojMDBjO3RleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7Y3Vyc29yOmRlZmF1bHR9Lmdvb2ctdGFiLWJhci10b3AgLmdvb2ctdGFie21hcmdpbjoxcHggNHB4IDAgMDtib3JkZXItYm90dG9tOjA7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLXRvcDphZnRlciwuZ29vZy10YWItYmFyLWJvdHRvbTphZnRlcntjb250ZW50OiIgIjtkaXNwbGF5OmJsb2NrO2hlaWdodDowO2NsZWFyOmJvdGg7dmlzaWJpbGl0eTpoaWRkZW59Lmdvb2ctdGFiLWJhci1ib3R0b20gLmdvb2ctdGFie21hcmdpbjowIDRweCAxcHggMDtib3JkZXItdG9wOjA7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLXN0YXJ0IC5nb29nLXRhYnttYXJnaW46MCAwIDRweCAxcHg7Ym9yZGVyLXJpZ2h0OjB9Lmdvb2ctdGFiLWJhci1lbmQgLmdvb2ctdGFie21hcmdpbjowIDFweCA0cHggMDtib3JkZXItbGVmdDowfS5nb29nLXRhYi1ob3ZlcntiYWNrZ3JvdW5kOiNlZWV9Lmdvb2ctdGFiLWRpc2FibGVke2NvbG9yOiM2NjZ9Lmdvb2ctdGFiLXNlbGVjdGVke2NvbG9yOiMwMDA7YmFja2dyb3VuZDojZmZmO3RleHQtZGVjb3JhdGlvbjpub25lO2ZvbnQtd2VpZ2h0OmJvbGQ7Ym9yZGVyOjFweCBzb2xpZCAjNmI5MGRhfS5nb29nLXRhYi1iYXItdG9we3BhZGRpbmctdG9wOjVweCFpbXBvcnRhbnQ7cGFkZGluZy1sZWZ0OjVweCFpbXBvcnRhbnQ7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgIzZiOTBkYSFpbXBvcnRhbnR9Lmdvb2ctdGFiLWJhci10b3AgLmdvb2ctdGFiLXNlbGVjdGVke3RvcDoxcHg7bWFyZ2luLXRvcDowO3BhZGRpbmctYm90dG9tOjVweH0uZ29vZy10YWItYmFyLWJvdHRvbSAuZ29vZy10YWItc2VsZWN0ZWR7dG9wOi0xcHg7bWFyZ2luLWJvdHRvbTowO3BhZGRpbmctdG9wOjVweH0uZ29vZy10YWItYmFyLXN0YXJ0IC5nb29nLXRhYi1zZWxlY3RlZHtsZWZ0OjFweDttYXJnaW4tbGVmdDowO3BhZGRpbmctcmlnaHQ6OXB4fS5nb29nLXRhYi1iYXItZW5kIC5nb29nLXRhYi1zZWxlY3RlZHtsZWZ0Oi0xcHg7bWFyZ2luLXJpZ2h0OjA7cGFkZGluZy1sZWZ0OjlweH0uZ29vZy10YWItYmFye21hcmdpbjowO2JvcmRlcjowO3BhZGRpbmc6MDtsaXN0LXN0eWxlOm5vbmU7Y3Vyc29yOmRlZmF1bHQ7b3V0bGluZTpub25lO2JhY2tncm91bmQ6I2ViZWZmOX0uZ29vZy10YWItYmFyLWNsZWFye2NsZWFyOmJvdGg7aGVpZ2h0OjA7b3ZlcmZsb3c6aGlkZGVufS5nb29nLXRhYi1iYXItc3RhcnR7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLWVuZHtmbG9hdDpyaWdodH0qIGh0bWwgLmdvb2ctdGFiLWJhci1zdGFydHttYXJnaW4tcmlnaHQ6LTNweH0qIGh0bWwgLmdvb2ctdGFiLWJhci1lbmR7bWFyZ2luLWxlZnQ6LTNweH1zZW50aW5lbHt9", + "ok": true, + "headers": [ + [ + "content-length", + "1404" + ], + [ + "content-type", + "text/css" + ] + ], + "status": 200, + "status_text": "" + }, + "http://localhost:8080/nbextensions/google.colab/tabbar_main.min.js": { + "data": "Ly8gY2xhbmctZm9ybWF0IG9mZgooZnVuY3Rpb24oKXt2YXIgZyxhYT1mdW5jdGlvbihhKXt2YXIgYj0wO3JldHVybiBmdW5jdGlvbigpe3JldHVybiBiPGEubGVuZ3RoP3tkb25lOiExLHZhbHVlOmFbYisrXX06e2RvbmU6ITB9fX0sYmE9dHlwZW9mIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzPT0iZnVuY3Rpb24iP09iamVjdC5kZWZpbmVQcm9wZXJ0eTpmdW5jdGlvbihhLGIsYyl7aWYoYT09QXJyYXkucHJvdG90eXBlfHxhPT1PYmplY3QucHJvdG90eXBlKXJldHVybiBhO2FbYl09Yy52YWx1ZTtyZXR1cm4gYX0sY2E9ZnVuY3Rpb24oYSl7YT1bIm9iamVjdCI9PXR5cGVvZiBnbG9iYWxUaGlzJiZnbG9iYWxUaGlzLGEsIm9iamVjdCI9PXR5cGVvZiB3aW5kb3cmJndpbmRvdywib2JqZWN0Ij09dHlwZW9mIHNlbGYmJnNlbGYsIm9iamVjdCI9PXR5cGVvZiBnbG9iYWwmJmdsb2JhbF07Zm9yKHZhciBiPTA7YjxhLmxlbmd0aDsrK2Ipe3ZhciBjPWFbYl07aWYoYyYmYy5NYXRoPT1NYXRoKXJldHVybiBjfXRocm93IEVycm9yKCJDYW5ub3QgZmluZCBnbG9iYWwgb2JqZWN0Iik7Cn0sZGE9Y2EodGhpcyksZWE9ZnVuY3Rpb24oYSxiKXtpZihiKWE6e3ZhciBjPWRhO2E9YS5zcGxpdCgiLiIpO2Zvcih2YXIgZD0wO2Q8YS5sZW5ndGgtMTtkKyspe3ZhciBlPWFbZF07aWYoIShlIGluIGMpKWJyZWFrIGE7Yz1jW2VdfWE9YVthLmxlbmd0aC0xXTtkPWNbYV07Yj1iKGQpO2IhPWQmJmIhPW51bGwmJmJhKGMsYSx7Y29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOmJ9KX19OwplYSgiU3ltYm9sIixmdW5jdGlvbihhKXtpZihhKXJldHVybiBhO3ZhciBiPWZ1bmN0aW9uKGYsaCl7dGhpcy5nPWY7YmEodGhpcywiZGVzY3JpcHRpb24iLHtjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6aH0pfTtiLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmd9O3ZhciBjPSJqc2NvbXBfc3ltYm9sXyIrKE1hdGgucmFuZG9tKCkqMUU5Pj4+MCkrIl8iLGQ9MCxlPWZ1bmN0aW9uKGYpe2lmKHRoaXMgaW5zdGFuY2VvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoIlN5bWJvbCBpcyBub3QgYSBjb25zdHJ1Y3RvciIpO3JldHVybiBuZXcgYihjKyhmfHwiIikrIl8iK2QrKyxmKX07cmV0dXJuIGV9KTsKdmFyIGZhPWZ1bmN0aW9uKGEpe3ZhciBiPXR5cGVvZiBTeW1ib2whPSJ1bmRlZmluZWQiJiZTeW1ib2wuaXRlcmF0b3ImJmFbU3ltYm9sLml0ZXJhdG9yXTtpZihiKXJldHVybiBiLmNhbGwoYSk7aWYodHlwZW9mIGEubGVuZ3RoPT0ibnVtYmVyIilyZXR1cm57bmV4dDphYShhKX07dGhyb3cgRXJyb3IoU3RyaW5nKGEpKyIgaXMgbm90IGFuIGl0ZXJhYmxlIG9yIEFycmF5TGlrZSIpO307ZWEoIlN5bWJvbC5kaXNwb3NlIixmdW5jdGlvbihhKXtyZXR1cm4gYT9hOlN5bWJvbCgiU3ltYm9sLmRpc3Bvc2UiKX0pOy8qCgogQ29weXJpZ2h0IFRoZSBDbG9zdXJlIExpYnJhcnkgQXV0aG9ycy4KIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wCiovCnZhciBsPXRoaXN8fHNlbGYsaWE9ZnVuY3Rpb24oYSl7YS5JYT12b2lkIDA7YS5WPWZ1bmN0aW9uKCl7cmV0dXJuIGEuSWE/YS5JYTphLklhPW5ldyBhfX0samE9ZnVuY3Rpb24oYSl7dmFyIGI9dHlwZW9mIGE7cmV0dXJuIGIhPSJvYmplY3QiP2I6YT9BcnJheS5pc0FycmF5KGEpPyJhcnJheSI6YjoibnVsbCJ9LGthPWZ1bmN0aW9uKGEpe3ZhciBiPWphKGEpO3JldHVybiBiPT0iYXJyYXkifHxiPT0ib2JqZWN0IiYmdHlwZW9mIGEubGVuZ3RoPT0ibnVtYmVyIn0sbT1mdW5jdGlvbihhKXt2YXIgYj10eXBlb2YgYTtyZXR1cm4gYj09Im9iamVjdCImJmEhPW51bGx8fGI9PSJmdW5jdGlvbiJ9LG5hPWZ1bmN0aW9uKGEpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYSxsYSkmJmFbbGFdfHwoYVtsYV09KyttYSl9LGxhPSJjbG9zdXJlX3VpZF8iKyhNYXRoLnJhbmRvbSgpKjFFOT4+PjApLG1hPTAsbj1mdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoKXt9Yy5wcm90b3R5cGU9CmIucHJvdG90eXBlO2EubD1iLnByb3RvdHlwZTthLnByb3RvdHlwZT1uZXcgYzthLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1hO2EucWQ9ZnVuY3Rpb24oZCxlLGYpe2Zvcih2YXIgaD1BcnJheShhcmd1bWVudHMubGVuZ3RoLTIpLGs9MjtrPGFyZ3VtZW50cy5sZW5ndGg7aysrKWhbay0yXT1hcmd1bWVudHNba107cmV0dXJuIGIucHJvdG90eXBlW2VdLmFwcGx5KGQsaCl9fTtmdW5jdGlvbiBvYShhLGIpe2lmKEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKUVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsb2EpO2Vsc2V7dmFyIGM9RXJyb3IoKS5zdGFjaztjJiYodGhpcy5zdGFjaz1jKX1hJiYodGhpcy5tZXNzYWdlPVN0cmluZyhhKSk7YiE9PXZvaWQgMCYmKHRoaXMuY2F1c2U9Yil9bihvYSxFcnJvcik7b2EucHJvdG90eXBlLm5hbWU9IkN1c3RvbUVycm9yIjt2YXIgcGE7ZnVuY3Rpb24gcWEoYSxiKXthPWEuc3BsaXQoIiVzIik7Zm9yKHZhciBjPSIiLGQ9YS5sZW5ndGgtMSxlPTA7ZTxkO2UrKyljKz1hW2VdKyhlPGIubGVuZ3RoP2JbZV06IiVzIik7b2EuY2FsbCh0aGlzLGMrYVtkXSl9bihxYSxvYSk7cWEucHJvdG90eXBlLm5hbWU9IkFzc2VydGlvbkVycm9yIjtmdW5jdGlvbiByYShhLGIsYyxkKXt2YXIgZT0iQXNzZXJ0aW9uIGZhaWxlZCI7aWYoYyl7ZSs9IjogIitjO3ZhciBmPWR9ZWxzZSBhJiYoZSs9IjogIithLGY9Yik7dGhyb3cgbmV3IHFhKCIiK2UsZnx8W10pO30KdmFyIHA9ZnVuY3Rpb24oYSxiLGMpe2F8fHJhKCIiLG51bGwsYixBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMikpO3JldHVybiBhfSxzYT1mdW5jdGlvbihhLGIsYyl7bShhKSYmYS5ub2RlVHlwZT09MXx8cmEoIkV4cGVjdGVkIEVsZW1lbnQgYnV0IGdvdCAlczogJXMuIixbamEoYSksYV0sYixBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMikpfSx1YT1mdW5jdGlvbihhLGIsYyxkKXthIGluc3RhbmNlb2YgYnx8cmEoIkV4cGVjdGVkIGluc3RhbmNlb2YgJXMgYnV0IGdvdCAlcy4iLFt0YShiKSx0YShhKV0sYyxBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMykpfTsKZnVuY3Rpb24gdGEoYSl7cmV0dXJuIGEgaW5zdGFuY2VvZiBGdW5jdGlvbj9hLmRpc3BsYXlOYW1lfHxhLm5hbWV8fCJ1bmtub3duIHR5cGUgbmFtZSI6YSBpbnN0YW5jZW9mIE9iamVjdD9hLmNvbnN0cnVjdG9yLmRpc3BsYXlOYW1lfHxhLmNvbnN0cnVjdG9yLm5hbWV8fE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhKTphPT09bnVsbD8ibnVsbCI6dHlwZW9mIGF9O3ZhciB2YT1BcnJheS5wcm90b3R5cGUuaW5kZXhPZj9mdW5jdGlvbihhLGIpe3AoYS5sZW5ndGghPW51bGwpO3JldHVybiBBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKGEsYix2b2lkIDApfTpmdW5jdGlvbihhLGIpe2lmKHR5cGVvZiBhPT09InN0cmluZyIpcmV0dXJuIHR5cGVvZiBiIT09InN0cmluZyJ8fGIubGVuZ3RoIT0xPy0xOmEuaW5kZXhPZihiLDApO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWlmKGMgaW4gYSYmYVtjXT09PWIpcmV0dXJuIGM7cmV0dXJuLTF9LHdhPUFycmF5LnByb3RvdHlwZS5mb3JFYWNoP2Z1bmN0aW9uKGEsYil7cChhLmxlbmd0aCE9bnVsbCk7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChhLGIsdm9pZCAwKX06ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9YS5sZW5ndGgsZD10eXBlb2YgYT09PSJzdHJpbmciP2Euc3BsaXQoIiIpOmEsZT0wO2U8YztlKyspZSBpbiBkJiZiLmNhbGwodm9pZCAwLGRbZV0sZSxhKX07CmZ1bmN0aW9uIHhhKGEsYil7Yj12YShhLGIpO3ZhciBjO2lmKGM9Yj49MClwKGEubGVuZ3RoIT1udWxsKSxBcnJheS5wcm90b3R5cGUuc3BsaWNlLmNhbGwoYSxiLDEpO3JldHVybiBjfWZ1bmN0aW9uIHlhKGEpe3ZhciBiPWEubGVuZ3RoO2lmKGI+MCl7Zm9yKHZhciBjPUFycmF5KGIpLGQ9MDtkPGI7ZCsrKWNbZF09YVtkXTtyZXR1cm4gY31yZXR1cm5bXX1mdW5jdGlvbiB6YShhLGIsYyxkKXtwKGEubGVuZ3RoIT1udWxsKTtBcnJheS5wcm90b3R5cGUuc3BsaWNlLmFwcGx5KGEsQWEoYXJndW1lbnRzLDEpKX1mdW5jdGlvbiBBYShhLGIsYyl7cChhLmxlbmd0aCE9bnVsbCk7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg8PTI/QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYSxiKTpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhLGIsYyl9O2Z1bmN0aW9uIEJhKGEsYixjKXtmb3IodmFyIGQgaW4gYSliLmNhbGwoYyxhW2RdLGQsYSl9ZnVuY3Rpb24gQ2EoYSxiKXtmb3IodmFyIGMgaW4gYSlpZihhW2NdPT1iKXJldHVybiEwO3JldHVybiExfWZ1bmN0aW9uIERhKGEsYixjKXtpZihhIT09bnVsbCYmYiBpbiBhKXRocm93IEVycm9yKCdUaGUgb2JqZWN0IGFscmVhZHkgY29udGFpbnMgdGhlIGtleSAiJytiKyciJyk7YVtiXT1jfWZ1bmN0aW9uIEVhKGEpe3ZhciBiPXt9LGM7Zm9yKGMgaW4gYSliW2FbY11dPWM7cmV0dXJuIGJ9dmFyIEZhPSJjb25zdHJ1Y3RvciBoYXNPd25Qcm9wZXJ0eSBpc1Byb3RvdHlwZU9mIHByb3BlcnR5SXNFbnVtZXJhYmxlIHRvTG9jYWxlU3RyaW5nIHRvU3RyaW5nIHZhbHVlT2YiLnNwbGl0KCIgIik7CmZ1bmN0aW9uIEdhKGEsYil7Zm9yKHZhciBjLGQsZT0xO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspe2Q9YXJndW1lbnRzW2VdO2ZvcihjIGluIGQpYVtjXT1kW2NdO2Zvcih2YXIgZj0wO2Y8RmEubGVuZ3RoO2YrKyljPUZhW2ZdLE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChkLGMpJiYoYVtjXT1kW2NdKX19O3ZhciBIYT1TdHJpbmcucHJvdG90eXBlLnRyaW0/ZnVuY3Rpb24oYSl7cmV0dXJuIGEudHJpbSgpfTpmdW5jdGlvbihhKXtyZXR1cm4vXltcc1x4YTBdKihbXHNcU10qPylbXHNceGEwXSokLy5leGVjKGEpWzFdfTsvKgoKIENvcHlyaWdodCBHb29nbGUgTExDCiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMAoqLwp2YXIgSWE9e307dmFyIEphPWZ1bmN0aW9uKGEpe2lmKElhIT09SWEpdGhyb3cgRXJyb3IoIkJhZCBzZWNyZXQiKTt0aGlzLmc9YX07SmEucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ307bmV3IEphKCJhYm91dDpibGFuayIpO25ldyBKYSgiYWJvdXQ6aW52YWxpZCN6Q2xvc3VyZXoiKTt2YXIgS2E9W10sTGE9ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJBIFVSTCB3aXRoIGNvbnRlbnQgJyIrYSsiJyB3YXMgc2FuaXRpemVkIGF3YXkuIil9O0thLmluZGV4T2YoTGEpPT09LTEmJkthLnB1c2goTGEpO3ZhciBNYSxOYTthOntmb3IodmFyIE9hPVsiQ0xPU1VSRV9GTEFHUyJdLFBhPWwsUWE9MDtRYTxPYS5sZW5ndGg7UWErKylpZihQYT1QYVtPYVtRYV1dLFBhPT1udWxsKXtOYT1udWxsO2JyZWFrIGF9TmE9UGF9dmFyIFJhPU5hJiZOYVs2MTA0MDEzMDFdO01hPVJhIT1udWxsP1JhOiExO2Z1bmN0aW9uIFNhKCl7dmFyIGE9bC5uYXZpZ2F0b3I7cmV0dXJuIGEmJihhPWEudXNlckFnZW50KT9hOiIifXZhciBUYSxVYT1sLm5hdmlnYXRvcjtUYT1VYT9VYS51c2VyQWdlbnREYXRhfHxudWxsOm51bGw7ZnVuY3Rpb24gcihhKXtyZXR1cm4gU2EoKS5pbmRleE9mKGEpIT0tMX07dmFyIFZhPXIoIkVkZ2UiKSx0PXIoIkdlY2tvIikmJiEoU2EoKS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoIndlYmtpdCIpIT0tMSYmIXIoIkVkZ2UiKSkmJiEocigiVHJpZGVudCIpfHxyKCJNU0lFIikpJiYhcigiRWRnZSIpLHU9U2EoKS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoIndlYmtpdCIpIT0tMSYmIXIoIkVkZ2UiKSx2PU1hJiZUYSYmVGEucGxhdGZvcm0/VGEucGxhdGZvcm09PT0ibWFjT1MiOnIoIk1hY2ludG9zaCIpO3ZhciBYYT1mdW5jdGlvbihhLGIpe0JhKGIsZnVuY3Rpb24oYyxkKXtkPT0ic3R5bGUiP2Euc3R5bGUuY3NzVGV4dD1jOmQ9PSJjbGFzcyI/YS5jbGFzc05hbWU9YzpkPT0iZm9yIj9hLmh0bWxGb3I9YzpXYS5oYXNPd25Qcm9wZXJ0eShkKT9hLnNldEF0dHJpYnV0ZShXYVtkXSxjKTpkLmxhc3RJbmRleE9mKCJhcmlhLSIsMCk9PTB8fGQubGFzdEluZGV4T2YoImRhdGEtIiwwKT09MD9hLnNldEF0dHJpYnV0ZShkLGMpOmFbZF09Y30pfSxXYT17Y2VsbHBhZGRpbmc6ImNlbGxQYWRkaW5nIixjZWxsc3BhY2luZzoiY2VsbFNwYWNpbmciLGNvbHNwYW46ImNvbFNwYW4iLGZyYW1lYm9yZGVyOiJmcmFtZUJvcmRlciIsaGVpZ2h0OiJoZWlnaHQiLG1heGxlbmd0aDoibWF4TGVuZ3RoIixub25jZToibm9uY2UiLHJvbGU6InJvbGUiLHJvd3NwYW46InJvd1NwYW4iLHR5cGU6InR5cGUiLHVzZW1hcDoidXNlTWFwIix2YWxpZ246InZBbGlnbiIsd2lkdGg6IndpZHRoIn0sWWE9ZnVuY3Rpb24oYSwKYixjKXtmdW5jdGlvbiBkKGspe2smJmIuYXBwZW5kQ2hpbGQodHlwZW9mIGs9PT0ic3RyaW5nIj9hLmNyZWF0ZVRleHROb2RlKGspOmspfWZvcih2YXIgZT0yO2U8Yy5sZW5ndGg7ZSsrKXt2YXIgZj1jW2VdO2lmKCFrYShmKXx8bShmKSYmZi5ub2RlVHlwZT4wKWQoZik7ZWxzZXthOntpZihmJiZ0eXBlb2YgZi5sZW5ndGg9PSJudW1iZXIiKXtpZihtKGYpKXt2YXIgaD10eXBlb2YgZi5pdGVtPT0iZnVuY3Rpb24ifHx0eXBlb2YgZi5pdGVtPT0ic3RyaW5nIjticmVhayBhfWlmKHR5cGVvZiBmPT09ImZ1bmN0aW9uIil7aD10eXBlb2YgZi5pdGVtPT0iZnVuY3Rpb24iO2JyZWFrIGF9fWg9ITF9d2EoaD95YShmKTpmLGQpfX19LFphPWZ1bmN0aW9uKGEsYil7Yj1TdHJpbmcoYik7YS5jb250ZW50VHlwZT09PSJhcHBsaWNhdGlvbi94aHRtbCt4bWwiJiYoYj1iLnRvTG93ZXJDYXNlKCkpO3JldHVybiBhLmNyZWF0ZUVsZW1lbnQoYil9LCRhPWZ1bmN0aW9uKGEpe2EmJmEucGFyZW50Tm9kZSYmCmEucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhKX0sYWI9ZnVuY3Rpb24oYSxiKXtpZighYXx8IWIpcmV0dXJuITE7aWYoYS5jb250YWlucyYmYi5ub2RlVHlwZT09MSlyZXR1cm4gYT09Ynx8YS5jb250YWlucyhiKTtpZih0eXBlb2YgYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiE9InVuZGVmaW5lZCIpcmV0dXJuIGE9PWJ8fCEhKGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24oYikmMTYpO2Zvcig7YiYmYSE9YjspYj1iLnBhcmVudE5vZGU7cmV0dXJuIGI9PWF9LGJiPWZ1bmN0aW9uKGEpe3AoYSwiTm9kZSBjYW5ub3QgYmUgbnVsbCBvciB1bmRlZmluZWQuIik7cmV0dXJuIGEubm9kZVR5cGU9PTk/YTphLm93bmVyRG9jdW1lbnR8fGEuZG9jdW1lbnR9LGNiPWZ1bmN0aW9uKGEsYil7Yj9hLnRhYkluZGV4PTA6KGEudGFiSW5kZXg9LTEsYS5yZW1vdmVBdHRyaWJ1dGUoInRhYkluZGV4IikpfSxkYj1mdW5jdGlvbihhKXtyZXR1cm4gYS5oYXNBdHRyaWJ1dGUoInRhYmluZGV4Iil9LGViPQpmdW5jdGlvbihhKXthPWEudGFiSW5kZXg7cmV0dXJuIHR5cGVvZiBhPT09Im51bWJlciImJmE+PTAmJmE8MzI3Njh9LGZiPWZ1bmN0aW9uKGEpe3RoaXMuZz1hfHxsLmRvY3VtZW50fHxkb2N1bWVudH07ZmIucHJvdG90eXBlLmk9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nO3JldHVybiB0eXBlb2YgYT09PSJzdHJpbmciP2IuZ2V0RWxlbWVudEJ5SWQoYSk6YX07ZmIucHJvdG90eXBlLmg9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXMuZyxlPWFyZ3VtZW50cyxmPWVbMV0saD1aYShkLFN0cmluZyhlWzBdKSk7ZiYmKHR5cGVvZiBmPT09InN0cmluZyI/aC5jbGFzc05hbWU9ZjpBcnJheS5pc0FycmF5KGYpP2guY2xhc3NOYW1lPWYuam9pbigiICIpOlhhKGgsZikpO2UubGVuZ3RoPjImJllhKGQsaCxlKTtyZXR1cm4gaH07dmFyIHc9ZnVuY3Rpb24oKXt0aGlzLmJhPXRoaXMuYmE7dGhpcy5rYT10aGlzLmthfTt3LnByb3RvdHlwZS5iYT0hMTt3LnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7dGhpcy5iYXx8KHRoaXMuYmE9ITAsdGhpcy5DKCkpfTt3LnByb3RvdHlwZVtTeW1ib2wuZGlzcG9zZV09ZnVuY3Rpb24oKXt0aGlzLmRpc3Bvc2UoKX07dy5wcm90b3R5cGUuQz1mdW5jdGlvbigpe2lmKHRoaXMua2EpZm9yKDt0aGlzLmthLmxlbmd0aDspdGhpcy5rYS5zaGlmdCgpKCl9O3ZhciB5PWZ1bmN0aW9uKGEsYil7dGhpcy50eXBlPWE7dGhpcy51PXRoaXMudGFyZ2V0PWI7dGhpcy5kZWZhdWx0UHJldmVudGVkPXRoaXMuQT0hMX07eS5wcm90b3R5cGUudj1mdW5jdGlvbigpe3RoaXMuQT0hMH07eS5wcm90b3R5cGUuaj1mdW5jdGlvbigpe3RoaXMuZGVmYXVsdFByZXZlbnRlZD0hMH07dmFyIGdiPWZ1bmN0aW9uKCl7aWYoIWwuYWRkRXZlbnRMaXN0ZW5lcnx8IU9iamVjdC5kZWZpbmVQcm9wZXJ0eSlyZXR1cm4hMTt2YXIgYT0hMSxiPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwicGFzc2l2ZSIse2dldDpmdW5jdGlvbigpe2E9ITB9fSk7dHJ5e3ZhciBjPWZ1bmN0aW9uKCl7fTtsLmFkZEV2ZW50TGlzdGVuZXIoInRlc3QiLGMsYik7bC5yZW1vdmVFdmVudExpc3RlbmVyKCJ0ZXN0IixjLGIpfWNhdGNoKGQpe31yZXR1cm4gYX0oKTt2YXIgej1mdW5jdGlvbihhLGIpe3kuY2FsbCh0aGlzLGE/YS50eXBlOiIiKTt0aGlzLnJlbGF0ZWRUYXJnZXQ9dGhpcy51PXRoaXMudGFyZ2V0PW51bGw7dGhpcy5idXR0b249dGhpcy5zY3JlZW5ZPXRoaXMuc2NyZWVuWD10aGlzLmNsaWVudFk9dGhpcy5jbGllbnRYPTA7dGhpcy5rZXk9IiI7dGhpcy5nPTA7dGhpcy5tZXRhS2V5PXRoaXMuc2hpZnRLZXk9dGhpcy5hbHRLZXk9dGhpcy5jdHJsS2V5PSExO3RoaXMuc3RhdGU9bnVsbDt0aGlzLkc9ITE7dGhpcy5wb2ludGVySWQ9MDt0aGlzLnBvaW50ZXJUeXBlPSIiO3RoaXMudGltZVN0YW1wPTA7dGhpcy5oPW51bGw7aWYoYSl7dmFyIGM9dGhpcy50eXBlPWEudHlwZSxkPWEuY2hhbmdlZFRvdWNoZXMmJmEuY2hhbmdlZFRvdWNoZXMubGVuZ3RoP2EuY2hhbmdlZFRvdWNoZXNbMF06bnVsbDt0aGlzLnRhcmdldD1hLnRhcmdldHx8YS5zcmNFbGVtZW50O3RoaXMudT1iO2I9YS5yZWxhdGVkVGFyZ2V0O2J8fChjPT0ibW91c2VvdmVyIj8KYj1hLmZyb21FbGVtZW50OmM9PSJtb3VzZW91dCImJihiPWEudG9FbGVtZW50KSk7dGhpcy5yZWxhdGVkVGFyZ2V0PWI7ZD8odGhpcy5jbGllbnRYPWQuY2xpZW50WCE9PXZvaWQgMD9kLmNsaWVudFg6ZC5wYWdlWCx0aGlzLmNsaWVudFk9ZC5jbGllbnRZIT09dm9pZCAwP2QuY2xpZW50WTpkLnBhZ2VZLHRoaXMuc2NyZWVuWD1kLnNjcmVlblh8fDAsdGhpcy5zY3JlZW5ZPWQuc2NyZWVuWXx8MCk6KHRoaXMuY2xpZW50WD1hLmNsaWVudFghPT12b2lkIDA/YS5jbGllbnRYOmEucGFnZVgsdGhpcy5jbGllbnRZPWEuY2xpZW50WSE9PXZvaWQgMD9hLmNsaWVudFk6YS5wYWdlWSx0aGlzLnNjcmVlblg9YS5zY3JlZW5YfHwwLHRoaXMuc2NyZWVuWT1hLnNjcmVlbll8fDApO3RoaXMuYnV0dG9uPWEuYnV0dG9uO3RoaXMuZz1hLmtleUNvZGV8fDA7dGhpcy5rZXk9YS5rZXl8fCIiO3RoaXMuY3RybEtleT1hLmN0cmxLZXk7dGhpcy5hbHRLZXk9YS5hbHRLZXk7dGhpcy5zaGlmdEtleT1hLnNoaWZ0S2V5Owp0aGlzLm1ldGFLZXk9YS5tZXRhS2V5O3RoaXMuRz12P2EubWV0YUtleTphLmN0cmxLZXk7dGhpcy5wb2ludGVySWQ9YS5wb2ludGVySWR8fDA7dGhpcy5wb2ludGVyVHlwZT1hLnBvaW50ZXJUeXBlO3RoaXMuc3RhdGU9YS5zdGF0ZTt0aGlzLnRpbWVTdGFtcD1hLnRpbWVTdGFtcDt0aGlzLmg9YTthLmRlZmF1bHRQcmV2ZW50ZWQmJnoubC5qLmNhbGwodGhpcyl9fTtuKHoseSk7ei5wcm90b3R5cGUudj1mdW5jdGlvbigpe3oubC52LmNhbGwodGhpcyk7dGhpcy5oLnN0b3BQcm9wYWdhdGlvbj90aGlzLmguc3RvcFByb3BhZ2F0aW9uKCk6dGhpcy5oLmNhbmNlbEJ1YmJsZT0hMH07ei5wcm90b3R5cGUuaj1mdW5jdGlvbigpe3oubC5qLmNhbGwodGhpcyk7dmFyIGE9dGhpcy5oO2EucHJldmVudERlZmF1bHQ/YS5wcmV2ZW50RGVmYXVsdCgpOmEucmV0dXJuVmFsdWU9ITF9O3ZhciBoYj0iY2xvc3VyZV9saXN0ZW5hYmxlXyIrKE1hdGgucmFuZG9tKCkqMUU2fDApLGliPWZ1bmN0aW9uKGEpe3JldHVybiEoIWF8fCFhW2hiXSl9O3ZhciBqYj0wO3ZhciBrYj1mdW5jdGlvbihhLGIsYyxkLGUpe3RoaXMubGlzdGVuZXI9YTt0aGlzLnByb3h5PW51bGw7dGhpcy5zcmM9Yjt0aGlzLnR5cGU9Yzt0aGlzLmNhcHR1cmU9ISFkO3RoaXMucGE9ZTt0aGlzLmtleT0rK2piO3RoaXMuamE9dGhpcy5vYT0hMX0sbGI9ZnVuY3Rpb24oYSl7YS5qYT0hMDthLmxpc3RlbmVyPW51bGw7YS5wcm94eT1udWxsO2Euc3JjPW51bGw7YS5wYT1udWxsfTt2YXIgbWI9ZnVuY3Rpb24oYSl7dGhpcy5zcmM9YTt0aGlzLmc9e307dGhpcy5oPTB9O21iLnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZj1hLnRvU3RyaW5nKCk7YT10aGlzLmdbZl07YXx8KGE9dGhpcy5nW2ZdPVtdLHRoaXMuaCsrKTt2YXIgaD1uYihhLGIsZCxlKTtoPi0xPyhiPWFbaF0sY3x8KGIub2E9ITEpKTooYj1uZXcga2IoYix0aGlzLnNyYyxmLCEhZCxlKSxiLm9hPWMsYS5wdXNoKGIpKTtyZXR1cm4gYn07CnZhciBvYj1mdW5jdGlvbihhLGIpe3ZhciBjPWIudHlwZTtjIGluIGEuZyYmeGEoYS5nW2NdLGIpJiYobGIoYiksYS5nW2NdLmxlbmd0aD09MCYmKGRlbGV0ZSBhLmdbY10sYS5oLS0pKX0scGI9ZnVuY3Rpb24oYSxiLGMsZCxlKXthPWEuZ1tiLnRvU3RyaW5nKCldO2I9LTE7YSYmKGI9bmIoYSxjLGQsZSkpO3JldHVybiBiPi0xP2FbYl06bnVsbH0sbmI9ZnVuY3Rpb24oYSxiLGMsZCl7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDsrK2Upe3ZhciBmPWFbZV07aWYoIWYuamEmJmYubGlzdGVuZXI9PWImJmYuY2FwdHVyZT09ISFjJiZmLnBhPT1kKXJldHVybiBlfXJldHVybi0xfTt2YXIgcWI9ImNsb3N1cmVfbG1fIisoTWF0aC5yYW5kb20oKSoxRTZ8MCkscmI9e30sc2I9MCx1Yj1mdW5jdGlvbihhLGIsYyxkLGUpe2lmKGQmJmQub25jZSlyZXR1cm4gdGIoYSxiLGMsZCxlKTtpZihBcnJheS5pc0FycmF5KGIpKXtmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKyl1YihhLGJbZl0sYyxkLGUpO3JldHVybiBudWxsfWM9dmIoYyk7cmV0dXJuIGliKGEpP3diKGEsYixjLG0oZCk/ISFkLmNhcHR1cmU6ISFkLGUpOnhiKGEsYixjLCExLGQsZSl9LHhiPWZ1bmN0aW9uKGEsYixjLGQsZSxmKXtpZighYil0aHJvdyBFcnJvcigiSW52YWxpZCBldmVudCB0eXBlIik7dmFyIGg9bShlKT8hIWUuY2FwdHVyZTohIWUsaz15YihhKTtrfHwoYVtxYl09az1uZXcgbWIoYSkpO2M9ay5hZGQoYixjLGQsaCxmKTtpZihjLnByb3h5KXJldHVybiBjO2Q9emIoKTtjLnByb3h5PWQ7ZC5zcmM9YTtkLmxpc3RlbmVyPWM7aWYoYS5hZGRFdmVudExpc3RlbmVyKWdifHwoZT1oKSxlPT09dm9pZCAwJiYKKGU9ITEpLGEuYWRkRXZlbnRMaXN0ZW5lcihiLnRvU3RyaW5nKCksZCxlKTtlbHNlIGlmKGEuYXR0YWNoRXZlbnQpYS5hdHRhY2hFdmVudChBYihiLnRvU3RyaW5nKCkpLGQpO2Vsc2UgaWYoYS5hZGRMaXN0ZW5lciYmYS5yZW1vdmVMaXN0ZW5lcilwKGI9PT0iY2hhbmdlIiwiTWVkaWFRdWVyeUxpc3Qgb25seSBoYXMgYSBjaGFuZ2UgZXZlbnQiKSxhLmFkZExpc3RlbmVyKGQpO2Vsc2UgdGhyb3cgRXJyb3IoImFkZEV2ZW50TGlzdGVuZXIgYW5kIGF0dGFjaEV2ZW50IGFyZSB1bmF2YWlsYWJsZS4iKTtzYisrO3JldHVybiBjfSx6Yj1mdW5jdGlvbigpe3ZhciBhPUJiLGI9ZnVuY3Rpb24oYyl7cmV0dXJuIGEuY2FsbChiLnNyYyxiLmxpc3RlbmVyLGMpfTtyZXR1cm4gYn0sdGI9ZnVuY3Rpb24oYSxiLGMsZCxlKXtpZihBcnJheS5pc0FycmF5KGIpKXtmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKyl0YihhLGJbZl0sYyxkLGUpO3JldHVybiBudWxsfWM9dmIoYyk7cmV0dXJuIGliKGEpPwphLkEuYWRkKFN0cmluZyhiKSxjLCEwLG0oZCk/ISFkLmNhcHR1cmU6ISFkLGUpOnhiKGEsYixjLCEwLGQsZSl9LENiPWZ1bmN0aW9uKGEsYixjLGQsZSl7aWYoQXJyYXkuaXNBcnJheShiKSlmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKylDYihhLGJbZl0sYyxkLGUpO2Vsc2UgZD1tKGQpPyEhZC5jYXB0dXJlOiEhZCxjPXZiKGMpLGliKGEpPyhhPWEuQSxiPVN0cmluZyhiKS50b1N0cmluZygpLGIgaW4gYS5nJiYoZj1hLmdbYl0sYz1uYihmLGMsZCxlKSxjPi0xJiYobGIoZltjXSkscChmLmxlbmd0aCE9bnVsbCksQXJyYXkucHJvdG90eXBlLnNwbGljZS5jYWxsKGYsYywxKSxmLmxlbmd0aD09MCYmKGRlbGV0ZSBhLmdbYl0sYS5oLS0pKSkpOmEmJihhPXliKGEpKSYmKGM9cGIoYSxiLGMsZCxlKSkmJkEoYyl9LEE9ZnVuY3Rpb24oYSl7aWYodHlwZW9mIGEhPT0ibnVtYmVyIiYmYSYmIWEuamEpe3ZhciBiPWEuc3JjO2lmKGliKGIpKW9iKGIuQSxhKTtlbHNle3ZhciBjPWEudHlwZSwKZD1hLnByb3h5O2IucmVtb3ZlRXZlbnRMaXN0ZW5lcj9iLnJlbW92ZUV2ZW50TGlzdGVuZXIoYyxkLGEuY2FwdHVyZSk6Yi5kZXRhY2hFdmVudD9iLmRldGFjaEV2ZW50KEFiKGMpLGQpOmIuYWRkTGlzdGVuZXImJmIucmVtb3ZlTGlzdGVuZXImJmIucmVtb3ZlTGlzdGVuZXIoZCk7c2ItLTsoYz15YihiKSk/KG9iKGMsYSksYy5oPT0wJiYoYy5zcmM9bnVsbCxiW3FiXT1udWxsKSk6bGIoYSl9fX0sQWI9ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW4gcmI/cmJbYV06cmJbYV09Im9uIithfSxCYj1mdW5jdGlvbihhLGIpe2lmKGEuamEpYT0hMDtlbHNle2I9bmV3IHooYix0aGlzKTt2YXIgYz1hLmxpc3RlbmVyLGQ9YS5wYXx8YS5zcmM7YS5vYSYmQShhKTthPWMuY2FsbChkLGIpfXJldHVybiBhfSx5Yj1mdW5jdGlvbihhKXthPWFbcWJdO3JldHVybiBhIGluc3RhbmNlb2YgbWI/YTpudWxsfSxEYj0iX19jbG9zdXJlX2V2ZW50c19mbl8iKyhNYXRoLnJhbmRvbSgpKjFFOT4+PjApLHZiPWZ1bmN0aW9uKGEpe3AoYSwKIkxpc3RlbmVyIGNhbiBub3QgYmUgbnVsbC4iKTtpZih0eXBlb2YgYT09PSJmdW5jdGlvbiIpcmV0dXJuIGE7cChhLmhhbmRsZUV2ZW50LCJBbiBvYmplY3QgbGlzdGVuZXIgbXVzdCBoYXZlIGhhbmRsZUV2ZW50IG1ldGhvZC4iKTthW0RiXXx8KGFbRGJdPWZ1bmN0aW9uKGIpe3JldHVybiBhLmhhbmRsZUV2ZW50KGIpfSk7cmV0dXJuIGFbRGJdfTt2YXIgRWI9ZnVuY3Rpb24oYSl7dy5jYWxsKHRoaXMpO3RoaXMuaD1hO3RoaXMuZz17fX07bihFYix3KTsKdmFyIEZiPVtdLEI9ZnVuY3Rpb24oYSxiLGMsZCl7QXJyYXkuaXNBcnJheShjKXx8KGMmJihGYlswXT1jLnRvU3RyaW5nKCkpLGM9RmIpO2Zvcih2YXIgZT0wO2U8Yy5sZW5ndGg7ZSsrKXt2YXIgZj11YihiLGNbZV0sZHx8YS5oYW5kbGVFdmVudCwhMSxhLmh8fGEpO2lmKCFmKWJyZWFrO2EuZ1tmLmtleV09Zn1yZXR1cm4gYX0sQz1mdW5jdGlvbihhLGIsYyxkLGUsZil7aWYoQXJyYXkuaXNBcnJheShjKSlmb3IodmFyIGg9MDtoPGMubGVuZ3RoO2grKylDKGEsYixjW2hdLGQsZSxmKTtlbHNlIGQ9ZHx8YS5oYW5kbGVFdmVudCxlPW0oZSk/ISFlLmNhcHR1cmU6ISFlLGY9Znx8YS5ofHxhLGQ9dmIoZCksZT0hIWUsYz1pYihiKT9wYihiLkEsU3RyaW5nKGMpLGQsZSxmKTpiPyhiPXliKGIpKT9wYihiLGMsZCxlLGYpOm51bGw6bnVsbCxjJiYoQShjKSxkZWxldGUgYS5nW2Mua2V5XSk7cmV0dXJuIGF9LEdiPWZ1bmN0aW9uKGEpe0JhKGEuZyxmdW5jdGlvbihiLGMpe3RoaXMuZy5oYXNPd25Qcm9wZXJ0eShjKSYmCkEoYil9LGEpO2EuZz17fX07RWIucHJvdG90eXBlLkM9ZnVuY3Rpb24oKXtFYi5sLkMuY2FsbCh0aGlzKTtHYih0aGlzKX07RWIucHJvdG90eXBlLmhhbmRsZUV2ZW50PWZ1bmN0aW9uKCl7dGhyb3cgRXJyb3IoIkV2ZW50SGFuZGxlci5oYW5kbGVFdmVudCBub3QgaW1wbGVtZW50ZWQiKTt9O3ZhciBEPWZ1bmN0aW9uKCl7dy5jYWxsKHRoaXMpO3RoaXMuQT1uZXcgbWIodGhpcyk7dGhpcy5ZYT10aGlzO3RoaXMubGE9bnVsbH07bihELHcpO0QucHJvdG90eXBlW2hiXT0hMDtELnByb3RvdHlwZS5BYT1mdW5jdGlvbihhKXt0aGlzLmxhPWF9O0QucHJvdG90eXBlLnJlbW92ZUV2ZW50TGlzdGVuZXI9ZnVuY3Rpb24oYSxiLGMsZCl7Q2IodGhpcyxhLGIsYyxkKX07CnZhciBFPWZ1bmN0aW9uKGEsYil7SGIoYSk7dmFyIGM9YS5sYTtpZihjKXt2YXIgZD1bXTtmb3IodmFyIGU9MTtjO2M9Yy5sYSlkLnB1c2goYykscCgrK2U8MUUzLCJpbmZpbml0ZSBsb29wIil9YT1hLllhO2M9Yi50eXBlfHxiO3R5cGVvZiBiPT09InN0cmluZyI/Yj1uZXcgeShiLGEpOmIgaW5zdGFuY2VvZiB5P2IudGFyZ2V0PWIudGFyZ2V0fHxhOihlPWIsYj1uZXcgeShjLGEpLEdhKGIsZSkpO2U9ITA7dmFyIGY7aWYoZClmb3IoZj1kLmxlbmd0aC0xOyFiLkEmJmY+PTA7Zi0tKXt2YXIgaD1iLnU9ZFtmXTtlPUliKGgsYywhMCxiKSYmZX1iLkF8fChoPWIudT1hLGU9SWIoaCxjLCEwLGIpJiZlLGIuQXx8KGU9SWIoaCxjLCExLGIpJiZlKSk7aWYoZClmb3IoZj0wOyFiLkEmJmY8ZC5sZW5ndGg7ZisrKWg9Yi51PWRbZl0sZT1JYihoLGMsITEsYikmJmU7cmV0dXJuIGV9OwpELnByb3RvdHlwZS5DPWZ1bmN0aW9uKCl7RC5sLkMuY2FsbCh0aGlzKTtpZih0aGlzLkEpe3ZhciBhPXRoaXMuQSxiPTAsYztmb3IoYyBpbiBhLmcpe2Zvcih2YXIgZD1hLmdbY10sZT0wO2U8ZC5sZW5ndGg7ZSsrKSsrYixsYihkW2VdKTtkZWxldGUgYS5nW2NdO2EuaC0tfX10aGlzLmxhPW51bGx9O3ZhciB3Yj1mdW5jdGlvbihhLGIsYyxkLGUpe0hiKGEpO3JldHVybiBhLkEuYWRkKFN0cmluZyhiKSxjLCExLGQsZSl9LEliPWZ1bmN0aW9uKGEsYixjLGQpe2I9YS5BLmdbU3RyaW5nKGIpXTtpZighYilyZXR1cm4hMDtiPWIuY29uY2F0KCk7Zm9yKHZhciBlPSEwLGY9MDtmPGIubGVuZ3RoOysrZil7dmFyIGg9YltmXTtpZihoJiYhaC5qYSYmaC5jYXB0dXJlPT1jKXt2YXIgaz1oLmxpc3RlbmVyLHE9aC5wYXx8aC5zcmM7aC5vYSYmb2IoYS5BLGgpO2U9ay5jYWxsKHEsZCkhPT0hMSYmZX19cmV0dXJuIGUmJiFkLmRlZmF1bHRQcmV2ZW50ZWR9LEhiPWZ1bmN0aW9uKGEpe3AoYS5BLCJFdmVudCB0YXJnZXQgaXMgbm90IGluaXRpYWxpemVkLiBEaWQgeW91IGNhbGwgdGhlIHN1cGVyY2xhc3MgKGdvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0KSBjb25zdHJ1Y3Rvcj8iKX07dmFyIEpiPXQ/Ik1velVzZXJTZWxlY3QiOnV8fFZhPyJXZWJraXRVc2VyU2VsZWN0IjpudWxsLEtiPWZ1bmN0aW9uKGEsYil7Yj1iP251bGw6YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpO2lmKEpiJiYoYS5zdHlsZSYmKGEuc3R5bGVbSmJdPSJub25lIiksYikpZm9yKHZhciBjPTA7YT1iW2NdO2MrKylhLnN0eWxlJiYoYS5zdHlsZVtKYl09Im5vbmUiKX07dmFyIExiPWZ1bmN0aW9uKCl7fTtpYShMYik7TGIucHJvdG90eXBlLmc9MDt2YXIgRj1mdW5jdGlvbihhKXtELmNhbGwodGhpcyk7dGhpcy5HPWF8fHBhfHwocGE9bmV3IGZiKTt0aGlzLnphPU1iO3RoaXMuWT1udWxsO3RoaXMucz0hMTt0aGlzLmc9bnVsbDt0aGlzLk09dm9pZCAwO3RoaXMudT10aGlzLmo9dGhpcy5oPW51bGw7dGhpcy5TYT0hMX07bihGLEQpO0YucHJvdG90eXBlLlphPUxiLlYoKTsKdmFyIE1iPW51bGwsTmI9ZnVuY3Rpb24oYSxiKXtzd2l0Y2goYSl7Y2FzZSAxOnJldHVybiBiPyJkaXNhYmxlIjoiZW5hYmxlIjtjYXNlIDI6cmV0dXJuIGI/ImhpZ2hsaWdodCI6InVuaGlnaGxpZ2h0IjtjYXNlIDQ6cmV0dXJuIGI/ImFjdGl2YXRlIjoiZGVhY3RpdmF0ZSI7Y2FzZSA4OnJldHVybiBiPyJzZWxlY3QiOiJ1bnNlbGVjdCI7Y2FzZSAxNjpyZXR1cm4gYj8iY2hlY2siOiJ1bmNoZWNrIjtjYXNlIDMyOnJldHVybiBiPyJmb2N1cyI6ImJsdXIiO2Nhc2UgNjQ6cmV0dXJuIGI/Im9wZW4iOiJjbG9zZSJ9dGhyb3cgRXJyb3IoIkludmFsaWQgY29tcG9uZW50IHN0YXRlIik7fSxPYj1mdW5jdGlvbihhKXtyZXR1cm4gYS5ZfHwoYS5ZPSI6IisoYS5aYS5nKyspLnRvU3RyaW5nKDM2KSl9LFBiPWZ1bmN0aW9uKGEsYil7aWYoYS5oJiZhLmgudSl7dmFyIGM9YS5oLnUsZD1hLlk7ZCBpbiBjJiZkZWxldGUgY1tkXTtEYShhLmgudSxiLGEpfWEuWT1ifTtGLnByb3RvdHlwZS5pPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ307CnZhciBRYj1mdW5jdGlvbihhKXthLk18fChhLk09bmV3IEViKGEpKTtyZXR1cm4gcChhLk0pfTtGLnByb3RvdHlwZS5BYT1mdW5jdGlvbihhKXtpZih0aGlzLmgmJnRoaXMuaCE9YSl0aHJvdyBFcnJvcigiTWV0aG9kIG5vdCBzdXBwb3J0ZWQiKTtGLmwuQWEuY2FsbCh0aGlzLGEpfTtGLnByb3RvdHlwZS5tYT1mdW5jdGlvbigpe3RoaXMuZz1aYSh0aGlzLkcuZywiRElWIil9O0YucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbihhKXtSYih0aGlzLGEpfTsKdmFyIFJiPWZ1bmN0aW9uKGEsYixjKXtpZihhLnMpdGhyb3cgRXJyb3IoIkNvbXBvbmVudCBhbHJlYWR5IHJlbmRlcmVkIik7YS5nfHxhLm1hKCk7Yj9iLmluc2VydEJlZm9yZShhLmcsY3x8bnVsbCk6YS5HLmcuYm9keS5hcHBlbmRDaGlsZChhLmcpO2EuaCYmIWEuaC5zfHxhLkkoKX0sU2I9ZnVuY3Rpb24oYSxiKXtpZihhLnMpdGhyb3cgRXJyb3IoIkNvbXBvbmVudCBhbHJlYWR5IHJlbmRlcmVkIik7aWYoYiYmYS53YShiKSl7YS5TYT0hMDt2YXIgYz1iYihiKTthLkcmJmEuRy5nPT1jfHwoYS5HPWI/bmV3IGZiKGJiKGIpKTpwYXx8KHBhPW5ldyBmYikpO2EuRWEoYik7YS5JKCl9ZWxzZSB0aHJvdyBFcnJvcigiSW52YWxpZCBlbGVtZW50IHRvIGRlY29yYXRlIik7fTtnPUYucHJvdG90eXBlO2cud2E9ZnVuY3Rpb24oKXtyZXR1cm4hMH07Zy5FYT1mdW5jdGlvbihhKXt0aGlzLmc9YX07CmcuST1mdW5jdGlvbigpe3RoaXMucz0hMDtUYih0aGlzLGZ1bmN0aW9uKGEpeyFhLnMmJmEuaSgpJiZhLkkoKX0pfTtnLlU9ZnVuY3Rpb24oKXtUYih0aGlzLGZ1bmN0aW9uKGEpe2EucyYmYS5VKCl9KTt0aGlzLk0mJkdiKHRoaXMuTSk7dGhpcy5zPSExfTtnLkM9ZnVuY3Rpb24oKXt0aGlzLnMmJnRoaXMuVSgpO3RoaXMuTSYmKHRoaXMuTS5kaXNwb3NlKCksZGVsZXRlIHRoaXMuTSk7VGIodGhpcyxmdW5jdGlvbihhKXthLmRpc3Bvc2UoKX0pOyF0aGlzLlNhJiZ0aGlzLmcmJiRhKHRoaXMuZyk7dGhpcy5oPXRoaXMuZz10aGlzLnU9dGhpcy5qPW51bGw7Ri5sLkMuY2FsbCh0aGlzKX07Zy5CYT1mdW5jdGlvbihhLGIpe3RoaXMuQ2EoYSxIKHRoaXMpLGIpfTsKZy5DYT1mdW5jdGlvbihhLGIsYyl7cCghIWEsIlByb3ZpZGVkIGVsZW1lbnQgbXVzdCBub3QgYmUgbnVsbC4iKTtpZihhLnMmJihjfHwhdGhpcy5zKSl0aHJvdyBFcnJvcigiQ29tcG9uZW50IGFscmVhZHkgcmVuZGVyZWQiKTtpZihiPDB8fGI+SCh0aGlzKSl0aHJvdyBFcnJvcigiQ2hpbGQgY29tcG9uZW50IGluZGV4IG91dCBvZiBib3VuZHMiKTt0aGlzLnUmJnRoaXMuanx8KHRoaXMudT17fSx0aGlzLmo9W10pO2lmKGEuaD09dGhpcyl7dmFyIGQ9dGhpcy51LGU9T2IoYSk7ZFtlXT1hO3hhKHRoaXMuaixhKX1lbHNlIERhKHRoaXMudSxPYihhKSxhKTtpZihhPT10aGlzKXRocm93IEVycm9yKCJVbmFibGUgdG8gc2V0IHBhcmVudCBjb21wb25lbnQiKTtpZihkPXRoaXMmJmEuaCYmYS5ZKWU9YS5oLGQ9YS5ZLGUudSYmZD8oZT1lLnUsZD0oZSE9PW51bGwmJmQgaW4gZT9lW2RdOnZvaWQgMCl8fG51bGwpOmQ9bnVsbDtpZihkJiZhLmghPXRoaXMpdGhyb3cgRXJyb3IoIlVuYWJsZSB0byBzZXQgcGFyZW50IGNvbXBvbmVudCIpOwphLmg9dGhpcztGLmwuQWEuY2FsbChhLHRoaXMpO3phKHRoaXMuaixiLDAsYSk7YS5zJiZ0aGlzLnMmJmEuaD09dGhpcz8oYz10aGlzLm5hKCksKGMuY2hpbGROb2Rlc1tiXXx8bnVsbCkhPWEuaSgpJiYoYS5pKCkucGFyZW50RWxlbWVudD09YyYmYy5yZW1vdmVDaGlsZChhLmkoKSksYj1jLmNoaWxkTm9kZXNbYl18fG51bGwsYy5pbnNlcnRCZWZvcmUoYS5pKCksYikpKTpjPyh0aGlzLmd8fHRoaXMubWEoKSxiPUkodGhpcyxiKzEpLFJiKGEsdGhpcy5uYSgpLGI/Yi5nOm51bGwpKTp0aGlzLnMmJiFhLnMmJmEuZyYmYS5nLnBhcmVudE5vZGUmJmEuZy5wYXJlbnROb2RlLm5vZGVUeXBlPT0xJiZhLkkoKX07Zy5uYT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmd9Owp2YXIgVWI9ZnVuY3Rpb24oYSl7aWYoYS56YT09bnVsbCl7dmFyIGI9YS5zP2EuZzphLkcuZy5ib2R5O2E6e3ZhciBjPWJiKGIpO2lmKGMuZGVmYXVsdFZpZXcmJmMuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSYmKGM9Yy5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKGIsbnVsbCkpKXtjPWMuZGlyZWN0aW9ufHxjLmdldFByb3BlcnR5VmFsdWUoImRpcmVjdGlvbiIpfHwiIjticmVhayBhfWM9IiJ9YS56YT0icnRsIj09KGN8fChiLmN1cnJlbnRTdHlsZT9iLmN1cnJlbnRTdHlsZS5kaXJlY3Rpb246bnVsbCl8fGIuc3R5bGUmJmIuc3R5bGUuZGlyZWN0aW9uKX1yZXR1cm4gYS56YX0sSD1mdW5jdGlvbihhKXtyZXR1cm4gYS5qP2Euai5sZW5ndGg6MH0sST1mdW5jdGlvbihhLGIpe3JldHVybiBhLmo/YS5qW2JdfHxudWxsOm51bGx9LFRiPWZ1bmN0aW9uKGEsYixjKXthLmomJmEuai5mb3JFYWNoKGIsYyl9LFZiPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuaiYmYj9hLmouaW5kZXhPZihiKToKLTF9O3ZhciBXYj17bWI6ImFjdGl2ZWRlc2NlbmRhbnQiLHJiOiJhdG9taWMiLHNiOiJhdXRvY29tcGxldGUiLHViOiJidXN5Iix4YjoiY2hlY2tlZCIseWI6ImNvbGluZGV4IixEYjoiY29udHJvbHMiLEViOiJjdXJyZW50IixHYjoiZGVzY3JpYmVkYnkiLEpiOiJkaXNhYmxlZCIsTGI6ImRyb3BlZmZlY3QiLE1iOiJleHBhbmRlZCIsTmI6ImZsb3d0byIsUGI6ImdyYWJiZWQiLFRiOiJoYXNwb3B1cCIsVmI6ImhpZGRlbiIsWGI6ImludmFsaWQiLFliOiJsYWJlbCIsWmI6ImxhYmVsbGVkYnkiLGFjOiJsZXZlbCIsZmM6ImxpdmUiLHZjOiJtdWx0aWxpbmUiLHdjOiJtdWx0aXNlbGVjdGFibGUiLEFjOiJvcmllbnRhdGlvbiIsQmM6Im93bnMiLENjOiJwb3NpbnNldCIsRWM6InByZXNzZWQiLEljOiJyZWFkb25seSIsS2M6InJlbGV2YW50IixMYzoicmVxdWlyZWQiLFBjOiJyb3dpbmRleCIsU2M6InNlbGVjdGVkIixVYzoic2V0c2l6ZSIsV2M6InNvcnQiLG1kOiJ2YWx1ZW1heCIsbmQ6InZhbHVlbWluIiwKb2Q6InZhbHVlbm93IixwZDoidmFsdWV0ZXh0In07dmFyIFhiO3ZhciBZYj17bmI6ImFsZXJ0IixvYjoiYWxlcnRkaWFsb2ciLHBiOiJhcHBsaWNhdGlvbiIscWI6ImFydGljbGUiLHRiOiJiYW5uZXIiLHZiOiJidXR0b24iLHdiOiJjaGVja2JveCIsemI6ImNvbHVtbmhlYWRlciIsQWI6ImNvbWJvYm94IixCYjoiY29tcGxlbWVudGFyeSIsQ2I6ImNvbnRlbnRpbmZvIixGYjoiZGVmaW5pdGlvbiIsSGI6ImRpYWxvZyIsSWI6ImRpcmVjdG9yeSIsS2I6ImRvY3VtZW50IixPYjoiZm9ybSIsUWI6ImdyaWQiLFJiOiJncmlkY2VsbCIsU2I6Imdyb3VwIixVYjoiaGVhZGluZyIsV2I6ImltZyIsYmM6ImxpbmsiLGNjOiJsaXN0IixkYzoibGlzdGJveCIsZWM6Imxpc3RpdGVtIixoYzoibG9nIixpYzoibWFpbiIsamM6Im1hcnF1ZWUiLGtjOiJtYXRoIixsYzoibWVudSIsbWM6Im1lbnViYXIiLG5jOiJtZW51aXRlbSIsb2M6Im1lbnVpdGVtY2hlY2tib3giLHBjOiJtZW51aXRlbXJhZGlvIix4YzoibmF2aWdhdGlvbiIseWM6Im5vdGUiLHpjOiJvcHRpb24iLApEYzoicHJlc2VudGF0aW9uIixGYzoicHJvZ3Jlc3NiYXIiLEdjOiJyYWRpbyIsSGM6InJhZGlvZ3JvdXAiLEpjOiJyZWdpb24iLE1jOiJyb3ciLE5jOiJyb3dncm91cCIsT2M6InJvd2hlYWRlciIsUWM6InNjcm9sbGJhciIsUmM6InNlYXJjaCIsVGM6InNlcGFyYXRvciIsVmM6InNsaWRlciIsWGM6InNwaW5idXR0b24iLFljOiJzdGF0dXMiLFpjOiJzd2l0Y2giLGFkOiJ0YWIiLGJkOiJ0YWJsaXN0IixjZDoidGFicGFuZWwiLGRkOiJ0ZXh0Ym94IixlZDoidGV4dGluZm8iLGZkOiJ0aW1lciIsZ2Q6InRvb2xiYXIiLGhkOiJ0b29sdGlwIixqZDoidHJlZSIsa2Q6InRyZWVncmlkIixsZDoidHJlZWl0ZW0ifTt2YXIgWmI9ZnVuY3Rpb24oYSxiKXtiPyhwKENhKFliLGIpLCJObyBzdWNoIEFSSUEgcm9sZSAiK2IpLGEuc2V0QXR0cmlidXRlKCJyb2xlIixiKSk6YS5yZW1vdmVBdHRyaWJ1dGUoInJvbGUiKX0sYWM9ZnVuY3Rpb24oYSxiLGMpe0FycmF5LmlzQXJyYXkoYykmJihjPWMuam9pbigiICIpKTt2YXIgZD0kYihiKTtjPT09IiJ8fGM9PXZvaWQgMD8oWGJ8fChjPXt9LFhiPShjLmF0b21pYz0hMSxjLmF1dG9jb21wbGV0ZT0ibm9uZSIsYy5kcm9wZWZmZWN0PSJub25lIixjLmhhc3BvcHVwPSExLGMubGl2ZT0ib2ZmIixjLm11bHRpbGluZT0hMSxjLm11bHRpc2VsZWN0YWJsZT0hMSxjLm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIsYy5yZWFkb25seT0hMSxjLnJlbGV2YW50PSJhZGRpdGlvbnMgdGV4dCIsYy5yZXF1aXJlZD0hMSxjLnNvcnQ9Im5vbmUiLGMuYnVzeT0hMSxjLmRpc2FibGVkPSExLGMuaGlkZGVuPSExLGMuaW52YWxpZD0iZmFsc2UiLGMpKSxjPVhiLGIgaW4gYz9hLnNldEF0dHJpYnV0ZShkLApjW2JdKTphLnJlbW92ZUF0dHJpYnV0ZShkKSk6YS5zZXRBdHRyaWJ1dGUoZCxjKX0sJGI9ZnVuY3Rpb24oYSl7cChhLCJBUklBIGF0dHJpYnV0ZSBjYW5ub3QgYmUgZW1wdHkuIik7cChDYShXYixhKSwiTm8gc3VjaCBBUklBIGF0dHJpYnV0ZSAiK2EpO3JldHVybiJhcmlhLSIrYX07dmFyIGRjPWZ1bmN0aW9uKGEsYixjLGQsZSxmKXtpZih2JiZlKXJldHVybiBiYyhhKTtpZihlJiYhZClyZXR1cm4hMTtpZighdCl7dHlwZW9mIGI9PT0ibnVtYmVyIiYmKGI9Y2MoYikpO3ZhciBoPWI9PTE3fHxiPT0xOHx8diYmYj09OTE7aWYoKCFjfHx2KSYmaHx8diYmYj09MTYmJihkfHxmKSlyZXR1cm4hMX1pZih1JiZkJiZjKXN3aXRjaChhKXtjYXNlIDIyMDpjYXNlIDIxOTpjYXNlIDIyMTpjYXNlIDE5MjpjYXNlIDE4NjpjYXNlIDE4OTpjYXNlIDE4NzpjYXNlIDE4ODpjYXNlIDE5MDpjYXNlIDE5MTpjYXNlIDE5MjpjYXNlIDIyMjpyZXR1cm4hMX1zd2l0Y2goYSl7Y2FzZSAxMzpyZXR1cm4gdD9mfHxlPyExOiEoYyYmZCk6ITA7Y2FzZSAyNzpyZXR1cm4hdSYmIXR9cmV0dXJuIHQmJihkfHxlfHxmKT8hMTpiYyhhKX0sYmM9ZnVuY3Rpb24oYSl7aWYoYT49NDgmJmE8PTU3fHxhPj05NiYmYTw9MTA2fHxhPj02NSYmYTw9OTB8fHUmJmE9PTApcmV0dXJuITA7c3dpdGNoKGEpe2Nhc2UgMzI6Y2FzZSA0MzpjYXNlIDYzOmNhc2UgNjQ6Y2FzZSAxMDc6Y2FzZSAxMDk6Y2FzZSAxMTA6Y2FzZSAxMTE6Y2FzZSAxODY6Y2FzZSA1OTpjYXNlIDE4OTpjYXNlIDE4NzpjYXNlIDYxOmNhc2UgMTg4OmNhc2UgMTkwOmNhc2UgMTkxOmNhc2UgMTkyOmNhc2UgMjIyOmNhc2UgMjE5OmNhc2UgMjIwOmNhc2UgMjIxOmNhc2UgMTYzOmNhc2UgNTg6cmV0dXJuITA7CmNhc2UgMTczOmNhc2UgMTcxOnJldHVybiB0O2RlZmF1bHQ6cmV0dXJuITF9fSxjYz1mdW5jdGlvbihhKXtpZih0KWE9ZWMoYSk7ZWxzZSBpZih2JiZ1KXN3aXRjaChhKXtjYXNlIDkzOmE9OTF9cmV0dXJuIGF9LGVjPWZ1bmN0aW9uKGEpe3N3aXRjaChhKXtjYXNlIDYxOnJldHVybiAxODc7Y2FzZSA1OTpyZXR1cm4gMTg2O2Nhc2UgMTczOnJldHVybiAxODk7Y2FzZSAyMjQ6cmV0dXJuIDkxO2Nhc2UgMDpyZXR1cm4gMjI0O2RlZmF1bHQ6cmV0dXJuIGF9fTt2YXIgZmM9ZnVuY3Rpb24oYSxiLGMsZCl7ei5jYWxsKHRoaXMsZCk7dGhpcy50eXBlPSJrZXkiO3RoaXMuZz1hO3RoaXMucmVwZWF0PWN9O24oZmMseik7dmFyIEo9ZnVuY3Rpb24oYSxiKXtELmNhbGwodGhpcyk7YSYmZ2ModGhpcyxhLGIpfTtuKEosRCk7Zz1KLnByb3RvdHlwZTtnLlI9bnVsbDtnLnFhPW51bGw7Zy5KYT1udWxsO2cucmE9bnVsbDtnLkY9LTE7Zy5LPS0xO2cuRGE9ITE7CnZhciBoYz17MzoxMywxMjoxNDQsNjMyMzI6MzgsNjMyMzM6NDAsNjMyMzQ6MzcsNjMyMzU6MzksNjMyMzY6MTEyLDYzMjM3OjExMyw2MzIzODoxMTQsNjMyMzk6MTE1LDYzMjQwOjExNiw2MzI0MToxMTcsNjMyNDI6MTE4LDYzMjQzOjExOSw2MzI0NDoxMjAsNjMyNDU6MTIxLDYzMjQ2OjEyMiw2MzI0NzoxMjMsNjMyNDg6NDQsNjMyNzI6NDYsNjMyNzM6MzYsNjMyNzU6MzUsNjMyNzY6MzMsNjMyNzc6MzQsNjMyODk6MTQ0LDYzMzAyOjQ1fSxpYz17VXA6MzgsRG93bjo0MCxMZWZ0OjM3LFJpZ2h0OjM5LEVudGVyOjEzLEYxOjExMixGMjoxMTMsRjM6MTE0LEY0OjExNSxGNToxMTYsRjY6MTE3LEY3OjExOCxGODoxMTksRjk6MTIwLEYxMDoxMjEsRjExOjEyMixGMTI6MTIzLCJVKzAwN0YiOjQ2LEhvbWU6MzYsRW5kOjM1LFBhZ2VVcDozMyxQYWdlRG93bjozNCxJbnNlcnQ6NDV9LGpjPXYmJnQ7CkoucHJvdG90eXBlLmc9ZnVuY3Rpb24oYSl7dSYmKHRoaXMuRj09MTcmJiFhLmN0cmxLZXl8fHRoaXMuRj09MTgmJiFhLmFsdEtleXx8diYmdGhpcy5GPT05MSYmIWEubWV0YUtleSkmJih0aGlzLks9dGhpcy5GPS0xKTt0aGlzLkY9PS0xJiYoYS5jdHJsS2V5JiZhLmchPTE3P3RoaXMuRj0xNzphLmFsdEtleSYmYS5nIT0xOD90aGlzLkY9MTg6YS5tZXRhS2V5JiZhLmchPTkxJiYodGhpcy5GPTkxKSk7ZGMoYS5nLHRoaXMuRixhLnNoaWZ0S2V5LGEuY3RybEtleSxhLmFsdEtleSxhLm1ldGFLZXkpPyh0aGlzLks9Y2MoYS5nKSxqYyYmKHRoaXMuRGE9YS5hbHRLZXkpKTp0aGlzLmhhbmRsZUV2ZW50KGEpfTtKLnByb3RvdHlwZS5oPWZ1bmN0aW9uKGEpe3RoaXMuSz10aGlzLkY9LTE7dGhpcy5EYT1hLmFsdEtleX07CkoucHJvdG90eXBlLmhhbmRsZUV2ZW50PWZ1bmN0aW9uKGEpe3ZhciBiPWEuaCxjPWIuYWx0S2V5O2lmKHUmJmEudHlwZT09ImtleXByZXNzIil7dmFyIGQ9dGhpcy5LO3ZhciBlPWIuY2hhckNvZGU+PTAmJmIuY2hhckNvZGU8NjMyMzImJmJjKGQpP2IuY2hhckNvZGU6MH1lbHNlIGEudHlwZT09ImtleXByZXNzIj8oamMmJihjPXRoaXMuRGEpLGIua2V5Q29kZT09Yi5jaGFyQ29kZT9iLmtleUNvZGU8MzI/KGQ9Yi5rZXlDb2RlLGU9MCk6KGQ9dGhpcy5LLGU9Yi5jaGFyQ29kZSk6KGQ9Yi5rZXlDb2RlfHx0aGlzLkssZT1iLmNoYXJDb2RlfHwwKSk6KGQ9Yi5rZXlDb2RlfHx0aGlzLkssZT1iLmNoYXJDb2RlfHwwKSx2JiZlPT02MyYmZD09MjI0JiYoZD0xOTEpO3ZhciBmPWQ9Y2MoZCk7ZD9kPj02MzIzMiYmZCBpbiBoYz9mPWhjW2RdOmQ9PTI1JiZhLnNoaWZ0S2V5JiYoZj05KTpiLmtleUlkZW50aWZpZXImJmIua2V5SWRlbnRpZmllciBpbiBpYyYmKGY9aWNbYi5rZXlJZGVudGlmaWVyXSk7CmlmKCF0fHxhLnR5cGUhPSJrZXlwcmVzcyJ8fGRjKGYsdGhpcy5GLGEuc2hpZnRLZXksYS5jdHJsS2V5LGMsYS5tZXRhS2V5KSlhPWY9PXRoaXMuRix0aGlzLkY9ZixiPW5ldyBmYyhmLGUsYSxiKSxiLmFsdEtleT1jLEUodGhpcyxiKX07Si5wcm90b3R5cGUuaT1mdW5jdGlvbigpe3JldHVybiB0aGlzLlJ9O3ZhciBnYz1mdW5jdGlvbihhLGIsYyl7YS5yYSYma2MoYSk7YS5SPWI7YS5xYT11YihhLlIsImtleXByZXNzIixhLGMpO2EuSmE9dWIoYS5SLCJrZXlkb3duIixhLmcsYyxhKTthLnJhPXViKGEuUiwia2V5dXAiLGEuaCxjLGEpfSxrYz1mdW5jdGlvbihhKXthLnFhJiYoQShhLnFhKSxBKGEuSmEpLEEoYS5yYSksYS5xYT1udWxsLGEuSmE9bnVsbCxhLnJhPW51bGwpO2EuUj1udWxsO2EuRj0tMTthLks9LTF9O0oucHJvdG90eXBlLkM9ZnVuY3Rpb24oKXtKLmwuQy5jYWxsKHRoaXMpO2tjKHRoaXMpfTt2YXIgSz17Z2E6Im1vdXNlZG93biIsaGE6Im1vdXNldXAiLGZhOiJtb3VzZWNhbmNlbCIsc2M6Im1vdXNlbW92ZSIsdWM6Im1vdXNlb3ZlciIsdGM6Im1vdXNlb3V0IixxYzoibW91c2VlbnRlciIscmM6Im1vdXNlbGVhdmUifTt2YXIgbGM9ZnVuY3Rpb24oYSl7cmV0dXJuIHR5cGVvZiBhLmNsYXNzTmFtZT09InN0cmluZyI/YS5jbGFzc05hbWU6YS5nZXRBdHRyaWJ1dGUmJmEuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIn0sTD1mdW5jdGlvbihhKXtyZXR1cm4gYS5jbGFzc0xpc3Q/YS5jbGFzc0xpc3Q6bGMoYSkubWF0Y2goL1xTKy9nKXx8W119LG1jPWZ1bmN0aW9uKGEsYil7dHlwZW9mIGEuY2xhc3NOYW1lPT0ic3RyaW5nIj9hLmNsYXNzTmFtZT1iOmEuc2V0QXR0cmlidXRlJiZhLnNldEF0dHJpYnV0ZSgiY2xhc3MiLGIpfSxuYz1mdW5jdGlvbihhLGIpe2EuY2xhc3NMaXN0P2I9YS5jbGFzc0xpc3QuY29udGFpbnMoYik6KGE9TChhKSxiPXZhKGEsYik+PTApO3JldHVybiBifSxvYz1mdW5jdGlvbihhLGIpe2lmKGEuY2xhc3NMaXN0KWEuY2xhc3NMaXN0LmFkZChiKTtlbHNlIGlmKCFuYyhhLGIpKXt2YXIgYz1sYyhhKTttYyhhLGMrKGMubGVuZ3RoPjA/IiAiK2I6YikpfX0scGM9ZnVuY3Rpb24oYSxiKXtpZihhLmNsYXNzTGlzdClBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGIsCmZ1bmN0aW9uKGUpe29jKGEsZSl9KTtlbHNle3ZhciBjPXt9O0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoTChhKSxmdW5jdGlvbihlKXtjW2VdPSEwfSk7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChiLGZ1bmN0aW9uKGUpe2NbZV09ITB9KTtiPSIiO2Zvcih2YXIgZCBpbiBjKWIrPWIubGVuZ3RoPjA/IiAiK2Q6ZDttYyhhLGIpfX0scWM9ZnVuY3Rpb24oYSxiKXthLmNsYXNzTGlzdD9hLmNsYXNzTGlzdC5yZW1vdmUoYik6bmMoYSxiKSYmbWMoYSxBcnJheS5wcm90b3R5cGUuZmlsdGVyLmNhbGwoTChhKSxmdW5jdGlvbihjKXtyZXR1cm4gYyE9Yn0pLmpvaW4oIiAiKSl9LHJjPWZ1bmN0aW9uKGEsYil7YS5jbGFzc0xpc3Q/QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChiLGZ1bmN0aW9uKGMpe3FjKGEsYyl9KTptYyhhLEFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbChMKGEpLGZ1bmN0aW9uKGMpe3JldHVybiEodmEoYixjKT49MCl9KS5qb2luKCIgIikpfTt2YXIgdGM9ZnVuY3Rpb24oYSxiKXtpZighYSl0aHJvdyBFcnJvcigiSW52YWxpZCBjbGFzcyBuYW1lICIrYSk7aWYodHlwZW9mIGIhPT0iZnVuY3Rpb24iKXRocm93IEVycm9yKCJJbnZhbGlkIGRlY29yYXRvciBmdW5jdGlvbiAiK2IpO3NjW2FdPWJ9LHVjPXt9LHNjPXt9O3ZhciB2Yz1mdW5jdGlvbihhKXt0aGlzLkE9YX07aWEodmMpO3ZhciB3Yz1mdW5jdGlvbihhLGIpe2EmJihhLnRhYkluZGV4PWI/MDotMSl9LHljPWZ1bmN0aW9uKGEsYixjKXtjLmlkJiZQYihiLGMuaWQpO3ZhciBkPWEuZygpLGU9ITEsZj1MKGMpO2YmJkFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoZixmdW5jdGlvbihoKXtoPT1kP2U9ITA6aCYmdGhpcy51KGIsaCxkKX0sYSk7ZXx8b2MoYyxkKTt4YyhiLGMpO3JldHVybiBjfTt2Yy5wcm90b3R5cGUudT1mdW5jdGlvbihhLGIsYyl7Yj09YysiLWRpc2FibGVkIj9hLlgoITEpOmI9PWMrIi1ob3Jpem9udGFsIj96YyhhLCJob3Jpem9udGFsIik6Yj09YysiLXZlcnRpY2FsIiYmemMoYSwidmVydGljYWwiKX07CnZhciB4Yz1mdW5jdGlvbihhLGIpe2lmKGIpZm9yKHZhciBjPWIuZmlyc3RDaGlsZCxkO2MmJmMucGFyZW50Tm9kZT09Yjspe2Q9Yy5uZXh0U2libGluZztpZihjLm5vZGVUeXBlPT0xKXthOnt2YXIgZT1jO3AoZSk7ZT1MKGUpO2Zvcih2YXIgZj1lLmxlbmd0aCxoPTA7aDxmO2grKyl7dmFyIGs9ZVtoXTtpZihrPWsgaW4gc2M/c2Nba10oKTpudWxsKXtlPWs7YnJlYWsgYX19ZT1udWxsfWUmJihlLmc9YyxhLmlzRW5hYmxlZCgpfHxlLlgoITEpLGEuQmEoZSksU2IoZSxjKSl9ZWxzZSBjLm5vZGVWYWx1ZSYmSGEoYy5ub2RlVmFsdWUpIT0iInx8Yi5yZW1vdmVDaGlsZChjKTtjPWR9fSxBYz1mdW5jdGlvbihhLGIpe2I9Yi5pKCk7cChiLCJUaGUgY29udGFpbmVyIERPTSBlbGVtZW50IGNhbm5vdCBiZSBudWxsLiIpO0tiKGIsdCk7KGE9YS5BKSYmWmIoYixhKX07dmMucHJvdG90eXBlLmc9ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy1jb250YWluZXIifTsKdmMucHJvdG90eXBlLmo9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nKCksYz1bYixhLkw9PSJob3Jpem9udGFsIj9iKyItaG9yaXpvbnRhbCI6YisiLXZlcnRpY2FsIl07YS5pc0VuYWJsZWQoKXx8Yy5wdXNoKGIrIi1kaXNhYmxlZCIpO3JldHVybiBjfTt2YXIgQmM9ZnVuY3Rpb24oKXt9O3ZhciBNPWZ1bmN0aW9uKCl7fSxDYztpYShNKTt2YXIgRGM9e2J1dHRvbjoicHJlc3NlZCIsY2hlY2tib3g6ImNoZWNrZWQiLG1lbnVpdGVtOiJzZWxlY3RlZCIsbWVudWl0ZW1jaGVja2JveDoiY2hlY2tlZCIsbWVudWl0ZW1yYWRpbzoiY2hlY2tlZCIscmFkaW86ImNoZWNrZWQiLHRhYjoic2VsZWN0ZWQiLHRyZWVpdGVtOiJzZWxlY3RlZCJ9O00ucHJvdG90eXBlLk5hPWZ1bmN0aW9uKCl7fTtNLnByb3RvdHlwZS54YT1mdW5jdGlvbihhKXt2YXIgYj1hLkcsYz1iLmgsZD10aGlzLk4oKSxlPVtkXSxmPXRoaXMuTigpO2YhPWQmJmUucHVzaChmKTtkPWEubTtmb3IoZj1bXTtkOyl7dmFyIGg9ZCYtZDtmLnB1c2goRWModGhpcyxoKSk7ZCY9fmh9ZS5wdXNoLmFwcGx5KGUsZik7KGQ9YS5GYSkmJmUucHVzaC5hcHBseShlLGQpO3JldHVybiBjLmNhbGwoYiwiRElWIixlLmpvaW4oIiAiKSxhLmlhKX07Ck0ucHJvdG90eXBlLnlhPWZ1bmN0aW9uKGEsYil7Yi5pZCYmUGIoYSxiLmlkKTtiJiZiLmZpcnN0Q2hpbGQ/RmMoYSxiLmZpcnN0Q2hpbGQubmV4dFNpYmxpbmc/eWEoYi5jaGlsZE5vZGVzKTpiLmZpcnN0Q2hpbGQpOmEuaWE9bnVsbDt2YXIgYz0wLGQ9dGhpcy5OKCksZT10aGlzLk4oKSxmPSExLGg9ITEsaz15YShMKGIpKTtrLmZvckVhY2goZnVuY3Rpb24ocSl7Znx8cSE9ZD9ofHxxIT1lP2N8PUdjKHRoaXMscSk6aD0hMDooZj0hMCxlPT1kJiYoaD0hMCkpO0djKHRoaXMscSk9PTEmJihzYShiKSxkYihiKSYmZWIoYikmJmNiKGIsITEpKX0sdGhpcyk7YS5tPWM7Znx8KGsucHVzaChkKSxlPT1kJiYoaD0hMCkpO2h8fGsucHVzaChlKTsoYT1hLkZhKSYmay5wdXNoLmFwcGx5KGssYSk7ZiYmaCYmIWF8fG1jKGIsay5qb2luKCIgIikpO3JldHVybiBifTsKdmFyIEhjPWZ1bmN0aW9uKGEsYil7aWYoYT1hLk5hKCkpe3AoYiwiVGhlIGVsZW1lbnQgcGFzc2VkIGFzIGEgZmlyc3QgcGFyYW1ldGVyIGNhbm5vdCBiZSBudWxsLiIpO3ZhciBjPWIuZ2V0QXR0cmlidXRlKCJyb2xlIil8fG51bGw7YSE9YyYmWmIoYixhKX19LEljPWZ1bmN0aW9uKGEsYil7dmFyIGM7aWYoYS5EJjMyJiYoYz1hLmkoKSkpe2lmKCFiJiZhLm0mMzIpe3RyeXtjLmJsdXIoKX1jYXRjaChkKXt9YS5tJjMyJiZhLlFhKG51bGwpfShkYihjKSYmZWIoYykpIT1iJiZjYihjLGIpfX0sSmM9ZnVuY3Rpb24oYSxiLGMpe0NjfHwoQ2M9ezE6ImRpc2FibGVkIiw4OiJzZWxlY3RlZCIsMTY6ImNoZWNrZWQiLDY0OiJleHBhbmRlZCJ9KTtwKGEsIlRoZSBlbGVtZW50IHBhc3NlZCBhcyBhIGZpcnN0IHBhcmFtZXRlciBjYW5ub3QgYmUgbnVsbC4iKTtiPUNjW2JdO3ZhciBkPWEuZ2V0QXR0cmlidXRlKCJyb2xlIil8fG51bGw7ZCYmKGQ9RGNbZF18fGIsYj1iPT0iY2hlY2tlZCJ8fGI9PQoic2VsZWN0ZWQiP2Q6Yik7YiYmYWMoYSxiLGMpfTtNLnByb3RvdHlwZS5OPWZ1bmN0aW9uKCl7cmV0dXJuImdvb2ctY29udHJvbCJ9O3ZhciBFYz1mdW5jdGlvbihhLGIpe2EuZ3x8S2MoYSk7cmV0dXJuIGEuZ1tiXX0sR2M9ZnVuY3Rpb24oYSxiKXthLmh8fChhLmd8fEtjKGEpLGEuaD1FYShhLmcpKTthPXBhcnNlSW50KGEuaFtiXSwxMCk7cmV0dXJuIGlzTmFOKGEpPzA6YX0sS2M9ZnVuY3Rpb24oYSl7dmFyIGI9YS5OKCk7dmFyIGM9Yi5yZXBsYWNlKC9ceGEwfFxzL2csIiAiKS5pbmRleE9mKCIgIikhPS0xO3AoIWMsIkNvbnRyb2xSZW5kZXJlciBoYXMgYW4gaW52YWxpZCBjc3MgY2xhc3M6ICciK2IrIiciKTthLmc9ezE6YisiLWRpc2FibGVkIiwyOmIrIi1ob3ZlciIsNDpiKyItYWN0aXZlIiw4OmIrIi1zZWxlY3RlZCIsMTY6YisiLWNoZWNrZWQiLDMyOmIrIi1mb2N1c2VkIiw2NDpiKyItb3BlbiJ9fTt2YXIgTj1mdW5jdGlvbihhLGIsYyl7Ri5jYWxsKHRoaXMsYyk7aWYoIWIpe2ZvcihiPXRoaXMuY29uc3RydWN0b3I7Yjspe3ZhciBkPW5hKGIpO2lmKGQ9dWNbZF0pYnJlYWs7Yj0oYj1PYmplY3QuZ2V0UHJvdG90eXBlT2YoYi5wcm90b3R5cGUpKSYmYi5jb25zdHJ1Y3Rvcn1iPWQ/dHlwZW9mIGQuVj09PSJmdW5jdGlvbiI/ZC5WKCk6bmV3IGQ6bnVsbH10aGlzLnY9Yjt0aGlzLmlhPWEhPT12b2lkIDA/YTpudWxsfTtuKE4sRik7Zz1OLnByb3RvdHlwZTtnLmlhPW51bGw7Zy5tPTA7Zy5EPTM5O2cuUD0wO2cuT2E9ITA7Zy5GYT1udWxsO2cuSGE9ITA7Zy5tYT1mdW5jdGlvbigpe3ZhciBhPXRoaXMudi54YSh0aGlzKTt0aGlzLmc9YTtIYyh0aGlzLnYsYSk7S2IoYSwhMCk7dGhpcy5pc1Zpc2libGUoKXx8KGEuc3R5bGUuZGlzcGxheT0ibm9uZSIsYSYmYWMoYSwiaGlkZGVuIiwhMCkpfTtnLm5hPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaSgpfTtnLndhPWZ1bmN0aW9uKCl7cmV0dXJuITB9OwpnLkVhPWZ1bmN0aW9uKGEpe3RoaXMuZz1hPXRoaXMudi55YSh0aGlzLGEpO0hjKHRoaXMudixhKTtLYihhLCEwKTt0aGlzLk9hPWEuc3R5bGUuZGlzcGxheSE9Im5vbmUifTsKZy5JPWZ1bmN0aW9uKCl7Ti5sLkkuY2FsbCh0aGlzKTt2YXIgYT10aGlzLmc7cChhLCJDYW4gbm90IGNhbGwgZ2V0RWxlbWVudFN0cmljdCBiZWZvcmUgcmVuZGVyaW5nL2RlY29yYXRpbmcuIik7cCh0aGlzKTtwKGEpO3RoaXMuaXNWaXNpYmxlKCl8fGFjKGEsImhpZGRlbiIsIXRoaXMuaXNWaXNpYmxlKCkpO3RoaXMuaXNFbmFibGVkKCl8fEpjKGEsMSwhdGhpcy5pc0VuYWJsZWQoKSk7dGhpcy5EJjgmJkpjKGEsOCwhISh0aGlzLm0mOCkpO3RoaXMuRCYxNiYmSmMoYSwxNiwhISh0aGlzLm0mMTYpKTt0aGlzLkQmNjQmJkpjKGEsNjQsISEodGhpcy5tJjY0KSk7dmFyIGI9dGhpcy52O1ViKHRoaXMpJiYoYT10aGlzLmkoKSxiPWIuTigpKyItcnRsIiwoYT1hLmk/YS5pKCk6YSkmJnBjKGEsW2JdKSk7dGhpcy5pc0VuYWJsZWQoKSYmSWModGhpcyx0aGlzLmlzVmlzaWJsZSgpKTt0aGlzLkQmLTImJih0aGlzLkhhJiZMYyh0aGlzLCEwKSx0aGlzLkQmMzImJihhPXRoaXMuaSgpKSkmJihiPQp0aGlzLlp8fCh0aGlzLlo9bmV3IEopLGdjKGIsYSksQihCKEIoUWIodGhpcyksYiwia2V5Iix0aGlzLmFhKSxhLCJmb2N1cyIsdGhpcy5YYSksYSwiYmx1ciIsdGhpcy5RYSkpfTt2YXIgTGM9ZnVuY3Rpb24oYSxiKXt2YXIgYz1RYihhKSxkPWEuaSgpO2I/KEIoQihCKEIoYyxkLEsuZ2EsYS5zYSksZCxbSy5oYSxLLmZhXSxhLnZhKSxkLCJtb3VzZW92ZXIiLGEudWEpLGQsIm1vdXNlb3V0IixhLnRhKSxhLmNhIT1CYyYmQihjLGQsImNvbnRleHRtZW51IixhLmNhKSk6KEMoQyhDKEMoYyxkLEsuZ2EsYS5zYSksZCxbSy5oYSxLLmZhXSxhLnZhKSxkLCJtb3VzZW92ZXIiLGEudWEpLGQsIm1vdXNlb3V0IixhLnRhKSxhLmNhIT1CYyYmQyhjLGQsImNvbnRleHRtZW51IixhLmNhKSl9O04ucHJvdG90eXBlLlU9ZnVuY3Rpb24oKXtOLmwuVS5jYWxsKHRoaXMpO3RoaXMuWiYma2ModGhpcy5aKTt0aGlzLmlzVmlzaWJsZSgpJiZ0aGlzLmlzRW5hYmxlZCgpJiZJYyh0aGlzLCExKX07Ck4ucHJvdG90eXBlLkM9ZnVuY3Rpb24oKXtOLmwuQy5jYWxsKHRoaXMpO3RoaXMuWiYmKHRoaXMuWi5kaXNwb3NlKCksZGVsZXRlIHRoaXMuWik7ZGVsZXRlIHRoaXMudjt0aGlzLkZhPXRoaXMuaWE9bnVsbH07dmFyIEZjPWZ1bmN0aW9uKGEsYil7YS5pYT1ifTtOLnByb3RvdHlwZS5pc1Zpc2libGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5PYX07Ti5wcm90b3R5cGUuaXNFbmFibGVkPWZ1bmN0aW9uKCl7cmV0dXJuISh0aGlzLm0mMSl9O04ucHJvdG90eXBlLlg9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5oO2ImJnR5cGVvZiBiLmlzRW5hYmxlZD09ImZ1bmN0aW9uIiYmIWIuaXNFbmFibGVkKCl8fCFPKHRoaXMsMSwhYSl8fChhfHwoTWModGhpcywhMSksUCh0aGlzLCExKSksdGhpcy5pc1Zpc2libGUoKSYmSWModGhpcyxhKSxUKHRoaXMsMSwhYSwhMCkpfTt2YXIgUD1mdW5jdGlvbihhLGIpe08oYSwyLGIpJiZUKGEsMixiKX07Ck4ucHJvdG90eXBlLmlzQWN0aXZlPWZ1bmN0aW9uKCl7cmV0dXJuISEodGhpcy5tJjQpfTsKdmFyIE1jPWZ1bmN0aW9uKGEsYil7TyhhLDQsYikmJlQoYSw0LGIpfSxOYz1mdW5jdGlvbihhLGIpe08oYSw4LGIpJiZUKGEsOCxiKX0sT2M9ZnVuY3Rpb24oYSxiKXtPKGEsNjQsYikmJlQoYSw2NCxiKX0sVD1mdW5jdGlvbihhLGIsYyxkKXtpZighZCYmYj09MSlhLlgoIWMpO2Vsc2UgaWYoYS5EJmImJmMhPSEhKGEubSZiKSl7dmFyIGU9YS52O2lmKGQ9YS5pKCkpe2lmKGU9RWMoZSxiKSl7dmFyIGY9YS5pP2EuaSgpOmE7ZiYmKGM/cGM6cmMpKGYsW2VdKX1KYyhkLGIsYyl9YS5tPWM/YS5tfGI6YS5tJn5ifX0sUGM9ZnVuY3Rpb24oYSxiLGMpe2lmKGEucyYmYS5tJmImJiFjKXRocm93IEVycm9yKCJDb21wb25lbnQgYWxyZWFkeSByZW5kZXJlZCIpOyFjJiZhLm0mYiYmVChhLGIsITEpO2EuRD1jP2EuRHxiOmEuRCZ+Yn0sVT1mdW5jdGlvbihhLGIpe3JldHVybiEhKDI1NSZiKSYmISEoYS5EJmIpfSxPPWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4hIShhLkQmYikmJiEhKGEubSZiKSE9CmMmJighKGEuUCZiKXx8RShhLE5iKGIsYykpKSYmIWEuYmF9O04ucHJvdG90eXBlLnVhPWZ1bmN0aW9uKGEpeyFRYyhhLHRoaXMuaSgpKSYmRSh0aGlzLCJlbnRlciIpJiZ0aGlzLmlzRW5hYmxlZCgpJiZVKHRoaXMsMikmJlAodGhpcywhMCl9O04ucHJvdG90eXBlLnRhPWZ1bmN0aW9uKGEpeyFRYyhhLHRoaXMuaSgpKSYmRSh0aGlzLCJsZWF2ZSIpJiYoVSh0aGlzLDQpJiZNYyh0aGlzLCExKSxVKHRoaXMsMikmJlAodGhpcywhMSkpfTtOLnByb3RvdHlwZS5jYT1CYzt2YXIgUWM9ZnVuY3Rpb24oYSxiKXtyZXR1cm4hIWEucmVsYXRlZFRhcmdldCYmYWIoYixhLnJlbGF0ZWRUYXJnZXQpfTsKTi5wcm90b3R5cGUuc2E9ZnVuY3Rpb24oYSl7aWYodGhpcy5pc0VuYWJsZWQoKSYmKFUodGhpcywyKSYmUCh0aGlzLCEwKSwhKGEuaC5idXR0b24hPTB8fHYmJmEuY3RybEtleSkpKXtVKHRoaXMsNCkmJk1jKHRoaXMsITApO3ZhciBiO2lmKGI9dGhpcy52KXt2YXIgYztiPXRoaXMuRCYzMiYmKGM9dGhpcy5pKCkpP2RiKGMpJiZlYihjKTohMX1iJiZ0aGlzLmkoKS5mb2N1cygpfWEuaC5idXR0b24hPTB8fHYmJmEuY3RybEtleXx8YS5qKCl9O04ucHJvdG90eXBlLnZhPWZ1bmN0aW9uKGEpe3RoaXMuaXNFbmFibGVkKCkmJihVKHRoaXMsMikmJlAodGhpcywhMCksdGhpcy5pc0FjdGl2ZSgpJiZSYyh0aGlzLGEpJiZVKHRoaXMsNCkmJk1jKHRoaXMsITEpKX07CnZhciBSYz1mdW5jdGlvbihhLGIpe2lmKFUoYSwxNikpe3ZhciBjPSEoYS5tJjE2KTtPKGEsMTYsYykmJlQoYSwxNixjKX1VKGEsOCkmJk5jKGEsITApO1UoYSw2NCkmJk9jKGEsIShhLm0mNjQpKTtjPW5ldyB5KCJhY3Rpb24iLGEpO2ImJihjLmFsdEtleT1iLmFsdEtleSxjLmN0cmxLZXk9Yi5jdHJsS2V5LGMubWV0YUtleT1iLm1ldGFLZXksYy5zaGlmdEtleT1iLnNoaWZ0S2V5LGMuRz1iLkcsYy50aW1lU3RhbXA9Yi50aW1lU3RhbXApO3JldHVybiBFKGEsYyl9O04ucHJvdG90eXBlLlhhPWZ1bmN0aW9uKCl7VSh0aGlzLDMyKSYmTyh0aGlzLDMyLCEwKSYmVCh0aGlzLDMyLCEwKX07Ti5wcm90b3R5cGUuUWE9ZnVuY3Rpb24oKXtVKHRoaXMsNCkmJk1jKHRoaXMsITEpO1UodGhpcywzMikmJk8odGhpcywzMiwhMSkmJlQodGhpcywzMiwhMSl9OwpOLnByb3RvdHlwZS5hYT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5pc1Zpc2libGUoKSYmdGhpcy5pc0VuYWJsZWQoKSYmYS5nPT0xMyYmUmModGhpcyxhKT8oYS5qKCksYS52KCksITApOiExfTtpZih0eXBlb2YgTiE9PSJmdW5jdGlvbiIpdGhyb3cgRXJyb3IoIkludmFsaWQgY29tcG9uZW50IGNsYXNzICIrTik7aWYodHlwZW9mIE0hPT0iZnVuY3Rpb24iKXRocm93IEVycm9yKCJJbnZhbGlkIHJlbmRlcmVyIGNsYXNzICIrTSk7dmFyIFNjPW5hKE4pO3VjW1NjXT1NO3RjKCJnb29nLWNvbnRyb2wiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBOKG51bGwpfSk7dmFyIFY9ZnVuY3Rpb24oYSxiLGMpe0YuY2FsbCh0aGlzLGMpO3RoaXMuZWE9Ynx8dmMuVigpO3RoaXMuTD1hfHwidmVydGljYWwifTtuKFYsRik7Zz1WLnByb3RvdHlwZTtnLkthPW51bGw7Zy5kYT1udWxsO2cuZWE9bnVsbDtnLkw9bnVsbDtnLlM9ITA7Zy5UPSEwO2cubz0tMTtnLkI9bnVsbDtnLlc9ITE7Zy5PPW51bGw7dmFyIFRjPWZ1bmN0aW9uKGEpe3JldHVybiBhLkthfHxhLmkoKX07Zz1WLnByb3RvdHlwZTtnLm1hPWZ1bmN0aW9uKCl7dGhpcy5nPXRoaXMuRy5oKCJESVYiLHRoaXMuZWEuaih0aGlzKS5qb2luKCIgIikpfTtnLm5hPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaSgpfTtnLndhPWZ1bmN0aW9uKGEpe3JldHVybiBhLnRhZ05hbWU9PSJESVYifTtnLkVhPWZ1bmN0aW9uKGEpe3RoaXMuZz15Yyh0aGlzLmVhLHRoaXMsYSk7YS5zdHlsZS5kaXNwbGF5PT0ibm9uZSImJih0aGlzLlM9ITEpfTsKZy5JPWZ1bmN0aW9uKCl7Vi5sLkkuY2FsbCh0aGlzKTtUYih0aGlzLGZ1bmN0aW9uKGIpe2IucyYmVWModGhpcyxiKX0sdGhpcyk7dmFyIGE9dGhpcy5pKCk7QWModGhpcy5lYSx0aGlzKTtWYyh0aGlzLHRoaXMuUyk7QihCKEIoQihCKEIoQihCKFFiKHRoaXMpLHRoaXMsImVudGVyIix0aGlzLmViKSx0aGlzLCJoaWdobGlnaHQiLHRoaXMuZmIpLHRoaXMsInVuaGlnaGxpZ2h0Iix0aGlzLmxiKSx0aGlzLCJvcGVuIix0aGlzLmdiKSx0aGlzLCJjbG9zZSIsdGhpcy5iYiksYSxLLmdhLHRoaXMuV2EpLGJiKGEpLFtLLmhhLEsuZmFdLHRoaXMuY2IpLGEsW0suZ2EsSy5oYSxLLmZhLCJtb3VzZW92ZXIiLCJtb3VzZW91dCIsImNvbnRleHRtZW51Il0sdGhpcy5hYik7V2ModGhpcyl9O3ZhciBXYz1mdW5jdGlvbihhKXt2YXIgYj1RYihhKSxjPVRjKGEpO0IoQihCKGIsYywiZm9jdXMiLGEuUGEpLGMsImJsdXIiLGEuVWEpLGEuZGF8fChhLmRhPW5ldyBKKFRjKGEpKSksImtleSIsYS5WYSl9OwpnPVYucHJvdG90eXBlO2cuVT1mdW5jdGlvbigpe1hjKHRoaXMsLTEpO3RoaXMuQiYmT2ModGhpcy5CLCExKTt0aGlzLlc9ITE7Vi5sLlUuY2FsbCh0aGlzKX07Zy5DPWZ1bmN0aW9uKCl7Vi5sLkMuY2FsbCh0aGlzKTt0aGlzLmRhJiYodGhpcy5kYS5kaXNwb3NlKCksdGhpcy5kYT1udWxsKTt0aGlzLmVhPXRoaXMuQj10aGlzLk89dGhpcy5LYT1udWxsfTtnLmViPWZ1bmN0aW9uKCl7cmV0dXJuITB9OwpnLmZiPWZ1bmN0aW9uKGEpe3ZhciBiPVZiKHRoaXMsYS50YXJnZXQpO2lmKGI+LTEmJmIhPXRoaXMubyl7dmFyIGM9SSh0aGlzLHRoaXMubyk7YyYmUChjLCExKTt0aGlzLm89YjtjPUkodGhpcyx0aGlzLm8pO3RoaXMuVyYmTWMoYywhMCk7dGhpcy5CJiZjIT10aGlzLkImJihjLkQmNjQ/T2MoYywhMCk6T2ModGhpcy5CLCExKSl9Yj10aGlzLmkoKTtwKGIsIlRoZSBET00gZWxlbWVudCBmb3IgdGhlIGNvbnRhaW5lciBjYW5ub3QgYmUgbnVsbC4iKTthLnRhcmdldC5pKCkhPW51bGwmJmFjKGIsImFjdGl2ZWRlc2NlbmRhbnQiLGEudGFyZ2V0LmkoKS5pZCl9O2cubGI9ZnVuY3Rpb24oYSl7YS50YXJnZXQ9PUkodGhpcyx0aGlzLm8pJiYodGhpcy5vPS0xKTthPXRoaXMuaSgpO3AoYSwiVGhlIERPTSBlbGVtZW50IGZvciB0aGUgY29udGFpbmVyIGNhbm5vdCBiZSBudWxsLiIpO2EucmVtb3ZlQXR0cmlidXRlKCRiKCJhY3RpdmVkZXNjZW5kYW50IikpfTsKZy5nYj1mdW5jdGlvbihhKXsoYT1hLnRhcmdldCkmJmEhPXRoaXMuQiYmYS5oPT10aGlzJiYodGhpcy5CJiZPYyh0aGlzLkIsITEpLHRoaXMuQj1hKX07Zy5iYj1mdW5jdGlvbihhKXthLnRhcmdldD09dGhpcy5CJiYodGhpcy5CPW51bGwpO3ZhciBiPXRoaXMuaSgpLGM9YS50YXJnZXQuaSgpO2ImJmEudGFyZ2V0Lm0mMiYmYyYmKGE9IiIsYyYmKGE9Yy5pZCxwKGEsIlRoZSBhY3RpdmUgZWxlbWVudCBzaG91bGQgaGF2ZSBhbiBpZC4iKSksYWMoYiwiYWN0aXZlZGVzY2VuZGFudCIsYSkpfTtnLldhPWZ1bmN0aW9uKGEpe3RoaXMuVCYmKHRoaXMuVz0hMCk7dmFyIGI9VGModGhpcyk7YiYmZGIoYikmJmViKGIpP2IuZm9jdXMoKTphLmooKX07Zy5jYj1mdW5jdGlvbigpe3RoaXMuVz0hMX07CmcuYWI9ZnVuY3Rpb24oYSl7YTp7dmFyIGI9YS50YXJnZXQ7aWYodGhpcy5PKWZvcih2YXIgYz10aGlzLmkoKTtiJiZiIT09Yzspe3ZhciBkPWIuaWQ7aWYoZCBpbiB0aGlzLk8pe2I9dGhpcy5PW2RdO2JyZWFrIGF9Yj1iLnBhcmVudE5vZGV9Yj1udWxsfWlmKGIpc3dpdGNoKGEudHlwZSl7Y2FzZSBLLmdhOmIuc2EoYSk7YnJlYWs7Y2FzZSBLLmhhOmNhc2UgSy5mYTpiLnZhKGEpO2JyZWFrO2Nhc2UgIm1vdXNlb3ZlciI6Yi51YShhKTticmVhaztjYXNlICJtb3VzZW91dCI6Yi50YShhKTticmVhaztjYXNlICJjb250ZXh0bWVudSI6Yi5jYShhKX19O2cuUGE9ZnVuY3Rpb24oKXt9O2cuVWE9ZnVuY3Rpb24oKXtYYyh0aGlzLC0xKTt0aGlzLlc9ITE7dGhpcy5CJiZPYyh0aGlzLkIsITEpfTsKZy5WYT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5pc0VuYWJsZWQoKSYmdGhpcy5pc1Zpc2libGUoKSYmKEgodGhpcykhPTB8fHRoaXMuS2EpJiZZYyh0aGlzLGEpPyhhLmooKSxhLnYoKSwhMCk6ITF9Owp2YXIgWWM9ZnVuY3Rpb24oYSxiKXt2YXIgYz1JKGEsYS5vKTtpZihjJiZ0eXBlb2YgYy5hYT09ImZ1bmN0aW9uIiYmYy5hYShiKXx8YS5CJiZhLkIhPWMmJnR5cGVvZiBhLkIuYWE9PSJmdW5jdGlvbiImJmEuQi5hYShiKSlyZXR1cm4hMDtpZihiLnNoaWZ0S2V5fHxiLmN0cmxLZXl8fGIubWV0YUtleXx8Yi5hbHRLZXkpcmV0dXJuITE7c3dpdGNoKGIuZyl7Y2FzZSAyNzpUYyhhKS5ibHVyKCk7YnJlYWs7Y2FzZSAzNjpaYyhhKTticmVhaztjYXNlIDM1OiRjKGEpO2JyZWFrO2Nhc2UgMzg6aWYoYS5MPT0idmVydGljYWwiKWFkKGEpO2Vsc2UgcmV0dXJuITE7YnJlYWs7Y2FzZSAzNzppZihhLkw9PSJob3Jpem9udGFsIilVYihhKT9iZChhKTphZChhKTtlbHNlIHJldHVybiExO2JyZWFrO2Nhc2UgNDA6aWYoYS5MPT0idmVydGljYWwiKWJkKGEpO2Vsc2UgcmV0dXJuITE7YnJlYWs7Y2FzZSAzOTppZihhLkw9PSJob3Jpem9udGFsIilVYihhKT9hZChhKTpiZChhKTtlbHNlIHJldHVybiExOwpicmVhaztkZWZhdWx0OnJldHVybiExfXJldHVybiEwfSxVYz1mdW5jdGlvbihhLGIpe3ZhciBjPWIuaSgpO2M9Yy5pZHx8KGMuaWQ9T2IoYikpO2EuT3x8KGEuTz17fSk7YS5PW2NdPWJ9O1YucHJvdG90eXBlLkJhPWZ1bmN0aW9uKGEsYil7dWEoYSxOLCJUaGUgY2hpbGQgb2YgYSBjb250YWluZXIgbXVzdCBiZSBhIGNvbnRyb2wiKTtWLmwuQmEuY2FsbCh0aGlzLGEsYil9O1YucHJvdG90eXBlLkNhPWZ1bmN0aW9uKGEsYixjKXt1YShhLE4pO2EuUHw9MjthLlB8PTY0O1BjKGEsMzIsITEpO2EucyYmMCE9YS5IYSYmTGMoYSwhMSk7YS5IYT0hMTt2YXIgZD1hLmg9PXRoaXM/VmIodGhpcyxhKTotMTtWLmwuQ2EuY2FsbCh0aGlzLGEsYixjKTthLnMmJnRoaXMucyYmVWModGhpcyxhKTthPWQ7YT09LTEmJihhPUgodGhpcykpO2E9PXRoaXMubz90aGlzLm89TWF0aC5taW4oSCh0aGlzKS0xLGIpOmE+dGhpcy5vJiZiPD10aGlzLm8/dGhpcy5vKys6YTx0aGlzLm8mJmI+dGhpcy5vJiZ0aGlzLm8tLX07CnZhciB6Yz1mdW5jdGlvbihhLGIpe2lmKGEuaSgpKXRocm93IEVycm9yKCJDb21wb25lbnQgYWxyZWFkeSByZW5kZXJlZCIpO2EuTD1ifTtWLnByb3RvdHlwZS5pc1Zpc2libGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5TfTt2YXIgVmM9ZnVuY3Rpb24oYSxiKXthLlM9Yjt2YXIgYz1hLmkoKTtjJiYoYy5zdHlsZS5kaXNwbGF5PWI/IiI6Im5vbmUiLHdjKFRjKGEpLGEuVCYmYS5TKSl9O1YucHJvdG90eXBlLmlzRW5hYmxlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLlR9O1YucHJvdG90eXBlLlg9ZnVuY3Rpb24oYSl7dGhpcy5UIT1hJiZFKHRoaXMsYT8iZW5hYmxlIjoiZGlzYWJsZSIpJiYoYT8odGhpcy5UPSEwLFRiKHRoaXMsZnVuY3Rpb24oYil7Yi5UYT9kZWxldGUgYi5UYTpiLlgoITApfSkpOihUYih0aGlzLGZ1bmN0aW9uKGIpe2IuaXNFbmFibGVkKCk/Yi5YKCExKTpiLlRhPSEwfSksdGhpcy5XPXRoaXMuVD0hMSksd2MoVGModGhpcyksYSYmdGhpcy5TKSl9Owp2YXIgWGM9ZnVuY3Rpb24oYSxiKXsoYj1JKGEsYikpP1AoYiwhMCk6YS5vPi0xJiZQKEkoYSxhLm8pLCExKX0sWmM9ZnVuY3Rpb24oYSl7Y2QoYSxmdW5jdGlvbihiLGMpe3JldHVybihiKzEpJWN9LEgoYSktMSl9LCRjPWZ1bmN0aW9uKGEpe2NkKGEsZnVuY3Rpb24oYixjKXtiLS07cmV0dXJuIGI8MD9jLTE6Yn0sMCl9LGJkPWZ1bmN0aW9uKGEpe2NkKGEsZnVuY3Rpb24oYixjKXtyZXR1cm4oYisxKSVjfSxhLm8pfSxhZD1mdW5jdGlvbihhKXtjZChhLGZ1bmN0aW9uKGIsYyl7Yi0tO3JldHVybiBiPDA/Yy0xOmJ9LGEubyl9LGNkPWZ1bmN0aW9uKGEsYixjKXtjPWM8MD9WYihhLGEuQik6Yzt2YXIgZD1IKGEpO2M9Yi5jYWxsKGEsYyxkKTtmb3IodmFyIGU9MDtlPD1kOyl7dmFyIGY9SShhLGMpO2lmKGYmJmYuaXNWaXNpYmxlKCkmJmYuaXNFbmFibGVkKCkmJmYuRCYyKXthLkxhKGMpO2JyZWFrfWUrKztjPWIuY2FsbChhLGMsZCl9fTsKVi5wcm90b3R5cGUuTGE9ZnVuY3Rpb24oYSl7WGModGhpcyxhKX07dmFyIGRkPWZ1bmN0aW9uKCl7fTtuKGRkLE0pO2lhKGRkKTtnPWRkLnByb3RvdHlwZTtnLk49ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy10YWIifTtnLk5hPWZ1bmN0aW9uKCl7cmV0dXJuInRhYiJ9O2cueGE9ZnVuY3Rpb24oYSl7dmFyIGI9ZGQubC54YS5jYWxsKHRoaXMsYSk7KGE9YS5HYSgpKSYmdGhpcy5NYShiLGEpO3JldHVybiBifTtnLnlhPWZ1bmN0aW9uKGEsYil7Yj1kZC5sLnlhLmNhbGwodGhpcyxhLGIpO3ZhciBjPXRoaXMuR2EoYik7YyYmKGEuUmE9Yyk7YS5tJjgmJihjPWEuaCkmJnR5cGVvZiBjLko9PT0iZnVuY3Rpb24iJiYoVChhLDgsITEpLGMuSihhKSk7cmV0dXJuIGJ9O2cuR2E9ZnVuY3Rpb24oYSl7cmV0dXJuIGEudGl0bGV8fCIifTtnLk1hPWZ1bmN0aW9uKGEsYil7YSYmKGEudGl0bGU9Ynx8IiIpfTt2YXIgZWQ9ZnVuY3Rpb24oYSxiLGMpe04uY2FsbCh0aGlzLGEsYnx8ZGQuVigpLGMpO1BjKHRoaXMsOCwhMCk7dGhpcy5QfD05fTtuKGVkLE4pO2VkLnByb3RvdHlwZS5HYT1mdW5jdGlvbigpe3JldHVybiB0aGlzLlJhfTtlZC5wcm90b3R5cGUuTWE9ZnVuY3Rpb24oYSl7dGhpcy52Lk1hKHRoaXMuaSgpLGEpO3RoaXMuUmE9YX07dGMoImdvb2ctdGFiIixmdW5jdGlvbigpe3JldHVybiBuZXcgZWQobnVsbCl9KTt2YXIgVz1mdW5jdGlvbigpe3RoaXMuQT0idGFibGlzdCJ9O24oVyx2Yyk7aWEoVyk7Vy5wcm90b3R5cGUuZz1mdW5jdGlvbigpe3JldHVybiJnb29nLXRhYi1iYXIifTtXLnByb3RvdHlwZS51PWZ1bmN0aW9uKGEsYixjKXt0aGlzLnZ8fCh0aGlzLmh8fGZkKHRoaXMpLHRoaXMudj1FYSh0aGlzLmgpKTt2YXIgZD10aGlzLnZbYl07ZD8oemMoYSxnZChkKSksYS52PWQpOlcubC51LmNhbGwodGhpcyxhLGIsYyl9O1cucHJvdG90eXBlLmo9ZnVuY3Rpb24oYSl7dmFyIGI9Vy5sLmouY2FsbCh0aGlzLGEpO3RoaXMuaHx8ZmQodGhpcyk7Yi5wdXNoKHRoaXMuaFthLnZdKTtyZXR1cm4gYn07dmFyIGZkPWZ1bmN0aW9uKGEpe3ZhciBiPWEuZygpO2EuaD17dG9wOmIrIi10b3AiLGJvdHRvbTpiKyItYm90dG9tIixzdGFydDpiKyItc3RhcnQiLGVuZDpiKyItZW5kIn19O3ZhciBYPWZ1bmN0aW9uKGEsYixjKXthPWF8fCJ0b3AiO3pjKHRoaXMsZ2QoYSkpO3RoaXMudj1hO1YuY2FsbCh0aGlzLHRoaXMuTCxifHxXLlYoKSxjKTtoZCh0aGlzKX07bihYLFYpO2c9WC5wcm90b3R5cGU7Zy5IPW51bGw7Zy5JPWZ1bmN0aW9uKCl7WC5sLkkuY2FsbCh0aGlzKTtoZCh0aGlzKX07Zy5DPWZ1bmN0aW9uKCl7WC5sLkMuY2FsbCh0aGlzKTt0aGlzLkg9bnVsbH07Zy5MYT1mdW5jdGlvbihhKXtYLmwuTGEuY2FsbCh0aGlzLGEpO3RoaXMuSihJKHRoaXMsYSkpfTtnLko9ZnVuY3Rpb24oYSl7YT9OYyhhLCEwKTp0aGlzLkgmJk5jKHRoaXMuSCwhMSl9Owp2YXIgaWQ9ZnVuY3Rpb24oYSxiKXtpZihiJiZiPT1hLkgpe2Zvcih2YXIgYz1WYihhLGIpLGQ9Yy0xO2I9SShhLGQpO2QtLSl7dmFyIGU9YjtpZihlLmlzVmlzaWJsZSgpJiZlLmlzRW5hYmxlZCgpKXthLkooYik7cmV0dXJufX1mb3IoYys9MTtiPUkoYSxjKTtjKyspaWYoZD1iLGQuaXNWaXNpYmxlKCkmJmQuaXNFbmFibGVkKCkpe2EuSihiKTtyZXR1cm59YS5KKG51bGwpfX07Zz1YLnByb3RvdHlwZTtnLmpiPWZ1bmN0aW9uKGEpe3RoaXMuSCYmdGhpcy5IIT1hLnRhcmdldCYmTmModGhpcy5ILCExKTt0aGlzLkg9YS50YXJnZXR9O2cua2I9ZnVuY3Rpb24oYSl7YS50YXJnZXQ9PXRoaXMuSCYmKHRoaXMuSD1udWxsKX07Zy5oYj1mdW5jdGlvbihhKXtpZCh0aGlzLGEudGFyZ2V0KX07Zy5pYj1mdW5jdGlvbihhKXtpZCh0aGlzLGEudGFyZ2V0KX07Zy5QYT1mdW5jdGlvbigpe0kodGhpcyx0aGlzLm8pfHxYYyh0aGlzLFZiKHRoaXMsdGhpcy5IfHxJKHRoaXMsMCkpKX07CnZhciBoZD1mdW5jdGlvbihhKXtCKEIoQihCKFFiKGEpLGEsInNlbGVjdCIsYS5qYiksYSwidW5zZWxlY3QiLGEua2IpLGEsImRpc2FibGUiLGEuaGIpLGEsImhpZGUiLGEuaWIpfSxnZD1mdW5jdGlvbihhKXtyZXR1cm4gYT09InN0YXJ0Inx8YT09ImVuZCI/InZlcnRpY2FsIjoiaG9yaXpvbnRhbCJ9O3RjKCJnb29nLXRhYi1iYXIiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBYfSk7ZnVuY3Rpb24gamQoYSl7dmFyIGI9e3RvcDoiYm90dG9tIixib3R0b206InRvcCIsc3RhcnQ6InJpZ2h0IixlbmQ6ImxlZnQifVthLmxvY2F0aW9uXSxjPWEuZWxlbWVudElkLGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTtkLnRleHRDb250ZW50PSJcbiAgICBmaWVsZHNldCB7XG4gICAgICBwYWRkaW5nOiAxMHB4O1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgIzM2OTtcbiAgICB9XG5cbiAgICAjIitjKyIgLmdvb2ctdGFiLWNvbnRlbnQge1xuICAgICAgbWluLWhlaWdodDogM2VtO1xuICAgICAgbWFyZ2luOiAwO1xuICAgICAgYm9yZGVyOiAiK2EuYm9yZGVyKyIgc29saWQgIithLmJvcmRlckNvbG9yKyI7XG4gICAgICBib3JkZXItdG9wOiAwO1xuICAgICAgaGVpZ2h0OiAiK2EuY29udGVudEhlaWdodCsiO1xuICAgICAgcGFkZGluZzogNHB4IDhweDtcbiAgICAgIG1hcmdpbi1yaWdodDogNHB4O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgIG92ZXJmbG93OiBhdXRvO1xuICAgIH1cblxuICAgICMiKwpjKyIgLmdvb2ctdGFiLWJhci0iK2EubG9jYXRpb24rIiAuZ29vZy10YWItc2VsZWN0ZWQge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICIrYS5ib3JkZXJDb2xvcisiO1xuICAgICAgYm9yZGVyLSIrYisiOiAwcHg7XG4gICAgfVxuXG4gICAgIyIrYysiIC5nb29nLXRhYi1iYXItIithLmxvY2F0aW9uKyIge1xuICAgICAgcGFkZGluZy0iK2EubG9jYXRpb24rIjogNXB4ICFpbXBvcnRhbnQ7XG4gICAgICBib3JkZXItIitiKyI6IDFweCBzb2xpZCAiK2EuYm9yZGVyQ29sb3IrIiAhaW1wb3J0YW50O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICB9XG5cbiAgICAjIitjKyIgLmdvb2ctdGFiLWJhciB7XG4gICAgICAgbWFyZ2luOiAwO1xuICAgICAgIGJvcmRlcjogMDtcbiAgICAgICBwYWRkaW5nOiAwO1xuICAgICAgIGxpc3Qtc3R5bGU6IG5vbmU7XG4gICAgICAgY3Vyc29yOiBkZWZhdWx0O1xuICAgICAgIG91dGxpbmU6IG5vbmU7XG4gICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgICBtYXJnaW4tcmlnaHQ6IDRweDtcbiAgICAgIH1cblxuICAgICAjIisKYysiIC5nb29nLXRhYiB7XG4gICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgIHBhZGRpbmc6IDRweCA4cHg7XG4gICAgICAgY29sb3I6IHZhcigtLWNvbGFiLXByaW1hcnktdGV4dC1jb2xvcik7XG4gICAgICAgdGV4dC1kZWNvcmF0aW9uOiBpbml0aWFsO1xuICAgICAgIGN1cnNvcjogZGVmYXVsdDtcbiAgICAgIH1cblxuICAgICAgIyIrYysiIC5nb29nLXRhYi1ob3ZlciB7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWNvbGFiLWhpZ2hsaWdodGVkLXN1cmZhY2UtY29sb3IpO1xuICAgICAgfVxuICAgICAgIjtyZXR1cm4gZH0KdmFyIGtkPWZ1bmN0aW9uKGEpe3ZhciBiPWEuZWxlbWVudElkLGM9YS50YWJOYW1lcyxkPWEuc2VsZWN0ZWRJbmRleDsiY29udGVudEJvcmRlciJpbiBhfHwoYS5jb250ZW50Qm9yZGVyPSIwcHgiKTsiY29udGVudEhlaWdodCJpbiBhfHwoYS5jb250ZW50SGVpZ2h0PSJpbml0aWFsIik7ImJvcmRlckNvbG9yImluIGF8fChhLmJvcmRlckNvbG9yPSJ2YXIoLS1jb2xhYi1ib3JkZXItY29sb3IpIik7YS5sb2NhdGlvbnx8KGEubG9jYXRpb249InRvcCIpO3ZhciBlPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiMiK2IpLGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zi5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYi1iYXIiKTt2YXIgaD1hLmxvY2F0aW9uO2YuY2xhc3NMaXN0LmFkZCgiZ29vZy10YWItYmFyLSIraCk7Zm9yKHZhciBrPVtdLHE9ZmEoYyksRz1xLm5leHQoKTshRy5kb25lO0c9cS5uZXh0KCkpe0c9Ry52YWx1ZTt2YXIgeD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKeC5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYiIpO3gudGV4dENvbnRlbnQ9RztmLmFwcGVuZENoaWxkKHgpO2sucHVzaCh4KX1oIT0iYm90dG9tIiYmZS5hcHBlbmRDaGlsZChmKTtxPW51bGw7aWYoaD09InRvcCJ8fGg9PSJib3R0b20iKXE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikscS5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYi1iYXItY2xlYXIiKTtoPT0idG9wIiYmcSYmZS5hcHBlbmRDaGlsZChxKTtHPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO0cuY2xhc3NMaXN0LmFkZCgiZ29vZy10YWItY29udGVudCIpO3ZhciBoYT1bXTtjPWZhKGMpO2Zvcih4PWMubmV4dCgpOyF4LmRvbmU7eD1jLm5leHQoKSl4PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHguaWQ9ZS5pZCsiX2NvbnRlbnRfIitoYS5sZW5ndGgseC5zdHlsZS5kaXNwbGF5PSJub25lIixHLmFwcGVuZENoaWxkKHgpLGhhLnB1c2goeCk7ZS5hcHBlbmRDaGlsZChHKTtoPT0iYm90dG9tIiYmKHEmJgplLmFwcGVuZENoaWxkKHEpLGUuYXBwZW5kQ2hpbGQoZikpO3ZhciBRPW5ldyBYKGgpO1NiKFEsZik7dmFyIFI9LTE7d2IoUSwic2VsZWN0IixmdW5jdGlvbihTKXtTPWsuaW5kZXhPZihTLnRhcmdldC5pKCkpO1MhPVImJihSPj0wJiZSPGhhLmxlbmd0aCYmKGhhW1JdLnN0eWxlLmRpc3BsYXk9Im5vbmUiLFI9LTEpLFM+PTAmJlM8aGEubGVuZ3RoJiYoUj1TLGhhW1JdLnN0eWxlLmRpc3BsYXk9ImlubGluZSIsd2luZG93LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCJyZXNpemUiKSksZ29vZ2xlLmNvbGFiLm91dHB1dC5yZXNpemVJZnJhbWVUb0NvbnRlbnQoKSksUS5KKEkoUSxSKSkpfSk7US5KKEkoUSxkKSk7d2luZG93W2JdPXtzZXRTZWxlY3RlZFRhYkluZGV4OmZ1bmN0aW9uKFMpe1EuSihJKFEsUykpfX07ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChqZChhKSl9LGxkPVsiY29sYWJfbGliIiwiY3JlYXRlVGFiQmFyIl0sWT1sOwpsZFswXWluIFl8fHR5cGVvZiBZLmV4ZWNTY3JpcHQ9PSJ1bmRlZmluZWQifHxZLmV4ZWNTY3JpcHQoInZhciAiK2xkWzBdKTtmb3IodmFyIFo7bGQubGVuZ3RoJiYoWj1sZC5zaGlmdCgpKTspbGQubGVuZ3RofHxrZD09PXZvaWQgMD9ZW1pdJiZZW1pdIT09T2JqZWN0LnByb3RvdHlwZVtaXT9ZPVlbWl06WT1ZW1pdPXt9OllbWl09a2Q7fSkuY2FsbCh0aGlzKTsKLy8gY2xhbmctZm9ybWF0IG9uCg==", + "ok": true, + "headers": [ + [ + "content-length", + "41785" + ], + [ + "content-type", + "application/javascript" + ] + ], + "status": 200, + "status_text": "" + } + }, + "base_uri": "https://localhost:8080/", + "height": 229 + }, + "outputId": "c796ffe8-9f9e-4f3a-c64e-352b5437387f" + }, + "source": [ + "%%logica Test\n", + "\n", + "Test(a: 1, b: 2, c: \"universe\");\n", + "Test(a: 1 + 2, b: 2 * (2 + 1), c: \"hello\" ++ \" \" ++ \"world\");\n" + ], + "execution_count": 6, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e3a8e6d8-d22c-11ef-a7c0-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id5\", \"tabNames\": [\"Test\", \"(Log)\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_944148e0f2" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e3a95db6-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id5\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_7a0c9d6374" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e3ab3258-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_119e5a4c75" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e3ab92ca-d22c-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id5_content_1\");\n", + "//# sourceURL=js_7b507c79eb" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e3ace648-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"e3ab92ca-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_d9e9e2c2bc" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e3ad3c60-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id5\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_1f6ac2e71a" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e3b054ae-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"e3ab3258-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_02a07755ff" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e3b22f86-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_24e0bb6b10" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e3b279dc-d22c-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id5_content_0\");\n", + "//# sourceURL=js_cc1310cc40" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e3b2d530-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"e3b279dc-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_cf1ec02324" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e3b368e2-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id5\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_0f6a76462b" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e3b5103e-d22c-11ef-a7c0-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id6\", \"tabNames\": [\"SQL\", \"Result\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_d0814a1f80" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e3b552ba-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id6\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_8a9ac4f077" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e3b67f96-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_d339aaf75d" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e3b6c3f2-d22c-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id6_content_0\");\n", + "//# sourceURL=js_df70c601ac" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e3b70218-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"e3b6c3f2-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_f20dc814b1" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e3b74656-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id6\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_c67a132751" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The following query is stored at \u001b[1mTest_sql\u001b[0m variable.\n", + "-- Initializing DuckDB environment.\n", + "create schema if not exists logica_home;\n", + "-- Empty record, has to have a field by DuckDB syntax.\n", + "drop type if exists logicarecord893574736 cascade; create type logicarecord893574736 as struct(nirvana numeric);\n", + "create sequence if not exists eternal_logical_sequence;\n", + "\n", + "\n", + "-- Logica type: logicarecord481217614\n", + "drop type if exists logicarecord481217614 cascade; create type logicarecord481217614 as struct(r logicarecord893574736);\n", + "\n", + "-- Logica type: logicarecord383307722\n", + "drop type if exists logicarecord383307722 cascade; create type logicarecord383307722 as struct(a timestamp);\n", + "SELECT * FROM (\n", + " \n", + " SELECT\n", + " 1 AS a,\n", + " 2 AS b,\n", + " 'universe' AS c\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " ((1) + (2)) AS a,\n", + " ((2) * (((2) + (1)))) AS b,\n", + " (((('hello') || (' '))) || ('world')) AS c\n", + " \n", + ") AS UNUSED_TABLE_NAME ;\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e3b83660-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"e3b67f96-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_63d962e2a4" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e3b9ac34-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_3209c62d98" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e3b9f4d2-d22c-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id6_content_1\");\n", + "//# sourceURL=js_bd5cb9a0bc" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e3ba3a50-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"e3b9f4d2-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_8b1664b6ce" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e3ba7eac-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id6\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_96888fa93e" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The following table is stored at \u001b[1mTest\u001b[0m variable.\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
abc
012universe
136hello world
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e3bba9c6-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"e3b9ac34-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_14652f5efb" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e3bd4d9e-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"e3b22f86-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_e71fa2cdb7" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e3bf38a2-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_f676c5589c" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e3bf89f6-d22c-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id5_content_1\");\n", + "//# sourceURL=js_78f6fbfc45" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e3bfd5be-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"e3bf89f6-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_494994ceaf" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e3c078d4-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id5\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_1084c7c844" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "image/svg+xml": "\n\n\n\n\n\nConcertina\n\n\n\nTest\n\nTest\n\n\n\n", + "text/plain": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Running predicate: Test (9 ms)\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e3df1c6c-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"e3bf38a2-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_9d27dd2901" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e3e1e6d6-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_96416faac2" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e3e239b0-d22c-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id5_content_0\");\n", + "//# sourceURL=js_6f6837f5e8" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e3e2dee2-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"e3e239b0-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_3e377aef28" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e3e32e2e-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id5\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_4e284f10a2" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e3e50320-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_155bf6f64f" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e3e55078-d22c-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id6_content_1\");\n", + "//# sourceURL=js_93bfbe4c24" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e3e5a960-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"e3e55078-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_cf77c58aba" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e3e5ee5c-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id6\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_c3cbc82738" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e3e895f8-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"e3e50320-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_94b2b792f9" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + " \n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e3ea98e4-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"e3e1e6d6-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_8840ec7be8" + ] + }, + "metadata": {} + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "c8RlzYjqm7i0" + }, + "source": [ + "### Structures\n", + "\n", + "You can define structures via syntax that is similar to json and textproto." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "VXX6gSt-m72D", + "colab": { + "resources": { + "http://localhost:8080/nbextensions/google.colab/tabbar.css": { + "data": "Lmdvb2ctdGFie3Bvc2l0aW9uOnJlbGF0aXZlO3BhZGRpbmc6NHB4IDhweDtjb2xvcjojMDBjO3RleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7Y3Vyc29yOmRlZmF1bHR9Lmdvb2ctdGFiLWJhci10b3AgLmdvb2ctdGFie21hcmdpbjoxcHggNHB4IDAgMDtib3JkZXItYm90dG9tOjA7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLXRvcDphZnRlciwuZ29vZy10YWItYmFyLWJvdHRvbTphZnRlcntjb250ZW50OiIgIjtkaXNwbGF5OmJsb2NrO2hlaWdodDowO2NsZWFyOmJvdGg7dmlzaWJpbGl0eTpoaWRkZW59Lmdvb2ctdGFiLWJhci1ib3R0b20gLmdvb2ctdGFie21hcmdpbjowIDRweCAxcHggMDtib3JkZXItdG9wOjA7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLXN0YXJ0IC5nb29nLXRhYnttYXJnaW46MCAwIDRweCAxcHg7Ym9yZGVyLXJpZ2h0OjB9Lmdvb2ctdGFiLWJhci1lbmQgLmdvb2ctdGFie21hcmdpbjowIDFweCA0cHggMDtib3JkZXItbGVmdDowfS5nb29nLXRhYi1ob3ZlcntiYWNrZ3JvdW5kOiNlZWV9Lmdvb2ctdGFiLWRpc2FibGVke2NvbG9yOiM2NjZ9Lmdvb2ctdGFiLXNlbGVjdGVke2NvbG9yOiMwMDA7YmFja2dyb3VuZDojZmZmO3RleHQtZGVjb3JhdGlvbjpub25lO2ZvbnQtd2VpZ2h0OmJvbGQ7Ym9yZGVyOjFweCBzb2xpZCAjNmI5MGRhfS5nb29nLXRhYi1iYXItdG9we3BhZGRpbmctdG9wOjVweCFpbXBvcnRhbnQ7cGFkZGluZy1sZWZ0OjVweCFpbXBvcnRhbnQ7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgIzZiOTBkYSFpbXBvcnRhbnR9Lmdvb2ctdGFiLWJhci10b3AgLmdvb2ctdGFiLXNlbGVjdGVke3RvcDoxcHg7bWFyZ2luLXRvcDowO3BhZGRpbmctYm90dG9tOjVweH0uZ29vZy10YWItYmFyLWJvdHRvbSAuZ29vZy10YWItc2VsZWN0ZWR7dG9wOi0xcHg7bWFyZ2luLWJvdHRvbTowO3BhZGRpbmctdG9wOjVweH0uZ29vZy10YWItYmFyLXN0YXJ0IC5nb29nLXRhYi1zZWxlY3RlZHtsZWZ0OjFweDttYXJnaW4tbGVmdDowO3BhZGRpbmctcmlnaHQ6OXB4fS5nb29nLXRhYi1iYXItZW5kIC5nb29nLXRhYi1zZWxlY3RlZHtsZWZ0Oi0xcHg7bWFyZ2luLXJpZ2h0OjA7cGFkZGluZy1sZWZ0OjlweH0uZ29vZy10YWItYmFye21hcmdpbjowO2JvcmRlcjowO3BhZGRpbmc6MDtsaXN0LXN0eWxlOm5vbmU7Y3Vyc29yOmRlZmF1bHQ7b3V0bGluZTpub25lO2JhY2tncm91bmQ6I2ViZWZmOX0uZ29vZy10YWItYmFyLWNsZWFye2NsZWFyOmJvdGg7aGVpZ2h0OjA7b3ZlcmZsb3c6aGlkZGVufS5nb29nLXRhYi1iYXItc3RhcnR7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLWVuZHtmbG9hdDpyaWdodH0qIGh0bWwgLmdvb2ctdGFiLWJhci1zdGFydHttYXJnaW4tcmlnaHQ6LTNweH0qIGh0bWwgLmdvb2ctdGFiLWJhci1lbmR7bWFyZ2luLWxlZnQ6LTNweH1zZW50aW5lbHt9", + "ok": true, + "headers": [ + [ + "content-length", + "1404" + ], + [ + "content-type", + "text/css" + ] + ], + "status": 200, + "status_text": "" + }, + "http://localhost:8080/nbextensions/google.colab/tabbar_main.min.js": { + "data": "Ly8gY2xhbmctZm9ybWF0IG9mZgooZnVuY3Rpb24oKXt2YXIgZyxhYT1mdW5jdGlvbihhKXt2YXIgYj0wO3JldHVybiBmdW5jdGlvbigpe3JldHVybiBiPGEubGVuZ3RoP3tkb25lOiExLHZhbHVlOmFbYisrXX06e2RvbmU6ITB9fX0sYmE9dHlwZW9mIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzPT0iZnVuY3Rpb24iP09iamVjdC5kZWZpbmVQcm9wZXJ0eTpmdW5jdGlvbihhLGIsYyl7aWYoYT09QXJyYXkucHJvdG90eXBlfHxhPT1PYmplY3QucHJvdG90eXBlKXJldHVybiBhO2FbYl09Yy52YWx1ZTtyZXR1cm4gYX0sY2E9ZnVuY3Rpb24oYSl7YT1bIm9iamVjdCI9PXR5cGVvZiBnbG9iYWxUaGlzJiZnbG9iYWxUaGlzLGEsIm9iamVjdCI9PXR5cGVvZiB3aW5kb3cmJndpbmRvdywib2JqZWN0Ij09dHlwZW9mIHNlbGYmJnNlbGYsIm9iamVjdCI9PXR5cGVvZiBnbG9iYWwmJmdsb2JhbF07Zm9yKHZhciBiPTA7YjxhLmxlbmd0aDsrK2Ipe3ZhciBjPWFbYl07aWYoYyYmYy5NYXRoPT1NYXRoKXJldHVybiBjfXRocm93IEVycm9yKCJDYW5ub3QgZmluZCBnbG9iYWwgb2JqZWN0Iik7Cn0sZGE9Y2EodGhpcyksZWE9ZnVuY3Rpb24oYSxiKXtpZihiKWE6e3ZhciBjPWRhO2E9YS5zcGxpdCgiLiIpO2Zvcih2YXIgZD0wO2Q8YS5sZW5ndGgtMTtkKyspe3ZhciBlPWFbZF07aWYoIShlIGluIGMpKWJyZWFrIGE7Yz1jW2VdfWE9YVthLmxlbmd0aC0xXTtkPWNbYV07Yj1iKGQpO2IhPWQmJmIhPW51bGwmJmJhKGMsYSx7Y29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOmJ9KX19OwplYSgiU3ltYm9sIixmdW5jdGlvbihhKXtpZihhKXJldHVybiBhO3ZhciBiPWZ1bmN0aW9uKGYsaCl7dGhpcy5nPWY7YmEodGhpcywiZGVzY3JpcHRpb24iLHtjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6aH0pfTtiLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmd9O3ZhciBjPSJqc2NvbXBfc3ltYm9sXyIrKE1hdGgucmFuZG9tKCkqMUU5Pj4+MCkrIl8iLGQ9MCxlPWZ1bmN0aW9uKGYpe2lmKHRoaXMgaW5zdGFuY2VvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoIlN5bWJvbCBpcyBub3QgYSBjb25zdHJ1Y3RvciIpO3JldHVybiBuZXcgYihjKyhmfHwiIikrIl8iK2QrKyxmKX07cmV0dXJuIGV9KTsKdmFyIGZhPWZ1bmN0aW9uKGEpe3ZhciBiPXR5cGVvZiBTeW1ib2whPSJ1bmRlZmluZWQiJiZTeW1ib2wuaXRlcmF0b3ImJmFbU3ltYm9sLml0ZXJhdG9yXTtpZihiKXJldHVybiBiLmNhbGwoYSk7aWYodHlwZW9mIGEubGVuZ3RoPT0ibnVtYmVyIilyZXR1cm57bmV4dDphYShhKX07dGhyb3cgRXJyb3IoU3RyaW5nKGEpKyIgaXMgbm90IGFuIGl0ZXJhYmxlIG9yIEFycmF5TGlrZSIpO307ZWEoIlN5bWJvbC5kaXNwb3NlIixmdW5jdGlvbihhKXtyZXR1cm4gYT9hOlN5bWJvbCgiU3ltYm9sLmRpc3Bvc2UiKX0pOy8qCgogQ29weXJpZ2h0IFRoZSBDbG9zdXJlIExpYnJhcnkgQXV0aG9ycy4KIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wCiovCnZhciBsPXRoaXN8fHNlbGYsaWE9ZnVuY3Rpb24oYSl7YS5JYT12b2lkIDA7YS5WPWZ1bmN0aW9uKCl7cmV0dXJuIGEuSWE/YS5JYTphLklhPW5ldyBhfX0samE9ZnVuY3Rpb24oYSl7dmFyIGI9dHlwZW9mIGE7cmV0dXJuIGIhPSJvYmplY3QiP2I6YT9BcnJheS5pc0FycmF5KGEpPyJhcnJheSI6YjoibnVsbCJ9LGthPWZ1bmN0aW9uKGEpe3ZhciBiPWphKGEpO3JldHVybiBiPT0iYXJyYXkifHxiPT0ib2JqZWN0IiYmdHlwZW9mIGEubGVuZ3RoPT0ibnVtYmVyIn0sbT1mdW5jdGlvbihhKXt2YXIgYj10eXBlb2YgYTtyZXR1cm4gYj09Im9iamVjdCImJmEhPW51bGx8fGI9PSJmdW5jdGlvbiJ9LG5hPWZ1bmN0aW9uKGEpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYSxsYSkmJmFbbGFdfHwoYVtsYV09KyttYSl9LGxhPSJjbG9zdXJlX3VpZF8iKyhNYXRoLnJhbmRvbSgpKjFFOT4+PjApLG1hPTAsbj1mdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoKXt9Yy5wcm90b3R5cGU9CmIucHJvdG90eXBlO2EubD1iLnByb3RvdHlwZTthLnByb3RvdHlwZT1uZXcgYzthLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1hO2EucWQ9ZnVuY3Rpb24oZCxlLGYpe2Zvcih2YXIgaD1BcnJheShhcmd1bWVudHMubGVuZ3RoLTIpLGs9MjtrPGFyZ3VtZW50cy5sZW5ndGg7aysrKWhbay0yXT1hcmd1bWVudHNba107cmV0dXJuIGIucHJvdG90eXBlW2VdLmFwcGx5KGQsaCl9fTtmdW5jdGlvbiBvYShhLGIpe2lmKEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKUVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsb2EpO2Vsc2V7dmFyIGM9RXJyb3IoKS5zdGFjaztjJiYodGhpcy5zdGFjaz1jKX1hJiYodGhpcy5tZXNzYWdlPVN0cmluZyhhKSk7YiE9PXZvaWQgMCYmKHRoaXMuY2F1c2U9Yil9bihvYSxFcnJvcik7b2EucHJvdG90eXBlLm5hbWU9IkN1c3RvbUVycm9yIjt2YXIgcGE7ZnVuY3Rpb24gcWEoYSxiKXthPWEuc3BsaXQoIiVzIik7Zm9yKHZhciBjPSIiLGQ9YS5sZW5ndGgtMSxlPTA7ZTxkO2UrKyljKz1hW2VdKyhlPGIubGVuZ3RoP2JbZV06IiVzIik7b2EuY2FsbCh0aGlzLGMrYVtkXSl9bihxYSxvYSk7cWEucHJvdG90eXBlLm5hbWU9IkFzc2VydGlvbkVycm9yIjtmdW5jdGlvbiByYShhLGIsYyxkKXt2YXIgZT0iQXNzZXJ0aW9uIGZhaWxlZCI7aWYoYyl7ZSs9IjogIitjO3ZhciBmPWR9ZWxzZSBhJiYoZSs9IjogIithLGY9Yik7dGhyb3cgbmV3IHFhKCIiK2UsZnx8W10pO30KdmFyIHA9ZnVuY3Rpb24oYSxiLGMpe2F8fHJhKCIiLG51bGwsYixBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMikpO3JldHVybiBhfSxzYT1mdW5jdGlvbihhLGIsYyl7bShhKSYmYS5ub2RlVHlwZT09MXx8cmEoIkV4cGVjdGVkIEVsZW1lbnQgYnV0IGdvdCAlczogJXMuIixbamEoYSksYV0sYixBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMikpfSx1YT1mdW5jdGlvbihhLGIsYyxkKXthIGluc3RhbmNlb2YgYnx8cmEoIkV4cGVjdGVkIGluc3RhbmNlb2YgJXMgYnV0IGdvdCAlcy4iLFt0YShiKSx0YShhKV0sYyxBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMykpfTsKZnVuY3Rpb24gdGEoYSl7cmV0dXJuIGEgaW5zdGFuY2VvZiBGdW5jdGlvbj9hLmRpc3BsYXlOYW1lfHxhLm5hbWV8fCJ1bmtub3duIHR5cGUgbmFtZSI6YSBpbnN0YW5jZW9mIE9iamVjdD9hLmNvbnN0cnVjdG9yLmRpc3BsYXlOYW1lfHxhLmNvbnN0cnVjdG9yLm5hbWV8fE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhKTphPT09bnVsbD8ibnVsbCI6dHlwZW9mIGF9O3ZhciB2YT1BcnJheS5wcm90b3R5cGUuaW5kZXhPZj9mdW5jdGlvbihhLGIpe3AoYS5sZW5ndGghPW51bGwpO3JldHVybiBBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKGEsYix2b2lkIDApfTpmdW5jdGlvbihhLGIpe2lmKHR5cGVvZiBhPT09InN0cmluZyIpcmV0dXJuIHR5cGVvZiBiIT09InN0cmluZyJ8fGIubGVuZ3RoIT0xPy0xOmEuaW5kZXhPZihiLDApO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWlmKGMgaW4gYSYmYVtjXT09PWIpcmV0dXJuIGM7cmV0dXJuLTF9LHdhPUFycmF5LnByb3RvdHlwZS5mb3JFYWNoP2Z1bmN0aW9uKGEsYil7cChhLmxlbmd0aCE9bnVsbCk7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChhLGIsdm9pZCAwKX06ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9YS5sZW5ndGgsZD10eXBlb2YgYT09PSJzdHJpbmciP2Euc3BsaXQoIiIpOmEsZT0wO2U8YztlKyspZSBpbiBkJiZiLmNhbGwodm9pZCAwLGRbZV0sZSxhKX07CmZ1bmN0aW9uIHhhKGEsYil7Yj12YShhLGIpO3ZhciBjO2lmKGM9Yj49MClwKGEubGVuZ3RoIT1udWxsKSxBcnJheS5wcm90b3R5cGUuc3BsaWNlLmNhbGwoYSxiLDEpO3JldHVybiBjfWZ1bmN0aW9uIHlhKGEpe3ZhciBiPWEubGVuZ3RoO2lmKGI+MCl7Zm9yKHZhciBjPUFycmF5KGIpLGQ9MDtkPGI7ZCsrKWNbZF09YVtkXTtyZXR1cm4gY31yZXR1cm5bXX1mdW5jdGlvbiB6YShhLGIsYyxkKXtwKGEubGVuZ3RoIT1udWxsKTtBcnJheS5wcm90b3R5cGUuc3BsaWNlLmFwcGx5KGEsQWEoYXJndW1lbnRzLDEpKX1mdW5jdGlvbiBBYShhLGIsYyl7cChhLmxlbmd0aCE9bnVsbCk7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg8PTI/QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYSxiKTpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhLGIsYyl9O2Z1bmN0aW9uIEJhKGEsYixjKXtmb3IodmFyIGQgaW4gYSliLmNhbGwoYyxhW2RdLGQsYSl9ZnVuY3Rpb24gQ2EoYSxiKXtmb3IodmFyIGMgaW4gYSlpZihhW2NdPT1iKXJldHVybiEwO3JldHVybiExfWZ1bmN0aW9uIERhKGEsYixjKXtpZihhIT09bnVsbCYmYiBpbiBhKXRocm93IEVycm9yKCdUaGUgb2JqZWN0IGFscmVhZHkgY29udGFpbnMgdGhlIGtleSAiJytiKyciJyk7YVtiXT1jfWZ1bmN0aW9uIEVhKGEpe3ZhciBiPXt9LGM7Zm9yKGMgaW4gYSliW2FbY11dPWM7cmV0dXJuIGJ9dmFyIEZhPSJjb25zdHJ1Y3RvciBoYXNPd25Qcm9wZXJ0eSBpc1Byb3RvdHlwZU9mIHByb3BlcnR5SXNFbnVtZXJhYmxlIHRvTG9jYWxlU3RyaW5nIHRvU3RyaW5nIHZhbHVlT2YiLnNwbGl0KCIgIik7CmZ1bmN0aW9uIEdhKGEsYil7Zm9yKHZhciBjLGQsZT0xO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspe2Q9YXJndW1lbnRzW2VdO2ZvcihjIGluIGQpYVtjXT1kW2NdO2Zvcih2YXIgZj0wO2Y8RmEubGVuZ3RoO2YrKyljPUZhW2ZdLE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChkLGMpJiYoYVtjXT1kW2NdKX19O3ZhciBIYT1TdHJpbmcucHJvdG90eXBlLnRyaW0/ZnVuY3Rpb24oYSl7cmV0dXJuIGEudHJpbSgpfTpmdW5jdGlvbihhKXtyZXR1cm4vXltcc1x4YTBdKihbXHNcU10qPylbXHNceGEwXSokLy5leGVjKGEpWzFdfTsvKgoKIENvcHlyaWdodCBHb29nbGUgTExDCiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMAoqLwp2YXIgSWE9e307dmFyIEphPWZ1bmN0aW9uKGEpe2lmKElhIT09SWEpdGhyb3cgRXJyb3IoIkJhZCBzZWNyZXQiKTt0aGlzLmc9YX07SmEucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ307bmV3IEphKCJhYm91dDpibGFuayIpO25ldyBKYSgiYWJvdXQ6aW52YWxpZCN6Q2xvc3VyZXoiKTt2YXIgS2E9W10sTGE9ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJBIFVSTCB3aXRoIGNvbnRlbnQgJyIrYSsiJyB3YXMgc2FuaXRpemVkIGF3YXkuIil9O0thLmluZGV4T2YoTGEpPT09LTEmJkthLnB1c2goTGEpO3ZhciBNYSxOYTthOntmb3IodmFyIE9hPVsiQ0xPU1VSRV9GTEFHUyJdLFBhPWwsUWE9MDtRYTxPYS5sZW5ndGg7UWErKylpZihQYT1QYVtPYVtRYV1dLFBhPT1udWxsKXtOYT1udWxsO2JyZWFrIGF9TmE9UGF9dmFyIFJhPU5hJiZOYVs2MTA0MDEzMDFdO01hPVJhIT1udWxsP1JhOiExO2Z1bmN0aW9uIFNhKCl7dmFyIGE9bC5uYXZpZ2F0b3I7cmV0dXJuIGEmJihhPWEudXNlckFnZW50KT9hOiIifXZhciBUYSxVYT1sLm5hdmlnYXRvcjtUYT1VYT9VYS51c2VyQWdlbnREYXRhfHxudWxsOm51bGw7ZnVuY3Rpb24gcihhKXtyZXR1cm4gU2EoKS5pbmRleE9mKGEpIT0tMX07dmFyIFZhPXIoIkVkZ2UiKSx0PXIoIkdlY2tvIikmJiEoU2EoKS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoIndlYmtpdCIpIT0tMSYmIXIoIkVkZ2UiKSkmJiEocigiVHJpZGVudCIpfHxyKCJNU0lFIikpJiYhcigiRWRnZSIpLHU9U2EoKS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoIndlYmtpdCIpIT0tMSYmIXIoIkVkZ2UiKSx2PU1hJiZUYSYmVGEucGxhdGZvcm0/VGEucGxhdGZvcm09PT0ibWFjT1MiOnIoIk1hY2ludG9zaCIpO3ZhciBYYT1mdW5jdGlvbihhLGIpe0JhKGIsZnVuY3Rpb24oYyxkKXtkPT0ic3R5bGUiP2Euc3R5bGUuY3NzVGV4dD1jOmQ9PSJjbGFzcyI/YS5jbGFzc05hbWU9YzpkPT0iZm9yIj9hLmh0bWxGb3I9YzpXYS5oYXNPd25Qcm9wZXJ0eShkKT9hLnNldEF0dHJpYnV0ZShXYVtkXSxjKTpkLmxhc3RJbmRleE9mKCJhcmlhLSIsMCk9PTB8fGQubGFzdEluZGV4T2YoImRhdGEtIiwwKT09MD9hLnNldEF0dHJpYnV0ZShkLGMpOmFbZF09Y30pfSxXYT17Y2VsbHBhZGRpbmc6ImNlbGxQYWRkaW5nIixjZWxsc3BhY2luZzoiY2VsbFNwYWNpbmciLGNvbHNwYW46ImNvbFNwYW4iLGZyYW1lYm9yZGVyOiJmcmFtZUJvcmRlciIsaGVpZ2h0OiJoZWlnaHQiLG1heGxlbmd0aDoibWF4TGVuZ3RoIixub25jZToibm9uY2UiLHJvbGU6InJvbGUiLHJvd3NwYW46InJvd1NwYW4iLHR5cGU6InR5cGUiLHVzZW1hcDoidXNlTWFwIix2YWxpZ246InZBbGlnbiIsd2lkdGg6IndpZHRoIn0sWWE9ZnVuY3Rpb24oYSwKYixjKXtmdW5jdGlvbiBkKGspe2smJmIuYXBwZW5kQ2hpbGQodHlwZW9mIGs9PT0ic3RyaW5nIj9hLmNyZWF0ZVRleHROb2RlKGspOmspfWZvcih2YXIgZT0yO2U8Yy5sZW5ndGg7ZSsrKXt2YXIgZj1jW2VdO2lmKCFrYShmKXx8bShmKSYmZi5ub2RlVHlwZT4wKWQoZik7ZWxzZXthOntpZihmJiZ0eXBlb2YgZi5sZW5ndGg9PSJudW1iZXIiKXtpZihtKGYpKXt2YXIgaD10eXBlb2YgZi5pdGVtPT0iZnVuY3Rpb24ifHx0eXBlb2YgZi5pdGVtPT0ic3RyaW5nIjticmVhayBhfWlmKHR5cGVvZiBmPT09ImZ1bmN0aW9uIil7aD10eXBlb2YgZi5pdGVtPT0iZnVuY3Rpb24iO2JyZWFrIGF9fWg9ITF9d2EoaD95YShmKTpmLGQpfX19LFphPWZ1bmN0aW9uKGEsYil7Yj1TdHJpbmcoYik7YS5jb250ZW50VHlwZT09PSJhcHBsaWNhdGlvbi94aHRtbCt4bWwiJiYoYj1iLnRvTG93ZXJDYXNlKCkpO3JldHVybiBhLmNyZWF0ZUVsZW1lbnQoYil9LCRhPWZ1bmN0aW9uKGEpe2EmJmEucGFyZW50Tm9kZSYmCmEucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhKX0sYWI9ZnVuY3Rpb24oYSxiKXtpZighYXx8IWIpcmV0dXJuITE7aWYoYS5jb250YWlucyYmYi5ub2RlVHlwZT09MSlyZXR1cm4gYT09Ynx8YS5jb250YWlucyhiKTtpZih0eXBlb2YgYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiE9InVuZGVmaW5lZCIpcmV0dXJuIGE9PWJ8fCEhKGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24oYikmMTYpO2Zvcig7YiYmYSE9YjspYj1iLnBhcmVudE5vZGU7cmV0dXJuIGI9PWF9LGJiPWZ1bmN0aW9uKGEpe3AoYSwiTm9kZSBjYW5ub3QgYmUgbnVsbCBvciB1bmRlZmluZWQuIik7cmV0dXJuIGEubm9kZVR5cGU9PTk/YTphLm93bmVyRG9jdW1lbnR8fGEuZG9jdW1lbnR9LGNiPWZ1bmN0aW9uKGEsYil7Yj9hLnRhYkluZGV4PTA6KGEudGFiSW5kZXg9LTEsYS5yZW1vdmVBdHRyaWJ1dGUoInRhYkluZGV4IikpfSxkYj1mdW5jdGlvbihhKXtyZXR1cm4gYS5oYXNBdHRyaWJ1dGUoInRhYmluZGV4Iil9LGViPQpmdW5jdGlvbihhKXthPWEudGFiSW5kZXg7cmV0dXJuIHR5cGVvZiBhPT09Im51bWJlciImJmE+PTAmJmE8MzI3Njh9LGZiPWZ1bmN0aW9uKGEpe3RoaXMuZz1hfHxsLmRvY3VtZW50fHxkb2N1bWVudH07ZmIucHJvdG90eXBlLmk9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nO3JldHVybiB0eXBlb2YgYT09PSJzdHJpbmciP2IuZ2V0RWxlbWVudEJ5SWQoYSk6YX07ZmIucHJvdG90eXBlLmg9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXMuZyxlPWFyZ3VtZW50cyxmPWVbMV0saD1aYShkLFN0cmluZyhlWzBdKSk7ZiYmKHR5cGVvZiBmPT09InN0cmluZyI/aC5jbGFzc05hbWU9ZjpBcnJheS5pc0FycmF5KGYpP2guY2xhc3NOYW1lPWYuam9pbigiICIpOlhhKGgsZikpO2UubGVuZ3RoPjImJllhKGQsaCxlKTtyZXR1cm4gaH07dmFyIHc9ZnVuY3Rpb24oKXt0aGlzLmJhPXRoaXMuYmE7dGhpcy5rYT10aGlzLmthfTt3LnByb3RvdHlwZS5iYT0hMTt3LnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7dGhpcy5iYXx8KHRoaXMuYmE9ITAsdGhpcy5DKCkpfTt3LnByb3RvdHlwZVtTeW1ib2wuZGlzcG9zZV09ZnVuY3Rpb24oKXt0aGlzLmRpc3Bvc2UoKX07dy5wcm90b3R5cGUuQz1mdW5jdGlvbigpe2lmKHRoaXMua2EpZm9yKDt0aGlzLmthLmxlbmd0aDspdGhpcy5rYS5zaGlmdCgpKCl9O3ZhciB5PWZ1bmN0aW9uKGEsYil7dGhpcy50eXBlPWE7dGhpcy51PXRoaXMudGFyZ2V0PWI7dGhpcy5kZWZhdWx0UHJldmVudGVkPXRoaXMuQT0hMX07eS5wcm90b3R5cGUudj1mdW5jdGlvbigpe3RoaXMuQT0hMH07eS5wcm90b3R5cGUuaj1mdW5jdGlvbigpe3RoaXMuZGVmYXVsdFByZXZlbnRlZD0hMH07dmFyIGdiPWZ1bmN0aW9uKCl7aWYoIWwuYWRkRXZlbnRMaXN0ZW5lcnx8IU9iamVjdC5kZWZpbmVQcm9wZXJ0eSlyZXR1cm4hMTt2YXIgYT0hMSxiPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwicGFzc2l2ZSIse2dldDpmdW5jdGlvbigpe2E9ITB9fSk7dHJ5e3ZhciBjPWZ1bmN0aW9uKCl7fTtsLmFkZEV2ZW50TGlzdGVuZXIoInRlc3QiLGMsYik7bC5yZW1vdmVFdmVudExpc3RlbmVyKCJ0ZXN0IixjLGIpfWNhdGNoKGQpe31yZXR1cm4gYX0oKTt2YXIgej1mdW5jdGlvbihhLGIpe3kuY2FsbCh0aGlzLGE/YS50eXBlOiIiKTt0aGlzLnJlbGF0ZWRUYXJnZXQ9dGhpcy51PXRoaXMudGFyZ2V0PW51bGw7dGhpcy5idXR0b249dGhpcy5zY3JlZW5ZPXRoaXMuc2NyZWVuWD10aGlzLmNsaWVudFk9dGhpcy5jbGllbnRYPTA7dGhpcy5rZXk9IiI7dGhpcy5nPTA7dGhpcy5tZXRhS2V5PXRoaXMuc2hpZnRLZXk9dGhpcy5hbHRLZXk9dGhpcy5jdHJsS2V5PSExO3RoaXMuc3RhdGU9bnVsbDt0aGlzLkc9ITE7dGhpcy5wb2ludGVySWQ9MDt0aGlzLnBvaW50ZXJUeXBlPSIiO3RoaXMudGltZVN0YW1wPTA7dGhpcy5oPW51bGw7aWYoYSl7dmFyIGM9dGhpcy50eXBlPWEudHlwZSxkPWEuY2hhbmdlZFRvdWNoZXMmJmEuY2hhbmdlZFRvdWNoZXMubGVuZ3RoP2EuY2hhbmdlZFRvdWNoZXNbMF06bnVsbDt0aGlzLnRhcmdldD1hLnRhcmdldHx8YS5zcmNFbGVtZW50O3RoaXMudT1iO2I9YS5yZWxhdGVkVGFyZ2V0O2J8fChjPT0ibW91c2VvdmVyIj8KYj1hLmZyb21FbGVtZW50OmM9PSJtb3VzZW91dCImJihiPWEudG9FbGVtZW50KSk7dGhpcy5yZWxhdGVkVGFyZ2V0PWI7ZD8odGhpcy5jbGllbnRYPWQuY2xpZW50WCE9PXZvaWQgMD9kLmNsaWVudFg6ZC5wYWdlWCx0aGlzLmNsaWVudFk9ZC5jbGllbnRZIT09dm9pZCAwP2QuY2xpZW50WTpkLnBhZ2VZLHRoaXMuc2NyZWVuWD1kLnNjcmVlblh8fDAsdGhpcy5zY3JlZW5ZPWQuc2NyZWVuWXx8MCk6KHRoaXMuY2xpZW50WD1hLmNsaWVudFghPT12b2lkIDA/YS5jbGllbnRYOmEucGFnZVgsdGhpcy5jbGllbnRZPWEuY2xpZW50WSE9PXZvaWQgMD9hLmNsaWVudFk6YS5wYWdlWSx0aGlzLnNjcmVlblg9YS5zY3JlZW5YfHwwLHRoaXMuc2NyZWVuWT1hLnNjcmVlbll8fDApO3RoaXMuYnV0dG9uPWEuYnV0dG9uO3RoaXMuZz1hLmtleUNvZGV8fDA7dGhpcy5rZXk9YS5rZXl8fCIiO3RoaXMuY3RybEtleT1hLmN0cmxLZXk7dGhpcy5hbHRLZXk9YS5hbHRLZXk7dGhpcy5zaGlmdEtleT1hLnNoaWZ0S2V5Owp0aGlzLm1ldGFLZXk9YS5tZXRhS2V5O3RoaXMuRz12P2EubWV0YUtleTphLmN0cmxLZXk7dGhpcy5wb2ludGVySWQ9YS5wb2ludGVySWR8fDA7dGhpcy5wb2ludGVyVHlwZT1hLnBvaW50ZXJUeXBlO3RoaXMuc3RhdGU9YS5zdGF0ZTt0aGlzLnRpbWVTdGFtcD1hLnRpbWVTdGFtcDt0aGlzLmg9YTthLmRlZmF1bHRQcmV2ZW50ZWQmJnoubC5qLmNhbGwodGhpcyl9fTtuKHoseSk7ei5wcm90b3R5cGUudj1mdW5jdGlvbigpe3oubC52LmNhbGwodGhpcyk7dGhpcy5oLnN0b3BQcm9wYWdhdGlvbj90aGlzLmguc3RvcFByb3BhZ2F0aW9uKCk6dGhpcy5oLmNhbmNlbEJ1YmJsZT0hMH07ei5wcm90b3R5cGUuaj1mdW5jdGlvbigpe3oubC5qLmNhbGwodGhpcyk7dmFyIGE9dGhpcy5oO2EucHJldmVudERlZmF1bHQ/YS5wcmV2ZW50RGVmYXVsdCgpOmEucmV0dXJuVmFsdWU9ITF9O3ZhciBoYj0iY2xvc3VyZV9saXN0ZW5hYmxlXyIrKE1hdGgucmFuZG9tKCkqMUU2fDApLGliPWZ1bmN0aW9uKGEpe3JldHVybiEoIWF8fCFhW2hiXSl9O3ZhciBqYj0wO3ZhciBrYj1mdW5jdGlvbihhLGIsYyxkLGUpe3RoaXMubGlzdGVuZXI9YTt0aGlzLnByb3h5PW51bGw7dGhpcy5zcmM9Yjt0aGlzLnR5cGU9Yzt0aGlzLmNhcHR1cmU9ISFkO3RoaXMucGE9ZTt0aGlzLmtleT0rK2piO3RoaXMuamE9dGhpcy5vYT0hMX0sbGI9ZnVuY3Rpb24oYSl7YS5qYT0hMDthLmxpc3RlbmVyPW51bGw7YS5wcm94eT1udWxsO2Euc3JjPW51bGw7YS5wYT1udWxsfTt2YXIgbWI9ZnVuY3Rpb24oYSl7dGhpcy5zcmM9YTt0aGlzLmc9e307dGhpcy5oPTB9O21iLnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZj1hLnRvU3RyaW5nKCk7YT10aGlzLmdbZl07YXx8KGE9dGhpcy5nW2ZdPVtdLHRoaXMuaCsrKTt2YXIgaD1uYihhLGIsZCxlKTtoPi0xPyhiPWFbaF0sY3x8KGIub2E9ITEpKTooYj1uZXcga2IoYix0aGlzLnNyYyxmLCEhZCxlKSxiLm9hPWMsYS5wdXNoKGIpKTtyZXR1cm4gYn07CnZhciBvYj1mdW5jdGlvbihhLGIpe3ZhciBjPWIudHlwZTtjIGluIGEuZyYmeGEoYS5nW2NdLGIpJiYobGIoYiksYS5nW2NdLmxlbmd0aD09MCYmKGRlbGV0ZSBhLmdbY10sYS5oLS0pKX0scGI9ZnVuY3Rpb24oYSxiLGMsZCxlKXthPWEuZ1tiLnRvU3RyaW5nKCldO2I9LTE7YSYmKGI9bmIoYSxjLGQsZSkpO3JldHVybiBiPi0xP2FbYl06bnVsbH0sbmI9ZnVuY3Rpb24oYSxiLGMsZCl7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDsrK2Upe3ZhciBmPWFbZV07aWYoIWYuamEmJmYubGlzdGVuZXI9PWImJmYuY2FwdHVyZT09ISFjJiZmLnBhPT1kKXJldHVybiBlfXJldHVybi0xfTt2YXIgcWI9ImNsb3N1cmVfbG1fIisoTWF0aC5yYW5kb20oKSoxRTZ8MCkscmI9e30sc2I9MCx1Yj1mdW5jdGlvbihhLGIsYyxkLGUpe2lmKGQmJmQub25jZSlyZXR1cm4gdGIoYSxiLGMsZCxlKTtpZihBcnJheS5pc0FycmF5KGIpKXtmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKyl1YihhLGJbZl0sYyxkLGUpO3JldHVybiBudWxsfWM9dmIoYyk7cmV0dXJuIGliKGEpP3diKGEsYixjLG0oZCk/ISFkLmNhcHR1cmU6ISFkLGUpOnhiKGEsYixjLCExLGQsZSl9LHhiPWZ1bmN0aW9uKGEsYixjLGQsZSxmKXtpZighYil0aHJvdyBFcnJvcigiSW52YWxpZCBldmVudCB0eXBlIik7dmFyIGg9bShlKT8hIWUuY2FwdHVyZTohIWUsaz15YihhKTtrfHwoYVtxYl09az1uZXcgbWIoYSkpO2M9ay5hZGQoYixjLGQsaCxmKTtpZihjLnByb3h5KXJldHVybiBjO2Q9emIoKTtjLnByb3h5PWQ7ZC5zcmM9YTtkLmxpc3RlbmVyPWM7aWYoYS5hZGRFdmVudExpc3RlbmVyKWdifHwoZT1oKSxlPT09dm9pZCAwJiYKKGU9ITEpLGEuYWRkRXZlbnRMaXN0ZW5lcihiLnRvU3RyaW5nKCksZCxlKTtlbHNlIGlmKGEuYXR0YWNoRXZlbnQpYS5hdHRhY2hFdmVudChBYihiLnRvU3RyaW5nKCkpLGQpO2Vsc2UgaWYoYS5hZGRMaXN0ZW5lciYmYS5yZW1vdmVMaXN0ZW5lcilwKGI9PT0iY2hhbmdlIiwiTWVkaWFRdWVyeUxpc3Qgb25seSBoYXMgYSBjaGFuZ2UgZXZlbnQiKSxhLmFkZExpc3RlbmVyKGQpO2Vsc2UgdGhyb3cgRXJyb3IoImFkZEV2ZW50TGlzdGVuZXIgYW5kIGF0dGFjaEV2ZW50IGFyZSB1bmF2YWlsYWJsZS4iKTtzYisrO3JldHVybiBjfSx6Yj1mdW5jdGlvbigpe3ZhciBhPUJiLGI9ZnVuY3Rpb24oYyl7cmV0dXJuIGEuY2FsbChiLnNyYyxiLmxpc3RlbmVyLGMpfTtyZXR1cm4gYn0sdGI9ZnVuY3Rpb24oYSxiLGMsZCxlKXtpZihBcnJheS5pc0FycmF5KGIpKXtmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKyl0YihhLGJbZl0sYyxkLGUpO3JldHVybiBudWxsfWM9dmIoYyk7cmV0dXJuIGliKGEpPwphLkEuYWRkKFN0cmluZyhiKSxjLCEwLG0oZCk/ISFkLmNhcHR1cmU6ISFkLGUpOnhiKGEsYixjLCEwLGQsZSl9LENiPWZ1bmN0aW9uKGEsYixjLGQsZSl7aWYoQXJyYXkuaXNBcnJheShiKSlmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKylDYihhLGJbZl0sYyxkLGUpO2Vsc2UgZD1tKGQpPyEhZC5jYXB0dXJlOiEhZCxjPXZiKGMpLGliKGEpPyhhPWEuQSxiPVN0cmluZyhiKS50b1N0cmluZygpLGIgaW4gYS5nJiYoZj1hLmdbYl0sYz1uYihmLGMsZCxlKSxjPi0xJiYobGIoZltjXSkscChmLmxlbmd0aCE9bnVsbCksQXJyYXkucHJvdG90eXBlLnNwbGljZS5jYWxsKGYsYywxKSxmLmxlbmd0aD09MCYmKGRlbGV0ZSBhLmdbYl0sYS5oLS0pKSkpOmEmJihhPXliKGEpKSYmKGM9cGIoYSxiLGMsZCxlKSkmJkEoYyl9LEE9ZnVuY3Rpb24oYSl7aWYodHlwZW9mIGEhPT0ibnVtYmVyIiYmYSYmIWEuamEpe3ZhciBiPWEuc3JjO2lmKGliKGIpKW9iKGIuQSxhKTtlbHNle3ZhciBjPWEudHlwZSwKZD1hLnByb3h5O2IucmVtb3ZlRXZlbnRMaXN0ZW5lcj9iLnJlbW92ZUV2ZW50TGlzdGVuZXIoYyxkLGEuY2FwdHVyZSk6Yi5kZXRhY2hFdmVudD9iLmRldGFjaEV2ZW50KEFiKGMpLGQpOmIuYWRkTGlzdGVuZXImJmIucmVtb3ZlTGlzdGVuZXImJmIucmVtb3ZlTGlzdGVuZXIoZCk7c2ItLTsoYz15YihiKSk/KG9iKGMsYSksYy5oPT0wJiYoYy5zcmM9bnVsbCxiW3FiXT1udWxsKSk6bGIoYSl9fX0sQWI9ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW4gcmI/cmJbYV06cmJbYV09Im9uIithfSxCYj1mdW5jdGlvbihhLGIpe2lmKGEuamEpYT0hMDtlbHNle2I9bmV3IHooYix0aGlzKTt2YXIgYz1hLmxpc3RlbmVyLGQ9YS5wYXx8YS5zcmM7YS5vYSYmQShhKTthPWMuY2FsbChkLGIpfXJldHVybiBhfSx5Yj1mdW5jdGlvbihhKXthPWFbcWJdO3JldHVybiBhIGluc3RhbmNlb2YgbWI/YTpudWxsfSxEYj0iX19jbG9zdXJlX2V2ZW50c19mbl8iKyhNYXRoLnJhbmRvbSgpKjFFOT4+PjApLHZiPWZ1bmN0aW9uKGEpe3AoYSwKIkxpc3RlbmVyIGNhbiBub3QgYmUgbnVsbC4iKTtpZih0eXBlb2YgYT09PSJmdW5jdGlvbiIpcmV0dXJuIGE7cChhLmhhbmRsZUV2ZW50LCJBbiBvYmplY3QgbGlzdGVuZXIgbXVzdCBoYXZlIGhhbmRsZUV2ZW50IG1ldGhvZC4iKTthW0RiXXx8KGFbRGJdPWZ1bmN0aW9uKGIpe3JldHVybiBhLmhhbmRsZUV2ZW50KGIpfSk7cmV0dXJuIGFbRGJdfTt2YXIgRWI9ZnVuY3Rpb24oYSl7dy5jYWxsKHRoaXMpO3RoaXMuaD1hO3RoaXMuZz17fX07bihFYix3KTsKdmFyIEZiPVtdLEI9ZnVuY3Rpb24oYSxiLGMsZCl7QXJyYXkuaXNBcnJheShjKXx8KGMmJihGYlswXT1jLnRvU3RyaW5nKCkpLGM9RmIpO2Zvcih2YXIgZT0wO2U8Yy5sZW5ndGg7ZSsrKXt2YXIgZj11YihiLGNbZV0sZHx8YS5oYW5kbGVFdmVudCwhMSxhLmh8fGEpO2lmKCFmKWJyZWFrO2EuZ1tmLmtleV09Zn1yZXR1cm4gYX0sQz1mdW5jdGlvbihhLGIsYyxkLGUsZil7aWYoQXJyYXkuaXNBcnJheShjKSlmb3IodmFyIGg9MDtoPGMubGVuZ3RoO2grKylDKGEsYixjW2hdLGQsZSxmKTtlbHNlIGQ9ZHx8YS5oYW5kbGVFdmVudCxlPW0oZSk/ISFlLmNhcHR1cmU6ISFlLGY9Znx8YS5ofHxhLGQ9dmIoZCksZT0hIWUsYz1pYihiKT9wYihiLkEsU3RyaW5nKGMpLGQsZSxmKTpiPyhiPXliKGIpKT9wYihiLGMsZCxlLGYpOm51bGw6bnVsbCxjJiYoQShjKSxkZWxldGUgYS5nW2Mua2V5XSk7cmV0dXJuIGF9LEdiPWZ1bmN0aW9uKGEpe0JhKGEuZyxmdW5jdGlvbihiLGMpe3RoaXMuZy5oYXNPd25Qcm9wZXJ0eShjKSYmCkEoYil9LGEpO2EuZz17fX07RWIucHJvdG90eXBlLkM9ZnVuY3Rpb24oKXtFYi5sLkMuY2FsbCh0aGlzKTtHYih0aGlzKX07RWIucHJvdG90eXBlLmhhbmRsZUV2ZW50PWZ1bmN0aW9uKCl7dGhyb3cgRXJyb3IoIkV2ZW50SGFuZGxlci5oYW5kbGVFdmVudCBub3QgaW1wbGVtZW50ZWQiKTt9O3ZhciBEPWZ1bmN0aW9uKCl7dy5jYWxsKHRoaXMpO3RoaXMuQT1uZXcgbWIodGhpcyk7dGhpcy5ZYT10aGlzO3RoaXMubGE9bnVsbH07bihELHcpO0QucHJvdG90eXBlW2hiXT0hMDtELnByb3RvdHlwZS5BYT1mdW5jdGlvbihhKXt0aGlzLmxhPWF9O0QucHJvdG90eXBlLnJlbW92ZUV2ZW50TGlzdGVuZXI9ZnVuY3Rpb24oYSxiLGMsZCl7Q2IodGhpcyxhLGIsYyxkKX07CnZhciBFPWZ1bmN0aW9uKGEsYil7SGIoYSk7dmFyIGM9YS5sYTtpZihjKXt2YXIgZD1bXTtmb3IodmFyIGU9MTtjO2M9Yy5sYSlkLnB1c2goYykscCgrK2U8MUUzLCJpbmZpbml0ZSBsb29wIil9YT1hLllhO2M9Yi50eXBlfHxiO3R5cGVvZiBiPT09InN0cmluZyI/Yj1uZXcgeShiLGEpOmIgaW5zdGFuY2VvZiB5P2IudGFyZ2V0PWIudGFyZ2V0fHxhOihlPWIsYj1uZXcgeShjLGEpLEdhKGIsZSkpO2U9ITA7dmFyIGY7aWYoZClmb3IoZj1kLmxlbmd0aC0xOyFiLkEmJmY+PTA7Zi0tKXt2YXIgaD1iLnU9ZFtmXTtlPUliKGgsYywhMCxiKSYmZX1iLkF8fChoPWIudT1hLGU9SWIoaCxjLCEwLGIpJiZlLGIuQXx8KGU9SWIoaCxjLCExLGIpJiZlKSk7aWYoZClmb3IoZj0wOyFiLkEmJmY8ZC5sZW5ndGg7ZisrKWg9Yi51PWRbZl0sZT1JYihoLGMsITEsYikmJmU7cmV0dXJuIGV9OwpELnByb3RvdHlwZS5DPWZ1bmN0aW9uKCl7RC5sLkMuY2FsbCh0aGlzKTtpZih0aGlzLkEpe3ZhciBhPXRoaXMuQSxiPTAsYztmb3IoYyBpbiBhLmcpe2Zvcih2YXIgZD1hLmdbY10sZT0wO2U8ZC5sZW5ndGg7ZSsrKSsrYixsYihkW2VdKTtkZWxldGUgYS5nW2NdO2EuaC0tfX10aGlzLmxhPW51bGx9O3ZhciB3Yj1mdW5jdGlvbihhLGIsYyxkLGUpe0hiKGEpO3JldHVybiBhLkEuYWRkKFN0cmluZyhiKSxjLCExLGQsZSl9LEliPWZ1bmN0aW9uKGEsYixjLGQpe2I9YS5BLmdbU3RyaW5nKGIpXTtpZighYilyZXR1cm4hMDtiPWIuY29uY2F0KCk7Zm9yKHZhciBlPSEwLGY9MDtmPGIubGVuZ3RoOysrZil7dmFyIGg9YltmXTtpZihoJiYhaC5qYSYmaC5jYXB0dXJlPT1jKXt2YXIgaz1oLmxpc3RlbmVyLHE9aC5wYXx8aC5zcmM7aC5vYSYmb2IoYS5BLGgpO2U9ay5jYWxsKHEsZCkhPT0hMSYmZX19cmV0dXJuIGUmJiFkLmRlZmF1bHRQcmV2ZW50ZWR9LEhiPWZ1bmN0aW9uKGEpe3AoYS5BLCJFdmVudCB0YXJnZXQgaXMgbm90IGluaXRpYWxpemVkLiBEaWQgeW91IGNhbGwgdGhlIHN1cGVyY2xhc3MgKGdvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0KSBjb25zdHJ1Y3Rvcj8iKX07dmFyIEpiPXQ/Ik1velVzZXJTZWxlY3QiOnV8fFZhPyJXZWJraXRVc2VyU2VsZWN0IjpudWxsLEtiPWZ1bmN0aW9uKGEsYil7Yj1iP251bGw6YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpO2lmKEpiJiYoYS5zdHlsZSYmKGEuc3R5bGVbSmJdPSJub25lIiksYikpZm9yKHZhciBjPTA7YT1iW2NdO2MrKylhLnN0eWxlJiYoYS5zdHlsZVtKYl09Im5vbmUiKX07dmFyIExiPWZ1bmN0aW9uKCl7fTtpYShMYik7TGIucHJvdG90eXBlLmc9MDt2YXIgRj1mdW5jdGlvbihhKXtELmNhbGwodGhpcyk7dGhpcy5HPWF8fHBhfHwocGE9bmV3IGZiKTt0aGlzLnphPU1iO3RoaXMuWT1udWxsO3RoaXMucz0hMTt0aGlzLmc9bnVsbDt0aGlzLk09dm9pZCAwO3RoaXMudT10aGlzLmo9dGhpcy5oPW51bGw7dGhpcy5TYT0hMX07bihGLEQpO0YucHJvdG90eXBlLlphPUxiLlYoKTsKdmFyIE1iPW51bGwsTmI9ZnVuY3Rpb24oYSxiKXtzd2l0Y2goYSl7Y2FzZSAxOnJldHVybiBiPyJkaXNhYmxlIjoiZW5hYmxlIjtjYXNlIDI6cmV0dXJuIGI/ImhpZ2hsaWdodCI6InVuaGlnaGxpZ2h0IjtjYXNlIDQ6cmV0dXJuIGI/ImFjdGl2YXRlIjoiZGVhY3RpdmF0ZSI7Y2FzZSA4OnJldHVybiBiPyJzZWxlY3QiOiJ1bnNlbGVjdCI7Y2FzZSAxNjpyZXR1cm4gYj8iY2hlY2siOiJ1bmNoZWNrIjtjYXNlIDMyOnJldHVybiBiPyJmb2N1cyI6ImJsdXIiO2Nhc2UgNjQ6cmV0dXJuIGI/Im9wZW4iOiJjbG9zZSJ9dGhyb3cgRXJyb3IoIkludmFsaWQgY29tcG9uZW50IHN0YXRlIik7fSxPYj1mdW5jdGlvbihhKXtyZXR1cm4gYS5ZfHwoYS5ZPSI6IisoYS5aYS5nKyspLnRvU3RyaW5nKDM2KSl9LFBiPWZ1bmN0aW9uKGEsYil7aWYoYS5oJiZhLmgudSl7dmFyIGM9YS5oLnUsZD1hLlk7ZCBpbiBjJiZkZWxldGUgY1tkXTtEYShhLmgudSxiLGEpfWEuWT1ifTtGLnByb3RvdHlwZS5pPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ307CnZhciBRYj1mdW5jdGlvbihhKXthLk18fChhLk09bmV3IEViKGEpKTtyZXR1cm4gcChhLk0pfTtGLnByb3RvdHlwZS5BYT1mdW5jdGlvbihhKXtpZih0aGlzLmgmJnRoaXMuaCE9YSl0aHJvdyBFcnJvcigiTWV0aG9kIG5vdCBzdXBwb3J0ZWQiKTtGLmwuQWEuY2FsbCh0aGlzLGEpfTtGLnByb3RvdHlwZS5tYT1mdW5jdGlvbigpe3RoaXMuZz1aYSh0aGlzLkcuZywiRElWIil9O0YucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbihhKXtSYih0aGlzLGEpfTsKdmFyIFJiPWZ1bmN0aW9uKGEsYixjKXtpZihhLnMpdGhyb3cgRXJyb3IoIkNvbXBvbmVudCBhbHJlYWR5IHJlbmRlcmVkIik7YS5nfHxhLm1hKCk7Yj9iLmluc2VydEJlZm9yZShhLmcsY3x8bnVsbCk6YS5HLmcuYm9keS5hcHBlbmRDaGlsZChhLmcpO2EuaCYmIWEuaC5zfHxhLkkoKX0sU2I9ZnVuY3Rpb24oYSxiKXtpZihhLnMpdGhyb3cgRXJyb3IoIkNvbXBvbmVudCBhbHJlYWR5IHJlbmRlcmVkIik7aWYoYiYmYS53YShiKSl7YS5TYT0hMDt2YXIgYz1iYihiKTthLkcmJmEuRy5nPT1jfHwoYS5HPWI/bmV3IGZiKGJiKGIpKTpwYXx8KHBhPW5ldyBmYikpO2EuRWEoYik7YS5JKCl9ZWxzZSB0aHJvdyBFcnJvcigiSW52YWxpZCBlbGVtZW50IHRvIGRlY29yYXRlIik7fTtnPUYucHJvdG90eXBlO2cud2E9ZnVuY3Rpb24oKXtyZXR1cm4hMH07Zy5FYT1mdW5jdGlvbihhKXt0aGlzLmc9YX07CmcuST1mdW5jdGlvbigpe3RoaXMucz0hMDtUYih0aGlzLGZ1bmN0aW9uKGEpeyFhLnMmJmEuaSgpJiZhLkkoKX0pfTtnLlU9ZnVuY3Rpb24oKXtUYih0aGlzLGZ1bmN0aW9uKGEpe2EucyYmYS5VKCl9KTt0aGlzLk0mJkdiKHRoaXMuTSk7dGhpcy5zPSExfTtnLkM9ZnVuY3Rpb24oKXt0aGlzLnMmJnRoaXMuVSgpO3RoaXMuTSYmKHRoaXMuTS5kaXNwb3NlKCksZGVsZXRlIHRoaXMuTSk7VGIodGhpcyxmdW5jdGlvbihhKXthLmRpc3Bvc2UoKX0pOyF0aGlzLlNhJiZ0aGlzLmcmJiRhKHRoaXMuZyk7dGhpcy5oPXRoaXMuZz10aGlzLnU9dGhpcy5qPW51bGw7Ri5sLkMuY2FsbCh0aGlzKX07Zy5CYT1mdW5jdGlvbihhLGIpe3RoaXMuQ2EoYSxIKHRoaXMpLGIpfTsKZy5DYT1mdW5jdGlvbihhLGIsYyl7cCghIWEsIlByb3ZpZGVkIGVsZW1lbnQgbXVzdCBub3QgYmUgbnVsbC4iKTtpZihhLnMmJihjfHwhdGhpcy5zKSl0aHJvdyBFcnJvcigiQ29tcG9uZW50IGFscmVhZHkgcmVuZGVyZWQiKTtpZihiPDB8fGI+SCh0aGlzKSl0aHJvdyBFcnJvcigiQ2hpbGQgY29tcG9uZW50IGluZGV4IG91dCBvZiBib3VuZHMiKTt0aGlzLnUmJnRoaXMuanx8KHRoaXMudT17fSx0aGlzLmo9W10pO2lmKGEuaD09dGhpcyl7dmFyIGQ9dGhpcy51LGU9T2IoYSk7ZFtlXT1hO3hhKHRoaXMuaixhKX1lbHNlIERhKHRoaXMudSxPYihhKSxhKTtpZihhPT10aGlzKXRocm93IEVycm9yKCJVbmFibGUgdG8gc2V0IHBhcmVudCBjb21wb25lbnQiKTtpZihkPXRoaXMmJmEuaCYmYS5ZKWU9YS5oLGQ9YS5ZLGUudSYmZD8oZT1lLnUsZD0oZSE9PW51bGwmJmQgaW4gZT9lW2RdOnZvaWQgMCl8fG51bGwpOmQ9bnVsbDtpZihkJiZhLmghPXRoaXMpdGhyb3cgRXJyb3IoIlVuYWJsZSB0byBzZXQgcGFyZW50IGNvbXBvbmVudCIpOwphLmg9dGhpcztGLmwuQWEuY2FsbChhLHRoaXMpO3phKHRoaXMuaixiLDAsYSk7YS5zJiZ0aGlzLnMmJmEuaD09dGhpcz8oYz10aGlzLm5hKCksKGMuY2hpbGROb2Rlc1tiXXx8bnVsbCkhPWEuaSgpJiYoYS5pKCkucGFyZW50RWxlbWVudD09YyYmYy5yZW1vdmVDaGlsZChhLmkoKSksYj1jLmNoaWxkTm9kZXNbYl18fG51bGwsYy5pbnNlcnRCZWZvcmUoYS5pKCksYikpKTpjPyh0aGlzLmd8fHRoaXMubWEoKSxiPUkodGhpcyxiKzEpLFJiKGEsdGhpcy5uYSgpLGI/Yi5nOm51bGwpKTp0aGlzLnMmJiFhLnMmJmEuZyYmYS5nLnBhcmVudE5vZGUmJmEuZy5wYXJlbnROb2RlLm5vZGVUeXBlPT0xJiZhLkkoKX07Zy5uYT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmd9Owp2YXIgVWI9ZnVuY3Rpb24oYSl7aWYoYS56YT09bnVsbCl7dmFyIGI9YS5zP2EuZzphLkcuZy5ib2R5O2E6e3ZhciBjPWJiKGIpO2lmKGMuZGVmYXVsdFZpZXcmJmMuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSYmKGM9Yy5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKGIsbnVsbCkpKXtjPWMuZGlyZWN0aW9ufHxjLmdldFByb3BlcnR5VmFsdWUoImRpcmVjdGlvbiIpfHwiIjticmVhayBhfWM9IiJ9YS56YT0icnRsIj09KGN8fChiLmN1cnJlbnRTdHlsZT9iLmN1cnJlbnRTdHlsZS5kaXJlY3Rpb246bnVsbCl8fGIuc3R5bGUmJmIuc3R5bGUuZGlyZWN0aW9uKX1yZXR1cm4gYS56YX0sSD1mdW5jdGlvbihhKXtyZXR1cm4gYS5qP2Euai5sZW5ndGg6MH0sST1mdW5jdGlvbihhLGIpe3JldHVybiBhLmo/YS5qW2JdfHxudWxsOm51bGx9LFRiPWZ1bmN0aW9uKGEsYixjKXthLmomJmEuai5mb3JFYWNoKGIsYyl9LFZiPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuaiYmYj9hLmouaW5kZXhPZihiKToKLTF9O3ZhciBXYj17bWI6ImFjdGl2ZWRlc2NlbmRhbnQiLHJiOiJhdG9taWMiLHNiOiJhdXRvY29tcGxldGUiLHViOiJidXN5Iix4YjoiY2hlY2tlZCIseWI6ImNvbGluZGV4IixEYjoiY29udHJvbHMiLEViOiJjdXJyZW50IixHYjoiZGVzY3JpYmVkYnkiLEpiOiJkaXNhYmxlZCIsTGI6ImRyb3BlZmZlY3QiLE1iOiJleHBhbmRlZCIsTmI6ImZsb3d0byIsUGI6ImdyYWJiZWQiLFRiOiJoYXNwb3B1cCIsVmI6ImhpZGRlbiIsWGI6ImludmFsaWQiLFliOiJsYWJlbCIsWmI6ImxhYmVsbGVkYnkiLGFjOiJsZXZlbCIsZmM6ImxpdmUiLHZjOiJtdWx0aWxpbmUiLHdjOiJtdWx0aXNlbGVjdGFibGUiLEFjOiJvcmllbnRhdGlvbiIsQmM6Im93bnMiLENjOiJwb3NpbnNldCIsRWM6InByZXNzZWQiLEljOiJyZWFkb25seSIsS2M6InJlbGV2YW50IixMYzoicmVxdWlyZWQiLFBjOiJyb3dpbmRleCIsU2M6InNlbGVjdGVkIixVYzoic2V0c2l6ZSIsV2M6InNvcnQiLG1kOiJ2YWx1ZW1heCIsbmQ6InZhbHVlbWluIiwKb2Q6InZhbHVlbm93IixwZDoidmFsdWV0ZXh0In07dmFyIFhiO3ZhciBZYj17bmI6ImFsZXJ0IixvYjoiYWxlcnRkaWFsb2ciLHBiOiJhcHBsaWNhdGlvbiIscWI6ImFydGljbGUiLHRiOiJiYW5uZXIiLHZiOiJidXR0b24iLHdiOiJjaGVja2JveCIsemI6ImNvbHVtbmhlYWRlciIsQWI6ImNvbWJvYm94IixCYjoiY29tcGxlbWVudGFyeSIsQ2I6ImNvbnRlbnRpbmZvIixGYjoiZGVmaW5pdGlvbiIsSGI6ImRpYWxvZyIsSWI6ImRpcmVjdG9yeSIsS2I6ImRvY3VtZW50IixPYjoiZm9ybSIsUWI6ImdyaWQiLFJiOiJncmlkY2VsbCIsU2I6Imdyb3VwIixVYjoiaGVhZGluZyIsV2I6ImltZyIsYmM6ImxpbmsiLGNjOiJsaXN0IixkYzoibGlzdGJveCIsZWM6Imxpc3RpdGVtIixoYzoibG9nIixpYzoibWFpbiIsamM6Im1hcnF1ZWUiLGtjOiJtYXRoIixsYzoibWVudSIsbWM6Im1lbnViYXIiLG5jOiJtZW51aXRlbSIsb2M6Im1lbnVpdGVtY2hlY2tib3giLHBjOiJtZW51aXRlbXJhZGlvIix4YzoibmF2aWdhdGlvbiIseWM6Im5vdGUiLHpjOiJvcHRpb24iLApEYzoicHJlc2VudGF0aW9uIixGYzoicHJvZ3Jlc3NiYXIiLEdjOiJyYWRpbyIsSGM6InJhZGlvZ3JvdXAiLEpjOiJyZWdpb24iLE1jOiJyb3ciLE5jOiJyb3dncm91cCIsT2M6InJvd2hlYWRlciIsUWM6InNjcm9sbGJhciIsUmM6InNlYXJjaCIsVGM6InNlcGFyYXRvciIsVmM6InNsaWRlciIsWGM6InNwaW5idXR0b24iLFljOiJzdGF0dXMiLFpjOiJzd2l0Y2giLGFkOiJ0YWIiLGJkOiJ0YWJsaXN0IixjZDoidGFicGFuZWwiLGRkOiJ0ZXh0Ym94IixlZDoidGV4dGluZm8iLGZkOiJ0aW1lciIsZ2Q6InRvb2xiYXIiLGhkOiJ0b29sdGlwIixqZDoidHJlZSIsa2Q6InRyZWVncmlkIixsZDoidHJlZWl0ZW0ifTt2YXIgWmI9ZnVuY3Rpb24oYSxiKXtiPyhwKENhKFliLGIpLCJObyBzdWNoIEFSSUEgcm9sZSAiK2IpLGEuc2V0QXR0cmlidXRlKCJyb2xlIixiKSk6YS5yZW1vdmVBdHRyaWJ1dGUoInJvbGUiKX0sYWM9ZnVuY3Rpb24oYSxiLGMpe0FycmF5LmlzQXJyYXkoYykmJihjPWMuam9pbigiICIpKTt2YXIgZD0kYihiKTtjPT09IiJ8fGM9PXZvaWQgMD8oWGJ8fChjPXt9LFhiPShjLmF0b21pYz0hMSxjLmF1dG9jb21wbGV0ZT0ibm9uZSIsYy5kcm9wZWZmZWN0PSJub25lIixjLmhhc3BvcHVwPSExLGMubGl2ZT0ib2ZmIixjLm11bHRpbGluZT0hMSxjLm11bHRpc2VsZWN0YWJsZT0hMSxjLm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIsYy5yZWFkb25seT0hMSxjLnJlbGV2YW50PSJhZGRpdGlvbnMgdGV4dCIsYy5yZXF1aXJlZD0hMSxjLnNvcnQ9Im5vbmUiLGMuYnVzeT0hMSxjLmRpc2FibGVkPSExLGMuaGlkZGVuPSExLGMuaW52YWxpZD0iZmFsc2UiLGMpKSxjPVhiLGIgaW4gYz9hLnNldEF0dHJpYnV0ZShkLApjW2JdKTphLnJlbW92ZUF0dHJpYnV0ZShkKSk6YS5zZXRBdHRyaWJ1dGUoZCxjKX0sJGI9ZnVuY3Rpb24oYSl7cChhLCJBUklBIGF0dHJpYnV0ZSBjYW5ub3QgYmUgZW1wdHkuIik7cChDYShXYixhKSwiTm8gc3VjaCBBUklBIGF0dHJpYnV0ZSAiK2EpO3JldHVybiJhcmlhLSIrYX07dmFyIGRjPWZ1bmN0aW9uKGEsYixjLGQsZSxmKXtpZih2JiZlKXJldHVybiBiYyhhKTtpZihlJiYhZClyZXR1cm4hMTtpZighdCl7dHlwZW9mIGI9PT0ibnVtYmVyIiYmKGI9Y2MoYikpO3ZhciBoPWI9PTE3fHxiPT0xOHx8diYmYj09OTE7aWYoKCFjfHx2KSYmaHx8diYmYj09MTYmJihkfHxmKSlyZXR1cm4hMX1pZih1JiZkJiZjKXN3aXRjaChhKXtjYXNlIDIyMDpjYXNlIDIxOTpjYXNlIDIyMTpjYXNlIDE5MjpjYXNlIDE4NjpjYXNlIDE4OTpjYXNlIDE4NzpjYXNlIDE4ODpjYXNlIDE5MDpjYXNlIDE5MTpjYXNlIDE5MjpjYXNlIDIyMjpyZXR1cm4hMX1zd2l0Y2goYSl7Y2FzZSAxMzpyZXR1cm4gdD9mfHxlPyExOiEoYyYmZCk6ITA7Y2FzZSAyNzpyZXR1cm4hdSYmIXR9cmV0dXJuIHQmJihkfHxlfHxmKT8hMTpiYyhhKX0sYmM9ZnVuY3Rpb24oYSl7aWYoYT49NDgmJmE8PTU3fHxhPj05NiYmYTw9MTA2fHxhPj02NSYmYTw9OTB8fHUmJmE9PTApcmV0dXJuITA7c3dpdGNoKGEpe2Nhc2UgMzI6Y2FzZSA0MzpjYXNlIDYzOmNhc2UgNjQ6Y2FzZSAxMDc6Y2FzZSAxMDk6Y2FzZSAxMTA6Y2FzZSAxMTE6Y2FzZSAxODY6Y2FzZSA1OTpjYXNlIDE4OTpjYXNlIDE4NzpjYXNlIDYxOmNhc2UgMTg4OmNhc2UgMTkwOmNhc2UgMTkxOmNhc2UgMTkyOmNhc2UgMjIyOmNhc2UgMjE5OmNhc2UgMjIwOmNhc2UgMjIxOmNhc2UgMTYzOmNhc2UgNTg6cmV0dXJuITA7CmNhc2UgMTczOmNhc2UgMTcxOnJldHVybiB0O2RlZmF1bHQ6cmV0dXJuITF9fSxjYz1mdW5jdGlvbihhKXtpZih0KWE9ZWMoYSk7ZWxzZSBpZih2JiZ1KXN3aXRjaChhKXtjYXNlIDkzOmE9OTF9cmV0dXJuIGF9LGVjPWZ1bmN0aW9uKGEpe3N3aXRjaChhKXtjYXNlIDYxOnJldHVybiAxODc7Y2FzZSA1OTpyZXR1cm4gMTg2O2Nhc2UgMTczOnJldHVybiAxODk7Y2FzZSAyMjQ6cmV0dXJuIDkxO2Nhc2UgMDpyZXR1cm4gMjI0O2RlZmF1bHQ6cmV0dXJuIGF9fTt2YXIgZmM9ZnVuY3Rpb24oYSxiLGMsZCl7ei5jYWxsKHRoaXMsZCk7dGhpcy50eXBlPSJrZXkiO3RoaXMuZz1hO3RoaXMucmVwZWF0PWN9O24oZmMseik7dmFyIEo9ZnVuY3Rpb24oYSxiKXtELmNhbGwodGhpcyk7YSYmZ2ModGhpcyxhLGIpfTtuKEosRCk7Zz1KLnByb3RvdHlwZTtnLlI9bnVsbDtnLnFhPW51bGw7Zy5KYT1udWxsO2cucmE9bnVsbDtnLkY9LTE7Zy5LPS0xO2cuRGE9ITE7CnZhciBoYz17MzoxMywxMjoxNDQsNjMyMzI6MzgsNjMyMzM6NDAsNjMyMzQ6MzcsNjMyMzU6MzksNjMyMzY6MTEyLDYzMjM3OjExMyw2MzIzODoxMTQsNjMyMzk6MTE1LDYzMjQwOjExNiw2MzI0MToxMTcsNjMyNDI6MTE4LDYzMjQzOjExOSw2MzI0NDoxMjAsNjMyNDU6MTIxLDYzMjQ2OjEyMiw2MzI0NzoxMjMsNjMyNDg6NDQsNjMyNzI6NDYsNjMyNzM6MzYsNjMyNzU6MzUsNjMyNzY6MzMsNjMyNzc6MzQsNjMyODk6MTQ0LDYzMzAyOjQ1fSxpYz17VXA6MzgsRG93bjo0MCxMZWZ0OjM3LFJpZ2h0OjM5LEVudGVyOjEzLEYxOjExMixGMjoxMTMsRjM6MTE0LEY0OjExNSxGNToxMTYsRjY6MTE3LEY3OjExOCxGODoxMTksRjk6MTIwLEYxMDoxMjEsRjExOjEyMixGMTI6MTIzLCJVKzAwN0YiOjQ2LEhvbWU6MzYsRW5kOjM1LFBhZ2VVcDozMyxQYWdlRG93bjozNCxJbnNlcnQ6NDV9LGpjPXYmJnQ7CkoucHJvdG90eXBlLmc9ZnVuY3Rpb24oYSl7dSYmKHRoaXMuRj09MTcmJiFhLmN0cmxLZXl8fHRoaXMuRj09MTgmJiFhLmFsdEtleXx8diYmdGhpcy5GPT05MSYmIWEubWV0YUtleSkmJih0aGlzLks9dGhpcy5GPS0xKTt0aGlzLkY9PS0xJiYoYS5jdHJsS2V5JiZhLmchPTE3P3RoaXMuRj0xNzphLmFsdEtleSYmYS5nIT0xOD90aGlzLkY9MTg6YS5tZXRhS2V5JiZhLmchPTkxJiYodGhpcy5GPTkxKSk7ZGMoYS5nLHRoaXMuRixhLnNoaWZ0S2V5LGEuY3RybEtleSxhLmFsdEtleSxhLm1ldGFLZXkpPyh0aGlzLks9Y2MoYS5nKSxqYyYmKHRoaXMuRGE9YS5hbHRLZXkpKTp0aGlzLmhhbmRsZUV2ZW50KGEpfTtKLnByb3RvdHlwZS5oPWZ1bmN0aW9uKGEpe3RoaXMuSz10aGlzLkY9LTE7dGhpcy5EYT1hLmFsdEtleX07CkoucHJvdG90eXBlLmhhbmRsZUV2ZW50PWZ1bmN0aW9uKGEpe3ZhciBiPWEuaCxjPWIuYWx0S2V5O2lmKHUmJmEudHlwZT09ImtleXByZXNzIil7dmFyIGQ9dGhpcy5LO3ZhciBlPWIuY2hhckNvZGU+PTAmJmIuY2hhckNvZGU8NjMyMzImJmJjKGQpP2IuY2hhckNvZGU6MH1lbHNlIGEudHlwZT09ImtleXByZXNzIj8oamMmJihjPXRoaXMuRGEpLGIua2V5Q29kZT09Yi5jaGFyQ29kZT9iLmtleUNvZGU8MzI/KGQ9Yi5rZXlDb2RlLGU9MCk6KGQ9dGhpcy5LLGU9Yi5jaGFyQ29kZSk6KGQ9Yi5rZXlDb2RlfHx0aGlzLkssZT1iLmNoYXJDb2RlfHwwKSk6KGQ9Yi5rZXlDb2RlfHx0aGlzLkssZT1iLmNoYXJDb2RlfHwwKSx2JiZlPT02MyYmZD09MjI0JiYoZD0xOTEpO3ZhciBmPWQ9Y2MoZCk7ZD9kPj02MzIzMiYmZCBpbiBoYz9mPWhjW2RdOmQ9PTI1JiZhLnNoaWZ0S2V5JiYoZj05KTpiLmtleUlkZW50aWZpZXImJmIua2V5SWRlbnRpZmllciBpbiBpYyYmKGY9aWNbYi5rZXlJZGVudGlmaWVyXSk7CmlmKCF0fHxhLnR5cGUhPSJrZXlwcmVzcyJ8fGRjKGYsdGhpcy5GLGEuc2hpZnRLZXksYS5jdHJsS2V5LGMsYS5tZXRhS2V5KSlhPWY9PXRoaXMuRix0aGlzLkY9ZixiPW5ldyBmYyhmLGUsYSxiKSxiLmFsdEtleT1jLEUodGhpcyxiKX07Si5wcm90b3R5cGUuaT1mdW5jdGlvbigpe3JldHVybiB0aGlzLlJ9O3ZhciBnYz1mdW5jdGlvbihhLGIsYyl7YS5yYSYma2MoYSk7YS5SPWI7YS5xYT11YihhLlIsImtleXByZXNzIixhLGMpO2EuSmE9dWIoYS5SLCJrZXlkb3duIixhLmcsYyxhKTthLnJhPXViKGEuUiwia2V5dXAiLGEuaCxjLGEpfSxrYz1mdW5jdGlvbihhKXthLnFhJiYoQShhLnFhKSxBKGEuSmEpLEEoYS5yYSksYS5xYT1udWxsLGEuSmE9bnVsbCxhLnJhPW51bGwpO2EuUj1udWxsO2EuRj0tMTthLks9LTF9O0oucHJvdG90eXBlLkM9ZnVuY3Rpb24oKXtKLmwuQy5jYWxsKHRoaXMpO2tjKHRoaXMpfTt2YXIgSz17Z2E6Im1vdXNlZG93biIsaGE6Im1vdXNldXAiLGZhOiJtb3VzZWNhbmNlbCIsc2M6Im1vdXNlbW92ZSIsdWM6Im1vdXNlb3ZlciIsdGM6Im1vdXNlb3V0IixxYzoibW91c2VlbnRlciIscmM6Im1vdXNlbGVhdmUifTt2YXIgbGM9ZnVuY3Rpb24oYSl7cmV0dXJuIHR5cGVvZiBhLmNsYXNzTmFtZT09InN0cmluZyI/YS5jbGFzc05hbWU6YS5nZXRBdHRyaWJ1dGUmJmEuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIn0sTD1mdW5jdGlvbihhKXtyZXR1cm4gYS5jbGFzc0xpc3Q/YS5jbGFzc0xpc3Q6bGMoYSkubWF0Y2goL1xTKy9nKXx8W119LG1jPWZ1bmN0aW9uKGEsYil7dHlwZW9mIGEuY2xhc3NOYW1lPT0ic3RyaW5nIj9hLmNsYXNzTmFtZT1iOmEuc2V0QXR0cmlidXRlJiZhLnNldEF0dHJpYnV0ZSgiY2xhc3MiLGIpfSxuYz1mdW5jdGlvbihhLGIpe2EuY2xhc3NMaXN0P2I9YS5jbGFzc0xpc3QuY29udGFpbnMoYik6KGE9TChhKSxiPXZhKGEsYik+PTApO3JldHVybiBifSxvYz1mdW5jdGlvbihhLGIpe2lmKGEuY2xhc3NMaXN0KWEuY2xhc3NMaXN0LmFkZChiKTtlbHNlIGlmKCFuYyhhLGIpKXt2YXIgYz1sYyhhKTttYyhhLGMrKGMubGVuZ3RoPjA/IiAiK2I6YikpfX0scGM9ZnVuY3Rpb24oYSxiKXtpZihhLmNsYXNzTGlzdClBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGIsCmZ1bmN0aW9uKGUpe29jKGEsZSl9KTtlbHNle3ZhciBjPXt9O0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoTChhKSxmdW5jdGlvbihlKXtjW2VdPSEwfSk7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChiLGZ1bmN0aW9uKGUpe2NbZV09ITB9KTtiPSIiO2Zvcih2YXIgZCBpbiBjKWIrPWIubGVuZ3RoPjA/IiAiK2Q6ZDttYyhhLGIpfX0scWM9ZnVuY3Rpb24oYSxiKXthLmNsYXNzTGlzdD9hLmNsYXNzTGlzdC5yZW1vdmUoYik6bmMoYSxiKSYmbWMoYSxBcnJheS5wcm90b3R5cGUuZmlsdGVyLmNhbGwoTChhKSxmdW5jdGlvbihjKXtyZXR1cm4gYyE9Yn0pLmpvaW4oIiAiKSl9LHJjPWZ1bmN0aW9uKGEsYil7YS5jbGFzc0xpc3Q/QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChiLGZ1bmN0aW9uKGMpe3FjKGEsYyl9KTptYyhhLEFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbChMKGEpLGZ1bmN0aW9uKGMpe3JldHVybiEodmEoYixjKT49MCl9KS5qb2luKCIgIikpfTt2YXIgdGM9ZnVuY3Rpb24oYSxiKXtpZighYSl0aHJvdyBFcnJvcigiSW52YWxpZCBjbGFzcyBuYW1lICIrYSk7aWYodHlwZW9mIGIhPT0iZnVuY3Rpb24iKXRocm93IEVycm9yKCJJbnZhbGlkIGRlY29yYXRvciBmdW5jdGlvbiAiK2IpO3NjW2FdPWJ9LHVjPXt9LHNjPXt9O3ZhciB2Yz1mdW5jdGlvbihhKXt0aGlzLkE9YX07aWEodmMpO3ZhciB3Yz1mdW5jdGlvbihhLGIpe2EmJihhLnRhYkluZGV4PWI/MDotMSl9LHljPWZ1bmN0aW9uKGEsYixjKXtjLmlkJiZQYihiLGMuaWQpO3ZhciBkPWEuZygpLGU9ITEsZj1MKGMpO2YmJkFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoZixmdW5jdGlvbihoKXtoPT1kP2U9ITA6aCYmdGhpcy51KGIsaCxkKX0sYSk7ZXx8b2MoYyxkKTt4YyhiLGMpO3JldHVybiBjfTt2Yy5wcm90b3R5cGUudT1mdW5jdGlvbihhLGIsYyl7Yj09YysiLWRpc2FibGVkIj9hLlgoITEpOmI9PWMrIi1ob3Jpem9udGFsIj96YyhhLCJob3Jpem9udGFsIik6Yj09YysiLXZlcnRpY2FsIiYmemMoYSwidmVydGljYWwiKX07CnZhciB4Yz1mdW5jdGlvbihhLGIpe2lmKGIpZm9yKHZhciBjPWIuZmlyc3RDaGlsZCxkO2MmJmMucGFyZW50Tm9kZT09Yjspe2Q9Yy5uZXh0U2libGluZztpZihjLm5vZGVUeXBlPT0xKXthOnt2YXIgZT1jO3AoZSk7ZT1MKGUpO2Zvcih2YXIgZj1lLmxlbmd0aCxoPTA7aDxmO2grKyl7dmFyIGs9ZVtoXTtpZihrPWsgaW4gc2M/c2Nba10oKTpudWxsKXtlPWs7YnJlYWsgYX19ZT1udWxsfWUmJihlLmc9YyxhLmlzRW5hYmxlZCgpfHxlLlgoITEpLGEuQmEoZSksU2IoZSxjKSl9ZWxzZSBjLm5vZGVWYWx1ZSYmSGEoYy5ub2RlVmFsdWUpIT0iInx8Yi5yZW1vdmVDaGlsZChjKTtjPWR9fSxBYz1mdW5jdGlvbihhLGIpe2I9Yi5pKCk7cChiLCJUaGUgY29udGFpbmVyIERPTSBlbGVtZW50IGNhbm5vdCBiZSBudWxsLiIpO0tiKGIsdCk7KGE9YS5BKSYmWmIoYixhKX07dmMucHJvdG90eXBlLmc9ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy1jb250YWluZXIifTsKdmMucHJvdG90eXBlLmo9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nKCksYz1bYixhLkw9PSJob3Jpem9udGFsIj9iKyItaG9yaXpvbnRhbCI6YisiLXZlcnRpY2FsIl07YS5pc0VuYWJsZWQoKXx8Yy5wdXNoKGIrIi1kaXNhYmxlZCIpO3JldHVybiBjfTt2YXIgQmM9ZnVuY3Rpb24oKXt9O3ZhciBNPWZ1bmN0aW9uKCl7fSxDYztpYShNKTt2YXIgRGM9e2J1dHRvbjoicHJlc3NlZCIsY2hlY2tib3g6ImNoZWNrZWQiLG1lbnVpdGVtOiJzZWxlY3RlZCIsbWVudWl0ZW1jaGVja2JveDoiY2hlY2tlZCIsbWVudWl0ZW1yYWRpbzoiY2hlY2tlZCIscmFkaW86ImNoZWNrZWQiLHRhYjoic2VsZWN0ZWQiLHRyZWVpdGVtOiJzZWxlY3RlZCJ9O00ucHJvdG90eXBlLk5hPWZ1bmN0aW9uKCl7fTtNLnByb3RvdHlwZS54YT1mdW5jdGlvbihhKXt2YXIgYj1hLkcsYz1iLmgsZD10aGlzLk4oKSxlPVtkXSxmPXRoaXMuTigpO2YhPWQmJmUucHVzaChmKTtkPWEubTtmb3IoZj1bXTtkOyl7dmFyIGg9ZCYtZDtmLnB1c2goRWModGhpcyxoKSk7ZCY9fmh9ZS5wdXNoLmFwcGx5KGUsZik7KGQ9YS5GYSkmJmUucHVzaC5hcHBseShlLGQpO3JldHVybiBjLmNhbGwoYiwiRElWIixlLmpvaW4oIiAiKSxhLmlhKX07Ck0ucHJvdG90eXBlLnlhPWZ1bmN0aW9uKGEsYil7Yi5pZCYmUGIoYSxiLmlkKTtiJiZiLmZpcnN0Q2hpbGQ/RmMoYSxiLmZpcnN0Q2hpbGQubmV4dFNpYmxpbmc/eWEoYi5jaGlsZE5vZGVzKTpiLmZpcnN0Q2hpbGQpOmEuaWE9bnVsbDt2YXIgYz0wLGQ9dGhpcy5OKCksZT10aGlzLk4oKSxmPSExLGg9ITEsaz15YShMKGIpKTtrLmZvckVhY2goZnVuY3Rpb24ocSl7Znx8cSE9ZD9ofHxxIT1lP2N8PUdjKHRoaXMscSk6aD0hMDooZj0hMCxlPT1kJiYoaD0hMCkpO0djKHRoaXMscSk9PTEmJihzYShiKSxkYihiKSYmZWIoYikmJmNiKGIsITEpKX0sdGhpcyk7YS5tPWM7Znx8KGsucHVzaChkKSxlPT1kJiYoaD0hMCkpO2h8fGsucHVzaChlKTsoYT1hLkZhKSYmay5wdXNoLmFwcGx5KGssYSk7ZiYmaCYmIWF8fG1jKGIsay5qb2luKCIgIikpO3JldHVybiBifTsKdmFyIEhjPWZ1bmN0aW9uKGEsYil7aWYoYT1hLk5hKCkpe3AoYiwiVGhlIGVsZW1lbnQgcGFzc2VkIGFzIGEgZmlyc3QgcGFyYW1ldGVyIGNhbm5vdCBiZSBudWxsLiIpO3ZhciBjPWIuZ2V0QXR0cmlidXRlKCJyb2xlIil8fG51bGw7YSE9YyYmWmIoYixhKX19LEljPWZ1bmN0aW9uKGEsYil7dmFyIGM7aWYoYS5EJjMyJiYoYz1hLmkoKSkpe2lmKCFiJiZhLm0mMzIpe3RyeXtjLmJsdXIoKX1jYXRjaChkKXt9YS5tJjMyJiZhLlFhKG51bGwpfShkYihjKSYmZWIoYykpIT1iJiZjYihjLGIpfX0sSmM9ZnVuY3Rpb24oYSxiLGMpe0NjfHwoQ2M9ezE6ImRpc2FibGVkIiw4OiJzZWxlY3RlZCIsMTY6ImNoZWNrZWQiLDY0OiJleHBhbmRlZCJ9KTtwKGEsIlRoZSBlbGVtZW50IHBhc3NlZCBhcyBhIGZpcnN0IHBhcmFtZXRlciBjYW5ub3QgYmUgbnVsbC4iKTtiPUNjW2JdO3ZhciBkPWEuZ2V0QXR0cmlidXRlKCJyb2xlIil8fG51bGw7ZCYmKGQ9RGNbZF18fGIsYj1iPT0iY2hlY2tlZCJ8fGI9PQoic2VsZWN0ZWQiP2Q6Yik7YiYmYWMoYSxiLGMpfTtNLnByb3RvdHlwZS5OPWZ1bmN0aW9uKCl7cmV0dXJuImdvb2ctY29udHJvbCJ9O3ZhciBFYz1mdW5jdGlvbihhLGIpe2EuZ3x8S2MoYSk7cmV0dXJuIGEuZ1tiXX0sR2M9ZnVuY3Rpb24oYSxiKXthLmh8fChhLmd8fEtjKGEpLGEuaD1FYShhLmcpKTthPXBhcnNlSW50KGEuaFtiXSwxMCk7cmV0dXJuIGlzTmFOKGEpPzA6YX0sS2M9ZnVuY3Rpb24oYSl7dmFyIGI9YS5OKCk7dmFyIGM9Yi5yZXBsYWNlKC9ceGEwfFxzL2csIiAiKS5pbmRleE9mKCIgIikhPS0xO3AoIWMsIkNvbnRyb2xSZW5kZXJlciBoYXMgYW4gaW52YWxpZCBjc3MgY2xhc3M6ICciK2IrIiciKTthLmc9ezE6YisiLWRpc2FibGVkIiwyOmIrIi1ob3ZlciIsNDpiKyItYWN0aXZlIiw4OmIrIi1zZWxlY3RlZCIsMTY6YisiLWNoZWNrZWQiLDMyOmIrIi1mb2N1c2VkIiw2NDpiKyItb3BlbiJ9fTt2YXIgTj1mdW5jdGlvbihhLGIsYyl7Ri5jYWxsKHRoaXMsYyk7aWYoIWIpe2ZvcihiPXRoaXMuY29uc3RydWN0b3I7Yjspe3ZhciBkPW5hKGIpO2lmKGQ9dWNbZF0pYnJlYWs7Yj0oYj1PYmplY3QuZ2V0UHJvdG90eXBlT2YoYi5wcm90b3R5cGUpKSYmYi5jb25zdHJ1Y3Rvcn1iPWQ/dHlwZW9mIGQuVj09PSJmdW5jdGlvbiI/ZC5WKCk6bmV3IGQ6bnVsbH10aGlzLnY9Yjt0aGlzLmlhPWEhPT12b2lkIDA/YTpudWxsfTtuKE4sRik7Zz1OLnByb3RvdHlwZTtnLmlhPW51bGw7Zy5tPTA7Zy5EPTM5O2cuUD0wO2cuT2E9ITA7Zy5GYT1udWxsO2cuSGE9ITA7Zy5tYT1mdW5jdGlvbigpe3ZhciBhPXRoaXMudi54YSh0aGlzKTt0aGlzLmc9YTtIYyh0aGlzLnYsYSk7S2IoYSwhMCk7dGhpcy5pc1Zpc2libGUoKXx8KGEuc3R5bGUuZGlzcGxheT0ibm9uZSIsYSYmYWMoYSwiaGlkZGVuIiwhMCkpfTtnLm5hPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaSgpfTtnLndhPWZ1bmN0aW9uKCl7cmV0dXJuITB9OwpnLkVhPWZ1bmN0aW9uKGEpe3RoaXMuZz1hPXRoaXMudi55YSh0aGlzLGEpO0hjKHRoaXMudixhKTtLYihhLCEwKTt0aGlzLk9hPWEuc3R5bGUuZGlzcGxheSE9Im5vbmUifTsKZy5JPWZ1bmN0aW9uKCl7Ti5sLkkuY2FsbCh0aGlzKTt2YXIgYT10aGlzLmc7cChhLCJDYW4gbm90IGNhbGwgZ2V0RWxlbWVudFN0cmljdCBiZWZvcmUgcmVuZGVyaW5nL2RlY29yYXRpbmcuIik7cCh0aGlzKTtwKGEpO3RoaXMuaXNWaXNpYmxlKCl8fGFjKGEsImhpZGRlbiIsIXRoaXMuaXNWaXNpYmxlKCkpO3RoaXMuaXNFbmFibGVkKCl8fEpjKGEsMSwhdGhpcy5pc0VuYWJsZWQoKSk7dGhpcy5EJjgmJkpjKGEsOCwhISh0aGlzLm0mOCkpO3RoaXMuRCYxNiYmSmMoYSwxNiwhISh0aGlzLm0mMTYpKTt0aGlzLkQmNjQmJkpjKGEsNjQsISEodGhpcy5tJjY0KSk7dmFyIGI9dGhpcy52O1ViKHRoaXMpJiYoYT10aGlzLmkoKSxiPWIuTigpKyItcnRsIiwoYT1hLmk/YS5pKCk6YSkmJnBjKGEsW2JdKSk7dGhpcy5pc0VuYWJsZWQoKSYmSWModGhpcyx0aGlzLmlzVmlzaWJsZSgpKTt0aGlzLkQmLTImJih0aGlzLkhhJiZMYyh0aGlzLCEwKSx0aGlzLkQmMzImJihhPXRoaXMuaSgpKSkmJihiPQp0aGlzLlp8fCh0aGlzLlo9bmV3IEopLGdjKGIsYSksQihCKEIoUWIodGhpcyksYiwia2V5Iix0aGlzLmFhKSxhLCJmb2N1cyIsdGhpcy5YYSksYSwiYmx1ciIsdGhpcy5RYSkpfTt2YXIgTGM9ZnVuY3Rpb24oYSxiKXt2YXIgYz1RYihhKSxkPWEuaSgpO2I/KEIoQihCKEIoYyxkLEsuZ2EsYS5zYSksZCxbSy5oYSxLLmZhXSxhLnZhKSxkLCJtb3VzZW92ZXIiLGEudWEpLGQsIm1vdXNlb3V0IixhLnRhKSxhLmNhIT1CYyYmQihjLGQsImNvbnRleHRtZW51IixhLmNhKSk6KEMoQyhDKEMoYyxkLEsuZ2EsYS5zYSksZCxbSy5oYSxLLmZhXSxhLnZhKSxkLCJtb3VzZW92ZXIiLGEudWEpLGQsIm1vdXNlb3V0IixhLnRhKSxhLmNhIT1CYyYmQyhjLGQsImNvbnRleHRtZW51IixhLmNhKSl9O04ucHJvdG90eXBlLlU9ZnVuY3Rpb24oKXtOLmwuVS5jYWxsKHRoaXMpO3RoaXMuWiYma2ModGhpcy5aKTt0aGlzLmlzVmlzaWJsZSgpJiZ0aGlzLmlzRW5hYmxlZCgpJiZJYyh0aGlzLCExKX07Ck4ucHJvdG90eXBlLkM9ZnVuY3Rpb24oKXtOLmwuQy5jYWxsKHRoaXMpO3RoaXMuWiYmKHRoaXMuWi5kaXNwb3NlKCksZGVsZXRlIHRoaXMuWik7ZGVsZXRlIHRoaXMudjt0aGlzLkZhPXRoaXMuaWE9bnVsbH07dmFyIEZjPWZ1bmN0aW9uKGEsYil7YS5pYT1ifTtOLnByb3RvdHlwZS5pc1Zpc2libGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5PYX07Ti5wcm90b3R5cGUuaXNFbmFibGVkPWZ1bmN0aW9uKCl7cmV0dXJuISh0aGlzLm0mMSl9O04ucHJvdG90eXBlLlg9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5oO2ImJnR5cGVvZiBiLmlzRW5hYmxlZD09ImZ1bmN0aW9uIiYmIWIuaXNFbmFibGVkKCl8fCFPKHRoaXMsMSwhYSl8fChhfHwoTWModGhpcywhMSksUCh0aGlzLCExKSksdGhpcy5pc1Zpc2libGUoKSYmSWModGhpcyxhKSxUKHRoaXMsMSwhYSwhMCkpfTt2YXIgUD1mdW5jdGlvbihhLGIpe08oYSwyLGIpJiZUKGEsMixiKX07Ck4ucHJvdG90eXBlLmlzQWN0aXZlPWZ1bmN0aW9uKCl7cmV0dXJuISEodGhpcy5tJjQpfTsKdmFyIE1jPWZ1bmN0aW9uKGEsYil7TyhhLDQsYikmJlQoYSw0LGIpfSxOYz1mdW5jdGlvbihhLGIpe08oYSw4LGIpJiZUKGEsOCxiKX0sT2M9ZnVuY3Rpb24oYSxiKXtPKGEsNjQsYikmJlQoYSw2NCxiKX0sVD1mdW5jdGlvbihhLGIsYyxkKXtpZighZCYmYj09MSlhLlgoIWMpO2Vsc2UgaWYoYS5EJmImJmMhPSEhKGEubSZiKSl7dmFyIGU9YS52O2lmKGQ9YS5pKCkpe2lmKGU9RWMoZSxiKSl7dmFyIGY9YS5pP2EuaSgpOmE7ZiYmKGM/cGM6cmMpKGYsW2VdKX1KYyhkLGIsYyl9YS5tPWM/YS5tfGI6YS5tJn5ifX0sUGM9ZnVuY3Rpb24oYSxiLGMpe2lmKGEucyYmYS5tJmImJiFjKXRocm93IEVycm9yKCJDb21wb25lbnQgYWxyZWFkeSByZW5kZXJlZCIpOyFjJiZhLm0mYiYmVChhLGIsITEpO2EuRD1jP2EuRHxiOmEuRCZ+Yn0sVT1mdW5jdGlvbihhLGIpe3JldHVybiEhKDI1NSZiKSYmISEoYS5EJmIpfSxPPWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4hIShhLkQmYikmJiEhKGEubSZiKSE9CmMmJighKGEuUCZiKXx8RShhLE5iKGIsYykpKSYmIWEuYmF9O04ucHJvdG90eXBlLnVhPWZ1bmN0aW9uKGEpeyFRYyhhLHRoaXMuaSgpKSYmRSh0aGlzLCJlbnRlciIpJiZ0aGlzLmlzRW5hYmxlZCgpJiZVKHRoaXMsMikmJlAodGhpcywhMCl9O04ucHJvdG90eXBlLnRhPWZ1bmN0aW9uKGEpeyFRYyhhLHRoaXMuaSgpKSYmRSh0aGlzLCJsZWF2ZSIpJiYoVSh0aGlzLDQpJiZNYyh0aGlzLCExKSxVKHRoaXMsMikmJlAodGhpcywhMSkpfTtOLnByb3RvdHlwZS5jYT1CYzt2YXIgUWM9ZnVuY3Rpb24oYSxiKXtyZXR1cm4hIWEucmVsYXRlZFRhcmdldCYmYWIoYixhLnJlbGF0ZWRUYXJnZXQpfTsKTi5wcm90b3R5cGUuc2E9ZnVuY3Rpb24oYSl7aWYodGhpcy5pc0VuYWJsZWQoKSYmKFUodGhpcywyKSYmUCh0aGlzLCEwKSwhKGEuaC5idXR0b24hPTB8fHYmJmEuY3RybEtleSkpKXtVKHRoaXMsNCkmJk1jKHRoaXMsITApO3ZhciBiO2lmKGI9dGhpcy52KXt2YXIgYztiPXRoaXMuRCYzMiYmKGM9dGhpcy5pKCkpP2RiKGMpJiZlYihjKTohMX1iJiZ0aGlzLmkoKS5mb2N1cygpfWEuaC5idXR0b24hPTB8fHYmJmEuY3RybEtleXx8YS5qKCl9O04ucHJvdG90eXBlLnZhPWZ1bmN0aW9uKGEpe3RoaXMuaXNFbmFibGVkKCkmJihVKHRoaXMsMikmJlAodGhpcywhMCksdGhpcy5pc0FjdGl2ZSgpJiZSYyh0aGlzLGEpJiZVKHRoaXMsNCkmJk1jKHRoaXMsITEpKX07CnZhciBSYz1mdW5jdGlvbihhLGIpe2lmKFUoYSwxNikpe3ZhciBjPSEoYS5tJjE2KTtPKGEsMTYsYykmJlQoYSwxNixjKX1VKGEsOCkmJk5jKGEsITApO1UoYSw2NCkmJk9jKGEsIShhLm0mNjQpKTtjPW5ldyB5KCJhY3Rpb24iLGEpO2ImJihjLmFsdEtleT1iLmFsdEtleSxjLmN0cmxLZXk9Yi5jdHJsS2V5LGMubWV0YUtleT1iLm1ldGFLZXksYy5zaGlmdEtleT1iLnNoaWZ0S2V5LGMuRz1iLkcsYy50aW1lU3RhbXA9Yi50aW1lU3RhbXApO3JldHVybiBFKGEsYyl9O04ucHJvdG90eXBlLlhhPWZ1bmN0aW9uKCl7VSh0aGlzLDMyKSYmTyh0aGlzLDMyLCEwKSYmVCh0aGlzLDMyLCEwKX07Ti5wcm90b3R5cGUuUWE9ZnVuY3Rpb24oKXtVKHRoaXMsNCkmJk1jKHRoaXMsITEpO1UodGhpcywzMikmJk8odGhpcywzMiwhMSkmJlQodGhpcywzMiwhMSl9OwpOLnByb3RvdHlwZS5hYT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5pc1Zpc2libGUoKSYmdGhpcy5pc0VuYWJsZWQoKSYmYS5nPT0xMyYmUmModGhpcyxhKT8oYS5qKCksYS52KCksITApOiExfTtpZih0eXBlb2YgTiE9PSJmdW5jdGlvbiIpdGhyb3cgRXJyb3IoIkludmFsaWQgY29tcG9uZW50IGNsYXNzICIrTik7aWYodHlwZW9mIE0hPT0iZnVuY3Rpb24iKXRocm93IEVycm9yKCJJbnZhbGlkIHJlbmRlcmVyIGNsYXNzICIrTSk7dmFyIFNjPW5hKE4pO3VjW1NjXT1NO3RjKCJnb29nLWNvbnRyb2wiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBOKG51bGwpfSk7dmFyIFY9ZnVuY3Rpb24oYSxiLGMpe0YuY2FsbCh0aGlzLGMpO3RoaXMuZWE9Ynx8dmMuVigpO3RoaXMuTD1hfHwidmVydGljYWwifTtuKFYsRik7Zz1WLnByb3RvdHlwZTtnLkthPW51bGw7Zy5kYT1udWxsO2cuZWE9bnVsbDtnLkw9bnVsbDtnLlM9ITA7Zy5UPSEwO2cubz0tMTtnLkI9bnVsbDtnLlc9ITE7Zy5PPW51bGw7dmFyIFRjPWZ1bmN0aW9uKGEpe3JldHVybiBhLkthfHxhLmkoKX07Zz1WLnByb3RvdHlwZTtnLm1hPWZ1bmN0aW9uKCl7dGhpcy5nPXRoaXMuRy5oKCJESVYiLHRoaXMuZWEuaih0aGlzKS5qb2luKCIgIikpfTtnLm5hPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaSgpfTtnLndhPWZ1bmN0aW9uKGEpe3JldHVybiBhLnRhZ05hbWU9PSJESVYifTtnLkVhPWZ1bmN0aW9uKGEpe3RoaXMuZz15Yyh0aGlzLmVhLHRoaXMsYSk7YS5zdHlsZS5kaXNwbGF5PT0ibm9uZSImJih0aGlzLlM9ITEpfTsKZy5JPWZ1bmN0aW9uKCl7Vi5sLkkuY2FsbCh0aGlzKTtUYih0aGlzLGZ1bmN0aW9uKGIpe2IucyYmVWModGhpcyxiKX0sdGhpcyk7dmFyIGE9dGhpcy5pKCk7QWModGhpcy5lYSx0aGlzKTtWYyh0aGlzLHRoaXMuUyk7QihCKEIoQihCKEIoQihCKFFiKHRoaXMpLHRoaXMsImVudGVyIix0aGlzLmViKSx0aGlzLCJoaWdobGlnaHQiLHRoaXMuZmIpLHRoaXMsInVuaGlnaGxpZ2h0Iix0aGlzLmxiKSx0aGlzLCJvcGVuIix0aGlzLmdiKSx0aGlzLCJjbG9zZSIsdGhpcy5iYiksYSxLLmdhLHRoaXMuV2EpLGJiKGEpLFtLLmhhLEsuZmFdLHRoaXMuY2IpLGEsW0suZ2EsSy5oYSxLLmZhLCJtb3VzZW92ZXIiLCJtb3VzZW91dCIsImNvbnRleHRtZW51Il0sdGhpcy5hYik7V2ModGhpcyl9O3ZhciBXYz1mdW5jdGlvbihhKXt2YXIgYj1RYihhKSxjPVRjKGEpO0IoQihCKGIsYywiZm9jdXMiLGEuUGEpLGMsImJsdXIiLGEuVWEpLGEuZGF8fChhLmRhPW5ldyBKKFRjKGEpKSksImtleSIsYS5WYSl9OwpnPVYucHJvdG90eXBlO2cuVT1mdW5jdGlvbigpe1hjKHRoaXMsLTEpO3RoaXMuQiYmT2ModGhpcy5CLCExKTt0aGlzLlc9ITE7Vi5sLlUuY2FsbCh0aGlzKX07Zy5DPWZ1bmN0aW9uKCl7Vi5sLkMuY2FsbCh0aGlzKTt0aGlzLmRhJiYodGhpcy5kYS5kaXNwb3NlKCksdGhpcy5kYT1udWxsKTt0aGlzLmVhPXRoaXMuQj10aGlzLk89dGhpcy5LYT1udWxsfTtnLmViPWZ1bmN0aW9uKCl7cmV0dXJuITB9OwpnLmZiPWZ1bmN0aW9uKGEpe3ZhciBiPVZiKHRoaXMsYS50YXJnZXQpO2lmKGI+LTEmJmIhPXRoaXMubyl7dmFyIGM9SSh0aGlzLHRoaXMubyk7YyYmUChjLCExKTt0aGlzLm89YjtjPUkodGhpcyx0aGlzLm8pO3RoaXMuVyYmTWMoYywhMCk7dGhpcy5CJiZjIT10aGlzLkImJihjLkQmNjQ/T2MoYywhMCk6T2ModGhpcy5CLCExKSl9Yj10aGlzLmkoKTtwKGIsIlRoZSBET00gZWxlbWVudCBmb3IgdGhlIGNvbnRhaW5lciBjYW5ub3QgYmUgbnVsbC4iKTthLnRhcmdldC5pKCkhPW51bGwmJmFjKGIsImFjdGl2ZWRlc2NlbmRhbnQiLGEudGFyZ2V0LmkoKS5pZCl9O2cubGI9ZnVuY3Rpb24oYSl7YS50YXJnZXQ9PUkodGhpcyx0aGlzLm8pJiYodGhpcy5vPS0xKTthPXRoaXMuaSgpO3AoYSwiVGhlIERPTSBlbGVtZW50IGZvciB0aGUgY29udGFpbmVyIGNhbm5vdCBiZSBudWxsLiIpO2EucmVtb3ZlQXR0cmlidXRlKCRiKCJhY3RpdmVkZXNjZW5kYW50IikpfTsKZy5nYj1mdW5jdGlvbihhKXsoYT1hLnRhcmdldCkmJmEhPXRoaXMuQiYmYS5oPT10aGlzJiYodGhpcy5CJiZPYyh0aGlzLkIsITEpLHRoaXMuQj1hKX07Zy5iYj1mdW5jdGlvbihhKXthLnRhcmdldD09dGhpcy5CJiYodGhpcy5CPW51bGwpO3ZhciBiPXRoaXMuaSgpLGM9YS50YXJnZXQuaSgpO2ImJmEudGFyZ2V0Lm0mMiYmYyYmKGE9IiIsYyYmKGE9Yy5pZCxwKGEsIlRoZSBhY3RpdmUgZWxlbWVudCBzaG91bGQgaGF2ZSBhbiBpZC4iKSksYWMoYiwiYWN0aXZlZGVzY2VuZGFudCIsYSkpfTtnLldhPWZ1bmN0aW9uKGEpe3RoaXMuVCYmKHRoaXMuVz0hMCk7dmFyIGI9VGModGhpcyk7YiYmZGIoYikmJmViKGIpP2IuZm9jdXMoKTphLmooKX07Zy5jYj1mdW5jdGlvbigpe3RoaXMuVz0hMX07CmcuYWI9ZnVuY3Rpb24oYSl7YTp7dmFyIGI9YS50YXJnZXQ7aWYodGhpcy5PKWZvcih2YXIgYz10aGlzLmkoKTtiJiZiIT09Yzspe3ZhciBkPWIuaWQ7aWYoZCBpbiB0aGlzLk8pe2I9dGhpcy5PW2RdO2JyZWFrIGF9Yj1iLnBhcmVudE5vZGV9Yj1udWxsfWlmKGIpc3dpdGNoKGEudHlwZSl7Y2FzZSBLLmdhOmIuc2EoYSk7YnJlYWs7Y2FzZSBLLmhhOmNhc2UgSy5mYTpiLnZhKGEpO2JyZWFrO2Nhc2UgIm1vdXNlb3ZlciI6Yi51YShhKTticmVhaztjYXNlICJtb3VzZW91dCI6Yi50YShhKTticmVhaztjYXNlICJjb250ZXh0bWVudSI6Yi5jYShhKX19O2cuUGE9ZnVuY3Rpb24oKXt9O2cuVWE9ZnVuY3Rpb24oKXtYYyh0aGlzLC0xKTt0aGlzLlc9ITE7dGhpcy5CJiZPYyh0aGlzLkIsITEpfTsKZy5WYT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5pc0VuYWJsZWQoKSYmdGhpcy5pc1Zpc2libGUoKSYmKEgodGhpcykhPTB8fHRoaXMuS2EpJiZZYyh0aGlzLGEpPyhhLmooKSxhLnYoKSwhMCk6ITF9Owp2YXIgWWM9ZnVuY3Rpb24oYSxiKXt2YXIgYz1JKGEsYS5vKTtpZihjJiZ0eXBlb2YgYy5hYT09ImZ1bmN0aW9uIiYmYy5hYShiKXx8YS5CJiZhLkIhPWMmJnR5cGVvZiBhLkIuYWE9PSJmdW5jdGlvbiImJmEuQi5hYShiKSlyZXR1cm4hMDtpZihiLnNoaWZ0S2V5fHxiLmN0cmxLZXl8fGIubWV0YUtleXx8Yi5hbHRLZXkpcmV0dXJuITE7c3dpdGNoKGIuZyl7Y2FzZSAyNzpUYyhhKS5ibHVyKCk7YnJlYWs7Y2FzZSAzNjpaYyhhKTticmVhaztjYXNlIDM1OiRjKGEpO2JyZWFrO2Nhc2UgMzg6aWYoYS5MPT0idmVydGljYWwiKWFkKGEpO2Vsc2UgcmV0dXJuITE7YnJlYWs7Y2FzZSAzNzppZihhLkw9PSJob3Jpem9udGFsIilVYihhKT9iZChhKTphZChhKTtlbHNlIHJldHVybiExO2JyZWFrO2Nhc2UgNDA6aWYoYS5MPT0idmVydGljYWwiKWJkKGEpO2Vsc2UgcmV0dXJuITE7YnJlYWs7Y2FzZSAzOTppZihhLkw9PSJob3Jpem9udGFsIilVYihhKT9hZChhKTpiZChhKTtlbHNlIHJldHVybiExOwpicmVhaztkZWZhdWx0OnJldHVybiExfXJldHVybiEwfSxVYz1mdW5jdGlvbihhLGIpe3ZhciBjPWIuaSgpO2M9Yy5pZHx8KGMuaWQ9T2IoYikpO2EuT3x8KGEuTz17fSk7YS5PW2NdPWJ9O1YucHJvdG90eXBlLkJhPWZ1bmN0aW9uKGEsYil7dWEoYSxOLCJUaGUgY2hpbGQgb2YgYSBjb250YWluZXIgbXVzdCBiZSBhIGNvbnRyb2wiKTtWLmwuQmEuY2FsbCh0aGlzLGEsYil9O1YucHJvdG90eXBlLkNhPWZ1bmN0aW9uKGEsYixjKXt1YShhLE4pO2EuUHw9MjthLlB8PTY0O1BjKGEsMzIsITEpO2EucyYmMCE9YS5IYSYmTGMoYSwhMSk7YS5IYT0hMTt2YXIgZD1hLmg9PXRoaXM/VmIodGhpcyxhKTotMTtWLmwuQ2EuY2FsbCh0aGlzLGEsYixjKTthLnMmJnRoaXMucyYmVWModGhpcyxhKTthPWQ7YT09LTEmJihhPUgodGhpcykpO2E9PXRoaXMubz90aGlzLm89TWF0aC5taW4oSCh0aGlzKS0xLGIpOmE+dGhpcy5vJiZiPD10aGlzLm8/dGhpcy5vKys6YTx0aGlzLm8mJmI+dGhpcy5vJiZ0aGlzLm8tLX07CnZhciB6Yz1mdW5jdGlvbihhLGIpe2lmKGEuaSgpKXRocm93IEVycm9yKCJDb21wb25lbnQgYWxyZWFkeSByZW5kZXJlZCIpO2EuTD1ifTtWLnByb3RvdHlwZS5pc1Zpc2libGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5TfTt2YXIgVmM9ZnVuY3Rpb24oYSxiKXthLlM9Yjt2YXIgYz1hLmkoKTtjJiYoYy5zdHlsZS5kaXNwbGF5PWI/IiI6Im5vbmUiLHdjKFRjKGEpLGEuVCYmYS5TKSl9O1YucHJvdG90eXBlLmlzRW5hYmxlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLlR9O1YucHJvdG90eXBlLlg9ZnVuY3Rpb24oYSl7dGhpcy5UIT1hJiZFKHRoaXMsYT8iZW5hYmxlIjoiZGlzYWJsZSIpJiYoYT8odGhpcy5UPSEwLFRiKHRoaXMsZnVuY3Rpb24oYil7Yi5UYT9kZWxldGUgYi5UYTpiLlgoITApfSkpOihUYih0aGlzLGZ1bmN0aW9uKGIpe2IuaXNFbmFibGVkKCk/Yi5YKCExKTpiLlRhPSEwfSksdGhpcy5XPXRoaXMuVD0hMSksd2MoVGModGhpcyksYSYmdGhpcy5TKSl9Owp2YXIgWGM9ZnVuY3Rpb24oYSxiKXsoYj1JKGEsYikpP1AoYiwhMCk6YS5vPi0xJiZQKEkoYSxhLm8pLCExKX0sWmM9ZnVuY3Rpb24oYSl7Y2QoYSxmdW5jdGlvbihiLGMpe3JldHVybihiKzEpJWN9LEgoYSktMSl9LCRjPWZ1bmN0aW9uKGEpe2NkKGEsZnVuY3Rpb24oYixjKXtiLS07cmV0dXJuIGI8MD9jLTE6Yn0sMCl9LGJkPWZ1bmN0aW9uKGEpe2NkKGEsZnVuY3Rpb24oYixjKXtyZXR1cm4oYisxKSVjfSxhLm8pfSxhZD1mdW5jdGlvbihhKXtjZChhLGZ1bmN0aW9uKGIsYyl7Yi0tO3JldHVybiBiPDA/Yy0xOmJ9LGEubyl9LGNkPWZ1bmN0aW9uKGEsYixjKXtjPWM8MD9WYihhLGEuQik6Yzt2YXIgZD1IKGEpO2M9Yi5jYWxsKGEsYyxkKTtmb3IodmFyIGU9MDtlPD1kOyl7dmFyIGY9SShhLGMpO2lmKGYmJmYuaXNWaXNpYmxlKCkmJmYuaXNFbmFibGVkKCkmJmYuRCYyKXthLkxhKGMpO2JyZWFrfWUrKztjPWIuY2FsbChhLGMsZCl9fTsKVi5wcm90b3R5cGUuTGE9ZnVuY3Rpb24oYSl7WGModGhpcyxhKX07dmFyIGRkPWZ1bmN0aW9uKCl7fTtuKGRkLE0pO2lhKGRkKTtnPWRkLnByb3RvdHlwZTtnLk49ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy10YWIifTtnLk5hPWZ1bmN0aW9uKCl7cmV0dXJuInRhYiJ9O2cueGE9ZnVuY3Rpb24oYSl7dmFyIGI9ZGQubC54YS5jYWxsKHRoaXMsYSk7KGE9YS5HYSgpKSYmdGhpcy5NYShiLGEpO3JldHVybiBifTtnLnlhPWZ1bmN0aW9uKGEsYil7Yj1kZC5sLnlhLmNhbGwodGhpcyxhLGIpO3ZhciBjPXRoaXMuR2EoYik7YyYmKGEuUmE9Yyk7YS5tJjgmJihjPWEuaCkmJnR5cGVvZiBjLko9PT0iZnVuY3Rpb24iJiYoVChhLDgsITEpLGMuSihhKSk7cmV0dXJuIGJ9O2cuR2E9ZnVuY3Rpb24oYSl7cmV0dXJuIGEudGl0bGV8fCIifTtnLk1hPWZ1bmN0aW9uKGEsYil7YSYmKGEudGl0bGU9Ynx8IiIpfTt2YXIgZWQ9ZnVuY3Rpb24oYSxiLGMpe04uY2FsbCh0aGlzLGEsYnx8ZGQuVigpLGMpO1BjKHRoaXMsOCwhMCk7dGhpcy5QfD05fTtuKGVkLE4pO2VkLnByb3RvdHlwZS5HYT1mdW5jdGlvbigpe3JldHVybiB0aGlzLlJhfTtlZC5wcm90b3R5cGUuTWE9ZnVuY3Rpb24oYSl7dGhpcy52Lk1hKHRoaXMuaSgpLGEpO3RoaXMuUmE9YX07dGMoImdvb2ctdGFiIixmdW5jdGlvbigpe3JldHVybiBuZXcgZWQobnVsbCl9KTt2YXIgVz1mdW5jdGlvbigpe3RoaXMuQT0idGFibGlzdCJ9O24oVyx2Yyk7aWEoVyk7Vy5wcm90b3R5cGUuZz1mdW5jdGlvbigpe3JldHVybiJnb29nLXRhYi1iYXIifTtXLnByb3RvdHlwZS51PWZ1bmN0aW9uKGEsYixjKXt0aGlzLnZ8fCh0aGlzLmh8fGZkKHRoaXMpLHRoaXMudj1FYSh0aGlzLmgpKTt2YXIgZD10aGlzLnZbYl07ZD8oemMoYSxnZChkKSksYS52PWQpOlcubC51LmNhbGwodGhpcyxhLGIsYyl9O1cucHJvdG90eXBlLmo9ZnVuY3Rpb24oYSl7dmFyIGI9Vy5sLmouY2FsbCh0aGlzLGEpO3RoaXMuaHx8ZmQodGhpcyk7Yi5wdXNoKHRoaXMuaFthLnZdKTtyZXR1cm4gYn07dmFyIGZkPWZ1bmN0aW9uKGEpe3ZhciBiPWEuZygpO2EuaD17dG9wOmIrIi10b3AiLGJvdHRvbTpiKyItYm90dG9tIixzdGFydDpiKyItc3RhcnQiLGVuZDpiKyItZW5kIn19O3ZhciBYPWZ1bmN0aW9uKGEsYixjKXthPWF8fCJ0b3AiO3pjKHRoaXMsZ2QoYSkpO3RoaXMudj1hO1YuY2FsbCh0aGlzLHRoaXMuTCxifHxXLlYoKSxjKTtoZCh0aGlzKX07bihYLFYpO2c9WC5wcm90b3R5cGU7Zy5IPW51bGw7Zy5JPWZ1bmN0aW9uKCl7WC5sLkkuY2FsbCh0aGlzKTtoZCh0aGlzKX07Zy5DPWZ1bmN0aW9uKCl7WC5sLkMuY2FsbCh0aGlzKTt0aGlzLkg9bnVsbH07Zy5MYT1mdW5jdGlvbihhKXtYLmwuTGEuY2FsbCh0aGlzLGEpO3RoaXMuSihJKHRoaXMsYSkpfTtnLko9ZnVuY3Rpb24oYSl7YT9OYyhhLCEwKTp0aGlzLkgmJk5jKHRoaXMuSCwhMSl9Owp2YXIgaWQ9ZnVuY3Rpb24oYSxiKXtpZihiJiZiPT1hLkgpe2Zvcih2YXIgYz1WYihhLGIpLGQ9Yy0xO2I9SShhLGQpO2QtLSl7dmFyIGU9YjtpZihlLmlzVmlzaWJsZSgpJiZlLmlzRW5hYmxlZCgpKXthLkooYik7cmV0dXJufX1mb3IoYys9MTtiPUkoYSxjKTtjKyspaWYoZD1iLGQuaXNWaXNpYmxlKCkmJmQuaXNFbmFibGVkKCkpe2EuSihiKTtyZXR1cm59YS5KKG51bGwpfX07Zz1YLnByb3RvdHlwZTtnLmpiPWZ1bmN0aW9uKGEpe3RoaXMuSCYmdGhpcy5IIT1hLnRhcmdldCYmTmModGhpcy5ILCExKTt0aGlzLkg9YS50YXJnZXR9O2cua2I9ZnVuY3Rpb24oYSl7YS50YXJnZXQ9PXRoaXMuSCYmKHRoaXMuSD1udWxsKX07Zy5oYj1mdW5jdGlvbihhKXtpZCh0aGlzLGEudGFyZ2V0KX07Zy5pYj1mdW5jdGlvbihhKXtpZCh0aGlzLGEudGFyZ2V0KX07Zy5QYT1mdW5jdGlvbigpe0kodGhpcyx0aGlzLm8pfHxYYyh0aGlzLFZiKHRoaXMsdGhpcy5IfHxJKHRoaXMsMCkpKX07CnZhciBoZD1mdW5jdGlvbihhKXtCKEIoQihCKFFiKGEpLGEsInNlbGVjdCIsYS5qYiksYSwidW5zZWxlY3QiLGEua2IpLGEsImRpc2FibGUiLGEuaGIpLGEsImhpZGUiLGEuaWIpfSxnZD1mdW5jdGlvbihhKXtyZXR1cm4gYT09InN0YXJ0Inx8YT09ImVuZCI/InZlcnRpY2FsIjoiaG9yaXpvbnRhbCJ9O3RjKCJnb29nLXRhYi1iYXIiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBYfSk7ZnVuY3Rpb24gamQoYSl7dmFyIGI9e3RvcDoiYm90dG9tIixib3R0b206InRvcCIsc3RhcnQ6InJpZ2h0IixlbmQ6ImxlZnQifVthLmxvY2F0aW9uXSxjPWEuZWxlbWVudElkLGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTtkLnRleHRDb250ZW50PSJcbiAgICBmaWVsZHNldCB7XG4gICAgICBwYWRkaW5nOiAxMHB4O1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgIzM2OTtcbiAgICB9XG5cbiAgICAjIitjKyIgLmdvb2ctdGFiLWNvbnRlbnQge1xuICAgICAgbWluLWhlaWdodDogM2VtO1xuICAgICAgbWFyZ2luOiAwO1xuICAgICAgYm9yZGVyOiAiK2EuYm9yZGVyKyIgc29saWQgIithLmJvcmRlckNvbG9yKyI7XG4gICAgICBib3JkZXItdG9wOiAwO1xuICAgICAgaGVpZ2h0OiAiK2EuY29udGVudEhlaWdodCsiO1xuICAgICAgcGFkZGluZzogNHB4IDhweDtcbiAgICAgIG1hcmdpbi1yaWdodDogNHB4O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgIG92ZXJmbG93OiBhdXRvO1xuICAgIH1cblxuICAgICMiKwpjKyIgLmdvb2ctdGFiLWJhci0iK2EubG9jYXRpb24rIiAuZ29vZy10YWItc2VsZWN0ZWQge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICIrYS5ib3JkZXJDb2xvcisiO1xuICAgICAgYm9yZGVyLSIrYisiOiAwcHg7XG4gICAgfVxuXG4gICAgIyIrYysiIC5nb29nLXRhYi1iYXItIithLmxvY2F0aW9uKyIge1xuICAgICAgcGFkZGluZy0iK2EubG9jYXRpb24rIjogNXB4ICFpbXBvcnRhbnQ7XG4gICAgICBib3JkZXItIitiKyI6IDFweCBzb2xpZCAiK2EuYm9yZGVyQ29sb3IrIiAhaW1wb3J0YW50O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICB9XG5cbiAgICAjIitjKyIgLmdvb2ctdGFiLWJhciB7XG4gICAgICAgbWFyZ2luOiAwO1xuICAgICAgIGJvcmRlcjogMDtcbiAgICAgICBwYWRkaW5nOiAwO1xuICAgICAgIGxpc3Qtc3R5bGU6IG5vbmU7XG4gICAgICAgY3Vyc29yOiBkZWZhdWx0O1xuICAgICAgIG91dGxpbmU6IG5vbmU7XG4gICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgICBtYXJnaW4tcmlnaHQ6IDRweDtcbiAgICAgIH1cblxuICAgICAjIisKYysiIC5nb29nLXRhYiB7XG4gICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgIHBhZGRpbmc6IDRweCA4cHg7XG4gICAgICAgY29sb3I6IHZhcigtLWNvbGFiLXByaW1hcnktdGV4dC1jb2xvcik7XG4gICAgICAgdGV4dC1kZWNvcmF0aW9uOiBpbml0aWFsO1xuICAgICAgIGN1cnNvcjogZGVmYXVsdDtcbiAgICAgIH1cblxuICAgICAgIyIrYysiIC5nb29nLXRhYi1ob3ZlciB7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWNvbGFiLWhpZ2hsaWdodGVkLXN1cmZhY2UtY29sb3IpO1xuICAgICAgfVxuICAgICAgIjtyZXR1cm4gZH0KdmFyIGtkPWZ1bmN0aW9uKGEpe3ZhciBiPWEuZWxlbWVudElkLGM9YS50YWJOYW1lcyxkPWEuc2VsZWN0ZWRJbmRleDsiY29udGVudEJvcmRlciJpbiBhfHwoYS5jb250ZW50Qm9yZGVyPSIwcHgiKTsiY29udGVudEhlaWdodCJpbiBhfHwoYS5jb250ZW50SGVpZ2h0PSJpbml0aWFsIik7ImJvcmRlckNvbG9yImluIGF8fChhLmJvcmRlckNvbG9yPSJ2YXIoLS1jb2xhYi1ib3JkZXItY29sb3IpIik7YS5sb2NhdGlvbnx8KGEubG9jYXRpb249InRvcCIpO3ZhciBlPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiMiK2IpLGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zi5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYi1iYXIiKTt2YXIgaD1hLmxvY2F0aW9uO2YuY2xhc3NMaXN0LmFkZCgiZ29vZy10YWItYmFyLSIraCk7Zm9yKHZhciBrPVtdLHE9ZmEoYyksRz1xLm5leHQoKTshRy5kb25lO0c9cS5uZXh0KCkpe0c9Ry52YWx1ZTt2YXIgeD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKeC5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYiIpO3gudGV4dENvbnRlbnQ9RztmLmFwcGVuZENoaWxkKHgpO2sucHVzaCh4KX1oIT0iYm90dG9tIiYmZS5hcHBlbmRDaGlsZChmKTtxPW51bGw7aWYoaD09InRvcCJ8fGg9PSJib3R0b20iKXE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikscS5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYi1iYXItY2xlYXIiKTtoPT0idG9wIiYmcSYmZS5hcHBlbmRDaGlsZChxKTtHPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO0cuY2xhc3NMaXN0LmFkZCgiZ29vZy10YWItY29udGVudCIpO3ZhciBoYT1bXTtjPWZhKGMpO2Zvcih4PWMubmV4dCgpOyF4LmRvbmU7eD1jLm5leHQoKSl4PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHguaWQ9ZS5pZCsiX2NvbnRlbnRfIitoYS5sZW5ndGgseC5zdHlsZS5kaXNwbGF5PSJub25lIixHLmFwcGVuZENoaWxkKHgpLGhhLnB1c2goeCk7ZS5hcHBlbmRDaGlsZChHKTtoPT0iYm90dG9tIiYmKHEmJgplLmFwcGVuZENoaWxkKHEpLGUuYXBwZW5kQ2hpbGQoZikpO3ZhciBRPW5ldyBYKGgpO1NiKFEsZik7dmFyIFI9LTE7d2IoUSwic2VsZWN0IixmdW5jdGlvbihTKXtTPWsuaW5kZXhPZihTLnRhcmdldC5pKCkpO1MhPVImJihSPj0wJiZSPGhhLmxlbmd0aCYmKGhhW1JdLnN0eWxlLmRpc3BsYXk9Im5vbmUiLFI9LTEpLFM+PTAmJlM8aGEubGVuZ3RoJiYoUj1TLGhhW1JdLnN0eWxlLmRpc3BsYXk9ImlubGluZSIsd2luZG93LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCJyZXNpemUiKSksZ29vZ2xlLmNvbGFiLm91dHB1dC5yZXNpemVJZnJhbWVUb0NvbnRlbnQoKSksUS5KKEkoUSxSKSkpfSk7US5KKEkoUSxkKSk7d2luZG93W2JdPXtzZXRTZWxlY3RlZFRhYkluZGV4OmZ1bmN0aW9uKFMpe1EuSihJKFEsUykpfX07ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChqZChhKSl9LGxkPVsiY29sYWJfbGliIiwiY3JlYXRlVGFiQmFyIl0sWT1sOwpsZFswXWluIFl8fHR5cGVvZiBZLmV4ZWNTY3JpcHQ9PSJ1bmRlZmluZWQifHxZLmV4ZWNTY3JpcHQoInZhciAiK2xkWzBdKTtmb3IodmFyIFo7bGQubGVuZ3RoJiYoWj1sZC5zaGlmdCgpKTspbGQubGVuZ3RofHxrZD09PXZvaWQgMD9ZW1pdJiZZW1pdIT09T2JqZWN0LnByb3RvdHlwZVtaXT9ZPVlbWl06WT1ZW1pdPXt9OllbWl09a2Q7fSkuY2FsbCh0aGlzKTsKLy8gY2xhbmctZm9ybWF0IG9uCg==", + "ok": true, + "headers": [ + [ + "content-length", + "41785" + ], + [ + "content-type", + "application/javascript" + ] + ], + "status": 200, + "status_text": "" + } + }, + "base_uri": "https://localhost:8080/", + "height": 229 + }, + "outputId": "f69e7dfa-02a3-45a6-9843-0969bbf713e4" + }, + "source": [ + "%%logica StructureTest\n", + "\n", + "StructureTest(a: {x: 1, y: 2, z: { w: \"hello\", v: \"world\"}});\n", + "StructureTest(a: {x: 3, y: 4, z: { w: \"bonjour\", v: \"monde\"}});" + ], + "execution_count": 7, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e4fa6ffc-d22c-11ef-a7c0-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id7\", \"tabNames\": [\"StructureTest\", \"(Log)\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_fca369064c" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e4fad56e-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id7\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_1afb606cbe" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e4fca150-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_9c88059347" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e4fd263e-d22c-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id7_content_1\");\n", + "//# sourceURL=js_b4d0d9296a" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e4fd7ed6-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"e4fd263e-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_3f2ddef454" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e4fe055e-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id7\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_3204661b0a" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e500c618-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"e4fca150-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_44e387de1e" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e502d80e-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_91ce8b7ff8" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e5032b88-d22c-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id7_content_0\");\n", + "//# sourceURL=js_b8df3fd8ca" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e503bb98-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"e5032b88-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_002cf005f5" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e5043082-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id7\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_7e50461550" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e50718ce-d22c-11ef-a7c0-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id8\", \"tabNames\": [\"SQL\", \"Result\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_92fd36b820" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e50768ce-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id8\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_7ba0cc4d96" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e508db46-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_d56ab077ec" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e5093b04-d22c-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id8_content_0\");\n", + "//# sourceURL=js_0b9d612862" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e5098d3e-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"e5093b04-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_570117b13d" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e509db86-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id8\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_335435b4fa" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The following query is stored at \u001b[1mStructureTest_sql\u001b[0m variable.\n", + "-- Initializing DuckDB environment.\n", + "create schema if not exists logica_home;\n", + "-- Empty record, has to have a field by DuckDB syntax.\n", + "drop type if exists logicarecord893574736 cascade; create type logicarecord893574736 as struct(nirvana numeric);\n", + "create sequence if not exists eternal_logical_sequence;\n", + "\n", + "\n", + "-- Logica type: logicarecord481217614\n", + "drop type if exists logicarecord481217614 cascade; create type logicarecord481217614 as struct(r logicarecord893574736);\n", + "\n", + "-- Logica type: logicarecord383307722\n", + "drop type if exists logicarecord383307722 cascade; create type logicarecord383307722 as struct(a timestamp);\n", + "\n", + "-- Logica type: logicarecord894559028\n", + "drop type if exists logicarecord894559028 cascade; create type logicarecord894559028 as struct(v text, w text);\n", + "\n", + "-- Logica type: logicarecord420398671\n", + "drop type if exists logicarecord420398671 cascade; create type logicarecord420398671 as struct(x numeric, y numeric, z logicarecord894559028);\n", + "SELECT * FROM (\n", + " \n", + " SELECT\n", + " {x: 1, y: 2, z: {w: 'hello', v: 'world'}} AS a\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " {x: 3, y: 4, z: {w: 'bonjour', v: 'monde'}} AS a\n", + " \n", + ") AS UNUSED_TABLE_NAME ;\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e50b0114-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"e508db46-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_214cd1efa1" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e50cd610-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_9d87ac7e2a" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e50d3ae2-d22c-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id8_content_1\");\n", + "//# sourceURL=js_4e4dde3d07" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e50d88bc-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"e50d3ae2-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_146b578c3f" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e50de1ae-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id8\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_113e815590" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The following table is stored at \u001b[1mStructureTest\u001b[0m variable.\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
a
0{'x': 1, 'y': 2, 'z': {'w': 'hello', 'v': 'world'}}
1{'x': 3, 'y': 4, 'z': {'w': 'bonjour', 'v': 'monde'}}
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e50f4bfc-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"e50cd610-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_9c2c47c72e" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e510b96a-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"e502d80e-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_78f068fd52" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e5125928-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_32adbbec74" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e512ae00-d22c-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id7_content_1\");\n", + "//# sourceURL=js_8a2e35552c" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e51301a2-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"e512ae00-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_86f18752b6" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e513536e-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id7\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_65f90465ba" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "image/svg+xml": "\n\n\n\n\n\nConcertina\n\n\n\nStructureTest\n\nStructureTest\n\n\n\n", + "text/plain": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Running predicate: StructureTest (7 ms)\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e52d3414-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"e5125928-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_4b78a99ad1" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e52f0050-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_d1ce8d2bb1" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e52f5014-d22c-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id7_content_0\");\n", + "//# sourceURL=js_ea7bf3b0b4" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e52f9b0a-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"e52f5014-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_d5b5c07754" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e52fe3ee-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id7\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_3d597c1e0b" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e5316002-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_445afb5c6e" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e531a90e-d22c-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id8_content_1\");\n", + "//# sourceURL=js_4d493cf0b3" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e531f558-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"e531a90e-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_66c46f7d0a" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e5324026-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id8\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_fd7dbf01cc" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e53496fa-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"e5316002-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_0897d2512f" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + " \n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e5361ec6-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"e52f0050-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_d10b8ec649" + ] + }, + "metadata": {} + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "4sV4SJjMnRKs", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "56858bba-7e55-4342-f6e5-4da67653d09f" + }, + "source": [ + "print(StructureTest['a'].values[0]['z']['w'])" + ], + "execution_count": 8, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "hello\n" + ] + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "IWqb0W3-Z2Ji" + }, + "source": [ + "### Variables\n", + "\n", + "You can define auxiliary variables. Both assignment and comparison is done via `==`. A single equality sign is reserved for function definition (see Functions section)." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "irse8Jg7XQMD", + "colab": { + "resources": { + "http://localhost:8080/nbextensions/google.colab/tabbar.css": { + "data": "Lmdvb2ctdGFie3Bvc2l0aW9uOnJlbGF0aXZlO3BhZGRpbmc6NHB4IDhweDtjb2xvcjojMDBjO3RleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7Y3Vyc29yOmRlZmF1bHR9Lmdvb2ctdGFiLWJhci10b3AgLmdvb2ctdGFie21hcmdpbjoxcHggNHB4IDAgMDtib3JkZXItYm90dG9tOjA7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLXRvcDphZnRlciwuZ29vZy10YWItYmFyLWJvdHRvbTphZnRlcntjb250ZW50OiIgIjtkaXNwbGF5OmJsb2NrO2hlaWdodDowO2NsZWFyOmJvdGg7dmlzaWJpbGl0eTpoaWRkZW59Lmdvb2ctdGFiLWJhci1ib3R0b20gLmdvb2ctdGFie21hcmdpbjowIDRweCAxcHggMDtib3JkZXItdG9wOjA7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLXN0YXJ0IC5nb29nLXRhYnttYXJnaW46MCAwIDRweCAxcHg7Ym9yZGVyLXJpZ2h0OjB9Lmdvb2ctdGFiLWJhci1lbmQgLmdvb2ctdGFie21hcmdpbjowIDFweCA0cHggMDtib3JkZXItbGVmdDowfS5nb29nLXRhYi1ob3ZlcntiYWNrZ3JvdW5kOiNlZWV9Lmdvb2ctdGFiLWRpc2FibGVke2NvbG9yOiM2NjZ9Lmdvb2ctdGFiLXNlbGVjdGVke2NvbG9yOiMwMDA7YmFja2dyb3VuZDojZmZmO3RleHQtZGVjb3JhdGlvbjpub25lO2ZvbnQtd2VpZ2h0OmJvbGQ7Ym9yZGVyOjFweCBzb2xpZCAjNmI5MGRhfS5nb29nLXRhYi1iYXItdG9we3BhZGRpbmctdG9wOjVweCFpbXBvcnRhbnQ7cGFkZGluZy1sZWZ0OjVweCFpbXBvcnRhbnQ7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgIzZiOTBkYSFpbXBvcnRhbnR9Lmdvb2ctdGFiLWJhci10b3AgLmdvb2ctdGFiLXNlbGVjdGVke3RvcDoxcHg7bWFyZ2luLXRvcDowO3BhZGRpbmctYm90dG9tOjVweH0uZ29vZy10YWItYmFyLWJvdHRvbSAuZ29vZy10YWItc2VsZWN0ZWR7dG9wOi0xcHg7bWFyZ2luLWJvdHRvbTowO3BhZGRpbmctdG9wOjVweH0uZ29vZy10YWItYmFyLXN0YXJ0IC5nb29nLXRhYi1zZWxlY3RlZHtsZWZ0OjFweDttYXJnaW4tbGVmdDowO3BhZGRpbmctcmlnaHQ6OXB4fS5nb29nLXRhYi1iYXItZW5kIC5nb29nLXRhYi1zZWxlY3RlZHtsZWZ0Oi0xcHg7bWFyZ2luLXJpZ2h0OjA7cGFkZGluZy1sZWZ0OjlweH0uZ29vZy10YWItYmFye21hcmdpbjowO2JvcmRlcjowO3BhZGRpbmc6MDtsaXN0LXN0eWxlOm5vbmU7Y3Vyc29yOmRlZmF1bHQ7b3V0bGluZTpub25lO2JhY2tncm91bmQ6I2ViZWZmOX0uZ29vZy10YWItYmFyLWNsZWFye2NsZWFyOmJvdGg7aGVpZ2h0OjA7b3ZlcmZsb3c6aGlkZGVufS5nb29nLXRhYi1iYXItc3RhcnR7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLWVuZHtmbG9hdDpyaWdodH0qIGh0bWwgLmdvb2ctdGFiLWJhci1zdGFydHttYXJnaW4tcmlnaHQ6LTNweH0qIGh0bWwgLmdvb2ctdGFiLWJhci1lbmR7bWFyZ2luLWxlZnQ6LTNweH1zZW50aW5lbHt9", + "ok": true, + "headers": [ + [ + "content-length", + "1404" + ], + [ + "content-type", + "text/css" + ] + ], + "status": 200, + "status_text": "" + }, + "http://localhost:8080/nbextensions/google.colab/tabbar_main.min.js": { + "data": "Ly8gY2xhbmctZm9ybWF0IG9mZgooZnVuY3Rpb24oKXt2YXIgZyxhYT1mdW5jdGlvbihhKXt2YXIgYj0wO3JldHVybiBmdW5jdGlvbigpe3JldHVybiBiPGEubGVuZ3RoP3tkb25lOiExLHZhbHVlOmFbYisrXX06e2RvbmU6ITB9fX0sYmE9dHlwZW9mIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzPT0iZnVuY3Rpb24iP09iamVjdC5kZWZpbmVQcm9wZXJ0eTpmdW5jdGlvbihhLGIsYyl7aWYoYT09QXJyYXkucHJvdG90eXBlfHxhPT1PYmplY3QucHJvdG90eXBlKXJldHVybiBhO2FbYl09Yy52YWx1ZTtyZXR1cm4gYX0sY2E9ZnVuY3Rpb24oYSl7YT1bIm9iamVjdCI9PXR5cGVvZiBnbG9iYWxUaGlzJiZnbG9iYWxUaGlzLGEsIm9iamVjdCI9PXR5cGVvZiB3aW5kb3cmJndpbmRvdywib2JqZWN0Ij09dHlwZW9mIHNlbGYmJnNlbGYsIm9iamVjdCI9PXR5cGVvZiBnbG9iYWwmJmdsb2JhbF07Zm9yKHZhciBiPTA7YjxhLmxlbmd0aDsrK2Ipe3ZhciBjPWFbYl07aWYoYyYmYy5NYXRoPT1NYXRoKXJldHVybiBjfXRocm93IEVycm9yKCJDYW5ub3QgZmluZCBnbG9iYWwgb2JqZWN0Iik7Cn0sZGE9Y2EodGhpcyksZWE9ZnVuY3Rpb24oYSxiKXtpZihiKWE6e3ZhciBjPWRhO2E9YS5zcGxpdCgiLiIpO2Zvcih2YXIgZD0wO2Q8YS5sZW5ndGgtMTtkKyspe3ZhciBlPWFbZF07aWYoIShlIGluIGMpKWJyZWFrIGE7Yz1jW2VdfWE9YVthLmxlbmd0aC0xXTtkPWNbYV07Yj1iKGQpO2IhPWQmJmIhPW51bGwmJmJhKGMsYSx7Y29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOmJ9KX19OwplYSgiU3ltYm9sIixmdW5jdGlvbihhKXtpZihhKXJldHVybiBhO3ZhciBiPWZ1bmN0aW9uKGYsaCl7dGhpcy5nPWY7YmEodGhpcywiZGVzY3JpcHRpb24iLHtjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6aH0pfTtiLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmd9O3ZhciBjPSJqc2NvbXBfc3ltYm9sXyIrKE1hdGgucmFuZG9tKCkqMUU5Pj4+MCkrIl8iLGQ9MCxlPWZ1bmN0aW9uKGYpe2lmKHRoaXMgaW5zdGFuY2VvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoIlN5bWJvbCBpcyBub3QgYSBjb25zdHJ1Y3RvciIpO3JldHVybiBuZXcgYihjKyhmfHwiIikrIl8iK2QrKyxmKX07cmV0dXJuIGV9KTsKdmFyIGZhPWZ1bmN0aW9uKGEpe3ZhciBiPXR5cGVvZiBTeW1ib2whPSJ1bmRlZmluZWQiJiZTeW1ib2wuaXRlcmF0b3ImJmFbU3ltYm9sLml0ZXJhdG9yXTtpZihiKXJldHVybiBiLmNhbGwoYSk7aWYodHlwZW9mIGEubGVuZ3RoPT0ibnVtYmVyIilyZXR1cm57bmV4dDphYShhKX07dGhyb3cgRXJyb3IoU3RyaW5nKGEpKyIgaXMgbm90IGFuIGl0ZXJhYmxlIG9yIEFycmF5TGlrZSIpO307ZWEoIlN5bWJvbC5kaXNwb3NlIixmdW5jdGlvbihhKXtyZXR1cm4gYT9hOlN5bWJvbCgiU3ltYm9sLmRpc3Bvc2UiKX0pOy8qCgogQ29weXJpZ2h0IFRoZSBDbG9zdXJlIExpYnJhcnkgQXV0aG9ycy4KIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wCiovCnZhciBsPXRoaXN8fHNlbGYsaWE9ZnVuY3Rpb24oYSl7YS5JYT12b2lkIDA7YS5WPWZ1bmN0aW9uKCl7cmV0dXJuIGEuSWE/YS5JYTphLklhPW5ldyBhfX0samE9ZnVuY3Rpb24oYSl7dmFyIGI9dHlwZW9mIGE7cmV0dXJuIGIhPSJvYmplY3QiP2I6YT9BcnJheS5pc0FycmF5KGEpPyJhcnJheSI6YjoibnVsbCJ9LGthPWZ1bmN0aW9uKGEpe3ZhciBiPWphKGEpO3JldHVybiBiPT0iYXJyYXkifHxiPT0ib2JqZWN0IiYmdHlwZW9mIGEubGVuZ3RoPT0ibnVtYmVyIn0sbT1mdW5jdGlvbihhKXt2YXIgYj10eXBlb2YgYTtyZXR1cm4gYj09Im9iamVjdCImJmEhPW51bGx8fGI9PSJmdW5jdGlvbiJ9LG5hPWZ1bmN0aW9uKGEpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYSxsYSkmJmFbbGFdfHwoYVtsYV09KyttYSl9LGxhPSJjbG9zdXJlX3VpZF8iKyhNYXRoLnJhbmRvbSgpKjFFOT4+PjApLG1hPTAsbj1mdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoKXt9Yy5wcm90b3R5cGU9CmIucHJvdG90eXBlO2EubD1iLnByb3RvdHlwZTthLnByb3RvdHlwZT1uZXcgYzthLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1hO2EucWQ9ZnVuY3Rpb24oZCxlLGYpe2Zvcih2YXIgaD1BcnJheShhcmd1bWVudHMubGVuZ3RoLTIpLGs9MjtrPGFyZ3VtZW50cy5sZW5ndGg7aysrKWhbay0yXT1hcmd1bWVudHNba107cmV0dXJuIGIucHJvdG90eXBlW2VdLmFwcGx5KGQsaCl9fTtmdW5jdGlvbiBvYShhLGIpe2lmKEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKUVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsb2EpO2Vsc2V7dmFyIGM9RXJyb3IoKS5zdGFjaztjJiYodGhpcy5zdGFjaz1jKX1hJiYodGhpcy5tZXNzYWdlPVN0cmluZyhhKSk7YiE9PXZvaWQgMCYmKHRoaXMuY2F1c2U9Yil9bihvYSxFcnJvcik7b2EucHJvdG90eXBlLm5hbWU9IkN1c3RvbUVycm9yIjt2YXIgcGE7ZnVuY3Rpb24gcWEoYSxiKXthPWEuc3BsaXQoIiVzIik7Zm9yKHZhciBjPSIiLGQ9YS5sZW5ndGgtMSxlPTA7ZTxkO2UrKyljKz1hW2VdKyhlPGIubGVuZ3RoP2JbZV06IiVzIik7b2EuY2FsbCh0aGlzLGMrYVtkXSl9bihxYSxvYSk7cWEucHJvdG90eXBlLm5hbWU9IkFzc2VydGlvbkVycm9yIjtmdW5jdGlvbiByYShhLGIsYyxkKXt2YXIgZT0iQXNzZXJ0aW9uIGZhaWxlZCI7aWYoYyl7ZSs9IjogIitjO3ZhciBmPWR9ZWxzZSBhJiYoZSs9IjogIithLGY9Yik7dGhyb3cgbmV3IHFhKCIiK2UsZnx8W10pO30KdmFyIHA9ZnVuY3Rpb24oYSxiLGMpe2F8fHJhKCIiLG51bGwsYixBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMikpO3JldHVybiBhfSxzYT1mdW5jdGlvbihhLGIsYyl7bShhKSYmYS5ub2RlVHlwZT09MXx8cmEoIkV4cGVjdGVkIEVsZW1lbnQgYnV0IGdvdCAlczogJXMuIixbamEoYSksYV0sYixBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMikpfSx1YT1mdW5jdGlvbihhLGIsYyxkKXthIGluc3RhbmNlb2YgYnx8cmEoIkV4cGVjdGVkIGluc3RhbmNlb2YgJXMgYnV0IGdvdCAlcy4iLFt0YShiKSx0YShhKV0sYyxBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMykpfTsKZnVuY3Rpb24gdGEoYSl7cmV0dXJuIGEgaW5zdGFuY2VvZiBGdW5jdGlvbj9hLmRpc3BsYXlOYW1lfHxhLm5hbWV8fCJ1bmtub3duIHR5cGUgbmFtZSI6YSBpbnN0YW5jZW9mIE9iamVjdD9hLmNvbnN0cnVjdG9yLmRpc3BsYXlOYW1lfHxhLmNvbnN0cnVjdG9yLm5hbWV8fE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhKTphPT09bnVsbD8ibnVsbCI6dHlwZW9mIGF9O3ZhciB2YT1BcnJheS5wcm90b3R5cGUuaW5kZXhPZj9mdW5jdGlvbihhLGIpe3AoYS5sZW5ndGghPW51bGwpO3JldHVybiBBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKGEsYix2b2lkIDApfTpmdW5jdGlvbihhLGIpe2lmKHR5cGVvZiBhPT09InN0cmluZyIpcmV0dXJuIHR5cGVvZiBiIT09InN0cmluZyJ8fGIubGVuZ3RoIT0xPy0xOmEuaW5kZXhPZihiLDApO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWlmKGMgaW4gYSYmYVtjXT09PWIpcmV0dXJuIGM7cmV0dXJuLTF9LHdhPUFycmF5LnByb3RvdHlwZS5mb3JFYWNoP2Z1bmN0aW9uKGEsYil7cChhLmxlbmd0aCE9bnVsbCk7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChhLGIsdm9pZCAwKX06ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9YS5sZW5ndGgsZD10eXBlb2YgYT09PSJzdHJpbmciP2Euc3BsaXQoIiIpOmEsZT0wO2U8YztlKyspZSBpbiBkJiZiLmNhbGwodm9pZCAwLGRbZV0sZSxhKX07CmZ1bmN0aW9uIHhhKGEsYil7Yj12YShhLGIpO3ZhciBjO2lmKGM9Yj49MClwKGEubGVuZ3RoIT1udWxsKSxBcnJheS5wcm90b3R5cGUuc3BsaWNlLmNhbGwoYSxiLDEpO3JldHVybiBjfWZ1bmN0aW9uIHlhKGEpe3ZhciBiPWEubGVuZ3RoO2lmKGI+MCl7Zm9yKHZhciBjPUFycmF5KGIpLGQ9MDtkPGI7ZCsrKWNbZF09YVtkXTtyZXR1cm4gY31yZXR1cm5bXX1mdW5jdGlvbiB6YShhLGIsYyxkKXtwKGEubGVuZ3RoIT1udWxsKTtBcnJheS5wcm90b3R5cGUuc3BsaWNlLmFwcGx5KGEsQWEoYXJndW1lbnRzLDEpKX1mdW5jdGlvbiBBYShhLGIsYyl7cChhLmxlbmd0aCE9bnVsbCk7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg8PTI/QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYSxiKTpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhLGIsYyl9O2Z1bmN0aW9uIEJhKGEsYixjKXtmb3IodmFyIGQgaW4gYSliLmNhbGwoYyxhW2RdLGQsYSl9ZnVuY3Rpb24gQ2EoYSxiKXtmb3IodmFyIGMgaW4gYSlpZihhW2NdPT1iKXJldHVybiEwO3JldHVybiExfWZ1bmN0aW9uIERhKGEsYixjKXtpZihhIT09bnVsbCYmYiBpbiBhKXRocm93IEVycm9yKCdUaGUgb2JqZWN0IGFscmVhZHkgY29udGFpbnMgdGhlIGtleSAiJytiKyciJyk7YVtiXT1jfWZ1bmN0aW9uIEVhKGEpe3ZhciBiPXt9LGM7Zm9yKGMgaW4gYSliW2FbY11dPWM7cmV0dXJuIGJ9dmFyIEZhPSJjb25zdHJ1Y3RvciBoYXNPd25Qcm9wZXJ0eSBpc1Byb3RvdHlwZU9mIHByb3BlcnR5SXNFbnVtZXJhYmxlIHRvTG9jYWxlU3RyaW5nIHRvU3RyaW5nIHZhbHVlT2YiLnNwbGl0KCIgIik7CmZ1bmN0aW9uIEdhKGEsYil7Zm9yKHZhciBjLGQsZT0xO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspe2Q9YXJndW1lbnRzW2VdO2ZvcihjIGluIGQpYVtjXT1kW2NdO2Zvcih2YXIgZj0wO2Y8RmEubGVuZ3RoO2YrKyljPUZhW2ZdLE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChkLGMpJiYoYVtjXT1kW2NdKX19O3ZhciBIYT1TdHJpbmcucHJvdG90eXBlLnRyaW0/ZnVuY3Rpb24oYSl7cmV0dXJuIGEudHJpbSgpfTpmdW5jdGlvbihhKXtyZXR1cm4vXltcc1x4YTBdKihbXHNcU10qPylbXHNceGEwXSokLy5leGVjKGEpWzFdfTsvKgoKIENvcHlyaWdodCBHb29nbGUgTExDCiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMAoqLwp2YXIgSWE9e307dmFyIEphPWZ1bmN0aW9uKGEpe2lmKElhIT09SWEpdGhyb3cgRXJyb3IoIkJhZCBzZWNyZXQiKTt0aGlzLmc9YX07SmEucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ307bmV3IEphKCJhYm91dDpibGFuayIpO25ldyBKYSgiYWJvdXQ6aW52YWxpZCN6Q2xvc3VyZXoiKTt2YXIgS2E9W10sTGE9ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJBIFVSTCB3aXRoIGNvbnRlbnQgJyIrYSsiJyB3YXMgc2FuaXRpemVkIGF3YXkuIil9O0thLmluZGV4T2YoTGEpPT09LTEmJkthLnB1c2goTGEpO3ZhciBNYSxOYTthOntmb3IodmFyIE9hPVsiQ0xPU1VSRV9GTEFHUyJdLFBhPWwsUWE9MDtRYTxPYS5sZW5ndGg7UWErKylpZihQYT1QYVtPYVtRYV1dLFBhPT1udWxsKXtOYT1udWxsO2JyZWFrIGF9TmE9UGF9dmFyIFJhPU5hJiZOYVs2MTA0MDEzMDFdO01hPVJhIT1udWxsP1JhOiExO2Z1bmN0aW9uIFNhKCl7dmFyIGE9bC5uYXZpZ2F0b3I7cmV0dXJuIGEmJihhPWEudXNlckFnZW50KT9hOiIifXZhciBUYSxVYT1sLm5hdmlnYXRvcjtUYT1VYT9VYS51c2VyQWdlbnREYXRhfHxudWxsOm51bGw7ZnVuY3Rpb24gcihhKXtyZXR1cm4gU2EoKS5pbmRleE9mKGEpIT0tMX07dmFyIFZhPXIoIkVkZ2UiKSx0PXIoIkdlY2tvIikmJiEoU2EoKS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoIndlYmtpdCIpIT0tMSYmIXIoIkVkZ2UiKSkmJiEocigiVHJpZGVudCIpfHxyKCJNU0lFIikpJiYhcigiRWRnZSIpLHU9U2EoKS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoIndlYmtpdCIpIT0tMSYmIXIoIkVkZ2UiKSx2PU1hJiZUYSYmVGEucGxhdGZvcm0/VGEucGxhdGZvcm09PT0ibWFjT1MiOnIoIk1hY2ludG9zaCIpO3ZhciBYYT1mdW5jdGlvbihhLGIpe0JhKGIsZnVuY3Rpb24oYyxkKXtkPT0ic3R5bGUiP2Euc3R5bGUuY3NzVGV4dD1jOmQ9PSJjbGFzcyI/YS5jbGFzc05hbWU9YzpkPT0iZm9yIj9hLmh0bWxGb3I9YzpXYS5oYXNPd25Qcm9wZXJ0eShkKT9hLnNldEF0dHJpYnV0ZShXYVtkXSxjKTpkLmxhc3RJbmRleE9mKCJhcmlhLSIsMCk9PTB8fGQubGFzdEluZGV4T2YoImRhdGEtIiwwKT09MD9hLnNldEF0dHJpYnV0ZShkLGMpOmFbZF09Y30pfSxXYT17Y2VsbHBhZGRpbmc6ImNlbGxQYWRkaW5nIixjZWxsc3BhY2luZzoiY2VsbFNwYWNpbmciLGNvbHNwYW46ImNvbFNwYW4iLGZyYW1lYm9yZGVyOiJmcmFtZUJvcmRlciIsaGVpZ2h0OiJoZWlnaHQiLG1heGxlbmd0aDoibWF4TGVuZ3RoIixub25jZToibm9uY2UiLHJvbGU6InJvbGUiLHJvd3NwYW46InJvd1NwYW4iLHR5cGU6InR5cGUiLHVzZW1hcDoidXNlTWFwIix2YWxpZ246InZBbGlnbiIsd2lkdGg6IndpZHRoIn0sWWE9ZnVuY3Rpb24oYSwKYixjKXtmdW5jdGlvbiBkKGspe2smJmIuYXBwZW5kQ2hpbGQodHlwZW9mIGs9PT0ic3RyaW5nIj9hLmNyZWF0ZVRleHROb2RlKGspOmspfWZvcih2YXIgZT0yO2U8Yy5sZW5ndGg7ZSsrKXt2YXIgZj1jW2VdO2lmKCFrYShmKXx8bShmKSYmZi5ub2RlVHlwZT4wKWQoZik7ZWxzZXthOntpZihmJiZ0eXBlb2YgZi5sZW5ndGg9PSJudW1iZXIiKXtpZihtKGYpKXt2YXIgaD10eXBlb2YgZi5pdGVtPT0iZnVuY3Rpb24ifHx0eXBlb2YgZi5pdGVtPT0ic3RyaW5nIjticmVhayBhfWlmKHR5cGVvZiBmPT09ImZ1bmN0aW9uIil7aD10eXBlb2YgZi5pdGVtPT0iZnVuY3Rpb24iO2JyZWFrIGF9fWg9ITF9d2EoaD95YShmKTpmLGQpfX19LFphPWZ1bmN0aW9uKGEsYil7Yj1TdHJpbmcoYik7YS5jb250ZW50VHlwZT09PSJhcHBsaWNhdGlvbi94aHRtbCt4bWwiJiYoYj1iLnRvTG93ZXJDYXNlKCkpO3JldHVybiBhLmNyZWF0ZUVsZW1lbnQoYil9LCRhPWZ1bmN0aW9uKGEpe2EmJmEucGFyZW50Tm9kZSYmCmEucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhKX0sYWI9ZnVuY3Rpb24oYSxiKXtpZighYXx8IWIpcmV0dXJuITE7aWYoYS5jb250YWlucyYmYi5ub2RlVHlwZT09MSlyZXR1cm4gYT09Ynx8YS5jb250YWlucyhiKTtpZih0eXBlb2YgYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiE9InVuZGVmaW5lZCIpcmV0dXJuIGE9PWJ8fCEhKGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24oYikmMTYpO2Zvcig7YiYmYSE9YjspYj1iLnBhcmVudE5vZGU7cmV0dXJuIGI9PWF9LGJiPWZ1bmN0aW9uKGEpe3AoYSwiTm9kZSBjYW5ub3QgYmUgbnVsbCBvciB1bmRlZmluZWQuIik7cmV0dXJuIGEubm9kZVR5cGU9PTk/YTphLm93bmVyRG9jdW1lbnR8fGEuZG9jdW1lbnR9LGNiPWZ1bmN0aW9uKGEsYil7Yj9hLnRhYkluZGV4PTA6KGEudGFiSW5kZXg9LTEsYS5yZW1vdmVBdHRyaWJ1dGUoInRhYkluZGV4IikpfSxkYj1mdW5jdGlvbihhKXtyZXR1cm4gYS5oYXNBdHRyaWJ1dGUoInRhYmluZGV4Iil9LGViPQpmdW5jdGlvbihhKXthPWEudGFiSW5kZXg7cmV0dXJuIHR5cGVvZiBhPT09Im51bWJlciImJmE+PTAmJmE8MzI3Njh9LGZiPWZ1bmN0aW9uKGEpe3RoaXMuZz1hfHxsLmRvY3VtZW50fHxkb2N1bWVudH07ZmIucHJvdG90eXBlLmk9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nO3JldHVybiB0eXBlb2YgYT09PSJzdHJpbmciP2IuZ2V0RWxlbWVudEJ5SWQoYSk6YX07ZmIucHJvdG90eXBlLmg9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXMuZyxlPWFyZ3VtZW50cyxmPWVbMV0saD1aYShkLFN0cmluZyhlWzBdKSk7ZiYmKHR5cGVvZiBmPT09InN0cmluZyI/aC5jbGFzc05hbWU9ZjpBcnJheS5pc0FycmF5KGYpP2guY2xhc3NOYW1lPWYuam9pbigiICIpOlhhKGgsZikpO2UubGVuZ3RoPjImJllhKGQsaCxlKTtyZXR1cm4gaH07dmFyIHc9ZnVuY3Rpb24oKXt0aGlzLmJhPXRoaXMuYmE7dGhpcy5rYT10aGlzLmthfTt3LnByb3RvdHlwZS5iYT0hMTt3LnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7dGhpcy5iYXx8KHRoaXMuYmE9ITAsdGhpcy5DKCkpfTt3LnByb3RvdHlwZVtTeW1ib2wuZGlzcG9zZV09ZnVuY3Rpb24oKXt0aGlzLmRpc3Bvc2UoKX07dy5wcm90b3R5cGUuQz1mdW5jdGlvbigpe2lmKHRoaXMua2EpZm9yKDt0aGlzLmthLmxlbmd0aDspdGhpcy5rYS5zaGlmdCgpKCl9O3ZhciB5PWZ1bmN0aW9uKGEsYil7dGhpcy50eXBlPWE7dGhpcy51PXRoaXMudGFyZ2V0PWI7dGhpcy5kZWZhdWx0UHJldmVudGVkPXRoaXMuQT0hMX07eS5wcm90b3R5cGUudj1mdW5jdGlvbigpe3RoaXMuQT0hMH07eS5wcm90b3R5cGUuaj1mdW5jdGlvbigpe3RoaXMuZGVmYXVsdFByZXZlbnRlZD0hMH07dmFyIGdiPWZ1bmN0aW9uKCl7aWYoIWwuYWRkRXZlbnRMaXN0ZW5lcnx8IU9iamVjdC5kZWZpbmVQcm9wZXJ0eSlyZXR1cm4hMTt2YXIgYT0hMSxiPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwicGFzc2l2ZSIse2dldDpmdW5jdGlvbigpe2E9ITB9fSk7dHJ5e3ZhciBjPWZ1bmN0aW9uKCl7fTtsLmFkZEV2ZW50TGlzdGVuZXIoInRlc3QiLGMsYik7bC5yZW1vdmVFdmVudExpc3RlbmVyKCJ0ZXN0IixjLGIpfWNhdGNoKGQpe31yZXR1cm4gYX0oKTt2YXIgej1mdW5jdGlvbihhLGIpe3kuY2FsbCh0aGlzLGE/YS50eXBlOiIiKTt0aGlzLnJlbGF0ZWRUYXJnZXQ9dGhpcy51PXRoaXMudGFyZ2V0PW51bGw7dGhpcy5idXR0b249dGhpcy5zY3JlZW5ZPXRoaXMuc2NyZWVuWD10aGlzLmNsaWVudFk9dGhpcy5jbGllbnRYPTA7dGhpcy5rZXk9IiI7dGhpcy5nPTA7dGhpcy5tZXRhS2V5PXRoaXMuc2hpZnRLZXk9dGhpcy5hbHRLZXk9dGhpcy5jdHJsS2V5PSExO3RoaXMuc3RhdGU9bnVsbDt0aGlzLkc9ITE7dGhpcy5wb2ludGVySWQ9MDt0aGlzLnBvaW50ZXJUeXBlPSIiO3RoaXMudGltZVN0YW1wPTA7dGhpcy5oPW51bGw7aWYoYSl7dmFyIGM9dGhpcy50eXBlPWEudHlwZSxkPWEuY2hhbmdlZFRvdWNoZXMmJmEuY2hhbmdlZFRvdWNoZXMubGVuZ3RoP2EuY2hhbmdlZFRvdWNoZXNbMF06bnVsbDt0aGlzLnRhcmdldD1hLnRhcmdldHx8YS5zcmNFbGVtZW50O3RoaXMudT1iO2I9YS5yZWxhdGVkVGFyZ2V0O2J8fChjPT0ibW91c2VvdmVyIj8KYj1hLmZyb21FbGVtZW50OmM9PSJtb3VzZW91dCImJihiPWEudG9FbGVtZW50KSk7dGhpcy5yZWxhdGVkVGFyZ2V0PWI7ZD8odGhpcy5jbGllbnRYPWQuY2xpZW50WCE9PXZvaWQgMD9kLmNsaWVudFg6ZC5wYWdlWCx0aGlzLmNsaWVudFk9ZC5jbGllbnRZIT09dm9pZCAwP2QuY2xpZW50WTpkLnBhZ2VZLHRoaXMuc2NyZWVuWD1kLnNjcmVlblh8fDAsdGhpcy5zY3JlZW5ZPWQuc2NyZWVuWXx8MCk6KHRoaXMuY2xpZW50WD1hLmNsaWVudFghPT12b2lkIDA/YS5jbGllbnRYOmEucGFnZVgsdGhpcy5jbGllbnRZPWEuY2xpZW50WSE9PXZvaWQgMD9hLmNsaWVudFk6YS5wYWdlWSx0aGlzLnNjcmVlblg9YS5zY3JlZW5YfHwwLHRoaXMuc2NyZWVuWT1hLnNjcmVlbll8fDApO3RoaXMuYnV0dG9uPWEuYnV0dG9uO3RoaXMuZz1hLmtleUNvZGV8fDA7dGhpcy5rZXk9YS5rZXl8fCIiO3RoaXMuY3RybEtleT1hLmN0cmxLZXk7dGhpcy5hbHRLZXk9YS5hbHRLZXk7dGhpcy5zaGlmdEtleT1hLnNoaWZ0S2V5Owp0aGlzLm1ldGFLZXk9YS5tZXRhS2V5O3RoaXMuRz12P2EubWV0YUtleTphLmN0cmxLZXk7dGhpcy5wb2ludGVySWQ9YS5wb2ludGVySWR8fDA7dGhpcy5wb2ludGVyVHlwZT1hLnBvaW50ZXJUeXBlO3RoaXMuc3RhdGU9YS5zdGF0ZTt0aGlzLnRpbWVTdGFtcD1hLnRpbWVTdGFtcDt0aGlzLmg9YTthLmRlZmF1bHRQcmV2ZW50ZWQmJnoubC5qLmNhbGwodGhpcyl9fTtuKHoseSk7ei5wcm90b3R5cGUudj1mdW5jdGlvbigpe3oubC52LmNhbGwodGhpcyk7dGhpcy5oLnN0b3BQcm9wYWdhdGlvbj90aGlzLmguc3RvcFByb3BhZ2F0aW9uKCk6dGhpcy5oLmNhbmNlbEJ1YmJsZT0hMH07ei5wcm90b3R5cGUuaj1mdW5jdGlvbigpe3oubC5qLmNhbGwodGhpcyk7dmFyIGE9dGhpcy5oO2EucHJldmVudERlZmF1bHQ/YS5wcmV2ZW50RGVmYXVsdCgpOmEucmV0dXJuVmFsdWU9ITF9O3ZhciBoYj0iY2xvc3VyZV9saXN0ZW5hYmxlXyIrKE1hdGgucmFuZG9tKCkqMUU2fDApLGliPWZ1bmN0aW9uKGEpe3JldHVybiEoIWF8fCFhW2hiXSl9O3ZhciBqYj0wO3ZhciBrYj1mdW5jdGlvbihhLGIsYyxkLGUpe3RoaXMubGlzdGVuZXI9YTt0aGlzLnByb3h5PW51bGw7dGhpcy5zcmM9Yjt0aGlzLnR5cGU9Yzt0aGlzLmNhcHR1cmU9ISFkO3RoaXMucGE9ZTt0aGlzLmtleT0rK2piO3RoaXMuamE9dGhpcy5vYT0hMX0sbGI9ZnVuY3Rpb24oYSl7YS5qYT0hMDthLmxpc3RlbmVyPW51bGw7YS5wcm94eT1udWxsO2Euc3JjPW51bGw7YS5wYT1udWxsfTt2YXIgbWI9ZnVuY3Rpb24oYSl7dGhpcy5zcmM9YTt0aGlzLmc9e307dGhpcy5oPTB9O21iLnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZj1hLnRvU3RyaW5nKCk7YT10aGlzLmdbZl07YXx8KGE9dGhpcy5nW2ZdPVtdLHRoaXMuaCsrKTt2YXIgaD1uYihhLGIsZCxlKTtoPi0xPyhiPWFbaF0sY3x8KGIub2E9ITEpKTooYj1uZXcga2IoYix0aGlzLnNyYyxmLCEhZCxlKSxiLm9hPWMsYS5wdXNoKGIpKTtyZXR1cm4gYn07CnZhciBvYj1mdW5jdGlvbihhLGIpe3ZhciBjPWIudHlwZTtjIGluIGEuZyYmeGEoYS5nW2NdLGIpJiYobGIoYiksYS5nW2NdLmxlbmd0aD09MCYmKGRlbGV0ZSBhLmdbY10sYS5oLS0pKX0scGI9ZnVuY3Rpb24oYSxiLGMsZCxlKXthPWEuZ1tiLnRvU3RyaW5nKCldO2I9LTE7YSYmKGI9bmIoYSxjLGQsZSkpO3JldHVybiBiPi0xP2FbYl06bnVsbH0sbmI9ZnVuY3Rpb24oYSxiLGMsZCl7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDsrK2Upe3ZhciBmPWFbZV07aWYoIWYuamEmJmYubGlzdGVuZXI9PWImJmYuY2FwdHVyZT09ISFjJiZmLnBhPT1kKXJldHVybiBlfXJldHVybi0xfTt2YXIgcWI9ImNsb3N1cmVfbG1fIisoTWF0aC5yYW5kb20oKSoxRTZ8MCkscmI9e30sc2I9MCx1Yj1mdW5jdGlvbihhLGIsYyxkLGUpe2lmKGQmJmQub25jZSlyZXR1cm4gdGIoYSxiLGMsZCxlKTtpZihBcnJheS5pc0FycmF5KGIpKXtmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKyl1YihhLGJbZl0sYyxkLGUpO3JldHVybiBudWxsfWM9dmIoYyk7cmV0dXJuIGliKGEpP3diKGEsYixjLG0oZCk/ISFkLmNhcHR1cmU6ISFkLGUpOnhiKGEsYixjLCExLGQsZSl9LHhiPWZ1bmN0aW9uKGEsYixjLGQsZSxmKXtpZighYil0aHJvdyBFcnJvcigiSW52YWxpZCBldmVudCB0eXBlIik7dmFyIGg9bShlKT8hIWUuY2FwdHVyZTohIWUsaz15YihhKTtrfHwoYVtxYl09az1uZXcgbWIoYSkpO2M9ay5hZGQoYixjLGQsaCxmKTtpZihjLnByb3h5KXJldHVybiBjO2Q9emIoKTtjLnByb3h5PWQ7ZC5zcmM9YTtkLmxpc3RlbmVyPWM7aWYoYS5hZGRFdmVudExpc3RlbmVyKWdifHwoZT1oKSxlPT09dm9pZCAwJiYKKGU9ITEpLGEuYWRkRXZlbnRMaXN0ZW5lcihiLnRvU3RyaW5nKCksZCxlKTtlbHNlIGlmKGEuYXR0YWNoRXZlbnQpYS5hdHRhY2hFdmVudChBYihiLnRvU3RyaW5nKCkpLGQpO2Vsc2UgaWYoYS5hZGRMaXN0ZW5lciYmYS5yZW1vdmVMaXN0ZW5lcilwKGI9PT0iY2hhbmdlIiwiTWVkaWFRdWVyeUxpc3Qgb25seSBoYXMgYSBjaGFuZ2UgZXZlbnQiKSxhLmFkZExpc3RlbmVyKGQpO2Vsc2UgdGhyb3cgRXJyb3IoImFkZEV2ZW50TGlzdGVuZXIgYW5kIGF0dGFjaEV2ZW50IGFyZSB1bmF2YWlsYWJsZS4iKTtzYisrO3JldHVybiBjfSx6Yj1mdW5jdGlvbigpe3ZhciBhPUJiLGI9ZnVuY3Rpb24oYyl7cmV0dXJuIGEuY2FsbChiLnNyYyxiLmxpc3RlbmVyLGMpfTtyZXR1cm4gYn0sdGI9ZnVuY3Rpb24oYSxiLGMsZCxlKXtpZihBcnJheS5pc0FycmF5KGIpKXtmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKyl0YihhLGJbZl0sYyxkLGUpO3JldHVybiBudWxsfWM9dmIoYyk7cmV0dXJuIGliKGEpPwphLkEuYWRkKFN0cmluZyhiKSxjLCEwLG0oZCk/ISFkLmNhcHR1cmU6ISFkLGUpOnhiKGEsYixjLCEwLGQsZSl9LENiPWZ1bmN0aW9uKGEsYixjLGQsZSl7aWYoQXJyYXkuaXNBcnJheShiKSlmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKylDYihhLGJbZl0sYyxkLGUpO2Vsc2UgZD1tKGQpPyEhZC5jYXB0dXJlOiEhZCxjPXZiKGMpLGliKGEpPyhhPWEuQSxiPVN0cmluZyhiKS50b1N0cmluZygpLGIgaW4gYS5nJiYoZj1hLmdbYl0sYz1uYihmLGMsZCxlKSxjPi0xJiYobGIoZltjXSkscChmLmxlbmd0aCE9bnVsbCksQXJyYXkucHJvdG90eXBlLnNwbGljZS5jYWxsKGYsYywxKSxmLmxlbmd0aD09MCYmKGRlbGV0ZSBhLmdbYl0sYS5oLS0pKSkpOmEmJihhPXliKGEpKSYmKGM9cGIoYSxiLGMsZCxlKSkmJkEoYyl9LEE9ZnVuY3Rpb24oYSl7aWYodHlwZW9mIGEhPT0ibnVtYmVyIiYmYSYmIWEuamEpe3ZhciBiPWEuc3JjO2lmKGliKGIpKW9iKGIuQSxhKTtlbHNle3ZhciBjPWEudHlwZSwKZD1hLnByb3h5O2IucmVtb3ZlRXZlbnRMaXN0ZW5lcj9iLnJlbW92ZUV2ZW50TGlzdGVuZXIoYyxkLGEuY2FwdHVyZSk6Yi5kZXRhY2hFdmVudD9iLmRldGFjaEV2ZW50KEFiKGMpLGQpOmIuYWRkTGlzdGVuZXImJmIucmVtb3ZlTGlzdGVuZXImJmIucmVtb3ZlTGlzdGVuZXIoZCk7c2ItLTsoYz15YihiKSk/KG9iKGMsYSksYy5oPT0wJiYoYy5zcmM9bnVsbCxiW3FiXT1udWxsKSk6bGIoYSl9fX0sQWI9ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW4gcmI/cmJbYV06cmJbYV09Im9uIithfSxCYj1mdW5jdGlvbihhLGIpe2lmKGEuamEpYT0hMDtlbHNle2I9bmV3IHooYix0aGlzKTt2YXIgYz1hLmxpc3RlbmVyLGQ9YS5wYXx8YS5zcmM7YS5vYSYmQShhKTthPWMuY2FsbChkLGIpfXJldHVybiBhfSx5Yj1mdW5jdGlvbihhKXthPWFbcWJdO3JldHVybiBhIGluc3RhbmNlb2YgbWI/YTpudWxsfSxEYj0iX19jbG9zdXJlX2V2ZW50c19mbl8iKyhNYXRoLnJhbmRvbSgpKjFFOT4+PjApLHZiPWZ1bmN0aW9uKGEpe3AoYSwKIkxpc3RlbmVyIGNhbiBub3QgYmUgbnVsbC4iKTtpZih0eXBlb2YgYT09PSJmdW5jdGlvbiIpcmV0dXJuIGE7cChhLmhhbmRsZUV2ZW50LCJBbiBvYmplY3QgbGlzdGVuZXIgbXVzdCBoYXZlIGhhbmRsZUV2ZW50IG1ldGhvZC4iKTthW0RiXXx8KGFbRGJdPWZ1bmN0aW9uKGIpe3JldHVybiBhLmhhbmRsZUV2ZW50KGIpfSk7cmV0dXJuIGFbRGJdfTt2YXIgRWI9ZnVuY3Rpb24oYSl7dy5jYWxsKHRoaXMpO3RoaXMuaD1hO3RoaXMuZz17fX07bihFYix3KTsKdmFyIEZiPVtdLEI9ZnVuY3Rpb24oYSxiLGMsZCl7QXJyYXkuaXNBcnJheShjKXx8KGMmJihGYlswXT1jLnRvU3RyaW5nKCkpLGM9RmIpO2Zvcih2YXIgZT0wO2U8Yy5sZW5ndGg7ZSsrKXt2YXIgZj11YihiLGNbZV0sZHx8YS5oYW5kbGVFdmVudCwhMSxhLmh8fGEpO2lmKCFmKWJyZWFrO2EuZ1tmLmtleV09Zn1yZXR1cm4gYX0sQz1mdW5jdGlvbihhLGIsYyxkLGUsZil7aWYoQXJyYXkuaXNBcnJheShjKSlmb3IodmFyIGg9MDtoPGMubGVuZ3RoO2grKylDKGEsYixjW2hdLGQsZSxmKTtlbHNlIGQ9ZHx8YS5oYW5kbGVFdmVudCxlPW0oZSk/ISFlLmNhcHR1cmU6ISFlLGY9Znx8YS5ofHxhLGQ9dmIoZCksZT0hIWUsYz1pYihiKT9wYihiLkEsU3RyaW5nKGMpLGQsZSxmKTpiPyhiPXliKGIpKT9wYihiLGMsZCxlLGYpOm51bGw6bnVsbCxjJiYoQShjKSxkZWxldGUgYS5nW2Mua2V5XSk7cmV0dXJuIGF9LEdiPWZ1bmN0aW9uKGEpe0JhKGEuZyxmdW5jdGlvbihiLGMpe3RoaXMuZy5oYXNPd25Qcm9wZXJ0eShjKSYmCkEoYil9LGEpO2EuZz17fX07RWIucHJvdG90eXBlLkM9ZnVuY3Rpb24oKXtFYi5sLkMuY2FsbCh0aGlzKTtHYih0aGlzKX07RWIucHJvdG90eXBlLmhhbmRsZUV2ZW50PWZ1bmN0aW9uKCl7dGhyb3cgRXJyb3IoIkV2ZW50SGFuZGxlci5oYW5kbGVFdmVudCBub3QgaW1wbGVtZW50ZWQiKTt9O3ZhciBEPWZ1bmN0aW9uKCl7dy5jYWxsKHRoaXMpO3RoaXMuQT1uZXcgbWIodGhpcyk7dGhpcy5ZYT10aGlzO3RoaXMubGE9bnVsbH07bihELHcpO0QucHJvdG90eXBlW2hiXT0hMDtELnByb3RvdHlwZS5BYT1mdW5jdGlvbihhKXt0aGlzLmxhPWF9O0QucHJvdG90eXBlLnJlbW92ZUV2ZW50TGlzdGVuZXI9ZnVuY3Rpb24oYSxiLGMsZCl7Q2IodGhpcyxhLGIsYyxkKX07CnZhciBFPWZ1bmN0aW9uKGEsYil7SGIoYSk7dmFyIGM9YS5sYTtpZihjKXt2YXIgZD1bXTtmb3IodmFyIGU9MTtjO2M9Yy5sYSlkLnB1c2goYykscCgrK2U8MUUzLCJpbmZpbml0ZSBsb29wIil9YT1hLllhO2M9Yi50eXBlfHxiO3R5cGVvZiBiPT09InN0cmluZyI/Yj1uZXcgeShiLGEpOmIgaW5zdGFuY2VvZiB5P2IudGFyZ2V0PWIudGFyZ2V0fHxhOihlPWIsYj1uZXcgeShjLGEpLEdhKGIsZSkpO2U9ITA7dmFyIGY7aWYoZClmb3IoZj1kLmxlbmd0aC0xOyFiLkEmJmY+PTA7Zi0tKXt2YXIgaD1iLnU9ZFtmXTtlPUliKGgsYywhMCxiKSYmZX1iLkF8fChoPWIudT1hLGU9SWIoaCxjLCEwLGIpJiZlLGIuQXx8KGU9SWIoaCxjLCExLGIpJiZlKSk7aWYoZClmb3IoZj0wOyFiLkEmJmY8ZC5sZW5ndGg7ZisrKWg9Yi51PWRbZl0sZT1JYihoLGMsITEsYikmJmU7cmV0dXJuIGV9OwpELnByb3RvdHlwZS5DPWZ1bmN0aW9uKCl7RC5sLkMuY2FsbCh0aGlzKTtpZih0aGlzLkEpe3ZhciBhPXRoaXMuQSxiPTAsYztmb3IoYyBpbiBhLmcpe2Zvcih2YXIgZD1hLmdbY10sZT0wO2U8ZC5sZW5ndGg7ZSsrKSsrYixsYihkW2VdKTtkZWxldGUgYS5nW2NdO2EuaC0tfX10aGlzLmxhPW51bGx9O3ZhciB3Yj1mdW5jdGlvbihhLGIsYyxkLGUpe0hiKGEpO3JldHVybiBhLkEuYWRkKFN0cmluZyhiKSxjLCExLGQsZSl9LEliPWZ1bmN0aW9uKGEsYixjLGQpe2I9YS5BLmdbU3RyaW5nKGIpXTtpZighYilyZXR1cm4hMDtiPWIuY29uY2F0KCk7Zm9yKHZhciBlPSEwLGY9MDtmPGIubGVuZ3RoOysrZil7dmFyIGg9YltmXTtpZihoJiYhaC5qYSYmaC5jYXB0dXJlPT1jKXt2YXIgaz1oLmxpc3RlbmVyLHE9aC5wYXx8aC5zcmM7aC5vYSYmb2IoYS5BLGgpO2U9ay5jYWxsKHEsZCkhPT0hMSYmZX19cmV0dXJuIGUmJiFkLmRlZmF1bHRQcmV2ZW50ZWR9LEhiPWZ1bmN0aW9uKGEpe3AoYS5BLCJFdmVudCB0YXJnZXQgaXMgbm90IGluaXRpYWxpemVkLiBEaWQgeW91IGNhbGwgdGhlIHN1cGVyY2xhc3MgKGdvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0KSBjb25zdHJ1Y3Rvcj8iKX07dmFyIEpiPXQ/Ik1velVzZXJTZWxlY3QiOnV8fFZhPyJXZWJraXRVc2VyU2VsZWN0IjpudWxsLEtiPWZ1bmN0aW9uKGEsYil7Yj1iP251bGw6YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpO2lmKEpiJiYoYS5zdHlsZSYmKGEuc3R5bGVbSmJdPSJub25lIiksYikpZm9yKHZhciBjPTA7YT1iW2NdO2MrKylhLnN0eWxlJiYoYS5zdHlsZVtKYl09Im5vbmUiKX07dmFyIExiPWZ1bmN0aW9uKCl7fTtpYShMYik7TGIucHJvdG90eXBlLmc9MDt2YXIgRj1mdW5jdGlvbihhKXtELmNhbGwodGhpcyk7dGhpcy5HPWF8fHBhfHwocGE9bmV3IGZiKTt0aGlzLnphPU1iO3RoaXMuWT1udWxsO3RoaXMucz0hMTt0aGlzLmc9bnVsbDt0aGlzLk09dm9pZCAwO3RoaXMudT10aGlzLmo9dGhpcy5oPW51bGw7dGhpcy5TYT0hMX07bihGLEQpO0YucHJvdG90eXBlLlphPUxiLlYoKTsKdmFyIE1iPW51bGwsTmI9ZnVuY3Rpb24oYSxiKXtzd2l0Y2goYSl7Y2FzZSAxOnJldHVybiBiPyJkaXNhYmxlIjoiZW5hYmxlIjtjYXNlIDI6cmV0dXJuIGI/ImhpZ2hsaWdodCI6InVuaGlnaGxpZ2h0IjtjYXNlIDQ6cmV0dXJuIGI/ImFjdGl2YXRlIjoiZGVhY3RpdmF0ZSI7Y2FzZSA4OnJldHVybiBiPyJzZWxlY3QiOiJ1bnNlbGVjdCI7Y2FzZSAxNjpyZXR1cm4gYj8iY2hlY2siOiJ1bmNoZWNrIjtjYXNlIDMyOnJldHVybiBiPyJmb2N1cyI6ImJsdXIiO2Nhc2UgNjQ6cmV0dXJuIGI/Im9wZW4iOiJjbG9zZSJ9dGhyb3cgRXJyb3IoIkludmFsaWQgY29tcG9uZW50IHN0YXRlIik7fSxPYj1mdW5jdGlvbihhKXtyZXR1cm4gYS5ZfHwoYS5ZPSI6IisoYS5aYS5nKyspLnRvU3RyaW5nKDM2KSl9LFBiPWZ1bmN0aW9uKGEsYil7aWYoYS5oJiZhLmgudSl7dmFyIGM9YS5oLnUsZD1hLlk7ZCBpbiBjJiZkZWxldGUgY1tkXTtEYShhLmgudSxiLGEpfWEuWT1ifTtGLnByb3RvdHlwZS5pPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ307CnZhciBRYj1mdW5jdGlvbihhKXthLk18fChhLk09bmV3IEViKGEpKTtyZXR1cm4gcChhLk0pfTtGLnByb3RvdHlwZS5BYT1mdW5jdGlvbihhKXtpZih0aGlzLmgmJnRoaXMuaCE9YSl0aHJvdyBFcnJvcigiTWV0aG9kIG5vdCBzdXBwb3J0ZWQiKTtGLmwuQWEuY2FsbCh0aGlzLGEpfTtGLnByb3RvdHlwZS5tYT1mdW5jdGlvbigpe3RoaXMuZz1aYSh0aGlzLkcuZywiRElWIil9O0YucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbihhKXtSYih0aGlzLGEpfTsKdmFyIFJiPWZ1bmN0aW9uKGEsYixjKXtpZihhLnMpdGhyb3cgRXJyb3IoIkNvbXBvbmVudCBhbHJlYWR5IHJlbmRlcmVkIik7YS5nfHxhLm1hKCk7Yj9iLmluc2VydEJlZm9yZShhLmcsY3x8bnVsbCk6YS5HLmcuYm9keS5hcHBlbmRDaGlsZChhLmcpO2EuaCYmIWEuaC5zfHxhLkkoKX0sU2I9ZnVuY3Rpb24oYSxiKXtpZihhLnMpdGhyb3cgRXJyb3IoIkNvbXBvbmVudCBhbHJlYWR5IHJlbmRlcmVkIik7aWYoYiYmYS53YShiKSl7YS5TYT0hMDt2YXIgYz1iYihiKTthLkcmJmEuRy5nPT1jfHwoYS5HPWI/bmV3IGZiKGJiKGIpKTpwYXx8KHBhPW5ldyBmYikpO2EuRWEoYik7YS5JKCl9ZWxzZSB0aHJvdyBFcnJvcigiSW52YWxpZCBlbGVtZW50IHRvIGRlY29yYXRlIik7fTtnPUYucHJvdG90eXBlO2cud2E9ZnVuY3Rpb24oKXtyZXR1cm4hMH07Zy5FYT1mdW5jdGlvbihhKXt0aGlzLmc9YX07CmcuST1mdW5jdGlvbigpe3RoaXMucz0hMDtUYih0aGlzLGZ1bmN0aW9uKGEpeyFhLnMmJmEuaSgpJiZhLkkoKX0pfTtnLlU9ZnVuY3Rpb24oKXtUYih0aGlzLGZ1bmN0aW9uKGEpe2EucyYmYS5VKCl9KTt0aGlzLk0mJkdiKHRoaXMuTSk7dGhpcy5zPSExfTtnLkM9ZnVuY3Rpb24oKXt0aGlzLnMmJnRoaXMuVSgpO3RoaXMuTSYmKHRoaXMuTS5kaXNwb3NlKCksZGVsZXRlIHRoaXMuTSk7VGIodGhpcyxmdW5jdGlvbihhKXthLmRpc3Bvc2UoKX0pOyF0aGlzLlNhJiZ0aGlzLmcmJiRhKHRoaXMuZyk7dGhpcy5oPXRoaXMuZz10aGlzLnU9dGhpcy5qPW51bGw7Ri5sLkMuY2FsbCh0aGlzKX07Zy5CYT1mdW5jdGlvbihhLGIpe3RoaXMuQ2EoYSxIKHRoaXMpLGIpfTsKZy5DYT1mdW5jdGlvbihhLGIsYyl7cCghIWEsIlByb3ZpZGVkIGVsZW1lbnQgbXVzdCBub3QgYmUgbnVsbC4iKTtpZihhLnMmJihjfHwhdGhpcy5zKSl0aHJvdyBFcnJvcigiQ29tcG9uZW50IGFscmVhZHkgcmVuZGVyZWQiKTtpZihiPDB8fGI+SCh0aGlzKSl0aHJvdyBFcnJvcigiQ2hpbGQgY29tcG9uZW50IGluZGV4IG91dCBvZiBib3VuZHMiKTt0aGlzLnUmJnRoaXMuanx8KHRoaXMudT17fSx0aGlzLmo9W10pO2lmKGEuaD09dGhpcyl7dmFyIGQ9dGhpcy51LGU9T2IoYSk7ZFtlXT1hO3hhKHRoaXMuaixhKX1lbHNlIERhKHRoaXMudSxPYihhKSxhKTtpZihhPT10aGlzKXRocm93IEVycm9yKCJVbmFibGUgdG8gc2V0IHBhcmVudCBjb21wb25lbnQiKTtpZihkPXRoaXMmJmEuaCYmYS5ZKWU9YS5oLGQ9YS5ZLGUudSYmZD8oZT1lLnUsZD0oZSE9PW51bGwmJmQgaW4gZT9lW2RdOnZvaWQgMCl8fG51bGwpOmQ9bnVsbDtpZihkJiZhLmghPXRoaXMpdGhyb3cgRXJyb3IoIlVuYWJsZSB0byBzZXQgcGFyZW50IGNvbXBvbmVudCIpOwphLmg9dGhpcztGLmwuQWEuY2FsbChhLHRoaXMpO3phKHRoaXMuaixiLDAsYSk7YS5zJiZ0aGlzLnMmJmEuaD09dGhpcz8oYz10aGlzLm5hKCksKGMuY2hpbGROb2Rlc1tiXXx8bnVsbCkhPWEuaSgpJiYoYS5pKCkucGFyZW50RWxlbWVudD09YyYmYy5yZW1vdmVDaGlsZChhLmkoKSksYj1jLmNoaWxkTm9kZXNbYl18fG51bGwsYy5pbnNlcnRCZWZvcmUoYS5pKCksYikpKTpjPyh0aGlzLmd8fHRoaXMubWEoKSxiPUkodGhpcyxiKzEpLFJiKGEsdGhpcy5uYSgpLGI/Yi5nOm51bGwpKTp0aGlzLnMmJiFhLnMmJmEuZyYmYS5nLnBhcmVudE5vZGUmJmEuZy5wYXJlbnROb2RlLm5vZGVUeXBlPT0xJiZhLkkoKX07Zy5uYT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmd9Owp2YXIgVWI9ZnVuY3Rpb24oYSl7aWYoYS56YT09bnVsbCl7dmFyIGI9YS5zP2EuZzphLkcuZy5ib2R5O2E6e3ZhciBjPWJiKGIpO2lmKGMuZGVmYXVsdFZpZXcmJmMuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSYmKGM9Yy5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKGIsbnVsbCkpKXtjPWMuZGlyZWN0aW9ufHxjLmdldFByb3BlcnR5VmFsdWUoImRpcmVjdGlvbiIpfHwiIjticmVhayBhfWM9IiJ9YS56YT0icnRsIj09KGN8fChiLmN1cnJlbnRTdHlsZT9iLmN1cnJlbnRTdHlsZS5kaXJlY3Rpb246bnVsbCl8fGIuc3R5bGUmJmIuc3R5bGUuZGlyZWN0aW9uKX1yZXR1cm4gYS56YX0sSD1mdW5jdGlvbihhKXtyZXR1cm4gYS5qP2Euai5sZW5ndGg6MH0sST1mdW5jdGlvbihhLGIpe3JldHVybiBhLmo/YS5qW2JdfHxudWxsOm51bGx9LFRiPWZ1bmN0aW9uKGEsYixjKXthLmomJmEuai5mb3JFYWNoKGIsYyl9LFZiPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuaiYmYj9hLmouaW5kZXhPZihiKToKLTF9O3ZhciBXYj17bWI6ImFjdGl2ZWRlc2NlbmRhbnQiLHJiOiJhdG9taWMiLHNiOiJhdXRvY29tcGxldGUiLHViOiJidXN5Iix4YjoiY2hlY2tlZCIseWI6ImNvbGluZGV4IixEYjoiY29udHJvbHMiLEViOiJjdXJyZW50IixHYjoiZGVzY3JpYmVkYnkiLEpiOiJkaXNhYmxlZCIsTGI6ImRyb3BlZmZlY3QiLE1iOiJleHBhbmRlZCIsTmI6ImZsb3d0byIsUGI6ImdyYWJiZWQiLFRiOiJoYXNwb3B1cCIsVmI6ImhpZGRlbiIsWGI6ImludmFsaWQiLFliOiJsYWJlbCIsWmI6ImxhYmVsbGVkYnkiLGFjOiJsZXZlbCIsZmM6ImxpdmUiLHZjOiJtdWx0aWxpbmUiLHdjOiJtdWx0aXNlbGVjdGFibGUiLEFjOiJvcmllbnRhdGlvbiIsQmM6Im93bnMiLENjOiJwb3NpbnNldCIsRWM6InByZXNzZWQiLEljOiJyZWFkb25seSIsS2M6InJlbGV2YW50IixMYzoicmVxdWlyZWQiLFBjOiJyb3dpbmRleCIsU2M6InNlbGVjdGVkIixVYzoic2V0c2l6ZSIsV2M6InNvcnQiLG1kOiJ2YWx1ZW1heCIsbmQ6InZhbHVlbWluIiwKb2Q6InZhbHVlbm93IixwZDoidmFsdWV0ZXh0In07dmFyIFhiO3ZhciBZYj17bmI6ImFsZXJ0IixvYjoiYWxlcnRkaWFsb2ciLHBiOiJhcHBsaWNhdGlvbiIscWI6ImFydGljbGUiLHRiOiJiYW5uZXIiLHZiOiJidXR0b24iLHdiOiJjaGVja2JveCIsemI6ImNvbHVtbmhlYWRlciIsQWI6ImNvbWJvYm94IixCYjoiY29tcGxlbWVudGFyeSIsQ2I6ImNvbnRlbnRpbmZvIixGYjoiZGVmaW5pdGlvbiIsSGI6ImRpYWxvZyIsSWI6ImRpcmVjdG9yeSIsS2I6ImRvY3VtZW50IixPYjoiZm9ybSIsUWI6ImdyaWQiLFJiOiJncmlkY2VsbCIsU2I6Imdyb3VwIixVYjoiaGVhZGluZyIsV2I6ImltZyIsYmM6ImxpbmsiLGNjOiJsaXN0IixkYzoibGlzdGJveCIsZWM6Imxpc3RpdGVtIixoYzoibG9nIixpYzoibWFpbiIsamM6Im1hcnF1ZWUiLGtjOiJtYXRoIixsYzoibWVudSIsbWM6Im1lbnViYXIiLG5jOiJtZW51aXRlbSIsb2M6Im1lbnVpdGVtY2hlY2tib3giLHBjOiJtZW51aXRlbXJhZGlvIix4YzoibmF2aWdhdGlvbiIseWM6Im5vdGUiLHpjOiJvcHRpb24iLApEYzoicHJlc2VudGF0aW9uIixGYzoicHJvZ3Jlc3NiYXIiLEdjOiJyYWRpbyIsSGM6InJhZGlvZ3JvdXAiLEpjOiJyZWdpb24iLE1jOiJyb3ciLE5jOiJyb3dncm91cCIsT2M6InJvd2hlYWRlciIsUWM6InNjcm9sbGJhciIsUmM6InNlYXJjaCIsVGM6InNlcGFyYXRvciIsVmM6InNsaWRlciIsWGM6InNwaW5idXR0b24iLFljOiJzdGF0dXMiLFpjOiJzd2l0Y2giLGFkOiJ0YWIiLGJkOiJ0YWJsaXN0IixjZDoidGFicGFuZWwiLGRkOiJ0ZXh0Ym94IixlZDoidGV4dGluZm8iLGZkOiJ0aW1lciIsZ2Q6InRvb2xiYXIiLGhkOiJ0b29sdGlwIixqZDoidHJlZSIsa2Q6InRyZWVncmlkIixsZDoidHJlZWl0ZW0ifTt2YXIgWmI9ZnVuY3Rpb24oYSxiKXtiPyhwKENhKFliLGIpLCJObyBzdWNoIEFSSUEgcm9sZSAiK2IpLGEuc2V0QXR0cmlidXRlKCJyb2xlIixiKSk6YS5yZW1vdmVBdHRyaWJ1dGUoInJvbGUiKX0sYWM9ZnVuY3Rpb24oYSxiLGMpe0FycmF5LmlzQXJyYXkoYykmJihjPWMuam9pbigiICIpKTt2YXIgZD0kYihiKTtjPT09IiJ8fGM9PXZvaWQgMD8oWGJ8fChjPXt9LFhiPShjLmF0b21pYz0hMSxjLmF1dG9jb21wbGV0ZT0ibm9uZSIsYy5kcm9wZWZmZWN0PSJub25lIixjLmhhc3BvcHVwPSExLGMubGl2ZT0ib2ZmIixjLm11bHRpbGluZT0hMSxjLm11bHRpc2VsZWN0YWJsZT0hMSxjLm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIsYy5yZWFkb25seT0hMSxjLnJlbGV2YW50PSJhZGRpdGlvbnMgdGV4dCIsYy5yZXF1aXJlZD0hMSxjLnNvcnQ9Im5vbmUiLGMuYnVzeT0hMSxjLmRpc2FibGVkPSExLGMuaGlkZGVuPSExLGMuaW52YWxpZD0iZmFsc2UiLGMpKSxjPVhiLGIgaW4gYz9hLnNldEF0dHJpYnV0ZShkLApjW2JdKTphLnJlbW92ZUF0dHJpYnV0ZShkKSk6YS5zZXRBdHRyaWJ1dGUoZCxjKX0sJGI9ZnVuY3Rpb24oYSl7cChhLCJBUklBIGF0dHJpYnV0ZSBjYW5ub3QgYmUgZW1wdHkuIik7cChDYShXYixhKSwiTm8gc3VjaCBBUklBIGF0dHJpYnV0ZSAiK2EpO3JldHVybiJhcmlhLSIrYX07dmFyIGRjPWZ1bmN0aW9uKGEsYixjLGQsZSxmKXtpZih2JiZlKXJldHVybiBiYyhhKTtpZihlJiYhZClyZXR1cm4hMTtpZighdCl7dHlwZW9mIGI9PT0ibnVtYmVyIiYmKGI9Y2MoYikpO3ZhciBoPWI9PTE3fHxiPT0xOHx8diYmYj09OTE7aWYoKCFjfHx2KSYmaHx8diYmYj09MTYmJihkfHxmKSlyZXR1cm4hMX1pZih1JiZkJiZjKXN3aXRjaChhKXtjYXNlIDIyMDpjYXNlIDIxOTpjYXNlIDIyMTpjYXNlIDE5MjpjYXNlIDE4NjpjYXNlIDE4OTpjYXNlIDE4NzpjYXNlIDE4ODpjYXNlIDE5MDpjYXNlIDE5MTpjYXNlIDE5MjpjYXNlIDIyMjpyZXR1cm4hMX1zd2l0Y2goYSl7Y2FzZSAxMzpyZXR1cm4gdD9mfHxlPyExOiEoYyYmZCk6ITA7Y2FzZSAyNzpyZXR1cm4hdSYmIXR9cmV0dXJuIHQmJihkfHxlfHxmKT8hMTpiYyhhKX0sYmM9ZnVuY3Rpb24oYSl7aWYoYT49NDgmJmE8PTU3fHxhPj05NiYmYTw9MTA2fHxhPj02NSYmYTw9OTB8fHUmJmE9PTApcmV0dXJuITA7c3dpdGNoKGEpe2Nhc2UgMzI6Y2FzZSA0MzpjYXNlIDYzOmNhc2UgNjQ6Y2FzZSAxMDc6Y2FzZSAxMDk6Y2FzZSAxMTA6Y2FzZSAxMTE6Y2FzZSAxODY6Y2FzZSA1OTpjYXNlIDE4OTpjYXNlIDE4NzpjYXNlIDYxOmNhc2UgMTg4OmNhc2UgMTkwOmNhc2UgMTkxOmNhc2UgMTkyOmNhc2UgMjIyOmNhc2UgMjE5OmNhc2UgMjIwOmNhc2UgMjIxOmNhc2UgMTYzOmNhc2UgNTg6cmV0dXJuITA7CmNhc2UgMTczOmNhc2UgMTcxOnJldHVybiB0O2RlZmF1bHQ6cmV0dXJuITF9fSxjYz1mdW5jdGlvbihhKXtpZih0KWE9ZWMoYSk7ZWxzZSBpZih2JiZ1KXN3aXRjaChhKXtjYXNlIDkzOmE9OTF9cmV0dXJuIGF9LGVjPWZ1bmN0aW9uKGEpe3N3aXRjaChhKXtjYXNlIDYxOnJldHVybiAxODc7Y2FzZSA1OTpyZXR1cm4gMTg2O2Nhc2UgMTczOnJldHVybiAxODk7Y2FzZSAyMjQ6cmV0dXJuIDkxO2Nhc2UgMDpyZXR1cm4gMjI0O2RlZmF1bHQ6cmV0dXJuIGF9fTt2YXIgZmM9ZnVuY3Rpb24oYSxiLGMsZCl7ei5jYWxsKHRoaXMsZCk7dGhpcy50eXBlPSJrZXkiO3RoaXMuZz1hO3RoaXMucmVwZWF0PWN9O24oZmMseik7dmFyIEo9ZnVuY3Rpb24oYSxiKXtELmNhbGwodGhpcyk7YSYmZ2ModGhpcyxhLGIpfTtuKEosRCk7Zz1KLnByb3RvdHlwZTtnLlI9bnVsbDtnLnFhPW51bGw7Zy5KYT1udWxsO2cucmE9bnVsbDtnLkY9LTE7Zy5LPS0xO2cuRGE9ITE7CnZhciBoYz17MzoxMywxMjoxNDQsNjMyMzI6MzgsNjMyMzM6NDAsNjMyMzQ6MzcsNjMyMzU6MzksNjMyMzY6MTEyLDYzMjM3OjExMyw2MzIzODoxMTQsNjMyMzk6MTE1LDYzMjQwOjExNiw2MzI0MToxMTcsNjMyNDI6MTE4LDYzMjQzOjExOSw2MzI0NDoxMjAsNjMyNDU6MTIxLDYzMjQ2OjEyMiw2MzI0NzoxMjMsNjMyNDg6NDQsNjMyNzI6NDYsNjMyNzM6MzYsNjMyNzU6MzUsNjMyNzY6MzMsNjMyNzc6MzQsNjMyODk6MTQ0LDYzMzAyOjQ1fSxpYz17VXA6MzgsRG93bjo0MCxMZWZ0OjM3LFJpZ2h0OjM5LEVudGVyOjEzLEYxOjExMixGMjoxMTMsRjM6MTE0LEY0OjExNSxGNToxMTYsRjY6MTE3LEY3OjExOCxGODoxMTksRjk6MTIwLEYxMDoxMjEsRjExOjEyMixGMTI6MTIzLCJVKzAwN0YiOjQ2LEhvbWU6MzYsRW5kOjM1LFBhZ2VVcDozMyxQYWdlRG93bjozNCxJbnNlcnQ6NDV9LGpjPXYmJnQ7CkoucHJvdG90eXBlLmc9ZnVuY3Rpb24oYSl7dSYmKHRoaXMuRj09MTcmJiFhLmN0cmxLZXl8fHRoaXMuRj09MTgmJiFhLmFsdEtleXx8diYmdGhpcy5GPT05MSYmIWEubWV0YUtleSkmJih0aGlzLks9dGhpcy5GPS0xKTt0aGlzLkY9PS0xJiYoYS5jdHJsS2V5JiZhLmchPTE3P3RoaXMuRj0xNzphLmFsdEtleSYmYS5nIT0xOD90aGlzLkY9MTg6YS5tZXRhS2V5JiZhLmchPTkxJiYodGhpcy5GPTkxKSk7ZGMoYS5nLHRoaXMuRixhLnNoaWZ0S2V5LGEuY3RybEtleSxhLmFsdEtleSxhLm1ldGFLZXkpPyh0aGlzLks9Y2MoYS5nKSxqYyYmKHRoaXMuRGE9YS5hbHRLZXkpKTp0aGlzLmhhbmRsZUV2ZW50KGEpfTtKLnByb3RvdHlwZS5oPWZ1bmN0aW9uKGEpe3RoaXMuSz10aGlzLkY9LTE7dGhpcy5EYT1hLmFsdEtleX07CkoucHJvdG90eXBlLmhhbmRsZUV2ZW50PWZ1bmN0aW9uKGEpe3ZhciBiPWEuaCxjPWIuYWx0S2V5O2lmKHUmJmEudHlwZT09ImtleXByZXNzIil7dmFyIGQ9dGhpcy5LO3ZhciBlPWIuY2hhckNvZGU+PTAmJmIuY2hhckNvZGU8NjMyMzImJmJjKGQpP2IuY2hhckNvZGU6MH1lbHNlIGEudHlwZT09ImtleXByZXNzIj8oamMmJihjPXRoaXMuRGEpLGIua2V5Q29kZT09Yi5jaGFyQ29kZT9iLmtleUNvZGU8MzI/KGQ9Yi5rZXlDb2RlLGU9MCk6KGQ9dGhpcy5LLGU9Yi5jaGFyQ29kZSk6KGQ9Yi5rZXlDb2RlfHx0aGlzLkssZT1iLmNoYXJDb2RlfHwwKSk6KGQ9Yi5rZXlDb2RlfHx0aGlzLkssZT1iLmNoYXJDb2RlfHwwKSx2JiZlPT02MyYmZD09MjI0JiYoZD0xOTEpO3ZhciBmPWQ9Y2MoZCk7ZD9kPj02MzIzMiYmZCBpbiBoYz9mPWhjW2RdOmQ9PTI1JiZhLnNoaWZ0S2V5JiYoZj05KTpiLmtleUlkZW50aWZpZXImJmIua2V5SWRlbnRpZmllciBpbiBpYyYmKGY9aWNbYi5rZXlJZGVudGlmaWVyXSk7CmlmKCF0fHxhLnR5cGUhPSJrZXlwcmVzcyJ8fGRjKGYsdGhpcy5GLGEuc2hpZnRLZXksYS5jdHJsS2V5LGMsYS5tZXRhS2V5KSlhPWY9PXRoaXMuRix0aGlzLkY9ZixiPW5ldyBmYyhmLGUsYSxiKSxiLmFsdEtleT1jLEUodGhpcyxiKX07Si5wcm90b3R5cGUuaT1mdW5jdGlvbigpe3JldHVybiB0aGlzLlJ9O3ZhciBnYz1mdW5jdGlvbihhLGIsYyl7YS5yYSYma2MoYSk7YS5SPWI7YS5xYT11YihhLlIsImtleXByZXNzIixhLGMpO2EuSmE9dWIoYS5SLCJrZXlkb3duIixhLmcsYyxhKTthLnJhPXViKGEuUiwia2V5dXAiLGEuaCxjLGEpfSxrYz1mdW5jdGlvbihhKXthLnFhJiYoQShhLnFhKSxBKGEuSmEpLEEoYS5yYSksYS5xYT1udWxsLGEuSmE9bnVsbCxhLnJhPW51bGwpO2EuUj1udWxsO2EuRj0tMTthLks9LTF9O0oucHJvdG90eXBlLkM9ZnVuY3Rpb24oKXtKLmwuQy5jYWxsKHRoaXMpO2tjKHRoaXMpfTt2YXIgSz17Z2E6Im1vdXNlZG93biIsaGE6Im1vdXNldXAiLGZhOiJtb3VzZWNhbmNlbCIsc2M6Im1vdXNlbW92ZSIsdWM6Im1vdXNlb3ZlciIsdGM6Im1vdXNlb3V0IixxYzoibW91c2VlbnRlciIscmM6Im1vdXNlbGVhdmUifTt2YXIgbGM9ZnVuY3Rpb24oYSl7cmV0dXJuIHR5cGVvZiBhLmNsYXNzTmFtZT09InN0cmluZyI/YS5jbGFzc05hbWU6YS5nZXRBdHRyaWJ1dGUmJmEuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIn0sTD1mdW5jdGlvbihhKXtyZXR1cm4gYS5jbGFzc0xpc3Q/YS5jbGFzc0xpc3Q6bGMoYSkubWF0Y2goL1xTKy9nKXx8W119LG1jPWZ1bmN0aW9uKGEsYil7dHlwZW9mIGEuY2xhc3NOYW1lPT0ic3RyaW5nIj9hLmNsYXNzTmFtZT1iOmEuc2V0QXR0cmlidXRlJiZhLnNldEF0dHJpYnV0ZSgiY2xhc3MiLGIpfSxuYz1mdW5jdGlvbihhLGIpe2EuY2xhc3NMaXN0P2I9YS5jbGFzc0xpc3QuY29udGFpbnMoYik6KGE9TChhKSxiPXZhKGEsYik+PTApO3JldHVybiBifSxvYz1mdW5jdGlvbihhLGIpe2lmKGEuY2xhc3NMaXN0KWEuY2xhc3NMaXN0LmFkZChiKTtlbHNlIGlmKCFuYyhhLGIpKXt2YXIgYz1sYyhhKTttYyhhLGMrKGMubGVuZ3RoPjA/IiAiK2I6YikpfX0scGM9ZnVuY3Rpb24oYSxiKXtpZihhLmNsYXNzTGlzdClBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGIsCmZ1bmN0aW9uKGUpe29jKGEsZSl9KTtlbHNle3ZhciBjPXt9O0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoTChhKSxmdW5jdGlvbihlKXtjW2VdPSEwfSk7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChiLGZ1bmN0aW9uKGUpe2NbZV09ITB9KTtiPSIiO2Zvcih2YXIgZCBpbiBjKWIrPWIubGVuZ3RoPjA/IiAiK2Q6ZDttYyhhLGIpfX0scWM9ZnVuY3Rpb24oYSxiKXthLmNsYXNzTGlzdD9hLmNsYXNzTGlzdC5yZW1vdmUoYik6bmMoYSxiKSYmbWMoYSxBcnJheS5wcm90b3R5cGUuZmlsdGVyLmNhbGwoTChhKSxmdW5jdGlvbihjKXtyZXR1cm4gYyE9Yn0pLmpvaW4oIiAiKSl9LHJjPWZ1bmN0aW9uKGEsYil7YS5jbGFzc0xpc3Q/QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChiLGZ1bmN0aW9uKGMpe3FjKGEsYyl9KTptYyhhLEFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbChMKGEpLGZ1bmN0aW9uKGMpe3JldHVybiEodmEoYixjKT49MCl9KS5qb2luKCIgIikpfTt2YXIgdGM9ZnVuY3Rpb24oYSxiKXtpZighYSl0aHJvdyBFcnJvcigiSW52YWxpZCBjbGFzcyBuYW1lICIrYSk7aWYodHlwZW9mIGIhPT0iZnVuY3Rpb24iKXRocm93IEVycm9yKCJJbnZhbGlkIGRlY29yYXRvciBmdW5jdGlvbiAiK2IpO3NjW2FdPWJ9LHVjPXt9LHNjPXt9O3ZhciB2Yz1mdW5jdGlvbihhKXt0aGlzLkE9YX07aWEodmMpO3ZhciB3Yz1mdW5jdGlvbihhLGIpe2EmJihhLnRhYkluZGV4PWI/MDotMSl9LHljPWZ1bmN0aW9uKGEsYixjKXtjLmlkJiZQYihiLGMuaWQpO3ZhciBkPWEuZygpLGU9ITEsZj1MKGMpO2YmJkFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoZixmdW5jdGlvbihoKXtoPT1kP2U9ITA6aCYmdGhpcy51KGIsaCxkKX0sYSk7ZXx8b2MoYyxkKTt4YyhiLGMpO3JldHVybiBjfTt2Yy5wcm90b3R5cGUudT1mdW5jdGlvbihhLGIsYyl7Yj09YysiLWRpc2FibGVkIj9hLlgoITEpOmI9PWMrIi1ob3Jpem9udGFsIj96YyhhLCJob3Jpem9udGFsIik6Yj09YysiLXZlcnRpY2FsIiYmemMoYSwidmVydGljYWwiKX07CnZhciB4Yz1mdW5jdGlvbihhLGIpe2lmKGIpZm9yKHZhciBjPWIuZmlyc3RDaGlsZCxkO2MmJmMucGFyZW50Tm9kZT09Yjspe2Q9Yy5uZXh0U2libGluZztpZihjLm5vZGVUeXBlPT0xKXthOnt2YXIgZT1jO3AoZSk7ZT1MKGUpO2Zvcih2YXIgZj1lLmxlbmd0aCxoPTA7aDxmO2grKyl7dmFyIGs9ZVtoXTtpZihrPWsgaW4gc2M/c2Nba10oKTpudWxsKXtlPWs7YnJlYWsgYX19ZT1udWxsfWUmJihlLmc9YyxhLmlzRW5hYmxlZCgpfHxlLlgoITEpLGEuQmEoZSksU2IoZSxjKSl9ZWxzZSBjLm5vZGVWYWx1ZSYmSGEoYy5ub2RlVmFsdWUpIT0iInx8Yi5yZW1vdmVDaGlsZChjKTtjPWR9fSxBYz1mdW5jdGlvbihhLGIpe2I9Yi5pKCk7cChiLCJUaGUgY29udGFpbmVyIERPTSBlbGVtZW50IGNhbm5vdCBiZSBudWxsLiIpO0tiKGIsdCk7KGE9YS5BKSYmWmIoYixhKX07dmMucHJvdG90eXBlLmc9ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy1jb250YWluZXIifTsKdmMucHJvdG90eXBlLmo9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nKCksYz1bYixhLkw9PSJob3Jpem9udGFsIj9iKyItaG9yaXpvbnRhbCI6YisiLXZlcnRpY2FsIl07YS5pc0VuYWJsZWQoKXx8Yy5wdXNoKGIrIi1kaXNhYmxlZCIpO3JldHVybiBjfTt2YXIgQmM9ZnVuY3Rpb24oKXt9O3ZhciBNPWZ1bmN0aW9uKCl7fSxDYztpYShNKTt2YXIgRGM9e2J1dHRvbjoicHJlc3NlZCIsY2hlY2tib3g6ImNoZWNrZWQiLG1lbnVpdGVtOiJzZWxlY3RlZCIsbWVudWl0ZW1jaGVja2JveDoiY2hlY2tlZCIsbWVudWl0ZW1yYWRpbzoiY2hlY2tlZCIscmFkaW86ImNoZWNrZWQiLHRhYjoic2VsZWN0ZWQiLHRyZWVpdGVtOiJzZWxlY3RlZCJ9O00ucHJvdG90eXBlLk5hPWZ1bmN0aW9uKCl7fTtNLnByb3RvdHlwZS54YT1mdW5jdGlvbihhKXt2YXIgYj1hLkcsYz1iLmgsZD10aGlzLk4oKSxlPVtkXSxmPXRoaXMuTigpO2YhPWQmJmUucHVzaChmKTtkPWEubTtmb3IoZj1bXTtkOyl7dmFyIGg9ZCYtZDtmLnB1c2goRWModGhpcyxoKSk7ZCY9fmh9ZS5wdXNoLmFwcGx5KGUsZik7KGQ9YS5GYSkmJmUucHVzaC5hcHBseShlLGQpO3JldHVybiBjLmNhbGwoYiwiRElWIixlLmpvaW4oIiAiKSxhLmlhKX07Ck0ucHJvdG90eXBlLnlhPWZ1bmN0aW9uKGEsYil7Yi5pZCYmUGIoYSxiLmlkKTtiJiZiLmZpcnN0Q2hpbGQ/RmMoYSxiLmZpcnN0Q2hpbGQubmV4dFNpYmxpbmc/eWEoYi5jaGlsZE5vZGVzKTpiLmZpcnN0Q2hpbGQpOmEuaWE9bnVsbDt2YXIgYz0wLGQ9dGhpcy5OKCksZT10aGlzLk4oKSxmPSExLGg9ITEsaz15YShMKGIpKTtrLmZvckVhY2goZnVuY3Rpb24ocSl7Znx8cSE9ZD9ofHxxIT1lP2N8PUdjKHRoaXMscSk6aD0hMDooZj0hMCxlPT1kJiYoaD0hMCkpO0djKHRoaXMscSk9PTEmJihzYShiKSxkYihiKSYmZWIoYikmJmNiKGIsITEpKX0sdGhpcyk7YS5tPWM7Znx8KGsucHVzaChkKSxlPT1kJiYoaD0hMCkpO2h8fGsucHVzaChlKTsoYT1hLkZhKSYmay5wdXNoLmFwcGx5KGssYSk7ZiYmaCYmIWF8fG1jKGIsay5qb2luKCIgIikpO3JldHVybiBifTsKdmFyIEhjPWZ1bmN0aW9uKGEsYil7aWYoYT1hLk5hKCkpe3AoYiwiVGhlIGVsZW1lbnQgcGFzc2VkIGFzIGEgZmlyc3QgcGFyYW1ldGVyIGNhbm5vdCBiZSBudWxsLiIpO3ZhciBjPWIuZ2V0QXR0cmlidXRlKCJyb2xlIil8fG51bGw7YSE9YyYmWmIoYixhKX19LEljPWZ1bmN0aW9uKGEsYil7dmFyIGM7aWYoYS5EJjMyJiYoYz1hLmkoKSkpe2lmKCFiJiZhLm0mMzIpe3RyeXtjLmJsdXIoKX1jYXRjaChkKXt9YS5tJjMyJiZhLlFhKG51bGwpfShkYihjKSYmZWIoYykpIT1iJiZjYihjLGIpfX0sSmM9ZnVuY3Rpb24oYSxiLGMpe0NjfHwoQ2M9ezE6ImRpc2FibGVkIiw4OiJzZWxlY3RlZCIsMTY6ImNoZWNrZWQiLDY0OiJleHBhbmRlZCJ9KTtwKGEsIlRoZSBlbGVtZW50IHBhc3NlZCBhcyBhIGZpcnN0IHBhcmFtZXRlciBjYW5ub3QgYmUgbnVsbC4iKTtiPUNjW2JdO3ZhciBkPWEuZ2V0QXR0cmlidXRlKCJyb2xlIil8fG51bGw7ZCYmKGQ9RGNbZF18fGIsYj1iPT0iY2hlY2tlZCJ8fGI9PQoic2VsZWN0ZWQiP2Q6Yik7YiYmYWMoYSxiLGMpfTtNLnByb3RvdHlwZS5OPWZ1bmN0aW9uKCl7cmV0dXJuImdvb2ctY29udHJvbCJ9O3ZhciBFYz1mdW5jdGlvbihhLGIpe2EuZ3x8S2MoYSk7cmV0dXJuIGEuZ1tiXX0sR2M9ZnVuY3Rpb24oYSxiKXthLmh8fChhLmd8fEtjKGEpLGEuaD1FYShhLmcpKTthPXBhcnNlSW50KGEuaFtiXSwxMCk7cmV0dXJuIGlzTmFOKGEpPzA6YX0sS2M9ZnVuY3Rpb24oYSl7dmFyIGI9YS5OKCk7dmFyIGM9Yi5yZXBsYWNlKC9ceGEwfFxzL2csIiAiKS5pbmRleE9mKCIgIikhPS0xO3AoIWMsIkNvbnRyb2xSZW5kZXJlciBoYXMgYW4gaW52YWxpZCBjc3MgY2xhc3M6ICciK2IrIiciKTthLmc9ezE6YisiLWRpc2FibGVkIiwyOmIrIi1ob3ZlciIsNDpiKyItYWN0aXZlIiw4OmIrIi1zZWxlY3RlZCIsMTY6YisiLWNoZWNrZWQiLDMyOmIrIi1mb2N1c2VkIiw2NDpiKyItb3BlbiJ9fTt2YXIgTj1mdW5jdGlvbihhLGIsYyl7Ri5jYWxsKHRoaXMsYyk7aWYoIWIpe2ZvcihiPXRoaXMuY29uc3RydWN0b3I7Yjspe3ZhciBkPW5hKGIpO2lmKGQ9dWNbZF0pYnJlYWs7Yj0oYj1PYmplY3QuZ2V0UHJvdG90eXBlT2YoYi5wcm90b3R5cGUpKSYmYi5jb25zdHJ1Y3Rvcn1iPWQ/dHlwZW9mIGQuVj09PSJmdW5jdGlvbiI/ZC5WKCk6bmV3IGQ6bnVsbH10aGlzLnY9Yjt0aGlzLmlhPWEhPT12b2lkIDA/YTpudWxsfTtuKE4sRik7Zz1OLnByb3RvdHlwZTtnLmlhPW51bGw7Zy5tPTA7Zy5EPTM5O2cuUD0wO2cuT2E9ITA7Zy5GYT1udWxsO2cuSGE9ITA7Zy5tYT1mdW5jdGlvbigpe3ZhciBhPXRoaXMudi54YSh0aGlzKTt0aGlzLmc9YTtIYyh0aGlzLnYsYSk7S2IoYSwhMCk7dGhpcy5pc1Zpc2libGUoKXx8KGEuc3R5bGUuZGlzcGxheT0ibm9uZSIsYSYmYWMoYSwiaGlkZGVuIiwhMCkpfTtnLm5hPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaSgpfTtnLndhPWZ1bmN0aW9uKCl7cmV0dXJuITB9OwpnLkVhPWZ1bmN0aW9uKGEpe3RoaXMuZz1hPXRoaXMudi55YSh0aGlzLGEpO0hjKHRoaXMudixhKTtLYihhLCEwKTt0aGlzLk9hPWEuc3R5bGUuZGlzcGxheSE9Im5vbmUifTsKZy5JPWZ1bmN0aW9uKCl7Ti5sLkkuY2FsbCh0aGlzKTt2YXIgYT10aGlzLmc7cChhLCJDYW4gbm90IGNhbGwgZ2V0RWxlbWVudFN0cmljdCBiZWZvcmUgcmVuZGVyaW5nL2RlY29yYXRpbmcuIik7cCh0aGlzKTtwKGEpO3RoaXMuaXNWaXNpYmxlKCl8fGFjKGEsImhpZGRlbiIsIXRoaXMuaXNWaXNpYmxlKCkpO3RoaXMuaXNFbmFibGVkKCl8fEpjKGEsMSwhdGhpcy5pc0VuYWJsZWQoKSk7dGhpcy5EJjgmJkpjKGEsOCwhISh0aGlzLm0mOCkpO3RoaXMuRCYxNiYmSmMoYSwxNiwhISh0aGlzLm0mMTYpKTt0aGlzLkQmNjQmJkpjKGEsNjQsISEodGhpcy5tJjY0KSk7dmFyIGI9dGhpcy52O1ViKHRoaXMpJiYoYT10aGlzLmkoKSxiPWIuTigpKyItcnRsIiwoYT1hLmk/YS5pKCk6YSkmJnBjKGEsW2JdKSk7dGhpcy5pc0VuYWJsZWQoKSYmSWModGhpcyx0aGlzLmlzVmlzaWJsZSgpKTt0aGlzLkQmLTImJih0aGlzLkhhJiZMYyh0aGlzLCEwKSx0aGlzLkQmMzImJihhPXRoaXMuaSgpKSkmJihiPQp0aGlzLlp8fCh0aGlzLlo9bmV3IEopLGdjKGIsYSksQihCKEIoUWIodGhpcyksYiwia2V5Iix0aGlzLmFhKSxhLCJmb2N1cyIsdGhpcy5YYSksYSwiYmx1ciIsdGhpcy5RYSkpfTt2YXIgTGM9ZnVuY3Rpb24oYSxiKXt2YXIgYz1RYihhKSxkPWEuaSgpO2I/KEIoQihCKEIoYyxkLEsuZ2EsYS5zYSksZCxbSy5oYSxLLmZhXSxhLnZhKSxkLCJtb3VzZW92ZXIiLGEudWEpLGQsIm1vdXNlb3V0IixhLnRhKSxhLmNhIT1CYyYmQihjLGQsImNvbnRleHRtZW51IixhLmNhKSk6KEMoQyhDKEMoYyxkLEsuZ2EsYS5zYSksZCxbSy5oYSxLLmZhXSxhLnZhKSxkLCJtb3VzZW92ZXIiLGEudWEpLGQsIm1vdXNlb3V0IixhLnRhKSxhLmNhIT1CYyYmQyhjLGQsImNvbnRleHRtZW51IixhLmNhKSl9O04ucHJvdG90eXBlLlU9ZnVuY3Rpb24oKXtOLmwuVS5jYWxsKHRoaXMpO3RoaXMuWiYma2ModGhpcy5aKTt0aGlzLmlzVmlzaWJsZSgpJiZ0aGlzLmlzRW5hYmxlZCgpJiZJYyh0aGlzLCExKX07Ck4ucHJvdG90eXBlLkM9ZnVuY3Rpb24oKXtOLmwuQy5jYWxsKHRoaXMpO3RoaXMuWiYmKHRoaXMuWi5kaXNwb3NlKCksZGVsZXRlIHRoaXMuWik7ZGVsZXRlIHRoaXMudjt0aGlzLkZhPXRoaXMuaWE9bnVsbH07dmFyIEZjPWZ1bmN0aW9uKGEsYil7YS5pYT1ifTtOLnByb3RvdHlwZS5pc1Zpc2libGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5PYX07Ti5wcm90b3R5cGUuaXNFbmFibGVkPWZ1bmN0aW9uKCl7cmV0dXJuISh0aGlzLm0mMSl9O04ucHJvdG90eXBlLlg9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5oO2ImJnR5cGVvZiBiLmlzRW5hYmxlZD09ImZ1bmN0aW9uIiYmIWIuaXNFbmFibGVkKCl8fCFPKHRoaXMsMSwhYSl8fChhfHwoTWModGhpcywhMSksUCh0aGlzLCExKSksdGhpcy5pc1Zpc2libGUoKSYmSWModGhpcyxhKSxUKHRoaXMsMSwhYSwhMCkpfTt2YXIgUD1mdW5jdGlvbihhLGIpe08oYSwyLGIpJiZUKGEsMixiKX07Ck4ucHJvdG90eXBlLmlzQWN0aXZlPWZ1bmN0aW9uKCl7cmV0dXJuISEodGhpcy5tJjQpfTsKdmFyIE1jPWZ1bmN0aW9uKGEsYil7TyhhLDQsYikmJlQoYSw0LGIpfSxOYz1mdW5jdGlvbihhLGIpe08oYSw4LGIpJiZUKGEsOCxiKX0sT2M9ZnVuY3Rpb24oYSxiKXtPKGEsNjQsYikmJlQoYSw2NCxiKX0sVD1mdW5jdGlvbihhLGIsYyxkKXtpZighZCYmYj09MSlhLlgoIWMpO2Vsc2UgaWYoYS5EJmImJmMhPSEhKGEubSZiKSl7dmFyIGU9YS52O2lmKGQ9YS5pKCkpe2lmKGU9RWMoZSxiKSl7dmFyIGY9YS5pP2EuaSgpOmE7ZiYmKGM/cGM6cmMpKGYsW2VdKX1KYyhkLGIsYyl9YS5tPWM/YS5tfGI6YS5tJn5ifX0sUGM9ZnVuY3Rpb24oYSxiLGMpe2lmKGEucyYmYS5tJmImJiFjKXRocm93IEVycm9yKCJDb21wb25lbnQgYWxyZWFkeSByZW5kZXJlZCIpOyFjJiZhLm0mYiYmVChhLGIsITEpO2EuRD1jP2EuRHxiOmEuRCZ+Yn0sVT1mdW5jdGlvbihhLGIpe3JldHVybiEhKDI1NSZiKSYmISEoYS5EJmIpfSxPPWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4hIShhLkQmYikmJiEhKGEubSZiKSE9CmMmJighKGEuUCZiKXx8RShhLE5iKGIsYykpKSYmIWEuYmF9O04ucHJvdG90eXBlLnVhPWZ1bmN0aW9uKGEpeyFRYyhhLHRoaXMuaSgpKSYmRSh0aGlzLCJlbnRlciIpJiZ0aGlzLmlzRW5hYmxlZCgpJiZVKHRoaXMsMikmJlAodGhpcywhMCl9O04ucHJvdG90eXBlLnRhPWZ1bmN0aW9uKGEpeyFRYyhhLHRoaXMuaSgpKSYmRSh0aGlzLCJsZWF2ZSIpJiYoVSh0aGlzLDQpJiZNYyh0aGlzLCExKSxVKHRoaXMsMikmJlAodGhpcywhMSkpfTtOLnByb3RvdHlwZS5jYT1CYzt2YXIgUWM9ZnVuY3Rpb24oYSxiKXtyZXR1cm4hIWEucmVsYXRlZFRhcmdldCYmYWIoYixhLnJlbGF0ZWRUYXJnZXQpfTsKTi5wcm90b3R5cGUuc2E9ZnVuY3Rpb24oYSl7aWYodGhpcy5pc0VuYWJsZWQoKSYmKFUodGhpcywyKSYmUCh0aGlzLCEwKSwhKGEuaC5idXR0b24hPTB8fHYmJmEuY3RybEtleSkpKXtVKHRoaXMsNCkmJk1jKHRoaXMsITApO3ZhciBiO2lmKGI9dGhpcy52KXt2YXIgYztiPXRoaXMuRCYzMiYmKGM9dGhpcy5pKCkpP2RiKGMpJiZlYihjKTohMX1iJiZ0aGlzLmkoKS5mb2N1cygpfWEuaC5idXR0b24hPTB8fHYmJmEuY3RybEtleXx8YS5qKCl9O04ucHJvdG90eXBlLnZhPWZ1bmN0aW9uKGEpe3RoaXMuaXNFbmFibGVkKCkmJihVKHRoaXMsMikmJlAodGhpcywhMCksdGhpcy5pc0FjdGl2ZSgpJiZSYyh0aGlzLGEpJiZVKHRoaXMsNCkmJk1jKHRoaXMsITEpKX07CnZhciBSYz1mdW5jdGlvbihhLGIpe2lmKFUoYSwxNikpe3ZhciBjPSEoYS5tJjE2KTtPKGEsMTYsYykmJlQoYSwxNixjKX1VKGEsOCkmJk5jKGEsITApO1UoYSw2NCkmJk9jKGEsIShhLm0mNjQpKTtjPW5ldyB5KCJhY3Rpb24iLGEpO2ImJihjLmFsdEtleT1iLmFsdEtleSxjLmN0cmxLZXk9Yi5jdHJsS2V5LGMubWV0YUtleT1iLm1ldGFLZXksYy5zaGlmdEtleT1iLnNoaWZ0S2V5LGMuRz1iLkcsYy50aW1lU3RhbXA9Yi50aW1lU3RhbXApO3JldHVybiBFKGEsYyl9O04ucHJvdG90eXBlLlhhPWZ1bmN0aW9uKCl7VSh0aGlzLDMyKSYmTyh0aGlzLDMyLCEwKSYmVCh0aGlzLDMyLCEwKX07Ti5wcm90b3R5cGUuUWE9ZnVuY3Rpb24oKXtVKHRoaXMsNCkmJk1jKHRoaXMsITEpO1UodGhpcywzMikmJk8odGhpcywzMiwhMSkmJlQodGhpcywzMiwhMSl9OwpOLnByb3RvdHlwZS5hYT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5pc1Zpc2libGUoKSYmdGhpcy5pc0VuYWJsZWQoKSYmYS5nPT0xMyYmUmModGhpcyxhKT8oYS5qKCksYS52KCksITApOiExfTtpZih0eXBlb2YgTiE9PSJmdW5jdGlvbiIpdGhyb3cgRXJyb3IoIkludmFsaWQgY29tcG9uZW50IGNsYXNzICIrTik7aWYodHlwZW9mIE0hPT0iZnVuY3Rpb24iKXRocm93IEVycm9yKCJJbnZhbGlkIHJlbmRlcmVyIGNsYXNzICIrTSk7dmFyIFNjPW5hKE4pO3VjW1NjXT1NO3RjKCJnb29nLWNvbnRyb2wiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBOKG51bGwpfSk7dmFyIFY9ZnVuY3Rpb24oYSxiLGMpe0YuY2FsbCh0aGlzLGMpO3RoaXMuZWE9Ynx8dmMuVigpO3RoaXMuTD1hfHwidmVydGljYWwifTtuKFYsRik7Zz1WLnByb3RvdHlwZTtnLkthPW51bGw7Zy5kYT1udWxsO2cuZWE9bnVsbDtnLkw9bnVsbDtnLlM9ITA7Zy5UPSEwO2cubz0tMTtnLkI9bnVsbDtnLlc9ITE7Zy5PPW51bGw7dmFyIFRjPWZ1bmN0aW9uKGEpe3JldHVybiBhLkthfHxhLmkoKX07Zz1WLnByb3RvdHlwZTtnLm1hPWZ1bmN0aW9uKCl7dGhpcy5nPXRoaXMuRy5oKCJESVYiLHRoaXMuZWEuaih0aGlzKS5qb2luKCIgIikpfTtnLm5hPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaSgpfTtnLndhPWZ1bmN0aW9uKGEpe3JldHVybiBhLnRhZ05hbWU9PSJESVYifTtnLkVhPWZ1bmN0aW9uKGEpe3RoaXMuZz15Yyh0aGlzLmVhLHRoaXMsYSk7YS5zdHlsZS5kaXNwbGF5PT0ibm9uZSImJih0aGlzLlM9ITEpfTsKZy5JPWZ1bmN0aW9uKCl7Vi5sLkkuY2FsbCh0aGlzKTtUYih0aGlzLGZ1bmN0aW9uKGIpe2IucyYmVWModGhpcyxiKX0sdGhpcyk7dmFyIGE9dGhpcy5pKCk7QWModGhpcy5lYSx0aGlzKTtWYyh0aGlzLHRoaXMuUyk7QihCKEIoQihCKEIoQihCKFFiKHRoaXMpLHRoaXMsImVudGVyIix0aGlzLmViKSx0aGlzLCJoaWdobGlnaHQiLHRoaXMuZmIpLHRoaXMsInVuaGlnaGxpZ2h0Iix0aGlzLmxiKSx0aGlzLCJvcGVuIix0aGlzLmdiKSx0aGlzLCJjbG9zZSIsdGhpcy5iYiksYSxLLmdhLHRoaXMuV2EpLGJiKGEpLFtLLmhhLEsuZmFdLHRoaXMuY2IpLGEsW0suZ2EsSy5oYSxLLmZhLCJtb3VzZW92ZXIiLCJtb3VzZW91dCIsImNvbnRleHRtZW51Il0sdGhpcy5hYik7V2ModGhpcyl9O3ZhciBXYz1mdW5jdGlvbihhKXt2YXIgYj1RYihhKSxjPVRjKGEpO0IoQihCKGIsYywiZm9jdXMiLGEuUGEpLGMsImJsdXIiLGEuVWEpLGEuZGF8fChhLmRhPW5ldyBKKFRjKGEpKSksImtleSIsYS5WYSl9OwpnPVYucHJvdG90eXBlO2cuVT1mdW5jdGlvbigpe1hjKHRoaXMsLTEpO3RoaXMuQiYmT2ModGhpcy5CLCExKTt0aGlzLlc9ITE7Vi5sLlUuY2FsbCh0aGlzKX07Zy5DPWZ1bmN0aW9uKCl7Vi5sLkMuY2FsbCh0aGlzKTt0aGlzLmRhJiYodGhpcy5kYS5kaXNwb3NlKCksdGhpcy5kYT1udWxsKTt0aGlzLmVhPXRoaXMuQj10aGlzLk89dGhpcy5LYT1udWxsfTtnLmViPWZ1bmN0aW9uKCl7cmV0dXJuITB9OwpnLmZiPWZ1bmN0aW9uKGEpe3ZhciBiPVZiKHRoaXMsYS50YXJnZXQpO2lmKGI+LTEmJmIhPXRoaXMubyl7dmFyIGM9SSh0aGlzLHRoaXMubyk7YyYmUChjLCExKTt0aGlzLm89YjtjPUkodGhpcyx0aGlzLm8pO3RoaXMuVyYmTWMoYywhMCk7dGhpcy5CJiZjIT10aGlzLkImJihjLkQmNjQ/T2MoYywhMCk6T2ModGhpcy5CLCExKSl9Yj10aGlzLmkoKTtwKGIsIlRoZSBET00gZWxlbWVudCBmb3IgdGhlIGNvbnRhaW5lciBjYW5ub3QgYmUgbnVsbC4iKTthLnRhcmdldC5pKCkhPW51bGwmJmFjKGIsImFjdGl2ZWRlc2NlbmRhbnQiLGEudGFyZ2V0LmkoKS5pZCl9O2cubGI9ZnVuY3Rpb24oYSl7YS50YXJnZXQ9PUkodGhpcyx0aGlzLm8pJiYodGhpcy5vPS0xKTthPXRoaXMuaSgpO3AoYSwiVGhlIERPTSBlbGVtZW50IGZvciB0aGUgY29udGFpbmVyIGNhbm5vdCBiZSBudWxsLiIpO2EucmVtb3ZlQXR0cmlidXRlKCRiKCJhY3RpdmVkZXNjZW5kYW50IikpfTsKZy5nYj1mdW5jdGlvbihhKXsoYT1hLnRhcmdldCkmJmEhPXRoaXMuQiYmYS5oPT10aGlzJiYodGhpcy5CJiZPYyh0aGlzLkIsITEpLHRoaXMuQj1hKX07Zy5iYj1mdW5jdGlvbihhKXthLnRhcmdldD09dGhpcy5CJiYodGhpcy5CPW51bGwpO3ZhciBiPXRoaXMuaSgpLGM9YS50YXJnZXQuaSgpO2ImJmEudGFyZ2V0Lm0mMiYmYyYmKGE9IiIsYyYmKGE9Yy5pZCxwKGEsIlRoZSBhY3RpdmUgZWxlbWVudCBzaG91bGQgaGF2ZSBhbiBpZC4iKSksYWMoYiwiYWN0aXZlZGVzY2VuZGFudCIsYSkpfTtnLldhPWZ1bmN0aW9uKGEpe3RoaXMuVCYmKHRoaXMuVz0hMCk7dmFyIGI9VGModGhpcyk7YiYmZGIoYikmJmViKGIpP2IuZm9jdXMoKTphLmooKX07Zy5jYj1mdW5jdGlvbigpe3RoaXMuVz0hMX07CmcuYWI9ZnVuY3Rpb24oYSl7YTp7dmFyIGI9YS50YXJnZXQ7aWYodGhpcy5PKWZvcih2YXIgYz10aGlzLmkoKTtiJiZiIT09Yzspe3ZhciBkPWIuaWQ7aWYoZCBpbiB0aGlzLk8pe2I9dGhpcy5PW2RdO2JyZWFrIGF9Yj1iLnBhcmVudE5vZGV9Yj1udWxsfWlmKGIpc3dpdGNoKGEudHlwZSl7Y2FzZSBLLmdhOmIuc2EoYSk7YnJlYWs7Y2FzZSBLLmhhOmNhc2UgSy5mYTpiLnZhKGEpO2JyZWFrO2Nhc2UgIm1vdXNlb3ZlciI6Yi51YShhKTticmVhaztjYXNlICJtb3VzZW91dCI6Yi50YShhKTticmVhaztjYXNlICJjb250ZXh0bWVudSI6Yi5jYShhKX19O2cuUGE9ZnVuY3Rpb24oKXt9O2cuVWE9ZnVuY3Rpb24oKXtYYyh0aGlzLC0xKTt0aGlzLlc9ITE7dGhpcy5CJiZPYyh0aGlzLkIsITEpfTsKZy5WYT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5pc0VuYWJsZWQoKSYmdGhpcy5pc1Zpc2libGUoKSYmKEgodGhpcykhPTB8fHRoaXMuS2EpJiZZYyh0aGlzLGEpPyhhLmooKSxhLnYoKSwhMCk6ITF9Owp2YXIgWWM9ZnVuY3Rpb24oYSxiKXt2YXIgYz1JKGEsYS5vKTtpZihjJiZ0eXBlb2YgYy5hYT09ImZ1bmN0aW9uIiYmYy5hYShiKXx8YS5CJiZhLkIhPWMmJnR5cGVvZiBhLkIuYWE9PSJmdW5jdGlvbiImJmEuQi5hYShiKSlyZXR1cm4hMDtpZihiLnNoaWZ0S2V5fHxiLmN0cmxLZXl8fGIubWV0YUtleXx8Yi5hbHRLZXkpcmV0dXJuITE7c3dpdGNoKGIuZyl7Y2FzZSAyNzpUYyhhKS5ibHVyKCk7YnJlYWs7Y2FzZSAzNjpaYyhhKTticmVhaztjYXNlIDM1OiRjKGEpO2JyZWFrO2Nhc2UgMzg6aWYoYS5MPT0idmVydGljYWwiKWFkKGEpO2Vsc2UgcmV0dXJuITE7YnJlYWs7Y2FzZSAzNzppZihhLkw9PSJob3Jpem9udGFsIilVYihhKT9iZChhKTphZChhKTtlbHNlIHJldHVybiExO2JyZWFrO2Nhc2UgNDA6aWYoYS5MPT0idmVydGljYWwiKWJkKGEpO2Vsc2UgcmV0dXJuITE7YnJlYWs7Y2FzZSAzOTppZihhLkw9PSJob3Jpem9udGFsIilVYihhKT9hZChhKTpiZChhKTtlbHNlIHJldHVybiExOwpicmVhaztkZWZhdWx0OnJldHVybiExfXJldHVybiEwfSxVYz1mdW5jdGlvbihhLGIpe3ZhciBjPWIuaSgpO2M9Yy5pZHx8KGMuaWQ9T2IoYikpO2EuT3x8KGEuTz17fSk7YS5PW2NdPWJ9O1YucHJvdG90eXBlLkJhPWZ1bmN0aW9uKGEsYil7dWEoYSxOLCJUaGUgY2hpbGQgb2YgYSBjb250YWluZXIgbXVzdCBiZSBhIGNvbnRyb2wiKTtWLmwuQmEuY2FsbCh0aGlzLGEsYil9O1YucHJvdG90eXBlLkNhPWZ1bmN0aW9uKGEsYixjKXt1YShhLE4pO2EuUHw9MjthLlB8PTY0O1BjKGEsMzIsITEpO2EucyYmMCE9YS5IYSYmTGMoYSwhMSk7YS5IYT0hMTt2YXIgZD1hLmg9PXRoaXM/VmIodGhpcyxhKTotMTtWLmwuQ2EuY2FsbCh0aGlzLGEsYixjKTthLnMmJnRoaXMucyYmVWModGhpcyxhKTthPWQ7YT09LTEmJihhPUgodGhpcykpO2E9PXRoaXMubz90aGlzLm89TWF0aC5taW4oSCh0aGlzKS0xLGIpOmE+dGhpcy5vJiZiPD10aGlzLm8/dGhpcy5vKys6YTx0aGlzLm8mJmI+dGhpcy5vJiZ0aGlzLm8tLX07CnZhciB6Yz1mdW5jdGlvbihhLGIpe2lmKGEuaSgpKXRocm93IEVycm9yKCJDb21wb25lbnQgYWxyZWFkeSByZW5kZXJlZCIpO2EuTD1ifTtWLnByb3RvdHlwZS5pc1Zpc2libGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5TfTt2YXIgVmM9ZnVuY3Rpb24oYSxiKXthLlM9Yjt2YXIgYz1hLmkoKTtjJiYoYy5zdHlsZS5kaXNwbGF5PWI/IiI6Im5vbmUiLHdjKFRjKGEpLGEuVCYmYS5TKSl9O1YucHJvdG90eXBlLmlzRW5hYmxlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLlR9O1YucHJvdG90eXBlLlg9ZnVuY3Rpb24oYSl7dGhpcy5UIT1hJiZFKHRoaXMsYT8iZW5hYmxlIjoiZGlzYWJsZSIpJiYoYT8odGhpcy5UPSEwLFRiKHRoaXMsZnVuY3Rpb24oYil7Yi5UYT9kZWxldGUgYi5UYTpiLlgoITApfSkpOihUYih0aGlzLGZ1bmN0aW9uKGIpe2IuaXNFbmFibGVkKCk/Yi5YKCExKTpiLlRhPSEwfSksdGhpcy5XPXRoaXMuVD0hMSksd2MoVGModGhpcyksYSYmdGhpcy5TKSl9Owp2YXIgWGM9ZnVuY3Rpb24oYSxiKXsoYj1JKGEsYikpP1AoYiwhMCk6YS5vPi0xJiZQKEkoYSxhLm8pLCExKX0sWmM9ZnVuY3Rpb24oYSl7Y2QoYSxmdW5jdGlvbihiLGMpe3JldHVybihiKzEpJWN9LEgoYSktMSl9LCRjPWZ1bmN0aW9uKGEpe2NkKGEsZnVuY3Rpb24oYixjKXtiLS07cmV0dXJuIGI8MD9jLTE6Yn0sMCl9LGJkPWZ1bmN0aW9uKGEpe2NkKGEsZnVuY3Rpb24oYixjKXtyZXR1cm4oYisxKSVjfSxhLm8pfSxhZD1mdW5jdGlvbihhKXtjZChhLGZ1bmN0aW9uKGIsYyl7Yi0tO3JldHVybiBiPDA/Yy0xOmJ9LGEubyl9LGNkPWZ1bmN0aW9uKGEsYixjKXtjPWM8MD9WYihhLGEuQik6Yzt2YXIgZD1IKGEpO2M9Yi5jYWxsKGEsYyxkKTtmb3IodmFyIGU9MDtlPD1kOyl7dmFyIGY9SShhLGMpO2lmKGYmJmYuaXNWaXNpYmxlKCkmJmYuaXNFbmFibGVkKCkmJmYuRCYyKXthLkxhKGMpO2JyZWFrfWUrKztjPWIuY2FsbChhLGMsZCl9fTsKVi5wcm90b3R5cGUuTGE9ZnVuY3Rpb24oYSl7WGModGhpcyxhKX07dmFyIGRkPWZ1bmN0aW9uKCl7fTtuKGRkLE0pO2lhKGRkKTtnPWRkLnByb3RvdHlwZTtnLk49ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy10YWIifTtnLk5hPWZ1bmN0aW9uKCl7cmV0dXJuInRhYiJ9O2cueGE9ZnVuY3Rpb24oYSl7dmFyIGI9ZGQubC54YS5jYWxsKHRoaXMsYSk7KGE9YS5HYSgpKSYmdGhpcy5NYShiLGEpO3JldHVybiBifTtnLnlhPWZ1bmN0aW9uKGEsYil7Yj1kZC5sLnlhLmNhbGwodGhpcyxhLGIpO3ZhciBjPXRoaXMuR2EoYik7YyYmKGEuUmE9Yyk7YS5tJjgmJihjPWEuaCkmJnR5cGVvZiBjLko9PT0iZnVuY3Rpb24iJiYoVChhLDgsITEpLGMuSihhKSk7cmV0dXJuIGJ9O2cuR2E9ZnVuY3Rpb24oYSl7cmV0dXJuIGEudGl0bGV8fCIifTtnLk1hPWZ1bmN0aW9uKGEsYil7YSYmKGEudGl0bGU9Ynx8IiIpfTt2YXIgZWQ9ZnVuY3Rpb24oYSxiLGMpe04uY2FsbCh0aGlzLGEsYnx8ZGQuVigpLGMpO1BjKHRoaXMsOCwhMCk7dGhpcy5QfD05fTtuKGVkLE4pO2VkLnByb3RvdHlwZS5HYT1mdW5jdGlvbigpe3JldHVybiB0aGlzLlJhfTtlZC5wcm90b3R5cGUuTWE9ZnVuY3Rpb24oYSl7dGhpcy52Lk1hKHRoaXMuaSgpLGEpO3RoaXMuUmE9YX07dGMoImdvb2ctdGFiIixmdW5jdGlvbigpe3JldHVybiBuZXcgZWQobnVsbCl9KTt2YXIgVz1mdW5jdGlvbigpe3RoaXMuQT0idGFibGlzdCJ9O24oVyx2Yyk7aWEoVyk7Vy5wcm90b3R5cGUuZz1mdW5jdGlvbigpe3JldHVybiJnb29nLXRhYi1iYXIifTtXLnByb3RvdHlwZS51PWZ1bmN0aW9uKGEsYixjKXt0aGlzLnZ8fCh0aGlzLmh8fGZkKHRoaXMpLHRoaXMudj1FYSh0aGlzLmgpKTt2YXIgZD10aGlzLnZbYl07ZD8oemMoYSxnZChkKSksYS52PWQpOlcubC51LmNhbGwodGhpcyxhLGIsYyl9O1cucHJvdG90eXBlLmo9ZnVuY3Rpb24oYSl7dmFyIGI9Vy5sLmouY2FsbCh0aGlzLGEpO3RoaXMuaHx8ZmQodGhpcyk7Yi5wdXNoKHRoaXMuaFthLnZdKTtyZXR1cm4gYn07dmFyIGZkPWZ1bmN0aW9uKGEpe3ZhciBiPWEuZygpO2EuaD17dG9wOmIrIi10b3AiLGJvdHRvbTpiKyItYm90dG9tIixzdGFydDpiKyItc3RhcnQiLGVuZDpiKyItZW5kIn19O3ZhciBYPWZ1bmN0aW9uKGEsYixjKXthPWF8fCJ0b3AiO3pjKHRoaXMsZ2QoYSkpO3RoaXMudj1hO1YuY2FsbCh0aGlzLHRoaXMuTCxifHxXLlYoKSxjKTtoZCh0aGlzKX07bihYLFYpO2c9WC5wcm90b3R5cGU7Zy5IPW51bGw7Zy5JPWZ1bmN0aW9uKCl7WC5sLkkuY2FsbCh0aGlzKTtoZCh0aGlzKX07Zy5DPWZ1bmN0aW9uKCl7WC5sLkMuY2FsbCh0aGlzKTt0aGlzLkg9bnVsbH07Zy5MYT1mdW5jdGlvbihhKXtYLmwuTGEuY2FsbCh0aGlzLGEpO3RoaXMuSihJKHRoaXMsYSkpfTtnLko9ZnVuY3Rpb24oYSl7YT9OYyhhLCEwKTp0aGlzLkgmJk5jKHRoaXMuSCwhMSl9Owp2YXIgaWQ9ZnVuY3Rpb24oYSxiKXtpZihiJiZiPT1hLkgpe2Zvcih2YXIgYz1WYihhLGIpLGQ9Yy0xO2I9SShhLGQpO2QtLSl7dmFyIGU9YjtpZihlLmlzVmlzaWJsZSgpJiZlLmlzRW5hYmxlZCgpKXthLkooYik7cmV0dXJufX1mb3IoYys9MTtiPUkoYSxjKTtjKyspaWYoZD1iLGQuaXNWaXNpYmxlKCkmJmQuaXNFbmFibGVkKCkpe2EuSihiKTtyZXR1cm59YS5KKG51bGwpfX07Zz1YLnByb3RvdHlwZTtnLmpiPWZ1bmN0aW9uKGEpe3RoaXMuSCYmdGhpcy5IIT1hLnRhcmdldCYmTmModGhpcy5ILCExKTt0aGlzLkg9YS50YXJnZXR9O2cua2I9ZnVuY3Rpb24oYSl7YS50YXJnZXQ9PXRoaXMuSCYmKHRoaXMuSD1udWxsKX07Zy5oYj1mdW5jdGlvbihhKXtpZCh0aGlzLGEudGFyZ2V0KX07Zy5pYj1mdW5jdGlvbihhKXtpZCh0aGlzLGEudGFyZ2V0KX07Zy5QYT1mdW5jdGlvbigpe0kodGhpcyx0aGlzLm8pfHxYYyh0aGlzLFZiKHRoaXMsdGhpcy5IfHxJKHRoaXMsMCkpKX07CnZhciBoZD1mdW5jdGlvbihhKXtCKEIoQihCKFFiKGEpLGEsInNlbGVjdCIsYS5qYiksYSwidW5zZWxlY3QiLGEua2IpLGEsImRpc2FibGUiLGEuaGIpLGEsImhpZGUiLGEuaWIpfSxnZD1mdW5jdGlvbihhKXtyZXR1cm4gYT09InN0YXJ0Inx8YT09ImVuZCI/InZlcnRpY2FsIjoiaG9yaXpvbnRhbCJ9O3RjKCJnb29nLXRhYi1iYXIiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBYfSk7ZnVuY3Rpb24gamQoYSl7dmFyIGI9e3RvcDoiYm90dG9tIixib3R0b206InRvcCIsc3RhcnQ6InJpZ2h0IixlbmQ6ImxlZnQifVthLmxvY2F0aW9uXSxjPWEuZWxlbWVudElkLGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTtkLnRleHRDb250ZW50PSJcbiAgICBmaWVsZHNldCB7XG4gICAgICBwYWRkaW5nOiAxMHB4O1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgIzM2OTtcbiAgICB9XG5cbiAgICAjIitjKyIgLmdvb2ctdGFiLWNvbnRlbnQge1xuICAgICAgbWluLWhlaWdodDogM2VtO1xuICAgICAgbWFyZ2luOiAwO1xuICAgICAgYm9yZGVyOiAiK2EuYm9yZGVyKyIgc29saWQgIithLmJvcmRlckNvbG9yKyI7XG4gICAgICBib3JkZXItdG9wOiAwO1xuICAgICAgaGVpZ2h0OiAiK2EuY29udGVudEhlaWdodCsiO1xuICAgICAgcGFkZGluZzogNHB4IDhweDtcbiAgICAgIG1hcmdpbi1yaWdodDogNHB4O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgIG92ZXJmbG93OiBhdXRvO1xuICAgIH1cblxuICAgICMiKwpjKyIgLmdvb2ctdGFiLWJhci0iK2EubG9jYXRpb24rIiAuZ29vZy10YWItc2VsZWN0ZWQge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICIrYS5ib3JkZXJDb2xvcisiO1xuICAgICAgYm9yZGVyLSIrYisiOiAwcHg7XG4gICAgfVxuXG4gICAgIyIrYysiIC5nb29nLXRhYi1iYXItIithLmxvY2F0aW9uKyIge1xuICAgICAgcGFkZGluZy0iK2EubG9jYXRpb24rIjogNXB4ICFpbXBvcnRhbnQ7XG4gICAgICBib3JkZXItIitiKyI6IDFweCBzb2xpZCAiK2EuYm9yZGVyQ29sb3IrIiAhaW1wb3J0YW50O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICB9XG5cbiAgICAjIitjKyIgLmdvb2ctdGFiLWJhciB7XG4gICAgICAgbWFyZ2luOiAwO1xuICAgICAgIGJvcmRlcjogMDtcbiAgICAgICBwYWRkaW5nOiAwO1xuICAgICAgIGxpc3Qtc3R5bGU6IG5vbmU7XG4gICAgICAgY3Vyc29yOiBkZWZhdWx0O1xuICAgICAgIG91dGxpbmU6IG5vbmU7XG4gICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgICBtYXJnaW4tcmlnaHQ6IDRweDtcbiAgICAgIH1cblxuICAgICAjIisKYysiIC5nb29nLXRhYiB7XG4gICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgIHBhZGRpbmc6IDRweCA4cHg7XG4gICAgICAgY29sb3I6IHZhcigtLWNvbGFiLXByaW1hcnktdGV4dC1jb2xvcik7XG4gICAgICAgdGV4dC1kZWNvcmF0aW9uOiBpbml0aWFsO1xuICAgICAgIGN1cnNvcjogZGVmYXVsdDtcbiAgICAgIH1cblxuICAgICAgIyIrYysiIC5nb29nLXRhYi1ob3ZlciB7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWNvbGFiLWhpZ2hsaWdodGVkLXN1cmZhY2UtY29sb3IpO1xuICAgICAgfVxuICAgICAgIjtyZXR1cm4gZH0KdmFyIGtkPWZ1bmN0aW9uKGEpe3ZhciBiPWEuZWxlbWVudElkLGM9YS50YWJOYW1lcyxkPWEuc2VsZWN0ZWRJbmRleDsiY29udGVudEJvcmRlciJpbiBhfHwoYS5jb250ZW50Qm9yZGVyPSIwcHgiKTsiY29udGVudEhlaWdodCJpbiBhfHwoYS5jb250ZW50SGVpZ2h0PSJpbml0aWFsIik7ImJvcmRlckNvbG9yImluIGF8fChhLmJvcmRlckNvbG9yPSJ2YXIoLS1jb2xhYi1ib3JkZXItY29sb3IpIik7YS5sb2NhdGlvbnx8KGEubG9jYXRpb249InRvcCIpO3ZhciBlPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiMiK2IpLGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zi5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYi1iYXIiKTt2YXIgaD1hLmxvY2F0aW9uO2YuY2xhc3NMaXN0LmFkZCgiZ29vZy10YWItYmFyLSIraCk7Zm9yKHZhciBrPVtdLHE9ZmEoYyksRz1xLm5leHQoKTshRy5kb25lO0c9cS5uZXh0KCkpe0c9Ry52YWx1ZTt2YXIgeD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKeC5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYiIpO3gudGV4dENvbnRlbnQ9RztmLmFwcGVuZENoaWxkKHgpO2sucHVzaCh4KX1oIT0iYm90dG9tIiYmZS5hcHBlbmRDaGlsZChmKTtxPW51bGw7aWYoaD09InRvcCJ8fGg9PSJib3R0b20iKXE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikscS5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYi1iYXItY2xlYXIiKTtoPT0idG9wIiYmcSYmZS5hcHBlbmRDaGlsZChxKTtHPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO0cuY2xhc3NMaXN0LmFkZCgiZ29vZy10YWItY29udGVudCIpO3ZhciBoYT1bXTtjPWZhKGMpO2Zvcih4PWMubmV4dCgpOyF4LmRvbmU7eD1jLm5leHQoKSl4PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHguaWQ9ZS5pZCsiX2NvbnRlbnRfIitoYS5sZW5ndGgseC5zdHlsZS5kaXNwbGF5PSJub25lIixHLmFwcGVuZENoaWxkKHgpLGhhLnB1c2goeCk7ZS5hcHBlbmRDaGlsZChHKTtoPT0iYm90dG9tIiYmKHEmJgplLmFwcGVuZENoaWxkKHEpLGUuYXBwZW5kQ2hpbGQoZikpO3ZhciBRPW5ldyBYKGgpO1NiKFEsZik7dmFyIFI9LTE7d2IoUSwic2VsZWN0IixmdW5jdGlvbihTKXtTPWsuaW5kZXhPZihTLnRhcmdldC5pKCkpO1MhPVImJihSPj0wJiZSPGhhLmxlbmd0aCYmKGhhW1JdLnN0eWxlLmRpc3BsYXk9Im5vbmUiLFI9LTEpLFM+PTAmJlM8aGEubGVuZ3RoJiYoUj1TLGhhW1JdLnN0eWxlLmRpc3BsYXk9ImlubGluZSIsd2luZG93LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCJyZXNpemUiKSksZ29vZ2xlLmNvbGFiLm91dHB1dC5yZXNpemVJZnJhbWVUb0NvbnRlbnQoKSksUS5KKEkoUSxSKSkpfSk7US5KKEkoUSxkKSk7d2luZG93W2JdPXtzZXRTZWxlY3RlZFRhYkluZGV4OmZ1bmN0aW9uKFMpe1EuSihJKFEsUykpfX07ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChqZChhKSl9LGxkPVsiY29sYWJfbGliIiwiY3JlYXRlVGFiQmFyIl0sWT1sOwpsZFswXWluIFl8fHR5cGVvZiBZLmV4ZWNTY3JpcHQ9PSJ1bmRlZmluZWQifHxZLmV4ZWNTY3JpcHQoInZhciAiK2xkWzBdKTtmb3IodmFyIFo7bGQubGVuZ3RoJiYoWj1sZC5zaGlmdCgpKTspbGQubGVuZ3RofHxrZD09PXZvaWQgMD9ZW1pdJiZZW1pdIT09T2JqZWN0LnByb3RvdHlwZVtaXT9ZPVlbWl06WT1ZW1pdPXt9OllbWl09a2Q7fSkuY2FsbCh0aGlzKTsKLy8gY2xhbmctZm9ybWF0IG9uCg==", + "ok": true, + "headers": [ + [ + "content-length", + "41785" + ], + [ + "content-type", + "application/javascript" + ] + ], + "status": 200, + "status_text": "" + } + }, + "base_uri": "https://localhost:8080/", + "height": 197 + }, + "outputId": "923bf7d0-9e72-4c2f-d07e-0d5d3e4ea4f8" + }, + "source": [ + "%%logica Test\n", + "\n", + "Test(y: value) :-\n", + " value == x * x + 2 * x + 5,\n", + " x == 10;\n" + ], + "execution_count": 9, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e72e6bca-d22c-11ef-a7c0-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id9\", \"tabNames\": [\"Test\", \"(Log)\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_c3145e59cc" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e72ed128-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id9\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_f7e92206a6" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e730a48a-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_d163e1d051" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e7317e96-d22c-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id9_content_1\");\n", + "//# sourceURL=js_8a903a21f3" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e731e3ea-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"e7317e96-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_651caaf999" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e732452e-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id9\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_5d6400b84b" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e7352f8c-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"e730a48a-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_0df88ed033" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e737e736-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_fa6322d56a" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e738453c-d22c-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id9_content_0\");\n", + "//# sourceURL=js_32e5710877" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e738a158-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"e738453c-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_295c1abaa1" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e738f414-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id9\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_10f241192c" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e73aea76-d22c-11ef-a7c0-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id10\", \"tabNames\": [\"SQL\", \"Result\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_adba74052d" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e73b2a0e-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id10\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_8f2158e272" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e73ccc1a-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_db6710e0e7" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e73d0dba-d22c-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id10_content_0\");\n", + "//# sourceURL=js_e1603d9392" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e73d4adc-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"e73d0dba-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_376c34400a" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e73e0422-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id10\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_fbc0dee8fa" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The following query is stored at \u001b[1mTest_sql\u001b[0m variable.\n", + "-- Initializing DuckDB environment.\n", + "create schema if not exists logica_home;\n", + "-- Empty record, has to have a field by DuckDB syntax.\n", + "drop type if exists logicarecord893574736 cascade; create type logicarecord893574736 as struct(nirvana numeric);\n", + "create sequence if not exists eternal_logical_sequence;\n", + "\n", + "\n", + "-- Logica type: logicarecord481217614\n", + "drop type if exists logicarecord481217614 cascade; create type logicarecord481217614 as struct(r logicarecord893574736);\n", + "\n", + "-- Logica type: logicarecord383307722\n", + "drop type if exists logicarecord383307722 cascade; create type logicarecord383307722 as struct(a timestamp);\n", + "SELECT\n", + " ((((((10) * (10))) + (((2) * (10))))) + (5)) AS y;\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e73eedec-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"e73ccc1a-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_9372ca2fe6" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e7409e3a-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_274ae0c4a6" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e740e8d6-d22c-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id10_content_1\");\n", + "//# sourceURL=js_12da8b1af8" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e74129fe-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"e740e8d6-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_c92b7a7be6" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e74169b4-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id10\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_d349222fed" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The following table is stored at \u001b[1mTest\u001b[0m variable.\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
y
0125
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e7430a6c-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"e7409e3a-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_74838f2210" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e7449242-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"e737e736-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_f52b2750cb" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e746cd1e-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_0581448842" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e747622e-d22c-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id9_content_1\");\n", + "//# sourceURL=js_895c9504e7" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e747af5e-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"e747622e-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_ed96be7157" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e7486caa-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id9\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_a13d9ba173" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "image/svg+xml": "\n\n\n\n\n\nConcertina\n\n\n\nTest\n\nTest\n\n\n\n", + "text/plain": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Running predicate: Test (10 ms)\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e766a3c8-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"e746cd1e-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_8250b8f957" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e76a0f54-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_3aa09efe33" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e76a5b26-d22c-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id9_content_0\");\n", + "//# sourceURL=js_2a13e5df96" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e76af7c0-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"e76a5b26-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_f1c8cbabae" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e76b838e-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id9\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_b359d6b12f" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e76d2d74-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_eca493b843" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e76db550-d22c-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id10_content_1\");\n", + "//# sourceURL=js_45e71b4110" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e76e5d0c-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"e76db550-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_ede6234c1b" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e76ea67c-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id10\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_753b3b2f35" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e770f26a-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"e76d2d74-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_65db11a2bd" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + " \n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e7738322-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"e76a0f54-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_a31e6efcc5" + ] + }, + "metadata": {} + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "zQ5x660dMNXT" + }, + "source": [ + "There are a couple of syntactical conventions regarding field names.\n", + "\n", + "If field value is omitted, then it is assumed that field value is the variable with the same name as field name.\n", + "\n", + "If field name is omitted then field name is assumed to be equal to colX, where X is at which position the field stands." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "FVHSuIyGXjXP", + "colab": { + "resources": { + "http://localhost:8080/nbextensions/google.colab/tabbar.css": { + "data": "Lmdvb2ctdGFie3Bvc2l0aW9uOnJlbGF0aXZlO3BhZGRpbmc6NHB4IDhweDtjb2xvcjojMDBjO3RleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7Y3Vyc29yOmRlZmF1bHR9Lmdvb2ctdGFiLWJhci10b3AgLmdvb2ctdGFie21hcmdpbjoxcHggNHB4IDAgMDtib3JkZXItYm90dG9tOjA7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLXRvcDphZnRlciwuZ29vZy10YWItYmFyLWJvdHRvbTphZnRlcntjb250ZW50OiIgIjtkaXNwbGF5OmJsb2NrO2hlaWdodDowO2NsZWFyOmJvdGg7dmlzaWJpbGl0eTpoaWRkZW59Lmdvb2ctdGFiLWJhci1ib3R0b20gLmdvb2ctdGFie21hcmdpbjowIDRweCAxcHggMDtib3JkZXItdG9wOjA7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLXN0YXJ0IC5nb29nLXRhYnttYXJnaW46MCAwIDRweCAxcHg7Ym9yZGVyLXJpZ2h0OjB9Lmdvb2ctdGFiLWJhci1lbmQgLmdvb2ctdGFie21hcmdpbjowIDFweCA0cHggMDtib3JkZXItbGVmdDowfS5nb29nLXRhYi1ob3ZlcntiYWNrZ3JvdW5kOiNlZWV9Lmdvb2ctdGFiLWRpc2FibGVke2NvbG9yOiM2NjZ9Lmdvb2ctdGFiLXNlbGVjdGVke2NvbG9yOiMwMDA7YmFja2dyb3VuZDojZmZmO3RleHQtZGVjb3JhdGlvbjpub25lO2ZvbnQtd2VpZ2h0OmJvbGQ7Ym9yZGVyOjFweCBzb2xpZCAjNmI5MGRhfS5nb29nLXRhYi1iYXItdG9we3BhZGRpbmctdG9wOjVweCFpbXBvcnRhbnQ7cGFkZGluZy1sZWZ0OjVweCFpbXBvcnRhbnQ7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgIzZiOTBkYSFpbXBvcnRhbnR9Lmdvb2ctdGFiLWJhci10b3AgLmdvb2ctdGFiLXNlbGVjdGVke3RvcDoxcHg7bWFyZ2luLXRvcDowO3BhZGRpbmctYm90dG9tOjVweH0uZ29vZy10YWItYmFyLWJvdHRvbSAuZ29vZy10YWItc2VsZWN0ZWR7dG9wOi0xcHg7bWFyZ2luLWJvdHRvbTowO3BhZGRpbmctdG9wOjVweH0uZ29vZy10YWItYmFyLXN0YXJ0IC5nb29nLXRhYi1zZWxlY3RlZHtsZWZ0OjFweDttYXJnaW4tbGVmdDowO3BhZGRpbmctcmlnaHQ6OXB4fS5nb29nLXRhYi1iYXItZW5kIC5nb29nLXRhYi1zZWxlY3RlZHtsZWZ0Oi0xcHg7bWFyZ2luLXJpZ2h0OjA7cGFkZGluZy1sZWZ0OjlweH0uZ29vZy10YWItYmFye21hcmdpbjowO2JvcmRlcjowO3BhZGRpbmc6MDtsaXN0LXN0eWxlOm5vbmU7Y3Vyc29yOmRlZmF1bHQ7b3V0bGluZTpub25lO2JhY2tncm91bmQ6I2ViZWZmOX0uZ29vZy10YWItYmFyLWNsZWFye2NsZWFyOmJvdGg7aGVpZ2h0OjA7b3ZlcmZsb3c6aGlkZGVufS5nb29nLXRhYi1iYXItc3RhcnR7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLWVuZHtmbG9hdDpyaWdodH0qIGh0bWwgLmdvb2ctdGFiLWJhci1zdGFydHttYXJnaW4tcmlnaHQ6LTNweH0qIGh0bWwgLmdvb2ctdGFiLWJhci1lbmR7bWFyZ2luLWxlZnQ6LTNweH1zZW50aW5lbHt9", + "ok": true, + "headers": [ + [ + "content-length", + "1404" + ], + [ + "content-type", + "text/css" + ] + ], + "status": 200, + "status_text": "" + }, + "http://localhost:8080/nbextensions/google.colab/tabbar_main.min.js": { + "data": "Ly8gY2xhbmctZm9ybWF0IG9mZgooZnVuY3Rpb24oKXt2YXIgZyxhYT1mdW5jdGlvbihhKXt2YXIgYj0wO3JldHVybiBmdW5jdGlvbigpe3JldHVybiBiPGEubGVuZ3RoP3tkb25lOiExLHZhbHVlOmFbYisrXX06e2RvbmU6ITB9fX0sYmE9dHlwZW9mIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzPT0iZnVuY3Rpb24iP09iamVjdC5kZWZpbmVQcm9wZXJ0eTpmdW5jdGlvbihhLGIsYyl7aWYoYT09QXJyYXkucHJvdG90eXBlfHxhPT1PYmplY3QucHJvdG90eXBlKXJldHVybiBhO2FbYl09Yy52YWx1ZTtyZXR1cm4gYX0sY2E9ZnVuY3Rpb24oYSl7YT1bIm9iamVjdCI9PXR5cGVvZiBnbG9iYWxUaGlzJiZnbG9iYWxUaGlzLGEsIm9iamVjdCI9PXR5cGVvZiB3aW5kb3cmJndpbmRvdywib2JqZWN0Ij09dHlwZW9mIHNlbGYmJnNlbGYsIm9iamVjdCI9PXR5cGVvZiBnbG9iYWwmJmdsb2JhbF07Zm9yKHZhciBiPTA7YjxhLmxlbmd0aDsrK2Ipe3ZhciBjPWFbYl07aWYoYyYmYy5NYXRoPT1NYXRoKXJldHVybiBjfXRocm93IEVycm9yKCJDYW5ub3QgZmluZCBnbG9iYWwgb2JqZWN0Iik7Cn0sZGE9Y2EodGhpcyksZWE9ZnVuY3Rpb24oYSxiKXtpZihiKWE6e3ZhciBjPWRhO2E9YS5zcGxpdCgiLiIpO2Zvcih2YXIgZD0wO2Q8YS5sZW5ndGgtMTtkKyspe3ZhciBlPWFbZF07aWYoIShlIGluIGMpKWJyZWFrIGE7Yz1jW2VdfWE9YVthLmxlbmd0aC0xXTtkPWNbYV07Yj1iKGQpO2IhPWQmJmIhPW51bGwmJmJhKGMsYSx7Y29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOmJ9KX19OwplYSgiU3ltYm9sIixmdW5jdGlvbihhKXtpZihhKXJldHVybiBhO3ZhciBiPWZ1bmN0aW9uKGYsaCl7dGhpcy5nPWY7YmEodGhpcywiZGVzY3JpcHRpb24iLHtjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6aH0pfTtiLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmd9O3ZhciBjPSJqc2NvbXBfc3ltYm9sXyIrKE1hdGgucmFuZG9tKCkqMUU5Pj4+MCkrIl8iLGQ9MCxlPWZ1bmN0aW9uKGYpe2lmKHRoaXMgaW5zdGFuY2VvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoIlN5bWJvbCBpcyBub3QgYSBjb25zdHJ1Y3RvciIpO3JldHVybiBuZXcgYihjKyhmfHwiIikrIl8iK2QrKyxmKX07cmV0dXJuIGV9KTsKdmFyIGZhPWZ1bmN0aW9uKGEpe3ZhciBiPXR5cGVvZiBTeW1ib2whPSJ1bmRlZmluZWQiJiZTeW1ib2wuaXRlcmF0b3ImJmFbU3ltYm9sLml0ZXJhdG9yXTtpZihiKXJldHVybiBiLmNhbGwoYSk7aWYodHlwZW9mIGEubGVuZ3RoPT0ibnVtYmVyIilyZXR1cm57bmV4dDphYShhKX07dGhyb3cgRXJyb3IoU3RyaW5nKGEpKyIgaXMgbm90IGFuIGl0ZXJhYmxlIG9yIEFycmF5TGlrZSIpO307ZWEoIlN5bWJvbC5kaXNwb3NlIixmdW5jdGlvbihhKXtyZXR1cm4gYT9hOlN5bWJvbCgiU3ltYm9sLmRpc3Bvc2UiKX0pOy8qCgogQ29weXJpZ2h0IFRoZSBDbG9zdXJlIExpYnJhcnkgQXV0aG9ycy4KIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wCiovCnZhciBsPXRoaXN8fHNlbGYsaWE9ZnVuY3Rpb24oYSl7YS5JYT12b2lkIDA7YS5WPWZ1bmN0aW9uKCl7cmV0dXJuIGEuSWE/YS5JYTphLklhPW5ldyBhfX0samE9ZnVuY3Rpb24oYSl7dmFyIGI9dHlwZW9mIGE7cmV0dXJuIGIhPSJvYmplY3QiP2I6YT9BcnJheS5pc0FycmF5KGEpPyJhcnJheSI6YjoibnVsbCJ9LGthPWZ1bmN0aW9uKGEpe3ZhciBiPWphKGEpO3JldHVybiBiPT0iYXJyYXkifHxiPT0ib2JqZWN0IiYmdHlwZW9mIGEubGVuZ3RoPT0ibnVtYmVyIn0sbT1mdW5jdGlvbihhKXt2YXIgYj10eXBlb2YgYTtyZXR1cm4gYj09Im9iamVjdCImJmEhPW51bGx8fGI9PSJmdW5jdGlvbiJ9LG5hPWZ1bmN0aW9uKGEpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYSxsYSkmJmFbbGFdfHwoYVtsYV09KyttYSl9LGxhPSJjbG9zdXJlX3VpZF8iKyhNYXRoLnJhbmRvbSgpKjFFOT4+PjApLG1hPTAsbj1mdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoKXt9Yy5wcm90b3R5cGU9CmIucHJvdG90eXBlO2EubD1iLnByb3RvdHlwZTthLnByb3RvdHlwZT1uZXcgYzthLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1hO2EucWQ9ZnVuY3Rpb24oZCxlLGYpe2Zvcih2YXIgaD1BcnJheShhcmd1bWVudHMubGVuZ3RoLTIpLGs9MjtrPGFyZ3VtZW50cy5sZW5ndGg7aysrKWhbay0yXT1hcmd1bWVudHNba107cmV0dXJuIGIucHJvdG90eXBlW2VdLmFwcGx5KGQsaCl9fTtmdW5jdGlvbiBvYShhLGIpe2lmKEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKUVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsb2EpO2Vsc2V7dmFyIGM9RXJyb3IoKS5zdGFjaztjJiYodGhpcy5zdGFjaz1jKX1hJiYodGhpcy5tZXNzYWdlPVN0cmluZyhhKSk7YiE9PXZvaWQgMCYmKHRoaXMuY2F1c2U9Yil9bihvYSxFcnJvcik7b2EucHJvdG90eXBlLm5hbWU9IkN1c3RvbUVycm9yIjt2YXIgcGE7ZnVuY3Rpb24gcWEoYSxiKXthPWEuc3BsaXQoIiVzIik7Zm9yKHZhciBjPSIiLGQ9YS5sZW5ndGgtMSxlPTA7ZTxkO2UrKyljKz1hW2VdKyhlPGIubGVuZ3RoP2JbZV06IiVzIik7b2EuY2FsbCh0aGlzLGMrYVtkXSl9bihxYSxvYSk7cWEucHJvdG90eXBlLm5hbWU9IkFzc2VydGlvbkVycm9yIjtmdW5jdGlvbiByYShhLGIsYyxkKXt2YXIgZT0iQXNzZXJ0aW9uIGZhaWxlZCI7aWYoYyl7ZSs9IjogIitjO3ZhciBmPWR9ZWxzZSBhJiYoZSs9IjogIithLGY9Yik7dGhyb3cgbmV3IHFhKCIiK2UsZnx8W10pO30KdmFyIHA9ZnVuY3Rpb24oYSxiLGMpe2F8fHJhKCIiLG51bGwsYixBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMikpO3JldHVybiBhfSxzYT1mdW5jdGlvbihhLGIsYyl7bShhKSYmYS5ub2RlVHlwZT09MXx8cmEoIkV4cGVjdGVkIEVsZW1lbnQgYnV0IGdvdCAlczogJXMuIixbamEoYSksYV0sYixBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMikpfSx1YT1mdW5jdGlvbihhLGIsYyxkKXthIGluc3RhbmNlb2YgYnx8cmEoIkV4cGVjdGVkIGluc3RhbmNlb2YgJXMgYnV0IGdvdCAlcy4iLFt0YShiKSx0YShhKV0sYyxBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMykpfTsKZnVuY3Rpb24gdGEoYSl7cmV0dXJuIGEgaW5zdGFuY2VvZiBGdW5jdGlvbj9hLmRpc3BsYXlOYW1lfHxhLm5hbWV8fCJ1bmtub3duIHR5cGUgbmFtZSI6YSBpbnN0YW5jZW9mIE9iamVjdD9hLmNvbnN0cnVjdG9yLmRpc3BsYXlOYW1lfHxhLmNvbnN0cnVjdG9yLm5hbWV8fE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhKTphPT09bnVsbD8ibnVsbCI6dHlwZW9mIGF9O3ZhciB2YT1BcnJheS5wcm90b3R5cGUuaW5kZXhPZj9mdW5jdGlvbihhLGIpe3AoYS5sZW5ndGghPW51bGwpO3JldHVybiBBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKGEsYix2b2lkIDApfTpmdW5jdGlvbihhLGIpe2lmKHR5cGVvZiBhPT09InN0cmluZyIpcmV0dXJuIHR5cGVvZiBiIT09InN0cmluZyJ8fGIubGVuZ3RoIT0xPy0xOmEuaW5kZXhPZihiLDApO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWlmKGMgaW4gYSYmYVtjXT09PWIpcmV0dXJuIGM7cmV0dXJuLTF9LHdhPUFycmF5LnByb3RvdHlwZS5mb3JFYWNoP2Z1bmN0aW9uKGEsYil7cChhLmxlbmd0aCE9bnVsbCk7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChhLGIsdm9pZCAwKX06ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9YS5sZW5ndGgsZD10eXBlb2YgYT09PSJzdHJpbmciP2Euc3BsaXQoIiIpOmEsZT0wO2U8YztlKyspZSBpbiBkJiZiLmNhbGwodm9pZCAwLGRbZV0sZSxhKX07CmZ1bmN0aW9uIHhhKGEsYil7Yj12YShhLGIpO3ZhciBjO2lmKGM9Yj49MClwKGEubGVuZ3RoIT1udWxsKSxBcnJheS5wcm90b3R5cGUuc3BsaWNlLmNhbGwoYSxiLDEpO3JldHVybiBjfWZ1bmN0aW9uIHlhKGEpe3ZhciBiPWEubGVuZ3RoO2lmKGI+MCl7Zm9yKHZhciBjPUFycmF5KGIpLGQ9MDtkPGI7ZCsrKWNbZF09YVtkXTtyZXR1cm4gY31yZXR1cm5bXX1mdW5jdGlvbiB6YShhLGIsYyxkKXtwKGEubGVuZ3RoIT1udWxsKTtBcnJheS5wcm90b3R5cGUuc3BsaWNlLmFwcGx5KGEsQWEoYXJndW1lbnRzLDEpKX1mdW5jdGlvbiBBYShhLGIsYyl7cChhLmxlbmd0aCE9bnVsbCk7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg8PTI/QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYSxiKTpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhLGIsYyl9O2Z1bmN0aW9uIEJhKGEsYixjKXtmb3IodmFyIGQgaW4gYSliLmNhbGwoYyxhW2RdLGQsYSl9ZnVuY3Rpb24gQ2EoYSxiKXtmb3IodmFyIGMgaW4gYSlpZihhW2NdPT1iKXJldHVybiEwO3JldHVybiExfWZ1bmN0aW9uIERhKGEsYixjKXtpZihhIT09bnVsbCYmYiBpbiBhKXRocm93IEVycm9yKCdUaGUgb2JqZWN0IGFscmVhZHkgY29udGFpbnMgdGhlIGtleSAiJytiKyciJyk7YVtiXT1jfWZ1bmN0aW9uIEVhKGEpe3ZhciBiPXt9LGM7Zm9yKGMgaW4gYSliW2FbY11dPWM7cmV0dXJuIGJ9dmFyIEZhPSJjb25zdHJ1Y3RvciBoYXNPd25Qcm9wZXJ0eSBpc1Byb3RvdHlwZU9mIHByb3BlcnR5SXNFbnVtZXJhYmxlIHRvTG9jYWxlU3RyaW5nIHRvU3RyaW5nIHZhbHVlT2YiLnNwbGl0KCIgIik7CmZ1bmN0aW9uIEdhKGEsYil7Zm9yKHZhciBjLGQsZT0xO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspe2Q9YXJndW1lbnRzW2VdO2ZvcihjIGluIGQpYVtjXT1kW2NdO2Zvcih2YXIgZj0wO2Y8RmEubGVuZ3RoO2YrKyljPUZhW2ZdLE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChkLGMpJiYoYVtjXT1kW2NdKX19O3ZhciBIYT1TdHJpbmcucHJvdG90eXBlLnRyaW0/ZnVuY3Rpb24oYSl7cmV0dXJuIGEudHJpbSgpfTpmdW5jdGlvbihhKXtyZXR1cm4vXltcc1x4YTBdKihbXHNcU10qPylbXHNceGEwXSokLy5leGVjKGEpWzFdfTsvKgoKIENvcHlyaWdodCBHb29nbGUgTExDCiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMAoqLwp2YXIgSWE9e307dmFyIEphPWZ1bmN0aW9uKGEpe2lmKElhIT09SWEpdGhyb3cgRXJyb3IoIkJhZCBzZWNyZXQiKTt0aGlzLmc9YX07SmEucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ307bmV3IEphKCJhYm91dDpibGFuayIpO25ldyBKYSgiYWJvdXQ6aW52YWxpZCN6Q2xvc3VyZXoiKTt2YXIgS2E9W10sTGE9ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJBIFVSTCB3aXRoIGNvbnRlbnQgJyIrYSsiJyB3YXMgc2FuaXRpemVkIGF3YXkuIil9O0thLmluZGV4T2YoTGEpPT09LTEmJkthLnB1c2goTGEpO3ZhciBNYSxOYTthOntmb3IodmFyIE9hPVsiQ0xPU1VSRV9GTEFHUyJdLFBhPWwsUWE9MDtRYTxPYS5sZW5ndGg7UWErKylpZihQYT1QYVtPYVtRYV1dLFBhPT1udWxsKXtOYT1udWxsO2JyZWFrIGF9TmE9UGF9dmFyIFJhPU5hJiZOYVs2MTA0MDEzMDFdO01hPVJhIT1udWxsP1JhOiExO2Z1bmN0aW9uIFNhKCl7dmFyIGE9bC5uYXZpZ2F0b3I7cmV0dXJuIGEmJihhPWEudXNlckFnZW50KT9hOiIifXZhciBUYSxVYT1sLm5hdmlnYXRvcjtUYT1VYT9VYS51c2VyQWdlbnREYXRhfHxudWxsOm51bGw7ZnVuY3Rpb24gcihhKXtyZXR1cm4gU2EoKS5pbmRleE9mKGEpIT0tMX07dmFyIFZhPXIoIkVkZ2UiKSx0PXIoIkdlY2tvIikmJiEoU2EoKS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoIndlYmtpdCIpIT0tMSYmIXIoIkVkZ2UiKSkmJiEocigiVHJpZGVudCIpfHxyKCJNU0lFIikpJiYhcigiRWRnZSIpLHU9U2EoKS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoIndlYmtpdCIpIT0tMSYmIXIoIkVkZ2UiKSx2PU1hJiZUYSYmVGEucGxhdGZvcm0/VGEucGxhdGZvcm09PT0ibWFjT1MiOnIoIk1hY2ludG9zaCIpO3ZhciBYYT1mdW5jdGlvbihhLGIpe0JhKGIsZnVuY3Rpb24oYyxkKXtkPT0ic3R5bGUiP2Euc3R5bGUuY3NzVGV4dD1jOmQ9PSJjbGFzcyI/YS5jbGFzc05hbWU9YzpkPT0iZm9yIj9hLmh0bWxGb3I9YzpXYS5oYXNPd25Qcm9wZXJ0eShkKT9hLnNldEF0dHJpYnV0ZShXYVtkXSxjKTpkLmxhc3RJbmRleE9mKCJhcmlhLSIsMCk9PTB8fGQubGFzdEluZGV4T2YoImRhdGEtIiwwKT09MD9hLnNldEF0dHJpYnV0ZShkLGMpOmFbZF09Y30pfSxXYT17Y2VsbHBhZGRpbmc6ImNlbGxQYWRkaW5nIixjZWxsc3BhY2luZzoiY2VsbFNwYWNpbmciLGNvbHNwYW46ImNvbFNwYW4iLGZyYW1lYm9yZGVyOiJmcmFtZUJvcmRlciIsaGVpZ2h0OiJoZWlnaHQiLG1heGxlbmd0aDoibWF4TGVuZ3RoIixub25jZToibm9uY2UiLHJvbGU6InJvbGUiLHJvd3NwYW46InJvd1NwYW4iLHR5cGU6InR5cGUiLHVzZW1hcDoidXNlTWFwIix2YWxpZ246InZBbGlnbiIsd2lkdGg6IndpZHRoIn0sWWE9ZnVuY3Rpb24oYSwKYixjKXtmdW5jdGlvbiBkKGspe2smJmIuYXBwZW5kQ2hpbGQodHlwZW9mIGs9PT0ic3RyaW5nIj9hLmNyZWF0ZVRleHROb2RlKGspOmspfWZvcih2YXIgZT0yO2U8Yy5sZW5ndGg7ZSsrKXt2YXIgZj1jW2VdO2lmKCFrYShmKXx8bShmKSYmZi5ub2RlVHlwZT4wKWQoZik7ZWxzZXthOntpZihmJiZ0eXBlb2YgZi5sZW5ndGg9PSJudW1iZXIiKXtpZihtKGYpKXt2YXIgaD10eXBlb2YgZi5pdGVtPT0iZnVuY3Rpb24ifHx0eXBlb2YgZi5pdGVtPT0ic3RyaW5nIjticmVhayBhfWlmKHR5cGVvZiBmPT09ImZ1bmN0aW9uIil7aD10eXBlb2YgZi5pdGVtPT0iZnVuY3Rpb24iO2JyZWFrIGF9fWg9ITF9d2EoaD95YShmKTpmLGQpfX19LFphPWZ1bmN0aW9uKGEsYil7Yj1TdHJpbmcoYik7YS5jb250ZW50VHlwZT09PSJhcHBsaWNhdGlvbi94aHRtbCt4bWwiJiYoYj1iLnRvTG93ZXJDYXNlKCkpO3JldHVybiBhLmNyZWF0ZUVsZW1lbnQoYil9LCRhPWZ1bmN0aW9uKGEpe2EmJmEucGFyZW50Tm9kZSYmCmEucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhKX0sYWI9ZnVuY3Rpb24oYSxiKXtpZighYXx8IWIpcmV0dXJuITE7aWYoYS5jb250YWlucyYmYi5ub2RlVHlwZT09MSlyZXR1cm4gYT09Ynx8YS5jb250YWlucyhiKTtpZih0eXBlb2YgYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiE9InVuZGVmaW5lZCIpcmV0dXJuIGE9PWJ8fCEhKGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24oYikmMTYpO2Zvcig7YiYmYSE9YjspYj1iLnBhcmVudE5vZGU7cmV0dXJuIGI9PWF9LGJiPWZ1bmN0aW9uKGEpe3AoYSwiTm9kZSBjYW5ub3QgYmUgbnVsbCBvciB1bmRlZmluZWQuIik7cmV0dXJuIGEubm9kZVR5cGU9PTk/YTphLm93bmVyRG9jdW1lbnR8fGEuZG9jdW1lbnR9LGNiPWZ1bmN0aW9uKGEsYil7Yj9hLnRhYkluZGV4PTA6KGEudGFiSW5kZXg9LTEsYS5yZW1vdmVBdHRyaWJ1dGUoInRhYkluZGV4IikpfSxkYj1mdW5jdGlvbihhKXtyZXR1cm4gYS5oYXNBdHRyaWJ1dGUoInRhYmluZGV4Iil9LGViPQpmdW5jdGlvbihhKXthPWEudGFiSW5kZXg7cmV0dXJuIHR5cGVvZiBhPT09Im51bWJlciImJmE+PTAmJmE8MzI3Njh9LGZiPWZ1bmN0aW9uKGEpe3RoaXMuZz1hfHxsLmRvY3VtZW50fHxkb2N1bWVudH07ZmIucHJvdG90eXBlLmk9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nO3JldHVybiB0eXBlb2YgYT09PSJzdHJpbmciP2IuZ2V0RWxlbWVudEJ5SWQoYSk6YX07ZmIucHJvdG90eXBlLmg9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXMuZyxlPWFyZ3VtZW50cyxmPWVbMV0saD1aYShkLFN0cmluZyhlWzBdKSk7ZiYmKHR5cGVvZiBmPT09InN0cmluZyI/aC5jbGFzc05hbWU9ZjpBcnJheS5pc0FycmF5KGYpP2guY2xhc3NOYW1lPWYuam9pbigiICIpOlhhKGgsZikpO2UubGVuZ3RoPjImJllhKGQsaCxlKTtyZXR1cm4gaH07dmFyIHc9ZnVuY3Rpb24oKXt0aGlzLmJhPXRoaXMuYmE7dGhpcy5rYT10aGlzLmthfTt3LnByb3RvdHlwZS5iYT0hMTt3LnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7dGhpcy5iYXx8KHRoaXMuYmE9ITAsdGhpcy5DKCkpfTt3LnByb3RvdHlwZVtTeW1ib2wuZGlzcG9zZV09ZnVuY3Rpb24oKXt0aGlzLmRpc3Bvc2UoKX07dy5wcm90b3R5cGUuQz1mdW5jdGlvbigpe2lmKHRoaXMua2EpZm9yKDt0aGlzLmthLmxlbmd0aDspdGhpcy5rYS5zaGlmdCgpKCl9O3ZhciB5PWZ1bmN0aW9uKGEsYil7dGhpcy50eXBlPWE7dGhpcy51PXRoaXMudGFyZ2V0PWI7dGhpcy5kZWZhdWx0UHJldmVudGVkPXRoaXMuQT0hMX07eS5wcm90b3R5cGUudj1mdW5jdGlvbigpe3RoaXMuQT0hMH07eS5wcm90b3R5cGUuaj1mdW5jdGlvbigpe3RoaXMuZGVmYXVsdFByZXZlbnRlZD0hMH07dmFyIGdiPWZ1bmN0aW9uKCl7aWYoIWwuYWRkRXZlbnRMaXN0ZW5lcnx8IU9iamVjdC5kZWZpbmVQcm9wZXJ0eSlyZXR1cm4hMTt2YXIgYT0hMSxiPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwicGFzc2l2ZSIse2dldDpmdW5jdGlvbigpe2E9ITB9fSk7dHJ5e3ZhciBjPWZ1bmN0aW9uKCl7fTtsLmFkZEV2ZW50TGlzdGVuZXIoInRlc3QiLGMsYik7bC5yZW1vdmVFdmVudExpc3RlbmVyKCJ0ZXN0IixjLGIpfWNhdGNoKGQpe31yZXR1cm4gYX0oKTt2YXIgej1mdW5jdGlvbihhLGIpe3kuY2FsbCh0aGlzLGE/YS50eXBlOiIiKTt0aGlzLnJlbGF0ZWRUYXJnZXQ9dGhpcy51PXRoaXMudGFyZ2V0PW51bGw7dGhpcy5idXR0b249dGhpcy5zY3JlZW5ZPXRoaXMuc2NyZWVuWD10aGlzLmNsaWVudFk9dGhpcy5jbGllbnRYPTA7dGhpcy5rZXk9IiI7dGhpcy5nPTA7dGhpcy5tZXRhS2V5PXRoaXMuc2hpZnRLZXk9dGhpcy5hbHRLZXk9dGhpcy5jdHJsS2V5PSExO3RoaXMuc3RhdGU9bnVsbDt0aGlzLkc9ITE7dGhpcy5wb2ludGVySWQ9MDt0aGlzLnBvaW50ZXJUeXBlPSIiO3RoaXMudGltZVN0YW1wPTA7dGhpcy5oPW51bGw7aWYoYSl7dmFyIGM9dGhpcy50eXBlPWEudHlwZSxkPWEuY2hhbmdlZFRvdWNoZXMmJmEuY2hhbmdlZFRvdWNoZXMubGVuZ3RoP2EuY2hhbmdlZFRvdWNoZXNbMF06bnVsbDt0aGlzLnRhcmdldD1hLnRhcmdldHx8YS5zcmNFbGVtZW50O3RoaXMudT1iO2I9YS5yZWxhdGVkVGFyZ2V0O2J8fChjPT0ibW91c2VvdmVyIj8KYj1hLmZyb21FbGVtZW50OmM9PSJtb3VzZW91dCImJihiPWEudG9FbGVtZW50KSk7dGhpcy5yZWxhdGVkVGFyZ2V0PWI7ZD8odGhpcy5jbGllbnRYPWQuY2xpZW50WCE9PXZvaWQgMD9kLmNsaWVudFg6ZC5wYWdlWCx0aGlzLmNsaWVudFk9ZC5jbGllbnRZIT09dm9pZCAwP2QuY2xpZW50WTpkLnBhZ2VZLHRoaXMuc2NyZWVuWD1kLnNjcmVlblh8fDAsdGhpcy5zY3JlZW5ZPWQuc2NyZWVuWXx8MCk6KHRoaXMuY2xpZW50WD1hLmNsaWVudFghPT12b2lkIDA/YS5jbGllbnRYOmEucGFnZVgsdGhpcy5jbGllbnRZPWEuY2xpZW50WSE9PXZvaWQgMD9hLmNsaWVudFk6YS5wYWdlWSx0aGlzLnNjcmVlblg9YS5zY3JlZW5YfHwwLHRoaXMuc2NyZWVuWT1hLnNjcmVlbll8fDApO3RoaXMuYnV0dG9uPWEuYnV0dG9uO3RoaXMuZz1hLmtleUNvZGV8fDA7dGhpcy5rZXk9YS5rZXl8fCIiO3RoaXMuY3RybEtleT1hLmN0cmxLZXk7dGhpcy5hbHRLZXk9YS5hbHRLZXk7dGhpcy5zaGlmdEtleT1hLnNoaWZ0S2V5Owp0aGlzLm1ldGFLZXk9YS5tZXRhS2V5O3RoaXMuRz12P2EubWV0YUtleTphLmN0cmxLZXk7dGhpcy5wb2ludGVySWQ9YS5wb2ludGVySWR8fDA7dGhpcy5wb2ludGVyVHlwZT1hLnBvaW50ZXJUeXBlO3RoaXMuc3RhdGU9YS5zdGF0ZTt0aGlzLnRpbWVTdGFtcD1hLnRpbWVTdGFtcDt0aGlzLmg9YTthLmRlZmF1bHRQcmV2ZW50ZWQmJnoubC5qLmNhbGwodGhpcyl9fTtuKHoseSk7ei5wcm90b3R5cGUudj1mdW5jdGlvbigpe3oubC52LmNhbGwodGhpcyk7dGhpcy5oLnN0b3BQcm9wYWdhdGlvbj90aGlzLmguc3RvcFByb3BhZ2F0aW9uKCk6dGhpcy5oLmNhbmNlbEJ1YmJsZT0hMH07ei5wcm90b3R5cGUuaj1mdW5jdGlvbigpe3oubC5qLmNhbGwodGhpcyk7dmFyIGE9dGhpcy5oO2EucHJldmVudERlZmF1bHQ/YS5wcmV2ZW50RGVmYXVsdCgpOmEucmV0dXJuVmFsdWU9ITF9O3ZhciBoYj0iY2xvc3VyZV9saXN0ZW5hYmxlXyIrKE1hdGgucmFuZG9tKCkqMUU2fDApLGliPWZ1bmN0aW9uKGEpe3JldHVybiEoIWF8fCFhW2hiXSl9O3ZhciBqYj0wO3ZhciBrYj1mdW5jdGlvbihhLGIsYyxkLGUpe3RoaXMubGlzdGVuZXI9YTt0aGlzLnByb3h5PW51bGw7dGhpcy5zcmM9Yjt0aGlzLnR5cGU9Yzt0aGlzLmNhcHR1cmU9ISFkO3RoaXMucGE9ZTt0aGlzLmtleT0rK2piO3RoaXMuamE9dGhpcy5vYT0hMX0sbGI9ZnVuY3Rpb24oYSl7YS5qYT0hMDthLmxpc3RlbmVyPW51bGw7YS5wcm94eT1udWxsO2Euc3JjPW51bGw7YS5wYT1udWxsfTt2YXIgbWI9ZnVuY3Rpb24oYSl7dGhpcy5zcmM9YTt0aGlzLmc9e307dGhpcy5oPTB9O21iLnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZj1hLnRvU3RyaW5nKCk7YT10aGlzLmdbZl07YXx8KGE9dGhpcy5nW2ZdPVtdLHRoaXMuaCsrKTt2YXIgaD1uYihhLGIsZCxlKTtoPi0xPyhiPWFbaF0sY3x8KGIub2E9ITEpKTooYj1uZXcga2IoYix0aGlzLnNyYyxmLCEhZCxlKSxiLm9hPWMsYS5wdXNoKGIpKTtyZXR1cm4gYn07CnZhciBvYj1mdW5jdGlvbihhLGIpe3ZhciBjPWIudHlwZTtjIGluIGEuZyYmeGEoYS5nW2NdLGIpJiYobGIoYiksYS5nW2NdLmxlbmd0aD09MCYmKGRlbGV0ZSBhLmdbY10sYS5oLS0pKX0scGI9ZnVuY3Rpb24oYSxiLGMsZCxlKXthPWEuZ1tiLnRvU3RyaW5nKCldO2I9LTE7YSYmKGI9bmIoYSxjLGQsZSkpO3JldHVybiBiPi0xP2FbYl06bnVsbH0sbmI9ZnVuY3Rpb24oYSxiLGMsZCl7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDsrK2Upe3ZhciBmPWFbZV07aWYoIWYuamEmJmYubGlzdGVuZXI9PWImJmYuY2FwdHVyZT09ISFjJiZmLnBhPT1kKXJldHVybiBlfXJldHVybi0xfTt2YXIgcWI9ImNsb3N1cmVfbG1fIisoTWF0aC5yYW5kb20oKSoxRTZ8MCkscmI9e30sc2I9MCx1Yj1mdW5jdGlvbihhLGIsYyxkLGUpe2lmKGQmJmQub25jZSlyZXR1cm4gdGIoYSxiLGMsZCxlKTtpZihBcnJheS5pc0FycmF5KGIpKXtmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKyl1YihhLGJbZl0sYyxkLGUpO3JldHVybiBudWxsfWM9dmIoYyk7cmV0dXJuIGliKGEpP3diKGEsYixjLG0oZCk/ISFkLmNhcHR1cmU6ISFkLGUpOnhiKGEsYixjLCExLGQsZSl9LHhiPWZ1bmN0aW9uKGEsYixjLGQsZSxmKXtpZighYil0aHJvdyBFcnJvcigiSW52YWxpZCBldmVudCB0eXBlIik7dmFyIGg9bShlKT8hIWUuY2FwdHVyZTohIWUsaz15YihhKTtrfHwoYVtxYl09az1uZXcgbWIoYSkpO2M9ay5hZGQoYixjLGQsaCxmKTtpZihjLnByb3h5KXJldHVybiBjO2Q9emIoKTtjLnByb3h5PWQ7ZC5zcmM9YTtkLmxpc3RlbmVyPWM7aWYoYS5hZGRFdmVudExpc3RlbmVyKWdifHwoZT1oKSxlPT09dm9pZCAwJiYKKGU9ITEpLGEuYWRkRXZlbnRMaXN0ZW5lcihiLnRvU3RyaW5nKCksZCxlKTtlbHNlIGlmKGEuYXR0YWNoRXZlbnQpYS5hdHRhY2hFdmVudChBYihiLnRvU3RyaW5nKCkpLGQpO2Vsc2UgaWYoYS5hZGRMaXN0ZW5lciYmYS5yZW1vdmVMaXN0ZW5lcilwKGI9PT0iY2hhbmdlIiwiTWVkaWFRdWVyeUxpc3Qgb25seSBoYXMgYSBjaGFuZ2UgZXZlbnQiKSxhLmFkZExpc3RlbmVyKGQpO2Vsc2UgdGhyb3cgRXJyb3IoImFkZEV2ZW50TGlzdGVuZXIgYW5kIGF0dGFjaEV2ZW50IGFyZSB1bmF2YWlsYWJsZS4iKTtzYisrO3JldHVybiBjfSx6Yj1mdW5jdGlvbigpe3ZhciBhPUJiLGI9ZnVuY3Rpb24oYyl7cmV0dXJuIGEuY2FsbChiLnNyYyxiLmxpc3RlbmVyLGMpfTtyZXR1cm4gYn0sdGI9ZnVuY3Rpb24oYSxiLGMsZCxlKXtpZihBcnJheS5pc0FycmF5KGIpKXtmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKyl0YihhLGJbZl0sYyxkLGUpO3JldHVybiBudWxsfWM9dmIoYyk7cmV0dXJuIGliKGEpPwphLkEuYWRkKFN0cmluZyhiKSxjLCEwLG0oZCk/ISFkLmNhcHR1cmU6ISFkLGUpOnhiKGEsYixjLCEwLGQsZSl9LENiPWZ1bmN0aW9uKGEsYixjLGQsZSl7aWYoQXJyYXkuaXNBcnJheShiKSlmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKylDYihhLGJbZl0sYyxkLGUpO2Vsc2UgZD1tKGQpPyEhZC5jYXB0dXJlOiEhZCxjPXZiKGMpLGliKGEpPyhhPWEuQSxiPVN0cmluZyhiKS50b1N0cmluZygpLGIgaW4gYS5nJiYoZj1hLmdbYl0sYz1uYihmLGMsZCxlKSxjPi0xJiYobGIoZltjXSkscChmLmxlbmd0aCE9bnVsbCksQXJyYXkucHJvdG90eXBlLnNwbGljZS5jYWxsKGYsYywxKSxmLmxlbmd0aD09MCYmKGRlbGV0ZSBhLmdbYl0sYS5oLS0pKSkpOmEmJihhPXliKGEpKSYmKGM9cGIoYSxiLGMsZCxlKSkmJkEoYyl9LEE9ZnVuY3Rpb24oYSl7aWYodHlwZW9mIGEhPT0ibnVtYmVyIiYmYSYmIWEuamEpe3ZhciBiPWEuc3JjO2lmKGliKGIpKW9iKGIuQSxhKTtlbHNle3ZhciBjPWEudHlwZSwKZD1hLnByb3h5O2IucmVtb3ZlRXZlbnRMaXN0ZW5lcj9iLnJlbW92ZUV2ZW50TGlzdGVuZXIoYyxkLGEuY2FwdHVyZSk6Yi5kZXRhY2hFdmVudD9iLmRldGFjaEV2ZW50KEFiKGMpLGQpOmIuYWRkTGlzdGVuZXImJmIucmVtb3ZlTGlzdGVuZXImJmIucmVtb3ZlTGlzdGVuZXIoZCk7c2ItLTsoYz15YihiKSk/KG9iKGMsYSksYy5oPT0wJiYoYy5zcmM9bnVsbCxiW3FiXT1udWxsKSk6bGIoYSl9fX0sQWI9ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW4gcmI/cmJbYV06cmJbYV09Im9uIithfSxCYj1mdW5jdGlvbihhLGIpe2lmKGEuamEpYT0hMDtlbHNle2I9bmV3IHooYix0aGlzKTt2YXIgYz1hLmxpc3RlbmVyLGQ9YS5wYXx8YS5zcmM7YS5vYSYmQShhKTthPWMuY2FsbChkLGIpfXJldHVybiBhfSx5Yj1mdW5jdGlvbihhKXthPWFbcWJdO3JldHVybiBhIGluc3RhbmNlb2YgbWI/YTpudWxsfSxEYj0iX19jbG9zdXJlX2V2ZW50c19mbl8iKyhNYXRoLnJhbmRvbSgpKjFFOT4+PjApLHZiPWZ1bmN0aW9uKGEpe3AoYSwKIkxpc3RlbmVyIGNhbiBub3QgYmUgbnVsbC4iKTtpZih0eXBlb2YgYT09PSJmdW5jdGlvbiIpcmV0dXJuIGE7cChhLmhhbmRsZUV2ZW50LCJBbiBvYmplY3QgbGlzdGVuZXIgbXVzdCBoYXZlIGhhbmRsZUV2ZW50IG1ldGhvZC4iKTthW0RiXXx8KGFbRGJdPWZ1bmN0aW9uKGIpe3JldHVybiBhLmhhbmRsZUV2ZW50KGIpfSk7cmV0dXJuIGFbRGJdfTt2YXIgRWI9ZnVuY3Rpb24oYSl7dy5jYWxsKHRoaXMpO3RoaXMuaD1hO3RoaXMuZz17fX07bihFYix3KTsKdmFyIEZiPVtdLEI9ZnVuY3Rpb24oYSxiLGMsZCl7QXJyYXkuaXNBcnJheShjKXx8KGMmJihGYlswXT1jLnRvU3RyaW5nKCkpLGM9RmIpO2Zvcih2YXIgZT0wO2U8Yy5sZW5ndGg7ZSsrKXt2YXIgZj11YihiLGNbZV0sZHx8YS5oYW5kbGVFdmVudCwhMSxhLmh8fGEpO2lmKCFmKWJyZWFrO2EuZ1tmLmtleV09Zn1yZXR1cm4gYX0sQz1mdW5jdGlvbihhLGIsYyxkLGUsZil7aWYoQXJyYXkuaXNBcnJheShjKSlmb3IodmFyIGg9MDtoPGMubGVuZ3RoO2grKylDKGEsYixjW2hdLGQsZSxmKTtlbHNlIGQ9ZHx8YS5oYW5kbGVFdmVudCxlPW0oZSk/ISFlLmNhcHR1cmU6ISFlLGY9Znx8YS5ofHxhLGQ9dmIoZCksZT0hIWUsYz1pYihiKT9wYihiLkEsU3RyaW5nKGMpLGQsZSxmKTpiPyhiPXliKGIpKT9wYihiLGMsZCxlLGYpOm51bGw6bnVsbCxjJiYoQShjKSxkZWxldGUgYS5nW2Mua2V5XSk7cmV0dXJuIGF9LEdiPWZ1bmN0aW9uKGEpe0JhKGEuZyxmdW5jdGlvbihiLGMpe3RoaXMuZy5oYXNPd25Qcm9wZXJ0eShjKSYmCkEoYil9LGEpO2EuZz17fX07RWIucHJvdG90eXBlLkM9ZnVuY3Rpb24oKXtFYi5sLkMuY2FsbCh0aGlzKTtHYih0aGlzKX07RWIucHJvdG90eXBlLmhhbmRsZUV2ZW50PWZ1bmN0aW9uKCl7dGhyb3cgRXJyb3IoIkV2ZW50SGFuZGxlci5oYW5kbGVFdmVudCBub3QgaW1wbGVtZW50ZWQiKTt9O3ZhciBEPWZ1bmN0aW9uKCl7dy5jYWxsKHRoaXMpO3RoaXMuQT1uZXcgbWIodGhpcyk7dGhpcy5ZYT10aGlzO3RoaXMubGE9bnVsbH07bihELHcpO0QucHJvdG90eXBlW2hiXT0hMDtELnByb3RvdHlwZS5BYT1mdW5jdGlvbihhKXt0aGlzLmxhPWF9O0QucHJvdG90eXBlLnJlbW92ZUV2ZW50TGlzdGVuZXI9ZnVuY3Rpb24oYSxiLGMsZCl7Q2IodGhpcyxhLGIsYyxkKX07CnZhciBFPWZ1bmN0aW9uKGEsYil7SGIoYSk7dmFyIGM9YS5sYTtpZihjKXt2YXIgZD1bXTtmb3IodmFyIGU9MTtjO2M9Yy5sYSlkLnB1c2goYykscCgrK2U8MUUzLCJpbmZpbml0ZSBsb29wIil9YT1hLllhO2M9Yi50eXBlfHxiO3R5cGVvZiBiPT09InN0cmluZyI/Yj1uZXcgeShiLGEpOmIgaW5zdGFuY2VvZiB5P2IudGFyZ2V0PWIudGFyZ2V0fHxhOihlPWIsYj1uZXcgeShjLGEpLEdhKGIsZSkpO2U9ITA7dmFyIGY7aWYoZClmb3IoZj1kLmxlbmd0aC0xOyFiLkEmJmY+PTA7Zi0tKXt2YXIgaD1iLnU9ZFtmXTtlPUliKGgsYywhMCxiKSYmZX1iLkF8fChoPWIudT1hLGU9SWIoaCxjLCEwLGIpJiZlLGIuQXx8KGU9SWIoaCxjLCExLGIpJiZlKSk7aWYoZClmb3IoZj0wOyFiLkEmJmY8ZC5sZW5ndGg7ZisrKWg9Yi51PWRbZl0sZT1JYihoLGMsITEsYikmJmU7cmV0dXJuIGV9OwpELnByb3RvdHlwZS5DPWZ1bmN0aW9uKCl7RC5sLkMuY2FsbCh0aGlzKTtpZih0aGlzLkEpe3ZhciBhPXRoaXMuQSxiPTAsYztmb3IoYyBpbiBhLmcpe2Zvcih2YXIgZD1hLmdbY10sZT0wO2U8ZC5sZW5ndGg7ZSsrKSsrYixsYihkW2VdKTtkZWxldGUgYS5nW2NdO2EuaC0tfX10aGlzLmxhPW51bGx9O3ZhciB3Yj1mdW5jdGlvbihhLGIsYyxkLGUpe0hiKGEpO3JldHVybiBhLkEuYWRkKFN0cmluZyhiKSxjLCExLGQsZSl9LEliPWZ1bmN0aW9uKGEsYixjLGQpe2I9YS5BLmdbU3RyaW5nKGIpXTtpZighYilyZXR1cm4hMDtiPWIuY29uY2F0KCk7Zm9yKHZhciBlPSEwLGY9MDtmPGIubGVuZ3RoOysrZil7dmFyIGg9YltmXTtpZihoJiYhaC5qYSYmaC5jYXB0dXJlPT1jKXt2YXIgaz1oLmxpc3RlbmVyLHE9aC5wYXx8aC5zcmM7aC5vYSYmb2IoYS5BLGgpO2U9ay5jYWxsKHEsZCkhPT0hMSYmZX19cmV0dXJuIGUmJiFkLmRlZmF1bHRQcmV2ZW50ZWR9LEhiPWZ1bmN0aW9uKGEpe3AoYS5BLCJFdmVudCB0YXJnZXQgaXMgbm90IGluaXRpYWxpemVkLiBEaWQgeW91IGNhbGwgdGhlIHN1cGVyY2xhc3MgKGdvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0KSBjb25zdHJ1Y3Rvcj8iKX07dmFyIEpiPXQ/Ik1velVzZXJTZWxlY3QiOnV8fFZhPyJXZWJraXRVc2VyU2VsZWN0IjpudWxsLEtiPWZ1bmN0aW9uKGEsYil7Yj1iP251bGw6YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpO2lmKEpiJiYoYS5zdHlsZSYmKGEuc3R5bGVbSmJdPSJub25lIiksYikpZm9yKHZhciBjPTA7YT1iW2NdO2MrKylhLnN0eWxlJiYoYS5zdHlsZVtKYl09Im5vbmUiKX07dmFyIExiPWZ1bmN0aW9uKCl7fTtpYShMYik7TGIucHJvdG90eXBlLmc9MDt2YXIgRj1mdW5jdGlvbihhKXtELmNhbGwodGhpcyk7dGhpcy5HPWF8fHBhfHwocGE9bmV3IGZiKTt0aGlzLnphPU1iO3RoaXMuWT1udWxsO3RoaXMucz0hMTt0aGlzLmc9bnVsbDt0aGlzLk09dm9pZCAwO3RoaXMudT10aGlzLmo9dGhpcy5oPW51bGw7dGhpcy5TYT0hMX07bihGLEQpO0YucHJvdG90eXBlLlphPUxiLlYoKTsKdmFyIE1iPW51bGwsTmI9ZnVuY3Rpb24oYSxiKXtzd2l0Y2goYSl7Y2FzZSAxOnJldHVybiBiPyJkaXNhYmxlIjoiZW5hYmxlIjtjYXNlIDI6cmV0dXJuIGI/ImhpZ2hsaWdodCI6InVuaGlnaGxpZ2h0IjtjYXNlIDQ6cmV0dXJuIGI/ImFjdGl2YXRlIjoiZGVhY3RpdmF0ZSI7Y2FzZSA4OnJldHVybiBiPyJzZWxlY3QiOiJ1bnNlbGVjdCI7Y2FzZSAxNjpyZXR1cm4gYj8iY2hlY2siOiJ1bmNoZWNrIjtjYXNlIDMyOnJldHVybiBiPyJmb2N1cyI6ImJsdXIiO2Nhc2UgNjQ6cmV0dXJuIGI/Im9wZW4iOiJjbG9zZSJ9dGhyb3cgRXJyb3IoIkludmFsaWQgY29tcG9uZW50IHN0YXRlIik7fSxPYj1mdW5jdGlvbihhKXtyZXR1cm4gYS5ZfHwoYS5ZPSI6IisoYS5aYS5nKyspLnRvU3RyaW5nKDM2KSl9LFBiPWZ1bmN0aW9uKGEsYil7aWYoYS5oJiZhLmgudSl7dmFyIGM9YS5oLnUsZD1hLlk7ZCBpbiBjJiZkZWxldGUgY1tkXTtEYShhLmgudSxiLGEpfWEuWT1ifTtGLnByb3RvdHlwZS5pPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ307CnZhciBRYj1mdW5jdGlvbihhKXthLk18fChhLk09bmV3IEViKGEpKTtyZXR1cm4gcChhLk0pfTtGLnByb3RvdHlwZS5BYT1mdW5jdGlvbihhKXtpZih0aGlzLmgmJnRoaXMuaCE9YSl0aHJvdyBFcnJvcigiTWV0aG9kIG5vdCBzdXBwb3J0ZWQiKTtGLmwuQWEuY2FsbCh0aGlzLGEpfTtGLnByb3RvdHlwZS5tYT1mdW5jdGlvbigpe3RoaXMuZz1aYSh0aGlzLkcuZywiRElWIil9O0YucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbihhKXtSYih0aGlzLGEpfTsKdmFyIFJiPWZ1bmN0aW9uKGEsYixjKXtpZihhLnMpdGhyb3cgRXJyb3IoIkNvbXBvbmVudCBhbHJlYWR5IHJlbmRlcmVkIik7YS5nfHxhLm1hKCk7Yj9iLmluc2VydEJlZm9yZShhLmcsY3x8bnVsbCk6YS5HLmcuYm9keS5hcHBlbmRDaGlsZChhLmcpO2EuaCYmIWEuaC5zfHxhLkkoKX0sU2I9ZnVuY3Rpb24oYSxiKXtpZihhLnMpdGhyb3cgRXJyb3IoIkNvbXBvbmVudCBhbHJlYWR5IHJlbmRlcmVkIik7aWYoYiYmYS53YShiKSl7YS5TYT0hMDt2YXIgYz1iYihiKTthLkcmJmEuRy5nPT1jfHwoYS5HPWI/bmV3IGZiKGJiKGIpKTpwYXx8KHBhPW5ldyBmYikpO2EuRWEoYik7YS5JKCl9ZWxzZSB0aHJvdyBFcnJvcigiSW52YWxpZCBlbGVtZW50IHRvIGRlY29yYXRlIik7fTtnPUYucHJvdG90eXBlO2cud2E9ZnVuY3Rpb24oKXtyZXR1cm4hMH07Zy5FYT1mdW5jdGlvbihhKXt0aGlzLmc9YX07CmcuST1mdW5jdGlvbigpe3RoaXMucz0hMDtUYih0aGlzLGZ1bmN0aW9uKGEpeyFhLnMmJmEuaSgpJiZhLkkoKX0pfTtnLlU9ZnVuY3Rpb24oKXtUYih0aGlzLGZ1bmN0aW9uKGEpe2EucyYmYS5VKCl9KTt0aGlzLk0mJkdiKHRoaXMuTSk7dGhpcy5zPSExfTtnLkM9ZnVuY3Rpb24oKXt0aGlzLnMmJnRoaXMuVSgpO3RoaXMuTSYmKHRoaXMuTS5kaXNwb3NlKCksZGVsZXRlIHRoaXMuTSk7VGIodGhpcyxmdW5jdGlvbihhKXthLmRpc3Bvc2UoKX0pOyF0aGlzLlNhJiZ0aGlzLmcmJiRhKHRoaXMuZyk7dGhpcy5oPXRoaXMuZz10aGlzLnU9dGhpcy5qPW51bGw7Ri5sLkMuY2FsbCh0aGlzKX07Zy5CYT1mdW5jdGlvbihhLGIpe3RoaXMuQ2EoYSxIKHRoaXMpLGIpfTsKZy5DYT1mdW5jdGlvbihhLGIsYyl7cCghIWEsIlByb3ZpZGVkIGVsZW1lbnQgbXVzdCBub3QgYmUgbnVsbC4iKTtpZihhLnMmJihjfHwhdGhpcy5zKSl0aHJvdyBFcnJvcigiQ29tcG9uZW50IGFscmVhZHkgcmVuZGVyZWQiKTtpZihiPDB8fGI+SCh0aGlzKSl0aHJvdyBFcnJvcigiQ2hpbGQgY29tcG9uZW50IGluZGV4IG91dCBvZiBib3VuZHMiKTt0aGlzLnUmJnRoaXMuanx8KHRoaXMudT17fSx0aGlzLmo9W10pO2lmKGEuaD09dGhpcyl7dmFyIGQ9dGhpcy51LGU9T2IoYSk7ZFtlXT1hO3hhKHRoaXMuaixhKX1lbHNlIERhKHRoaXMudSxPYihhKSxhKTtpZihhPT10aGlzKXRocm93IEVycm9yKCJVbmFibGUgdG8gc2V0IHBhcmVudCBjb21wb25lbnQiKTtpZihkPXRoaXMmJmEuaCYmYS5ZKWU9YS5oLGQ9YS5ZLGUudSYmZD8oZT1lLnUsZD0oZSE9PW51bGwmJmQgaW4gZT9lW2RdOnZvaWQgMCl8fG51bGwpOmQ9bnVsbDtpZihkJiZhLmghPXRoaXMpdGhyb3cgRXJyb3IoIlVuYWJsZSB0byBzZXQgcGFyZW50IGNvbXBvbmVudCIpOwphLmg9dGhpcztGLmwuQWEuY2FsbChhLHRoaXMpO3phKHRoaXMuaixiLDAsYSk7YS5zJiZ0aGlzLnMmJmEuaD09dGhpcz8oYz10aGlzLm5hKCksKGMuY2hpbGROb2Rlc1tiXXx8bnVsbCkhPWEuaSgpJiYoYS5pKCkucGFyZW50RWxlbWVudD09YyYmYy5yZW1vdmVDaGlsZChhLmkoKSksYj1jLmNoaWxkTm9kZXNbYl18fG51bGwsYy5pbnNlcnRCZWZvcmUoYS5pKCksYikpKTpjPyh0aGlzLmd8fHRoaXMubWEoKSxiPUkodGhpcyxiKzEpLFJiKGEsdGhpcy5uYSgpLGI/Yi5nOm51bGwpKTp0aGlzLnMmJiFhLnMmJmEuZyYmYS5nLnBhcmVudE5vZGUmJmEuZy5wYXJlbnROb2RlLm5vZGVUeXBlPT0xJiZhLkkoKX07Zy5uYT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmd9Owp2YXIgVWI9ZnVuY3Rpb24oYSl7aWYoYS56YT09bnVsbCl7dmFyIGI9YS5zP2EuZzphLkcuZy5ib2R5O2E6e3ZhciBjPWJiKGIpO2lmKGMuZGVmYXVsdFZpZXcmJmMuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSYmKGM9Yy5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKGIsbnVsbCkpKXtjPWMuZGlyZWN0aW9ufHxjLmdldFByb3BlcnR5VmFsdWUoImRpcmVjdGlvbiIpfHwiIjticmVhayBhfWM9IiJ9YS56YT0icnRsIj09KGN8fChiLmN1cnJlbnRTdHlsZT9iLmN1cnJlbnRTdHlsZS5kaXJlY3Rpb246bnVsbCl8fGIuc3R5bGUmJmIuc3R5bGUuZGlyZWN0aW9uKX1yZXR1cm4gYS56YX0sSD1mdW5jdGlvbihhKXtyZXR1cm4gYS5qP2Euai5sZW5ndGg6MH0sST1mdW5jdGlvbihhLGIpe3JldHVybiBhLmo/YS5qW2JdfHxudWxsOm51bGx9LFRiPWZ1bmN0aW9uKGEsYixjKXthLmomJmEuai5mb3JFYWNoKGIsYyl9LFZiPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuaiYmYj9hLmouaW5kZXhPZihiKToKLTF9O3ZhciBXYj17bWI6ImFjdGl2ZWRlc2NlbmRhbnQiLHJiOiJhdG9taWMiLHNiOiJhdXRvY29tcGxldGUiLHViOiJidXN5Iix4YjoiY2hlY2tlZCIseWI6ImNvbGluZGV4IixEYjoiY29udHJvbHMiLEViOiJjdXJyZW50IixHYjoiZGVzY3JpYmVkYnkiLEpiOiJkaXNhYmxlZCIsTGI6ImRyb3BlZmZlY3QiLE1iOiJleHBhbmRlZCIsTmI6ImZsb3d0byIsUGI6ImdyYWJiZWQiLFRiOiJoYXNwb3B1cCIsVmI6ImhpZGRlbiIsWGI6ImludmFsaWQiLFliOiJsYWJlbCIsWmI6ImxhYmVsbGVkYnkiLGFjOiJsZXZlbCIsZmM6ImxpdmUiLHZjOiJtdWx0aWxpbmUiLHdjOiJtdWx0aXNlbGVjdGFibGUiLEFjOiJvcmllbnRhdGlvbiIsQmM6Im93bnMiLENjOiJwb3NpbnNldCIsRWM6InByZXNzZWQiLEljOiJyZWFkb25seSIsS2M6InJlbGV2YW50IixMYzoicmVxdWlyZWQiLFBjOiJyb3dpbmRleCIsU2M6InNlbGVjdGVkIixVYzoic2V0c2l6ZSIsV2M6InNvcnQiLG1kOiJ2YWx1ZW1heCIsbmQ6InZhbHVlbWluIiwKb2Q6InZhbHVlbm93IixwZDoidmFsdWV0ZXh0In07dmFyIFhiO3ZhciBZYj17bmI6ImFsZXJ0IixvYjoiYWxlcnRkaWFsb2ciLHBiOiJhcHBsaWNhdGlvbiIscWI6ImFydGljbGUiLHRiOiJiYW5uZXIiLHZiOiJidXR0b24iLHdiOiJjaGVja2JveCIsemI6ImNvbHVtbmhlYWRlciIsQWI6ImNvbWJvYm94IixCYjoiY29tcGxlbWVudGFyeSIsQ2I6ImNvbnRlbnRpbmZvIixGYjoiZGVmaW5pdGlvbiIsSGI6ImRpYWxvZyIsSWI6ImRpcmVjdG9yeSIsS2I6ImRvY3VtZW50IixPYjoiZm9ybSIsUWI6ImdyaWQiLFJiOiJncmlkY2VsbCIsU2I6Imdyb3VwIixVYjoiaGVhZGluZyIsV2I6ImltZyIsYmM6ImxpbmsiLGNjOiJsaXN0IixkYzoibGlzdGJveCIsZWM6Imxpc3RpdGVtIixoYzoibG9nIixpYzoibWFpbiIsamM6Im1hcnF1ZWUiLGtjOiJtYXRoIixsYzoibWVudSIsbWM6Im1lbnViYXIiLG5jOiJtZW51aXRlbSIsb2M6Im1lbnVpdGVtY2hlY2tib3giLHBjOiJtZW51aXRlbXJhZGlvIix4YzoibmF2aWdhdGlvbiIseWM6Im5vdGUiLHpjOiJvcHRpb24iLApEYzoicHJlc2VudGF0aW9uIixGYzoicHJvZ3Jlc3NiYXIiLEdjOiJyYWRpbyIsSGM6InJhZGlvZ3JvdXAiLEpjOiJyZWdpb24iLE1jOiJyb3ciLE5jOiJyb3dncm91cCIsT2M6InJvd2hlYWRlciIsUWM6InNjcm9sbGJhciIsUmM6InNlYXJjaCIsVGM6InNlcGFyYXRvciIsVmM6InNsaWRlciIsWGM6InNwaW5idXR0b24iLFljOiJzdGF0dXMiLFpjOiJzd2l0Y2giLGFkOiJ0YWIiLGJkOiJ0YWJsaXN0IixjZDoidGFicGFuZWwiLGRkOiJ0ZXh0Ym94IixlZDoidGV4dGluZm8iLGZkOiJ0aW1lciIsZ2Q6InRvb2xiYXIiLGhkOiJ0b29sdGlwIixqZDoidHJlZSIsa2Q6InRyZWVncmlkIixsZDoidHJlZWl0ZW0ifTt2YXIgWmI9ZnVuY3Rpb24oYSxiKXtiPyhwKENhKFliLGIpLCJObyBzdWNoIEFSSUEgcm9sZSAiK2IpLGEuc2V0QXR0cmlidXRlKCJyb2xlIixiKSk6YS5yZW1vdmVBdHRyaWJ1dGUoInJvbGUiKX0sYWM9ZnVuY3Rpb24oYSxiLGMpe0FycmF5LmlzQXJyYXkoYykmJihjPWMuam9pbigiICIpKTt2YXIgZD0kYihiKTtjPT09IiJ8fGM9PXZvaWQgMD8oWGJ8fChjPXt9LFhiPShjLmF0b21pYz0hMSxjLmF1dG9jb21wbGV0ZT0ibm9uZSIsYy5kcm9wZWZmZWN0PSJub25lIixjLmhhc3BvcHVwPSExLGMubGl2ZT0ib2ZmIixjLm11bHRpbGluZT0hMSxjLm11bHRpc2VsZWN0YWJsZT0hMSxjLm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIsYy5yZWFkb25seT0hMSxjLnJlbGV2YW50PSJhZGRpdGlvbnMgdGV4dCIsYy5yZXF1aXJlZD0hMSxjLnNvcnQ9Im5vbmUiLGMuYnVzeT0hMSxjLmRpc2FibGVkPSExLGMuaGlkZGVuPSExLGMuaW52YWxpZD0iZmFsc2UiLGMpKSxjPVhiLGIgaW4gYz9hLnNldEF0dHJpYnV0ZShkLApjW2JdKTphLnJlbW92ZUF0dHJpYnV0ZShkKSk6YS5zZXRBdHRyaWJ1dGUoZCxjKX0sJGI9ZnVuY3Rpb24oYSl7cChhLCJBUklBIGF0dHJpYnV0ZSBjYW5ub3QgYmUgZW1wdHkuIik7cChDYShXYixhKSwiTm8gc3VjaCBBUklBIGF0dHJpYnV0ZSAiK2EpO3JldHVybiJhcmlhLSIrYX07dmFyIGRjPWZ1bmN0aW9uKGEsYixjLGQsZSxmKXtpZih2JiZlKXJldHVybiBiYyhhKTtpZihlJiYhZClyZXR1cm4hMTtpZighdCl7dHlwZW9mIGI9PT0ibnVtYmVyIiYmKGI9Y2MoYikpO3ZhciBoPWI9PTE3fHxiPT0xOHx8diYmYj09OTE7aWYoKCFjfHx2KSYmaHx8diYmYj09MTYmJihkfHxmKSlyZXR1cm4hMX1pZih1JiZkJiZjKXN3aXRjaChhKXtjYXNlIDIyMDpjYXNlIDIxOTpjYXNlIDIyMTpjYXNlIDE5MjpjYXNlIDE4NjpjYXNlIDE4OTpjYXNlIDE4NzpjYXNlIDE4ODpjYXNlIDE5MDpjYXNlIDE5MTpjYXNlIDE5MjpjYXNlIDIyMjpyZXR1cm4hMX1zd2l0Y2goYSl7Y2FzZSAxMzpyZXR1cm4gdD9mfHxlPyExOiEoYyYmZCk6ITA7Y2FzZSAyNzpyZXR1cm4hdSYmIXR9cmV0dXJuIHQmJihkfHxlfHxmKT8hMTpiYyhhKX0sYmM9ZnVuY3Rpb24oYSl7aWYoYT49NDgmJmE8PTU3fHxhPj05NiYmYTw9MTA2fHxhPj02NSYmYTw9OTB8fHUmJmE9PTApcmV0dXJuITA7c3dpdGNoKGEpe2Nhc2UgMzI6Y2FzZSA0MzpjYXNlIDYzOmNhc2UgNjQ6Y2FzZSAxMDc6Y2FzZSAxMDk6Y2FzZSAxMTA6Y2FzZSAxMTE6Y2FzZSAxODY6Y2FzZSA1OTpjYXNlIDE4OTpjYXNlIDE4NzpjYXNlIDYxOmNhc2UgMTg4OmNhc2UgMTkwOmNhc2UgMTkxOmNhc2UgMTkyOmNhc2UgMjIyOmNhc2UgMjE5OmNhc2UgMjIwOmNhc2UgMjIxOmNhc2UgMTYzOmNhc2UgNTg6cmV0dXJuITA7CmNhc2UgMTczOmNhc2UgMTcxOnJldHVybiB0O2RlZmF1bHQ6cmV0dXJuITF9fSxjYz1mdW5jdGlvbihhKXtpZih0KWE9ZWMoYSk7ZWxzZSBpZih2JiZ1KXN3aXRjaChhKXtjYXNlIDkzOmE9OTF9cmV0dXJuIGF9LGVjPWZ1bmN0aW9uKGEpe3N3aXRjaChhKXtjYXNlIDYxOnJldHVybiAxODc7Y2FzZSA1OTpyZXR1cm4gMTg2O2Nhc2UgMTczOnJldHVybiAxODk7Y2FzZSAyMjQ6cmV0dXJuIDkxO2Nhc2UgMDpyZXR1cm4gMjI0O2RlZmF1bHQ6cmV0dXJuIGF9fTt2YXIgZmM9ZnVuY3Rpb24oYSxiLGMsZCl7ei5jYWxsKHRoaXMsZCk7dGhpcy50eXBlPSJrZXkiO3RoaXMuZz1hO3RoaXMucmVwZWF0PWN9O24oZmMseik7dmFyIEo9ZnVuY3Rpb24oYSxiKXtELmNhbGwodGhpcyk7YSYmZ2ModGhpcyxhLGIpfTtuKEosRCk7Zz1KLnByb3RvdHlwZTtnLlI9bnVsbDtnLnFhPW51bGw7Zy5KYT1udWxsO2cucmE9bnVsbDtnLkY9LTE7Zy5LPS0xO2cuRGE9ITE7CnZhciBoYz17MzoxMywxMjoxNDQsNjMyMzI6MzgsNjMyMzM6NDAsNjMyMzQ6MzcsNjMyMzU6MzksNjMyMzY6MTEyLDYzMjM3OjExMyw2MzIzODoxMTQsNjMyMzk6MTE1LDYzMjQwOjExNiw2MzI0MToxMTcsNjMyNDI6MTE4LDYzMjQzOjExOSw2MzI0NDoxMjAsNjMyNDU6MTIxLDYzMjQ2OjEyMiw2MzI0NzoxMjMsNjMyNDg6NDQsNjMyNzI6NDYsNjMyNzM6MzYsNjMyNzU6MzUsNjMyNzY6MzMsNjMyNzc6MzQsNjMyODk6MTQ0LDYzMzAyOjQ1fSxpYz17VXA6MzgsRG93bjo0MCxMZWZ0OjM3LFJpZ2h0OjM5LEVudGVyOjEzLEYxOjExMixGMjoxMTMsRjM6MTE0LEY0OjExNSxGNToxMTYsRjY6MTE3LEY3OjExOCxGODoxMTksRjk6MTIwLEYxMDoxMjEsRjExOjEyMixGMTI6MTIzLCJVKzAwN0YiOjQ2LEhvbWU6MzYsRW5kOjM1LFBhZ2VVcDozMyxQYWdlRG93bjozNCxJbnNlcnQ6NDV9LGpjPXYmJnQ7CkoucHJvdG90eXBlLmc9ZnVuY3Rpb24oYSl7dSYmKHRoaXMuRj09MTcmJiFhLmN0cmxLZXl8fHRoaXMuRj09MTgmJiFhLmFsdEtleXx8diYmdGhpcy5GPT05MSYmIWEubWV0YUtleSkmJih0aGlzLks9dGhpcy5GPS0xKTt0aGlzLkY9PS0xJiYoYS5jdHJsS2V5JiZhLmchPTE3P3RoaXMuRj0xNzphLmFsdEtleSYmYS5nIT0xOD90aGlzLkY9MTg6YS5tZXRhS2V5JiZhLmchPTkxJiYodGhpcy5GPTkxKSk7ZGMoYS5nLHRoaXMuRixhLnNoaWZ0S2V5LGEuY3RybEtleSxhLmFsdEtleSxhLm1ldGFLZXkpPyh0aGlzLks9Y2MoYS5nKSxqYyYmKHRoaXMuRGE9YS5hbHRLZXkpKTp0aGlzLmhhbmRsZUV2ZW50KGEpfTtKLnByb3RvdHlwZS5oPWZ1bmN0aW9uKGEpe3RoaXMuSz10aGlzLkY9LTE7dGhpcy5EYT1hLmFsdEtleX07CkoucHJvdG90eXBlLmhhbmRsZUV2ZW50PWZ1bmN0aW9uKGEpe3ZhciBiPWEuaCxjPWIuYWx0S2V5O2lmKHUmJmEudHlwZT09ImtleXByZXNzIil7dmFyIGQ9dGhpcy5LO3ZhciBlPWIuY2hhckNvZGU+PTAmJmIuY2hhckNvZGU8NjMyMzImJmJjKGQpP2IuY2hhckNvZGU6MH1lbHNlIGEudHlwZT09ImtleXByZXNzIj8oamMmJihjPXRoaXMuRGEpLGIua2V5Q29kZT09Yi5jaGFyQ29kZT9iLmtleUNvZGU8MzI/KGQ9Yi5rZXlDb2RlLGU9MCk6KGQ9dGhpcy5LLGU9Yi5jaGFyQ29kZSk6KGQ9Yi5rZXlDb2RlfHx0aGlzLkssZT1iLmNoYXJDb2RlfHwwKSk6KGQ9Yi5rZXlDb2RlfHx0aGlzLkssZT1iLmNoYXJDb2RlfHwwKSx2JiZlPT02MyYmZD09MjI0JiYoZD0xOTEpO3ZhciBmPWQ9Y2MoZCk7ZD9kPj02MzIzMiYmZCBpbiBoYz9mPWhjW2RdOmQ9PTI1JiZhLnNoaWZ0S2V5JiYoZj05KTpiLmtleUlkZW50aWZpZXImJmIua2V5SWRlbnRpZmllciBpbiBpYyYmKGY9aWNbYi5rZXlJZGVudGlmaWVyXSk7CmlmKCF0fHxhLnR5cGUhPSJrZXlwcmVzcyJ8fGRjKGYsdGhpcy5GLGEuc2hpZnRLZXksYS5jdHJsS2V5LGMsYS5tZXRhS2V5KSlhPWY9PXRoaXMuRix0aGlzLkY9ZixiPW5ldyBmYyhmLGUsYSxiKSxiLmFsdEtleT1jLEUodGhpcyxiKX07Si5wcm90b3R5cGUuaT1mdW5jdGlvbigpe3JldHVybiB0aGlzLlJ9O3ZhciBnYz1mdW5jdGlvbihhLGIsYyl7YS5yYSYma2MoYSk7YS5SPWI7YS5xYT11YihhLlIsImtleXByZXNzIixhLGMpO2EuSmE9dWIoYS5SLCJrZXlkb3duIixhLmcsYyxhKTthLnJhPXViKGEuUiwia2V5dXAiLGEuaCxjLGEpfSxrYz1mdW5jdGlvbihhKXthLnFhJiYoQShhLnFhKSxBKGEuSmEpLEEoYS5yYSksYS5xYT1udWxsLGEuSmE9bnVsbCxhLnJhPW51bGwpO2EuUj1udWxsO2EuRj0tMTthLks9LTF9O0oucHJvdG90eXBlLkM9ZnVuY3Rpb24oKXtKLmwuQy5jYWxsKHRoaXMpO2tjKHRoaXMpfTt2YXIgSz17Z2E6Im1vdXNlZG93biIsaGE6Im1vdXNldXAiLGZhOiJtb3VzZWNhbmNlbCIsc2M6Im1vdXNlbW92ZSIsdWM6Im1vdXNlb3ZlciIsdGM6Im1vdXNlb3V0IixxYzoibW91c2VlbnRlciIscmM6Im1vdXNlbGVhdmUifTt2YXIgbGM9ZnVuY3Rpb24oYSl7cmV0dXJuIHR5cGVvZiBhLmNsYXNzTmFtZT09InN0cmluZyI/YS5jbGFzc05hbWU6YS5nZXRBdHRyaWJ1dGUmJmEuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIn0sTD1mdW5jdGlvbihhKXtyZXR1cm4gYS5jbGFzc0xpc3Q/YS5jbGFzc0xpc3Q6bGMoYSkubWF0Y2goL1xTKy9nKXx8W119LG1jPWZ1bmN0aW9uKGEsYil7dHlwZW9mIGEuY2xhc3NOYW1lPT0ic3RyaW5nIj9hLmNsYXNzTmFtZT1iOmEuc2V0QXR0cmlidXRlJiZhLnNldEF0dHJpYnV0ZSgiY2xhc3MiLGIpfSxuYz1mdW5jdGlvbihhLGIpe2EuY2xhc3NMaXN0P2I9YS5jbGFzc0xpc3QuY29udGFpbnMoYik6KGE9TChhKSxiPXZhKGEsYik+PTApO3JldHVybiBifSxvYz1mdW5jdGlvbihhLGIpe2lmKGEuY2xhc3NMaXN0KWEuY2xhc3NMaXN0LmFkZChiKTtlbHNlIGlmKCFuYyhhLGIpKXt2YXIgYz1sYyhhKTttYyhhLGMrKGMubGVuZ3RoPjA/IiAiK2I6YikpfX0scGM9ZnVuY3Rpb24oYSxiKXtpZihhLmNsYXNzTGlzdClBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGIsCmZ1bmN0aW9uKGUpe29jKGEsZSl9KTtlbHNle3ZhciBjPXt9O0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoTChhKSxmdW5jdGlvbihlKXtjW2VdPSEwfSk7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChiLGZ1bmN0aW9uKGUpe2NbZV09ITB9KTtiPSIiO2Zvcih2YXIgZCBpbiBjKWIrPWIubGVuZ3RoPjA/IiAiK2Q6ZDttYyhhLGIpfX0scWM9ZnVuY3Rpb24oYSxiKXthLmNsYXNzTGlzdD9hLmNsYXNzTGlzdC5yZW1vdmUoYik6bmMoYSxiKSYmbWMoYSxBcnJheS5wcm90b3R5cGUuZmlsdGVyLmNhbGwoTChhKSxmdW5jdGlvbihjKXtyZXR1cm4gYyE9Yn0pLmpvaW4oIiAiKSl9LHJjPWZ1bmN0aW9uKGEsYil7YS5jbGFzc0xpc3Q/QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChiLGZ1bmN0aW9uKGMpe3FjKGEsYyl9KTptYyhhLEFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbChMKGEpLGZ1bmN0aW9uKGMpe3JldHVybiEodmEoYixjKT49MCl9KS5qb2luKCIgIikpfTt2YXIgdGM9ZnVuY3Rpb24oYSxiKXtpZighYSl0aHJvdyBFcnJvcigiSW52YWxpZCBjbGFzcyBuYW1lICIrYSk7aWYodHlwZW9mIGIhPT0iZnVuY3Rpb24iKXRocm93IEVycm9yKCJJbnZhbGlkIGRlY29yYXRvciBmdW5jdGlvbiAiK2IpO3NjW2FdPWJ9LHVjPXt9LHNjPXt9O3ZhciB2Yz1mdW5jdGlvbihhKXt0aGlzLkE9YX07aWEodmMpO3ZhciB3Yz1mdW5jdGlvbihhLGIpe2EmJihhLnRhYkluZGV4PWI/MDotMSl9LHljPWZ1bmN0aW9uKGEsYixjKXtjLmlkJiZQYihiLGMuaWQpO3ZhciBkPWEuZygpLGU9ITEsZj1MKGMpO2YmJkFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoZixmdW5jdGlvbihoKXtoPT1kP2U9ITA6aCYmdGhpcy51KGIsaCxkKX0sYSk7ZXx8b2MoYyxkKTt4YyhiLGMpO3JldHVybiBjfTt2Yy5wcm90b3R5cGUudT1mdW5jdGlvbihhLGIsYyl7Yj09YysiLWRpc2FibGVkIj9hLlgoITEpOmI9PWMrIi1ob3Jpem9udGFsIj96YyhhLCJob3Jpem9udGFsIik6Yj09YysiLXZlcnRpY2FsIiYmemMoYSwidmVydGljYWwiKX07CnZhciB4Yz1mdW5jdGlvbihhLGIpe2lmKGIpZm9yKHZhciBjPWIuZmlyc3RDaGlsZCxkO2MmJmMucGFyZW50Tm9kZT09Yjspe2Q9Yy5uZXh0U2libGluZztpZihjLm5vZGVUeXBlPT0xKXthOnt2YXIgZT1jO3AoZSk7ZT1MKGUpO2Zvcih2YXIgZj1lLmxlbmd0aCxoPTA7aDxmO2grKyl7dmFyIGs9ZVtoXTtpZihrPWsgaW4gc2M/c2Nba10oKTpudWxsKXtlPWs7YnJlYWsgYX19ZT1udWxsfWUmJihlLmc9YyxhLmlzRW5hYmxlZCgpfHxlLlgoITEpLGEuQmEoZSksU2IoZSxjKSl9ZWxzZSBjLm5vZGVWYWx1ZSYmSGEoYy5ub2RlVmFsdWUpIT0iInx8Yi5yZW1vdmVDaGlsZChjKTtjPWR9fSxBYz1mdW5jdGlvbihhLGIpe2I9Yi5pKCk7cChiLCJUaGUgY29udGFpbmVyIERPTSBlbGVtZW50IGNhbm5vdCBiZSBudWxsLiIpO0tiKGIsdCk7KGE9YS5BKSYmWmIoYixhKX07dmMucHJvdG90eXBlLmc9ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy1jb250YWluZXIifTsKdmMucHJvdG90eXBlLmo9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nKCksYz1bYixhLkw9PSJob3Jpem9udGFsIj9iKyItaG9yaXpvbnRhbCI6YisiLXZlcnRpY2FsIl07YS5pc0VuYWJsZWQoKXx8Yy5wdXNoKGIrIi1kaXNhYmxlZCIpO3JldHVybiBjfTt2YXIgQmM9ZnVuY3Rpb24oKXt9O3ZhciBNPWZ1bmN0aW9uKCl7fSxDYztpYShNKTt2YXIgRGM9e2J1dHRvbjoicHJlc3NlZCIsY2hlY2tib3g6ImNoZWNrZWQiLG1lbnVpdGVtOiJzZWxlY3RlZCIsbWVudWl0ZW1jaGVja2JveDoiY2hlY2tlZCIsbWVudWl0ZW1yYWRpbzoiY2hlY2tlZCIscmFkaW86ImNoZWNrZWQiLHRhYjoic2VsZWN0ZWQiLHRyZWVpdGVtOiJzZWxlY3RlZCJ9O00ucHJvdG90eXBlLk5hPWZ1bmN0aW9uKCl7fTtNLnByb3RvdHlwZS54YT1mdW5jdGlvbihhKXt2YXIgYj1hLkcsYz1iLmgsZD10aGlzLk4oKSxlPVtkXSxmPXRoaXMuTigpO2YhPWQmJmUucHVzaChmKTtkPWEubTtmb3IoZj1bXTtkOyl7dmFyIGg9ZCYtZDtmLnB1c2goRWModGhpcyxoKSk7ZCY9fmh9ZS5wdXNoLmFwcGx5KGUsZik7KGQ9YS5GYSkmJmUucHVzaC5hcHBseShlLGQpO3JldHVybiBjLmNhbGwoYiwiRElWIixlLmpvaW4oIiAiKSxhLmlhKX07Ck0ucHJvdG90eXBlLnlhPWZ1bmN0aW9uKGEsYil7Yi5pZCYmUGIoYSxiLmlkKTtiJiZiLmZpcnN0Q2hpbGQ/RmMoYSxiLmZpcnN0Q2hpbGQubmV4dFNpYmxpbmc/eWEoYi5jaGlsZE5vZGVzKTpiLmZpcnN0Q2hpbGQpOmEuaWE9bnVsbDt2YXIgYz0wLGQ9dGhpcy5OKCksZT10aGlzLk4oKSxmPSExLGg9ITEsaz15YShMKGIpKTtrLmZvckVhY2goZnVuY3Rpb24ocSl7Znx8cSE9ZD9ofHxxIT1lP2N8PUdjKHRoaXMscSk6aD0hMDooZj0hMCxlPT1kJiYoaD0hMCkpO0djKHRoaXMscSk9PTEmJihzYShiKSxkYihiKSYmZWIoYikmJmNiKGIsITEpKX0sdGhpcyk7YS5tPWM7Znx8KGsucHVzaChkKSxlPT1kJiYoaD0hMCkpO2h8fGsucHVzaChlKTsoYT1hLkZhKSYmay5wdXNoLmFwcGx5KGssYSk7ZiYmaCYmIWF8fG1jKGIsay5qb2luKCIgIikpO3JldHVybiBifTsKdmFyIEhjPWZ1bmN0aW9uKGEsYil7aWYoYT1hLk5hKCkpe3AoYiwiVGhlIGVsZW1lbnQgcGFzc2VkIGFzIGEgZmlyc3QgcGFyYW1ldGVyIGNhbm5vdCBiZSBudWxsLiIpO3ZhciBjPWIuZ2V0QXR0cmlidXRlKCJyb2xlIil8fG51bGw7YSE9YyYmWmIoYixhKX19LEljPWZ1bmN0aW9uKGEsYil7dmFyIGM7aWYoYS5EJjMyJiYoYz1hLmkoKSkpe2lmKCFiJiZhLm0mMzIpe3RyeXtjLmJsdXIoKX1jYXRjaChkKXt9YS5tJjMyJiZhLlFhKG51bGwpfShkYihjKSYmZWIoYykpIT1iJiZjYihjLGIpfX0sSmM9ZnVuY3Rpb24oYSxiLGMpe0NjfHwoQ2M9ezE6ImRpc2FibGVkIiw4OiJzZWxlY3RlZCIsMTY6ImNoZWNrZWQiLDY0OiJleHBhbmRlZCJ9KTtwKGEsIlRoZSBlbGVtZW50IHBhc3NlZCBhcyBhIGZpcnN0IHBhcmFtZXRlciBjYW5ub3QgYmUgbnVsbC4iKTtiPUNjW2JdO3ZhciBkPWEuZ2V0QXR0cmlidXRlKCJyb2xlIil8fG51bGw7ZCYmKGQ9RGNbZF18fGIsYj1iPT0iY2hlY2tlZCJ8fGI9PQoic2VsZWN0ZWQiP2Q6Yik7YiYmYWMoYSxiLGMpfTtNLnByb3RvdHlwZS5OPWZ1bmN0aW9uKCl7cmV0dXJuImdvb2ctY29udHJvbCJ9O3ZhciBFYz1mdW5jdGlvbihhLGIpe2EuZ3x8S2MoYSk7cmV0dXJuIGEuZ1tiXX0sR2M9ZnVuY3Rpb24oYSxiKXthLmh8fChhLmd8fEtjKGEpLGEuaD1FYShhLmcpKTthPXBhcnNlSW50KGEuaFtiXSwxMCk7cmV0dXJuIGlzTmFOKGEpPzA6YX0sS2M9ZnVuY3Rpb24oYSl7dmFyIGI9YS5OKCk7dmFyIGM9Yi5yZXBsYWNlKC9ceGEwfFxzL2csIiAiKS5pbmRleE9mKCIgIikhPS0xO3AoIWMsIkNvbnRyb2xSZW5kZXJlciBoYXMgYW4gaW52YWxpZCBjc3MgY2xhc3M6ICciK2IrIiciKTthLmc9ezE6YisiLWRpc2FibGVkIiwyOmIrIi1ob3ZlciIsNDpiKyItYWN0aXZlIiw4OmIrIi1zZWxlY3RlZCIsMTY6YisiLWNoZWNrZWQiLDMyOmIrIi1mb2N1c2VkIiw2NDpiKyItb3BlbiJ9fTt2YXIgTj1mdW5jdGlvbihhLGIsYyl7Ri5jYWxsKHRoaXMsYyk7aWYoIWIpe2ZvcihiPXRoaXMuY29uc3RydWN0b3I7Yjspe3ZhciBkPW5hKGIpO2lmKGQ9dWNbZF0pYnJlYWs7Yj0oYj1PYmplY3QuZ2V0UHJvdG90eXBlT2YoYi5wcm90b3R5cGUpKSYmYi5jb25zdHJ1Y3Rvcn1iPWQ/dHlwZW9mIGQuVj09PSJmdW5jdGlvbiI/ZC5WKCk6bmV3IGQ6bnVsbH10aGlzLnY9Yjt0aGlzLmlhPWEhPT12b2lkIDA/YTpudWxsfTtuKE4sRik7Zz1OLnByb3RvdHlwZTtnLmlhPW51bGw7Zy5tPTA7Zy5EPTM5O2cuUD0wO2cuT2E9ITA7Zy5GYT1udWxsO2cuSGE9ITA7Zy5tYT1mdW5jdGlvbigpe3ZhciBhPXRoaXMudi54YSh0aGlzKTt0aGlzLmc9YTtIYyh0aGlzLnYsYSk7S2IoYSwhMCk7dGhpcy5pc1Zpc2libGUoKXx8KGEuc3R5bGUuZGlzcGxheT0ibm9uZSIsYSYmYWMoYSwiaGlkZGVuIiwhMCkpfTtnLm5hPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaSgpfTtnLndhPWZ1bmN0aW9uKCl7cmV0dXJuITB9OwpnLkVhPWZ1bmN0aW9uKGEpe3RoaXMuZz1hPXRoaXMudi55YSh0aGlzLGEpO0hjKHRoaXMudixhKTtLYihhLCEwKTt0aGlzLk9hPWEuc3R5bGUuZGlzcGxheSE9Im5vbmUifTsKZy5JPWZ1bmN0aW9uKCl7Ti5sLkkuY2FsbCh0aGlzKTt2YXIgYT10aGlzLmc7cChhLCJDYW4gbm90IGNhbGwgZ2V0RWxlbWVudFN0cmljdCBiZWZvcmUgcmVuZGVyaW5nL2RlY29yYXRpbmcuIik7cCh0aGlzKTtwKGEpO3RoaXMuaXNWaXNpYmxlKCl8fGFjKGEsImhpZGRlbiIsIXRoaXMuaXNWaXNpYmxlKCkpO3RoaXMuaXNFbmFibGVkKCl8fEpjKGEsMSwhdGhpcy5pc0VuYWJsZWQoKSk7dGhpcy5EJjgmJkpjKGEsOCwhISh0aGlzLm0mOCkpO3RoaXMuRCYxNiYmSmMoYSwxNiwhISh0aGlzLm0mMTYpKTt0aGlzLkQmNjQmJkpjKGEsNjQsISEodGhpcy5tJjY0KSk7dmFyIGI9dGhpcy52O1ViKHRoaXMpJiYoYT10aGlzLmkoKSxiPWIuTigpKyItcnRsIiwoYT1hLmk/YS5pKCk6YSkmJnBjKGEsW2JdKSk7dGhpcy5pc0VuYWJsZWQoKSYmSWModGhpcyx0aGlzLmlzVmlzaWJsZSgpKTt0aGlzLkQmLTImJih0aGlzLkhhJiZMYyh0aGlzLCEwKSx0aGlzLkQmMzImJihhPXRoaXMuaSgpKSkmJihiPQp0aGlzLlp8fCh0aGlzLlo9bmV3IEopLGdjKGIsYSksQihCKEIoUWIodGhpcyksYiwia2V5Iix0aGlzLmFhKSxhLCJmb2N1cyIsdGhpcy5YYSksYSwiYmx1ciIsdGhpcy5RYSkpfTt2YXIgTGM9ZnVuY3Rpb24oYSxiKXt2YXIgYz1RYihhKSxkPWEuaSgpO2I/KEIoQihCKEIoYyxkLEsuZ2EsYS5zYSksZCxbSy5oYSxLLmZhXSxhLnZhKSxkLCJtb3VzZW92ZXIiLGEudWEpLGQsIm1vdXNlb3V0IixhLnRhKSxhLmNhIT1CYyYmQihjLGQsImNvbnRleHRtZW51IixhLmNhKSk6KEMoQyhDKEMoYyxkLEsuZ2EsYS5zYSksZCxbSy5oYSxLLmZhXSxhLnZhKSxkLCJtb3VzZW92ZXIiLGEudWEpLGQsIm1vdXNlb3V0IixhLnRhKSxhLmNhIT1CYyYmQyhjLGQsImNvbnRleHRtZW51IixhLmNhKSl9O04ucHJvdG90eXBlLlU9ZnVuY3Rpb24oKXtOLmwuVS5jYWxsKHRoaXMpO3RoaXMuWiYma2ModGhpcy5aKTt0aGlzLmlzVmlzaWJsZSgpJiZ0aGlzLmlzRW5hYmxlZCgpJiZJYyh0aGlzLCExKX07Ck4ucHJvdG90eXBlLkM9ZnVuY3Rpb24oKXtOLmwuQy5jYWxsKHRoaXMpO3RoaXMuWiYmKHRoaXMuWi5kaXNwb3NlKCksZGVsZXRlIHRoaXMuWik7ZGVsZXRlIHRoaXMudjt0aGlzLkZhPXRoaXMuaWE9bnVsbH07dmFyIEZjPWZ1bmN0aW9uKGEsYil7YS5pYT1ifTtOLnByb3RvdHlwZS5pc1Zpc2libGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5PYX07Ti5wcm90b3R5cGUuaXNFbmFibGVkPWZ1bmN0aW9uKCl7cmV0dXJuISh0aGlzLm0mMSl9O04ucHJvdG90eXBlLlg9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5oO2ImJnR5cGVvZiBiLmlzRW5hYmxlZD09ImZ1bmN0aW9uIiYmIWIuaXNFbmFibGVkKCl8fCFPKHRoaXMsMSwhYSl8fChhfHwoTWModGhpcywhMSksUCh0aGlzLCExKSksdGhpcy5pc1Zpc2libGUoKSYmSWModGhpcyxhKSxUKHRoaXMsMSwhYSwhMCkpfTt2YXIgUD1mdW5jdGlvbihhLGIpe08oYSwyLGIpJiZUKGEsMixiKX07Ck4ucHJvdG90eXBlLmlzQWN0aXZlPWZ1bmN0aW9uKCl7cmV0dXJuISEodGhpcy5tJjQpfTsKdmFyIE1jPWZ1bmN0aW9uKGEsYil7TyhhLDQsYikmJlQoYSw0LGIpfSxOYz1mdW5jdGlvbihhLGIpe08oYSw4LGIpJiZUKGEsOCxiKX0sT2M9ZnVuY3Rpb24oYSxiKXtPKGEsNjQsYikmJlQoYSw2NCxiKX0sVD1mdW5jdGlvbihhLGIsYyxkKXtpZighZCYmYj09MSlhLlgoIWMpO2Vsc2UgaWYoYS5EJmImJmMhPSEhKGEubSZiKSl7dmFyIGU9YS52O2lmKGQ9YS5pKCkpe2lmKGU9RWMoZSxiKSl7dmFyIGY9YS5pP2EuaSgpOmE7ZiYmKGM/cGM6cmMpKGYsW2VdKX1KYyhkLGIsYyl9YS5tPWM/YS5tfGI6YS5tJn5ifX0sUGM9ZnVuY3Rpb24oYSxiLGMpe2lmKGEucyYmYS5tJmImJiFjKXRocm93IEVycm9yKCJDb21wb25lbnQgYWxyZWFkeSByZW5kZXJlZCIpOyFjJiZhLm0mYiYmVChhLGIsITEpO2EuRD1jP2EuRHxiOmEuRCZ+Yn0sVT1mdW5jdGlvbihhLGIpe3JldHVybiEhKDI1NSZiKSYmISEoYS5EJmIpfSxPPWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4hIShhLkQmYikmJiEhKGEubSZiKSE9CmMmJighKGEuUCZiKXx8RShhLE5iKGIsYykpKSYmIWEuYmF9O04ucHJvdG90eXBlLnVhPWZ1bmN0aW9uKGEpeyFRYyhhLHRoaXMuaSgpKSYmRSh0aGlzLCJlbnRlciIpJiZ0aGlzLmlzRW5hYmxlZCgpJiZVKHRoaXMsMikmJlAodGhpcywhMCl9O04ucHJvdG90eXBlLnRhPWZ1bmN0aW9uKGEpeyFRYyhhLHRoaXMuaSgpKSYmRSh0aGlzLCJsZWF2ZSIpJiYoVSh0aGlzLDQpJiZNYyh0aGlzLCExKSxVKHRoaXMsMikmJlAodGhpcywhMSkpfTtOLnByb3RvdHlwZS5jYT1CYzt2YXIgUWM9ZnVuY3Rpb24oYSxiKXtyZXR1cm4hIWEucmVsYXRlZFRhcmdldCYmYWIoYixhLnJlbGF0ZWRUYXJnZXQpfTsKTi5wcm90b3R5cGUuc2E9ZnVuY3Rpb24oYSl7aWYodGhpcy5pc0VuYWJsZWQoKSYmKFUodGhpcywyKSYmUCh0aGlzLCEwKSwhKGEuaC5idXR0b24hPTB8fHYmJmEuY3RybEtleSkpKXtVKHRoaXMsNCkmJk1jKHRoaXMsITApO3ZhciBiO2lmKGI9dGhpcy52KXt2YXIgYztiPXRoaXMuRCYzMiYmKGM9dGhpcy5pKCkpP2RiKGMpJiZlYihjKTohMX1iJiZ0aGlzLmkoKS5mb2N1cygpfWEuaC5idXR0b24hPTB8fHYmJmEuY3RybEtleXx8YS5qKCl9O04ucHJvdG90eXBlLnZhPWZ1bmN0aW9uKGEpe3RoaXMuaXNFbmFibGVkKCkmJihVKHRoaXMsMikmJlAodGhpcywhMCksdGhpcy5pc0FjdGl2ZSgpJiZSYyh0aGlzLGEpJiZVKHRoaXMsNCkmJk1jKHRoaXMsITEpKX07CnZhciBSYz1mdW5jdGlvbihhLGIpe2lmKFUoYSwxNikpe3ZhciBjPSEoYS5tJjE2KTtPKGEsMTYsYykmJlQoYSwxNixjKX1VKGEsOCkmJk5jKGEsITApO1UoYSw2NCkmJk9jKGEsIShhLm0mNjQpKTtjPW5ldyB5KCJhY3Rpb24iLGEpO2ImJihjLmFsdEtleT1iLmFsdEtleSxjLmN0cmxLZXk9Yi5jdHJsS2V5LGMubWV0YUtleT1iLm1ldGFLZXksYy5zaGlmdEtleT1iLnNoaWZ0S2V5LGMuRz1iLkcsYy50aW1lU3RhbXA9Yi50aW1lU3RhbXApO3JldHVybiBFKGEsYyl9O04ucHJvdG90eXBlLlhhPWZ1bmN0aW9uKCl7VSh0aGlzLDMyKSYmTyh0aGlzLDMyLCEwKSYmVCh0aGlzLDMyLCEwKX07Ti5wcm90b3R5cGUuUWE9ZnVuY3Rpb24oKXtVKHRoaXMsNCkmJk1jKHRoaXMsITEpO1UodGhpcywzMikmJk8odGhpcywzMiwhMSkmJlQodGhpcywzMiwhMSl9OwpOLnByb3RvdHlwZS5hYT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5pc1Zpc2libGUoKSYmdGhpcy5pc0VuYWJsZWQoKSYmYS5nPT0xMyYmUmModGhpcyxhKT8oYS5qKCksYS52KCksITApOiExfTtpZih0eXBlb2YgTiE9PSJmdW5jdGlvbiIpdGhyb3cgRXJyb3IoIkludmFsaWQgY29tcG9uZW50IGNsYXNzICIrTik7aWYodHlwZW9mIE0hPT0iZnVuY3Rpb24iKXRocm93IEVycm9yKCJJbnZhbGlkIHJlbmRlcmVyIGNsYXNzICIrTSk7dmFyIFNjPW5hKE4pO3VjW1NjXT1NO3RjKCJnb29nLWNvbnRyb2wiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBOKG51bGwpfSk7dmFyIFY9ZnVuY3Rpb24oYSxiLGMpe0YuY2FsbCh0aGlzLGMpO3RoaXMuZWE9Ynx8dmMuVigpO3RoaXMuTD1hfHwidmVydGljYWwifTtuKFYsRik7Zz1WLnByb3RvdHlwZTtnLkthPW51bGw7Zy5kYT1udWxsO2cuZWE9bnVsbDtnLkw9bnVsbDtnLlM9ITA7Zy5UPSEwO2cubz0tMTtnLkI9bnVsbDtnLlc9ITE7Zy5PPW51bGw7dmFyIFRjPWZ1bmN0aW9uKGEpe3JldHVybiBhLkthfHxhLmkoKX07Zz1WLnByb3RvdHlwZTtnLm1hPWZ1bmN0aW9uKCl7dGhpcy5nPXRoaXMuRy5oKCJESVYiLHRoaXMuZWEuaih0aGlzKS5qb2luKCIgIikpfTtnLm5hPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaSgpfTtnLndhPWZ1bmN0aW9uKGEpe3JldHVybiBhLnRhZ05hbWU9PSJESVYifTtnLkVhPWZ1bmN0aW9uKGEpe3RoaXMuZz15Yyh0aGlzLmVhLHRoaXMsYSk7YS5zdHlsZS5kaXNwbGF5PT0ibm9uZSImJih0aGlzLlM9ITEpfTsKZy5JPWZ1bmN0aW9uKCl7Vi5sLkkuY2FsbCh0aGlzKTtUYih0aGlzLGZ1bmN0aW9uKGIpe2IucyYmVWModGhpcyxiKX0sdGhpcyk7dmFyIGE9dGhpcy5pKCk7QWModGhpcy5lYSx0aGlzKTtWYyh0aGlzLHRoaXMuUyk7QihCKEIoQihCKEIoQihCKFFiKHRoaXMpLHRoaXMsImVudGVyIix0aGlzLmViKSx0aGlzLCJoaWdobGlnaHQiLHRoaXMuZmIpLHRoaXMsInVuaGlnaGxpZ2h0Iix0aGlzLmxiKSx0aGlzLCJvcGVuIix0aGlzLmdiKSx0aGlzLCJjbG9zZSIsdGhpcy5iYiksYSxLLmdhLHRoaXMuV2EpLGJiKGEpLFtLLmhhLEsuZmFdLHRoaXMuY2IpLGEsW0suZ2EsSy5oYSxLLmZhLCJtb3VzZW92ZXIiLCJtb3VzZW91dCIsImNvbnRleHRtZW51Il0sdGhpcy5hYik7V2ModGhpcyl9O3ZhciBXYz1mdW5jdGlvbihhKXt2YXIgYj1RYihhKSxjPVRjKGEpO0IoQihCKGIsYywiZm9jdXMiLGEuUGEpLGMsImJsdXIiLGEuVWEpLGEuZGF8fChhLmRhPW5ldyBKKFRjKGEpKSksImtleSIsYS5WYSl9OwpnPVYucHJvdG90eXBlO2cuVT1mdW5jdGlvbigpe1hjKHRoaXMsLTEpO3RoaXMuQiYmT2ModGhpcy5CLCExKTt0aGlzLlc9ITE7Vi5sLlUuY2FsbCh0aGlzKX07Zy5DPWZ1bmN0aW9uKCl7Vi5sLkMuY2FsbCh0aGlzKTt0aGlzLmRhJiYodGhpcy5kYS5kaXNwb3NlKCksdGhpcy5kYT1udWxsKTt0aGlzLmVhPXRoaXMuQj10aGlzLk89dGhpcy5LYT1udWxsfTtnLmViPWZ1bmN0aW9uKCl7cmV0dXJuITB9OwpnLmZiPWZ1bmN0aW9uKGEpe3ZhciBiPVZiKHRoaXMsYS50YXJnZXQpO2lmKGI+LTEmJmIhPXRoaXMubyl7dmFyIGM9SSh0aGlzLHRoaXMubyk7YyYmUChjLCExKTt0aGlzLm89YjtjPUkodGhpcyx0aGlzLm8pO3RoaXMuVyYmTWMoYywhMCk7dGhpcy5CJiZjIT10aGlzLkImJihjLkQmNjQ/T2MoYywhMCk6T2ModGhpcy5CLCExKSl9Yj10aGlzLmkoKTtwKGIsIlRoZSBET00gZWxlbWVudCBmb3IgdGhlIGNvbnRhaW5lciBjYW5ub3QgYmUgbnVsbC4iKTthLnRhcmdldC5pKCkhPW51bGwmJmFjKGIsImFjdGl2ZWRlc2NlbmRhbnQiLGEudGFyZ2V0LmkoKS5pZCl9O2cubGI9ZnVuY3Rpb24oYSl7YS50YXJnZXQ9PUkodGhpcyx0aGlzLm8pJiYodGhpcy5vPS0xKTthPXRoaXMuaSgpO3AoYSwiVGhlIERPTSBlbGVtZW50IGZvciB0aGUgY29udGFpbmVyIGNhbm5vdCBiZSBudWxsLiIpO2EucmVtb3ZlQXR0cmlidXRlKCRiKCJhY3RpdmVkZXNjZW5kYW50IikpfTsKZy5nYj1mdW5jdGlvbihhKXsoYT1hLnRhcmdldCkmJmEhPXRoaXMuQiYmYS5oPT10aGlzJiYodGhpcy5CJiZPYyh0aGlzLkIsITEpLHRoaXMuQj1hKX07Zy5iYj1mdW5jdGlvbihhKXthLnRhcmdldD09dGhpcy5CJiYodGhpcy5CPW51bGwpO3ZhciBiPXRoaXMuaSgpLGM9YS50YXJnZXQuaSgpO2ImJmEudGFyZ2V0Lm0mMiYmYyYmKGE9IiIsYyYmKGE9Yy5pZCxwKGEsIlRoZSBhY3RpdmUgZWxlbWVudCBzaG91bGQgaGF2ZSBhbiBpZC4iKSksYWMoYiwiYWN0aXZlZGVzY2VuZGFudCIsYSkpfTtnLldhPWZ1bmN0aW9uKGEpe3RoaXMuVCYmKHRoaXMuVz0hMCk7dmFyIGI9VGModGhpcyk7YiYmZGIoYikmJmViKGIpP2IuZm9jdXMoKTphLmooKX07Zy5jYj1mdW5jdGlvbigpe3RoaXMuVz0hMX07CmcuYWI9ZnVuY3Rpb24oYSl7YTp7dmFyIGI9YS50YXJnZXQ7aWYodGhpcy5PKWZvcih2YXIgYz10aGlzLmkoKTtiJiZiIT09Yzspe3ZhciBkPWIuaWQ7aWYoZCBpbiB0aGlzLk8pe2I9dGhpcy5PW2RdO2JyZWFrIGF9Yj1iLnBhcmVudE5vZGV9Yj1udWxsfWlmKGIpc3dpdGNoKGEudHlwZSl7Y2FzZSBLLmdhOmIuc2EoYSk7YnJlYWs7Y2FzZSBLLmhhOmNhc2UgSy5mYTpiLnZhKGEpO2JyZWFrO2Nhc2UgIm1vdXNlb3ZlciI6Yi51YShhKTticmVhaztjYXNlICJtb3VzZW91dCI6Yi50YShhKTticmVhaztjYXNlICJjb250ZXh0bWVudSI6Yi5jYShhKX19O2cuUGE9ZnVuY3Rpb24oKXt9O2cuVWE9ZnVuY3Rpb24oKXtYYyh0aGlzLC0xKTt0aGlzLlc9ITE7dGhpcy5CJiZPYyh0aGlzLkIsITEpfTsKZy5WYT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5pc0VuYWJsZWQoKSYmdGhpcy5pc1Zpc2libGUoKSYmKEgodGhpcykhPTB8fHRoaXMuS2EpJiZZYyh0aGlzLGEpPyhhLmooKSxhLnYoKSwhMCk6ITF9Owp2YXIgWWM9ZnVuY3Rpb24oYSxiKXt2YXIgYz1JKGEsYS5vKTtpZihjJiZ0eXBlb2YgYy5hYT09ImZ1bmN0aW9uIiYmYy5hYShiKXx8YS5CJiZhLkIhPWMmJnR5cGVvZiBhLkIuYWE9PSJmdW5jdGlvbiImJmEuQi5hYShiKSlyZXR1cm4hMDtpZihiLnNoaWZ0S2V5fHxiLmN0cmxLZXl8fGIubWV0YUtleXx8Yi5hbHRLZXkpcmV0dXJuITE7c3dpdGNoKGIuZyl7Y2FzZSAyNzpUYyhhKS5ibHVyKCk7YnJlYWs7Y2FzZSAzNjpaYyhhKTticmVhaztjYXNlIDM1OiRjKGEpO2JyZWFrO2Nhc2UgMzg6aWYoYS5MPT0idmVydGljYWwiKWFkKGEpO2Vsc2UgcmV0dXJuITE7YnJlYWs7Y2FzZSAzNzppZihhLkw9PSJob3Jpem9udGFsIilVYihhKT9iZChhKTphZChhKTtlbHNlIHJldHVybiExO2JyZWFrO2Nhc2UgNDA6aWYoYS5MPT0idmVydGljYWwiKWJkKGEpO2Vsc2UgcmV0dXJuITE7YnJlYWs7Y2FzZSAzOTppZihhLkw9PSJob3Jpem9udGFsIilVYihhKT9hZChhKTpiZChhKTtlbHNlIHJldHVybiExOwpicmVhaztkZWZhdWx0OnJldHVybiExfXJldHVybiEwfSxVYz1mdW5jdGlvbihhLGIpe3ZhciBjPWIuaSgpO2M9Yy5pZHx8KGMuaWQ9T2IoYikpO2EuT3x8KGEuTz17fSk7YS5PW2NdPWJ9O1YucHJvdG90eXBlLkJhPWZ1bmN0aW9uKGEsYil7dWEoYSxOLCJUaGUgY2hpbGQgb2YgYSBjb250YWluZXIgbXVzdCBiZSBhIGNvbnRyb2wiKTtWLmwuQmEuY2FsbCh0aGlzLGEsYil9O1YucHJvdG90eXBlLkNhPWZ1bmN0aW9uKGEsYixjKXt1YShhLE4pO2EuUHw9MjthLlB8PTY0O1BjKGEsMzIsITEpO2EucyYmMCE9YS5IYSYmTGMoYSwhMSk7YS5IYT0hMTt2YXIgZD1hLmg9PXRoaXM/VmIodGhpcyxhKTotMTtWLmwuQ2EuY2FsbCh0aGlzLGEsYixjKTthLnMmJnRoaXMucyYmVWModGhpcyxhKTthPWQ7YT09LTEmJihhPUgodGhpcykpO2E9PXRoaXMubz90aGlzLm89TWF0aC5taW4oSCh0aGlzKS0xLGIpOmE+dGhpcy5vJiZiPD10aGlzLm8/dGhpcy5vKys6YTx0aGlzLm8mJmI+dGhpcy5vJiZ0aGlzLm8tLX07CnZhciB6Yz1mdW5jdGlvbihhLGIpe2lmKGEuaSgpKXRocm93IEVycm9yKCJDb21wb25lbnQgYWxyZWFkeSByZW5kZXJlZCIpO2EuTD1ifTtWLnByb3RvdHlwZS5pc1Zpc2libGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5TfTt2YXIgVmM9ZnVuY3Rpb24oYSxiKXthLlM9Yjt2YXIgYz1hLmkoKTtjJiYoYy5zdHlsZS5kaXNwbGF5PWI/IiI6Im5vbmUiLHdjKFRjKGEpLGEuVCYmYS5TKSl9O1YucHJvdG90eXBlLmlzRW5hYmxlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLlR9O1YucHJvdG90eXBlLlg9ZnVuY3Rpb24oYSl7dGhpcy5UIT1hJiZFKHRoaXMsYT8iZW5hYmxlIjoiZGlzYWJsZSIpJiYoYT8odGhpcy5UPSEwLFRiKHRoaXMsZnVuY3Rpb24oYil7Yi5UYT9kZWxldGUgYi5UYTpiLlgoITApfSkpOihUYih0aGlzLGZ1bmN0aW9uKGIpe2IuaXNFbmFibGVkKCk/Yi5YKCExKTpiLlRhPSEwfSksdGhpcy5XPXRoaXMuVD0hMSksd2MoVGModGhpcyksYSYmdGhpcy5TKSl9Owp2YXIgWGM9ZnVuY3Rpb24oYSxiKXsoYj1JKGEsYikpP1AoYiwhMCk6YS5vPi0xJiZQKEkoYSxhLm8pLCExKX0sWmM9ZnVuY3Rpb24oYSl7Y2QoYSxmdW5jdGlvbihiLGMpe3JldHVybihiKzEpJWN9LEgoYSktMSl9LCRjPWZ1bmN0aW9uKGEpe2NkKGEsZnVuY3Rpb24oYixjKXtiLS07cmV0dXJuIGI8MD9jLTE6Yn0sMCl9LGJkPWZ1bmN0aW9uKGEpe2NkKGEsZnVuY3Rpb24oYixjKXtyZXR1cm4oYisxKSVjfSxhLm8pfSxhZD1mdW5jdGlvbihhKXtjZChhLGZ1bmN0aW9uKGIsYyl7Yi0tO3JldHVybiBiPDA/Yy0xOmJ9LGEubyl9LGNkPWZ1bmN0aW9uKGEsYixjKXtjPWM8MD9WYihhLGEuQik6Yzt2YXIgZD1IKGEpO2M9Yi5jYWxsKGEsYyxkKTtmb3IodmFyIGU9MDtlPD1kOyl7dmFyIGY9SShhLGMpO2lmKGYmJmYuaXNWaXNpYmxlKCkmJmYuaXNFbmFibGVkKCkmJmYuRCYyKXthLkxhKGMpO2JyZWFrfWUrKztjPWIuY2FsbChhLGMsZCl9fTsKVi5wcm90b3R5cGUuTGE9ZnVuY3Rpb24oYSl7WGModGhpcyxhKX07dmFyIGRkPWZ1bmN0aW9uKCl7fTtuKGRkLE0pO2lhKGRkKTtnPWRkLnByb3RvdHlwZTtnLk49ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy10YWIifTtnLk5hPWZ1bmN0aW9uKCl7cmV0dXJuInRhYiJ9O2cueGE9ZnVuY3Rpb24oYSl7dmFyIGI9ZGQubC54YS5jYWxsKHRoaXMsYSk7KGE9YS5HYSgpKSYmdGhpcy5NYShiLGEpO3JldHVybiBifTtnLnlhPWZ1bmN0aW9uKGEsYil7Yj1kZC5sLnlhLmNhbGwodGhpcyxhLGIpO3ZhciBjPXRoaXMuR2EoYik7YyYmKGEuUmE9Yyk7YS5tJjgmJihjPWEuaCkmJnR5cGVvZiBjLko9PT0iZnVuY3Rpb24iJiYoVChhLDgsITEpLGMuSihhKSk7cmV0dXJuIGJ9O2cuR2E9ZnVuY3Rpb24oYSl7cmV0dXJuIGEudGl0bGV8fCIifTtnLk1hPWZ1bmN0aW9uKGEsYil7YSYmKGEudGl0bGU9Ynx8IiIpfTt2YXIgZWQ9ZnVuY3Rpb24oYSxiLGMpe04uY2FsbCh0aGlzLGEsYnx8ZGQuVigpLGMpO1BjKHRoaXMsOCwhMCk7dGhpcy5QfD05fTtuKGVkLE4pO2VkLnByb3RvdHlwZS5HYT1mdW5jdGlvbigpe3JldHVybiB0aGlzLlJhfTtlZC5wcm90b3R5cGUuTWE9ZnVuY3Rpb24oYSl7dGhpcy52Lk1hKHRoaXMuaSgpLGEpO3RoaXMuUmE9YX07dGMoImdvb2ctdGFiIixmdW5jdGlvbigpe3JldHVybiBuZXcgZWQobnVsbCl9KTt2YXIgVz1mdW5jdGlvbigpe3RoaXMuQT0idGFibGlzdCJ9O24oVyx2Yyk7aWEoVyk7Vy5wcm90b3R5cGUuZz1mdW5jdGlvbigpe3JldHVybiJnb29nLXRhYi1iYXIifTtXLnByb3RvdHlwZS51PWZ1bmN0aW9uKGEsYixjKXt0aGlzLnZ8fCh0aGlzLmh8fGZkKHRoaXMpLHRoaXMudj1FYSh0aGlzLmgpKTt2YXIgZD10aGlzLnZbYl07ZD8oemMoYSxnZChkKSksYS52PWQpOlcubC51LmNhbGwodGhpcyxhLGIsYyl9O1cucHJvdG90eXBlLmo9ZnVuY3Rpb24oYSl7dmFyIGI9Vy5sLmouY2FsbCh0aGlzLGEpO3RoaXMuaHx8ZmQodGhpcyk7Yi5wdXNoKHRoaXMuaFthLnZdKTtyZXR1cm4gYn07dmFyIGZkPWZ1bmN0aW9uKGEpe3ZhciBiPWEuZygpO2EuaD17dG9wOmIrIi10b3AiLGJvdHRvbTpiKyItYm90dG9tIixzdGFydDpiKyItc3RhcnQiLGVuZDpiKyItZW5kIn19O3ZhciBYPWZ1bmN0aW9uKGEsYixjKXthPWF8fCJ0b3AiO3pjKHRoaXMsZ2QoYSkpO3RoaXMudj1hO1YuY2FsbCh0aGlzLHRoaXMuTCxifHxXLlYoKSxjKTtoZCh0aGlzKX07bihYLFYpO2c9WC5wcm90b3R5cGU7Zy5IPW51bGw7Zy5JPWZ1bmN0aW9uKCl7WC5sLkkuY2FsbCh0aGlzKTtoZCh0aGlzKX07Zy5DPWZ1bmN0aW9uKCl7WC5sLkMuY2FsbCh0aGlzKTt0aGlzLkg9bnVsbH07Zy5MYT1mdW5jdGlvbihhKXtYLmwuTGEuY2FsbCh0aGlzLGEpO3RoaXMuSihJKHRoaXMsYSkpfTtnLko9ZnVuY3Rpb24oYSl7YT9OYyhhLCEwKTp0aGlzLkgmJk5jKHRoaXMuSCwhMSl9Owp2YXIgaWQ9ZnVuY3Rpb24oYSxiKXtpZihiJiZiPT1hLkgpe2Zvcih2YXIgYz1WYihhLGIpLGQ9Yy0xO2I9SShhLGQpO2QtLSl7dmFyIGU9YjtpZihlLmlzVmlzaWJsZSgpJiZlLmlzRW5hYmxlZCgpKXthLkooYik7cmV0dXJufX1mb3IoYys9MTtiPUkoYSxjKTtjKyspaWYoZD1iLGQuaXNWaXNpYmxlKCkmJmQuaXNFbmFibGVkKCkpe2EuSihiKTtyZXR1cm59YS5KKG51bGwpfX07Zz1YLnByb3RvdHlwZTtnLmpiPWZ1bmN0aW9uKGEpe3RoaXMuSCYmdGhpcy5IIT1hLnRhcmdldCYmTmModGhpcy5ILCExKTt0aGlzLkg9YS50YXJnZXR9O2cua2I9ZnVuY3Rpb24oYSl7YS50YXJnZXQ9PXRoaXMuSCYmKHRoaXMuSD1udWxsKX07Zy5oYj1mdW5jdGlvbihhKXtpZCh0aGlzLGEudGFyZ2V0KX07Zy5pYj1mdW5jdGlvbihhKXtpZCh0aGlzLGEudGFyZ2V0KX07Zy5QYT1mdW5jdGlvbigpe0kodGhpcyx0aGlzLm8pfHxYYyh0aGlzLFZiKHRoaXMsdGhpcy5IfHxJKHRoaXMsMCkpKX07CnZhciBoZD1mdW5jdGlvbihhKXtCKEIoQihCKFFiKGEpLGEsInNlbGVjdCIsYS5qYiksYSwidW5zZWxlY3QiLGEua2IpLGEsImRpc2FibGUiLGEuaGIpLGEsImhpZGUiLGEuaWIpfSxnZD1mdW5jdGlvbihhKXtyZXR1cm4gYT09InN0YXJ0Inx8YT09ImVuZCI/InZlcnRpY2FsIjoiaG9yaXpvbnRhbCJ9O3RjKCJnb29nLXRhYi1iYXIiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBYfSk7ZnVuY3Rpb24gamQoYSl7dmFyIGI9e3RvcDoiYm90dG9tIixib3R0b206InRvcCIsc3RhcnQ6InJpZ2h0IixlbmQ6ImxlZnQifVthLmxvY2F0aW9uXSxjPWEuZWxlbWVudElkLGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTtkLnRleHRDb250ZW50PSJcbiAgICBmaWVsZHNldCB7XG4gICAgICBwYWRkaW5nOiAxMHB4O1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgIzM2OTtcbiAgICB9XG5cbiAgICAjIitjKyIgLmdvb2ctdGFiLWNvbnRlbnQge1xuICAgICAgbWluLWhlaWdodDogM2VtO1xuICAgICAgbWFyZ2luOiAwO1xuICAgICAgYm9yZGVyOiAiK2EuYm9yZGVyKyIgc29saWQgIithLmJvcmRlckNvbG9yKyI7XG4gICAgICBib3JkZXItdG9wOiAwO1xuICAgICAgaGVpZ2h0OiAiK2EuY29udGVudEhlaWdodCsiO1xuICAgICAgcGFkZGluZzogNHB4IDhweDtcbiAgICAgIG1hcmdpbi1yaWdodDogNHB4O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgIG92ZXJmbG93OiBhdXRvO1xuICAgIH1cblxuICAgICMiKwpjKyIgLmdvb2ctdGFiLWJhci0iK2EubG9jYXRpb24rIiAuZ29vZy10YWItc2VsZWN0ZWQge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICIrYS5ib3JkZXJDb2xvcisiO1xuICAgICAgYm9yZGVyLSIrYisiOiAwcHg7XG4gICAgfVxuXG4gICAgIyIrYysiIC5nb29nLXRhYi1iYXItIithLmxvY2F0aW9uKyIge1xuICAgICAgcGFkZGluZy0iK2EubG9jYXRpb24rIjogNXB4ICFpbXBvcnRhbnQ7XG4gICAgICBib3JkZXItIitiKyI6IDFweCBzb2xpZCAiK2EuYm9yZGVyQ29sb3IrIiAhaW1wb3J0YW50O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICB9XG5cbiAgICAjIitjKyIgLmdvb2ctdGFiLWJhciB7XG4gICAgICAgbWFyZ2luOiAwO1xuICAgICAgIGJvcmRlcjogMDtcbiAgICAgICBwYWRkaW5nOiAwO1xuICAgICAgIGxpc3Qtc3R5bGU6IG5vbmU7XG4gICAgICAgY3Vyc29yOiBkZWZhdWx0O1xuICAgICAgIG91dGxpbmU6IG5vbmU7XG4gICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgICBtYXJnaW4tcmlnaHQ6IDRweDtcbiAgICAgIH1cblxuICAgICAjIisKYysiIC5nb29nLXRhYiB7XG4gICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgIHBhZGRpbmc6IDRweCA4cHg7XG4gICAgICAgY29sb3I6IHZhcigtLWNvbGFiLXByaW1hcnktdGV4dC1jb2xvcik7XG4gICAgICAgdGV4dC1kZWNvcmF0aW9uOiBpbml0aWFsO1xuICAgICAgIGN1cnNvcjogZGVmYXVsdDtcbiAgICAgIH1cblxuICAgICAgIyIrYysiIC5nb29nLXRhYi1ob3ZlciB7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWNvbGFiLWhpZ2hsaWdodGVkLXN1cmZhY2UtY29sb3IpO1xuICAgICAgfVxuICAgICAgIjtyZXR1cm4gZH0KdmFyIGtkPWZ1bmN0aW9uKGEpe3ZhciBiPWEuZWxlbWVudElkLGM9YS50YWJOYW1lcyxkPWEuc2VsZWN0ZWRJbmRleDsiY29udGVudEJvcmRlciJpbiBhfHwoYS5jb250ZW50Qm9yZGVyPSIwcHgiKTsiY29udGVudEhlaWdodCJpbiBhfHwoYS5jb250ZW50SGVpZ2h0PSJpbml0aWFsIik7ImJvcmRlckNvbG9yImluIGF8fChhLmJvcmRlckNvbG9yPSJ2YXIoLS1jb2xhYi1ib3JkZXItY29sb3IpIik7YS5sb2NhdGlvbnx8KGEubG9jYXRpb249InRvcCIpO3ZhciBlPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiMiK2IpLGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zi5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYi1iYXIiKTt2YXIgaD1hLmxvY2F0aW9uO2YuY2xhc3NMaXN0LmFkZCgiZ29vZy10YWItYmFyLSIraCk7Zm9yKHZhciBrPVtdLHE9ZmEoYyksRz1xLm5leHQoKTshRy5kb25lO0c9cS5uZXh0KCkpe0c9Ry52YWx1ZTt2YXIgeD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKeC5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYiIpO3gudGV4dENvbnRlbnQ9RztmLmFwcGVuZENoaWxkKHgpO2sucHVzaCh4KX1oIT0iYm90dG9tIiYmZS5hcHBlbmRDaGlsZChmKTtxPW51bGw7aWYoaD09InRvcCJ8fGg9PSJib3R0b20iKXE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikscS5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYi1iYXItY2xlYXIiKTtoPT0idG9wIiYmcSYmZS5hcHBlbmRDaGlsZChxKTtHPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO0cuY2xhc3NMaXN0LmFkZCgiZ29vZy10YWItY29udGVudCIpO3ZhciBoYT1bXTtjPWZhKGMpO2Zvcih4PWMubmV4dCgpOyF4LmRvbmU7eD1jLm5leHQoKSl4PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHguaWQ9ZS5pZCsiX2NvbnRlbnRfIitoYS5sZW5ndGgseC5zdHlsZS5kaXNwbGF5PSJub25lIixHLmFwcGVuZENoaWxkKHgpLGhhLnB1c2goeCk7ZS5hcHBlbmRDaGlsZChHKTtoPT0iYm90dG9tIiYmKHEmJgplLmFwcGVuZENoaWxkKHEpLGUuYXBwZW5kQ2hpbGQoZikpO3ZhciBRPW5ldyBYKGgpO1NiKFEsZik7dmFyIFI9LTE7d2IoUSwic2VsZWN0IixmdW5jdGlvbihTKXtTPWsuaW5kZXhPZihTLnRhcmdldC5pKCkpO1MhPVImJihSPj0wJiZSPGhhLmxlbmd0aCYmKGhhW1JdLnN0eWxlLmRpc3BsYXk9Im5vbmUiLFI9LTEpLFM+PTAmJlM8aGEubGVuZ3RoJiYoUj1TLGhhW1JdLnN0eWxlLmRpc3BsYXk9ImlubGluZSIsd2luZG93LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCJyZXNpemUiKSksZ29vZ2xlLmNvbGFiLm91dHB1dC5yZXNpemVJZnJhbWVUb0NvbnRlbnQoKSksUS5KKEkoUSxSKSkpfSk7US5KKEkoUSxkKSk7d2luZG93W2JdPXtzZXRTZWxlY3RlZFRhYkluZGV4OmZ1bmN0aW9uKFMpe1EuSihJKFEsUykpfX07ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChqZChhKSl9LGxkPVsiY29sYWJfbGliIiwiY3JlYXRlVGFiQmFyIl0sWT1sOwpsZFswXWluIFl8fHR5cGVvZiBZLmV4ZWNTY3JpcHQ9PSJ1bmRlZmluZWQifHxZLmV4ZWNTY3JpcHQoInZhciAiK2xkWzBdKTtmb3IodmFyIFo7bGQubGVuZ3RoJiYoWj1sZC5zaGlmdCgpKTspbGQubGVuZ3RofHxrZD09PXZvaWQgMD9ZW1pdJiZZW1pdIT09T2JqZWN0LnByb3RvdHlwZVtaXT9ZPVlbWl06WT1ZW1pdPXt9OllbWl09a2Q7fSkuY2FsbCh0aGlzKTsKLy8gY2xhbmctZm9ybWF0IG9uCg==", + "ok": true, + "headers": [ + [ + "content-length", + "41785" + ], + [ + "content-type", + "application/javascript" + ] + ], + "status": 200, + "status_text": "" + } + }, + "base_uri": "https://localhost:8080/", + "height": 197 + }, + "outputId": "e5e03ce3-515a-4102-9b84-1191cf19af6a" + }, + "source": [ + "%%logica Test1, Test2\n", + "\n", + "Test1(x:, y:) :-\n", + " y == x * x + 2 * x + 5,\n", + " x == 10;\n", + "\n", + "Test2(x, 10 * x) :- x == 5;" + ], + "execution_count": 10, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e834f264-d22c-11ef-a7c0-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id11\", \"tabNames\": [\"Test1\", \"Test2\", \"(Log)\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_ca0e25329c" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e83588b4-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id11\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_3739aa6645" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e837d470-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_f7c9184b46" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e838d50a-d22c-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id11_content_2\");\n", + "//# sourceURL=js_16d7f95f1f" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e83923de-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"e838d50a-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_20e8333fd9" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e839997c-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id11\"].setSelectedTabIndex(2);\n", + "//# sourceURL=js_d206d933c2" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e83bf6b8-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"e837d470-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_0d78ec10f9" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e83e62fe-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_c32ceb410c" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e83eaed0-d22c-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id11_content_0\");\n", + "//# sourceURL=js_3c673ddcf5" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e83ef9e4-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"e83eaed0-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_917c2358ab" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e83f7ae0-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id11\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_32068a3d4e" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e8420166-d22c-11ef-a7c0-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id12\", \"tabNames\": [\"SQL\", \"Result\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_4eb08716de" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e842a332-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id12\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_bcd6b24357" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e843fdd6-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_ba0a2f2138" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e844a1d2-d22c-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id12_content_0\");\n", + "//# sourceURL=js_b24f29f7c6" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e844f060-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"e844a1d2-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_caaa85b7c9" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e84540b0-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id12\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_dd56ffbed6" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The following query is stored at \u001b[1mTest1_sql\u001b[0m variable.\n", + "-- Initializing DuckDB environment.\n", + "create schema if not exists logica_home;\n", + "-- Empty record, has to have a field by DuckDB syntax.\n", + "drop type if exists logicarecord893574736 cascade; create type logicarecord893574736 as struct(nirvana numeric);\n", + "create sequence if not exists eternal_logical_sequence;\n", + "\n", + "\n", + "-- Logica type: logicarecord481217614\n", + "drop type if exists logicarecord481217614 cascade; create type logicarecord481217614 as struct(r logicarecord893574736);\n", + "\n", + "-- Logica type: logicarecord383307722\n", + "drop type if exists logicarecord383307722 cascade; create type logicarecord383307722 as struct(a timestamp);\n", + "SELECT\n", + " 10 AS x,\n", + " ((((((10) * (10))) + (((2) * (10))))) + (5)) AS y;\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e84652d4-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"e843fdd6-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_9f92d5d3e5" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e8482e1a-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_38b13a6a54" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e8487834-d22c-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id12_content_1\");\n", + "//# sourceURL=js_1db7bb8e22" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e849133e-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"e8487834-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_13b22a8696" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e8496488-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id12\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_6c64677236" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The following table is stored at \u001b[1mTest1\u001b[0m variable.\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
xy
010125
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e84abe64-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"e8482e1a-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_17db54600f" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e84c1d5e-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"e83e62fe-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_31a5de5f0e" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e84db45c-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_204cdc0e3e" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e84e0006-d22c-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id11_content_2\");\n", + "//# sourceURL=js_e8d21b9b5c" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e84ed6b6-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"e84e0006-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_8d3e68db39" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e84f2526-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id11\"].setSelectedTabIndex(2);\n", + "//# sourceURL=js_ab66f3d32b" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e85b4a5e-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"e84db45c-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_a4c32c8211" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e85d29dc-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_16c82973d5" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e85d7824-d22c-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id11_content_1\");\n", + "//# sourceURL=js_78e32ff385" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e85dc608-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"e85d7824-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_d70b4ea2e8" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e85eacda-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id11\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_5bc0057f1c" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e8616628-d22c-11ef-a7c0-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id13\", \"tabNames\": [\"SQL\", \"Result\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_ef99ae4bd9" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e86234ae-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id13\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_e31cfb0f27" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e8656444-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_b37be18585" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e8662a5a-d22c-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id13_content_0\");\n", + "//# sourceURL=js_754ad91018" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e8668c7a-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"e8662a5a-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_058ebe6482" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e8671fa0-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id13\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_4c7e902738" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The following query is stored at \u001b[1mTest2_sql\u001b[0m variable.\n", + "-- Initializing DuckDB environment.\n", + "create schema if not exists logica_home;\n", + "-- Empty record, has to have a field by DuckDB syntax.\n", + "drop type if exists logicarecord893574736 cascade; create type logicarecord893574736 as struct(nirvana numeric);\n", + "create sequence if not exists eternal_logical_sequence;\n", + "\n", + "\n", + "-- Logica type: logicarecord481217614\n", + "drop type if exists logicarecord481217614 cascade; create type logicarecord481217614 as struct(r logicarecord893574736);\n", + "\n", + "-- Logica type: logicarecord383307722\n", + "drop type if exists logicarecord383307722 cascade; create type logicarecord383307722 as struct(a timestamp);\n", + "SELECT\n", + " 5 AS col0,\n", + " ((10) * (5)) AS col1;\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e868884a-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"e8656444-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_27c4110085" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e86aab5c-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_28d3e25fe7" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e86afb66-d22c-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id13_content_1\");\n", + "//# sourceURL=js_ba6161af47" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e86b4efe-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"e86afb66-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_cfdd56fbde" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e86edfba-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id13\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_dec8b2fdd7" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The following table is stored at \u001b[1mTest2\u001b[0m variable.\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
col0col1
0550
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e870933c-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"e86aab5c-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_825ec3e563" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e8751ed4-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"e85d29dc-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_1fff06dc66" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e87703e8-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_a9795868f8" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e8775b86-d22c-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id11_content_2\");\n", + "//# sourceURL=js_737a17348d" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e877b70c-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"e8775b86-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_058ce428b0" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e878069e-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id11\"].setSelectedTabIndex(2);\n", + "//# sourceURL=js_e5457c7918" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "image/svg+xml": "\n\n\n\n\n\nConcertina\n\n\n\nTest2\n\nTest2\n\n\n\nTest1\n\nTest1\n\n\n\n", + "text/plain": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Running predicate: Test2 (3 ms)\n", + "Running predicate: Test1 (2 ms)\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e8926cf0-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"e87703e8-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_00251c8be7" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e8945dda-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_d7dd13ca8b" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e894b064-d22c-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id11_content_0\");\n", + "//# sourceURL=js_56712ea9f5" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e894f6d2-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"e894b064-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_2d28a095ca" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e8953dc2-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id11\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_92695f6ff8" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e8968a60-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_814c6d5506" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e896e67c-d22c-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id12_content_1\");\n", + "//# sourceURL=js_831f260e0d" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e8972cc2-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"e896e67c-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_683e71dce4" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e897768c-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id12\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_d370af9022" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e8993cc4-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"e8968a60-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_7f9311131c" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + " \n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e89ab5d6-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"e8945dda-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_0e382d63df" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e89cee64-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_788499058b" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e89d37ac-d22c-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id11_content_1\");\n", + "//# sourceURL=js_29fc258bce" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e89dc4d8-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"e89d37ac-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_62af0b107a" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e89e1258-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id11\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_c64dc41500" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e89f6c52-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_5582b42a1c" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e89fb63a-d22c-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id13_content_1\");\n", + "//# sourceURL=js_95f1f9b3e8" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e8a000c2-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"e89fb63a-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_d2bd7bf95b" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e8a0433e-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id13\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_cc6b6326bb" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e8a261f0-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"e89f6c52-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_2d2d7a92cf" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + " \n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e8ad8760-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"e89cee64-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_e92c1e56de" + ] + }, + "metadata": {} + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "s1YNyj78Zvhg" + }, + "source": [ + "### Basic data extraction and filtering\n", + "\n", + "You can easily extract certain columns, or filter rows." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "DznTm114TvD7", + "colab": { + "resources": { + "http://localhost:8080/nbextensions/google.colab/tabbar.css": { + "data": "Lmdvb2ctdGFie3Bvc2l0aW9uOnJlbGF0aXZlO3BhZGRpbmc6NHB4IDhweDtjb2xvcjojMDBjO3RleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7Y3Vyc29yOmRlZmF1bHR9Lmdvb2ctdGFiLWJhci10b3AgLmdvb2ctdGFie21hcmdpbjoxcHggNHB4IDAgMDtib3JkZXItYm90dG9tOjA7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLXRvcDphZnRlciwuZ29vZy10YWItYmFyLWJvdHRvbTphZnRlcntjb250ZW50OiIgIjtkaXNwbGF5OmJsb2NrO2hlaWdodDowO2NsZWFyOmJvdGg7dmlzaWJpbGl0eTpoaWRkZW59Lmdvb2ctdGFiLWJhci1ib3R0b20gLmdvb2ctdGFie21hcmdpbjowIDRweCAxcHggMDtib3JkZXItdG9wOjA7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLXN0YXJ0IC5nb29nLXRhYnttYXJnaW46MCAwIDRweCAxcHg7Ym9yZGVyLXJpZ2h0OjB9Lmdvb2ctdGFiLWJhci1lbmQgLmdvb2ctdGFie21hcmdpbjowIDFweCA0cHggMDtib3JkZXItbGVmdDowfS5nb29nLXRhYi1ob3ZlcntiYWNrZ3JvdW5kOiNlZWV9Lmdvb2ctdGFiLWRpc2FibGVke2NvbG9yOiM2NjZ9Lmdvb2ctdGFiLXNlbGVjdGVke2NvbG9yOiMwMDA7YmFja2dyb3VuZDojZmZmO3RleHQtZGVjb3JhdGlvbjpub25lO2ZvbnQtd2VpZ2h0OmJvbGQ7Ym9yZGVyOjFweCBzb2xpZCAjNmI5MGRhfS5nb29nLXRhYi1iYXItdG9we3BhZGRpbmctdG9wOjVweCFpbXBvcnRhbnQ7cGFkZGluZy1sZWZ0OjVweCFpbXBvcnRhbnQ7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgIzZiOTBkYSFpbXBvcnRhbnR9Lmdvb2ctdGFiLWJhci10b3AgLmdvb2ctdGFiLXNlbGVjdGVke3RvcDoxcHg7bWFyZ2luLXRvcDowO3BhZGRpbmctYm90dG9tOjVweH0uZ29vZy10YWItYmFyLWJvdHRvbSAuZ29vZy10YWItc2VsZWN0ZWR7dG9wOi0xcHg7bWFyZ2luLWJvdHRvbTowO3BhZGRpbmctdG9wOjVweH0uZ29vZy10YWItYmFyLXN0YXJ0IC5nb29nLXRhYi1zZWxlY3RlZHtsZWZ0OjFweDttYXJnaW4tbGVmdDowO3BhZGRpbmctcmlnaHQ6OXB4fS5nb29nLXRhYi1iYXItZW5kIC5nb29nLXRhYi1zZWxlY3RlZHtsZWZ0Oi0xcHg7bWFyZ2luLXJpZ2h0OjA7cGFkZGluZy1sZWZ0OjlweH0uZ29vZy10YWItYmFye21hcmdpbjowO2JvcmRlcjowO3BhZGRpbmc6MDtsaXN0LXN0eWxlOm5vbmU7Y3Vyc29yOmRlZmF1bHQ7b3V0bGluZTpub25lO2JhY2tncm91bmQ6I2ViZWZmOX0uZ29vZy10YWItYmFyLWNsZWFye2NsZWFyOmJvdGg7aGVpZ2h0OjA7b3ZlcmZsb3c6aGlkZGVufS5nb29nLXRhYi1iYXItc3RhcnR7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLWVuZHtmbG9hdDpyaWdodH0qIGh0bWwgLmdvb2ctdGFiLWJhci1zdGFydHttYXJnaW4tcmlnaHQ6LTNweH0qIGh0bWwgLmdvb2ctdGFiLWJhci1lbmR7bWFyZ2luLWxlZnQ6LTNweH1zZW50aW5lbHt9", + "ok": true, + "headers": [ + [ + "content-length", + "1404" + ], + [ + "content-type", + "text/css" + ] + ], + "status": 200, + "status_text": "" + }, + "http://localhost:8080/nbextensions/google.colab/tabbar_main.min.js": { + "data": "Ly8gY2xhbmctZm9ybWF0IG9mZgooZnVuY3Rpb24oKXt2YXIgZyxhYT1mdW5jdGlvbihhKXt2YXIgYj0wO3JldHVybiBmdW5jdGlvbigpe3JldHVybiBiPGEubGVuZ3RoP3tkb25lOiExLHZhbHVlOmFbYisrXX06e2RvbmU6ITB9fX0sYmE9dHlwZW9mIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzPT0iZnVuY3Rpb24iP09iamVjdC5kZWZpbmVQcm9wZXJ0eTpmdW5jdGlvbihhLGIsYyl7aWYoYT09QXJyYXkucHJvdG90eXBlfHxhPT1PYmplY3QucHJvdG90eXBlKXJldHVybiBhO2FbYl09Yy52YWx1ZTtyZXR1cm4gYX0sY2E9ZnVuY3Rpb24oYSl7YT1bIm9iamVjdCI9PXR5cGVvZiBnbG9iYWxUaGlzJiZnbG9iYWxUaGlzLGEsIm9iamVjdCI9PXR5cGVvZiB3aW5kb3cmJndpbmRvdywib2JqZWN0Ij09dHlwZW9mIHNlbGYmJnNlbGYsIm9iamVjdCI9PXR5cGVvZiBnbG9iYWwmJmdsb2JhbF07Zm9yKHZhciBiPTA7YjxhLmxlbmd0aDsrK2Ipe3ZhciBjPWFbYl07aWYoYyYmYy5NYXRoPT1NYXRoKXJldHVybiBjfXRocm93IEVycm9yKCJDYW5ub3QgZmluZCBnbG9iYWwgb2JqZWN0Iik7Cn0sZGE9Y2EodGhpcyksZWE9ZnVuY3Rpb24oYSxiKXtpZihiKWE6e3ZhciBjPWRhO2E9YS5zcGxpdCgiLiIpO2Zvcih2YXIgZD0wO2Q8YS5sZW5ndGgtMTtkKyspe3ZhciBlPWFbZF07aWYoIShlIGluIGMpKWJyZWFrIGE7Yz1jW2VdfWE9YVthLmxlbmd0aC0xXTtkPWNbYV07Yj1iKGQpO2IhPWQmJmIhPW51bGwmJmJhKGMsYSx7Y29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOmJ9KX19OwplYSgiU3ltYm9sIixmdW5jdGlvbihhKXtpZihhKXJldHVybiBhO3ZhciBiPWZ1bmN0aW9uKGYsaCl7dGhpcy5nPWY7YmEodGhpcywiZGVzY3JpcHRpb24iLHtjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6aH0pfTtiLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmd9O3ZhciBjPSJqc2NvbXBfc3ltYm9sXyIrKE1hdGgucmFuZG9tKCkqMUU5Pj4+MCkrIl8iLGQ9MCxlPWZ1bmN0aW9uKGYpe2lmKHRoaXMgaW5zdGFuY2VvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoIlN5bWJvbCBpcyBub3QgYSBjb25zdHJ1Y3RvciIpO3JldHVybiBuZXcgYihjKyhmfHwiIikrIl8iK2QrKyxmKX07cmV0dXJuIGV9KTsKdmFyIGZhPWZ1bmN0aW9uKGEpe3ZhciBiPXR5cGVvZiBTeW1ib2whPSJ1bmRlZmluZWQiJiZTeW1ib2wuaXRlcmF0b3ImJmFbU3ltYm9sLml0ZXJhdG9yXTtpZihiKXJldHVybiBiLmNhbGwoYSk7aWYodHlwZW9mIGEubGVuZ3RoPT0ibnVtYmVyIilyZXR1cm57bmV4dDphYShhKX07dGhyb3cgRXJyb3IoU3RyaW5nKGEpKyIgaXMgbm90IGFuIGl0ZXJhYmxlIG9yIEFycmF5TGlrZSIpO307ZWEoIlN5bWJvbC5kaXNwb3NlIixmdW5jdGlvbihhKXtyZXR1cm4gYT9hOlN5bWJvbCgiU3ltYm9sLmRpc3Bvc2UiKX0pOy8qCgogQ29weXJpZ2h0IFRoZSBDbG9zdXJlIExpYnJhcnkgQXV0aG9ycy4KIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wCiovCnZhciBsPXRoaXN8fHNlbGYsaWE9ZnVuY3Rpb24oYSl7YS5JYT12b2lkIDA7YS5WPWZ1bmN0aW9uKCl7cmV0dXJuIGEuSWE/YS5JYTphLklhPW5ldyBhfX0samE9ZnVuY3Rpb24oYSl7dmFyIGI9dHlwZW9mIGE7cmV0dXJuIGIhPSJvYmplY3QiP2I6YT9BcnJheS5pc0FycmF5KGEpPyJhcnJheSI6YjoibnVsbCJ9LGthPWZ1bmN0aW9uKGEpe3ZhciBiPWphKGEpO3JldHVybiBiPT0iYXJyYXkifHxiPT0ib2JqZWN0IiYmdHlwZW9mIGEubGVuZ3RoPT0ibnVtYmVyIn0sbT1mdW5jdGlvbihhKXt2YXIgYj10eXBlb2YgYTtyZXR1cm4gYj09Im9iamVjdCImJmEhPW51bGx8fGI9PSJmdW5jdGlvbiJ9LG5hPWZ1bmN0aW9uKGEpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYSxsYSkmJmFbbGFdfHwoYVtsYV09KyttYSl9LGxhPSJjbG9zdXJlX3VpZF8iKyhNYXRoLnJhbmRvbSgpKjFFOT4+PjApLG1hPTAsbj1mdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoKXt9Yy5wcm90b3R5cGU9CmIucHJvdG90eXBlO2EubD1iLnByb3RvdHlwZTthLnByb3RvdHlwZT1uZXcgYzthLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1hO2EucWQ9ZnVuY3Rpb24oZCxlLGYpe2Zvcih2YXIgaD1BcnJheShhcmd1bWVudHMubGVuZ3RoLTIpLGs9MjtrPGFyZ3VtZW50cy5sZW5ndGg7aysrKWhbay0yXT1hcmd1bWVudHNba107cmV0dXJuIGIucHJvdG90eXBlW2VdLmFwcGx5KGQsaCl9fTtmdW5jdGlvbiBvYShhLGIpe2lmKEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKUVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsb2EpO2Vsc2V7dmFyIGM9RXJyb3IoKS5zdGFjaztjJiYodGhpcy5zdGFjaz1jKX1hJiYodGhpcy5tZXNzYWdlPVN0cmluZyhhKSk7YiE9PXZvaWQgMCYmKHRoaXMuY2F1c2U9Yil9bihvYSxFcnJvcik7b2EucHJvdG90eXBlLm5hbWU9IkN1c3RvbUVycm9yIjt2YXIgcGE7ZnVuY3Rpb24gcWEoYSxiKXthPWEuc3BsaXQoIiVzIik7Zm9yKHZhciBjPSIiLGQ9YS5sZW5ndGgtMSxlPTA7ZTxkO2UrKyljKz1hW2VdKyhlPGIubGVuZ3RoP2JbZV06IiVzIik7b2EuY2FsbCh0aGlzLGMrYVtkXSl9bihxYSxvYSk7cWEucHJvdG90eXBlLm5hbWU9IkFzc2VydGlvbkVycm9yIjtmdW5jdGlvbiByYShhLGIsYyxkKXt2YXIgZT0iQXNzZXJ0aW9uIGZhaWxlZCI7aWYoYyl7ZSs9IjogIitjO3ZhciBmPWR9ZWxzZSBhJiYoZSs9IjogIithLGY9Yik7dGhyb3cgbmV3IHFhKCIiK2UsZnx8W10pO30KdmFyIHA9ZnVuY3Rpb24oYSxiLGMpe2F8fHJhKCIiLG51bGwsYixBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMikpO3JldHVybiBhfSxzYT1mdW5jdGlvbihhLGIsYyl7bShhKSYmYS5ub2RlVHlwZT09MXx8cmEoIkV4cGVjdGVkIEVsZW1lbnQgYnV0IGdvdCAlczogJXMuIixbamEoYSksYV0sYixBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMikpfSx1YT1mdW5jdGlvbihhLGIsYyxkKXthIGluc3RhbmNlb2YgYnx8cmEoIkV4cGVjdGVkIGluc3RhbmNlb2YgJXMgYnV0IGdvdCAlcy4iLFt0YShiKSx0YShhKV0sYyxBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMykpfTsKZnVuY3Rpb24gdGEoYSl7cmV0dXJuIGEgaW5zdGFuY2VvZiBGdW5jdGlvbj9hLmRpc3BsYXlOYW1lfHxhLm5hbWV8fCJ1bmtub3duIHR5cGUgbmFtZSI6YSBpbnN0YW5jZW9mIE9iamVjdD9hLmNvbnN0cnVjdG9yLmRpc3BsYXlOYW1lfHxhLmNvbnN0cnVjdG9yLm5hbWV8fE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhKTphPT09bnVsbD8ibnVsbCI6dHlwZW9mIGF9O3ZhciB2YT1BcnJheS5wcm90b3R5cGUuaW5kZXhPZj9mdW5jdGlvbihhLGIpe3AoYS5sZW5ndGghPW51bGwpO3JldHVybiBBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKGEsYix2b2lkIDApfTpmdW5jdGlvbihhLGIpe2lmKHR5cGVvZiBhPT09InN0cmluZyIpcmV0dXJuIHR5cGVvZiBiIT09InN0cmluZyJ8fGIubGVuZ3RoIT0xPy0xOmEuaW5kZXhPZihiLDApO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWlmKGMgaW4gYSYmYVtjXT09PWIpcmV0dXJuIGM7cmV0dXJuLTF9LHdhPUFycmF5LnByb3RvdHlwZS5mb3JFYWNoP2Z1bmN0aW9uKGEsYil7cChhLmxlbmd0aCE9bnVsbCk7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChhLGIsdm9pZCAwKX06ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9YS5sZW5ndGgsZD10eXBlb2YgYT09PSJzdHJpbmciP2Euc3BsaXQoIiIpOmEsZT0wO2U8YztlKyspZSBpbiBkJiZiLmNhbGwodm9pZCAwLGRbZV0sZSxhKX07CmZ1bmN0aW9uIHhhKGEsYil7Yj12YShhLGIpO3ZhciBjO2lmKGM9Yj49MClwKGEubGVuZ3RoIT1udWxsKSxBcnJheS5wcm90b3R5cGUuc3BsaWNlLmNhbGwoYSxiLDEpO3JldHVybiBjfWZ1bmN0aW9uIHlhKGEpe3ZhciBiPWEubGVuZ3RoO2lmKGI+MCl7Zm9yKHZhciBjPUFycmF5KGIpLGQ9MDtkPGI7ZCsrKWNbZF09YVtkXTtyZXR1cm4gY31yZXR1cm5bXX1mdW5jdGlvbiB6YShhLGIsYyxkKXtwKGEubGVuZ3RoIT1udWxsKTtBcnJheS5wcm90b3R5cGUuc3BsaWNlLmFwcGx5KGEsQWEoYXJndW1lbnRzLDEpKX1mdW5jdGlvbiBBYShhLGIsYyl7cChhLmxlbmd0aCE9bnVsbCk7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg8PTI/QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYSxiKTpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhLGIsYyl9O2Z1bmN0aW9uIEJhKGEsYixjKXtmb3IodmFyIGQgaW4gYSliLmNhbGwoYyxhW2RdLGQsYSl9ZnVuY3Rpb24gQ2EoYSxiKXtmb3IodmFyIGMgaW4gYSlpZihhW2NdPT1iKXJldHVybiEwO3JldHVybiExfWZ1bmN0aW9uIERhKGEsYixjKXtpZihhIT09bnVsbCYmYiBpbiBhKXRocm93IEVycm9yKCdUaGUgb2JqZWN0IGFscmVhZHkgY29udGFpbnMgdGhlIGtleSAiJytiKyciJyk7YVtiXT1jfWZ1bmN0aW9uIEVhKGEpe3ZhciBiPXt9LGM7Zm9yKGMgaW4gYSliW2FbY11dPWM7cmV0dXJuIGJ9dmFyIEZhPSJjb25zdHJ1Y3RvciBoYXNPd25Qcm9wZXJ0eSBpc1Byb3RvdHlwZU9mIHByb3BlcnR5SXNFbnVtZXJhYmxlIHRvTG9jYWxlU3RyaW5nIHRvU3RyaW5nIHZhbHVlT2YiLnNwbGl0KCIgIik7CmZ1bmN0aW9uIEdhKGEsYil7Zm9yKHZhciBjLGQsZT0xO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspe2Q9YXJndW1lbnRzW2VdO2ZvcihjIGluIGQpYVtjXT1kW2NdO2Zvcih2YXIgZj0wO2Y8RmEubGVuZ3RoO2YrKyljPUZhW2ZdLE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChkLGMpJiYoYVtjXT1kW2NdKX19O3ZhciBIYT1TdHJpbmcucHJvdG90eXBlLnRyaW0/ZnVuY3Rpb24oYSl7cmV0dXJuIGEudHJpbSgpfTpmdW5jdGlvbihhKXtyZXR1cm4vXltcc1x4YTBdKihbXHNcU10qPylbXHNceGEwXSokLy5leGVjKGEpWzFdfTsvKgoKIENvcHlyaWdodCBHb29nbGUgTExDCiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMAoqLwp2YXIgSWE9e307dmFyIEphPWZ1bmN0aW9uKGEpe2lmKElhIT09SWEpdGhyb3cgRXJyb3IoIkJhZCBzZWNyZXQiKTt0aGlzLmc9YX07SmEucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ307bmV3IEphKCJhYm91dDpibGFuayIpO25ldyBKYSgiYWJvdXQ6aW52YWxpZCN6Q2xvc3VyZXoiKTt2YXIgS2E9W10sTGE9ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJBIFVSTCB3aXRoIGNvbnRlbnQgJyIrYSsiJyB3YXMgc2FuaXRpemVkIGF3YXkuIil9O0thLmluZGV4T2YoTGEpPT09LTEmJkthLnB1c2goTGEpO3ZhciBNYSxOYTthOntmb3IodmFyIE9hPVsiQ0xPU1VSRV9GTEFHUyJdLFBhPWwsUWE9MDtRYTxPYS5sZW5ndGg7UWErKylpZihQYT1QYVtPYVtRYV1dLFBhPT1udWxsKXtOYT1udWxsO2JyZWFrIGF9TmE9UGF9dmFyIFJhPU5hJiZOYVs2MTA0MDEzMDFdO01hPVJhIT1udWxsP1JhOiExO2Z1bmN0aW9uIFNhKCl7dmFyIGE9bC5uYXZpZ2F0b3I7cmV0dXJuIGEmJihhPWEudXNlckFnZW50KT9hOiIifXZhciBUYSxVYT1sLm5hdmlnYXRvcjtUYT1VYT9VYS51c2VyQWdlbnREYXRhfHxudWxsOm51bGw7ZnVuY3Rpb24gcihhKXtyZXR1cm4gU2EoKS5pbmRleE9mKGEpIT0tMX07dmFyIFZhPXIoIkVkZ2UiKSx0PXIoIkdlY2tvIikmJiEoU2EoKS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoIndlYmtpdCIpIT0tMSYmIXIoIkVkZ2UiKSkmJiEocigiVHJpZGVudCIpfHxyKCJNU0lFIikpJiYhcigiRWRnZSIpLHU9U2EoKS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoIndlYmtpdCIpIT0tMSYmIXIoIkVkZ2UiKSx2PU1hJiZUYSYmVGEucGxhdGZvcm0/VGEucGxhdGZvcm09PT0ibWFjT1MiOnIoIk1hY2ludG9zaCIpO3ZhciBYYT1mdW5jdGlvbihhLGIpe0JhKGIsZnVuY3Rpb24oYyxkKXtkPT0ic3R5bGUiP2Euc3R5bGUuY3NzVGV4dD1jOmQ9PSJjbGFzcyI/YS5jbGFzc05hbWU9YzpkPT0iZm9yIj9hLmh0bWxGb3I9YzpXYS5oYXNPd25Qcm9wZXJ0eShkKT9hLnNldEF0dHJpYnV0ZShXYVtkXSxjKTpkLmxhc3RJbmRleE9mKCJhcmlhLSIsMCk9PTB8fGQubGFzdEluZGV4T2YoImRhdGEtIiwwKT09MD9hLnNldEF0dHJpYnV0ZShkLGMpOmFbZF09Y30pfSxXYT17Y2VsbHBhZGRpbmc6ImNlbGxQYWRkaW5nIixjZWxsc3BhY2luZzoiY2VsbFNwYWNpbmciLGNvbHNwYW46ImNvbFNwYW4iLGZyYW1lYm9yZGVyOiJmcmFtZUJvcmRlciIsaGVpZ2h0OiJoZWlnaHQiLG1heGxlbmd0aDoibWF4TGVuZ3RoIixub25jZToibm9uY2UiLHJvbGU6InJvbGUiLHJvd3NwYW46InJvd1NwYW4iLHR5cGU6InR5cGUiLHVzZW1hcDoidXNlTWFwIix2YWxpZ246InZBbGlnbiIsd2lkdGg6IndpZHRoIn0sWWE9ZnVuY3Rpb24oYSwKYixjKXtmdW5jdGlvbiBkKGspe2smJmIuYXBwZW5kQ2hpbGQodHlwZW9mIGs9PT0ic3RyaW5nIj9hLmNyZWF0ZVRleHROb2RlKGspOmspfWZvcih2YXIgZT0yO2U8Yy5sZW5ndGg7ZSsrKXt2YXIgZj1jW2VdO2lmKCFrYShmKXx8bShmKSYmZi5ub2RlVHlwZT4wKWQoZik7ZWxzZXthOntpZihmJiZ0eXBlb2YgZi5sZW5ndGg9PSJudW1iZXIiKXtpZihtKGYpKXt2YXIgaD10eXBlb2YgZi5pdGVtPT0iZnVuY3Rpb24ifHx0eXBlb2YgZi5pdGVtPT0ic3RyaW5nIjticmVhayBhfWlmKHR5cGVvZiBmPT09ImZ1bmN0aW9uIil7aD10eXBlb2YgZi5pdGVtPT0iZnVuY3Rpb24iO2JyZWFrIGF9fWg9ITF9d2EoaD95YShmKTpmLGQpfX19LFphPWZ1bmN0aW9uKGEsYil7Yj1TdHJpbmcoYik7YS5jb250ZW50VHlwZT09PSJhcHBsaWNhdGlvbi94aHRtbCt4bWwiJiYoYj1iLnRvTG93ZXJDYXNlKCkpO3JldHVybiBhLmNyZWF0ZUVsZW1lbnQoYil9LCRhPWZ1bmN0aW9uKGEpe2EmJmEucGFyZW50Tm9kZSYmCmEucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhKX0sYWI9ZnVuY3Rpb24oYSxiKXtpZighYXx8IWIpcmV0dXJuITE7aWYoYS5jb250YWlucyYmYi5ub2RlVHlwZT09MSlyZXR1cm4gYT09Ynx8YS5jb250YWlucyhiKTtpZih0eXBlb2YgYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiE9InVuZGVmaW5lZCIpcmV0dXJuIGE9PWJ8fCEhKGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24oYikmMTYpO2Zvcig7YiYmYSE9YjspYj1iLnBhcmVudE5vZGU7cmV0dXJuIGI9PWF9LGJiPWZ1bmN0aW9uKGEpe3AoYSwiTm9kZSBjYW5ub3QgYmUgbnVsbCBvciB1bmRlZmluZWQuIik7cmV0dXJuIGEubm9kZVR5cGU9PTk/YTphLm93bmVyRG9jdW1lbnR8fGEuZG9jdW1lbnR9LGNiPWZ1bmN0aW9uKGEsYil7Yj9hLnRhYkluZGV4PTA6KGEudGFiSW5kZXg9LTEsYS5yZW1vdmVBdHRyaWJ1dGUoInRhYkluZGV4IikpfSxkYj1mdW5jdGlvbihhKXtyZXR1cm4gYS5oYXNBdHRyaWJ1dGUoInRhYmluZGV4Iil9LGViPQpmdW5jdGlvbihhKXthPWEudGFiSW5kZXg7cmV0dXJuIHR5cGVvZiBhPT09Im51bWJlciImJmE+PTAmJmE8MzI3Njh9LGZiPWZ1bmN0aW9uKGEpe3RoaXMuZz1hfHxsLmRvY3VtZW50fHxkb2N1bWVudH07ZmIucHJvdG90eXBlLmk9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nO3JldHVybiB0eXBlb2YgYT09PSJzdHJpbmciP2IuZ2V0RWxlbWVudEJ5SWQoYSk6YX07ZmIucHJvdG90eXBlLmg9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXMuZyxlPWFyZ3VtZW50cyxmPWVbMV0saD1aYShkLFN0cmluZyhlWzBdKSk7ZiYmKHR5cGVvZiBmPT09InN0cmluZyI/aC5jbGFzc05hbWU9ZjpBcnJheS5pc0FycmF5KGYpP2guY2xhc3NOYW1lPWYuam9pbigiICIpOlhhKGgsZikpO2UubGVuZ3RoPjImJllhKGQsaCxlKTtyZXR1cm4gaH07dmFyIHc9ZnVuY3Rpb24oKXt0aGlzLmJhPXRoaXMuYmE7dGhpcy5rYT10aGlzLmthfTt3LnByb3RvdHlwZS5iYT0hMTt3LnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7dGhpcy5iYXx8KHRoaXMuYmE9ITAsdGhpcy5DKCkpfTt3LnByb3RvdHlwZVtTeW1ib2wuZGlzcG9zZV09ZnVuY3Rpb24oKXt0aGlzLmRpc3Bvc2UoKX07dy5wcm90b3R5cGUuQz1mdW5jdGlvbigpe2lmKHRoaXMua2EpZm9yKDt0aGlzLmthLmxlbmd0aDspdGhpcy5rYS5zaGlmdCgpKCl9O3ZhciB5PWZ1bmN0aW9uKGEsYil7dGhpcy50eXBlPWE7dGhpcy51PXRoaXMudGFyZ2V0PWI7dGhpcy5kZWZhdWx0UHJldmVudGVkPXRoaXMuQT0hMX07eS5wcm90b3R5cGUudj1mdW5jdGlvbigpe3RoaXMuQT0hMH07eS5wcm90b3R5cGUuaj1mdW5jdGlvbigpe3RoaXMuZGVmYXVsdFByZXZlbnRlZD0hMH07dmFyIGdiPWZ1bmN0aW9uKCl7aWYoIWwuYWRkRXZlbnRMaXN0ZW5lcnx8IU9iamVjdC5kZWZpbmVQcm9wZXJ0eSlyZXR1cm4hMTt2YXIgYT0hMSxiPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwicGFzc2l2ZSIse2dldDpmdW5jdGlvbigpe2E9ITB9fSk7dHJ5e3ZhciBjPWZ1bmN0aW9uKCl7fTtsLmFkZEV2ZW50TGlzdGVuZXIoInRlc3QiLGMsYik7bC5yZW1vdmVFdmVudExpc3RlbmVyKCJ0ZXN0IixjLGIpfWNhdGNoKGQpe31yZXR1cm4gYX0oKTt2YXIgej1mdW5jdGlvbihhLGIpe3kuY2FsbCh0aGlzLGE/YS50eXBlOiIiKTt0aGlzLnJlbGF0ZWRUYXJnZXQ9dGhpcy51PXRoaXMudGFyZ2V0PW51bGw7dGhpcy5idXR0b249dGhpcy5zY3JlZW5ZPXRoaXMuc2NyZWVuWD10aGlzLmNsaWVudFk9dGhpcy5jbGllbnRYPTA7dGhpcy5rZXk9IiI7dGhpcy5nPTA7dGhpcy5tZXRhS2V5PXRoaXMuc2hpZnRLZXk9dGhpcy5hbHRLZXk9dGhpcy5jdHJsS2V5PSExO3RoaXMuc3RhdGU9bnVsbDt0aGlzLkc9ITE7dGhpcy5wb2ludGVySWQ9MDt0aGlzLnBvaW50ZXJUeXBlPSIiO3RoaXMudGltZVN0YW1wPTA7dGhpcy5oPW51bGw7aWYoYSl7dmFyIGM9dGhpcy50eXBlPWEudHlwZSxkPWEuY2hhbmdlZFRvdWNoZXMmJmEuY2hhbmdlZFRvdWNoZXMubGVuZ3RoP2EuY2hhbmdlZFRvdWNoZXNbMF06bnVsbDt0aGlzLnRhcmdldD1hLnRhcmdldHx8YS5zcmNFbGVtZW50O3RoaXMudT1iO2I9YS5yZWxhdGVkVGFyZ2V0O2J8fChjPT0ibW91c2VvdmVyIj8KYj1hLmZyb21FbGVtZW50OmM9PSJtb3VzZW91dCImJihiPWEudG9FbGVtZW50KSk7dGhpcy5yZWxhdGVkVGFyZ2V0PWI7ZD8odGhpcy5jbGllbnRYPWQuY2xpZW50WCE9PXZvaWQgMD9kLmNsaWVudFg6ZC5wYWdlWCx0aGlzLmNsaWVudFk9ZC5jbGllbnRZIT09dm9pZCAwP2QuY2xpZW50WTpkLnBhZ2VZLHRoaXMuc2NyZWVuWD1kLnNjcmVlblh8fDAsdGhpcy5zY3JlZW5ZPWQuc2NyZWVuWXx8MCk6KHRoaXMuY2xpZW50WD1hLmNsaWVudFghPT12b2lkIDA/YS5jbGllbnRYOmEucGFnZVgsdGhpcy5jbGllbnRZPWEuY2xpZW50WSE9PXZvaWQgMD9hLmNsaWVudFk6YS5wYWdlWSx0aGlzLnNjcmVlblg9YS5zY3JlZW5YfHwwLHRoaXMuc2NyZWVuWT1hLnNjcmVlbll8fDApO3RoaXMuYnV0dG9uPWEuYnV0dG9uO3RoaXMuZz1hLmtleUNvZGV8fDA7dGhpcy5rZXk9YS5rZXl8fCIiO3RoaXMuY3RybEtleT1hLmN0cmxLZXk7dGhpcy5hbHRLZXk9YS5hbHRLZXk7dGhpcy5zaGlmdEtleT1hLnNoaWZ0S2V5Owp0aGlzLm1ldGFLZXk9YS5tZXRhS2V5O3RoaXMuRz12P2EubWV0YUtleTphLmN0cmxLZXk7dGhpcy5wb2ludGVySWQ9YS5wb2ludGVySWR8fDA7dGhpcy5wb2ludGVyVHlwZT1hLnBvaW50ZXJUeXBlO3RoaXMuc3RhdGU9YS5zdGF0ZTt0aGlzLnRpbWVTdGFtcD1hLnRpbWVTdGFtcDt0aGlzLmg9YTthLmRlZmF1bHRQcmV2ZW50ZWQmJnoubC5qLmNhbGwodGhpcyl9fTtuKHoseSk7ei5wcm90b3R5cGUudj1mdW5jdGlvbigpe3oubC52LmNhbGwodGhpcyk7dGhpcy5oLnN0b3BQcm9wYWdhdGlvbj90aGlzLmguc3RvcFByb3BhZ2F0aW9uKCk6dGhpcy5oLmNhbmNlbEJ1YmJsZT0hMH07ei5wcm90b3R5cGUuaj1mdW5jdGlvbigpe3oubC5qLmNhbGwodGhpcyk7dmFyIGE9dGhpcy5oO2EucHJldmVudERlZmF1bHQ/YS5wcmV2ZW50RGVmYXVsdCgpOmEucmV0dXJuVmFsdWU9ITF9O3ZhciBoYj0iY2xvc3VyZV9saXN0ZW5hYmxlXyIrKE1hdGgucmFuZG9tKCkqMUU2fDApLGliPWZ1bmN0aW9uKGEpe3JldHVybiEoIWF8fCFhW2hiXSl9O3ZhciBqYj0wO3ZhciBrYj1mdW5jdGlvbihhLGIsYyxkLGUpe3RoaXMubGlzdGVuZXI9YTt0aGlzLnByb3h5PW51bGw7dGhpcy5zcmM9Yjt0aGlzLnR5cGU9Yzt0aGlzLmNhcHR1cmU9ISFkO3RoaXMucGE9ZTt0aGlzLmtleT0rK2piO3RoaXMuamE9dGhpcy5vYT0hMX0sbGI9ZnVuY3Rpb24oYSl7YS5qYT0hMDthLmxpc3RlbmVyPW51bGw7YS5wcm94eT1udWxsO2Euc3JjPW51bGw7YS5wYT1udWxsfTt2YXIgbWI9ZnVuY3Rpb24oYSl7dGhpcy5zcmM9YTt0aGlzLmc9e307dGhpcy5oPTB9O21iLnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZj1hLnRvU3RyaW5nKCk7YT10aGlzLmdbZl07YXx8KGE9dGhpcy5nW2ZdPVtdLHRoaXMuaCsrKTt2YXIgaD1uYihhLGIsZCxlKTtoPi0xPyhiPWFbaF0sY3x8KGIub2E9ITEpKTooYj1uZXcga2IoYix0aGlzLnNyYyxmLCEhZCxlKSxiLm9hPWMsYS5wdXNoKGIpKTtyZXR1cm4gYn07CnZhciBvYj1mdW5jdGlvbihhLGIpe3ZhciBjPWIudHlwZTtjIGluIGEuZyYmeGEoYS5nW2NdLGIpJiYobGIoYiksYS5nW2NdLmxlbmd0aD09MCYmKGRlbGV0ZSBhLmdbY10sYS5oLS0pKX0scGI9ZnVuY3Rpb24oYSxiLGMsZCxlKXthPWEuZ1tiLnRvU3RyaW5nKCldO2I9LTE7YSYmKGI9bmIoYSxjLGQsZSkpO3JldHVybiBiPi0xP2FbYl06bnVsbH0sbmI9ZnVuY3Rpb24oYSxiLGMsZCl7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDsrK2Upe3ZhciBmPWFbZV07aWYoIWYuamEmJmYubGlzdGVuZXI9PWImJmYuY2FwdHVyZT09ISFjJiZmLnBhPT1kKXJldHVybiBlfXJldHVybi0xfTt2YXIgcWI9ImNsb3N1cmVfbG1fIisoTWF0aC5yYW5kb20oKSoxRTZ8MCkscmI9e30sc2I9MCx1Yj1mdW5jdGlvbihhLGIsYyxkLGUpe2lmKGQmJmQub25jZSlyZXR1cm4gdGIoYSxiLGMsZCxlKTtpZihBcnJheS5pc0FycmF5KGIpKXtmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKyl1YihhLGJbZl0sYyxkLGUpO3JldHVybiBudWxsfWM9dmIoYyk7cmV0dXJuIGliKGEpP3diKGEsYixjLG0oZCk/ISFkLmNhcHR1cmU6ISFkLGUpOnhiKGEsYixjLCExLGQsZSl9LHhiPWZ1bmN0aW9uKGEsYixjLGQsZSxmKXtpZighYil0aHJvdyBFcnJvcigiSW52YWxpZCBldmVudCB0eXBlIik7dmFyIGg9bShlKT8hIWUuY2FwdHVyZTohIWUsaz15YihhKTtrfHwoYVtxYl09az1uZXcgbWIoYSkpO2M9ay5hZGQoYixjLGQsaCxmKTtpZihjLnByb3h5KXJldHVybiBjO2Q9emIoKTtjLnByb3h5PWQ7ZC5zcmM9YTtkLmxpc3RlbmVyPWM7aWYoYS5hZGRFdmVudExpc3RlbmVyKWdifHwoZT1oKSxlPT09dm9pZCAwJiYKKGU9ITEpLGEuYWRkRXZlbnRMaXN0ZW5lcihiLnRvU3RyaW5nKCksZCxlKTtlbHNlIGlmKGEuYXR0YWNoRXZlbnQpYS5hdHRhY2hFdmVudChBYihiLnRvU3RyaW5nKCkpLGQpO2Vsc2UgaWYoYS5hZGRMaXN0ZW5lciYmYS5yZW1vdmVMaXN0ZW5lcilwKGI9PT0iY2hhbmdlIiwiTWVkaWFRdWVyeUxpc3Qgb25seSBoYXMgYSBjaGFuZ2UgZXZlbnQiKSxhLmFkZExpc3RlbmVyKGQpO2Vsc2UgdGhyb3cgRXJyb3IoImFkZEV2ZW50TGlzdGVuZXIgYW5kIGF0dGFjaEV2ZW50IGFyZSB1bmF2YWlsYWJsZS4iKTtzYisrO3JldHVybiBjfSx6Yj1mdW5jdGlvbigpe3ZhciBhPUJiLGI9ZnVuY3Rpb24oYyl7cmV0dXJuIGEuY2FsbChiLnNyYyxiLmxpc3RlbmVyLGMpfTtyZXR1cm4gYn0sdGI9ZnVuY3Rpb24oYSxiLGMsZCxlKXtpZihBcnJheS5pc0FycmF5KGIpKXtmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKyl0YihhLGJbZl0sYyxkLGUpO3JldHVybiBudWxsfWM9dmIoYyk7cmV0dXJuIGliKGEpPwphLkEuYWRkKFN0cmluZyhiKSxjLCEwLG0oZCk/ISFkLmNhcHR1cmU6ISFkLGUpOnhiKGEsYixjLCEwLGQsZSl9LENiPWZ1bmN0aW9uKGEsYixjLGQsZSl7aWYoQXJyYXkuaXNBcnJheShiKSlmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKylDYihhLGJbZl0sYyxkLGUpO2Vsc2UgZD1tKGQpPyEhZC5jYXB0dXJlOiEhZCxjPXZiKGMpLGliKGEpPyhhPWEuQSxiPVN0cmluZyhiKS50b1N0cmluZygpLGIgaW4gYS5nJiYoZj1hLmdbYl0sYz1uYihmLGMsZCxlKSxjPi0xJiYobGIoZltjXSkscChmLmxlbmd0aCE9bnVsbCksQXJyYXkucHJvdG90eXBlLnNwbGljZS5jYWxsKGYsYywxKSxmLmxlbmd0aD09MCYmKGRlbGV0ZSBhLmdbYl0sYS5oLS0pKSkpOmEmJihhPXliKGEpKSYmKGM9cGIoYSxiLGMsZCxlKSkmJkEoYyl9LEE9ZnVuY3Rpb24oYSl7aWYodHlwZW9mIGEhPT0ibnVtYmVyIiYmYSYmIWEuamEpe3ZhciBiPWEuc3JjO2lmKGliKGIpKW9iKGIuQSxhKTtlbHNle3ZhciBjPWEudHlwZSwKZD1hLnByb3h5O2IucmVtb3ZlRXZlbnRMaXN0ZW5lcj9iLnJlbW92ZUV2ZW50TGlzdGVuZXIoYyxkLGEuY2FwdHVyZSk6Yi5kZXRhY2hFdmVudD9iLmRldGFjaEV2ZW50KEFiKGMpLGQpOmIuYWRkTGlzdGVuZXImJmIucmVtb3ZlTGlzdGVuZXImJmIucmVtb3ZlTGlzdGVuZXIoZCk7c2ItLTsoYz15YihiKSk/KG9iKGMsYSksYy5oPT0wJiYoYy5zcmM9bnVsbCxiW3FiXT1udWxsKSk6bGIoYSl9fX0sQWI9ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW4gcmI/cmJbYV06cmJbYV09Im9uIithfSxCYj1mdW5jdGlvbihhLGIpe2lmKGEuamEpYT0hMDtlbHNle2I9bmV3IHooYix0aGlzKTt2YXIgYz1hLmxpc3RlbmVyLGQ9YS5wYXx8YS5zcmM7YS5vYSYmQShhKTthPWMuY2FsbChkLGIpfXJldHVybiBhfSx5Yj1mdW5jdGlvbihhKXthPWFbcWJdO3JldHVybiBhIGluc3RhbmNlb2YgbWI/YTpudWxsfSxEYj0iX19jbG9zdXJlX2V2ZW50c19mbl8iKyhNYXRoLnJhbmRvbSgpKjFFOT4+PjApLHZiPWZ1bmN0aW9uKGEpe3AoYSwKIkxpc3RlbmVyIGNhbiBub3QgYmUgbnVsbC4iKTtpZih0eXBlb2YgYT09PSJmdW5jdGlvbiIpcmV0dXJuIGE7cChhLmhhbmRsZUV2ZW50LCJBbiBvYmplY3QgbGlzdGVuZXIgbXVzdCBoYXZlIGhhbmRsZUV2ZW50IG1ldGhvZC4iKTthW0RiXXx8KGFbRGJdPWZ1bmN0aW9uKGIpe3JldHVybiBhLmhhbmRsZUV2ZW50KGIpfSk7cmV0dXJuIGFbRGJdfTt2YXIgRWI9ZnVuY3Rpb24oYSl7dy5jYWxsKHRoaXMpO3RoaXMuaD1hO3RoaXMuZz17fX07bihFYix3KTsKdmFyIEZiPVtdLEI9ZnVuY3Rpb24oYSxiLGMsZCl7QXJyYXkuaXNBcnJheShjKXx8KGMmJihGYlswXT1jLnRvU3RyaW5nKCkpLGM9RmIpO2Zvcih2YXIgZT0wO2U8Yy5sZW5ndGg7ZSsrKXt2YXIgZj11YihiLGNbZV0sZHx8YS5oYW5kbGVFdmVudCwhMSxhLmh8fGEpO2lmKCFmKWJyZWFrO2EuZ1tmLmtleV09Zn1yZXR1cm4gYX0sQz1mdW5jdGlvbihhLGIsYyxkLGUsZil7aWYoQXJyYXkuaXNBcnJheShjKSlmb3IodmFyIGg9MDtoPGMubGVuZ3RoO2grKylDKGEsYixjW2hdLGQsZSxmKTtlbHNlIGQ9ZHx8YS5oYW5kbGVFdmVudCxlPW0oZSk/ISFlLmNhcHR1cmU6ISFlLGY9Znx8YS5ofHxhLGQ9dmIoZCksZT0hIWUsYz1pYihiKT9wYihiLkEsU3RyaW5nKGMpLGQsZSxmKTpiPyhiPXliKGIpKT9wYihiLGMsZCxlLGYpOm51bGw6bnVsbCxjJiYoQShjKSxkZWxldGUgYS5nW2Mua2V5XSk7cmV0dXJuIGF9LEdiPWZ1bmN0aW9uKGEpe0JhKGEuZyxmdW5jdGlvbihiLGMpe3RoaXMuZy5oYXNPd25Qcm9wZXJ0eShjKSYmCkEoYil9LGEpO2EuZz17fX07RWIucHJvdG90eXBlLkM9ZnVuY3Rpb24oKXtFYi5sLkMuY2FsbCh0aGlzKTtHYih0aGlzKX07RWIucHJvdG90eXBlLmhhbmRsZUV2ZW50PWZ1bmN0aW9uKCl7dGhyb3cgRXJyb3IoIkV2ZW50SGFuZGxlci5oYW5kbGVFdmVudCBub3QgaW1wbGVtZW50ZWQiKTt9O3ZhciBEPWZ1bmN0aW9uKCl7dy5jYWxsKHRoaXMpO3RoaXMuQT1uZXcgbWIodGhpcyk7dGhpcy5ZYT10aGlzO3RoaXMubGE9bnVsbH07bihELHcpO0QucHJvdG90eXBlW2hiXT0hMDtELnByb3RvdHlwZS5BYT1mdW5jdGlvbihhKXt0aGlzLmxhPWF9O0QucHJvdG90eXBlLnJlbW92ZUV2ZW50TGlzdGVuZXI9ZnVuY3Rpb24oYSxiLGMsZCl7Q2IodGhpcyxhLGIsYyxkKX07CnZhciBFPWZ1bmN0aW9uKGEsYil7SGIoYSk7dmFyIGM9YS5sYTtpZihjKXt2YXIgZD1bXTtmb3IodmFyIGU9MTtjO2M9Yy5sYSlkLnB1c2goYykscCgrK2U8MUUzLCJpbmZpbml0ZSBsb29wIil9YT1hLllhO2M9Yi50eXBlfHxiO3R5cGVvZiBiPT09InN0cmluZyI/Yj1uZXcgeShiLGEpOmIgaW5zdGFuY2VvZiB5P2IudGFyZ2V0PWIudGFyZ2V0fHxhOihlPWIsYj1uZXcgeShjLGEpLEdhKGIsZSkpO2U9ITA7dmFyIGY7aWYoZClmb3IoZj1kLmxlbmd0aC0xOyFiLkEmJmY+PTA7Zi0tKXt2YXIgaD1iLnU9ZFtmXTtlPUliKGgsYywhMCxiKSYmZX1iLkF8fChoPWIudT1hLGU9SWIoaCxjLCEwLGIpJiZlLGIuQXx8KGU9SWIoaCxjLCExLGIpJiZlKSk7aWYoZClmb3IoZj0wOyFiLkEmJmY8ZC5sZW5ndGg7ZisrKWg9Yi51PWRbZl0sZT1JYihoLGMsITEsYikmJmU7cmV0dXJuIGV9OwpELnByb3RvdHlwZS5DPWZ1bmN0aW9uKCl7RC5sLkMuY2FsbCh0aGlzKTtpZih0aGlzLkEpe3ZhciBhPXRoaXMuQSxiPTAsYztmb3IoYyBpbiBhLmcpe2Zvcih2YXIgZD1hLmdbY10sZT0wO2U8ZC5sZW5ndGg7ZSsrKSsrYixsYihkW2VdKTtkZWxldGUgYS5nW2NdO2EuaC0tfX10aGlzLmxhPW51bGx9O3ZhciB3Yj1mdW5jdGlvbihhLGIsYyxkLGUpe0hiKGEpO3JldHVybiBhLkEuYWRkKFN0cmluZyhiKSxjLCExLGQsZSl9LEliPWZ1bmN0aW9uKGEsYixjLGQpe2I9YS5BLmdbU3RyaW5nKGIpXTtpZighYilyZXR1cm4hMDtiPWIuY29uY2F0KCk7Zm9yKHZhciBlPSEwLGY9MDtmPGIubGVuZ3RoOysrZil7dmFyIGg9YltmXTtpZihoJiYhaC5qYSYmaC5jYXB0dXJlPT1jKXt2YXIgaz1oLmxpc3RlbmVyLHE9aC5wYXx8aC5zcmM7aC5vYSYmb2IoYS5BLGgpO2U9ay5jYWxsKHEsZCkhPT0hMSYmZX19cmV0dXJuIGUmJiFkLmRlZmF1bHRQcmV2ZW50ZWR9LEhiPWZ1bmN0aW9uKGEpe3AoYS5BLCJFdmVudCB0YXJnZXQgaXMgbm90IGluaXRpYWxpemVkLiBEaWQgeW91IGNhbGwgdGhlIHN1cGVyY2xhc3MgKGdvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0KSBjb25zdHJ1Y3Rvcj8iKX07dmFyIEpiPXQ/Ik1velVzZXJTZWxlY3QiOnV8fFZhPyJXZWJraXRVc2VyU2VsZWN0IjpudWxsLEtiPWZ1bmN0aW9uKGEsYil7Yj1iP251bGw6YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpO2lmKEpiJiYoYS5zdHlsZSYmKGEuc3R5bGVbSmJdPSJub25lIiksYikpZm9yKHZhciBjPTA7YT1iW2NdO2MrKylhLnN0eWxlJiYoYS5zdHlsZVtKYl09Im5vbmUiKX07dmFyIExiPWZ1bmN0aW9uKCl7fTtpYShMYik7TGIucHJvdG90eXBlLmc9MDt2YXIgRj1mdW5jdGlvbihhKXtELmNhbGwodGhpcyk7dGhpcy5HPWF8fHBhfHwocGE9bmV3IGZiKTt0aGlzLnphPU1iO3RoaXMuWT1udWxsO3RoaXMucz0hMTt0aGlzLmc9bnVsbDt0aGlzLk09dm9pZCAwO3RoaXMudT10aGlzLmo9dGhpcy5oPW51bGw7dGhpcy5TYT0hMX07bihGLEQpO0YucHJvdG90eXBlLlphPUxiLlYoKTsKdmFyIE1iPW51bGwsTmI9ZnVuY3Rpb24oYSxiKXtzd2l0Y2goYSl7Y2FzZSAxOnJldHVybiBiPyJkaXNhYmxlIjoiZW5hYmxlIjtjYXNlIDI6cmV0dXJuIGI/ImhpZ2hsaWdodCI6InVuaGlnaGxpZ2h0IjtjYXNlIDQ6cmV0dXJuIGI/ImFjdGl2YXRlIjoiZGVhY3RpdmF0ZSI7Y2FzZSA4OnJldHVybiBiPyJzZWxlY3QiOiJ1bnNlbGVjdCI7Y2FzZSAxNjpyZXR1cm4gYj8iY2hlY2siOiJ1bmNoZWNrIjtjYXNlIDMyOnJldHVybiBiPyJmb2N1cyI6ImJsdXIiO2Nhc2UgNjQ6cmV0dXJuIGI/Im9wZW4iOiJjbG9zZSJ9dGhyb3cgRXJyb3IoIkludmFsaWQgY29tcG9uZW50IHN0YXRlIik7fSxPYj1mdW5jdGlvbihhKXtyZXR1cm4gYS5ZfHwoYS5ZPSI6IisoYS5aYS5nKyspLnRvU3RyaW5nKDM2KSl9LFBiPWZ1bmN0aW9uKGEsYil7aWYoYS5oJiZhLmgudSl7dmFyIGM9YS5oLnUsZD1hLlk7ZCBpbiBjJiZkZWxldGUgY1tkXTtEYShhLmgudSxiLGEpfWEuWT1ifTtGLnByb3RvdHlwZS5pPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ307CnZhciBRYj1mdW5jdGlvbihhKXthLk18fChhLk09bmV3IEViKGEpKTtyZXR1cm4gcChhLk0pfTtGLnByb3RvdHlwZS5BYT1mdW5jdGlvbihhKXtpZih0aGlzLmgmJnRoaXMuaCE9YSl0aHJvdyBFcnJvcigiTWV0aG9kIG5vdCBzdXBwb3J0ZWQiKTtGLmwuQWEuY2FsbCh0aGlzLGEpfTtGLnByb3RvdHlwZS5tYT1mdW5jdGlvbigpe3RoaXMuZz1aYSh0aGlzLkcuZywiRElWIil9O0YucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbihhKXtSYih0aGlzLGEpfTsKdmFyIFJiPWZ1bmN0aW9uKGEsYixjKXtpZihhLnMpdGhyb3cgRXJyb3IoIkNvbXBvbmVudCBhbHJlYWR5IHJlbmRlcmVkIik7YS5nfHxhLm1hKCk7Yj9iLmluc2VydEJlZm9yZShhLmcsY3x8bnVsbCk6YS5HLmcuYm9keS5hcHBlbmRDaGlsZChhLmcpO2EuaCYmIWEuaC5zfHxhLkkoKX0sU2I9ZnVuY3Rpb24oYSxiKXtpZihhLnMpdGhyb3cgRXJyb3IoIkNvbXBvbmVudCBhbHJlYWR5IHJlbmRlcmVkIik7aWYoYiYmYS53YShiKSl7YS5TYT0hMDt2YXIgYz1iYihiKTthLkcmJmEuRy5nPT1jfHwoYS5HPWI/bmV3IGZiKGJiKGIpKTpwYXx8KHBhPW5ldyBmYikpO2EuRWEoYik7YS5JKCl9ZWxzZSB0aHJvdyBFcnJvcigiSW52YWxpZCBlbGVtZW50IHRvIGRlY29yYXRlIik7fTtnPUYucHJvdG90eXBlO2cud2E9ZnVuY3Rpb24oKXtyZXR1cm4hMH07Zy5FYT1mdW5jdGlvbihhKXt0aGlzLmc9YX07CmcuST1mdW5jdGlvbigpe3RoaXMucz0hMDtUYih0aGlzLGZ1bmN0aW9uKGEpeyFhLnMmJmEuaSgpJiZhLkkoKX0pfTtnLlU9ZnVuY3Rpb24oKXtUYih0aGlzLGZ1bmN0aW9uKGEpe2EucyYmYS5VKCl9KTt0aGlzLk0mJkdiKHRoaXMuTSk7dGhpcy5zPSExfTtnLkM9ZnVuY3Rpb24oKXt0aGlzLnMmJnRoaXMuVSgpO3RoaXMuTSYmKHRoaXMuTS5kaXNwb3NlKCksZGVsZXRlIHRoaXMuTSk7VGIodGhpcyxmdW5jdGlvbihhKXthLmRpc3Bvc2UoKX0pOyF0aGlzLlNhJiZ0aGlzLmcmJiRhKHRoaXMuZyk7dGhpcy5oPXRoaXMuZz10aGlzLnU9dGhpcy5qPW51bGw7Ri5sLkMuY2FsbCh0aGlzKX07Zy5CYT1mdW5jdGlvbihhLGIpe3RoaXMuQ2EoYSxIKHRoaXMpLGIpfTsKZy5DYT1mdW5jdGlvbihhLGIsYyl7cCghIWEsIlByb3ZpZGVkIGVsZW1lbnQgbXVzdCBub3QgYmUgbnVsbC4iKTtpZihhLnMmJihjfHwhdGhpcy5zKSl0aHJvdyBFcnJvcigiQ29tcG9uZW50IGFscmVhZHkgcmVuZGVyZWQiKTtpZihiPDB8fGI+SCh0aGlzKSl0aHJvdyBFcnJvcigiQ2hpbGQgY29tcG9uZW50IGluZGV4IG91dCBvZiBib3VuZHMiKTt0aGlzLnUmJnRoaXMuanx8KHRoaXMudT17fSx0aGlzLmo9W10pO2lmKGEuaD09dGhpcyl7dmFyIGQ9dGhpcy51LGU9T2IoYSk7ZFtlXT1hO3hhKHRoaXMuaixhKX1lbHNlIERhKHRoaXMudSxPYihhKSxhKTtpZihhPT10aGlzKXRocm93IEVycm9yKCJVbmFibGUgdG8gc2V0IHBhcmVudCBjb21wb25lbnQiKTtpZihkPXRoaXMmJmEuaCYmYS5ZKWU9YS5oLGQ9YS5ZLGUudSYmZD8oZT1lLnUsZD0oZSE9PW51bGwmJmQgaW4gZT9lW2RdOnZvaWQgMCl8fG51bGwpOmQ9bnVsbDtpZihkJiZhLmghPXRoaXMpdGhyb3cgRXJyb3IoIlVuYWJsZSB0byBzZXQgcGFyZW50IGNvbXBvbmVudCIpOwphLmg9dGhpcztGLmwuQWEuY2FsbChhLHRoaXMpO3phKHRoaXMuaixiLDAsYSk7YS5zJiZ0aGlzLnMmJmEuaD09dGhpcz8oYz10aGlzLm5hKCksKGMuY2hpbGROb2Rlc1tiXXx8bnVsbCkhPWEuaSgpJiYoYS5pKCkucGFyZW50RWxlbWVudD09YyYmYy5yZW1vdmVDaGlsZChhLmkoKSksYj1jLmNoaWxkTm9kZXNbYl18fG51bGwsYy5pbnNlcnRCZWZvcmUoYS5pKCksYikpKTpjPyh0aGlzLmd8fHRoaXMubWEoKSxiPUkodGhpcyxiKzEpLFJiKGEsdGhpcy5uYSgpLGI/Yi5nOm51bGwpKTp0aGlzLnMmJiFhLnMmJmEuZyYmYS5nLnBhcmVudE5vZGUmJmEuZy5wYXJlbnROb2RlLm5vZGVUeXBlPT0xJiZhLkkoKX07Zy5uYT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmd9Owp2YXIgVWI9ZnVuY3Rpb24oYSl7aWYoYS56YT09bnVsbCl7dmFyIGI9YS5zP2EuZzphLkcuZy5ib2R5O2E6e3ZhciBjPWJiKGIpO2lmKGMuZGVmYXVsdFZpZXcmJmMuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSYmKGM9Yy5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKGIsbnVsbCkpKXtjPWMuZGlyZWN0aW9ufHxjLmdldFByb3BlcnR5VmFsdWUoImRpcmVjdGlvbiIpfHwiIjticmVhayBhfWM9IiJ9YS56YT0icnRsIj09KGN8fChiLmN1cnJlbnRTdHlsZT9iLmN1cnJlbnRTdHlsZS5kaXJlY3Rpb246bnVsbCl8fGIuc3R5bGUmJmIuc3R5bGUuZGlyZWN0aW9uKX1yZXR1cm4gYS56YX0sSD1mdW5jdGlvbihhKXtyZXR1cm4gYS5qP2Euai5sZW5ndGg6MH0sST1mdW5jdGlvbihhLGIpe3JldHVybiBhLmo/YS5qW2JdfHxudWxsOm51bGx9LFRiPWZ1bmN0aW9uKGEsYixjKXthLmomJmEuai5mb3JFYWNoKGIsYyl9LFZiPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuaiYmYj9hLmouaW5kZXhPZihiKToKLTF9O3ZhciBXYj17bWI6ImFjdGl2ZWRlc2NlbmRhbnQiLHJiOiJhdG9taWMiLHNiOiJhdXRvY29tcGxldGUiLHViOiJidXN5Iix4YjoiY2hlY2tlZCIseWI6ImNvbGluZGV4IixEYjoiY29udHJvbHMiLEViOiJjdXJyZW50IixHYjoiZGVzY3JpYmVkYnkiLEpiOiJkaXNhYmxlZCIsTGI6ImRyb3BlZmZlY3QiLE1iOiJleHBhbmRlZCIsTmI6ImZsb3d0byIsUGI6ImdyYWJiZWQiLFRiOiJoYXNwb3B1cCIsVmI6ImhpZGRlbiIsWGI6ImludmFsaWQiLFliOiJsYWJlbCIsWmI6ImxhYmVsbGVkYnkiLGFjOiJsZXZlbCIsZmM6ImxpdmUiLHZjOiJtdWx0aWxpbmUiLHdjOiJtdWx0aXNlbGVjdGFibGUiLEFjOiJvcmllbnRhdGlvbiIsQmM6Im93bnMiLENjOiJwb3NpbnNldCIsRWM6InByZXNzZWQiLEljOiJyZWFkb25seSIsS2M6InJlbGV2YW50IixMYzoicmVxdWlyZWQiLFBjOiJyb3dpbmRleCIsU2M6InNlbGVjdGVkIixVYzoic2V0c2l6ZSIsV2M6InNvcnQiLG1kOiJ2YWx1ZW1heCIsbmQ6InZhbHVlbWluIiwKb2Q6InZhbHVlbm93IixwZDoidmFsdWV0ZXh0In07dmFyIFhiO3ZhciBZYj17bmI6ImFsZXJ0IixvYjoiYWxlcnRkaWFsb2ciLHBiOiJhcHBsaWNhdGlvbiIscWI6ImFydGljbGUiLHRiOiJiYW5uZXIiLHZiOiJidXR0b24iLHdiOiJjaGVja2JveCIsemI6ImNvbHVtbmhlYWRlciIsQWI6ImNvbWJvYm94IixCYjoiY29tcGxlbWVudGFyeSIsQ2I6ImNvbnRlbnRpbmZvIixGYjoiZGVmaW5pdGlvbiIsSGI6ImRpYWxvZyIsSWI6ImRpcmVjdG9yeSIsS2I6ImRvY3VtZW50IixPYjoiZm9ybSIsUWI6ImdyaWQiLFJiOiJncmlkY2VsbCIsU2I6Imdyb3VwIixVYjoiaGVhZGluZyIsV2I6ImltZyIsYmM6ImxpbmsiLGNjOiJsaXN0IixkYzoibGlzdGJveCIsZWM6Imxpc3RpdGVtIixoYzoibG9nIixpYzoibWFpbiIsamM6Im1hcnF1ZWUiLGtjOiJtYXRoIixsYzoibWVudSIsbWM6Im1lbnViYXIiLG5jOiJtZW51aXRlbSIsb2M6Im1lbnVpdGVtY2hlY2tib3giLHBjOiJtZW51aXRlbXJhZGlvIix4YzoibmF2aWdhdGlvbiIseWM6Im5vdGUiLHpjOiJvcHRpb24iLApEYzoicHJlc2VudGF0aW9uIixGYzoicHJvZ3Jlc3NiYXIiLEdjOiJyYWRpbyIsSGM6InJhZGlvZ3JvdXAiLEpjOiJyZWdpb24iLE1jOiJyb3ciLE5jOiJyb3dncm91cCIsT2M6InJvd2hlYWRlciIsUWM6InNjcm9sbGJhciIsUmM6InNlYXJjaCIsVGM6InNlcGFyYXRvciIsVmM6InNsaWRlciIsWGM6InNwaW5idXR0b24iLFljOiJzdGF0dXMiLFpjOiJzd2l0Y2giLGFkOiJ0YWIiLGJkOiJ0YWJsaXN0IixjZDoidGFicGFuZWwiLGRkOiJ0ZXh0Ym94IixlZDoidGV4dGluZm8iLGZkOiJ0aW1lciIsZ2Q6InRvb2xiYXIiLGhkOiJ0b29sdGlwIixqZDoidHJlZSIsa2Q6InRyZWVncmlkIixsZDoidHJlZWl0ZW0ifTt2YXIgWmI9ZnVuY3Rpb24oYSxiKXtiPyhwKENhKFliLGIpLCJObyBzdWNoIEFSSUEgcm9sZSAiK2IpLGEuc2V0QXR0cmlidXRlKCJyb2xlIixiKSk6YS5yZW1vdmVBdHRyaWJ1dGUoInJvbGUiKX0sYWM9ZnVuY3Rpb24oYSxiLGMpe0FycmF5LmlzQXJyYXkoYykmJihjPWMuam9pbigiICIpKTt2YXIgZD0kYihiKTtjPT09IiJ8fGM9PXZvaWQgMD8oWGJ8fChjPXt9LFhiPShjLmF0b21pYz0hMSxjLmF1dG9jb21wbGV0ZT0ibm9uZSIsYy5kcm9wZWZmZWN0PSJub25lIixjLmhhc3BvcHVwPSExLGMubGl2ZT0ib2ZmIixjLm11bHRpbGluZT0hMSxjLm11bHRpc2VsZWN0YWJsZT0hMSxjLm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIsYy5yZWFkb25seT0hMSxjLnJlbGV2YW50PSJhZGRpdGlvbnMgdGV4dCIsYy5yZXF1aXJlZD0hMSxjLnNvcnQ9Im5vbmUiLGMuYnVzeT0hMSxjLmRpc2FibGVkPSExLGMuaGlkZGVuPSExLGMuaW52YWxpZD0iZmFsc2UiLGMpKSxjPVhiLGIgaW4gYz9hLnNldEF0dHJpYnV0ZShkLApjW2JdKTphLnJlbW92ZUF0dHJpYnV0ZShkKSk6YS5zZXRBdHRyaWJ1dGUoZCxjKX0sJGI9ZnVuY3Rpb24oYSl7cChhLCJBUklBIGF0dHJpYnV0ZSBjYW5ub3QgYmUgZW1wdHkuIik7cChDYShXYixhKSwiTm8gc3VjaCBBUklBIGF0dHJpYnV0ZSAiK2EpO3JldHVybiJhcmlhLSIrYX07dmFyIGRjPWZ1bmN0aW9uKGEsYixjLGQsZSxmKXtpZih2JiZlKXJldHVybiBiYyhhKTtpZihlJiYhZClyZXR1cm4hMTtpZighdCl7dHlwZW9mIGI9PT0ibnVtYmVyIiYmKGI9Y2MoYikpO3ZhciBoPWI9PTE3fHxiPT0xOHx8diYmYj09OTE7aWYoKCFjfHx2KSYmaHx8diYmYj09MTYmJihkfHxmKSlyZXR1cm4hMX1pZih1JiZkJiZjKXN3aXRjaChhKXtjYXNlIDIyMDpjYXNlIDIxOTpjYXNlIDIyMTpjYXNlIDE5MjpjYXNlIDE4NjpjYXNlIDE4OTpjYXNlIDE4NzpjYXNlIDE4ODpjYXNlIDE5MDpjYXNlIDE5MTpjYXNlIDE5MjpjYXNlIDIyMjpyZXR1cm4hMX1zd2l0Y2goYSl7Y2FzZSAxMzpyZXR1cm4gdD9mfHxlPyExOiEoYyYmZCk6ITA7Y2FzZSAyNzpyZXR1cm4hdSYmIXR9cmV0dXJuIHQmJihkfHxlfHxmKT8hMTpiYyhhKX0sYmM9ZnVuY3Rpb24oYSl7aWYoYT49NDgmJmE8PTU3fHxhPj05NiYmYTw9MTA2fHxhPj02NSYmYTw9OTB8fHUmJmE9PTApcmV0dXJuITA7c3dpdGNoKGEpe2Nhc2UgMzI6Y2FzZSA0MzpjYXNlIDYzOmNhc2UgNjQ6Y2FzZSAxMDc6Y2FzZSAxMDk6Y2FzZSAxMTA6Y2FzZSAxMTE6Y2FzZSAxODY6Y2FzZSA1OTpjYXNlIDE4OTpjYXNlIDE4NzpjYXNlIDYxOmNhc2UgMTg4OmNhc2UgMTkwOmNhc2UgMTkxOmNhc2UgMTkyOmNhc2UgMjIyOmNhc2UgMjE5OmNhc2UgMjIwOmNhc2UgMjIxOmNhc2UgMTYzOmNhc2UgNTg6cmV0dXJuITA7CmNhc2UgMTczOmNhc2UgMTcxOnJldHVybiB0O2RlZmF1bHQ6cmV0dXJuITF9fSxjYz1mdW5jdGlvbihhKXtpZih0KWE9ZWMoYSk7ZWxzZSBpZih2JiZ1KXN3aXRjaChhKXtjYXNlIDkzOmE9OTF9cmV0dXJuIGF9LGVjPWZ1bmN0aW9uKGEpe3N3aXRjaChhKXtjYXNlIDYxOnJldHVybiAxODc7Y2FzZSA1OTpyZXR1cm4gMTg2O2Nhc2UgMTczOnJldHVybiAxODk7Y2FzZSAyMjQ6cmV0dXJuIDkxO2Nhc2UgMDpyZXR1cm4gMjI0O2RlZmF1bHQ6cmV0dXJuIGF9fTt2YXIgZmM9ZnVuY3Rpb24oYSxiLGMsZCl7ei5jYWxsKHRoaXMsZCk7dGhpcy50eXBlPSJrZXkiO3RoaXMuZz1hO3RoaXMucmVwZWF0PWN9O24oZmMseik7dmFyIEo9ZnVuY3Rpb24oYSxiKXtELmNhbGwodGhpcyk7YSYmZ2ModGhpcyxhLGIpfTtuKEosRCk7Zz1KLnByb3RvdHlwZTtnLlI9bnVsbDtnLnFhPW51bGw7Zy5KYT1udWxsO2cucmE9bnVsbDtnLkY9LTE7Zy5LPS0xO2cuRGE9ITE7CnZhciBoYz17MzoxMywxMjoxNDQsNjMyMzI6MzgsNjMyMzM6NDAsNjMyMzQ6MzcsNjMyMzU6MzksNjMyMzY6MTEyLDYzMjM3OjExMyw2MzIzODoxMTQsNjMyMzk6MTE1LDYzMjQwOjExNiw2MzI0MToxMTcsNjMyNDI6MTE4LDYzMjQzOjExOSw2MzI0NDoxMjAsNjMyNDU6MTIxLDYzMjQ2OjEyMiw2MzI0NzoxMjMsNjMyNDg6NDQsNjMyNzI6NDYsNjMyNzM6MzYsNjMyNzU6MzUsNjMyNzY6MzMsNjMyNzc6MzQsNjMyODk6MTQ0LDYzMzAyOjQ1fSxpYz17VXA6MzgsRG93bjo0MCxMZWZ0OjM3LFJpZ2h0OjM5LEVudGVyOjEzLEYxOjExMixGMjoxMTMsRjM6MTE0LEY0OjExNSxGNToxMTYsRjY6MTE3LEY3OjExOCxGODoxMTksRjk6MTIwLEYxMDoxMjEsRjExOjEyMixGMTI6MTIzLCJVKzAwN0YiOjQ2LEhvbWU6MzYsRW5kOjM1LFBhZ2VVcDozMyxQYWdlRG93bjozNCxJbnNlcnQ6NDV9LGpjPXYmJnQ7CkoucHJvdG90eXBlLmc9ZnVuY3Rpb24oYSl7dSYmKHRoaXMuRj09MTcmJiFhLmN0cmxLZXl8fHRoaXMuRj09MTgmJiFhLmFsdEtleXx8diYmdGhpcy5GPT05MSYmIWEubWV0YUtleSkmJih0aGlzLks9dGhpcy5GPS0xKTt0aGlzLkY9PS0xJiYoYS5jdHJsS2V5JiZhLmchPTE3P3RoaXMuRj0xNzphLmFsdEtleSYmYS5nIT0xOD90aGlzLkY9MTg6YS5tZXRhS2V5JiZhLmchPTkxJiYodGhpcy5GPTkxKSk7ZGMoYS5nLHRoaXMuRixhLnNoaWZ0S2V5LGEuY3RybEtleSxhLmFsdEtleSxhLm1ldGFLZXkpPyh0aGlzLks9Y2MoYS5nKSxqYyYmKHRoaXMuRGE9YS5hbHRLZXkpKTp0aGlzLmhhbmRsZUV2ZW50KGEpfTtKLnByb3RvdHlwZS5oPWZ1bmN0aW9uKGEpe3RoaXMuSz10aGlzLkY9LTE7dGhpcy5EYT1hLmFsdEtleX07CkoucHJvdG90eXBlLmhhbmRsZUV2ZW50PWZ1bmN0aW9uKGEpe3ZhciBiPWEuaCxjPWIuYWx0S2V5O2lmKHUmJmEudHlwZT09ImtleXByZXNzIil7dmFyIGQ9dGhpcy5LO3ZhciBlPWIuY2hhckNvZGU+PTAmJmIuY2hhckNvZGU8NjMyMzImJmJjKGQpP2IuY2hhckNvZGU6MH1lbHNlIGEudHlwZT09ImtleXByZXNzIj8oamMmJihjPXRoaXMuRGEpLGIua2V5Q29kZT09Yi5jaGFyQ29kZT9iLmtleUNvZGU8MzI/KGQ9Yi5rZXlDb2RlLGU9MCk6KGQ9dGhpcy5LLGU9Yi5jaGFyQ29kZSk6KGQ9Yi5rZXlDb2RlfHx0aGlzLkssZT1iLmNoYXJDb2RlfHwwKSk6KGQ9Yi5rZXlDb2RlfHx0aGlzLkssZT1iLmNoYXJDb2RlfHwwKSx2JiZlPT02MyYmZD09MjI0JiYoZD0xOTEpO3ZhciBmPWQ9Y2MoZCk7ZD9kPj02MzIzMiYmZCBpbiBoYz9mPWhjW2RdOmQ9PTI1JiZhLnNoaWZ0S2V5JiYoZj05KTpiLmtleUlkZW50aWZpZXImJmIua2V5SWRlbnRpZmllciBpbiBpYyYmKGY9aWNbYi5rZXlJZGVudGlmaWVyXSk7CmlmKCF0fHxhLnR5cGUhPSJrZXlwcmVzcyJ8fGRjKGYsdGhpcy5GLGEuc2hpZnRLZXksYS5jdHJsS2V5LGMsYS5tZXRhS2V5KSlhPWY9PXRoaXMuRix0aGlzLkY9ZixiPW5ldyBmYyhmLGUsYSxiKSxiLmFsdEtleT1jLEUodGhpcyxiKX07Si5wcm90b3R5cGUuaT1mdW5jdGlvbigpe3JldHVybiB0aGlzLlJ9O3ZhciBnYz1mdW5jdGlvbihhLGIsYyl7YS5yYSYma2MoYSk7YS5SPWI7YS5xYT11YihhLlIsImtleXByZXNzIixhLGMpO2EuSmE9dWIoYS5SLCJrZXlkb3duIixhLmcsYyxhKTthLnJhPXViKGEuUiwia2V5dXAiLGEuaCxjLGEpfSxrYz1mdW5jdGlvbihhKXthLnFhJiYoQShhLnFhKSxBKGEuSmEpLEEoYS5yYSksYS5xYT1udWxsLGEuSmE9bnVsbCxhLnJhPW51bGwpO2EuUj1udWxsO2EuRj0tMTthLks9LTF9O0oucHJvdG90eXBlLkM9ZnVuY3Rpb24oKXtKLmwuQy5jYWxsKHRoaXMpO2tjKHRoaXMpfTt2YXIgSz17Z2E6Im1vdXNlZG93biIsaGE6Im1vdXNldXAiLGZhOiJtb3VzZWNhbmNlbCIsc2M6Im1vdXNlbW92ZSIsdWM6Im1vdXNlb3ZlciIsdGM6Im1vdXNlb3V0IixxYzoibW91c2VlbnRlciIscmM6Im1vdXNlbGVhdmUifTt2YXIgbGM9ZnVuY3Rpb24oYSl7cmV0dXJuIHR5cGVvZiBhLmNsYXNzTmFtZT09InN0cmluZyI/YS5jbGFzc05hbWU6YS5nZXRBdHRyaWJ1dGUmJmEuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIn0sTD1mdW5jdGlvbihhKXtyZXR1cm4gYS5jbGFzc0xpc3Q/YS5jbGFzc0xpc3Q6bGMoYSkubWF0Y2goL1xTKy9nKXx8W119LG1jPWZ1bmN0aW9uKGEsYil7dHlwZW9mIGEuY2xhc3NOYW1lPT0ic3RyaW5nIj9hLmNsYXNzTmFtZT1iOmEuc2V0QXR0cmlidXRlJiZhLnNldEF0dHJpYnV0ZSgiY2xhc3MiLGIpfSxuYz1mdW5jdGlvbihhLGIpe2EuY2xhc3NMaXN0P2I9YS5jbGFzc0xpc3QuY29udGFpbnMoYik6KGE9TChhKSxiPXZhKGEsYik+PTApO3JldHVybiBifSxvYz1mdW5jdGlvbihhLGIpe2lmKGEuY2xhc3NMaXN0KWEuY2xhc3NMaXN0LmFkZChiKTtlbHNlIGlmKCFuYyhhLGIpKXt2YXIgYz1sYyhhKTttYyhhLGMrKGMubGVuZ3RoPjA/IiAiK2I6YikpfX0scGM9ZnVuY3Rpb24oYSxiKXtpZihhLmNsYXNzTGlzdClBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGIsCmZ1bmN0aW9uKGUpe29jKGEsZSl9KTtlbHNle3ZhciBjPXt9O0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoTChhKSxmdW5jdGlvbihlKXtjW2VdPSEwfSk7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChiLGZ1bmN0aW9uKGUpe2NbZV09ITB9KTtiPSIiO2Zvcih2YXIgZCBpbiBjKWIrPWIubGVuZ3RoPjA/IiAiK2Q6ZDttYyhhLGIpfX0scWM9ZnVuY3Rpb24oYSxiKXthLmNsYXNzTGlzdD9hLmNsYXNzTGlzdC5yZW1vdmUoYik6bmMoYSxiKSYmbWMoYSxBcnJheS5wcm90b3R5cGUuZmlsdGVyLmNhbGwoTChhKSxmdW5jdGlvbihjKXtyZXR1cm4gYyE9Yn0pLmpvaW4oIiAiKSl9LHJjPWZ1bmN0aW9uKGEsYil7YS5jbGFzc0xpc3Q/QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChiLGZ1bmN0aW9uKGMpe3FjKGEsYyl9KTptYyhhLEFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbChMKGEpLGZ1bmN0aW9uKGMpe3JldHVybiEodmEoYixjKT49MCl9KS5qb2luKCIgIikpfTt2YXIgdGM9ZnVuY3Rpb24oYSxiKXtpZighYSl0aHJvdyBFcnJvcigiSW52YWxpZCBjbGFzcyBuYW1lICIrYSk7aWYodHlwZW9mIGIhPT0iZnVuY3Rpb24iKXRocm93IEVycm9yKCJJbnZhbGlkIGRlY29yYXRvciBmdW5jdGlvbiAiK2IpO3NjW2FdPWJ9LHVjPXt9LHNjPXt9O3ZhciB2Yz1mdW5jdGlvbihhKXt0aGlzLkE9YX07aWEodmMpO3ZhciB3Yz1mdW5jdGlvbihhLGIpe2EmJihhLnRhYkluZGV4PWI/MDotMSl9LHljPWZ1bmN0aW9uKGEsYixjKXtjLmlkJiZQYihiLGMuaWQpO3ZhciBkPWEuZygpLGU9ITEsZj1MKGMpO2YmJkFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoZixmdW5jdGlvbihoKXtoPT1kP2U9ITA6aCYmdGhpcy51KGIsaCxkKX0sYSk7ZXx8b2MoYyxkKTt4YyhiLGMpO3JldHVybiBjfTt2Yy5wcm90b3R5cGUudT1mdW5jdGlvbihhLGIsYyl7Yj09YysiLWRpc2FibGVkIj9hLlgoITEpOmI9PWMrIi1ob3Jpem9udGFsIj96YyhhLCJob3Jpem9udGFsIik6Yj09YysiLXZlcnRpY2FsIiYmemMoYSwidmVydGljYWwiKX07CnZhciB4Yz1mdW5jdGlvbihhLGIpe2lmKGIpZm9yKHZhciBjPWIuZmlyc3RDaGlsZCxkO2MmJmMucGFyZW50Tm9kZT09Yjspe2Q9Yy5uZXh0U2libGluZztpZihjLm5vZGVUeXBlPT0xKXthOnt2YXIgZT1jO3AoZSk7ZT1MKGUpO2Zvcih2YXIgZj1lLmxlbmd0aCxoPTA7aDxmO2grKyl7dmFyIGs9ZVtoXTtpZihrPWsgaW4gc2M/c2Nba10oKTpudWxsKXtlPWs7YnJlYWsgYX19ZT1udWxsfWUmJihlLmc9YyxhLmlzRW5hYmxlZCgpfHxlLlgoITEpLGEuQmEoZSksU2IoZSxjKSl9ZWxzZSBjLm5vZGVWYWx1ZSYmSGEoYy5ub2RlVmFsdWUpIT0iInx8Yi5yZW1vdmVDaGlsZChjKTtjPWR9fSxBYz1mdW5jdGlvbihhLGIpe2I9Yi5pKCk7cChiLCJUaGUgY29udGFpbmVyIERPTSBlbGVtZW50IGNhbm5vdCBiZSBudWxsLiIpO0tiKGIsdCk7KGE9YS5BKSYmWmIoYixhKX07dmMucHJvdG90eXBlLmc9ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy1jb250YWluZXIifTsKdmMucHJvdG90eXBlLmo9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nKCksYz1bYixhLkw9PSJob3Jpem9udGFsIj9iKyItaG9yaXpvbnRhbCI6YisiLXZlcnRpY2FsIl07YS5pc0VuYWJsZWQoKXx8Yy5wdXNoKGIrIi1kaXNhYmxlZCIpO3JldHVybiBjfTt2YXIgQmM9ZnVuY3Rpb24oKXt9O3ZhciBNPWZ1bmN0aW9uKCl7fSxDYztpYShNKTt2YXIgRGM9e2J1dHRvbjoicHJlc3NlZCIsY2hlY2tib3g6ImNoZWNrZWQiLG1lbnVpdGVtOiJzZWxlY3RlZCIsbWVudWl0ZW1jaGVja2JveDoiY2hlY2tlZCIsbWVudWl0ZW1yYWRpbzoiY2hlY2tlZCIscmFkaW86ImNoZWNrZWQiLHRhYjoic2VsZWN0ZWQiLHRyZWVpdGVtOiJzZWxlY3RlZCJ9O00ucHJvdG90eXBlLk5hPWZ1bmN0aW9uKCl7fTtNLnByb3RvdHlwZS54YT1mdW5jdGlvbihhKXt2YXIgYj1hLkcsYz1iLmgsZD10aGlzLk4oKSxlPVtkXSxmPXRoaXMuTigpO2YhPWQmJmUucHVzaChmKTtkPWEubTtmb3IoZj1bXTtkOyl7dmFyIGg9ZCYtZDtmLnB1c2goRWModGhpcyxoKSk7ZCY9fmh9ZS5wdXNoLmFwcGx5KGUsZik7KGQ9YS5GYSkmJmUucHVzaC5hcHBseShlLGQpO3JldHVybiBjLmNhbGwoYiwiRElWIixlLmpvaW4oIiAiKSxhLmlhKX07Ck0ucHJvdG90eXBlLnlhPWZ1bmN0aW9uKGEsYil7Yi5pZCYmUGIoYSxiLmlkKTtiJiZiLmZpcnN0Q2hpbGQ/RmMoYSxiLmZpcnN0Q2hpbGQubmV4dFNpYmxpbmc/eWEoYi5jaGlsZE5vZGVzKTpiLmZpcnN0Q2hpbGQpOmEuaWE9bnVsbDt2YXIgYz0wLGQ9dGhpcy5OKCksZT10aGlzLk4oKSxmPSExLGg9ITEsaz15YShMKGIpKTtrLmZvckVhY2goZnVuY3Rpb24ocSl7Znx8cSE9ZD9ofHxxIT1lP2N8PUdjKHRoaXMscSk6aD0hMDooZj0hMCxlPT1kJiYoaD0hMCkpO0djKHRoaXMscSk9PTEmJihzYShiKSxkYihiKSYmZWIoYikmJmNiKGIsITEpKX0sdGhpcyk7YS5tPWM7Znx8KGsucHVzaChkKSxlPT1kJiYoaD0hMCkpO2h8fGsucHVzaChlKTsoYT1hLkZhKSYmay5wdXNoLmFwcGx5KGssYSk7ZiYmaCYmIWF8fG1jKGIsay5qb2luKCIgIikpO3JldHVybiBifTsKdmFyIEhjPWZ1bmN0aW9uKGEsYil7aWYoYT1hLk5hKCkpe3AoYiwiVGhlIGVsZW1lbnQgcGFzc2VkIGFzIGEgZmlyc3QgcGFyYW1ldGVyIGNhbm5vdCBiZSBudWxsLiIpO3ZhciBjPWIuZ2V0QXR0cmlidXRlKCJyb2xlIil8fG51bGw7YSE9YyYmWmIoYixhKX19LEljPWZ1bmN0aW9uKGEsYil7dmFyIGM7aWYoYS5EJjMyJiYoYz1hLmkoKSkpe2lmKCFiJiZhLm0mMzIpe3RyeXtjLmJsdXIoKX1jYXRjaChkKXt9YS5tJjMyJiZhLlFhKG51bGwpfShkYihjKSYmZWIoYykpIT1iJiZjYihjLGIpfX0sSmM9ZnVuY3Rpb24oYSxiLGMpe0NjfHwoQ2M9ezE6ImRpc2FibGVkIiw4OiJzZWxlY3RlZCIsMTY6ImNoZWNrZWQiLDY0OiJleHBhbmRlZCJ9KTtwKGEsIlRoZSBlbGVtZW50IHBhc3NlZCBhcyBhIGZpcnN0IHBhcmFtZXRlciBjYW5ub3QgYmUgbnVsbC4iKTtiPUNjW2JdO3ZhciBkPWEuZ2V0QXR0cmlidXRlKCJyb2xlIil8fG51bGw7ZCYmKGQ9RGNbZF18fGIsYj1iPT0iY2hlY2tlZCJ8fGI9PQoic2VsZWN0ZWQiP2Q6Yik7YiYmYWMoYSxiLGMpfTtNLnByb3RvdHlwZS5OPWZ1bmN0aW9uKCl7cmV0dXJuImdvb2ctY29udHJvbCJ9O3ZhciBFYz1mdW5jdGlvbihhLGIpe2EuZ3x8S2MoYSk7cmV0dXJuIGEuZ1tiXX0sR2M9ZnVuY3Rpb24oYSxiKXthLmh8fChhLmd8fEtjKGEpLGEuaD1FYShhLmcpKTthPXBhcnNlSW50KGEuaFtiXSwxMCk7cmV0dXJuIGlzTmFOKGEpPzA6YX0sS2M9ZnVuY3Rpb24oYSl7dmFyIGI9YS5OKCk7dmFyIGM9Yi5yZXBsYWNlKC9ceGEwfFxzL2csIiAiKS5pbmRleE9mKCIgIikhPS0xO3AoIWMsIkNvbnRyb2xSZW5kZXJlciBoYXMgYW4gaW52YWxpZCBjc3MgY2xhc3M6ICciK2IrIiciKTthLmc9ezE6YisiLWRpc2FibGVkIiwyOmIrIi1ob3ZlciIsNDpiKyItYWN0aXZlIiw4OmIrIi1zZWxlY3RlZCIsMTY6YisiLWNoZWNrZWQiLDMyOmIrIi1mb2N1c2VkIiw2NDpiKyItb3BlbiJ9fTt2YXIgTj1mdW5jdGlvbihhLGIsYyl7Ri5jYWxsKHRoaXMsYyk7aWYoIWIpe2ZvcihiPXRoaXMuY29uc3RydWN0b3I7Yjspe3ZhciBkPW5hKGIpO2lmKGQ9dWNbZF0pYnJlYWs7Yj0oYj1PYmplY3QuZ2V0UHJvdG90eXBlT2YoYi5wcm90b3R5cGUpKSYmYi5jb25zdHJ1Y3Rvcn1iPWQ/dHlwZW9mIGQuVj09PSJmdW5jdGlvbiI/ZC5WKCk6bmV3IGQ6bnVsbH10aGlzLnY9Yjt0aGlzLmlhPWEhPT12b2lkIDA/YTpudWxsfTtuKE4sRik7Zz1OLnByb3RvdHlwZTtnLmlhPW51bGw7Zy5tPTA7Zy5EPTM5O2cuUD0wO2cuT2E9ITA7Zy5GYT1udWxsO2cuSGE9ITA7Zy5tYT1mdW5jdGlvbigpe3ZhciBhPXRoaXMudi54YSh0aGlzKTt0aGlzLmc9YTtIYyh0aGlzLnYsYSk7S2IoYSwhMCk7dGhpcy5pc1Zpc2libGUoKXx8KGEuc3R5bGUuZGlzcGxheT0ibm9uZSIsYSYmYWMoYSwiaGlkZGVuIiwhMCkpfTtnLm5hPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaSgpfTtnLndhPWZ1bmN0aW9uKCl7cmV0dXJuITB9OwpnLkVhPWZ1bmN0aW9uKGEpe3RoaXMuZz1hPXRoaXMudi55YSh0aGlzLGEpO0hjKHRoaXMudixhKTtLYihhLCEwKTt0aGlzLk9hPWEuc3R5bGUuZGlzcGxheSE9Im5vbmUifTsKZy5JPWZ1bmN0aW9uKCl7Ti5sLkkuY2FsbCh0aGlzKTt2YXIgYT10aGlzLmc7cChhLCJDYW4gbm90IGNhbGwgZ2V0RWxlbWVudFN0cmljdCBiZWZvcmUgcmVuZGVyaW5nL2RlY29yYXRpbmcuIik7cCh0aGlzKTtwKGEpO3RoaXMuaXNWaXNpYmxlKCl8fGFjKGEsImhpZGRlbiIsIXRoaXMuaXNWaXNpYmxlKCkpO3RoaXMuaXNFbmFibGVkKCl8fEpjKGEsMSwhdGhpcy5pc0VuYWJsZWQoKSk7dGhpcy5EJjgmJkpjKGEsOCwhISh0aGlzLm0mOCkpO3RoaXMuRCYxNiYmSmMoYSwxNiwhISh0aGlzLm0mMTYpKTt0aGlzLkQmNjQmJkpjKGEsNjQsISEodGhpcy5tJjY0KSk7dmFyIGI9dGhpcy52O1ViKHRoaXMpJiYoYT10aGlzLmkoKSxiPWIuTigpKyItcnRsIiwoYT1hLmk/YS5pKCk6YSkmJnBjKGEsW2JdKSk7dGhpcy5pc0VuYWJsZWQoKSYmSWModGhpcyx0aGlzLmlzVmlzaWJsZSgpKTt0aGlzLkQmLTImJih0aGlzLkhhJiZMYyh0aGlzLCEwKSx0aGlzLkQmMzImJihhPXRoaXMuaSgpKSkmJihiPQp0aGlzLlp8fCh0aGlzLlo9bmV3IEopLGdjKGIsYSksQihCKEIoUWIodGhpcyksYiwia2V5Iix0aGlzLmFhKSxhLCJmb2N1cyIsdGhpcy5YYSksYSwiYmx1ciIsdGhpcy5RYSkpfTt2YXIgTGM9ZnVuY3Rpb24oYSxiKXt2YXIgYz1RYihhKSxkPWEuaSgpO2I/KEIoQihCKEIoYyxkLEsuZ2EsYS5zYSksZCxbSy5oYSxLLmZhXSxhLnZhKSxkLCJtb3VzZW92ZXIiLGEudWEpLGQsIm1vdXNlb3V0IixhLnRhKSxhLmNhIT1CYyYmQihjLGQsImNvbnRleHRtZW51IixhLmNhKSk6KEMoQyhDKEMoYyxkLEsuZ2EsYS5zYSksZCxbSy5oYSxLLmZhXSxhLnZhKSxkLCJtb3VzZW92ZXIiLGEudWEpLGQsIm1vdXNlb3V0IixhLnRhKSxhLmNhIT1CYyYmQyhjLGQsImNvbnRleHRtZW51IixhLmNhKSl9O04ucHJvdG90eXBlLlU9ZnVuY3Rpb24oKXtOLmwuVS5jYWxsKHRoaXMpO3RoaXMuWiYma2ModGhpcy5aKTt0aGlzLmlzVmlzaWJsZSgpJiZ0aGlzLmlzRW5hYmxlZCgpJiZJYyh0aGlzLCExKX07Ck4ucHJvdG90eXBlLkM9ZnVuY3Rpb24oKXtOLmwuQy5jYWxsKHRoaXMpO3RoaXMuWiYmKHRoaXMuWi5kaXNwb3NlKCksZGVsZXRlIHRoaXMuWik7ZGVsZXRlIHRoaXMudjt0aGlzLkZhPXRoaXMuaWE9bnVsbH07dmFyIEZjPWZ1bmN0aW9uKGEsYil7YS5pYT1ifTtOLnByb3RvdHlwZS5pc1Zpc2libGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5PYX07Ti5wcm90b3R5cGUuaXNFbmFibGVkPWZ1bmN0aW9uKCl7cmV0dXJuISh0aGlzLm0mMSl9O04ucHJvdG90eXBlLlg9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5oO2ImJnR5cGVvZiBiLmlzRW5hYmxlZD09ImZ1bmN0aW9uIiYmIWIuaXNFbmFibGVkKCl8fCFPKHRoaXMsMSwhYSl8fChhfHwoTWModGhpcywhMSksUCh0aGlzLCExKSksdGhpcy5pc1Zpc2libGUoKSYmSWModGhpcyxhKSxUKHRoaXMsMSwhYSwhMCkpfTt2YXIgUD1mdW5jdGlvbihhLGIpe08oYSwyLGIpJiZUKGEsMixiKX07Ck4ucHJvdG90eXBlLmlzQWN0aXZlPWZ1bmN0aW9uKCl7cmV0dXJuISEodGhpcy5tJjQpfTsKdmFyIE1jPWZ1bmN0aW9uKGEsYil7TyhhLDQsYikmJlQoYSw0LGIpfSxOYz1mdW5jdGlvbihhLGIpe08oYSw4LGIpJiZUKGEsOCxiKX0sT2M9ZnVuY3Rpb24oYSxiKXtPKGEsNjQsYikmJlQoYSw2NCxiKX0sVD1mdW5jdGlvbihhLGIsYyxkKXtpZighZCYmYj09MSlhLlgoIWMpO2Vsc2UgaWYoYS5EJmImJmMhPSEhKGEubSZiKSl7dmFyIGU9YS52O2lmKGQ9YS5pKCkpe2lmKGU9RWMoZSxiKSl7dmFyIGY9YS5pP2EuaSgpOmE7ZiYmKGM/cGM6cmMpKGYsW2VdKX1KYyhkLGIsYyl9YS5tPWM/YS5tfGI6YS5tJn5ifX0sUGM9ZnVuY3Rpb24oYSxiLGMpe2lmKGEucyYmYS5tJmImJiFjKXRocm93IEVycm9yKCJDb21wb25lbnQgYWxyZWFkeSByZW5kZXJlZCIpOyFjJiZhLm0mYiYmVChhLGIsITEpO2EuRD1jP2EuRHxiOmEuRCZ+Yn0sVT1mdW5jdGlvbihhLGIpe3JldHVybiEhKDI1NSZiKSYmISEoYS5EJmIpfSxPPWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4hIShhLkQmYikmJiEhKGEubSZiKSE9CmMmJighKGEuUCZiKXx8RShhLE5iKGIsYykpKSYmIWEuYmF9O04ucHJvdG90eXBlLnVhPWZ1bmN0aW9uKGEpeyFRYyhhLHRoaXMuaSgpKSYmRSh0aGlzLCJlbnRlciIpJiZ0aGlzLmlzRW5hYmxlZCgpJiZVKHRoaXMsMikmJlAodGhpcywhMCl9O04ucHJvdG90eXBlLnRhPWZ1bmN0aW9uKGEpeyFRYyhhLHRoaXMuaSgpKSYmRSh0aGlzLCJsZWF2ZSIpJiYoVSh0aGlzLDQpJiZNYyh0aGlzLCExKSxVKHRoaXMsMikmJlAodGhpcywhMSkpfTtOLnByb3RvdHlwZS5jYT1CYzt2YXIgUWM9ZnVuY3Rpb24oYSxiKXtyZXR1cm4hIWEucmVsYXRlZFRhcmdldCYmYWIoYixhLnJlbGF0ZWRUYXJnZXQpfTsKTi5wcm90b3R5cGUuc2E9ZnVuY3Rpb24oYSl7aWYodGhpcy5pc0VuYWJsZWQoKSYmKFUodGhpcywyKSYmUCh0aGlzLCEwKSwhKGEuaC5idXR0b24hPTB8fHYmJmEuY3RybEtleSkpKXtVKHRoaXMsNCkmJk1jKHRoaXMsITApO3ZhciBiO2lmKGI9dGhpcy52KXt2YXIgYztiPXRoaXMuRCYzMiYmKGM9dGhpcy5pKCkpP2RiKGMpJiZlYihjKTohMX1iJiZ0aGlzLmkoKS5mb2N1cygpfWEuaC5idXR0b24hPTB8fHYmJmEuY3RybEtleXx8YS5qKCl9O04ucHJvdG90eXBlLnZhPWZ1bmN0aW9uKGEpe3RoaXMuaXNFbmFibGVkKCkmJihVKHRoaXMsMikmJlAodGhpcywhMCksdGhpcy5pc0FjdGl2ZSgpJiZSYyh0aGlzLGEpJiZVKHRoaXMsNCkmJk1jKHRoaXMsITEpKX07CnZhciBSYz1mdW5jdGlvbihhLGIpe2lmKFUoYSwxNikpe3ZhciBjPSEoYS5tJjE2KTtPKGEsMTYsYykmJlQoYSwxNixjKX1VKGEsOCkmJk5jKGEsITApO1UoYSw2NCkmJk9jKGEsIShhLm0mNjQpKTtjPW5ldyB5KCJhY3Rpb24iLGEpO2ImJihjLmFsdEtleT1iLmFsdEtleSxjLmN0cmxLZXk9Yi5jdHJsS2V5LGMubWV0YUtleT1iLm1ldGFLZXksYy5zaGlmdEtleT1iLnNoaWZ0S2V5LGMuRz1iLkcsYy50aW1lU3RhbXA9Yi50aW1lU3RhbXApO3JldHVybiBFKGEsYyl9O04ucHJvdG90eXBlLlhhPWZ1bmN0aW9uKCl7VSh0aGlzLDMyKSYmTyh0aGlzLDMyLCEwKSYmVCh0aGlzLDMyLCEwKX07Ti5wcm90b3R5cGUuUWE9ZnVuY3Rpb24oKXtVKHRoaXMsNCkmJk1jKHRoaXMsITEpO1UodGhpcywzMikmJk8odGhpcywzMiwhMSkmJlQodGhpcywzMiwhMSl9OwpOLnByb3RvdHlwZS5hYT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5pc1Zpc2libGUoKSYmdGhpcy5pc0VuYWJsZWQoKSYmYS5nPT0xMyYmUmModGhpcyxhKT8oYS5qKCksYS52KCksITApOiExfTtpZih0eXBlb2YgTiE9PSJmdW5jdGlvbiIpdGhyb3cgRXJyb3IoIkludmFsaWQgY29tcG9uZW50IGNsYXNzICIrTik7aWYodHlwZW9mIE0hPT0iZnVuY3Rpb24iKXRocm93IEVycm9yKCJJbnZhbGlkIHJlbmRlcmVyIGNsYXNzICIrTSk7dmFyIFNjPW5hKE4pO3VjW1NjXT1NO3RjKCJnb29nLWNvbnRyb2wiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBOKG51bGwpfSk7dmFyIFY9ZnVuY3Rpb24oYSxiLGMpe0YuY2FsbCh0aGlzLGMpO3RoaXMuZWE9Ynx8dmMuVigpO3RoaXMuTD1hfHwidmVydGljYWwifTtuKFYsRik7Zz1WLnByb3RvdHlwZTtnLkthPW51bGw7Zy5kYT1udWxsO2cuZWE9bnVsbDtnLkw9bnVsbDtnLlM9ITA7Zy5UPSEwO2cubz0tMTtnLkI9bnVsbDtnLlc9ITE7Zy5PPW51bGw7dmFyIFRjPWZ1bmN0aW9uKGEpe3JldHVybiBhLkthfHxhLmkoKX07Zz1WLnByb3RvdHlwZTtnLm1hPWZ1bmN0aW9uKCl7dGhpcy5nPXRoaXMuRy5oKCJESVYiLHRoaXMuZWEuaih0aGlzKS5qb2luKCIgIikpfTtnLm5hPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaSgpfTtnLndhPWZ1bmN0aW9uKGEpe3JldHVybiBhLnRhZ05hbWU9PSJESVYifTtnLkVhPWZ1bmN0aW9uKGEpe3RoaXMuZz15Yyh0aGlzLmVhLHRoaXMsYSk7YS5zdHlsZS5kaXNwbGF5PT0ibm9uZSImJih0aGlzLlM9ITEpfTsKZy5JPWZ1bmN0aW9uKCl7Vi5sLkkuY2FsbCh0aGlzKTtUYih0aGlzLGZ1bmN0aW9uKGIpe2IucyYmVWModGhpcyxiKX0sdGhpcyk7dmFyIGE9dGhpcy5pKCk7QWModGhpcy5lYSx0aGlzKTtWYyh0aGlzLHRoaXMuUyk7QihCKEIoQihCKEIoQihCKFFiKHRoaXMpLHRoaXMsImVudGVyIix0aGlzLmViKSx0aGlzLCJoaWdobGlnaHQiLHRoaXMuZmIpLHRoaXMsInVuaGlnaGxpZ2h0Iix0aGlzLmxiKSx0aGlzLCJvcGVuIix0aGlzLmdiKSx0aGlzLCJjbG9zZSIsdGhpcy5iYiksYSxLLmdhLHRoaXMuV2EpLGJiKGEpLFtLLmhhLEsuZmFdLHRoaXMuY2IpLGEsW0suZ2EsSy5oYSxLLmZhLCJtb3VzZW92ZXIiLCJtb3VzZW91dCIsImNvbnRleHRtZW51Il0sdGhpcy5hYik7V2ModGhpcyl9O3ZhciBXYz1mdW5jdGlvbihhKXt2YXIgYj1RYihhKSxjPVRjKGEpO0IoQihCKGIsYywiZm9jdXMiLGEuUGEpLGMsImJsdXIiLGEuVWEpLGEuZGF8fChhLmRhPW5ldyBKKFRjKGEpKSksImtleSIsYS5WYSl9OwpnPVYucHJvdG90eXBlO2cuVT1mdW5jdGlvbigpe1hjKHRoaXMsLTEpO3RoaXMuQiYmT2ModGhpcy5CLCExKTt0aGlzLlc9ITE7Vi5sLlUuY2FsbCh0aGlzKX07Zy5DPWZ1bmN0aW9uKCl7Vi5sLkMuY2FsbCh0aGlzKTt0aGlzLmRhJiYodGhpcy5kYS5kaXNwb3NlKCksdGhpcy5kYT1udWxsKTt0aGlzLmVhPXRoaXMuQj10aGlzLk89dGhpcy5LYT1udWxsfTtnLmViPWZ1bmN0aW9uKCl7cmV0dXJuITB9OwpnLmZiPWZ1bmN0aW9uKGEpe3ZhciBiPVZiKHRoaXMsYS50YXJnZXQpO2lmKGI+LTEmJmIhPXRoaXMubyl7dmFyIGM9SSh0aGlzLHRoaXMubyk7YyYmUChjLCExKTt0aGlzLm89YjtjPUkodGhpcyx0aGlzLm8pO3RoaXMuVyYmTWMoYywhMCk7dGhpcy5CJiZjIT10aGlzLkImJihjLkQmNjQ/T2MoYywhMCk6T2ModGhpcy5CLCExKSl9Yj10aGlzLmkoKTtwKGIsIlRoZSBET00gZWxlbWVudCBmb3IgdGhlIGNvbnRhaW5lciBjYW5ub3QgYmUgbnVsbC4iKTthLnRhcmdldC5pKCkhPW51bGwmJmFjKGIsImFjdGl2ZWRlc2NlbmRhbnQiLGEudGFyZ2V0LmkoKS5pZCl9O2cubGI9ZnVuY3Rpb24oYSl7YS50YXJnZXQ9PUkodGhpcyx0aGlzLm8pJiYodGhpcy5vPS0xKTthPXRoaXMuaSgpO3AoYSwiVGhlIERPTSBlbGVtZW50IGZvciB0aGUgY29udGFpbmVyIGNhbm5vdCBiZSBudWxsLiIpO2EucmVtb3ZlQXR0cmlidXRlKCRiKCJhY3RpdmVkZXNjZW5kYW50IikpfTsKZy5nYj1mdW5jdGlvbihhKXsoYT1hLnRhcmdldCkmJmEhPXRoaXMuQiYmYS5oPT10aGlzJiYodGhpcy5CJiZPYyh0aGlzLkIsITEpLHRoaXMuQj1hKX07Zy5iYj1mdW5jdGlvbihhKXthLnRhcmdldD09dGhpcy5CJiYodGhpcy5CPW51bGwpO3ZhciBiPXRoaXMuaSgpLGM9YS50YXJnZXQuaSgpO2ImJmEudGFyZ2V0Lm0mMiYmYyYmKGE9IiIsYyYmKGE9Yy5pZCxwKGEsIlRoZSBhY3RpdmUgZWxlbWVudCBzaG91bGQgaGF2ZSBhbiBpZC4iKSksYWMoYiwiYWN0aXZlZGVzY2VuZGFudCIsYSkpfTtnLldhPWZ1bmN0aW9uKGEpe3RoaXMuVCYmKHRoaXMuVz0hMCk7dmFyIGI9VGModGhpcyk7YiYmZGIoYikmJmViKGIpP2IuZm9jdXMoKTphLmooKX07Zy5jYj1mdW5jdGlvbigpe3RoaXMuVz0hMX07CmcuYWI9ZnVuY3Rpb24oYSl7YTp7dmFyIGI9YS50YXJnZXQ7aWYodGhpcy5PKWZvcih2YXIgYz10aGlzLmkoKTtiJiZiIT09Yzspe3ZhciBkPWIuaWQ7aWYoZCBpbiB0aGlzLk8pe2I9dGhpcy5PW2RdO2JyZWFrIGF9Yj1iLnBhcmVudE5vZGV9Yj1udWxsfWlmKGIpc3dpdGNoKGEudHlwZSl7Y2FzZSBLLmdhOmIuc2EoYSk7YnJlYWs7Y2FzZSBLLmhhOmNhc2UgSy5mYTpiLnZhKGEpO2JyZWFrO2Nhc2UgIm1vdXNlb3ZlciI6Yi51YShhKTticmVhaztjYXNlICJtb3VzZW91dCI6Yi50YShhKTticmVhaztjYXNlICJjb250ZXh0bWVudSI6Yi5jYShhKX19O2cuUGE9ZnVuY3Rpb24oKXt9O2cuVWE9ZnVuY3Rpb24oKXtYYyh0aGlzLC0xKTt0aGlzLlc9ITE7dGhpcy5CJiZPYyh0aGlzLkIsITEpfTsKZy5WYT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5pc0VuYWJsZWQoKSYmdGhpcy5pc1Zpc2libGUoKSYmKEgodGhpcykhPTB8fHRoaXMuS2EpJiZZYyh0aGlzLGEpPyhhLmooKSxhLnYoKSwhMCk6ITF9Owp2YXIgWWM9ZnVuY3Rpb24oYSxiKXt2YXIgYz1JKGEsYS5vKTtpZihjJiZ0eXBlb2YgYy5hYT09ImZ1bmN0aW9uIiYmYy5hYShiKXx8YS5CJiZhLkIhPWMmJnR5cGVvZiBhLkIuYWE9PSJmdW5jdGlvbiImJmEuQi5hYShiKSlyZXR1cm4hMDtpZihiLnNoaWZ0S2V5fHxiLmN0cmxLZXl8fGIubWV0YUtleXx8Yi5hbHRLZXkpcmV0dXJuITE7c3dpdGNoKGIuZyl7Y2FzZSAyNzpUYyhhKS5ibHVyKCk7YnJlYWs7Y2FzZSAzNjpaYyhhKTticmVhaztjYXNlIDM1OiRjKGEpO2JyZWFrO2Nhc2UgMzg6aWYoYS5MPT0idmVydGljYWwiKWFkKGEpO2Vsc2UgcmV0dXJuITE7YnJlYWs7Y2FzZSAzNzppZihhLkw9PSJob3Jpem9udGFsIilVYihhKT9iZChhKTphZChhKTtlbHNlIHJldHVybiExO2JyZWFrO2Nhc2UgNDA6aWYoYS5MPT0idmVydGljYWwiKWJkKGEpO2Vsc2UgcmV0dXJuITE7YnJlYWs7Y2FzZSAzOTppZihhLkw9PSJob3Jpem9udGFsIilVYihhKT9hZChhKTpiZChhKTtlbHNlIHJldHVybiExOwpicmVhaztkZWZhdWx0OnJldHVybiExfXJldHVybiEwfSxVYz1mdW5jdGlvbihhLGIpe3ZhciBjPWIuaSgpO2M9Yy5pZHx8KGMuaWQ9T2IoYikpO2EuT3x8KGEuTz17fSk7YS5PW2NdPWJ9O1YucHJvdG90eXBlLkJhPWZ1bmN0aW9uKGEsYil7dWEoYSxOLCJUaGUgY2hpbGQgb2YgYSBjb250YWluZXIgbXVzdCBiZSBhIGNvbnRyb2wiKTtWLmwuQmEuY2FsbCh0aGlzLGEsYil9O1YucHJvdG90eXBlLkNhPWZ1bmN0aW9uKGEsYixjKXt1YShhLE4pO2EuUHw9MjthLlB8PTY0O1BjKGEsMzIsITEpO2EucyYmMCE9YS5IYSYmTGMoYSwhMSk7YS5IYT0hMTt2YXIgZD1hLmg9PXRoaXM/VmIodGhpcyxhKTotMTtWLmwuQ2EuY2FsbCh0aGlzLGEsYixjKTthLnMmJnRoaXMucyYmVWModGhpcyxhKTthPWQ7YT09LTEmJihhPUgodGhpcykpO2E9PXRoaXMubz90aGlzLm89TWF0aC5taW4oSCh0aGlzKS0xLGIpOmE+dGhpcy5vJiZiPD10aGlzLm8/dGhpcy5vKys6YTx0aGlzLm8mJmI+dGhpcy5vJiZ0aGlzLm8tLX07CnZhciB6Yz1mdW5jdGlvbihhLGIpe2lmKGEuaSgpKXRocm93IEVycm9yKCJDb21wb25lbnQgYWxyZWFkeSByZW5kZXJlZCIpO2EuTD1ifTtWLnByb3RvdHlwZS5pc1Zpc2libGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5TfTt2YXIgVmM9ZnVuY3Rpb24oYSxiKXthLlM9Yjt2YXIgYz1hLmkoKTtjJiYoYy5zdHlsZS5kaXNwbGF5PWI/IiI6Im5vbmUiLHdjKFRjKGEpLGEuVCYmYS5TKSl9O1YucHJvdG90eXBlLmlzRW5hYmxlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLlR9O1YucHJvdG90eXBlLlg9ZnVuY3Rpb24oYSl7dGhpcy5UIT1hJiZFKHRoaXMsYT8iZW5hYmxlIjoiZGlzYWJsZSIpJiYoYT8odGhpcy5UPSEwLFRiKHRoaXMsZnVuY3Rpb24oYil7Yi5UYT9kZWxldGUgYi5UYTpiLlgoITApfSkpOihUYih0aGlzLGZ1bmN0aW9uKGIpe2IuaXNFbmFibGVkKCk/Yi5YKCExKTpiLlRhPSEwfSksdGhpcy5XPXRoaXMuVD0hMSksd2MoVGModGhpcyksYSYmdGhpcy5TKSl9Owp2YXIgWGM9ZnVuY3Rpb24oYSxiKXsoYj1JKGEsYikpP1AoYiwhMCk6YS5vPi0xJiZQKEkoYSxhLm8pLCExKX0sWmM9ZnVuY3Rpb24oYSl7Y2QoYSxmdW5jdGlvbihiLGMpe3JldHVybihiKzEpJWN9LEgoYSktMSl9LCRjPWZ1bmN0aW9uKGEpe2NkKGEsZnVuY3Rpb24oYixjKXtiLS07cmV0dXJuIGI8MD9jLTE6Yn0sMCl9LGJkPWZ1bmN0aW9uKGEpe2NkKGEsZnVuY3Rpb24oYixjKXtyZXR1cm4oYisxKSVjfSxhLm8pfSxhZD1mdW5jdGlvbihhKXtjZChhLGZ1bmN0aW9uKGIsYyl7Yi0tO3JldHVybiBiPDA/Yy0xOmJ9LGEubyl9LGNkPWZ1bmN0aW9uKGEsYixjKXtjPWM8MD9WYihhLGEuQik6Yzt2YXIgZD1IKGEpO2M9Yi5jYWxsKGEsYyxkKTtmb3IodmFyIGU9MDtlPD1kOyl7dmFyIGY9SShhLGMpO2lmKGYmJmYuaXNWaXNpYmxlKCkmJmYuaXNFbmFibGVkKCkmJmYuRCYyKXthLkxhKGMpO2JyZWFrfWUrKztjPWIuY2FsbChhLGMsZCl9fTsKVi5wcm90b3R5cGUuTGE9ZnVuY3Rpb24oYSl7WGModGhpcyxhKX07dmFyIGRkPWZ1bmN0aW9uKCl7fTtuKGRkLE0pO2lhKGRkKTtnPWRkLnByb3RvdHlwZTtnLk49ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy10YWIifTtnLk5hPWZ1bmN0aW9uKCl7cmV0dXJuInRhYiJ9O2cueGE9ZnVuY3Rpb24oYSl7dmFyIGI9ZGQubC54YS5jYWxsKHRoaXMsYSk7KGE9YS5HYSgpKSYmdGhpcy5NYShiLGEpO3JldHVybiBifTtnLnlhPWZ1bmN0aW9uKGEsYil7Yj1kZC5sLnlhLmNhbGwodGhpcyxhLGIpO3ZhciBjPXRoaXMuR2EoYik7YyYmKGEuUmE9Yyk7YS5tJjgmJihjPWEuaCkmJnR5cGVvZiBjLko9PT0iZnVuY3Rpb24iJiYoVChhLDgsITEpLGMuSihhKSk7cmV0dXJuIGJ9O2cuR2E9ZnVuY3Rpb24oYSl7cmV0dXJuIGEudGl0bGV8fCIifTtnLk1hPWZ1bmN0aW9uKGEsYil7YSYmKGEudGl0bGU9Ynx8IiIpfTt2YXIgZWQ9ZnVuY3Rpb24oYSxiLGMpe04uY2FsbCh0aGlzLGEsYnx8ZGQuVigpLGMpO1BjKHRoaXMsOCwhMCk7dGhpcy5QfD05fTtuKGVkLE4pO2VkLnByb3RvdHlwZS5HYT1mdW5jdGlvbigpe3JldHVybiB0aGlzLlJhfTtlZC5wcm90b3R5cGUuTWE9ZnVuY3Rpb24oYSl7dGhpcy52Lk1hKHRoaXMuaSgpLGEpO3RoaXMuUmE9YX07dGMoImdvb2ctdGFiIixmdW5jdGlvbigpe3JldHVybiBuZXcgZWQobnVsbCl9KTt2YXIgVz1mdW5jdGlvbigpe3RoaXMuQT0idGFibGlzdCJ9O24oVyx2Yyk7aWEoVyk7Vy5wcm90b3R5cGUuZz1mdW5jdGlvbigpe3JldHVybiJnb29nLXRhYi1iYXIifTtXLnByb3RvdHlwZS51PWZ1bmN0aW9uKGEsYixjKXt0aGlzLnZ8fCh0aGlzLmh8fGZkKHRoaXMpLHRoaXMudj1FYSh0aGlzLmgpKTt2YXIgZD10aGlzLnZbYl07ZD8oemMoYSxnZChkKSksYS52PWQpOlcubC51LmNhbGwodGhpcyxhLGIsYyl9O1cucHJvdG90eXBlLmo9ZnVuY3Rpb24oYSl7dmFyIGI9Vy5sLmouY2FsbCh0aGlzLGEpO3RoaXMuaHx8ZmQodGhpcyk7Yi5wdXNoKHRoaXMuaFthLnZdKTtyZXR1cm4gYn07dmFyIGZkPWZ1bmN0aW9uKGEpe3ZhciBiPWEuZygpO2EuaD17dG9wOmIrIi10b3AiLGJvdHRvbTpiKyItYm90dG9tIixzdGFydDpiKyItc3RhcnQiLGVuZDpiKyItZW5kIn19O3ZhciBYPWZ1bmN0aW9uKGEsYixjKXthPWF8fCJ0b3AiO3pjKHRoaXMsZ2QoYSkpO3RoaXMudj1hO1YuY2FsbCh0aGlzLHRoaXMuTCxifHxXLlYoKSxjKTtoZCh0aGlzKX07bihYLFYpO2c9WC5wcm90b3R5cGU7Zy5IPW51bGw7Zy5JPWZ1bmN0aW9uKCl7WC5sLkkuY2FsbCh0aGlzKTtoZCh0aGlzKX07Zy5DPWZ1bmN0aW9uKCl7WC5sLkMuY2FsbCh0aGlzKTt0aGlzLkg9bnVsbH07Zy5MYT1mdW5jdGlvbihhKXtYLmwuTGEuY2FsbCh0aGlzLGEpO3RoaXMuSihJKHRoaXMsYSkpfTtnLko9ZnVuY3Rpb24oYSl7YT9OYyhhLCEwKTp0aGlzLkgmJk5jKHRoaXMuSCwhMSl9Owp2YXIgaWQ9ZnVuY3Rpb24oYSxiKXtpZihiJiZiPT1hLkgpe2Zvcih2YXIgYz1WYihhLGIpLGQ9Yy0xO2I9SShhLGQpO2QtLSl7dmFyIGU9YjtpZihlLmlzVmlzaWJsZSgpJiZlLmlzRW5hYmxlZCgpKXthLkooYik7cmV0dXJufX1mb3IoYys9MTtiPUkoYSxjKTtjKyspaWYoZD1iLGQuaXNWaXNpYmxlKCkmJmQuaXNFbmFibGVkKCkpe2EuSihiKTtyZXR1cm59YS5KKG51bGwpfX07Zz1YLnByb3RvdHlwZTtnLmpiPWZ1bmN0aW9uKGEpe3RoaXMuSCYmdGhpcy5IIT1hLnRhcmdldCYmTmModGhpcy5ILCExKTt0aGlzLkg9YS50YXJnZXR9O2cua2I9ZnVuY3Rpb24oYSl7YS50YXJnZXQ9PXRoaXMuSCYmKHRoaXMuSD1udWxsKX07Zy5oYj1mdW5jdGlvbihhKXtpZCh0aGlzLGEudGFyZ2V0KX07Zy5pYj1mdW5jdGlvbihhKXtpZCh0aGlzLGEudGFyZ2V0KX07Zy5QYT1mdW5jdGlvbigpe0kodGhpcyx0aGlzLm8pfHxYYyh0aGlzLFZiKHRoaXMsdGhpcy5IfHxJKHRoaXMsMCkpKX07CnZhciBoZD1mdW5jdGlvbihhKXtCKEIoQihCKFFiKGEpLGEsInNlbGVjdCIsYS5qYiksYSwidW5zZWxlY3QiLGEua2IpLGEsImRpc2FibGUiLGEuaGIpLGEsImhpZGUiLGEuaWIpfSxnZD1mdW5jdGlvbihhKXtyZXR1cm4gYT09InN0YXJ0Inx8YT09ImVuZCI/InZlcnRpY2FsIjoiaG9yaXpvbnRhbCJ9O3RjKCJnb29nLXRhYi1iYXIiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBYfSk7ZnVuY3Rpb24gamQoYSl7dmFyIGI9e3RvcDoiYm90dG9tIixib3R0b206InRvcCIsc3RhcnQ6InJpZ2h0IixlbmQ6ImxlZnQifVthLmxvY2F0aW9uXSxjPWEuZWxlbWVudElkLGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTtkLnRleHRDb250ZW50PSJcbiAgICBmaWVsZHNldCB7XG4gICAgICBwYWRkaW5nOiAxMHB4O1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgIzM2OTtcbiAgICB9XG5cbiAgICAjIitjKyIgLmdvb2ctdGFiLWNvbnRlbnQge1xuICAgICAgbWluLWhlaWdodDogM2VtO1xuICAgICAgbWFyZ2luOiAwO1xuICAgICAgYm9yZGVyOiAiK2EuYm9yZGVyKyIgc29saWQgIithLmJvcmRlckNvbG9yKyI7XG4gICAgICBib3JkZXItdG9wOiAwO1xuICAgICAgaGVpZ2h0OiAiK2EuY29udGVudEhlaWdodCsiO1xuICAgICAgcGFkZGluZzogNHB4IDhweDtcbiAgICAgIG1hcmdpbi1yaWdodDogNHB4O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgIG92ZXJmbG93OiBhdXRvO1xuICAgIH1cblxuICAgICMiKwpjKyIgLmdvb2ctdGFiLWJhci0iK2EubG9jYXRpb24rIiAuZ29vZy10YWItc2VsZWN0ZWQge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICIrYS5ib3JkZXJDb2xvcisiO1xuICAgICAgYm9yZGVyLSIrYisiOiAwcHg7XG4gICAgfVxuXG4gICAgIyIrYysiIC5nb29nLXRhYi1iYXItIithLmxvY2F0aW9uKyIge1xuICAgICAgcGFkZGluZy0iK2EubG9jYXRpb24rIjogNXB4ICFpbXBvcnRhbnQ7XG4gICAgICBib3JkZXItIitiKyI6IDFweCBzb2xpZCAiK2EuYm9yZGVyQ29sb3IrIiAhaW1wb3J0YW50O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICB9XG5cbiAgICAjIitjKyIgLmdvb2ctdGFiLWJhciB7XG4gICAgICAgbWFyZ2luOiAwO1xuICAgICAgIGJvcmRlcjogMDtcbiAgICAgICBwYWRkaW5nOiAwO1xuICAgICAgIGxpc3Qtc3R5bGU6IG5vbmU7XG4gICAgICAgY3Vyc29yOiBkZWZhdWx0O1xuICAgICAgIG91dGxpbmU6IG5vbmU7XG4gICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgICBtYXJnaW4tcmlnaHQ6IDRweDtcbiAgICAgIH1cblxuICAgICAjIisKYysiIC5nb29nLXRhYiB7XG4gICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgIHBhZGRpbmc6IDRweCA4cHg7XG4gICAgICAgY29sb3I6IHZhcigtLWNvbGFiLXByaW1hcnktdGV4dC1jb2xvcik7XG4gICAgICAgdGV4dC1kZWNvcmF0aW9uOiBpbml0aWFsO1xuICAgICAgIGN1cnNvcjogZGVmYXVsdDtcbiAgICAgIH1cblxuICAgICAgIyIrYysiIC5nb29nLXRhYi1ob3ZlciB7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWNvbGFiLWhpZ2hsaWdodGVkLXN1cmZhY2UtY29sb3IpO1xuICAgICAgfVxuICAgICAgIjtyZXR1cm4gZH0KdmFyIGtkPWZ1bmN0aW9uKGEpe3ZhciBiPWEuZWxlbWVudElkLGM9YS50YWJOYW1lcyxkPWEuc2VsZWN0ZWRJbmRleDsiY29udGVudEJvcmRlciJpbiBhfHwoYS5jb250ZW50Qm9yZGVyPSIwcHgiKTsiY29udGVudEhlaWdodCJpbiBhfHwoYS5jb250ZW50SGVpZ2h0PSJpbml0aWFsIik7ImJvcmRlckNvbG9yImluIGF8fChhLmJvcmRlckNvbG9yPSJ2YXIoLS1jb2xhYi1ib3JkZXItY29sb3IpIik7YS5sb2NhdGlvbnx8KGEubG9jYXRpb249InRvcCIpO3ZhciBlPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiMiK2IpLGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zi5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYi1iYXIiKTt2YXIgaD1hLmxvY2F0aW9uO2YuY2xhc3NMaXN0LmFkZCgiZ29vZy10YWItYmFyLSIraCk7Zm9yKHZhciBrPVtdLHE9ZmEoYyksRz1xLm5leHQoKTshRy5kb25lO0c9cS5uZXh0KCkpe0c9Ry52YWx1ZTt2YXIgeD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKeC5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYiIpO3gudGV4dENvbnRlbnQ9RztmLmFwcGVuZENoaWxkKHgpO2sucHVzaCh4KX1oIT0iYm90dG9tIiYmZS5hcHBlbmRDaGlsZChmKTtxPW51bGw7aWYoaD09InRvcCJ8fGg9PSJib3R0b20iKXE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikscS5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYi1iYXItY2xlYXIiKTtoPT0idG9wIiYmcSYmZS5hcHBlbmRDaGlsZChxKTtHPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO0cuY2xhc3NMaXN0LmFkZCgiZ29vZy10YWItY29udGVudCIpO3ZhciBoYT1bXTtjPWZhKGMpO2Zvcih4PWMubmV4dCgpOyF4LmRvbmU7eD1jLm5leHQoKSl4PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHguaWQ9ZS5pZCsiX2NvbnRlbnRfIitoYS5sZW5ndGgseC5zdHlsZS5kaXNwbGF5PSJub25lIixHLmFwcGVuZENoaWxkKHgpLGhhLnB1c2goeCk7ZS5hcHBlbmRDaGlsZChHKTtoPT0iYm90dG9tIiYmKHEmJgplLmFwcGVuZENoaWxkKHEpLGUuYXBwZW5kQ2hpbGQoZikpO3ZhciBRPW5ldyBYKGgpO1NiKFEsZik7dmFyIFI9LTE7d2IoUSwic2VsZWN0IixmdW5jdGlvbihTKXtTPWsuaW5kZXhPZihTLnRhcmdldC5pKCkpO1MhPVImJihSPj0wJiZSPGhhLmxlbmd0aCYmKGhhW1JdLnN0eWxlLmRpc3BsYXk9Im5vbmUiLFI9LTEpLFM+PTAmJlM8aGEubGVuZ3RoJiYoUj1TLGhhW1JdLnN0eWxlLmRpc3BsYXk9ImlubGluZSIsd2luZG93LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCJyZXNpemUiKSksZ29vZ2xlLmNvbGFiLm91dHB1dC5yZXNpemVJZnJhbWVUb0NvbnRlbnQoKSksUS5KKEkoUSxSKSkpfSk7US5KKEkoUSxkKSk7d2luZG93W2JdPXtzZXRTZWxlY3RlZFRhYkluZGV4OmZ1bmN0aW9uKFMpe1EuSihJKFEsUykpfX07ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChqZChhKSl9LGxkPVsiY29sYWJfbGliIiwiY3JlYXRlVGFiQmFyIl0sWT1sOwpsZFswXWluIFl8fHR5cGVvZiBZLmV4ZWNTY3JpcHQ9PSJ1bmRlZmluZWQifHxZLmV4ZWNTY3JpcHQoInZhciAiK2xkWzBdKTtmb3IodmFyIFo7bGQubGVuZ3RoJiYoWj1sZC5zaGlmdCgpKTspbGQubGVuZ3RofHxrZD09PXZvaWQgMD9ZW1pdJiZZW1pdIT09T2JqZWN0LnByb3RvdHlwZVtaXT9ZPVlbWl06WT1ZW1pdPXt9OllbWl09a2Q7fSkuY2FsbCh0aGlzKTsKLy8gY2xhbmctZm9ybWF0IG9uCg==", + "ok": true, + "headers": [ + [ + "content-length", + "41785" + ], + [ + "content-type", + "application/javascript" + ] + ], + "status": 200, + "status_text": "" + } + }, + "base_uri": "https://localhost:8080/", + "height": 260 + }, + "outputId": "c0a0d3b9-7a31-44e2-8668-46666a34e728" + }, + "source": [ + "%%logica EmployeeName, Engineer, EngineersAndProductManagers\n", + "\n", + "Employee(name: \"Alice\", role: \"Product Manager\");\n", + "Employee(name: \"Bob\", role: \"Engineer\");\n", + "Employee(name: \"Caroline\", role: \"Engineer\");\n", + "Employee(name: \"David\", role: \"Data Scientist\");\n", + "Employee(name: \"Eve\", role: \"Data Scientist\");\n", + "\n", + "EmployeeName(name:) :- Employee(name:);\n", + "\n", + "Engineer(name:) :- Employee(name:, role: \"Engineer\");\n", + "\n", + "EngineersAndProductManagers(name:) :-\n", + " Employee(name:, role:),\n", + " role == \"Engineer\" || role == \"Product Manager\";\n" + ], + "execution_count": 11, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e98584e4-d22c-11ef-a7c0-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id14\", \"tabNames\": [\"EmployeeName\", \"Engineer\", \"EngineersAndProductManagers\", \"(Log)\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_1f310888d8" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e985ec5e-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id14\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_0354f50e45" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e98791c6-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_deb49601d4" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e987db22-d22c-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id14_content_3\");\n", + "//# sourceURL=js_5dad3ab4cf" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e98821a4-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"e987db22-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_8dc78f212e" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e988d9e6-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id14\"].setSelectedTabIndex(3);\n", + "//# sourceURL=js_3e5ba3f1e0" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e98c29fc-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"e98791c6-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_2c747bf314" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e98e8c24-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_07a24b49c2" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e98eed5e-d22c-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id14_content_0\");\n", + "//# sourceURL=js_f944e60378" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e98f6702-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"e98eed5e-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_cd4d1e3e01" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e98fc404-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id14\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_9760f120b4" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e9922c12-d22c-11ef-a7c0-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id15\", \"tabNames\": [\"SQL\", \"Result\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_58d90e8f8e" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e992a188-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id15\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_3093352514" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e994970e-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_2a79ea39ea" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e994f49c-d22c-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id15_content_0\");\n", + "//# sourceURL=js_fc1638314f" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e99563e6-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"e994f49c-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_1c9e7fac81" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e995c0e8-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id15\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_05adec46ae" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The following query is stored at \u001b[1mEmployeeName_sql\u001b[0m variable.\n", + "-- Initializing DuckDB environment.\n", + "create schema if not exists logica_home;\n", + "-- Empty record, has to have a field by DuckDB syntax.\n", + "drop type if exists logicarecord893574736 cascade; create type logicarecord893574736 as struct(nirvana numeric);\n", + "create sequence if not exists eternal_logical_sequence;\n", + "\n", + "\n", + "-- Logica type: logicarecord481217614\n", + "drop type if exists logicarecord481217614 cascade; create type logicarecord481217614 as struct(r logicarecord893574736);\n", + "\n", + "-- Logica type: logicarecord383307722\n", + "drop type if exists logicarecord383307722 cascade; create type logicarecord383307722 as struct(a timestamp);\n", + "WITH t_0_Employee AS (SELECT * FROM (\n", + " \n", + " SELECT\n", + " 'Alice' AS name,\n", + " 'Product Manager' AS role\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " 'Bob' AS name,\n", + " 'Engineer' AS role\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " 'Caroline' AS name,\n", + " 'Engineer' AS role\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " 'David' AS name,\n", + " 'Data Scientist' AS role\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " 'Eve' AS name,\n", + " 'Data Scientist' AS role\n", + " \n", + ") AS UNUSED_TABLE_NAME )\n", + "SELECT\n", + " Employee.name AS name\n", + "FROM\n", + " t_0_Employee AS Employee;\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e997151a-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"e994970e-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_ae107932e1" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e99ab788-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_c9a505f8b3" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e99afaea-d22c-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id15_content_1\");\n", + "//# sourceURL=js_5dcc4851bc" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e99b4374-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"e99afaea-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_62a68a0c45" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e99bf29c-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id15\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_6dc0820dc7" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The following table is stored at \u001b[1mEmployeeName\u001b[0m variable.\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
name
0Alice
1Bob
2Caroline
3David
4Eve
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e99fbb3e-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"e99ab788-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_ae2c818bc4" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e9a2d292-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"e98e8c24-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_5f1dadf056" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e9a4cdea-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_7cb6ade38b" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e9a51f5c-d22c-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id14_content_3\");\n", + "//# sourceURL=js_fee0ba40fd" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e9a68ad6-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"e9a51f5c-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_e81f04f7a6" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e9a73ec2-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id14\"].setSelectedTabIndex(3);\n", + "//# sourceURL=js_4da4debbeb" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e9ac2392-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"e9a4cdea-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_5dd5da94d7" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e9afd208-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_a58df66886" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e9b06fec-d22c-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id14_content_1\");\n", + "//# sourceURL=js_29a7f33451" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e9b0f71e-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"e9b06fec-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_6fde0361fa" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e9b180bc-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id14\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_b0610beba2" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e9b54bca-d22c-11ef-a7c0-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id16\", \"tabNames\": [\"SQL\", \"Result\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_fb8ab857f8" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e9b604e8-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id16\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_b73916f00d" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e9b7c846-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_4dd4295bc3" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e9b81300-d22c-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id16_content_0\");\n", + "//# sourceURL=js_5c9f444da0" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e9b858ec-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"e9b81300-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_5d327654de" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e9b89dd4-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id16\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_dc8743c4ba" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The following query is stored at \u001b[1mEngineer_sql\u001b[0m variable.\n", + "-- Initializing DuckDB environment.\n", + "create schema if not exists logica_home;\n", + "-- Empty record, has to have a field by DuckDB syntax.\n", + "drop type if exists logicarecord893574736 cascade; create type logicarecord893574736 as struct(nirvana numeric);\n", + "create sequence if not exists eternal_logical_sequence;\n", + "\n", + "\n", + "-- Logica type: logicarecord481217614\n", + "drop type if exists logicarecord481217614 cascade; create type logicarecord481217614 as struct(r logicarecord893574736);\n", + "\n", + "-- Logica type: logicarecord383307722\n", + "drop type if exists logicarecord383307722 cascade; create type logicarecord383307722 as struct(a timestamp);\n", + "WITH t_0_Employee AS (SELECT * FROM (\n", + " \n", + " SELECT\n", + " 'Alice' AS name,\n", + " 'Product Manager' AS role\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " 'Bob' AS name,\n", + " 'Engineer' AS role\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " 'Caroline' AS name,\n", + " 'Engineer' AS role\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " 'David' AS name,\n", + " 'Data Scientist' AS role\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " 'Eve' AS name,\n", + " 'Data Scientist' AS role\n", + " \n", + ") AS UNUSED_TABLE_NAME )\n", + "SELECT\n", + " Employee.name AS name\n", + "FROM\n", + " t_0_Employee AS Employee\n", + "WHERE\n", + " (Employee.role = 'Engineer');\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e9ba8c5c-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"e9b7c846-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_92cf17c022" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e9bd1f12-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_7ee852354d" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e9bdc17e-d22c-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id16_content_1\");\n", + "//# sourceURL=js_24263b2f8c" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e9be673c-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"e9bdc17e-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_8547b6c7bb" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e9beb4c6-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id16\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_e1bfdf4114" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The following table is stored at \u001b[1mEngineer\u001b[0m variable.\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
name
0Bob
1Caroline
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e9c049bc-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"e9bd1f12-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_8aa70841a2" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e9c26cb0-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"e9afd208-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_33f92d1ddd" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e9c54926-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_976802a577" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e9c5a952-d22c-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id14_content_3\");\n", + "//# sourceURL=js_a6629a13f1" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e9c5f452-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"e9c5a952-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_c0850d0813" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e9c64042-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id14\"].setSelectedTabIndex(3);\n", + "//# sourceURL=js_69e0648b48" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e9ce0ee4-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"e9c54926-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_0386c3ca25" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e9d00e74-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_98dd4f8f91" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e9d05ba4-d22c-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id14_content_2\");\n", + "//# sourceURL=js_99733e9291" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e9d11594-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"e9d05ba4-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_d7bcb94c52" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e9d1a8c4-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id14\"].setSelectedTabIndex(2);\n", + "//# sourceURL=js_efee3093b8" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e9d48864-d22c-11ef-a7c0-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id17\", \"tabNames\": [\"SQL\", \"Result\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_648ce8f901" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e9d579cc-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id17\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_7c354ae5a4" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e9d7ca10-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_1ac110728c" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e9d81baa-d22c-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id17_content_0\");\n", + "//# sourceURL=js_f6a0e6d012" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e9d8bc4a-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"e9d81baa-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_c99f4e81b6" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e9d9051a-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id17\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_3ee4f87206" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The following query is stored at \u001b[1mEngineersAndProductManagers_sql\u001b[0m variable.\n", + "-- Initializing DuckDB environment.\n", + "create schema if not exists logica_home;\n", + "-- Empty record, has to have a field by DuckDB syntax.\n", + "drop type if exists logicarecord893574736 cascade; create type logicarecord893574736 as struct(nirvana numeric);\n", + "create sequence if not exists eternal_logical_sequence;\n", + "\n", + "\n", + "-- Logica type: logicarecord481217614\n", + "drop type if exists logicarecord481217614 cascade; create type logicarecord481217614 as struct(r logicarecord893574736);\n", + "\n", + "-- Logica type: logicarecord383307722\n", + "drop type if exists logicarecord383307722 cascade; create type logicarecord383307722 as struct(a timestamp);\n", + "WITH t_0_Employee AS (SELECT * FROM (\n", + " \n", + " SELECT\n", + " 'Alice' AS name,\n", + " 'Product Manager' AS role\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " 'Bob' AS name,\n", + " 'Engineer' AS role\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " 'Caroline' AS name,\n", + " 'Engineer' AS role\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " 'David' AS name,\n", + " 'Data Scientist' AS role\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " 'Eve' AS name,\n", + " 'Data Scientist' AS role\n", + " \n", + ") AS UNUSED_TABLE_NAME )\n", + "SELECT\n", + " Employee.name AS name\n", + "FROM\n", + " t_0_Employee AS Employee\n", + "WHERE\n", + " ((Employee.role = 'Engineer') OR (Employee.role = 'Product Manager'));\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e9dab4e6-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"e9d7ca10-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_0ea62fc8af" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e9ddce38-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_7686277f87" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e9de1848-d22c-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id17_content_1\");\n", + "//# sourceURL=js_6244b03a58" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e9deaef2-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"e9de1848-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_2cc5246974" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e9df4416-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id17\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_3f464a0328" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The following table is stored at \u001b[1mEngineersAndProductManagers\u001b[0m variable.\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
name
0Alice
1Bob
2Caroline
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e9e165fc-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"e9ddce38-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_7e543bc27a" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e9e3b0fa-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"e9d00e74-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_eb14b9e27d" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e9e6272c-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_51ead33237" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e9e678e4-d22c-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id14_content_3\");\n", + "//# sourceURL=js_6e89ad6e85" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e9e71f88-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"e9e678e4-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_ede82f649a" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"e9e7ac46-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id14\"].setSelectedTabIndex(3);\n", + "//# sourceURL=js_076894a180" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "image/svg+xml": "\n\n\n\n\n\nConcertina\n\n\n\nEngineer\n\nEngineer\n\n\n\nEmployeeName\n\nEmployeeName\n\n\n\nEngineersAndProductManagers\n\nEngineersAndProductManagers\n\n\n\n", + "text/plain": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Running predicate: Engineer (7 ms)\n", + "Running predicate: EmployeeName (6 ms)\n", + "Running predicate: EngineersAndProductManagers (5 ms)\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"ea198c8e-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"e9e6272c-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_ff151d101a" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"ea1c386c-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_6af4fd3f1f" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"ea1c9e10-d22c-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id14_content_0\");\n", + "//# sourceURL=js_6bc56590bd" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"ea1d6bc4-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"ea1c9e10-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_d8dbc3b2e2" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"ea1ddf50-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id14\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_3b602b28dd" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"ea211f76-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_cca0db676c" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"ea219834-d22c-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id15_content_1\");\n", + "//# sourceURL=js_a318382a24" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"ea22045e-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"ea219834-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_37d9b9dddf" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"ea226a7a-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id15\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_9d6f8e7bbb" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"ea249584-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"ea211f76-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_de909758b2" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + " \n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"ea26ca48-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"ea1c386c-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_613e406686" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"ea289ed6-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_f943ba0772" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"ea28f516-d22c-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id14_content_1\");\n", + "//# sourceURL=js_be79fe3b55" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"ea294a66-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"ea28f516-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_475ac98df8" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"ea29a7fe-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id14\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_58b53d667e" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"ea2b0626-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_997d9ee1cf" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"ea2b5a68-d22c-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id16_content_1\");\n", + "//# sourceURL=js_094e9137df" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"ea2bab6c-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"ea2b5a68-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_dd08ef07db" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"ea2bfbda-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id16\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_be2f2caf9d" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"ea2d9fe4-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"ea2b0626-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_8d08d9a743" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + " \n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"ea2f3ce6-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"ea289ed6-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_11061f0f73" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"ea317f60-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_ebf110226d" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"ea31e2de-d22c-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id14_content_2\");\n", + "//# sourceURL=js_409eabde5e" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"ea32370c-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"ea31e2de-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_7a38d14aff" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"ea32890a-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id14\"].setSelectedTabIndex(2);\n", + "//# sourceURL=js_009ececf26" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"ea33d9f4-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_c3557cc503" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"ea342b3e-d22c-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id17_content_1\");\n", + "//# sourceURL=js_9453dc0b92" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"ea347f80-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"ea342b3e-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_f1340de020" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"ea34c0ee-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id17\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_5c8e759255" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"ea429692-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"ea33d9f4-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_e1be4fb30a" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + " \n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"ea45b1d8-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"ea317f60-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_84f07edcc4" + ] + }, + "metadata": {} + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "xEu_i145iV-b" + }, + "source": [ + "Fields of the structure are accessed with `.` notation." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "ZTFcMOz3ie2g", + "outputId": "99214b7b-1444-43ef-ffd3-45302da23827", + "colab": { + "resources": { + "http://localhost:8080/nbextensions/google.colab/tabbar.css": { + "data": "Lmdvb2ctdGFie3Bvc2l0aW9uOnJlbGF0aXZlO3BhZGRpbmc6NHB4IDhweDtjb2xvcjojMDBjO3RleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7Y3Vyc29yOmRlZmF1bHR9Lmdvb2ctdGFiLWJhci10b3AgLmdvb2ctdGFie21hcmdpbjoxcHggNHB4IDAgMDtib3JkZXItYm90dG9tOjA7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLXRvcDphZnRlciwuZ29vZy10YWItYmFyLWJvdHRvbTphZnRlcntjb250ZW50OiIgIjtkaXNwbGF5OmJsb2NrO2hlaWdodDowO2NsZWFyOmJvdGg7dmlzaWJpbGl0eTpoaWRkZW59Lmdvb2ctdGFiLWJhci1ib3R0b20gLmdvb2ctdGFie21hcmdpbjowIDRweCAxcHggMDtib3JkZXItdG9wOjA7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLXN0YXJ0IC5nb29nLXRhYnttYXJnaW46MCAwIDRweCAxcHg7Ym9yZGVyLXJpZ2h0OjB9Lmdvb2ctdGFiLWJhci1lbmQgLmdvb2ctdGFie21hcmdpbjowIDFweCA0cHggMDtib3JkZXItbGVmdDowfS5nb29nLXRhYi1ob3ZlcntiYWNrZ3JvdW5kOiNlZWV9Lmdvb2ctdGFiLWRpc2FibGVke2NvbG9yOiM2NjZ9Lmdvb2ctdGFiLXNlbGVjdGVke2NvbG9yOiMwMDA7YmFja2dyb3VuZDojZmZmO3RleHQtZGVjb3JhdGlvbjpub25lO2ZvbnQtd2VpZ2h0OmJvbGQ7Ym9yZGVyOjFweCBzb2xpZCAjNmI5MGRhfS5nb29nLXRhYi1iYXItdG9we3BhZGRpbmctdG9wOjVweCFpbXBvcnRhbnQ7cGFkZGluZy1sZWZ0OjVweCFpbXBvcnRhbnQ7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgIzZiOTBkYSFpbXBvcnRhbnR9Lmdvb2ctdGFiLWJhci10b3AgLmdvb2ctdGFiLXNlbGVjdGVke3RvcDoxcHg7bWFyZ2luLXRvcDowO3BhZGRpbmctYm90dG9tOjVweH0uZ29vZy10YWItYmFyLWJvdHRvbSAuZ29vZy10YWItc2VsZWN0ZWR7dG9wOi0xcHg7bWFyZ2luLWJvdHRvbTowO3BhZGRpbmctdG9wOjVweH0uZ29vZy10YWItYmFyLXN0YXJ0IC5nb29nLXRhYi1zZWxlY3RlZHtsZWZ0OjFweDttYXJnaW4tbGVmdDowO3BhZGRpbmctcmlnaHQ6OXB4fS5nb29nLXRhYi1iYXItZW5kIC5nb29nLXRhYi1zZWxlY3RlZHtsZWZ0Oi0xcHg7bWFyZ2luLXJpZ2h0OjA7cGFkZGluZy1sZWZ0OjlweH0uZ29vZy10YWItYmFye21hcmdpbjowO2JvcmRlcjowO3BhZGRpbmc6MDtsaXN0LXN0eWxlOm5vbmU7Y3Vyc29yOmRlZmF1bHQ7b3V0bGluZTpub25lO2JhY2tncm91bmQ6I2ViZWZmOX0uZ29vZy10YWItYmFyLWNsZWFye2NsZWFyOmJvdGg7aGVpZ2h0OjA7b3ZlcmZsb3c6aGlkZGVufS5nb29nLXRhYi1iYXItc3RhcnR7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLWVuZHtmbG9hdDpyaWdodH0qIGh0bWwgLmdvb2ctdGFiLWJhci1zdGFydHttYXJnaW4tcmlnaHQ6LTNweH0qIGh0bWwgLmdvb2ctdGFiLWJhci1lbmR7bWFyZ2luLWxlZnQ6LTNweH1zZW50aW5lbHt9", + "ok": true, + "headers": [ + [ + "content-length", + "1404" + ], + [ + "content-type", + "text/css" + ] + ], + "status": 200, + "status_text": "" + }, + "http://localhost:8080/nbextensions/google.colab/tabbar_main.min.js": { + "data": "Ly8gY2xhbmctZm9ybWF0IG9mZgooZnVuY3Rpb24oKXt2YXIgZyxhYT1mdW5jdGlvbihhKXt2YXIgYj0wO3JldHVybiBmdW5jdGlvbigpe3JldHVybiBiPGEubGVuZ3RoP3tkb25lOiExLHZhbHVlOmFbYisrXX06e2RvbmU6ITB9fX0sYmE9dHlwZW9mIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzPT0iZnVuY3Rpb24iP09iamVjdC5kZWZpbmVQcm9wZXJ0eTpmdW5jdGlvbihhLGIsYyl7aWYoYT09QXJyYXkucHJvdG90eXBlfHxhPT1PYmplY3QucHJvdG90eXBlKXJldHVybiBhO2FbYl09Yy52YWx1ZTtyZXR1cm4gYX0sY2E9ZnVuY3Rpb24oYSl7YT1bIm9iamVjdCI9PXR5cGVvZiBnbG9iYWxUaGlzJiZnbG9iYWxUaGlzLGEsIm9iamVjdCI9PXR5cGVvZiB3aW5kb3cmJndpbmRvdywib2JqZWN0Ij09dHlwZW9mIHNlbGYmJnNlbGYsIm9iamVjdCI9PXR5cGVvZiBnbG9iYWwmJmdsb2JhbF07Zm9yKHZhciBiPTA7YjxhLmxlbmd0aDsrK2Ipe3ZhciBjPWFbYl07aWYoYyYmYy5NYXRoPT1NYXRoKXJldHVybiBjfXRocm93IEVycm9yKCJDYW5ub3QgZmluZCBnbG9iYWwgb2JqZWN0Iik7Cn0sZGE9Y2EodGhpcyksZWE9ZnVuY3Rpb24oYSxiKXtpZihiKWE6e3ZhciBjPWRhO2E9YS5zcGxpdCgiLiIpO2Zvcih2YXIgZD0wO2Q8YS5sZW5ndGgtMTtkKyspe3ZhciBlPWFbZF07aWYoIShlIGluIGMpKWJyZWFrIGE7Yz1jW2VdfWE9YVthLmxlbmd0aC0xXTtkPWNbYV07Yj1iKGQpO2IhPWQmJmIhPW51bGwmJmJhKGMsYSx7Y29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOmJ9KX19OwplYSgiU3ltYm9sIixmdW5jdGlvbihhKXtpZihhKXJldHVybiBhO3ZhciBiPWZ1bmN0aW9uKGYsaCl7dGhpcy5nPWY7YmEodGhpcywiZGVzY3JpcHRpb24iLHtjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6aH0pfTtiLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmd9O3ZhciBjPSJqc2NvbXBfc3ltYm9sXyIrKE1hdGgucmFuZG9tKCkqMUU5Pj4+MCkrIl8iLGQ9MCxlPWZ1bmN0aW9uKGYpe2lmKHRoaXMgaW5zdGFuY2VvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoIlN5bWJvbCBpcyBub3QgYSBjb25zdHJ1Y3RvciIpO3JldHVybiBuZXcgYihjKyhmfHwiIikrIl8iK2QrKyxmKX07cmV0dXJuIGV9KTsKdmFyIGZhPWZ1bmN0aW9uKGEpe3ZhciBiPXR5cGVvZiBTeW1ib2whPSJ1bmRlZmluZWQiJiZTeW1ib2wuaXRlcmF0b3ImJmFbU3ltYm9sLml0ZXJhdG9yXTtpZihiKXJldHVybiBiLmNhbGwoYSk7aWYodHlwZW9mIGEubGVuZ3RoPT0ibnVtYmVyIilyZXR1cm57bmV4dDphYShhKX07dGhyb3cgRXJyb3IoU3RyaW5nKGEpKyIgaXMgbm90IGFuIGl0ZXJhYmxlIG9yIEFycmF5TGlrZSIpO307ZWEoIlN5bWJvbC5kaXNwb3NlIixmdW5jdGlvbihhKXtyZXR1cm4gYT9hOlN5bWJvbCgiU3ltYm9sLmRpc3Bvc2UiKX0pOy8qCgogQ29weXJpZ2h0IFRoZSBDbG9zdXJlIExpYnJhcnkgQXV0aG9ycy4KIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wCiovCnZhciBsPXRoaXN8fHNlbGYsaWE9ZnVuY3Rpb24oYSl7YS5JYT12b2lkIDA7YS5WPWZ1bmN0aW9uKCl7cmV0dXJuIGEuSWE/YS5JYTphLklhPW5ldyBhfX0samE9ZnVuY3Rpb24oYSl7dmFyIGI9dHlwZW9mIGE7cmV0dXJuIGIhPSJvYmplY3QiP2I6YT9BcnJheS5pc0FycmF5KGEpPyJhcnJheSI6YjoibnVsbCJ9LGthPWZ1bmN0aW9uKGEpe3ZhciBiPWphKGEpO3JldHVybiBiPT0iYXJyYXkifHxiPT0ib2JqZWN0IiYmdHlwZW9mIGEubGVuZ3RoPT0ibnVtYmVyIn0sbT1mdW5jdGlvbihhKXt2YXIgYj10eXBlb2YgYTtyZXR1cm4gYj09Im9iamVjdCImJmEhPW51bGx8fGI9PSJmdW5jdGlvbiJ9LG5hPWZ1bmN0aW9uKGEpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYSxsYSkmJmFbbGFdfHwoYVtsYV09KyttYSl9LGxhPSJjbG9zdXJlX3VpZF8iKyhNYXRoLnJhbmRvbSgpKjFFOT4+PjApLG1hPTAsbj1mdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoKXt9Yy5wcm90b3R5cGU9CmIucHJvdG90eXBlO2EubD1iLnByb3RvdHlwZTthLnByb3RvdHlwZT1uZXcgYzthLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1hO2EucWQ9ZnVuY3Rpb24oZCxlLGYpe2Zvcih2YXIgaD1BcnJheShhcmd1bWVudHMubGVuZ3RoLTIpLGs9MjtrPGFyZ3VtZW50cy5sZW5ndGg7aysrKWhbay0yXT1hcmd1bWVudHNba107cmV0dXJuIGIucHJvdG90eXBlW2VdLmFwcGx5KGQsaCl9fTtmdW5jdGlvbiBvYShhLGIpe2lmKEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKUVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsb2EpO2Vsc2V7dmFyIGM9RXJyb3IoKS5zdGFjaztjJiYodGhpcy5zdGFjaz1jKX1hJiYodGhpcy5tZXNzYWdlPVN0cmluZyhhKSk7YiE9PXZvaWQgMCYmKHRoaXMuY2F1c2U9Yil9bihvYSxFcnJvcik7b2EucHJvdG90eXBlLm5hbWU9IkN1c3RvbUVycm9yIjt2YXIgcGE7ZnVuY3Rpb24gcWEoYSxiKXthPWEuc3BsaXQoIiVzIik7Zm9yKHZhciBjPSIiLGQ9YS5sZW5ndGgtMSxlPTA7ZTxkO2UrKyljKz1hW2VdKyhlPGIubGVuZ3RoP2JbZV06IiVzIik7b2EuY2FsbCh0aGlzLGMrYVtkXSl9bihxYSxvYSk7cWEucHJvdG90eXBlLm5hbWU9IkFzc2VydGlvbkVycm9yIjtmdW5jdGlvbiByYShhLGIsYyxkKXt2YXIgZT0iQXNzZXJ0aW9uIGZhaWxlZCI7aWYoYyl7ZSs9IjogIitjO3ZhciBmPWR9ZWxzZSBhJiYoZSs9IjogIithLGY9Yik7dGhyb3cgbmV3IHFhKCIiK2UsZnx8W10pO30KdmFyIHA9ZnVuY3Rpb24oYSxiLGMpe2F8fHJhKCIiLG51bGwsYixBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMikpO3JldHVybiBhfSxzYT1mdW5jdGlvbihhLGIsYyl7bShhKSYmYS5ub2RlVHlwZT09MXx8cmEoIkV4cGVjdGVkIEVsZW1lbnQgYnV0IGdvdCAlczogJXMuIixbamEoYSksYV0sYixBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMikpfSx1YT1mdW5jdGlvbihhLGIsYyxkKXthIGluc3RhbmNlb2YgYnx8cmEoIkV4cGVjdGVkIGluc3RhbmNlb2YgJXMgYnV0IGdvdCAlcy4iLFt0YShiKSx0YShhKV0sYyxBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMykpfTsKZnVuY3Rpb24gdGEoYSl7cmV0dXJuIGEgaW5zdGFuY2VvZiBGdW5jdGlvbj9hLmRpc3BsYXlOYW1lfHxhLm5hbWV8fCJ1bmtub3duIHR5cGUgbmFtZSI6YSBpbnN0YW5jZW9mIE9iamVjdD9hLmNvbnN0cnVjdG9yLmRpc3BsYXlOYW1lfHxhLmNvbnN0cnVjdG9yLm5hbWV8fE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhKTphPT09bnVsbD8ibnVsbCI6dHlwZW9mIGF9O3ZhciB2YT1BcnJheS5wcm90b3R5cGUuaW5kZXhPZj9mdW5jdGlvbihhLGIpe3AoYS5sZW5ndGghPW51bGwpO3JldHVybiBBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKGEsYix2b2lkIDApfTpmdW5jdGlvbihhLGIpe2lmKHR5cGVvZiBhPT09InN0cmluZyIpcmV0dXJuIHR5cGVvZiBiIT09InN0cmluZyJ8fGIubGVuZ3RoIT0xPy0xOmEuaW5kZXhPZihiLDApO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWlmKGMgaW4gYSYmYVtjXT09PWIpcmV0dXJuIGM7cmV0dXJuLTF9LHdhPUFycmF5LnByb3RvdHlwZS5mb3JFYWNoP2Z1bmN0aW9uKGEsYil7cChhLmxlbmd0aCE9bnVsbCk7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChhLGIsdm9pZCAwKX06ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9YS5sZW5ndGgsZD10eXBlb2YgYT09PSJzdHJpbmciP2Euc3BsaXQoIiIpOmEsZT0wO2U8YztlKyspZSBpbiBkJiZiLmNhbGwodm9pZCAwLGRbZV0sZSxhKX07CmZ1bmN0aW9uIHhhKGEsYil7Yj12YShhLGIpO3ZhciBjO2lmKGM9Yj49MClwKGEubGVuZ3RoIT1udWxsKSxBcnJheS5wcm90b3R5cGUuc3BsaWNlLmNhbGwoYSxiLDEpO3JldHVybiBjfWZ1bmN0aW9uIHlhKGEpe3ZhciBiPWEubGVuZ3RoO2lmKGI+MCl7Zm9yKHZhciBjPUFycmF5KGIpLGQ9MDtkPGI7ZCsrKWNbZF09YVtkXTtyZXR1cm4gY31yZXR1cm5bXX1mdW5jdGlvbiB6YShhLGIsYyxkKXtwKGEubGVuZ3RoIT1udWxsKTtBcnJheS5wcm90b3R5cGUuc3BsaWNlLmFwcGx5KGEsQWEoYXJndW1lbnRzLDEpKX1mdW5jdGlvbiBBYShhLGIsYyl7cChhLmxlbmd0aCE9bnVsbCk7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg8PTI/QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYSxiKTpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhLGIsYyl9O2Z1bmN0aW9uIEJhKGEsYixjKXtmb3IodmFyIGQgaW4gYSliLmNhbGwoYyxhW2RdLGQsYSl9ZnVuY3Rpb24gQ2EoYSxiKXtmb3IodmFyIGMgaW4gYSlpZihhW2NdPT1iKXJldHVybiEwO3JldHVybiExfWZ1bmN0aW9uIERhKGEsYixjKXtpZihhIT09bnVsbCYmYiBpbiBhKXRocm93IEVycm9yKCdUaGUgb2JqZWN0IGFscmVhZHkgY29udGFpbnMgdGhlIGtleSAiJytiKyciJyk7YVtiXT1jfWZ1bmN0aW9uIEVhKGEpe3ZhciBiPXt9LGM7Zm9yKGMgaW4gYSliW2FbY11dPWM7cmV0dXJuIGJ9dmFyIEZhPSJjb25zdHJ1Y3RvciBoYXNPd25Qcm9wZXJ0eSBpc1Byb3RvdHlwZU9mIHByb3BlcnR5SXNFbnVtZXJhYmxlIHRvTG9jYWxlU3RyaW5nIHRvU3RyaW5nIHZhbHVlT2YiLnNwbGl0KCIgIik7CmZ1bmN0aW9uIEdhKGEsYil7Zm9yKHZhciBjLGQsZT0xO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspe2Q9YXJndW1lbnRzW2VdO2ZvcihjIGluIGQpYVtjXT1kW2NdO2Zvcih2YXIgZj0wO2Y8RmEubGVuZ3RoO2YrKyljPUZhW2ZdLE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChkLGMpJiYoYVtjXT1kW2NdKX19O3ZhciBIYT1TdHJpbmcucHJvdG90eXBlLnRyaW0/ZnVuY3Rpb24oYSl7cmV0dXJuIGEudHJpbSgpfTpmdW5jdGlvbihhKXtyZXR1cm4vXltcc1x4YTBdKihbXHNcU10qPylbXHNceGEwXSokLy5leGVjKGEpWzFdfTsvKgoKIENvcHlyaWdodCBHb29nbGUgTExDCiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMAoqLwp2YXIgSWE9e307dmFyIEphPWZ1bmN0aW9uKGEpe2lmKElhIT09SWEpdGhyb3cgRXJyb3IoIkJhZCBzZWNyZXQiKTt0aGlzLmc9YX07SmEucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ307bmV3IEphKCJhYm91dDpibGFuayIpO25ldyBKYSgiYWJvdXQ6aW52YWxpZCN6Q2xvc3VyZXoiKTt2YXIgS2E9W10sTGE9ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJBIFVSTCB3aXRoIGNvbnRlbnQgJyIrYSsiJyB3YXMgc2FuaXRpemVkIGF3YXkuIil9O0thLmluZGV4T2YoTGEpPT09LTEmJkthLnB1c2goTGEpO3ZhciBNYSxOYTthOntmb3IodmFyIE9hPVsiQ0xPU1VSRV9GTEFHUyJdLFBhPWwsUWE9MDtRYTxPYS5sZW5ndGg7UWErKylpZihQYT1QYVtPYVtRYV1dLFBhPT1udWxsKXtOYT1udWxsO2JyZWFrIGF9TmE9UGF9dmFyIFJhPU5hJiZOYVs2MTA0MDEzMDFdO01hPVJhIT1udWxsP1JhOiExO2Z1bmN0aW9uIFNhKCl7dmFyIGE9bC5uYXZpZ2F0b3I7cmV0dXJuIGEmJihhPWEudXNlckFnZW50KT9hOiIifXZhciBUYSxVYT1sLm5hdmlnYXRvcjtUYT1VYT9VYS51c2VyQWdlbnREYXRhfHxudWxsOm51bGw7ZnVuY3Rpb24gcihhKXtyZXR1cm4gU2EoKS5pbmRleE9mKGEpIT0tMX07dmFyIFZhPXIoIkVkZ2UiKSx0PXIoIkdlY2tvIikmJiEoU2EoKS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoIndlYmtpdCIpIT0tMSYmIXIoIkVkZ2UiKSkmJiEocigiVHJpZGVudCIpfHxyKCJNU0lFIikpJiYhcigiRWRnZSIpLHU9U2EoKS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoIndlYmtpdCIpIT0tMSYmIXIoIkVkZ2UiKSx2PU1hJiZUYSYmVGEucGxhdGZvcm0/VGEucGxhdGZvcm09PT0ibWFjT1MiOnIoIk1hY2ludG9zaCIpO3ZhciBYYT1mdW5jdGlvbihhLGIpe0JhKGIsZnVuY3Rpb24oYyxkKXtkPT0ic3R5bGUiP2Euc3R5bGUuY3NzVGV4dD1jOmQ9PSJjbGFzcyI/YS5jbGFzc05hbWU9YzpkPT0iZm9yIj9hLmh0bWxGb3I9YzpXYS5oYXNPd25Qcm9wZXJ0eShkKT9hLnNldEF0dHJpYnV0ZShXYVtkXSxjKTpkLmxhc3RJbmRleE9mKCJhcmlhLSIsMCk9PTB8fGQubGFzdEluZGV4T2YoImRhdGEtIiwwKT09MD9hLnNldEF0dHJpYnV0ZShkLGMpOmFbZF09Y30pfSxXYT17Y2VsbHBhZGRpbmc6ImNlbGxQYWRkaW5nIixjZWxsc3BhY2luZzoiY2VsbFNwYWNpbmciLGNvbHNwYW46ImNvbFNwYW4iLGZyYW1lYm9yZGVyOiJmcmFtZUJvcmRlciIsaGVpZ2h0OiJoZWlnaHQiLG1heGxlbmd0aDoibWF4TGVuZ3RoIixub25jZToibm9uY2UiLHJvbGU6InJvbGUiLHJvd3NwYW46InJvd1NwYW4iLHR5cGU6InR5cGUiLHVzZW1hcDoidXNlTWFwIix2YWxpZ246InZBbGlnbiIsd2lkdGg6IndpZHRoIn0sWWE9ZnVuY3Rpb24oYSwKYixjKXtmdW5jdGlvbiBkKGspe2smJmIuYXBwZW5kQ2hpbGQodHlwZW9mIGs9PT0ic3RyaW5nIj9hLmNyZWF0ZVRleHROb2RlKGspOmspfWZvcih2YXIgZT0yO2U8Yy5sZW5ndGg7ZSsrKXt2YXIgZj1jW2VdO2lmKCFrYShmKXx8bShmKSYmZi5ub2RlVHlwZT4wKWQoZik7ZWxzZXthOntpZihmJiZ0eXBlb2YgZi5sZW5ndGg9PSJudW1iZXIiKXtpZihtKGYpKXt2YXIgaD10eXBlb2YgZi5pdGVtPT0iZnVuY3Rpb24ifHx0eXBlb2YgZi5pdGVtPT0ic3RyaW5nIjticmVhayBhfWlmKHR5cGVvZiBmPT09ImZ1bmN0aW9uIil7aD10eXBlb2YgZi5pdGVtPT0iZnVuY3Rpb24iO2JyZWFrIGF9fWg9ITF9d2EoaD95YShmKTpmLGQpfX19LFphPWZ1bmN0aW9uKGEsYil7Yj1TdHJpbmcoYik7YS5jb250ZW50VHlwZT09PSJhcHBsaWNhdGlvbi94aHRtbCt4bWwiJiYoYj1iLnRvTG93ZXJDYXNlKCkpO3JldHVybiBhLmNyZWF0ZUVsZW1lbnQoYil9LCRhPWZ1bmN0aW9uKGEpe2EmJmEucGFyZW50Tm9kZSYmCmEucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhKX0sYWI9ZnVuY3Rpb24oYSxiKXtpZighYXx8IWIpcmV0dXJuITE7aWYoYS5jb250YWlucyYmYi5ub2RlVHlwZT09MSlyZXR1cm4gYT09Ynx8YS5jb250YWlucyhiKTtpZih0eXBlb2YgYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiE9InVuZGVmaW5lZCIpcmV0dXJuIGE9PWJ8fCEhKGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24oYikmMTYpO2Zvcig7YiYmYSE9YjspYj1iLnBhcmVudE5vZGU7cmV0dXJuIGI9PWF9LGJiPWZ1bmN0aW9uKGEpe3AoYSwiTm9kZSBjYW5ub3QgYmUgbnVsbCBvciB1bmRlZmluZWQuIik7cmV0dXJuIGEubm9kZVR5cGU9PTk/YTphLm93bmVyRG9jdW1lbnR8fGEuZG9jdW1lbnR9LGNiPWZ1bmN0aW9uKGEsYil7Yj9hLnRhYkluZGV4PTA6KGEudGFiSW5kZXg9LTEsYS5yZW1vdmVBdHRyaWJ1dGUoInRhYkluZGV4IikpfSxkYj1mdW5jdGlvbihhKXtyZXR1cm4gYS5oYXNBdHRyaWJ1dGUoInRhYmluZGV4Iil9LGViPQpmdW5jdGlvbihhKXthPWEudGFiSW5kZXg7cmV0dXJuIHR5cGVvZiBhPT09Im51bWJlciImJmE+PTAmJmE8MzI3Njh9LGZiPWZ1bmN0aW9uKGEpe3RoaXMuZz1hfHxsLmRvY3VtZW50fHxkb2N1bWVudH07ZmIucHJvdG90eXBlLmk9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nO3JldHVybiB0eXBlb2YgYT09PSJzdHJpbmciP2IuZ2V0RWxlbWVudEJ5SWQoYSk6YX07ZmIucHJvdG90eXBlLmg9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXMuZyxlPWFyZ3VtZW50cyxmPWVbMV0saD1aYShkLFN0cmluZyhlWzBdKSk7ZiYmKHR5cGVvZiBmPT09InN0cmluZyI/aC5jbGFzc05hbWU9ZjpBcnJheS5pc0FycmF5KGYpP2guY2xhc3NOYW1lPWYuam9pbigiICIpOlhhKGgsZikpO2UubGVuZ3RoPjImJllhKGQsaCxlKTtyZXR1cm4gaH07dmFyIHc9ZnVuY3Rpb24oKXt0aGlzLmJhPXRoaXMuYmE7dGhpcy5rYT10aGlzLmthfTt3LnByb3RvdHlwZS5iYT0hMTt3LnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7dGhpcy5iYXx8KHRoaXMuYmE9ITAsdGhpcy5DKCkpfTt3LnByb3RvdHlwZVtTeW1ib2wuZGlzcG9zZV09ZnVuY3Rpb24oKXt0aGlzLmRpc3Bvc2UoKX07dy5wcm90b3R5cGUuQz1mdW5jdGlvbigpe2lmKHRoaXMua2EpZm9yKDt0aGlzLmthLmxlbmd0aDspdGhpcy5rYS5zaGlmdCgpKCl9O3ZhciB5PWZ1bmN0aW9uKGEsYil7dGhpcy50eXBlPWE7dGhpcy51PXRoaXMudGFyZ2V0PWI7dGhpcy5kZWZhdWx0UHJldmVudGVkPXRoaXMuQT0hMX07eS5wcm90b3R5cGUudj1mdW5jdGlvbigpe3RoaXMuQT0hMH07eS5wcm90b3R5cGUuaj1mdW5jdGlvbigpe3RoaXMuZGVmYXVsdFByZXZlbnRlZD0hMH07dmFyIGdiPWZ1bmN0aW9uKCl7aWYoIWwuYWRkRXZlbnRMaXN0ZW5lcnx8IU9iamVjdC5kZWZpbmVQcm9wZXJ0eSlyZXR1cm4hMTt2YXIgYT0hMSxiPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwicGFzc2l2ZSIse2dldDpmdW5jdGlvbigpe2E9ITB9fSk7dHJ5e3ZhciBjPWZ1bmN0aW9uKCl7fTtsLmFkZEV2ZW50TGlzdGVuZXIoInRlc3QiLGMsYik7bC5yZW1vdmVFdmVudExpc3RlbmVyKCJ0ZXN0IixjLGIpfWNhdGNoKGQpe31yZXR1cm4gYX0oKTt2YXIgej1mdW5jdGlvbihhLGIpe3kuY2FsbCh0aGlzLGE/YS50eXBlOiIiKTt0aGlzLnJlbGF0ZWRUYXJnZXQ9dGhpcy51PXRoaXMudGFyZ2V0PW51bGw7dGhpcy5idXR0b249dGhpcy5zY3JlZW5ZPXRoaXMuc2NyZWVuWD10aGlzLmNsaWVudFk9dGhpcy5jbGllbnRYPTA7dGhpcy5rZXk9IiI7dGhpcy5nPTA7dGhpcy5tZXRhS2V5PXRoaXMuc2hpZnRLZXk9dGhpcy5hbHRLZXk9dGhpcy5jdHJsS2V5PSExO3RoaXMuc3RhdGU9bnVsbDt0aGlzLkc9ITE7dGhpcy5wb2ludGVySWQ9MDt0aGlzLnBvaW50ZXJUeXBlPSIiO3RoaXMudGltZVN0YW1wPTA7dGhpcy5oPW51bGw7aWYoYSl7dmFyIGM9dGhpcy50eXBlPWEudHlwZSxkPWEuY2hhbmdlZFRvdWNoZXMmJmEuY2hhbmdlZFRvdWNoZXMubGVuZ3RoP2EuY2hhbmdlZFRvdWNoZXNbMF06bnVsbDt0aGlzLnRhcmdldD1hLnRhcmdldHx8YS5zcmNFbGVtZW50O3RoaXMudT1iO2I9YS5yZWxhdGVkVGFyZ2V0O2J8fChjPT0ibW91c2VvdmVyIj8KYj1hLmZyb21FbGVtZW50OmM9PSJtb3VzZW91dCImJihiPWEudG9FbGVtZW50KSk7dGhpcy5yZWxhdGVkVGFyZ2V0PWI7ZD8odGhpcy5jbGllbnRYPWQuY2xpZW50WCE9PXZvaWQgMD9kLmNsaWVudFg6ZC5wYWdlWCx0aGlzLmNsaWVudFk9ZC5jbGllbnRZIT09dm9pZCAwP2QuY2xpZW50WTpkLnBhZ2VZLHRoaXMuc2NyZWVuWD1kLnNjcmVlblh8fDAsdGhpcy5zY3JlZW5ZPWQuc2NyZWVuWXx8MCk6KHRoaXMuY2xpZW50WD1hLmNsaWVudFghPT12b2lkIDA/YS5jbGllbnRYOmEucGFnZVgsdGhpcy5jbGllbnRZPWEuY2xpZW50WSE9PXZvaWQgMD9hLmNsaWVudFk6YS5wYWdlWSx0aGlzLnNjcmVlblg9YS5zY3JlZW5YfHwwLHRoaXMuc2NyZWVuWT1hLnNjcmVlbll8fDApO3RoaXMuYnV0dG9uPWEuYnV0dG9uO3RoaXMuZz1hLmtleUNvZGV8fDA7dGhpcy5rZXk9YS5rZXl8fCIiO3RoaXMuY3RybEtleT1hLmN0cmxLZXk7dGhpcy5hbHRLZXk9YS5hbHRLZXk7dGhpcy5zaGlmdEtleT1hLnNoaWZ0S2V5Owp0aGlzLm1ldGFLZXk9YS5tZXRhS2V5O3RoaXMuRz12P2EubWV0YUtleTphLmN0cmxLZXk7dGhpcy5wb2ludGVySWQ9YS5wb2ludGVySWR8fDA7dGhpcy5wb2ludGVyVHlwZT1hLnBvaW50ZXJUeXBlO3RoaXMuc3RhdGU9YS5zdGF0ZTt0aGlzLnRpbWVTdGFtcD1hLnRpbWVTdGFtcDt0aGlzLmg9YTthLmRlZmF1bHRQcmV2ZW50ZWQmJnoubC5qLmNhbGwodGhpcyl9fTtuKHoseSk7ei5wcm90b3R5cGUudj1mdW5jdGlvbigpe3oubC52LmNhbGwodGhpcyk7dGhpcy5oLnN0b3BQcm9wYWdhdGlvbj90aGlzLmguc3RvcFByb3BhZ2F0aW9uKCk6dGhpcy5oLmNhbmNlbEJ1YmJsZT0hMH07ei5wcm90b3R5cGUuaj1mdW5jdGlvbigpe3oubC5qLmNhbGwodGhpcyk7dmFyIGE9dGhpcy5oO2EucHJldmVudERlZmF1bHQ/YS5wcmV2ZW50RGVmYXVsdCgpOmEucmV0dXJuVmFsdWU9ITF9O3ZhciBoYj0iY2xvc3VyZV9saXN0ZW5hYmxlXyIrKE1hdGgucmFuZG9tKCkqMUU2fDApLGliPWZ1bmN0aW9uKGEpe3JldHVybiEoIWF8fCFhW2hiXSl9O3ZhciBqYj0wO3ZhciBrYj1mdW5jdGlvbihhLGIsYyxkLGUpe3RoaXMubGlzdGVuZXI9YTt0aGlzLnByb3h5PW51bGw7dGhpcy5zcmM9Yjt0aGlzLnR5cGU9Yzt0aGlzLmNhcHR1cmU9ISFkO3RoaXMucGE9ZTt0aGlzLmtleT0rK2piO3RoaXMuamE9dGhpcy5vYT0hMX0sbGI9ZnVuY3Rpb24oYSl7YS5qYT0hMDthLmxpc3RlbmVyPW51bGw7YS5wcm94eT1udWxsO2Euc3JjPW51bGw7YS5wYT1udWxsfTt2YXIgbWI9ZnVuY3Rpb24oYSl7dGhpcy5zcmM9YTt0aGlzLmc9e307dGhpcy5oPTB9O21iLnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZj1hLnRvU3RyaW5nKCk7YT10aGlzLmdbZl07YXx8KGE9dGhpcy5nW2ZdPVtdLHRoaXMuaCsrKTt2YXIgaD1uYihhLGIsZCxlKTtoPi0xPyhiPWFbaF0sY3x8KGIub2E9ITEpKTooYj1uZXcga2IoYix0aGlzLnNyYyxmLCEhZCxlKSxiLm9hPWMsYS5wdXNoKGIpKTtyZXR1cm4gYn07CnZhciBvYj1mdW5jdGlvbihhLGIpe3ZhciBjPWIudHlwZTtjIGluIGEuZyYmeGEoYS5nW2NdLGIpJiYobGIoYiksYS5nW2NdLmxlbmd0aD09MCYmKGRlbGV0ZSBhLmdbY10sYS5oLS0pKX0scGI9ZnVuY3Rpb24oYSxiLGMsZCxlKXthPWEuZ1tiLnRvU3RyaW5nKCldO2I9LTE7YSYmKGI9bmIoYSxjLGQsZSkpO3JldHVybiBiPi0xP2FbYl06bnVsbH0sbmI9ZnVuY3Rpb24oYSxiLGMsZCl7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDsrK2Upe3ZhciBmPWFbZV07aWYoIWYuamEmJmYubGlzdGVuZXI9PWImJmYuY2FwdHVyZT09ISFjJiZmLnBhPT1kKXJldHVybiBlfXJldHVybi0xfTt2YXIgcWI9ImNsb3N1cmVfbG1fIisoTWF0aC5yYW5kb20oKSoxRTZ8MCkscmI9e30sc2I9MCx1Yj1mdW5jdGlvbihhLGIsYyxkLGUpe2lmKGQmJmQub25jZSlyZXR1cm4gdGIoYSxiLGMsZCxlKTtpZihBcnJheS5pc0FycmF5KGIpKXtmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKyl1YihhLGJbZl0sYyxkLGUpO3JldHVybiBudWxsfWM9dmIoYyk7cmV0dXJuIGliKGEpP3diKGEsYixjLG0oZCk/ISFkLmNhcHR1cmU6ISFkLGUpOnhiKGEsYixjLCExLGQsZSl9LHhiPWZ1bmN0aW9uKGEsYixjLGQsZSxmKXtpZighYil0aHJvdyBFcnJvcigiSW52YWxpZCBldmVudCB0eXBlIik7dmFyIGg9bShlKT8hIWUuY2FwdHVyZTohIWUsaz15YihhKTtrfHwoYVtxYl09az1uZXcgbWIoYSkpO2M9ay5hZGQoYixjLGQsaCxmKTtpZihjLnByb3h5KXJldHVybiBjO2Q9emIoKTtjLnByb3h5PWQ7ZC5zcmM9YTtkLmxpc3RlbmVyPWM7aWYoYS5hZGRFdmVudExpc3RlbmVyKWdifHwoZT1oKSxlPT09dm9pZCAwJiYKKGU9ITEpLGEuYWRkRXZlbnRMaXN0ZW5lcihiLnRvU3RyaW5nKCksZCxlKTtlbHNlIGlmKGEuYXR0YWNoRXZlbnQpYS5hdHRhY2hFdmVudChBYihiLnRvU3RyaW5nKCkpLGQpO2Vsc2UgaWYoYS5hZGRMaXN0ZW5lciYmYS5yZW1vdmVMaXN0ZW5lcilwKGI9PT0iY2hhbmdlIiwiTWVkaWFRdWVyeUxpc3Qgb25seSBoYXMgYSBjaGFuZ2UgZXZlbnQiKSxhLmFkZExpc3RlbmVyKGQpO2Vsc2UgdGhyb3cgRXJyb3IoImFkZEV2ZW50TGlzdGVuZXIgYW5kIGF0dGFjaEV2ZW50IGFyZSB1bmF2YWlsYWJsZS4iKTtzYisrO3JldHVybiBjfSx6Yj1mdW5jdGlvbigpe3ZhciBhPUJiLGI9ZnVuY3Rpb24oYyl7cmV0dXJuIGEuY2FsbChiLnNyYyxiLmxpc3RlbmVyLGMpfTtyZXR1cm4gYn0sdGI9ZnVuY3Rpb24oYSxiLGMsZCxlKXtpZihBcnJheS5pc0FycmF5KGIpKXtmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKyl0YihhLGJbZl0sYyxkLGUpO3JldHVybiBudWxsfWM9dmIoYyk7cmV0dXJuIGliKGEpPwphLkEuYWRkKFN0cmluZyhiKSxjLCEwLG0oZCk/ISFkLmNhcHR1cmU6ISFkLGUpOnhiKGEsYixjLCEwLGQsZSl9LENiPWZ1bmN0aW9uKGEsYixjLGQsZSl7aWYoQXJyYXkuaXNBcnJheShiKSlmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKylDYihhLGJbZl0sYyxkLGUpO2Vsc2UgZD1tKGQpPyEhZC5jYXB0dXJlOiEhZCxjPXZiKGMpLGliKGEpPyhhPWEuQSxiPVN0cmluZyhiKS50b1N0cmluZygpLGIgaW4gYS5nJiYoZj1hLmdbYl0sYz1uYihmLGMsZCxlKSxjPi0xJiYobGIoZltjXSkscChmLmxlbmd0aCE9bnVsbCksQXJyYXkucHJvdG90eXBlLnNwbGljZS5jYWxsKGYsYywxKSxmLmxlbmd0aD09MCYmKGRlbGV0ZSBhLmdbYl0sYS5oLS0pKSkpOmEmJihhPXliKGEpKSYmKGM9cGIoYSxiLGMsZCxlKSkmJkEoYyl9LEE9ZnVuY3Rpb24oYSl7aWYodHlwZW9mIGEhPT0ibnVtYmVyIiYmYSYmIWEuamEpe3ZhciBiPWEuc3JjO2lmKGliKGIpKW9iKGIuQSxhKTtlbHNle3ZhciBjPWEudHlwZSwKZD1hLnByb3h5O2IucmVtb3ZlRXZlbnRMaXN0ZW5lcj9iLnJlbW92ZUV2ZW50TGlzdGVuZXIoYyxkLGEuY2FwdHVyZSk6Yi5kZXRhY2hFdmVudD9iLmRldGFjaEV2ZW50KEFiKGMpLGQpOmIuYWRkTGlzdGVuZXImJmIucmVtb3ZlTGlzdGVuZXImJmIucmVtb3ZlTGlzdGVuZXIoZCk7c2ItLTsoYz15YihiKSk/KG9iKGMsYSksYy5oPT0wJiYoYy5zcmM9bnVsbCxiW3FiXT1udWxsKSk6bGIoYSl9fX0sQWI9ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW4gcmI/cmJbYV06cmJbYV09Im9uIithfSxCYj1mdW5jdGlvbihhLGIpe2lmKGEuamEpYT0hMDtlbHNle2I9bmV3IHooYix0aGlzKTt2YXIgYz1hLmxpc3RlbmVyLGQ9YS5wYXx8YS5zcmM7YS5vYSYmQShhKTthPWMuY2FsbChkLGIpfXJldHVybiBhfSx5Yj1mdW5jdGlvbihhKXthPWFbcWJdO3JldHVybiBhIGluc3RhbmNlb2YgbWI/YTpudWxsfSxEYj0iX19jbG9zdXJlX2V2ZW50c19mbl8iKyhNYXRoLnJhbmRvbSgpKjFFOT4+PjApLHZiPWZ1bmN0aW9uKGEpe3AoYSwKIkxpc3RlbmVyIGNhbiBub3QgYmUgbnVsbC4iKTtpZih0eXBlb2YgYT09PSJmdW5jdGlvbiIpcmV0dXJuIGE7cChhLmhhbmRsZUV2ZW50LCJBbiBvYmplY3QgbGlzdGVuZXIgbXVzdCBoYXZlIGhhbmRsZUV2ZW50IG1ldGhvZC4iKTthW0RiXXx8KGFbRGJdPWZ1bmN0aW9uKGIpe3JldHVybiBhLmhhbmRsZUV2ZW50KGIpfSk7cmV0dXJuIGFbRGJdfTt2YXIgRWI9ZnVuY3Rpb24oYSl7dy5jYWxsKHRoaXMpO3RoaXMuaD1hO3RoaXMuZz17fX07bihFYix3KTsKdmFyIEZiPVtdLEI9ZnVuY3Rpb24oYSxiLGMsZCl7QXJyYXkuaXNBcnJheShjKXx8KGMmJihGYlswXT1jLnRvU3RyaW5nKCkpLGM9RmIpO2Zvcih2YXIgZT0wO2U8Yy5sZW5ndGg7ZSsrKXt2YXIgZj11YihiLGNbZV0sZHx8YS5oYW5kbGVFdmVudCwhMSxhLmh8fGEpO2lmKCFmKWJyZWFrO2EuZ1tmLmtleV09Zn1yZXR1cm4gYX0sQz1mdW5jdGlvbihhLGIsYyxkLGUsZil7aWYoQXJyYXkuaXNBcnJheShjKSlmb3IodmFyIGg9MDtoPGMubGVuZ3RoO2grKylDKGEsYixjW2hdLGQsZSxmKTtlbHNlIGQ9ZHx8YS5oYW5kbGVFdmVudCxlPW0oZSk/ISFlLmNhcHR1cmU6ISFlLGY9Znx8YS5ofHxhLGQ9dmIoZCksZT0hIWUsYz1pYihiKT9wYihiLkEsU3RyaW5nKGMpLGQsZSxmKTpiPyhiPXliKGIpKT9wYihiLGMsZCxlLGYpOm51bGw6bnVsbCxjJiYoQShjKSxkZWxldGUgYS5nW2Mua2V5XSk7cmV0dXJuIGF9LEdiPWZ1bmN0aW9uKGEpe0JhKGEuZyxmdW5jdGlvbihiLGMpe3RoaXMuZy5oYXNPd25Qcm9wZXJ0eShjKSYmCkEoYil9LGEpO2EuZz17fX07RWIucHJvdG90eXBlLkM9ZnVuY3Rpb24oKXtFYi5sLkMuY2FsbCh0aGlzKTtHYih0aGlzKX07RWIucHJvdG90eXBlLmhhbmRsZUV2ZW50PWZ1bmN0aW9uKCl7dGhyb3cgRXJyb3IoIkV2ZW50SGFuZGxlci5oYW5kbGVFdmVudCBub3QgaW1wbGVtZW50ZWQiKTt9O3ZhciBEPWZ1bmN0aW9uKCl7dy5jYWxsKHRoaXMpO3RoaXMuQT1uZXcgbWIodGhpcyk7dGhpcy5ZYT10aGlzO3RoaXMubGE9bnVsbH07bihELHcpO0QucHJvdG90eXBlW2hiXT0hMDtELnByb3RvdHlwZS5BYT1mdW5jdGlvbihhKXt0aGlzLmxhPWF9O0QucHJvdG90eXBlLnJlbW92ZUV2ZW50TGlzdGVuZXI9ZnVuY3Rpb24oYSxiLGMsZCl7Q2IodGhpcyxhLGIsYyxkKX07CnZhciBFPWZ1bmN0aW9uKGEsYil7SGIoYSk7dmFyIGM9YS5sYTtpZihjKXt2YXIgZD1bXTtmb3IodmFyIGU9MTtjO2M9Yy5sYSlkLnB1c2goYykscCgrK2U8MUUzLCJpbmZpbml0ZSBsb29wIil9YT1hLllhO2M9Yi50eXBlfHxiO3R5cGVvZiBiPT09InN0cmluZyI/Yj1uZXcgeShiLGEpOmIgaW5zdGFuY2VvZiB5P2IudGFyZ2V0PWIudGFyZ2V0fHxhOihlPWIsYj1uZXcgeShjLGEpLEdhKGIsZSkpO2U9ITA7dmFyIGY7aWYoZClmb3IoZj1kLmxlbmd0aC0xOyFiLkEmJmY+PTA7Zi0tKXt2YXIgaD1iLnU9ZFtmXTtlPUliKGgsYywhMCxiKSYmZX1iLkF8fChoPWIudT1hLGU9SWIoaCxjLCEwLGIpJiZlLGIuQXx8KGU9SWIoaCxjLCExLGIpJiZlKSk7aWYoZClmb3IoZj0wOyFiLkEmJmY8ZC5sZW5ndGg7ZisrKWg9Yi51PWRbZl0sZT1JYihoLGMsITEsYikmJmU7cmV0dXJuIGV9OwpELnByb3RvdHlwZS5DPWZ1bmN0aW9uKCl7RC5sLkMuY2FsbCh0aGlzKTtpZih0aGlzLkEpe3ZhciBhPXRoaXMuQSxiPTAsYztmb3IoYyBpbiBhLmcpe2Zvcih2YXIgZD1hLmdbY10sZT0wO2U8ZC5sZW5ndGg7ZSsrKSsrYixsYihkW2VdKTtkZWxldGUgYS5nW2NdO2EuaC0tfX10aGlzLmxhPW51bGx9O3ZhciB3Yj1mdW5jdGlvbihhLGIsYyxkLGUpe0hiKGEpO3JldHVybiBhLkEuYWRkKFN0cmluZyhiKSxjLCExLGQsZSl9LEliPWZ1bmN0aW9uKGEsYixjLGQpe2I9YS5BLmdbU3RyaW5nKGIpXTtpZighYilyZXR1cm4hMDtiPWIuY29uY2F0KCk7Zm9yKHZhciBlPSEwLGY9MDtmPGIubGVuZ3RoOysrZil7dmFyIGg9YltmXTtpZihoJiYhaC5qYSYmaC5jYXB0dXJlPT1jKXt2YXIgaz1oLmxpc3RlbmVyLHE9aC5wYXx8aC5zcmM7aC5vYSYmb2IoYS5BLGgpO2U9ay5jYWxsKHEsZCkhPT0hMSYmZX19cmV0dXJuIGUmJiFkLmRlZmF1bHRQcmV2ZW50ZWR9LEhiPWZ1bmN0aW9uKGEpe3AoYS5BLCJFdmVudCB0YXJnZXQgaXMgbm90IGluaXRpYWxpemVkLiBEaWQgeW91IGNhbGwgdGhlIHN1cGVyY2xhc3MgKGdvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0KSBjb25zdHJ1Y3Rvcj8iKX07dmFyIEpiPXQ/Ik1velVzZXJTZWxlY3QiOnV8fFZhPyJXZWJraXRVc2VyU2VsZWN0IjpudWxsLEtiPWZ1bmN0aW9uKGEsYil7Yj1iP251bGw6YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpO2lmKEpiJiYoYS5zdHlsZSYmKGEuc3R5bGVbSmJdPSJub25lIiksYikpZm9yKHZhciBjPTA7YT1iW2NdO2MrKylhLnN0eWxlJiYoYS5zdHlsZVtKYl09Im5vbmUiKX07dmFyIExiPWZ1bmN0aW9uKCl7fTtpYShMYik7TGIucHJvdG90eXBlLmc9MDt2YXIgRj1mdW5jdGlvbihhKXtELmNhbGwodGhpcyk7dGhpcy5HPWF8fHBhfHwocGE9bmV3IGZiKTt0aGlzLnphPU1iO3RoaXMuWT1udWxsO3RoaXMucz0hMTt0aGlzLmc9bnVsbDt0aGlzLk09dm9pZCAwO3RoaXMudT10aGlzLmo9dGhpcy5oPW51bGw7dGhpcy5TYT0hMX07bihGLEQpO0YucHJvdG90eXBlLlphPUxiLlYoKTsKdmFyIE1iPW51bGwsTmI9ZnVuY3Rpb24oYSxiKXtzd2l0Y2goYSl7Y2FzZSAxOnJldHVybiBiPyJkaXNhYmxlIjoiZW5hYmxlIjtjYXNlIDI6cmV0dXJuIGI/ImhpZ2hsaWdodCI6InVuaGlnaGxpZ2h0IjtjYXNlIDQ6cmV0dXJuIGI/ImFjdGl2YXRlIjoiZGVhY3RpdmF0ZSI7Y2FzZSA4OnJldHVybiBiPyJzZWxlY3QiOiJ1bnNlbGVjdCI7Y2FzZSAxNjpyZXR1cm4gYj8iY2hlY2siOiJ1bmNoZWNrIjtjYXNlIDMyOnJldHVybiBiPyJmb2N1cyI6ImJsdXIiO2Nhc2UgNjQ6cmV0dXJuIGI/Im9wZW4iOiJjbG9zZSJ9dGhyb3cgRXJyb3IoIkludmFsaWQgY29tcG9uZW50IHN0YXRlIik7fSxPYj1mdW5jdGlvbihhKXtyZXR1cm4gYS5ZfHwoYS5ZPSI6IisoYS5aYS5nKyspLnRvU3RyaW5nKDM2KSl9LFBiPWZ1bmN0aW9uKGEsYil7aWYoYS5oJiZhLmgudSl7dmFyIGM9YS5oLnUsZD1hLlk7ZCBpbiBjJiZkZWxldGUgY1tkXTtEYShhLmgudSxiLGEpfWEuWT1ifTtGLnByb3RvdHlwZS5pPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ307CnZhciBRYj1mdW5jdGlvbihhKXthLk18fChhLk09bmV3IEViKGEpKTtyZXR1cm4gcChhLk0pfTtGLnByb3RvdHlwZS5BYT1mdW5jdGlvbihhKXtpZih0aGlzLmgmJnRoaXMuaCE9YSl0aHJvdyBFcnJvcigiTWV0aG9kIG5vdCBzdXBwb3J0ZWQiKTtGLmwuQWEuY2FsbCh0aGlzLGEpfTtGLnByb3RvdHlwZS5tYT1mdW5jdGlvbigpe3RoaXMuZz1aYSh0aGlzLkcuZywiRElWIil9O0YucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbihhKXtSYih0aGlzLGEpfTsKdmFyIFJiPWZ1bmN0aW9uKGEsYixjKXtpZihhLnMpdGhyb3cgRXJyb3IoIkNvbXBvbmVudCBhbHJlYWR5IHJlbmRlcmVkIik7YS5nfHxhLm1hKCk7Yj9iLmluc2VydEJlZm9yZShhLmcsY3x8bnVsbCk6YS5HLmcuYm9keS5hcHBlbmRDaGlsZChhLmcpO2EuaCYmIWEuaC5zfHxhLkkoKX0sU2I9ZnVuY3Rpb24oYSxiKXtpZihhLnMpdGhyb3cgRXJyb3IoIkNvbXBvbmVudCBhbHJlYWR5IHJlbmRlcmVkIik7aWYoYiYmYS53YShiKSl7YS5TYT0hMDt2YXIgYz1iYihiKTthLkcmJmEuRy5nPT1jfHwoYS5HPWI/bmV3IGZiKGJiKGIpKTpwYXx8KHBhPW5ldyBmYikpO2EuRWEoYik7YS5JKCl9ZWxzZSB0aHJvdyBFcnJvcigiSW52YWxpZCBlbGVtZW50IHRvIGRlY29yYXRlIik7fTtnPUYucHJvdG90eXBlO2cud2E9ZnVuY3Rpb24oKXtyZXR1cm4hMH07Zy5FYT1mdW5jdGlvbihhKXt0aGlzLmc9YX07CmcuST1mdW5jdGlvbigpe3RoaXMucz0hMDtUYih0aGlzLGZ1bmN0aW9uKGEpeyFhLnMmJmEuaSgpJiZhLkkoKX0pfTtnLlU9ZnVuY3Rpb24oKXtUYih0aGlzLGZ1bmN0aW9uKGEpe2EucyYmYS5VKCl9KTt0aGlzLk0mJkdiKHRoaXMuTSk7dGhpcy5zPSExfTtnLkM9ZnVuY3Rpb24oKXt0aGlzLnMmJnRoaXMuVSgpO3RoaXMuTSYmKHRoaXMuTS5kaXNwb3NlKCksZGVsZXRlIHRoaXMuTSk7VGIodGhpcyxmdW5jdGlvbihhKXthLmRpc3Bvc2UoKX0pOyF0aGlzLlNhJiZ0aGlzLmcmJiRhKHRoaXMuZyk7dGhpcy5oPXRoaXMuZz10aGlzLnU9dGhpcy5qPW51bGw7Ri5sLkMuY2FsbCh0aGlzKX07Zy5CYT1mdW5jdGlvbihhLGIpe3RoaXMuQ2EoYSxIKHRoaXMpLGIpfTsKZy5DYT1mdW5jdGlvbihhLGIsYyl7cCghIWEsIlByb3ZpZGVkIGVsZW1lbnQgbXVzdCBub3QgYmUgbnVsbC4iKTtpZihhLnMmJihjfHwhdGhpcy5zKSl0aHJvdyBFcnJvcigiQ29tcG9uZW50IGFscmVhZHkgcmVuZGVyZWQiKTtpZihiPDB8fGI+SCh0aGlzKSl0aHJvdyBFcnJvcigiQ2hpbGQgY29tcG9uZW50IGluZGV4IG91dCBvZiBib3VuZHMiKTt0aGlzLnUmJnRoaXMuanx8KHRoaXMudT17fSx0aGlzLmo9W10pO2lmKGEuaD09dGhpcyl7dmFyIGQ9dGhpcy51LGU9T2IoYSk7ZFtlXT1hO3hhKHRoaXMuaixhKX1lbHNlIERhKHRoaXMudSxPYihhKSxhKTtpZihhPT10aGlzKXRocm93IEVycm9yKCJVbmFibGUgdG8gc2V0IHBhcmVudCBjb21wb25lbnQiKTtpZihkPXRoaXMmJmEuaCYmYS5ZKWU9YS5oLGQ9YS5ZLGUudSYmZD8oZT1lLnUsZD0oZSE9PW51bGwmJmQgaW4gZT9lW2RdOnZvaWQgMCl8fG51bGwpOmQ9bnVsbDtpZihkJiZhLmghPXRoaXMpdGhyb3cgRXJyb3IoIlVuYWJsZSB0byBzZXQgcGFyZW50IGNvbXBvbmVudCIpOwphLmg9dGhpcztGLmwuQWEuY2FsbChhLHRoaXMpO3phKHRoaXMuaixiLDAsYSk7YS5zJiZ0aGlzLnMmJmEuaD09dGhpcz8oYz10aGlzLm5hKCksKGMuY2hpbGROb2Rlc1tiXXx8bnVsbCkhPWEuaSgpJiYoYS5pKCkucGFyZW50RWxlbWVudD09YyYmYy5yZW1vdmVDaGlsZChhLmkoKSksYj1jLmNoaWxkTm9kZXNbYl18fG51bGwsYy5pbnNlcnRCZWZvcmUoYS5pKCksYikpKTpjPyh0aGlzLmd8fHRoaXMubWEoKSxiPUkodGhpcyxiKzEpLFJiKGEsdGhpcy5uYSgpLGI/Yi5nOm51bGwpKTp0aGlzLnMmJiFhLnMmJmEuZyYmYS5nLnBhcmVudE5vZGUmJmEuZy5wYXJlbnROb2RlLm5vZGVUeXBlPT0xJiZhLkkoKX07Zy5uYT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmd9Owp2YXIgVWI9ZnVuY3Rpb24oYSl7aWYoYS56YT09bnVsbCl7dmFyIGI9YS5zP2EuZzphLkcuZy5ib2R5O2E6e3ZhciBjPWJiKGIpO2lmKGMuZGVmYXVsdFZpZXcmJmMuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSYmKGM9Yy5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKGIsbnVsbCkpKXtjPWMuZGlyZWN0aW9ufHxjLmdldFByb3BlcnR5VmFsdWUoImRpcmVjdGlvbiIpfHwiIjticmVhayBhfWM9IiJ9YS56YT0icnRsIj09KGN8fChiLmN1cnJlbnRTdHlsZT9iLmN1cnJlbnRTdHlsZS5kaXJlY3Rpb246bnVsbCl8fGIuc3R5bGUmJmIuc3R5bGUuZGlyZWN0aW9uKX1yZXR1cm4gYS56YX0sSD1mdW5jdGlvbihhKXtyZXR1cm4gYS5qP2Euai5sZW5ndGg6MH0sST1mdW5jdGlvbihhLGIpe3JldHVybiBhLmo/YS5qW2JdfHxudWxsOm51bGx9LFRiPWZ1bmN0aW9uKGEsYixjKXthLmomJmEuai5mb3JFYWNoKGIsYyl9LFZiPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuaiYmYj9hLmouaW5kZXhPZihiKToKLTF9O3ZhciBXYj17bWI6ImFjdGl2ZWRlc2NlbmRhbnQiLHJiOiJhdG9taWMiLHNiOiJhdXRvY29tcGxldGUiLHViOiJidXN5Iix4YjoiY2hlY2tlZCIseWI6ImNvbGluZGV4IixEYjoiY29udHJvbHMiLEViOiJjdXJyZW50IixHYjoiZGVzY3JpYmVkYnkiLEpiOiJkaXNhYmxlZCIsTGI6ImRyb3BlZmZlY3QiLE1iOiJleHBhbmRlZCIsTmI6ImZsb3d0byIsUGI6ImdyYWJiZWQiLFRiOiJoYXNwb3B1cCIsVmI6ImhpZGRlbiIsWGI6ImludmFsaWQiLFliOiJsYWJlbCIsWmI6ImxhYmVsbGVkYnkiLGFjOiJsZXZlbCIsZmM6ImxpdmUiLHZjOiJtdWx0aWxpbmUiLHdjOiJtdWx0aXNlbGVjdGFibGUiLEFjOiJvcmllbnRhdGlvbiIsQmM6Im93bnMiLENjOiJwb3NpbnNldCIsRWM6InByZXNzZWQiLEljOiJyZWFkb25seSIsS2M6InJlbGV2YW50IixMYzoicmVxdWlyZWQiLFBjOiJyb3dpbmRleCIsU2M6InNlbGVjdGVkIixVYzoic2V0c2l6ZSIsV2M6InNvcnQiLG1kOiJ2YWx1ZW1heCIsbmQ6InZhbHVlbWluIiwKb2Q6InZhbHVlbm93IixwZDoidmFsdWV0ZXh0In07dmFyIFhiO3ZhciBZYj17bmI6ImFsZXJ0IixvYjoiYWxlcnRkaWFsb2ciLHBiOiJhcHBsaWNhdGlvbiIscWI6ImFydGljbGUiLHRiOiJiYW5uZXIiLHZiOiJidXR0b24iLHdiOiJjaGVja2JveCIsemI6ImNvbHVtbmhlYWRlciIsQWI6ImNvbWJvYm94IixCYjoiY29tcGxlbWVudGFyeSIsQ2I6ImNvbnRlbnRpbmZvIixGYjoiZGVmaW5pdGlvbiIsSGI6ImRpYWxvZyIsSWI6ImRpcmVjdG9yeSIsS2I6ImRvY3VtZW50IixPYjoiZm9ybSIsUWI6ImdyaWQiLFJiOiJncmlkY2VsbCIsU2I6Imdyb3VwIixVYjoiaGVhZGluZyIsV2I6ImltZyIsYmM6ImxpbmsiLGNjOiJsaXN0IixkYzoibGlzdGJveCIsZWM6Imxpc3RpdGVtIixoYzoibG9nIixpYzoibWFpbiIsamM6Im1hcnF1ZWUiLGtjOiJtYXRoIixsYzoibWVudSIsbWM6Im1lbnViYXIiLG5jOiJtZW51aXRlbSIsb2M6Im1lbnVpdGVtY2hlY2tib3giLHBjOiJtZW51aXRlbXJhZGlvIix4YzoibmF2aWdhdGlvbiIseWM6Im5vdGUiLHpjOiJvcHRpb24iLApEYzoicHJlc2VudGF0aW9uIixGYzoicHJvZ3Jlc3NiYXIiLEdjOiJyYWRpbyIsSGM6InJhZGlvZ3JvdXAiLEpjOiJyZWdpb24iLE1jOiJyb3ciLE5jOiJyb3dncm91cCIsT2M6InJvd2hlYWRlciIsUWM6InNjcm9sbGJhciIsUmM6InNlYXJjaCIsVGM6InNlcGFyYXRvciIsVmM6InNsaWRlciIsWGM6InNwaW5idXR0b24iLFljOiJzdGF0dXMiLFpjOiJzd2l0Y2giLGFkOiJ0YWIiLGJkOiJ0YWJsaXN0IixjZDoidGFicGFuZWwiLGRkOiJ0ZXh0Ym94IixlZDoidGV4dGluZm8iLGZkOiJ0aW1lciIsZ2Q6InRvb2xiYXIiLGhkOiJ0b29sdGlwIixqZDoidHJlZSIsa2Q6InRyZWVncmlkIixsZDoidHJlZWl0ZW0ifTt2YXIgWmI9ZnVuY3Rpb24oYSxiKXtiPyhwKENhKFliLGIpLCJObyBzdWNoIEFSSUEgcm9sZSAiK2IpLGEuc2V0QXR0cmlidXRlKCJyb2xlIixiKSk6YS5yZW1vdmVBdHRyaWJ1dGUoInJvbGUiKX0sYWM9ZnVuY3Rpb24oYSxiLGMpe0FycmF5LmlzQXJyYXkoYykmJihjPWMuam9pbigiICIpKTt2YXIgZD0kYihiKTtjPT09IiJ8fGM9PXZvaWQgMD8oWGJ8fChjPXt9LFhiPShjLmF0b21pYz0hMSxjLmF1dG9jb21wbGV0ZT0ibm9uZSIsYy5kcm9wZWZmZWN0PSJub25lIixjLmhhc3BvcHVwPSExLGMubGl2ZT0ib2ZmIixjLm11bHRpbGluZT0hMSxjLm11bHRpc2VsZWN0YWJsZT0hMSxjLm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIsYy5yZWFkb25seT0hMSxjLnJlbGV2YW50PSJhZGRpdGlvbnMgdGV4dCIsYy5yZXF1aXJlZD0hMSxjLnNvcnQ9Im5vbmUiLGMuYnVzeT0hMSxjLmRpc2FibGVkPSExLGMuaGlkZGVuPSExLGMuaW52YWxpZD0iZmFsc2UiLGMpKSxjPVhiLGIgaW4gYz9hLnNldEF0dHJpYnV0ZShkLApjW2JdKTphLnJlbW92ZUF0dHJpYnV0ZShkKSk6YS5zZXRBdHRyaWJ1dGUoZCxjKX0sJGI9ZnVuY3Rpb24oYSl7cChhLCJBUklBIGF0dHJpYnV0ZSBjYW5ub3QgYmUgZW1wdHkuIik7cChDYShXYixhKSwiTm8gc3VjaCBBUklBIGF0dHJpYnV0ZSAiK2EpO3JldHVybiJhcmlhLSIrYX07dmFyIGRjPWZ1bmN0aW9uKGEsYixjLGQsZSxmKXtpZih2JiZlKXJldHVybiBiYyhhKTtpZihlJiYhZClyZXR1cm4hMTtpZighdCl7dHlwZW9mIGI9PT0ibnVtYmVyIiYmKGI9Y2MoYikpO3ZhciBoPWI9PTE3fHxiPT0xOHx8diYmYj09OTE7aWYoKCFjfHx2KSYmaHx8diYmYj09MTYmJihkfHxmKSlyZXR1cm4hMX1pZih1JiZkJiZjKXN3aXRjaChhKXtjYXNlIDIyMDpjYXNlIDIxOTpjYXNlIDIyMTpjYXNlIDE5MjpjYXNlIDE4NjpjYXNlIDE4OTpjYXNlIDE4NzpjYXNlIDE4ODpjYXNlIDE5MDpjYXNlIDE5MTpjYXNlIDE5MjpjYXNlIDIyMjpyZXR1cm4hMX1zd2l0Y2goYSl7Y2FzZSAxMzpyZXR1cm4gdD9mfHxlPyExOiEoYyYmZCk6ITA7Y2FzZSAyNzpyZXR1cm4hdSYmIXR9cmV0dXJuIHQmJihkfHxlfHxmKT8hMTpiYyhhKX0sYmM9ZnVuY3Rpb24oYSl7aWYoYT49NDgmJmE8PTU3fHxhPj05NiYmYTw9MTA2fHxhPj02NSYmYTw9OTB8fHUmJmE9PTApcmV0dXJuITA7c3dpdGNoKGEpe2Nhc2UgMzI6Y2FzZSA0MzpjYXNlIDYzOmNhc2UgNjQ6Y2FzZSAxMDc6Y2FzZSAxMDk6Y2FzZSAxMTA6Y2FzZSAxMTE6Y2FzZSAxODY6Y2FzZSA1OTpjYXNlIDE4OTpjYXNlIDE4NzpjYXNlIDYxOmNhc2UgMTg4OmNhc2UgMTkwOmNhc2UgMTkxOmNhc2UgMTkyOmNhc2UgMjIyOmNhc2UgMjE5OmNhc2UgMjIwOmNhc2UgMjIxOmNhc2UgMTYzOmNhc2UgNTg6cmV0dXJuITA7CmNhc2UgMTczOmNhc2UgMTcxOnJldHVybiB0O2RlZmF1bHQ6cmV0dXJuITF9fSxjYz1mdW5jdGlvbihhKXtpZih0KWE9ZWMoYSk7ZWxzZSBpZih2JiZ1KXN3aXRjaChhKXtjYXNlIDkzOmE9OTF9cmV0dXJuIGF9LGVjPWZ1bmN0aW9uKGEpe3N3aXRjaChhKXtjYXNlIDYxOnJldHVybiAxODc7Y2FzZSA1OTpyZXR1cm4gMTg2O2Nhc2UgMTczOnJldHVybiAxODk7Y2FzZSAyMjQ6cmV0dXJuIDkxO2Nhc2UgMDpyZXR1cm4gMjI0O2RlZmF1bHQ6cmV0dXJuIGF9fTt2YXIgZmM9ZnVuY3Rpb24oYSxiLGMsZCl7ei5jYWxsKHRoaXMsZCk7dGhpcy50eXBlPSJrZXkiO3RoaXMuZz1hO3RoaXMucmVwZWF0PWN9O24oZmMseik7dmFyIEo9ZnVuY3Rpb24oYSxiKXtELmNhbGwodGhpcyk7YSYmZ2ModGhpcyxhLGIpfTtuKEosRCk7Zz1KLnByb3RvdHlwZTtnLlI9bnVsbDtnLnFhPW51bGw7Zy5KYT1udWxsO2cucmE9bnVsbDtnLkY9LTE7Zy5LPS0xO2cuRGE9ITE7CnZhciBoYz17MzoxMywxMjoxNDQsNjMyMzI6MzgsNjMyMzM6NDAsNjMyMzQ6MzcsNjMyMzU6MzksNjMyMzY6MTEyLDYzMjM3OjExMyw2MzIzODoxMTQsNjMyMzk6MTE1LDYzMjQwOjExNiw2MzI0MToxMTcsNjMyNDI6MTE4LDYzMjQzOjExOSw2MzI0NDoxMjAsNjMyNDU6MTIxLDYzMjQ2OjEyMiw2MzI0NzoxMjMsNjMyNDg6NDQsNjMyNzI6NDYsNjMyNzM6MzYsNjMyNzU6MzUsNjMyNzY6MzMsNjMyNzc6MzQsNjMyODk6MTQ0LDYzMzAyOjQ1fSxpYz17VXA6MzgsRG93bjo0MCxMZWZ0OjM3LFJpZ2h0OjM5LEVudGVyOjEzLEYxOjExMixGMjoxMTMsRjM6MTE0LEY0OjExNSxGNToxMTYsRjY6MTE3LEY3OjExOCxGODoxMTksRjk6MTIwLEYxMDoxMjEsRjExOjEyMixGMTI6MTIzLCJVKzAwN0YiOjQ2LEhvbWU6MzYsRW5kOjM1LFBhZ2VVcDozMyxQYWdlRG93bjozNCxJbnNlcnQ6NDV9LGpjPXYmJnQ7CkoucHJvdG90eXBlLmc9ZnVuY3Rpb24oYSl7dSYmKHRoaXMuRj09MTcmJiFhLmN0cmxLZXl8fHRoaXMuRj09MTgmJiFhLmFsdEtleXx8diYmdGhpcy5GPT05MSYmIWEubWV0YUtleSkmJih0aGlzLks9dGhpcy5GPS0xKTt0aGlzLkY9PS0xJiYoYS5jdHJsS2V5JiZhLmchPTE3P3RoaXMuRj0xNzphLmFsdEtleSYmYS5nIT0xOD90aGlzLkY9MTg6YS5tZXRhS2V5JiZhLmchPTkxJiYodGhpcy5GPTkxKSk7ZGMoYS5nLHRoaXMuRixhLnNoaWZ0S2V5LGEuY3RybEtleSxhLmFsdEtleSxhLm1ldGFLZXkpPyh0aGlzLks9Y2MoYS5nKSxqYyYmKHRoaXMuRGE9YS5hbHRLZXkpKTp0aGlzLmhhbmRsZUV2ZW50KGEpfTtKLnByb3RvdHlwZS5oPWZ1bmN0aW9uKGEpe3RoaXMuSz10aGlzLkY9LTE7dGhpcy5EYT1hLmFsdEtleX07CkoucHJvdG90eXBlLmhhbmRsZUV2ZW50PWZ1bmN0aW9uKGEpe3ZhciBiPWEuaCxjPWIuYWx0S2V5O2lmKHUmJmEudHlwZT09ImtleXByZXNzIil7dmFyIGQ9dGhpcy5LO3ZhciBlPWIuY2hhckNvZGU+PTAmJmIuY2hhckNvZGU8NjMyMzImJmJjKGQpP2IuY2hhckNvZGU6MH1lbHNlIGEudHlwZT09ImtleXByZXNzIj8oamMmJihjPXRoaXMuRGEpLGIua2V5Q29kZT09Yi5jaGFyQ29kZT9iLmtleUNvZGU8MzI/KGQ9Yi5rZXlDb2RlLGU9MCk6KGQ9dGhpcy5LLGU9Yi5jaGFyQ29kZSk6KGQ9Yi5rZXlDb2RlfHx0aGlzLkssZT1iLmNoYXJDb2RlfHwwKSk6KGQ9Yi5rZXlDb2RlfHx0aGlzLkssZT1iLmNoYXJDb2RlfHwwKSx2JiZlPT02MyYmZD09MjI0JiYoZD0xOTEpO3ZhciBmPWQ9Y2MoZCk7ZD9kPj02MzIzMiYmZCBpbiBoYz9mPWhjW2RdOmQ9PTI1JiZhLnNoaWZ0S2V5JiYoZj05KTpiLmtleUlkZW50aWZpZXImJmIua2V5SWRlbnRpZmllciBpbiBpYyYmKGY9aWNbYi5rZXlJZGVudGlmaWVyXSk7CmlmKCF0fHxhLnR5cGUhPSJrZXlwcmVzcyJ8fGRjKGYsdGhpcy5GLGEuc2hpZnRLZXksYS5jdHJsS2V5LGMsYS5tZXRhS2V5KSlhPWY9PXRoaXMuRix0aGlzLkY9ZixiPW5ldyBmYyhmLGUsYSxiKSxiLmFsdEtleT1jLEUodGhpcyxiKX07Si5wcm90b3R5cGUuaT1mdW5jdGlvbigpe3JldHVybiB0aGlzLlJ9O3ZhciBnYz1mdW5jdGlvbihhLGIsYyl7YS5yYSYma2MoYSk7YS5SPWI7YS5xYT11YihhLlIsImtleXByZXNzIixhLGMpO2EuSmE9dWIoYS5SLCJrZXlkb3duIixhLmcsYyxhKTthLnJhPXViKGEuUiwia2V5dXAiLGEuaCxjLGEpfSxrYz1mdW5jdGlvbihhKXthLnFhJiYoQShhLnFhKSxBKGEuSmEpLEEoYS5yYSksYS5xYT1udWxsLGEuSmE9bnVsbCxhLnJhPW51bGwpO2EuUj1udWxsO2EuRj0tMTthLks9LTF9O0oucHJvdG90eXBlLkM9ZnVuY3Rpb24oKXtKLmwuQy5jYWxsKHRoaXMpO2tjKHRoaXMpfTt2YXIgSz17Z2E6Im1vdXNlZG93biIsaGE6Im1vdXNldXAiLGZhOiJtb3VzZWNhbmNlbCIsc2M6Im1vdXNlbW92ZSIsdWM6Im1vdXNlb3ZlciIsdGM6Im1vdXNlb3V0IixxYzoibW91c2VlbnRlciIscmM6Im1vdXNlbGVhdmUifTt2YXIgbGM9ZnVuY3Rpb24oYSl7cmV0dXJuIHR5cGVvZiBhLmNsYXNzTmFtZT09InN0cmluZyI/YS5jbGFzc05hbWU6YS5nZXRBdHRyaWJ1dGUmJmEuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIn0sTD1mdW5jdGlvbihhKXtyZXR1cm4gYS5jbGFzc0xpc3Q/YS5jbGFzc0xpc3Q6bGMoYSkubWF0Y2goL1xTKy9nKXx8W119LG1jPWZ1bmN0aW9uKGEsYil7dHlwZW9mIGEuY2xhc3NOYW1lPT0ic3RyaW5nIj9hLmNsYXNzTmFtZT1iOmEuc2V0QXR0cmlidXRlJiZhLnNldEF0dHJpYnV0ZSgiY2xhc3MiLGIpfSxuYz1mdW5jdGlvbihhLGIpe2EuY2xhc3NMaXN0P2I9YS5jbGFzc0xpc3QuY29udGFpbnMoYik6KGE9TChhKSxiPXZhKGEsYik+PTApO3JldHVybiBifSxvYz1mdW5jdGlvbihhLGIpe2lmKGEuY2xhc3NMaXN0KWEuY2xhc3NMaXN0LmFkZChiKTtlbHNlIGlmKCFuYyhhLGIpKXt2YXIgYz1sYyhhKTttYyhhLGMrKGMubGVuZ3RoPjA/IiAiK2I6YikpfX0scGM9ZnVuY3Rpb24oYSxiKXtpZihhLmNsYXNzTGlzdClBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGIsCmZ1bmN0aW9uKGUpe29jKGEsZSl9KTtlbHNle3ZhciBjPXt9O0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoTChhKSxmdW5jdGlvbihlKXtjW2VdPSEwfSk7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChiLGZ1bmN0aW9uKGUpe2NbZV09ITB9KTtiPSIiO2Zvcih2YXIgZCBpbiBjKWIrPWIubGVuZ3RoPjA/IiAiK2Q6ZDttYyhhLGIpfX0scWM9ZnVuY3Rpb24oYSxiKXthLmNsYXNzTGlzdD9hLmNsYXNzTGlzdC5yZW1vdmUoYik6bmMoYSxiKSYmbWMoYSxBcnJheS5wcm90b3R5cGUuZmlsdGVyLmNhbGwoTChhKSxmdW5jdGlvbihjKXtyZXR1cm4gYyE9Yn0pLmpvaW4oIiAiKSl9LHJjPWZ1bmN0aW9uKGEsYil7YS5jbGFzc0xpc3Q/QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChiLGZ1bmN0aW9uKGMpe3FjKGEsYyl9KTptYyhhLEFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbChMKGEpLGZ1bmN0aW9uKGMpe3JldHVybiEodmEoYixjKT49MCl9KS5qb2luKCIgIikpfTt2YXIgdGM9ZnVuY3Rpb24oYSxiKXtpZighYSl0aHJvdyBFcnJvcigiSW52YWxpZCBjbGFzcyBuYW1lICIrYSk7aWYodHlwZW9mIGIhPT0iZnVuY3Rpb24iKXRocm93IEVycm9yKCJJbnZhbGlkIGRlY29yYXRvciBmdW5jdGlvbiAiK2IpO3NjW2FdPWJ9LHVjPXt9LHNjPXt9O3ZhciB2Yz1mdW5jdGlvbihhKXt0aGlzLkE9YX07aWEodmMpO3ZhciB3Yz1mdW5jdGlvbihhLGIpe2EmJihhLnRhYkluZGV4PWI/MDotMSl9LHljPWZ1bmN0aW9uKGEsYixjKXtjLmlkJiZQYihiLGMuaWQpO3ZhciBkPWEuZygpLGU9ITEsZj1MKGMpO2YmJkFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoZixmdW5jdGlvbihoKXtoPT1kP2U9ITA6aCYmdGhpcy51KGIsaCxkKX0sYSk7ZXx8b2MoYyxkKTt4YyhiLGMpO3JldHVybiBjfTt2Yy5wcm90b3R5cGUudT1mdW5jdGlvbihhLGIsYyl7Yj09YysiLWRpc2FibGVkIj9hLlgoITEpOmI9PWMrIi1ob3Jpem9udGFsIj96YyhhLCJob3Jpem9udGFsIik6Yj09YysiLXZlcnRpY2FsIiYmemMoYSwidmVydGljYWwiKX07CnZhciB4Yz1mdW5jdGlvbihhLGIpe2lmKGIpZm9yKHZhciBjPWIuZmlyc3RDaGlsZCxkO2MmJmMucGFyZW50Tm9kZT09Yjspe2Q9Yy5uZXh0U2libGluZztpZihjLm5vZGVUeXBlPT0xKXthOnt2YXIgZT1jO3AoZSk7ZT1MKGUpO2Zvcih2YXIgZj1lLmxlbmd0aCxoPTA7aDxmO2grKyl7dmFyIGs9ZVtoXTtpZihrPWsgaW4gc2M/c2Nba10oKTpudWxsKXtlPWs7YnJlYWsgYX19ZT1udWxsfWUmJihlLmc9YyxhLmlzRW5hYmxlZCgpfHxlLlgoITEpLGEuQmEoZSksU2IoZSxjKSl9ZWxzZSBjLm5vZGVWYWx1ZSYmSGEoYy5ub2RlVmFsdWUpIT0iInx8Yi5yZW1vdmVDaGlsZChjKTtjPWR9fSxBYz1mdW5jdGlvbihhLGIpe2I9Yi5pKCk7cChiLCJUaGUgY29udGFpbmVyIERPTSBlbGVtZW50IGNhbm5vdCBiZSBudWxsLiIpO0tiKGIsdCk7KGE9YS5BKSYmWmIoYixhKX07dmMucHJvdG90eXBlLmc9ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy1jb250YWluZXIifTsKdmMucHJvdG90eXBlLmo9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nKCksYz1bYixhLkw9PSJob3Jpem9udGFsIj9iKyItaG9yaXpvbnRhbCI6YisiLXZlcnRpY2FsIl07YS5pc0VuYWJsZWQoKXx8Yy5wdXNoKGIrIi1kaXNhYmxlZCIpO3JldHVybiBjfTt2YXIgQmM9ZnVuY3Rpb24oKXt9O3ZhciBNPWZ1bmN0aW9uKCl7fSxDYztpYShNKTt2YXIgRGM9e2J1dHRvbjoicHJlc3NlZCIsY2hlY2tib3g6ImNoZWNrZWQiLG1lbnVpdGVtOiJzZWxlY3RlZCIsbWVudWl0ZW1jaGVja2JveDoiY2hlY2tlZCIsbWVudWl0ZW1yYWRpbzoiY2hlY2tlZCIscmFkaW86ImNoZWNrZWQiLHRhYjoic2VsZWN0ZWQiLHRyZWVpdGVtOiJzZWxlY3RlZCJ9O00ucHJvdG90eXBlLk5hPWZ1bmN0aW9uKCl7fTtNLnByb3RvdHlwZS54YT1mdW5jdGlvbihhKXt2YXIgYj1hLkcsYz1iLmgsZD10aGlzLk4oKSxlPVtkXSxmPXRoaXMuTigpO2YhPWQmJmUucHVzaChmKTtkPWEubTtmb3IoZj1bXTtkOyl7dmFyIGg9ZCYtZDtmLnB1c2goRWModGhpcyxoKSk7ZCY9fmh9ZS5wdXNoLmFwcGx5KGUsZik7KGQ9YS5GYSkmJmUucHVzaC5hcHBseShlLGQpO3JldHVybiBjLmNhbGwoYiwiRElWIixlLmpvaW4oIiAiKSxhLmlhKX07Ck0ucHJvdG90eXBlLnlhPWZ1bmN0aW9uKGEsYil7Yi5pZCYmUGIoYSxiLmlkKTtiJiZiLmZpcnN0Q2hpbGQ/RmMoYSxiLmZpcnN0Q2hpbGQubmV4dFNpYmxpbmc/eWEoYi5jaGlsZE5vZGVzKTpiLmZpcnN0Q2hpbGQpOmEuaWE9bnVsbDt2YXIgYz0wLGQ9dGhpcy5OKCksZT10aGlzLk4oKSxmPSExLGg9ITEsaz15YShMKGIpKTtrLmZvckVhY2goZnVuY3Rpb24ocSl7Znx8cSE9ZD9ofHxxIT1lP2N8PUdjKHRoaXMscSk6aD0hMDooZj0hMCxlPT1kJiYoaD0hMCkpO0djKHRoaXMscSk9PTEmJihzYShiKSxkYihiKSYmZWIoYikmJmNiKGIsITEpKX0sdGhpcyk7YS5tPWM7Znx8KGsucHVzaChkKSxlPT1kJiYoaD0hMCkpO2h8fGsucHVzaChlKTsoYT1hLkZhKSYmay5wdXNoLmFwcGx5KGssYSk7ZiYmaCYmIWF8fG1jKGIsay5qb2luKCIgIikpO3JldHVybiBifTsKdmFyIEhjPWZ1bmN0aW9uKGEsYil7aWYoYT1hLk5hKCkpe3AoYiwiVGhlIGVsZW1lbnQgcGFzc2VkIGFzIGEgZmlyc3QgcGFyYW1ldGVyIGNhbm5vdCBiZSBudWxsLiIpO3ZhciBjPWIuZ2V0QXR0cmlidXRlKCJyb2xlIil8fG51bGw7YSE9YyYmWmIoYixhKX19LEljPWZ1bmN0aW9uKGEsYil7dmFyIGM7aWYoYS5EJjMyJiYoYz1hLmkoKSkpe2lmKCFiJiZhLm0mMzIpe3RyeXtjLmJsdXIoKX1jYXRjaChkKXt9YS5tJjMyJiZhLlFhKG51bGwpfShkYihjKSYmZWIoYykpIT1iJiZjYihjLGIpfX0sSmM9ZnVuY3Rpb24oYSxiLGMpe0NjfHwoQ2M9ezE6ImRpc2FibGVkIiw4OiJzZWxlY3RlZCIsMTY6ImNoZWNrZWQiLDY0OiJleHBhbmRlZCJ9KTtwKGEsIlRoZSBlbGVtZW50IHBhc3NlZCBhcyBhIGZpcnN0IHBhcmFtZXRlciBjYW5ub3QgYmUgbnVsbC4iKTtiPUNjW2JdO3ZhciBkPWEuZ2V0QXR0cmlidXRlKCJyb2xlIil8fG51bGw7ZCYmKGQ9RGNbZF18fGIsYj1iPT0iY2hlY2tlZCJ8fGI9PQoic2VsZWN0ZWQiP2Q6Yik7YiYmYWMoYSxiLGMpfTtNLnByb3RvdHlwZS5OPWZ1bmN0aW9uKCl7cmV0dXJuImdvb2ctY29udHJvbCJ9O3ZhciBFYz1mdW5jdGlvbihhLGIpe2EuZ3x8S2MoYSk7cmV0dXJuIGEuZ1tiXX0sR2M9ZnVuY3Rpb24oYSxiKXthLmh8fChhLmd8fEtjKGEpLGEuaD1FYShhLmcpKTthPXBhcnNlSW50KGEuaFtiXSwxMCk7cmV0dXJuIGlzTmFOKGEpPzA6YX0sS2M9ZnVuY3Rpb24oYSl7dmFyIGI9YS5OKCk7dmFyIGM9Yi5yZXBsYWNlKC9ceGEwfFxzL2csIiAiKS5pbmRleE9mKCIgIikhPS0xO3AoIWMsIkNvbnRyb2xSZW5kZXJlciBoYXMgYW4gaW52YWxpZCBjc3MgY2xhc3M6ICciK2IrIiciKTthLmc9ezE6YisiLWRpc2FibGVkIiwyOmIrIi1ob3ZlciIsNDpiKyItYWN0aXZlIiw4OmIrIi1zZWxlY3RlZCIsMTY6YisiLWNoZWNrZWQiLDMyOmIrIi1mb2N1c2VkIiw2NDpiKyItb3BlbiJ9fTt2YXIgTj1mdW5jdGlvbihhLGIsYyl7Ri5jYWxsKHRoaXMsYyk7aWYoIWIpe2ZvcihiPXRoaXMuY29uc3RydWN0b3I7Yjspe3ZhciBkPW5hKGIpO2lmKGQ9dWNbZF0pYnJlYWs7Yj0oYj1PYmplY3QuZ2V0UHJvdG90eXBlT2YoYi5wcm90b3R5cGUpKSYmYi5jb25zdHJ1Y3Rvcn1iPWQ/dHlwZW9mIGQuVj09PSJmdW5jdGlvbiI/ZC5WKCk6bmV3IGQ6bnVsbH10aGlzLnY9Yjt0aGlzLmlhPWEhPT12b2lkIDA/YTpudWxsfTtuKE4sRik7Zz1OLnByb3RvdHlwZTtnLmlhPW51bGw7Zy5tPTA7Zy5EPTM5O2cuUD0wO2cuT2E9ITA7Zy5GYT1udWxsO2cuSGE9ITA7Zy5tYT1mdW5jdGlvbigpe3ZhciBhPXRoaXMudi54YSh0aGlzKTt0aGlzLmc9YTtIYyh0aGlzLnYsYSk7S2IoYSwhMCk7dGhpcy5pc1Zpc2libGUoKXx8KGEuc3R5bGUuZGlzcGxheT0ibm9uZSIsYSYmYWMoYSwiaGlkZGVuIiwhMCkpfTtnLm5hPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaSgpfTtnLndhPWZ1bmN0aW9uKCl7cmV0dXJuITB9OwpnLkVhPWZ1bmN0aW9uKGEpe3RoaXMuZz1hPXRoaXMudi55YSh0aGlzLGEpO0hjKHRoaXMudixhKTtLYihhLCEwKTt0aGlzLk9hPWEuc3R5bGUuZGlzcGxheSE9Im5vbmUifTsKZy5JPWZ1bmN0aW9uKCl7Ti5sLkkuY2FsbCh0aGlzKTt2YXIgYT10aGlzLmc7cChhLCJDYW4gbm90IGNhbGwgZ2V0RWxlbWVudFN0cmljdCBiZWZvcmUgcmVuZGVyaW5nL2RlY29yYXRpbmcuIik7cCh0aGlzKTtwKGEpO3RoaXMuaXNWaXNpYmxlKCl8fGFjKGEsImhpZGRlbiIsIXRoaXMuaXNWaXNpYmxlKCkpO3RoaXMuaXNFbmFibGVkKCl8fEpjKGEsMSwhdGhpcy5pc0VuYWJsZWQoKSk7dGhpcy5EJjgmJkpjKGEsOCwhISh0aGlzLm0mOCkpO3RoaXMuRCYxNiYmSmMoYSwxNiwhISh0aGlzLm0mMTYpKTt0aGlzLkQmNjQmJkpjKGEsNjQsISEodGhpcy5tJjY0KSk7dmFyIGI9dGhpcy52O1ViKHRoaXMpJiYoYT10aGlzLmkoKSxiPWIuTigpKyItcnRsIiwoYT1hLmk/YS5pKCk6YSkmJnBjKGEsW2JdKSk7dGhpcy5pc0VuYWJsZWQoKSYmSWModGhpcyx0aGlzLmlzVmlzaWJsZSgpKTt0aGlzLkQmLTImJih0aGlzLkhhJiZMYyh0aGlzLCEwKSx0aGlzLkQmMzImJihhPXRoaXMuaSgpKSkmJihiPQp0aGlzLlp8fCh0aGlzLlo9bmV3IEopLGdjKGIsYSksQihCKEIoUWIodGhpcyksYiwia2V5Iix0aGlzLmFhKSxhLCJmb2N1cyIsdGhpcy5YYSksYSwiYmx1ciIsdGhpcy5RYSkpfTt2YXIgTGM9ZnVuY3Rpb24oYSxiKXt2YXIgYz1RYihhKSxkPWEuaSgpO2I/KEIoQihCKEIoYyxkLEsuZ2EsYS5zYSksZCxbSy5oYSxLLmZhXSxhLnZhKSxkLCJtb3VzZW92ZXIiLGEudWEpLGQsIm1vdXNlb3V0IixhLnRhKSxhLmNhIT1CYyYmQihjLGQsImNvbnRleHRtZW51IixhLmNhKSk6KEMoQyhDKEMoYyxkLEsuZ2EsYS5zYSksZCxbSy5oYSxLLmZhXSxhLnZhKSxkLCJtb3VzZW92ZXIiLGEudWEpLGQsIm1vdXNlb3V0IixhLnRhKSxhLmNhIT1CYyYmQyhjLGQsImNvbnRleHRtZW51IixhLmNhKSl9O04ucHJvdG90eXBlLlU9ZnVuY3Rpb24oKXtOLmwuVS5jYWxsKHRoaXMpO3RoaXMuWiYma2ModGhpcy5aKTt0aGlzLmlzVmlzaWJsZSgpJiZ0aGlzLmlzRW5hYmxlZCgpJiZJYyh0aGlzLCExKX07Ck4ucHJvdG90eXBlLkM9ZnVuY3Rpb24oKXtOLmwuQy5jYWxsKHRoaXMpO3RoaXMuWiYmKHRoaXMuWi5kaXNwb3NlKCksZGVsZXRlIHRoaXMuWik7ZGVsZXRlIHRoaXMudjt0aGlzLkZhPXRoaXMuaWE9bnVsbH07dmFyIEZjPWZ1bmN0aW9uKGEsYil7YS5pYT1ifTtOLnByb3RvdHlwZS5pc1Zpc2libGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5PYX07Ti5wcm90b3R5cGUuaXNFbmFibGVkPWZ1bmN0aW9uKCl7cmV0dXJuISh0aGlzLm0mMSl9O04ucHJvdG90eXBlLlg9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5oO2ImJnR5cGVvZiBiLmlzRW5hYmxlZD09ImZ1bmN0aW9uIiYmIWIuaXNFbmFibGVkKCl8fCFPKHRoaXMsMSwhYSl8fChhfHwoTWModGhpcywhMSksUCh0aGlzLCExKSksdGhpcy5pc1Zpc2libGUoKSYmSWModGhpcyxhKSxUKHRoaXMsMSwhYSwhMCkpfTt2YXIgUD1mdW5jdGlvbihhLGIpe08oYSwyLGIpJiZUKGEsMixiKX07Ck4ucHJvdG90eXBlLmlzQWN0aXZlPWZ1bmN0aW9uKCl7cmV0dXJuISEodGhpcy5tJjQpfTsKdmFyIE1jPWZ1bmN0aW9uKGEsYil7TyhhLDQsYikmJlQoYSw0LGIpfSxOYz1mdW5jdGlvbihhLGIpe08oYSw4LGIpJiZUKGEsOCxiKX0sT2M9ZnVuY3Rpb24oYSxiKXtPKGEsNjQsYikmJlQoYSw2NCxiKX0sVD1mdW5jdGlvbihhLGIsYyxkKXtpZighZCYmYj09MSlhLlgoIWMpO2Vsc2UgaWYoYS5EJmImJmMhPSEhKGEubSZiKSl7dmFyIGU9YS52O2lmKGQ9YS5pKCkpe2lmKGU9RWMoZSxiKSl7dmFyIGY9YS5pP2EuaSgpOmE7ZiYmKGM/cGM6cmMpKGYsW2VdKX1KYyhkLGIsYyl9YS5tPWM/YS5tfGI6YS5tJn5ifX0sUGM9ZnVuY3Rpb24oYSxiLGMpe2lmKGEucyYmYS5tJmImJiFjKXRocm93IEVycm9yKCJDb21wb25lbnQgYWxyZWFkeSByZW5kZXJlZCIpOyFjJiZhLm0mYiYmVChhLGIsITEpO2EuRD1jP2EuRHxiOmEuRCZ+Yn0sVT1mdW5jdGlvbihhLGIpe3JldHVybiEhKDI1NSZiKSYmISEoYS5EJmIpfSxPPWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4hIShhLkQmYikmJiEhKGEubSZiKSE9CmMmJighKGEuUCZiKXx8RShhLE5iKGIsYykpKSYmIWEuYmF9O04ucHJvdG90eXBlLnVhPWZ1bmN0aW9uKGEpeyFRYyhhLHRoaXMuaSgpKSYmRSh0aGlzLCJlbnRlciIpJiZ0aGlzLmlzRW5hYmxlZCgpJiZVKHRoaXMsMikmJlAodGhpcywhMCl9O04ucHJvdG90eXBlLnRhPWZ1bmN0aW9uKGEpeyFRYyhhLHRoaXMuaSgpKSYmRSh0aGlzLCJsZWF2ZSIpJiYoVSh0aGlzLDQpJiZNYyh0aGlzLCExKSxVKHRoaXMsMikmJlAodGhpcywhMSkpfTtOLnByb3RvdHlwZS5jYT1CYzt2YXIgUWM9ZnVuY3Rpb24oYSxiKXtyZXR1cm4hIWEucmVsYXRlZFRhcmdldCYmYWIoYixhLnJlbGF0ZWRUYXJnZXQpfTsKTi5wcm90b3R5cGUuc2E9ZnVuY3Rpb24oYSl7aWYodGhpcy5pc0VuYWJsZWQoKSYmKFUodGhpcywyKSYmUCh0aGlzLCEwKSwhKGEuaC5idXR0b24hPTB8fHYmJmEuY3RybEtleSkpKXtVKHRoaXMsNCkmJk1jKHRoaXMsITApO3ZhciBiO2lmKGI9dGhpcy52KXt2YXIgYztiPXRoaXMuRCYzMiYmKGM9dGhpcy5pKCkpP2RiKGMpJiZlYihjKTohMX1iJiZ0aGlzLmkoKS5mb2N1cygpfWEuaC5idXR0b24hPTB8fHYmJmEuY3RybEtleXx8YS5qKCl9O04ucHJvdG90eXBlLnZhPWZ1bmN0aW9uKGEpe3RoaXMuaXNFbmFibGVkKCkmJihVKHRoaXMsMikmJlAodGhpcywhMCksdGhpcy5pc0FjdGl2ZSgpJiZSYyh0aGlzLGEpJiZVKHRoaXMsNCkmJk1jKHRoaXMsITEpKX07CnZhciBSYz1mdW5jdGlvbihhLGIpe2lmKFUoYSwxNikpe3ZhciBjPSEoYS5tJjE2KTtPKGEsMTYsYykmJlQoYSwxNixjKX1VKGEsOCkmJk5jKGEsITApO1UoYSw2NCkmJk9jKGEsIShhLm0mNjQpKTtjPW5ldyB5KCJhY3Rpb24iLGEpO2ImJihjLmFsdEtleT1iLmFsdEtleSxjLmN0cmxLZXk9Yi5jdHJsS2V5LGMubWV0YUtleT1iLm1ldGFLZXksYy5zaGlmdEtleT1iLnNoaWZ0S2V5LGMuRz1iLkcsYy50aW1lU3RhbXA9Yi50aW1lU3RhbXApO3JldHVybiBFKGEsYyl9O04ucHJvdG90eXBlLlhhPWZ1bmN0aW9uKCl7VSh0aGlzLDMyKSYmTyh0aGlzLDMyLCEwKSYmVCh0aGlzLDMyLCEwKX07Ti5wcm90b3R5cGUuUWE9ZnVuY3Rpb24oKXtVKHRoaXMsNCkmJk1jKHRoaXMsITEpO1UodGhpcywzMikmJk8odGhpcywzMiwhMSkmJlQodGhpcywzMiwhMSl9OwpOLnByb3RvdHlwZS5hYT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5pc1Zpc2libGUoKSYmdGhpcy5pc0VuYWJsZWQoKSYmYS5nPT0xMyYmUmModGhpcyxhKT8oYS5qKCksYS52KCksITApOiExfTtpZih0eXBlb2YgTiE9PSJmdW5jdGlvbiIpdGhyb3cgRXJyb3IoIkludmFsaWQgY29tcG9uZW50IGNsYXNzICIrTik7aWYodHlwZW9mIE0hPT0iZnVuY3Rpb24iKXRocm93IEVycm9yKCJJbnZhbGlkIHJlbmRlcmVyIGNsYXNzICIrTSk7dmFyIFNjPW5hKE4pO3VjW1NjXT1NO3RjKCJnb29nLWNvbnRyb2wiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBOKG51bGwpfSk7dmFyIFY9ZnVuY3Rpb24oYSxiLGMpe0YuY2FsbCh0aGlzLGMpO3RoaXMuZWE9Ynx8dmMuVigpO3RoaXMuTD1hfHwidmVydGljYWwifTtuKFYsRik7Zz1WLnByb3RvdHlwZTtnLkthPW51bGw7Zy5kYT1udWxsO2cuZWE9bnVsbDtnLkw9bnVsbDtnLlM9ITA7Zy5UPSEwO2cubz0tMTtnLkI9bnVsbDtnLlc9ITE7Zy5PPW51bGw7dmFyIFRjPWZ1bmN0aW9uKGEpe3JldHVybiBhLkthfHxhLmkoKX07Zz1WLnByb3RvdHlwZTtnLm1hPWZ1bmN0aW9uKCl7dGhpcy5nPXRoaXMuRy5oKCJESVYiLHRoaXMuZWEuaih0aGlzKS5qb2luKCIgIikpfTtnLm5hPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaSgpfTtnLndhPWZ1bmN0aW9uKGEpe3JldHVybiBhLnRhZ05hbWU9PSJESVYifTtnLkVhPWZ1bmN0aW9uKGEpe3RoaXMuZz15Yyh0aGlzLmVhLHRoaXMsYSk7YS5zdHlsZS5kaXNwbGF5PT0ibm9uZSImJih0aGlzLlM9ITEpfTsKZy5JPWZ1bmN0aW9uKCl7Vi5sLkkuY2FsbCh0aGlzKTtUYih0aGlzLGZ1bmN0aW9uKGIpe2IucyYmVWModGhpcyxiKX0sdGhpcyk7dmFyIGE9dGhpcy5pKCk7QWModGhpcy5lYSx0aGlzKTtWYyh0aGlzLHRoaXMuUyk7QihCKEIoQihCKEIoQihCKFFiKHRoaXMpLHRoaXMsImVudGVyIix0aGlzLmViKSx0aGlzLCJoaWdobGlnaHQiLHRoaXMuZmIpLHRoaXMsInVuaGlnaGxpZ2h0Iix0aGlzLmxiKSx0aGlzLCJvcGVuIix0aGlzLmdiKSx0aGlzLCJjbG9zZSIsdGhpcy5iYiksYSxLLmdhLHRoaXMuV2EpLGJiKGEpLFtLLmhhLEsuZmFdLHRoaXMuY2IpLGEsW0suZ2EsSy5oYSxLLmZhLCJtb3VzZW92ZXIiLCJtb3VzZW91dCIsImNvbnRleHRtZW51Il0sdGhpcy5hYik7V2ModGhpcyl9O3ZhciBXYz1mdW5jdGlvbihhKXt2YXIgYj1RYihhKSxjPVRjKGEpO0IoQihCKGIsYywiZm9jdXMiLGEuUGEpLGMsImJsdXIiLGEuVWEpLGEuZGF8fChhLmRhPW5ldyBKKFRjKGEpKSksImtleSIsYS5WYSl9OwpnPVYucHJvdG90eXBlO2cuVT1mdW5jdGlvbigpe1hjKHRoaXMsLTEpO3RoaXMuQiYmT2ModGhpcy5CLCExKTt0aGlzLlc9ITE7Vi5sLlUuY2FsbCh0aGlzKX07Zy5DPWZ1bmN0aW9uKCl7Vi5sLkMuY2FsbCh0aGlzKTt0aGlzLmRhJiYodGhpcy5kYS5kaXNwb3NlKCksdGhpcy5kYT1udWxsKTt0aGlzLmVhPXRoaXMuQj10aGlzLk89dGhpcy5LYT1udWxsfTtnLmViPWZ1bmN0aW9uKCl7cmV0dXJuITB9OwpnLmZiPWZ1bmN0aW9uKGEpe3ZhciBiPVZiKHRoaXMsYS50YXJnZXQpO2lmKGI+LTEmJmIhPXRoaXMubyl7dmFyIGM9SSh0aGlzLHRoaXMubyk7YyYmUChjLCExKTt0aGlzLm89YjtjPUkodGhpcyx0aGlzLm8pO3RoaXMuVyYmTWMoYywhMCk7dGhpcy5CJiZjIT10aGlzLkImJihjLkQmNjQ/T2MoYywhMCk6T2ModGhpcy5CLCExKSl9Yj10aGlzLmkoKTtwKGIsIlRoZSBET00gZWxlbWVudCBmb3IgdGhlIGNvbnRhaW5lciBjYW5ub3QgYmUgbnVsbC4iKTthLnRhcmdldC5pKCkhPW51bGwmJmFjKGIsImFjdGl2ZWRlc2NlbmRhbnQiLGEudGFyZ2V0LmkoKS5pZCl9O2cubGI9ZnVuY3Rpb24oYSl7YS50YXJnZXQ9PUkodGhpcyx0aGlzLm8pJiYodGhpcy5vPS0xKTthPXRoaXMuaSgpO3AoYSwiVGhlIERPTSBlbGVtZW50IGZvciB0aGUgY29udGFpbmVyIGNhbm5vdCBiZSBudWxsLiIpO2EucmVtb3ZlQXR0cmlidXRlKCRiKCJhY3RpdmVkZXNjZW5kYW50IikpfTsKZy5nYj1mdW5jdGlvbihhKXsoYT1hLnRhcmdldCkmJmEhPXRoaXMuQiYmYS5oPT10aGlzJiYodGhpcy5CJiZPYyh0aGlzLkIsITEpLHRoaXMuQj1hKX07Zy5iYj1mdW5jdGlvbihhKXthLnRhcmdldD09dGhpcy5CJiYodGhpcy5CPW51bGwpO3ZhciBiPXRoaXMuaSgpLGM9YS50YXJnZXQuaSgpO2ImJmEudGFyZ2V0Lm0mMiYmYyYmKGE9IiIsYyYmKGE9Yy5pZCxwKGEsIlRoZSBhY3RpdmUgZWxlbWVudCBzaG91bGQgaGF2ZSBhbiBpZC4iKSksYWMoYiwiYWN0aXZlZGVzY2VuZGFudCIsYSkpfTtnLldhPWZ1bmN0aW9uKGEpe3RoaXMuVCYmKHRoaXMuVz0hMCk7dmFyIGI9VGModGhpcyk7YiYmZGIoYikmJmViKGIpP2IuZm9jdXMoKTphLmooKX07Zy5jYj1mdW5jdGlvbigpe3RoaXMuVz0hMX07CmcuYWI9ZnVuY3Rpb24oYSl7YTp7dmFyIGI9YS50YXJnZXQ7aWYodGhpcy5PKWZvcih2YXIgYz10aGlzLmkoKTtiJiZiIT09Yzspe3ZhciBkPWIuaWQ7aWYoZCBpbiB0aGlzLk8pe2I9dGhpcy5PW2RdO2JyZWFrIGF9Yj1iLnBhcmVudE5vZGV9Yj1udWxsfWlmKGIpc3dpdGNoKGEudHlwZSl7Y2FzZSBLLmdhOmIuc2EoYSk7YnJlYWs7Y2FzZSBLLmhhOmNhc2UgSy5mYTpiLnZhKGEpO2JyZWFrO2Nhc2UgIm1vdXNlb3ZlciI6Yi51YShhKTticmVhaztjYXNlICJtb3VzZW91dCI6Yi50YShhKTticmVhaztjYXNlICJjb250ZXh0bWVudSI6Yi5jYShhKX19O2cuUGE9ZnVuY3Rpb24oKXt9O2cuVWE9ZnVuY3Rpb24oKXtYYyh0aGlzLC0xKTt0aGlzLlc9ITE7dGhpcy5CJiZPYyh0aGlzLkIsITEpfTsKZy5WYT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5pc0VuYWJsZWQoKSYmdGhpcy5pc1Zpc2libGUoKSYmKEgodGhpcykhPTB8fHRoaXMuS2EpJiZZYyh0aGlzLGEpPyhhLmooKSxhLnYoKSwhMCk6ITF9Owp2YXIgWWM9ZnVuY3Rpb24oYSxiKXt2YXIgYz1JKGEsYS5vKTtpZihjJiZ0eXBlb2YgYy5hYT09ImZ1bmN0aW9uIiYmYy5hYShiKXx8YS5CJiZhLkIhPWMmJnR5cGVvZiBhLkIuYWE9PSJmdW5jdGlvbiImJmEuQi5hYShiKSlyZXR1cm4hMDtpZihiLnNoaWZ0S2V5fHxiLmN0cmxLZXl8fGIubWV0YUtleXx8Yi5hbHRLZXkpcmV0dXJuITE7c3dpdGNoKGIuZyl7Y2FzZSAyNzpUYyhhKS5ibHVyKCk7YnJlYWs7Y2FzZSAzNjpaYyhhKTticmVhaztjYXNlIDM1OiRjKGEpO2JyZWFrO2Nhc2UgMzg6aWYoYS5MPT0idmVydGljYWwiKWFkKGEpO2Vsc2UgcmV0dXJuITE7YnJlYWs7Y2FzZSAzNzppZihhLkw9PSJob3Jpem9udGFsIilVYihhKT9iZChhKTphZChhKTtlbHNlIHJldHVybiExO2JyZWFrO2Nhc2UgNDA6aWYoYS5MPT0idmVydGljYWwiKWJkKGEpO2Vsc2UgcmV0dXJuITE7YnJlYWs7Y2FzZSAzOTppZihhLkw9PSJob3Jpem9udGFsIilVYihhKT9hZChhKTpiZChhKTtlbHNlIHJldHVybiExOwpicmVhaztkZWZhdWx0OnJldHVybiExfXJldHVybiEwfSxVYz1mdW5jdGlvbihhLGIpe3ZhciBjPWIuaSgpO2M9Yy5pZHx8KGMuaWQ9T2IoYikpO2EuT3x8KGEuTz17fSk7YS5PW2NdPWJ9O1YucHJvdG90eXBlLkJhPWZ1bmN0aW9uKGEsYil7dWEoYSxOLCJUaGUgY2hpbGQgb2YgYSBjb250YWluZXIgbXVzdCBiZSBhIGNvbnRyb2wiKTtWLmwuQmEuY2FsbCh0aGlzLGEsYil9O1YucHJvdG90eXBlLkNhPWZ1bmN0aW9uKGEsYixjKXt1YShhLE4pO2EuUHw9MjthLlB8PTY0O1BjKGEsMzIsITEpO2EucyYmMCE9YS5IYSYmTGMoYSwhMSk7YS5IYT0hMTt2YXIgZD1hLmg9PXRoaXM/VmIodGhpcyxhKTotMTtWLmwuQ2EuY2FsbCh0aGlzLGEsYixjKTthLnMmJnRoaXMucyYmVWModGhpcyxhKTthPWQ7YT09LTEmJihhPUgodGhpcykpO2E9PXRoaXMubz90aGlzLm89TWF0aC5taW4oSCh0aGlzKS0xLGIpOmE+dGhpcy5vJiZiPD10aGlzLm8/dGhpcy5vKys6YTx0aGlzLm8mJmI+dGhpcy5vJiZ0aGlzLm8tLX07CnZhciB6Yz1mdW5jdGlvbihhLGIpe2lmKGEuaSgpKXRocm93IEVycm9yKCJDb21wb25lbnQgYWxyZWFkeSByZW5kZXJlZCIpO2EuTD1ifTtWLnByb3RvdHlwZS5pc1Zpc2libGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5TfTt2YXIgVmM9ZnVuY3Rpb24oYSxiKXthLlM9Yjt2YXIgYz1hLmkoKTtjJiYoYy5zdHlsZS5kaXNwbGF5PWI/IiI6Im5vbmUiLHdjKFRjKGEpLGEuVCYmYS5TKSl9O1YucHJvdG90eXBlLmlzRW5hYmxlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLlR9O1YucHJvdG90eXBlLlg9ZnVuY3Rpb24oYSl7dGhpcy5UIT1hJiZFKHRoaXMsYT8iZW5hYmxlIjoiZGlzYWJsZSIpJiYoYT8odGhpcy5UPSEwLFRiKHRoaXMsZnVuY3Rpb24oYil7Yi5UYT9kZWxldGUgYi5UYTpiLlgoITApfSkpOihUYih0aGlzLGZ1bmN0aW9uKGIpe2IuaXNFbmFibGVkKCk/Yi5YKCExKTpiLlRhPSEwfSksdGhpcy5XPXRoaXMuVD0hMSksd2MoVGModGhpcyksYSYmdGhpcy5TKSl9Owp2YXIgWGM9ZnVuY3Rpb24oYSxiKXsoYj1JKGEsYikpP1AoYiwhMCk6YS5vPi0xJiZQKEkoYSxhLm8pLCExKX0sWmM9ZnVuY3Rpb24oYSl7Y2QoYSxmdW5jdGlvbihiLGMpe3JldHVybihiKzEpJWN9LEgoYSktMSl9LCRjPWZ1bmN0aW9uKGEpe2NkKGEsZnVuY3Rpb24oYixjKXtiLS07cmV0dXJuIGI8MD9jLTE6Yn0sMCl9LGJkPWZ1bmN0aW9uKGEpe2NkKGEsZnVuY3Rpb24oYixjKXtyZXR1cm4oYisxKSVjfSxhLm8pfSxhZD1mdW5jdGlvbihhKXtjZChhLGZ1bmN0aW9uKGIsYyl7Yi0tO3JldHVybiBiPDA/Yy0xOmJ9LGEubyl9LGNkPWZ1bmN0aW9uKGEsYixjKXtjPWM8MD9WYihhLGEuQik6Yzt2YXIgZD1IKGEpO2M9Yi5jYWxsKGEsYyxkKTtmb3IodmFyIGU9MDtlPD1kOyl7dmFyIGY9SShhLGMpO2lmKGYmJmYuaXNWaXNpYmxlKCkmJmYuaXNFbmFibGVkKCkmJmYuRCYyKXthLkxhKGMpO2JyZWFrfWUrKztjPWIuY2FsbChhLGMsZCl9fTsKVi5wcm90b3R5cGUuTGE9ZnVuY3Rpb24oYSl7WGModGhpcyxhKX07dmFyIGRkPWZ1bmN0aW9uKCl7fTtuKGRkLE0pO2lhKGRkKTtnPWRkLnByb3RvdHlwZTtnLk49ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy10YWIifTtnLk5hPWZ1bmN0aW9uKCl7cmV0dXJuInRhYiJ9O2cueGE9ZnVuY3Rpb24oYSl7dmFyIGI9ZGQubC54YS5jYWxsKHRoaXMsYSk7KGE9YS5HYSgpKSYmdGhpcy5NYShiLGEpO3JldHVybiBifTtnLnlhPWZ1bmN0aW9uKGEsYil7Yj1kZC5sLnlhLmNhbGwodGhpcyxhLGIpO3ZhciBjPXRoaXMuR2EoYik7YyYmKGEuUmE9Yyk7YS5tJjgmJihjPWEuaCkmJnR5cGVvZiBjLko9PT0iZnVuY3Rpb24iJiYoVChhLDgsITEpLGMuSihhKSk7cmV0dXJuIGJ9O2cuR2E9ZnVuY3Rpb24oYSl7cmV0dXJuIGEudGl0bGV8fCIifTtnLk1hPWZ1bmN0aW9uKGEsYil7YSYmKGEudGl0bGU9Ynx8IiIpfTt2YXIgZWQ9ZnVuY3Rpb24oYSxiLGMpe04uY2FsbCh0aGlzLGEsYnx8ZGQuVigpLGMpO1BjKHRoaXMsOCwhMCk7dGhpcy5QfD05fTtuKGVkLE4pO2VkLnByb3RvdHlwZS5HYT1mdW5jdGlvbigpe3JldHVybiB0aGlzLlJhfTtlZC5wcm90b3R5cGUuTWE9ZnVuY3Rpb24oYSl7dGhpcy52Lk1hKHRoaXMuaSgpLGEpO3RoaXMuUmE9YX07dGMoImdvb2ctdGFiIixmdW5jdGlvbigpe3JldHVybiBuZXcgZWQobnVsbCl9KTt2YXIgVz1mdW5jdGlvbigpe3RoaXMuQT0idGFibGlzdCJ9O24oVyx2Yyk7aWEoVyk7Vy5wcm90b3R5cGUuZz1mdW5jdGlvbigpe3JldHVybiJnb29nLXRhYi1iYXIifTtXLnByb3RvdHlwZS51PWZ1bmN0aW9uKGEsYixjKXt0aGlzLnZ8fCh0aGlzLmh8fGZkKHRoaXMpLHRoaXMudj1FYSh0aGlzLmgpKTt2YXIgZD10aGlzLnZbYl07ZD8oemMoYSxnZChkKSksYS52PWQpOlcubC51LmNhbGwodGhpcyxhLGIsYyl9O1cucHJvdG90eXBlLmo9ZnVuY3Rpb24oYSl7dmFyIGI9Vy5sLmouY2FsbCh0aGlzLGEpO3RoaXMuaHx8ZmQodGhpcyk7Yi5wdXNoKHRoaXMuaFthLnZdKTtyZXR1cm4gYn07dmFyIGZkPWZ1bmN0aW9uKGEpe3ZhciBiPWEuZygpO2EuaD17dG9wOmIrIi10b3AiLGJvdHRvbTpiKyItYm90dG9tIixzdGFydDpiKyItc3RhcnQiLGVuZDpiKyItZW5kIn19O3ZhciBYPWZ1bmN0aW9uKGEsYixjKXthPWF8fCJ0b3AiO3pjKHRoaXMsZ2QoYSkpO3RoaXMudj1hO1YuY2FsbCh0aGlzLHRoaXMuTCxifHxXLlYoKSxjKTtoZCh0aGlzKX07bihYLFYpO2c9WC5wcm90b3R5cGU7Zy5IPW51bGw7Zy5JPWZ1bmN0aW9uKCl7WC5sLkkuY2FsbCh0aGlzKTtoZCh0aGlzKX07Zy5DPWZ1bmN0aW9uKCl7WC5sLkMuY2FsbCh0aGlzKTt0aGlzLkg9bnVsbH07Zy5MYT1mdW5jdGlvbihhKXtYLmwuTGEuY2FsbCh0aGlzLGEpO3RoaXMuSihJKHRoaXMsYSkpfTtnLko9ZnVuY3Rpb24oYSl7YT9OYyhhLCEwKTp0aGlzLkgmJk5jKHRoaXMuSCwhMSl9Owp2YXIgaWQ9ZnVuY3Rpb24oYSxiKXtpZihiJiZiPT1hLkgpe2Zvcih2YXIgYz1WYihhLGIpLGQ9Yy0xO2I9SShhLGQpO2QtLSl7dmFyIGU9YjtpZihlLmlzVmlzaWJsZSgpJiZlLmlzRW5hYmxlZCgpKXthLkooYik7cmV0dXJufX1mb3IoYys9MTtiPUkoYSxjKTtjKyspaWYoZD1iLGQuaXNWaXNpYmxlKCkmJmQuaXNFbmFibGVkKCkpe2EuSihiKTtyZXR1cm59YS5KKG51bGwpfX07Zz1YLnByb3RvdHlwZTtnLmpiPWZ1bmN0aW9uKGEpe3RoaXMuSCYmdGhpcy5IIT1hLnRhcmdldCYmTmModGhpcy5ILCExKTt0aGlzLkg9YS50YXJnZXR9O2cua2I9ZnVuY3Rpb24oYSl7YS50YXJnZXQ9PXRoaXMuSCYmKHRoaXMuSD1udWxsKX07Zy5oYj1mdW5jdGlvbihhKXtpZCh0aGlzLGEudGFyZ2V0KX07Zy5pYj1mdW5jdGlvbihhKXtpZCh0aGlzLGEudGFyZ2V0KX07Zy5QYT1mdW5jdGlvbigpe0kodGhpcyx0aGlzLm8pfHxYYyh0aGlzLFZiKHRoaXMsdGhpcy5IfHxJKHRoaXMsMCkpKX07CnZhciBoZD1mdW5jdGlvbihhKXtCKEIoQihCKFFiKGEpLGEsInNlbGVjdCIsYS5qYiksYSwidW5zZWxlY3QiLGEua2IpLGEsImRpc2FibGUiLGEuaGIpLGEsImhpZGUiLGEuaWIpfSxnZD1mdW5jdGlvbihhKXtyZXR1cm4gYT09InN0YXJ0Inx8YT09ImVuZCI/InZlcnRpY2FsIjoiaG9yaXpvbnRhbCJ9O3RjKCJnb29nLXRhYi1iYXIiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBYfSk7ZnVuY3Rpb24gamQoYSl7dmFyIGI9e3RvcDoiYm90dG9tIixib3R0b206InRvcCIsc3RhcnQ6InJpZ2h0IixlbmQ6ImxlZnQifVthLmxvY2F0aW9uXSxjPWEuZWxlbWVudElkLGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTtkLnRleHRDb250ZW50PSJcbiAgICBmaWVsZHNldCB7XG4gICAgICBwYWRkaW5nOiAxMHB4O1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgIzM2OTtcbiAgICB9XG5cbiAgICAjIitjKyIgLmdvb2ctdGFiLWNvbnRlbnQge1xuICAgICAgbWluLWhlaWdodDogM2VtO1xuICAgICAgbWFyZ2luOiAwO1xuICAgICAgYm9yZGVyOiAiK2EuYm9yZGVyKyIgc29saWQgIithLmJvcmRlckNvbG9yKyI7XG4gICAgICBib3JkZXItdG9wOiAwO1xuICAgICAgaGVpZ2h0OiAiK2EuY29udGVudEhlaWdodCsiO1xuICAgICAgcGFkZGluZzogNHB4IDhweDtcbiAgICAgIG1hcmdpbi1yaWdodDogNHB4O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgIG92ZXJmbG93OiBhdXRvO1xuICAgIH1cblxuICAgICMiKwpjKyIgLmdvb2ctdGFiLWJhci0iK2EubG9jYXRpb24rIiAuZ29vZy10YWItc2VsZWN0ZWQge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICIrYS5ib3JkZXJDb2xvcisiO1xuICAgICAgYm9yZGVyLSIrYisiOiAwcHg7XG4gICAgfVxuXG4gICAgIyIrYysiIC5nb29nLXRhYi1iYXItIithLmxvY2F0aW9uKyIge1xuICAgICAgcGFkZGluZy0iK2EubG9jYXRpb24rIjogNXB4ICFpbXBvcnRhbnQ7XG4gICAgICBib3JkZXItIitiKyI6IDFweCBzb2xpZCAiK2EuYm9yZGVyQ29sb3IrIiAhaW1wb3J0YW50O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICB9XG5cbiAgICAjIitjKyIgLmdvb2ctdGFiLWJhciB7XG4gICAgICAgbWFyZ2luOiAwO1xuICAgICAgIGJvcmRlcjogMDtcbiAgICAgICBwYWRkaW5nOiAwO1xuICAgICAgIGxpc3Qtc3R5bGU6IG5vbmU7XG4gICAgICAgY3Vyc29yOiBkZWZhdWx0O1xuICAgICAgIG91dGxpbmU6IG5vbmU7XG4gICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgICBtYXJnaW4tcmlnaHQ6IDRweDtcbiAgICAgIH1cblxuICAgICAjIisKYysiIC5nb29nLXRhYiB7XG4gICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgIHBhZGRpbmc6IDRweCA4cHg7XG4gICAgICAgY29sb3I6IHZhcigtLWNvbGFiLXByaW1hcnktdGV4dC1jb2xvcik7XG4gICAgICAgdGV4dC1kZWNvcmF0aW9uOiBpbml0aWFsO1xuICAgICAgIGN1cnNvcjogZGVmYXVsdDtcbiAgICAgIH1cblxuICAgICAgIyIrYysiIC5nb29nLXRhYi1ob3ZlciB7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWNvbGFiLWhpZ2hsaWdodGVkLXN1cmZhY2UtY29sb3IpO1xuICAgICAgfVxuICAgICAgIjtyZXR1cm4gZH0KdmFyIGtkPWZ1bmN0aW9uKGEpe3ZhciBiPWEuZWxlbWVudElkLGM9YS50YWJOYW1lcyxkPWEuc2VsZWN0ZWRJbmRleDsiY29udGVudEJvcmRlciJpbiBhfHwoYS5jb250ZW50Qm9yZGVyPSIwcHgiKTsiY29udGVudEhlaWdodCJpbiBhfHwoYS5jb250ZW50SGVpZ2h0PSJpbml0aWFsIik7ImJvcmRlckNvbG9yImluIGF8fChhLmJvcmRlckNvbG9yPSJ2YXIoLS1jb2xhYi1ib3JkZXItY29sb3IpIik7YS5sb2NhdGlvbnx8KGEubG9jYXRpb249InRvcCIpO3ZhciBlPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiMiK2IpLGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zi5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYi1iYXIiKTt2YXIgaD1hLmxvY2F0aW9uO2YuY2xhc3NMaXN0LmFkZCgiZ29vZy10YWItYmFyLSIraCk7Zm9yKHZhciBrPVtdLHE9ZmEoYyksRz1xLm5leHQoKTshRy5kb25lO0c9cS5uZXh0KCkpe0c9Ry52YWx1ZTt2YXIgeD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKeC5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYiIpO3gudGV4dENvbnRlbnQ9RztmLmFwcGVuZENoaWxkKHgpO2sucHVzaCh4KX1oIT0iYm90dG9tIiYmZS5hcHBlbmRDaGlsZChmKTtxPW51bGw7aWYoaD09InRvcCJ8fGg9PSJib3R0b20iKXE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikscS5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYi1iYXItY2xlYXIiKTtoPT0idG9wIiYmcSYmZS5hcHBlbmRDaGlsZChxKTtHPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO0cuY2xhc3NMaXN0LmFkZCgiZ29vZy10YWItY29udGVudCIpO3ZhciBoYT1bXTtjPWZhKGMpO2Zvcih4PWMubmV4dCgpOyF4LmRvbmU7eD1jLm5leHQoKSl4PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHguaWQ9ZS5pZCsiX2NvbnRlbnRfIitoYS5sZW5ndGgseC5zdHlsZS5kaXNwbGF5PSJub25lIixHLmFwcGVuZENoaWxkKHgpLGhhLnB1c2goeCk7ZS5hcHBlbmRDaGlsZChHKTtoPT0iYm90dG9tIiYmKHEmJgplLmFwcGVuZENoaWxkKHEpLGUuYXBwZW5kQ2hpbGQoZikpO3ZhciBRPW5ldyBYKGgpO1NiKFEsZik7dmFyIFI9LTE7d2IoUSwic2VsZWN0IixmdW5jdGlvbihTKXtTPWsuaW5kZXhPZihTLnRhcmdldC5pKCkpO1MhPVImJihSPj0wJiZSPGhhLmxlbmd0aCYmKGhhW1JdLnN0eWxlLmRpc3BsYXk9Im5vbmUiLFI9LTEpLFM+PTAmJlM8aGEubGVuZ3RoJiYoUj1TLGhhW1JdLnN0eWxlLmRpc3BsYXk9ImlubGluZSIsd2luZG93LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCJyZXNpemUiKSksZ29vZ2xlLmNvbGFiLm91dHB1dC5yZXNpemVJZnJhbWVUb0NvbnRlbnQoKSksUS5KKEkoUSxSKSkpfSk7US5KKEkoUSxkKSk7d2luZG93W2JdPXtzZXRTZWxlY3RlZFRhYkluZGV4OmZ1bmN0aW9uKFMpe1EuSihJKFEsUykpfX07ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChqZChhKSl9LGxkPVsiY29sYWJfbGliIiwiY3JlYXRlVGFiQmFyIl0sWT1sOwpsZFswXWluIFl8fHR5cGVvZiBZLmV4ZWNTY3JpcHQ9PSJ1bmRlZmluZWQifHxZLmV4ZWNTY3JpcHQoInZhciAiK2xkWzBdKTtmb3IodmFyIFo7bGQubGVuZ3RoJiYoWj1sZC5zaGlmdCgpKTspbGQubGVuZ3RofHxrZD09PXZvaWQgMD9ZW1pdJiZZW1pdIT09T2JqZWN0LnByb3RvdHlwZVtaXT9ZPVlbWl06WT1ZW1pdPXt9OllbWl09a2Q7fSkuY2FsbCh0aGlzKTsKLy8gY2xhbmctZm9ybWF0IG9uCg==", + "ok": true, + "headers": [ + [ + "content-length", + "41785" + ], + [ + "content-type", + "application/javascript" + ] + ], + "status": 200, + "status_text": "" + } + }, + "base_uri": "https://localhost:8080/", + "height": 229 + } + }, + "source": [ + "%%logica StructureExtractionTest\n", + "\n", + "StructureTest(a: {x: 1, y: 2, z: { w: \"hello\", v: \"world\"}});\n", + "StructureTest(a: {x: 3, y: 4, z: { w: \"bonjour\", v: \"monde\"}});\n", + "\n", + "StructureExtractionTest(x:, w:) :-\n", + " StructureTest(a:),\n", + " x == a.x,\n", + " w == a.z.w;\n" + ], + "execution_count": 12, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"ebf3e374-d22c-11ef-a7c0-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id18\", \"tabNames\": [\"StructureExtractionTest\", \"(Log)\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_64bba5a0e3" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"ebf4539a-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id18\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_b91b0c17b6" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"ebf64cc2-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_640ee48b7d" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"ebf69632-d22c-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id18_content_1\");\n", + "//# sourceURL=js_3e0f19ec9e" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"ebf6e556-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"ebf69632-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_9755d43591" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"ebf79618-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id18\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_735e571875" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"ebfaa628-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"ebf64cc2-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_c021dfa676" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"ebfdf60c-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_1aa280fc21" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"ebfe5e6c-d22c-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id18_content_0\");\n", + "//# sourceURL=js_51a170e2b8" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"ebfec9a6-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"ebfe5e6c-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_e44ea2aa2a" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"ebff2f22-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id18\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_c000828c96" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"ec011a26-d22c-11ef-a7c0-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id19\", \"tabNames\": [\"SQL\", \"Result\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_51ee53f0b1" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"ec016a1c-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id19\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_200e850681" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"ec0312e0-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_b0f6fa9dfa" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"ec035eb2-d22c-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id19_content_0\");\n", + "//# sourceURL=js_8cbf9e256e" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"ec03a6f6-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"ec035eb2-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_ecebcd3210" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"ec03ed3c-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id19\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_b10f59005e" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The following query is stored at \u001b[1mStructureExtractionTest_sql\u001b[0m variable.\n", + "-- Initializing DuckDB environment.\n", + "create schema if not exists logica_home;\n", + "-- Empty record, has to have a field by DuckDB syntax.\n", + "drop type if exists logicarecord893574736 cascade; create type logicarecord893574736 as struct(nirvana numeric);\n", + "create sequence if not exists eternal_logical_sequence;\n", + "\n", + "\n", + "-- Logica type: logicarecord481217614\n", + "drop type if exists logicarecord481217614 cascade; create type logicarecord481217614 as struct(r logicarecord893574736);\n", + "\n", + "-- Logica type: logicarecord383307722\n", + "drop type if exists logicarecord383307722 cascade; create type logicarecord383307722 as struct(a timestamp);\n", + "\n", + "-- Logica type: logicarecord894559028\n", + "drop type if exists logicarecord894559028 cascade; create type logicarecord894559028 as struct(v text, w text);\n", + "\n", + "-- Logica type: logicarecord420398671\n", + "drop type if exists logicarecord420398671 cascade; create type logicarecord420398671 as struct(x numeric, y numeric, z logicarecord894559028);\n", + "WITH t_0_StructureTest AS (SELECT * FROM (\n", + " \n", + " SELECT\n", + " {x: 1, y: 2, z: {w: 'hello', v: 'world'}} AS a\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " {x: 3, y: 4, z: {w: 'bonjour', v: 'monde'}} AS a\n", + " \n", + ") AS UNUSED_TABLE_NAME )\n", + "SELECT\n", + " StructureTest.a.x AS x,\n", + " StructureTest.a.z.w AS w\n", + "FROM\n", + " t_0_StructureTest AS StructureTest;\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"ec057fb2-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"ec0312e0-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_4680e0d441" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"ec07efc2-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_25b6ecfc7a" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"ec0891fc-d22c-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id19_content_1\");\n", + "//# sourceURL=js_569ccfa3c9" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"ec08e29c-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"ec0891fc-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_5b7a7df04c" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"ec098454-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id19\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_95516fa412" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The following table is stored at \u001b[1mStructureExtractionTest\u001b[0m variable.\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
xw
01hello
13bonjour
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"ec0b50d6-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"ec07efc2-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_cc7c71d546" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"ec0df0e8-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"ebfdf60c-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_25e51213d8" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"ec10c390-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_ef9478f468" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"ec110cc4-d22c-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id18_content_1\");\n", + "//# sourceURL=js_b6cd1eecd9" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"ec11b908-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"ec110cc4-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_b8df166543" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"ec120d40-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id18\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_922cbbc12c" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "image/svg+xml": "\n\n\n\n\n\nConcertina\n\n\n\nStructureExtractionTest\n\nStructureExtractionTest\n\n\n\n", + "text/plain": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Running predicate: StructureExtractionTest (6 ms)\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"ec2a9cfc-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"ec10c390-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_db6765b97c" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"ec2c8940-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_0a0ec4ca4f" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"ec2cd92c-d22c-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id18_content_0\");\n", + "//# sourceURL=js_09cd650aa3" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"ec2d2724-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"ec2cd92c-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_a036cb3340" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"ec2d7166-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id18\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_448a9885e4" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"ec2ece44-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_2e8451fe75" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"ec2f252e-d22c-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id19_content_1\");\n", + "//# sourceURL=js_440f4fa09e" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"ec2f7204-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"ec2f252e-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_fbdfeebee4" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"ec2fbd68-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id19\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_8b3007ada7" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"ec33ffea-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"ec2ece44-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_a4c2eb0782" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + " \n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"ec3636f2-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"ec2c8940-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_b605b6e04a" + ] + }, + "metadata": {} + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "GA_MzWuURFKY" + }, + "source": [ + "Expression `..` is used to extract or emit a whole table row as one record.\n", + "\n", + "⚠️ WARNING: `..` does not work with SQLite engine." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "6VFrsJycREkJ", + "colab": { + "resources": { + "http://localhost:8080/nbextensions/google.colab/tabbar.css": { + "data": "Lmdvb2ctdGFie3Bvc2l0aW9uOnJlbGF0aXZlO3BhZGRpbmc6NHB4IDhweDtjb2xvcjojMDBjO3RleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7Y3Vyc29yOmRlZmF1bHR9Lmdvb2ctdGFiLWJhci10b3AgLmdvb2ctdGFie21hcmdpbjoxcHggNHB4IDAgMDtib3JkZXItYm90dG9tOjA7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLXRvcDphZnRlciwuZ29vZy10YWItYmFyLWJvdHRvbTphZnRlcntjb250ZW50OiIgIjtkaXNwbGF5OmJsb2NrO2hlaWdodDowO2NsZWFyOmJvdGg7dmlzaWJpbGl0eTpoaWRkZW59Lmdvb2ctdGFiLWJhci1ib3R0b20gLmdvb2ctdGFie21hcmdpbjowIDRweCAxcHggMDtib3JkZXItdG9wOjA7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLXN0YXJ0IC5nb29nLXRhYnttYXJnaW46MCAwIDRweCAxcHg7Ym9yZGVyLXJpZ2h0OjB9Lmdvb2ctdGFiLWJhci1lbmQgLmdvb2ctdGFie21hcmdpbjowIDFweCA0cHggMDtib3JkZXItbGVmdDowfS5nb29nLXRhYi1ob3ZlcntiYWNrZ3JvdW5kOiNlZWV9Lmdvb2ctdGFiLWRpc2FibGVke2NvbG9yOiM2NjZ9Lmdvb2ctdGFiLXNlbGVjdGVke2NvbG9yOiMwMDA7YmFja2dyb3VuZDojZmZmO3RleHQtZGVjb3JhdGlvbjpub25lO2ZvbnQtd2VpZ2h0OmJvbGQ7Ym9yZGVyOjFweCBzb2xpZCAjNmI5MGRhfS5nb29nLXRhYi1iYXItdG9we3BhZGRpbmctdG9wOjVweCFpbXBvcnRhbnQ7cGFkZGluZy1sZWZ0OjVweCFpbXBvcnRhbnQ7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgIzZiOTBkYSFpbXBvcnRhbnR9Lmdvb2ctdGFiLWJhci10b3AgLmdvb2ctdGFiLXNlbGVjdGVke3RvcDoxcHg7bWFyZ2luLXRvcDowO3BhZGRpbmctYm90dG9tOjVweH0uZ29vZy10YWItYmFyLWJvdHRvbSAuZ29vZy10YWItc2VsZWN0ZWR7dG9wOi0xcHg7bWFyZ2luLWJvdHRvbTowO3BhZGRpbmctdG9wOjVweH0uZ29vZy10YWItYmFyLXN0YXJ0IC5nb29nLXRhYi1zZWxlY3RlZHtsZWZ0OjFweDttYXJnaW4tbGVmdDowO3BhZGRpbmctcmlnaHQ6OXB4fS5nb29nLXRhYi1iYXItZW5kIC5nb29nLXRhYi1zZWxlY3RlZHtsZWZ0Oi0xcHg7bWFyZ2luLXJpZ2h0OjA7cGFkZGluZy1sZWZ0OjlweH0uZ29vZy10YWItYmFye21hcmdpbjowO2JvcmRlcjowO3BhZGRpbmc6MDtsaXN0LXN0eWxlOm5vbmU7Y3Vyc29yOmRlZmF1bHQ7b3V0bGluZTpub25lO2JhY2tncm91bmQ6I2ViZWZmOX0uZ29vZy10YWItYmFyLWNsZWFye2NsZWFyOmJvdGg7aGVpZ2h0OjA7b3ZlcmZsb3c6aGlkZGVufS5nb29nLXRhYi1iYXItc3RhcnR7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLWVuZHtmbG9hdDpyaWdodH0qIGh0bWwgLmdvb2ctdGFiLWJhci1zdGFydHttYXJnaW4tcmlnaHQ6LTNweH0qIGh0bWwgLmdvb2ctdGFiLWJhci1lbmR7bWFyZ2luLWxlZnQ6LTNweH1zZW50aW5lbHt9", + "ok": true, + "headers": [ + [ + "content-length", + "1404" + ], + [ + "content-type", + "text/css" + ] + ], + "status": 200, + "status_text": "" + }, + "http://localhost:8080/nbextensions/google.colab/tabbar_main.min.js": { + "data": "Ly8gY2xhbmctZm9ybWF0IG9mZgooZnVuY3Rpb24oKXt2YXIgZyxhYT1mdW5jdGlvbihhKXt2YXIgYj0wO3JldHVybiBmdW5jdGlvbigpe3JldHVybiBiPGEubGVuZ3RoP3tkb25lOiExLHZhbHVlOmFbYisrXX06e2RvbmU6ITB9fX0sYmE9dHlwZW9mIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzPT0iZnVuY3Rpb24iP09iamVjdC5kZWZpbmVQcm9wZXJ0eTpmdW5jdGlvbihhLGIsYyl7aWYoYT09QXJyYXkucHJvdG90eXBlfHxhPT1PYmplY3QucHJvdG90eXBlKXJldHVybiBhO2FbYl09Yy52YWx1ZTtyZXR1cm4gYX0sY2E9ZnVuY3Rpb24oYSl7YT1bIm9iamVjdCI9PXR5cGVvZiBnbG9iYWxUaGlzJiZnbG9iYWxUaGlzLGEsIm9iamVjdCI9PXR5cGVvZiB3aW5kb3cmJndpbmRvdywib2JqZWN0Ij09dHlwZW9mIHNlbGYmJnNlbGYsIm9iamVjdCI9PXR5cGVvZiBnbG9iYWwmJmdsb2JhbF07Zm9yKHZhciBiPTA7YjxhLmxlbmd0aDsrK2Ipe3ZhciBjPWFbYl07aWYoYyYmYy5NYXRoPT1NYXRoKXJldHVybiBjfXRocm93IEVycm9yKCJDYW5ub3QgZmluZCBnbG9iYWwgb2JqZWN0Iik7Cn0sZGE9Y2EodGhpcyksZWE9ZnVuY3Rpb24oYSxiKXtpZihiKWE6e3ZhciBjPWRhO2E9YS5zcGxpdCgiLiIpO2Zvcih2YXIgZD0wO2Q8YS5sZW5ndGgtMTtkKyspe3ZhciBlPWFbZF07aWYoIShlIGluIGMpKWJyZWFrIGE7Yz1jW2VdfWE9YVthLmxlbmd0aC0xXTtkPWNbYV07Yj1iKGQpO2IhPWQmJmIhPW51bGwmJmJhKGMsYSx7Y29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOmJ9KX19OwplYSgiU3ltYm9sIixmdW5jdGlvbihhKXtpZihhKXJldHVybiBhO3ZhciBiPWZ1bmN0aW9uKGYsaCl7dGhpcy5nPWY7YmEodGhpcywiZGVzY3JpcHRpb24iLHtjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6aH0pfTtiLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmd9O3ZhciBjPSJqc2NvbXBfc3ltYm9sXyIrKE1hdGgucmFuZG9tKCkqMUU5Pj4+MCkrIl8iLGQ9MCxlPWZ1bmN0aW9uKGYpe2lmKHRoaXMgaW5zdGFuY2VvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoIlN5bWJvbCBpcyBub3QgYSBjb25zdHJ1Y3RvciIpO3JldHVybiBuZXcgYihjKyhmfHwiIikrIl8iK2QrKyxmKX07cmV0dXJuIGV9KTsKdmFyIGZhPWZ1bmN0aW9uKGEpe3ZhciBiPXR5cGVvZiBTeW1ib2whPSJ1bmRlZmluZWQiJiZTeW1ib2wuaXRlcmF0b3ImJmFbU3ltYm9sLml0ZXJhdG9yXTtpZihiKXJldHVybiBiLmNhbGwoYSk7aWYodHlwZW9mIGEubGVuZ3RoPT0ibnVtYmVyIilyZXR1cm57bmV4dDphYShhKX07dGhyb3cgRXJyb3IoU3RyaW5nKGEpKyIgaXMgbm90IGFuIGl0ZXJhYmxlIG9yIEFycmF5TGlrZSIpO307ZWEoIlN5bWJvbC5kaXNwb3NlIixmdW5jdGlvbihhKXtyZXR1cm4gYT9hOlN5bWJvbCgiU3ltYm9sLmRpc3Bvc2UiKX0pOy8qCgogQ29weXJpZ2h0IFRoZSBDbG9zdXJlIExpYnJhcnkgQXV0aG9ycy4KIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wCiovCnZhciBsPXRoaXN8fHNlbGYsaWE9ZnVuY3Rpb24oYSl7YS5JYT12b2lkIDA7YS5WPWZ1bmN0aW9uKCl7cmV0dXJuIGEuSWE/YS5JYTphLklhPW5ldyBhfX0samE9ZnVuY3Rpb24oYSl7dmFyIGI9dHlwZW9mIGE7cmV0dXJuIGIhPSJvYmplY3QiP2I6YT9BcnJheS5pc0FycmF5KGEpPyJhcnJheSI6YjoibnVsbCJ9LGthPWZ1bmN0aW9uKGEpe3ZhciBiPWphKGEpO3JldHVybiBiPT0iYXJyYXkifHxiPT0ib2JqZWN0IiYmdHlwZW9mIGEubGVuZ3RoPT0ibnVtYmVyIn0sbT1mdW5jdGlvbihhKXt2YXIgYj10eXBlb2YgYTtyZXR1cm4gYj09Im9iamVjdCImJmEhPW51bGx8fGI9PSJmdW5jdGlvbiJ9LG5hPWZ1bmN0aW9uKGEpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYSxsYSkmJmFbbGFdfHwoYVtsYV09KyttYSl9LGxhPSJjbG9zdXJlX3VpZF8iKyhNYXRoLnJhbmRvbSgpKjFFOT4+PjApLG1hPTAsbj1mdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoKXt9Yy5wcm90b3R5cGU9CmIucHJvdG90eXBlO2EubD1iLnByb3RvdHlwZTthLnByb3RvdHlwZT1uZXcgYzthLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1hO2EucWQ9ZnVuY3Rpb24oZCxlLGYpe2Zvcih2YXIgaD1BcnJheShhcmd1bWVudHMubGVuZ3RoLTIpLGs9MjtrPGFyZ3VtZW50cy5sZW5ndGg7aysrKWhbay0yXT1hcmd1bWVudHNba107cmV0dXJuIGIucHJvdG90eXBlW2VdLmFwcGx5KGQsaCl9fTtmdW5jdGlvbiBvYShhLGIpe2lmKEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKUVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsb2EpO2Vsc2V7dmFyIGM9RXJyb3IoKS5zdGFjaztjJiYodGhpcy5zdGFjaz1jKX1hJiYodGhpcy5tZXNzYWdlPVN0cmluZyhhKSk7YiE9PXZvaWQgMCYmKHRoaXMuY2F1c2U9Yil9bihvYSxFcnJvcik7b2EucHJvdG90eXBlLm5hbWU9IkN1c3RvbUVycm9yIjt2YXIgcGE7ZnVuY3Rpb24gcWEoYSxiKXthPWEuc3BsaXQoIiVzIik7Zm9yKHZhciBjPSIiLGQ9YS5sZW5ndGgtMSxlPTA7ZTxkO2UrKyljKz1hW2VdKyhlPGIubGVuZ3RoP2JbZV06IiVzIik7b2EuY2FsbCh0aGlzLGMrYVtkXSl9bihxYSxvYSk7cWEucHJvdG90eXBlLm5hbWU9IkFzc2VydGlvbkVycm9yIjtmdW5jdGlvbiByYShhLGIsYyxkKXt2YXIgZT0iQXNzZXJ0aW9uIGZhaWxlZCI7aWYoYyl7ZSs9IjogIitjO3ZhciBmPWR9ZWxzZSBhJiYoZSs9IjogIithLGY9Yik7dGhyb3cgbmV3IHFhKCIiK2UsZnx8W10pO30KdmFyIHA9ZnVuY3Rpb24oYSxiLGMpe2F8fHJhKCIiLG51bGwsYixBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMikpO3JldHVybiBhfSxzYT1mdW5jdGlvbihhLGIsYyl7bShhKSYmYS5ub2RlVHlwZT09MXx8cmEoIkV4cGVjdGVkIEVsZW1lbnQgYnV0IGdvdCAlczogJXMuIixbamEoYSksYV0sYixBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMikpfSx1YT1mdW5jdGlvbihhLGIsYyxkKXthIGluc3RhbmNlb2YgYnx8cmEoIkV4cGVjdGVkIGluc3RhbmNlb2YgJXMgYnV0IGdvdCAlcy4iLFt0YShiKSx0YShhKV0sYyxBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMykpfTsKZnVuY3Rpb24gdGEoYSl7cmV0dXJuIGEgaW5zdGFuY2VvZiBGdW5jdGlvbj9hLmRpc3BsYXlOYW1lfHxhLm5hbWV8fCJ1bmtub3duIHR5cGUgbmFtZSI6YSBpbnN0YW5jZW9mIE9iamVjdD9hLmNvbnN0cnVjdG9yLmRpc3BsYXlOYW1lfHxhLmNvbnN0cnVjdG9yLm5hbWV8fE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhKTphPT09bnVsbD8ibnVsbCI6dHlwZW9mIGF9O3ZhciB2YT1BcnJheS5wcm90b3R5cGUuaW5kZXhPZj9mdW5jdGlvbihhLGIpe3AoYS5sZW5ndGghPW51bGwpO3JldHVybiBBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKGEsYix2b2lkIDApfTpmdW5jdGlvbihhLGIpe2lmKHR5cGVvZiBhPT09InN0cmluZyIpcmV0dXJuIHR5cGVvZiBiIT09InN0cmluZyJ8fGIubGVuZ3RoIT0xPy0xOmEuaW5kZXhPZihiLDApO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWlmKGMgaW4gYSYmYVtjXT09PWIpcmV0dXJuIGM7cmV0dXJuLTF9LHdhPUFycmF5LnByb3RvdHlwZS5mb3JFYWNoP2Z1bmN0aW9uKGEsYil7cChhLmxlbmd0aCE9bnVsbCk7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChhLGIsdm9pZCAwKX06ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9YS5sZW5ndGgsZD10eXBlb2YgYT09PSJzdHJpbmciP2Euc3BsaXQoIiIpOmEsZT0wO2U8YztlKyspZSBpbiBkJiZiLmNhbGwodm9pZCAwLGRbZV0sZSxhKX07CmZ1bmN0aW9uIHhhKGEsYil7Yj12YShhLGIpO3ZhciBjO2lmKGM9Yj49MClwKGEubGVuZ3RoIT1udWxsKSxBcnJheS5wcm90b3R5cGUuc3BsaWNlLmNhbGwoYSxiLDEpO3JldHVybiBjfWZ1bmN0aW9uIHlhKGEpe3ZhciBiPWEubGVuZ3RoO2lmKGI+MCl7Zm9yKHZhciBjPUFycmF5KGIpLGQ9MDtkPGI7ZCsrKWNbZF09YVtkXTtyZXR1cm4gY31yZXR1cm5bXX1mdW5jdGlvbiB6YShhLGIsYyxkKXtwKGEubGVuZ3RoIT1udWxsKTtBcnJheS5wcm90b3R5cGUuc3BsaWNlLmFwcGx5KGEsQWEoYXJndW1lbnRzLDEpKX1mdW5jdGlvbiBBYShhLGIsYyl7cChhLmxlbmd0aCE9bnVsbCk7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg8PTI/QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYSxiKTpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhLGIsYyl9O2Z1bmN0aW9uIEJhKGEsYixjKXtmb3IodmFyIGQgaW4gYSliLmNhbGwoYyxhW2RdLGQsYSl9ZnVuY3Rpb24gQ2EoYSxiKXtmb3IodmFyIGMgaW4gYSlpZihhW2NdPT1iKXJldHVybiEwO3JldHVybiExfWZ1bmN0aW9uIERhKGEsYixjKXtpZihhIT09bnVsbCYmYiBpbiBhKXRocm93IEVycm9yKCdUaGUgb2JqZWN0IGFscmVhZHkgY29udGFpbnMgdGhlIGtleSAiJytiKyciJyk7YVtiXT1jfWZ1bmN0aW9uIEVhKGEpe3ZhciBiPXt9LGM7Zm9yKGMgaW4gYSliW2FbY11dPWM7cmV0dXJuIGJ9dmFyIEZhPSJjb25zdHJ1Y3RvciBoYXNPd25Qcm9wZXJ0eSBpc1Byb3RvdHlwZU9mIHByb3BlcnR5SXNFbnVtZXJhYmxlIHRvTG9jYWxlU3RyaW5nIHRvU3RyaW5nIHZhbHVlT2YiLnNwbGl0KCIgIik7CmZ1bmN0aW9uIEdhKGEsYil7Zm9yKHZhciBjLGQsZT0xO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspe2Q9YXJndW1lbnRzW2VdO2ZvcihjIGluIGQpYVtjXT1kW2NdO2Zvcih2YXIgZj0wO2Y8RmEubGVuZ3RoO2YrKyljPUZhW2ZdLE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChkLGMpJiYoYVtjXT1kW2NdKX19O3ZhciBIYT1TdHJpbmcucHJvdG90eXBlLnRyaW0/ZnVuY3Rpb24oYSl7cmV0dXJuIGEudHJpbSgpfTpmdW5jdGlvbihhKXtyZXR1cm4vXltcc1x4YTBdKihbXHNcU10qPylbXHNceGEwXSokLy5leGVjKGEpWzFdfTsvKgoKIENvcHlyaWdodCBHb29nbGUgTExDCiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMAoqLwp2YXIgSWE9e307dmFyIEphPWZ1bmN0aW9uKGEpe2lmKElhIT09SWEpdGhyb3cgRXJyb3IoIkJhZCBzZWNyZXQiKTt0aGlzLmc9YX07SmEucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ307bmV3IEphKCJhYm91dDpibGFuayIpO25ldyBKYSgiYWJvdXQ6aW52YWxpZCN6Q2xvc3VyZXoiKTt2YXIgS2E9W10sTGE9ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJBIFVSTCB3aXRoIGNvbnRlbnQgJyIrYSsiJyB3YXMgc2FuaXRpemVkIGF3YXkuIil9O0thLmluZGV4T2YoTGEpPT09LTEmJkthLnB1c2goTGEpO3ZhciBNYSxOYTthOntmb3IodmFyIE9hPVsiQ0xPU1VSRV9GTEFHUyJdLFBhPWwsUWE9MDtRYTxPYS5sZW5ndGg7UWErKylpZihQYT1QYVtPYVtRYV1dLFBhPT1udWxsKXtOYT1udWxsO2JyZWFrIGF9TmE9UGF9dmFyIFJhPU5hJiZOYVs2MTA0MDEzMDFdO01hPVJhIT1udWxsP1JhOiExO2Z1bmN0aW9uIFNhKCl7dmFyIGE9bC5uYXZpZ2F0b3I7cmV0dXJuIGEmJihhPWEudXNlckFnZW50KT9hOiIifXZhciBUYSxVYT1sLm5hdmlnYXRvcjtUYT1VYT9VYS51c2VyQWdlbnREYXRhfHxudWxsOm51bGw7ZnVuY3Rpb24gcihhKXtyZXR1cm4gU2EoKS5pbmRleE9mKGEpIT0tMX07dmFyIFZhPXIoIkVkZ2UiKSx0PXIoIkdlY2tvIikmJiEoU2EoKS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoIndlYmtpdCIpIT0tMSYmIXIoIkVkZ2UiKSkmJiEocigiVHJpZGVudCIpfHxyKCJNU0lFIikpJiYhcigiRWRnZSIpLHU9U2EoKS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoIndlYmtpdCIpIT0tMSYmIXIoIkVkZ2UiKSx2PU1hJiZUYSYmVGEucGxhdGZvcm0/VGEucGxhdGZvcm09PT0ibWFjT1MiOnIoIk1hY2ludG9zaCIpO3ZhciBYYT1mdW5jdGlvbihhLGIpe0JhKGIsZnVuY3Rpb24oYyxkKXtkPT0ic3R5bGUiP2Euc3R5bGUuY3NzVGV4dD1jOmQ9PSJjbGFzcyI/YS5jbGFzc05hbWU9YzpkPT0iZm9yIj9hLmh0bWxGb3I9YzpXYS5oYXNPd25Qcm9wZXJ0eShkKT9hLnNldEF0dHJpYnV0ZShXYVtkXSxjKTpkLmxhc3RJbmRleE9mKCJhcmlhLSIsMCk9PTB8fGQubGFzdEluZGV4T2YoImRhdGEtIiwwKT09MD9hLnNldEF0dHJpYnV0ZShkLGMpOmFbZF09Y30pfSxXYT17Y2VsbHBhZGRpbmc6ImNlbGxQYWRkaW5nIixjZWxsc3BhY2luZzoiY2VsbFNwYWNpbmciLGNvbHNwYW46ImNvbFNwYW4iLGZyYW1lYm9yZGVyOiJmcmFtZUJvcmRlciIsaGVpZ2h0OiJoZWlnaHQiLG1heGxlbmd0aDoibWF4TGVuZ3RoIixub25jZToibm9uY2UiLHJvbGU6InJvbGUiLHJvd3NwYW46InJvd1NwYW4iLHR5cGU6InR5cGUiLHVzZW1hcDoidXNlTWFwIix2YWxpZ246InZBbGlnbiIsd2lkdGg6IndpZHRoIn0sWWE9ZnVuY3Rpb24oYSwKYixjKXtmdW5jdGlvbiBkKGspe2smJmIuYXBwZW5kQ2hpbGQodHlwZW9mIGs9PT0ic3RyaW5nIj9hLmNyZWF0ZVRleHROb2RlKGspOmspfWZvcih2YXIgZT0yO2U8Yy5sZW5ndGg7ZSsrKXt2YXIgZj1jW2VdO2lmKCFrYShmKXx8bShmKSYmZi5ub2RlVHlwZT4wKWQoZik7ZWxzZXthOntpZihmJiZ0eXBlb2YgZi5sZW5ndGg9PSJudW1iZXIiKXtpZihtKGYpKXt2YXIgaD10eXBlb2YgZi5pdGVtPT0iZnVuY3Rpb24ifHx0eXBlb2YgZi5pdGVtPT0ic3RyaW5nIjticmVhayBhfWlmKHR5cGVvZiBmPT09ImZ1bmN0aW9uIil7aD10eXBlb2YgZi5pdGVtPT0iZnVuY3Rpb24iO2JyZWFrIGF9fWg9ITF9d2EoaD95YShmKTpmLGQpfX19LFphPWZ1bmN0aW9uKGEsYil7Yj1TdHJpbmcoYik7YS5jb250ZW50VHlwZT09PSJhcHBsaWNhdGlvbi94aHRtbCt4bWwiJiYoYj1iLnRvTG93ZXJDYXNlKCkpO3JldHVybiBhLmNyZWF0ZUVsZW1lbnQoYil9LCRhPWZ1bmN0aW9uKGEpe2EmJmEucGFyZW50Tm9kZSYmCmEucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhKX0sYWI9ZnVuY3Rpb24oYSxiKXtpZighYXx8IWIpcmV0dXJuITE7aWYoYS5jb250YWlucyYmYi5ub2RlVHlwZT09MSlyZXR1cm4gYT09Ynx8YS5jb250YWlucyhiKTtpZih0eXBlb2YgYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiE9InVuZGVmaW5lZCIpcmV0dXJuIGE9PWJ8fCEhKGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24oYikmMTYpO2Zvcig7YiYmYSE9YjspYj1iLnBhcmVudE5vZGU7cmV0dXJuIGI9PWF9LGJiPWZ1bmN0aW9uKGEpe3AoYSwiTm9kZSBjYW5ub3QgYmUgbnVsbCBvciB1bmRlZmluZWQuIik7cmV0dXJuIGEubm9kZVR5cGU9PTk/YTphLm93bmVyRG9jdW1lbnR8fGEuZG9jdW1lbnR9LGNiPWZ1bmN0aW9uKGEsYil7Yj9hLnRhYkluZGV4PTA6KGEudGFiSW5kZXg9LTEsYS5yZW1vdmVBdHRyaWJ1dGUoInRhYkluZGV4IikpfSxkYj1mdW5jdGlvbihhKXtyZXR1cm4gYS5oYXNBdHRyaWJ1dGUoInRhYmluZGV4Iil9LGViPQpmdW5jdGlvbihhKXthPWEudGFiSW5kZXg7cmV0dXJuIHR5cGVvZiBhPT09Im51bWJlciImJmE+PTAmJmE8MzI3Njh9LGZiPWZ1bmN0aW9uKGEpe3RoaXMuZz1hfHxsLmRvY3VtZW50fHxkb2N1bWVudH07ZmIucHJvdG90eXBlLmk9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nO3JldHVybiB0eXBlb2YgYT09PSJzdHJpbmciP2IuZ2V0RWxlbWVudEJ5SWQoYSk6YX07ZmIucHJvdG90eXBlLmg9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXMuZyxlPWFyZ3VtZW50cyxmPWVbMV0saD1aYShkLFN0cmluZyhlWzBdKSk7ZiYmKHR5cGVvZiBmPT09InN0cmluZyI/aC5jbGFzc05hbWU9ZjpBcnJheS5pc0FycmF5KGYpP2guY2xhc3NOYW1lPWYuam9pbigiICIpOlhhKGgsZikpO2UubGVuZ3RoPjImJllhKGQsaCxlKTtyZXR1cm4gaH07dmFyIHc9ZnVuY3Rpb24oKXt0aGlzLmJhPXRoaXMuYmE7dGhpcy5rYT10aGlzLmthfTt3LnByb3RvdHlwZS5iYT0hMTt3LnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7dGhpcy5iYXx8KHRoaXMuYmE9ITAsdGhpcy5DKCkpfTt3LnByb3RvdHlwZVtTeW1ib2wuZGlzcG9zZV09ZnVuY3Rpb24oKXt0aGlzLmRpc3Bvc2UoKX07dy5wcm90b3R5cGUuQz1mdW5jdGlvbigpe2lmKHRoaXMua2EpZm9yKDt0aGlzLmthLmxlbmd0aDspdGhpcy5rYS5zaGlmdCgpKCl9O3ZhciB5PWZ1bmN0aW9uKGEsYil7dGhpcy50eXBlPWE7dGhpcy51PXRoaXMudGFyZ2V0PWI7dGhpcy5kZWZhdWx0UHJldmVudGVkPXRoaXMuQT0hMX07eS5wcm90b3R5cGUudj1mdW5jdGlvbigpe3RoaXMuQT0hMH07eS5wcm90b3R5cGUuaj1mdW5jdGlvbigpe3RoaXMuZGVmYXVsdFByZXZlbnRlZD0hMH07dmFyIGdiPWZ1bmN0aW9uKCl7aWYoIWwuYWRkRXZlbnRMaXN0ZW5lcnx8IU9iamVjdC5kZWZpbmVQcm9wZXJ0eSlyZXR1cm4hMTt2YXIgYT0hMSxiPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwicGFzc2l2ZSIse2dldDpmdW5jdGlvbigpe2E9ITB9fSk7dHJ5e3ZhciBjPWZ1bmN0aW9uKCl7fTtsLmFkZEV2ZW50TGlzdGVuZXIoInRlc3QiLGMsYik7bC5yZW1vdmVFdmVudExpc3RlbmVyKCJ0ZXN0IixjLGIpfWNhdGNoKGQpe31yZXR1cm4gYX0oKTt2YXIgej1mdW5jdGlvbihhLGIpe3kuY2FsbCh0aGlzLGE/YS50eXBlOiIiKTt0aGlzLnJlbGF0ZWRUYXJnZXQ9dGhpcy51PXRoaXMudGFyZ2V0PW51bGw7dGhpcy5idXR0b249dGhpcy5zY3JlZW5ZPXRoaXMuc2NyZWVuWD10aGlzLmNsaWVudFk9dGhpcy5jbGllbnRYPTA7dGhpcy5rZXk9IiI7dGhpcy5nPTA7dGhpcy5tZXRhS2V5PXRoaXMuc2hpZnRLZXk9dGhpcy5hbHRLZXk9dGhpcy5jdHJsS2V5PSExO3RoaXMuc3RhdGU9bnVsbDt0aGlzLkc9ITE7dGhpcy5wb2ludGVySWQ9MDt0aGlzLnBvaW50ZXJUeXBlPSIiO3RoaXMudGltZVN0YW1wPTA7dGhpcy5oPW51bGw7aWYoYSl7dmFyIGM9dGhpcy50eXBlPWEudHlwZSxkPWEuY2hhbmdlZFRvdWNoZXMmJmEuY2hhbmdlZFRvdWNoZXMubGVuZ3RoP2EuY2hhbmdlZFRvdWNoZXNbMF06bnVsbDt0aGlzLnRhcmdldD1hLnRhcmdldHx8YS5zcmNFbGVtZW50O3RoaXMudT1iO2I9YS5yZWxhdGVkVGFyZ2V0O2J8fChjPT0ibW91c2VvdmVyIj8KYj1hLmZyb21FbGVtZW50OmM9PSJtb3VzZW91dCImJihiPWEudG9FbGVtZW50KSk7dGhpcy5yZWxhdGVkVGFyZ2V0PWI7ZD8odGhpcy5jbGllbnRYPWQuY2xpZW50WCE9PXZvaWQgMD9kLmNsaWVudFg6ZC5wYWdlWCx0aGlzLmNsaWVudFk9ZC5jbGllbnRZIT09dm9pZCAwP2QuY2xpZW50WTpkLnBhZ2VZLHRoaXMuc2NyZWVuWD1kLnNjcmVlblh8fDAsdGhpcy5zY3JlZW5ZPWQuc2NyZWVuWXx8MCk6KHRoaXMuY2xpZW50WD1hLmNsaWVudFghPT12b2lkIDA/YS5jbGllbnRYOmEucGFnZVgsdGhpcy5jbGllbnRZPWEuY2xpZW50WSE9PXZvaWQgMD9hLmNsaWVudFk6YS5wYWdlWSx0aGlzLnNjcmVlblg9YS5zY3JlZW5YfHwwLHRoaXMuc2NyZWVuWT1hLnNjcmVlbll8fDApO3RoaXMuYnV0dG9uPWEuYnV0dG9uO3RoaXMuZz1hLmtleUNvZGV8fDA7dGhpcy5rZXk9YS5rZXl8fCIiO3RoaXMuY3RybEtleT1hLmN0cmxLZXk7dGhpcy5hbHRLZXk9YS5hbHRLZXk7dGhpcy5zaGlmdEtleT1hLnNoaWZ0S2V5Owp0aGlzLm1ldGFLZXk9YS5tZXRhS2V5O3RoaXMuRz12P2EubWV0YUtleTphLmN0cmxLZXk7dGhpcy5wb2ludGVySWQ9YS5wb2ludGVySWR8fDA7dGhpcy5wb2ludGVyVHlwZT1hLnBvaW50ZXJUeXBlO3RoaXMuc3RhdGU9YS5zdGF0ZTt0aGlzLnRpbWVTdGFtcD1hLnRpbWVTdGFtcDt0aGlzLmg9YTthLmRlZmF1bHRQcmV2ZW50ZWQmJnoubC5qLmNhbGwodGhpcyl9fTtuKHoseSk7ei5wcm90b3R5cGUudj1mdW5jdGlvbigpe3oubC52LmNhbGwodGhpcyk7dGhpcy5oLnN0b3BQcm9wYWdhdGlvbj90aGlzLmguc3RvcFByb3BhZ2F0aW9uKCk6dGhpcy5oLmNhbmNlbEJ1YmJsZT0hMH07ei5wcm90b3R5cGUuaj1mdW5jdGlvbigpe3oubC5qLmNhbGwodGhpcyk7dmFyIGE9dGhpcy5oO2EucHJldmVudERlZmF1bHQ/YS5wcmV2ZW50RGVmYXVsdCgpOmEucmV0dXJuVmFsdWU9ITF9O3ZhciBoYj0iY2xvc3VyZV9saXN0ZW5hYmxlXyIrKE1hdGgucmFuZG9tKCkqMUU2fDApLGliPWZ1bmN0aW9uKGEpe3JldHVybiEoIWF8fCFhW2hiXSl9O3ZhciBqYj0wO3ZhciBrYj1mdW5jdGlvbihhLGIsYyxkLGUpe3RoaXMubGlzdGVuZXI9YTt0aGlzLnByb3h5PW51bGw7dGhpcy5zcmM9Yjt0aGlzLnR5cGU9Yzt0aGlzLmNhcHR1cmU9ISFkO3RoaXMucGE9ZTt0aGlzLmtleT0rK2piO3RoaXMuamE9dGhpcy5vYT0hMX0sbGI9ZnVuY3Rpb24oYSl7YS5qYT0hMDthLmxpc3RlbmVyPW51bGw7YS5wcm94eT1udWxsO2Euc3JjPW51bGw7YS5wYT1udWxsfTt2YXIgbWI9ZnVuY3Rpb24oYSl7dGhpcy5zcmM9YTt0aGlzLmc9e307dGhpcy5oPTB9O21iLnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZj1hLnRvU3RyaW5nKCk7YT10aGlzLmdbZl07YXx8KGE9dGhpcy5nW2ZdPVtdLHRoaXMuaCsrKTt2YXIgaD1uYihhLGIsZCxlKTtoPi0xPyhiPWFbaF0sY3x8KGIub2E9ITEpKTooYj1uZXcga2IoYix0aGlzLnNyYyxmLCEhZCxlKSxiLm9hPWMsYS5wdXNoKGIpKTtyZXR1cm4gYn07CnZhciBvYj1mdW5jdGlvbihhLGIpe3ZhciBjPWIudHlwZTtjIGluIGEuZyYmeGEoYS5nW2NdLGIpJiYobGIoYiksYS5nW2NdLmxlbmd0aD09MCYmKGRlbGV0ZSBhLmdbY10sYS5oLS0pKX0scGI9ZnVuY3Rpb24oYSxiLGMsZCxlKXthPWEuZ1tiLnRvU3RyaW5nKCldO2I9LTE7YSYmKGI9bmIoYSxjLGQsZSkpO3JldHVybiBiPi0xP2FbYl06bnVsbH0sbmI9ZnVuY3Rpb24oYSxiLGMsZCl7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDsrK2Upe3ZhciBmPWFbZV07aWYoIWYuamEmJmYubGlzdGVuZXI9PWImJmYuY2FwdHVyZT09ISFjJiZmLnBhPT1kKXJldHVybiBlfXJldHVybi0xfTt2YXIgcWI9ImNsb3N1cmVfbG1fIisoTWF0aC5yYW5kb20oKSoxRTZ8MCkscmI9e30sc2I9MCx1Yj1mdW5jdGlvbihhLGIsYyxkLGUpe2lmKGQmJmQub25jZSlyZXR1cm4gdGIoYSxiLGMsZCxlKTtpZihBcnJheS5pc0FycmF5KGIpKXtmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKyl1YihhLGJbZl0sYyxkLGUpO3JldHVybiBudWxsfWM9dmIoYyk7cmV0dXJuIGliKGEpP3diKGEsYixjLG0oZCk/ISFkLmNhcHR1cmU6ISFkLGUpOnhiKGEsYixjLCExLGQsZSl9LHhiPWZ1bmN0aW9uKGEsYixjLGQsZSxmKXtpZighYil0aHJvdyBFcnJvcigiSW52YWxpZCBldmVudCB0eXBlIik7dmFyIGg9bShlKT8hIWUuY2FwdHVyZTohIWUsaz15YihhKTtrfHwoYVtxYl09az1uZXcgbWIoYSkpO2M9ay5hZGQoYixjLGQsaCxmKTtpZihjLnByb3h5KXJldHVybiBjO2Q9emIoKTtjLnByb3h5PWQ7ZC5zcmM9YTtkLmxpc3RlbmVyPWM7aWYoYS5hZGRFdmVudExpc3RlbmVyKWdifHwoZT1oKSxlPT09dm9pZCAwJiYKKGU9ITEpLGEuYWRkRXZlbnRMaXN0ZW5lcihiLnRvU3RyaW5nKCksZCxlKTtlbHNlIGlmKGEuYXR0YWNoRXZlbnQpYS5hdHRhY2hFdmVudChBYihiLnRvU3RyaW5nKCkpLGQpO2Vsc2UgaWYoYS5hZGRMaXN0ZW5lciYmYS5yZW1vdmVMaXN0ZW5lcilwKGI9PT0iY2hhbmdlIiwiTWVkaWFRdWVyeUxpc3Qgb25seSBoYXMgYSBjaGFuZ2UgZXZlbnQiKSxhLmFkZExpc3RlbmVyKGQpO2Vsc2UgdGhyb3cgRXJyb3IoImFkZEV2ZW50TGlzdGVuZXIgYW5kIGF0dGFjaEV2ZW50IGFyZSB1bmF2YWlsYWJsZS4iKTtzYisrO3JldHVybiBjfSx6Yj1mdW5jdGlvbigpe3ZhciBhPUJiLGI9ZnVuY3Rpb24oYyl7cmV0dXJuIGEuY2FsbChiLnNyYyxiLmxpc3RlbmVyLGMpfTtyZXR1cm4gYn0sdGI9ZnVuY3Rpb24oYSxiLGMsZCxlKXtpZihBcnJheS5pc0FycmF5KGIpKXtmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKyl0YihhLGJbZl0sYyxkLGUpO3JldHVybiBudWxsfWM9dmIoYyk7cmV0dXJuIGliKGEpPwphLkEuYWRkKFN0cmluZyhiKSxjLCEwLG0oZCk/ISFkLmNhcHR1cmU6ISFkLGUpOnhiKGEsYixjLCEwLGQsZSl9LENiPWZ1bmN0aW9uKGEsYixjLGQsZSl7aWYoQXJyYXkuaXNBcnJheShiKSlmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKylDYihhLGJbZl0sYyxkLGUpO2Vsc2UgZD1tKGQpPyEhZC5jYXB0dXJlOiEhZCxjPXZiKGMpLGliKGEpPyhhPWEuQSxiPVN0cmluZyhiKS50b1N0cmluZygpLGIgaW4gYS5nJiYoZj1hLmdbYl0sYz1uYihmLGMsZCxlKSxjPi0xJiYobGIoZltjXSkscChmLmxlbmd0aCE9bnVsbCksQXJyYXkucHJvdG90eXBlLnNwbGljZS5jYWxsKGYsYywxKSxmLmxlbmd0aD09MCYmKGRlbGV0ZSBhLmdbYl0sYS5oLS0pKSkpOmEmJihhPXliKGEpKSYmKGM9cGIoYSxiLGMsZCxlKSkmJkEoYyl9LEE9ZnVuY3Rpb24oYSl7aWYodHlwZW9mIGEhPT0ibnVtYmVyIiYmYSYmIWEuamEpe3ZhciBiPWEuc3JjO2lmKGliKGIpKW9iKGIuQSxhKTtlbHNle3ZhciBjPWEudHlwZSwKZD1hLnByb3h5O2IucmVtb3ZlRXZlbnRMaXN0ZW5lcj9iLnJlbW92ZUV2ZW50TGlzdGVuZXIoYyxkLGEuY2FwdHVyZSk6Yi5kZXRhY2hFdmVudD9iLmRldGFjaEV2ZW50KEFiKGMpLGQpOmIuYWRkTGlzdGVuZXImJmIucmVtb3ZlTGlzdGVuZXImJmIucmVtb3ZlTGlzdGVuZXIoZCk7c2ItLTsoYz15YihiKSk/KG9iKGMsYSksYy5oPT0wJiYoYy5zcmM9bnVsbCxiW3FiXT1udWxsKSk6bGIoYSl9fX0sQWI9ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW4gcmI/cmJbYV06cmJbYV09Im9uIithfSxCYj1mdW5jdGlvbihhLGIpe2lmKGEuamEpYT0hMDtlbHNle2I9bmV3IHooYix0aGlzKTt2YXIgYz1hLmxpc3RlbmVyLGQ9YS5wYXx8YS5zcmM7YS5vYSYmQShhKTthPWMuY2FsbChkLGIpfXJldHVybiBhfSx5Yj1mdW5jdGlvbihhKXthPWFbcWJdO3JldHVybiBhIGluc3RhbmNlb2YgbWI/YTpudWxsfSxEYj0iX19jbG9zdXJlX2V2ZW50c19mbl8iKyhNYXRoLnJhbmRvbSgpKjFFOT4+PjApLHZiPWZ1bmN0aW9uKGEpe3AoYSwKIkxpc3RlbmVyIGNhbiBub3QgYmUgbnVsbC4iKTtpZih0eXBlb2YgYT09PSJmdW5jdGlvbiIpcmV0dXJuIGE7cChhLmhhbmRsZUV2ZW50LCJBbiBvYmplY3QgbGlzdGVuZXIgbXVzdCBoYXZlIGhhbmRsZUV2ZW50IG1ldGhvZC4iKTthW0RiXXx8KGFbRGJdPWZ1bmN0aW9uKGIpe3JldHVybiBhLmhhbmRsZUV2ZW50KGIpfSk7cmV0dXJuIGFbRGJdfTt2YXIgRWI9ZnVuY3Rpb24oYSl7dy5jYWxsKHRoaXMpO3RoaXMuaD1hO3RoaXMuZz17fX07bihFYix3KTsKdmFyIEZiPVtdLEI9ZnVuY3Rpb24oYSxiLGMsZCl7QXJyYXkuaXNBcnJheShjKXx8KGMmJihGYlswXT1jLnRvU3RyaW5nKCkpLGM9RmIpO2Zvcih2YXIgZT0wO2U8Yy5sZW5ndGg7ZSsrKXt2YXIgZj11YihiLGNbZV0sZHx8YS5oYW5kbGVFdmVudCwhMSxhLmh8fGEpO2lmKCFmKWJyZWFrO2EuZ1tmLmtleV09Zn1yZXR1cm4gYX0sQz1mdW5jdGlvbihhLGIsYyxkLGUsZil7aWYoQXJyYXkuaXNBcnJheShjKSlmb3IodmFyIGg9MDtoPGMubGVuZ3RoO2grKylDKGEsYixjW2hdLGQsZSxmKTtlbHNlIGQ9ZHx8YS5oYW5kbGVFdmVudCxlPW0oZSk/ISFlLmNhcHR1cmU6ISFlLGY9Znx8YS5ofHxhLGQ9dmIoZCksZT0hIWUsYz1pYihiKT9wYihiLkEsU3RyaW5nKGMpLGQsZSxmKTpiPyhiPXliKGIpKT9wYihiLGMsZCxlLGYpOm51bGw6bnVsbCxjJiYoQShjKSxkZWxldGUgYS5nW2Mua2V5XSk7cmV0dXJuIGF9LEdiPWZ1bmN0aW9uKGEpe0JhKGEuZyxmdW5jdGlvbihiLGMpe3RoaXMuZy5oYXNPd25Qcm9wZXJ0eShjKSYmCkEoYil9LGEpO2EuZz17fX07RWIucHJvdG90eXBlLkM9ZnVuY3Rpb24oKXtFYi5sLkMuY2FsbCh0aGlzKTtHYih0aGlzKX07RWIucHJvdG90eXBlLmhhbmRsZUV2ZW50PWZ1bmN0aW9uKCl7dGhyb3cgRXJyb3IoIkV2ZW50SGFuZGxlci5oYW5kbGVFdmVudCBub3QgaW1wbGVtZW50ZWQiKTt9O3ZhciBEPWZ1bmN0aW9uKCl7dy5jYWxsKHRoaXMpO3RoaXMuQT1uZXcgbWIodGhpcyk7dGhpcy5ZYT10aGlzO3RoaXMubGE9bnVsbH07bihELHcpO0QucHJvdG90eXBlW2hiXT0hMDtELnByb3RvdHlwZS5BYT1mdW5jdGlvbihhKXt0aGlzLmxhPWF9O0QucHJvdG90eXBlLnJlbW92ZUV2ZW50TGlzdGVuZXI9ZnVuY3Rpb24oYSxiLGMsZCl7Q2IodGhpcyxhLGIsYyxkKX07CnZhciBFPWZ1bmN0aW9uKGEsYil7SGIoYSk7dmFyIGM9YS5sYTtpZihjKXt2YXIgZD1bXTtmb3IodmFyIGU9MTtjO2M9Yy5sYSlkLnB1c2goYykscCgrK2U8MUUzLCJpbmZpbml0ZSBsb29wIil9YT1hLllhO2M9Yi50eXBlfHxiO3R5cGVvZiBiPT09InN0cmluZyI/Yj1uZXcgeShiLGEpOmIgaW5zdGFuY2VvZiB5P2IudGFyZ2V0PWIudGFyZ2V0fHxhOihlPWIsYj1uZXcgeShjLGEpLEdhKGIsZSkpO2U9ITA7dmFyIGY7aWYoZClmb3IoZj1kLmxlbmd0aC0xOyFiLkEmJmY+PTA7Zi0tKXt2YXIgaD1iLnU9ZFtmXTtlPUliKGgsYywhMCxiKSYmZX1iLkF8fChoPWIudT1hLGU9SWIoaCxjLCEwLGIpJiZlLGIuQXx8KGU9SWIoaCxjLCExLGIpJiZlKSk7aWYoZClmb3IoZj0wOyFiLkEmJmY8ZC5sZW5ndGg7ZisrKWg9Yi51PWRbZl0sZT1JYihoLGMsITEsYikmJmU7cmV0dXJuIGV9OwpELnByb3RvdHlwZS5DPWZ1bmN0aW9uKCl7RC5sLkMuY2FsbCh0aGlzKTtpZih0aGlzLkEpe3ZhciBhPXRoaXMuQSxiPTAsYztmb3IoYyBpbiBhLmcpe2Zvcih2YXIgZD1hLmdbY10sZT0wO2U8ZC5sZW5ndGg7ZSsrKSsrYixsYihkW2VdKTtkZWxldGUgYS5nW2NdO2EuaC0tfX10aGlzLmxhPW51bGx9O3ZhciB3Yj1mdW5jdGlvbihhLGIsYyxkLGUpe0hiKGEpO3JldHVybiBhLkEuYWRkKFN0cmluZyhiKSxjLCExLGQsZSl9LEliPWZ1bmN0aW9uKGEsYixjLGQpe2I9YS5BLmdbU3RyaW5nKGIpXTtpZighYilyZXR1cm4hMDtiPWIuY29uY2F0KCk7Zm9yKHZhciBlPSEwLGY9MDtmPGIubGVuZ3RoOysrZil7dmFyIGg9YltmXTtpZihoJiYhaC5qYSYmaC5jYXB0dXJlPT1jKXt2YXIgaz1oLmxpc3RlbmVyLHE9aC5wYXx8aC5zcmM7aC5vYSYmb2IoYS5BLGgpO2U9ay5jYWxsKHEsZCkhPT0hMSYmZX19cmV0dXJuIGUmJiFkLmRlZmF1bHRQcmV2ZW50ZWR9LEhiPWZ1bmN0aW9uKGEpe3AoYS5BLCJFdmVudCB0YXJnZXQgaXMgbm90IGluaXRpYWxpemVkLiBEaWQgeW91IGNhbGwgdGhlIHN1cGVyY2xhc3MgKGdvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0KSBjb25zdHJ1Y3Rvcj8iKX07dmFyIEpiPXQ/Ik1velVzZXJTZWxlY3QiOnV8fFZhPyJXZWJraXRVc2VyU2VsZWN0IjpudWxsLEtiPWZ1bmN0aW9uKGEsYil7Yj1iP251bGw6YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpO2lmKEpiJiYoYS5zdHlsZSYmKGEuc3R5bGVbSmJdPSJub25lIiksYikpZm9yKHZhciBjPTA7YT1iW2NdO2MrKylhLnN0eWxlJiYoYS5zdHlsZVtKYl09Im5vbmUiKX07dmFyIExiPWZ1bmN0aW9uKCl7fTtpYShMYik7TGIucHJvdG90eXBlLmc9MDt2YXIgRj1mdW5jdGlvbihhKXtELmNhbGwodGhpcyk7dGhpcy5HPWF8fHBhfHwocGE9bmV3IGZiKTt0aGlzLnphPU1iO3RoaXMuWT1udWxsO3RoaXMucz0hMTt0aGlzLmc9bnVsbDt0aGlzLk09dm9pZCAwO3RoaXMudT10aGlzLmo9dGhpcy5oPW51bGw7dGhpcy5TYT0hMX07bihGLEQpO0YucHJvdG90eXBlLlphPUxiLlYoKTsKdmFyIE1iPW51bGwsTmI9ZnVuY3Rpb24oYSxiKXtzd2l0Y2goYSl7Y2FzZSAxOnJldHVybiBiPyJkaXNhYmxlIjoiZW5hYmxlIjtjYXNlIDI6cmV0dXJuIGI/ImhpZ2hsaWdodCI6InVuaGlnaGxpZ2h0IjtjYXNlIDQ6cmV0dXJuIGI/ImFjdGl2YXRlIjoiZGVhY3RpdmF0ZSI7Y2FzZSA4OnJldHVybiBiPyJzZWxlY3QiOiJ1bnNlbGVjdCI7Y2FzZSAxNjpyZXR1cm4gYj8iY2hlY2siOiJ1bmNoZWNrIjtjYXNlIDMyOnJldHVybiBiPyJmb2N1cyI6ImJsdXIiO2Nhc2UgNjQ6cmV0dXJuIGI/Im9wZW4iOiJjbG9zZSJ9dGhyb3cgRXJyb3IoIkludmFsaWQgY29tcG9uZW50IHN0YXRlIik7fSxPYj1mdW5jdGlvbihhKXtyZXR1cm4gYS5ZfHwoYS5ZPSI6IisoYS5aYS5nKyspLnRvU3RyaW5nKDM2KSl9LFBiPWZ1bmN0aW9uKGEsYil7aWYoYS5oJiZhLmgudSl7dmFyIGM9YS5oLnUsZD1hLlk7ZCBpbiBjJiZkZWxldGUgY1tkXTtEYShhLmgudSxiLGEpfWEuWT1ifTtGLnByb3RvdHlwZS5pPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ307CnZhciBRYj1mdW5jdGlvbihhKXthLk18fChhLk09bmV3IEViKGEpKTtyZXR1cm4gcChhLk0pfTtGLnByb3RvdHlwZS5BYT1mdW5jdGlvbihhKXtpZih0aGlzLmgmJnRoaXMuaCE9YSl0aHJvdyBFcnJvcigiTWV0aG9kIG5vdCBzdXBwb3J0ZWQiKTtGLmwuQWEuY2FsbCh0aGlzLGEpfTtGLnByb3RvdHlwZS5tYT1mdW5jdGlvbigpe3RoaXMuZz1aYSh0aGlzLkcuZywiRElWIil9O0YucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbihhKXtSYih0aGlzLGEpfTsKdmFyIFJiPWZ1bmN0aW9uKGEsYixjKXtpZihhLnMpdGhyb3cgRXJyb3IoIkNvbXBvbmVudCBhbHJlYWR5IHJlbmRlcmVkIik7YS5nfHxhLm1hKCk7Yj9iLmluc2VydEJlZm9yZShhLmcsY3x8bnVsbCk6YS5HLmcuYm9keS5hcHBlbmRDaGlsZChhLmcpO2EuaCYmIWEuaC5zfHxhLkkoKX0sU2I9ZnVuY3Rpb24oYSxiKXtpZihhLnMpdGhyb3cgRXJyb3IoIkNvbXBvbmVudCBhbHJlYWR5IHJlbmRlcmVkIik7aWYoYiYmYS53YShiKSl7YS5TYT0hMDt2YXIgYz1iYihiKTthLkcmJmEuRy5nPT1jfHwoYS5HPWI/bmV3IGZiKGJiKGIpKTpwYXx8KHBhPW5ldyBmYikpO2EuRWEoYik7YS5JKCl9ZWxzZSB0aHJvdyBFcnJvcigiSW52YWxpZCBlbGVtZW50IHRvIGRlY29yYXRlIik7fTtnPUYucHJvdG90eXBlO2cud2E9ZnVuY3Rpb24oKXtyZXR1cm4hMH07Zy5FYT1mdW5jdGlvbihhKXt0aGlzLmc9YX07CmcuST1mdW5jdGlvbigpe3RoaXMucz0hMDtUYih0aGlzLGZ1bmN0aW9uKGEpeyFhLnMmJmEuaSgpJiZhLkkoKX0pfTtnLlU9ZnVuY3Rpb24oKXtUYih0aGlzLGZ1bmN0aW9uKGEpe2EucyYmYS5VKCl9KTt0aGlzLk0mJkdiKHRoaXMuTSk7dGhpcy5zPSExfTtnLkM9ZnVuY3Rpb24oKXt0aGlzLnMmJnRoaXMuVSgpO3RoaXMuTSYmKHRoaXMuTS5kaXNwb3NlKCksZGVsZXRlIHRoaXMuTSk7VGIodGhpcyxmdW5jdGlvbihhKXthLmRpc3Bvc2UoKX0pOyF0aGlzLlNhJiZ0aGlzLmcmJiRhKHRoaXMuZyk7dGhpcy5oPXRoaXMuZz10aGlzLnU9dGhpcy5qPW51bGw7Ri5sLkMuY2FsbCh0aGlzKX07Zy5CYT1mdW5jdGlvbihhLGIpe3RoaXMuQ2EoYSxIKHRoaXMpLGIpfTsKZy5DYT1mdW5jdGlvbihhLGIsYyl7cCghIWEsIlByb3ZpZGVkIGVsZW1lbnQgbXVzdCBub3QgYmUgbnVsbC4iKTtpZihhLnMmJihjfHwhdGhpcy5zKSl0aHJvdyBFcnJvcigiQ29tcG9uZW50IGFscmVhZHkgcmVuZGVyZWQiKTtpZihiPDB8fGI+SCh0aGlzKSl0aHJvdyBFcnJvcigiQ2hpbGQgY29tcG9uZW50IGluZGV4IG91dCBvZiBib3VuZHMiKTt0aGlzLnUmJnRoaXMuanx8KHRoaXMudT17fSx0aGlzLmo9W10pO2lmKGEuaD09dGhpcyl7dmFyIGQ9dGhpcy51LGU9T2IoYSk7ZFtlXT1hO3hhKHRoaXMuaixhKX1lbHNlIERhKHRoaXMudSxPYihhKSxhKTtpZihhPT10aGlzKXRocm93IEVycm9yKCJVbmFibGUgdG8gc2V0IHBhcmVudCBjb21wb25lbnQiKTtpZihkPXRoaXMmJmEuaCYmYS5ZKWU9YS5oLGQ9YS5ZLGUudSYmZD8oZT1lLnUsZD0oZSE9PW51bGwmJmQgaW4gZT9lW2RdOnZvaWQgMCl8fG51bGwpOmQ9bnVsbDtpZihkJiZhLmghPXRoaXMpdGhyb3cgRXJyb3IoIlVuYWJsZSB0byBzZXQgcGFyZW50IGNvbXBvbmVudCIpOwphLmg9dGhpcztGLmwuQWEuY2FsbChhLHRoaXMpO3phKHRoaXMuaixiLDAsYSk7YS5zJiZ0aGlzLnMmJmEuaD09dGhpcz8oYz10aGlzLm5hKCksKGMuY2hpbGROb2Rlc1tiXXx8bnVsbCkhPWEuaSgpJiYoYS5pKCkucGFyZW50RWxlbWVudD09YyYmYy5yZW1vdmVDaGlsZChhLmkoKSksYj1jLmNoaWxkTm9kZXNbYl18fG51bGwsYy5pbnNlcnRCZWZvcmUoYS5pKCksYikpKTpjPyh0aGlzLmd8fHRoaXMubWEoKSxiPUkodGhpcyxiKzEpLFJiKGEsdGhpcy5uYSgpLGI/Yi5nOm51bGwpKTp0aGlzLnMmJiFhLnMmJmEuZyYmYS5nLnBhcmVudE5vZGUmJmEuZy5wYXJlbnROb2RlLm5vZGVUeXBlPT0xJiZhLkkoKX07Zy5uYT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmd9Owp2YXIgVWI9ZnVuY3Rpb24oYSl7aWYoYS56YT09bnVsbCl7dmFyIGI9YS5zP2EuZzphLkcuZy5ib2R5O2E6e3ZhciBjPWJiKGIpO2lmKGMuZGVmYXVsdFZpZXcmJmMuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSYmKGM9Yy5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKGIsbnVsbCkpKXtjPWMuZGlyZWN0aW9ufHxjLmdldFByb3BlcnR5VmFsdWUoImRpcmVjdGlvbiIpfHwiIjticmVhayBhfWM9IiJ9YS56YT0icnRsIj09KGN8fChiLmN1cnJlbnRTdHlsZT9iLmN1cnJlbnRTdHlsZS5kaXJlY3Rpb246bnVsbCl8fGIuc3R5bGUmJmIuc3R5bGUuZGlyZWN0aW9uKX1yZXR1cm4gYS56YX0sSD1mdW5jdGlvbihhKXtyZXR1cm4gYS5qP2Euai5sZW5ndGg6MH0sST1mdW5jdGlvbihhLGIpe3JldHVybiBhLmo/YS5qW2JdfHxudWxsOm51bGx9LFRiPWZ1bmN0aW9uKGEsYixjKXthLmomJmEuai5mb3JFYWNoKGIsYyl9LFZiPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuaiYmYj9hLmouaW5kZXhPZihiKToKLTF9O3ZhciBXYj17bWI6ImFjdGl2ZWRlc2NlbmRhbnQiLHJiOiJhdG9taWMiLHNiOiJhdXRvY29tcGxldGUiLHViOiJidXN5Iix4YjoiY2hlY2tlZCIseWI6ImNvbGluZGV4IixEYjoiY29udHJvbHMiLEViOiJjdXJyZW50IixHYjoiZGVzY3JpYmVkYnkiLEpiOiJkaXNhYmxlZCIsTGI6ImRyb3BlZmZlY3QiLE1iOiJleHBhbmRlZCIsTmI6ImZsb3d0byIsUGI6ImdyYWJiZWQiLFRiOiJoYXNwb3B1cCIsVmI6ImhpZGRlbiIsWGI6ImludmFsaWQiLFliOiJsYWJlbCIsWmI6ImxhYmVsbGVkYnkiLGFjOiJsZXZlbCIsZmM6ImxpdmUiLHZjOiJtdWx0aWxpbmUiLHdjOiJtdWx0aXNlbGVjdGFibGUiLEFjOiJvcmllbnRhdGlvbiIsQmM6Im93bnMiLENjOiJwb3NpbnNldCIsRWM6InByZXNzZWQiLEljOiJyZWFkb25seSIsS2M6InJlbGV2YW50IixMYzoicmVxdWlyZWQiLFBjOiJyb3dpbmRleCIsU2M6InNlbGVjdGVkIixVYzoic2V0c2l6ZSIsV2M6InNvcnQiLG1kOiJ2YWx1ZW1heCIsbmQ6InZhbHVlbWluIiwKb2Q6InZhbHVlbm93IixwZDoidmFsdWV0ZXh0In07dmFyIFhiO3ZhciBZYj17bmI6ImFsZXJ0IixvYjoiYWxlcnRkaWFsb2ciLHBiOiJhcHBsaWNhdGlvbiIscWI6ImFydGljbGUiLHRiOiJiYW5uZXIiLHZiOiJidXR0b24iLHdiOiJjaGVja2JveCIsemI6ImNvbHVtbmhlYWRlciIsQWI6ImNvbWJvYm94IixCYjoiY29tcGxlbWVudGFyeSIsQ2I6ImNvbnRlbnRpbmZvIixGYjoiZGVmaW5pdGlvbiIsSGI6ImRpYWxvZyIsSWI6ImRpcmVjdG9yeSIsS2I6ImRvY3VtZW50IixPYjoiZm9ybSIsUWI6ImdyaWQiLFJiOiJncmlkY2VsbCIsU2I6Imdyb3VwIixVYjoiaGVhZGluZyIsV2I6ImltZyIsYmM6ImxpbmsiLGNjOiJsaXN0IixkYzoibGlzdGJveCIsZWM6Imxpc3RpdGVtIixoYzoibG9nIixpYzoibWFpbiIsamM6Im1hcnF1ZWUiLGtjOiJtYXRoIixsYzoibWVudSIsbWM6Im1lbnViYXIiLG5jOiJtZW51aXRlbSIsb2M6Im1lbnVpdGVtY2hlY2tib3giLHBjOiJtZW51aXRlbXJhZGlvIix4YzoibmF2aWdhdGlvbiIseWM6Im5vdGUiLHpjOiJvcHRpb24iLApEYzoicHJlc2VudGF0aW9uIixGYzoicHJvZ3Jlc3NiYXIiLEdjOiJyYWRpbyIsSGM6InJhZGlvZ3JvdXAiLEpjOiJyZWdpb24iLE1jOiJyb3ciLE5jOiJyb3dncm91cCIsT2M6InJvd2hlYWRlciIsUWM6InNjcm9sbGJhciIsUmM6InNlYXJjaCIsVGM6InNlcGFyYXRvciIsVmM6InNsaWRlciIsWGM6InNwaW5idXR0b24iLFljOiJzdGF0dXMiLFpjOiJzd2l0Y2giLGFkOiJ0YWIiLGJkOiJ0YWJsaXN0IixjZDoidGFicGFuZWwiLGRkOiJ0ZXh0Ym94IixlZDoidGV4dGluZm8iLGZkOiJ0aW1lciIsZ2Q6InRvb2xiYXIiLGhkOiJ0b29sdGlwIixqZDoidHJlZSIsa2Q6InRyZWVncmlkIixsZDoidHJlZWl0ZW0ifTt2YXIgWmI9ZnVuY3Rpb24oYSxiKXtiPyhwKENhKFliLGIpLCJObyBzdWNoIEFSSUEgcm9sZSAiK2IpLGEuc2V0QXR0cmlidXRlKCJyb2xlIixiKSk6YS5yZW1vdmVBdHRyaWJ1dGUoInJvbGUiKX0sYWM9ZnVuY3Rpb24oYSxiLGMpe0FycmF5LmlzQXJyYXkoYykmJihjPWMuam9pbigiICIpKTt2YXIgZD0kYihiKTtjPT09IiJ8fGM9PXZvaWQgMD8oWGJ8fChjPXt9LFhiPShjLmF0b21pYz0hMSxjLmF1dG9jb21wbGV0ZT0ibm9uZSIsYy5kcm9wZWZmZWN0PSJub25lIixjLmhhc3BvcHVwPSExLGMubGl2ZT0ib2ZmIixjLm11bHRpbGluZT0hMSxjLm11bHRpc2VsZWN0YWJsZT0hMSxjLm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIsYy5yZWFkb25seT0hMSxjLnJlbGV2YW50PSJhZGRpdGlvbnMgdGV4dCIsYy5yZXF1aXJlZD0hMSxjLnNvcnQ9Im5vbmUiLGMuYnVzeT0hMSxjLmRpc2FibGVkPSExLGMuaGlkZGVuPSExLGMuaW52YWxpZD0iZmFsc2UiLGMpKSxjPVhiLGIgaW4gYz9hLnNldEF0dHJpYnV0ZShkLApjW2JdKTphLnJlbW92ZUF0dHJpYnV0ZShkKSk6YS5zZXRBdHRyaWJ1dGUoZCxjKX0sJGI9ZnVuY3Rpb24oYSl7cChhLCJBUklBIGF0dHJpYnV0ZSBjYW5ub3QgYmUgZW1wdHkuIik7cChDYShXYixhKSwiTm8gc3VjaCBBUklBIGF0dHJpYnV0ZSAiK2EpO3JldHVybiJhcmlhLSIrYX07dmFyIGRjPWZ1bmN0aW9uKGEsYixjLGQsZSxmKXtpZih2JiZlKXJldHVybiBiYyhhKTtpZihlJiYhZClyZXR1cm4hMTtpZighdCl7dHlwZW9mIGI9PT0ibnVtYmVyIiYmKGI9Y2MoYikpO3ZhciBoPWI9PTE3fHxiPT0xOHx8diYmYj09OTE7aWYoKCFjfHx2KSYmaHx8diYmYj09MTYmJihkfHxmKSlyZXR1cm4hMX1pZih1JiZkJiZjKXN3aXRjaChhKXtjYXNlIDIyMDpjYXNlIDIxOTpjYXNlIDIyMTpjYXNlIDE5MjpjYXNlIDE4NjpjYXNlIDE4OTpjYXNlIDE4NzpjYXNlIDE4ODpjYXNlIDE5MDpjYXNlIDE5MTpjYXNlIDE5MjpjYXNlIDIyMjpyZXR1cm4hMX1zd2l0Y2goYSl7Y2FzZSAxMzpyZXR1cm4gdD9mfHxlPyExOiEoYyYmZCk6ITA7Y2FzZSAyNzpyZXR1cm4hdSYmIXR9cmV0dXJuIHQmJihkfHxlfHxmKT8hMTpiYyhhKX0sYmM9ZnVuY3Rpb24oYSl7aWYoYT49NDgmJmE8PTU3fHxhPj05NiYmYTw9MTA2fHxhPj02NSYmYTw9OTB8fHUmJmE9PTApcmV0dXJuITA7c3dpdGNoKGEpe2Nhc2UgMzI6Y2FzZSA0MzpjYXNlIDYzOmNhc2UgNjQ6Y2FzZSAxMDc6Y2FzZSAxMDk6Y2FzZSAxMTA6Y2FzZSAxMTE6Y2FzZSAxODY6Y2FzZSA1OTpjYXNlIDE4OTpjYXNlIDE4NzpjYXNlIDYxOmNhc2UgMTg4OmNhc2UgMTkwOmNhc2UgMTkxOmNhc2UgMTkyOmNhc2UgMjIyOmNhc2UgMjE5OmNhc2UgMjIwOmNhc2UgMjIxOmNhc2UgMTYzOmNhc2UgNTg6cmV0dXJuITA7CmNhc2UgMTczOmNhc2UgMTcxOnJldHVybiB0O2RlZmF1bHQ6cmV0dXJuITF9fSxjYz1mdW5jdGlvbihhKXtpZih0KWE9ZWMoYSk7ZWxzZSBpZih2JiZ1KXN3aXRjaChhKXtjYXNlIDkzOmE9OTF9cmV0dXJuIGF9LGVjPWZ1bmN0aW9uKGEpe3N3aXRjaChhKXtjYXNlIDYxOnJldHVybiAxODc7Y2FzZSA1OTpyZXR1cm4gMTg2O2Nhc2UgMTczOnJldHVybiAxODk7Y2FzZSAyMjQ6cmV0dXJuIDkxO2Nhc2UgMDpyZXR1cm4gMjI0O2RlZmF1bHQ6cmV0dXJuIGF9fTt2YXIgZmM9ZnVuY3Rpb24oYSxiLGMsZCl7ei5jYWxsKHRoaXMsZCk7dGhpcy50eXBlPSJrZXkiO3RoaXMuZz1hO3RoaXMucmVwZWF0PWN9O24oZmMseik7dmFyIEo9ZnVuY3Rpb24oYSxiKXtELmNhbGwodGhpcyk7YSYmZ2ModGhpcyxhLGIpfTtuKEosRCk7Zz1KLnByb3RvdHlwZTtnLlI9bnVsbDtnLnFhPW51bGw7Zy5KYT1udWxsO2cucmE9bnVsbDtnLkY9LTE7Zy5LPS0xO2cuRGE9ITE7CnZhciBoYz17MzoxMywxMjoxNDQsNjMyMzI6MzgsNjMyMzM6NDAsNjMyMzQ6MzcsNjMyMzU6MzksNjMyMzY6MTEyLDYzMjM3OjExMyw2MzIzODoxMTQsNjMyMzk6MTE1LDYzMjQwOjExNiw2MzI0MToxMTcsNjMyNDI6MTE4LDYzMjQzOjExOSw2MzI0NDoxMjAsNjMyNDU6MTIxLDYzMjQ2OjEyMiw2MzI0NzoxMjMsNjMyNDg6NDQsNjMyNzI6NDYsNjMyNzM6MzYsNjMyNzU6MzUsNjMyNzY6MzMsNjMyNzc6MzQsNjMyODk6MTQ0LDYzMzAyOjQ1fSxpYz17VXA6MzgsRG93bjo0MCxMZWZ0OjM3LFJpZ2h0OjM5LEVudGVyOjEzLEYxOjExMixGMjoxMTMsRjM6MTE0LEY0OjExNSxGNToxMTYsRjY6MTE3LEY3OjExOCxGODoxMTksRjk6MTIwLEYxMDoxMjEsRjExOjEyMixGMTI6MTIzLCJVKzAwN0YiOjQ2LEhvbWU6MzYsRW5kOjM1LFBhZ2VVcDozMyxQYWdlRG93bjozNCxJbnNlcnQ6NDV9LGpjPXYmJnQ7CkoucHJvdG90eXBlLmc9ZnVuY3Rpb24oYSl7dSYmKHRoaXMuRj09MTcmJiFhLmN0cmxLZXl8fHRoaXMuRj09MTgmJiFhLmFsdEtleXx8diYmdGhpcy5GPT05MSYmIWEubWV0YUtleSkmJih0aGlzLks9dGhpcy5GPS0xKTt0aGlzLkY9PS0xJiYoYS5jdHJsS2V5JiZhLmchPTE3P3RoaXMuRj0xNzphLmFsdEtleSYmYS5nIT0xOD90aGlzLkY9MTg6YS5tZXRhS2V5JiZhLmchPTkxJiYodGhpcy5GPTkxKSk7ZGMoYS5nLHRoaXMuRixhLnNoaWZ0S2V5LGEuY3RybEtleSxhLmFsdEtleSxhLm1ldGFLZXkpPyh0aGlzLks9Y2MoYS5nKSxqYyYmKHRoaXMuRGE9YS5hbHRLZXkpKTp0aGlzLmhhbmRsZUV2ZW50KGEpfTtKLnByb3RvdHlwZS5oPWZ1bmN0aW9uKGEpe3RoaXMuSz10aGlzLkY9LTE7dGhpcy5EYT1hLmFsdEtleX07CkoucHJvdG90eXBlLmhhbmRsZUV2ZW50PWZ1bmN0aW9uKGEpe3ZhciBiPWEuaCxjPWIuYWx0S2V5O2lmKHUmJmEudHlwZT09ImtleXByZXNzIil7dmFyIGQ9dGhpcy5LO3ZhciBlPWIuY2hhckNvZGU+PTAmJmIuY2hhckNvZGU8NjMyMzImJmJjKGQpP2IuY2hhckNvZGU6MH1lbHNlIGEudHlwZT09ImtleXByZXNzIj8oamMmJihjPXRoaXMuRGEpLGIua2V5Q29kZT09Yi5jaGFyQ29kZT9iLmtleUNvZGU8MzI/KGQ9Yi5rZXlDb2RlLGU9MCk6KGQ9dGhpcy5LLGU9Yi5jaGFyQ29kZSk6KGQ9Yi5rZXlDb2RlfHx0aGlzLkssZT1iLmNoYXJDb2RlfHwwKSk6KGQ9Yi5rZXlDb2RlfHx0aGlzLkssZT1iLmNoYXJDb2RlfHwwKSx2JiZlPT02MyYmZD09MjI0JiYoZD0xOTEpO3ZhciBmPWQ9Y2MoZCk7ZD9kPj02MzIzMiYmZCBpbiBoYz9mPWhjW2RdOmQ9PTI1JiZhLnNoaWZ0S2V5JiYoZj05KTpiLmtleUlkZW50aWZpZXImJmIua2V5SWRlbnRpZmllciBpbiBpYyYmKGY9aWNbYi5rZXlJZGVudGlmaWVyXSk7CmlmKCF0fHxhLnR5cGUhPSJrZXlwcmVzcyJ8fGRjKGYsdGhpcy5GLGEuc2hpZnRLZXksYS5jdHJsS2V5LGMsYS5tZXRhS2V5KSlhPWY9PXRoaXMuRix0aGlzLkY9ZixiPW5ldyBmYyhmLGUsYSxiKSxiLmFsdEtleT1jLEUodGhpcyxiKX07Si5wcm90b3R5cGUuaT1mdW5jdGlvbigpe3JldHVybiB0aGlzLlJ9O3ZhciBnYz1mdW5jdGlvbihhLGIsYyl7YS5yYSYma2MoYSk7YS5SPWI7YS5xYT11YihhLlIsImtleXByZXNzIixhLGMpO2EuSmE9dWIoYS5SLCJrZXlkb3duIixhLmcsYyxhKTthLnJhPXViKGEuUiwia2V5dXAiLGEuaCxjLGEpfSxrYz1mdW5jdGlvbihhKXthLnFhJiYoQShhLnFhKSxBKGEuSmEpLEEoYS5yYSksYS5xYT1udWxsLGEuSmE9bnVsbCxhLnJhPW51bGwpO2EuUj1udWxsO2EuRj0tMTthLks9LTF9O0oucHJvdG90eXBlLkM9ZnVuY3Rpb24oKXtKLmwuQy5jYWxsKHRoaXMpO2tjKHRoaXMpfTt2YXIgSz17Z2E6Im1vdXNlZG93biIsaGE6Im1vdXNldXAiLGZhOiJtb3VzZWNhbmNlbCIsc2M6Im1vdXNlbW92ZSIsdWM6Im1vdXNlb3ZlciIsdGM6Im1vdXNlb3V0IixxYzoibW91c2VlbnRlciIscmM6Im1vdXNlbGVhdmUifTt2YXIgbGM9ZnVuY3Rpb24oYSl7cmV0dXJuIHR5cGVvZiBhLmNsYXNzTmFtZT09InN0cmluZyI/YS5jbGFzc05hbWU6YS5nZXRBdHRyaWJ1dGUmJmEuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIn0sTD1mdW5jdGlvbihhKXtyZXR1cm4gYS5jbGFzc0xpc3Q/YS5jbGFzc0xpc3Q6bGMoYSkubWF0Y2goL1xTKy9nKXx8W119LG1jPWZ1bmN0aW9uKGEsYil7dHlwZW9mIGEuY2xhc3NOYW1lPT0ic3RyaW5nIj9hLmNsYXNzTmFtZT1iOmEuc2V0QXR0cmlidXRlJiZhLnNldEF0dHJpYnV0ZSgiY2xhc3MiLGIpfSxuYz1mdW5jdGlvbihhLGIpe2EuY2xhc3NMaXN0P2I9YS5jbGFzc0xpc3QuY29udGFpbnMoYik6KGE9TChhKSxiPXZhKGEsYik+PTApO3JldHVybiBifSxvYz1mdW5jdGlvbihhLGIpe2lmKGEuY2xhc3NMaXN0KWEuY2xhc3NMaXN0LmFkZChiKTtlbHNlIGlmKCFuYyhhLGIpKXt2YXIgYz1sYyhhKTttYyhhLGMrKGMubGVuZ3RoPjA/IiAiK2I6YikpfX0scGM9ZnVuY3Rpb24oYSxiKXtpZihhLmNsYXNzTGlzdClBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGIsCmZ1bmN0aW9uKGUpe29jKGEsZSl9KTtlbHNle3ZhciBjPXt9O0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoTChhKSxmdW5jdGlvbihlKXtjW2VdPSEwfSk7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChiLGZ1bmN0aW9uKGUpe2NbZV09ITB9KTtiPSIiO2Zvcih2YXIgZCBpbiBjKWIrPWIubGVuZ3RoPjA/IiAiK2Q6ZDttYyhhLGIpfX0scWM9ZnVuY3Rpb24oYSxiKXthLmNsYXNzTGlzdD9hLmNsYXNzTGlzdC5yZW1vdmUoYik6bmMoYSxiKSYmbWMoYSxBcnJheS5wcm90b3R5cGUuZmlsdGVyLmNhbGwoTChhKSxmdW5jdGlvbihjKXtyZXR1cm4gYyE9Yn0pLmpvaW4oIiAiKSl9LHJjPWZ1bmN0aW9uKGEsYil7YS5jbGFzc0xpc3Q/QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChiLGZ1bmN0aW9uKGMpe3FjKGEsYyl9KTptYyhhLEFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbChMKGEpLGZ1bmN0aW9uKGMpe3JldHVybiEodmEoYixjKT49MCl9KS5qb2luKCIgIikpfTt2YXIgdGM9ZnVuY3Rpb24oYSxiKXtpZighYSl0aHJvdyBFcnJvcigiSW52YWxpZCBjbGFzcyBuYW1lICIrYSk7aWYodHlwZW9mIGIhPT0iZnVuY3Rpb24iKXRocm93IEVycm9yKCJJbnZhbGlkIGRlY29yYXRvciBmdW5jdGlvbiAiK2IpO3NjW2FdPWJ9LHVjPXt9LHNjPXt9O3ZhciB2Yz1mdW5jdGlvbihhKXt0aGlzLkE9YX07aWEodmMpO3ZhciB3Yz1mdW5jdGlvbihhLGIpe2EmJihhLnRhYkluZGV4PWI/MDotMSl9LHljPWZ1bmN0aW9uKGEsYixjKXtjLmlkJiZQYihiLGMuaWQpO3ZhciBkPWEuZygpLGU9ITEsZj1MKGMpO2YmJkFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoZixmdW5jdGlvbihoKXtoPT1kP2U9ITA6aCYmdGhpcy51KGIsaCxkKX0sYSk7ZXx8b2MoYyxkKTt4YyhiLGMpO3JldHVybiBjfTt2Yy5wcm90b3R5cGUudT1mdW5jdGlvbihhLGIsYyl7Yj09YysiLWRpc2FibGVkIj9hLlgoITEpOmI9PWMrIi1ob3Jpem9udGFsIj96YyhhLCJob3Jpem9udGFsIik6Yj09YysiLXZlcnRpY2FsIiYmemMoYSwidmVydGljYWwiKX07CnZhciB4Yz1mdW5jdGlvbihhLGIpe2lmKGIpZm9yKHZhciBjPWIuZmlyc3RDaGlsZCxkO2MmJmMucGFyZW50Tm9kZT09Yjspe2Q9Yy5uZXh0U2libGluZztpZihjLm5vZGVUeXBlPT0xKXthOnt2YXIgZT1jO3AoZSk7ZT1MKGUpO2Zvcih2YXIgZj1lLmxlbmd0aCxoPTA7aDxmO2grKyl7dmFyIGs9ZVtoXTtpZihrPWsgaW4gc2M/c2Nba10oKTpudWxsKXtlPWs7YnJlYWsgYX19ZT1udWxsfWUmJihlLmc9YyxhLmlzRW5hYmxlZCgpfHxlLlgoITEpLGEuQmEoZSksU2IoZSxjKSl9ZWxzZSBjLm5vZGVWYWx1ZSYmSGEoYy5ub2RlVmFsdWUpIT0iInx8Yi5yZW1vdmVDaGlsZChjKTtjPWR9fSxBYz1mdW5jdGlvbihhLGIpe2I9Yi5pKCk7cChiLCJUaGUgY29udGFpbmVyIERPTSBlbGVtZW50IGNhbm5vdCBiZSBudWxsLiIpO0tiKGIsdCk7KGE9YS5BKSYmWmIoYixhKX07dmMucHJvdG90eXBlLmc9ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy1jb250YWluZXIifTsKdmMucHJvdG90eXBlLmo9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nKCksYz1bYixhLkw9PSJob3Jpem9udGFsIj9iKyItaG9yaXpvbnRhbCI6YisiLXZlcnRpY2FsIl07YS5pc0VuYWJsZWQoKXx8Yy5wdXNoKGIrIi1kaXNhYmxlZCIpO3JldHVybiBjfTt2YXIgQmM9ZnVuY3Rpb24oKXt9O3ZhciBNPWZ1bmN0aW9uKCl7fSxDYztpYShNKTt2YXIgRGM9e2J1dHRvbjoicHJlc3NlZCIsY2hlY2tib3g6ImNoZWNrZWQiLG1lbnVpdGVtOiJzZWxlY3RlZCIsbWVudWl0ZW1jaGVja2JveDoiY2hlY2tlZCIsbWVudWl0ZW1yYWRpbzoiY2hlY2tlZCIscmFkaW86ImNoZWNrZWQiLHRhYjoic2VsZWN0ZWQiLHRyZWVpdGVtOiJzZWxlY3RlZCJ9O00ucHJvdG90eXBlLk5hPWZ1bmN0aW9uKCl7fTtNLnByb3RvdHlwZS54YT1mdW5jdGlvbihhKXt2YXIgYj1hLkcsYz1iLmgsZD10aGlzLk4oKSxlPVtkXSxmPXRoaXMuTigpO2YhPWQmJmUucHVzaChmKTtkPWEubTtmb3IoZj1bXTtkOyl7dmFyIGg9ZCYtZDtmLnB1c2goRWModGhpcyxoKSk7ZCY9fmh9ZS5wdXNoLmFwcGx5KGUsZik7KGQ9YS5GYSkmJmUucHVzaC5hcHBseShlLGQpO3JldHVybiBjLmNhbGwoYiwiRElWIixlLmpvaW4oIiAiKSxhLmlhKX07Ck0ucHJvdG90eXBlLnlhPWZ1bmN0aW9uKGEsYil7Yi5pZCYmUGIoYSxiLmlkKTtiJiZiLmZpcnN0Q2hpbGQ/RmMoYSxiLmZpcnN0Q2hpbGQubmV4dFNpYmxpbmc/eWEoYi5jaGlsZE5vZGVzKTpiLmZpcnN0Q2hpbGQpOmEuaWE9bnVsbDt2YXIgYz0wLGQ9dGhpcy5OKCksZT10aGlzLk4oKSxmPSExLGg9ITEsaz15YShMKGIpKTtrLmZvckVhY2goZnVuY3Rpb24ocSl7Znx8cSE9ZD9ofHxxIT1lP2N8PUdjKHRoaXMscSk6aD0hMDooZj0hMCxlPT1kJiYoaD0hMCkpO0djKHRoaXMscSk9PTEmJihzYShiKSxkYihiKSYmZWIoYikmJmNiKGIsITEpKX0sdGhpcyk7YS5tPWM7Znx8KGsucHVzaChkKSxlPT1kJiYoaD0hMCkpO2h8fGsucHVzaChlKTsoYT1hLkZhKSYmay5wdXNoLmFwcGx5KGssYSk7ZiYmaCYmIWF8fG1jKGIsay5qb2luKCIgIikpO3JldHVybiBifTsKdmFyIEhjPWZ1bmN0aW9uKGEsYil7aWYoYT1hLk5hKCkpe3AoYiwiVGhlIGVsZW1lbnQgcGFzc2VkIGFzIGEgZmlyc3QgcGFyYW1ldGVyIGNhbm5vdCBiZSBudWxsLiIpO3ZhciBjPWIuZ2V0QXR0cmlidXRlKCJyb2xlIil8fG51bGw7YSE9YyYmWmIoYixhKX19LEljPWZ1bmN0aW9uKGEsYil7dmFyIGM7aWYoYS5EJjMyJiYoYz1hLmkoKSkpe2lmKCFiJiZhLm0mMzIpe3RyeXtjLmJsdXIoKX1jYXRjaChkKXt9YS5tJjMyJiZhLlFhKG51bGwpfShkYihjKSYmZWIoYykpIT1iJiZjYihjLGIpfX0sSmM9ZnVuY3Rpb24oYSxiLGMpe0NjfHwoQ2M9ezE6ImRpc2FibGVkIiw4OiJzZWxlY3RlZCIsMTY6ImNoZWNrZWQiLDY0OiJleHBhbmRlZCJ9KTtwKGEsIlRoZSBlbGVtZW50IHBhc3NlZCBhcyBhIGZpcnN0IHBhcmFtZXRlciBjYW5ub3QgYmUgbnVsbC4iKTtiPUNjW2JdO3ZhciBkPWEuZ2V0QXR0cmlidXRlKCJyb2xlIil8fG51bGw7ZCYmKGQ9RGNbZF18fGIsYj1iPT0iY2hlY2tlZCJ8fGI9PQoic2VsZWN0ZWQiP2Q6Yik7YiYmYWMoYSxiLGMpfTtNLnByb3RvdHlwZS5OPWZ1bmN0aW9uKCl7cmV0dXJuImdvb2ctY29udHJvbCJ9O3ZhciBFYz1mdW5jdGlvbihhLGIpe2EuZ3x8S2MoYSk7cmV0dXJuIGEuZ1tiXX0sR2M9ZnVuY3Rpb24oYSxiKXthLmh8fChhLmd8fEtjKGEpLGEuaD1FYShhLmcpKTthPXBhcnNlSW50KGEuaFtiXSwxMCk7cmV0dXJuIGlzTmFOKGEpPzA6YX0sS2M9ZnVuY3Rpb24oYSl7dmFyIGI9YS5OKCk7dmFyIGM9Yi5yZXBsYWNlKC9ceGEwfFxzL2csIiAiKS5pbmRleE9mKCIgIikhPS0xO3AoIWMsIkNvbnRyb2xSZW5kZXJlciBoYXMgYW4gaW52YWxpZCBjc3MgY2xhc3M6ICciK2IrIiciKTthLmc9ezE6YisiLWRpc2FibGVkIiwyOmIrIi1ob3ZlciIsNDpiKyItYWN0aXZlIiw4OmIrIi1zZWxlY3RlZCIsMTY6YisiLWNoZWNrZWQiLDMyOmIrIi1mb2N1c2VkIiw2NDpiKyItb3BlbiJ9fTt2YXIgTj1mdW5jdGlvbihhLGIsYyl7Ri5jYWxsKHRoaXMsYyk7aWYoIWIpe2ZvcihiPXRoaXMuY29uc3RydWN0b3I7Yjspe3ZhciBkPW5hKGIpO2lmKGQ9dWNbZF0pYnJlYWs7Yj0oYj1PYmplY3QuZ2V0UHJvdG90eXBlT2YoYi5wcm90b3R5cGUpKSYmYi5jb25zdHJ1Y3Rvcn1iPWQ/dHlwZW9mIGQuVj09PSJmdW5jdGlvbiI/ZC5WKCk6bmV3IGQ6bnVsbH10aGlzLnY9Yjt0aGlzLmlhPWEhPT12b2lkIDA/YTpudWxsfTtuKE4sRik7Zz1OLnByb3RvdHlwZTtnLmlhPW51bGw7Zy5tPTA7Zy5EPTM5O2cuUD0wO2cuT2E9ITA7Zy5GYT1udWxsO2cuSGE9ITA7Zy5tYT1mdW5jdGlvbigpe3ZhciBhPXRoaXMudi54YSh0aGlzKTt0aGlzLmc9YTtIYyh0aGlzLnYsYSk7S2IoYSwhMCk7dGhpcy5pc1Zpc2libGUoKXx8KGEuc3R5bGUuZGlzcGxheT0ibm9uZSIsYSYmYWMoYSwiaGlkZGVuIiwhMCkpfTtnLm5hPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaSgpfTtnLndhPWZ1bmN0aW9uKCl7cmV0dXJuITB9OwpnLkVhPWZ1bmN0aW9uKGEpe3RoaXMuZz1hPXRoaXMudi55YSh0aGlzLGEpO0hjKHRoaXMudixhKTtLYihhLCEwKTt0aGlzLk9hPWEuc3R5bGUuZGlzcGxheSE9Im5vbmUifTsKZy5JPWZ1bmN0aW9uKCl7Ti5sLkkuY2FsbCh0aGlzKTt2YXIgYT10aGlzLmc7cChhLCJDYW4gbm90IGNhbGwgZ2V0RWxlbWVudFN0cmljdCBiZWZvcmUgcmVuZGVyaW5nL2RlY29yYXRpbmcuIik7cCh0aGlzKTtwKGEpO3RoaXMuaXNWaXNpYmxlKCl8fGFjKGEsImhpZGRlbiIsIXRoaXMuaXNWaXNpYmxlKCkpO3RoaXMuaXNFbmFibGVkKCl8fEpjKGEsMSwhdGhpcy5pc0VuYWJsZWQoKSk7dGhpcy5EJjgmJkpjKGEsOCwhISh0aGlzLm0mOCkpO3RoaXMuRCYxNiYmSmMoYSwxNiwhISh0aGlzLm0mMTYpKTt0aGlzLkQmNjQmJkpjKGEsNjQsISEodGhpcy5tJjY0KSk7dmFyIGI9dGhpcy52O1ViKHRoaXMpJiYoYT10aGlzLmkoKSxiPWIuTigpKyItcnRsIiwoYT1hLmk/YS5pKCk6YSkmJnBjKGEsW2JdKSk7dGhpcy5pc0VuYWJsZWQoKSYmSWModGhpcyx0aGlzLmlzVmlzaWJsZSgpKTt0aGlzLkQmLTImJih0aGlzLkhhJiZMYyh0aGlzLCEwKSx0aGlzLkQmMzImJihhPXRoaXMuaSgpKSkmJihiPQp0aGlzLlp8fCh0aGlzLlo9bmV3IEopLGdjKGIsYSksQihCKEIoUWIodGhpcyksYiwia2V5Iix0aGlzLmFhKSxhLCJmb2N1cyIsdGhpcy5YYSksYSwiYmx1ciIsdGhpcy5RYSkpfTt2YXIgTGM9ZnVuY3Rpb24oYSxiKXt2YXIgYz1RYihhKSxkPWEuaSgpO2I/KEIoQihCKEIoYyxkLEsuZ2EsYS5zYSksZCxbSy5oYSxLLmZhXSxhLnZhKSxkLCJtb3VzZW92ZXIiLGEudWEpLGQsIm1vdXNlb3V0IixhLnRhKSxhLmNhIT1CYyYmQihjLGQsImNvbnRleHRtZW51IixhLmNhKSk6KEMoQyhDKEMoYyxkLEsuZ2EsYS5zYSksZCxbSy5oYSxLLmZhXSxhLnZhKSxkLCJtb3VzZW92ZXIiLGEudWEpLGQsIm1vdXNlb3V0IixhLnRhKSxhLmNhIT1CYyYmQyhjLGQsImNvbnRleHRtZW51IixhLmNhKSl9O04ucHJvdG90eXBlLlU9ZnVuY3Rpb24oKXtOLmwuVS5jYWxsKHRoaXMpO3RoaXMuWiYma2ModGhpcy5aKTt0aGlzLmlzVmlzaWJsZSgpJiZ0aGlzLmlzRW5hYmxlZCgpJiZJYyh0aGlzLCExKX07Ck4ucHJvdG90eXBlLkM9ZnVuY3Rpb24oKXtOLmwuQy5jYWxsKHRoaXMpO3RoaXMuWiYmKHRoaXMuWi5kaXNwb3NlKCksZGVsZXRlIHRoaXMuWik7ZGVsZXRlIHRoaXMudjt0aGlzLkZhPXRoaXMuaWE9bnVsbH07dmFyIEZjPWZ1bmN0aW9uKGEsYil7YS5pYT1ifTtOLnByb3RvdHlwZS5pc1Zpc2libGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5PYX07Ti5wcm90b3R5cGUuaXNFbmFibGVkPWZ1bmN0aW9uKCl7cmV0dXJuISh0aGlzLm0mMSl9O04ucHJvdG90eXBlLlg9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5oO2ImJnR5cGVvZiBiLmlzRW5hYmxlZD09ImZ1bmN0aW9uIiYmIWIuaXNFbmFibGVkKCl8fCFPKHRoaXMsMSwhYSl8fChhfHwoTWModGhpcywhMSksUCh0aGlzLCExKSksdGhpcy5pc1Zpc2libGUoKSYmSWModGhpcyxhKSxUKHRoaXMsMSwhYSwhMCkpfTt2YXIgUD1mdW5jdGlvbihhLGIpe08oYSwyLGIpJiZUKGEsMixiKX07Ck4ucHJvdG90eXBlLmlzQWN0aXZlPWZ1bmN0aW9uKCl7cmV0dXJuISEodGhpcy5tJjQpfTsKdmFyIE1jPWZ1bmN0aW9uKGEsYil7TyhhLDQsYikmJlQoYSw0LGIpfSxOYz1mdW5jdGlvbihhLGIpe08oYSw4LGIpJiZUKGEsOCxiKX0sT2M9ZnVuY3Rpb24oYSxiKXtPKGEsNjQsYikmJlQoYSw2NCxiKX0sVD1mdW5jdGlvbihhLGIsYyxkKXtpZighZCYmYj09MSlhLlgoIWMpO2Vsc2UgaWYoYS5EJmImJmMhPSEhKGEubSZiKSl7dmFyIGU9YS52O2lmKGQ9YS5pKCkpe2lmKGU9RWMoZSxiKSl7dmFyIGY9YS5pP2EuaSgpOmE7ZiYmKGM/cGM6cmMpKGYsW2VdKX1KYyhkLGIsYyl9YS5tPWM/YS5tfGI6YS5tJn5ifX0sUGM9ZnVuY3Rpb24oYSxiLGMpe2lmKGEucyYmYS5tJmImJiFjKXRocm93IEVycm9yKCJDb21wb25lbnQgYWxyZWFkeSByZW5kZXJlZCIpOyFjJiZhLm0mYiYmVChhLGIsITEpO2EuRD1jP2EuRHxiOmEuRCZ+Yn0sVT1mdW5jdGlvbihhLGIpe3JldHVybiEhKDI1NSZiKSYmISEoYS5EJmIpfSxPPWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4hIShhLkQmYikmJiEhKGEubSZiKSE9CmMmJighKGEuUCZiKXx8RShhLE5iKGIsYykpKSYmIWEuYmF9O04ucHJvdG90eXBlLnVhPWZ1bmN0aW9uKGEpeyFRYyhhLHRoaXMuaSgpKSYmRSh0aGlzLCJlbnRlciIpJiZ0aGlzLmlzRW5hYmxlZCgpJiZVKHRoaXMsMikmJlAodGhpcywhMCl9O04ucHJvdG90eXBlLnRhPWZ1bmN0aW9uKGEpeyFRYyhhLHRoaXMuaSgpKSYmRSh0aGlzLCJsZWF2ZSIpJiYoVSh0aGlzLDQpJiZNYyh0aGlzLCExKSxVKHRoaXMsMikmJlAodGhpcywhMSkpfTtOLnByb3RvdHlwZS5jYT1CYzt2YXIgUWM9ZnVuY3Rpb24oYSxiKXtyZXR1cm4hIWEucmVsYXRlZFRhcmdldCYmYWIoYixhLnJlbGF0ZWRUYXJnZXQpfTsKTi5wcm90b3R5cGUuc2E9ZnVuY3Rpb24oYSl7aWYodGhpcy5pc0VuYWJsZWQoKSYmKFUodGhpcywyKSYmUCh0aGlzLCEwKSwhKGEuaC5idXR0b24hPTB8fHYmJmEuY3RybEtleSkpKXtVKHRoaXMsNCkmJk1jKHRoaXMsITApO3ZhciBiO2lmKGI9dGhpcy52KXt2YXIgYztiPXRoaXMuRCYzMiYmKGM9dGhpcy5pKCkpP2RiKGMpJiZlYihjKTohMX1iJiZ0aGlzLmkoKS5mb2N1cygpfWEuaC5idXR0b24hPTB8fHYmJmEuY3RybEtleXx8YS5qKCl9O04ucHJvdG90eXBlLnZhPWZ1bmN0aW9uKGEpe3RoaXMuaXNFbmFibGVkKCkmJihVKHRoaXMsMikmJlAodGhpcywhMCksdGhpcy5pc0FjdGl2ZSgpJiZSYyh0aGlzLGEpJiZVKHRoaXMsNCkmJk1jKHRoaXMsITEpKX07CnZhciBSYz1mdW5jdGlvbihhLGIpe2lmKFUoYSwxNikpe3ZhciBjPSEoYS5tJjE2KTtPKGEsMTYsYykmJlQoYSwxNixjKX1VKGEsOCkmJk5jKGEsITApO1UoYSw2NCkmJk9jKGEsIShhLm0mNjQpKTtjPW5ldyB5KCJhY3Rpb24iLGEpO2ImJihjLmFsdEtleT1iLmFsdEtleSxjLmN0cmxLZXk9Yi5jdHJsS2V5LGMubWV0YUtleT1iLm1ldGFLZXksYy5zaGlmdEtleT1iLnNoaWZ0S2V5LGMuRz1iLkcsYy50aW1lU3RhbXA9Yi50aW1lU3RhbXApO3JldHVybiBFKGEsYyl9O04ucHJvdG90eXBlLlhhPWZ1bmN0aW9uKCl7VSh0aGlzLDMyKSYmTyh0aGlzLDMyLCEwKSYmVCh0aGlzLDMyLCEwKX07Ti5wcm90b3R5cGUuUWE9ZnVuY3Rpb24oKXtVKHRoaXMsNCkmJk1jKHRoaXMsITEpO1UodGhpcywzMikmJk8odGhpcywzMiwhMSkmJlQodGhpcywzMiwhMSl9OwpOLnByb3RvdHlwZS5hYT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5pc1Zpc2libGUoKSYmdGhpcy5pc0VuYWJsZWQoKSYmYS5nPT0xMyYmUmModGhpcyxhKT8oYS5qKCksYS52KCksITApOiExfTtpZih0eXBlb2YgTiE9PSJmdW5jdGlvbiIpdGhyb3cgRXJyb3IoIkludmFsaWQgY29tcG9uZW50IGNsYXNzICIrTik7aWYodHlwZW9mIE0hPT0iZnVuY3Rpb24iKXRocm93IEVycm9yKCJJbnZhbGlkIHJlbmRlcmVyIGNsYXNzICIrTSk7dmFyIFNjPW5hKE4pO3VjW1NjXT1NO3RjKCJnb29nLWNvbnRyb2wiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBOKG51bGwpfSk7dmFyIFY9ZnVuY3Rpb24oYSxiLGMpe0YuY2FsbCh0aGlzLGMpO3RoaXMuZWE9Ynx8dmMuVigpO3RoaXMuTD1hfHwidmVydGljYWwifTtuKFYsRik7Zz1WLnByb3RvdHlwZTtnLkthPW51bGw7Zy5kYT1udWxsO2cuZWE9bnVsbDtnLkw9bnVsbDtnLlM9ITA7Zy5UPSEwO2cubz0tMTtnLkI9bnVsbDtnLlc9ITE7Zy5PPW51bGw7dmFyIFRjPWZ1bmN0aW9uKGEpe3JldHVybiBhLkthfHxhLmkoKX07Zz1WLnByb3RvdHlwZTtnLm1hPWZ1bmN0aW9uKCl7dGhpcy5nPXRoaXMuRy5oKCJESVYiLHRoaXMuZWEuaih0aGlzKS5qb2luKCIgIikpfTtnLm5hPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaSgpfTtnLndhPWZ1bmN0aW9uKGEpe3JldHVybiBhLnRhZ05hbWU9PSJESVYifTtnLkVhPWZ1bmN0aW9uKGEpe3RoaXMuZz15Yyh0aGlzLmVhLHRoaXMsYSk7YS5zdHlsZS5kaXNwbGF5PT0ibm9uZSImJih0aGlzLlM9ITEpfTsKZy5JPWZ1bmN0aW9uKCl7Vi5sLkkuY2FsbCh0aGlzKTtUYih0aGlzLGZ1bmN0aW9uKGIpe2IucyYmVWModGhpcyxiKX0sdGhpcyk7dmFyIGE9dGhpcy5pKCk7QWModGhpcy5lYSx0aGlzKTtWYyh0aGlzLHRoaXMuUyk7QihCKEIoQihCKEIoQihCKFFiKHRoaXMpLHRoaXMsImVudGVyIix0aGlzLmViKSx0aGlzLCJoaWdobGlnaHQiLHRoaXMuZmIpLHRoaXMsInVuaGlnaGxpZ2h0Iix0aGlzLmxiKSx0aGlzLCJvcGVuIix0aGlzLmdiKSx0aGlzLCJjbG9zZSIsdGhpcy5iYiksYSxLLmdhLHRoaXMuV2EpLGJiKGEpLFtLLmhhLEsuZmFdLHRoaXMuY2IpLGEsW0suZ2EsSy5oYSxLLmZhLCJtb3VzZW92ZXIiLCJtb3VzZW91dCIsImNvbnRleHRtZW51Il0sdGhpcy5hYik7V2ModGhpcyl9O3ZhciBXYz1mdW5jdGlvbihhKXt2YXIgYj1RYihhKSxjPVRjKGEpO0IoQihCKGIsYywiZm9jdXMiLGEuUGEpLGMsImJsdXIiLGEuVWEpLGEuZGF8fChhLmRhPW5ldyBKKFRjKGEpKSksImtleSIsYS5WYSl9OwpnPVYucHJvdG90eXBlO2cuVT1mdW5jdGlvbigpe1hjKHRoaXMsLTEpO3RoaXMuQiYmT2ModGhpcy5CLCExKTt0aGlzLlc9ITE7Vi5sLlUuY2FsbCh0aGlzKX07Zy5DPWZ1bmN0aW9uKCl7Vi5sLkMuY2FsbCh0aGlzKTt0aGlzLmRhJiYodGhpcy5kYS5kaXNwb3NlKCksdGhpcy5kYT1udWxsKTt0aGlzLmVhPXRoaXMuQj10aGlzLk89dGhpcy5LYT1udWxsfTtnLmViPWZ1bmN0aW9uKCl7cmV0dXJuITB9OwpnLmZiPWZ1bmN0aW9uKGEpe3ZhciBiPVZiKHRoaXMsYS50YXJnZXQpO2lmKGI+LTEmJmIhPXRoaXMubyl7dmFyIGM9SSh0aGlzLHRoaXMubyk7YyYmUChjLCExKTt0aGlzLm89YjtjPUkodGhpcyx0aGlzLm8pO3RoaXMuVyYmTWMoYywhMCk7dGhpcy5CJiZjIT10aGlzLkImJihjLkQmNjQ/T2MoYywhMCk6T2ModGhpcy5CLCExKSl9Yj10aGlzLmkoKTtwKGIsIlRoZSBET00gZWxlbWVudCBmb3IgdGhlIGNvbnRhaW5lciBjYW5ub3QgYmUgbnVsbC4iKTthLnRhcmdldC5pKCkhPW51bGwmJmFjKGIsImFjdGl2ZWRlc2NlbmRhbnQiLGEudGFyZ2V0LmkoKS5pZCl9O2cubGI9ZnVuY3Rpb24oYSl7YS50YXJnZXQ9PUkodGhpcyx0aGlzLm8pJiYodGhpcy5vPS0xKTthPXRoaXMuaSgpO3AoYSwiVGhlIERPTSBlbGVtZW50IGZvciB0aGUgY29udGFpbmVyIGNhbm5vdCBiZSBudWxsLiIpO2EucmVtb3ZlQXR0cmlidXRlKCRiKCJhY3RpdmVkZXNjZW5kYW50IikpfTsKZy5nYj1mdW5jdGlvbihhKXsoYT1hLnRhcmdldCkmJmEhPXRoaXMuQiYmYS5oPT10aGlzJiYodGhpcy5CJiZPYyh0aGlzLkIsITEpLHRoaXMuQj1hKX07Zy5iYj1mdW5jdGlvbihhKXthLnRhcmdldD09dGhpcy5CJiYodGhpcy5CPW51bGwpO3ZhciBiPXRoaXMuaSgpLGM9YS50YXJnZXQuaSgpO2ImJmEudGFyZ2V0Lm0mMiYmYyYmKGE9IiIsYyYmKGE9Yy5pZCxwKGEsIlRoZSBhY3RpdmUgZWxlbWVudCBzaG91bGQgaGF2ZSBhbiBpZC4iKSksYWMoYiwiYWN0aXZlZGVzY2VuZGFudCIsYSkpfTtnLldhPWZ1bmN0aW9uKGEpe3RoaXMuVCYmKHRoaXMuVz0hMCk7dmFyIGI9VGModGhpcyk7YiYmZGIoYikmJmViKGIpP2IuZm9jdXMoKTphLmooKX07Zy5jYj1mdW5jdGlvbigpe3RoaXMuVz0hMX07CmcuYWI9ZnVuY3Rpb24oYSl7YTp7dmFyIGI9YS50YXJnZXQ7aWYodGhpcy5PKWZvcih2YXIgYz10aGlzLmkoKTtiJiZiIT09Yzspe3ZhciBkPWIuaWQ7aWYoZCBpbiB0aGlzLk8pe2I9dGhpcy5PW2RdO2JyZWFrIGF9Yj1iLnBhcmVudE5vZGV9Yj1udWxsfWlmKGIpc3dpdGNoKGEudHlwZSl7Y2FzZSBLLmdhOmIuc2EoYSk7YnJlYWs7Y2FzZSBLLmhhOmNhc2UgSy5mYTpiLnZhKGEpO2JyZWFrO2Nhc2UgIm1vdXNlb3ZlciI6Yi51YShhKTticmVhaztjYXNlICJtb3VzZW91dCI6Yi50YShhKTticmVhaztjYXNlICJjb250ZXh0bWVudSI6Yi5jYShhKX19O2cuUGE9ZnVuY3Rpb24oKXt9O2cuVWE9ZnVuY3Rpb24oKXtYYyh0aGlzLC0xKTt0aGlzLlc9ITE7dGhpcy5CJiZPYyh0aGlzLkIsITEpfTsKZy5WYT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5pc0VuYWJsZWQoKSYmdGhpcy5pc1Zpc2libGUoKSYmKEgodGhpcykhPTB8fHRoaXMuS2EpJiZZYyh0aGlzLGEpPyhhLmooKSxhLnYoKSwhMCk6ITF9Owp2YXIgWWM9ZnVuY3Rpb24oYSxiKXt2YXIgYz1JKGEsYS5vKTtpZihjJiZ0eXBlb2YgYy5hYT09ImZ1bmN0aW9uIiYmYy5hYShiKXx8YS5CJiZhLkIhPWMmJnR5cGVvZiBhLkIuYWE9PSJmdW5jdGlvbiImJmEuQi5hYShiKSlyZXR1cm4hMDtpZihiLnNoaWZ0S2V5fHxiLmN0cmxLZXl8fGIubWV0YUtleXx8Yi5hbHRLZXkpcmV0dXJuITE7c3dpdGNoKGIuZyl7Y2FzZSAyNzpUYyhhKS5ibHVyKCk7YnJlYWs7Y2FzZSAzNjpaYyhhKTticmVhaztjYXNlIDM1OiRjKGEpO2JyZWFrO2Nhc2UgMzg6aWYoYS5MPT0idmVydGljYWwiKWFkKGEpO2Vsc2UgcmV0dXJuITE7YnJlYWs7Y2FzZSAzNzppZihhLkw9PSJob3Jpem9udGFsIilVYihhKT9iZChhKTphZChhKTtlbHNlIHJldHVybiExO2JyZWFrO2Nhc2UgNDA6aWYoYS5MPT0idmVydGljYWwiKWJkKGEpO2Vsc2UgcmV0dXJuITE7YnJlYWs7Y2FzZSAzOTppZihhLkw9PSJob3Jpem9udGFsIilVYihhKT9hZChhKTpiZChhKTtlbHNlIHJldHVybiExOwpicmVhaztkZWZhdWx0OnJldHVybiExfXJldHVybiEwfSxVYz1mdW5jdGlvbihhLGIpe3ZhciBjPWIuaSgpO2M9Yy5pZHx8KGMuaWQ9T2IoYikpO2EuT3x8KGEuTz17fSk7YS5PW2NdPWJ9O1YucHJvdG90eXBlLkJhPWZ1bmN0aW9uKGEsYil7dWEoYSxOLCJUaGUgY2hpbGQgb2YgYSBjb250YWluZXIgbXVzdCBiZSBhIGNvbnRyb2wiKTtWLmwuQmEuY2FsbCh0aGlzLGEsYil9O1YucHJvdG90eXBlLkNhPWZ1bmN0aW9uKGEsYixjKXt1YShhLE4pO2EuUHw9MjthLlB8PTY0O1BjKGEsMzIsITEpO2EucyYmMCE9YS5IYSYmTGMoYSwhMSk7YS5IYT0hMTt2YXIgZD1hLmg9PXRoaXM/VmIodGhpcyxhKTotMTtWLmwuQ2EuY2FsbCh0aGlzLGEsYixjKTthLnMmJnRoaXMucyYmVWModGhpcyxhKTthPWQ7YT09LTEmJihhPUgodGhpcykpO2E9PXRoaXMubz90aGlzLm89TWF0aC5taW4oSCh0aGlzKS0xLGIpOmE+dGhpcy5vJiZiPD10aGlzLm8/dGhpcy5vKys6YTx0aGlzLm8mJmI+dGhpcy5vJiZ0aGlzLm8tLX07CnZhciB6Yz1mdW5jdGlvbihhLGIpe2lmKGEuaSgpKXRocm93IEVycm9yKCJDb21wb25lbnQgYWxyZWFkeSByZW5kZXJlZCIpO2EuTD1ifTtWLnByb3RvdHlwZS5pc1Zpc2libGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5TfTt2YXIgVmM9ZnVuY3Rpb24oYSxiKXthLlM9Yjt2YXIgYz1hLmkoKTtjJiYoYy5zdHlsZS5kaXNwbGF5PWI/IiI6Im5vbmUiLHdjKFRjKGEpLGEuVCYmYS5TKSl9O1YucHJvdG90eXBlLmlzRW5hYmxlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLlR9O1YucHJvdG90eXBlLlg9ZnVuY3Rpb24oYSl7dGhpcy5UIT1hJiZFKHRoaXMsYT8iZW5hYmxlIjoiZGlzYWJsZSIpJiYoYT8odGhpcy5UPSEwLFRiKHRoaXMsZnVuY3Rpb24oYil7Yi5UYT9kZWxldGUgYi5UYTpiLlgoITApfSkpOihUYih0aGlzLGZ1bmN0aW9uKGIpe2IuaXNFbmFibGVkKCk/Yi5YKCExKTpiLlRhPSEwfSksdGhpcy5XPXRoaXMuVD0hMSksd2MoVGModGhpcyksYSYmdGhpcy5TKSl9Owp2YXIgWGM9ZnVuY3Rpb24oYSxiKXsoYj1JKGEsYikpP1AoYiwhMCk6YS5vPi0xJiZQKEkoYSxhLm8pLCExKX0sWmM9ZnVuY3Rpb24oYSl7Y2QoYSxmdW5jdGlvbihiLGMpe3JldHVybihiKzEpJWN9LEgoYSktMSl9LCRjPWZ1bmN0aW9uKGEpe2NkKGEsZnVuY3Rpb24oYixjKXtiLS07cmV0dXJuIGI8MD9jLTE6Yn0sMCl9LGJkPWZ1bmN0aW9uKGEpe2NkKGEsZnVuY3Rpb24oYixjKXtyZXR1cm4oYisxKSVjfSxhLm8pfSxhZD1mdW5jdGlvbihhKXtjZChhLGZ1bmN0aW9uKGIsYyl7Yi0tO3JldHVybiBiPDA/Yy0xOmJ9LGEubyl9LGNkPWZ1bmN0aW9uKGEsYixjKXtjPWM8MD9WYihhLGEuQik6Yzt2YXIgZD1IKGEpO2M9Yi5jYWxsKGEsYyxkKTtmb3IodmFyIGU9MDtlPD1kOyl7dmFyIGY9SShhLGMpO2lmKGYmJmYuaXNWaXNpYmxlKCkmJmYuaXNFbmFibGVkKCkmJmYuRCYyKXthLkxhKGMpO2JyZWFrfWUrKztjPWIuY2FsbChhLGMsZCl9fTsKVi5wcm90b3R5cGUuTGE9ZnVuY3Rpb24oYSl7WGModGhpcyxhKX07dmFyIGRkPWZ1bmN0aW9uKCl7fTtuKGRkLE0pO2lhKGRkKTtnPWRkLnByb3RvdHlwZTtnLk49ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy10YWIifTtnLk5hPWZ1bmN0aW9uKCl7cmV0dXJuInRhYiJ9O2cueGE9ZnVuY3Rpb24oYSl7dmFyIGI9ZGQubC54YS5jYWxsKHRoaXMsYSk7KGE9YS5HYSgpKSYmdGhpcy5NYShiLGEpO3JldHVybiBifTtnLnlhPWZ1bmN0aW9uKGEsYil7Yj1kZC5sLnlhLmNhbGwodGhpcyxhLGIpO3ZhciBjPXRoaXMuR2EoYik7YyYmKGEuUmE9Yyk7YS5tJjgmJihjPWEuaCkmJnR5cGVvZiBjLko9PT0iZnVuY3Rpb24iJiYoVChhLDgsITEpLGMuSihhKSk7cmV0dXJuIGJ9O2cuR2E9ZnVuY3Rpb24oYSl7cmV0dXJuIGEudGl0bGV8fCIifTtnLk1hPWZ1bmN0aW9uKGEsYil7YSYmKGEudGl0bGU9Ynx8IiIpfTt2YXIgZWQ9ZnVuY3Rpb24oYSxiLGMpe04uY2FsbCh0aGlzLGEsYnx8ZGQuVigpLGMpO1BjKHRoaXMsOCwhMCk7dGhpcy5QfD05fTtuKGVkLE4pO2VkLnByb3RvdHlwZS5HYT1mdW5jdGlvbigpe3JldHVybiB0aGlzLlJhfTtlZC5wcm90b3R5cGUuTWE9ZnVuY3Rpb24oYSl7dGhpcy52Lk1hKHRoaXMuaSgpLGEpO3RoaXMuUmE9YX07dGMoImdvb2ctdGFiIixmdW5jdGlvbigpe3JldHVybiBuZXcgZWQobnVsbCl9KTt2YXIgVz1mdW5jdGlvbigpe3RoaXMuQT0idGFibGlzdCJ9O24oVyx2Yyk7aWEoVyk7Vy5wcm90b3R5cGUuZz1mdW5jdGlvbigpe3JldHVybiJnb29nLXRhYi1iYXIifTtXLnByb3RvdHlwZS51PWZ1bmN0aW9uKGEsYixjKXt0aGlzLnZ8fCh0aGlzLmh8fGZkKHRoaXMpLHRoaXMudj1FYSh0aGlzLmgpKTt2YXIgZD10aGlzLnZbYl07ZD8oemMoYSxnZChkKSksYS52PWQpOlcubC51LmNhbGwodGhpcyxhLGIsYyl9O1cucHJvdG90eXBlLmo9ZnVuY3Rpb24oYSl7dmFyIGI9Vy5sLmouY2FsbCh0aGlzLGEpO3RoaXMuaHx8ZmQodGhpcyk7Yi5wdXNoKHRoaXMuaFthLnZdKTtyZXR1cm4gYn07dmFyIGZkPWZ1bmN0aW9uKGEpe3ZhciBiPWEuZygpO2EuaD17dG9wOmIrIi10b3AiLGJvdHRvbTpiKyItYm90dG9tIixzdGFydDpiKyItc3RhcnQiLGVuZDpiKyItZW5kIn19O3ZhciBYPWZ1bmN0aW9uKGEsYixjKXthPWF8fCJ0b3AiO3pjKHRoaXMsZ2QoYSkpO3RoaXMudj1hO1YuY2FsbCh0aGlzLHRoaXMuTCxifHxXLlYoKSxjKTtoZCh0aGlzKX07bihYLFYpO2c9WC5wcm90b3R5cGU7Zy5IPW51bGw7Zy5JPWZ1bmN0aW9uKCl7WC5sLkkuY2FsbCh0aGlzKTtoZCh0aGlzKX07Zy5DPWZ1bmN0aW9uKCl7WC5sLkMuY2FsbCh0aGlzKTt0aGlzLkg9bnVsbH07Zy5MYT1mdW5jdGlvbihhKXtYLmwuTGEuY2FsbCh0aGlzLGEpO3RoaXMuSihJKHRoaXMsYSkpfTtnLko9ZnVuY3Rpb24oYSl7YT9OYyhhLCEwKTp0aGlzLkgmJk5jKHRoaXMuSCwhMSl9Owp2YXIgaWQ9ZnVuY3Rpb24oYSxiKXtpZihiJiZiPT1hLkgpe2Zvcih2YXIgYz1WYihhLGIpLGQ9Yy0xO2I9SShhLGQpO2QtLSl7dmFyIGU9YjtpZihlLmlzVmlzaWJsZSgpJiZlLmlzRW5hYmxlZCgpKXthLkooYik7cmV0dXJufX1mb3IoYys9MTtiPUkoYSxjKTtjKyspaWYoZD1iLGQuaXNWaXNpYmxlKCkmJmQuaXNFbmFibGVkKCkpe2EuSihiKTtyZXR1cm59YS5KKG51bGwpfX07Zz1YLnByb3RvdHlwZTtnLmpiPWZ1bmN0aW9uKGEpe3RoaXMuSCYmdGhpcy5IIT1hLnRhcmdldCYmTmModGhpcy5ILCExKTt0aGlzLkg9YS50YXJnZXR9O2cua2I9ZnVuY3Rpb24oYSl7YS50YXJnZXQ9PXRoaXMuSCYmKHRoaXMuSD1udWxsKX07Zy5oYj1mdW5jdGlvbihhKXtpZCh0aGlzLGEudGFyZ2V0KX07Zy5pYj1mdW5jdGlvbihhKXtpZCh0aGlzLGEudGFyZ2V0KX07Zy5QYT1mdW5jdGlvbigpe0kodGhpcyx0aGlzLm8pfHxYYyh0aGlzLFZiKHRoaXMsdGhpcy5IfHxJKHRoaXMsMCkpKX07CnZhciBoZD1mdW5jdGlvbihhKXtCKEIoQihCKFFiKGEpLGEsInNlbGVjdCIsYS5qYiksYSwidW5zZWxlY3QiLGEua2IpLGEsImRpc2FibGUiLGEuaGIpLGEsImhpZGUiLGEuaWIpfSxnZD1mdW5jdGlvbihhKXtyZXR1cm4gYT09InN0YXJ0Inx8YT09ImVuZCI/InZlcnRpY2FsIjoiaG9yaXpvbnRhbCJ9O3RjKCJnb29nLXRhYi1iYXIiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBYfSk7ZnVuY3Rpb24gamQoYSl7dmFyIGI9e3RvcDoiYm90dG9tIixib3R0b206InRvcCIsc3RhcnQ6InJpZ2h0IixlbmQ6ImxlZnQifVthLmxvY2F0aW9uXSxjPWEuZWxlbWVudElkLGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTtkLnRleHRDb250ZW50PSJcbiAgICBmaWVsZHNldCB7XG4gICAgICBwYWRkaW5nOiAxMHB4O1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgIzM2OTtcbiAgICB9XG5cbiAgICAjIitjKyIgLmdvb2ctdGFiLWNvbnRlbnQge1xuICAgICAgbWluLWhlaWdodDogM2VtO1xuICAgICAgbWFyZ2luOiAwO1xuICAgICAgYm9yZGVyOiAiK2EuYm9yZGVyKyIgc29saWQgIithLmJvcmRlckNvbG9yKyI7XG4gICAgICBib3JkZXItdG9wOiAwO1xuICAgICAgaGVpZ2h0OiAiK2EuY29udGVudEhlaWdodCsiO1xuICAgICAgcGFkZGluZzogNHB4IDhweDtcbiAgICAgIG1hcmdpbi1yaWdodDogNHB4O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgIG92ZXJmbG93OiBhdXRvO1xuICAgIH1cblxuICAgICMiKwpjKyIgLmdvb2ctdGFiLWJhci0iK2EubG9jYXRpb24rIiAuZ29vZy10YWItc2VsZWN0ZWQge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICIrYS5ib3JkZXJDb2xvcisiO1xuICAgICAgYm9yZGVyLSIrYisiOiAwcHg7XG4gICAgfVxuXG4gICAgIyIrYysiIC5nb29nLXRhYi1iYXItIithLmxvY2F0aW9uKyIge1xuICAgICAgcGFkZGluZy0iK2EubG9jYXRpb24rIjogNXB4ICFpbXBvcnRhbnQ7XG4gICAgICBib3JkZXItIitiKyI6IDFweCBzb2xpZCAiK2EuYm9yZGVyQ29sb3IrIiAhaW1wb3J0YW50O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICB9XG5cbiAgICAjIitjKyIgLmdvb2ctdGFiLWJhciB7XG4gICAgICAgbWFyZ2luOiAwO1xuICAgICAgIGJvcmRlcjogMDtcbiAgICAgICBwYWRkaW5nOiAwO1xuICAgICAgIGxpc3Qtc3R5bGU6IG5vbmU7XG4gICAgICAgY3Vyc29yOiBkZWZhdWx0O1xuICAgICAgIG91dGxpbmU6IG5vbmU7XG4gICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgICBtYXJnaW4tcmlnaHQ6IDRweDtcbiAgICAgIH1cblxuICAgICAjIisKYysiIC5nb29nLXRhYiB7XG4gICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgIHBhZGRpbmc6IDRweCA4cHg7XG4gICAgICAgY29sb3I6IHZhcigtLWNvbGFiLXByaW1hcnktdGV4dC1jb2xvcik7XG4gICAgICAgdGV4dC1kZWNvcmF0aW9uOiBpbml0aWFsO1xuICAgICAgIGN1cnNvcjogZGVmYXVsdDtcbiAgICAgIH1cblxuICAgICAgIyIrYysiIC5nb29nLXRhYi1ob3ZlciB7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWNvbGFiLWhpZ2hsaWdodGVkLXN1cmZhY2UtY29sb3IpO1xuICAgICAgfVxuICAgICAgIjtyZXR1cm4gZH0KdmFyIGtkPWZ1bmN0aW9uKGEpe3ZhciBiPWEuZWxlbWVudElkLGM9YS50YWJOYW1lcyxkPWEuc2VsZWN0ZWRJbmRleDsiY29udGVudEJvcmRlciJpbiBhfHwoYS5jb250ZW50Qm9yZGVyPSIwcHgiKTsiY29udGVudEhlaWdodCJpbiBhfHwoYS5jb250ZW50SGVpZ2h0PSJpbml0aWFsIik7ImJvcmRlckNvbG9yImluIGF8fChhLmJvcmRlckNvbG9yPSJ2YXIoLS1jb2xhYi1ib3JkZXItY29sb3IpIik7YS5sb2NhdGlvbnx8KGEubG9jYXRpb249InRvcCIpO3ZhciBlPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiMiK2IpLGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zi5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYi1iYXIiKTt2YXIgaD1hLmxvY2F0aW9uO2YuY2xhc3NMaXN0LmFkZCgiZ29vZy10YWItYmFyLSIraCk7Zm9yKHZhciBrPVtdLHE9ZmEoYyksRz1xLm5leHQoKTshRy5kb25lO0c9cS5uZXh0KCkpe0c9Ry52YWx1ZTt2YXIgeD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKeC5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYiIpO3gudGV4dENvbnRlbnQ9RztmLmFwcGVuZENoaWxkKHgpO2sucHVzaCh4KX1oIT0iYm90dG9tIiYmZS5hcHBlbmRDaGlsZChmKTtxPW51bGw7aWYoaD09InRvcCJ8fGg9PSJib3R0b20iKXE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikscS5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYi1iYXItY2xlYXIiKTtoPT0idG9wIiYmcSYmZS5hcHBlbmRDaGlsZChxKTtHPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO0cuY2xhc3NMaXN0LmFkZCgiZ29vZy10YWItY29udGVudCIpO3ZhciBoYT1bXTtjPWZhKGMpO2Zvcih4PWMubmV4dCgpOyF4LmRvbmU7eD1jLm5leHQoKSl4PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHguaWQ9ZS5pZCsiX2NvbnRlbnRfIitoYS5sZW5ndGgseC5zdHlsZS5kaXNwbGF5PSJub25lIixHLmFwcGVuZENoaWxkKHgpLGhhLnB1c2goeCk7ZS5hcHBlbmRDaGlsZChHKTtoPT0iYm90dG9tIiYmKHEmJgplLmFwcGVuZENoaWxkKHEpLGUuYXBwZW5kQ2hpbGQoZikpO3ZhciBRPW5ldyBYKGgpO1NiKFEsZik7dmFyIFI9LTE7d2IoUSwic2VsZWN0IixmdW5jdGlvbihTKXtTPWsuaW5kZXhPZihTLnRhcmdldC5pKCkpO1MhPVImJihSPj0wJiZSPGhhLmxlbmd0aCYmKGhhW1JdLnN0eWxlLmRpc3BsYXk9Im5vbmUiLFI9LTEpLFM+PTAmJlM8aGEubGVuZ3RoJiYoUj1TLGhhW1JdLnN0eWxlLmRpc3BsYXk9ImlubGluZSIsd2luZG93LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCJyZXNpemUiKSksZ29vZ2xlLmNvbGFiLm91dHB1dC5yZXNpemVJZnJhbWVUb0NvbnRlbnQoKSksUS5KKEkoUSxSKSkpfSk7US5KKEkoUSxkKSk7d2luZG93W2JdPXtzZXRTZWxlY3RlZFRhYkluZGV4OmZ1bmN0aW9uKFMpe1EuSihJKFEsUykpfX07ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChqZChhKSl9LGxkPVsiY29sYWJfbGliIiwiY3JlYXRlVGFiQmFyIl0sWT1sOwpsZFswXWluIFl8fHR5cGVvZiBZLmV4ZWNTY3JpcHQ9PSJ1bmRlZmluZWQifHxZLmV4ZWNTY3JpcHQoInZhciAiK2xkWzBdKTtmb3IodmFyIFo7bGQubGVuZ3RoJiYoWj1sZC5zaGlmdCgpKTspbGQubGVuZ3RofHxrZD09PXZvaWQgMD9ZW1pdJiZZW1pdIT09T2JqZWN0LnByb3RvdHlwZVtaXT9ZPVlbWl06WT1ZW1pdPXt9OllbWl09a2Q7fSkuY2FsbCh0aGlzKTsKLy8gY2xhbmctZm9ybWF0IG9uCg==", + "ok": true, + "headers": [ + [ + "content-length", + "41785" + ], + [ + "content-type", + "application/javascript" + ] + ], + "status": 200, + "status_text": "" + } + }, + "base_uri": "https://localhost:8080/", + "height": 229 + }, + "outputId": "f765950a-a1b4-448c-966d-886b940b3830" + }, + "source": [ + "%%logica Engineers\n", + "\n", + "Employee(name: \"Alice\", role: \"Product Manager\");\n", + "Employee(name: \"Bob\", role: \"Engineer\");\n", + "Employee(name: \"Caroline\", role: \"Engineer\");\n", + "Employee(name: \"David\", role: \"Data Scientist\");\n", + "Employee(name: \"Eve\", role: \"Data Scientist\");\n", + "\n", + "Engineers(..r) :- Employee(..r), r.role == \"Engineer\";" + ], + "execution_count": 13, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"edb0d640-d22c-11ef-a7c0-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id20\", \"tabNames\": [\"Engineers\", \"(Log)\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_9b459a0a9f" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"edb1548a-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id20\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_d0bf2c6801" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"edb2fac4-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_6d4140797d" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"edb34830-d22c-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id20_content_1\");\n", + "//# sourceURL=js_bc9ccc3326" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"edb38d7c-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"edb34830-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_5dacdc497f" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"edb461a2-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id20\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_1e1670a959" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"edb81234-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"edb2fac4-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_71af6bc9c7" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"edba3438-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_89742f45ab" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"edba8582-d22c-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id20_content_0\");\n", + "//# sourceURL=js_f92f9c5eb9" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"edbb21e0-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"edba8582-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_045236b15a" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"edbb7316-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id20\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_8bb84dde1e" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"edbd136a-d22c-11ef-a7c0-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id21\", \"tabNames\": [\"SQL\", \"Result\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_a7ebb76aba" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"edbd74e0-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id21\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_7ba58c4727" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"edbeb4c2-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_b7621a7f73" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"edbeff4a-d22c-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id21_content_0\");\n", + "//# sourceURL=js_8b7ba6526e" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"edc00da4-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"edbeff4a-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_f461252b16" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"edc05e8a-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id21\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_eb1b913a82" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The following query is stored at \u001b[1mEngineers_sql\u001b[0m variable.\n", + "-- Initializing DuckDB environment.\n", + "create schema if not exists logica_home;\n", + "-- Empty record, has to have a field by DuckDB syntax.\n", + "drop type if exists logicarecord893574736 cascade; create type logicarecord893574736 as struct(nirvana numeric);\n", + "create sequence if not exists eternal_logical_sequence;\n", + "\n", + "\n", + "-- Logica type: logicarecord481217614\n", + "drop type if exists logicarecord481217614 cascade; create type logicarecord481217614 as struct(r logicarecord893574736);\n", + "\n", + "-- Logica type: logicarecord383307722\n", + "drop type if exists logicarecord383307722 cascade; create type logicarecord383307722 as struct(a timestamp);\n", + "\n", + "-- Logica type: logicarecord368262871\n", + "drop type if exists logicarecord368262871 cascade; create type logicarecord368262871 as struct(name text, role text);\n", + "WITH t_0_Employee AS (SELECT * FROM (\n", + " \n", + " SELECT\n", + " 'Alice' AS name,\n", + " 'Product Manager' AS role\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " 'Bob' AS name,\n", + " 'Engineer' AS role\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " 'Caroline' AS name,\n", + " 'Engineer' AS role\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " 'David' AS name,\n", + " 'Data Scientist' AS role\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " 'Eve' AS name,\n", + " 'Data Scientist' AS role\n", + " \n", + ") AS UNUSED_TABLE_NAME )\n", + "SELECT\n", + " Employee.*\n", + "FROM\n", + " t_0_Employee AS Employee\n", + "WHERE\n", + " (Employee.role = 'Engineer');\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"edc1e1d8-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"edbeb4c2-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_6ee14a007c" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"edc37e30-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_a03b7b2703" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"edc3cc32-d22c-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id21_content_1\");\n", + "//# sourceURL=js_7601418170" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"edc41660-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"edc3cc32-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_7ece0209ed" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"edc45b84-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id21\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_eb341c454c" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The following table is stored at \u001b[1mEngineers\u001b[0m variable.\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
namerole
0BobEngineer
1CarolineEngineer
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"edc5864e-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"edc37e30-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_c243a35184" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"edc76edc-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"edba3438-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_15b2978c95" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"edc91160-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_ffc63fc789" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"edc95cd8-d22c-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id20_content_1\");\n", + "//# sourceURL=js_5dee181858" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"edc9a486-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"edc95cd8-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_28fc52b7b6" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"edc9e842-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id20\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_9bad2caaa2" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "image/svg+xml": "\n\n\n\n\n\nConcertina\n\n\n\nEngineers\n\nEngineers\n\n\n\n", + "text/plain": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Running predicate: Engineers (11 ms)\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"ede6932a-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"edc91160-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_2fa916b666" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"ede8689e-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_67e3fce04d" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"ede8ba6a-d22c-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id20_content_0\");\n", + "//# sourceURL=js_b01764f31b" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"ede909fc-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"ede8ba6a-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_30469ca4ea" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"ede95394-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id20\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_9640a61c95" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"edeaa906-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_6b792a121d" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"edeb2052-d22c-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id21_content_1\");\n", + "//# sourceURL=js_038b72d86b" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"edeb73ea-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"edeb2052-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_ed0327806d" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"edebc516-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id21\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_5bfe1726c2" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"ededf57a-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"edeaa906-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_3ef5fe8af4" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + " \n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"edef7c92-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"ede8689e-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_59316d853b" + ] + }, + "metadata": {} + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "pna_1hZsaQZv" + }, + "source": [ + "### Conjunction (aka Join)\n", + "\n", + "To join a few tables simply list the tables in the body and connect columns via same name, or via using `==`.\n", + "\n", + "Note that logically the items listed via comma in the body of the rule can be thought of as conjuncts whether they are constraints, or joined tables." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "FLWcN-HZT91l", + "colab": { + "resources": { + "http://localhost:8080/nbextensions/google.colab/tabbar.css": { + "data": "Lmdvb2ctdGFie3Bvc2l0aW9uOnJlbGF0aXZlO3BhZGRpbmc6NHB4IDhweDtjb2xvcjojMDBjO3RleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7Y3Vyc29yOmRlZmF1bHR9Lmdvb2ctdGFiLWJhci10b3AgLmdvb2ctdGFie21hcmdpbjoxcHggNHB4IDAgMDtib3JkZXItYm90dG9tOjA7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLXRvcDphZnRlciwuZ29vZy10YWItYmFyLWJvdHRvbTphZnRlcntjb250ZW50OiIgIjtkaXNwbGF5OmJsb2NrO2hlaWdodDowO2NsZWFyOmJvdGg7dmlzaWJpbGl0eTpoaWRkZW59Lmdvb2ctdGFiLWJhci1ib3R0b20gLmdvb2ctdGFie21hcmdpbjowIDRweCAxcHggMDtib3JkZXItdG9wOjA7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLXN0YXJ0IC5nb29nLXRhYnttYXJnaW46MCAwIDRweCAxcHg7Ym9yZGVyLXJpZ2h0OjB9Lmdvb2ctdGFiLWJhci1lbmQgLmdvb2ctdGFie21hcmdpbjowIDFweCA0cHggMDtib3JkZXItbGVmdDowfS5nb29nLXRhYi1ob3ZlcntiYWNrZ3JvdW5kOiNlZWV9Lmdvb2ctdGFiLWRpc2FibGVke2NvbG9yOiM2NjZ9Lmdvb2ctdGFiLXNlbGVjdGVke2NvbG9yOiMwMDA7YmFja2dyb3VuZDojZmZmO3RleHQtZGVjb3JhdGlvbjpub25lO2ZvbnQtd2VpZ2h0OmJvbGQ7Ym9yZGVyOjFweCBzb2xpZCAjNmI5MGRhfS5nb29nLXRhYi1iYXItdG9we3BhZGRpbmctdG9wOjVweCFpbXBvcnRhbnQ7cGFkZGluZy1sZWZ0OjVweCFpbXBvcnRhbnQ7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgIzZiOTBkYSFpbXBvcnRhbnR9Lmdvb2ctdGFiLWJhci10b3AgLmdvb2ctdGFiLXNlbGVjdGVke3RvcDoxcHg7bWFyZ2luLXRvcDowO3BhZGRpbmctYm90dG9tOjVweH0uZ29vZy10YWItYmFyLWJvdHRvbSAuZ29vZy10YWItc2VsZWN0ZWR7dG9wOi0xcHg7bWFyZ2luLWJvdHRvbTowO3BhZGRpbmctdG9wOjVweH0uZ29vZy10YWItYmFyLXN0YXJ0IC5nb29nLXRhYi1zZWxlY3RlZHtsZWZ0OjFweDttYXJnaW4tbGVmdDowO3BhZGRpbmctcmlnaHQ6OXB4fS5nb29nLXRhYi1iYXItZW5kIC5nb29nLXRhYi1zZWxlY3RlZHtsZWZ0Oi0xcHg7bWFyZ2luLXJpZ2h0OjA7cGFkZGluZy1sZWZ0OjlweH0uZ29vZy10YWItYmFye21hcmdpbjowO2JvcmRlcjowO3BhZGRpbmc6MDtsaXN0LXN0eWxlOm5vbmU7Y3Vyc29yOmRlZmF1bHQ7b3V0bGluZTpub25lO2JhY2tncm91bmQ6I2ViZWZmOX0uZ29vZy10YWItYmFyLWNsZWFye2NsZWFyOmJvdGg7aGVpZ2h0OjA7b3ZlcmZsb3c6aGlkZGVufS5nb29nLXRhYi1iYXItc3RhcnR7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLWVuZHtmbG9hdDpyaWdodH0qIGh0bWwgLmdvb2ctdGFiLWJhci1zdGFydHttYXJnaW4tcmlnaHQ6LTNweH0qIGh0bWwgLmdvb2ctdGFiLWJhci1lbmR7bWFyZ2luLWxlZnQ6LTNweH1zZW50aW5lbHt9", + "ok": true, + "headers": [ + [ + "content-length", + "1404" + ], + [ + "content-type", + "text/css" + ] + ], + "status": 200, + "status_text": "" + }, + "http://localhost:8080/nbextensions/google.colab/tabbar_main.min.js": { + "data": "Ly8gY2xhbmctZm9ybWF0IG9mZgooZnVuY3Rpb24oKXt2YXIgZyxhYT1mdW5jdGlvbihhKXt2YXIgYj0wO3JldHVybiBmdW5jdGlvbigpe3JldHVybiBiPGEubGVuZ3RoP3tkb25lOiExLHZhbHVlOmFbYisrXX06e2RvbmU6ITB9fX0sYmE9dHlwZW9mIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzPT0iZnVuY3Rpb24iP09iamVjdC5kZWZpbmVQcm9wZXJ0eTpmdW5jdGlvbihhLGIsYyl7aWYoYT09QXJyYXkucHJvdG90eXBlfHxhPT1PYmplY3QucHJvdG90eXBlKXJldHVybiBhO2FbYl09Yy52YWx1ZTtyZXR1cm4gYX0sY2E9ZnVuY3Rpb24oYSl7YT1bIm9iamVjdCI9PXR5cGVvZiBnbG9iYWxUaGlzJiZnbG9iYWxUaGlzLGEsIm9iamVjdCI9PXR5cGVvZiB3aW5kb3cmJndpbmRvdywib2JqZWN0Ij09dHlwZW9mIHNlbGYmJnNlbGYsIm9iamVjdCI9PXR5cGVvZiBnbG9iYWwmJmdsb2JhbF07Zm9yKHZhciBiPTA7YjxhLmxlbmd0aDsrK2Ipe3ZhciBjPWFbYl07aWYoYyYmYy5NYXRoPT1NYXRoKXJldHVybiBjfXRocm93IEVycm9yKCJDYW5ub3QgZmluZCBnbG9iYWwgb2JqZWN0Iik7Cn0sZGE9Y2EodGhpcyksZWE9ZnVuY3Rpb24oYSxiKXtpZihiKWE6e3ZhciBjPWRhO2E9YS5zcGxpdCgiLiIpO2Zvcih2YXIgZD0wO2Q8YS5sZW5ndGgtMTtkKyspe3ZhciBlPWFbZF07aWYoIShlIGluIGMpKWJyZWFrIGE7Yz1jW2VdfWE9YVthLmxlbmd0aC0xXTtkPWNbYV07Yj1iKGQpO2IhPWQmJmIhPW51bGwmJmJhKGMsYSx7Y29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOmJ9KX19OwplYSgiU3ltYm9sIixmdW5jdGlvbihhKXtpZihhKXJldHVybiBhO3ZhciBiPWZ1bmN0aW9uKGYsaCl7dGhpcy5nPWY7YmEodGhpcywiZGVzY3JpcHRpb24iLHtjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6aH0pfTtiLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmd9O3ZhciBjPSJqc2NvbXBfc3ltYm9sXyIrKE1hdGgucmFuZG9tKCkqMUU5Pj4+MCkrIl8iLGQ9MCxlPWZ1bmN0aW9uKGYpe2lmKHRoaXMgaW5zdGFuY2VvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoIlN5bWJvbCBpcyBub3QgYSBjb25zdHJ1Y3RvciIpO3JldHVybiBuZXcgYihjKyhmfHwiIikrIl8iK2QrKyxmKX07cmV0dXJuIGV9KTsKdmFyIGZhPWZ1bmN0aW9uKGEpe3ZhciBiPXR5cGVvZiBTeW1ib2whPSJ1bmRlZmluZWQiJiZTeW1ib2wuaXRlcmF0b3ImJmFbU3ltYm9sLml0ZXJhdG9yXTtpZihiKXJldHVybiBiLmNhbGwoYSk7aWYodHlwZW9mIGEubGVuZ3RoPT0ibnVtYmVyIilyZXR1cm57bmV4dDphYShhKX07dGhyb3cgRXJyb3IoU3RyaW5nKGEpKyIgaXMgbm90IGFuIGl0ZXJhYmxlIG9yIEFycmF5TGlrZSIpO307ZWEoIlN5bWJvbC5kaXNwb3NlIixmdW5jdGlvbihhKXtyZXR1cm4gYT9hOlN5bWJvbCgiU3ltYm9sLmRpc3Bvc2UiKX0pOy8qCgogQ29weXJpZ2h0IFRoZSBDbG9zdXJlIExpYnJhcnkgQXV0aG9ycy4KIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wCiovCnZhciBsPXRoaXN8fHNlbGYsaWE9ZnVuY3Rpb24oYSl7YS5JYT12b2lkIDA7YS5WPWZ1bmN0aW9uKCl7cmV0dXJuIGEuSWE/YS5JYTphLklhPW5ldyBhfX0samE9ZnVuY3Rpb24oYSl7dmFyIGI9dHlwZW9mIGE7cmV0dXJuIGIhPSJvYmplY3QiP2I6YT9BcnJheS5pc0FycmF5KGEpPyJhcnJheSI6YjoibnVsbCJ9LGthPWZ1bmN0aW9uKGEpe3ZhciBiPWphKGEpO3JldHVybiBiPT0iYXJyYXkifHxiPT0ib2JqZWN0IiYmdHlwZW9mIGEubGVuZ3RoPT0ibnVtYmVyIn0sbT1mdW5jdGlvbihhKXt2YXIgYj10eXBlb2YgYTtyZXR1cm4gYj09Im9iamVjdCImJmEhPW51bGx8fGI9PSJmdW5jdGlvbiJ9LG5hPWZ1bmN0aW9uKGEpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYSxsYSkmJmFbbGFdfHwoYVtsYV09KyttYSl9LGxhPSJjbG9zdXJlX3VpZF8iKyhNYXRoLnJhbmRvbSgpKjFFOT4+PjApLG1hPTAsbj1mdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoKXt9Yy5wcm90b3R5cGU9CmIucHJvdG90eXBlO2EubD1iLnByb3RvdHlwZTthLnByb3RvdHlwZT1uZXcgYzthLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1hO2EucWQ9ZnVuY3Rpb24oZCxlLGYpe2Zvcih2YXIgaD1BcnJheShhcmd1bWVudHMubGVuZ3RoLTIpLGs9MjtrPGFyZ3VtZW50cy5sZW5ndGg7aysrKWhbay0yXT1hcmd1bWVudHNba107cmV0dXJuIGIucHJvdG90eXBlW2VdLmFwcGx5KGQsaCl9fTtmdW5jdGlvbiBvYShhLGIpe2lmKEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKUVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsb2EpO2Vsc2V7dmFyIGM9RXJyb3IoKS5zdGFjaztjJiYodGhpcy5zdGFjaz1jKX1hJiYodGhpcy5tZXNzYWdlPVN0cmluZyhhKSk7YiE9PXZvaWQgMCYmKHRoaXMuY2F1c2U9Yil9bihvYSxFcnJvcik7b2EucHJvdG90eXBlLm5hbWU9IkN1c3RvbUVycm9yIjt2YXIgcGE7ZnVuY3Rpb24gcWEoYSxiKXthPWEuc3BsaXQoIiVzIik7Zm9yKHZhciBjPSIiLGQ9YS5sZW5ndGgtMSxlPTA7ZTxkO2UrKyljKz1hW2VdKyhlPGIubGVuZ3RoP2JbZV06IiVzIik7b2EuY2FsbCh0aGlzLGMrYVtkXSl9bihxYSxvYSk7cWEucHJvdG90eXBlLm5hbWU9IkFzc2VydGlvbkVycm9yIjtmdW5jdGlvbiByYShhLGIsYyxkKXt2YXIgZT0iQXNzZXJ0aW9uIGZhaWxlZCI7aWYoYyl7ZSs9IjogIitjO3ZhciBmPWR9ZWxzZSBhJiYoZSs9IjogIithLGY9Yik7dGhyb3cgbmV3IHFhKCIiK2UsZnx8W10pO30KdmFyIHA9ZnVuY3Rpb24oYSxiLGMpe2F8fHJhKCIiLG51bGwsYixBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMikpO3JldHVybiBhfSxzYT1mdW5jdGlvbihhLGIsYyl7bShhKSYmYS5ub2RlVHlwZT09MXx8cmEoIkV4cGVjdGVkIEVsZW1lbnQgYnV0IGdvdCAlczogJXMuIixbamEoYSksYV0sYixBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMikpfSx1YT1mdW5jdGlvbihhLGIsYyxkKXthIGluc3RhbmNlb2YgYnx8cmEoIkV4cGVjdGVkIGluc3RhbmNlb2YgJXMgYnV0IGdvdCAlcy4iLFt0YShiKSx0YShhKV0sYyxBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMykpfTsKZnVuY3Rpb24gdGEoYSl7cmV0dXJuIGEgaW5zdGFuY2VvZiBGdW5jdGlvbj9hLmRpc3BsYXlOYW1lfHxhLm5hbWV8fCJ1bmtub3duIHR5cGUgbmFtZSI6YSBpbnN0YW5jZW9mIE9iamVjdD9hLmNvbnN0cnVjdG9yLmRpc3BsYXlOYW1lfHxhLmNvbnN0cnVjdG9yLm5hbWV8fE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhKTphPT09bnVsbD8ibnVsbCI6dHlwZW9mIGF9O3ZhciB2YT1BcnJheS5wcm90b3R5cGUuaW5kZXhPZj9mdW5jdGlvbihhLGIpe3AoYS5sZW5ndGghPW51bGwpO3JldHVybiBBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKGEsYix2b2lkIDApfTpmdW5jdGlvbihhLGIpe2lmKHR5cGVvZiBhPT09InN0cmluZyIpcmV0dXJuIHR5cGVvZiBiIT09InN0cmluZyJ8fGIubGVuZ3RoIT0xPy0xOmEuaW5kZXhPZihiLDApO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWlmKGMgaW4gYSYmYVtjXT09PWIpcmV0dXJuIGM7cmV0dXJuLTF9LHdhPUFycmF5LnByb3RvdHlwZS5mb3JFYWNoP2Z1bmN0aW9uKGEsYil7cChhLmxlbmd0aCE9bnVsbCk7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChhLGIsdm9pZCAwKX06ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9YS5sZW5ndGgsZD10eXBlb2YgYT09PSJzdHJpbmciP2Euc3BsaXQoIiIpOmEsZT0wO2U8YztlKyspZSBpbiBkJiZiLmNhbGwodm9pZCAwLGRbZV0sZSxhKX07CmZ1bmN0aW9uIHhhKGEsYil7Yj12YShhLGIpO3ZhciBjO2lmKGM9Yj49MClwKGEubGVuZ3RoIT1udWxsKSxBcnJheS5wcm90b3R5cGUuc3BsaWNlLmNhbGwoYSxiLDEpO3JldHVybiBjfWZ1bmN0aW9uIHlhKGEpe3ZhciBiPWEubGVuZ3RoO2lmKGI+MCl7Zm9yKHZhciBjPUFycmF5KGIpLGQ9MDtkPGI7ZCsrKWNbZF09YVtkXTtyZXR1cm4gY31yZXR1cm5bXX1mdW5jdGlvbiB6YShhLGIsYyxkKXtwKGEubGVuZ3RoIT1udWxsKTtBcnJheS5wcm90b3R5cGUuc3BsaWNlLmFwcGx5KGEsQWEoYXJndW1lbnRzLDEpKX1mdW5jdGlvbiBBYShhLGIsYyl7cChhLmxlbmd0aCE9bnVsbCk7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg8PTI/QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYSxiKTpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhLGIsYyl9O2Z1bmN0aW9uIEJhKGEsYixjKXtmb3IodmFyIGQgaW4gYSliLmNhbGwoYyxhW2RdLGQsYSl9ZnVuY3Rpb24gQ2EoYSxiKXtmb3IodmFyIGMgaW4gYSlpZihhW2NdPT1iKXJldHVybiEwO3JldHVybiExfWZ1bmN0aW9uIERhKGEsYixjKXtpZihhIT09bnVsbCYmYiBpbiBhKXRocm93IEVycm9yKCdUaGUgb2JqZWN0IGFscmVhZHkgY29udGFpbnMgdGhlIGtleSAiJytiKyciJyk7YVtiXT1jfWZ1bmN0aW9uIEVhKGEpe3ZhciBiPXt9LGM7Zm9yKGMgaW4gYSliW2FbY11dPWM7cmV0dXJuIGJ9dmFyIEZhPSJjb25zdHJ1Y3RvciBoYXNPd25Qcm9wZXJ0eSBpc1Byb3RvdHlwZU9mIHByb3BlcnR5SXNFbnVtZXJhYmxlIHRvTG9jYWxlU3RyaW5nIHRvU3RyaW5nIHZhbHVlT2YiLnNwbGl0KCIgIik7CmZ1bmN0aW9uIEdhKGEsYil7Zm9yKHZhciBjLGQsZT0xO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspe2Q9YXJndW1lbnRzW2VdO2ZvcihjIGluIGQpYVtjXT1kW2NdO2Zvcih2YXIgZj0wO2Y8RmEubGVuZ3RoO2YrKyljPUZhW2ZdLE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChkLGMpJiYoYVtjXT1kW2NdKX19O3ZhciBIYT1TdHJpbmcucHJvdG90eXBlLnRyaW0/ZnVuY3Rpb24oYSl7cmV0dXJuIGEudHJpbSgpfTpmdW5jdGlvbihhKXtyZXR1cm4vXltcc1x4YTBdKihbXHNcU10qPylbXHNceGEwXSokLy5leGVjKGEpWzFdfTsvKgoKIENvcHlyaWdodCBHb29nbGUgTExDCiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMAoqLwp2YXIgSWE9e307dmFyIEphPWZ1bmN0aW9uKGEpe2lmKElhIT09SWEpdGhyb3cgRXJyb3IoIkJhZCBzZWNyZXQiKTt0aGlzLmc9YX07SmEucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ307bmV3IEphKCJhYm91dDpibGFuayIpO25ldyBKYSgiYWJvdXQ6aW52YWxpZCN6Q2xvc3VyZXoiKTt2YXIgS2E9W10sTGE9ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJBIFVSTCB3aXRoIGNvbnRlbnQgJyIrYSsiJyB3YXMgc2FuaXRpemVkIGF3YXkuIil9O0thLmluZGV4T2YoTGEpPT09LTEmJkthLnB1c2goTGEpO3ZhciBNYSxOYTthOntmb3IodmFyIE9hPVsiQ0xPU1VSRV9GTEFHUyJdLFBhPWwsUWE9MDtRYTxPYS5sZW5ndGg7UWErKylpZihQYT1QYVtPYVtRYV1dLFBhPT1udWxsKXtOYT1udWxsO2JyZWFrIGF9TmE9UGF9dmFyIFJhPU5hJiZOYVs2MTA0MDEzMDFdO01hPVJhIT1udWxsP1JhOiExO2Z1bmN0aW9uIFNhKCl7dmFyIGE9bC5uYXZpZ2F0b3I7cmV0dXJuIGEmJihhPWEudXNlckFnZW50KT9hOiIifXZhciBUYSxVYT1sLm5hdmlnYXRvcjtUYT1VYT9VYS51c2VyQWdlbnREYXRhfHxudWxsOm51bGw7ZnVuY3Rpb24gcihhKXtyZXR1cm4gU2EoKS5pbmRleE9mKGEpIT0tMX07dmFyIFZhPXIoIkVkZ2UiKSx0PXIoIkdlY2tvIikmJiEoU2EoKS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoIndlYmtpdCIpIT0tMSYmIXIoIkVkZ2UiKSkmJiEocigiVHJpZGVudCIpfHxyKCJNU0lFIikpJiYhcigiRWRnZSIpLHU9U2EoKS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoIndlYmtpdCIpIT0tMSYmIXIoIkVkZ2UiKSx2PU1hJiZUYSYmVGEucGxhdGZvcm0/VGEucGxhdGZvcm09PT0ibWFjT1MiOnIoIk1hY2ludG9zaCIpO3ZhciBYYT1mdW5jdGlvbihhLGIpe0JhKGIsZnVuY3Rpb24oYyxkKXtkPT0ic3R5bGUiP2Euc3R5bGUuY3NzVGV4dD1jOmQ9PSJjbGFzcyI/YS5jbGFzc05hbWU9YzpkPT0iZm9yIj9hLmh0bWxGb3I9YzpXYS5oYXNPd25Qcm9wZXJ0eShkKT9hLnNldEF0dHJpYnV0ZShXYVtkXSxjKTpkLmxhc3RJbmRleE9mKCJhcmlhLSIsMCk9PTB8fGQubGFzdEluZGV4T2YoImRhdGEtIiwwKT09MD9hLnNldEF0dHJpYnV0ZShkLGMpOmFbZF09Y30pfSxXYT17Y2VsbHBhZGRpbmc6ImNlbGxQYWRkaW5nIixjZWxsc3BhY2luZzoiY2VsbFNwYWNpbmciLGNvbHNwYW46ImNvbFNwYW4iLGZyYW1lYm9yZGVyOiJmcmFtZUJvcmRlciIsaGVpZ2h0OiJoZWlnaHQiLG1heGxlbmd0aDoibWF4TGVuZ3RoIixub25jZToibm9uY2UiLHJvbGU6InJvbGUiLHJvd3NwYW46InJvd1NwYW4iLHR5cGU6InR5cGUiLHVzZW1hcDoidXNlTWFwIix2YWxpZ246InZBbGlnbiIsd2lkdGg6IndpZHRoIn0sWWE9ZnVuY3Rpb24oYSwKYixjKXtmdW5jdGlvbiBkKGspe2smJmIuYXBwZW5kQ2hpbGQodHlwZW9mIGs9PT0ic3RyaW5nIj9hLmNyZWF0ZVRleHROb2RlKGspOmspfWZvcih2YXIgZT0yO2U8Yy5sZW5ndGg7ZSsrKXt2YXIgZj1jW2VdO2lmKCFrYShmKXx8bShmKSYmZi5ub2RlVHlwZT4wKWQoZik7ZWxzZXthOntpZihmJiZ0eXBlb2YgZi5sZW5ndGg9PSJudW1iZXIiKXtpZihtKGYpKXt2YXIgaD10eXBlb2YgZi5pdGVtPT0iZnVuY3Rpb24ifHx0eXBlb2YgZi5pdGVtPT0ic3RyaW5nIjticmVhayBhfWlmKHR5cGVvZiBmPT09ImZ1bmN0aW9uIil7aD10eXBlb2YgZi5pdGVtPT0iZnVuY3Rpb24iO2JyZWFrIGF9fWg9ITF9d2EoaD95YShmKTpmLGQpfX19LFphPWZ1bmN0aW9uKGEsYil7Yj1TdHJpbmcoYik7YS5jb250ZW50VHlwZT09PSJhcHBsaWNhdGlvbi94aHRtbCt4bWwiJiYoYj1iLnRvTG93ZXJDYXNlKCkpO3JldHVybiBhLmNyZWF0ZUVsZW1lbnQoYil9LCRhPWZ1bmN0aW9uKGEpe2EmJmEucGFyZW50Tm9kZSYmCmEucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhKX0sYWI9ZnVuY3Rpb24oYSxiKXtpZighYXx8IWIpcmV0dXJuITE7aWYoYS5jb250YWlucyYmYi5ub2RlVHlwZT09MSlyZXR1cm4gYT09Ynx8YS5jb250YWlucyhiKTtpZih0eXBlb2YgYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiE9InVuZGVmaW5lZCIpcmV0dXJuIGE9PWJ8fCEhKGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24oYikmMTYpO2Zvcig7YiYmYSE9YjspYj1iLnBhcmVudE5vZGU7cmV0dXJuIGI9PWF9LGJiPWZ1bmN0aW9uKGEpe3AoYSwiTm9kZSBjYW5ub3QgYmUgbnVsbCBvciB1bmRlZmluZWQuIik7cmV0dXJuIGEubm9kZVR5cGU9PTk/YTphLm93bmVyRG9jdW1lbnR8fGEuZG9jdW1lbnR9LGNiPWZ1bmN0aW9uKGEsYil7Yj9hLnRhYkluZGV4PTA6KGEudGFiSW5kZXg9LTEsYS5yZW1vdmVBdHRyaWJ1dGUoInRhYkluZGV4IikpfSxkYj1mdW5jdGlvbihhKXtyZXR1cm4gYS5oYXNBdHRyaWJ1dGUoInRhYmluZGV4Iil9LGViPQpmdW5jdGlvbihhKXthPWEudGFiSW5kZXg7cmV0dXJuIHR5cGVvZiBhPT09Im51bWJlciImJmE+PTAmJmE8MzI3Njh9LGZiPWZ1bmN0aW9uKGEpe3RoaXMuZz1hfHxsLmRvY3VtZW50fHxkb2N1bWVudH07ZmIucHJvdG90eXBlLmk9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nO3JldHVybiB0eXBlb2YgYT09PSJzdHJpbmciP2IuZ2V0RWxlbWVudEJ5SWQoYSk6YX07ZmIucHJvdG90eXBlLmg9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXMuZyxlPWFyZ3VtZW50cyxmPWVbMV0saD1aYShkLFN0cmluZyhlWzBdKSk7ZiYmKHR5cGVvZiBmPT09InN0cmluZyI/aC5jbGFzc05hbWU9ZjpBcnJheS5pc0FycmF5KGYpP2guY2xhc3NOYW1lPWYuam9pbigiICIpOlhhKGgsZikpO2UubGVuZ3RoPjImJllhKGQsaCxlKTtyZXR1cm4gaH07dmFyIHc9ZnVuY3Rpb24oKXt0aGlzLmJhPXRoaXMuYmE7dGhpcy5rYT10aGlzLmthfTt3LnByb3RvdHlwZS5iYT0hMTt3LnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7dGhpcy5iYXx8KHRoaXMuYmE9ITAsdGhpcy5DKCkpfTt3LnByb3RvdHlwZVtTeW1ib2wuZGlzcG9zZV09ZnVuY3Rpb24oKXt0aGlzLmRpc3Bvc2UoKX07dy5wcm90b3R5cGUuQz1mdW5jdGlvbigpe2lmKHRoaXMua2EpZm9yKDt0aGlzLmthLmxlbmd0aDspdGhpcy5rYS5zaGlmdCgpKCl9O3ZhciB5PWZ1bmN0aW9uKGEsYil7dGhpcy50eXBlPWE7dGhpcy51PXRoaXMudGFyZ2V0PWI7dGhpcy5kZWZhdWx0UHJldmVudGVkPXRoaXMuQT0hMX07eS5wcm90b3R5cGUudj1mdW5jdGlvbigpe3RoaXMuQT0hMH07eS5wcm90b3R5cGUuaj1mdW5jdGlvbigpe3RoaXMuZGVmYXVsdFByZXZlbnRlZD0hMH07dmFyIGdiPWZ1bmN0aW9uKCl7aWYoIWwuYWRkRXZlbnRMaXN0ZW5lcnx8IU9iamVjdC5kZWZpbmVQcm9wZXJ0eSlyZXR1cm4hMTt2YXIgYT0hMSxiPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwicGFzc2l2ZSIse2dldDpmdW5jdGlvbigpe2E9ITB9fSk7dHJ5e3ZhciBjPWZ1bmN0aW9uKCl7fTtsLmFkZEV2ZW50TGlzdGVuZXIoInRlc3QiLGMsYik7bC5yZW1vdmVFdmVudExpc3RlbmVyKCJ0ZXN0IixjLGIpfWNhdGNoKGQpe31yZXR1cm4gYX0oKTt2YXIgej1mdW5jdGlvbihhLGIpe3kuY2FsbCh0aGlzLGE/YS50eXBlOiIiKTt0aGlzLnJlbGF0ZWRUYXJnZXQ9dGhpcy51PXRoaXMudGFyZ2V0PW51bGw7dGhpcy5idXR0b249dGhpcy5zY3JlZW5ZPXRoaXMuc2NyZWVuWD10aGlzLmNsaWVudFk9dGhpcy5jbGllbnRYPTA7dGhpcy5rZXk9IiI7dGhpcy5nPTA7dGhpcy5tZXRhS2V5PXRoaXMuc2hpZnRLZXk9dGhpcy5hbHRLZXk9dGhpcy5jdHJsS2V5PSExO3RoaXMuc3RhdGU9bnVsbDt0aGlzLkc9ITE7dGhpcy5wb2ludGVySWQ9MDt0aGlzLnBvaW50ZXJUeXBlPSIiO3RoaXMudGltZVN0YW1wPTA7dGhpcy5oPW51bGw7aWYoYSl7dmFyIGM9dGhpcy50eXBlPWEudHlwZSxkPWEuY2hhbmdlZFRvdWNoZXMmJmEuY2hhbmdlZFRvdWNoZXMubGVuZ3RoP2EuY2hhbmdlZFRvdWNoZXNbMF06bnVsbDt0aGlzLnRhcmdldD1hLnRhcmdldHx8YS5zcmNFbGVtZW50O3RoaXMudT1iO2I9YS5yZWxhdGVkVGFyZ2V0O2J8fChjPT0ibW91c2VvdmVyIj8KYj1hLmZyb21FbGVtZW50OmM9PSJtb3VzZW91dCImJihiPWEudG9FbGVtZW50KSk7dGhpcy5yZWxhdGVkVGFyZ2V0PWI7ZD8odGhpcy5jbGllbnRYPWQuY2xpZW50WCE9PXZvaWQgMD9kLmNsaWVudFg6ZC5wYWdlWCx0aGlzLmNsaWVudFk9ZC5jbGllbnRZIT09dm9pZCAwP2QuY2xpZW50WTpkLnBhZ2VZLHRoaXMuc2NyZWVuWD1kLnNjcmVlblh8fDAsdGhpcy5zY3JlZW5ZPWQuc2NyZWVuWXx8MCk6KHRoaXMuY2xpZW50WD1hLmNsaWVudFghPT12b2lkIDA/YS5jbGllbnRYOmEucGFnZVgsdGhpcy5jbGllbnRZPWEuY2xpZW50WSE9PXZvaWQgMD9hLmNsaWVudFk6YS5wYWdlWSx0aGlzLnNjcmVlblg9YS5zY3JlZW5YfHwwLHRoaXMuc2NyZWVuWT1hLnNjcmVlbll8fDApO3RoaXMuYnV0dG9uPWEuYnV0dG9uO3RoaXMuZz1hLmtleUNvZGV8fDA7dGhpcy5rZXk9YS5rZXl8fCIiO3RoaXMuY3RybEtleT1hLmN0cmxLZXk7dGhpcy5hbHRLZXk9YS5hbHRLZXk7dGhpcy5zaGlmdEtleT1hLnNoaWZ0S2V5Owp0aGlzLm1ldGFLZXk9YS5tZXRhS2V5O3RoaXMuRz12P2EubWV0YUtleTphLmN0cmxLZXk7dGhpcy5wb2ludGVySWQ9YS5wb2ludGVySWR8fDA7dGhpcy5wb2ludGVyVHlwZT1hLnBvaW50ZXJUeXBlO3RoaXMuc3RhdGU9YS5zdGF0ZTt0aGlzLnRpbWVTdGFtcD1hLnRpbWVTdGFtcDt0aGlzLmg9YTthLmRlZmF1bHRQcmV2ZW50ZWQmJnoubC5qLmNhbGwodGhpcyl9fTtuKHoseSk7ei5wcm90b3R5cGUudj1mdW5jdGlvbigpe3oubC52LmNhbGwodGhpcyk7dGhpcy5oLnN0b3BQcm9wYWdhdGlvbj90aGlzLmguc3RvcFByb3BhZ2F0aW9uKCk6dGhpcy5oLmNhbmNlbEJ1YmJsZT0hMH07ei5wcm90b3R5cGUuaj1mdW5jdGlvbigpe3oubC5qLmNhbGwodGhpcyk7dmFyIGE9dGhpcy5oO2EucHJldmVudERlZmF1bHQ/YS5wcmV2ZW50RGVmYXVsdCgpOmEucmV0dXJuVmFsdWU9ITF9O3ZhciBoYj0iY2xvc3VyZV9saXN0ZW5hYmxlXyIrKE1hdGgucmFuZG9tKCkqMUU2fDApLGliPWZ1bmN0aW9uKGEpe3JldHVybiEoIWF8fCFhW2hiXSl9O3ZhciBqYj0wO3ZhciBrYj1mdW5jdGlvbihhLGIsYyxkLGUpe3RoaXMubGlzdGVuZXI9YTt0aGlzLnByb3h5PW51bGw7dGhpcy5zcmM9Yjt0aGlzLnR5cGU9Yzt0aGlzLmNhcHR1cmU9ISFkO3RoaXMucGE9ZTt0aGlzLmtleT0rK2piO3RoaXMuamE9dGhpcy5vYT0hMX0sbGI9ZnVuY3Rpb24oYSl7YS5qYT0hMDthLmxpc3RlbmVyPW51bGw7YS5wcm94eT1udWxsO2Euc3JjPW51bGw7YS5wYT1udWxsfTt2YXIgbWI9ZnVuY3Rpb24oYSl7dGhpcy5zcmM9YTt0aGlzLmc9e307dGhpcy5oPTB9O21iLnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZj1hLnRvU3RyaW5nKCk7YT10aGlzLmdbZl07YXx8KGE9dGhpcy5nW2ZdPVtdLHRoaXMuaCsrKTt2YXIgaD1uYihhLGIsZCxlKTtoPi0xPyhiPWFbaF0sY3x8KGIub2E9ITEpKTooYj1uZXcga2IoYix0aGlzLnNyYyxmLCEhZCxlKSxiLm9hPWMsYS5wdXNoKGIpKTtyZXR1cm4gYn07CnZhciBvYj1mdW5jdGlvbihhLGIpe3ZhciBjPWIudHlwZTtjIGluIGEuZyYmeGEoYS5nW2NdLGIpJiYobGIoYiksYS5nW2NdLmxlbmd0aD09MCYmKGRlbGV0ZSBhLmdbY10sYS5oLS0pKX0scGI9ZnVuY3Rpb24oYSxiLGMsZCxlKXthPWEuZ1tiLnRvU3RyaW5nKCldO2I9LTE7YSYmKGI9bmIoYSxjLGQsZSkpO3JldHVybiBiPi0xP2FbYl06bnVsbH0sbmI9ZnVuY3Rpb24oYSxiLGMsZCl7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDsrK2Upe3ZhciBmPWFbZV07aWYoIWYuamEmJmYubGlzdGVuZXI9PWImJmYuY2FwdHVyZT09ISFjJiZmLnBhPT1kKXJldHVybiBlfXJldHVybi0xfTt2YXIgcWI9ImNsb3N1cmVfbG1fIisoTWF0aC5yYW5kb20oKSoxRTZ8MCkscmI9e30sc2I9MCx1Yj1mdW5jdGlvbihhLGIsYyxkLGUpe2lmKGQmJmQub25jZSlyZXR1cm4gdGIoYSxiLGMsZCxlKTtpZihBcnJheS5pc0FycmF5KGIpKXtmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKyl1YihhLGJbZl0sYyxkLGUpO3JldHVybiBudWxsfWM9dmIoYyk7cmV0dXJuIGliKGEpP3diKGEsYixjLG0oZCk/ISFkLmNhcHR1cmU6ISFkLGUpOnhiKGEsYixjLCExLGQsZSl9LHhiPWZ1bmN0aW9uKGEsYixjLGQsZSxmKXtpZighYil0aHJvdyBFcnJvcigiSW52YWxpZCBldmVudCB0eXBlIik7dmFyIGg9bShlKT8hIWUuY2FwdHVyZTohIWUsaz15YihhKTtrfHwoYVtxYl09az1uZXcgbWIoYSkpO2M9ay5hZGQoYixjLGQsaCxmKTtpZihjLnByb3h5KXJldHVybiBjO2Q9emIoKTtjLnByb3h5PWQ7ZC5zcmM9YTtkLmxpc3RlbmVyPWM7aWYoYS5hZGRFdmVudExpc3RlbmVyKWdifHwoZT1oKSxlPT09dm9pZCAwJiYKKGU9ITEpLGEuYWRkRXZlbnRMaXN0ZW5lcihiLnRvU3RyaW5nKCksZCxlKTtlbHNlIGlmKGEuYXR0YWNoRXZlbnQpYS5hdHRhY2hFdmVudChBYihiLnRvU3RyaW5nKCkpLGQpO2Vsc2UgaWYoYS5hZGRMaXN0ZW5lciYmYS5yZW1vdmVMaXN0ZW5lcilwKGI9PT0iY2hhbmdlIiwiTWVkaWFRdWVyeUxpc3Qgb25seSBoYXMgYSBjaGFuZ2UgZXZlbnQiKSxhLmFkZExpc3RlbmVyKGQpO2Vsc2UgdGhyb3cgRXJyb3IoImFkZEV2ZW50TGlzdGVuZXIgYW5kIGF0dGFjaEV2ZW50IGFyZSB1bmF2YWlsYWJsZS4iKTtzYisrO3JldHVybiBjfSx6Yj1mdW5jdGlvbigpe3ZhciBhPUJiLGI9ZnVuY3Rpb24oYyl7cmV0dXJuIGEuY2FsbChiLnNyYyxiLmxpc3RlbmVyLGMpfTtyZXR1cm4gYn0sdGI9ZnVuY3Rpb24oYSxiLGMsZCxlKXtpZihBcnJheS5pc0FycmF5KGIpKXtmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKyl0YihhLGJbZl0sYyxkLGUpO3JldHVybiBudWxsfWM9dmIoYyk7cmV0dXJuIGliKGEpPwphLkEuYWRkKFN0cmluZyhiKSxjLCEwLG0oZCk/ISFkLmNhcHR1cmU6ISFkLGUpOnhiKGEsYixjLCEwLGQsZSl9LENiPWZ1bmN0aW9uKGEsYixjLGQsZSl7aWYoQXJyYXkuaXNBcnJheShiKSlmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKylDYihhLGJbZl0sYyxkLGUpO2Vsc2UgZD1tKGQpPyEhZC5jYXB0dXJlOiEhZCxjPXZiKGMpLGliKGEpPyhhPWEuQSxiPVN0cmluZyhiKS50b1N0cmluZygpLGIgaW4gYS5nJiYoZj1hLmdbYl0sYz1uYihmLGMsZCxlKSxjPi0xJiYobGIoZltjXSkscChmLmxlbmd0aCE9bnVsbCksQXJyYXkucHJvdG90eXBlLnNwbGljZS5jYWxsKGYsYywxKSxmLmxlbmd0aD09MCYmKGRlbGV0ZSBhLmdbYl0sYS5oLS0pKSkpOmEmJihhPXliKGEpKSYmKGM9cGIoYSxiLGMsZCxlKSkmJkEoYyl9LEE9ZnVuY3Rpb24oYSl7aWYodHlwZW9mIGEhPT0ibnVtYmVyIiYmYSYmIWEuamEpe3ZhciBiPWEuc3JjO2lmKGliKGIpKW9iKGIuQSxhKTtlbHNle3ZhciBjPWEudHlwZSwKZD1hLnByb3h5O2IucmVtb3ZlRXZlbnRMaXN0ZW5lcj9iLnJlbW92ZUV2ZW50TGlzdGVuZXIoYyxkLGEuY2FwdHVyZSk6Yi5kZXRhY2hFdmVudD9iLmRldGFjaEV2ZW50KEFiKGMpLGQpOmIuYWRkTGlzdGVuZXImJmIucmVtb3ZlTGlzdGVuZXImJmIucmVtb3ZlTGlzdGVuZXIoZCk7c2ItLTsoYz15YihiKSk/KG9iKGMsYSksYy5oPT0wJiYoYy5zcmM9bnVsbCxiW3FiXT1udWxsKSk6bGIoYSl9fX0sQWI9ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW4gcmI/cmJbYV06cmJbYV09Im9uIithfSxCYj1mdW5jdGlvbihhLGIpe2lmKGEuamEpYT0hMDtlbHNle2I9bmV3IHooYix0aGlzKTt2YXIgYz1hLmxpc3RlbmVyLGQ9YS5wYXx8YS5zcmM7YS5vYSYmQShhKTthPWMuY2FsbChkLGIpfXJldHVybiBhfSx5Yj1mdW5jdGlvbihhKXthPWFbcWJdO3JldHVybiBhIGluc3RhbmNlb2YgbWI/YTpudWxsfSxEYj0iX19jbG9zdXJlX2V2ZW50c19mbl8iKyhNYXRoLnJhbmRvbSgpKjFFOT4+PjApLHZiPWZ1bmN0aW9uKGEpe3AoYSwKIkxpc3RlbmVyIGNhbiBub3QgYmUgbnVsbC4iKTtpZih0eXBlb2YgYT09PSJmdW5jdGlvbiIpcmV0dXJuIGE7cChhLmhhbmRsZUV2ZW50LCJBbiBvYmplY3QgbGlzdGVuZXIgbXVzdCBoYXZlIGhhbmRsZUV2ZW50IG1ldGhvZC4iKTthW0RiXXx8KGFbRGJdPWZ1bmN0aW9uKGIpe3JldHVybiBhLmhhbmRsZUV2ZW50KGIpfSk7cmV0dXJuIGFbRGJdfTt2YXIgRWI9ZnVuY3Rpb24oYSl7dy5jYWxsKHRoaXMpO3RoaXMuaD1hO3RoaXMuZz17fX07bihFYix3KTsKdmFyIEZiPVtdLEI9ZnVuY3Rpb24oYSxiLGMsZCl7QXJyYXkuaXNBcnJheShjKXx8KGMmJihGYlswXT1jLnRvU3RyaW5nKCkpLGM9RmIpO2Zvcih2YXIgZT0wO2U8Yy5sZW5ndGg7ZSsrKXt2YXIgZj11YihiLGNbZV0sZHx8YS5oYW5kbGVFdmVudCwhMSxhLmh8fGEpO2lmKCFmKWJyZWFrO2EuZ1tmLmtleV09Zn1yZXR1cm4gYX0sQz1mdW5jdGlvbihhLGIsYyxkLGUsZil7aWYoQXJyYXkuaXNBcnJheShjKSlmb3IodmFyIGg9MDtoPGMubGVuZ3RoO2grKylDKGEsYixjW2hdLGQsZSxmKTtlbHNlIGQ9ZHx8YS5oYW5kbGVFdmVudCxlPW0oZSk/ISFlLmNhcHR1cmU6ISFlLGY9Znx8YS5ofHxhLGQ9dmIoZCksZT0hIWUsYz1pYihiKT9wYihiLkEsU3RyaW5nKGMpLGQsZSxmKTpiPyhiPXliKGIpKT9wYihiLGMsZCxlLGYpOm51bGw6bnVsbCxjJiYoQShjKSxkZWxldGUgYS5nW2Mua2V5XSk7cmV0dXJuIGF9LEdiPWZ1bmN0aW9uKGEpe0JhKGEuZyxmdW5jdGlvbihiLGMpe3RoaXMuZy5oYXNPd25Qcm9wZXJ0eShjKSYmCkEoYil9LGEpO2EuZz17fX07RWIucHJvdG90eXBlLkM9ZnVuY3Rpb24oKXtFYi5sLkMuY2FsbCh0aGlzKTtHYih0aGlzKX07RWIucHJvdG90eXBlLmhhbmRsZUV2ZW50PWZ1bmN0aW9uKCl7dGhyb3cgRXJyb3IoIkV2ZW50SGFuZGxlci5oYW5kbGVFdmVudCBub3QgaW1wbGVtZW50ZWQiKTt9O3ZhciBEPWZ1bmN0aW9uKCl7dy5jYWxsKHRoaXMpO3RoaXMuQT1uZXcgbWIodGhpcyk7dGhpcy5ZYT10aGlzO3RoaXMubGE9bnVsbH07bihELHcpO0QucHJvdG90eXBlW2hiXT0hMDtELnByb3RvdHlwZS5BYT1mdW5jdGlvbihhKXt0aGlzLmxhPWF9O0QucHJvdG90eXBlLnJlbW92ZUV2ZW50TGlzdGVuZXI9ZnVuY3Rpb24oYSxiLGMsZCl7Q2IodGhpcyxhLGIsYyxkKX07CnZhciBFPWZ1bmN0aW9uKGEsYil7SGIoYSk7dmFyIGM9YS5sYTtpZihjKXt2YXIgZD1bXTtmb3IodmFyIGU9MTtjO2M9Yy5sYSlkLnB1c2goYykscCgrK2U8MUUzLCJpbmZpbml0ZSBsb29wIil9YT1hLllhO2M9Yi50eXBlfHxiO3R5cGVvZiBiPT09InN0cmluZyI/Yj1uZXcgeShiLGEpOmIgaW5zdGFuY2VvZiB5P2IudGFyZ2V0PWIudGFyZ2V0fHxhOihlPWIsYj1uZXcgeShjLGEpLEdhKGIsZSkpO2U9ITA7dmFyIGY7aWYoZClmb3IoZj1kLmxlbmd0aC0xOyFiLkEmJmY+PTA7Zi0tKXt2YXIgaD1iLnU9ZFtmXTtlPUliKGgsYywhMCxiKSYmZX1iLkF8fChoPWIudT1hLGU9SWIoaCxjLCEwLGIpJiZlLGIuQXx8KGU9SWIoaCxjLCExLGIpJiZlKSk7aWYoZClmb3IoZj0wOyFiLkEmJmY8ZC5sZW5ndGg7ZisrKWg9Yi51PWRbZl0sZT1JYihoLGMsITEsYikmJmU7cmV0dXJuIGV9OwpELnByb3RvdHlwZS5DPWZ1bmN0aW9uKCl7RC5sLkMuY2FsbCh0aGlzKTtpZih0aGlzLkEpe3ZhciBhPXRoaXMuQSxiPTAsYztmb3IoYyBpbiBhLmcpe2Zvcih2YXIgZD1hLmdbY10sZT0wO2U8ZC5sZW5ndGg7ZSsrKSsrYixsYihkW2VdKTtkZWxldGUgYS5nW2NdO2EuaC0tfX10aGlzLmxhPW51bGx9O3ZhciB3Yj1mdW5jdGlvbihhLGIsYyxkLGUpe0hiKGEpO3JldHVybiBhLkEuYWRkKFN0cmluZyhiKSxjLCExLGQsZSl9LEliPWZ1bmN0aW9uKGEsYixjLGQpe2I9YS5BLmdbU3RyaW5nKGIpXTtpZighYilyZXR1cm4hMDtiPWIuY29uY2F0KCk7Zm9yKHZhciBlPSEwLGY9MDtmPGIubGVuZ3RoOysrZil7dmFyIGg9YltmXTtpZihoJiYhaC5qYSYmaC5jYXB0dXJlPT1jKXt2YXIgaz1oLmxpc3RlbmVyLHE9aC5wYXx8aC5zcmM7aC5vYSYmb2IoYS5BLGgpO2U9ay5jYWxsKHEsZCkhPT0hMSYmZX19cmV0dXJuIGUmJiFkLmRlZmF1bHRQcmV2ZW50ZWR9LEhiPWZ1bmN0aW9uKGEpe3AoYS5BLCJFdmVudCB0YXJnZXQgaXMgbm90IGluaXRpYWxpemVkLiBEaWQgeW91IGNhbGwgdGhlIHN1cGVyY2xhc3MgKGdvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0KSBjb25zdHJ1Y3Rvcj8iKX07dmFyIEpiPXQ/Ik1velVzZXJTZWxlY3QiOnV8fFZhPyJXZWJraXRVc2VyU2VsZWN0IjpudWxsLEtiPWZ1bmN0aW9uKGEsYil7Yj1iP251bGw6YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpO2lmKEpiJiYoYS5zdHlsZSYmKGEuc3R5bGVbSmJdPSJub25lIiksYikpZm9yKHZhciBjPTA7YT1iW2NdO2MrKylhLnN0eWxlJiYoYS5zdHlsZVtKYl09Im5vbmUiKX07dmFyIExiPWZ1bmN0aW9uKCl7fTtpYShMYik7TGIucHJvdG90eXBlLmc9MDt2YXIgRj1mdW5jdGlvbihhKXtELmNhbGwodGhpcyk7dGhpcy5HPWF8fHBhfHwocGE9bmV3IGZiKTt0aGlzLnphPU1iO3RoaXMuWT1udWxsO3RoaXMucz0hMTt0aGlzLmc9bnVsbDt0aGlzLk09dm9pZCAwO3RoaXMudT10aGlzLmo9dGhpcy5oPW51bGw7dGhpcy5TYT0hMX07bihGLEQpO0YucHJvdG90eXBlLlphPUxiLlYoKTsKdmFyIE1iPW51bGwsTmI9ZnVuY3Rpb24oYSxiKXtzd2l0Y2goYSl7Y2FzZSAxOnJldHVybiBiPyJkaXNhYmxlIjoiZW5hYmxlIjtjYXNlIDI6cmV0dXJuIGI/ImhpZ2hsaWdodCI6InVuaGlnaGxpZ2h0IjtjYXNlIDQ6cmV0dXJuIGI/ImFjdGl2YXRlIjoiZGVhY3RpdmF0ZSI7Y2FzZSA4OnJldHVybiBiPyJzZWxlY3QiOiJ1bnNlbGVjdCI7Y2FzZSAxNjpyZXR1cm4gYj8iY2hlY2siOiJ1bmNoZWNrIjtjYXNlIDMyOnJldHVybiBiPyJmb2N1cyI6ImJsdXIiO2Nhc2UgNjQ6cmV0dXJuIGI/Im9wZW4iOiJjbG9zZSJ9dGhyb3cgRXJyb3IoIkludmFsaWQgY29tcG9uZW50IHN0YXRlIik7fSxPYj1mdW5jdGlvbihhKXtyZXR1cm4gYS5ZfHwoYS5ZPSI6IisoYS5aYS5nKyspLnRvU3RyaW5nKDM2KSl9LFBiPWZ1bmN0aW9uKGEsYil7aWYoYS5oJiZhLmgudSl7dmFyIGM9YS5oLnUsZD1hLlk7ZCBpbiBjJiZkZWxldGUgY1tkXTtEYShhLmgudSxiLGEpfWEuWT1ifTtGLnByb3RvdHlwZS5pPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ307CnZhciBRYj1mdW5jdGlvbihhKXthLk18fChhLk09bmV3IEViKGEpKTtyZXR1cm4gcChhLk0pfTtGLnByb3RvdHlwZS5BYT1mdW5jdGlvbihhKXtpZih0aGlzLmgmJnRoaXMuaCE9YSl0aHJvdyBFcnJvcigiTWV0aG9kIG5vdCBzdXBwb3J0ZWQiKTtGLmwuQWEuY2FsbCh0aGlzLGEpfTtGLnByb3RvdHlwZS5tYT1mdW5jdGlvbigpe3RoaXMuZz1aYSh0aGlzLkcuZywiRElWIil9O0YucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbihhKXtSYih0aGlzLGEpfTsKdmFyIFJiPWZ1bmN0aW9uKGEsYixjKXtpZihhLnMpdGhyb3cgRXJyb3IoIkNvbXBvbmVudCBhbHJlYWR5IHJlbmRlcmVkIik7YS5nfHxhLm1hKCk7Yj9iLmluc2VydEJlZm9yZShhLmcsY3x8bnVsbCk6YS5HLmcuYm9keS5hcHBlbmRDaGlsZChhLmcpO2EuaCYmIWEuaC5zfHxhLkkoKX0sU2I9ZnVuY3Rpb24oYSxiKXtpZihhLnMpdGhyb3cgRXJyb3IoIkNvbXBvbmVudCBhbHJlYWR5IHJlbmRlcmVkIik7aWYoYiYmYS53YShiKSl7YS5TYT0hMDt2YXIgYz1iYihiKTthLkcmJmEuRy5nPT1jfHwoYS5HPWI/bmV3IGZiKGJiKGIpKTpwYXx8KHBhPW5ldyBmYikpO2EuRWEoYik7YS5JKCl9ZWxzZSB0aHJvdyBFcnJvcigiSW52YWxpZCBlbGVtZW50IHRvIGRlY29yYXRlIik7fTtnPUYucHJvdG90eXBlO2cud2E9ZnVuY3Rpb24oKXtyZXR1cm4hMH07Zy5FYT1mdW5jdGlvbihhKXt0aGlzLmc9YX07CmcuST1mdW5jdGlvbigpe3RoaXMucz0hMDtUYih0aGlzLGZ1bmN0aW9uKGEpeyFhLnMmJmEuaSgpJiZhLkkoKX0pfTtnLlU9ZnVuY3Rpb24oKXtUYih0aGlzLGZ1bmN0aW9uKGEpe2EucyYmYS5VKCl9KTt0aGlzLk0mJkdiKHRoaXMuTSk7dGhpcy5zPSExfTtnLkM9ZnVuY3Rpb24oKXt0aGlzLnMmJnRoaXMuVSgpO3RoaXMuTSYmKHRoaXMuTS5kaXNwb3NlKCksZGVsZXRlIHRoaXMuTSk7VGIodGhpcyxmdW5jdGlvbihhKXthLmRpc3Bvc2UoKX0pOyF0aGlzLlNhJiZ0aGlzLmcmJiRhKHRoaXMuZyk7dGhpcy5oPXRoaXMuZz10aGlzLnU9dGhpcy5qPW51bGw7Ri5sLkMuY2FsbCh0aGlzKX07Zy5CYT1mdW5jdGlvbihhLGIpe3RoaXMuQ2EoYSxIKHRoaXMpLGIpfTsKZy5DYT1mdW5jdGlvbihhLGIsYyl7cCghIWEsIlByb3ZpZGVkIGVsZW1lbnQgbXVzdCBub3QgYmUgbnVsbC4iKTtpZihhLnMmJihjfHwhdGhpcy5zKSl0aHJvdyBFcnJvcigiQ29tcG9uZW50IGFscmVhZHkgcmVuZGVyZWQiKTtpZihiPDB8fGI+SCh0aGlzKSl0aHJvdyBFcnJvcigiQ2hpbGQgY29tcG9uZW50IGluZGV4IG91dCBvZiBib3VuZHMiKTt0aGlzLnUmJnRoaXMuanx8KHRoaXMudT17fSx0aGlzLmo9W10pO2lmKGEuaD09dGhpcyl7dmFyIGQ9dGhpcy51LGU9T2IoYSk7ZFtlXT1hO3hhKHRoaXMuaixhKX1lbHNlIERhKHRoaXMudSxPYihhKSxhKTtpZihhPT10aGlzKXRocm93IEVycm9yKCJVbmFibGUgdG8gc2V0IHBhcmVudCBjb21wb25lbnQiKTtpZihkPXRoaXMmJmEuaCYmYS5ZKWU9YS5oLGQ9YS5ZLGUudSYmZD8oZT1lLnUsZD0oZSE9PW51bGwmJmQgaW4gZT9lW2RdOnZvaWQgMCl8fG51bGwpOmQ9bnVsbDtpZihkJiZhLmghPXRoaXMpdGhyb3cgRXJyb3IoIlVuYWJsZSB0byBzZXQgcGFyZW50IGNvbXBvbmVudCIpOwphLmg9dGhpcztGLmwuQWEuY2FsbChhLHRoaXMpO3phKHRoaXMuaixiLDAsYSk7YS5zJiZ0aGlzLnMmJmEuaD09dGhpcz8oYz10aGlzLm5hKCksKGMuY2hpbGROb2Rlc1tiXXx8bnVsbCkhPWEuaSgpJiYoYS5pKCkucGFyZW50RWxlbWVudD09YyYmYy5yZW1vdmVDaGlsZChhLmkoKSksYj1jLmNoaWxkTm9kZXNbYl18fG51bGwsYy5pbnNlcnRCZWZvcmUoYS5pKCksYikpKTpjPyh0aGlzLmd8fHRoaXMubWEoKSxiPUkodGhpcyxiKzEpLFJiKGEsdGhpcy5uYSgpLGI/Yi5nOm51bGwpKTp0aGlzLnMmJiFhLnMmJmEuZyYmYS5nLnBhcmVudE5vZGUmJmEuZy5wYXJlbnROb2RlLm5vZGVUeXBlPT0xJiZhLkkoKX07Zy5uYT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmd9Owp2YXIgVWI9ZnVuY3Rpb24oYSl7aWYoYS56YT09bnVsbCl7dmFyIGI9YS5zP2EuZzphLkcuZy5ib2R5O2E6e3ZhciBjPWJiKGIpO2lmKGMuZGVmYXVsdFZpZXcmJmMuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSYmKGM9Yy5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKGIsbnVsbCkpKXtjPWMuZGlyZWN0aW9ufHxjLmdldFByb3BlcnR5VmFsdWUoImRpcmVjdGlvbiIpfHwiIjticmVhayBhfWM9IiJ9YS56YT0icnRsIj09KGN8fChiLmN1cnJlbnRTdHlsZT9iLmN1cnJlbnRTdHlsZS5kaXJlY3Rpb246bnVsbCl8fGIuc3R5bGUmJmIuc3R5bGUuZGlyZWN0aW9uKX1yZXR1cm4gYS56YX0sSD1mdW5jdGlvbihhKXtyZXR1cm4gYS5qP2Euai5sZW5ndGg6MH0sST1mdW5jdGlvbihhLGIpe3JldHVybiBhLmo/YS5qW2JdfHxudWxsOm51bGx9LFRiPWZ1bmN0aW9uKGEsYixjKXthLmomJmEuai5mb3JFYWNoKGIsYyl9LFZiPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuaiYmYj9hLmouaW5kZXhPZihiKToKLTF9O3ZhciBXYj17bWI6ImFjdGl2ZWRlc2NlbmRhbnQiLHJiOiJhdG9taWMiLHNiOiJhdXRvY29tcGxldGUiLHViOiJidXN5Iix4YjoiY2hlY2tlZCIseWI6ImNvbGluZGV4IixEYjoiY29udHJvbHMiLEViOiJjdXJyZW50IixHYjoiZGVzY3JpYmVkYnkiLEpiOiJkaXNhYmxlZCIsTGI6ImRyb3BlZmZlY3QiLE1iOiJleHBhbmRlZCIsTmI6ImZsb3d0byIsUGI6ImdyYWJiZWQiLFRiOiJoYXNwb3B1cCIsVmI6ImhpZGRlbiIsWGI6ImludmFsaWQiLFliOiJsYWJlbCIsWmI6ImxhYmVsbGVkYnkiLGFjOiJsZXZlbCIsZmM6ImxpdmUiLHZjOiJtdWx0aWxpbmUiLHdjOiJtdWx0aXNlbGVjdGFibGUiLEFjOiJvcmllbnRhdGlvbiIsQmM6Im93bnMiLENjOiJwb3NpbnNldCIsRWM6InByZXNzZWQiLEljOiJyZWFkb25seSIsS2M6InJlbGV2YW50IixMYzoicmVxdWlyZWQiLFBjOiJyb3dpbmRleCIsU2M6InNlbGVjdGVkIixVYzoic2V0c2l6ZSIsV2M6InNvcnQiLG1kOiJ2YWx1ZW1heCIsbmQ6InZhbHVlbWluIiwKb2Q6InZhbHVlbm93IixwZDoidmFsdWV0ZXh0In07dmFyIFhiO3ZhciBZYj17bmI6ImFsZXJ0IixvYjoiYWxlcnRkaWFsb2ciLHBiOiJhcHBsaWNhdGlvbiIscWI6ImFydGljbGUiLHRiOiJiYW5uZXIiLHZiOiJidXR0b24iLHdiOiJjaGVja2JveCIsemI6ImNvbHVtbmhlYWRlciIsQWI6ImNvbWJvYm94IixCYjoiY29tcGxlbWVudGFyeSIsQ2I6ImNvbnRlbnRpbmZvIixGYjoiZGVmaW5pdGlvbiIsSGI6ImRpYWxvZyIsSWI6ImRpcmVjdG9yeSIsS2I6ImRvY3VtZW50IixPYjoiZm9ybSIsUWI6ImdyaWQiLFJiOiJncmlkY2VsbCIsU2I6Imdyb3VwIixVYjoiaGVhZGluZyIsV2I6ImltZyIsYmM6ImxpbmsiLGNjOiJsaXN0IixkYzoibGlzdGJveCIsZWM6Imxpc3RpdGVtIixoYzoibG9nIixpYzoibWFpbiIsamM6Im1hcnF1ZWUiLGtjOiJtYXRoIixsYzoibWVudSIsbWM6Im1lbnViYXIiLG5jOiJtZW51aXRlbSIsb2M6Im1lbnVpdGVtY2hlY2tib3giLHBjOiJtZW51aXRlbXJhZGlvIix4YzoibmF2aWdhdGlvbiIseWM6Im5vdGUiLHpjOiJvcHRpb24iLApEYzoicHJlc2VudGF0aW9uIixGYzoicHJvZ3Jlc3NiYXIiLEdjOiJyYWRpbyIsSGM6InJhZGlvZ3JvdXAiLEpjOiJyZWdpb24iLE1jOiJyb3ciLE5jOiJyb3dncm91cCIsT2M6InJvd2hlYWRlciIsUWM6InNjcm9sbGJhciIsUmM6InNlYXJjaCIsVGM6InNlcGFyYXRvciIsVmM6InNsaWRlciIsWGM6InNwaW5idXR0b24iLFljOiJzdGF0dXMiLFpjOiJzd2l0Y2giLGFkOiJ0YWIiLGJkOiJ0YWJsaXN0IixjZDoidGFicGFuZWwiLGRkOiJ0ZXh0Ym94IixlZDoidGV4dGluZm8iLGZkOiJ0aW1lciIsZ2Q6InRvb2xiYXIiLGhkOiJ0b29sdGlwIixqZDoidHJlZSIsa2Q6InRyZWVncmlkIixsZDoidHJlZWl0ZW0ifTt2YXIgWmI9ZnVuY3Rpb24oYSxiKXtiPyhwKENhKFliLGIpLCJObyBzdWNoIEFSSUEgcm9sZSAiK2IpLGEuc2V0QXR0cmlidXRlKCJyb2xlIixiKSk6YS5yZW1vdmVBdHRyaWJ1dGUoInJvbGUiKX0sYWM9ZnVuY3Rpb24oYSxiLGMpe0FycmF5LmlzQXJyYXkoYykmJihjPWMuam9pbigiICIpKTt2YXIgZD0kYihiKTtjPT09IiJ8fGM9PXZvaWQgMD8oWGJ8fChjPXt9LFhiPShjLmF0b21pYz0hMSxjLmF1dG9jb21wbGV0ZT0ibm9uZSIsYy5kcm9wZWZmZWN0PSJub25lIixjLmhhc3BvcHVwPSExLGMubGl2ZT0ib2ZmIixjLm11bHRpbGluZT0hMSxjLm11bHRpc2VsZWN0YWJsZT0hMSxjLm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIsYy5yZWFkb25seT0hMSxjLnJlbGV2YW50PSJhZGRpdGlvbnMgdGV4dCIsYy5yZXF1aXJlZD0hMSxjLnNvcnQ9Im5vbmUiLGMuYnVzeT0hMSxjLmRpc2FibGVkPSExLGMuaGlkZGVuPSExLGMuaW52YWxpZD0iZmFsc2UiLGMpKSxjPVhiLGIgaW4gYz9hLnNldEF0dHJpYnV0ZShkLApjW2JdKTphLnJlbW92ZUF0dHJpYnV0ZShkKSk6YS5zZXRBdHRyaWJ1dGUoZCxjKX0sJGI9ZnVuY3Rpb24oYSl7cChhLCJBUklBIGF0dHJpYnV0ZSBjYW5ub3QgYmUgZW1wdHkuIik7cChDYShXYixhKSwiTm8gc3VjaCBBUklBIGF0dHJpYnV0ZSAiK2EpO3JldHVybiJhcmlhLSIrYX07dmFyIGRjPWZ1bmN0aW9uKGEsYixjLGQsZSxmKXtpZih2JiZlKXJldHVybiBiYyhhKTtpZihlJiYhZClyZXR1cm4hMTtpZighdCl7dHlwZW9mIGI9PT0ibnVtYmVyIiYmKGI9Y2MoYikpO3ZhciBoPWI9PTE3fHxiPT0xOHx8diYmYj09OTE7aWYoKCFjfHx2KSYmaHx8diYmYj09MTYmJihkfHxmKSlyZXR1cm4hMX1pZih1JiZkJiZjKXN3aXRjaChhKXtjYXNlIDIyMDpjYXNlIDIxOTpjYXNlIDIyMTpjYXNlIDE5MjpjYXNlIDE4NjpjYXNlIDE4OTpjYXNlIDE4NzpjYXNlIDE4ODpjYXNlIDE5MDpjYXNlIDE5MTpjYXNlIDE5MjpjYXNlIDIyMjpyZXR1cm4hMX1zd2l0Y2goYSl7Y2FzZSAxMzpyZXR1cm4gdD9mfHxlPyExOiEoYyYmZCk6ITA7Y2FzZSAyNzpyZXR1cm4hdSYmIXR9cmV0dXJuIHQmJihkfHxlfHxmKT8hMTpiYyhhKX0sYmM9ZnVuY3Rpb24oYSl7aWYoYT49NDgmJmE8PTU3fHxhPj05NiYmYTw9MTA2fHxhPj02NSYmYTw9OTB8fHUmJmE9PTApcmV0dXJuITA7c3dpdGNoKGEpe2Nhc2UgMzI6Y2FzZSA0MzpjYXNlIDYzOmNhc2UgNjQ6Y2FzZSAxMDc6Y2FzZSAxMDk6Y2FzZSAxMTA6Y2FzZSAxMTE6Y2FzZSAxODY6Y2FzZSA1OTpjYXNlIDE4OTpjYXNlIDE4NzpjYXNlIDYxOmNhc2UgMTg4OmNhc2UgMTkwOmNhc2UgMTkxOmNhc2UgMTkyOmNhc2UgMjIyOmNhc2UgMjE5OmNhc2UgMjIwOmNhc2UgMjIxOmNhc2UgMTYzOmNhc2UgNTg6cmV0dXJuITA7CmNhc2UgMTczOmNhc2UgMTcxOnJldHVybiB0O2RlZmF1bHQ6cmV0dXJuITF9fSxjYz1mdW5jdGlvbihhKXtpZih0KWE9ZWMoYSk7ZWxzZSBpZih2JiZ1KXN3aXRjaChhKXtjYXNlIDkzOmE9OTF9cmV0dXJuIGF9LGVjPWZ1bmN0aW9uKGEpe3N3aXRjaChhKXtjYXNlIDYxOnJldHVybiAxODc7Y2FzZSA1OTpyZXR1cm4gMTg2O2Nhc2UgMTczOnJldHVybiAxODk7Y2FzZSAyMjQ6cmV0dXJuIDkxO2Nhc2UgMDpyZXR1cm4gMjI0O2RlZmF1bHQ6cmV0dXJuIGF9fTt2YXIgZmM9ZnVuY3Rpb24oYSxiLGMsZCl7ei5jYWxsKHRoaXMsZCk7dGhpcy50eXBlPSJrZXkiO3RoaXMuZz1hO3RoaXMucmVwZWF0PWN9O24oZmMseik7dmFyIEo9ZnVuY3Rpb24oYSxiKXtELmNhbGwodGhpcyk7YSYmZ2ModGhpcyxhLGIpfTtuKEosRCk7Zz1KLnByb3RvdHlwZTtnLlI9bnVsbDtnLnFhPW51bGw7Zy5KYT1udWxsO2cucmE9bnVsbDtnLkY9LTE7Zy5LPS0xO2cuRGE9ITE7CnZhciBoYz17MzoxMywxMjoxNDQsNjMyMzI6MzgsNjMyMzM6NDAsNjMyMzQ6MzcsNjMyMzU6MzksNjMyMzY6MTEyLDYzMjM3OjExMyw2MzIzODoxMTQsNjMyMzk6MTE1LDYzMjQwOjExNiw2MzI0MToxMTcsNjMyNDI6MTE4LDYzMjQzOjExOSw2MzI0NDoxMjAsNjMyNDU6MTIxLDYzMjQ2OjEyMiw2MzI0NzoxMjMsNjMyNDg6NDQsNjMyNzI6NDYsNjMyNzM6MzYsNjMyNzU6MzUsNjMyNzY6MzMsNjMyNzc6MzQsNjMyODk6MTQ0LDYzMzAyOjQ1fSxpYz17VXA6MzgsRG93bjo0MCxMZWZ0OjM3LFJpZ2h0OjM5LEVudGVyOjEzLEYxOjExMixGMjoxMTMsRjM6MTE0LEY0OjExNSxGNToxMTYsRjY6MTE3LEY3OjExOCxGODoxMTksRjk6MTIwLEYxMDoxMjEsRjExOjEyMixGMTI6MTIzLCJVKzAwN0YiOjQ2LEhvbWU6MzYsRW5kOjM1LFBhZ2VVcDozMyxQYWdlRG93bjozNCxJbnNlcnQ6NDV9LGpjPXYmJnQ7CkoucHJvdG90eXBlLmc9ZnVuY3Rpb24oYSl7dSYmKHRoaXMuRj09MTcmJiFhLmN0cmxLZXl8fHRoaXMuRj09MTgmJiFhLmFsdEtleXx8diYmdGhpcy5GPT05MSYmIWEubWV0YUtleSkmJih0aGlzLks9dGhpcy5GPS0xKTt0aGlzLkY9PS0xJiYoYS5jdHJsS2V5JiZhLmchPTE3P3RoaXMuRj0xNzphLmFsdEtleSYmYS5nIT0xOD90aGlzLkY9MTg6YS5tZXRhS2V5JiZhLmchPTkxJiYodGhpcy5GPTkxKSk7ZGMoYS5nLHRoaXMuRixhLnNoaWZ0S2V5LGEuY3RybEtleSxhLmFsdEtleSxhLm1ldGFLZXkpPyh0aGlzLks9Y2MoYS5nKSxqYyYmKHRoaXMuRGE9YS5hbHRLZXkpKTp0aGlzLmhhbmRsZUV2ZW50KGEpfTtKLnByb3RvdHlwZS5oPWZ1bmN0aW9uKGEpe3RoaXMuSz10aGlzLkY9LTE7dGhpcy5EYT1hLmFsdEtleX07CkoucHJvdG90eXBlLmhhbmRsZUV2ZW50PWZ1bmN0aW9uKGEpe3ZhciBiPWEuaCxjPWIuYWx0S2V5O2lmKHUmJmEudHlwZT09ImtleXByZXNzIil7dmFyIGQ9dGhpcy5LO3ZhciBlPWIuY2hhckNvZGU+PTAmJmIuY2hhckNvZGU8NjMyMzImJmJjKGQpP2IuY2hhckNvZGU6MH1lbHNlIGEudHlwZT09ImtleXByZXNzIj8oamMmJihjPXRoaXMuRGEpLGIua2V5Q29kZT09Yi5jaGFyQ29kZT9iLmtleUNvZGU8MzI/KGQ9Yi5rZXlDb2RlLGU9MCk6KGQ9dGhpcy5LLGU9Yi5jaGFyQ29kZSk6KGQ9Yi5rZXlDb2RlfHx0aGlzLkssZT1iLmNoYXJDb2RlfHwwKSk6KGQ9Yi5rZXlDb2RlfHx0aGlzLkssZT1iLmNoYXJDb2RlfHwwKSx2JiZlPT02MyYmZD09MjI0JiYoZD0xOTEpO3ZhciBmPWQ9Y2MoZCk7ZD9kPj02MzIzMiYmZCBpbiBoYz9mPWhjW2RdOmQ9PTI1JiZhLnNoaWZ0S2V5JiYoZj05KTpiLmtleUlkZW50aWZpZXImJmIua2V5SWRlbnRpZmllciBpbiBpYyYmKGY9aWNbYi5rZXlJZGVudGlmaWVyXSk7CmlmKCF0fHxhLnR5cGUhPSJrZXlwcmVzcyJ8fGRjKGYsdGhpcy5GLGEuc2hpZnRLZXksYS5jdHJsS2V5LGMsYS5tZXRhS2V5KSlhPWY9PXRoaXMuRix0aGlzLkY9ZixiPW5ldyBmYyhmLGUsYSxiKSxiLmFsdEtleT1jLEUodGhpcyxiKX07Si5wcm90b3R5cGUuaT1mdW5jdGlvbigpe3JldHVybiB0aGlzLlJ9O3ZhciBnYz1mdW5jdGlvbihhLGIsYyl7YS5yYSYma2MoYSk7YS5SPWI7YS5xYT11YihhLlIsImtleXByZXNzIixhLGMpO2EuSmE9dWIoYS5SLCJrZXlkb3duIixhLmcsYyxhKTthLnJhPXViKGEuUiwia2V5dXAiLGEuaCxjLGEpfSxrYz1mdW5jdGlvbihhKXthLnFhJiYoQShhLnFhKSxBKGEuSmEpLEEoYS5yYSksYS5xYT1udWxsLGEuSmE9bnVsbCxhLnJhPW51bGwpO2EuUj1udWxsO2EuRj0tMTthLks9LTF9O0oucHJvdG90eXBlLkM9ZnVuY3Rpb24oKXtKLmwuQy5jYWxsKHRoaXMpO2tjKHRoaXMpfTt2YXIgSz17Z2E6Im1vdXNlZG93biIsaGE6Im1vdXNldXAiLGZhOiJtb3VzZWNhbmNlbCIsc2M6Im1vdXNlbW92ZSIsdWM6Im1vdXNlb3ZlciIsdGM6Im1vdXNlb3V0IixxYzoibW91c2VlbnRlciIscmM6Im1vdXNlbGVhdmUifTt2YXIgbGM9ZnVuY3Rpb24oYSl7cmV0dXJuIHR5cGVvZiBhLmNsYXNzTmFtZT09InN0cmluZyI/YS5jbGFzc05hbWU6YS5nZXRBdHRyaWJ1dGUmJmEuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIn0sTD1mdW5jdGlvbihhKXtyZXR1cm4gYS5jbGFzc0xpc3Q/YS5jbGFzc0xpc3Q6bGMoYSkubWF0Y2goL1xTKy9nKXx8W119LG1jPWZ1bmN0aW9uKGEsYil7dHlwZW9mIGEuY2xhc3NOYW1lPT0ic3RyaW5nIj9hLmNsYXNzTmFtZT1iOmEuc2V0QXR0cmlidXRlJiZhLnNldEF0dHJpYnV0ZSgiY2xhc3MiLGIpfSxuYz1mdW5jdGlvbihhLGIpe2EuY2xhc3NMaXN0P2I9YS5jbGFzc0xpc3QuY29udGFpbnMoYik6KGE9TChhKSxiPXZhKGEsYik+PTApO3JldHVybiBifSxvYz1mdW5jdGlvbihhLGIpe2lmKGEuY2xhc3NMaXN0KWEuY2xhc3NMaXN0LmFkZChiKTtlbHNlIGlmKCFuYyhhLGIpKXt2YXIgYz1sYyhhKTttYyhhLGMrKGMubGVuZ3RoPjA/IiAiK2I6YikpfX0scGM9ZnVuY3Rpb24oYSxiKXtpZihhLmNsYXNzTGlzdClBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGIsCmZ1bmN0aW9uKGUpe29jKGEsZSl9KTtlbHNle3ZhciBjPXt9O0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoTChhKSxmdW5jdGlvbihlKXtjW2VdPSEwfSk7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChiLGZ1bmN0aW9uKGUpe2NbZV09ITB9KTtiPSIiO2Zvcih2YXIgZCBpbiBjKWIrPWIubGVuZ3RoPjA/IiAiK2Q6ZDttYyhhLGIpfX0scWM9ZnVuY3Rpb24oYSxiKXthLmNsYXNzTGlzdD9hLmNsYXNzTGlzdC5yZW1vdmUoYik6bmMoYSxiKSYmbWMoYSxBcnJheS5wcm90b3R5cGUuZmlsdGVyLmNhbGwoTChhKSxmdW5jdGlvbihjKXtyZXR1cm4gYyE9Yn0pLmpvaW4oIiAiKSl9LHJjPWZ1bmN0aW9uKGEsYil7YS5jbGFzc0xpc3Q/QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChiLGZ1bmN0aW9uKGMpe3FjKGEsYyl9KTptYyhhLEFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbChMKGEpLGZ1bmN0aW9uKGMpe3JldHVybiEodmEoYixjKT49MCl9KS5qb2luKCIgIikpfTt2YXIgdGM9ZnVuY3Rpb24oYSxiKXtpZighYSl0aHJvdyBFcnJvcigiSW52YWxpZCBjbGFzcyBuYW1lICIrYSk7aWYodHlwZW9mIGIhPT0iZnVuY3Rpb24iKXRocm93IEVycm9yKCJJbnZhbGlkIGRlY29yYXRvciBmdW5jdGlvbiAiK2IpO3NjW2FdPWJ9LHVjPXt9LHNjPXt9O3ZhciB2Yz1mdW5jdGlvbihhKXt0aGlzLkE9YX07aWEodmMpO3ZhciB3Yz1mdW5jdGlvbihhLGIpe2EmJihhLnRhYkluZGV4PWI/MDotMSl9LHljPWZ1bmN0aW9uKGEsYixjKXtjLmlkJiZQYihiLGMuaWQpO3ZhciBkPWEuZygpLGU9ITEsZj1MKGMpO2YmJkFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoZixmdW5jdGlvbihoKXtoPT1kP2U9ITA6aCYmdGhpcy51KGIsaCxkKX0sYSk7ZXx8b2MoYyxkKTt4YyhiLGMpO3JldHVybiBjfTt2Yy5wcm90b3R5cGUudT1mdW5jdGlvbihhLGIsYyl7Yj09YysiLWRpc2FibGVkIj9hLlgoITEpOmI9PWMrIi1ob3Jpem9udGFsIj96YyhhLCJob3Jpem9udGFsIik6Yj09YysiLXZlcnRpY2FsIiYmemMoYSwidmVydGljYWwiKX07CnZhciB4Yz1mdW5jdGlvbihhLGIpe2lmKGIpZm9yKHZhciBjPWIuZmlyc3RDaGlsZCxkO2MmJmMucGFyZW50Tm9kZT09Yjspe2Q9Yy5uZXh0U2libGluZztpZihjLm5vZGVUeXBlPT0xKXthOnt2YXIgZT1jO3AoZSk7ZT1MKGUpO2Zvcih2YXIgZj1lLmxlbmd0aCxoPTA7aDxmO2grKyl7dmFyIGs9ZVtoXTtpZihrPWsgaW4gc2M/c2Nba10oKTpudWxsKXtlPWs7YnJlYWsgYX19ZT1udWxsfWUmJihlLmc9YyxhLmlzRW5hYmxlZCgpfHxlLlgoITEpLGEuQmEoZSksU2IoZSxjKSl9ZWxzZSBjLm5vZGVWYWx1ZSYmSGEoYy5ub2RlVmFsdWUpIT0iInx8Yi5yZW1vdmVDaGlsZChjKTtjPWR9fSxBYz1mdW5jdGlvbihhLGIpe2I9Yi5pKCk7cChiLCJUaGUgY29udGFpbmVyIERPTSBlbGVtZW50IGNhbm5vdCBiZSBudWxsLiIpO0tiKGIsdCk7KGE9YS5BKSYmWmIoYixhKX07dmMucHJvdG90eXBlLmc9ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy1jb250YWluZXIifTsKdmMucHJvdG90eXBlLmo9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nKCksYz1bYixhLkw9PSJob3Jpem9udGFsIj9iKyItaG9yaXpvbnRhbCI6YisiLXZlcnRpY2FsIl07YS5pc0VuYWJsZWQoKXx8Yy5wdXNoKGIrIi1kaXNhYmxlZCIpO3JldHVybiBjfTt2YXIgQmM9ZnVuY3Rpb24oKXt9O3ZhciBNPWZ1bmN0aW9uKCl7fSxDYztpYShNKTt2YXIgRGM9e2J1dHRvbjoicHJlc3NlZCIsY2hlY2tib3g6ImNoZWNrZWQiLG1lbnVpdGVtOiJzZWxlY3RlZCIsbWVudWl0ZW1jaGVja2JveDoiY2hlY2tlZCIsbWVudWl0ZW1yYWRpbzoiY2hlY2tlZCIscmFkaW86ImNoZWNrZWQiLHRhYjoic2VsZWN0ZWQiLHRyZWVpdGVtOiJzZWxlY3RlZCJ9O00ucHJvdG90eXBlLk5hPWZ1bmN0aW9uKCl7fTtNLnByb3RvdHlwZS54YT1mdW5jdGlvbihhKXt2YXIgYj1hLkcsYz1iLmgsZD10aGlzLk4oKSxlPVtkXSxmPXRoaXMuTigpO2YhPWQmJmUucHVzaChmKTtkPWEubTtmb3IoZj1bXTtkOyl7dmFyIGg9ZCYtZDtmLnB1c2goRWModGhpcyxoKSk7ZCY9fmh9ZS5wdXNoLmFwcGx5KGUsZik7KGQ9YS5GYSkmJmUucHVzaC5hcHBseShlLGQpO3JldHVybiBjLmNhbGwoYiwiRElWIixlLmpvaW4oIiAiKSxhLmlhKX07Ck0ucHJvdG90eXBlLnlhPWZ1bmN0aW9uKGEsYil7Yi5pZCYmUGIoYSxiLmlkKTtiJiZiLmZpcnN0Q2hpbGQ/RmMoYSxiLmZpcnN0Q2hpbGQubmV4dFNpYmxpbmc/eWEoYi5jaGlsZE5vZGVzKTpiLmZpcnN0Q2hpbGQpOmEuaWE9bnVsbDt2YXIgYz0wLGQ9dGhpcy5OKCksZT10aGlzLk4oKSxmPSExLGg9ITEsaz15YShMKGIpKTtrLmZvckVhY2goZnVuY3Rpb24ocSl7Znx8cSE9ZD9ofHxxIT1lP2N8PUdjKHRoaXMscSk6aD0hMDooZj0hMCxlPT1kJiYoaD0hMCkpO0djKHRoaXMscSk9PTEmJihzYShiKSxkYihiKSYmZWIoYikmJmNiKGIsITEpKX0sdGhpcyk7YS5tPWM7Znx8KGsucHVzaChkKSxlPT1kJiYoaD0hMCkpO2h8fGsucHVzaChlKTsoYT1hLkZhKSYmay5wdXNoLmFwcGx5KGssYSk7ZiYmaCYmIWF8fG1jKGIsay5qb2luKCIgIikpO3JldHVybiBifTsKdmFyIEhjPWZ1bmN0aW9uKGEsYil7aWYoYT1hLk5hKCkpe3AoYiwiVGhlIGVsZW1lbnQgcGFzc2VkIGFzIGEgZmlyc3QgcGFyYW1ldGVyIGNhbm5vdCBiZSBudWxsLiIpO3ZhciBjPWIuZ2V0QXR0cmlidXRlKCJyb2xlIil8fG51bGw7YSE9YyYmWmIoYixhKX19LEljPWZ1bmN0aW9uKGEsYil7dmFyIGM7aWYoYS5EJjMyJiYoYz1hLmkoKSkpe2lmKCFiJiZhLm0mMzIpe3RyeXtjLmJsdXIoKX1jYXRjaChkKXt9YS5tJjMyJiZhLlFhKG51bGwpfShkYihjKSYmZWIoYykpIT1iJiZjYihjLGIpfX0sSmM9ZnVuY3Rpb24oYSxiLGMpe0NjfHwoQ2M9ezE6ImRpc2FibGVkIiw4OiJzZWxlY3RlZCIsMTY6ImNoZWNrZWQiLDY0OiJleHBhbmRlZCJ9KTtwKGEsIlRoZSBlbGVtZW50IHBhc3NlZCBhcyBhIGZpcnN0IHBhcmFtZXRlciBjYW5ub3QgYmUgbnVsbC4iKTtiPUNjW2JdO3ZhciBkPWEuZ2V0QXR0cmlidXRlKCJyb2xlIil8fG51bGw7ZCYmKGQ9RGNbZF18fGIsYj1iPT0iY2hlY2tlZCJ8fGI9PQoic2VsZWN0ZWQiP2Q6Yik7YiYmYWMoYSxiLGMpfTtNLnByb3RvdHlwZS5OPWZ1bmN0aW9uKCl7cmV0dXJuImdvb2ctY29udHJvbCJ9O3ZhciBFYz1mdW5jdGlvbihhLGIpe2EuZ3x8S2MoYSk7cmV0dXJuIGEuZ1tiXX0sR2M9ZnVuY3Rpb24oYSxiKXthLmh8fChhLmd8fEtjKGEpLGEuaD1FYShhLmcpKTthPXBhcnNlSW50KGEuaFtiXSwxMCk7cmV0dXJuIGlzTmFOKGEpPzA6YX0sS2M9ZnVuY3Rpb24oYSl7dmFyIGI9YS5OKCk7dmFyIGM9Yi5yZXBsYWNlKC9ceGEwfFxzL2csIiAiKS5pbmRleE9mKCIgIikhPS0xO3AoIWMsIkNvbnRyb2xSZW5kZXJlciBoYXMgYW4gaW52YWxpZCBjc3MgY2xhc3M6ICciK2IrIiciKTthLmc9ezE6YisiLWRpc2FibGVkIiwyOmIrIi1ob3ZlciIsNDpiKyItYWN0aXZlIiw4OmIrIi1zZWxlY3RlZCIsMTY6YisiLWNoZWNrZWQiLDMyOmIrIi1mb2N1c2VkIiw2NDpiKyItb3BlbiJ9fTt2YXIgTj1mdW5jdGlvbihhLGIsYyl7Ri5jYWxsKHRoaXMsYyk7aWYoIWIpe2ZvcihiPXRoaXMuY29uc3RydWN0b3I7Yjspe3ZhciBkPW5hKGIpO2lmKGQ9dWNbZF0pYnJlYWs7Yj0oYj1PYmplY3QuZ2V0UHJvdG90eXBlT2YoYi5wcm90b3R5cGUpKSYmYi5jb25zdHJ1Y3Rvcn1iPWQ/dHlwZW9mIGQuVj09PSJmdW5jdGlvbiI/ZC5WKCk6bmV3IGQ6bnVsbH10aGlzLnY9Yjt0aGlzLmlhPWEhPT12b2lkIDA/YTpudWxsfTtuKE4sRik7Zz1OLnByb3RvdHlwZTtnLmlhPW51bGw7Zy5tPTA7Zy5EPTM5O2cuUD0wO2cuT2E9ITA7Zy5GYT1udWxsO2cuSGE9ITA7Zy5tYT1mdW5jdGlvbigpe3ZhciBhPXRoaXMudi54YSh0aGlzKTt0aGlzLmc9YTtIYyh0aGlzLnYsYSk7S2IoYSwhMCk7dGhpcy5pc1Zpc2libGUoKXx8KGEuc3R5bGUuZGlzcGxheT0ibm9uZSIsYSYmYWMoYSwiaGlkZGVuIiwhMCkpfTtnLm5hPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaSgpfTtnLndhPWZ1bmN0aW9uKCl7cmV0dXJuITB9OwpnLkVhPWZ1bmN0aW9uKGEpe3RoaXMuZz1hPXRoaXMudi55YSh0aGlzLGEpO0hjKHRoaXMudixhKTtLYihhLCEwKTt0aGlzLk9hPWEuc3R5bGUuZGlzcGxheSE9Im5vbmUifTsKZy5JPWZ1bmN0aW9uKCl7Ti5sLkkuY2FsbCh0aGlzKTt2YXIgYT10aGlzLmc7cChhLCJDYW4gbm90IGNhbGwgZ2V0RWxlbWVudFN0cmljdCBiZWZvcmUgcmVuZGVyaW5nL2RlY29yYXRpbmcuIik7cCh0aGlzKTtwKGEpO3RoaXMuaXNWaXNpYmxlKCl8fGFjKGEsImhpZGRlbiIsIXRoaXMuaXNWaXNpYmxlKCkpO3RoaXMuaXNFbmFibGVkKCl8fEpjKGEsMSwhdGhpcy5pc0VuYWJsZWQoKSk7dGhpcy5EJjgmJkpjKGEsOCwhISh0aGlzLm0mOCkpO3RoaXMuRCYxNiYmSmMoYSwxNiwhISh0aGlzLm0mMTYpKTt0aGlzLkQmNjQmJkpjKGEsNjQsISEodGhpcy5tJjY0KSk7dmFyIGI9dGhpcy52O1ViKHRoaXMpJiYoYT10aGlzLmkoKSxiPWIuTigpKyItcnRsIiwoYT1hLmk/YS5pKCk6YSkmJnBjKGEsW2JdKSk7dGhpcy5pc0VuYWJsZWQoKSYmSWModGhpcyx0aGlzLmlzVmlzaWJsZSgpKTt0aGlzLkQmLTImJih0aGlzLkhhJiZMYyh0aGlzLCEwKSx0aGlzLkQmMzImJihhPXRoaXMuaSgpKSkmJihiPQp0aGlzLlp8fCh0aGlzLlo9bmV3IEopLGdjKGIsYSksQihCKEIoUWIodGhpcyksYiwia2V5Iix0aGlzLmFhKSxhLCJmb2N1cyIsdGhpcy5YYSksYSwiYmx1ciIsdGhpcy5RYSkpfTt2YXIgTGM9ZnVuY3Rpb24oYSxiKXt2YXIgYz1RYihhKSxkPWEuaSgpO2I/KEIoQihCKEIoYyxkLEsuZ2EsYS5zYSksZCxbSy5oYSxLLmZhXSxhLnZhKSxkLCJtb3VzZW92ZXIiLGEudWEpLGQsIm1vdXNlb3V0IixhLnRhKSxhLmNhIT1CYyYmQihjLGQsImNvbnRleHRtZW51IixhLmNhKSk6KEMoQyhDKEMoYyxkLEsuZ2EsYS5zYSksZCxbSy5oYSxLLmZhXSxhLnZhKSxkLCJtb3VzZW92ZXIiLGEudWEpLGQsIm1vdXNlb3V0IixhLnRhKSxhLmNhIT1CYyYmQyhjLGQsImNvbnRleHRtZW51IixhLmNhKSl9O04ucHJvdG90eXBlLlU9ZnVuY3Rpb24oKXtOLmwuVS5jYWxsKHRoaXMpO3RoaXMuWiYma2ModGhpcy5aKTt0aGlzLmlzVmlzaWJsZSgpJiZ0aGlzLmlzRW5hYmxlZCgpJiZJYyh0aGlzLCExKX07Ck4ucHJvdG90eXBlLkM9ZnVuY3Rpb24oKXtOLmwuQy5jYWxsKHRoaXMpO3RoaXMuWiYmKHRoaXMuWi5kaXNwb3NlKCksZGVsZXRlIHRoaXMuWik7ZGVsZXRlIHRoaXMudjt0aGlzLkZhPXRoaXMuaWE9bnVsbH07dmFyIEZjPWZ1bmN0aW9uKGEsYil7YS5pYT1ifTtOLnByb3RvdHlwZS5pc1Zpc2libGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5PYX07Ti5wcm90b3R5cGUuaXNFbmFibGVkPWZ1bmN0aW9uKCl7cmV0dXJuISh0aGlzLm0mMSl9O04ucHJvdG90eXBlLlg9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5oO2ImJnR5cGVvZiBiLmlzRW5hYmxlZD09ImZ1bmN0aW9uIiYmIWIuaXNFbmFibGVkKCl8fCFPKHRoaXMsMSwhYSl8fChhfHwoTWModGhpcywhMSksUCh0aGlzLCExKSksdGhpcy5pc1Zpc2libGUoKSYmSWModGhpcyxhKSxUKHRoaXMsMSwhYSwhMCkpfTt2YXIgUD1mdW5jdGlvbihhLGIpe08oYSwyLGIpJiZUKGEsMixiKX07Ck4ucHJvdG90eXBlLmlzQWN0aXZlPWZ1bmN0aW9uKCl7cmV0dXJuISEodGhpcy5tJjQpfTsKdmFyIE1jPWZ1bmN0aW9uKGEsYil7TyhhLDQsYikmJlQoYSw0LGIpfSxOYz1mdW5jdGlvbihhLGIpe08oYSw4LGIpJiZUKGEsOCxiKX0sT2M9ZnVuY3Rpb24oYSxiKXtPKGEsNjQsYikmJlQoYSw2NCxiKX0sVD1mdW5jdGlvbihhLGIsYyxkKXtpZighZCYmYj09MSlhLlgoIWMpO2Vsc2UgaWYoYS5EJmImJmMhPSEhKGEubSZiKSl7dmFyIGU9YS52O2lmKGQ9YS5pKCkpe2lmKGU9RWMoZSxiKSl7dmFyIGY9YS5pP2EuaSgpOmE7ZiYmKGM/cGM6cmMpKGYsW2VdKX1KYyhkLGIsYyl9YS5tPWM/YS5tfGI6YS5tJn5ifX0sUGM9ZnVuY3Rpb24oYSxiLGMpe2lmKGEucyYmYS5tJmImJiFjKXRocm93IEVycm9yKCJDb21wb25lbnQgYWxyZWFkeSByZW5kZXJlZCIpOyFjJiZhLm0mYiYmVChhLGIsITEpO2EuRD1jP2EuRHxiOmEuRCZ+Yn0sVT1mdW5jdGlvbihhLGIpe3JldHVybiEhKDI1NSZiKSYmISEoYS5EJmIpfSxPPWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4hIShhLkQmYikmJiEhKGEubSZiKSE9CmMmJighKGEuUCZiKXx8RShhLE5iKGIsYykpKSYmIWEuYmF9O04ucHJvdG90eXBlLnVhPWZ1bmN0aW9uKGEpeyFRYyhhLHRoaXMuaSgpKSYmRSh0aGlzLCJlbnRlciIpJiZ0aGlzLmlzRW5hYmxlZCgpJiZVKHRoaXMsMikmJlAodGhpcywhMCl9O04ucHJvdG90eXBlLnRhPWZ1bmN0aW9uKGEpeyFRYyhhLHRoaXMuaSgpKSYmRSh0aGlzLCJsZWF2ZSIpJiYoVSh0aGlzLDQpJiZNYyh0aGlzLCExKSxVKHRoaXMsMikmJlAodGhpcywhMSkpfTtOLnByb3RvdHlwZS5jYT1CYzt2YXIgUWM9ZnVuY3Rpb24oYSxiKXtyZXR1cm4hIWEucmVsYXRlZFRhcmdldCYmYWIoYixhLnJlbGF0ZWRUYXJnZXQpfTsKTi5wcm90b3R5cGUuc2E9ZnVuY3Rpb24oYSl7aWYodGhpcy5pc0VuYWJsZWQoKSYmKFUodGhpcywyKSYmUCh0aGlzLCEwKSwhKGEuaC5idXR0b24hPTB8fHYmJmEuY3RybEtleSkpKXtVKHRoaXMsNCkmJk1jKHRoaXMsITApO3ZhciBiO2lmKGI9dGhpcy52KXt2YXIgYztiPXRoaXMuRCYzMiYmKGM9dGhpcy5pKCkpP2RiKGMpJiZlYihjKTohMX1iJiZ0aGlzLmkoKS5mb2N1cygpfWEuaC5idXR0b24hPTB8fHYmJmEuY3RybEtleXx8YS5qKCl9O04ucHJvdG90eXBlLnZhPWZ1bmN0aW9uKGEpe3RoaXMuaXNFbmFibGVkKCkmJihVKHRoaXMsMikmJlAodGhpcywhMCksdGhpcy5pc0FjdGl2ZSgpJiZSYyh0aGlzLGEpJiZVKHRoaXMsNCkmJk1jKHRoaXMsITEpKX07CnZhciBSYz1mdW5jdGlvbihhLGIpe2lmKFUoYSwxNikpe3ZhciBjPSEoYS5tJjE2KTtPKGEsMTYsYykmJlQoYSwxNixjKX1VKGEsOCkmJk5jKGEsITApO1UoYSw2NCkmJk9jKGEsIShhLm0mNjQpKTtjPW5ldyB5KCJhY3Rpb24iLGEpO2ImJihjLmFsdEtleT1iLmFsdEtleSxjLmN0cmxLZXk9Yi5jdHJsS2V5LGMubWV0YUtleT1iLm1ldGFLZXksYy5zaGlmdEtleT1iLnNoaWZ0S2V5LGMuRz1iLkcsYy50aW1lU3RhbXA9Yi50aW1lU3RhbXApO3JldHVybiBFKGEsYyl9O04ucHJvdG90eXBlLlhhPWZ1bmN0aW9uKCl7VSh0aGlzLDMyKSYmTyh0aGlzLDMyLCEwKSYmVCh0aGlzLDMyLCEwKX07Ti5wcm90b3R5cGUuUWE9ZnVuY3Rpb24oKXtVKHRoaXMsNCkmJk1jKHRoaXMsITEpO1UodGhpcywzMikmJk8odGhpcywzMiwhMSkmJlQodGhpcywzMiwhMSl9OwpOLnByb3RvdHlwZS5hYT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5pc1Zpc2libGUoKSYmdGhpcy5pc0VuYWJsZWQoKSYmYS5nPT0xMyYmUmModGhpcyxhKT8oYS5qKCksYS52KCksITApOiExfTtpZih0eXBlb2YgTiE9PSJmdW5jdGlvbiIpdGhyb3cgRXJyb3IoIkludmFsaWQgY29tcG9uZW50IGNsYXNzICIrTik7aWYodHlwZW9mIE0hPT0iZnVuY3Rpb24iKXRocm93IEVycm9yKCJJbnZhbGlkIHJlbmRlcmVyIGNsYXNzICIrTSk7dmFyIFNjPW5hKE4pO3VjW1NjXT1NO3RjKCJnb29nLWNvbnRyb2wiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBOKG51bGwpfSk7dmFyIFY9ZnVuY3Rpb24oYSxiLGMpe0YuY2FsbCh0aGlzLGMpO3RoaXMuZWE9Ynx8dmMuVigpO3RoaXMuTD1hfHwidmVydGljYWwifTtuKFYsRik7Zz1WLnByb3RvdHlwZTtnLkthPW51bGw7Zy5kYT1udWxsO2cuZWE9bnVsbDtnLkw9bnVsbDtnLlM9ITA7Zy5UPSEwO2cubz0tMTtnLkI9bnVsbDtnLlc9ITE7Zy5PPW51bGw7dmFyIFRjPWZ1bmN0aW9uKGEpe3JldHVybiBhLkthfHxhLmkoKX07Zz1WLnByb3RvdHlwZTtnLm1hPWZ1bmN0aW9uKCl7dGhpcy5nPXRoaXMuRy5oKCJESVYiLHRoaXMuZWEuaih0aGlzKS5qb2luKCIgIikpfTtnLm5hPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaSgpfTtnLndhPWZ1bmN0aW9uKGEpe3JldHVybiBhLnRhZ05hbWU9PSJESVYifTtnLkVhPWZ1bmN0aW9uKGEpe3RoaXMuZz15Yyh0aGlzLmVhLHRoaXMsYSk7YS5zdHlsZS5kaXNwbGF5PT0ibm9uZSImJih0aGlzLlM9ITEpfTsKZy5JPWZ1bmN0aW9uKCl7Vi5sLkkuY2FsbCh0aGlzKTtUYih0aGlzLGZ1bmN0aW9uKGIpe2IucyYmVWModGhpcyxiKX0sdGhpcyk7dmFyIGE9dGhpcy5pKCk7QWModGhpcy5lYSx0aGlzKTtWYyh0aGlzLHRoaXMuUyk7QihCKEIoQihCKEIoQihCKFFiKHRoaXMpLHRoaXMsImVudGVyIix0aGlzLmViKSx0aGlzLCJoaWdobGlnaHQiLHRoaXMuZmIpLHRoaXMsInVuaGlnaGxpZ2h0Iix0aGlzLmxiKSx0aGlzLCJvcGVuIix0aGlzLmdiKSx0aGlzLCJjbG9zZSIsdGhpcy5iYiksYSxLLmdhLHRoaXMuV2EpLGJiKGEpLFtLLmhhLEsuZmFdLHRoaXMuY2IpLGEsW0suZ2EsSy5oYSxLLmZhLCJtb3VzZW92ZXIiLCJtb3VzZW91dCIsImNvbnRleHRtZW51Il0sdGhpcy5hYik7V2ModGhpcyl9O3ZhciBXYz1mdW5jdGlvbihhKXt2YXIgYj1RYihhKSxjPVRjKGEpO0IoQihCKGIsYywiZm9jdXMiLGEuUGEpLGMsImJsdXIiLGEuVWEpLGEuZGF8fChhLmRhPW5ldyBKKFRjKGEpKSksImtleSIsYS5WYSl9OwpnPVYucHJvdG90eXBlO2cuVT1mdW5jdGlvbigpe1hjKHRoaXMsLTEpO3RoaXMuQiYmT2ModGhpcy5CLCExKTt0aGlzLlc9ITE7Vi5sLlUuY2FsbCh0aGlzKX07Zy5DPWZ1bmN0aW9uKCl7Vi5sLkMuY2FsbCh0aGlzKTt0aGlzLmRhJiYodGhpcy5kYS5kaXNwb3NlKCksdGhpcy5kYT1udWxsKTt0aGlzLmVhPXRoaXMuQj10aGlzLk89dGhpcy5LYT1udWxsfTtnLmViPWZ1bmN0aW9uKCl7cmV0dXJuITB9OwpnLmZiPWZ1bmN0aW9uKGEpe3ZhciBiPVZiKHRoaXMsYS50YXJnZXQpO2lmKGI+LTEmJmIhPXRoaXMubyl7dmFyIGM9SSh0aGlzLHRoaXMubyk7YyYmUChjLCExKTt0aGlzLm89YjtjPUkodGhpcyx0aGlzLm8pO3RoaXMuVyYmTWMoYywhMCk7dGhpcy5CJiZjIT10aGlzLkImJihjLkQmNjQ/T2MoYywhMCk6T2ModGhpcy5CLCExKSl9Yj10aGlzLmkoKTtwKGIsIlRoZSBET00gZWxlbWVudCBmb3IgdGhlIGNvbnRhaW5lciBjYW5ub3QgYmUgbnVsbC4iKTthLnRhcmdldC5pKCkhPW51bGwmJmFjKGIsImFjdGl2ZWRlc2NlbmRhbnQiLGEudGFyZ2V0LmkoKS5pZCl9O2cubGI9ZnVuY3Rpb24oYSl7YS50YXJnZXQ9PUkodGhpcyx0aGlzLm8pJiYodGhpcy5vPS0xKTthPXRoaXMuaSgpO3AoYSwiVGhlIERPTSBlbGVtZW50IGZvciB0aGUgY29udGFpbmVyIGNhbm5vdCBiZSBudWxsLiIpO2EucmVtb3ZlQXR0cmlidXRlKCRiKCJhY3RpdmVkZXNjZW5kYW50IikpfTsKZy5nYj1mdW5jdGlvbihhKXsoYT1hLnRhcmdldCkmJmEhPXRoaXMuQiYmYS5oPT10aGlzJiYodGhpcy5CJiZPYyh0aGlzLkIsITEpLHRoaXMuQj1hKX07Zy5iYj1mdW5jdGlvbihhKXthLnRhcmdldD09dGhpcy5CJiYodGhpcy5CPW51bGwpO3ZhciBiPXRoaXMuaSgpLGM9YS50YXJnZXQuaSgpO2ImJmEudGFyZ2V0Lm0mMiYmYyYmKGE9IiIsYyYmKGE9Yy5pZCxwKGEsIlRoZSBhY3RpdmUgZWxlbWVudCBzaG91bGQgaGF2ZSBhbiBpZC4iKSksYWMoYiwiYWN0aXZlZGVzY2VuZGFudCIsYSkpfTtnLldhPWZ1bmN0aW9uKGEpe3RoaXMuVCYmKHRoaXMuVz0hMCk7dmFyIGI9VGModGhpcyk7YiYmZGIoYikmJmViKGIpP2IuZm9jdXMoKTphLmooKX07Zy5jYj1mdW5jdGlvbigpe3RoaXMuVz0hMX07CmcuYWI9ZnVuY3Rpb24oYSl7YTp7dmFyIGI9YS50YXJnZXQ7aWYodGhpcy5PKWZvcih2YXIgYz10aGlzLmkoKTtiJiZiIT09Yzspe3ZhciBkPWIuaWQ7aWYoZCBpbiB0aGlzLk8pe2I9dGhpcy5PW2RdO2JyZWFrIGF9Yj1iLnBhcmVudE5vZGV9Yj1udWxsfWlmKGIpc3dpdGNoKGEudHlwZSl7Y2FzZSBLLmdhOmIuc2EoYSk7YnJlYWs7Y2FzZSBLLmhhOmNhc2UgSy5mYTpiLnZhKGEpO2JyZWFrO2Nhc2UgIm1vdXNlb3ZlciI6Yi51YShhKTticmVhaztjYXNlICJtb3VzZW91dCI6Yi50YShhKTticmVhaztjYXNlICJjb250ZXh0bWVudSI6Yi5jYShhKX19O2cuUGE9ZnVuY3Rpb24oKXt9O2cuVWE9ZnVuY3Rpb24oKXtYYyh0aGlzLC0xKTt0aGlzLlc9ITE7dGhpcy5CJiZPYyh0aGlzLkIsITEpfTsKZy5WYT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5pc0VuYWJsZWQoKSYmdGhpcy5pc1Zpc2libGUoKSYmKEgodGhpcykhPTB8fHRoaXMuS2EpJiZZYyh0aGlzLGEpPyhhLmooKSxhLnYoKSwhMCk6ITF9Owp2YXIgWWM9ZnVuY3Rpb24oYSxiKXt2YXIgYz1JKGEsYS5vKTtpZihjJiZ0eXBlb2YgYy5hYT09ImZ1bmN0aW9uIiYmYy5hYShiKXx8YS5CJiZhLkIhPWMmJnR5cGVvZiBhLkIuYWE9PSJmdW5jdGlvbiImJmEuQi5hYShiKSlyZXR1cm4hMDtpZihiLnNoaWZ0S2V5fHxiLmN0cmxLZXl8fGIubWV0YUtleXx8Yi5hbHRLZXkpcmV0dXJuITE7c3dpdGNoKGIuZyl7Y2FzZSAyNzpUYyhhKS5ibHVyKCk7YnJlYWs7Y2FzZSAzNjpaYyhhKTticmVhaztjYXNlIDM1OiRjKGEpO2JyZWFrO2Nhc2UgMzg6aWYoYS5MPT0idmVydGljYWwiKWFkKGEpO2Vsc2UgcmV0dXJuITE7YnJlYWs7Y2FzZSAzNzppZihhLkw9PSJob3Jpem9udGFsIilVYihhKT9iZChhKTphZChhKTtlbHNlIHJldHVybiExO2JyZWFrO2Nhc2UgNDA6aWYoYS5MPT0idmVydGljYWwiKWJkKGEpO2Vsc2UgcmV0dXJuITE7YnJlYWs7Y2FzZSAzOTppZihhLkw9PSJob3Jpem9udGFsIilVYihhKT9hZChhKTpiZChhKTtlbHNlIHJldHVybiExOwpicmVhaztkZWZhdWx0OnJldHVybiExfXJldHVybiEwfSxVYz1mdW5jdGlvbihhLGIpe3ZhciBjPWIuaSgpO2M9Yy5pZHx8KGMuaWQ9T2IoYikpO2EuT3x8KGEuTz17fSk7YS5PW2NdPWJ9O1YucHJvdG90eXBlLkJhPWZ1bmN0aW9uKGEsYil7dWEoYSxOLCJUaGUgY2hpbGQgb2YgYSBjb250YWluZXIgbXVzdCBiZSBhIGNvbnRyb2wiKTtWLmwuQmEuY2FsbCh0aGlzLGEsYil9O1YucHJvdG90eXBlLkNhPWZ1bmN0aW9uKGEsYixjKXt1YShhLE4pO2EuUHw9MjthLlB8PTY0O1BjKGEsMzIsITEpO2EucyYmMCE9YS5IYSYmTGMoYSwhMSk7YS5IYT0hMTt2YXIgZD1hLmg9PXRoaXM/VmIodGhpcyxhKTotMTtWLmwuQ2EuY2FsbCh0aGlzLGEsYixjKTthLnMmJnRoaXMucyYmVWModGhpcyxhKTthPWQ7YT09LTEmJihhPUgodGhpcykpO2E9PXRoaXMubz90aGlzLm89TWF0aC5taW4oSCh0aGlzKS0xLGIpOmE+dGhpcy5vJiZiPD10aGlzLm8/dGhpcy5vKys6YTx0aGlzLm8mJmI+dGhpcy5vJiZ0aGlzLm8tLX07CnZhciB6Yz1mdW5jdGlvbihhLGIpe2lmKGEuaSgpKXRocm93IEVycm9yKCJDb21wb25lbnQgYWxyZWFkeSByZW5kZXJlZCIpO2EuTD1ifTtWLnByb3RvdHlwZS5pc1Zpc2libGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5TfTt2YXIgVmM9ZnVuY3Rpb24oYSxiKXthLlM9Yjt2YXIgYz1hLmkoKTtjJiYoYy5zdHlsZS5kaXNwbGF5PWI/IiI6Im5vbmUiLHdjKFRjKGEpLGEuVCYmYS5TKSl9O1YucHJvdG90eXBlLmlzRW5hYmxlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLlR9O1YucHJvdG90eXBlLlg9ZnVuY3Rpb24oYSl7dGhpcy5UIT1hJiZFKHRoaXMsYT8iZW5hYmxlIjoiZGlzYWJsZSIpJiYoYT8odGhpcy5UPSEwLFRiKHRoaXMsZnVuY3Rpb24oYil7Yi5UYT9kZWxldGUgYi5UYTpiLlgoITApfSkpOihUYih0aGlzLGZ1bmN0aW9uKGIpe2IuaXNFbmFibGVkKCk/Yi5YKCExKTpiLlRhPSEwfSksdGhpcy5XPXRoaXMuVD0hMSksd2MoVGModGhpcyksYSYmdGhpcy5TKSl9Owp2YXIgWGM9ZnVuY3Rpb24oYSxiKXsoYj1JKGEsYikpP1AoYiwhMCk6YS5vPi0xJiZQKEkoYSxhLm8pLCExKX0sWmM9ZnVuY3Rpb24oYSl7Y2QoYSxmdW5jdGlvbihiLGMpe3JldHVybihiKzEpJWN9LEgoYSktMSl9LCRjPWZ1bmN0aW9uKGEpe2NkKGEsZnVuY3Rpb24oYixjKXtiLS07cmV0dXJuIGI8MD9jLTE6Yn0sMCl9LGJkPWZ1bmN0aW9uKGEpe2NkKGEsZnVuY3Rpb24oYixjKXtyZXR1cm4oYisxKSVjfSxhLm8pfSxhZD1mdW5jdGlvbihhKXtjZChhLGZ1bmN0aW9uKGIsYyl7Yi0tO3JldHVybiBiPDA/Yy0xOmJ9LGEubyl9LGNkPWZ1bmN0aW9uKGEsYixjKXtjPWM8MD9WYihhLGEuQik6Yzt2YXIgZD1IKGEpO2M9Yi5jYWxsKGEsYyxkKTtmb3IodmFyIGU9MDtlPD1kOyl7dmFyIGY9SShhLGMpO2lmKGYmJmYuaXNWaXNpYmxlKCkmJmYuaXNFbmFibGVkKCkmJmYuRCYyKXthLkxhKGMpO2JyZWFrfWUrKztjPWIuY2FsbChhLGMsZCl9fTsKVi5wcm90b3R5cGUuTGE9ZnVuY3Rpb24oYSl7WGModGhpcyxhKX07dmFyIGRkPWZ1bmN0aW9uKCl7fTtuKGRkLE0pO2lhKGRkKTtnPWRkLnByb3RvdHlwZTtnLk49ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy10YWIifTtnLk5hPWZ1bmN0aW9uKCl7cmV0dXJuInRhYiJ9O2cueGE9ZnVuY3Rpb24oYSl7dmFyIGI9ZGQubC54YS5jYWxsKHRoaXMsYSk7KGE9YS5HYSgpKSYmdGhpcy5NYShiLGEpO3JldHVybiBifTtnLnlhPWZ1bmN0aW9uKGEsYil7Yj1kZC5sLnlhLmNhbGwodGhpcyxhLGIpO3ZhciBjPXRoaXMuR2EoYik7YyYmKGEuUmE9Yyk7YS5tJjgmJihjPWEuaCkmJnR5cGVvZiBjLko9PT0iZnVuY3Rpb24iJiYoVChhLDgsITEpLGMuSihhKSk7cmV0dXJuIGJ9O2cuR2E9ZnVuY3Rpb24oYSl7cmV0dXJuIGEudGl0bGV8fCIifTtnLk1hPWZ1bmN0aW9uKGEsYil7YSYmKGEudGl0bGU9Ynx8IiIpfTt2YXIgZWQ9ZnVuY3Rpb24oYSxiLGMpe04uY2FsbCh0aGlzLGEsYnx8ZGQuVigpLGMpO1BjKHRoaXMsOCwhMCk7dGhpcy5QfD05fTtuKGVkLE4pO2VkLnByb3RvdHlwZS5HYT1mdW5jdGlvbigpe3JldHVybiB0aGlzLlJhfTtlZC5wcm90b3R5cGUuTWE9ZnVuY3Rpb24oYSl7dGhpcy52Lk1hKHRoaXMuaSgpLGEpO3RoaXMuUmE9YX07dGMoImdvb2ctdGFiIixmdW5jdGlvbigpe3JldHVybiBuZXcgZWQobnVsbCl9KTt2YXIgVz1mdW5jdGlvbigpe3RoaXMuQT0idGFibGlzdCJ9O24oVyx2Yyk7aWEoVyk7Vy5wcm90b3R5cGUuZz1mdW5jdGlvbigpe3JldHVybiJnb29nLXRhYi1iYXIifTtXLnByb3RvdHlwZS51PWZ1bmN0aW9uKGEsYixjKXt0aGlzLnZ8fCh0aGlzLmh8fGZkKHRoaXMpLHRoaXMudj1FYSh0aGlzLmgpKTt2YXIgZD10aGlzLnZbYl07ZD8oemMoYSxnZChkKSksYS52PWQpOlcubC51LmNhbGwodGhpcyxhLGIsYyl9O1cucHJvdG90eXBlLmo9ZnVuY3Rpb24oYSl7dmFyIGI9Vy5sLmouY2FsbCh0aGlzLGEpO3RoaXMuaHx8ZmQodGhpcyk7Yi5wdXNoKHRoaXMuaFthLnZdKTtyZXR1cm4gYn07dmFyIGZkPWZ1bmN0aW9uKGEpe3ZhciBiPWEuZygpO2EuaD17dG9wOmIrIi10b3AiLGJvdHRvbTpiKyItYm90dG9tIixzdGFydDpiKyItc3RhcnQiLGVuZDpiKyItZW5kIn19O3ZhciBYPWZ1bmN0aW9uKGEsYixjKXthPWF8fCJ0b3AiO3pjKHRoaXMsZ2QoYSkpO3RoaXMudj1hO1YuY2FsbCh0aGlzLHRoaXMuTCxifHxXLlYoKSxjKTtoZCh0aGlzKX07bihYLFYpO2c9WC5wcm90b3R5cGU7Zy5IPW51bGw7Zy5JPWZ1bmN0aW9uKCl7WC5sLkkuY2FsbCh0aGlzKTtoZCh0aGlzKX07Zy5DPWZ1bmN0aW9uKCl7WC5sLkMuY2FsbCh0aGlzKTt0aGlzLkg9bnVsbH07Zy5MYT1mdW5jdGlvbihhKXtYLmwuTGEuY2FsbCh0aGlzLGEpO3RoaXMuSihJKHRoaXMsYSkpfTtnLko9ZnVuY3Rpb24oYSl7YT9OYyhhLCEwKTp0aGlzLkgmJk5jKHRoaXMuSCwhMSl9Owp2YXIgaWQ9ZnVuY3Rpb24oYSxiKXtpZihiJiZiPT1hLkgpe2Zvcih2YXIgYz1WYihhLGIpLGQ9Yy0xO2I9SShhLGQpO2QtLSl7dmFyIGU9YjtpZihlLmlzVmlzaWJsZSgpJiZlLmlzRW5hYmxlZCgpKXthLkooYik7cmV0dXJufX1mb3IoYys9MTtiPUkoYSxjKTtjKyspaWYoZD1iLGQuaXNWaXNpYmxlKCkmJmQuaXNFbmFibGVkKCkpe2EuSihiKTtyZXR1cm59YS5KKG51bGwpfX07Zz1YLnByb3RvdHlwZTtnLmpiPWZ1bmN0aW9uKGEpe3RoaXMuSCYmdGhpcy5IIT1hLnRhcmdldCYmTmModGhpcy5ILCExKTt0aGlzLkg9YS50YXJnZXR9O2cua2I9ZnVuY3Rpb24oYSl7YS50YXJnZXQ9PXRoaXMuSCYmKHRoaXMuSD1udWxsKX07Zy5oYj1mdW5jdGlvbihhKXtpZCh0aGlzLGEudGFyZ2V0KX07Zy5pYj1mdW5jdGlvbihhKXtpZCh0aGlzLGEudGFyZ2V0KX07Zy5QYT1mdW5jdGlvbigpe0kodGhpcyx0aGlzLm8pfHxYYyh0aGlzLFZiKHRoaXMsdGhpcy5IfHxJKHRoaXMsMCkpKX07CnZhciBoZD1mdW5jdGlvbihhKXtCKEIoQihCKFFiKGEpLGEsInNlbGVjdCIsYS5qYiksYSwidW5zZWxlY3QiLGEua2IpLGEsImRpc2FibGUiLGEuaGIpLGEsImhpZGUiLGEuaWIpfSxnZD1mdW5jdGlvbihhKXtyZXR1cm4gYT09InN0YXJ0Inx8YT09ImVuZCI/InZlcnRpY2FsIjoiaG9yaXpvbnRhbCJ9O3RjKCJnb29nLXRhYi1iYXIiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBYfSk7ZnVuY3Rpb24gamQoYSl7dmFyIGI9e3RvcDoiYm90dG9tIixib3R0b206InRvcCIsc3RhcnQ6InJpZ2h0IixlbmQ6ImxlZnQifVthLmxvY2F0aW9uXSxjPWEuZWxlbWVudElkLGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTtkLnRleHRDb250ZW50PSJcbiAgICBmaWVsZHNldCB7XG4gICAgICBwYWRkaW5nOiAxMHB4O1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgIzM2OTtcbiAgICB9XG5cbiAgICAjIitjKyIgLmdvb2ctdGFiLWNvbnRlbnQge1xuICAgICAgbWluLWhlaWdodDogM2VtO1xuICAgICAgbWFyZ2luOiAwO1xuICAgICAgYm9yZGVyOiAiK2EuYm9yZGVyKyIgc29saWQgIithLmJvcmRlckNvbG9yKyI7XG4gICAgICBib3JkZXItdG9wOiAwO1xuICAgICAgaGVpZ2h0OiAiK2EuY29udGVudEhlaWdodCsiO1xuICAgICAgcGFkZGluZzogNHB4IDhweDtcbiAgICAgIG1hcmdpbi1yaWdodDogNHB4O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgIG92ZXJmbG93OiBhdXRvO1xuICAgIH1cblxuICAgICMiKwpjKyIgLmdvb2ctdGFiLWJhci0iK2EubG9jYXRpb24rIiAuZ29vZy10YWItc2VsZWN0ZWQge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICIrYS5ib3JkZXJDb2xvcisiO1xuICAgICAgYm9yZGVyLSIrYisiOiAwcHg7XG4gICAgfVxuXG4gICAgIyIrYysiIC5nb29nLXRhYi1iYXItIithLmxvY2F0aW9uKyIge1xuICAgICAgcGFkZGluZy0iK2EubG9jYXRpb24rIjogNXB4ICFpbXBvcnRhbnQ7XG4gICAgICBib3JkZXItIitiKyI6IDFweCBzb2xpZCAiK2EuYm9yZGVyQ29sb3IrIiAhaW1wb3J0YW50O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICB9XG5cbiAgICAjIitjKyIgLmdvb2ctdGFiLWJhciB7XG4gICAgICAgbWFyZ2luOiAwO1xuICAgICAgIGJvcmRlcjogMDtcbiAgICAgICBwYWRkaW5nOiAwO1xuICAgICAgIGxpc3Qtc3R5bGU6IG5vbmU7XG4gICAgICAgY3Vyc29yOiBkZWZhdWx0O1xuICAgICAgIG91dGxpbmU6IG5vbmU7XG4gICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgICBtYXJnaW4tcmlnaHQ6IDRweDtcbiAgICAgIH1cblxuICAgICAjIisKYysiIC5nb29nLXRhYiB7XG4gICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgIHBhZGRpbmc6IDRweCA4cHg7XG4gICAgICAgY29sb3I6IHZhcigtLWNvbGFiLXByaW1hcnktdGV4dC1jb2xvcik7XG4gICAgICAgdGV4dC1kZWNvcmF0aW9uOiBpbml0aWFsO1xuICAgICAgIGN1cnNvcjogZGVmYXVsdDtcbiAgICAgIH1cblxuICAgICAgIyIrYysiIC5nb29nLXRhYi1ob3ZlciB7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWNvbGFiLWhpZ2hsaWdodGVkLXN1cmZhY2UtY29sb3IpO1xuICAgICAgfVxuICAgICAgIjtyZXR1cm4gZH0KdmFyIGtkPWZ1bmN0aW9uKGEpe3ZhciBiPWEuZWxlbWVudElkLGM9YS50YWJOYW1lcyxkPWEuc2VsZWN0ZWRJbmRleDsiY29udGVudEJvcmRlciJpbiBhfHwoYS5jb250ZW50Qm9yZGVyPSIwcHgiKTsiY29udGVudEhlaWdodCJpbiBhfHwoYS5jb250ZW50SGVpZ2h0PSJpbml0aWFsIik7ImJvcmRlckNvbG9yImluIGF8fChhLmJvcmRlckNvbG9yPSJ2YXIoLS1jb2xhYi1ib3JkZXItY29sb3IpIik7YS5sb2NhdGlvbnx8KGEubG9jYXRpb249InRvcCIpO3ZhciBlPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiMiK2IpLGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zi5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYi1iYXIiKTt2YXIgaD1hLmxvY2F0aW9uO2YuY2xhc3NMaXN0LmFkZCgiZ29vZy10YWItYmFyLSIraCk7Zm9yKHZhciBrPVtdLHE9ZmEoYyksRz1xLm5leHQoKTshRy5kb25lO0c9cS5uZXh0KCkpe0c9Ry52YWx1ZTt2YXIgeD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKeC5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYiIpO3gudGV4dENvbnRlbnQ9RztmLmFwcGVuZENoaWxkKHgpO2sucHVzaCh4KX1oIT0iYm90dG9tIiYmZS5hcHBlbmRDaGlsZChmKTtxPW51bGw7aWYoaD09InRvcCJ8fGg9PSJib3R0b20iKXE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikscS5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYi1iYXItY2xlYXIiKTtoPT0idG9wIiYmcSYmZS5hcHBlbmRDaGlsZChxKTtHPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO0cuY2xhc3NMaXN0LmFkZCgiZ29vZy10YWItY29udGVudCIpO3ZhciBoYT1bXTtjPWZhKGMpO2Zvcih4PWMubmV4dCgpOyF4LmRvbmU7eD1jLm5leHQoKSl4PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHguaWQ9ZS5pZCsiX2NvbnRlbnRfIitoYS5sZW5ndGgseC5zdHlsZS5kaXNwbGF5PSJub25lIixHLmFwcGVuZENoaWxkKHgpLGhhLnB1c2goeCk7ZS5hcHBlbmRDaGlsZChHKTtoPT0iYm90dG9tIiYmKHEmJgplLmFwcGVuZENoaWxkKHEpLGUuYXBwZW5kQ2hpbGQoZikpO3ZhciBRPW5ldyBYKGgpO1NiKFEsZik7dmFyIFI9LTE7d2IoUSwic2VsZWN0IixmdW5jdGlvbihTKXtTPWsuaW5kZXhPZihTLnRhcmdldC5pKCkpO1MhPVImJihSPj0wJiZSPGhhLmxlbmd0aCYmKGhhW1JdLnN0eWxlLmRpc3BsYXk9Im5vbmUiLFI9LTEpLFM+PTAmJlM8aGEubGVuZ3RoJiYoUj1TLGhhW1JdLnN0eWxlLmRpc3BsYXk9ImlubGluZSIsd2luZG93LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCJyZXNpemUiKSksZ29vZ2xlLmNvbGFiLm91dHB1dC5yZXNpemVJZnJhbWVUb0NvbnRlbnQoKSksUS5KKEkoUSxSKSkpfSk7US5KKEkoUSxkKSk7d2luZG93W2JdPXtzZXRTZWxlY3RlZFRhYkluZGV4OmZ1bmN0aW9uKFMpe1EuSihJKFEsUykpfX07ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChqZChhKSl9LGxkPVsiY29sYWJfbGliIiwiY3JlYXRlVGFiQmFyIl0sWT1sOwpsZFswXWluIFl8fHR5cGVvZiBZLmV4ZWNTY3JpcHQ9PSJ1bmRlZmluZWQifHxZLmV4ZWNTY3JpcHQoInZhciAiK2xkWzBdKTtmb3IodmFyIFo7bGQubGVuZ3RoJiYoWj1sZC5zaGlmdCgpKTspbGQubGVuZ3RofHxrZD09PXZvaWQgMD9ZW1pdJiZZW1pdIT09T2JqZWN0LnByb3RvdHlwZVtaXT9ZPVlbWl06WT1ZW1pdPXt9OllbWl09a2Q7fSkuY2FsbCh0aGlzKTsKLy8gY2xhbmctZm9ybWF0IG9uCg==", + "ok": true, + "headers": [ + [ + "content-length", + "41785" + ], + [ + "content-type", + "application/javascript" + ] + ], + "status": 200, + "status_text": "" + } + }, + "base_uri": "https://localhost:8080/", + "height": 323 + }, + "outputId": "d4ef8b86-98fa-4d8d-c036-ba8f979a56de" + }, + "source": [ + "%%logica EmployeeLocation\n", + "\n", + "Employee(name: \"Alice\", role: \"Product Manager\", office: \"SEA\");\n", + "Employee(name: \"Bob\", role: \"Engineer\", office: \"SEA\");\n", + "Employee(name: \"Caroline\", role: \"Engineer\", office: \"LAX\");\n", + "Employee(name: \"David\", role: \"Data Scientist\", office: \"LAX\");\n", + "Employee(name: \"Eve\", role: \"Data Scientist\", office: \"SEA\");\n", + "\n", + "OfficeLocation(office: \"SEA\", city: \"Seattle\");\n", + "OfficeLocation(office: \"LAX\", city: \"Los Angeles\");\n", + "\n", + "Role(name: \"PM\", area: \"Product\");\n", + "Role(name: \"Eng\", area: \"Software\");\n", + "Role(name: \"AMT\", area: \"Statitics\");\n", + "\n", + "EmployeeLocation(employee: name, city:) :-\n", + " Employee(name:, office:),\n", + " OfficeLocation(office:, city:);\n", + "\n" + ], + "execution_count": 14, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"ef77daaa-d22c-11ef-a7c0-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id22\", \"tabNames\": [\"EmployeeLocation\", \"(Log)\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_a77cfdd4f1" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"ef783a0e-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id22\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_8ff6ed6200" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"ef7a001e-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_99c2dc3b96" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"ef7a7904-d22c-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id22_content_1\");\n", + "//# sourceURL=js_6afebdf0f5" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"ef7b07ca-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"ef7a7904-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_5ea219a19e" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"ef7b59d2-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id22\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_d66ddd4852" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"ef7ee6d8-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"ef7a001e-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_bc5a9464cf" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"ef8107c4-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_9bd9655ad4" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"ef81821c-d22c-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id22_content_0\");\n", + "//# sourceURL=js_4a67efc679" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"ef81f922-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"ef81821c-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_b8ed5cc9f6" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"ef826dd0-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id22\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_0ec4b0add1" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"ef84b612-d22c-11ef-a7c0-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id23\", \"tabNames\": [\"SQL\", \"Result\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_88b7f40f22" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"ef851904-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id23\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_14eb90e9ba" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"ef872f50-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_08d809cb2c" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"ef878b80-d22c-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id23_content_0\");\n", + "//# sourceURL=js_15f32331aa" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"ef87e9d6-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"ef878b80-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_600a8591ad" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"ef8842aa-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id23\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_86e3f24a66" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The following query is stored at \u001b[1mEmployeeLocation_sql\u001b[0m variable.\n", + "-- Initializing DuckDB environment.\n", + "create schema if not exists logica_home;\n", + "-- Empty record, has to have a field by DuckDB syntax.\n", + "drop type if exists logicarecord893574736 cascade; create type logicarecord893574736 as struct(nirvana numeric);\n", + "create sequence if not exists eternal_logical_sequence;\n", + "\n", + "\n", + "-- Logica type: logicarecord481217614\n", + "drop type if exists logicarecord481217614 cascade; create type logicarecord481217614 as struct(r logicarecord893574736);\n", + "\n", + "-- Logica type: logicarecord383307722\n", + "drop type if exists logicarecord383307722 cascade; create type logicarecord383307722 as struct(a timestamp);\n", + "WITH t_0_Employee AS (SELECT * FROM (\n", + " \n", + " SELECT\n", + " 'Alice' AS name,\n", + " 'Product Manager' AS role,\n", + " 'SEA' AS office\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " 'Bob' AS name,\n", + " 'Engineer' AS role,\n", + " 'SEA' AS office\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " 'Caroline' AS name,\n", + " 'Engineer' AS role,\n", + " 'LAX' AS office\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " 'David' AS name,\n", + " 'Data Scientist' AS role,\n", + " 'LAX' AS office\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " 'Eve' AS name,\n", + " 'Data Scientist' AS role,\n", + " 'SEA' AS office\n", + " \n", + ") AS UNUSED_TABLE_NAME ),\n", + "t_1_OfficeLocation AS (SELECT * FROM (\n", + " \n", + " SELECT\n", + " 'SEA' AS office,\n", + " 'Seattle' AS city\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " 'LAX' AS office,\n", + " 'Los Angeles' AS city\n", + " \n", + ") AS UNUSED_TABLE_NAME )\n", + "SELECT\n", + " Employee.name AS employee,\n", + " OfficeLocation.city AS city\n", + "FROM\n", + " t_0_Employee AS Employee, t_1_OfficeLocation AS OfficeLocation\n", + "WHERE\n", + " (OfficeLocation.office = Employee.office);\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"ef89c5bc-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"ef872f50-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_aa61b16a57" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"ef8d0592-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_70bd0aa4d3" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"ef8db6b8-d22c-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id23_content_1\");\n", + "//# sourceURL=js_4bf1777b4c" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"ef8e32e6-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"ef8db6b8-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_06c5fdb782" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"ef8e96aa-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id23\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_7164b25ac1" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The following table is stored at \u001b[1mEmployeeLocation\u001b[0m variable.\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
employeecity
0AliceSeattle
1BobSeattle
2CarolineLos Angeles
3DavidLos Angeles
4EveSeattle
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"ef905f12-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"ef8d0592-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_0ac882226f" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"ef922626-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"ef8107c4-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_701feaf13b" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"ef93cb7a-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_0e78872a7d" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"ef9494a6-d22c-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id22_content_1\");\n", + "//# sourceURL=js_ad8417bb8d" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"ef94df1a-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"ef9494a6-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_12eabb81bc" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"ef952b32-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id22\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_229c2a7ec1" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "image/svg+xml": "\n\n\n\n\n\nConcertina\n\n\n\nEmployeeLocation\n\nEmployeeLocation\n\n\n\n", + "text/plain": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Running predicate: EmployeeLocation (6 ms)\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"efa8dab0-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"ef93cb7a-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_0ab646f279" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"efaab952-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_16992a1d5c" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"efab0d3a-d22c-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id22_content_0\");\n", + "//# sourceURL=js_eb8472ae5b" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"efab6492-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"efab0d3a-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_ca69386690" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"efabb406-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id22\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_20794367dc" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"efad0aea-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_eabe19146d" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"efad57d4-d22c-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id23_content_1\");\n", + "//# sourceURL=js_1caa4221c1" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"efada702-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"efad57d4-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_e7e6322732" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"efadfa40-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id23\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_71fb25e420" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"efaf9c74-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"efad0aea-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_368ce8fe7c" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + " \n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"efb17378-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"efaab952-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_4111744cdf" + ] + }, + "metadata": {} + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "tKYdjSq9egR0" + }, + "source": [ + "### Disjunction (aka Union)\n", + "\n", + "Symbol `|` denotes disjunction." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "MwRieDl3eixo", + "colab": { + "resources": { + "http://localhost:8080/nbextensions/google.colab/tabbar.css": { + "data": "Lmdvb2ctdGFie3Bvc2l0aW9uOnJlbGF0aXZlO3BhZGRpbmc6NHB4IDhweDtjb2xvcjojMDBjO3RleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7Y3Vyc29yOmRlZmF1bHR9Lmdvb2ctdGFiLWJhci10b3AgLmdvb2ctdGFie21hcmdpbjoxcHggNHB4IDAgMDtib3JkZXItYm90dG9tOjA7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLXRvcDphZnRlciwuZ29vZy10YWItYmFyLWJvdHRvbTphZnRlcntjb250ZW50OiIgIjtkaXNwbGF5OmJsb2NrO2hlaWdodDowO2NsZWFyOmJvdGg7dmlzaWJpbGl0eTpoaWRkZW59Lmdvb2ctdGFiLWJhci1ib3R0b20gLmdvb2ctdGFie21hcmdpbjowIDRweCAxcHggMDtib3JkZXItdG9wOjA7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLXN0YXJ0IC5nb29nLXRhYnttYXJnaW46MCAwIDRweCAxcHg7Ym9yZGVyLXJpZ2h0OjB9Lmdvb2ctdGFiLWJhci1lbmQgLmdvb2ctdGFie21hcmdpbjowIDFweCA0cHggMDtib3JkZXItbGVmdDowfS5nb29nLXRhYi1ob3ZlcntiYWNrZ3JvdW5kOiNlZWV9Lmdvb2ctdGFiLWRpc2FibGVke2NvbG9yOiM2NjZ9Lmdvb2ctdGFiLXNlbGVjdGVke2NvbG9yOiMwMDA7YmFja2dyb3VuZDojZmZmO3RleHQtZGVjb3JhdGlvbjpub25lO2ZvbnQtd2VpZ2h0OmJvbGQ7Ym9yZGVyOjFweCBzb2xpZCAjNmI5MGRhfS5nb29nLXRhYi1iYXItdG9we3BhZGRpbmctdG9wOjVweCFpbXBvcnRhbnQ7cGFkZGluZy1sZWZ0OjVweCFpbXBvcnRhbnQ7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgIzZiOTBkYSFpbXBvcnRhbnR9Lmdvb2ctdGFiLWJhci10b3AgLmdvb2ctdGFiLXNlbGVjdGVke3RvcDoxcHg7bWFyZ2luLXRvcDowO3BhZGRpbmctYm90dG9tOjVweH0uZ29vZy10YWItYmFyLWJvdHRvbSAuZ29vZy10YWItc2VsZWN0ZWR7dG9wOi0xcHg7bWFyZ2luLWJvdHRvbTowO3BhZGRpbmctdG9wOjVweH0uZ29vZy10YWItYmFyLXN0YXJ0IC5nb29nLXRhYi1zZWxlY3RlZHtsZWZ0OjFweDttYXJnaW4tbGVmdDowO3BhZGRpbmctcmlnaHQ6OXB4fS5nb29nLXRhYi1iYXItZW5kIC5nb29nLXRhYi1zZWxlY3RlZHtsZWZ0Oi0xcHg7bWFyZ2luLXJpZ2h0OjA7cGFkZGluZy1sZWZ0OjlweH0uZ29vZy10YWItYmFye21hcmdpbjowO2JvcmRlcjowO3BhZGRpbmc6MDtsaXN0LXN0eWxlOm5vbmU7Y3Vyc29yOmRlZmF1bHQ7b3V0bGluZTpub25lO2JhY2tncm91bmQ6I2ViZWZmOX0uZ29vZy10YWItYmFyLWNsZWFye2NsZWFyOmJvdGg7aGVpZ2h0OjA7b3ZlcmZsb3c6aGlkZGVufS5nb29nLXRhYi1iYXItc3RhcnR7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLWVuZHtmbG9hdDpyaWdodH0qIGh0bWwgLmdvb2ctdGFiLWJhci1zdGFydHttYXJnaW4tcmlnaHQ6LTNweH0qIGh0bWwgLmdvb2ctdGFiLWJhci1lbmR7bWFyZ2luLWxlZnQ6LTNweH1zZW50aW5lbHt9", + "ok": true, + "headers": [ + [ + "content-length", + "1404" + ], + [ + "content-type", + "text/css" + ] + ], + "status": 200, + "status_text": "" + }, + "http://localhost:8080/nbextensions/google.colab/tabbar_main.min.js": { + "data": "Ly8gY2xhbmctZm9ybWF0IG9mZgooZnVuY3Rpb24oKXt2YXIgZyxhYT1mdW5jdGlvbihhKXt2YXIgYj0wO3JldHVybiBmdW5jdGlvbigpe3JldHVybiBiPGEubGVuZ3RoP3tkb25lOiExLHZhbHVlOmFbYisrXX06e2RvbmU6ITB9fX0sYmE9dHlwZW9mIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzPT0iZnVuY3Rpb24iP09iamVjdC5kZWZpbmVQcm9wZXJ0eTpmdW5jdGlvbihhLGIsYyl7aWYoYT09QXJyYXkucHJvdG90eXBlfHxhPT1PYmplY3QucHJvdG90eXBlKXJldHVybiBhO2FbYl09Yy52YWx1ZTtyZXR1cm4gYX0sY2E9ZnVuY3Rpb24oYSl7YT1bIm9iamVjdCI9PXR5cGVvZiBnbG9iYWxUaGlzJiZnbG9iYWxUaGlzLGEsIm9iamVjdCI9PXR5cGVvZiB3aW5kb3cmJndpbmRvdywib2JqZWN0Ij09dHlwZW9mIHNlbGYmJnNlbGYsIm9iamVjdCI9PXR5cGVvZiBnbG9iYWwmJmdsb2JhbF07Zm9yKHZhciBiPTA7YjxhLmxlbmd0aDsrK2Ipe3ZhciBjPWFbYl07aWYoYyYmYy5NYXRoPT1NYXRoKXJldHVybiBjfXRocm93IEVycm9yKCJDYW5ub3QgZmluZCBnbG9iYWwgb2JqZWN0Iik7Cn0sZGE9Y2EodGhpcyksZWE9ZnVuY3Rpb24oYSxiKXtpZihiKWE6e3ZhciBjPWRhO2E9YS5zcGxpdCgiLiIpO2Zvcih2YXIgZD0wO2Q8YS5sZW5ndGgtMTtkKyspe3ZhciBlPWFbZF07aWYoIShlIGluIGMpKWJyZWFrIGE7Yz1jW2VdfWE9YVthLmxlbmd0aC0xXTtkPWNbYV07Yj1iKGQpO2IhPWQmJmIhPW51bGwmJmJhKGMsYSx7Y29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOmJ9KX19OwplYSgiU3ltYm9sIixmdW5jdGlvbihhKXtpZihhKXJldHVybiBhO3ZhciBiPWZ1bmN0aW9uKGYsaCl7dGhpcy5nPWY7YmEodGhpcywiZGVzY3JpcHRpb24iLHtjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6aH0pfTtiLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmd9O3ZhciBjPSJqc2NvbXBfc3ltYm9sXyIrKE1hdGgucmFuZG9tKCkqMUU5Pj4+MCkrIl8iLGQ9MCxlPWZ1bmN0aW9uKGYpe2lmKHRoaXMgaW5zdGFuY2VvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoIlN5bWJvbCBpcyBub3QgYSBjb25zdHJ1Y3RvciIpO3JldHVybiBuZXcgYihjKyhmfHwiIikrIl8iK2QrKyxmKX07cmV0dXJuIGV9KTsKdmFyIGZhPWZ1bmN0aW9uKGEpe3ZhciBiPXR5cGVvZiBTeW1ib2whPSJ1bmRlZmluZWQiJiZTeW1ib2wuaXRlcmF0b3ImJmFbU3ltYm9sLml0ZXJhdG9yXTtpZihiKXJldHVybiBiLmNhbGwoYSk7aWYodHlwZW9mIGEubGVuZ3RoPT0ibnVtYmVyIilyZXR1cm57bmV4dDphYShhKX07dGhyb3cgRXJyb3IoU3RyaW5nKGEpKyIgaXMgbm90IGFuIGl0ZXJhYmxlIG9yIEFycmF5TGlrZSIpO307ZWEoIlN5bWJvbC5kaXNwb3NlIixmdW5jdGlvbihhKXtyZXR1cm4gYT9hOlN5bWJvbCgiU3ltYm9sLmRpc3Bvc2UiKX0pOy8qCgogQ29weXJpZ2h0IFRoZSBDbG9zdXJlIExpYnJhcnkgQXV0aG9ycy4KIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wCiovCnZhciBsPXRoaXN8fHNlbGYsaWE9ZnVuY3Rpb24oYSl7YS5JYT12b2lkIDA7YS5WPWZ1bmN0aW9uKCl7cmV0dXJuIGEuSWE/YS5JYTphLklhPW5ldyBhfX0samE9ZnVuY3Rpb24oYSl7dmFyIGI9dHlwZW9mIGE7cmV0dXJuIGIhPSJvYmplY3QiP2I6YT9BcnJheS5pc0FycmF5KGEpPyJhcnJheSI6YjoibnVsbCJ9LGthPWZ1bmN0aW9uKGEpe3ZhciBiPWphKGEpO3JldHVybiBiPT0iYXJyYXkifHxiPT0ib2JqZWN0IiYmdHlwZW9mIGEubGVuZ3RoPT0ibnVtYmVyIn0sbT1mdW5jdGlvbihhKXt2YXIgYj10eXBlb2YgYTtyZXR1cm4gYj09Im9iamVjdCImJmEhPW51bGx8fGI9PSJmdW5jdGlvbiJ9LG5hPWZ1bmN0aW9uKGEpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYSxsYSkmJmFbbGFdfHwoYVtsYV09KyttYSl9LGxhPSJjbG9zdXJlX3VpZF8iKyhNYXRoLnJhbmRvbSgpKjFFOT4+PjApLG1hPTAsbj1mdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoKXt9Yy5wcm90b3R5cGU9CmIucHJvdG90eXBlO2EubD1iLnByb3RvdHlwZTthLnByb3RvdHlwZT1uZXcgYzthLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1hO2EucWQ9ZnVuY3Rpb24oZCxlLGYpe2Zvcih2YXIgaD1BcnJheShhcmd1bWVudHMubGVuZ3RoLTIpLGs9MjtrPGFyZ3VtZW50cy5sZW5ndGg7aysrKWhbay0yXT1hcmd1bWVudHNba107cmV0dXJuIGIucHJvdG90eXBlW2VdLmFwcGx5KGQsaCl9fTtmdW5jdGlvbiBvYShhLGIpe2lmKEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKUVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsb2EpO2Vsc2V7dmFyIGM9RXJyb3IoKS5zdGFjaztjJiYodGhpcy5zdGFjaz1jKX1hJiYodGhpcy5tZXNzYWdlPVN0cmluZyhhKSk7YiE9PXZvaWQgMCYmKHRoaXMuY2F1c2U9Yil9bihvYSxFcnJvcik7b2EucHJvdG90eXBlLm5hbWU9IkN1c3RvbUVycm9yIjt2YXIgcGE7ZnVuY3Rpb24gcWEoYSxiKXthPWEuc3BsaXQoIiVzIik7Zm9yKHZhciBjPSIiLGQ9YS5sZW5ndGgtMSxlPTA7ZTxkO2UrKyljKz1hW2VdKyhlPGIubGVuZ3RoP2JbZV06IiVzIik7b2EuY2FsbCh0aGlzLGMrYVtkXSl9bihxYSxvYSk7cWEucHJvdG90eXBlLm5hbWU9IkFzc2VydGlvbkVycm9yIjtmdW5jdGlvbiByYShhLGIsYyxkKXt2YXIgZT0iQXNzZXJ0aW9uIGZhaWxlZCI7aWYoYyl7ZSs9IjogIitjO3ZhciBmPWR9ZWxzZSBhJiYoZSs9IjogIithLGY9Yik7dGhyb3cgbmV3IHFhKCIiK2UsZnx8W10pO30KdmFyIHA9ZnVuY3Rpb24oYSxiLGMpe2F8fHJhKCIiLG51bGwsYixBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMikpO3JldHVybiBhfSxzYT1mdW5jdGlvbihhLGIsYyl7bShhKSYmYS5ub2RlVHlwZT09MXx8cmEoIkV4cGVjdGVkIEVsZW1lbnQgYnV0IGdvdCAlczogJXMuIixbamEoYSksYV0sYixBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMikpfSx1YT1mdW5jdGlvbihhLGIsYyxkKXthIGluc3RhbmNlb2YgYnx8cmEoIkV4cGVjdGVkIGluc3RhbmNlb2YgJXMgYnV0IGdvdCAlcy4iLFt0YShiKSx0YShhKV0sYyxBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMykpfTsKZnVuY3Rpb24gdGEoYSl7cmV0dXJuIGEgaW5zdGFuY2VvZiBGdW5jdGlvbj9hLmRpc3BsYXlOYW1lfHxhLm5hbWV8fCJ1bmtub3duIHR5cGUgbmFtZSI6YSBpbnN0YW5jZW9mIE9iamVjdD9hLmNvbnN0cnVjdG9yLmRpc3BsYXlOYW1lfHxhLmNvbnN0cnVjdG9yLm5hbWV8fE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhKTphPT09bnVsbD8ibnVsbCI6dHlwZW9mIGF9O3ZhciB2YT1BcnJheS5wcm90b3R5cGUuaW5kZXhPZj9mdW5jdGlvbihhLGIpe3AoYS5sZW5ndGghPW51bGwpO3JldHVybiBBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKGEsYix2b2lkIDApfTpmdW5jdGlvbihhLGIpe2lmKHR5cGVvZiBhPT09InN0cmluZyIpcmV0dXJuIHR5cGVvZiBiIT09InN0cmluZyJ8fGIubGVuZ3RoIT0xPy0xOmEuaW5kZXhPZihiLDApO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWlmKGMgaW4gYSYmYVtjXT09PWIpcmV0dXJuIGM7cmV0dXJuLTF9LHdhPUFycmF5LnByb3RvdHlwZS5mb3JFYWNoP2Z1bmN0aW9uKGEsYil7cChhLmxlbmd0aCE9bnVsbCk7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChhLGIsdm9pZCAwKX06ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9YS5sZW5ndGgsZD10eXBlb2YgYT09PSJzdHJpbmciP2Euc3BsaXQoIiIpOmEsZT0wO2U8YztlKyspZSBpbiBkJiZiLmNhbGwodm9pZCAwLGRbZV0sZSxhKX07CmZ1bmN0aW9uIHhhKGEsYil7Yj12YShhLGIpO3ZhciBjO2lmKGM9Yj49MClwKGEubGVuZ3RoIT1udWxsKSxBcnJheS5wcm90b3R5cGUuc3BsaWNlLmNhbGwoYSxiLDEpO3JldHVybiBjfWZ1bmN0aW9uIHlhKGEpe3ZhciBiPWEubGVuZ3RoO2lmKGI+MCl7Zm9yKHZhciBjPUFycmF5KGIpLGQ9MDtkPGI7ZCsrKWNbZF09YVtkXTtyZXR1cm4gY31yZXR1cm5bXX1mdW5jdGlvbiB6YShhLGIsYyxkKXtwKGEubGVuZ3RoIT1udWxsKTtBcnJheS5wcm90b3R5cGUuc3BsaWNlLmFwcGx5KGEsQWEoYXJndW1lbnRzLDEpKX1mdW5jdGlvbiBBYShhLGIsYyl7cChhLmxlbmd0aCE9bnVsbCk7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg8PTI/QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYSxiKTpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhLGIsYyl9O2Z1bmN0aW9uIEJhKGEsYixjKXtmb3IodmFyIGQgaW4gYSliLmNhbGwoYyxhW2RdLGQsYSl9ZnVuY3Rpb24gQ2EoYSxiKXtmb3IodmFyIGMgaW4gYSlpZihhW2NdPT1iKXJldHVybiEwO3JldHVybiExfWZ1bmN0aW9uIERhKGEsYixjKXtpZihhIT09bnVsbCYmYiBpbiBhKXRocm93IEVycm9yKCdUaGUgb2JqZWN0IGFscmVhZHkgY29udGFpbnMgdGhlIGtleSAiJytiKyciJyk7YVtiXT1jfWZ1bmN0aW9uIEVhKGEpe3ZhciBiPXt9LGM7Zm9yKGMgaW4gYSliW2FbY11dPWM7cmV0dXJuIGJ9dmFyIEZhPSJjb25zdHJ1Y3RvciBoYXNPd25Qcm9wZXJ0eSBpc1Byb3RvdHlwZU9mIHByb3BlcnR5SXNFbnVtZXJhYmxlIHRvTG9jYWxlU3RyaW5nIHRvU3RyaW5nIHZhbHVlT2YiLnNwbGl0KCIgIik7CmZ1bmN0aW9uIEdhKGEsYil7Zm9yKHZhciBjLGQsZT0xO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspe2Q9YXJndW1lbnRzW2VdO2ZvcihjIGluIGQpYVtjXT1kW2NdO2Zvcih2YXIgZj0wO2Y8RmEubGVuZ3RoO2YrKyljPUZhW2ZdLE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChkLGMpJiYoYVtjXT1kW2NdKX19O3ZhciBIYT1TdHJpbmcucHJvdG90eXBlLnRyaW0/ZnVuY3Rpb24oYSl7cmV0dXJuIGEudHJpbSgpfTpmdW5jdGlvbihhKXtyZXR1cm4vXltcc1x4YTBdKihbXHNcU10qPylbXHNceGEwXSokLy5leGVjKGEpWzFdfTsvKgoKIENvcHlyaWdodCBHb29nbGUgTExDCiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMAoqLwp2YXIgSWE9e307dmFyIEphPWZ1bmN0aW9uKGEpe2lmKElhIT09SWEpdGhyb3cgRXJyb3IoIkJhZCBzZWNyZXQiKTt0aGlzLmc9YX07SmEucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ307bmV3IEphKCJhYm91dDpibGFuayIpO25ldyBKYSgiYWJvdXQ6aW52YWxpZCN6Q2xvc3VyZXoiKTt2YXIgS2E9W10sTGE9ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJBIFVSTCB3aXRoIGNvbnRlbnQgJyIrYSsiJyB3YXMgc2FuaXRpemVkIGF3YXkuIil9O0thLmluZGV4T2YoTGEpPT09LTEmJkthLnB1c2goTGEpO3ZhciBNYSxOYTthOntmb3IodmFyIE9hPVsiQ0xPU1VSRV9GTEFHUyJdLFBhPWwsUWE9MDtRYTxPYS5sZW5ndGg7UWErKylpZihQYT1QYVtPYVtRYV1dLFBhPT1udWxsKXtOYT1udWxsO2JyZWFrIGF9TmE9UGF9dmFyIFJhPU5hJiZOYVs2MTA0MDEzMDFdO01hPVJhIT1udWxsP1JhOiExO2Z1bmN0aW9uIFNhKCl7dmFyIGE9bC5uYXZpZ2F0b3I7cmV0dXJuIGEmJihhPWEudXNlckFnZW50KT9hOiIifXZhciBUYSxVYT1sLm5hdmlnYXRvcjtUYT1VYT9VYS51c2VyQWdlbnREYXRhfHxudWxsOm51bGw7ZnVuY3Rpb24gcihhKXtyZXR1cm4gU2EoKS5pbmRleE9mKGEpIT0tMX07dmFyIFZhPXIoIkVkZ2UiKSx0PXIoIkdlY2tvIikmJiEoU2EoKS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoIndlYmtpdCIpIT0tMSYmIXIoIkVkZ2UiKSkmJiEocigiVHJpZGVudCIpfHxyKCJNU0lFIikpJiYhcigiRWRnZSIpLHU9U2EoKS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoIndlYmtpdCIpIT0tMSYmIXIoIkVkZ2UiKSx2PU1hJiZUYSYmVGEucGxhdGZvcm0/VGEucGxhdGZvcm09PT0ibWFjT1MiOnIoIk1hY2ludG9zaCIpO3ZhciBYYT1mdW5jdGlvbihhLGIpe0JhKGIsZnVuY3Rpb24oYyxkKXtkPT0ic3R5bGUiP2Euc3R5bGUuY3NzVGV4dD1jOmQ9PSJjbGFzcyI/YS5jbGFzc05hbWU9YzpkPT0iZm9yIj9hLmh0bWxGb3I9YzpXYS5oYXNPd25Qcm9wZXJ0eShkKT9hLnNldEF0dHJpYnV0ZShXYVtkXSxjKTpkLmxhc3RJbmRleE9mKCJhcmlhLSIsMCk9PTB8fGQubGFzdEluZGV4T2YoImRhdGEtIiwwKT09MD9hLnNldEF0dHJpYnV0ZShkLGMpOmFbZF09Y30pfSxXYT17Y2VsbHBhZGRpbmc6ImNlbGxQYWRkaW5nIixjZWxsc3BhY2luZzoiY2VsbFNwYWNpbmciLGNvbHNwYW46ImNvbFNwYW4iLGZyYW1lYm9yZGVyOiJmcmFtZUJvcmRlciIsaGVpZ2h0OiJoZWlnaHQiLG1heGxlbmd0aDoibWF4TGVuZ3RoIixub25jZToibm9uY2UiLHJvbGU6InJvbGUiLHJvd3NwYW46InJvd1NwYW4iLHR5cGU6InR5cGUiLHVzZW1hcDoidXNlTWFwIix2YWxpZ246InZBbGlnbiIsd2lkdGg6IndpZHRoIn0sWWE9ZnVuY3Rpb24oYSwKYixjKXtmdW5jdGlvbiBkKGspe2smJmIuYXBwZW5kQ2hpbGQodHlwZW9mIGs9PT0ic3RyaW5nIj9hLmNyZWF0ZVRleHROb2RlKGspOmspfWZvcih2YXIgZT0yO2U8Yy5sZW5ndGg7ZSsrKXt2YXIgZj1jW2VdO2lmKCFrYShmKXx8bShmKSYmZi5ub2RlVHlwZT4wKWQoZik7ZWxzZXthOntpZihmJiZ0eXBlb2YgZi5sZW5ndGg9PSJudW1iZXIiKXtpZihtKGYpKXt2YXIgaD10eXBlb2YgZi5pdGVtPT0iZnVuY3Rpb24ifHx0eXBlb2YgZi5pdGVtPT0ic3RyaW5nIjticmVhayBhfWlmKHR5cGVvZiBmPT09ImZ1bmN0aW9uIil7aD10eXBlb2YgZi5pdGVtPT0iZnVuY3Rpb24iO2JyZWFrIGF9fWg9ITF9d2EoaD95YShmKTpmLGQpfX19LFphPWZ1bmN0aW9uKGEsYil7Yj1TdHJpbmcoYik7YS5jb250ZW50VHlwZT09PSJhcHBsaWNhdGlvbi94aHRtbCt4bWwiJiYoYj1iLnRvTG93ZXJDYXNlKCkpO3JldHVybiBhLmNyZWF0ZUVsZW1lbnQoYil9LCRhPWZ1bmN0aW9uKGEpe2EmJmEucGFyZW50Tm9kZSYmCmEucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhKX0sYWI9ZnVuY3Rpb24oYSxiKXtpZighYXx8IWIpcmV0dXJuITE7aWYoYS5jb250YWlucyYmYi5ub2RlVHlwZT09MSlyZXR1cm4gYT09Ynx8YS5jb250YWlucyhiKTtpZih0eXBlb2YgYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiE9InVuZGVmaW5lZCIpcmV0dXJuIGE9PWJ8fCEhKGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24oYikmMTYpO2Zvcig7YiYmYSE9YjspYj1iLnBhcmVudE5vZGU7cmV0dXJuIGI9PWF9LGJiPWZ1bmN0aW9uKGEpe3AoYSwiTm9kZSBjYW5ub3QgYmUgbnVsbCBvciB1bmRlZmluZWQuIik7cmV0dXJuIGEubm9kZVR5cGU9PTk/YTphLm93bmVyRG9jdW1lbnR8fGEuZG9jdW1lbnR9LGNiPWZ1bmN0aW9uKGEsYil7Yj9hLnRhYkluZGV4PTA6KGEudGFiSW5kZXg9LTEsYS5yZW1vdmVBdHRyaWJ1dGUoInRhYkluZGV4IikpfSxkYj1mdW5jdGlvbihhKXtyZXR1cm4gYS5oYXNBdHRyaWJ1dGUoInRhYmluZGV4Iil9LGViPQpmdW5jdGlvbihhKXthPWEudGFiSW5kZXg7cmV0dXJuIHR5cGVvZiBhPT09Im51bWJlciImJmE+PTAmJmE8MzI3Njh9LGZiPWZ1bmN0aW9uKGEpe3RoaXMuZz1hfHxsLmRvY3VtZW50fHxkb2N1bWVudH07ZmIucHJvdG90eXBlLmk9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nO3JldHVybiB0eXBlb2YgYT09PSJzdHJpbmciP2IuZ2V0RWxlbWVudEJ5SWQoYSk6YX07ZmIucHJvdG90eXBlLmg9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXMuZyxlPWFyZ3VtZW50cyxmPWVbMV0saD1aYShkLFN0cmluZyhlWzBdKSk7ZiYmKHR5cGVvZiBmPT09InN0cmluZyI/aC5jbGFzc05hbWU9ZjpBcnJheS5pc0FycmF5KGYpP2guY2xhc3NOYW1lPWYuam9pbigiICIpOlhhKGgsZikpO2UubGVuZ3RoPjImJllhKGQsaCxlKTtyZXR1cm4gaH07dmFyIHc9ZnVuY3Rpb24oKXt0aGlzLmJhPXRoaXMuYmE7dGhpcy5rYT10aGlzLmthfTt3LnByb3RvdHlwZS5iYT0hMTt3LnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7dGhpcy5iYXx8KHRoaXMuYmE9ITAsdGhpcy5DKCkpfTt3LnByb3RvdHlwZVtTeW1ib2wuZGlzcG9zZV09ZnVuY3Rpb24oKXt0aGlzLmRpc3Bvc2UoKX07dy5wcm90b3R5cGUuQz1mdW5jdGlvbigpe2lmKHRoaXMua2EpZm9yKDt0aGlzLmthLmxlbmd0aDspdGhpcy5rYS5zaGlmdCgpKCl9O3ZhciB5PWZ1bmN0aW9uKGEsYil7dGhpcy50eXBlPWE7dGhpcy51PXRoaXMudGFyZ2V0PWI7dGhpcy5kZWZhdWx0UHJldmVudGVkPXRoaXMuQT0hMX07eS5wcm90b3R5cGUudj1mdW5jdGlvbigpe3RoaXMuQT0hMH07eS5wcm90b3R5cGUuaj1mdW5jdGlvbigpe3RoaXMuZGVmYXVsdFByZXZlbnRlZD0hMH07dmFyIGdiPWZ1bmN0aW9uKCl7aWYoIWwuYWRkRXZlbnRMaXN0ZW5lcnx8IU9iamVjdC5kZWZpbmVQcm9wZXJ0eSlyZXR1cm4hMTt2YXIgYT0hMSxiPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwicGFzc2l2ZSIse2dldDpmdW5jdGlvbigpe2E9ITB9fSk7dHJ5e3ZhciBjPWZ1bmN0aW9uKCl7fTtsLmFkZEV2ZW50TGlzdGVuZXIoInRlc3QiLGMsYik7bC5yZW1vdmVFdmVudExpc3RlbmVyKCJ0ZXN0IixjLGIpfWNhdGNoKGQpe31yZXR1cm4gYX0oKTt2YXIgej1mdW5jdGlvbihhLGIpe3kuY2FsbCh0aGlzLGE/YS50eXBlOiIiKTt0aGlzLnJlbGF0ZWRUYXJnZXQ9dGhpcy51PXRoaXMudGFyZ2V0PW51bGw7dGhpcy5idXR0b249dGhpcy5zY3JlZW5ZPXRoaXMuc2NyZWVuWD10aGlzLmNsaWVudFk9dGhpcy5jbGllbnRYPTA7dGhpcy5rZXk9IiI7dGhpcy5nPTA7dGhpcy5tZXRhS2V5PXRoaXMuc2hpZnRLZXk9dGhpcy5hbHRLZXk9dGhpcy5jdHJsS2V5PSExO3RoaXMuc3RhdGU9bnVsbDt0aGlzLkc9ITE7dGhpcy5wb2ludGVySWQ9MDt0aGlzLnBvaW50ZXJUeXBlPSIiO3RoaXMudGltZVN0YW1wPTA7dGhpcy5oPW51bGw7aWYoYSl7dmFyIGM9dGhpcy50eXBlPWEudHlwZSxkPWEuY2hhbmdlZFRvdWNoZXMmJmEuY2hhbmdlZFRvdWNoZXMubGVuZ3RoP2EuY2hhbmdlZFRvdWNoZXNbMF06bnVsbDt0aGlzLnRhcmdldD1hLnRhcmdldHx8YS5zcmNFbGVtZW50O3RoaXMudT1iO2I9YS5yZWxhdGVkVGFyZ2V0O2J8fChjPT0ibW91c2VvdmVyIj8KYj1hLmZyb21FbGVtZW50OmM9PSJtb3VzZW91dCImJihiPWEudG9FbGVtZW50KSk7dGhpcy5yZWxhdGVkVGFyZ2V0PWI7ZD8odGhpcy5jbGllbnRYPWQuY2xpZW50WCE9PXZvaWQgMD9kLmNsaWVudFg6ZC5wYWdlWCx0aGlzLmNsaWVudFk9ZC5jbGllbnRZIT09dm9pZCAwP2QuY2xpZW50WTpkLnBhZ2VZLHRoaXMuc2NyZWVuWD1kLnNjcmVlblh8fDAsdGhpcy5zY3JlZW5ZPWQuc2NyZWVuWXx8MCk6KHRoaXMuY2xpZW50WD1hLmNsaWVudFghPT12b2lkIDA/YS5jbGllbnRYOmEucGFnZVgsdGhpcy5jbGllbnRZPWEuY2xpZW50WSE9PXZvaWQgMD9hLmNsaWVudFk6YS5wYWdlWSx0aGlzLnNjcmVlblg9YS5zY3JlZW5YfHwwLHRoaXMuc2NyZWVuWT1hLnNjcmVlbll8fDApO3RoaXMuYnV0dG9uPWEuYnV0dG9uO3RoaXMuZz1hLmtleUNvZGV8fDA7dGhpcy5rZXk9YS5rZXl8fCIiO3RoaXMuY3RybEtleT1hLmN0cmxLZXk7dGhpcy5hbHRLZXk9YS5hbHRLZXk7dGhpcy5zaGlmdEtleT1hLnNoaWZ0S2V5Owp0aGlzLm1ldGFLZXk9YS5tZXRhS2V5O3RoaXMuRz12P2EubWV0YUtleTphLmN0cmxLZXk7dGhpcy5wb2ludGVySWQ9YS5wb2ludGVySWR8fDA7dGhpcy5wb2ludGVyVHlwZT1hLnBvaW50ZXJUeXBlO3RoaXMuc3RhdGU9YS5zdGF0ZTt0aGlzLnRpbWVTdGFtcD1hLnRpbWVTdGFtcDt0aGlzLmg9YTthLmRlZmF1bHRQcmV2ZW50ZWQmJnoubC5qLmNhbGwodGhpcyl9fTtuKHoseSk7ei5wcm90b3R5cGUudj1mdW5jdGlvbigpe3oubC52LmNhbGwodGhpcyk7dGhpcy5oLnN0b3BQcm9wYWdhdGlvbj90aGlzLmguc3RvcFByb3BhZ2F0aW9uKCk6dGhpcy5oLmNhbmNlbEJ1YmJsZT0hMH07ei5wcm90b3R5cGUuaj1mdW5jdGlvbigpe3oubC5qLmNhbGwodGhpcyk7dmFyIGE9dGhpcy5oO2EucHJldmVudERlZmF1bHQ/YS5wcmV2ZW50RGVmYXVsdCgpOmEucmV0dXJuVmFsdWU9ITF9O3ZhciBoYj0iY2xvc3VyZV9saXN0ZW5hYmxlXyIrKE1hdGgucmFuZG9tKCkqMUU2fDApLGliPWZ1bmN0aW9uKGEpe3JldHVybiEoIWF8fCFhW2hiXSl9O3ZhciBqYj0wO3ZhciBrYj1mdW5jdGlvbihhLGIsYyxkLGUpe3RoaXMubGlzdGVuZXI9YTt0aGlzLnByb3h5PW51bGw7dGhpcy5zcmM9Yjt0aGlzLnR5cGU9Yzt0aGlzLmNhcHR1cmU9ISFkO3RoaXMucGE9ZTt0aGlzLmtleT0rK2piO3RoaXMuamE9dGhpcy5vYT0hMX0sbGI9ZnVuY3Rpb24oYSl7YS5qYT0hMDthLmxpc3RlbmVyPW51bGw7YS5wcm94eT1udWxsO2Euc3JjPW51bGw7YS5wYT1udWxsfTt2YXIgbWI9ZnVuY3Rpb24oYSl7dGhpcy5zcmM9YTt0aGlzLmc9e307dGhpcy5oPTB9O21iLnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZj1hLnRvU3RyaW5nKCk7YT10aGlzLmdbZl07YXx8KGE9dGhpcy5nW2ZdPVtdLHRoaXMuaCsrKTt2YXIgaD1uYihhLGIsZCxlKTtoPi0xPyhiPWFbaF0sY3x8KGIub2E9ITEpKTooYj1uZXcga2IoYix0aGlzLnNyYyxmLCEhZCxlKSxiLm9hPWMsYS5wdXNoKGIpKTtyZXR1cm4gYn07CnZhciBvYj1mdW5jdGlvbihhLGIpe3ZhciBjPWIudHlwZTtjIGluIGEuZyYmeGEoYS5nW2NdLGIpJiYobGIoYiksYS5nW2NdLmxlbmd0aD09MCYmKGRlbGV0ZSBhLmdbY10sYS5oLS0pKX0scGI9ZnVuY3Rpb24oYSxiLGMsZCxlKXthPWEuZ1tiLnRvU3RyaW5nKCldO2I9LTE7YSYmKGI9bmIoYSxjLGQsZSkpO3JldHVybiBiPi0xP2FbYl06bnVsbH0sbmI9ZnVuY3Rpb24oYSxiLGMsZCl7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDsrK2Upe3ZhciBmPWFbZV07aWYoIWYuamEmJmYubGlzdGVuZXI9PWImJmYuY2FwdHVyZT09ISFjJiZmLnBhPT1kKXJldHVybiBlfXJldHVybi0xfTt2YXIgcWI9ImNsb3N1cmVfbG1fIisoTWF0aC5yYW5kb20oKSoxRTZ8MCkscmI9e30sc2I9MCx1Yj1mdW5jdGlvbihhLGIsYyxkLGUpe2lmKGQmJmQub25jZSlyZXR1cm4gdGIoYSxiLGMsZCxlKTtpZihBcnJheS5pc0FycmF5KGIpKXtmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKyl1YihhLGJbZl0sYyxkLGUpO3JldHVybiBudWxsfWM9dmIoYyk7cmV0dXJuIGliKGEpP3diKGEsYixjLG0oZCk/ISFkLmNhcHR1cmU6ISFkLGUpOnhiKGEsYixjLCExLGQsZSl9LHhiPWZ1bmN0aW9uKGEsYixjLGQsZSxmKXtpZighYil0aHJvdyBFcnJvcigiSW52YWxpZCBldmVudCB0eXBlIik7dmFyIGg9bShlKT8hIWUuY2FwdHVyZTohIWUsaz15YihhKTtrfHwoYVtxYl09az1uZXcgbWIoYSkpO2M9ay5hZGQoYixjLGQsaCxmKTtpZihjLnByb3h5KXJldHVybiBjO2Q9emIoKTtjLnByb3h5PWQ7ZC5zcmM9YTtkLmxpc3RlbmVyPWM7aWYoYS5hZGRFdmVudExpc3RlbmVyKWdifHwoZT1oKSxlPT09dm9pZCAwJiYKKGU9ITEpLGEuYWRkRXZlbnRMaXN0ZW5lcihiLnRvU3RyaW5nKCksZCxlKTtlbHNlIGlmKGEuYXR0YWNoRXZlbnQpYS5hdHRhY2hFdmVudChBYihiLnRvU3RyaW5nKCkpLGQpO2Vsc2UgaWYoYS5hZGRMaXN0ZW5lciYmYS5yZW1vdmVMaXN0ZW5lcilwKGI9PT0iY2hhbmdlIiwiTWVkaWFRdWVyeUxpc3Qgb25seSBoYXMgYSBjaGFuZ2UgZXZlbnQiKSxhLmFkZExpc3RlbmVyKGQpO2Vsc2UgdGhyb3cgRXJyb3IoImFkZEV2ZW50TGlzdGVuZXIgYW5kIGF0dGFjaEV2ZW50IGFyZSB1bmF2YWlsYWJsZS4iKTtzYisrO3JldHVybiBjfSx6Yj1mdW5jdGlvbigpe3ZhciBhPUJiLGI9ZnVuY3Rpb24oYyl7cmV0dXJuIGEuY2FsbChiLnNyYyxiLmxpc3RlbmVyLGMpfTtyZXR1cm4gYn0sdGI9ZnVuY3Rpb24oYSxiLGMsZCxlKXtpZihBcnJheS5pc0FycmF5KGIpKXtmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKyl0YihhLGJbZl0sYyxkLGUpO3JldHVybiBudWxsfWM9dmIoYyk7cmV0dXJuIGliKGEpPwphLkEuYWRkKFN0cmluZyhiKSxjLCEwLG0oZCk/ISFkLmNhcHR1cmU6ISFkLGUpOnhiKGEsYixjLCEwLGQsZSl9LENiPWZ1bmN0aW9uKGEsYixjLGQsZSl7aWYoQXJyYXkuaXNBcnJheShiKSlmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKylDYihhLGJbZl0sYyxkLGUpO2Vsc2UgZD1tKGQpPyEhZC5jYXB0dXJlOiEhZCxjPXZiKGMpLGliKGEpPyhhPWEuQSxiPVN0cmluZyhiKS50b1N0cmluZygpLGIgaW4gYS5nJiYoZj1hLmdbYl0sYz1uYihmLGMsZCxlKSxjPi0xJiYobGIoZltjXSkscChmLmxlbmd0aCE9bnVsbCksQXJyYXkucHJvdG90eXBlLnNwbGljZS5jYWxsKGYsYywxKSxmLmxlbmd0aD09MCYmKGRlbGV0ZSBhLmdbYl0sYS5oLS0pKSkpOmEmJihhPXliKGEpKSYmKGM9cGIoYSxiLGMsZCxlKSkmJkEoYyl9LEE9ZnVuY3Rpb24oYSl7aWYodHlwZW9mIGEhPT0ibnVtYmVyIiYmYSYmIWEuamEpe3ZhciBiPWEuc3JjO2lmKGliKGIpKW9iKGIuQSxhKTtlbHNle3ZhciBjPWEudHlwZSwKZD1hLnByb3h5O2IucmVtb3ZlRXZlbnRMaXN0ZW5lcj9iLnJlbW92ZUV2ZW50TGlzdGVuZXIoYyxkLGEuY2FwdHVyZSk6Yi5kZXRhY2hFdmVudD9iLmRldGFjaEV2ZW50KEFiKGMpLGQpOmIuYWRkTGlzdGVuZXImJmIucmVtb3ZlTGlzdGVuZXImJmIucmVtb3ZlTGlzdGVuZXIoZCk7c2ItLTsoYz15YihiKSk/KG9iKGMsYSksYy5oPT0wJiYoYy5zcmM9bnVsbCxiW3FiXT1udWxsKSk6bGIoYSl9fX0sQWI9ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW4gcmI/cmJbYV06cmJbYV09Im9uIithfSxCYj1mdW5jdGlvbihhLGIpe2lmKGEuamEpYT0hMDtlbHNle2I9bmV3IHooYix0aGlzKTt2YXIgYz1hLmxpc3RlbmVyLGQ9YS5wYXx8YS5zcmM7YS5vYSYmQShhKTthPWMuY2FsbChkLGIpfXJldHVybiBhfSx5Yj1mdW5jdGlvbihhKXthPWFbcWJdO3JldHVybiBhIGluc3RhbmNlb2YgbWI/YTpudWxsfSxEYj0iX19jbG9zdXJlX2V2ZW50c19mbl8iKyhNYXRoLnJhbmRvbSgpKjFFOT4+PjApLHZiPWZ1bmN0aW9uKGEpe3AoYSwKIkxpc3RlbmVyIGNhbiBub3QgYmUgbnVsbC4iKTtpZih0eXBlb2YgYT09PSJmdW5jdGlvbiIpcmV0dXJuIGE7cChhLmhhbmRsZUV2ZW50LCJBbiBvYmplY3QgbGlzdGVuZXIgbXVzdCBoYXZlIGhhbmRsZUV2ZW50IG1ldGhvZC4iKTthW0RiXXx8KGFbRGJdPWZ1bmN0aW9uKGIpe3JldHVybiBhLmhhbmRsZUV2ZW50KGIpfSk7cmV0dXJuIGFbRGJdfTt2YXIgRWI9ZnVuY3Rpb24oYSl7dy5jYWxsKHRoaXMpO3RoaXMuaD1hO3RoaXMuZz17fX07bihFYix3KTsKdmFyIEZiPVtdLEI9ZnVuY3Rpb24oYSxiLGMsZCl7QXJyYXkuaXNBcnJheShjKXx8KGMmJihGYlswXT1jLnRvU3RyaW5nKCkpLGM9RmIpO2Zvcih2YXIgZT0wO2U8Yy5sZW5ndGg7ZSsrKXt2YXIgZj11YihiLGNbZV0sZHx8YS5oYW5kbGVFdmVudCwhMSxhLmh8fGEpO2lmKCFmKWJyZWFrO2EuZ1tmLmtleV09Zn1yZXR1cm4gYX0sQz1mdW5jdGlvbihhLGIsYyxkLGUsZil7aWYoQXJyYXkuaXNBcnJheShjKSlmb3IodmFyIGg9MDtoPGMubGVuZ3RoO2grKylDKGEsYixjW2hdLGQsZSxmKTtlbHNlIGQ9ZHx8YS5oYW5kbGVFdmVudCxlPW0oZSk/ISFlLmNhcHR1cmU6ISFlLGY9Znx8YS5ofHxhLGQ9dmIoZCksZT0hIWUsYz1pYihiKT9wYihiLkEsU3RyaW5nKGMpLGQsZSxmKTpiPyhiPXliKGIpKT9wYihiLGMsZCxlLGYpOm51bGw6bnVsbCxjJiYoQShjKSxkZWxldGUgYS5nW2Mua2V5XSk7cmV0dXJuIGF9LEdiPWZ1bmN0aW9uKGEpe0JhKGEuZyxmdW5jdGlvbihiLGMpe3RoaXMuZy5oYXNPd25Qcm9wZXJ0eShjKSYmCkEoYil9LGEpO2EuZz17fX07RWIucHJvdG90eXBlLkM9ZnVuY3Rpb24oKXtFYi5sLkMuY2FsbCh0aGlzKTtHYih0aGlzKX07RWIucHJvdG90eXBlLmhhbmRsZUV2ZW50PWZ1bmN0aW9uKCl7dGhyb3cgRXJyb3IoIkV2ZW50SGFuZGxlci5oYW5kbGVFdmVudCBub3QgaW1wbGVtZW50ZWQiKTt9O3ZhciBEPWZ1bmN0aW9uKCl7dy5jYWxsKHRoaXMpO3RoaXMuQT1uZXcgbWIodGhpcyk7dGhpcy5ZYT10aGlzO3RoaXMubGE9bnVsbH07bihELHcpO0QucHJvdG90eXBlW2hiXT0hMDtELnByb3RvdHlwZS5BYT1mdW5jdGlvbihhKXt0aGlzLmxhPWF9O0QucHJvdG90eXBlLnJlbW92ZUV2ZW50TGlzdGVuZXI9ZnVuY3Rpb24oYSxiLGMsZCl7Q2IodGhpcyxhLGIsYyxkKX07CnZhciBFPWZ1bmN0aW9uKGEsYil7SGIoYSk7dmFyIGM9YS5sYTtpZihjKXt2YXIgZD1bXTtmb3IodmFyIGU9MTtjO2M9Yy5sYSlkLnB1c2goYykscCgrK2U8MUUzLCJpbmZpbml0ZSBsb29wIil9YT1hLllhO2M9Yi50eXBlfHxiO3R5cGVvZiBiPT09InN0cmluZyI/Yj1uZXcgeShiLGEpOmIgaW5zdGFuY2VvZiB5P2IudGFyZ2V0PWIudGFyZ2V0fHxhOihlPWIsYj1uZXcgeShjLGEpLEdhKGIsZSkpO2U9ITA7dmFyIGY7aWYoZClmb3IoZj1kLmxlbmd0aC0xOyFiLkEmJmY+PTA7Zi0tKXt2YXIgaD1iLnU9ZFtmXTtlPUliKGgsYywhMCxiKSYmZX1iLkF8fChoPWIudT1hLGU9SWIoaCxjLCEwLGIpJiZlLGIuQXx8KGU9SWIoaCxjLCExLGIpJiZlKSk7aWYoZClmb3IoZj0wOyFiLkEmJmY8ZC5sZW5ndGg7ZisrKWg9Yi51PWRbZl0sZT1JYihoLGMsITEsYikmJmU7cmV0dXJuIGV9OwpELnByb3RvdHlwZS5DPWZ1bmN0aW9uKCl7RC5sLkMuY2FsbCh0aGlzKTtpZih0aGlzLkEpe3ZhciBhPXRoaXMuQSxiPTAsYztmb3IoYyBpbiBhLmcpe2Zvcih2YXIgZD1hLmdbY10sZT0wO2U8ZC5sZW5ndGg7ZSsrKSsrYixsYihkW2VdKTtkZWxldGUgYS5nW2NdO2EuaC0tfX10aGlzLmxhPW51bGx9O3ZhciB3Yj1mdW5jdGlvbihhLGIsYyxkLGUpe0hiKGEpO3JldHVybiBhLkEuYWRkKFN0cmluZyhiKSxjLCExLGQsZSl9LEliPWZ1bmN0aW9uKGEsYixjLGQpe2I9YS5BLmdbU3RyaW5nKGIpXTtpZighYilyZXR1cm4hMDtiPWIuY29uY2F0KCk7Zm9yKHZhciBlPSEwLGY9MDtmPGIubGVuZ3RoOysrZil7dmFyIGg9YltmXTtpZihoJiYhaC5qYSYmaC5jYXB0dXJlPT1jKXt2YXIgaz1oLmxpc3RlbmVyLHE9aC5wYXx8aC5zcmM7aC5vYSYmb2IoYS5BLGgpO2U9ay5jYWxsKHEsZCkhPT0hMSYmZX19cmV0dXJuIGUmJiFkLmRlZmF1bHRQcmV2ZW50ZWR9LEhiPWZ1bmN0aW9uKGEpe3AoYS5BLCJFdmVudCB0YXJnZXQgaXMgbm90IGluaXRpYWxpemVkLiBEaWQgeW91IGNhbGwgdGhlIHN1cGVyY2xhc3MgKGdvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0KSBjb25zdHJ1Y3Rvcj8iKX07dmFyIEpiPXQ/Ik1velVzZXJTZWxlY3QiOnV8fFZhPyJXZWJraXRVc2VyU2VsZWN0IjpudWxsLEtiPWZ1bmN0aW9uKGEsYil7Yj1iP251bGw6YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpO2lmKEpiJiYoYS5zdHlsZSYmKGEuc3R5bGVbSmJdPSJub25lIiksYikpZm9yKHZhciBjPTA7YT1iW2NdO2MrKylhLnN0eWxlJiYoYS5zdHlsZVtKYl09Im5vbmUiKX07dmFyIExiPWZ1bmN0aW9uKCl7fTtpYShMYik7TGIucHJvdG90eXBlLmc9MDt2YXIgRj1mdW5jdGlvbihhKXtELmNhbGwodGhpcyk7dGhpcy5HPWF8fHBhfHwocGE9bmV3IGZiKTt0aGlzLnphPU1iO3RoaXMuWT1udWxsO3RoaXMucz0hMTt0aGlzLmc9bnVsbDt0aGlzLk09dm9pZCAwO3RoaXMudT10aGlzLmo9dGhpcy5oPW51bGw7dGhpcy5TYT0hMX07bihGLEQpO0YucHJvdG90eXBlLlphPUxiLlYoKTsKdmFyIE1iPW51bGwsTmI9ZnVuY3Rpb24oYSxiKXtzd2l0Y2goYSl7Y2FzZSAxOnJldHVybiBiPyJkaXNhYmxlIjoiZW5hYmxlIjtjYXNlIDI6cmV0dXJuIGI/ImhpZ2hsaWdodCI6InVuaGlnaGxpZ2h0IjtjYXNlIDQ6cmV0dXJuIGI/ImFjdGl2YXRlIjoiZGVhY3RpdmF0ZSI7Y2FzZSA4OnJldHVybiBiPyJzZWxlY3QiOiJ1bnNlbGVjdCI7Y2FzZSAxNjpyZXR1cm4gYj8iY2hlY2siOiJ1bmNoZWNrIjtjYXNlIDMyOnJldHVybiBiPyJmb2N1cyI6ImJsdXIiO2Nhc2UgNjQ6cmV0dXJuIGI/Im9wZW4iOiJjbG9zZSJ9dGhyb3cgRXJyb3IoIkludmFsaWQgY29tcG9uZW50IHN0YXRlIik7fSxPYj1mdW5jdGlvbihhKXtyZXR1cm4gYS5ZfHwoYS5ZPSI6IisoYS5aYS5nKyspLnRvU3RyaW5nKDM2KSl9LFBiPWZ1bmN0aW9uKGEsYil7aWYoYS5oJiZhLmgudSl7dmFyIGM9YS5oLnUsZD1hLlk7ZCBpbiBjJiZkZWxldGUgY1tkXTtEYShhLmgudSxiLGEpfWEuWT1ifTtGLnByb3RvdHlwZS5pPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ307CnZhciBRYj1mdW5jdGlvbihhKXthLk18fChhLk09bmV3IEViKGEpKTtyZXR1cm4gcChhLk0pfTtGLnByb3RvdHlwZS5BYT1mdW5jdGlvbihhKXtpZih0aGlzLmgmJnRoaXMuaCE9YSl0aHJvdyBFcnJvcigiTWV0aG9kIG5vdCBzdXBwb3J0ZWQiKTtGLmwuQWEuY2FsbCh0aGlzLGEpfTtGLnByb3RvdHlwZS5tYT1mdW5jdGlvbigpe3RoaXMuZz1aYSh0aGlzLkcuZywiRElWIil9O0YucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbihhKXtSYih0aGlzLGEpfTsKdmFyIFJiPWZ1bmN0aW9uKGEsYixjKXtpZihhLnMpdGhyb3cgRXJyb3IoIkNvbXBvbmVudCBhbHJlYWR5IHJlbmRlcmVkIik7YS5nfHxhLm1hKCk7Yj9iLmluc2VydEJlZm9yZShhLmcsY3x8bnVsbCk6YS5HLmcuYm9keS5hcHBlbmRDaGlsZChhLmcpO2EuaCYmIWEuaC5zfHxhLkkoKX0sU2I9ZnVuY3Rpb24oYSxiKXtpZihhLnMpdGhyb3cgRXJyb3IoIkNvbXBvbmVudCBhbHJlYWR5IHJlbmRlcmVkIik7aWYoYiYmYS53YShiKSl7YS5TYT0hMDt2YXIgYz1iYihiKTthLkcmJmEuRy5nPT1jfHwoYS5HPWI/bmV3IGZiKGJiKGIpKTpwYXx8KHBhPW5ldyBmYikpO2EuRWEoYik7YS5JKCl9ZWxzZSB0aHJvdyBFcnJvcigiSW52YWxpZCBlbGVtZW50IHRvIGRlY29yYXRlIik7fTtnPUYucHJvdG90eXBlO2cud2E9ZnVuY3Rpb24oKXtyZXR1cm4hMH07Zy5FYT1mdW5jdGlvbihhKXt0aGlzLmc9YX07CmcuST1mdW5jdGlvbigpe3RoaXMucz0hMDtUYih0aGlzLGZ1bmN0aW9uKGEpeyFhLnMmJmEuaSgpJiZhLkkoKX0pfTtnLlU9ZnVuY3Rpb24oKXtUYih0aGlzLGZ1bmN0aW9uKGEpe2EucyYmYS5VKCl9KTt0aGlzLk0mJkdiKHRoaXMuTSk7dGhpcy5zPSExfTtnLkM9ZnVuY3Rpb24oKXt0aGlzLnMmJnRoaXMuVSgpO3RoaXMuTSYmKHRoaXMuTS5kaXNwb3NlKCksZGVsZXRlIHRoaXMuTSk7VGIodGhpcyxmdW5jdGlvbihhKXthLmRpc3Bvc2UoKX0pOyF0aGlzLlNhJiZ0aGlzLmcmJiRhKHRoaXMuZyk7dGhpcy5oPXRoaXMuZz10aGlzLnU9dGhpcy5qPW51bGw7Ri5sLkMuY2FsbCh0aGlzKX07Zy5CYT1mdW5jdGlvbihhLGIpe3RoaXMuQ2EoYSxIKHRoaXMpLGIpfTsKZy5DYT1mdW5jdGlvbihhLGIsYyl7cCghIWEsIlByb3ZpZGVkIGVsZW1lbnQgbXVzdCBub3QgYmUgbnVsbC4iKTtpZihhLnMmJihjfHwhdGhpcy5zKSl0aHJvdyBFcnJvcigiQ29tcG9uZW50IGFscmVhZHkgcmVuZGVyZWQiKTtpZihiPDB8fGI+SCh0aGlzKSl0aHJvdyBFcnJvcigiQ2hpbGQgY29tcG9uZW50IGluZGV4IG91dCBvZiBib3VuZHMiKTt0aGlzLnUmJnRoaXMuanx8KHRoaXMudT17fSx0aGlzLmo9W10pO2lmKGEuaD09dGhpcyl7dmFyIGQ9dGhpcy51LGU9T2IoYSk7ZFtlXT1hO3hhKHRoaXMuaixhKX1lbHNlIERhKHRoaXMudSxPYihhKSxhKTtpZihhPT10aGlzKXRocm93IEVycm9yKCJVbmFibGUgdG8gc2V0IHBhcmVudCBjb21wb25lbnQiKTtpZihkPXRoaXMmJmEuaCYmYS5ZKWU9YS5oLGQ9YS5ZLGUudSYmZD8oZT1lLnUsZD0oZSE9PW51bGwmJmQgaW4gZT9lW2RdOnZvaWQgMCl8fG51bGwpOmQ9bnVsbDtpZihkJiZhLmghPXRoaXMpdGhyb3cgRXJyb3IoIlVuYWJsZSB0byBzZXQgcGFyZW50IGNvbXBvbmVudCIpOwphLmg9dGhpcztGLmwuQWEuY2FsbChhLHRoaXMpO3phKHRoaXMuaixiLDAsYSk7YS5zJiZ0aGlzLnMmJmEuaD09dGhpcz8oYz10aGlzLm5hKCksKGMuY2hpbGROb2Rlc1tiXXx8bnVsbCkhPWEuaSgpJiYoYS5pKCkucGFyZW50RWxlbWVudD09YyYmYy5yZW1vdmVDaGlsZChhLmkoKSksYj1jLmNoaWxkTm9kZXNbYl18fG51bGwsYy5pbnNlcnRCZWZvcmUoYS5pKCksYikpKTpjPyh0aGlzLmd8fHRoaXMubWEoKSxiPUkodGhpcyxiKzEpLFJiKGEsdGhpcy5uYSgpLGI/Yi5nOm51bGwpKTp0aGlzLnMmJiFhLnMmJmEuZyYmYS5nLnBhcmVudE5vZGUmJmEuZy5wYXJlbnROb2RlLm5vZGVUeXBlPT0xJiZhLkkoKX07Zy5uYT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmd9Owp2YXIgVWI9ZnVuY3Rpb24oYSl7aWYoYS56YT09bnVsbCl7dmFyIGI9YS5zP2EuZzphLkcuZy5ib2R5O2E6e3ZhciBjPWJiKGIpO2lmKGMuZGVmYXVsdFZpZXcmJmMuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSYmKGM9Yy5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKGIsbnVsbCkpKXtjPWMuZGlyZWN0aW9ufHxjLmdldFByb3BlcnR5VmFsdWUoImRpcmVjdGlvbiIpfHwiIjticmVhayBhfWM9IiJ9YS56YT0icnRsIj09KGN8fChiLmN1cnJlbnRTdHlsZT9iLmN1cnJlbnRTdHlsZS5kaXJlY3Rpb246bnVsbCl8fGIuc3R5bGUmJmIuc3R5bGUuZGlyZWN0aW9uKX1yZXR1cm4gYS56YX0sSD1mdW5jdGlvbihhKXtyZXR1cm4gYS5qP2Euai5sZW5ndGg6MH0sST1mdW5jdGlvbihhLGIpe3JldHVybiBhLmo/YS5qW2JdfHxudWxsOm51bGx9LFRiPWZ1bmN0aW9uKGEsYixjKXthLmomJmEuai5mb3JFYWNoKGIsYyl9LFZiPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuaiYmYj9hLmouaW5kZXhPZihiKToKLTF9O3ZhciBXYj17bWI6ImFjdGl2ZWRlc2NlbmRhbnQiLHJiOiJhdG9taWMiLHNiOiJhdXRvY29tcGxldGUiLHViOiJidXN5Iix4YjoiY2hlY2tlZCIseWI6ImNvbGluZGV4IixEYjoiY29udHJvbHMiLEViOiJjdXJyZW50IixHYjoiZGVzY3JpYmVkYnkiLEpiOiJkaXNhYmxlZCIsTGI6ImRyb3BlZmZlY3QiLE1iOiJleHBhbmRlZCIsTmI6ImZsb3d0byIsUGI6ImdyYWJiZWQiLFRiOiJoYXNwb3B1cCIsVmI6ImhpZGRlbiIsWGI6ImludmFsaWQiLFliOiJsYWJlbCIsWmI6ImxhYmVsbGVkYnkiLGFjOiJsZXZlbCIsZmM6ImxpdmUiLHZjOiJtdWx0aWxpbmUiLHdjOiJtdWx0aXNlbGVjdGFibGUiLEFjOiJvcmllbnRhdGlvbiIsQmM6Im93bnMiLENjOiJwb3NpbnNldCIsRWM6InByZXNzZWQiLEljOiJyZWFkb25seSIsS2M6InJlbGV2YW50IixMYzoicmVxdWlyZWQiLFBjOiJyb3dpbmRleCIsU2M6InNlbGVjdGVkIixVYzoic2V0c2l6ZSIsV2M6InNvcnQiLG1kOiJ2YWx1ZW1heCIsbmQ6InZhbHVlbWluIiwKb2Q6InZhbHVlbm93IixwZDoidmFsdWV0ZXh0In07dmFyIFhiO3ZhciBZYj17bmI6ImFsZXJ0IixvYjoiYWxlcnRkaWFsb2ciLHBiOiJhcHBsaWNhdGlvbiIscWI6ImFydGljbGUiLHRiOiJiYW5uZXIiLHZiOiJidXR0b24iLHdiOiJjaGVja2JveCIsemI6ImNvbHVtbmhlYWRlciIsQWI6ImNvbWJvYm94IixCYjoiY29tcGxlbWVudGFyeSIsQ2I6ImNvbnRlbnRpbmZvIixGYjoiZGVmaW5pdGlvbiIsSGI6ImRpYWxvZyIsSWI6ImRpcmVjdG9yeSIsS2I6ImRvY3VtZW50IixPYjoiZm9ybSIsUWI6ImdyaWQiLFJiOiJncmlkY2VsbCIsU2I6Imdyb3VwIixVYjoiaGVhZGluZyIsV2I6ImltZyIsYmM6ImxpbmsiLGNjOiJsaXN0IixkYzoibGlzdGJveCIsZWM6Imxpc3RpdGVtIixoYzoibG9nIixpYzoibWFpbiIsamM6Im1hcnF1ZWUiLGtjOiJtYXRoIixsYzoibWVudSIsbWM6Im1lbnViYXIiLG5jOiJtZW51aXRlbSIsb2M6Im1lbnVpdGVtY2hlY2tib3giLHBjOiJtZW51aXRlbXJhZGlvIix4YzoibmF2aWdhdGlvbiIseWM6Im5vdGUiLHpjOiJvcHRpb24iLApEYzoicHJlc2VudGF0aW9uIixGYzoicHJvZ3Jlc3NiYXIiLEdjOiJyYWRpbyIsSGM6InJhZGlvZ3JvdXAiLEpjOiJyZWdpb24iLE1jOiJyb3ciLE5jOiJyb3dncm91cCIsT2M6InJvd2hlYWRlciIsUWM6InNjcm9sbGJhciIsUmM6InNlYXJjaCIsVGM6InNlcGFyYXRvciIsVmM6InNsaWRlciIsWGM6InNwaW5idXR0b24iLFljOiJzdGF0dXMiLFpjOiJzd2l0Y2giLGFkOiJ0YWIiLGJkOiJ0YWJsaXN0IixjZDoidGFicGFuZWwiLGRkOiJ0ZXh0Ym94IixlZDoidGV4dGluZm8iLGZkOiJ0aW1lciIsZ2Q6InRvb2xiYXIiLGhkOiJ0b29sdGlwIixqZDoidHJlZSIsa2Q6InRyZWVncmlkIixsZDoidHJlZWl0ZW0ifTt2YXIgWmI9ZnVuY3Rpb24oYSxiKXtiPyhwKENhKFliLGIpLCJObyBzdWNoIEFSSUEgcm9sZSAiK2IpLGEuc2V0QXR0cmlidXRlKCJyb2xlIixiKSk6YS5yZW1vdmVBdHRyaWJ1dGUoInJvbGUiKX0sYWM9ZnVuY3Rpb24oYSxiLGMpe0FycmF5LmlzQXJyYXkoYykmJihjPWMuam9pbigiICIpKTt2YXIgZD0kYihiKTtjPT09IiJ8fGM9PXZvaWQgMD8oWGJ8fChjPXt9LFhiPShjLmF0b21pYz0hMSxjLmF1dG9jb21wbGV0ZT0ibm9uZSIsYy5kcm9wZWZmZWN0PSJub25lIixjLmhhc3BvcHVwPSExLGMubGl2ZT0ib2ZmIixjLm11bHRpbGluZT0hMSxjLm11bHRpc2VsZWN0YWJsZT0hMSxjLm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIsYy5yZWFkb25seT0hMSxjLnJlbGV2YW50PSJhZGRpdGlvbnMgdGV4dCIsYy5yZXF1aXJlZD0hMSxjLnNvcnQ9Im5vbmUiLGMuYnVzeT0hMSxjLmRpc2FibGVkPSExLGMuaGlkZGVuPSExLGMuaW52YWxpZD0iZmFsc2UiLGMpKSxjPVhiLGIgaW4gYz9hLnNldEF0dHJpYnV0ZShkLApjW2JdKTphLnJlbW92ZUF0dHJpYnV0ZShkKSk6YS5zZXRBdHRyaWJ1dGUoZCxjKX0sJGI9ZnVuY3Rpb24oYSl7cChhLCJBUklBIGF0dHJpYnV0ZSBjYW5ub3QgYmUgZW1wdHkuIik7cChDYShXYixhKSwiTm8gc3VjaCBBUklBIGF0dHJpYnV0ZSAiK2EpO3JldHVybiJhcmlhLSIrYX07dmFyIGRjPWZ1bmN0aW9uKGEsYixjLGQsZSxmKXtpZih2JiZlKXJldHVybiBiYyhhKTtpZihlJiYhZClyZXR1cm4hMTtpZighdCl7dHlwZW9mIGI9PT0ibnVtYmVyIiYmKGI9Y2MoYikpO3ZhciBoPWI9PTE3fHxiPT0xOHx8diYmYj09OTE7aWYoKCFjfHx2KSYmaHx8diYmYj09MTYmJihkfHxmKSlyZXR1cm4hMX1pZih1JiZkJiZjKXN3aXRjaChhKXtjYXNlIDIyMDpjYXNlIDIxOTpjYXNlIDIyMTpjYXNlIDE5MjpjYXNlIDE4NjpjYXNlIDE4OTpjYXNlIDE4NzpjYXNlIDE4ODpjYXNlIDE5MDpjYXNlIDE5MTpjYXNlIDE5MjpjYXNlIDIyMjpyZXR1cm4hMX1zd2l0Y2goYSl7Y2FzZSAxMzpyZXR1cm4gdD9mfHxlPyExOiEoYyYmZCk6ITA7Y2FzZSAyNzpyZXR1cm4hdSYmIXR9cmV0dXJuIHQmJihkfHxlfHxmKT8hMTpiYyhhKX0sYmM9ZnVuY3Rpb24oYSl7aWYoYT49NDgmJmE8PTU3fHxhPj05NiYmYTw9MTA2fHxhPj02NSYmYTw9OTB8fHUmJmE9PTApcmV0dXJuITA7c3dpdGNoKGEpe2Nhc2UgMzI6Y2FzZSA0MzpjYXNlIDYzOmNhc2UgNjQ6Y2FzZSAxMDc6Y2FzZSAxMDk6Y2FzZSAxMTA6Y2FzZSAxMTE6Y2FzZSAxODY6Y2FzZSA1OTpjYXNlIDE4OTpjYXNlIDE4NzpjYXNlIDYxOmNhc2UgMTg4OmNhc2UgMTkwOmNhc2UgMTkxOmNhc2UgMTkyOmNhc2UgMjIyOmNhc2UgMjE5OmNhc2UgMjIwOmNhc2UgMjIxOmNhc2UgMTYzOmNhc2UgNTg6cmV0dXJuITA7CmNhc2UgMTczOmNhc2UgMTcxOnJldHVybiB0O2RlZmF1bHQ6cmV0dXJuITF9fSxjYz1mdW5jdGlvbihhKXtpZih0KWE9ZWMoYSk7ZWxzZSBpZih2JiZ1KXN3aXRjaChhKXtjYXNlIDkzOmE9OTF9cmV0dXJuIGF9LGVjPWZ1bmN0aW9uKGEpe3N3aXRjaChhKXtjYXNlIDYxOnJldHVybiAxODc7Y2FzZSA1OTpyZXR1cm4gMTg2O2Nhc2UgMTczOnJldHVybiAxODk7Y2FzZSAyMjQ6cmV0dXJuIDkxO2Nhc2UgMDpyZXR1cm4gMjI0O2RlZmF1bHQ6cmV0dXJuIGF9fTt2YXIgZmM9ZnVuY3Rpb24oYSxiLGMsZCl7ei5jYWxsKHRoaXMsZCk7dGhpcy50eXBlPSJrZXkiO3RoaXMuZz1hO3RoaXMucmVwZWF0PWN9O24oZmMseik7dmFyIEo9ZnVuY3Rpb24oYSxiKXtELmNhbGwodGhpcyk7YSYmZ2ModGhpcyxhLGIpfTtuKEosRCk7Zz1KLnByb3RvdHlwZTtnLlI9bnVsbDtnLnFhPW51bGw7Zy5KYT1udWxsO2cucmE9bnVsbDtnLkY9LTE7Zy5LPS0xO2cuRGE9ITE7CnZhciBoYz17MzoxMywxMjoxNDQsNjMyMzI6MzgsNjMyMzM6NDAsNjMyMzQ6MzcsNjMyMzU6MzksNjMyMzY6MTEyLDYzMjM3OjExMyw2MzIzODoxMTQsNjMyMzk6MTE1LDYzMjQwOjExNiw2MzI0MToxMTcsNjMyNDI6MTE4LDYzMjQzOjExOSw2MzI0NDoxMjAsNjMyNDU6MTIxLDYzMjQ2OjEyMiw2MzI0NzoxMjMsNjMyNDg6NDQsNjMyNzI6NDYsNjMyNzM6MzYsNjMyNzU6MzUsNjMyNzY6MzMsNjMyNzc6MzQsNjMyODk6MTQ0LDYzMzAyOjQ1fSxpYz17VXA6MzgsRG93bjo0MCxMZWZ0OjM3LFJpZ2h0OjM5LEVudGVyOjEzLEYxOjExMixGMjoxMTMsRjM6MTE0LEY0OjExNSxGNToxMTYsRjY6MTE3LEY3OjExOCxGODoxMTksRjk6MTIwLEYxMDoxMjEsRjExOjEyMixGMTI6MTIzLCJVKzAwN0YiOjQ2LEhvbWU6MzYsRW5kOjM1LFBhZ2VVcDozMyxQYWdlRG93bjozNCxJbnNlcnQ6NDV9LGpjPXYmJnQ7CkoucHJvdG90eXBlLmc9ZnVuY3Rpb24oYSl7dSYmKHRoaXMuRj09MTcmJiFhLmN0cmxLZXl8fHRoaXMuRj09MTgmJiFhLmFsdEtleXx8diYmdGhpcy5GPT05MSYmIWEubWV0YUtleSkmJih0aGlzLks9dGhpcy5GPS0xKTt0aGlzLkY9PS0xJiYoYS5jdHJsS2V5JiZhLmchPTE3P3RoaXMuRj0xNzphLmFsdEtleSYmYS5nIT0xOD90aGlzLkY9MTg6YS5tZXRhS2V5JiZhLmchPTkxJiYodGhpcy5GPTkxKSk7ZGMoYS5nLHRoaXMuRixhLnNoaWZ0S2V5LGEuY3RybEtleSxhLmFsdEtleSxhLm1ldGFLZXkpPyh0aGlzLks9Y2MoYS5nKSxqYyYmKHRoaXMuRGE9YS5hbHRLZXkpKTp0aGlzLmhhbmRsZUV2ZW50KGEpfTtKLnByb3RvdHlwZS5oPWZ1bmN0aW9uKGEpe3RoaXMuSz10aGlzLkY9LTE7dGhpcy5EYT1hLmFsdEtleX07CkoucHJvdG90eXBlLmhhbmRsZUV2ZW50PWZ1bmN0aW9uKGEpe3ZhciBiPWEuaCxjPWIuYWx0S2V5O2lmKHUmJmEudHlwZT09ImtleXByZXNzIil7dmFyIGQ9dGhpcy5LO3ZhciBlPWIuY2hhckNvZGU+PTAmJmIuY2hhckNvZGU8NjMyMzImJmJjKGQpP2IuY2hhckNvZGU6MH1lbHNlIGEudHlwZT09ImtleXByZXNzIj8oamMmJihjPXRoaXMuRGEpLGIua2V5Q29kZT09Yi5jaGFyQ29kZT9iLmtleUNvZGU8MzI/KGQ9Yi5rZXlDb2RlLGU9MCk6KGQ9dGhpcy5LLGU9Yi5jaGFyQ29kZSk6KGQ9Yi5rZXlDb2RlfHx0aGlzLkssZT1iLmNoYXJDb2RlfHwwKSk6KGQ9Yi5rZXlDb2RlfHx0aGlzLkssZT1iLmNoYXJDb2RlfHwwKSx2JiZlPT02MyYmZD09MjI0JiYoZD0xOTEpO3ZhciBmPWQ9Y2MoZCk7ZD9kPj02MzIzMiYmZCBpbiBoYz9mPWhjW2RdOmQ9PTI1JiZhLnNoaWZ0S2V5JiYoZj05KTpiLmtleUlkZW50aWZpZXImJmIua2V5SWRlbnRpZmllciBpbiBpYyYmKGY9aWNbYi5rZXlJZGVudGlmaWVyXSk7CmlmKCF0fHxhLnR5cGUhPSJrZXlwcmVzcyJ8fGRjKGYsdGhpcy5GLGEuc2hpZnRLZXksYS5jdHJsS2V5LGMsYS5tZXRhS2V5KSlhPWY9PXRoaXMuRix0aGlzLkY9ZixiPW5ldyBmYyhmLGUsYSxiKSxiLmFsdEtleT1jLEUodGhpcyxiKX07Si5wcm90b3R5cGUuaT1mdW5jdGlvbigpe3JldHVybiB0aGlzLlJ9O3ZhciBnYz1mdW5jdGlvbihhLGIsYyl7YS5yYSYma2MoYSk7YS5SPWI7YS5xYT11YihhLlIsImtleXByZXNzIixhLGMpO2EuSmE9dWIoYS5SLCJrZXlkb3duIixhLmcsYyxhKTthLnJhPXViKGEuUiwia2V5dXAiLGEuaCxjLGEpfSxrYz1mdW5jdGlvbihhKXthLnFhJiYoQShhLnFhKSxBKGEuSmEpLEEoYS5yYSksYS5xYT1udWxsLGEuSmE9bnVsbCxhLnJhPW51bGwpO2EuUj1udWxsO2EuRj0tMTthLks9LTF9O0oucHJvdG90eXBlLkM9ZnVuY3Rpb24oKXtKLmwuQy5jYWxsKHRoaXMpO2tjKHRoaXMpfTt2YXIgSz17Z2E6Im1vdXNlZG93biIsaGE6Im1vdXNldXAiLGZhOiJtb3VzZWNhbmNlbCIsc2M6Im1vdXNlbW92ZSIsdWM6Im1vdXNlb3ZlciIsdGM6Im1vdXNlb3V0IixxYzoibW91c2VlbnRlciIscmM6Im1vdXNlbGVhdmUifTt2YXIgbGM9ZnVuY3Rpb24oYSl7cmV0dXJuIHR5cGVvZiBhLmNsYXNzTmFtZT09InN0cmluZyI/YS5jbGFzc05hbWU6YS5nZXRBdHRyaWJ1dGUmJmEuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIn0sTD1mdW5jdGlvbihhKXtyZXR1cm4gYS5jbGFzc0xpc3Q/YS5jbGFzc0xpc3Q6bGMoYSkubWF0Y2goL1xTKy9nKXx8W119LG1jPWZ1bmN0aW9uKGEsYil7dHlwZW9mIGEuY2xhc3NOYW1lPT0ic3RyaW5nIj9hLmNsYXNzTmFtZT1iOmEuc2V0QXR0cmlidXRlJiZhLnNldEF0dHJpYnV0ZSgiY2xhc3MiLGIpfSxuYz1mdW5jdGlvbihhLGIpe2EuY2xhc3NMaXN0P2I9YS5jbGFzc0xpc3QuY29udGFpbnMoYik6KGE9TChhKSxiPXZhKGEsYik+PTApO3JldHVybiBifSxvYz1mdW5jdGlvbihhLGIpe2lmKGEuY2xhc3NMaXN0KWEuY2xhc3NMaXN0LmFkZChiKTtlbHNlIGlmKCFuYyhhLGIpKXt2YXIgYz1sYyhhKTttYyhhLGMrKGMubGVuZ3RoPjA/IiAiK2I6YikpfX0scGM9ZnVuY3Rpb24oYSxiKXtpZihhLmNsYXNzTGlzdClBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGIsCmZ1bmN0aW9uKGUpe29jKGEsZSl9KTtlbHNle3ZhciBjPXt9O0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoTChhKSxmdW5jdGlvbihlKXtjW2VdPSEwfSk7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChiLGZ1bmN0aW9uKGUpe2NbZV09ITB9KTtiPSIiO2Zvcih2YXIgZCBpbiBjKWIrPWIubGVuZ3RoPjA/IiAiK2Q6ZDttYyhhLGIpfX0scWM9ZnVuY3Rpb24oYSxiKXthLmNsYXNzTGlzdD9hLmNsYXNzTGlzdC5yZW1vdmUoYik6bmMoYSxiKSYmbWMoYSxBcnJheS5wcm90b3R5cGUuZmlsdGVyLmNhbGwoTChhKSxmdW5jdGlvbihjKXtyZXR1cm4gYyE9Yn0pLmpvaW4oIiAiKSl9LHJjPWZ1bmN0aW9uKGEsYil7YS5jbGFzc0xpc3Q/QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChiLGZ1bmN0aW9uKGMpe3FjKGEsYyl9KTptYyhhLEFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbChMKGEpLGZ1bmN0aW9uKGMpe3JldHVybiEodmEoYixjKT49MCl9KS5qb2luKCIgIikpfTt2YXIgdGM9ZnVuY3Rpb24oYSxiKXtpZighYSl0aHJvdyBFcnJvcigiSW52YWxpZCBjbGFzcyBuYW1lICIrYSk7aWYodHlwZW9mIGIhPT0iZnVuY3Rpb24iKXRocm93IEVycm9yKCJJbnZhbGlkIGRlY29yYXRvciBmdW5jdGlvbiAiK2IpO3NjW2FdPWJ9LHVjPXt9LHNjPXt9O3ZhciB2Yz1mdW5jdGlvbihhKXt0aGlzLkE9YX07aWEodmMpO3ZhciB3Yz1mdW5jdGlvbihhLGIpe2EmJihhLnRhYkluZGV4PWI/MDotMSl9LHljPWZ1bmN0aW9uKGEsYixjKXtjLmlkJiZQYihiLGMuaWQpO3ZhciBkPWEuZygpLGU9ITEsZj1MKGMpO2YmJkFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoZixmdW5jdGlvbihoKXtoPT1kP2U9ITA6aCYmdGhpcy51KGIsaCxkKX0sYSk7ZXx8b2MoYyxkKTt4YyhiLGMpO3JldHVybiBjfTt2Yy5wcm90b3R5cGUudT1mdW5jdGlvbihhLGIsYyl7Yj09YysiLWRpc2FibGVkIj9hLlgoITEpOmI9PWMrIi1ob3Jpem9udGFsIj96YyhhLCJob3Jpem9udGFsIik6Yj09YysiLXZlcnRpY2FsIiYmemMoYSwidmVydGljYWwiKX07CnZhciB4Yz1mdW5jdGlvbihhLGIpe2lmKGIpZm9yKHZhciBjPWIuZmlyc3RDaGlsZCxkO2MmJmMucGFyZW50Tm9kZT09Yjspe2Q9Yy5uZXh0U2libGluZztpZihjLm5vZGVUeXBlPT0xKXthOnt2YXIgZT1jO3AoZSk7ZT1MKGUpO2Zvcih2YXIgZj1lLmxlbmd0aCxoPTA7aDxmO2grKyl7dmFyIGs9ZVtoXTtpZihrPWsgaW4gc2M/c2Nba10oKTpudWxsKXtlPWs7YnJlYWsgYX19ZT1udWxsfWUmJihlLmc9YyxhLmlzRW5hYmxlZCgpfHxlLlgoITEpLGEuQmEoZSksU2IoZSxjKSl9ZWxzZSBjLm5vZGVWYWx1ZSYmSGEoYy5ub2RlVmFsdWUpIT0iInx8Yi5yZW1vdmVDaGlsZChjKTtjPWR9fSxBYz1mdW5jdGlvbihhLGIpe2I9Yi5pKCk7cChiLCJUaGUgY29udGFpbmVyIERPTSBlbGVtZW50IGNhbm5vdCBiZSBudWxsLiIpO0tiKGIsdCk7KGE9YS5BKSYmWmIoYixhKX07dmMucHJvdG90eXBlLmc9ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy1jb250YWluZXIifTsKdmMucHJvdG90eXBlLmo9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nKCksYz1bYixhLkw9PSJob3Jpem9udGFsIj9iKyItaG9yaXpvbnRhbCI6YisiLXZlcnRpY2FsIl07YS5pc0VuYWJsZWQoKXx8Yy5wdXNoKGIrIi1kaXNhYmxlZCIpO3JldHVybiBjfTt2YXIgQmM9ZnVuY3Rpb24oKXt9O3ZhciBNPWZ1bmN0aW9uKCl7fSxDYztpYShNKTt2YXIgRGM9e2J1dHRvbjoicHJlc3NlZCIsY2hlY2tib3g6ImNoZWNrZWQiLG1lbnVpdGVtOiJzZWxlY3RlZCIsbWVudWl0ZW1jaGVja2JveDoiY2hlY2tlZCIsbWVudWl0ZW1yYWRpbzoiY2hlY2tlZCIscmFkaW86ImNoZWNrZWQiLHRhYjoic2VsZWN0ZWQiLHRyZWVpdGVtOiJzZWxlY3RlZCJ9O00ucHJvdG90eXBlLk5hPWZ1bmN0aW9uKCl7fTtNLnByb3RvdHlwZS54YT1mdW5jdGlvbihhKXt2YXIgYj1hLkcsYz1iLmgsZD10aGlzLk4oKSxlPVtkXSxmPXRoaXMuTigpO2YhPWQmJmUucHVzaChmKTtkPWEubTtmb3IoZj1bXTtkOyl7dmFyIGg9ZCYtZDtmLnB1c2goRWModGhpcyxoKSk7ZCY9fmh9ZS5wdXNoLmFwcGx5KGUsZik7KGQ9YS5GYSkmJmUucHVzaC5hcHBseShlLGQpO3JldHVybiBjLmNhbGwoYiwiRElWIixlLmpvaW4oIiAiKSxhLmlhKX07Ck0ucHJvdG90eXBlLnlhPWZ1bmN0aW9uKGEsYil7Yi5pZCYmUGIoYSxiLmlkKTtiJiZiLmZpcnN0Q2hpbGQ/RmMoYSxiLmZpcnN0Q2hpbGQubmV4dFNpYmxpbmc/eWEoYi5jaGlsZE5vZGVzKTpiLmZpcnN0Q2hpbGQpOmEuaWE9bnVsbDt2YXIgYz0wLGQ9dGhpcy5OKCksZT10aGlzLk4oKSxmPSExLGg9ITEsaz15YShMKGIpKTtrLmZvckVhY2goZnVuY3Rpb24ocSl7Znx8cSE9ZD9ofHxxIT1lP2N8PUdjKHRoaXMscSk6aD0hMDooZj0hMCxlPT1kJiYoaD0hMCkpO0djKHRoaXMscSk9PTEmJihzYShiKSxkYihiKSYmZWIoYikmJmNiKGIsITEpKX0sdGhpcyk7YS5tPWM7Znx8KGsucHVzaChkKSxlPT1kJiYoaD0hMCkpO2h8fGsucHVzaChlKTsoYT1hLkZhKSYmay5wdXNoLmFwcGx5KGssYSk7ZiYmaCYmIWF8fG1jKGIsay5qb2luKCIgIikpO3JldHVybiBifTsKdmFyIEhjPWZ1bmN0aW9uKGEsYil7aWYoYT1hLk5hKCkpe3AoYiwiVGhlIGVsZW1lbnQgcGFzc2VkIGFzIGEgZmlyc3QgcGFyYW1ldGVyIGNhbm5vdCBiZSBudWxsLiIpO3ZhciBjPWIuZ2V0QXR0cmlidXRlKCJyb2xlIil8fG51bGw7YSE9YyYmWmIoYixhKX19LEljPWZ1bmN0aW9uKGEsYil7dmFyIGM7aWYoYS5EJjMyJiYoYz1hLmkoKSkpe2lmKCFiJiZhLm0mMzIpe3RyeXtjLmJsdXIoKX1jYXRjaChkKXt9YS5tJjMyJiZhLlFhKG51bGwpfShkYihjKSYmZWIoYykpIT1iJiZjYihjLGIpfX0sSmM9ZnVuY3Rpb24oYSxiLGMpe0NjfHwoQ2M9ezE6ImRpc2FibGVkIiw4OiJzZWxlY3RlZCIsMTY6ImNoZWNrZWQiLDY0OiJleHBhbmRlZCJ9KTtwKGEsIlRoZSBlbGVtZW50IHBhc3NlZCBhcyBhIGZpcnN0IHBhcmFtZXRlciBjYW5ub3QgYmUgbnVsbC4iKTtiPUNjW2JdO3ZhciBkPWEuZ2V0QXR0cmlidXRlKCJyb2xlIil8fG51bGw7ZCYmKGQ9RGNbZF18fGIsYj1iPT0iY2hlY2tlZCJ8fGI9PQoic2VsZWN0ZWQiP2Q6Yik7YiYmYWMoYSxiLGMpfTtNLnByb3RvdHlwZS5OPWZ1bmN0aW9uKCl7cmV0dXJuImdvb2ctY29udHJvbCJ9O3ZhciBFYz1mdW5jdGlvbihhLGIpe2EuZ3x8S2MoYSk7cmV0dXJuIGEuZ1tiXX0sR2M9ZnVuY3Rpb24oYSxiKXthLmh8fChhLmd8fEtjKGEpLGEuaD1FYShhLmcpKTthPXBhcnNlSW50KGEuaFtiXSwxMCk7cmV0dXJuIGlzTmFOKGEpPzA6YX0sS2M9ZnVuY3Rpb24oYSl7dmFyIGI9YS5OKCk7dmFyIGM9Yi5yZXBsYWNlKC9ceGEwfFxzL2csIiAiKS5pbmRleE9mKCIgIikhPS0xO3AoIWMsIkNvbnRyb2xSZW5kZXJlciBoYXMgYW4gaW52YWxpZCBjc3MgY2xhc3M6ICciK2IrIiciKTthLmc9ezE6YisiLWRpc2FibGVkIiwyOmIrIi1ob3ZlciIsNDpiKyItYWN0aXZlIiw4OmIrIi1zZWxlY3RlZCIsMTY6YisiLWNoZWNrZWQiLDMyOmIrIi1mb2N1c2VkIiw2NDpiKyItb3BlbiJ9fTt2YXIgTj1mdW5jdGlvbihhLGIsYyl7Ri5jYWxsKHRoaXMsYyk7aWYoIWIpe2ZvcihiPXRoaXMuY29uc3RydWN0b3I7Yjspe3ZhciBkPW5hKGIpO2lmKGQ9dWNbZF0pYnJlYWs7Yj0oYj1PYmplY3QuZ2V0UHJvdG90eXBlT2YoYi5wcm90b3R5cGUpKSYmYi5jb25zdHJ1Y3Rvcn1iPWQ/dHlwZW9mIGQuVj09PSJmdW5jdGlvbiI/ZC5WKCk6bmV3IGQ6bnVsbH10aGlzLnY9Yjt0aGlzLmlhPWEhPT12b2lkIDA/YTpudWxsfTtuKE4sRik7Zz1OLnByb3RvdHlwZTtnLmlhPW51bGw7Zy5tPTA7Zy5EPTM5O2cuUD0wO2cuT2E9ITA7Zy5GYT1udWxsO2cuSGE9ITA7Zy5tYT1mdW5jdGlvbigpe3ZhciBhPXRoaXMudi54YSh0aGlzKTt0aGlzLmc9YTtIYyh0aGlzLnYsYSk7S2IoYSwhMCk7dGhpcy5pc1Zpc2libGUoKXx8KGEuc3R5bGUuZGlzcGxheT0ibm9uZSIsYSYmYWMoYSwiaGlkZGVuIiwhMCkpfTtnLm5hPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaSgpfTtnLndhPWZ1bmN0aW9uKCl7cmV0dXJuITB9OwpnLkVhPWZ1bmN0aW9uKGEpe3RoaXMuZz1hPXRoaXMudi55YSh0aGlzLGEpO0hjKHRoaXMudixhKTtLYihhLCEwKTt0aGlzLk9hPWEuc3R5bGUuZGlzcGxheSE9Im5vbmUifTsKZy5JPWZ1bmN0aW9uKCl7Ti5sLkkuY2FsbCh0aGlzKTt2YXIgYT10aGlzLmc7cChhLCJDYW4gbm90IGNhbGwgZ2V0RWxlbWVudFN0cmljdCBiZWZvcmUgcmVuZGVyaW5nL2RlY29yYXRpbmcuIik7cCh0aGlzKTtwKGEpO3RoaXMuaXNWaXNpYmxlKCl8fGFjKGEsImhpZGRlbiIsIXRoaXMuaXNWaXNpYmxlKCkpO3RoaXMuaXNFbmFibGVkKCl8fEpjKGEsMSwhdGhpcy5pc0VuYWJsZWQoKSk7dGhpcy5EJjgmJkpjKGEsOCwhISh0aGlzLm0mOCkpO3RoaXMuRCYxNiYmSmMoYSwxNiwhISh0aGlzLm0mMTYpKTt0aGlzLkQmNjQmJkpjKGEsNjQsISEodGhpcy5tJjY0KSk7dmFyIGI9dGhpcy52O1ViKHRoaXMpJiYoYT10aGlzLmkoKSxiPWIuTigpKyItcnRsIiwoYT1hLmk/YS5pKCk6YSkmJnBjKGEsW2JdKSk7dGhpcy5pc0VuYWJsZWQoKSYmSWModGhpcyx0aGlzLmlzVmlzaWJsZSgpKTt0aGlzLkQmLTImJih0aGlzLkhhJiZMYyh0aGlzLCEwKSx0aGlzLkQmMzImJihhPXRoaXMuaSgpKSkmJihiPQp0aGlzLlp8fCh0aGlzLlo9bmV3IEopLGdjKGIsYSksQihCKEIoUWIodGhpcyksYiwia2V5Iix0aGlzLmFhKSxhLCJmb2N1cyIsdGhpcy5YYSksYSwiYmx1ciIsdGhpcy5RYSkpfTt2YXIgTGM9ZnVuY3Rpb24oYSxiKXt2YXIgYz1RYihhKSxkPWEuaSgpO2I/KEIoQihCKEIoYyxkLEsuZ2EsYS5zYSksZCxbSy5oYSxLLmZhXSxhLnZhKSxkLCJtb3VzZW92ZXIiLGEudWEpLGQsIm1vdXNlb3V0IixhLnRhKSxhLmNhIT1CYyYmQihjLGQsImNvbnRleHRtZW51IixhLmNhKSk6KEMoQyhDKEMoYyxkLEsuZ2EsYS5zYSksZCxbSy5oYSxLLmZhXSxhLnZhKSxkLCJtb3VzZW92ZXIiLGEudWEpLGQsIm1vdXNlb3V0IixhLnRhKSxhLmNhIT1CYyYmQyhjLGQsImNvbnRleHRtZW51IixhLmNhKSl9O04ucHJvdG90eXBlLlU9ZnVuY3Rpb24oKXtOLmwuVS5jYWxsKHRoaXMpO3RoaXMuWiYma2ModGhpcy5aKTt0aGlzLmlzVmlzaWJsZSgpJiZ0aGlzLmlzRW5hYmxlZCgpJiZJYyh0aGlzLCExKX07Ck4ucHJvdG90eXBlLkM9ZnVuY3Rpb24oKXtOLmwuQy5jYWxsKHRoaXMpO3RoaXMuWiYmKHRoaXMuWi5kaXNwb3NlKCksZGVsZXRlIHRoaXMuWik7ZGVsZXRlIHRoaXMudjt0aGlzLkZhPXRoaXMuaWE9bnVsbH07dmFyIEZjPWZ1bmN0aW9uKGEsYil7YS5pYT1ifTtOLnByb3RvdHlwZS5pc1Zpc2libGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5PYX07Ti5wcm90b3R5cGUuaXNFbmFibGVkPWZ1bmN0aW9uKCl7cmV0dXJuISh0aGlzLm0mMSl9O04ucHJvdG90eXBlLlg9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5oO2ImJnR5cGVvZiBiLmlzRW5hYmxlZD09ImZ1bmN0aW9uIiYmIWIuaXNFbmFibGVkKCl8fCFPKHRoaXMsMSwhYSl8fChhfHwoTWModGhpcywhMSksUCh0aGlzLCExKSksdGhpcy5pc1Zpc2libGUoKSYmSWModGhpcyxhKSxUKHRoaXMsMSwhYSwhMCkpfTt2YXIgUD1mdW5jdGlvbihhLGIpe08oYSwyLGIpJiZUKGEsMixiKX07Ck4ucHJvdG90eXBlLmlzQWN0aXZlPWZ1bmN0aW9uKCl7cmV0dXJuISEodGhpcy5tJjQpfTsKdmFyIE1jPWZ1bmN0aW9uKGEsYil7TyhhLDQsYikmJlQoYSw0LGIpfSxOYz1mdW5jdGlvbihhLGIpe08oYSw4LGIpJiZUKGEsOCxiKX0sT2M9ZnVuY3Rpb24oYSxiKXtPKGEsNjQsYikmJlQoYSw2NCxiKX0sVD1mdW5jdGlvbihhLGIsYyxkKXtpZighZCYmYj09MSlhLlgoIWMpO2Vsc2UgaWYoYS5EJmImJmMhPSEhKGEubSZiKSl7dmFyIGU9YS52O2lmKGQ9YS5pKCkpe2lmKGU9RWMoZSxiKSl7dmFyIGY9YS5pP2EuaSgpOmE7ZiYmKGM/cGM6cmMpKGYsW2VdKX1KYyhkLGIsYyl9YS5tPWM/YS5tfGI6YS5tJn5ifX0sUGM9ZnVuY3Rpb24oYSxiLGMpe2lmKGEucyYmYS5tJmImJiFjKXRocm93IEVycm9yKCJDb21wb25lbnQgYWxyZWFkeSByZW5kZXJlZCIpOyFjJiZhLm0mYiYmVChhLGIsITEpO2EuRD1jP2EuRHxiOmEuRCZ+Yn0sVT1mdW5jdGlvbihhLGIpe3JldHVybiEhKDI1NSZiKSYmISEoYS5EJmIpfSxPPWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4hIShhLkQmYikmJiEhKGEubSZiKSE9CmMmJighKGEuUCZiKXx8RShhLE5iKGIsYykpKSYmIWEuYmF9O04ucHJvdG90eXBlLnVhPWZ1bmN0aW9uKGEpeyFRYyhhLHRoaXMuaSgpKSYmRSh0aGlzLCJlbnRlciIpJiZ0aGlzLmlzRW5hYmxlZCgpJiZVKHRoaXMsMikmJlAodGhpcywhMCl9O04ucHJvdG90eXBlLnRhPWZ1bmN0aW9uKGEpeyFRYyhhLHRoaXMuaSgpKSYmRSh0aGlzLCJsZWF2ZSIpJiYoVSh0aGlzLDQpJiZNYyh0aGlzLCExKSxVKHRoaXMsMikmJlAodGhpcywhMSkpfTtOLnByb3RvdHlwZS5jYT1CYzt2YXIgUWM9ZnVuY3Rpb24oYSxiKXtyZXR1cm4hIWEucmVsYXRlZFRhcmdldCYmYWIoYixhLnJlbGF0ZWRUYXJnZXQpfTsKTi5wcm90b3R5cGUuc2E9ZnVuY3Rpb24oYSl7aWYodGhpcy5pc0VuYWJsZWQoKSYmKFUodGhpcywyKSYmUCh0aGlzLCEwKSwhKGEuaC5idXR0b24hPTB8fHYmJmEuY3RybEtleSkpKXtVKHRoaXMsNCkmJk1jKHRoaXMsITApO3ZhciBiO2lmKGI9dGhpcy52KXt2YXIgYztiPXRoaXMuRCYzMiYmKGM9dGhpcy5pKCkpP2RiKGMpJiZlYihjKTohMX1iJiZ0aGlzLmkoKS5mb2N1cygpfWEuaC5idXR0b24hPTB8fHYmJmEuY3RybEtleXx8YS5qKCl9O04ucHJvdG90eXBlLnZhPWZ1bmN0aW9uKGEpe3RoaXMuaXNFbmFibGVkKCkmJihVKHRoaXMsMikmJlAodGhpcywhMCksdGhpcy5pc0FjdGl2ZSgpJiZSYyh0aGlzLGEpJiZVKHRoaXMsNCkmJk1jKHRoaXMsITEpKX07CnZhciBSYz1mdW5jdGlvbihhLGIpe2lmKFUoYSwxNikpe3ZhciBjPSEoYS5tJjE2KTtPKGEsMTYsYykmJlQoYSwxNixjKX1VKGEsOCkmJk5jKGEsITApO1UoYSw2NCkmJk9jKGEsIShhLm0mNjQpKTtjPW5ldyB5KCJhY3Rpb24iLGEpO2ImJihjLmFsdEtleT1iLmFsdEtleSxjLmN0cmxLZXk9Yi5jdHJsS2V5LGMubWV0YUtleT1iLm1ldGFLZXksYy5zaGlmdEtleT1iLnNoaWZ0S2V5LGMuRz1iLkcsYy50aW1lU3RhbXA9Yi50aW1lU3RhbXApO3JldHVybiBFKGEsYyl9O04ucHJvdG90eXBlLlhhPWZ1bmN0aW9uKCl7VSh0aGlzLDMyKSYmTyh0aGlzLDMyLCEwKSYmVCh0aGlzLDMyLCEwKX07Ti5wcm90b3R5cGUuUWE9ZnVuY3Rpb24oKXtVKHRoaXMsNCkmJk1jKHRoaXMsITEpO1UodGhpcywzMikmJk8odGhpcywzMiwhMSkmJlQodGhpcywzMiwhMSl9OwpOLnByb3RvdHlwZS5hYT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5pc1Zpc2libGUoKSYmdGhpcy5pc0VuYWJsZWQoKSYmYS5nPT0xMyYmUmModGhpcyxhKT8oYS5qKCksYS52KCksITApOiExfTtpZih0eXBlb2YgTiE9PSJmdW5jdGlvbiIpdGhyb3cgRXJyb3IoIkludmFsaWQgY29tcG9uZW50IGNsYXNzICIrTik7aWYodHlwZW9mIE0hPT0iZnVuY3Rpb24iKXRocm93IEVycm9yKCJJbnZhbGlkIHJlbmRlcmVyIGNsYXNzICIrTSk7dmFyIFNjPW5hKE4pO3VjW1NjXT1NO3RjKCJnb29nLWNvbnRyb2wiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBOKG51bGwpfSk7dmFyIFY9ZnVuY3Rpb24oYSxiLGMpe0YuY2FsbCh0aGlzLGMpO3RoaXMuZWE9Ynx8dmMuVigpO3RoaXMuTD1hfHwidmVydGljYWwifTtuKFYsRik7Zz1WLnByb3RvdHlwZTtnLkthPW51bGw7Zy5kYT1udWxsO2cuZWE9bnVsbDtnLkw9bnVsbDtnLlM9ITA7Zy5UPSEwO2cubz0tMTtnLkI9bnVsbDtnLlc9ITE7Zy5PPW51bGw7dmFyIFRjPWZ1bmN0aW9uKGEpe3JldHVybiBhLkthfHxhLmkoKX07Zz1WLnByb3RvdHlwZTtnLm1hPWZ1bmN0aW9uKCl7dGhpcy5nPXRoaXMuRy5oKCJESVYiLHRoaXMuZWEuaih0aGlzKS5qb2luKCIgIikpfTtnLm5hPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaSgpfTtnLndhPWZ1bmN0aW9uKGEpe3JldHVybiBhLnRhZ05hbWU9PSJESVYifTtnLkVhPWZ1bmN0aW9uKGEpe3RoaXMuZz15Yyh0aGlzLmVhLHRoaXMsYSk7YS5zdHlsZS5kaXNwbGF5PT0ibm9uZSImJih0aGlzLlM9ITEpfTsKZy5JPWZ1bmN0aW9uKCl7Vi5sLkkuY2FsbCh0aGlzKTtUYih0aGlzLGZ1bmN0aW9uKGIpe2IucyYmVWModGhpcyxiKX0sdGhpcyk7dmFyIGE9dGhpcy5pKCk7QWModGhpcy5lYSx0aGlzKTtWYyh0aGlzLHRoaXMuUyk7QihCKEIoQihCKEIoQihCKFFiKHRoaXMpLHRoaXMsImVudGVyIix0aGlzLmViKSx0aGlzLCJoaWdobGlnaHQiLHRoaXMuZmIpLHRoaXMsInVuaGlnaGxpZ2h0Iix0aGlzLmxiKSx0aGlzLCJvcGVuIix0aGlzLmdiKSx0aGlzLCJjbG9zZSIsdGhpcy5iYiksYSxLLmdhLHRoaXMuV2EpLGJiKGEpLFtLLmhhLEsuZmFdLHRoaXMuY2IpLGEsW0suZ2EsSy5oYSxLLmZhLCJtb3VzZW92ZXIiLCJtb3VzZW91dCIsImNvbnRleHRtZW51Il0sdGhpcy5hYik7V2ModGhpcyl9O3ZhciBXYz1mdW5jdGlvbihhKXt2YXIgYj1RYihhKSxjPVRjKGEpO0IoQihCKGIsYywiZm9jdXMiLGEuUGEpLGMsImJsdXIiLGEuVWEpLGEuZGF8fChhLmRhPW5ldyBKKFRjKGEpKSksImtleSIsYS5WYSl9OwpnPVYucHJvdG90eXBlO2cuVT1mdW5jdGlvbigpe1hjKHRoaXMsLTEpO3RoaXMuQiYmT2ModGhpcy5CLCExKTt0aGlzLlc9ITE7Vi5sLlUuY2FsbCh0aGlzKX07Zy5DPWZ1bmN0aW9uKCl7Vi5sLkMuY2FsbCh0aGlzKTt0aGlzLmRhJiYodGhpcy5kYS5kaXNwb3NlKCksdGhpcy5kYT1udWxsKTt0aGlzLmVhPXRoaXMuQj10aGlzLk89dGhpcy5LYT1udWxsfTtnLmViPWZ1bmN0aW9uKCl7cmV0dXJuITB9OwpnLmZiPWZ1bmN0aW9uKGEpe3ZhciBiPVZiKHRoaXMsYS50YXJnZXQpO2lmKGI+LTEmJmIhPXRoaXMubyl7dmFyIGM9SSh0aGlzLHRoaXMubyk7YyYmUChjLCExKTt0aGlzLm89YjtjPUkodGhpcyx0aGlzLm8pO3RoaXMuVyYmTWMoYywhMCk7dGhpcy5CJiZjIT10aGlzLkImJihjLkQmNjQ/T2MoYywhMCk6T2ModGhpcy5CLCExKSl9Yj10aGlzLmkoKTtwKGIsIlRoZSBET00gZWxlbWVudCBmb3IgdGhlIGNvbnRhaW5lciBjYW5ub3QgYmUgbnVsbC4iKTthLnRhcmdldC5pKCkhPW51bGwmJmFjKGIsImFjdGl2ZWRlc2NlbmRhbnQiLGEudGFyZ2V0LmkoKS5pZCl9O2cubGI9ZnVuY3Rpb24oYSl7YS50YXJnZXQ9PUkodGhpcyx0aGlzLm8pJiYodGhpcy5vPS0xKTthPXRoaXMuaSgpO3AoYSwiVGhlIERPTSBlbGVtZW50IGZvciB0aGUgY29udGFpbmVyIGNhbm5vdCBiZSBudWxsLiIpO2EucmVtb3ZlQXR0cmlidXRlKCRiKCJhY3RpdmVkZXNjZW5kYW50IikpfTsKZy5nYj1mdW5jdGlvbihhKXsoYT1hLnRhcmdldCkmJmEhPXRoaXMuQiYmYS5oPT10aGlzJiYodGhpcy5CJiZPYyh0aGlzLkIsITEpLHRoaXMuQj1hKX07Zy5iYj1mdW5jdGlvbihhKXthLnRhcmdldD09dGhpcy5CJiYodGhpcy5CPW51bGwpO3ZhciBiPXRoaXMuaSgpLGM9YS50YXJnZXQuaSgpO2ImJmEudGFyZ2V0Lm0mMiYmYyYmKGE9IiIsYyYmKGE9Yy5pZCxwKGEsIlRoZSBhY3RpdmUgZWxlbWVudCBzaG91bGQgaGF2ZSBhbiBpZC4iKSksYWMoYiwiYWN0aXZlZGVzY2VuZGFudCIsYSkpfTtnLldhPWZ1bmN0aW9uKGEpe3RoaXMuVCYmKHRoaXMuVz0hMCk7dmFyIGI9VGModGhpcyk7YiYmZGIoYikmJmViKGIpP2IuZm9jdXMoKTphLmooKX07Zy5jYj1mdW5jdGlvbigpe3RoaXMuVz0hMX07CmcuYWI9ZnVuY3Rpb24oYSl7YTp7dmFyIGI9YS50YXJnZXQ7aWYodGhpcy5PKWZvcih2YXIgYz10aGlzLmkoKTtiJiZiIT09Yzspe3ZhciBkPWIuaWQ7aWYoZCBpbiB0aGlzLk8pe2I9dGhpcy5PW2RdO2JyZWFrIGF9Yj1iLnBhcmVudE5vZGV9Yj1udWxsfWlmKGIpc3dpdGNoKGEudHlwZSl7Y2FzZSBLLmdhOmIuc2EoYSk7YnJlYWs7Y2FzZSBLLmhhOmNhc2UgSy5mYTpiLnZhKGEpO2JyZWFrO2Nhc2UgIm1vdXNlb3ZlciI6Yi51YShhKTticmVhaztjYXNlICJtb3VzZW91dCI6Yi50YShhKTticmVhaztjYXNlICJjb250ZXh0bWVudSI6Yi5jYShhKX19O2cuUGE9ZnVuY3Rpb24oKXt9O2cuVWE9ZnVuY3Rpb24oKXtYYyh0aGlzLC0xKTt0aGlzLlc9ITE7dGhpcy5CJiZPYyh0aGlzLkIsITEpfTsKZy5WYT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5pc0VuYWJsZWQoKSYmdGhpcy5pc1Zpc2libGUoKSYmKEgodGhpcykhPTB8fHRoaXMuS2EpJiZZYyh0aGlzLGEpPyhhLmooKSxhLnYoKSwhMCk6ITF9Owp2YXIgWWM9ZnVuY3Rpb24oYSxiKXt2YXIgYz1JKGEsYS5vKTtpZihjJiZ0eXBlb2YgYy5hYT09ImZ1bmN0aW9uIiYmYy5hYShiKXx8YS5CJiZhLkIhPWMmJnR5cGVvZiBhLkIuYWE9PSJmdW5jdGlvbiImJmEuQi5hYShiKSlyZXR1cm4hMDtpZihiLnNoaWZ0S2V5fHxiLmN0cmxLZXl8fGIubWV0YUtleXx8Yi5hbHRLZXkpcmV0dXJuITE7c3dpdGNoKGIuZyl7Y2FzZSAyNzpUYyhhKS5ibHVyKCk7YnJlYWs7Y2FzZSAzNjpaYyhhKTticmVhaztjYXNlIDM1OiRjKGEpO2JyZWFrO2Nhc2UgMzg6aWYoYS5MPT0idmVydGljYWwiKWFkKGEpO2Vsc2UgcmV0dXJuITE7YnJlYWs7Y2FzZSAzNzppZihhLkw9PSJob3Jpem9udGFsIilVYihhKT9iZChhKTphZChhKTtlbHNlIHJldHVybiExO2JyZWFrO2Nhc2UgNDA6aWYoYS5MPT0idmVydGljYWwiKWJkKGEpO2Vsc2UgcmV0dXJuITE7YnJlYWs7Y2FzZSAzOTppZihhLkw9PSJob3Jpem9udGFsIilVYihhKT9hZChhKTpiZChhKTtlbHNlIHJldHVybiExOwpicmVhaztkZWZhdWx0OnJldHVybiExfXJldHVybiEwfSxVYz1mdW5jdGlvbihhLGIpe3ZhciBjPWIuaSgpO2M9Yy5pZHx8KGMuaWQ9T2IoYikpO2EuT3x8KGEuTz17fSk7YS5PW2NdPWJ9O1YucHJvdG90eXBlLkJhPWZ1bmN0aW9uKGEsYil7dWEoYSxOLCJUaGUgY2hpbGQgb2YgYSBjb250YWluZXIgbXVzdCBiZSBhIGNvbnRyb2wiKTtWLmwuQmEuY2FsbCh0aGlzLGEsYil9O1YucHJvdG90eXBlLkNhPWZ1bmN0aW9uKGEsYixjKXt1YShhLE4pO2EuUHw9MjthLlB8PTY0O1BjKGEsMzIsITEpO2EucyYmMCE9YS5IYSYmTGMoYSwhMSk7YS5IYT0hMTt2YXIgZD1hLmg9PXRoaXM/VmIodGhpcyxhKTotMTtWLmwuQ2EuY2FsbCh0aGlzLGEsYixjKTthLnMmJnRoaXMucyYmVWModGhpcyxhKTthPWQ7YT09LTEmJihhPUgodGhpcykpO2E9PXRoaXMubz90aGlzLm89TWF0aC5taW4oSCh0aGlzKS0xLGIpOmE+dGhpcy5vJiZiPD10aGlzLm8/dGhpcy5vKys6YTx0aGlzLm8mJmI+dGhpcy5vJiZ0aGlzLm8tLX07CnZhciB6Yz1mdW5jdGlvbihhLGIpe2lmKGEuaSgpKXRocm93IEVycm9yKCJDb21wb25lbnQgYWxyZWFkeSByZW5kZXJlZCIpO2EuTD1ifTtWLnByb3RvdHlwZS5pc1Zpc2libGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5TfTt2YXIgVmM9ZnVuY3Rpb24oYSxiKXthLlM9Yjt2YXIgYz1hLmkoKTtjJiYoYy5zdHlsZS5kaXNwbGF5PWI/IiI6Im5vbmUiLHdjKFRjKGEpLGEuVCYmYS5TKSl9O1YucHJvdG90eXBlLmlzRW5hYmxlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLlR9O1YucHJvdG90eXBlLlg9ZnVuY3Rpb24oYSl7dGhpcy5UIT1hJiZFKHRoaXMsYT8iZW5hYmxlIjoiZGlzYWJsZSIpJiYoYT8odGhpcy5UPSEwLFRiKHRoaXMsZnVuY3Rpb24oYil7Yi5UYT9kZWxldGUgYi5UYTpiLlgoITApfSkpOihUYih0aGlzLGZ1bmN0aW9uKGIpe2IuaXNFbmFibGVkKCk/Yi5YKCExKTpiLlRhPSEwfSksdGhpcy5XPXRoaXMuVD0hMSksd2MoVGModGhpcyksYSYmdGhpcy5TKSl9Owp2YXIgWGM9ZnVuY3Rpb24oYSxiKXsoYj1JKGEsYikpP1AoYiwhMCk6YS5vPi0xJiZQKEkoYSxhLm8pLCExKX0sWmM9ZnVuY3Rpb24oYSl7Y2QoYSxmdW5jdGlvbihiLGMpe3JldHVybihiKzEpJWN9LEgoYSktMSl9LCRjPWZ1bmN0aW9uKGEpe2NkKGEsZnVuY3Rpb24oYixjKXtiLS07cmV0dXJuIGI8MD9jLTE6Yn0sMCl9LGJkPWZ1bmN0aW9uKGEpe2NkKGEsZnVuY3Rpb24oYixjKXtyZXR1cm4oYisxKSVjfSxhLm8pfSxhZD1mdW5jdGlvbihhKXtjZChhLGZ1bmN0aW9uKGIsYyl7Yi0tO3JldHVybiBiPDA/Yy0xOmJ9LGEubyl9LGNkPWZ1bmN0aW9uKGEsYixjKXtjPWM8MD9WYihhLGEuQik6Yzt2YXIgZD1IKGEpO2M9Yi5jYWxsKGEsYyxkKTtmb3IodmFyIGU9MDtlPD1kOyl7dmFyIGY9SShhLGMpO2lmKGYmJmYuaXNWaXNpYmxlKCkmJmYuaXNFbmFibGVkKCkmJmYuRCYyKXthLkxhKGMpO2JyZWFrfWUrKztjPWIuY2FsbChhLGMsZCl9fTsKVi5wcm90b3R5cGUuTGE9ZnVuY3Rpb24oYSl7WGModGhpcyxhKX07dmFyIGRkPWZ1bmN0aW9uKCl7fTtuKGRkLE0pO2lhKGRkKTtnPWRkLnByb3RvdHlwZTtnLk49ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy10YWIifTtnLk5hPWZ1bmN0aW9uKCl7cmV0dXJuInRhYiJ9O2cueGE9ZnVuY3Rpb24oYSl7dmFyIGI9ZGQubC54YS5jYWxsKHRoaXMsYSk7KGE9YS5HYSgpKSYmdGhpcy5NYShiLGEpO3JldHVybiBifTtnLnlhPWZ1bmN0aW9uKGEsYil7Yj1kZC5sLnlhLmNhbGwodGhpcyxhLGIpO3ZhciBjPXRoaXMuR2EoYik7YyYmKGEuUmE9Yyk7YS5tJjgmJihjPWEuaCkmJnR5cGVvZiBjLko9PT0iZnVuY3Rpb24iJiYoVChhLDgsITEpLGMuSihhKSk7cmV0dXJuIGJ9O2cuR2E9ZnVuY3Rpb24oYSl7cmV0dXJuIGEudGl0bGV8fCIifTtnLk1hPWZ1bmN0aW9uKGEsYil7YSYmKGEudGl0bGU9Ynx8IiIpfTt2YXIgZWQ9ZnVuY3Rpb24oYSxiLGMpe04uY2FsbCh0aGlzLGEsYnx8ZGQuVigpLGMpO1BjKHRoaXMsOCwhMCk7dGhpcy5QfD05fTtuKGVkLE4pO2VkLnByb3RvdHlwZS5HYT1mdW5jdGlvbigpe3JldHVybiB0aGlzLlJhfTtlZC5wcm90b3R5cGUuTWE9ZnVuY3Rpb24oYSl7dGhpcy52Lk1hKHRoaXMuaSgpLGEpO3RoaXMuUmE9YX07dGMoImdvb2ctdGFiIixmdW5jdGlvbigpe3JldHVybiBuZXcgZWQobnVsbCl9KTt2YXIgVz1mdW5jdGlvbigpe3RoaXMuQT0idGFibGlzdCJ9O24oVyx2Yyk7aWEoVyk7Vy5wcm90b3R5cGUuZz1mdW5jdGlvbigpe3JldHVybiJnb29nLXRhYi1iYXIifTtXLnByb3RvdHlwZS51PWZ1bmN0aW9uKGEsYixjKXt0aGlzLnZ8fCh0aGlzLmh8fGZkKHRoaXMpLHRoaXMudj1FYSh0aGlzLmgpKTt2YXIgZD10aGlzLnZbYl07ZD8oemMoYSxnZChkKSksYS52PWQpOlcubC51LmNhbGwodGhpcyxhLGIsYyl9O1cucHJvdG90eXBlLmo9ZnVuY3Rpb24oYSl7dmFyIGI9Vy5sLmouY2FsbCh0aGlzLGEpO3RoaXMuaHx8ZmQodGhpcyk7Yi5wdXNoKHRoaXMuaFthLnZdKTtyZXR1cm4gYn07dmFyIGZkPWZ1bmN0aW9uKGEpe3ZhciBiPWEuZygpO2EuaD17dG9wOmIrIi10b3AiLGJvdHRvbTpiKyItYm90dG9tIixzdGFydDpiKyItc3RhcnQiLGVuZDpiKyItZW5kIn19O3ZhciBYPWZ1bmN0aW9uKGEsYixjKXthPWF8fCJ0b3AiO3pjKHRoaXMsZ2QoYSkpO3RoaXMudj1hO1YuY2FsbCh0aGlzLHRoaXMuTCxifHxXLlYoKSxjKTtoZCh0aGlzKX07bihYLFYpO2c9WC5wcm90b3R5cGU7Zy5IPW51bGw7Zy5JPWZ1bmN0aW9uKCl7WC5sLkkuY2FsbCh0aGlzKTtoZCh0aGlzKX07Zy5DPWZ1bmN0aW9uKCl7WC5sLkMuY2FsbCh0aGlzKTt0aGlzLkg9bnVsbH07Zy5MYT1mdW5jdGlvbihhKXtYLmwuTGEuY2FsbCh0aGlzLGEpO3RoaXMuSihJKHRoaXMsYSkpfTtnLko9ZnVuY3Rpb24oYSl7YT9OYyhhLCEwKTp0aGlzLkgmJk5jKHRoaXMuSCwhMSl9Owp2YXIgaWQ9ZnVuY3Rpb24oYSxiKXtpZihiJiZiPT1hLkgpe2Zvcih2YXIgYz1WYihhLGIpLGQ9Yy0xO2I9SShhLGQpO2QtLSl7dmFyIGU9YjtpZihlLmlzVmlzaWJsZSgpJiZlLmlzRW5hYmxlZCgpKXthLkooYik7cmV0dXJufX1mb3IoYys9MTtiPUkoYSxjKTtjKyspaWYoZD1iLGQuaXNWaXNpYmxlKCkmJmQuaXNFbmFibGVkKCkpe2EuSihiKTtyZXR1cm59YS5KKG51bGwpfX07Zz1YLnByb3RvdHlwZTtnLmpiPWZ1bmN0aW9uKGEpe3RoaXMuSCYmdGhpcy5IIT1hLnRhcmdldCYmTmModGhpcy5ILCExKTt0aGlzLkg9YS50YXJnZXR9O2cua2I9ZnVuY3Rpb24oYSl7YS50YXJnZXQ9PXRoaXMuSCYmKHRoaXMuSD1udWxsKX07Zy5oYj1mdW5jdGlvbihhKXtpZCh0aGlzLGEudGFyZ2V0KX07Zy5pYj1mdW5jdGlvbihhKXtpZCh0aGlzLGEudGFyZ2V0KX07Zy5QYT1mdW5jdGlvbigpe0kodGhpcyx0aGlzLm8pfHxYYyh0aGlzLFZiKHRoaXMsdGhpcy5IfHxJKHRoaXMsMCkpKX07CnZhciBoZD1mdW5jdGlvbihhKXtCKEIoQihCKFFiKGEpLGEsInNlbGVjdCIsYS5qYiksYSwidW5zZWxlY3QiLGEua2IpLGEsImRpc2FibGUiLGEuaGIpLGEsImhpZGUiLGEuaWIpfSxnZD1mdW5jdGlvbihhKXtyZXR1cm4gYT09InN0YXJ0Inx8YT09ImVuZCI/InZlcnRpY2FsIjoiaG9yaXpvbnRhbCJ9O3RjKCJnb29nLXRhYi1iYXIiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBYfSk7ZnVuY3Rpb24gamQoYSl7dmFyIGI9e3RvcDoiYm90dG9tIixib3R0b206InRvcCIsc3RhcnQ6InJpZ2h0IixlbmQ6ImxlZnQifVthLmxvY2F0aW9uXSxjPWEuZWxlbWVudElkLGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTtkLnRleHRDb250ZW50PSJcbiAgICBmaWVsZHNldCB7XG4gICAgICBwYWRkaW5nOiAxMHB4O1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgIzM2OTtcbiAgICB9XG5cbiAgICAjIitjKyIgLmdvb2ctdGFiLWNvbnRlbnQge1xuICAgICAgbWluLWhlaWdodDogM2VtO1xuICAgICAgbWFyZ2luOiAwO1xuICAgICAgYm9yZGVyOiAiK2EuYm9yZGVyKyIgc29saWQgIithLmJvcmRlckNvbG9yKyI7XG4gICAgICBib3JkZXItdG9wOiAwO1xuICAgICAgaGVpZ2h0OiAiK2EuY29udGVudEhlaWdodCsiO1xuICAgICAgcGFkZGluZzogNHB4IDhweDtcbiAgICAgIG1hcmdpbi1yaWdodDogNHB4O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgIG92ZXJmbG93OiBhdXRvO1xuICAgIH1cblxuICAgICMiKwpjKyIgLmdvb2ctdGFiLWJhci0iK2EubG9jYXRpb24rIiAuZ29vZy10YWItc2VsZWN0ZWQge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICIrYS5ib3JkZXJDb2xvcisiO1xuICAgICAgYm9yZGVyLSIrYisiOiAwcHg7XG4gICAgfVxuXG4gICAgIyIrYysiIC5nb29nLXRhYi1iYXItIithLmxvY2F0aW9uKyIge1xuICAgICAgcGFkZGluZy0iK2EubG9jYXRpb24rIjogNXB4ICFpbXBvcnRhbnQ7XG4gICAgICBib3JkZXItIitiKyI6IDFweCBzb2xpZCAiK2EuYm9yZGVyQ29sb3IrIiAhaW1wb3J0YW50O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICB9XG5cbiAgICAjIitjKyIgLmdvb2ctdGFiLWJhciB7XG4gICAgICAgbWFyZ2luOiAwO1xuICAgICAgIGJvcmRlcjogMDtcbiAgICAgICBwYWRkaW5nOiAwO1xuICAgICAgIGxpc3Qtc3R5bGU6IG5vbmU7XG4gICAgICAgY3Vyc29yOiBkZWZhdWx0O1xuICAgICAgIG91dGxpbmU6IG5vbmU7XG4gICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgICBtYXJnaW4tcmlnaHQ6IDRweDtcbiAgICAgIH1cblxuICAgICAjIisKYysiIC5nb29nLXRhYiB7XG4gICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgIHBhZGRpbmc6IDRweCA4cHg7XG4gICAgICAgY29sb3I6IHZhcigtLWNvbGFiLXByaW1hcnktdGV4dC1jb2xvcik7XG4gICAgICAgdGV4dC1kZWNvcmF0aW9uOiBpbml0aWFsO1xuICAgICAgIGN1cnNvcjogZGVmYXVsdDtcbiAgICAgIH1cblxuICAgICAgIyIrYysiIC5nb29nLXRhYi1ob3ZlciB7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWNvbGFiLWhpZ2hsaWdodGVkLXN1cmZhY2UtY29sb3IpO1xuICAgICAgfVxuICAgICAgIjtyZXR1cm4gZH0KdmFyIGtkPWZ1bmN0aW9uKGEpe3ZhciBiPWEuZWxlbWVudElkLGM9YS50YWJOYW1lcyxkPWEuc2VsZWN0ZWRJbmRleDsiY29udGVudEJvcmRlciJpbiBhfHwoYS5jb250ZW50Qm9yZGVyPSIwcHgiKTsiY29udGVudEhlaWdodCJpbiBhfHwoYS5jb250ZW50SGVpZ2h0PSJpbml0aWFsIik7ImJvcmRlckNvbG9yImluIGF8fChhLmJvcmRlckNvbG9yPSJ2YXIoLS1jb2xhYi1ib3JkZXItY29sb3IpIik7YS5sb2NhdGlvbnx8KGEubG9jYXRpb249InRvcCIpO3ZhciBlPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiMiK2IpLGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zi5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYi1iYXIiKTt2YXIgaD1hLmxvY2F0aW9uO2YuY2xhc3NMaXN0LmFkZCgiZ29vZy10YWItYmFyLSIraCk7Zm9yKHZhciBrPVtdLHE9ZmEoYyksRz1xLm5leHQoKTshRy5kb25lO0c9cS5uZXh0KCkpe0c9Ry52YWx1ZTt2YXIgeD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKeC5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYiIpO3gudGV4dENvbnRlbnQ9RztmLmFwcGVuZENoaWxkKHgpO2sucHVzaCh4KX1oIT0iYm90dG9tIiYmZS5hcHBlbmRDaGlsZChmKTtxPW51bGw7aWYoaD09InRvcCJ8fGg9PSJib3R0b20iKXE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikscS5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYi1iYXItY2xlYXIiKTtoPT0idG9wIiYmcSYmZS5hcHBlbmRDaGlsZChxKTtHPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO0cuY2xhc3NMaXN0LmFkZCgiZ29vZy10YWItY29udGVudCIpO3ZhciBoYT1bXTtjPWZhKGMpO2Zvcih4PWMubmV4dCgpOyF4LmRvbmU7eD1jLm5leHQoKSl4PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHguaWQ9ZS5pZCsiX2NvbnRlbnRfIitoYS5sZW5ndGgseC5zdHlsZS5kaXNwbGF5PSJub25lIixHLmFwcGVuZENoaWxkKHgpLGhhLnB1c2goeCk7ZS5hcHBlbmRDaGlsZChHKTtoPT0iYm90dG9tIiYmKHEmJgplLmFwcGVuZENoaWxkKHEpLGUuYXBwZW5kQ2hpbGQoZikpO3ZhciBRPW5ldyBYKGgpO1NiKFEsZik7dmFyIFI9LTE7d2IoUSwic2VsZWN0IixmdW5jdGlvbihTKXtTPWsuaW5kZXhPZihTLnRhcmdldC5pKCkpO1MhPVImJihSPj0wJiZSPGhhLmxlbmd0aCYmKGhhW1JdLnN0eWxlLmRpc3BsYXk9Im5vbmUiLFI9LTEpLFM+PTAmJlM8aGEubGVuZ3RoJiYoUj1TLGhhW1JdLnN0eWxlLmRpc3BsYXk9ImlubGluZSIsd2luZG93LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCJyZXNpemUiKSksZ29vZ2xlLmNvbGFiLm91dHB1dC5yZXNpemVJZnJhbWVUb0NvbnRlbnQoKSksUS5KKEkoUSxSKSkpfSk7US5KKEkoUSxkKSk7d2luZG93W2JdPXtzZXRTZWxlY3RlZFRhYkluZGV4OmZ1bmN0aW9uKFMpe1EuSihJKFEsUykpfX07ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChqZChhKSl9LGxkPVsiY29sYWJfbGliIiwiY3JlYXRlVGFiQmFyIl0sWT1sOwpsZFswXWluIFl8fHR5cGVvZiBZLmV4ZWNTY3JpcHQ9PSJ1bmRlZmluZWQifHxZLmV4ZWNTY3JpcHQoInZhciAiK2xkWzBdKTtmb3IodmFyIFo7bGQubGVuZ3RoJiYoWj1sZC5zaGlmdCgpKTspbGQubGVuZ3RofHxrZD09PXZvaWQgMD9ZW1pdJiZZW1pdIT09T2JqZWN0LnByb3RvdHlwZVtaXT9ZPVlbWl06WT1ZW1pdPXt9OllbWl09a2Q7fSkuY2FsbCh0aGlzKTsKLy8gY2xhbmctZm9ybWF0IG9uCg==", + "ok": true, + "headers": [ + [ + "content-length", + "41785" + ], + [ + "content-type", + "application/javascript" + ] + ], + "status": 200, + "status_text": "" + } + }, + "base_uri": "https://localhost:8080/", + "height": 291 + }, + "outputId": "d9b052cf-5aa4-4dd4-cd63-b8769b96b35c" + }, + "source": [ + "%%logica WritesCode\n", + "\n", + "Employee(name: \"Alice\", role: \"Product Manager\", office: \"SEA\");\n", + "Employee(name: \"Bob\", role: \"Engineer\", office: \"SEA\");\n", + "Employee(name: \"Caroline\", role: \"Engineer\", office: \"LAX\");\n", + "Employee(name: \"David\", role: \"Data Scientist\", office: \"LAX\");\n", + "Employee(name: \"Eve\", role: \"Data Scientist\", office: \"SEA\");\n", + "\n", + "# Engineers and data scientists write code.\n", + "WritesCode(name:) :-\n", + " Employee(name:, role: \"Engineer\") |\n", + " Employee(name:, role: \"Data Scientist\");\n" + ], + "execution_count": 15, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"f0f2177e-d22c-11ef-a7c0-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id24\", \"tabNames\": [\"WritesCode\", \"(Log)\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_05ef432225" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"f0f26ce2-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id24\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_f2731a2f79" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"f0f41876-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_825df09bd5" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"f0f48158-d22c-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id24_content_1\");\n", + "//# sourceURL=js_90fc08f9a0" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"f0f4da72-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"f0f48158-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_954c2e871f" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"f0f59d22-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id24\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_372495d268" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"f0fa8a9e-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"f0f41876-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_d0e51437d2" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"f0fc8452-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_aa6df636d0" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"f0fcd470-d22c-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id24_content_0\");\n", + "//# sourceURL=js_022d050b6d" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"f0fd3942-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"f0fcd470-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_0a833fd14c" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"f0fe0cfa-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id24\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_ece864c27c" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"f1009f06-d22c-11ef-a7c0-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id25\", \"tabNames\": [\"SQL\", \"Result\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_5bf6e73531" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"f101118e-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id25\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_7395301b3d" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"f1033e46-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_40a445a43c" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"f103cf3c-d22c-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id25_content_0\");\n", + "//# sourceURL=js_ee5b4f4a3f" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"f1041f14-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"f103cf3c-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_eeb070a00e" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"f10465aa-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id25\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_f87c7c9e1b" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The following query is stored at \u001b[1mWritesCode_sql\u001b[0m variable.\n", + "-- Initializing DuckDB environment.\n", + "create schema if not exists logica_home;\n", + "-- Empty record, has to have a field by DuckDB syntax.\n", + "drop type if exists logicarecord893574736 cascade; create type logicarecord893574736 as struct(nirvana numeric);\n", + "create sequence if not exists eternal_logical_sequence;\n", + "\n", + "\n", + "-- Logica type: logicarecord481217614\n", + "drop type if exists logicarecord481217614 cascade; create type logicarecord481217614 as struct(r logicarecord893574736);\n", + "\n", + "-- Logica type: logicarecord383307722\n", + "drop type if exists logicarecord383307722 cascade; create type logicarecord383307722 as struct(a timestamp);\n", + "WITH t_0_Employee AS (SELECT * FROM (\n", + " \n", + " SELECT\n", + " 'Alice' AS name,\n", + " 'Product Manager' AS role,\n", + " 'SEA' AS office\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " 'Bob' AS name,\n", + " 'Engineer' AS role,\n", + " 'SEA' AS office\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " 'Caroline' AS name,\n", + " 'Engineer' AS role,\n", + " 'LAX' AS office\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " 'David' AS name,\n", + " 'Data Scientist' AS role,\n", + " 'LAX' AS office\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " 'Eve' AS name,\n", + " 'Data Scientist' AS role,\n", + " 'SEA' AS office\n", + " \n", + ") AS UNUSED_TABLE_NAME )\n", + "SELECT * FROM (\n", + " \n", + " SELECT\n", + " Employee.name AS name\n", + " FROM\n", + " t_0_Employee AS Employee\n", + " WHERE\n", + " (Employee.role = 'Engineer')\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " Employee.name AS name\n", + " FROM\n", + " t_0_Employee AS Employee\n", + " WHERE\n", + " (Employee.role = 'Data Scientist')\n", + " \n", + ") AS UNUSED_TABLE_NAME ;\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"f10604f0-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"f1033e46-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_0db9c39974" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"f107a3f0-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_eaea0ae293" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"f107e950-d22c-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id25_content_1\");\n", + "//# sourceURL=js_ba8f500d14" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"f1082b7c-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"f107e950-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_216af797b3" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"f10887a2-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id25\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_40b0112f53" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The following table is stored at \u001b[1mWritesCode\u001b[0m variable.\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
name
0Bob
1Caroline
2David
3Eve
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"f109a9ac-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"f107a3f0-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_1e16654e29" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"f10ae7d6-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"f0fc8452-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_545ec5866c" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"f10c847e-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_33e89d0ca8" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"f10cd082-d22c-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id24_content_1\");\n", + "//# sourceURL=js_b1c5a41be9" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"f10d16be-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"f10cd082-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_12a61a27dc" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"f10d5e3a-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id24\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_30cb4d1ab5" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "image/svg+xml": "\n\n\n\n\n\nConcertina\n\n\n\nWritesCode\n\nWritesCode\n\n\n\n", + "text/plain": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Running predicate: WritesCode (5 ms)\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"f1217bd6-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"f10c847e-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_f963da8f66" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"f12322d8-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_95ef8431be" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"f12371d4-d22c-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id24_content_0\");\n", + "//# sourceURL=js_f1216a48a8" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"f123bbbc-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"f12371d4-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_8a2b492a88" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"f123fbcc-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id24\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_a051d686f0" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"f12516ce-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_9bc9eb2b33" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"f1255d14-d22c-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id25_content_1\");\n", + "//# sourceURL=js_15cd3e5b26" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"f125a210-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"f1255d14-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_b19b4e5b8a" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"f125e464-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id25\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_0fdd9a43d7" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"f127d83c-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"f12516ce-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_2678f409ab" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + " \n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"f12934d4-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"f12322d8-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_b2381a1326" + ] + }, + "metadata": {} + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "NOZOU2vgmoCp" + }, + "source": [ + "### Negation\n", + "\n", + "Negation of a predicate is denoted `~`, while `!` is used to negate a boolean value.\n" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "JtMLLq0CnG-Y", + "colab": { + "resources": { + "http://localhost:8080/nbextensions/google.colab/tabbar.css": { + "data": "Lmdvb2ctdGFie3Bvc2l0aW9uOnJlbGF0aXZlO3BhZGRpbmc6NHB4IDhweDtjb2xvcjojMDBjO3RleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7Y3Vyc29yOmRlZmF1bHR9Lmdvb2ctdGFiLWJhci10b3AgLmdvb2ctdGFie21hcmdpbjoxcHggNHB4IDAgMDtib3JkZXItYm90dG9tOjA7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLXRvcDphZnRlciwuZ29vZy10YWItYmFyLWJvdHRvbTphZnRlcntjb250ZW50OiIgIjtkaXNwbGF5OmJsb2NrO2hlaWdodDowO2NsZWFyOmJvdGg7dmlzaWJpbGl0eTpoaWRkZW59Lmdvb2ctdGFiLWJhci1ib3R0b20gLmdvb2ctdGFie21hcmdpbjowIDRweCAxcHggMDtib3JkZXItdG9wOjA7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLXN0YXJ0IC5nb29nLXRhYnttYXJnaW46MCAwIDRweCAxcHg7Ym9yZGVyLXJpZ2h0OjB9Lmdvb2ctdGFiLWJhci1lbmQgLmdvb2ctdGFie21hcmdpbjowIDFweCA0cHggMDtib3JkZXItbGVmdDowfS5nb29nLXRhYi1ob3ZlcntiYWNrZ3JvdW5kOiNlZWV9Lmdvb2ctdGFiLWRpc2FibGVke2NvbG9yOiM2NjZ9Lmdvb2ctdGFiLXNlbGVjdGVke2NvbG9yOiMwMDA7YmFja2dyb3VuZDojZmZmO3RleHQtZGVjb3JhdGlvbjpub25lO2ZvbnQtd2VpZ2h0OmJvbGQ7Ym9yZGVyOjFweCBzb2xpZCAjNmI5MGRhfS5nb29nLXRhYi1iYXItdG9we3BhZGRpbmctdG9wOjVweCFpbXBvcnRhbnQ7cGFkZGluZy1sZWZ0OjVweCFpbXBvcnRhbnQ7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgIzZiOTBkYSFpbXBvcnRhbnR9Lmdvb2ctdGFiLWJhci10b3AgLmdvb2ctdGFiLXNlbGVjdGVke3RvcDoxcHg7bWFyZ2luLXRvcDowO3BhZGRpbmctYm90dG9tOjVweH0uZ29vZy10YWItYmFyLWJvdHRvbSAuZ29vZy10YWItc2VsZWN0ZWR7dG9wOi0xcHg7bWFyZ2luLWJvdHRvbTowO3BhZGRpbmctdG9wOjVweH0uZ29vZy10YWItYmFyLXN0YXJ0IC5nb29nLXRhYi1zZWxlY3RlZHtsZWZ0OjFweDttYXJnaW4tbGVmdDowO3BhZGRpbmctcmlnaHQ6OXB4fS5nb29nLXRhYi1iYXItZW5kIC5nb29nLXRhYi1zZWxlY3RlZHtsZWZ0Oi0xcHg7bWFyZ2luLXJpZ2h0OjA7cGFkZGluZy1sZWZ0OjlweH0uZ29vZy10YWItYmFye21hcmdpbjowO2JvcmRlcjowO3BhZGRpbmc6MDtsaXN0LXN0eWxlOm5vbmU7Y3Vyc29yOmRlZmF1bHQ7b3V0bGluZTpub25lO2JhY2tncm91bmQ6I2ViZWZmOX0uZ29vZy10YWItYmFyLWNsZWFye2NsZWFyOmJvdGg7aGVpZ2h0OjA7b3ZlcmZsb3c6aGlkZGVufS5nb29nLXRhYi1iYXItc3RhcnR7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLWVuZHtmbG9hdDpyaWdodH0qIGh0bWwgLmdvb2ctdGFiLWJhci1zdGFydHttYXJnaW4tcmlnaHQ6LTNweH0qIGh0bWwgLmdvb2ctdGFiLWJhci1lbmR7bWFyZ2luLWxlZnQ6LTNweH1zZW50aW5lbHt9", + "ok": true, + "headers": [ + [ + "content-length", + "1404" + ], + [ + "content-type", + "text/css" + ] + ], + "status": 200, + "status_text": "" + }, + "http://localhost:8080/nbextensions/google.colab/tabbar_main.min.js": { + "data": "Ly8gY2xhbmctZm9ybWF0IG9mZgooZnVuY3Rpb24oKXt2YXIgZyxhYT1mdW5jdGlvbihhKXt2YXIgYj0wO3JldHVybiBmdW5jdGlvbigpe3JldHVybiBiPGEubGVuZ3RoP3tkb25lOiExLHZhbHVlOmFbYisrXX06e2RvbmU6ITB9fX0sYmE9dHlwZW9mIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzPT0iZnVuY3Rpb24iP09iamVjdC5kZWZpbmVQcm9wZXJ0eTpmdW5jdGlvbihhLGIsYyl7aWYoYT09QXJyYXkucHJvdG90eXBlfHxhPT1PYmplY3QucHJvdG90eXBlKXJldHVybiBhO2FbYl09Yy52YWx1ZTtyZXR1cm4gYX0sY2E9ZnVuY3Rpb24oYSl7YT1bIm9iamVjdCI9PXR5cGVvZiBnbG9iYWxUaGlzJiZnbG9iYWxUaGlzLGEsIm9iamVjdCI9PXR5cGVvZiB3aW5kb3cmJndpbmRvdywib2JqZWN0Ij09dHlwZW9mIHNlbGYmJnNlbGYsIm9iamVjdCI9PXR5cGVvZiBnbG9iYWwmJmdsb2JhbF07Zm9yKHZhciBiPTA7YjxhLmxlbmd0aDsrK2Ipe3ZhciBjPWFbYl07aWYoYyYmYy5NYXRoPT1NYXRoKXJldHVybiBjfXRocm93IEVycm9yKCJDYW5ub3QgZmluZCBnbG9iYWwgb2JqZWN0Iik7Cn0sZGE9Y2EodGhpcyksZWE9ZnVuY3Rpb24oYSxiKXtpZihiKWE6e3ZhciBjPWRhO2E9YS5zcGxpdCgiLiIpO2Zvcih2YXIgZD0wO2Q8YS5sZW5ndGgtMTtkKyspe3ZhciBlPWFbZF07aWYoIShlIGluIGMpKWJyZWFrIGE7Yz1jW2VdfWE9YVthLmxlbmd0aC0xXTtkPWNbYV07Yj1iKGQpO2IhPWQmJmIhPW51bGwmJmJhKGMsYSx7Y29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOmJ9KX19OwplYSgiU3ltYm9sIixmdW5jdGlvbihhKXtpZihhKXJldHVybiBhO3ZhciBiPWZ1bmN0aW9uKGYsaCl7dGhpcy5nPWY7YmEodGhpcywiZGVzY3JpcHRpb24iLHtjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6aH0pfTtiLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmd9O3ZhciBjPSJqc2NvbXBfc3ltYm9sXyIrKE1hdGgucmFuZG9tKCkqMUU5Pj4+MCkrIl8iLGQ9MCxlPWZ1bmN0aW9uKGYpe2lmKHRoaXMgaW5zdGFuY2VvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoIlN5bWJvbCBpcyBub3QgYSBjb25zdHJ1Y3RvciIpO3JldHVybiBuZXcgYihjKyhmfHwiIikrIl8iK2QrKyxmKX07cmV0dXJuIGV9KTsKdmFyIGZhPWZ1bmN0aW9uKGEpe3ZhciBiPXR5cGVvZiBTeW1ib2whPSJ1bmRlZmluZWQiJiZTeW1ib2wuaXRlcmF0b3ImJmFbU3ltYm9sLml0ZXJhdG9yXTtpZihiKXJldHVybiBiLmNhbGwoYSk7aWYodHlwZW9mIGEubGVuZ3RoPT0ibnVtYmVyIilyZXR1cm57bmV4dDphYShhKX07dGhyb3cgRXJyb3IoU3RyaW5nKGEpKyIgaXMgbm90IGFuIGl0ZXJhYmxlIG9yIEFycmF5TGlrZSIpO307ZWEoIlN5bWJvbC5kaXNwb3NlIixmdW5jdGlvbihhKXtyZXR1cm4gYT9hOlN5bWJvbCgiU3ltYm9sLmRpc3Bvc2UiKX0pOy8qCgogQ29weXJpZ2h0IFRoZSBDbG9zdXJlIExpYnJhcnkgQXV0aG9ycy4KIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wCiovCnZhciBsPXRoaXN8fHNlbGYsaWE9ZnVuY3Rpb24oYSl7YS5JYT12b2lkIDA7YS5WPWZ1bmN0aW9uKCl7cmV0dXJuIGEuSWE/YS5JYTphLklhPW5ldyBhfX0samE9ZnVuY3Rpb24oYSl7dmFyIGI9dHlwZW9mIGE7cmV0dXJuIGIhPSJvYmplY3QiP2I6YT9BcnJheS5pc0FycmF5KGEpPyJhcnJheSI6YjoibnVsbCJ9LGthPWZ1bmN0aW9uKGEpe3ZhciBiPWphKGEpO3JldHVybiBiPT0iYXJyYXkifHxiPT0ib2JqZWN0IiYmdHlwZW9mIGEubGVuZ3RoPT0ibnVtYmVyIn0sbT1mdW5jdGlvbihhKXt2YXIgYj10eXBlb2YgYTtyZXR1cm4gYj09Im9iamVjdCImJmEhPW51bGx8fGI9PSJmdW5jdGlvbiJ9LG5hPWZ1bmN0aW9uKGEpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYSxsYSkmJmFbbGFdfHwoYVtsYV09KyttYSl9LGxhPSJjbG9zdXJlX3VpZF8iKyhNYXRoLnJhbmRvbSgpKjFFOT4+PjApLG1hPTAsbj1mdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoKXt9Yy5wcm90b3R5cGU9CmIucHJvdG90eXBlO2EubD1iLnByb3RvdHlwZTthLnByb3RvdHlwZT1uZXcgYzthLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1hO2EucWQ9ZnVuY3Rpb24oZCxlLGYpe2Zvcih2YXIgaD1BcnJheShhcmd1bWVudHMubGVuZ3RoLTIpLGs9MjtrPGFyZ3VtZW50cy5sZW5ndGg7aysrKWhbay0yXT1hcmd1bWVudHNba107cmV0dXJuIGIucHJvdG90eXBlW2VdLmFwcGx5KGQsaCl9fTtmdW5jdGlvbiBvYShhLGIpe2lmKEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKUVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsb2EpO2Vsc2V7dmFyIGM9RXJyb3IoKS5zdGFjaztjJiYodGhpcy5zdGFjaz1jKX1hJiYodGhpcy5tZXNzYWdlPVN0cmluZyhhKSk7YiE9PXZvaWQgMCYmKHRoaXMuY2F1c2U9Yil9bihvYSxFcnJvcik7b2EucHJvdG90eXBlLm5hbWU9IkN1c3RvbUVycm9yIjt2YXIgcGE7ZnVuY3Rpb24gcWEoYSxiKXthPWEuc3BsaXQoIiVzIik7Zm9yKHZhciBjPSIiLGQ9YS5sZW5ndGgtMSxlPTA7ZTxkO2UrKyljKz1hW2VdKyhlPGIubGVuZ3RoP2JbZV06IiVzIik7b2EuY2FsbCh0aGlzLGMrYVtkXSl9bihxYSxvYSk7cWEucHJvdG90eXBlLm5hbWU9IkFzc2VydGlvbkVycm9yIjtmdW5jdGlvbiByYShhLGIsYyxkKXt2YXIgZT0iQXNzZXJ0aW9uIGZhaWxlZCI7aWYoYyl7ZSs9IjogIitjO3ZhciBmPWR9ZWxzZSBhJiYoZSs9IjogIithLGY9Yik7dGhyb3cgbmV3IHFhKCIiK2UsZnx8W10pO30KdmFyIHA9ZnVuY3Rpb24oYSxiLGMpe2F8fHJhKCIiLG51bGwsYixBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMikpO3JldHVybiBhfSxzYT1mdW5jdGlvbihhLGIsYyl7bShhKSYmYS5ub2RlVHlwZT09MXx8cmEoIkV4cGVjdGVkIEVsZW1lbnQgYnV0IGdvdCAlczogJXMuIixbamEoYSksYV0sYixBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMikpfSx1YT1mdW5jdGlvbihhLGIsYyxkKXthIGluc3RhbmNlb2YgYnx8cmEoIkV4cGVjdGVkIGluc3RhbmNlb2YgJXMgYnV0IGdvdCAlcy4iLFt0YShiKSx0YShhKV0sYyxBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMykpfTsKZnVuY3Rpb24gdGEoYSl7cmV0dXJuIGEgaW5zdGFuY2VvZiBGdW5jdGlvbj9hLmRpc3BsYXlOYW1lfHxhLm5hbWV8fCJ1bmtub3duIHR5cGUgbmFtZSI6YSBpbnN0YW5jZW9mIE9iamVjdD9hLmNvbnN0cnVjdG9yLmRpc3BsYXlOYW1lfHxhLmNvbnN0cnVjdG9yLm5hbWV8fE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhKTphPT09bnVsbD8ibnVsbCI6dHlwZW9mIGF9O3ZhciB2YT1BcnJheS5wcm90b3R5cGUuaW5kZXhPZj9mdW5jdGlvbihhLGIpe3AoYS5sZW5ndGghPW51bGwpO3JldHVybiBBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKGEsYix2b2lkIDApfTpmdW5jdGlvbihhLGIpe2lmKHR5cGVvZiBhPT09InN0cmluZyIpcmV0dXJuIHR5cGVvZiBiIT09InN0cmluZyJ8fGIubGVuZ3RoIT0xPy0xOmEuaW5kZXhPZihiLDApO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWlmKGMgaW4gYSYmYVtjXT09PWIpcmV0dXJuIGM7cmV0dXJuLTF9LHdhPUFycmF5LnByb3RvdHlwZS5mb3JFYWNoP2Z1bmN0aW9uKGEsYil7cChhLmxlbmd0aCE9bnVsbCk7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChhLGIsdm9pZCAwKX06ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9YS5sZW5ndGgsZD10eXBlb2YgYT09PSJzdHJpbmciP2Euc3BsaXQoIiIpOmEsZT0wO2U8YztlKyspZSBpbiBkJiZiLmNhbGwodm9pZCAwLGRbZV0sZSxhKX07CmZ1bmN0aW9uIHhhKGEsYil7Yj12YShhLGIpO3ZhciBjO2lmKGM9Yj49MClwKGEubGVuZ3RoIT1udWxsKSxBcnJheS5wcm90b3R5cGUuc3BsaWNlLmNhbGwoYSxiLDEpO3JldHVybiBjfWZ1bmN0aW9uIHlhKGEpe3ZhciBiPWEubGVuZ3RoO2lmKGI+MCl7Zm9yKHZhciBjPUFycmF5KGIpLGQ9MDtkPGI7ZCsrKWNbZF09YVtkXTtyZXR1cm4gY31yZXR1cm5bXX1mdW5jdGlvbiB6YShhLGIsYyxkKXtwKGEubGVuZ3RoIT1udWxsKTtBcnJheS5wcm90b3R5cGUuc3BsaWNlLmFwcGx5KGEsQWEoYXJndW1lbnRzLDEpKX1mdW5jdGlvbiBBYShhLGIsYyl7cChhLmxlbmd0aCE9bnVsbCk7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg8PTI/QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYSxiKTpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhLGIsYyl9O2Z1bmN0aW9uIEJhKGEsYixjKXtmb3IodmFyIGQgaW4gYSliLmNhbGwoYyxhW2RdLGQsYSl9ZnVuY3Rpb24gQ2EoYSxiKXtmb3IodmFyIGMgaW4gYSlpZihhW2NdPT1iKXJldHVybiEwO3JldHVybiExfWZ1bmN0aW9uIERhKGEsYixjKXtpZihhIT09bnVsbCYmYiBpbiBhKXRocm93IEVycm9yKCdUaGUgb2JqZWN0IGFscmVhZHkgY29udGFpbnMgdGhlIGtleSAiJytiKyciJyk7YVtiXT1jfWZ1bmN0aW9uIEVhKGEpe3ZhciBiPXt9LGM7Zm9yKGMgaW4gYSliW2FbY11dPWM7cmV0dXJuIGJ9dmFyIEZhPSJjb25zdHJ1Y3RvciBoYXNPd25Qcm9wZXJ0eSBpc1Byb3RvdHlwZU9mIHByb3BlcnR5SXNFbnVtZXJhYmxlIHRvTG9jYWxlU3RyaW5nIHRvU3RyaW5nIHZhbHVlT2YiLnNwbGl0KCIgIik7CmZ1bmN0aW9uIEdhKGEsYil7Zm9yKHZhciBjLGQsZT0xO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspe2Q9YXJndW1lbnRzW2VdO2ZvcihjIGluIGQpYVtjXT1kW2NdO2Zvcih2YXIgZj0wO2Y8RmEubGVuZ3RoO2YrKyljPUZhW2ZdLE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChkLGMpJiYoYVtjXT1kW2NdKX19O3ZhciBIYT1TdHJpbmcucHJvdG90eXBlLnRyaW0/ZnVuY3Rpb24oYSl7cmV0dXJuIGEudHJpbSgpfTpmdW5jdGlvbihhKXtyZXR1cm4vXltcc1x4YTBdKihbXHNcU10qPylbXHNceGEwXSokLy5leGVjKGEpWzFdfTsvKgoKIENvcHlyaWdodCBHb29nbGUgTExDCiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMAoqLwp2YXIgSWE9e307dmFyIEphPWZ1bmN0aW9uKGEpe2lmKElhIT09SWEpdGhyb3cgRXJyb3IoIkJhZCBzZWNyZXQiKTt0aGlzLmc9YX07SmEucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ307bmV3IEphKCJhYm91dDpibGFuayIpO25ldyBKYSgiYWJvdXQ6aW52YWxpZCN6Q2xvc3VyZXoiKTt2YXIgS2E9W10sTGE9ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJBIFVSTCB3aXRoIGNvbnRlbnQgJyIrYSsiJyB3YXMgc2FuaXRpemVkIGF3YXkuIil9O0thLmluZGV4T2YoTGEpPT09LTEmJkthLnB1c2goTGEpO3ZhciBNYSxOYTthOntmb3IodmFyIE9hPVsiQ0xPU1VSRV9GTEFHUyJdLFBhPWwsUWE9MDtRYTxPYS5sZW5ndGg7UWErKylpZihQYT1QYVtPYVtRYV1dLFBhPT1udWxsKXtOYT1udWxsO2JyZWFrIGF9TmE9UGF9dmFyIFJhPU5hJiZOYVs2MTA0MDEzMDFdO01hPVJhIT1udWxsP1JhOiExO2Z1bmN0aW9uIFNhKCl7dmFyIGE9bC5uYXZpZ2F0b3I7cmV0dXJuIGEmJihhPWEudXNlckFnZW50KT9hOiIifXZhciBUYSxVYT1sLm5hdmlnYXRvcjtUYT1VYT9VYS51c2VyQWdlbnREYXRhfHxudWxsOm51bGw7ZnVuY3Rpb24gcihhKXtyZXR1cm4gU2EoKS5pbmRleE9mKGEpIT0tMX07dmFyIFZhPXIoIkVkZ2UiKSx0PXIoIkdlY2tvIikmJiEoU2EoKS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoIndlYmtpdCIpIT0tMSYmIXIoIkVkZ2UiKSkmJiEocigiVHJpZGVudCIpfHxyKCJNU0lFIikpJiYhcigiRWRnZSIpLHU9U2EoKS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoIndlYmtpdCIpIT0tMSYmIXIoIkVkZ2UiKSx2PU1hJiZUYSYmVGEucGxhdGZvcm0/VGEucGxhdGZvcm09PT0ibWFjT1MiOnIoIk1hY2ludG9zaCIpO3ZhciBYYT1mdW5jdGlvbihhLGIpe0JhKGIsZnVuY3Rpb24oYyxkKXtkPT0ic3R5bGUiP2Euc3R5bGUuY3NzVGV4dD1jOmQ9PSJjbGFzcyI/YS5jbGFzc05hbWU9YzpkPT0iZm9yIj9hLmh0bWxGb3I9YzpXYS5oYXNPd25Qcm9wZXJ0eShkKT9hLnNldEF0dHJpYnV0ZShXYVtkXSxjKTpkLmxhc3RJbmRleE9mKCJhcmlhLSIsMCk9PTB8fGQubGFzdEluZGV4T2YoImRhdGEtIiwwKT09MD9hLnNldEF0dHJpYnV0ZShkLGMpOmFbZF09Y30pfSxXYT17Y2VsbHBhZGRpbmc6ImNlbGxQYWRkaW5nIixjZWxsc3BhY2luZzoiY2VsbFNwYWNpbmciLGNvbHNwYW46ImNvbFNwYW4iLGZyYW1lYm9yZGVyOiJmcmFtZUJvcmRlciIsaGVpZ2h0OiJoZWlnaHQiLG1heGxlbmd0aDoibWF4TGVuZ3RoIixub25jZToibm9uY2UiLHJvbGU6InJvbGUiLHJvd3NwYW46InJvd1NwYW4iLHR5cGU6InR5cGUiLHVzZW1hcDoidXNlTWFwIix2YWxpZ246InZBbGlnbiIsd2lkdGg6IndpZHRoIn0sWWE9ZnVuY3Rpb24oYSwKYixjKXtmdW5jdGlvbiBkKGspe2smJmIuYXBwZW5kQ2hpbGQodHlwZW9mIGs9PT0ic3RyaW5nIj9hLmNyZWF0ZVRleHROb2RlKGspOmspfWZvcih2YXIgZT0yO2U8Yy5sZW5ndGg7ZSsrKXt2YXIgZj1jW2VdO2lmKCFrYShmKXx8bShmKSYmZi5ub2RlVHlwZT4wKWQoZik7ZWxzZXthOntpZihmJiZ0eXBlb2YgZi5sZW5ndGg9PSJudW1iZXIiKXtpZihtKGYpKXt2YXIgaD10eXBlb2YgZi5pdGVtPT0iZnVuY3Rpb24ifHx0eXBlb2YgZi5pdGVtPT0ic3RyaW5nIjticmVhayBhfWlmKHR5cGVvZiBmPT09ImZ1bmN0aW9uIil7aD10eXBlb2YgZi5pdGVtPT0iZnVuY3Rpb24iO2JyZWFrIGF9fWg9ITF9d2EoaD95YShmKTpmLGQpfX19LFphPWZ1bmN0aW9uKGEsYil7Yj1TdHJpbmcoYik7YS5jb250ZW50VHlwZT09PSJhcHBsaWNhdGlvbi94aHRtbCt4bWwiJiYoYj1iLnRvTG93ZXJDYXNlKCkpO3JldHVybiBhLmNyZWF0ZUVsZW1lbnQoYil9LCRhPWZ1bmN0aW9uKGEpe2EmJmEucGFyZW50Tm9kZSYmCmEucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhKX0sYWI9ZnVuY3Rpb24oYSxiKXtpZighYXx8IWIpcmV0dXJuITE7aWYoYS5jb250YWlucyYmYi5ub2RlVHlwZT09MSlyZXR1cm4gYT09Ynx8YS5jb250YWlucyhiKTtpZih0eXBlb2YgYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiE9InVuZGVmaW5lZCIpcmV0dXJuIGE9PWJ8fCEhKGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24oYikmMTYpO2Zvcig7YiYmYSE9YjspYj1iLnBhcmVudE5vZGU7cmV0dXJuIGI9PWF9LGJiPWZ1bmN0aW9uKGEpe3AoYSwiTm9kZSBjYW5ub3QgYmUgbnVsbCBvciB1bmRlZmluZWQuIik7cmV0dXJuIGEubm9kZVR5cGU9PTk/YTphLm93bmVyRG9jdW1lbnR8fGEuZG9jdW1lbnR9LGNiPWZ1bmN0aW9uKGEsYil7Yj9hLnRhYkluZGV4PTA6KGEudGFiSW5kZXg9LTEsYS5yZW1vdmVBdHRyaWJ1dGUoInRhYkluZGV4IikpfSxkYj1mdW5jdGlvbihhKXtyZXR1cm4gYS5oYXNBdHRyaWJ1dGUoInRhYmluZGV4Iil9LGViPQpmdW5jdGlvbihhKXthPWEudGFiSW5kZXg7cmV0dXJuIHR5cGVvZiBhPT09Im51bWJlciImJmE+PTAmJmE8MzI3Njh9LGZiPWZ1bmN0aW9uKGEpe3RoaXMuZz1hfHxsLmRvY3VtZW50fHxkb2N1bWVudH07ZmIucHJvdG90eXBlLmk9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nO3JldHVybiB0eXBlb2YgYT09PSJzdHJpbmciP2IuZ2V0RWxlbWVudEJ5SWQoYSk6YX07ZmIucHJvdG90eXBlLmg9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXMuZyxlPWFyZ3VtZW50cyxmPWVbMV0saD1aYShkLFN0cmluZyhlWzBdKSk7ZiYmKHR5cGVvZiBmPT09InN0cmluZyI/aC5jbGFzc05hbWU9ZjpBcnJheS5pc0FycmF5KGYpP2guY2xhc3NOYW1lPWYuam9pbigiICIpOlhhKGgsZikpO2UubGVuZ3RoPjImJllhKGQsaCxlKTtyZXR1cm4gaH07dmFyIHc9ZnVuY3Rpb24oKXt0aGlzLmJhPXRoaXMuYmE7dGhpcy5rYT10aGlzLmthfTt3LnByb3RvdHlwZS5iYT0hMTt3LnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7dGhpcy5iYXx8KHRoaXMuYmE9ITAsdGhpcy5DKCkpfTt3LnByb3RvdHlwZVtTeW1ib2wuZGlzcG9zZV09ZnVuY3Rpb24oKXt0aGlzLmRpc3Bvc2UoKX07dy5wcm90b3R5cGUuQz1mdW5jdGlvbigpe2lmKHRoaXMua2EpZm9yKDt0aGlzLmthLmxlbmd0aDspdGhpcy5rYS5zaGlmdCgpKCl9O3ZhciB5PWZ1bmN0aW9uKGEsYil7dGhpcy50eXBlPWE7dGhpcy51PXRoaXMudGFyZ2V0PWI7dGhpcy5kZWZhdWx0UHJldmVudGVkPXRoaXMuQT0hMX07eS5wcm90b3R5cGUudj1mdW5jdGlvbigpe3RoaXMuQT0hMH07eS5wcm90b3R5cGUuaj1mdW5jdGlvbigpe3RoaXMuZGVmYXVsdFByZXZlbnRlZD0hMH07dmFyIGdiPWZ1bmN0aW9uKCl7aWYoIWwuYWRkRXZlbnRMaXN0ZW5lcnx8IU9iamVjdC5kZWZpbmVQcm9wZXJ0eSlyZXR1cm4hMTt2YXIgYT0hMSxiPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwicGFzc2l2ZSIse2dldDpmdW5jdGlvbigpe2E9ITB9fSk7dHJ5e3ZhciBjPWZ1bmN0aW9uKCl7fTtsLmFkZEV2ZW50TGlzdGVuZXIoInRlc3QiLGMsYik7bC5yZW1vdmVFdmVudExpc3RlbmVyKCJ0ZXN0IixjLGIpfWNhdGNoKGQpe31yZXR1cm4gYX0oKTt2YXIgej1mdW5jdGlvbihhLGIpe3kuY2FsbCh0aGlzLGE/YS50eXBlOiIiKTt0aGlzLnJlbGF0ZWRUYXJnZXQ9dGhpcy51PXRoaXMudGFyZ2V0PW51bGw7dGhpcy5idXR0b249dGhpcy5zY3JlZW5ZPXRoaXMuc2NyZWVuWD10aGlzLmNsaWVudFk9dGhpcy5jbGllbnRYPTA7dGhpcy5rZXk9IiI7dGhpcy5nPTA7dGhpcy5tZXRhS2V5PXRoaXMuc2hpZnRLZXk9dGhpcy5hbHRLZXk9dGhpcy5jdHJsS2V5PSExO3RoaXMuc3RhdGU9bnVsbDt0aGlzLkc9ITE7dGhpcy5wb2ludGVySWQ9MDt0aGlzLnBvaW50ZXJUeXBlPSIiO3RoaXMudGltZVN0YW1wPTA7dGhpcy5oPW51bGw7aWYoYSl7dmFyIGM9dGhpcy50eXBlPWEudHlwZSxkPWEuY2hhbmdlZFRvdWNoZXMmJmEuY2hhbmdlZFRvdWNoZXMubGVuZ3RoP2EuY2hhbmdlZFRvdWNoZXNbMF06bnVsbDt0aGlzLnRhcmdldD1hLnRhcmdldHx8YS5zcmNFbGVtZW50O3RoaXMudT1iO2I9YS5yZWxhdGVkVGFyZ2V0O2J8fChjPT0ibW91c2VvdmVyIj8KYj1hLmZyb21FbGVtZW50OmM9PSJtb3VzZW91dCImJihiPWEudG9FbGVtZW50KSk7dGhpcy5yZWxhdGVkVGFyZ2V0PWI7ZD8odGhpcy5jbGllbnRYPWQuY2xpZW50WCE9PXZvaWQgMD9kLmNsaWVudFg6ZC5wYWdlWCx0aGlzLmNsaWVudFk9ZC5jbGllbnRZIT09dm9pZCAwP2QuY2xpZW50WTpkLnBhZ2VZLHRoaXMuc2NyZWVuWD1kLnNjcmVlblh8fDAsdGhpcy5zY3JlZW5ZPWQuc2NyZWVuWXx8MCk6KHRoaXMuY2xpZW50WD1hLmNsaWVudFghPT12b2lkIDA/YS5jbGllbnRYOmEucGFnZVgsdGhpcy5jbGllbnRZPWEuY2xpZW50WSE9PXZvaWQgMD9hLmNsaWVudFk6YS5wYWdlWSx0aGlzLnNjcmVlblg9YS5zY3JlZW5YfHwwLHRoaXMuc2NyZWVuWT1hLnNjcmVlbll8fDApO3RoaXMuYnV0dG9uPWEuYnV0dG9uO3RoaXMuZz1hLmtleUNvZGV8fDA7dGhpcy5rZXk9YS5rZXl8fCIiO3RoaXMuY3RybEtleT1hLmN0cmxLZXk7dGhpcy5hbHRLZXk9YS5hbHRLZXk7dGhpcy5zaGlmdEtleT1hLnNoaWZ0S2V5Owp0aGlzLm1ldGFLZXk9YS5tZXRhS2V5O3RoaXMuRz12P2EubWV0YUtleTphLmN0cmxLZXk7dGhpcy5wb2ludGVySWQ9YS5wb2ludGVySWR8fDA7dGhpcy5wb2ludGVyVHlwZT1hLnBvaW50ZXJUeXBlO3RoaXMuc3RhdGU9YS5zdGF0ZTt0aGlzLnRpbWVTdGFtcD1hLnRpbWVTdGFtcDt0aGlzLmg9YTthLmRlZmF1bHRQcmV2ZW50ZWQmJnoubC5qLmNhbGwodGhpcyl9fTtuKHoseSk7ei5wcm90b3R5cGUudj1mdW5jdGlvbigpe3oubC52LmNhbGwodGhpcyk7dGhpcy5oLnN0b3BQcm9wYWdhdGlvbj90aGlzLmguc3RvcFByb3BhZ2F0aW9uKCk6dGhpcy5oLmNhbmNlbEJ1YmJsZT0hMH07ei5wcm90b3R5cGUuaj1mdW5jdGlvbigpe3oubC5qLmNhbGwodGhpcyk7dmFyIGE9dGhpcy5oO2EucHJldmVudERlZmF1bHQ/YS5wcmV2ZW50RGVmYXVsdCgpOmEucmV0dXJuVmFsdWU9ITF9O3ZhciBoYj0iY2xvc3VyZV9saXN0ZW5hYmxlXyIrKE1hdGgucmFuZG9tKCkqMUU2fDApLGliPWZ1bmN0aW9uKGEpe3JldHVybiEoIWF8fCFhW2hiXSl9O3ZhciBqYj0wO3ZhciBrYj1mdW5jdGlvbihhLGIsYyxkLGUpe3RoaXMubGlzdGVuZXI9YTt0aGlzLnByb3h5PW51bGw7dGhpcy5zcmM9Yjt0aGlzLnR5cGU9Yzt0aGlzLmNhcHR1cmU9ISFkO3RoaXMucGE9ZTt0aGlzLmtleT0rK2piO3RoaXMuamE9dGhpcy5vYT0hMX0sbGI9ZnVuY3Rpb24oYSl7YS5qYT0hMDthLmxpc3RlbmVyPW51bGw7YS5wcm94eT1udWxsO2Euc3JjPW51bGw7YS5wYT1udWxsfTt2YXIgbWI9ZnVuY3Rpb24oYSl7dGhpcy5zcmM9YTt0aGlzLmc9e307dGhpcy5oPTB9O21iLnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZj1hLnRvU3RyaW5nKCk7YT10aGlzLmdbZl07YXx8KGE9dGhpcy5nW2ZdPVtdLHRoaXMuaCsrKTt2YXIgaD1uYihhLGIsZCxlKTtoPi0xPyhiPWFbaF0sY3x8KGIub2E9ITEpKTooYj1uZXcga2IoYix0aGlzLnNyYyxmLCEhZCxlKSxiLm9hPWMsYS5wdXNoKGIpKTtyZXR1cm4gYn07CnZhciBvYj1mdW5jdGlvbihhLGIpe3ZhciBjPWIudHlwZTtjIGluIGEuZyYmeGEoYS5nW2NdLGIpJiYobGIoYiksYS5nW2NdLmxlbmd0aD09MCYmKGRlbGV0ZSBhLmdbY10sYS5oLS0pKX0scGI9ZnVuY3Rpb24oYSxiLGMsZCxlKXthPWEuZ1tiLnRvU3RyaW5nKCldO2I9LTE7YSYmKGI9bmIoYSxjLGQsZSkpO3JldHVybiBiPi0xP2FbYl06bnVsbH0sbmI9ZnVuY3Rpb24oYSxiLGMsZCl7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDsrK2Upe3ZhciBmPWFbZV07aWYoIWYuamEmJmYubGlzdGVuZXI9PWImJmYuY2FwdHVyZT09ISFjJiZmLnBhPT1kKXJldHVybiBlfXJldHVybi0xfTt2YXIgcWI9ImNsb3N1cmVfbG1fIisoTWF0aC5yYW5kb20oKSoxRTZ8MCkscmI9e30sc2I9MCx1Yj1mdW5jdGlvbihhLGIsYyxkLGUpe2lmKGQmJmQub25jZSlyZXR1cm4gdGIoYSxiLGMsZCxlKTtpZihBcnJheS5pc0FycmF5KGIpKXtmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKyl1YihhLGJbZl0sYyxkLGUpO3JldHVybiBudWxsfWM9dmIoYyk7cmV0dXJuIGliKGEpP3diKGEsYixjLG0oZCk/ISFkLmNhcHR1cmU6ISFkLGUpOnhiKGEsYixjLCExLGQsZSl9LHhiPWZ1bmN0aW9uKGEsYixjLGQsZSxmKXtpZighYil0aHJvdyBFcnJvcigiSW52YWxpZCBldmVudCB0eXBlIik7dmFyIGg9bShlKT8hIWUuY2FwdHVyZTohIWUsaz15YihhKTtrfHwoYVtxYl09az1uZXcgbWIoYSkpO2M9ay5hZGQoYixjLGQsaCxmKTtpZihjLnByb3h5KXJldHVybiBjO2Q9emIoKTtjLnByb3h5PWQ7ZC5zcmM9YTtkLmxpc3RlbmVyPWM7aWYoYS5hZGRFdmVudExpc3RlbmVyKWdifHwoZT1oKSxlPT09dm9pZCAwJiYKKGU9ITEpLGEuYWRkRXZlbnRMaXN0ZW5lcihiLnRvU3RyaW5nKCksZCxlKTtlbHNlIGlmKGEuYXR0YWNoRXZlbnQpYS5hdHRhY2hFdmVudChBYihiLnRvU3RyaW5nKCkpLGQpO2Vsc2UgaWYoYS5hZGRMaXN0ZW5lciYmYS5yZW1vdmVMaXN0ZW5lcilwKGI9PT0iY2hhbmdlIiwiTWVkaWFRdWVyeUxpc3Qgb25seSBoYXMgYSBjaGFuZ2UgZXZlbnQiKSxhLmFkZExpc3RlbmVyKGQpO2Vsc2UgdGhyb3cgRXJyb3IoImFkZEV2ZW50TGlzdGVuZXIgYW5kIGF0dGFjaEV2ZW50IGFyZSB1bmF2YWlsYWJsZS4iKTtzYisrO3JldHVybiBjfSx6Yj1mdW5jdGlvbigpe3ZhciBhPUJiLGI9ZnVuY3Rpb24oYyl7cmV0dXJuIGEuY2FsbChiLnNyYyxiLmxpc3RlbmVyLGMpfTtyZXR1cm4gYn0sdGI9ZnVuY3Rpb24oYSxiLGMsZCxlKXtpZihBcnJheS5pc0FycmF5KGIpKXtmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKyl0YihhLGJbZl0sYyxkLGUpO3JldHVybiBudWxsfWM9dmIoYyk7cmV0dXJuIGliKGEpPwphLkEuYWRkKFN0cmluZyhiKSxjLCEwLG0oZCk/ISFkLmNhcHR1cmU6ISFkLGUpOnhiKGEsYixjLCEwLGQsZSl9LENiPWZ1bmN0aW9uKGEsYixjLGQsZSl7aWYoQXJyYXkuaXNBcnJheShiKSlmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKylDYihhLGJbZl0sYyxkLGUpO2Vsc2UgZD1tKGQpPyEhZC5jYXB0dXJlOiEhZCxjPXZiKGMpLGliKGEpPyhhPWEuQSxiPVN0cmluZyhiKS50b1N0cmluZygpLGIgaW4gYS5nJiYoZj1hLmdbYl0sYz1uYihmLGMsZCxlKSxjPi0xJiYobGIoZltjXSkscChmLmxlbmd0aCE9bnVsbCksQXJyYXkucHJvdG90eXBlLnNwbGljZS5jYWxsKGYsYywxKSxmLmxlbmd0aD09MCYmKGRlbGV0ZSBhLmdbYl0sYS5oLS0pKSkpOmEmJihhPXliKGEpKSYmKGM9cGIoYSxiLGMsZCxlKSkmJkEoYyl9LEE9ZnVuY3Rpb24oYSl7aWYodHlwZW9mIGEhPT0ibnVtYmVyIiYmYSYmIWEuamEpe3ZhciBiPWEuc3JjO2lmKGliKGIpKW9iKGIuQSxhKTtlbHNle3ZhciBjPWEudHlwZSwKZD1hLnByb3h5O2IucmVtb3ZlRXZlbnRMaXN0ZW5lcj9iLnJlbW92ZUV2ZW50TGlzdGVuZXIoYyxkLGEuY2FwdHVyZSk6Yi5kZXRhY2hFdmVudD9iLmRldGFjaEV2ZW50KEFiKGMpLGQpOmIuYWRkTGlzdGVuZXImJmIucmVtb3ZlTGlzdGVuZXImJmIucmVtb3ZlTGlzdGVuZXIoZCk7c2ItLTsoYz15YihiKSk/KG9iKGMsYSksYy5oPT0wJiYoYy5zcmM9bnVsbCxiW3FiXT1udWxsKSk6bGIoYSl9fX0sQWI9ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW4gcmI/cmJbYV06cmJbYV09Im9uIithfSxCYj1mdW5jdGlvbihhLGIpe2lmKGEuamEpYT0hMDtlbHNle2I9bmV3IHooYix0aGlzKTt2YXIgYz1hLmxpc3RlbmVyLGQ9YS5wYXx8YS5zcmM7YS5vYSYmQShhKTthPWMuY2FsbChkLGIpfXJldHVybiBhfSx5Yj1mdW5jdGlvbihhKXthPWFbcWJdO3JldHVybiBhIGluc3RhbmNlb2YgbWI/YTpudWxsfSxEYj0iX19jbG9zdXJlX2V2ZW50c19mbl8iKyhNYXRoLnJhbmRvbSgpKjFFOT4+PjApLHZiPWZ1bmN0aW9uKGEpe3AoYSwKIkxpc3RlbmVyIGNhbiBub3QgYmUgbnVsbC4iKTtpZih0eXBlb2YgYT09PSJmdW5jdGlvbiIpcmV0dXJuIGE7cChhLmhhbmRsZUV2ZW50LCJBbiBvYmplY3QgbGlzdGVuZXIgbXVzdCBoYXZlIGhhbmRsZUV2ZW50IG1ldGhvZC4iKTthW0RiXXx8KGFbRGJdPWZ1bmN0aW9uKGIpe3JldHVybiBhLmhhbmRsZUV2ZW50KGIpfSk7cmV0dXJuIGFbRGJdfTt2YXIgRWI9ZnVuY3Rpb24oYSl7dy5jYWxsKHRoaXMpO3RoaXMuaD1hO3RoaXMuZz17fX07bihFYix3KTsKdmFyIEZiPVtdLEI9ZnVuY3Rpb24oYSxiLGMsZCl7QXJyYXkuaXNBcnJheShjKXx8KGMmJihGYlswXT1jLnRvU3RyaW5nKCkpLGM9RmIpO2Zvcih2YXIgZT0wO2U8Yy5sZW5ndGg7ZSsrKXt2YXIgZj11YihiLGNbZV0sZHx8YS5oYW5kbGVFdmVudCwhMSxhLmh8fGEpO2lmKCFmKWJyZWFrO2EuZ1tmLmtleV09Zn1yZXR1cm4gYX0sQz1mdW5jdGlvbihhLGIsYyxkLGUsZil7aWYoQXJyYXkuaXNBcnJheShjKSlmb3IodmFyIGg9MDtoPGMubGVuZ3RoO2grKylDKGEsYixjW2hdLGQsZSxmKTtlbHNlIGQ9ZHx8YS5oYW5kbGVFdmVudCxlPW0oZSk/ISFlLmNhcHR1cmU6ISFlLGY9Znx8YS5ofHxhLGQ9dmIoZCksZT0hIWUsYz1pYihiKT9wYihiLkEsU3RyaW5nKGMpLGQsZSxmKTpiPyhiPXliKGIpKT9wYihiLGMsZCxlLGYpOm51bGw6bnVsbCxjJiYoQShjKSxkZWxldGUgYS5nW2Mua2V5XSk7cmV0dXJuIGF9LEdiPWZ1bmN0aW9uKGEpe0JhKGEuZyxmdW5jdGlvbihiLGMpe3RoaXMuZy5oYXNPd25Qcm9wZXJ0eShjKSYmCkEoYil9LGEpO2EuZz17fX07RWIucHJvdG90eXBlLkM9ZnVuY3Rpb24oKXtFYi5sLkMuY2FsbCh0aGlzKTtHYih0aGlzKX07RWIucHJvdG90eXBlLmhhbmRsZUV2ZW50PWZ1bmN0aW9uKCl7dGhyb3cgRXJyb3IoIkV2ZW50SGFuZGxlci5oYW5kbGVFdmVudCBub3QgaW1wbGVtZW50ZWQiKTt9O3ZhciBEPWZ1bmN0aW9uKCl7dy5jYWxsKHRoaXMpO3RoaXMuQT1uZXcgbWIodGhpcyk7dGhpcy5ZYT10aGlzO3RoaXMubGE9bnVsbH07bihELHcpO0QucHJvdG90eXBlW2hiXT0hMDtELnByb3RvdHlwZS5BYT1mdW5jdGlvbihhKXt0aGlzLmxhPWF9O0QucHJvdG90eXBlLnJlbW92ZUV2ZW50TGlzdGVuZXI9ZnVuY3Rpb24oYSxiLGMsZCl7Q2IodGhpcyxhLGIsYyxkKX07CnZhciBFPWZ1bmN0aW9uKGEsYil7SGIoYSk7dmFyIGM9YS5sYTtpZihjKXt2YXIgZD1bXTtmb3IodmFyIGU9MTtjO2M9Yy5sYSlkLnB1c2goYykscCgrK2U8MUUzLCJpbmZpbml0ZSBsb29wIil9YT1hLllhO2M9Yi50eXBlfHxiO3R5cGVvZiBiPT09InN0cmluZyI/Yj1uZXcgeShiLGEpOmIgaW5zdGFuY2VvZiB5P2IudGFyZ2V0PWIudGFyZ2V0fHxhOihlPWIsYj1uZXcgeShjLGEpLEdhKGIsZSkpO2U9ITA7dmFyIGY7aWYoZClmb3IoZj1kLmxlbmd0aC0xOyFiLkEmJmY+PTA7Zi0tKXt2YXIgaD1iLnU9ZFtmXTtlPUliKGgsYywhMCxiKSYmZX1iLkF8fChoPWIudT1hLGU9SWIoaCxjLCEwLGIpJiZlLGIuQXx8KGU9SWIoaCxjLCExLGIpJiZlKSk7aWYoZClmb3IoZj0wOyFiLkEmJmY8ZC5sZW5ndGg7ZisrKWg9Yi51PWRbZl0sZT1JYihoLGMsITEsYikmJmU7cmV0dXJuIGV9OwpELnByb3RvdHlwZS5DPWZ1bmN0aW9uKCl7RC5sLkMuY2FsbCh0aGlzKTtpZih0aGlzLkEpe3ZhciBhPXRoaXMuQSxiPTAsYztmb3IoYyBpbiBhLmcpe2Zvcih2YXIgZD1hLmdbY10sZT0wO2U8ZC5sZW5ndGg7ZSsrKSsrYixsYihkW2VdKTtkZWxldGUgYS5nW2NdO2EuaC0tfX10aGlzLmxhPW51bGx9O3ZhciB3Yj1mdW5jdGlvbihhLGIsYyxkLGUpe0hiKGEpO3JldHVybiBhLkEuYWRkKFN0cmluZyhiKSxjLCExLGQsZSl9LEliPWZ1bmN0aW9uKGEsYixjLGQpe2I9YS5BLmdbU3RyaW5nKGIpXTtpZighYilyZXR1cm4hMDtiPWIuY29uY2F0KCk7Zm9yKHZhciBlPSEwLGY9MDtmPGIubGVuZ3RoOysrZil7dmFyIGg9YltmXTtpZihoJiYhaC5qYSYmaC5jYXB0dXJlPT1jKXt2YXIgaz1oLmxpc3RlbmVyLHE9aC5wYXx8aC5zcmM7aC5vYSYmb2IoYS5BLGgpO2U9ay5jYWxsKHEsZCkhPT0hMSYmZX19cmV0dXJuIGUmJiFkLmRlZmF1bHRQcmV2ZW50ZWR9LEhiPWZ1bmN0aW9uKGEpe3AoYS5BLCJFdmVudCB0YXJnZXQgaXMgbm90IGluaXRpYWxpemVkLiBEaWQgeW91IGNhbGwgdGhlIHN1cGVyY2xhc3MgKGdvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0KSBjb25zdHJ1Y3Rvcj8iKX07dmFyIEpiPXQ/Ik1velVzZXJTZWxlY3QiOnV8fFZhPyJXZWJraXRVc2VyU2VsZWN0IjpudWxsLEtiPWZ1bmN0aW9uKGEsYil7Yj1iP251bGw6YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpO2lmKEpiJiYoYS5zdHlsZSYmKGEuc3R5bGVbSmJdPSJub25lIiksYikpZm9yKHZhciBjPTA7YT1iW2NdO2MrKylhLnN0eWxlJiYoYS5zdHlsZVtKYl09Im5vbmUiKX07dmFyIExiPWZ1bmN0aW9uKCl7fTtpYShMYik7TGIucHJvdG90eXBlLmc9MDt2YXIgRj1mdW5jdGlvbihhKXtELmNhbGwodGhpcyk7dGhpcy5HPWF8fHBhfHwocGE9bmV3IGZiKTt0aGlzLnphPU1iO3RoaXMuWT1udWxsO3RoaXMucz0hMTt0aGlzLmc9bnVsbDt0aGlzLk09dm9pZCAwO3RoaXMudT10aGlzLmo9dGhpcy5oPW51bGw7dGhpcy5TYT0hMX07bihGLEQpO0YucHJvdG90eXBlLlphPUxiLlYoKTsKdmFyIE1iPW51bGwsTmI9ZnVuY3Rpb24oYSxiKXtzd2l0Y2goYSl7Y2FzZSAxOnJldHVybiBiPyJkaXNhYmxlIjoiZW5hYmxlIjtjYXNlIDI6cmV0dXJuIGI/ImhpZ2hsaWdodCI6InVuaGlnaGxpZ2h0IjtjYXNlIDQ6cmV0dXJuIGI/ImFjdGl2YXRlIjoiZGVhY3RpdmF0ZSI7Y2FzZSA4OnJldHVybiBiPyJzZWxlY3QiOiJ1bnNlbGVjdCI7Y2FzZSAxNjpyZXR1cm4gYj8iY2hlY2siOiJ1bmNoZWNrIjtjYXNlIDMyOnJldHVybiBiPyJmb2N1cyI6ImJsdXIiO2Nhc2UgNjQ6cmV0dXJuIGI/Im9wZW4iOiJjbG9zZSJ9dGhyb3cgRXJyb3IoIkludmFsaWQgY29tcG9uZW50IHN0YXRlIik7fSxPYj1mdW5jdGlvbihhKXtyZXR1cm4gYS5ZfHwoYS5ZPSI6IisoYS5aYS5nKyspLnRvU3RyaW5nKDM2KSl9LFBiPWZ1bmN0aW9uKGEsYil7aWYoYS5oJiZhLmgudSl7dmFyIGM9YS5oLnUsZD1hLlk7ZCBpbiBjJiZkZWxldGUgY1tkXTtEYShhLmgudSxiLGEpfWEuWT1ifTtGLnByb3RvdHlwZS5pPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ307CnZhciBRYj1mdW5jdGlvbihhKXthLk18fChhLk09bmV3IEViKGEpKTtyZXR1cm4gcChhLk0pfTtGLnByb3RvdHlwZS5BYT1mdW5jdGlvbihhKXtpZih0aGlzLmgmJnRoaXMuaCE9YSl0aHJvdyBFcnJvcigiTWV0aG9kIG5vdCBzdXBwb3J0ZWQiKTtGLmwuQWEuY2FsbCh0aGlzLGEpfTtGLnByb3RvdHlwZS5tYT1mdW5jdGlvbigpe3RoaXMuZz1aYSh0aGlzLkcuZywiRElWIil9O0YucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbihhKXtSYih0aGlzLGEpfTsKdmFyIFJiPWZ1bmN0aW9uKGEsYixjKXtpZihhLnMpdGhyb3cgRXJyb3IoIkNvbXBvbmVudCBhbHJlYWR5IHJlbmRlcmVkIik7YS5nfHxhLm1hKCk7Yj9iLmluc2VydEJlZm9yZShhLmcsY3x8bnVsbCk6YS5HLmcuYm9keS5hcHBlbmRDaGlsZChhLmcpO2EuaCYmIWEuaC5zfHxhLkkoKX0sU2I9ZnVuY3Rpb24oYSxiKXtpZihhLnMpdGhyb3cgRXJyb3IoIkNvbXBvbmVudCBhbHJlYWR5IHJlbmRlcmVkIik7aWYoYiYmYS53YShiKSl7YS5TYT0hMDt2YXIgYz1iYihiKTthLkcmJmEuRy5nPT1jfHwoYS5HPWI/bmV3IGZiKGJiKGIpKTpwYXx8KHBhPW5ldyBmYikpO2EuRWEoYik7YS5JKCl9ZWxzZSB0aHJvdyBFcnJvcigiSW52YWxpZCBlbGVtZW50IHRvIGRlY29yYXRlIik7fTtnPUYucHJvdG90eXBlO2cud2E9ZnVuY3Rpb24oKXtyZXR1cm4hMH07Zy5FYT1mdW5jdGlvbihhKXt0aGlzLmc9YX07CmcuST1mdW5jdGlvbigpe3RoaXMucz0hMDtUYih0aGlzLGZ1bmN0aW9uKGEpeyFhLnMmJmEuaSgpJiZhLkkoKX0pfTtnLlU9ZnVuY3Rpb24oKXtUYih0aGlzLGZ1bmN0aW9uKGEpe2EucyYmYS5VKCl9KTt0aGlzLk0mJkdiKHRoaXMuTSk7dGhpcy5zPSExfTtnLkM9ZnVuY3Rpb24oKXt0aGlzLnMmJnRoaXMuVSgpO3RoaXMuTSYmKHRoaXMuTS5kaXNwb3NlKCksZGVsZXRlIHRoaXMuTSk7VGIodGhpcyxmdW5jdGlvbihhKXthLmRpc3Bvc2UoKX0pOyF0aGlzLlNhJiZ0aGlzLmcmJiRhKHRoaXMuZyk7dGhpcy5oPXRoaXMuZz10aGlzLnU9dGhpcy5qPW51bGw7Ri5sLkMuY2FsbCh0aGlzKX07Zy5CYT1mdW5jdGlvbihhLGIpe3RoaXMuQ2EoYSxIKHRoaXMpLGIpfTsKZy5DYT1mdW5jdGlvbihhLGIsYyl7cCghIWEsIlByb3ZpZGVkIGVsZW1lbnQgbXVzdCBub3QgYmUgbnVsbC4iKTtpZihhLnMmJihjfHwhdGhpcy5zKSl0aHJvdyBFcnJvcigiQ29tcG9uZW50IGFscmVhZHkgcmVuZGVyZWQiKTtpZihiPDB8fGI+SCh0aGlzKSl0aHJvdyBFcnJvcigiQ2hpbGQgY29tcG9uZW50IGluZGV4IG91dCBvZiBib3VuZHMiKTt0aGlzLnUmJnRoaXMuanx8KHRoaXMudT17fSx0aGlzLmo9W10pO2lmKGEuaD09dGhpcyl7dmFyIGQ9dGhpcy51LGU9T2IoYSk7ZFtlXT1hO3hhKHRoaXMuaixhKX1lbHNlIERhKHRoaXMudSxPYihhKSxhKTtpZihhPT10aGlzKXRocm93IEVycm9yKCJVbmFibGUgdG8gc2V0IHBhcmVudCBjb21wb25lbnQiKTtpZihkPXRoaXMmJmEuaCYmYS5ZKWU9YS5oLGQ9YS5ZLGUudSYmZD8oZT1lLnUsZD0oZSE9PW51bGwmJmQgaW4gZT9lW2RdOnZvaWQgMCl8fG51bGwpOmQ9bnVsbDtpZihkJiZhLmghPXRoaXMpdGhyb3cgRXJyb3IoIlVuYWJsZSB0byBzZXQgcGFyZW50IGNvbXBvbmVudCIpOwphLmg9dGhpcztGLmwuQWEuY2FsbChhLHRoaXMpO3phKHRoaXMuaixiLDAsYSk7YS5zJiZ0aGlzLnMmJmEuaD09dGhpcz8oYz10aGlzLm5hKCksKGMuY2hpbGROb2Rlc1tiXXx8bnVsbCkhPWEuaSgpJiYoYS5pKCkucGFyZW50RWxlbWVudD09YyYmYy5yZW1vdmVDaGlsZChhLmkoKSksYj1jLmNoaWxkTm9kZXNbYl18fG51bGwsYy5pbnNlcnRCZWZvcmUoYS5pKCksYikpKTpjPyh0aGlzLmd8fHRoaXMubWEoKSxiPUkodGhpcyxiKzEpLFJiKGEsdGhpcy5uYSgpLGI/Yi5nOm51bGwpKTp0aGlzLnMmJiFhLnMmJmEuZyYmYS5nLnBhcmVudE5vZGUmJmEuZy5wYXJlbnROb2RlLm5vZGVUeXBlPT0xJiZhLkkoKX07Zy5uYT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmd9Owp2YXIgVWI9ZnVuY3Rpb24oYSl7aWYoYS56YT09bnVsbCl7dmFyIGI9YS5zP2EuZzphLkcuZy5ib2R5O2E6e3ZhciBjPWJiKGIpO2lmKGMuZGVmYXVsdFZpZXcmJmMuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSYmKGM9Yy5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKGIsbnVsbCkpKXtjPWMuZGlyZWN0aW9ufHxjLmdldFByb3BlcnR5VmFsdWUoImRpcmVjdGlvbiIpfHwiIjticmVhayBhfWM9IiJ9YS56YT0icnRsIj09KGN8fChiLmN1cnJlbnRTdHlsZT9iLmN1cnJlbnRTdHlsZS5kaXJlY3Rpb246bnVsbCl8fGIuc3R5bGUmJmIuc3R5bGUuZGlyZWN0aW9uKX1yZXR1cm4gYS56YX0sSD1mdW5jdGlvbihhKXtyZXR1cm4gYS5qP2Euai5sZW5ndGg6MH0sST1mdW5jdGlvbihhLGIpe3JldHVybiBhLmo/YS5qW2JdfHxudWxsOm51bGx9LFRiPWZ1bmN0aW9uKGEsYixjKXthLmomJmEuai5mb3JFYWNoKGIsYyl9LFZiPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuaiYmYj9hLmouaW5kZXhPZihiKToKLTF9O3ZhciBXYj17bWI6ImFjdGl2ZWRlc2NlbmRhbnQiLHJiOiJhdG9taWMiLHNiOiJhdXRvY29tcGxldGUiLHViOiJidXN5Iix4YjoiY2hlY2tlZCIseWI6ImNvbGluZGV4IixEYjoiY29udHJvbHMiLEViOiJjdXJyZW50IixHYjoiZGVzY3JpYmVkYnkiLEpiOiJkaXNhYmxlZCIsTGI6ImRyb3BlZmZlY3QiLE1iOiJleHBhbmRlZCIsTmI6ImZsb3d0byIsUGI6ImdyYWJiZWQiLFRiOiJoYXNwb3B1cCIsVmI6ImhpZGRlbiIsWGI6ImludmFsaWQiLFliOiJsYWJlbCIsWmI6ImxhYmVsbGVkYnkiLGFjOiJsZXZlbCIsZmM6ImxpdmUiLHZjOiJtdWx0aWxpbmUiLHdjOiJtdWx0aXNlbGVjdGFibGUiLEFjOiJvcmllbnRhdGlvbiIsQmM6Im93bnMiLENjOiJwb3NpbnNldCIsRWM6InByZXNzZWQiLEljOiJyZWFkb25seSIsS2M6InJlbGV2YW50IixMYzoicmVxdWlyZWQiLFBjOiJyb3dpbmRleCIsU2M6InNlbGVjdGVkIixVYzoic2V0c2l6ZSIsV2M6InNvcnQiLG1kOiJ2YWx1ZW1heCIsbmQ6InZhbHVlbWluIiwKb2Q6InZhbHVlbm93IixwZDoidmFsdWV0ZXh0In07dmFyIFhiO3ZhciBZYj17bmI6ImFsZXJ0IixvYjoiYWxlcnRkaWFsb2ciLHBiOiJhcHBsaWNhdGlvbiIscWI6ImFydGljbGUiLHRiOiJiYW5uZXIiLHZiOiJidXR0b24iLHdiOiJjaGVja2JveCIsemI6ImNvbHVtbmhlYWRlciIsQWI6ImNvbWJvYm94IixCYjoiY29tcGxlbWVudGFyeSIsQ2I6ImNvbnRlbnRpbmZvIixGYjoiZGVmaW5pdGlvbiIsSGI6ImRpYWxvZyIsSWI6ImRpcmVjdG9yeSIsS2I6ImRvY3VtZW50IixPYjoiZm9ybSIsUWI6ImdyaWQiLFJiOiJncmlkY2VsbCIsU2I6Imdyb3VwIixVYjoiaGVhZGluZyIsV2I6ImltZyIsYmM6ImxpbmsiLGNjOiJsaXN0IixkYzoibGlzdGJveCIsZWM6Imxpc3RpdGVtIixoYzoibG9nIixpYzoibWFpbiIsamM6Im1hcnF1ZWUiLGtjOiJtYXRoIixsYzoibWVudSIsbWM6Im1lbnViYXIiLG5jOiJtZW51aXRlbSIsb2M6Im1lbnVpdGVtY2hlY2tib3giLHBjOiJtZW51aXRlbXJhZGlvIix4YzoibmF2aWdhdGlvbiIseWM6Im5vdGUiLHpjOiJvcHRpb24iLApEYzoicHJlc2VudGF0aW9uIixGYzoicHJvZ3Jlc3NiYXIiLEdjOiJyYWRpbyIsSGM6InJhZGlvZ3JvdXAiLEpjOiJyZWdpb24iLE1jOiJyb3ciLE5jOiJyb3dncm91cCIsT2M6InJvd2hlYWRlciIsUWM6InNjcm9sbGJhciIsUmM6InNlYXJjaCIsVGM6InNlcGFyYXRvciIsVmM6InNsaWRlciIsWGM6InNwaW5idXR0b24iLFljOiJzdGF0dXMiLFpjOiJzd2l0Y2giLGFkOiJ0YWIiLGJkOiJ0YWJsaXN0IixjZDoidGFicGFuZWwiLGRkOiJ0ZXh0Ym94IixlZDoidGV4dGluZm8iLGZkOiJ0aW1lciIsZ2Q6InRvb2xiYXIiLGhkOiJ0b29sdGlwIixqZDoidHJlZSIsa2Q6InRyZWVncmlkIixsZDoidHJlZWl0ZW0ifTt2YXIgWmI9ZnVuY3Rpb24oYSxiKXtiPyhwKENhKFliLGIpLCJObyBzdWNoIEFSSUEgcm9sZSAiK2IpLGEuc2V0QXR0cmlidXRlKCJyb2xlIixiKSk6YS5yZW1vdmVBdHRyaWJ1dGUoInJvbGUiKX0sYWM9ZnVuY3Rpb24oYSxiLGMpe0FycmF5LmlzQXJyYXkoYykmJihjPWMuam9pbigiICIpKTt2YXIgZD0kYihiKTtjPT09IiJ8fGM9PXZvaWQgMD8oWGJ8fChjPXt9LFhiPShjLmF0b21pYz0hMSxjLmF1dG9jb21wbGV0ZT0ibm9uZSIsYy5kcm9wZWZmZWN0PSJub25lIixjLmhhc3BvcHVwPSExLGMubGl2ZT0ib2ZmIixjLm11bHRpbGluZT0hMSxjLm11bHRpc2VsZWN0YWJsZT0hMSxjLm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIsYy5yZWFkb25seT0hMSxjLnJlbGV2YW50PSJhZGRpdGlvbnMgdGV4dCIsYy5yZXF1aXJlZD0hMSxjLnNvcnQ9Im5vbmUiLGMuYnVzeT0hMSxjLmRpc2FibGVkPSExLGMuaGlkZGVuPSExLGMuaW52YWxpZD0iZmFsc2UiLGMpKSxjPVhiLGIgaW4gYz9hLnNldEF0dHJpYnV0ZShkLApjW2JdKTphLnJlbW92ZUF0dHJpYnV0ZShkKSk6YS5zZXRBdHRyaWJ1dGUoZCxjKX0sJGI9ZnVuY3Rpb24oYSl7cChhLCJBUklBIGF0dHJpYnV0ZSBjYW5ub3QgYmUgZW1wdHkuIik7cChDYShXYixhKSwiTm8gc3VjaCBBUklBIGF0dHJpYnV0ZSAiK2EpO3JldHVybiJhcmlhLSIrYX07dmFyIGRjPWZ1bmN0aW9uKGEsYixjLGQsZSxmKXtpZih2JiZlKXJldHVybiBiYyhhKTtpZihlJiYhZClyZXR1cm4hMTtpZighdCl7dHlwZW9mIGI9PT0ibnVtYmVyIiYmKGI9Y2MoYikpO3ZhciBoPWI9PTE3fHxiPT0xOHx8diYmYj09OTE7aWYoKCFjfHx2KSYmaHx8diYmYj09MTYmJihkfHxmKSlyZXR1cm4hMX1pZih1JiZkJiZjKXN3aXRjaChhKXtjYXNlIDIyMDpjYXNlIDIxOTpjYXNlIDIyMTpjYXNlIDE5MjpjYXNlIDE4NjpjYXNlIDE4OTpjYXNlIDE4NzpjYXNlIDE4ODpjYXNlIDE5MDpjYXNlIDE5MTpjYXNlIDE5MjpjYXNlIDIyMjpyZXR1cm4hMX1zd2l0Y2goYSl7Y2FzZSAxMzpyZXR1cm4gdD9mfHxlPyExOiEoYyYmZCk6ITA7Y2FzZSAyNzpyZXR1cm4hdSYmIXR9cmV0dXJuIHQmJihkfHxlfHxmKT8hMTpiYyhhKX0sYmM9ZnVuY3Rpb24oYSl7aWYoYT49NDgmJmE8PTU3fHxhPj05NiYmYTw9MTA2fHxhPj02NSYmYTw9OTB8fHUmJmE9PTApcmV0dXJuITA7c3dpdGNoKGEpe2Nhc2UgMzI6Y2FzZSA0MzpjYXNlIDYzOmNhc2UgNjQ6Y2FzZSAxMDc6Y2FzZSAxMDk6Y2FzZSAxMTA6Y2FzZSAxMTE6Y2FzZSAxODY6Y2FzZSA1OTpjYXNlIDE4OTpjYXNlIDE4NzpjYXNlIDYxOmNhc2UgMTg4OmNhc2UgMTkwOmNhc2UgMTkxOmNhc2UgMTkyOmNhc2UgMjIyOmNhc2UgMjE5OmNhc2UgMjIwOmNhc2UgMjIxOmNhc2UgMTYzOmNhc2UgNTg6cmV0dXJuITA7CmNhc2UgMTczOmNhc2UgMTcxOnJldHVybiB0O2RlZmF1bHQ6cmV0dXJuITF9fSxjYz1mdW5jdGlvbihhKXtpZih0KWE9ZWMoYSk7ZWxzZSBpZih2JiZ1KXN3aXRjaChhKXtjYXNlIDkzOmE9OTF9cmV0dXJuIGF9LGVjPWZ1bmN0aW9uKGEpe3N3aXRjaChhKXtjYXNlIDYxOnJldHVybiAxODc7Y2FzZSA1OTpyZXR1cm4gMTg2O2Nhc2UgMTczOnJldHVybiAxODk7Y2FzZSAyMjQ6cmV0dXJuIDkxO2Nhc2UgMDpyZXR1cm4gMjI0O2RlZmF1bHQ6cmV0dXJuIGF9fTt2YXIgZmM9ZnVuY3Rpb24oYSxiLGMsZCl7ei5jYWxsKHRoaXMsZCk7dGhpcy50eXBlPSJrZXkiO3RoaXMuZz1hO3RoaXMucmVwZWF0PWN9O24oZmMseik7dmFyIEo9ZnVuY3Rpb24oYSxiKXtELmNhbGwodGhpcyk7YSYmZ2ModGhpcyxhLGIpfTtuKEosRCk7Zz1KLnByb3RvdHlwZTtnLlI9bnVsbDtnLnFhPW51bGw7Zy5KYT1udWxsO2cucmE9bnVsbDtnLkY9LTE7Zy5LPS0xO2cuRGE9ITE7CnZhciBoYz17MzoxMywxMjoxNDQsNjMyMzI6MzgsNjMyMzM6NDAsNjMyMzQ6MzcsNjMyMzU6MzksNjMyMzY6MTEyLDYzMjM3OjExMyw2MzIzODoxMTQsNjMyMzk6MTE1LDYzMjQwOjExNiw2MzI0MToxMTcsNjMyNDI6MTE4LDYzMjQzOjExOSw2MzI0NDoxMjAsNjMyNDU6MTIxLDYzMjQ2OjEyMiw2MzI0NzoxMjMsNjMyNDg6NDQsNjMyNzI6NDYsNjMyNzM6MzYsNjMyNzU6MzUsNjMyNzY6MzMsNjMyNzc6MzQsNjMyODk6MTQ0LDYzMzAyOjQ1fSxpYz17VXA6MzgsRG93bjo0MCxMZWZ0OjM3LFJpZ2h0OjM5LEVudGVyOjEzLEYxOjExMixGMjoxMTMsRjM6MTE0LEY0OjExNSxGNToxMTYsRjY6MTE3LEY3OjExOCxGODoxMTksRjk6MTIwLEYxMDoxMjEsRjExOjEyMixGMTI6MTIzLCJVKzAwN0YiOjQ2LEhvbWU6MzYsRW5kOjM1LFBhZ2VVcDozMyxQYWdlRG93bjozNCxJbnNlcnQ6NDV9LGpjPXYmJnQ7CkoucHJvdG90eXBlLmc9ZnVuY3Rpb24oYSl7dSYmKHRoaXMuRj09MTcmJiFhLmN0cmxLZXl8fHRoaXMuRj09MTgmJiFhLmFsdEtleXx8diYmdGhpcy5GPT05MSYmIWEubWV0YUtleSkmJih0aGlzLks9dGhpcy5GPS0xKTt0aGlzLkY9PS0xJiYoYS5jdHJsS2V5JiZhLmchPTE3P3RoaXMuRj0xNzphLmFsdEtleSYmYS5nIT0xOD90aGlzLkY9MTg6YS5tZXRhS2V5JiZhLmchPTkxJiYodGhpcy5GPTkxKSk7ZGMoYS5nLHRoaXMuRixhLnNoaWZ0S2V5LGEuY3RybEtleSxhLmFsdEtleSxhLm1ldGFLZXkpPyh0aGlzLks9Y2MoYS5nKSxqYyYmKHRoaXMuRGE9YS5hbHRLZXkpKTp0aGlzLmhhbmRsZUV2ZW50KGEpfTtKLnByb3RvdHlwZS5oPWZ1bmN0aW9uKGEpe3RoaXMuSz10aGlzLkY9LTE7dGhpcy5EYT1hLmFsdEtleX07CkoucHJvdG90eXBlLmhhbmRsZUV2ZW50PWZ1bmN0aW9uKGEpe3ZhciBiPWEuaCxjPWIuYWx0S2V5O2lmKHUmJmEudHlwZT09ImtleXByZXNzIil7dmFyIGQ9dGhpcy5LO3ZhciBlPWIuY2hhckNvZGU+PTAmJmIuY2hhckNvZGU8NjMyMzImJmJjKGQpP2IuY2hhckNvZGU6MH1lbHNlIGEudHlwZT09ImtleXByZXNzIj8oamMmJihjPXRoaXMuRGEpLGIua2V5Q29kZT09Yi5jaGFyQ29kZT9iLmtleUNvZGU8MzI/KGQ9Yi5rZXlDb2RlLGU9MCk6KGQ9dGhpcy5LLGU9Yi5jaGFyQ29kZSk6KGQ9Yi5rZXlDb2RlfHx0aGlzLkssZT1iLmNoYXJDb2RlfHwwKSk6KGQ9Yi5rZXlDb2RlfHx0aGlzLkssZT1iLmNoYXJDb2RlfHwwKSx2JiZlPT02MyYmZD09MjI0JiYoZD0xOTEpO3ZhciBmPWQ9Y2MoZCk7ZD9kPj02MzIzMiYmZCBpbiBoYz9mPWhjW2RdOmQ9PTI1JiZhLnNoaWZ0S2V5JiYoZj05KTpiLmtleUlkZW50aWZpZXImJmIua2V5SWRlbnRpZmllciBpbiBpYyYmKGY9aWNbYi5rZXlJZGVudGlmaWVyXSk7CmlmKCF0fHxhLnR5cGUhPSJrZXlwcmVzcyJ8fGRjKGYsdGhpcy5GLGEuc2hpZnRLZXksYS5jdHJsS2V5LGMsYS5tZXRhS2V5KSlhPWY9PXRoaXMuRix0aGlzLkY9ZixiPW5ldyBmYyhmLGUsYSxiKSxiLmFsdEtleT1jLEUodGhpcyxiKX07Si5wcm90b3R5cGUuaT1mdW5jdGlvbigpe3JldHVybiB0aGlzLlJ9O3ZhciBnYz1mdW5jdGlvbihhLGIsYyl7YS5yYSYma2MoYSk7YS5SPWI7YS5xYT11YihhLlIsImtleXByZXNzIixhLGMpO2EuSmE9dWIoYS5SLCJrZXlkb3duIixhLmcsYyxhKTthLnJhPXViKGEuUiwia2V5dXAiLGEuaCxjLGEpfSxrYz1mdW5jdGlvbihhKXthLnFhJiYoQShhLnFhKSxBKGEuSmEpLEEoYS5yYSksYS5xYT1udWxsLGEuSmE9bnVsbCxhLnJhPW51bGwpO2EuUj1udWxsO2EuRj0tMTthLks9LTF9O0oucHJvdG90eXBlLkM9ZnVuY3Rpb24oKXtKLmwuQy5jYWxsKHRoaXMpO2tjKHRoaXMpfTt2YXIgSz17Z2E6Im1vdXNlZG93biIsaGE6Im1vdXNldXAiLGZhOiJtb3VzZWNhbmNlbCIsc2M6Im1vdXNlbW92ZSIsdWM6Im1vdXNlb3ZlciIsdGM6Im1vdXNlb3V0IixxYzoibW91c2VlbnRlciIscmM6Im1vdXNlbGVhdmUifTt2YXIgbGM9ZnVuY3Rpb24oYSl7cmV0dXJuIHR5cGVvZiBhLmNsYXNzTmFtZT09InN0cmluZyI/YS5jbGFzc05hbWU6YS5nZXRBdHRyaWJ1dGUmJmEuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIn0sTD1mdW5jdGlvbihhKXtyZXR1cm4gYS5jbGFzc0xpc3Q/YS5jbGFzc0xpc3Q6bGMoYSkubWF0Y2goL1xTKy9nKXx8W119LG1jPWZ1bmN0aW9uKGEsYil7dHlwZW9mIGEuY2xhc3NOYW1lPT0ic3RyaW5nIj9hLmNsYXNzTmFtZT1iOmEuc2V0QXR0cmlidXRlJiZhLnNldEF0dHJpYnV0ZSgiY2xhc3MiLGIpfSxuYz1mdW5jdGlvbihhLGIpe2EuY2xhc3NMaXN0P2I9YS5jbGFzc0xpc3QuY29udGFpbnMoYik6KGE9TChhKSxiPXZhKGEsYik+PTApO3JldHVybiBifSxvYz1mdW5jdGlvbihhLGIpe2lmKGEuY2xhc3NMaXN0KWEuY2xhc3NMaXN0LmFkZChiKTtlbHNlIGlmKCFuYyhhLGIpKXt2YXIgYz1sYyhhKTttYyhhLGMrKGMubGVuZ3RoPjA/IiAiK2I6YikpfX0scGM9ZnVuY3Rpb24oYSxiKXtpZihhLmNsYXNzTGlzdClBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGIsCmZ1bmN0aW9uKGUpe29jKGEsZSl9KTtlbHNle3ZhciBjPXt9O0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoTChhKSxmdW5jdGlvbihlKXtjW2VdPSEwfSk7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChiLGZ1bmN0aW9uKGUpe2NbZV09ITB9KTtiPSIiO2Zvcih2YXIgZCBpbiBjKWIrPWIubGVuZ3RoPjA/IiAiK2Q6ZDttYyhhLGIpfX0scWM9ZnVuY3Rpb24oYSxiKXthLmNsYXNzTGlzdD9hLmNsYXNzTGlzdC5yZW1vdmUoYik6bmMoYSxiKSYmbWMoYSxBcnJheS5wcm90b3R5cGUuZmlsdGVyLmNhbGwoTChhKSxmdW5jdGlvbihjKXtyZXR1cm4gYyE9Yn0pLmpvaW4oIiAiKSl9LHJjPWZ1bmN0aW9uKGEsYil7YS5jbGFzc0xpc3Q/QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChiLGZ1bmN0aW9uKGMpe3FjKGEsYyl9KTptYyhhLEFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbChMKGEpLGZ1bmN0aW9uKGMpe3JldHVybiEodmEoYixjKT49MCl9KS5qb2luKCIgIikpfTt2YXIgdGM9ZnVuY3Rpb24oYSxiKXtpZighYSl0aHJvdyBFcnJvcigiSW52YWxpZCBjbGFzcyBuYW1lICIrYSk7aWYodHlwZW9mIGIhPT0iZnVuY3Rpb24iKXRocm93IEVycm9yKCJJbnZhbGlkIGRlY29yYXRvciBmdW5jdGlvbiAiK2IpO3NjW2FdPWJ9LHVjPXt9LHNjPXt9O3ZhciB2Yz1mdW5jdGlvbihhKXt0aGlzLkE9YX07aWEodmMpO3ZhciB3Yz1mdW5jdGlvbihhLGIpe2EmJihhLnRhYkluZGV4PWI/MDotMSl9LHljPWZ1bmN0aW9uKGEsYixjKXtjLmlkJiZQYihiLGMuaWQpO3ZhciBkPWEuZygpLGU9ITEsZj1MKGMpO2YmJkFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoZixmdW5jdGlvbihoKXtoPT1kP2U9ITA6aCYmdGhpcy51KGIsaCxkKX0sYSk7ZXx8b2MoYyxkKTt4YyhiLGMpO3JldHVybiBjfTt2Yy5wcm90b3R5cGUudT1mdW5jdGlvbihhLGIsYyl7Yj09YysiLWRpc2FibGVkIj9hLlgoITEpOmI9PWMrIi1ob3Jpem9udGFsIj96YyhhLCJob3Jpem9udGFsIik6Yj09YysiLXZlcnRpY2FsIiYmemMoYSwidmVydGljYWwiKX07CnZhciB4Yz1mdW5jdGlvbihhLGIpe2lmKGIpZm9yKHZhciBjPWIuZmlyc3RDaGlsZCxkO2MmJmMucGFyZW50Tm9kZT09Yjspe2Q9Yy5uZXh0U2libGluZztpZihjLm5vZGVUeXBlPT0xKXthOnt2YXIgZT1jO3AoZSk7ZT1MKGUpO2Zvcih2YXIgZj1lLmxlbmd0aCxoPTA7aDxmO2grKyl7dmFyIGs9ZVtoXTtpZihrPWsgaW4gc2M/c2Nba10oKTpudWxsKXtlPWs7YnJlYWsgYX19ZT1udWxsfWUmJihlLmc9YyxhLmlzRW5hYmxlZCgpfHxlLlgoITEpLGEuQmEoZSksU2IoZSxjKSl9ZWxzZSBjLm5vZGVWYWx1ZSYmSGEoYy5ub2RlVmFsdWUpIT0iInx8Yi5yZW1vdmVDaGlsZChjKTtjPWR9fSxBYz1mdW5jdGlvbihhLGIpe2I9Yi5pKCk7cChiLCJUaGUgY29udGFpbmVyIERPTSBlbGVtZW50IGNhbm5vdCBiZSBudWxsLiIpO0tiKGIsdCk7KGE9YS5BKSYmWmIoYixhKX07dmMucHJvdG90eXBlLmc9ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy1jb250YWluZXIifTsKdmMucHJvdG90eXBlLmo9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nKCksYz1bYixhLkw9PSJob3Jpem9udGFsIj9iKyItaG9yaXpvbnRhbCI6YisiLXZlcnRpY2FsIl07YS5pc0VuYWJsZWQoKXx8Yy5wdXNoKGIrIi1kaXNhYmxlZCIpO3JldHVybiBjfTt2YXIgQmM9ZnVuY3Rpb24oKXt9O3ZhciBNPWZ1bmN0aW9uKCl7fSxDYztpYShNKTt2YXIgRGM9e2J1dHRvbjoicHJlc3NlZCIsY2hlY2tib3g6ImNoZWNrZWQiLG1lbnVpdGVtOiJzZWxlY3RlZCIsbWVudWl0ZW1jaGVja2JveDoiY2hlY2tlZCIsbWVudWl0ZW1yYWRpbzoiY2hlY2tlZCIscmFkaW86ImNoZWNrZWQiLHRhYjoic2VsZWN0ZWQiLHRyZWVpdGVtOiJzZWxlY3RlZCJ9O00ucHJvdG90eXBlLk5hPWZ1bmN0aW9uKCl7fTtNLnByb3RvdHlwZS54YT1mdW5jdGlvbihhKXt2YXIgYj1hLkcsYz1iLmgsZD10aGlzLk4oKSxlPVtkXSxmPXRoaXMuTigpO2YhPWQmJmUucHVzaChmKTtkPWEubTtmb3IoZj1bXTtkOyl7dmFyIGg9ZCYtZDtmLnB1c2goRWModGhpcyxoKSk7ZCY9fmh9ZS5wdXNoLmFwcGx5KGUsZik7KGQ9YS5GYSkmJmUucHVzaC5hcHBseShlLGQpO3JldHVybiBjLmNhbGwoYiwiRElWIixlLmpvaW4oIiAiKSxhLmlhKX07Ck0ucHJvdG90eXBlLnlhPWZ1bmN0aW9uKGEsYil7Yi5pZCYmUGIoYSxiLmlkKTtiJiZiLmZpcnN0Q2hpbGQ/RmMoYSxiLmZpcnN0Q2hpbGQubmV4dFNpYmxpbmc/eWEoYi5jaGlsZE5vZGVzKTpiLmZpcnN0Q2hpbGQpOmEuaWE9bnVsbDt2YXIgYz0wLGQ9dGhpcy5OKCksZT10aGlzLk4oKSxmPSExLGg9ITEsaz15YShMKGIpKTtrLmZvckVhY2goZnVuY3Rpb24ocSl7Znx8cSE9ZD9ofHxxIT1lP2N8PUdjKHRoaXMscSk6aD0hMDooZj0hMCxlPT1kJiYoaD0hMCkpO0djKHRoaXMscSk9PTEmJihzYShiKSxkYihiKSYmZWIoYikmJmNiKGIsITEpKX0sdGhpcyk7YS5tPWM7Znx8KGsucHVzaChkKSxlPT1kJiYoaD0hMCkpO2h8fGsucHVzaChlKTsoYT1hLkZhKSYmay5wdXNoLmFwcGx5KGssYSk7ZiYmaCYmIWF8fG1jKGIsay5qb2luKCIgIikpO3JldHVybiBifTsKdmFyIEhjPWZ1bmN0aW9uKGEsYil7aWYoYT1hLk5hKCkpe3AoYiwiVGhlIGVsZW1lbnQgcGFzc2VkIGFzIGEgZmlyc3QgcGFyYW1ldGVyIGNhbm5vdCBiZSBudWxsLiIpO3ZhciBjPWIuZ2V0QXR0cmlidXRlKCJyb2xlIil8fG51bGw7YSE9YyYmWmIoYixhKX19LEljPWZ1bmN0aW9uKGEsYil7dmFyIGM7aWYoYS5EJjMyJiYoYz1hLmkoKSkpe2lmKCFiJiZhLm0mMzIpe3RyeXtjLmJsdXIoKX1jYXRjaChkKXt9YS5tJjMyJiZhLlFhKG51bGwpfShkYihjKSYmZWIoYykpIT1iJiZjYihjLGIpfX0sSmM9ZnVuY3Rpb24oYSxiLGMpe0NjfHwoQ2M9ezE6ImRpc2FibGVkIiw4OiJzZWxlY3RlZCIsMTY6ImNoZWNrZWQiLDY0OiJleHBhbmRlZCJ9KTtwKGEsIlRoZSBlbGVtZW50IHBhc3NlZCBhcyBhIGZpcnN0IHBhcmFtZXRlciBjYW5ub3QgYmUgbnVsbC4iKTtiPUNjW2JdO3ZhciBkPWEuZ2V0QXR0cmlidXRlKCJyb2xlIil8fG51bGw7ZCYmKGQ9RGNbZF18fGIsYj1iPT0iY2hlY2tlZCJ8fGI9PQoic2VsZWN0ZWQiP2Q6Yik7YiYmYWMoYSxiLGMpfTtNLnByb3RvdHlwZS5OPWZ1bmN0aW9uKCl7cmV0dXJuImdvb2ctY29udHJvbCJ9O3ZhciBFYz1mdW5jdGlvbihhLGIpe2EuZ3x8S2MoYSk7cmV0dXJuIGEuZ1tiXX0sR2M9ZnVuY3Rpb24oYSxiKXthLmh8fChhLmd8fEtjKGEpLGEuaD1FYShhLmcpKTthPXBhcnNlSW50KGEuaFtiXSwxMCk7cmV0dXJuIGlzTmFOKGEpPzA6YX0sS2M9ZnVuY3Rpb24oYSl7dmFyIGI9YS5OKCk7dmFyIGM9Yi5yZXBsYWNlKC9ceGEwfFxzL2csIiAiKS5pbmRleE9mKCIgIikhPS0xO3AoIWMsIkNvbnRyb2xSZW5kZXJlciBoYXMgYW4gaW52YWxpZCBjc3MgY2xhc3M6ICciK2IrIiciKTthLmc9ezE6YisiLWRpc2FibGVkIiwyOmIrIi1ob3ZlciIsNDpiKyItYWN0aXZlIiw4OmIrIi1zZWxlY3RlZCIsMTY6YisiLWNoZWNrZWQiLDMyOmIrIi1mb2N1c2VkIiw2NDpiKyItb3BlbiJ9fTt2YXIgTj1mdW5jdGlvbihhLGIsYyl7Ri5jYWxsKHRoaXMsYyk7aWYoIWIpe2ZvcihiPXRoaXMuY29uc3RydWN0b3I7Yjspe3ZhciBkPW5hKGIpO2lmKGQ9dWNbZF0pYnJlYWs7Yj0oYj1PYmplY3QuZ2V0UHJvdG90eXBlT2YoYi5wcm90b3R5cGUpKSYmYi5jb25zdHJ1Y3Rvcn1iPWQ/dHlwZW9mIGQuVj09PSJmdW5jdGlvbiI/ZC5WKCk6bmV3IGQ6bnVsbH10aGlzLnY9Yjt0aGlzLmlhPWEhPT12b2lkIDA/YTpudWxsfTtuKE4sRik7Zz1OLnByb3RvdHlwZTtnLmlhPW51bGw7Zy5tPTA7Zy5EPTM5O2cuUD0wO2cuT2E9ITA7Zy5GYT1udWxsO2cuSGE9ITA7Zy5tYT1mdW5jdGlvbigpe3ZhciBhPXRoaXMudi54YSh0aGlzKTt0aGlzLmc9YTtIYyh0aGlzLnYsYSk7S2IoYSwhMCk7dGhpcy5pc1Zpc2libGUoKXx8KGEuc3R5bGUuZGlzcGxheT0ibm9uZSIsYSYmYWMoYSwiaGlkZGVuIiwhMCkpfTtnLm5hPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaSgpfTtnLndhPWZ1bmN0aW9uKCl7cmV0dXJuITB9OwpnLkVhPWZ1bmN0aW9uKGEpe3RoaXMuZz1hPXRoaXMudi55YSh0aGlzLGEpO0hjKHRoaXMudixhKTtLYihhLCEwKTt0aGlzLk9hPWEuc3R5bGUuZGlzcGxheSE9Im5vbmUifTsKZy5JPWZ1bmN0aW9uKCl7Ti5sLkkuY2FsbCh0aGlzKTt2YXIgYT10aGlzLmc7cChhLCJDYW4gbm90IGNhbGwgZ2V0RWxlbWVudFN0cmljdCBiZWZvcmUgcmVuZGVyaW5nL2RlY29yYXRpbmcuIik7cCh0aGlzKTtwKGEpO3RoaXMuaXNWaXNpYmxlKCl8fGFjKGEsImhpZGRlbiIsIXRoaXMuaXNWaXNpYmxlKCkpO3RoaXMuaXNFbmFibGVkKCl8fEpjKGEsMSwhdGhpcy5pc0VuYWJsZWQoKSk7dGhpcy5EJjgmJkpjKGEsOCwhISh0aGlzLm0mOCkpO3RoaXMuRCYxNiYmSmMoYSwxNiwhISh0aGlzLm0mMTYpKTt0aGlzLkQmNjQmJkpjKGEsNjQsISEodGhpcy5tJjY0KSk7dmFyIGI9dGhpcy52O1ViKHRoaXMpJiYoYT10aGlzLmkoKSxiPWIuTigpKyItcnRsIiwoYT1hLmk/YS5pKCk6YSkmJnBjKGEsW2JdKSk7dGhpcy5pc0VuYWJsZWQoKSYmSWModGhpcyx0aGlzLmlzVmlzaWJsZSgpKTt0aGlzLkQmLTImJih0aGlzLkhhJiZMYyh0aGlzLCEwKSx0aGlzLkQmMzImJihhPXRoaXMuaSgpKSkmJihiPQp0aGlzLlp8fCh0aGlzLlo9bmV3IEopLGdjKGIsYSksQihCKEIoUWIodGhpcyksYiwia2V5Iix0aGlzLmFhKSxhLCJmb2N1cyIsdGhpcy5YYSksYSwiYmx1ciIsdGhpcy5RYSkpfTt2YXIgTGM9ZnVuY3Rpb24oYSxiKXt2YXIgYz1RYihhKSxkPWEuaSgpO2I/KEIoQihCKEIoYyxkLEsuZ2EsYS5zYSksZCxbSy5oYSxLLmZhXSxhLnZhKSxkLCJtb3VzZW92ZXIiLGEudWEpLGQsIm1vdXNlb3V0IixhLnRhKSxhLmNhIT1CYyYmQihjLGQsImNvbnRleHRtZW51IixhLmNhKSk6KEMoQyhDKEMoYyxkLEsuZ2EsYS5zYSksZCxbSy5oYSxLLmZhXSxhLnZhKSxkLCJtb3VzZW92ZXIiLGEudWEpLGQsIm1vdXNlb3V0IixhLnRhKSxhLmNhIT1CYyYmQyhjLGQsImNvbnRleHRtZW51IixhLmNhKSl9O04ucHJvdG90eXBlLlU9ZnVuY3Rpb24oKXtOLmwuVS5jYWxsKHRoaXMpO3RoaXMuWiYma2ModGhpcy5aKTt0aGlzLmlzVmlzaWJsZSgpJiZ0aGlzLmlzRW5hYmxlZCgpJiZJYyh0aGlzLCExKX07Ck4ucHJvdG90eXBlLkM9ZnVuY3Rpb24oKXtOLmwuQy5jYWxsKHRoaXMpO3RoaXMuWiYmKHRoaXMuWi5kaXNwb3NlKCksZGVsZXRlIHRoaXMuWik7ZGVsZXRlIHRoaXMudjt0aGlzLkZhPXRoaXMuaWE9bnVsbH07dmFyIEZjPWZ1bmN0aW9uKGEsYil7YS5pYT1ifTtOLnByb3RvdHlwZS5pc1Zpc2libGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5PYX07Ti5wcm90b3R5cGUuaXNFbmFibGVkPWZ1bmN0aW9uKCl7cmV0dXJuISh0aGlzLm0mMSl9O04ucHJvdG90eXBlLlg9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5oO2ImJnR5cGVvZiBiLmlzRW5hYmxlZD09ImZ1bmN0aW9uIiYmIWIuaXNFbmFibGVkKCl8fCFPKHRoaXMsMSwhYSl8fChhfHwoTWModGhpcywhMSksUCh0aGlzLCExKSksdGhpcy5pc1Zpc2libGUoKSYmSWModGhpcyxhKSxUKHRoaXMsMSwhYSwhMCkpfTt2YXIgUD1mdW5jdGlvbihhLGIpe08oYSwyLGIpJiZUKGEsMixiKX07Ck4ucHJvdG90eXBlLmlzQWN0aXZlPWZ1bmN0aW9uKCl7cmV0dXJuISEodGhpcy5tJjQpfTsKdmFyIE1jPWZ1bmN0aW9uKGEsYil7TyhhLDQsYikmJlQoYSw0LGIpfSxOYz1mdW5jdGlvbihhLGIpe08oYSw4LGIpJiZUKGEsOCxiKX0sT2M9ZnVuY3Rpb24oYSxiKXtPKGEsNjQsYikmJlQoYSw2NCxiKX0sVD1mdW5jdGlvbihhLGIsYyxkKXtpZighZCYmYj09MSlhLlgoIWMpO2Vsc2UgaWYoYS5EJmImJmMhPSEhKGEubSZiKSl7dmFyIGU9YS52O2lmKGQ9YS5pKCkpe2lmKGU9RWMoZSxiKSl7dmFyIGY9YS5pP2EuaSgpOmE7ZiYmKGM/cGM6cmMpKGYsW2VdKX1KYyhkLGIsYyl9YS5tPWM/YS5tfGI6YS5tJn5ifX0sUGM9ZnVuY3Rpb24oYSxiLGMpe2lmKGEucyYmYS5tJmImJiFjKXRocm93IEVycm9yKCJDb21wb25lbnQgYWxyZWFkeSByZW5kZXJlZCIpOyFjJiZhLm0mYiYmVChhLGIsITEpO2EuRD1jP2EuRHxiOmEuRCZ+Yn0sVT1mdW5jdGlvbihhLGIpe3JldHVybiEhKDI1NSZiKSYmISEoYS5EJmIpfSxPPWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4hIShhLkQmYikmJiEhKGEubSZiKSE9CmMmJighKGEuUCZiKXx8RShhLE5iKGIsYykpKSYmIWEuYmF9O04ucHJvdG90eXBlLnVhPWZ1bmN0aW9uKGEpeyFRYyhhLHRoaXMuaSgpKSYmRSh0aGlzLCJlbnRlciIpJiZ0aGlzLmlzRW5hYmxlZCgpJiZVKHRoaXMsMikmJlAodGhpcywhMCl9O04ucHJvdG90eXBlLnRhPWZ1bmN0aW9uKGEpeyFRYyhhLHRoaXMuaSgpKSYmRSh0aGlzLCJsZWF2ZSIpJiYoVSh0aGlzLDQpJiZNYyh0aGlzLCExKSxVKHRoaXMsMikmJlAodGhpcywhMSkpfTtOLnByb3RvdHlwZS5jYT1CYzt2YXIgUWM9ZnVuY3Rpb24oYSxiKXtyZXR1cm4hIWEucmVsYXRlZFRhcmdldCYmYWIoYixhLnJlbGF0ZWRUYXJnZXQpfTsKTi5wcm90b3R5cGUuc2E9ZnVuY3Rpb24oYSl7aWYodGhpcy5pc0VuYWJsZWQoKSYmKFUodGhpcywyKSYmUCh0aGlzLCEwKSwhKGEuaC5idXR0b24hPTB8fHYmJmEuY3RybEtleSkpKXtVKHRoaXMsNCkmJk1jKHRoaXMsITApO3ZhciBiO2lmKGI9dGhpcy52KXt2YXIgYztiPXRoaXMuRCYzMiYmKGM9dGhpcy5pKCkpP2RiKGMpJiZlYihjKTohMX1iJiZ0aGlzLmkoKS5mb2N1cygpfWEuaC5idXR0b24hPTB8fHYmJmEuY3RybEtleXx8YS5qKCl9O04ucHJvdG90eXBlLnZhPWZ1bmN0aW9uKGEpe3RoaXMuaXNFbmFibGVkKCkmJihVKHRoaXMsMikmJlAodGhpcywhMCksdGhpcy5pc0FjdGl2ZSgpJiZSYyh0aGlzLGEpJiZVKHRoaXMsNCkmJk1jKHRoaXMsITEpKX07CnZhciBSYz1mdW5jdGlvbihhLGIpe2lmKFUoYSwxNikpe3ZhciBjPSEoYS5tJjE2KTtPKGEsMTYsYykmJlQoYSwxNixjKX1VKGEsOCkmJk5jKGEsITApO1UoYSw2NCkmJk9jKGEsIShhLm0mNjQpKTtjPW5ldyB5KCJhY3Rpb24iLGEpO2ImJihjLmFsdEtleT1iLmFsdEtleSxjLmN0cmxLZXk9Yi5jdHJsS2V5LGMubWV0YUtleT1iLm1ldGFLZXksYy5zaGlmdEtleT1iLnNoaWZ0S2V5LGMuRz1iLkcsYy50aW1lU3RhbXA9Yi50aW1lU3RhbXApO3JldHVybiBFKGEsYyl9O04ucHJvdG90eXBlLlhhPWZ1bmN0aW9uKCl7VSh0aGlzLDMyKSYmTyh0aGlzLDMyLCEwKSYmVCh0aGlzLDMyLCEwKX07Ti5wcm90b3R5cGUuUWE9ZnVuY3Rpb24oKXtVKHRoaXMsNCkmJk1jKHRoaXMsITEpO1UodGhpcywzMikmJk8odGhpcywzMiwhMSkmJlQodGhpcywzMiwhMSl9OwpOLnByb3RvdHlwZS5hYT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5pc1Zpc2libGUoKSYmdGhpcy5pc0VuYWJsZWQoKSYmYS5nPT0xMyYmUmModGhpcyxhKT8oYS5qKCksYS52KCksITApOiExfTtpZih0eXBlb2YgTiE9PSJmdW5jdGlvbiIpdGhyb3cgRXJyb3IoIkludmFsaWQgY29tcG9uZW50IGNsYXNzICIrTik7aWYodHlwZW9mIE0hPT0iZnVuY3Rpb24iKXRocm93IEVycm9yKCJJbnZhbGlkIHJlbmRlcmVyIGNsYXNzICIrTSk7dmFyIFNjPW5hKE4pO3VjW1NjXT1NO3RjKCJnb29nLWNvbnRyb2wiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBOKG51bGwpfSk7dmFyIFY9ZnVuY3Rpb24oYSxiLGMpe0YuY2FsbCh0aGlzLGMpO3RoaXMuZWE9Ynx8dmMuVigpO3RoaXMuTD1hfHwidmVydGljYWwifTtuKFYsRik7Zz1WLnByb3RvdHlwZTtnLkthPW51bGw7Zy5kYT1udWxsO2cuZWE9bnVsbDtnLkw9bnVsbDtnLlM9ITA7Zy5UPSEwO2cubz0tMTtnLkI9bnVsbDtnLlc9ITE7Zy5PPW51bGw7dmFyIFRjPWZ1bmN0aW9uKGEpe3JldHVybiBhLkthfHxhLmkoKX07Zz1WLnByb3RvdHlwZTtnLm1hPWZ1bmN0aW9uKCl7dGhpcy5nPXRoaXMuRy5oKCJESVYiLHRoaXMuZWEuaih0aGlzKS5qb2luKCIgIikpfTtnLm5hPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaSgpfTtnLndhPWZ1bmN0aW9uKGEpe3JldHVybiBhLnRhZ05hbWU9PSJESVYifTtnLkVhPWZ1bmN0aW9uKGEpe3RoaXMuZz15Yyh0aGlzLmVhLHRoaXMsYSk7YS5zdHlsZS5kaXNwbGF5PT0ibm9uZSImJih0aGlzLlM9ITEpfTsKZy5JPWZ1bmN0aW9uKCl7Vi5sLkkuY2FsbCh0aGlzKTtUYih0aGlzLGZ1bmN0aW9uKGIpe2IucyYmVWModGhpcyxiKX0sdGhpcyk7dmFyIGE9dGhpcy5pKCk7QWModGhpcy5lYSx0aGlzKTtWYyh0aGlzLHRoaXMuUyk7QihCKEIoQihCKEIoQihCKFFiKHRoaXMpLHRoaXMsImVudGVyIix0aGlzLmViKSx0aGlzLCJoaWdobGlnaHQiLHRoaXMuZmIpLHRoaXMsInVuaGlnaGxpZ2h0Iix0aGlzLmxiKSx0aGlzLCJvcGVuIix0aGlzLmdiKSx0aGlzLCJjbG9zZSIsdGhpcy5iYiksYSxLLmdhLHRoaXMuV2EpLGJiKGEpLFtLLmhhLEsuZmFdLHRoaXMuY2IpLGEsW0suZ2EsSy5oYSxLLmZhLCJtb3VzZW92ZXIiLCJtb3VzZW91dCIsImNvbnRleHRtZW51Il0sdGhpcy5hYik7V2ModGhpcyl9O3ZhciBXYz1mdW5jdGlvbihhKXt2YXIgYj1RYihhKSxjPVRjKGEpO0IoQihCKGIsYywiZm9jdXMiLGEuUGEpLGMsImJsdXIiLGEuVWEpLGEuZGF8fChhLmRhPW5ldyBKKFRjKGEpKSksImtleSIsYS5WYSl9OwpnPVYucHJvdG90eXBlO2cuVT1mdW5jdGlvbigpe1hjKHRoaXMsLTEpO3RoaXMuQiYmT2ModGhpcy5CLCExKTt0aGlzLlc9ITE7Vi5sLlUuY2FsbCh0aGlzKX07Zy5DPWZ1bmN0aW9uKCl7Vi5sLkMuY2FsbCh0aGlzKTt0aGlzLmRhJiYodGhpcy5kYS5kaXNwb3NlKCksdGhpcy5kYT1udWxsKTt0aGlzLmVhPXRoaXMuQj10aGlzLk89dGhpcy5LYT1udWxsfTtnLmViPWZ1bmN0aW9uKCl7cmV0dXJuITB9OwpnLmZiPWZ1bmN0aW9uKGEpe3ZhciBiPVZiKHRoaXMsYS50YXJnZXQpO2lmKGI+LTEmJmIhPXRoaXMubyl7dmFyIGM9SSh0aGlzLHRoaXMubyk7YyYmUChjLCExKTt0aGlzLm89YjtjPUkodGhpcyx0aGlzLm8pO3RoaXMuVyYmTWMoYywhMCk7dGhpcy5CJiZjIT10aGlzLkImJihjLkQmNjQ/T2MoYywhMCk6T2ModGhpcy5CLCExKSl9Yj10aGlzLmkoKTtwKGIsIlRoZSBET00gZWxlbWVudCBmb3IgdGhlIGNvbnRhaW5lciBjYW5ub3QgYmUgbnVsbC4iKTthLnRhcmdldC5pKCkhPW51bGwmJmFjKGIsImFjdGl2ZWRlc2NlbmRhbnQiLGEudGFyZ2V0LmkoKS5pZCl9O2cubGI9ZnVuY3Rpb24oYSl7YS50YXJnZXQ9PUkodGhpcyx0aGlzLm8pJiYodGhpcy5vPS0xKTthPXRoaXMuaSgpO3AoYSwiVGhlIERPTSBlbGVtZW50IGZvciB0aGUgY29udGFpbmVyIGNhbm5vdCBiZSBudWxsLiIpO2EucmVtb3ZlQXR0cmlidXRlKCRiKCJhY3RpdmVkZXNjZW5kYW50IikpfTsKZy5nYj1mdW5jdGlvbihhKXsoYT1hLnRhcmdldCkmJmEhPXRoaXMuQiYmYS5oPT10aGlzJiYodGhpcy5CJiZPYyh0aGlzLkIsITEpLHRoaXMuQj1hKX07Zy5iYj1mdW5jdGlvbihhKXthLnRhcmdldD09dGhpcy5CJiYodGhpcy5CPW51bGwpO3ZhciBiPXRoaXMuaSgpLGM9YS50YXJnZXQuaSgpO2ImJmEudGFyZ2V0Lm0mMiYmYyYmKGE9IiIsYyYmKGE9Yy5pZCxwKGEsIlRoZSBhY3RpdmUgZWxlbWVudCBzaG91bGQgaGF2ZSBhbiBpZC4iKSksYWMoYiwiYWN0aXZlZGVzY2VuZGFudCIsYSkpfTtnLldhPWZ1bmN0aW9uKGEpe3RoaXMuVCYmKHRoaXMuVz0hMCk7dmFyIGI9VGModGhpcyk7YiYmZGIoYikmJmViKGIpP2IuZm9jdXMoKTphLmooKX07Zy5jYj1mdW5jdGlvbigpe3RoaXMuVz0hMX07CmcuYWI9ZnVuY3Rpb24oYSl7YTp7dmFyIGI9YS50YXJnZXQ7aWYodGhpcy5PKWZvcih2YXIgYz10aGlzLmkoKTtiJiZiIT09Yzspe3ZhciBkPWIuaWQ7aWYoZCBpbiB0aGlzLk8pe2I9dGhpcy5PW2RdO2JyZWFrIGF9Yj1iLnBhcmVudE5vZGV9Yj1udWxsfWlmKGIpc3dpdGNoKGEudHlwZSl7Y2FzZSBLLmdhOmIuc2EoYSk7YnJlYWs7Y2FzZSBLLmhhOmNhc2UgSy5mYTpiLnZhKGEpO2JyZWFrO2Nhc2UgIm1vdXNlb3ZlciI6Yi51YShhKTticmVhaztjYXNlICJtb3VzZW91dCI6Yi50YShhKTticmVhaztjYXNlICJjb250ZXh0bWVudSI6Yi5jYShhKX19O2cuUGE9ZnVuY3Rpb24oKXt9O2cuVWE9ZnVuY3Rpb24oKXtYYyh0aGlzLC0xKTt0aGlzLlc9ITE7dGhpcy5CJiZPYyh0aGlzLkIsITEpfTsKZy5WYT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5pc0VuYWJsZWQoKSYmdGhpcy5pc1Zpc2libGUoKSYmKEgodGhpcykhPTB8fHRoaXMuS2EpJiZZYyh0aGlzLGEpPyhhLmooKSxhLnYoKSwhMCk6ITF9Owp2YXIgWWM9ZnVuY3Rpb24oYSxiKXt2YXIgYz1JKGEsYS5vKTtpZihjJiZ0eXBlb2YgYy5hYT09ImZ1bmN0aW9uIiYmYy5hYShiKXx8YS5CJiZhLkIhPWMmJnR5cGVvZiBhLkIuYWE9PSJmdW5jdGlvbiImJmEuQi5hYShiKSlyZXR1cm4hMDtpZihiLnNoaWZ0S2V5fHxiLmN0cmxLZXl8fGIubWV0YUtleXx8Yi5hbHRLZXkpcmV0dXJuITE7c3dpdGNoKGIuZyl7Y2FzZSAyNzpUYyhhKS5ibHVyKCk7YnJlYWs7Y2FzZSAzNjpaYyhhKTticmVhaztjYXNlIDM1OiRjKGEpO2JyZWFrO2Nhc2UgMzg6aWYoYS5MPT0idmVydGljYWwiKWFkKGEpO2Vsc2UgcmV0dXJuITE7YnJlYWs7Y2FzZSAzNzppZihhLkw9PSJob3Jpem9udGFsIilVYihhKT9iZChhKTphZChhKTtlbHNlIHJldHVybiExO2JyZWFrO2Nhc2UgNDA6aWYoYS5MPT0idmVydGljYWwiKWJkKGEpO2Vsc2UgcmV0dXJuITE7YnJlYWs7Y2FzZSAzOTppZihhLkw9PSJob3Jpem9udGFsIilVYihhKT9hZChhKTpiZChhKTtlbHNlIHJldHVybiExOwpicmVhaztkZWZhdWx0OnJldHVybiExfXJldHVybiEwfSxVYz1mdW5jdGlvbihhLGIpe3ZhciBjPWIuaSgpO2M9Yy5pZHx8KGMuaWQ9T2IoYikpO2EuT3x8KGEuTz17fSk7YS5PW2NdPWJ9O1YucHJvdG90eXBlLkJhPWZ1bmN0aW9uKGEsYil7dWEoYSxOLCJUaGUgY2hpbGQgb2YgYSBjb250YWluZXIgbXVzdCBiZSBhIGNvbnRyb2wiKTtWLmwuQmEuY2FsbCh0aGlzLGEsYil9O1YucHJvdG90eXBlLkNhPWZ1bmN0aW9uKGEsYixjKXt1YShhLE4pO2EuUHw9MjthLlB8PTY0O1BjKGEsMzIsITEpO2EucyYmMCE9YS5IYSYmTGMoYSwhMSk7YS5IYT0hMTt2YXIgZD1hLmg9PXRoaXM/VmIodGhpcyxhKTotMTtWLmwuQ2EuY2FsbCh0aGlzLGEsYixjKTthLnMmJnRoaXMucyYmVWModGhpcyxhKTthPWQ7YT09LTEmJihhPUgodGhpcykpO2E9PXRoaXMubz90aGlzLm89TWF0aC5taW4oSCh0aGlzKS0xLGIpOmE+dGhpcy5vJiZiPD10aGlzLm8/dGhpcy5vKys6YTx0aGlzLm8mJmI+dGhpcy5vJiZ0aGlzLm8tLX07CnZhciB6Yz1mdW5jdGlvbihhLGIpe2lmKGEuaSgpKXRocm93IEVycm9yKCJDb21wb25lbnQgYWxyZWFkeSByZW5kZXJlZCIpO2EuTD1ifTtWLnByb3RvdHlwZS5pc1Zpc2libGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5TfTt2YXIgVmM9ZnVuY3Rpb24oYSxiKXthLlM9Yjt2YXIgYz1hLmkoKTtjJiYoYy5zdHlsZS5kaXNwbGF5PWI/IiI6Im5vbmUiLHdjKFRjKGEpLGEuVCYmYS5TKSl9O1YucHJvdG90eXBlLmlzRW5hYmxlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLlR9O1YucHJvdG90eXBlLlg9ZnVuY3Rpb24oYSl7dGhpcy5UIT1hJiZFKHRoaXMsYT8iZW5hYmxlIjoiZGlzYWJsZSIpJiYoYT8odGhpcy5UPSEwLFRiKHRoaXMsZnVuY3Rpb24oYil7Yi5UYT9kZWxldGUgYi5UYTpiLlgoITApfSkpOihUYih0aGlzLGZ1bmN0aW9uKGIpe2IuaXNFbmFibGVkKCk/Yi5YKCExKTpiLlRhPSEwfSksdGhpcy5XPXRoaXMuVD0hMSksd2MoVGModGhpcyksYSYmdGhpcy5TKSl9Owp2YXIgWGM9ZnVuY3Rpb24oYSxiKXsoYj1JKGEsYikpP1AoYiwhMCk6YS5vPi0xJiZQKEkoYSxhLm8pLCExKX0sWmM9ZnVuY3Rpb24oYSl7Y2QoYSxmdW5jdGlvbihiLGMpe3JldHVybihiKzEpJWN9LEgoYSktMSl9LCRjPWZ1bmN0aW9uKGEpe2NkKGEsZnVuY3Rpb24oYixjKXtiLS07cmV0dXJuIGI8MD9jLTE6Yn0sMCl9LGJkPWZ1bmN0aW9uKGEpe2NkKGEsZnVuY3Rpb24oYixjKXtyZXR1cm4oYisxKSVjfSxhLm8pfSxhZD1mdW5jdGlvbihhKXtjZChhLGZ1bmN0aW9uKGIsYyl7Yi0tO3JldHVybiBiPDA/Yy0xOmJ9LGEubyl9LGNkPWZ1bmN0aW9uKGEsYixjKXtjPWM8MD9WYihhLGEuQik6Yzt2YXIgZD1IKGEpO2M9Yi5jYWxsKGEsYyxkKTtmb3IodmFyIGU9MDtlPD1kOyl7dmFyIGY9SShhLGMpO2lmKGYmJmYuaXNWaXNpYmxlKCkmJmYuaXNFbmFibGVkKCkmJmYuRCYyKXthLkxhKGMpO2JyZWFrfWUrKztjPWIuY2FsbChhLGMsZCl9fTsKVi5wcm90b3R5cGUuTGE9ZnVuY3Rpb24oYSl7WGModGhpcyxhKX07dmFyIGRkPWZ1bmN0aW9uKCl7fTtuKGRkLE0pO2lhKGRkKTtnPWRkLnByb3RvdHlwZTtnLk49ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy10YWIifTtnLk5hPWZ1bmN0aW9uKCl7cmV0dXJuInRhYiJ9O2cueGE9ZnVuY3Rpb24oYSl7dmFyIGI9ZGQubC54YS5jYWxsKHRoaXMsYSk7KGE9YS5HYSgpKSYmdGhpcy5NYShiLGEpO3JldHVybiBifTtnLnlhPWZ1bmN0aW9uKGEsYil7Yj1kZC5sLnlhLmNhbGwodGhpcyxhLGIpO3ZhciBjPXRoaXMuR2EoYik7YyYmKGEuUmE9Yyk7YS5tJjgmJihjPWEuaCkmJnR5cGVvZiBjLko9PT0iZnVuY3Rpb24iJiYoVChhLDgsITEpLGMuSihhKSk7cmV0dXJuIGJ9O2cuR2E9ZnVuY3Rpb24oYSl7cmV0dXJuIGEudGl0bGV8fCIifTtnLk1hPWZ1bmN0aW9uKGEsYil7YSYmKGEudGl0bGU9Ynx8IiIpfTt2YXIgZWQ9ZnVuY3Rpb24oYSxiLGMpe04uY2FsbCh0aGlzLGEsYnx8ZGQuVigpLGMpO1BjKHRoaXMsOCwhMCk7dGhpcy5QfD05fTtuKGVkLE4pO2VkLnByb3RvdHlwZS5HYT1mdW5jdGlvbigpe3JldHVybiB0aGlzLlJhfTtlZC5wcm90b3R5cGUuTWE9ZnVuY3Rpb24oYSl7dGhpcy52Lk1hKHRoaXMuaSgpLGEpO3RoaXMuUmE9YX07dGMoImdvb2ctdGFiIixmdW5jdGlvbigpe3JldHVybiBuZXcgZWQobnVsbCl9KTt2YXIgVz1mdW5jdGlvbigpe3RoaXMuQT0idGFibGlzdCJ9O24oVyx2Yyk7aWEoVyk7Vy5wcm90b3R5cGUuZz1mdW5jdGlvbigpe3JldHVybiJnb29nLXRhYi1iYXIifTtXLnByb3RvdHlwZS51PWZ1bmN0aW9uKGEsYixjKXt0aGlzLnZ8fCh0aGlzLmh8fGZkKHRoaXMpLHRoaXMudj1FYSh0aGlzLmgpKTt2YXIgZD10aGlzLnZbYl07ZD8oemMoYSxnZChkKSksYS52PWQpOlcubC51LmNhbGwodGhpcyxhLGIsYyl9O1cucHJvdG90eXBlLmo9ZnVuY3Rpb24oYSl7dmFyIGI9Vy5sLmouY2FsbCh0aGlzLGEpO3RoaXMuaHx8ZmQodGhpcyk7Yi5wdXNoKHRoaXMuaFthLnZdKTtyZXR1cm4gYn07dmFyIGZkPWZ1bmN0aW9uKGEpe3ZhciBiPWEuZygpO2EuaD17dG9wOmIrIi10b3AiLGJvdHRvbTpiKyItYm90dG9tIixzdGFydDpiKyItc3RhcnQiLGVuZDpiKyItZW5kIn19O3ZhciBYPWZ1bmN0aW9uKGEsYixjKXthPWF8fCJ0b3AiO3pjKHRoaXMsZ2QoYSkpO3RoaXMudj1hO1YuY2FsbCh0aGlzLHRoaXMuTCxifHxXLlYoKSxjKTtoZCh0aGlzKX07bihYLFYpO2c9WC5wcm90b3R5cGU7Zy5IPW51bGw7Zy5JPWZ1bmN0aW9uKCl7WC5sLkkuY2FsbCh0aGlzKTtoZCh0aGlzKX07Zy5DPWZ1bmN0aW9uKCl7WC5sLkMuY2FsbCh0aGlzKTt0aGlzLkg9bnVsbH07Zy5MYT1mdW5jdGlvbihhKXtYLmwuTGEuY2FsbCh0aGlzLGEpO3RoaXMuSihJKHRoaXMsYSkpfTtnLko9ZnVuY3Rpb24oYSl7YT9OYyhhLCEwKTp0aGlzLkgmJk5jKHRoaXMuSCwhMSl9Owp2YXIgaWQ9ZnVuY3Rpb24oYSxiKXtpZihiJiZiPT1hLkgpe2Zvcih2YXIgYz1WYihhLGIpLGQ9Yy0xO2I9SShhLGQpO2QtLSl7dmFyIGU9YjtpZihlLmlzVmlzaWJsZSgpJiZlLmlzRW5hYmxlZCgpKXthLkooYik7cmV0dXJufX1mb3IoYys9MTtiPUkoYSxjKTtjKyspaWYoZD1iLGQuaXNWaXNpYmxlKCkmJmQuaXNFbmFibGVkKCkpe2EuSihiKTtyZXR1cm59YS5KKG51bGwpfX07Zz1YLnByb3RvdHlwZTtnLmpiPWZ1bmN0aW9uKGEpe3RoaXMuSCYmdGhpcy5IIT1hLnRhcmdldCYmTmModGhpcy5ILCExKTt0aGlzLkg9YS50YXJnZXR9O2cua2I9ZnVuY3Rpb24oYSl7YS50YXJnZXQ9PXRoaXMuSCYmKHRoaXMuSD1udWxsKX07Zy5oYj1mdW5jdGlvbihhKXtpZCh0aGlzLGEudGFyZ2V0KX07Zy5pYj1mdW5jdGlvbihhKXtpZCh0aGlzLGEudGFyZ2V0KX07Zy5QYT1mdW5jdGlvbigpe0kodGhpcyx0aGlzLm8pfHxYYyh0aGlzLFZiKHRoaXMsdGhpcy5IfHxJKHRoaXMsMCkpKX07CnZhciBoZD1mdW5jdGlvbihhKXtCKEIoQihCKFFiKGEpLGEsInNlbGVjdCIsYS5qYiksYSwidW5zZWxlY3QiLGEua2IpLGEsImRpc2FibGUiLGEuaGIpLGEsImhpZGUiLGEuaWIpfSxnZD1mdW5jdGlvbihhKXtyZXR1cm4gYT09InN0YXJ0Inx8YT09ImVuZCI/InZlcnRpY2FsIjoiaG9yaXpvbnRhbCJ9O3RjKCJnb29nLXRhYi1iYXIiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBYfSk7ZnVuY3Rpb24gamQoYSl7dmFyIGI9e3RvcDoiYm90dG9tIixib3R0b206InRvcCIsc3RhcnQ6InJpZ2h0IixlbmQ6ImxlZnQifVthLmxvY2F0aW9uXSxjPWEuZWxlbWVudElkLGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTtkLnRleHRDb250ZW50PSJcbiAgICBmaWVsZHNldCB7XG4gICAgICBwYWRkaW5nOiAxMHB4O1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgIzM2OTtcbiAgICB9XG5cbiAgICAjIitjKyIgLmdvb2ctdGFiLWNvbnRlbnQge1xuICAgICAgbWluLWhlaWdodDogM2VtO1xuICAgICAgbWFyZ2luOiAwO1xuICAgICAgYm9yZGVyOiAiK2EuYm9yZGVyKyIgc29saWQgIithLmJvcmRlckNvbG9yKyI7XG4gICAgICBib3JkZXItdG9wOiAwO1xuICAgICAgaGVpZ2h0OiAiK2EuY29udGVudEhlaWdodCsiO1xuICAgICAgcGFkZGluZzogNHB4IDhweDtcbiAgICAgIG1hcmdpbi1yaWdodDogNHB4O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgIG92ZXJmbG93OiBhdXRvO1xuICAgIH1cblxuICAgICMiKwpjKyIgLmdvb2ctdGFiLWJhci0iK2EubG9jYXRpb24rIiAuZ29vZy10YWItc2VsZWN0ZWQge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICIrYS5ib3JkZXJDb2xvcisiO1xuICAgICAgYm9yZGVyLSIrYisiOiAwcHg7XG4gICAgfVxuXG4gICAgIyIrYysiIC5nb29nLXRhYi1iYXItIithLmxvY2F0aW9uKyIge1xuICAgICAgcGFkZGluZy0iK2EubG9jYXRpb24rIjogNXB4ICFpbXBvcnRhbnQ7XG4gICAgICBib3JkZXItIitiKyI6IDFweCBzb2xpZCAiK2EuYm9yZGVyQ29sb3IrIiAhaW1wb3J0YW50O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICB9XG5cbiAgICAjIitjKyIgLmdvb2ctdGFiLWJhciB7XG4gICAgICAgbWFyZ2luOiAwO1xuICAgICAgIGJvcmRlcjogMDtcbiAgICAgICBwYWRkaW5nOiAwO1xuICAgICAgIGxpc3Qtc3R5bGU6IG5vbmU7XG4gICAgICAgY3Vyc29yOiBkZWZhdWx0O1xuICAgICAgIG91dGxpbmU6IG5vbmU7XG4gICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgICBtYXJnaW4tcmlnaHQ6IDRweDtcbiAgICAgIH1cblxuICAgICAjIisKYysiIC5nb29nLXRhYiB7XG4gICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgIHBhZGRpbmc6IDRweCA4cHg7XG4gICAgICAgY29sb3I6IHZhcigtLWNvbGFiLXByaW1hcnktdGV4dC1jb2xvcik7XG4gICAgICAgdGV4dC1kZWNvcmF0aW9uOiBpbml0aWFsO1xuICAgICAgIGN1cnNvcjogZGVmYXVsdDtcbiAgICAgIH1cblxuICAgICAgIyIrYysiIC5nb29nLXRhYi1ob3ZlciB7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWNvbGFiLWhpZ2hsaWdodGVkLXN1cmZhY2UtY29sb3IpO1xuICAgICAgfVxuICAgICAgIjtyZXR1cm4gZH0KdmFyIGtkPWZ1bmN0aW9uKGEpe3ZhciBiPWEuZWxlbWVudElkLGM9YS50YWJOYW1lcyxkPWEuc2VsZWN0ZWRJbmRleDsiY29udGVudEJvcmRlciJpbiBhfHwoYS5jb250ZW50Qm9yZGVyPSIwcHgiKTsiY29udGVudEhlaWdodCJpbiBhfHwoYS5jb250ZW50SGVpZ2h0PSJpbml0aWFsIik7ImJvcmRlckNvbG9yImluIGF8fChhLmJvcmRlckNvbG9yPSJ2YXIoLS1jb2xhYi1ib3JkZXItY29sb3IpIik7YS5sb2NhdGlvbnx8KGEubG9jYXRpb249InRvcCIpO3ZhciBlPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiMiK2IpLGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zi5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYi1iYXIiKTt2YXIgaD1hLmxvY2F0aW9uO2YuY2xhc3NMaXN0LmFkZCgiZ29vZy10YWItYmFyLSIraCk7Zm9yKHZhciBrPVtdLHE9ZmEoYyksRz1xLm5leHQoKTshRy5kb25lO0c9cS5uZXh0KCkpe0c9Ry52YWx1ZTt2YXIgeD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKeC5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYiIpO3gudGV4dENvbnRlbnQ9RztmLmFwcGVuZENoaWxkKHgpO2sucHVzaCh4KX1oIT0iYm90dG9tIiYmZS5hcHBlbmRDaGlsZChmKTtxPW51bGw7aWYoaD09InRvcCJ8fGg9PSJib3R0b20iKXE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikscS5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYi1iYXItY2xlYXIiKTtoPT0idG9wIiYmcSYmZS5hcHBlbmRDaGlsZChxKTtHPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO0cuY2xhc3NMaXN0LmFkZCgiZ29vZy10YWItY29udGVudCIpO3ZhciBoYT1bXTtjPWZhKGMpO2Zvcih4PWMubmV4dCgpOyF4LmRvbmU7eD1jLm5leHQoKSl4PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHguaWQ9ZS5pZCsiX2NvbnRlbnRfIitoYS5sZW5ndGgseC5zdHlsZS5kaXNwbGF5PSJub25lIixHLmFwcGVuZENoaWxkKHgpLGhhLnB1c2goeCk7ZS5hcHBlbmRDaGlsZChHKTtoPT0iYm90dG9tIiYmKHEmJgplLmFwcGVuZENoaWxkKHEpLGUuYXBwZW5kQ2hpbGQoZikpO3ZhciBRPW5ldyBYKGgpO1NiKFEsZik7dmFyIFI9LTE7d2IoUSwic2VsZWN0IixmdW5jdGlvbihTKXtTPWsuaW5kZXhPZihTLnRhcmdldC5pKCkpO1MhPVImJihSPj0wJiZSPGhhLmxlbmd0aCYmKGhhW1JdLnN0eWxlLmRpc3BsYXk9Im5vbmUiLFI9LTEpLFM+PTAmJlM8aGEubGVuZ3RoJiYoUj1TLGhhW1JdLnN0eWxlLmRpc3BsYXk9ImlubGluZSIsd2luZG93LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCJyZXNpemUiKSksZ29vZ2xlLmNvbGFiLm91dHB1dC5yZXNpemVJZnJhbWVUb0NvbnRlbnQoKSksUS5KKEkoUSxSKSkpfSk7US5KKEkoUSxkKSk7d2luZG93W2JdPXtzZXRTZWxlY3RlZFRhYkluZGV4OmZ1bmN0aW9uKFMpe1EuSihJKFEsUykpfX07ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChqZChhKSl9LGxkPVsiY29sYWJfbGliIiwiY3JlYXRlVGFiQmFyIl0sWT1sOwpsZFswXWluIFl8fHR5cGVvZiBZLmV4ZWNTY3JpcHQ9PSJ1bmRlZmluZWQifHxZLmV4ZWNTY3JpcHQoInZhciAiK2xkWzBdKTtmb3IodmFyIFo7bGQubGVuZ3RoJiYoWj1sZC5zaGlmdCgpKTspbGQubGVuZ3RofHxrZD09PXZvaWQgMD9ZW1pdJiZZW1pdIT09T2JqZWN0LnByb3RvdHlwZVtaXT9ZPVlbWl06WT1ZW1pdPXt9OllbWl09a2Q7fSkuY2FsbCh0aGlzKTsKLy8gY2xhbmctZm9ybWF0IG9uCg==", + "ok": true, + "headers": [ + [ + "content-length", + "41785" + ], + [ + "content-type", + "application/javascript" + ] + ], + "status": 200, + "status_text": "" + } + }, + "base_uri": "https://localhost:8080/", + "height": 260 + }, + "outputId": "54ef790a-0ca7-4935-ee46-f0b428efe01a" + }, + "source": [ + "%%logica OutsideOfCalifornia\n", + "\n", + "Employee(name: \"Alice\", role: \"Product Manager\", office: \"SEA\");\n", + "Employee(name: \"Bob\", role: \"Engineer\", office: \"SEA\");\n", + "Employee(name: \"Caroline\", role: \"Engineer\", office: \"LAX\");\n", + "Employee(name: \"David\", role: \"Data Scientist\", office: \"LAX\");\n", + "Employee(name: \"Eve\", role: \"Data Scientist\", office: \"SEA\");\n", + "\n", + "InCalifornia(name:) :- Employee(name:, office:), office == \"LAX\";\n", + "\n", + "OutsideOfCalifornia(name:) :- Employee(name:), ~InCalifornia(name:);" + ], + "execution_count": 16, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"f3bd9758-d22c-11ef-a7c0-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id26\", \"tabNames\": [\"OutsideOfCalifornia\", \"(Log)\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_08c385ce2d" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"f3be180e-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id26\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_eeb0302f3f" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"f3bff2aa-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_c3d9415871" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"f3c06d02-d22c-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id26_content_1\");\n", + "//# sourceURL=js_abbc5dde17" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"f3c0d8a0-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"f3c06d02-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_15db0817b7" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"f3c14646-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id26\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_bea9ad720f" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"f3c645c4-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"f3bff2aa-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_8ca0780844" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"f3c8e978-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_872750d20a" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"f3c94fda-d22c-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id26_content_0\");\n", + "//# sourceURL=js_cfced75ef9" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"f3c9c05a-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"f3c94fda-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_278486e408" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"f3ca27de-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id26\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_b6ffdf7202" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"f3cc66d4-d22c-11ef-a7c0-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id27\", \"tabNames\": [\"SQL\", \"Result\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_0f7b923a4d" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"f3cca982-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id27\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_45e981e423" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"f3ce1b32-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_600c1a780c" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"f3ce75f0-d22c-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id27_content_0\");\n", + "//# sourceURL=js_73831c8194" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"f3cec30c-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"f3ce75f0-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_7a86c6f9fe" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"f3cf0cae-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id27\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_cced65519a" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The following query is stored at \u001b[1mOutsideOfCalifornia_sql\u001b[0m variable.\n", + "-- Initializing DuckDB environment.\n", + "create schema if not exists logica_home;\n", + "-- Empty record, has to have a field by DuckDB syntax.\n", + "drop type if exists logicarecord893574736 cascade; create type logicarecord893574736 as struct(nirvana numeric);\n", + "create sequence if not exists eternal_logical_sequence;\n", + "\n", + "\n", + "-- Logica type: logicarecord481217614\n", + "drop type if exists logicarecord481217614 cascade; create type logicarecord481217614 as struct(r logicarecord893574736);\n", + "\n", + "-- Logica type: logicarecord383307722\n", + "drop type if exists logicarecord383307722 cascade; create type logicarecord383307722 as struct(a timestamp);\n", + "WITH t_0_Employee AS (SELECT * FROM (\n", + " \n", + " SELECT\n", + " 'Alice' AS name,\n", + " 'Product Manager' AS role,\n", + " 'SEA' AS office\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " 'Bob' AS name,\n", + " 'Engineer' AS role,\n", + " 'SEA' AS office\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " 'Caroline' AS name,\n", + " 'Engineer' AS role,\n", + " 'LAX' AS office\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " 'David' AS name,\n", + " 'Data Scientist' AS role,\n", + " 'LAX' AS office\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " 'Eve' AS name,\n", + " 'Data Scientist' AS role,\n", + " 'SEA' AS office\n", + " \n", + ") AS UNUSED_TABLE_NAME )\n", + "SELECT\n", + " Employee.name AS name\n", + "FROM\n", + " t_0_Employee AS Employee\n", + "WHERE\n", + " ((SELECT\n", + " MIN((CASE WHEN x_4.unnested_pod = 0 THEN 1 ELSE NULL END)) AS logica_value\n", + " FROM\n", + " t_0_Employee AS t_1_Employee, (select unnest([0]::numeric[]) as unnested_pod) as x_4\n", + " WHERE\n", + " (t_1_Employee.office = 'LAX') AND\n", + " (Employee.name = t_1_Employee.name)) IS NULL);\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"f3d0920e-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"f3ce1b32-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_898457ca87" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"f3d35cf0-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_42108935e7" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"f3d3a142-d22c-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id27_content_1\");\n", + "//# sourceURL=js_5451c0e363" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"f3d3e242-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"f3d3a142-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_70fb960041" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"f3d42518-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id27\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_5781c067ee" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The following table is stored at \u001b[1mOutsideOfCalifornia\u001b[0m variable.\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
name
0Alice
1Bob
2Eve
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"f3d62b1a-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"f3d35cf0-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_9eb5d289ed" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"f3d83f54-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"f3c8e978-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_dc8fc34dcd" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"f3db66a2-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_54e60072bc" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"f3dbafea-d22c-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id26_content_1\");\n", + "//# sourceURL=js_fd1b67a689" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"f3dbf70c-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"f3dbafea-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_3f012827b4" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"f3dcc5b0-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id26\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_bd9e678a34" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "image/svg+xml": "\n\n\n\n\n\nConcertina\n\n\n\nOutsideOfCalifornia\n\nOutsideOfCalifornia\n\n\n\n", + "text/plain": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Running predicate: OutsideOfCalifornia (18 ms)\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"f3f5cace-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"f3db66a2-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_9d2e2732f9" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"f3f8196e-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_8b7feea464" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"f3f88228-d22c-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id26_content_0\");\n", + "//# sourceURL=js_3324c138cb" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"f3f91d46-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"f3f88228-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_40159d5a9f" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"f3f9c0e8-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id26\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_2e7403b68e" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"f3fc1302-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_380490adc3" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"f3fca36c-d22c-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id27_content_1\");\n", + "//# sourceURL=js_7879d65ade" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"f3fd7b48-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"f3fca36c-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_fdda4cbc48" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"f3fdcbd4-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id27\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_d6f7c13aad" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"f401e21e-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"f3fc1302-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_f026ea103b" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + " \n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"f403ba12-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"f3f8196e-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_a7121959a5" + ] + }, + "metadata": {} + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "8WxKw66keWqL" + }, + "source": [ + "### Aggregation\n", + "\n", + "To run an aggregation you use the keyword `distinct` in the head of the rule. An aggregated field uses\n", + "\n", + "```\n", + "? = \n", + "\n", + "```\n", + "syntax. Keywork `distinct` must be used to trigger aggregation (there is one exception though, see 'Functions' section).\n", + "\n", + "Here is an example of a simple aggregation counting employees per role." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "x0dixQKTo1t9", + "colab": { + "resources": { + "http://localhost:8080/nbextensions/google.colab/tabbar.css": { + "data": "Lmdvb2ctdGFie3Bvc2l0aW9uOnJlbGF0aXZlO3BhZGRpbmc6NHB4IDhweDtjb2xvcjojMDBjO3RleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7Y3Vyc29yOmRlZmF1bHR9Lmdvb2ctdGFiLWJhci10b3AgLmdvb2ctdGFie21hcmdpbjoxcHggNHB4IDAgMDtib3JkZXItYm90dG9tOjA7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLXRvcDphZnRlciwuZ29vZy10YWItYmFyLWJvdHRvbTphZnRlcntjb250ZW50OiIgIjtkaXNwbGF5OmJsb2NrO2hlaWdodDowO2NsZWFyOmJvdGg7dmlzaWJpbGl0eTpoaWRkZW59Lmdvb2ctdGFiLWJhci1ib3R0b20gLmdvb2ctdGFie21hcmdpbjowIDRweCAxcHggMDtib3JkZXItdG9wOjA7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLXN0YXJ0IC5nb29nLXRhYnttYXJnaW46MCAwIDRweCAxcHg7Ym9yZGVyLXJpZ2h0OjB9Lmdvb2ctdGFiLWJhci1lbmQgLmdvb2ctdGFie21hcmdpbjowIDFweCA0cHggMDtib3JkZXItbGVmdDowfS5nb29nLXRhYi1ob3ZlcntiYWNrZ3JvdW5kOiNlZWV9Lmdvb2ctdGFiLWRpc2FibGVke2NvbG9yOiM2NjZ9Lmdvb2ctdGFiLXNlbGVjdGVke2NvbG9yOiMwMDA7YmFja2dyb3VuZDojZmZmO3RleHQtZGVjb3JhdGlvbjpub25lO2ZvbnQtd2VpZ2h0OmJvbGQ7Ym9yZGVyOjFweCBzb2xpZCAjNmI5MGRhfS5nb29nLXRhYi1iYXItdG9we3BhZGRpbmctdG9wOjVweCFpbXBvcnRhbnQ7cGFkZGluZy1sZWZ0OjVweCFpbXBvcnRhbnQ7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgIzZiOTBkYSFpbXBvcnRhbnR9Lmdvb2ctdGFiLWJhci10b3AgLmdvb2ctdGFiLXNlbGVjdGVke3RvcDoxcHg7bWFyZ2luLXRvcDowO3BhZGRpbmctYm90dG9tOjVweH0uZ29vZy10YWItYmFyLWJvdHRvbSAuZ29vZy10YWItc2VsZWN0ZWR7dG9wOi0xcHg7bWFyZ2luLWJvdHRvbTowO3BhZGRpbmctdG9wOjVweH0uZ29vZy10YWItYmFyLXN0YXJ0IC5nb29nLXRhYi1zZWxlY3RlZHtsZWZ0OjFweDttYXJnaW4tbGVmdDowO3BhZGRpbmctcmlnaHQ6OXB4fS5nb29nLXRhYi1iYXItZW5kIC5nb29nLXRhYi1zZWxlY3RlZHtsZWZ0Oi0xcHg7bWFyZ2luLXJpZ2h0OjA7cGFkZGluZy1sZWZ0OjlweH0uZ29vZy10YWItYmFye21hcmdpbjowO2JvcmRlcjowO3BhZGRpbmc6MDtsaXN0LXN0eWxlOm5vbmU7Y3Vyc29yOmRlZmF1bHQ7b3V0bGluZTpub25lO2JhY2tncm91bmQ6I2ViZWZmOX0uZ29vZy10YWItYmFyLWNsZWFye2NsZWFyOmJvdGg7aGVpZ2h0OjA7b3ZlcmZsb3c6aGlkZGVufS5nb29nLXRhYi1iYXItc3RhcnR7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLWVuZHtmbG9hdDpyaWdodH0qIGh0bWwgLmdvb2ctdGFiLWJhci1zdGFydHttYXJnaW4tcmlnaHQ6LTNweH0qIGh0bWwgLmdvb2ctdGFiLWJhci1lbmR7bWFyZ2luLWxlZnQ6LTNweH1zZW50aW5lbHt9", + "ok": true, + "headers": [ + [ + "content-length", + "1404" + ], + [ + "content-type", + "text/css" + ] + ], + "status": 200, + "status_text": "" + }, + "http://localhost:8080/nbextensions/google.colab/tabbar_main.min.js": { + "data": "Ly8gY2xhbmctZm9ybWF0IG9mZgooZnVuY3Rpb24oKXt2YXIgZyxhYT1mdW5jdGlvbihhKXt2YXIgYj0wO3JldHVybiBmdW5jdGlvbigpe3JldHVybiBiPGEubGVuZ3RoP3tkb25lOiExLHZhbHVlOmFbYisrXX06e2RvbmU6ITB9fX0sYmE9dHlwZW9mIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzPT0iZnVuY3Rpb24iP09iamVjdC5kZWZpbmVQcm9wZXJ0eTpmdW5jdGlvbihhLGIsYyl7aWYoYT09QXJyYXkucHJvdG90eXBlfHxhPT1PYmplY3QucHJvdG90eXBlKXJldHVybiBhO2FbYl09Yy52YWx1ZTtyZXR1cm4gYX0sY2E9ZnVuY3Rpb24oYSl7YT1bIm9iamVjdCI9PXR5cGVvZiBnbG9iYWxUaGlzJiZnbG9iYWxUaGlzLGEsIm9iamVjdCI9PXR5cGVvZiB3aW5kb3cmJndpbmRvdywib2JqZWN0Ij09dHlwZW9mIHNlbGYmJnNlbGYsIm9iamVjdCI9PXR5cGVvZiBnbG9iYWwmJmdsb2JhbF07Zm9yKHZhciBiPTA7YjxhLmxlbmd0aDsrK2Ipe3ZhciBjPWFbYl07aWYoYyYmYy5NYXRoPT1NYXRoKXJldHVybiBjfXRocm93IEVycm9yKCJDYW5ub3QgZmluZCBnbG9iYWwgb2JqZWN0Iik7Cn0sZGE9Y2EodGhpcyksZWE9ZnVuY3Rpb24oYSxiKXtpZihiKWE6e3ZhciBjPWRhO2E9YS5zcGxpdCgiLiIpO2Zvcih2YXIgZD0wO2Q8YS5sZW5ndGgtMTtkKyspe3ZhciBlPWFbZF07aWYoIShlIGluIGMpKWJyZWFrIGE7Yz1jW2VdfWE9YVthLmxlbmd0aC0xXTtkPWNbYV07Yj1iKGQpO2IhPWQmJmIhPW51bGwmJmJhKGMsYSx7Y29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOmJ9KX19OwplYSgiU3ltYm9sIixmdW5jdGlvbihhKXtpZihhKXJldHVybiBhO3ZhciBiPWZ1bmN0aW9uKGYsaCl7dGhpcy5nPWY7YmEodGhpcywiZGVzY3JpcHRpb24iLHtjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6aH0pfTtiLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmd9O3ZhciBjPSJqc2NvbXBfc3ltYm9sXyIrKE1hdGgucmFuZG9tKCkqMUU5Pj4+MCkrIl8iLGQ9MCxlPWZ1bmN0aW9uKGYpe2lmKHRoaXMgaW5zdGFuY2VvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoIlN5bWJvbCBpcyBub3QgYSBjb25zdHJ1Y3RvciIpO3JldHVybiBuZXcgYihjKyhmfHwiIikrIl8iK2QrKyxmKX07cmV0dXJuIGV9KTsKdmFyIGZhPWZ1bmN0aW9uKGEpe3ZhciBiPXR5cGVvZiBTeW1ib2whPSJ1bmRlZmluZWQiJiZTeW1ib2wuaXRlcmF0b3ImJmFbU3ltYm9sLml0ZXJhdG9yXTtpZihiKXJldHVybiBiLmNhbGwoYSk7aWYodHlwZW9mIGEubGVuZ3RoPT0ibnVtYmVyIilyZXR1cm57bmV4dDphYShhKX07dGhyb3cgRXJyb3IoU3RyaW5nKGEpKyIgaXMgbm90IGFuIGl0ZXJhYmxlIG9yIEFycmF5TGlrZSIpO307ZWEoIlN5bWJvbC5kaXNwb3NlIixmdW5jdGlvbihhKXtyZXR1cm4gYT9hOlN5bWJvbCgiU3ltYm9sLmRpc3Bvc2UiKX0pOy8qCgogQ29weXJpZ2h0IFRoZSBDbG9zdXJlIExpYnJhcnkgQXV0aG9ycy4KIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wCiovCnZhciBsPXRoaXN8fHNlbGYsaWE9ZnVuY3Rpb24oYSl7YS5JYT12b2lkIDA7YS5WPWZ1bmN0aW9uKCl7cmV0dXJuIGEuSWE/YS5JYTphLklhPW5ldyBhfX0samE9ZnVuY3Rpb24oYSl7dmFyIGI9dHlwZW9mIGE7cmV0dXJuIGIhPSJvYmplY3QiP2I6YT9BcnJheS5pc0FycmF5KGEpPyJhcnJheSI6YjoibnVsbCJ9LGthPWZ1bmN0aW9uKGEpe3ZhciBiPWphKGEpO3JldHVybiBiPT0iYXJyYXkifHxiPT0ib2JqZWN0IiYmdHlwZW9mIGEubGVuZ3RoPT0ibnVtYmVyIn0sbT1mdW5jdGlvbihhKXt2YXIgYj10eXBlb2YgYTtyZXR1cm4gYj09Im9iamVjdCImJmEhPW51bGx8fGI9PSJmdW5jdGlvbiJ9LG5hPWZ1bmN0aW9uKGEpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYSxsYSkmJmFbbGFdfHwoYVtsYV09KyttYSl9LGxhPSJjbG9zdXJlX3VpZF8iKyhNYXRoLnJhbmRvbSgpKjFFOT4+PjApLG1hPTAsbj1mdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoKXt9Yy5wcm90b3R5cGU9CmIucHJvdG90eXBlO2EubD1iLnByb3RvdHlwZTthLnByb3RvdHlwZT1uZXcgYzthLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1hO2EucWQ9ZnVuY3Rpb24oZCxlLGYpe2Zvcih2YXIgaD1BcnJheShhcmd1bWVudHMubGVuZ3RoLTIpLGs9MjtrPGFyZ3VtZW50cy5sZW5ndGg7aysrKWhbay0yXT1hcmd1bWVudHNba107cmV0dXJuIGIucHJvdG90eXBlW2VdLmFwcGx5KGQsaCl9fTtmdW5jdGlvbiBvYShhLGIpe2lmKEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKUVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsb2EpO2Vsc2V7dmFyIGM9RXJyb3IoKS5zdGFjaztjJiYodGhpcy5zdGFjaz1jKX1hJiYodGhpcy5tZXNzYWdlPVN0cmluZyhhKSk7YiE9PXZvaWQgMCYmKHRoaXMuY2F1c2U9Yil9bihvYSxFcnJvcik7b2EucHJvdG90eXBlLm5hbWU9IkN1c3RvbUVycm9yIjt2YXIgcGE7ZnVuY3Rpb24gcWEoYSxiKXthPWEuc3BsaXQoIiVzIik7Zm9yKHZhciBjPSIiLGQ9YS5sZW5ndGgtMSxlPTA7ZTxkO2UrKyljKz1hW2VdKyhlPGIubGVuZ3RoP2JbZV06IiVzIik7b2EuY2FsbCh0aGlzLGMrYVtkXSl9bihxYSxvYSk7cWEucHJvdG90eXBlLm5hbWU9IkFzc2VydGlvbkVycm9yIjtmdW5jdGlvbiByYShhLGIsYyxkKXt2YXIgZT0iQXNzZXJ0aW9uIGZhaWxlZCI7aWYoYyl7ZSs9IjogIitjO3ZhciBmPWR9ZWxzZSBhJiYoZSs9IjogIithLGY9Yik7dGhyb3cgbmV3IHFhKCIiK2UsZnx8W10pO30KdmFyIHA9ZnVuY3Rpb24oYSxiLGMpe2F8fHJhKCIiLG51bGwsYixBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMikpO3JldHVybiBhfSxzYT1mdW5jdGlvbihhLGIsYyl7bShhKSYmYS5ub2RlVHlwZT09MXx8cmEoIkV4cGVjdGVkIEVsZW1lbnQgYnV0IGdvdCAlczogJXMuIixbamEoYSksYV0sYixBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMikpfSx1YT1mdW5jdGlvbihhLGIsYyxkKXthIGluc3RhbmNlb2YgYnx8cmEoIkV4cGVjdGVkIGluc3RhbmNlb2YgJXMgYnV0IGdvdCAlcy4iLFt0YShiKSx0YShhKV0sYyxBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMykpfTsKZnVuY3Rpb24gdGEoYSl7cmV0dXJuIGEgaW5zdGFuY2VvZiBGdW5jdGlvbj9hLmRpc3BsYXlOYW1lfHxhLm5hbWV8fCJ1bmtub3duIHR5cGUgbmFtZSI6YSBpbnN0YW5jZW9mIE9iamVjdD9hLmNvbnN0cnVjdG9yLmRpc3BsYXlOYW1lfHxhLmNvbnN0cnVjdG9yLm5hbWV8fE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhKTphPT09bnVsbD8ibnVsbCI6dHlwZW9mIGF9O3ZhciB2YT1BcnJheS5wcm90b3R5cGUuaW5kZXhPZj9mdW5jdGlvbihhLGIpe3AoYS5sZW5ndGghPW51bGwpO3JldHVybiBBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKGEsYix2b2lkIDApfTpmdW5jdGlvbihhLGIpe2lmKHR5cGVvZiBhPT09InN0cmluZyIpcmV0dXJuIHR5cGVvZiBiIT09InN0cmluZyJ8fGIubGVuZ3RoIT0xPy0xOmEuaW5kZXhPZihiLDApO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWlmKGMgaW4gYSYmYVtjXT09PWIpcmV0dXJuIGM7cmV0dXJuLTF9LHdhPUFycmF5LnByb3RvdHlwZS5mb3JFYWNoP2Z1bmN0aW9uKGEsYil7cChhLmxlbmd0aCE9bnVsbCk7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChhLGIsdm9pZCAwKX06ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9YS5sZW5ndGgsZD10eXBlb2YgYT09PSJzdHJpbmciP2Euc3BsaXQoIiIpOmEsZT0wO2U8YztlKyspZSBpbiBkJiZiLmNhbGwodm9pZCAwLGRbZV0sZSxhKX07CmZ1bmN0aW9uIHhhKGEsYil7Yj12YShhLGIpO3ZhciBjO2lmKGM9Yj49MClwKGEubGVuZ3RoIT1udWxsKSxBcnJheS5wcm90b3R5cGUuc3BsaWNlLmNhbGwoYSxiLDEpO3JldHVybiBjfWZ1bmN0aW9uIHlhKGEpe3ZhciBiPWEubGVuZ3RoO2lmKGI+MCl7Zm9yKHZhciBjPUFycmF5KGIpLGQ9MDtkPGI7ZCsrKWNbZF09YVtkXTtyZXR1cm4gY31yZXR1cm5bXX1mdW5jdGlvbiB6YShhLGIsYyxkKXtwKGEubGVuZ3RoIT1udWxsKTtBcnJheS5wcm90b3R5cGUuc3BsaWNlLmFwcGx5KGEsQWEoYXJndW1lbnRzLDEpKX1mdW5jdGlvbiBBYShhLGIsYyl7cChhLmxlbmd0aCE9bnVsbCk7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg8PTI/QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYSxiKTpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhLGIsYyl9O2Z1bmN0aW9uIEJhKGEsYixjKXtmb3IodmFyIGQgaW4gYSliLmNhbGwoYyxhW2RdLGQsYSl9ZnVuY3Rpb24gQ2EoYSxiKXtmb3IodmFyIGMgaW4gYSlpZihhW2NdPT1iKXJldHVybiEwO3JldHVybiExfWZ1bmN0aW9uIERhKGEsYixjKXtpZihhIT09bnVsbCYmYiBpbiBhKXRocm93IEVycm9yKCdUaGUgb2JqZWN0IGFscmVhZHkgY29udGFpbnMgdGhlIGtleSAiJytiKyciJyk7YVtiXT1jfWZ1bmN0aW9uIEVhKGEpe3ZhciBiPXt9LGM7Zm9yKGMgaW4gYSliW2FbY11dPWM7cmV0dXJuIGJ9dmFyIEZhPSJjb25zdHJ1Y3RvciBoYXNPd25Qcm9wZXJ0eSBpc1Byb3RvdHlwZU9mIHByb3BlcnR5SXNFbnVtZXJhYmxlIHRvTG9jYWxlU3RyaW5nIHRvU3RyaW5nIHZhbHVlT2YiLnNwbGl0KCIgIik7CmZ1bmN0aW9uIEdhKGEsYil7Zm9yKHZhciBjLGQsZT0xO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspe2Q9YXJndW1lbnRzW2VdO2ZvcihjIGluIGQpYVtjXT1kW2NdO2Zvcih2YXIgZj0wO2Y8RmEubGVuZ3RoO2YrKyljPUZhW2ZdLE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChkLGMpJiYoYVtjXT1kW2NdKX19O3ZhciBIYT1TdHJpbmcucHJvdG90eXBlLnRyaW0/ZnVuY3Rpb24oYSl7cmV0dXJuIGEudHJpbSgpfTpmdW5jdGlvbihhKXtyZXR1cm4vXltcc1x4YTBdKihbXHNcU10qPylbXHNceGEwXSokLy5leGVjKGEpWzFdfTsvKgoKIENvcHlyaWdodCBHb29nbGUgTExDCiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMAoqLwp2YXIgSWE9e307dmFyIEphPWZ1bmN0aW9uKGEpe2lmKElhIT09SWEpdGhyb3cgRXJyb3IoIkJhZCBzZWNyZXQiKTt0aGlzLmc9YX07SmEucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ307bmV3IEphKCJhYm91dDpibGFuayIpO25ldyBKYSgiYWJvdXQ6aW52YWxpZCN6Q2xvc3VyZXoiKTt2YXIgS2E9W10sTGE9ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJBIFVSTCB3aXRoIGNvbnRlbnQgJyIrYSsiJyB3YXMgc2FuaXRpemVkIGF3YXkuIil9O0thLmluZGV4T2YoTGEpPT09LTEmJkthLnB1c2goTGEpO3ZhciBNYSxOYTthOntmb3IodmFyIE9hPVsiQ0xPU1VSRV9GTEFHUyJdLFBhPWwsUWE9MDtRYTxPYS5sZW5ndGg7UWErKylpZihQYT1QYVtPYVtRYV1dLFBhPT1udWxsKXtOYT1udWxsO2JyZWFrIGF9TmE9UGF9dmFyIFJhPU5hJiZOYVs2MTA0MDEzMDFdO01hPVJhIT1udWxsP1JhOiExO2Z1bmN0aW9uIFNhKCl7dmFyIGE9bC5uYXZpZ2F0b3I7cmV0dXJuIGEmJihhPWEudXNlckFnZW50KT9hOiIifXZhciBUYSxVYT1sLm5hdmlnYXRvcjtUYT1VYT9VYS51c2VyQWdlbnREYXRhfHxudWxsOm51bGw7ZnVuY3Rpb24gcihhKXtyZXR1cm4gU2EoKS5pbmRleE9mKGEpIT0tMX07dmFyIFZhPXIoIkVkZ2UiKSx0PXIoIkdlY2tvIikmJiEoU2EoKS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoIndlYmtpdCIpIT0tMSYmIXIoIkVkZ2UiKSkmJiEocigiVHJpZGVudCIpfHxyKCJNU0lFIikpJiYhcigiRWRnZSIpLHU9U2EoKS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoIndlYmtpdCIpIT0tMSYmIXIoIkVkZ2UiKSx2PU1hJiZUYSYmVGEucGxhdGZvcm0/VGEucGxhdGZvcm09PT0ibWFjT1MiOnIoIk1hY2ludG9zaCIpO3ZhciBYYT1mdW5jdGlvbihhLGIpe0JhKGIsZnVuY3Rpb24oYyxkKXtkPT0ic3R5bGUiP2Euc3R5bGUuY3NzVGV4dD1jOmQ9PSJjbGFzcyI/YS5jbGFzc05hbWU9YzpkPT0iZm9yIj9hLmh0bWxGb3I9YzpXYS5oYXNPd25Qcm9wZXJ0eShkKT9hLnNldEF0dHJpYnV0ZShXYVtkXSxjKTpkLmxhc3RJbmRleE9mKCJhcmlhLSIsMCk9PTB8fGQubGFzdEluZGV4T2YoImRhdGEtIiwwKT09MD9hLnNldEF0dHJpYnV0ZShkLGMpOmFbZF09Y30pfSxXYT17Y2VsbHBhZGRpbmc6ImNlbGxQYWRkaW5nIixjZWxsc3BhY2luZzoiY2VsbFNwYWNpbmciLGNvbHNwYW46ImNvbFNwYW4iLGZyYW1lYm9yZGVyOiJmcmFtZUJvcmRlciIsaGVpZ2h0OiJoZWlnaHQiLG1heGxlbmd0aDoibWF4TGVuZ3RoIixub25jZToibm9uY2UiLHJvbGU6InJvbGUiLHJvd3NwYW46InJvd1NwYW4iLHR5cGU6InR5cGUiLHVzZW1hcDoidXNlTWFwIix2YWxpZ246InZBbGlnbiIsd2lkdGg6IndpZHRoIn0sWWE9ZnVuY3Rpb24oYSwKYixjKXtmdW5jdGlvbiBkKGspe2smJmIuYXBwZW5kQ2hpbGQodHlwZW9mIGs9PT0ic3RyaW5nIj9hLmNyZWF0ZVRleHROb2RlKGspOmspfWZvcih2YXIgZT0yO2U8Yy5sZW5ndGg7ZSsrKXt2YXIgZj1jW2VdO2lmKCFrYShmKXx8bShmKSYmZi5ub2RlVHlwZT4wKWQoZik7ZWxzZXthOntpZihmJiZ0eXBlb2YgZi5sZW5ndGg9PSJudW1iZXIiKXtpZihtKGYpKXt2YXIgaD10eXBlb2YgZi5pdGVtPT0iZnVuY3Rpb24ifHx0eXBlb2YgZi5pdGVtPT0ic3RyaW5nIjticmVhayBhfWlmKHR5cGVvZiBmPT09ImZ1bmN0aW9uIil7aD10eXBlb2YgZi5pdGVtPT0iZnVuY3Rpb24iO2JyZWFrIGF9fWg9ITF9d2EoaD95YShmKTpmLGQpfX19LFphPWZ1bmN0aW9uKGEsYil7Yj1TdHJpbmcoYik7YS5jb250ZW50VHlwZT09PSJhcHBsaWNhdGlvbi94aHRtbCt4bWwiJiYoYj1iLnRvTG93ZXJDYXNlKCkpO3JldHVybiBhLmNyZWF0ZUVsZW1lbnQoYil9LCRhPWZ1bmN0aW9uKGEpe2EmJmEucGFyZW50Tm9kZSYmCmEucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhKX0sYWI9ZnVuY3Rpb24oYSxiKXtpZighYXx8IWIpcmV0dXJuITE7aWYoYS5jb250YWlucyYmYi5ub2RlVHlwZT09MSlyZXR1cm4gYT09Ynx8YS5jb250YWlucyhiKTtpZih0eXBlb2YgYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiE9InVuZGVmaW5lZCIpcmV0dXJuIGE9PWJ8fCEhKGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24oYikmMTYpO2Zvcig7YiYmYSE9YjspYj1iLnBhcmVudE5vZGU7cmV0dXJuIGI9PWF9LGJiPWZ1bmN0aW9uKGEpe3AoYSwiTm9kZSBjYW5ub3QgYmUgbnVsbCBvciB1bmRlZmluZWQuIik7cmV0dXJuIGEubm9kZVR5cGU9PTk/YTphLm93bmVyRG9jdW1lbnR8fGEuZG9jdW1lbnR9LGNiPWZ1bmN0aW9uKGEsYil7Yj9hLnRhYkluZGV4PTA6KGEudGFiSW5kZXg9LTEsYS5yZW1vdmVBdHRyaWJ1dGUoInRhYkluZGV4IikpfSxkYj1mdW5jdGlvbihhKXtyZXR1cm4gYS5oYXNBdHRyaWJ1dGUoInRhYmluZGV4Iil9LGViPQpmdW5jdGlvbihhKXthPWEudGFiSW5kZXg7cmV0dXJuIHR5cGVvZiBhPT09Im51bWJlciImJmE+PTAmJmE8MzI3Njh9LGZiPWZ1bmN0aW9uKGEpe3RoaXMuZz1hfHxsLmRvY3VtZW50fHxkb2N1bWVudH07ZmIucHJvdG90eXBlLmk9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nO3JldHVybiB0eXBlb2YgYT09PSJzdHJpbmciP2IuZ2V0RWxlbWVudEJ5SWQoYSk6YX07ZmIucHJvdG90eXBlLmg9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXMuZyxlPWFyZ3VtZW50cyxmPWVbMV0saD1aYShkLFN0cmluZyhlWzBdKSk7ZiYmKHR5cGVvZiBmPT09InN0cmluZyI/aC5jbGFzc05hbWU9ZjpBcnJheS5pc0FycmF5KGYpP2guY2xhc3NOYW1lPWYuam9pbigiICIpOlhhKGgsZikpO2UubGVuZ3RoPjImJllhKGQsaCxlKTtyZXR1cm4gaH07dmFyIHc9ZnVuY3Rpb24oKXt0aGlzLmJhPXRoaXMuYmE7dGhpcy5rYT10aGlzLmthfTt3LnByb3RvdHlwZS5iYT0hMTt3LnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7dGhpcy5iYXx8KHRoaXMuYmE9ITAsdGhpcy5DKCkpfTt3LnByb3RvdHlwZVtTeW1ib2wuZGlzcG9zZV09ZnVuY3Rpb24oKXt0aGlzLmRpc3Bvc2UoKX07dy5wcm90b3R5cGUuQz1mdW5jdGlvbigpe2lmKHRoaXMua2EpZm9yKDt0aGlzLmthLmxlbmd0aDspdGhpcy5rYS5zaGlmdCgpKCl9O3ZhciB5PWZ1bmN0aW9uKGEsYil7dGhpcy50eXBlPWE7dGhpcy51PXRoaXMudGFyZ2V0PWI7dGhpcy5kZWZhdWx0UHJldmVudGVkPXRoaXMuQT0hMX07eS5wcm90b3R5cGUudj1mdW5jdGlvbigpe3RoaXMuQT0hMH07eS5wcm90b3R5cGUuaj1mdW5jdGlvbigpe3RoaXMuZGVmYXVsdFByZXZlbnRlZD0hMH07dmFyIGdiPWZ1bmN0aW9uKCl7aWYoIWwuYWRkRXZlbnRMaXN0ZW5lcnx8IU9iamVjdC5kZWZpbmVQcm9wZXJ0eSlyZXR1cm4hMTt2YXIgYT0hMSxiPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwicGFzc2l2ZSIse2dldDpmdW5jdGlvbigpe2E9ITB9fSk7dHJ5e3ZhciBjPWZ1bmN0aW9uKCl7fTtsLmFkZEV2ZW50TGlzdGVuZXIoInRlc3QiLGMsYik7bC5yZW1vdmVFdmVudExpc3RlbmVyKCJ0ZXN0IixjLGIpfWNhdGNoKGQpe31yZXR1cm4gYX0oKTt2YXIgej1mdW5jdGlvbihhLGIpe3kuY2FsbCh0aGlzLGE/YS50eXBlOiIiKTt0aGlzLnJlbGF0ZWRUYXJnZXQ9dGhpcy51PXRoaXMudGFyZ2V0PW51bGw7dGhpcy5idXR0b249dGhpcy5zY3JlZW5ZPXRoaXMuc2NyZWVuWD10aGlzLmNsaWVudFk9dGhpcy5jbGllbnRYPTA7dGhpcy5rZXk9IiI7dGhpcy5nPTA7dGhpcy5tZXRhS2V5PXRoaXMuc2hpZnRLZXk9dGhpcy5hbHRLZXk9dGhpcy5jdHJsS2V5PSExO3RoaXMuc3RhdGU9bnVsbDt0aGlzLkc9ITE7dGhpcy5wb2ludGVySWQ9MDt0aGlzLnBvaW50ZXJUeXBlPSIiO3RoaXMudGltZVN0YW1wPTA7dGhpcy5oPW51bGw7aWYoYSl7dmFyIGM9dGhpcy50eXBlPWEudHlwZSxkPWEuY2hhbmdlZFRvdWNoZXMmJmEuY2hhbmdlZFRvdWNoZXMubGVuZ3RoP2EuY2hhbmdlZFRvdWNoZXNbMF06bnVsbDt0aGlzLnRhcmdldD1hLnRhcmdldHx8YS5zcmNFbGVtZW50O3RoaXMudT1iO2I9YS5yZWxhdGVkVGFyZ2V0O2J8fChjPT0ibW91c2VvdmVyIj8KYj1hLmZyb21FbGVtZW50OmM9PSJtb3VzZW91dCImJihiPWEudG9FbGVtZW50KSk7dGhpcy5yZWxhdGVkVGFyZ2V0PWI7ZD8odGhpcy5jbGllbnRYPWQuY2xpZW50WCE9PXZvaWQgMD9kLmNsaWVudFg6ZC5wYWdlWCx0aGlzLmNsaWVudFk9ZC5jbGllbnRZIT09dm9pZCAwP2QuY2xpZW50WTpkLnBhZ2VZLHRoaXMuc2NyZWVuWD1kLnNjcmVlblh8fDAsdGhpcy5zY3JlZW5ZPWQuc2NyZWVuWXx8MCk6KHRoaXMuY2xpZW50WD1hLmNsaWVudFghPT12b2lkIDA/YS5jbGllbnRYOmEucGFnZVgsdGhpcy5jbGllbnRZPWEuY2xpZW50WSE9PXZvaWQgMD9hLmNsaWVudFk6YS5wYWdlWSx0aGlzLnNjcmVlblg9YS5zY3JlZW5YfHwwLHRoaXMuc2NyZWVuWT1hLnNjcmVlbll8fDApO3RoaXMuYnV0dG9uPWEuYnV0dG9uO3RoaXMuZz1hLmtleUNvZGV8fDA7dGhpcy5rZXk9YS5rZXl8fCIiO3RoaXMuY3RybEtleT1hLmN0cmxLZXk7dGhpcy5hbHRLZXk9YS5hbHRLZXk7dGhpcy5zaGlmdEtleT1hLnNoaWZ0S2V5Owp0aGlzLm1ldGFLZXk9YS5tZXRhS2V5O3RoaXMuRz12P2EubWV0YUtleTphLmN0cmxLZXk7dGhpcy5wb2ludGVySWQ9YS5wb2ludGVySWR8fDA7dGhpcy5wb2ludGVyVHlwZT1hLnBvaW50ZXJUeXBlO3RoaXMuc3RhdGU9YS5zdGF0ZTt0aGlzLnRpbWVTdGFtcD1hLnRpbWVTdGFtcDt0aGlzLmg9YTthLmRlZmF1bHRQcmV2ZW50ZWQmJnoubC5qLmNhbGwodGhpcyl9fTtuKHoseSk7ei5wcm90b3R5cGUudj1mdW5jdGlvbigpe3oubC52LmNhbGwodGhpcyk7dGhpcy5oLnN0b3BQcm9wYWdhdGlvbj90aGlzLmguc3RvcFByb3BhZ2F0aW9uKCk6dGhpcy5oLmNhbmNlbEJ1YmJsZT0hMH07ei5wcm90b3R5cGUuaj1mdW5jdGlvbigpe3oubC5qLmNhbGwodGhpcyk7dmFyIGE9dGhpcy5oO2EucHJldmVudERlZmF1bHQ/YS5wcmV2ZW50RGVmYXVsdCgpOmEucmV0dXJuVmFsdWU9ITF9O3ZhciBoYj0iY2xvc3VyZV9saXN0ZW5hYmxlXyIrKE1hdGgucmFuZG9tKCkqMUU2fDApLGliPWZ1bmN0aW9uKGEpe3JldHVybiEoIWF8fCFhW2hiXSl9O3ZhciBqYj0wO3ZhciBrYj1mdW5jdGlvbihhLGIsYyxkLGUpe3RoaXMubGlzdGVuZXI9YTt0aGlzLnByb3h5PW51bGw7dGhpcy5zcmM9Yjt0aGlzLnR5cGU9Yzt0aGlzLmNhcHR1cmU9ISFkO3RoaXMucGE9ZTt0aGlzLmtleT0rK2piO3RoaXMuamE9dGhpcy5vYT0hMX0sbGI9ZnVuY3Rpb24oYSl7YS5qYT0hMDthLmxpc3RlbmVyPW51bGw7YS5wcm94eT1udWxsO2Euc3JjPW51bGw7YS5wYT1udWxsfTt2YXIgbWI9ZnVuY3Rpb24oYSl7dGhpcy5zcmM9YTt0aGlzLmc9e307dGhpcy5oPTB9O21iLnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZj1hLnRvU3RyaW5nKCk7YT10aGlzLmdbZl07YXx8KGE9dGhpcy5nW2ZdPVtdLHRoaXMuaCsrKTt2YXIgaD1uYihhLGIsZCxlKTtoPi0xPyhiPWFbaF0sY3x8KGIub2E9ITEpKTooYj1uZXcga2IoYix0aGlzLnNyYyxmLCEhZCxlKSxiLm9hPWMsYS5wdXNoKGIpKTtyZXR1cm4gYn07CnZhciBvYj1mdW5jdGlvbihhLGIpe3ZhciBjPWIudHlwZTtjIGluIGEuZyYmeGEoYS5nW2NdLGIpJiYobGIoYiksYS5nW2NdLmxlbmd0aD09MCYmKGRlbGV0ZSBhLmdbY10sYS5oLS0pKX0scGI9ZnVuY3Rpb24oYSxiLGMsZCxlKXthPWEuZ1tiLnRvU3RyaW5nKCldO2I9LTE7YSYmKGI9bmIoYSxjLGQsZSkpO3JldHVybiBiPi0xP2FbYl06bnVsbH0sbmI9ZnVuY3Rpb24oYSxiLGMsZCl7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDsrK2Upe3ZhciBmPWFbZV07aWYoIWYuamEmJmYubGlzdGVuZXI9PWImJmYuY2FwdHVyZT09ISFjJiZmLnBhPT1kKXJldHVybiBlfXJldHVybi0xfTt2YXIgcWI9ImNsb3N1cmVfbG1fIisoTWF0aC5yYW5kb20oKSoxRTZ8MCkscmI9e30sc2I9MCx1Yj1mdW5jdGlvbihhLGIsYyxkLGUpe2lmKGQmJmQub25jZSlyZXR1cm4gdGIoYSxiLGMsZCxlKTtpZihBcnJheS5pc0FycmF5KGIpKXtmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKyl1YihhLGJbZl0sYyxkLGUpO3JldHVybiBudWxsfWM9dmIoYyk7cmV0dXJuIGliKGEpP3diKGEsYixjLG0oZCk/ISFkLmNhcHR1cmU6ISFkLGUpOnhiKGEsYixjLCExLGQsZSl9LHhiPWZ1bmN0aW9uKGEsYixjLGQsZSxmKXtpZighYil0aHJvdyBFcnJvcigiSW52YWxpZCBldmVudCB0eXBlIik7dmFyIGg9bShlKT8hIWUuY2FwdHVyZTohIWUsaz15YihhKTtrfHwoYVtxYl09az1uZXcgbWIoYSkpO2M9ay5hZGQoYixjLGQsaCxmKTtpZihjLnByb3h5KXJldHVybiBjO2Q9emIoKTtjLnByb3h5PWQ7ZC5zcmM9YTtkLmxpc3RlbmVyPWM7aWYoYS5hZGRFdmVudExpc3RlbmVyKWdifHwoZT1oKSxlPT09dm9pZCAwJiYKKGU9ITEpLGEuYWRkRXZlbnRMaXN0ZW5lcihiLnRvU3RyaW5nKCksZCxlKTtlbHNlIGlmKGEuYXR0YWNoRXZlbnQpYS5hdHRhY2hFdmVudChBYihiLnRvU3RyaW5nKCkpLGQpO2Vsc2UgaWYoYS5hZGRMaXN0ZW5lciYmYS5yZW1vdmVMaXN0ZW5lcilwKGI9PT0iY2hhbmdlIiwiTWVkaWFRdWVyeUxpc3Qgb25seSBoYXMgYSBjaGFuZ2UgZXZlbnQiKSxhLmFkZExpc3RlbmVyKGQpO2Vsc2UgdGhyb3cgRXJyb3IoImFkZEV2ZW50TGlzdGVuZXIgYW5kIGF0dGFjaEV2ZW50IGFyZSB1bmF2YWlsYWJsZS4iKTtzYisrO3JldHVybiBjfSx6Yj1mdW5jdGlvbigpe3ZhciBhPUJiLGI9ZnVuY3Rpb24oYyl7cmV0dXJuIGEuY2FsbChiLnNyYyxiLmxpc3RlbmVyLGMpfTtyZXR1cm4gYn0sdGI9ZnVuY3Rpb24oYSxiLGMsZCxlKXtpZihBcnJheS5pc0FycmF5KGIpKXtmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKyl0YihhLGJbZl0sYyxkLGUpO3JldHVybiBudWxsfWM9dmIoYyk7cmV0dXJuIGliKGEpPwphLkEuYWRkKFN0cmluZyhiKSxjLCEwLG0oZCk/ISFkLmNhcHR1cmU6ISFkLGUpOnhiKGEsYixjLCEwLGQsZSl9LENiPWZ1bmN0aW9uKGEsYixjLGQsZSl7aWYoQXJyYXkuaXNBcnJheShiKSlmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKylDYihhLGJbZl0sYyxkLGUpO2Vsc2UgZD1tKGQpPyEhZC5jYXB0dXJlOiEhZCxjPXZiKGMpLGliKGEpPyhhPWEuQSxiPVN0cmluZyhiKS50b1N0cmluZygpLGIgaW4gYS5nJiYoZj1hLmdbYl0sYz1uYihmLGMsZCxlKSxjPi0xJiYobGIoZltjXSkscChmLmxlbmd0aCE9bnVsbCksQXJyYXkucHJvdG90eXBlLnNwbGljZS5jYWxsKGYsYywxKSxmLmxlbmd0aD09MCYmKGRlbGV0ZSBhLmdbYl0sYS5oLS0pKSkpOmEmJihhPXliKGEpKSYmKGM9cGIoYSxiLGMsZCxlKSkmJkEoYyl9LEE9ZnVuY3Rpb24oYSl7aWYodHlwZW9mIGEhPT0ibnVtYmVyIiYmYSYmIWEuamEpe3ZhciBiPWEuc3JjO2lmKGliKGIpKW9iKGIuQSxhKTtlbHNle3ZhciBjPWEudHlwZSwKZD1hLnByb3h5O2IucmVtb3ZlRXZlbnRMaXN0ZW5lcj9iLnJlbW92ZUV2ZW50TGlzdGVuZXIoYyxkLGEuY2FwdHVyZSk6Yi5kZXRhY2hFdmVudD9iLmRldGFjaEV2ZW50KEFiKGMpLGQpOmIuYWRkTGlzdGVuZXImJmIucmVtb3ZlTGlzdGVuZXImJmIucmVtb3ZlTGlzdGVuZXIoZCk7c2ItLTsoYz15YihiKSk/KG9iKGMsYSksYy5oPT0wJiYoYy5zcmM9bnVsbCxiW3FiXT1udWxsKSk6bGIoYSl9fX0sQWI9ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW4gcmI/cmJbYV06cmJbYV09Im9uIithfSxCYj1mdW5jdGlvbihhLGIpe2lmKGEuamEpYT0hMDtlbHNle2I9bmV3IHooYix0aGlzKTt2YXIgYz1hLmxpc3RlbmVyLGQ9YS5wYXx8YS5zcmM7YS5vYSYmQShhKTthPWMuY2FsbChkLGIpfXJldHVybiBhfSx5Yj1mdW5jdGlvbihhKXthPWFbcWJdO3JldHVybiBhIGluc3RhbmNlb2YgbWI/YTpudWxsfSxEYj0iX19jbG9zdXJlX2V2ZW50c19mbl8iKyhNYXRoLnJhbmRvbSgpKjFFOT4+PjApLHZiPWZ1bmN0aW9uKGEpe3AoYSwKIkxpc3RlbmVyIGNhbiBub3QgYmUgbnVsbC4iKTtpZih0eXBlb2YgYT09PSJmdW5jdGlvbiIpcmV0dXJuIGE7cChhLmhhbmRsZUV2ZW50LCJBbiBvYmplY3QgbGlzdGVuZXIgbXVzdCBoYXZlIGhhbmRsZUV2ZW50IG1ldGhvZC4iKTthW0RiXXx8KGFbRGJdPWZ1bmN0aW9uKGIpe3JldHVybiBhLmhhbmRsZUV2ZW50KGIpfSk7cmV0dXJuIGFbRGJdfTt2YXIgRWI9ZnVuY3Rpb24oYSl7dy5jYWxsKHRoaXMpO3RoaXMuaD1hO3RoaXMuZz17fX07bihFYix3KTsKdmFyIEZiPVtdLEI9ZnVuY3Rpb24oYSxiLGMsZCl7QXJyYXkuaXNBcnJheShjKXx8KGMmJihGYlswXT1jLnRvU3RyaW5nKCkpLGM9RmIpO2Zvcih2YXIgZT0wO2U8Yy5sZW5ndGg7ZSsrKXt2YXIgZj11YihiLGNbZV0sZHx8YS5oYW5kbGVFdmVudCwhMSxhLmh8fGEpO2lmKCFmKWJyZWFrO2EuZ1tmLmtleV09Zn1yZXR1cm4gYX0sQz1mdW5jdGlvbihhLGIsYyxkLGUsZil7aWYoQXJyYXkuaXNBcnJheShjKSlmb3IodmFyIGg9MDtoPGMubGVuZ3RoO2grKylDKGEsYixjW2hdLGQsZSxmKTtlbHNlIGQ9ZHx8YS5oYW5kbGVFdmVudCxlPW0oZSk/ISFlLmNhcHR1cmU6ISFlLGY9Znx8YS5ofHxhLGQ9dmIoZCksZT0hIWUsYz1pYihiKT9wYihiLkEsU3RyaW5nKGMpLGQsZSxmKTpiPyhiPXliKGIpKT9wYihiLGMsZCxlLGYpOm51bGw6bnVsbCxjJiYoQShjKSxkZWxldGUgYS5nW2Mua2V5XSk7cmV0dXJuIGF9LEdiPWZ1bmN0aW9uKGEpe0JhKGEuZyxmdW5jdGlvbihiLGMpe3RoaXMuZy5oYXNPd25Qcm9wZXJ0eShjKSYmCkEoYil9LGEpO2EuZz17fX07RWIucHJvdG90eXBlLkM9ZnVuY3Rpb24oKXtFYi5sLkMuY2FsbCh0aGlzKTtHYih0aGlzKX07RWIucHJvdG90eXBlLmhhbmRsZUV2ZW50PWZ1bmN0aW9uKCl7dGhyb3cgRXJyb3IoIkV2ZW50SGFuZGxlci5oYW5kbGVFdmVudCBub3QgaW1wbGVtZW50ZWQiKTt9O3ZhciBEPWZ1bmN0aW9uKCl7dy5jYWxsKHRoaXMpO3RoaXMuQT1uZXcgbWIodGhpcyk7dGhpcy5ZYT10aGlzO3RoaXMubGE9bnVsbH07bihELHcpO0QucHJvdG90eXBlW2hiXT0hMDtELnByb3RvdHlwZS5BYT1mdW5jdGlvbihhKXt0aGlzLmxhPWF9O0QucHJvdG90eXBlLnJlbW92ZUV2ZW50TGlzdGVuZXI9ZnVuY3Rpb24oYSxiLGMsZCl7Q2IodGhpcyxhLGIsYyxkKX07CnZhciBFPWZ1bmN0aW9uKGEsYil7SGIoYSk7dmFyIGM9YS5sYTtpZihjKXt2YXIgZD1bXTtmb3IodmFyIGU9MTtjO2M9Yy5sYSlkLnB1c2goYykscCgrK2U8MUUzLCJpbmZpbml0ZSBsb29wIil9YT1hLllhO2M9Yi50eXBlfHxiO3R5cGVvZiBiPT09InN0cmluZyI/Yj1uZXcgeShiLGEpOmIgaW5zdGFuY2VvZiB5P2IudGFyZ2V0PWIudGFyZ2V0fHxhOihlPWIsYj1uZXcgeShjLGEpLEdhKGIsZSkpO2U9ITA7dmFyIGY7aWYoZClmb3IoZj1kLmxlbmd0aC0xOyFiLkEmJmY+PTA7Zi0tKXt2YXIgaD1iLnU9ZFtmXTtlPUliKGgsYywhMCxiKSYmZX1iLkF8fChoPWIudT1hLGU9SWIoaCxjLCEwLGIpJiZlLGIuQXx8KGU9SWIoaCxjLCExLGIpJiZlKSk7aWYoZClmb3IoZj0wOyFiLkEmJmY8ZC5sZW5ndGg7ZisrKWg9Yi51PWRbZl0sZT1JYihoLGMsITEsYikmJmU7cmV0dXJuIGV9OwpELnByb3RvdHlwZS5DPWZ1bmN0aW9uKCl7RC5sLkMuY2FsbCh0aGlzKTtpZih0aGlzLkEpe3ZhciBhPXRoaXMuQSxiPTAsYztmb3IoYyBpbiBhLmcpe2Zvcih2YXIgZD1hLmdbY10sZT0wO2U8ZC5sZW5ndGg7ZSsrKSsrYixsYihkW2VdKTtkZWxldGUgYS5nW2NdO2EuaC0tfX10aGlzLmxhPW51bGx9O3ZhciB3Yj1mdW5jdGlvbihhLGIsYyxkLGUpe0hiKGEpO3JldHVybiBhLkEuYWRkKFN0cmluZyhiKSxjLCExLGQsZSl9LEliPWZ1bmN0aW9uKGEsYixjLGQpe2I9YS5BLmdbU3RyaW5nKGIpXTtpZighYilyZXR1cm4hMDtiPWIuY29uY2F0KCk7Zm9yKHZhciBlPSEwLGY9MDtmPGIubGVuZ3RoOysrZil7dmFyIGg9YltmXTtpZihoJiYhaC5qYSYmaC5jYXB0dXJlPT1jKXt2YXIgaz1oLmxpc3RlbmVyLHE9aC5wYXx8aC5zcmM7aC5vYSYmb2IoYS5BLGgpO2U9ay5jYWxsKHEsZCkhPT0hMSYmZX19cmV0dXJuIGUmJiFkLmRlZmF1bHRQcmV2ZW50ZWR9LEhiPWZ1bmN0aW9uKGEpe3AoYS5BLCJFdmVudCB0YXJnZXQgaXMgbm90IGluaXRpYWxpemVkLiBEaWQgeW91IGNhbGwgdGhlIHN1cGVyY2xhc3MgKGdvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0KSBjb25zdHJ1Y3Rvcj8iKX07dmFyIEpiPXQ/Ik1velVzZXJTZWxlY3QiOnV8fFZhPyJXZWJraXRVc2VyU2VsZWN0IjpudWxsLEtiPWZ1bmN0aW9uKGEsYil7Yj1iP251bGw6YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpO2lmKEpiJiYoYS5zdHlsZSYmKGEuc3R5bGVbSmJdPSJub25lIiksYikpZm9yKHZhciBjPTA7YT1iW2NdO2MrKylhLnN0eWxlJiYoYS5zdHlsZVtKYl09Im5vbmUiKX07dmFyIExiPWZ1bmN0aW9uKCl7fTtpYShMYik7TGIucHJvdG90eXBlLmc9MDt2YXIgRj1mdW5jdGlvbihhKXtELmNhbGwodGhpcyk7dGhpcy5HPWF8fHBhfHwocGE9bmV3IGZiKTt0aGlzLnphPU1iO3RoaXMuWT1udWxsO3RoaXMucz0hMTt0aGlzLmc9bnVsbDt0aGlzLk09dm9pZCAwO3RoaXMudT10aGlzLmo9dGhpcy5oPW51bGw7dGhpcy5TYT0hMX07bihGLEQpO0YucHJvdG90eXBlLlphPUxiLlYoKTsKdmFyIE1iPW51bGwsTmI9ZnVuY3Rpb24oYSxiKXtzd2l0Y2goYSl7Y2FzZSAxOnJldHVybiBiPyJkaXNhYmxlIjoiZW5hYmxlIjtjYXNlIDI6cmV0dXJuIGI/ImhpZ2hsaWdodCI6InVuaGlnaGxpZ2h0IjtjYXNlIDQ6cmV0dXJuIGI/ImFjdGl2YXRlIjoiZGVhY3RpdmF0ZSI7Y2FzZSA4OnJldHVybiBiPyJzZWxlY3QiOiJ1bnNlbGVjdCI7Y2FzZSAxNjpyZXR1cm4gYj8iY2hlY2siOiJ1bmNoZWNrIjtjYXNlIDMyOnJldHVybiBiPyJmb2N1cyI6ImJsdXIiO2Nhc2UgNjQ6cmV0dXJuIGI/Im9wZW4iOiJjbG9zZSJ9dGhyb3cgRXJyb3IoIkludmFsaWQgY29tcG9uZW50IHN0YXRlIik7fSxPYj1mdW5jdGlvbihhKXtyZXR1cm4gYS5ZfHwoYS5ZPSI6IisoYS5aYS5nKyspLnRvU3RyaW5nKDM2KSl9LFBiPWZ1bmN0aW9uKGEsYil7aWYoYS5oJiZhLmgudSl7dmFyIGM9YS5oLnUsZD1hLlk7ZCBpbiBjJiZkZWxldGUgY1tkXTtEYShhLmgudSxiLGEpfWEuWT1ifTtGLnByb3RvdHlwZS5pPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ307CnZhciBRYj1mdW5jdGlvbihhKXthLk18fChhLk09bmV3IEViKGEpKTtyZXR1cm4gcChhLk0pfTtGLnByb3RvdHlwZS5BYT1mdW5jdGlvbihhKXtpZih0aGlzLmgmJnRoaXMuaCE9YSl0aHJvdyBFcnJvcigiTWV0aG9kIG5vdCBzdXBwb3J0ZWQiKTtGLmwuQWEuY2FsbCh0aGlzLGEpfTtGLnByb3RvdHlwZS5tYT1mdW5jdGlvbigpe3RoaXMuZz1aYSh0aGlzLkcuZywiRElWIil9O0YucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbihhKXtSYih0aGlzLGEpfTsKdmFyIFJiPWZ1bmN0aW9uKGEsYixjKXtpZihhLnMpdGhyb3cgRXJyb3IoIkNvbXBvbmVudCBhbHJlYWR5IHJlbmRlcmVkIik7YS5nfHxhLm1hKCk7Yj9iLmluc2VydEJlZm9yZShhLmcsY3x8bnVsbCk6YS5HLmcuYm9keS5hcHBlbmRDaGlsZChhLmcpO2EuaCYmIWEuaC5zfHxhLkkoKX0sU2I9ZnVuY3Rpb24oYSxiKXtpZihhLnMpdGhyb3cgRXJyb3IoIkNvbXBvbmVudCBhbHJlYWR5IHJlbmRlcmVkIik7aWYoYiYmYS53YShiKSl7YS5TYT0hMDt2YXIgYz1iYihiKTthLkcmJmEuRy5nPT1jfHwoYS5HPWI/bmV3IGZiKGJiKGIpKTpwYXx8KHBhPW5ldyBmYikpO2EuRWEoYik7YS5JKCl9ZWxzZSB0aHJvdyBFcnJvcigiSW52YWxpZCBlbGVtZW50IHRvIGRlY29yYXRlIik7fTtnPUYucHJvdG90eXBlO2cud2E9ZnVuY3Rpb24oKXtyZXR1cm4hMH07Zy5FYT1mdW5jdGlvbihhKXt0aGlzLmc9YX07CmcuST1mdW5jdGlvbigpe3RoaXMucz0hMDtUYih0aGlzLGZ1bmN0aW9uKGEpeyFhLnMmJmEuaSgpJiZhLkkoKX0pfTtnLlU9ZnVuY3Rpb24oKXtUYih0aGlzLGZ1bmN0aW9uKGEpe2EucyYmYS5VKCl9KTt0aGlzLk0mJkdiKHRoaXMuTSk7dGhpcy5zPSExfTtnLkM9ZnVuY3Rpb24oKXt0aGlzLnMmJnRoaXMuVSgpO3RoaXMuTSYmKHRoaXMuTS5kaXNwb3NlKCksZGVsZXRlIHRoaXMuTSk7VGIodGhpcyxmdW5jdGlvbihhKXthLmRpc3Bvc2UoKX0pOyF0aGlzLlNhJiZ0aGlzLmcmJiRhKHRoaXMuZyk7dGhpcy5oPXRoaXMuZz10aGlzLnU9dGhpcy5qPW51bGw7Ri5sLkMuY2FsbCh0aGlzKX07Zy5CYT1mdW5jdGlvbihhLGIpe3RoaXMuQ2EoYSxIKHRoaXMpLGIpfTsKZy5DYT1mdW5jdGlvbihhLGIsYyl7cCghIWEsIlByb3ZpZGVkIGVsZW1lbnQgbXVzdCBub3QgYmUgbnVsbC4iKTtpZihhLnMmJihjfHwhdGhpcy5zKSl0aHJvdyBFcnJvcigiQ29tcG9uZW50IGFscmVhZHkgcmVuZGVyZWQiKTtpZihiPDB8fGI+SCh0aGlzKSl0aHJvdyBFcnJvcigiQ2hpbGQgY29tcG9uZW50IGluZGV4IG91dCBvZiBib3VuZHMiKTt0aGlzLnUmJnRoaXMuanx8KHRoaXMudT17fSx0aGlzLmo9W10pO2lmKGEuaD09dGhpcyl7dmFyIGQ9dGhpcy51LGU9T2IoYSk7ZFtlXT1hO3hhKHRoaXMuaixhKX1lbHNlIERhKHRoaXMudSxPYihhKSxhKTtpZihhPT10aGlzKXRocm93IEVycm9yKCJVbmFibGUgdG8gc2V0IHBhcmVudCBjb21wb25lbnQiKTtpZihkPXRoaXMmJmEuaCYmYS5ZKWU9YS5oLGQ9YS5ZLGUudSYmZD8oZT1lLnUsZD0oZSE9PW51bGwmJmQgaW4gZT9lW2RdOnZvaWQgMCl8fG51bGwpOmQ9bnVsbDtpZihkJiZhLmghPXRoaXMpdGhyb3cgRXJyb3IoIlVuYWJsZSB0byBzZXQgcGFyZW50IGNvbXBvbmVudCIpOwphLmg9dGhpcztGLmwuQWEuY2FsbChhLHRoaXMpO3phKHRoaXMuaixiLDAsYSk7YS5zJiZ0aGlzLnMmJmEuaD09dGhpcz8oYz10aGlzLm5hKCksKGMuY2hpbGROb2Rlc1tiXXx8bnVsbCkhPWEuaSgpJiYoYS5pKCkucGFyZW50RWxlbWVudD09YyYmYy5yZW1vdmVDaGlsZChhLmkoKSksYj1jLmNoaWxkTm9kZXNbYl18fG51bGwsYy5pbnNlcnRCZWZvcmUoYS5pKCksYikpKTpjPyh0aGlzLmd8fHRoaXMubWEoKSxiPUkodGhpcyxiKzEpLFJiKGEsdGhpcy5uYSgpLGI/Yi5nOm51bGwpKTp0aGlzLnMmJiFhLnMmJmEuZyYmYS5nLnBhcmVudE5vZGUmJmEuZy5wYXJlbnROb2RlLm5vZGVUeXBlPT0xJiZhLkkoKX07Zy5uYT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmd9Owp2YXIgVWI9ZnVuY3Rpb24oYSl7aWYoYS56YT09bnVsbCl7dmFyIGI9YS5zP2EuZzphLkcuZy5ib2R5O2E6e3ZhciBjPWJiKGIpO2lmKGMuZGVmYXVsdFZpZXcmJmMuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSYmKGM9Yy5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKGIsbnVsbCkpKXtjPWMuZGlyZWN0aW9ufHxjLmdldFByb3BlcnR5VmFsdWUoImRpcmVjdGlvbiIpfHwiIjticmVhayBhfWM9IiJ9YS56YT0icnRsIj09KGN8fChiLmN1cnJlbnRTdHlsZT9iLmN1cnJlbnRTdHlsZS5kaXJlY3Rpb246bnVsbCl8fGIuc3R5bGUmJmIuc3R5bGUuZGlyZWN0aW9uKX1yZXR1cm4gYS56YX0sSD1mdW5jdGlvbihhKXtyZXR1cm4gYS5qP2Euai5sZW5ndGg6MH0sST1mdW5jdGlvbihhLGIpe3JldHVybiBhLmo/YS5qW2JdfHxudWxsOm51bGx9LFRiPWZ1bmN0aW9uKGEsYixjKXthLmomJmEuai5mb3JFYWNoKGIsYyl9LFZiPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuaiYmYj9hLmouaW5kZXhPZihiKToKLTF9O3ZhciBXYj17bWI6ImFjdGl2ZWRlc2NlbmRhbnQiLHJiOiJhdG9taWMiLHNiOiJhdXRvY29tcGxldGUiLHViOiJidXN5Iix4YjoiY2hlY2tlZCIseWI6ImNvbGluZGV4IixEYjoiY29udHJvbHMiLEViOiJjdXJyZW50IixHYjoiZGVzY3JpYmVkYnkiLEpiOiJkaXNhYmxlZCIsTGI6ImRyb3BlZmZlY3QiLE1iOiJleHBhbmRlZCIsTmI6ImZsb3d0byIsUGI6ImdyYWJiZWQiLFRiOiJoYXNwb3B1cCIsVmI6ImhpZGRlbiIsWGI6ImludmFsaWQiLFliOiJsYWJlbCIsWmI6ImxhYmVsbGVkYnkiLGFjOiJsZXZlbCIsZmM6ImxpdmUiLHZjOiJtdWx0aWxpbmUiLHdjOiJtdWx0aXNlbGVjdGFibGUiLEFjOiJvcmllbnRhdGlvbiIsQmM6Im93bnMiLENjOiJwb3NpbnNldCIsRWM6InByZXNzZWQiLEljOiJyZWFkb25seSIsS2M6InJlbGV2YW50IixMYzoicmVxdWlyZWQiLFBjOiJyb3dpbmRleCIsU2M6InNlbGVjdGVkIixVYzoic2V0c2l6ZSIsV2M6InNvcnQiLG1kOiJ2YWx1ZW1heCIsbmQ6InZhbHVlbWluIiwKb2Q6InZhbHVlbm93IixwZDoidmFsdWV0ZXh0In07dmFyIFhiO3ZhciBZYj17bmI6ImFsZXJ0IixvYjoiYWxlcnRkaWFsb2ciLHBiOiJhcHBsaWNhdGlvbiIscWI6ImFydGljbGUiLHRiOiJiYW5uZXIiLHZiOiJidXR0b24iLHdiOiJjaGVja2JveCIsemI6ImNvbHVtbmhlYWRlciIsQWI6ImNvbWJvYm94IixCYjoiY29tcGxlbWVudGFyeSIsQ2I6ImNvbnRlbnRpbmZvIixGYjoiZGVmaW5pdGlvbiIsSGI6ImRpYWxvZyIsSWI6ImRpcmVjdG9yeSIsS2I6ImRvY3VtZW50IixPYjoiZm9ybSIsUWI6ImdyaWQiLFJiOiJncmlkY2VsbCIsU2I6Imdyb3VwIixVYjoiaGVhZGluZyIsV2I6ImltZyIsYmM6ImxpbmsiLGNjOiJsaXN0IixkYzoibGlzdGJveCIsZWM6Imxpc3RpdGVtIixoYzoibG9nIixpYzoibWFpbiIsamM6Im1hcnF1ZWUiLGtjOiJtYXRoIixsYzoibWVudSIsbWM6Im1lbnViYXIiLG5jOiJtZW51aXRlbSIsb2M6Im1lbnVpdGVtY2hlY2tib3giLHBjOiJtZW51aXRlbXJhZGlvIix4YzoibmF2aWdhdGlvbiIseWM6Im5vdGUiLHpjOiJvcHRpb24iLApEYzoicHJlc2VudGF0aW9uIixGYzoicHJvZ3Jlc3NiYXIiLEdjOiJyYWRpbyIsSGM6InJhZGlvZ3JvdXAiLEpjOiJyZWdpb24iLE1jOiJyb3ciLE5jOiJyb3dncm91cCIsT2M6InJvd2hlYWRlciIsUWM6InNjcm9sbGJhciIsUmM6InNlYXJjaCIsVGM6InNlcGFyYXRvciIsVmM6InNsaWRlciIsWGM6InNwaW5idXR0b24iLFljOiJzdGF0dXMiLFpjOiJzd2l0Y2giLGFkOiJ0YWIiLGJkOiJ0YWJsaXN0IixjZDoidGFicGFuZWwiLGRkOiJ0ZXh0Ym94IixlZDoidGV4dGluZm8iLGZkOiJ0aW1lciIsZ2Q6InRvb2xiYXIiLGhkOiJ0b29sdGlwIixqZDoidHJlZSIsa2Q6InRyZWVncmlkIixsZDoidHJlZWl0ZW0ifTt2YXIgWmI9ZnVuY3Rpb24oYSxiKXtiPyhwKENhKFliLGIpLCJObyBzdWNoIEFSSUEgcm9sZSAiK2IpLGEuc2V0QXR0cmlidXRlKCJyb2xlIixiKSk6YS5yZW1vdmVBdHRyaWJ1dGUoInJvbGUiKX0sYWM9ZnVuY3Rpb24oYSxiLGMpe0FycmF5LmlzQXJyYXkoYykmJihjPWMuam9pbigiICIpKTt2YXIgZD0kYihiKTtjPT09IiJ8fGM9PXZvaWQgMD8oWGJ8fChjPXt9LFhiPShjLmF0b21pYz0hMSxjLmF1dG9jb21wbGV0ZT0ibm9uZSIsYy5kcm9wZWZmZWN0PSJub25lIixjLmhhc3BvcHVwPSExLGMubGl2ZT0ib2ZmIixjLm11bHRpbGluZT0hMSxjLm11bHRpc2VsZWN0YWJsZT0hMSxjLm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIsYy5yZWFkb25seT0hMSxjLnJlbGV2YW50PSJhZGRpdGlvbnMgdGV4dCIsYy5yZXF1aXJlZD0hMSxjLnNvcnQ9Im5vbmUiLGMuYnVzeT0hMSxjLmRpc2FibGVkPSExLGMuaGlkZGVuPSExLGMuaW52YWxpZD0iZmFsc2UiLGMpKSxjPVhiLGIgaW4gYz9hLnNldEF0dHJpYnV0ZShkLApjW2JdKTphLnJlbW92ZUF0dHJpYnV0ZShkKSk6YS5zZXRBdHRyaWJ1dGUoZCxjKX0sJGI9ZnVuY3Rpb24oYSl7cChhLCJBUklBIGF0dHJpYnV0ZSBjYW5ub3QgYmUgZW1wdHkuIik7cChDYShXYixhKSwiTm8gc3VjaCBBUklBIGF0dHJpYnV0ZSAiK2EpO3JldHVybiJhcmlhLSIrYX07dmFyIGRjPWZ1bmN0aW9uKGEsYixjLGQsZSxmKXtpZih2JiZlKXJldHVybiBiYyhhKTtpZihlJiYhZClyZXR1cm4hMTtpZighdCl7dHlwZW9mIGI9PT0ibnVtYmVyIiYmKGI9Y2MoYikpO3ZhciBoPWI9PTE3fHxiPT0xOHx8diYmYj09OTE7aWYoKCFjfHx2KSYmaHx8diYmYj09MTYmJihkfHxmKSlyZXR1cm4hMX1pZih1JiZkJiZjKXN3aXRjaChhKXtjYXNlIDIyMDpjYXNlIDIxOTpjYXNlIDIyMTpjYXNlIDE5MjpjYXNlIDE4NjpjYXNlIDE4OTpjYXNlIDE4NzpjYXNlIDE4ODpjYXNlIDE5MDpjYXNlIDE5MTpjYXNlIDE5MjpjYXNlIDIyMjpyZXR1cm4hMX1zd2l0Y2goYSl7Y2FzZSAxMzpyZXR1cm4gdD9mfHxlPyExOiEoYyYmZCk6ITA7Y2FzZSAyNzpyZXR1cm4hdSYmIXR9cmV0dXJuIHQmJihkfHxlfHxmKT8hMTpiYyhhKX0sYmM9ZnVuY3Rpb24oYSl7aWYoYT49NDgmJmE8PTU3fHxhPj05NiYmYTw9MTA2fHxhPj02NSYmYTw9OTB8fHUmJmE9PTApcmV0dXJuITA7c3dpdGNoKGEpe2Nhc2UgMzI6Y2FzZSA0MzpjYXNlIDYzOmNhc2UgNjQ6Y2FzZSAxMDc6Y2FzZSAxMDk6Y2FzZSAxMTA6Y2FzZSAxMTE6Y2FzZSAxODY6Y2FzZSA1OTpjYXNlIDE4OTpjYXNlIDE4NzpjYXNlIDYxOmNhc2UgMTg4OmNhc2UgMTkwOmNhc2UgMTkxOmNhc2UgMTkyOmNhc2UgMjIyOmNhc2UgMjE5OmNhc2UgMjIwOmNhc2UgMjIxOmNhc2UgMTYzOmNhc2UgNTg6cmV0dXJuITA7CmNhc2UgMTczOmNhc2UgMTcxOnJldHVybiB0O2RlZmF1bHQ6cmV0dXJuITF9fSxjYz1mdW5jdGlvbihhKXtpZih0KWE9ZWMoYSk7ZWxzZSBpZih2JiZ1KXN3aXRjaChhKXtjYXNlIDkzOmE9OTF9cmV0dXJuIGF9LGVjPWZ1bmN0aW9uKGEpe3N3aXRjaChhKXtjYXNlIDYxOnJldHVybiAxODc7Y2FzZSA1OTpyZXR1cm4gMTg2O2Nhc2UgMTczOnJldHVybiAxODk7Y2FzZSAyMjQ6cmV0dXJuIDkxO2Nhc2UgMDpyZXR1cm4gMjI0O2RlZmF1bHQ6cmV0dXJuIGF9fTt2YXIgZmM9ZnVuY3Rpb24oYSxiLGMsZCl7ei5jYWxsKHRoaXMsZCk7dGhpcy50eXBlPSJrZXkiO3RoaXMuZz1hO3RoaXMucmVwZWF0PWN9O24oZmMseik7dmFyIEo9ZnVuY3Rpb24oYSxiKXtELmNhbGwodGhpcyk7YSYmZ2ModGhpcyxhLGIpfTtuKEosRCk7Zz1KLnByb3RvdHlwZTtnLlI9bnVsbDtnLnFhPW51bGw7Zy5KYT1udWxsO2cucmE9bnVsbDtnLkY9LTE7Zy5LPS0xO2cuRGE9ITE7CnZhciBoYz17MzoxMywxMjoxNDQsNjMyMzI6MzgsNjMyMzM6NDAsNjMyMzQ6MzcsNjMyMzU6MzksNjMyMzY6MTEyLDYzMjM3OjExMyw2MzIzODoxMTQsNjMyMzk6MTE1LDYzMjQwOjExNiw2MzI0MToxMTcsNjMyNDI6MTE4LDYzMjQzOjExOSw2MzI0NDoxMjAsNjMyNDU6MTIxLDYzMjQ2OjEyMiw2MzI0NzoxMjMsNjMyNDg6NDQsNjMyNzI6NDYsNjMyNzM6MzYsNjMyNzU6MzUsNjMyNzY6MzMsNjMyNzc6MzQsNjMyODk6MTQ0LDYzMzAyOjQ1fSxpYz17VXA6MzgsRG93bjo0MCxMZWZ0OjM3LFJpZ2h0OjM5LEVudGVyOjEzLEYxOjExMixGMjoxMTMsRjM6MTE0LEY0OjExNSxGNToxMTYsRjY6MTE3LEY3OjExOCxGODoxMTksRjk6MTIwLEYxMDoxMjEsRjExOjEyMixGMTI6MTIzLCJVKzAwN0YiOjQ2LEhvbWU6MzYsRW5kOjM1LFBhZ2VVcDozMyxQYWdlRG93bjozNCxJbnNlcnQ6NDV9LGpjPXYmJnQ7CkoucHJvdG90eXBlLmc9ZnVuY3Rpb24oYSl7dSYmKHRoaXMuRj09MTcmJiFhLmN0cmxLZXl8fHRoaXMuRj09MTgmJiFhLmFsdEtleXx8diYmdGhpcy5GPT05MSYmIWEubWV0YUtleSkmJih0aGlzLks9dGhpcy5GPS0xKTt0aGlzLkY9PS0xJiYoYS5jdHJsS2V5JiZhLmchPTE3P3RoaXMuRj0xNzphLmFsdEtleSYmYS5nIT0xOD90aGlzLkY9MTg6YS5tZXRhS2V5JiZhLmchPTkxJiYodGhpcy5GPTkxKSk7ZGMoYS5nLHRoaXMuRixhLnNoaWZ0S2V5LGEuY3RybEtleSxhLmFsdEtleSxhLm1ldGFLZXkpPyh0aGlzLks9Y2MoYS5nKSxqYyYmKHRoaXMuRGE9YS5hbHRLZXkpKTp0aGlzLmhhbmRsZUV2ZW50KGEpfTtKLnByb3RvdHlwZS5oPWZ1bmN0aW9uKGEpe3RoaXMuSz10aGlzLkY9LTE7dGhpcy5EYT1hLmFsdEtleX07CkoucHJvdG90eXBlLmhhbmRsZUV2ZW50PWZ1bmN0aW9uKGEpe3ZhciBiPWEuaCxjPWIuYWx0S2V5O2lmKHUmJmEudHlwZT09ImtleXByZXNzIil7dmFyIGQ9dGhpcy5LO3ZhciBlPWIuY2hhckNvZGU+PTAmJmIuY2hhckNvZGU8NjMyMzImJmJjKGQpP2IuY2hhckNvZGU6MH1lbHNlIGEudHlwZT09ImtleXByZXNzIj8oamMmJihjPXRoaXMuRGEpLGIua2V5Q29kZT09Yi5jaGFyQ29kZT9iLmtleUNvZGU8MzI/KGQ9Yi5rZXlDb2RlLGU9MCk6KGQ9dGhpcy5LLGU9Yi5jaGFyQ29kZSk6KGQ9Yi5rZXlDb2RlfHx0aGlzLkssZT1iLmNoYXJDb2RlfHwwKSk6KGQ9Yi5rZXlDb2RlfHx0aGlzLkssZT1iLmNoYXJDb2RlfHwwKSx2JiZlPT02MyYmZD09MjI0JiYoZD0xOTEpO3ZhciBmPWQ9Y2MoZCk7ZD9kPj02MzIzMiYmZCBpbiBoYz9mPWhjW2RdOmQ9PTI1JiZhLnNoaWZ0S2V5JiYoZj05KTpiLmtleUlkZW50aWZpZXImJmIua2V5SWRlbnRpZmllciBpbiBpYyYmKGY9aWNbYi5rZXlJZGVudGlmaWVyXSk7CmlmKCF0fHxhLnR5cGUhPSJrZXlwcmVzcyJ8fGRjKGYsdGhpcy5GLGEuc2hpZnRLZXksYS5jdHJsS2V5LGMsYS5tZXRhS2V5KSlhPWY9PXRoaXMuRix0aGlzLkY9ZixiPW5ldyBmYyhmLGUsYSxiKSxiLmFsdEtleT1jLEUodGhpcyxiKX07Si5wcm90b3R5cGUuaT1mdW5jdGlvbigpe3JldHVybiB0aGlzLlJ9O3ZhciBnYz1mdW5jdGlvbihhLGIsYyl7YS5yYSYma2MoYSk7YS5SPWI7YS5xYT11YihhLlIsImtleXByZXNzIixhLGMpO2EuSmE9dWIoYS5SLCJrZXlkb3duIixhLmcsYyxhKTthLnJhPXViKGEuUiwia2V5dXAiLGEuaCxjLGEpfSxrYz1mdW5jdGlvbihhKXthLnFhJiYoQShhLnFhKSxBKGEuSmEpLEEoYS5yYSksYS5xYT1udWxsLGEuSmE9bnVsbCxhLnJhPW51bGwpO2EuUj1udWxsO2EuRj0tMTthLks9LTF9O0oucHJvdG90eXBlLkM9ZnVuY3Rpb24oKXtKLmwuQy5jYWxsKHRoaXMpO2tjKHRoaXMpfTt2YXIgSz17Z2E6Im1vdXNlZG93biIsaGE6Im1vdXNldXAiLGZhOiJtb3VzZWNhbmNlbCIsc2M6Im1vdXNlbW92ZSIsdWM6Im1vdXNlb3ZlciIsdGM6Im1vdXNlb3V0IixxYzoibW91c2VlbnRlciIscmM6Im1vdXNlbGVhdmUifTt2YXIgbGM9ZnVuY3Rpb24oYSl7cmV0dXJuIHR5cGVvZiBhLmNsYXNzTmFtZT09InN0cmluZyI/YS5jbGFzc05hbWU6YS5nZXRBdHRyaWJ1dGUmJmEuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIn0sTD1mdW5jdGlvbihhKXtyZXR1cm4gYS5jbGFzc0xpc3Q/YS5jbGFzc0xpc3Q6bGMoYSkubWF0Y2goL1xTKy9nKXx8W119LG1jPWZ1bmN0aW9uKGEsYil7dHlwZW9mIGEuY2xhc3NOYW1lPT0ic3RyaW5nIj9hLmNsYXNzTmFtZT1iOmEuc2V0QXR0cmlidXRlJiZhLnNldEF0dHJpYnV0ZSgiY2xhc3MiLGIpfSxuYz1mdW5jdGlvbihhLGIpe2EuY2xhc3NMaXN0P2I9YS5jbGFzc0xpc3QuY29udGFpbnMoYik6KGE9TChhKSxiPXZhKGEsYik+PTApO3JldHVybiBifSxvYz1mdW5jdGlvbihhLGIpe2lmKGEuY2xhc3NMaXN0KWEuY2xhc3NMaXN0LmFkZChiKTtlbHNlIGlmKCFuYyhhLGIpKXt2YXIgYz1sYyhhKTttYyhhLGMrKGMubGVuZ3RoPjA/IiAiK2I6YikpfX0scGM9ZnVuY3Rpb24oYSxiKXtpZihhLmNsYXNzTGlzdClBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGIsCmZ1bmN0aW9uKGUpe29jKGEsZSl9KTtlbHNle3ZhciBjPXt9O0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoTChhKSxmdW5jdGlvbihlKXtjW2VdPSEwfSk7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChiLGZ1bmN0aW9uKGUpe2NbZV09ITB9KTtiPSIiO2Zvcih2YXIgZCBpbiBjKWIrPWIubGVuZ3RoPjA/IiAiK2Q6ZDttYyhhLGIpfX0scWM9ZnVuY3Rpb24oYSxiKXthLmNsYXNzTGlzdD9hLmNsYXNzTGlzdC5yZW1vdmUoYik6bmMoYSxiKSYmbWMoYSxBcnJheS5wcm90b3R5cGUuZmlsdGVyLmNhbGwoTChhKSxmdW5jdGlvbihjKXtyZXR1cm4gYyE9Yn0pLmpvaW4oIiAiKSl9LHJjPWZ1bmN0aW9uKGEsYil7YS5jbGFzc0xpc3Q/QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChiLGZ1bmN0aW9uKGMpe3FjKGEsYyl9KTptYyhhLEFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbChMKGEpLGZ1bmN0aW9uKGMpe3JldHVybiEodmEoYixjKT49MCl9KS5qb2luKCIgIikpfTt2YXIgdGM9ZnVuY3Rpb24oYSxiKXtpZighYSl0aHJvdyBFcnJvcigiSW52YWxpZCBjbGFzcyBuYW1lICIrYSk7aWYodHlwZW9mIGIhPT0iZnVuY3Rpb24iKXRocm93IEVycm9yKCJJbnZhbGlkIGRlY29yYXRvciBmdW5jdGlvbiAiK2IpO3NjW2FdPWJ9LHVjPXt9LHNjPXt9O3ZhciB2Yz1mdW5jdGlvbihhKXt0aGlzLkE9YX07aWEodmMpO3ZhciB3Yz1mdW5jdGlvbihhLGIpe2EmJihhLnRhYkluZGV4PWI/MDotMSl9LHljPWZ1bmN0aW9uKGEsYixjKXtjLmlkJiZQYihiLGMuaWQpO3ZhciBkPWEuZygpLGU9ITEsZj1MKGMpO2YmJkFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoZixmdW5jdGlvbihoKXtoPT1kP2U9ITA6aCYmdGhpcy51KGIsaCxkKX0sYSk7ZXx8b2MoYyxkKTt4YyhiLGMpO3JldHVybiBjfTt2Yy5wcm90b3R5cGUudT1mdW5jdGlvbihhLGIsYyl7Yj09YysiLWRpc2FibGVkIj9hLlgoITEpOmI9PWMrIi1ob3Jpem9udGFsIj96YyhhLCJob3Jpem9udGFsIik6Yj09YysiLXZlcnRpY2FsIiYmemMoYSwidmVydGljYWwiKX07CnZhciB4Yz1mdW5jdGlvbihhLGIpe2lmKGIpZm9yKHZhciBjPWIuZmlyc3RDaGlsZCxkO2MmJmMucGFyZW50Tm9kZT09Yjspe2Q9Yy5uZXh0U2libGluZztpZihjLm5vZGVUeXBlPT0xKXthOnt2YXIgZT1jO3AoZSk7ZT1MKGUpO2Zvcih2YXIgZj1lLmxlbmd0aCxoPTA7aDxmO2grKyl7dmFyIGs9ZVtoXTtpZihrPWsgaW4gc2M/c2Nba10oKTpudWxsKXtlPWs7YnJlYWsgYX19ZT1udWxsfWUmJihlLmc9YyxhLmlzRW5hYmxlZCgpfHxlLlgoITEpLGEuQmEoZSksU2IoZSxjKSl9ZWxzZSBjLm5vZGVWYWx1ZSYmSGEoYy5ub2RlVmFsdWUpIT0iInx8Yi5yZW1vdmVDaGlsZChjKTtjPWR9fSxBYz1mdW5jdGlvbihhLGIpe2I9Yi5pKCk7cChiLCJUaGUgY29udGFpbmVyIERPTSBlbGVtZW50IGNhbm5vdCBiZSBudWxsLiIpO0tiKGIsdCk7KGE9YS5BKSYmWmIoYixhKX07dmMucHJvdG90eXBlLmc9ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy1jb250YWluZXIifTsKdmMucHJvdG90eXBlLmo9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nKCksYz1bYixhLkw9PSJob3Jpem9udGFsIj9iKyItaG9yaXpvbnRhbCI6YisiLXZlcnRpY2FsIl07YS5pc0VuYWJsZWQoKXx8Yy5wdXNoKGIrIi1kaXNhYmxlZCIpO3JldHVybiBjfTt2YXIgQmM9ZnVuY3Rpb24oKXt9O3ZhciBNPWZ1bmN0aW9uKCl7fSxDYztpYShNKTt2YXIgRGM9e2J1dHRvbjoicHJlc3NlZCIsY2hlY2tib3g6ImNoZWNrZWQiLG1lbnVpdGVtOiJzZWxlY3RlZCIsbWVudWl0ZW1jaGVja2JveDoiY2hlY2tlZCIsbWVudWl0ZW1yYWRpbzoiY2hlY2tlZCIscmFkaW86ImNoZWNrZWQiLHRhYjoic2VsZWN0ZWQiLHRyZWVpdGVtOiJzZWxlY3RlZCJ9O00ucHJvdG90eXBlLk5hPWZ1bmN0aW9uKCl7fTtNLnByb3RvdHlwZS54YT1mdW5jdGlvbihhKXt2YXIgYj1hLkcsYz1iLmgsZD10aGlzLk4oKSxlPVtkXSxmPXRoaXMuTigpO2YhPWQmJmUucHVzaChmKTtkPWEubTtmb3IoZj1bXTtkOyl7dmFyIGg9ZCYtZDtmLnB1c2goRWModGhpcyxoKSk7ZCY9fmh9ZS5wdXNoLmFwcGx5KGUsZik7KGQ9YS5GYSkmJmUucHVzaC5hcHBseShlLGQpO3JldHVybiBjLmNhbGwoYiwiRElWIixlLmpvaW4oIiAiKSxhLmlhKX07Ck0ucHJvdG90eXBlLnlhPWZ1bmN0aW9uKGEsYil7Yi5pZCYmUGIoYSxiLmlkKTtiJiZiLmZpcnN0Q2hpbGQ/RmMoYSxiLmZpcnN0Q2hpbGQubmV4dFNpYmxpbmc/eWEoYi5jaGlsZE5vZGVzKTpiLmZpcnN0Q2hpbGQpOmEuaWE9bnVsbDt2YXIgYz0wLGQ9dGhpcy5OKCksZT10aGlzLk4oKSxmPSExLGg9ITEsaz15YShMKGIpKTtrLmZvckVhY2goZnVuY3Rpb24ocSl7Znx8cSE9ZD9ofHxxIT1lP2N8PUdjKHRoaXMscSk6aD0hMDooZj0hMCxlPT1kJiYoaD0hMCkpO0djKHRoaXMscSk9PTEmJihzYShiKSxkYihiKSYmZWIoYikmJmNiKGIsITEpKX0sdGhpcyk7YS5tPWM7Znx8KGsucHVzaChkKSxlPT1kJiYoaD0hMCkpO2h8fGsucHVzaChlKTsoYT1hLkZhKSYmay5wdXNoLmFwcGx5KGssYSk7ZiYmaCYmIWF8fG1jKGIsay5qb2luKCIgIikpO3JldHVybiBifTsKdmFyIEhjPWZ1bmN0aW9uKGEsYil7aWYoYT1hLk5hKCkpe3AoYiwiVGhlIGVsZW1lbnQgcGFzc2VkIGFzIGEgZmlyc3QgcGFyYW1ldGVyIGNhbm5vdCBiZSBudWxsLiIpO3ZhciBjPWIuZ2V0QXR0cmlidXRlKCJyb2xlIil8fG51bGw7YSE9YyYmWmIoYixhKX19LEljPWZ1bmN0aW9uKGEsYil7dmFyIGM7aWYoYS5EJjMyJiYoYz1hLmkoKSkpe2lmKCFiJiZhLm0mMzIpe3RyeXtjLmJsdXIoKX1jYXRjaChkKXt9YS5tJjMyJiZhLlFhKG51bGwpfShkYihjKSYmZWIoYykpIT1iJiZjYihjLGIpfX0sSmM9ZnVuY3Rpb24oYSxiLGMpe0NjfHwoQ2M9ezE6ImRpc2FibGVkIiw4OiJzZWxlY3RlZCIsMTY6ImNoZWNrZWQiLDY0OiJleHBhbmRlZCJ9KTtwKGEsIlRoZSBlbGVtZW50IHBhc3NlZCBhcyBhIGZpcnN0IHBhcmFtZXRlciBjYW5ub3QgYmUgbnVsbC4iKTtiPUNjW2JdO3ZhciBkPWEuZ2V0QXR0cmlidXRlKCJyb2xlIil8fG51bGw7ZCYmKGQ9RGNbZF18fGIsYj1iPT0iY2hlY2tlZCJ8fGI9PQoic2VsZWN0ZWQiP2Q6Yik7YiYmYWMoYSxiLGMpfTtNLnByb3RvdHlwZS5OPWZ1bmN0aW9uKCl7cmV0dXJuImdvb2ctY29udHJvbCJ9O3ZhciBFYz1mdW5jdGlvbihhLGIpe2EuZ3x8S2MoYSk7cmV0dXJuIGEuZ1tiXX0sR2M9ZnVuY3Rpb24oYSxiKXthLmh8fChhLmd8fEtjKGEpLGEuaD1FYShhLmcpKTthPXBhcnNlSW50KGEuaFtiXSwxMCk7cmV0dXJuIGlzTmFOKGEpPzA6YX0sS2M9ZnVuY3Rpb24oYSl7dmFyIGI9YS5OKCk7dmFyIGM9Yi5yZXBsYWNlKC9ceGEwfFxzL2csIiAiKS5pbmRleE9mKCIgIikhPS0xO3AoIWMsIkNvbnRyb2xSZW5kZXJlciBoYXMgYW4gaW52YWxpZCBjc3MgY2xhc3M6ICciK2IrIiciKTthLmc9ezE6YisiLWRpc2FibGVkIiwyOmIrIi1ob3ZlciIsNDpiKyItYWN0aXZlIiw4OmIrIi1zZWxlY3RlZCIsMTY6YisiLWNoZWNrZWQiLDMyOmIrIi1mb2N1c2VkIiw2NDpiKyItb3BlbiJ9fTt2YXIgTj1mdW5jdGlvbihhLGIsYyl7Ri5jYWxsKHRoaXMsYyk7aWYoIWIpe2ZvcihiPXRoaXMuY29uc3RydWN0b3I7Yjspe3ZhciBkPW5hKGIpO2lmKGQ9dWNbZF0pYnJlYWs7Yj0oYj1PYmplY3QuZ2V0UHJvdG90eXBlT2YoYi5wcm90b3R5cGUpKSYmYi5jb25zdHJ1Y3Rvcn1iPWQ/dHlwZW9mIGQuVj09PSJmdW5jdGlvbiI/ZC5WKCk6bmV3IGQ6bnVsbH10aGlzLnY9Yjt0aGlzLmlhPWEhPT12b2lkIDA/YTpudWxsfTtuKE4sRik7Zz1OLnByb3RvdHlwZTtnLmlhPW51bGw7Zy5tPTA7Zy5EPTM5O2cuUD0wO2cuT2E9ITA7Zy5GYT1udWxsO2cuSGE9ITA7Zy5tYT1mdW5jdGlvbigpe3ZhciBhPXRoaXMudi54YSh0aGlzKTt0aGlzLmc9YTtIYyh0aGlzLnYsYSk7S2IoYSwhMCk7dGhpcy5pc1Zpc2libGUoKXx8KGEuc3R5bGUuZGlzcGxheT0ibm9uZSIsYSYmYWMoYSwiaGlkZGVuIiwhMCkpfTtnLm5hPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaSgpfTtnLndhPWZ1bmN0aW9uKCl7cmV0dXJuITB9OwpnLkVhPWZ1bmN0aW9uKGEpe3RoaXMuZz1hPXRoaXMudi55YSh0aGlzLGEpO0hjKHRoaXMudixhKTtLYihhLCEwKTt0aGlzLk9hPWEuc3R5bGUuZGlzcGxheSE9Im5vbmUifTsKZy5JPWZ1bmN0aW9uKCl7Ti5sLkkuY2FsbCh0aGlzKTt2YXIgYT10aGlzLmc7cChhLCJDYW4gbm90IGNhbGwgZ2V0RWxlbWVudFN0cmljdCBiZWZvcmUgcmVuZGVyaW5nL2RlY29yYXRpbmcuIik7cCh0aGlzKTtwKGEpO3RoaXMuaXNWaXNpYmxlKCl8fGFjKGEsImhpZGRlbiIsIXRoaXMuaXNWaXNpYmxlKCkpO3RoaXMuaXNFbmFibGVkKCl8fEpjKGEsMSwhdGhpcy5pc0VuYWJsZWQoKSk7dGhpcy5EJjgmJkpjKGEsOCwhISh0aGlzLm0mOCkpO3RoaXMuRCYxNiYmSmMoYSwxNiwhISh0aGlzLm0mMTYpKTt0aGlzLkQmNjQmJkpjKGEsNjQsISEodGhpcy5tJjY0KSk7dmFyIGI9dGhpcy52O1ViKHRoaXMpJiYoYT10aGlzLmkoKSxiPWIuTigpKyItcnRsIiwoYT1hLmk/YS5pKCk6YSkmJnBjKGEsW2JdKSk7dGhpcy5pc0VuYWJsZWQoKSYmSWModGhpcyx0aGlzLmlzVmlzaWJsZSgpKTt0aGlzLkQmLTImJih0aGlzLkhhJiZMYyh0aGlzLCEwKSx0aGlzLkQmMzImJihhPXRoaXMuaSgpKSkmJihiPQp0aGlzLlp8fCh0aGlzLlo9bmV3IEopLGdjKGIsYSksQihCKEIoUWIodGhpcyksYiwia2V5Iix0aGlzLmFhKSxhLCJmb2N1cyIsdGhpcy5YYSksYSwiYmx1ciIsdGhpcy5RYSkpfTt2YXIgTGM9ZnVuY3Rpb24oYSxiKXt2YXIgYz1RYihhKSxkPWEuaSgpO2I/KEIoQihCKEIoYyxkLEsuZ2EsYS5zYSksZCxbSy5oYSxLLmZhXSxhLnZhKSxkLCJtb3VzZW92ZXIiLGEudWEpLGQsIm1vdXNlb3V0IixhLnRhKSxhLmNhIT1CYyYmQihjLGQsImNvbnRleHRtZW51IixhLmNhKSk6KEMoQyhDKEMoYyxkLEsuZ2EsYS5zYSksZCxbSy5oYSxLLmZhXSxhLnZhKSxkLCJtb3VzZW92ZXIiLGEudWEpLGQsIm1vdXNlb3V0IixhLnRhKSxhLmNhIT1CYyYmQyhjLGQsImNvbnRleHRtZW51IixhLmNhKSl9O04ucHJvdG90eXBlLlU9ZnVuY3Rpb24oKXtOLmwuVS5jYWxsKHRoaXMpO3RoaXMuWiYma2ModGhpcy5aKTt0aGlzLmlzVmlzaWJsZSgpJiZ0aGlzLmlzRW5hYmxlZCgpJiZJYyh0aGlzLCExKX07Ck4ucHJvdG90eXBlLkM9ZnVuY3Rpb24oKXtOLmwuQy5jYWxsKHRoaXMpO3RoaXMuWiYmKHRoaXMuWi5kaXNwb3NlKCksZGVsZXRlIHRoaXMuWik7ZGVsZXRlIHRoaXMudjt0aGlzLkZhPXRoaXMuaWE9bnVsbH07dmFyIEZjPWZ1bmN0aW9uKGEsYil7YS5pYT1ifTtOLnByb3RvdHlwZS5pc1Zpc2libGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5PYX07Ti5wcm90b3R5cGUuaXNFbmFibGVkPWZ1bmN0aW9uKCl7cmV0dXJuISh0aGlzLm0mMSl9O04ucHJvdG90eXBlLlg9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5oO2ImJnR5cGVvZiBiLmlzRW5hYmxlZD09ImZ1bmN0aW9uIiYmIWIuaXNFbmFibGVkKCl8fCFPKHRoaXMsMSwhYSl8fChhfHwoTWModGhpcywhMSksUCh0aGlzLCExKSksdGhpcy5pc1Zpc2libGUoKSYmSWModGhpcyxhKSxUKHRoaXMsMSwhYSwhMCkpfTt2YXIgUD1mdW5jdGlvbihhLGIpe08oYSwyLGIpJiZUKGEsMixiKX07Ck4ucHJvdG90eXBlLmlzQWN0aXZlPWZ1bmN0aW9uKCl7cmV0dXJuISEodGhpcy5tJjQpfTsKdmFyIE1jPWZ1bmN0aW9uKGEsYil7TyhhLDQsYikmJlQoYSw0LGIpfSxOYz1mdW5jdGlvbihhLGIpe08oYSw4LGIpJiZUKGEsOCxiKX0sT2M9ZnVuY3Rpb24oYSxiKXtPKGEsNjQsYikmJlQoYSw2NCxiKX0sVD1mdW5jdGlvbihhLGIsYyxkKXtpZighZCYmYj09MSlhLlgoIWMpO2Vsc2UgaWYoYS5EJmImJmMhPSEhKGEubSZiKSl7dmFyIGU9YS52O2lmKGQ9YS5pKCkpe2lmKGU9RWMoZSxiKSl7dmFyIGY9YS5pP2EuaSgpOmE7ZiYmKGM/cGM6cmMpKGYsW2VdKX1KYyhkLGIsYyl9YS5tPWM/YS5tfGI6YS5tJn5ifX0sUGM9ZnVuY3Rpb24oYSxiLGMpe2lmKGEucyYmYS5tJmImJiFjKXRocm93IEVycm9yKCJDb21wb25lbnQgYWxyZWFkeSByZW5kZXJlZCIpOyFjJiZhLm0mYiYmVChhLGIsITEpO2EuRD1jP2EuRHxiOmEuRCZ+Yn0sVT1mdW5jdGlvbihhLGIpe3JldHVybiEhKDI1NSZiKSYmISEoYS5EJmIpfSxPPWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4hIShhLkQmYikmJiEhKGEubSZiKSE9CmMmJighKGEuUCZiKXx8RShhLE5iKGIsYykpKSYmIWEuYmF9O04ucHJvdG90eXBlLnVhPWZ1bmN0aW9uKGEpeyFRYyhhLHRoaXMuaSgpKSYmRSh0aGlzLCJlbnRlciIpJiZ0aGlzLmlzRW5hYmxlZCgpJiZVKHRoaXMsMikmJlAodGhpcywhMCl9O04ucHJvdG90eXBlLnRhPWZ1bmN0aW9uKGEpeyFRYyhhLHRoaXMuaSgpKSYmRSh0aGlzLCJsZWF2ZSIpJiYoVSh0aGlzLDQpJiZNYyh0aGlzLCExKSxVKHRoaXMsMikmJlAodGhpcywhMSkpfTtOLnByb3RvdHlwZS5jYT1CYzt2YXIgUWM9ZnVuY3Rpb24oYSxiKXtyZXR1cm4hIWEucmVsYXRlZFRhcmdldCYmYWIoYixhLnJlbGF0ZWRUYXJnZXQpfTsKTi5wcm90b3R5cGUuc2E9ZnVuY3Rpb24oYSl7aWYodGhpcy5pc0VuYWJsZWQoKSYmKFUodGhpcywyKSYmUCh0aGlzLCEwKSwhKGEuaC5idXR0b24hPTB8fHYmJmEuY3RybEtleSkpKXtVKHRoaXMsNCkmJk1jKHRoaXMsITApO3ZhciBiO2lmKGI9dGhpcy52KXt2YXIgYztiPXRoaXMuRCYzMiYmKGM9dGhpcy5pKCkpP2RiKGMpJiZlYihjKTohMX1iJiZ0aGlzLmkoKS5mb2N1cygpfWEuaC5idXR0b24hPTB8fHYmJmEuY3RybEtleXx8YS5qKCl9O04ucHJvdG90eXBlLnZhPWZ1bmN0aW9uKGEpe3RoaXMuaXNFbmFibGVkKCkmJihVKHRoaXMsMikmJlAodGhpcywhMCksdGhpcy5pc0FjdGl2ZSgpJiZSYyh0aGlzLGEpJiZVKHRoaXMsNCkmJk1jKHRoaXMsITEpKX07CnZhciBSYz1mdW5jdGlvbihhLGIpe2lmKFUoYSwxNikpe3ZhciBjPSEoYS5tJjE2KTtPKGEsMTYsYykmJlQoYSwxNixjKX1VKGEsOCkmJk5jKGEsITApO1UoYSw2NCkmJk9jKGEsIShhLm0mNjQpKTtjPW5ldyB5KCJhY3Rpb24iLGEpO2ImJihjLmFsdEtleT1iLmFsdEtleSxjLmN0cmxLZXk9Yi5jdHJsS2V5LGMubWV0YUtleT1iLm1ldGFLZXksYy5zaGlmdEtleT1iLnNoaWZ0S2V5LGMuRz1iLkcsYy50aW1lU3RhbXA9Yi50aW1lU3RhbXApO3JldHVybiBFKGEsYyl9O04ucHJvdG90eXBlLlhhPWZ1bmN0aW9uKCl7VSh0aGlzLDMyKSYmTyh0aGlzLDMyLCEwKSYmVCh0aGlzLDMyLCEwKX07Ti5wcm90b3R5cGUuUWE9ZnVuY3Rpb24oKXtVKHRoaXMsNCkmJk1jKHRoaXMsITEpO1UodGhpcywzMikmJk8odGhpcywzMiwhMSkmJlQodGhpcywzMiwhMSl9OwpOLnByb3RvdHlwZS5hYT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5pc1Zpc2libGUoKSYmdGhpcy5pc0VuYWJsZWQoKSYmYS5nPT0xMyYmUmModGhpcyxhKT8oYS5qKCksYS52KCksITApOiExfTtpZih0eXBlb2YgTiE9PSJmdW5jdGlvbiIpdGhyb3cgRXJyb3IoIkludmFsaWQgY29tcG9uZW50IGNsYXNzICIrTik7aWYodHlwZW9mIE0hPT0iZnVuY3Rpb24iKXRocm93IEVycm9yKCJJbnZhbGlkIHJlbmRlcmVyIGNsYXNzICIrTSk7dmFyIFNjPW5hKE4pO3VjW1NjXT1NO3RjKCJnb29nLWNvbnRyb2wiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBOKG51bGwpfSk7dmFyIFY9ZnVuY3Rpb24oYSxiLGMpe0YuY2FsbCh0aGlzLGMpO3RoaXMuZWE9Ynx8dmMuVigpO3RoaXMuTD1hfHwidmVydGljYWwifTtuKFYsRik7Zz1WLnByb3RvdHlwZTtnLkthPW51bGw7Zy5kYT1udWxsO2cuZWE9bnVsbDtnLkw9bnVsbDtnLlM9ITA7Zy5UPSEwO2cubz0tMTtnLkI9bnVsbDtnLlc9ITE7Zy5PPW51bGw7dmFyIFRjPWZ1bmN0aW9uKGEpe3JldHVybiBhLkthfHxhLmkoKX07Zz1WLnByb3RvdHlwZTtnLm1hPWZ1bmN0aW9uKCl7dGhpcy5nPXRoaXMuRy5oKCJESVYiLHRoaXMuZWEuaih0aGlzKS5qb2luKCIgIikpfTtnLm5hPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaSgpfTtnLndhPWZ1bmN0aW9uKGEpe3JldHVybiBhLnRhZ05hbWU9PSJESVYifTtnLkVhPWZ1bmN0aW9uKGEpe3RoaXMuZz15Yyh0aGlzLmVhLHRoaXMsYSk7YS5zdHlsZS5kaXNwbGF5PT0ibm9uZSImJih0aGlzLlM9ITEpfTsKZy5JPWZ1bmN0aW9uKCl7Vi5sLkkuY2FsbCh0aGlzKTtUYih0aGlzLGZ1bmN0aW9uKGIpe2IucyYmVWModGhpcyxiKX0sdGhpcyk7dmFyIGE9dGhpcy5pKCk7QWModGhpcy5lYSx0aGlzKTtWYyh0aGlzLHRoaXMuUyk7QihCKEIoQihCKEIoQihCKFFiKHRoaXMpLHRoaXMsImVudGVyIix0aGlzLmViKSx0aGlzLCJoaWdobGlnaHQiLHRoaXMuZmIpLHRoaXMsInVuaGlnaGxpZ2h0Iix0aGlzLmxiKSx0aGlzLCJvcGVuIix0aGlzLmdiKSx0aGlzLCJjbG9zZSIsdGhpcy5iYiksYSxLLmdhLHRoaXMuV2EpLGJiKGEpLFtLLmhhLEsuZmFdLHRoaXMuY2IpLGEsW0suZ2EsSy5oYSxLLmZhLCJtb3VzZW92ZXIiLCJtb3VzZW91dCIsImNvbnRleHRtZW51Il0sdGhpcy5hYik7V2ModGhpcyl9O3ZhciBXYz1mdW5jdGlvbihhKXt2YXIgYj1RYihhKSxjPVRjKGEpO0IoQihCKGIsYywiZm9jdXMiLGEuUGEpLGMsImJsdXIiLGEuVWEpLGEuZGF8fChhLmRhPW5ldyBKKFRjKGEpKSksImtleSIsYS5WYSl9OwpnPVYucHJvdG90eXBlO2cuVT1mdW5jdGlvbigpe1hjKHRoaXMsLTEpO3RoaXMuQiYmT2ModGhpcy5CLCExKTt0aGlzLlc9ITE7Vi5sLlUuY2FsbCh0aGlzKX07Zy5DPWZ1bmN0aW9uKCl7Vi5sLkMuY2FsbCh0aGlzKTt0aGlzLmRhJiYodGhpcy5kYS5kaXNwb3NlKCksdGhpcy5kYT1udWxsKTt0aGlzLmVhPXRoaXMuQj10aGlzLk89dGhpcy5LYT1udWxsfTtnLmViPWZ1bmN0aW9uKCl7cmV0dXJuITB9OwpnLmZiPWZ1bmN0aW9uKGEpe3ZhciBiPVZiKHRoaXMsYS50YXJnZXQpO2lmKGI+LTEmJmIhPXRoaXMubyl7dmFyIGM9SSh0aGlzLHRoaXMubyk7YyYmUChjLCExKTt0aGlzLm89YjtjPUkodGhpcyx0aGlzLm8pO3RoaXMuVyYmTWMoYywhMCk7dGhpcy5CJiZjIT10aGlzLkImJihjLkQmNjQ/T2MoYywhMCk6T2ModGhpcy5CLCExKSl9Yj10aGlzLmkoKTtwKGIsIlRoZSBET00gZWxlbWVudCBmb3IgdGhlIGNvbnRhaW5lciBjYW5ub3QgYmUgbnVsbC4iKTthLnRhcmdldC5pKCkhPW51bGwmJmFjKGIsImFjdGl2ZWRlc2NlbmRhbnQiLGEudGFyZ2V0LmkoKS5pZCl9O2cubGI9ZnVuY3Rpb24oYSl7YS50YXJnZXQ9PUkodGhpcyx0aGlzLm8pJiYodGhpcy5vPS0xKTthPXRoaXMuaSgpO3AoYSwiVGhlIERPTSBlbGVtZW50IGZvciB0aGUgY29udGFpbmVyIGNhbm5vdCBiZSBudWxsLiIpO2EucmVtb3ZlQXR0cmlidXRlKCRiKCJhY3RpdmVkZXNjZW5kYW50IikpfTsKZy5nYj1mdW5jdGlvbihhKXsoYT1hLnRhcmdldCkmJmEhPXRoaXMuQiYmYS5oPT10aGlzJiYodGhpcy5CJiZPYyh0aGlzLkIsITEpLHRoaXMuQj1hKX07Zy5iYj1mdW5jdGlvbihhKXthLnRhcmdldD09dGhpcy5CJiYodGhpcy5CPW51bGwpO3ZhciBiPXRoaXMuaSgpLGM9YS50YXJnZXQuaSgpO2ImJmEudGFyZ2V0Lm0mMiYmYyYmKGE9IiIsYyYmKGE9Yy5pZCxwKGEsIlRoZSBhY3RpdmUgZWxlbWVudCBzaG91bGQgaGF2ZSBhbiBpZC4iKSksYWMoYiwiYWN0aXZlZGVzY2VuZGFudCIsYSkpfTtnLldhPWZ1bmN0aW9uKGEpe3RoaXMuVCYmKHRoaXMuVz0hMCk7dmFyIGI9VGModGhpcyk7YiYmZGIoYikmJmViKGIpP2IuZm9jdXMoKTphLmooKX07Zy5jYj1mdW5jdGlvbigpe3RoaXMuVz0hMX07CmcuYWI9ZnVuY3Rpb24oYSl7YTp7dmFyIGI9YS50YXJnZXQ7aWYodGhpcy5PKWZvcih2YXIgYz10aGlzLmkoKTtiJiZiIT09Yzspe3ZhciBkPWIuaWQ7aWYoZCBpbiB0aGlzLk8pe2I9dGhpcy5PW2RdO2JyZWFrIGF9Yj1iLnBhcmVudE5vZGV9Yj1udWxsfWlmKGIpc3dpdGNoKGEudHlwZSl7Y2FzZSBLLmdhOmIuc2EoYSk7YnJlYWs7Y2FzZSBLLmhhOmNhc2UgSy5mYTpiLnZhKGEpO2JyZWFrO2Nhc2UgIm1vdXNlb3ZlciI6Yi51YShhKTticmVhaztjYXNlICJtb3VzZW91dCI6Yi50YShhKTticmVhaztjYXNlICJjb250ZXh0bWVudSI6Yi5jYShhKX19O2cuUGE9ZnVuY3Rpb24oKXt9O2cuVWE9ZnVuY3Rpb24oKXtYYyh0aGlzLC0xKTt0aGlzLlc9ITE7dGhpcy5CJiZPYyh0aGlzLkIsITEpfTsKZy5WYT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5pc0VuYWJsZWQoKSYmdGhpcy5pc1Zpc2libGUoKSYmKEgodGhpcykhPTB8fHRoaXMuS2EpJiZZYyh0aGlzLGEpPyhhLmooKSxhLnYoKSwhMCk6ITF9Owp2YXIgWWM9ZnVuY3Rpb24oYSxiKXt2YXIgYz1JKGEsYS5vKTtpZihjJiZ0eXBlb2YgYy5hYT09ImZ1bmN0aW9uIiYmYy5hYShiKXx8YS5CJiZhLkIhPWMmJnR5cGVvZiBhLkIuYWE9PSJmdW5jdGlvbiImJmEuQi5hYShiKSlyZXR1cm4hMDtpZihiLnNoaWZ0S2V5fHxiLmN0cmxLZXl8fGIubWV0YUtleXx8Yi5hbHRLZXkpcmV0dXJuITE7c3dpdGNoKGIuZyl7Y2FzZSAyNzpUYyhhKS5ibHVyKCk7YnJlYWs7Y2FzZSAzNjpaYyhhKTticmVhaztjYXNlIDM1OiRjKGEpO2JyZWFrO2Nhc2UgMzg6aWYoYS5MPT0idmVydGljYWwiKWFkKGEpO2Vsc2UgcmV0dXJuITE7YnJlYWs7Y2FzZSAzNzppZihhLkw9PSJob3Jpem9udGFsIilVYihhKT9iZChhKTphZChhKTtlbHNlIHJldHVybiExO2JyZWFrO2Nhc2UgNDA6aWYoYS5MPT0idmVydGljYWwiKWJkKGEpO2Vsc2UgcmV0dXJuITE7YnJlYWs7Y2FzZSAzOTppZihhLkw9PSJob3Jpem9udGFsIilVYihhKT9hZChhKTpiZChhKTtlbHNlIHJldHVybiExOwpicmVhaztkZWZhdWx0OnJldHVybiExfXJldHVybiEwfSxVYz1mdW5jdGlvbihhLGIpe3ZhciBjPWIuaSgpO2M9Yy5pZHx8KGMuaWQ9T2IoYikpO2EuT3x8KGEuTz17fSk7YS5PW2NdPWJ9O1YucHJvdG90eXBlLkJhPWZ1bmN0aW9uKGEsYil7dWEoYSxOLCJUaGUgY2hpbGQgb2YgYSBjb250YWluZXIgbXVzdCBiZSBhIGNvbnRyb2wiKTtWLmwuQmEuY2FsbCh0aGlzLGEsYil9O1YucHJvdG90eXBlLkNhPWZ1bmN0aW9uKGEsYixjKXt1YShhLE4pO2EuUHw9MjthLlB8PTY0O1BjKGEsMzIsITEpO2EucyYmMCE9YS5IYSYmTGMoYSwhMSk7YS5IYT0hMTt2YXIgZD1hLmg9PXRoaXM/VmIodGhpcyxhKTotMTtWLmwuQ2EuY2FsbCh0aGlzLGEsYixjKTthLnMmJnRoaXMucyYmVWModGhpcyxhKTthPWQ7YT09LTEmJihhPUgodGhpcykpO2E9PXRoaXMubz90aGlzLm89TWF0aC5taW4oSCh0aGlzKS0xLGIpOmE+dGhpcy5vJiZiPD10aGlzLm8/dGhpcy5vKys6YTx0aGlzLm8mJmI+dGhpcy5vJiZ0aGlzLm8tLX07CnZhciB6Yz1mdW5jdGlvbihhLGIpe2lmKGEuaSgpKXRocm93IEVycm9yKCJDb21wb25lbnQgYWxyZWFkeSByZW5kZXJlZCIpO2EuTD1ifTtWLnByb3RvdHlwZS5pc1Zpc2libGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5TfTt2YXIgVmM9ZnVuY3Rpb24oYSxiKXthLlM9Yjt2YXIgYz1hLmkoKTtjJiYoYy5zdHlsZS5kaXNwbGF5PWI/IiI6Im5vbmUiLHdjKFRjKGEpLGEuVCYmYS5TKSl9O1YucHJvdG90eXBlLmlzRW5hYmxlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLlR9O1YucHJvdG90eXBlLlg9ZnVuY3Rpb24oYSl7dGhpcy5UIT1hJiZFKHRoaXMsYT8iZW5hYmxlIjoiZGlzYWJsZSIpJiYoYT8odGhpcy5UPSEwLFRiKHRoaXMsZnVuY3Rpb24oYil7Yi5UYT9kZWxldGUgYi5UYTpiLlgoITApfSkpOihUYih0aGlzLGZ1bmN0aW9uKGIpe2IuaXNFbmFibGVkKCk/Yi5YKCExKTpiLlRhPSEwfSksdGhpcy5XPXRoaXMuVD0hMSksd2MoVGModGhpcyksYSYmdGhpcy5TKSl9Owp2YXIgWGM9ZnVuY3Rpb24oYSxiKXsoYj1JKGEsYikpP1AoYiwhMCk6YS5vPi0xJiZQKEkoYSxhLm8pLCExKX0sWmM9ZnVuY3Rpb24oYSl7Y2QoYSxmdW5jdGlvbihiLGMpe3JldHVybihiKzEpJWN9LEgoYSktMSl9LCRjPWZ1bmN0aW9uKGEpe2NkKGEsZnVuY3Rpb24oYixjKXtiLS07cmV0dXJuIGI8MD9jLTE6Yn0sMCl9LGJkPWZ1bmN0aW9uKGEpe2NkKGEsZnVuY3Rpb24oYixjKXtyZXR1cm4oYisxKSVjfSxhLm8pfSxhZD1mdW5jdGlvbihhKXtjZChhLGZ1bmN0aW9uKGIsYyl7Yi0tO3JldHVybiBiPDA/Yy0xOmJ9LGEubyl9LGNkPWZ1bmN0aW9uKGEsYixjKXtjPWM8MD9WYihhLGEuQik6Yzt2YXIgZD1IKGEpO2M9Yi5jYWxsKGEsYyxkKTtmb3IodmFyIGU9MDtlPD1kOyl7dmFyIGY9SShhLGMpO2lmKGYmJmYuaXNWaXNpYmxlKCkmJmYuaXNFbmFibGVkKCkmJmYuRCYyKXthLkxhKGMpO2JyZWFrfWUrKztjPWIuY2FsbChhLGMsZCl9fTsKVi5wcm90b3R5cGUuTGE9ZnVuY3Rpb24oYSl7WGModGhpcyxhKX07dmFyIGRkPWZ1bmN0aW9uKCl7fTtuKGRkLE0pO2lhKGRkKTtnPWRkLnByb3RvdHlwZTtnLk49ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy10YWIifTtnLk5hPWZ1bmN0aW9uKCl7cmV0dXJuInRhYiJ9O2cueGE9ZnVuY3Rpb24oYSl7dmFyIGI9ZGQubC54YS5jYWxsKHRoaXMsYSk7KGE9YS5HYSgpKSYmdGhpcy5NYShiLGEpO3JldHVybiBifTtnLnlhPWZ1bmN0aW9uKGEsYil7Yj1kZC5sLnlhLmNhbGwodGhpcyxhLGIpO3ZhciBjPXRoaXMuR2EoYik7YyYmKGEuUmE9Yyk7YS5tJjgmJihjPWEuaCkmJnR5cGVvZiBjLko9PT0iZnVuY3Rpb24iJiYoVChhLDgsITEpLGMuSihhKSk7cmV0dXJuIGJ9O2cuR2E9ZnVuY3Rpb24oYSl7cmV0dXJuIGEudGl0bGV8fCIifTtnLk1hPWZ1bmN0aW9uKGEsYil7YSYmKGEudGl0bGU9Ynx8IiIpfTt2YXIgZWQ9ZnVuY3Rpb24oYSxiLGMpe04uY2FsbCh0aGlzLGEsYnx8ZGQuVigpLGMpO1BjKHRoaXMsOCwhMCk7dGhpcy5QfD05fTtuKGVkLE4pO2VkLnByb3RvdHlwZS5HYT1mdW5jdGlvbigpe3JldHVybiB0aGlzLlJhfTtlZC5wcm90b3R5cGUuTWE9ZnVuY3Rpb24oYSl7dGhpcy52Lk1hKHRoaXMuaSgpLGEpO3RoaXMuUmE9YX07dGMoImdvb2ctdGFiIixmdW5jdGlvbigpe3JldHVybiBuZXcgZWQobnVsbCl9KTt2YXIgVz1mdW5jdGlvbigpe3RoaXMuQT0idGFibGlzdCJ9O24oVyx2Yyk7aWEoVyk7Vy5wcm90b3R5cGUuZz1mdW5jdGlvbigpe3JldHVybiJnb29nLXRhYi1iYXIifTtXLnByb3RvdHlwZS51PWZ1bmN0aW9uKGEsYixjKXt0aGlzLnZ8fCh0aGlzLmh8fGZkKHRoaXMpLHRoaXMudj1FYSh0aGlzLmgpKTt2YXIgZD10aGlzLnZbYl07ZD8oemMoYSxnZChkKSksYS52PWQpOlcubC51LmNhbGwodGhpcyxhLGIsYyl9O1cucHJvdG90eXBlLmo9ZnVuY3Rpb24oYSl7dmFyIGI9Vy5sLmouY2FsbCh0aGlzLGEpO3RoaXMuaHx8ZmQodGhpcyk7Yi5wdXNoKHRoaXMuaFthLnZdKTtyZXR1cm4gYn07dmFyIGZkPWZ1bmN0aW9uKGEpe3ZhciBiPWEuZygpO2EuaD17dG9wOmIrIi10b3AiLGJvdHRvbTpiKyItYm90dG9tIixzdGFydDpiKyItc3RhcnQiLGVuZDpiKyItZW5kIn19O3ZhciBYPWZ1bmN0aW9uKGEsYixjKXthPWF8fCJ0b3AiO3pjKHRoaXMsZ2QoYSkpO3RoaXMudj1hO1YuY2FsbCh0aGlzLHRoaXMuTCxifHxXLlYoKSxjKTtoZCh0aGlzKX07bihYLFYpO2c9WC5wcm90b3R5cGU7Zy5IPW51bGw7Zy5JPWZ1bmN0aW9uKCl7WC5sLkkuY2FsbCh0aGlzKTtoZCh0aGlzKX07Zy5DPWZ1bmN0aW9uKCl7WC5sLkMuY2FsbCh0aGlzKTt0aGlzLkg9bnVsbH07Zy5MYT1mdW5jdGlvbihhKXtYLmwuTGEuY2FsbCh0aGlzLGEpO3RoaXMuSihJKHRoaXMsYSkpfTtnLko9ZnVuY3Rpb24oYSl7YT9OYyhhLCEwKTp0aGlzLkgmJk5jKHRoaXMuSCwhMSl9Owp2YXIgaWQ9ZnVuY3Rpb24oYSxiKXtpZihiJiZiPT1hLkgpe2Zvcih2YXIgYz1WYihhLGIpLGQ9Yy0xO2I9SShhLGQpO2QtLSl7dmFyIGU9YjtpZihlLmlzVmlzaWJsZSgpJiZlLmlzRW5hYmxlZCgpKXthLkooYik7cmV0dXJufX1mb3IoYys9MTtiPUkoYSxjKTtjKyspaWYoZD1iLGQuaXNWaXNpYmxlKCkmJmQuaXNFbmFibGVkKCkpe2EuSihiKTtyZXR1cm59YS5KKG51bGwpfX07Zz1YLnByb3RvdHlwZTtnLmpiPWZ1bmN0aW9uKGEpe3RoaXMuSCYmdGhpcy5IIT1hLnRhcmdldCYmTmModGhpcy5ILCExKTt0aGlzLkg9YS50YXJnZXR9O2cua2I9ZnVuY3Rpb24oYSl7YS50YXJnZXQ9PXRoaXMuSCYmKHRoaXMuSD1udWxsKX07Zy5oYj1mdW5jdGlvbihhKXtpZCh0aGlzLGEudGFyZ2V0KX07Zy5pYj1mdW5jdGlvbihhKXtpZCh0aGlzLGEudGFyZ2V0KX07Zy5QYT1mdW5jdGlvbigpe0kodGhpcyx0aGlzLm8pfHxYYyh0aGlzLFZiKHRoaXMsdGhpcy5IfHxJKHRoaXMsMCkpKX07CnZhciBoZD1mdW5jdGlvbihhKXtCKEIoQihCKFFiKGEpLGEsInNlbGVjdCIsYS5qYiksYSwidW5zZWxlY3QiLGEua2IpLGEsImRpc2FibGUiLGEuaGIpLGEsImhpZGUiLGEuaWIpfSxnZD1mdW5jdGlvbihhKXtyZXR1cm4gYT09InN0YXJ0Inx8YT09ImVuZCI/InZlcnRpY2FsIjoiaG9yaXpvbnRhbCJ9O3RjKCJnb29nLXRhYi1iYXIiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBYfSk7ZnVuY3Rpb24gamQoYSl7dmFyIGI9e3RvcDoiYm90dG9tIixib3R0b206InRvcCIsc3RhcnQ6InJpZ2h0IixlbmQ6ImxlZnQifVthLmxvY2F0aW9uXSxjPWEuZWxlbWVudElkLGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTtkLnRleHRDb250ZW50PSJcbiAgICBmaWVsZHNldCB7XG4gICAgICBwYWRkaW5nOiAxMHB4O1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgIzM2OTtcbiAgICB9XG5cbiAgICAjIitjKyIgLmdvb2ctdGFiLWNvbnRlbnQge1xuICAgICAgbWluLWhlaWdodDogM2VtO1xuICAgICAgbWFyZ2luOiAwO1xuICAgICAgYm9yZGVyOiAiK2EuYm9yZGVyKyIgc29saWQgIithLmJvcmRlckNvbG9yKyI7XG4gICAgICBib3JkZXItdG9wOiAwO1xuICAgICAgaGVpZ2h0OiAiK2EuY29udGVudEhlaWdodCsiO1xuICAgICAgcGFkZGluZzogNHB4IDhweDtcbiAgICAgIG1hcmdpbi1yaWdodDogNHB4O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgIG92ZXJmbG93OiBhdXRvO1xuICAgIH1cblxuICAgICMiKwpjKyIgLmdvb2ctdGFiLWJhci0iK2EubG9jYXRpb24rIiAuZ29vZy10YWItc2VsZWN0ZWQge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICIrYS5ib3JkZXJDb2xvcisiO1xuICAgICAgYm9yZGVyLSIrYisiOiAwcHg7XG4gICAgfVxuXG4gICAgIyIrYysiIC5nb29nLXRhYi1iYXItIithLmxvY2F0aW9uKyIge1xuICAgICAgcGFkZGluZy0iK2EubG9jYXRpb24rIjogNXB4ICFpbXBvcnRhbnQ7XG4gICAgICBib3JkZXItIitiKyI6IDFweCBzb2xpZCAiK2EuYm9yZGVyQ29sb3IrIiAhaW1wb3J0YW50O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICB9XG5cbiAgICAjIitjKyIgLmdvb2ctdGFiLWJhciB7XG4gICAgICAgbWFyZ2luOiAwO1xuICAgICAgIGJvcmRlcjogMDtcbiAgICAgICBwYWRkaW5nOiAwO1xuICAgICAgIGxpc3Qtc3R5bGU6IG5vbmU7XG4gICAgICAgY3Vyc29yOiBkZWZhdWx0O1xuICAgICAgIG91dGxpbmU6IG5vbmU7XG4gICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgICBtYXJnaW4tcmlnaHQ6IDRweDtcbiAgICAgIH1cblxuICAgICAjIisKYysiIC5nb29nLXRhYiB7XG4gICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgIHBhZGRpbmc6IDRweCA4cHg7XG4gICAgICAgY29sb3I6IHZhcigtLWNvbGFiLXByaW1hcnktdGV4dC1jb2xvcik7XG4gICAgICAgdGV4dC1kZWNvcmF0aW9uOiBpbml0aWFsO1xuICAgICAgIGN1cnNvcjogZGVmYXVsdDtcbiAgICAgIH1cblxuICAgICAgIyIrYysiIC5nb29nLXRhYi1ob3ZlciB7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWNvbGFiLWhpZ2hsaWdodGVkLXN1cmZhY2UtY29sb3IpO1xuICAgICAgfVxuICAgICAgIjtyZXR1cm4gZH0KdmFyIGtkPWZ1bmN0aW9uKGEpe3ZhciBiPWEuZWxlbWVudElkLGM9YS50YWJOYW1lcyxkPWEuc2VsZWN0ZWRJbmRleDsiY29udGVudEJvcmRlciJpbiBhfHwoYS5jb250ZW50Qm9yZGVyPSIwcHgiKTsiY29udGVudEhlaWdodCJpbiBhfHwoYS5jb250ZW50SGVpZ2h0PSJpbml0aWFsIik7ImJvcmRlckNvbG9yImluIGF8fChhLmJvcmRlckNvbG9yPSJ2YXIoLS1jb2xhYi1ib3JkZXItY29sb3IpIik7YS5sb2NhdGlvbnx8KGEubG9jYXRpb249InRvcCIpO3ZhciBlPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiMiK2IpLGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zi5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYi1iYXIiKTt2YXIgaD1hLmxvY2F0aW9uO2YuY2xhc3NMaXN0LmFkZCgiZ29vZy10YWItYmFyLSIraCk7Zm9yKHZhciBrPVtdLHE9ZmEoYyksRz1xLm5leHQoKTshRy5kb25lO0c9cS5uZXh0KCkpe0c9Ry52YWx1ZTt2YXIgeD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKeC5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYiIpO3gudGV4dENvbnRlbnQ9RztmLmFwcGVuZENoaWxkKHgpO2sucHVzaCh4KX1oIT0iYm90dG9tIiYmZS5hcHBlbmRDaGlsZChmKTtxPW51bGw7aWYoaD09InRvcCJ8fGg9PSJib3R0b20iKXE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikscS5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYi1iYXItY2xlYXIiKTtoPT0idG9wIiYmcSYmZS5hcHBlbmRDaGlsZChxKTtHPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO0cuY2xhc3NMaXN0LmFkZCgiZ29vZy10YWItY29udGVudCIpO3ZhciBoYT1bXTtjPWZhKGMpO2Zvcih4PWMubmV4dCgpOyF4LmRvbmU7eD1jLm5leHQoKSl4PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHguaWQ9ZS5pZCsiX2NvbnRlbnRfIitoYS5sZW5ndGgseC5zdHlsZS5kaXNwbGF5PSJub25lIixHLmFwcGVuZENoaWxkKHgpLGhhLnB1c2goeCk7ZS5hcHBlbmRDaGlsZChHKTtoPT0iYm90dG9tIiYmKHEmJgplLmFwcGVuZENoaWxkKHEpLGUuYXBwZW5kQ2hpbGQoZikpO3ZhciBRPW5ldyBYKGgpO1NiKFEsZik7dmFyIFI9LTE7d2IoUSwic2VsZWN0IixmdW5jdGlvbihTKXtTPWsuaW5kZXhPZihTLnRhcmdldC5pKCkpO1MhPVImJihSPj0wJiZSPGhhLmxlbmd0aCYmKGhhW1JdLnN0eWxlLmRpc3BsYXk9Im5vbmUiLFI9LTEpLFM+PTAmJlM8aGEubGVuZ3RoJiYoUj1TLGhhW1JdLnN0eWxlLmRpc3BsYXk9ImlubGluZSIsd2luZG93LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCJyZXNpemUiKSksZ29vZ2xlLmNvbGFiLm91dHB1dC5yZXNpemVJZnJhbWVUb0NvbnRlbnQoKSksUS5KKEkoUSxSKSkpfSk7US5KKEkoUSxkKSk7d2luZG93W2JdPXtzZXRTZWxlY3RlZFRhYkluZGV4OmZ1bmN0aW9uKFMpe1EuSihJKFEsUykpfX07ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChqZChhKSl9LGxkPVsiY29sYWJfbGliIiwiY3JlYXRlVGFiQmFyIl0sWT1sOwpsZFswXWluIFl8fHR5cGVvZiBZLmV4ZWNTY3JpcHQ9PSJ1bmRlZmluZWQifHxZLmV4ZWNTY3JpcHQoInZhciAiK2xkWzBdKTtmb3IodmFyIFo7bGQubGVuZ3RoJiYoWj1sZC5zaGlmdCgpKTspbGQubGVuZ3RofHxrZD09PXZvaWQgMD9ZW1pdJiZZW1pdIT09T2JqZWN0LnByb3RvdHlwZVtaXT9ZPVlbWl06WT1ZW1pdPXt9OllbWl09a2Q7fSkuY2FsbCh0aGlzKTsKLy8gY2xhbmctZm9ybWF0IG9uCg==", + "ok": true, + "headers": [ + [ + "content-length", + "41785" + ], + [ + "content-type", + "application/javascript" + ] + ], + "status": 200, + "status_text": "" + } + }, + "base_uri": "https://localhost:8080/", + "height": 260 + }, + "outputId": "885cb1c5-de08-4ef6-de29-ecc6d92bf376" + }, + "source": [ + "%%logica ByRoleCount\n", + "\n", + "Employee(name: \"Alice\", role: \"Product Manager\", office: \"SEA\");\n", + "Employee(name: \"Bob\", role: \"Engineer\", office: \"SEA\");\n", + "Employee(name: \"Caroline\", role: \"Engineer\", office: \"LAX\");\n", + "Employee(name: \"David\", role: \"Data Scientist\", office: \"LAX\");\n", + "Employee(name: \"Eve\", role: \"Data Scientist\", office: \"SEA\");\n", + "\n", + "ByRoleCount(role:, count? += 1) distinct :- Employee(role:);" + ], + "execution_count": 17, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fb5c716e-d22c-11ef-a7c0-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id28\", \"tabNames\": [\"ByRoleCount\", \"(Log)\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_7bf789b83a" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fb5ce158-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id28\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_9f6ef5bbb4" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fb5ec4aa-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_b40c3b3038" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fb5f4c40-d22c-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id28_content_1\");\n", + "//# sourceURL=js_d0a836d20b" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fb606ca6-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"fb5f4c40-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_3c51e35191" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fb60df56-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id28\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_506a78f79e" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fb649218-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"fb5ec4aa-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_e630879c20" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fb679b02-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_bca86c60a7" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fb682478-d22c-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id28_content_0\");\n", + "//# sourceURL=js_b4b208386d" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fb68ab96-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"fb682478-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_efaab9f79e" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fb692436-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id28\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_c2f403ff6b" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fb6bf030-d22c-11ef-a7c0-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id29\", \"tabNames\": [\"SQL\", \"Result\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_712b784456" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fb6c5138-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id29\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_271480a380" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fb6e48bc-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_2f447a86d0" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fb6e9aa6-d22c-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id29_content_0\");\n", + "//# sourceURL=js_f9c2b1bc22" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fb6ef258-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"fb6e9aa6-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_f808c08b45" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fb6f4136-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id29\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_dab6ee2d0a" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The following query is stored at \u001b[1mByRoleCount_sql\u001b[0m variable.\n", + "-- Initializing DuckDB environment.\n", + "create schema if not exists logica_home;\n", + "-- Empty record, has to have a field by DuckDB syntax.\n", + "drop type if exists logicarecord893574736 cascade; create type logicarecord893574736 as struct(nirvana numeric);\n", + "create sequence if not exists eternal_logical_sequence;\n", + "\n", + "\n", + "-- Logica type: logicarecord481217614\n", + "drop type if exists logicarecord481217614 cascade; create type logicarecord481217614 as struct(r logicarecord893574736);\n", + "\n", + "-- Logica type: logicarecord383307722\n", + "drop type if exists logicarecord383307722 cascade; create type logicarecord383307722 as struct(a timestamp);\n", + "WITH t_0_Employee AS (SELECT * FROM (\n", + " \n", + " SELECT\n", + " 'Alice' AS name,\n", + " 'Product Manager' AS role,\n", + " 'SEA' AS office\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " 'Bob' AS name,\n", + " 'Engineer' AS role,\n", + " 'SEA' AS office\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " 'Caroline' AS name,\n", + " 'Engineer' AS role,\n", + " 'LAX' AS office\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " 'David' AS name,\n", + " 'Data Scientist' AS role,\n", + " 'LAX' AS office\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " 'Eve' AS name,\n", + " 'Data Scientist' AS role,\n", + " 'SEA' AS office\n", + " \n", + ") AS UNUSED_TABLE_NAME )\n", + "SELECT\n", + " Employee.role AS role,\n", + " SUM(1) AS count\n", + "FROM\n", + " t_0_Employee AS Employee\n", + "GROUP BY Employee.role;\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fb70c4ac-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"fb6e48bc-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_febc2dff61" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fb72d760-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_7a84a4de0e" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fb7331ba-d22c-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id29_content_1\");\n", + "//# sourceURL=js_0f358d311f" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fb73849e-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"fb7331ba-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_d991f4ca72" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fb73d516-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id29\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_f71dbc9412" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The following table is stored at \u001b[1mByRoleCount\u001b[0m variable.\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
rolecount
0Engineer2
1Product Manager1
2Data Scientist2
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fb755846-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"fb72d760-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_2e8ad83f1c" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fb769c9c-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"fb679b02-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_1bf975dfe3" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fb792980-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_d3f7428d6c" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fb7975f2-d22c-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id28_content_1\");\n", + "//# sourceURL=js_2c906c3264" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fb79bfb2-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"fb7975f2-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_2bb644644b" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fb7a060c-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id28\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_992fcc6ba4" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "image/svg+xml": "\n\n\n\n\n\nConcertina\n\n\n\nByRoleCount\n\nByRoleCount\n\n\n\n", + "text/plain": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Running predicate: ByRoleCount (13 ms)\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fb937a06-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"fb792980-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_42addb8cd1" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fb95e7fa-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_c86105110a" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fb9656fe-d22c-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id28_content_0\");\n", + "//# sourceURL=js_b09f6efd42" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fb96bce8-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"fb9656fe-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_e875381664" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fb971396-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id28\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_b621b6d28b" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fb986d54-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_e8c2aadffe" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fb98c736-d22c-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id29_content_1\");\n", + "//# sourceURL=js_acb4d57740" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fb992cf8-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"fb98c736-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_edef18b83f" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fb997f28-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id29\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_386be87422" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fb9babb8-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"fb986d54-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_a79676650a" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + " \n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fb9da9fe-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"fb95e7fa-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_bf0e553712" + ] + }, + "metadata": {} + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "CNzHg4u4tHfO" + }, + "source": [ + "If no aggregated columns are specified then keyword `distinct` naturally leads to making a predicate to be a list\n", + "of distinct rows.\n", + "\n", + "Logica implements native `+`, `List`, `Set` and `Count` aggregators. You can also call any StandardSQL aggregation (converting it to camelcase)." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "PviQQX34tMVJ", + "colab": { + "resources": { + "http://localhost:8080/nbextensions/google.colab/tabbar.css": { + "data": "Lmdvb2ctdGFie3Bvc2l0aW9uOnJlbGF0aXZlO3BhZGRpbmc6NHB4IDhweDtjb2xvcjojMDBjO3RleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7Y3Vyc29yOmRlZmF1bHR9Lmdvb2ctdGFiLWJhci10b3AgLmdvb2ctdGFie21hcmdpbjoxcHggNHB4IDAgMDtib3JkZXItYm90dG9tOjA7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLXRvcDphZnRlciwuZ29vZy10YWItYmFyLWJvdHRvbTphZnRlcntjb250ZW50OiIgIjtkaXNwbGF5OmJsb2NrO2hlaWdodDowO2NsZWFyOmJvdGg7dmlzaWJpbGl0eTpoaWRkZW59Lmdvb2ctdGFiLWJhci1ib3R0b20gLmdvb2ctdGFie21hcmdpbjowIDRweCAxcHggMDtib3JkZXItdG9wOjA7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLXN0YXJ0IC5nb29nLXRhYnttYXJnaW46MCAwIDRweCAxcHg7Ym9yZGVyLXJpZ2h0OjB9Lmdvb2ctdGFiLWJhci1lbmQgLmdvb2ctdGFie21hcmdpbjowIDFweCA0cHggMDtib3JkZXItbGVmdDowfS5nb29nLXRhYi1ob3ZlcntiYWNrZ3JvdW5kOiNlZWV9Lmdvb2ctdGFiLWRpc2FibGVke2NvbG9yOiM2NjZ9Lmdvb2ctdGFiLXNlbGVjdGVke2NvbG9yOiMwMDA7YmFja2dyb3VuZDojZmZmO3RleHQtZGVjb3JhdGlvbjpub25lO2ZvbnQtd2VpZ2h0OmJvbGQ7Ym9yZGVyOjFweCBzb2xpZCAjNmI5MGRhfS5nb29nLXRhYi1iYXItdG9we3BhZGRpbmctdG9wOjVweCFpbXBvcnRhbnQ7cGFkZGluZy1sZWZ0OjVweCFpbXBvcnRhbnQ7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgIzZiOTBkYSFpbXBvcnRhbnR9Lmdvb2ctdGFiLWJhci10b3AgLmdvb2ctdGFiLXNlbGVjdGVke3RvcDoxcHg7bWFyZ2luLXRvcDowO3BhZGRpbmctYm90dG9tOjVweH0uZ29vZy10YWItYmFyLWJvdHRvbSAuZ29vZy10YWItc2VsZWN0ZWR7dG9wOi0xcHg7bWFyZ2luLWJvdHRvbTowO3BhZGRpbmctdG9wOjVweH0uZ29vZy10YWItYmFyLXN0YXJ0IC5nb29nLXRhYi1zZWxlY3RlZHtsZWZ0OjFweDttYXJnaW4tbGVmdDowO3BhZGRpbmctcmlnaHQ6OXB4fS5nb29nLXRhYi1iYXItZW5kIC5nb29nLXRhYi1zZWxlY3RlZHtsZWZ0Oi0xcHg7bWFyZ2luLXJpZ2h0OjA7cGFkZGluZy1sZWZ0OjlweH0uZ29vZy10YWItYmFye21hcmdpbjowO2JvcmRlcjowO3BhZGRpbmc6MDtsaXN0LXN0eWxlOm5vbmU7Y3Vyc29yOmRlZmF1bHQ7b3V0bGluZTpub25lO2JhY2tncm91bmQ6I2ViZWZmOX0uZ29vZy10YWItYmFyLWNsZWFye2NsZWFyOmJvdGg7aGVpZ2h0OjA7b3ZlcmZsb3c6aGlkZGVufS5nb29nLXRhYi1iYXItc3RhcnR7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLWVuZHtmbG9hdDpyaWdodH0qIGh0bWwgLmdvb2ctdGFiLWJhci1zdGFydHttYXJnaW4tcmlnaHQ6LTNweH0qIGh0bWwgLmdvb2ctdGFiLWJhci1lbmR7bWFyZ2luLWxlZnQ6LTNweH1zZW50aW5lbHt9", + "ok": true, + "headers": [ + [ + "content-length", + "1404" + ], + [ + "content-type", + "text/css" + ] + ], + "status": 200, + "status_text": "" + }, + "http://localhost:8080/nbextensions/google.colab/tabbar_main.min.js": { + "data": "Ly8gY2xhbmctZm9ybWF0IG9mZgooZnVuY3Rpb24oKXt2YXIgZyxhYT1mdW5jdGlvbihhKXt2YXIgYj0wO3JldHVybiBmdW5jdGlvbigpe3JldHVybiBiPGEubGVuZ3RoP3tkb25lOiExLHZhbHVlOmFbYisrXX06e2RvbmU6ITB9fX0sYmE9dHlwZW9mIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzPT0iZnVuY3Rpb24iP09iamVjdC5kZWZpbmVQcm9wZXJ0eTpmdW5jdGlvbihhLGIsYyl7aWYoYT09QXJyYXkucHJvdG90eXBlfHxhPT1PYmplY3QucHJvdG90eXBlKXJldHVybiBhO2FbYl09Yy52YWx1ZTtyZXR1cm4gYX0sY2E9ZnVuY3Rpb24oYSl7YT1bIm9iamVjdCI9PXR5cGVvZiBnbG9iYWxUaGlzJiZnbG9iYWxUaGlzLGEsIm9iamVjdCI9PXR5cGVvZiB3aW5kb3cmJndpbmRvdywib2JqZWN0Ij09dHlwZW9mIHNlbGYmJnNlbGYsIm9iamVjdCI9PXR5cGVvZiBnbG9iYWwmJmdsb2JhbF07Zm9yKHZhciBiPTA7YjxhLmxlbmd0aDsrK2Ipe3ZhciBjPWFbYl07aWYoYyYmYy5NYXRoPT1NYXRoKXJldHVybiBjfXRocm93IEVycm9yKCJDYW5ub3QgZmluZCBnbG9iYWwgb2JqZWN0Iik7Cn0sZGE9Y2EodGhpcyksZWE9ZnVuY3Rpb24oYSxiKXtpZihiKWE6e3ZhciBjPWRhO2E9YS5zcGxpdCgiLiIpO2Zvcih2YXIgZD0wO2Q8YS5sZW5ndGgtMTtkKyspe3ZhciBlPWFbZF07aWYoIShlIGluIGMpKWJyZWFrIGE7Yz1jW2VdfWE9YVthLmxlbmd0aC0xXTtkPWNbYV07Yj1iKGQpO2IhPWQmJmIhPW51bGwmJmJhKGMsYSx7Y29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOmJ9KX19OwplYSgiU3ltYm9sIixmdW5jdGlvbihhKXtpZihhKXJldHVybiBhO3ZhciBiPWZ1bmN0aW9uKGYsaCl7dGhpcy5nPWY7YmEodGhpcywiZGVzY3JpcHRpb24iLHtjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6aH0pfTtiLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmd9O3ZhciBjPSJqc2NvbXBfc3ltYm9sXyIrKE1hdGgucmFuZG9tKCkqMUU5Pj4+MCkrIl8iLGQ9MCxlPWZ1bmN0aW9uKGYpe2lmKHRoaXMgaW5zdGFuY2VvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoIlN5bWJvbCBpcyBub3QgYSBjb25zdHJ1Y3RvciIpO3JldHVybiBuZXcgYihjKyhmfHwiIikrIl8iK2QrKyxmKX07cmV0dXJuIGV9KTsKdmFyIGZhPWZ1bmN0aW9uKGEpe3ZhciBiPXR5cGVvZiBTeW1ib2whPSJ1bmRlZmluZWQiJiZTeW1ib2wuaXRlcmF0b3ImJmFbU3ltYm9sLml0ZXJhdG9yXTtpZihiKXJldHVybiBiLmNhbGwoYSk7aWYodHlwZW9mIGEubGVuZ3RoPT0ibnVtYmVyIilyZXR1cm57bmV4dDphYShhKX07dGhyb3cgRXJyb3IoU3RyaW5nKGEpKyIgaXMgbm90IGFuIGl0ZXJhYmxlIG9yIEFycmF5TGlrZSIpO307ZWEoIlN5bWJvbC5kaXNwb3NlIixmdW5jdGlvbihhKXtyZXR1cm4gYT9hOlN5bWJvbCgiU3ltYm9sLmRpc3Bvc2UiKX0pOy8qCgogQ29weXJpZ2h0IFRoZSBDbG9zdXJlIExpYnJhcnkgQXV0aG9ycy4KIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wCiovCnZhciBsPXRoaXN8fHNlbGYsaWE9ZnVuY3Rpb24oYSl7YS5JYT12b2lkIDA7YS5WPWZ1bmN0aW9uKCl7cmV0dXJuIGEuSWE/YS5JYTphLklhPW5ldyBhfX0samE9ZnVuY3Rpb24oYSl7dmFyIGI9dHlwZW9mIGE7cmV0dXJuIGIhPSJvYmplY3QiP2I6YT9BcnJheS5pc0FycmF5KGEpPyJhcnJheSI6YjoibnVsbCJ9LGthPWZ1bmN0aW9uKGEpe3ZhciBiPWphKGEpO3JldHVybiBiPT0iYXJyYXkifHxiPT0ib2JqZWN0IiYmdHlwZW9mIGEubGVuZ3RoPT0ibnVtYmVyIn0sbT1mdW5jdGlvbihhKXt2YXIgYj10eXBlb2YgYTtyZXR1cm4gYj09Im9iamVjdCImJmEhPW51bGx8fGI9PSJmdW5jdGlvbiJ9LG5hPWZ1bmN0aW9uKGEpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYSxsYSkmJmFbbGFdfHwoYVtsYV09KyttYSl9LGxhPSJjbG9zdXJlX3VpZF8iKyhNYXRoLnJhbmRvbSgpKjFFOT4+PjApLG1hPTAsbj1mdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoKXt9Yy5wcm90b3R5cGU9CmIucHJvdG90eXBlO2EubD1iLnByb3RvdHlwZTthLnByb3RvdHlwZT1uZXcgYzthLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1hO2EucWQ9ZnVuY3Rpb24oZCxlLGYpe2Zvcih2YXIgaD1BcnJheShhcmd1bWVudHMubGVuZ3RoLTIpLGs9MjtrPGFyZ3VtZW50cy5sZW5ndGg7aysrKWhbay0yXT1hcmd1bWVudHNba107cmV0dXJuIGIucHJvdG90eXBlW2VdLmFwcGx5KGQsaCl9fTtmdW5jdGlvbiBvYShhLGIpe2lmKEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKUVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsb2EpO2Vsc2V7dmFyIGM9RXJyb3IoKS5zdGFjaztjJiYodGhpcy5zdGFjaz1jKX1hJiYodGhpcy5tZXNzYWdlPVN0cmluZyhhKSk7YiE9PXZvaWQgMCYmKHRoaXMuY2F1c2U9Yil9bihvYSxFcnJvcik7b2EucHJvdG90eXBlLm5hbWU9IkN1c3RvbUVycm9yIjt2YXIgcGE7ZnVuY3Rpb24gcWEoYSxiKXthPWEuc3BsaXQoIiVzIik7Zm9yKHZhciBjPSIiLGQ9YS5sZW5ndGgtMSxlPTA7ZTxkO2UrKyljKz1hW2VdKyhlPGIubGVuZ3RoP2JbZV06IiVzIik7b2EuY2FsbCh0aGlzLGMrYVtkXSl9bihxYSxvYSk7cWEucHJvdG90eXBlLm5hbWU9IkFzc2VydGlvbkVycm9yIjtmdW5jdGlvbiByYShhLGIsYyxkKXt2YXIgZT0iQXNzZXJ0aW9uIGZhaWxlZCI7aWYoYyl7ZSs9IjogIitjO3ZhciBmPWR9ZWxzZSBhJiYoZSs9IjogIithLGY9Yik7dGhyb3cgbmV3IHFhKCIiK2UsZnx8W10pO30KdmFyIHA9ZnVuY3Rpb24oYSxiLGMpe2F8fHJhKCIiLG51bGwsYixBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMikpO3JldHVybiBhfSxzYT1mdW5jdGlvbihhLGIsYyl7bShhKSYmYS5ub2RlVHlwZT09MXx8cmEoIkV4cGVjdGVkIEVsZW1lbnQgYnV0IGdvdCAlczogJXMuIixbamEoYSksYV0sYixBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMikpfSx1YT1mdW5jdGlvbihhLGIsYyxkKXthIGluc3RhbmNlb2YgYnx8cmEoIkV4cGVjdGVkIGluc3RhbmNlb2YgJXMgYnV0IGdvdCAlcy4iLFt0YShiKSx0YShhKV0sYyxBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMykpfTsKZnVuY3Rpb24gdGEoYSl7cmV0dXJuIGEgaW5zdGFuY2VvZiBGdW5jdGlvbj9hLmRpc3BsYXlOYW1lfHxhLm5hbWV8fCJ1bmtub3duIHR5cGUgbmFtZSI6YSBpbnN0YW5jZW9mIE9iamVjdD9hLmNvbnN0cnVjdG9yLmRpc3BsYXlOYW1lfHxhLmNvbnN0cnVjdG9yLm5hbWV8fE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhKTphPT09bnVsbD8ibnVsbCI6dHlwZW9mIGF9O3ZhciB2YT1BcnJheS5wcm90b3R5cGUuaW5kZXhPZj9mdW5jdGlvbihhLGIpe3AoYS5sZW5ndGghPW51bGwpO3JldHVybiBBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKGEsYix2b2lkIDApfTpmdW5jdGlvbihhLGIpe2lmKHR5cGVvZiBhPT09InN0cmluZyIpcmV0dXJuIHR5cGVvZiBiIT09InN0cmluZyJ8fGIubGVuZ3RoIT0xPy0xOmEuaW5kZXhPZihiLDApO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWlmKGMgaW4gYSYmYVtjXT09PWIpcmV0dXJuIGM7cmV0dXJuLTF9LHdhPUFycmF5LnByb3RvdHlwZS5mb3JFYWNoP2Z1bmN0aW9uKGEsYil7cChhLmxlbmd0aCE9bnVsbCk7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChhLGIsdm9pZCAwKX06ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9YS5sZW5ndGgsZD10eXBlb2YgYT09PSJzdHJpbmciP2Euc3BsaXQoIiIpOmEsZT0wO2U8YztlKyspZSBpbiBkJiZiLmNhbGwodm9pZCAwLGRbZV0sZSxhKX07CmZ1bmN0aW9uIHhhKGEsYil7Yj12YShhLGIpO3ZhciBjO2lmKGM9Yj49MClwKGEubGVuZ3RoIT1udWxsKSxBcnJheS5wcm90b3R5cGUuc3BsaWNlLmNhbGwoYSxiLDEpO3JldHVybiBjfWZ1bmN0aW9uIHlhKGEpe3ZhciBiPWEubGVuZ3RoO2lmKGI+MCl7Zm9yKHZhciBjPUFycmF5KGIpLGQ9MDtkPGI7ZCsrKWNbZF09YVtkXTtyZXR1cm4gY31yZXR1cm5bXX1mdW5jdGlvbiB6YShhLGIsYyxkKXtwKGEubGVuZ3RoIT1udWxsKTtBcnJheS5wcm90b3R5cGUuc3BsaWNlLmFwcGx5KGEsQWEoYXJndW1lbnRzLDEpKX1mdW5jdGlvbiBBYShhLGIsYyl7cChhLmxlbmd0aCE9bnVsbCk7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg8PTI/QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYSxiKTpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhLGIsYyl9O2Z1bmN0aW9uIEJhKGEsYixjKXtmb3IodmFyIGQgaW4gYSliLmNhbGwoYyxhW2RdLGQsYSl9ZnVuY3Rpb24gQ2EoYSxiKXtmb3IodmFyIGMgaW4gYSlpZihhW2NdPT1iKXJldHVybiEwO3JldHVybiExfWZ1bmN0aW9uIERhKGEsYixjKXtpZihhIT09bnVsbCYmYiBpbiBhKXRocm93IEVycm9yKCdUaGUgb2JqZWN0IGFscmVhZHkgY29udGFpbnMgdGhlIGtleSAiJytiKyciJyk7YVtiXT1jfWZ1bmN0aW9uIEVhKGEpe3ZhciBiPXt9LGM7Zm9yKGMgaW4gYSliW2FbY11dPWM7cmV0dXJuIGJ9dmFyIEZhPSJjb25zdHJ1Y3RvciBoYXNPd25Qcm9wZXJ0eSBpc1Byb3RvdHlwZU9mIHByb3BlcnR5SXNFbnVtZXJhYmxlIHRvTG9jYWxlU3RyaW5nIHRvU3RyaW5nIHZhbHVlT2YiLnNwbGl0KCIgIik7CmZ1bmN0aW9uIEdhKGEsYil7Zm9yKHZhciBjLGQsZT0xO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspe2Q9YXJndW1lbnRzW2VdO2ZvcihjIGluIGQpYVtjXT1kW2NdO2Zvcih2YXIgZj0wO2Y8RmEubGVuZ3RoO2YrKyljPUZhW2ZdLE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChkLGMpJiYoYVtjXT1kW2NdKX19O3ZhciBIYT1TdHJpbmcucHJvdG90eXBlLnRyaW0/ZnVuY3Rpb24oYSl7cmV0dXJuIGEudHJpbSgpfTpmdW5jdGlvbihhKXtyZXR1cm4vXltcc1x4YTBdKihbXHNcU10qPylbXHNceGEwXSokLy5leGVjKGEpWzFdfTsvKgoKIENvcHlyaWdodCBHb29nbGUgTExDCiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMAoqLwp2YXIgSWE9e307dmFyIEphPWZ1bmN0aW9uKGEpe2lmKElhIT09SWEpdGhyb3cgRXJyb3IoIkJhZCBzZWNyZXQiKTt0aGlzLmc9YX07SmEucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ307bmV3IEphKCJhYm91dDpibGFuayIpO25ldyBKYSgiYWJvdXQ6aW52YWxpZCN6Q2xvc3VyZXoiKTt2YXIgS2E9W10sTGE9ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJBIFVSTCB3aXRoIGNvbnRlbnQgJyIrYSsiJyB3YXMgc2FuaXRpemVkIGF3YXkuIil9O0thLmluZGV4T2YoTGEpPT09LTEmJkthLnB1c2goTGEpO3ZhciBNYSxOYTthOntmb3IodmFyIE9hPVsiQ0xPU1VSRV9GTEFHUyJdLFBhPWwsUWE9MDtRYTxPYS5sZW5ndGg7UWErKylpZihQYT1QYVtPYVtRYV1dLFBhPT1udWxsKXtOYT1udWxsO2JyZWFrIGF9TmE9UGF9dmFyIFJhPU5hJiZOYVs2MTA0MDEzMDFdO01hPVJhIT1udWxsP1JhOiExO2Z1bmN0aW9uIFNhKCl7dmFyIGE9bC5uYXZpZ2F0b3I7cmV0dXJuIGEmJihhPWEudXNlckFnZW50KT9hOiIifXZhciBUYSxVYT1sLm5hdmlnYXRvcjtUYT1VYT9VYS51c2VyQWdlbnREYXRhfHxudWxsOm51bGw7ZnVuY3Rpb24gcihhKXtyZXR1cm4gU2EoKS5pbmRleE9mKGEpIT0tMX07dmFyIFZhPXIoIkVkZ2UiKSx0PXIoIkdlY2tvIikmJiEoU2EoKS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoIndlYmtpdCIpIT0tMSYmIXIoIkVkZ2UiKSkmJiEocigiVHJpZGVudCIpfHxyKCJNU0lFIikpJiYhcigiRWRnZSIpLHU9U2EoKS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoIndlYmtpdCIpIT0tMSYmIXIoIkVkZ2UiKSx2PU1hJiZUYSYmVGEucGxhdGZvcm0/VGEucGxhdGZvcm09PT0ibWFjT1MiOnIoIk1hY2ludG9zaCIpO3ZhciBYYT1mdW5jdGlvbihhLGIpe0JhKGIsZnVuY3Rpb24oYyxkKXtkPT0ic3R5bGUiP2Euc3R5bGUuY3NzVGV4dD1jOmQ9PSJjbGFzcyI/YS5jbGFzc05hbWU9YzpkPT0iZm9yIj9hLmh0bWxGb3I9YzpXYS5oYXNPd25Qcm9wZXJ0eShkKT9hLnNldEF0dHJpYnV0ZShXYVtkXSxjKTpkLmxhc3RJbmRleE9mKCJhcmlhLSIsMCk9PTB8fGQubGFzdEluZGV4T2YoImRhdGEtIiwwKT09MD9hLnNldEF0dHJpYnV0ZShkLGMpOmFbZF09Y30pfSxXYT17Y2VsbHBhZGRpbmc6ImNlbGxQYWRkaW5nIixjZWxsc3BhY2luZzoiY2VsbFNwYWNpbmciLGNvbHNwYW46ImNvbFNwYW4iLGZyYW1lYm9yZGVyOiJmcmFtZUJvcmRlciIsaGVpZ2h0OiJoZWlnaHQiLG1heGxlbmd0aDoibWF4TGVuZ3RoIixub25jZToibm9uY2UiLHJvbGU6InJvbGUiLHJvd3NwYW46InJvd1NwYW4iLHR5cGU6InR5cGUiLHVzZW1hcDoidXNlTWFwIix2YWxpZ246InZBbGlnbiIsd2lkdGg6IndpZHRoIn0sWWE9ZnVuY3Rpb24oYSwKYixjKXtmdW5jdGlvbiBkKGspe2smJmIuYXBwZW5kQ2hpbGQodHlwZW9mIGs9PT0ic3RyaW5nIj9hLmNyZWF0ZVRleHROb2RlKGspOmspfWZvcih2YXIgZT0yO2U8Yy5sZW5ndGg7ZSsrKXt2YXIgZj1jW2VdO2lmKCFrYShmKXx8bShmKSYmZi5ub2RlVHlwZT4wKWQoZik7ZWxzZXthOntpZihmJiZ0eXBlb2YgZi5sZW5ndGg9PSJudW1iZXIiKXtpZihtKGYpKXt2YXIgaD10eXBlb2YgZi5pdGVtPT0iZnVuY3Rpb24ifHx0eXBlb2YgZi5pdGVtPT0ic3RyaW5nIjticmVhayBhfWlmKHR5cGVvZiBmPT09ImZ1bmN0aW9uIil7aD10eXBlb2YgZi5pdGVtPT0iZnVuY3Rpb24iO2JyZWFrIGF9fWg9ITF9d2EoaD95YShmKTpmLGQpfX19LFphPWZ1bmN0aW9uKGEsYil7Yj1TdHJpbmcoYik7YS5jb250ZW50VHlwZT09PSJhcHBsaWNhdGlvbi94aHRtbCt4bWwiJiYoYj1iLnRvTG93ZXJDYXNlKCkpO3JldHVybiBhLmNyZWF0ZUVsZW1lbnQoYil9LCRhPWZ1bmN0aW9uKGEpe2EmJmEucGFyZW50Tm9kZSYmCmEucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhKX0sYWI9ZnVuY3Rpb24oYSxiKXtpZighYXx8IWIpcmV0dXJuITE7aWYoYS5jb250YWlucyYmYi5ub2RlVHlwZT09MSlyZXR1cm4gYT09Ynx8YS5jb250YWlucyhiKTtpZih0eXBlb2YgYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiE9InVuZGVmaW5lZCIpcmV0dXJuIGE9PWJ8fCEhKGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24oYikmMTYpO2Zvcig7YiYmYSE9YjspYj1iLnBhcmVudE5vZGU7cmV0dXJuIGI9PWF9LGJiPWZ1bmN0aW9uKGEpe3AoYSwiTm9kZSBjYW5ub3QgYmUgbnVsbCBvciB1bmRlZmluZWQuIik7cmV0dXJuIGEubm9kZVR5cGU9PTk/YTphLm93bmVyRG9jdW1lbnR8fGEuZG9jdW1lbnR9LGNiPWZ1bmN0aW9uKGEsYil7Yj9hLnRhYkluZGV4PTA6KGEudGFiSW5kZXg9LTEsYS5yZW1vdmVBdHRyaWJ1dGUoInRhYkluZGV4IikpfSxkYj1mdW5jdGlvbihhKXtyZXR1cm4gYS5oYXNBdHRyaWJ1dGUoInRhYmluZGV4Iil9LGViPQpmdW5jdGlvbihhKXthPWEudGFiSW5kZXg7cmV0dXJuIHR5cGVvZiBhPT09Im51bWJlciImJmE+PTAmJmE8MzI3Njh9LGZiPWZ1bmN0aW9uKGEpe3RoaXMuZz1hfHxsLmRvY3VtZW50fHxkb2N1bWVudH07ZmIucHJvdG90eXBlLmk9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nO3JldHVybiB0eXBlb2YgYT09PSJzdHJpbmciP2IuZ2V0RWxlbWVudEJ5SWQoYSk6YX07ZmIucHJvdG90eXBlLmg9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXMuZyxlPWFyZ3VtZW50cyxmPWVbMV0saD1aYShkLFN0cmluZyhlWzBdKSk7ZiYmKHR5cGVvZiBmPT09InN0cmluZyI/aC5jbGFzc05hbWU9ZjpBcnJheS5pc0FycmF5KGYpP2guY2xhc3NOYW1lPWYuam9pbigiICIpOlhhKGgsZikpO2UubGVuZ3RoPjImJllhKGQsaCxlKTtyZXR1cm4gaH07dmFyIHc9ZnVuY3Rpb24oKXt0aGlzLmJhPXRoaXMuYmE7dGhpcy5rYT10aGlzLmthfTt3LnByb3RvdHlwZS5iYT0hMTt3LnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7dGhpcy5iYXx8KHRoaXMuYmE9ITAsdGhpcy5DKCkpfTt3LnByb3RvdHlwZVtTeW1ib2wuZGlzcG9zZV09ZnVuY3Rpb24oKXt0aGlzLmRpc3Bvc2UoKX07dy5wcm90b3R5cGUuQz1mdW5jdGlvbigpe2lmKHRoaXMua2EpZm9yKDt0aGlzLmthLmxlbmd0aDspdGhpcy5rYS5zaGlmdCgpKCl9O3ZhciB5PWZ1bmN0aW9uKGEsYil7dGhpcy50eXBlPWE7dGhpcy51PXRoaXMudGFyZ2V0PWI7dGhpcy5kZWZhdWx0UHJldmVudGVkPXRoaXMuQT0hMX07eS5wcm90b3R5cGUudj1mdW5jdGlvbigpe3RoaXMuQT0hMH07eS5wcm90b3R5cGUuaj1mdW5jdGlvbigpe3RoaXMuZGVmYXVsdFByZXZlbnRlZD0hMH07dmFyIGdiPWZ1bmN0aW9uKCl7aWYoIWwuYWRkRXZlbnRMaXN0ZW5lcnx8IU9iamVjdC5kZWZpbmVQcm9wZXJ0eSlyZXR1cm4hMTt2YXIgYT0hMSxiPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwicGFzc2l2ZSIse2dldDpmdW5jdGlvbigpe2E9ITB9fSk7dHJ5e3ZhciBjPWZ1bmN0aW9uKCl7fTtsLmFkZEV2ZW50TGlzdGVuZXIoInRlc3QiLGMsYik7bC5yZW1vdmVFdmVudExpc3RlbmVyKCJ0ZXN0IixjLGIpfWNhdGNoKGQpe31yZXR1cm4gYX0oKTt2YXIgej1mdW5jdGlvbihhLGIpe3kuY2FsbCh0aGlzLGE/YS50eXBlOiIiKTt0aGlzLnJlbGF0ZWRUYXJnZXQ9dGhpcy51PXRoaXMudGFyZ2V0PW51bGw7dGhpcy5idXR0b249dGhpcy5zY3JlZW5ZPXRoaXMuc2NyZWVuWD10aGlzLmNsaWVudFk9dGhpcy5jbGllbnRYPTA7dGhpcy5rZXk9IiI7dGhpcy5nPTA7dGhpcy5tZXRhS2V5PXRoaXMuc2hpZnRLZXk9dGhpcy5hbHRLZXk9dGhpcy5jdHJsS2V5PSExO3RoaXMuc3RhdGU9bnVsbDt0aGlzLkc9ITE7dGhpcy5wb2ludGVySWQ9MDt0aGlzLnBvaW50ZXJUeXBlPSIiO3RoaXMudGltZVN0YW1wPTA7dGhpcy5oPW51bGw7aWYoYSl7dmFyIGM9dGhpcy50eXBlPWEudHlwZSxkPWEuY2hhbmdlZFRvdWNoZXMmJmEuY2hhbmdlZFRvdWNoZXMubGVuZ3RoP2EuY2hhbmdlZFRvdWNoZXNbMF06bnVsbDt0aGlzLnRhcmdldD1hLnRhcmdldHx8YS5zcmNFbGVtZW50O3RoaXMudT1iO2I9YS5yZWxhdGVkVGFyZ2V0O2J8fChjPT0ibW91c2VvdmVyIj8KYj1hLmZyb21FbGVtZW50OmM9PSJtb3VzZW91dCImJihiPWEudG9FbGVtZW50KSk7dGhpcy5yZWxhdGVkVGFyZ2V0PWI7ZD8odGhpcy5jbGllbnRYPWQuY2xpZW50WCE9PXZvaWQgMD9kLmNsaWVudFg6ZC5wYWdlWCx0aGlzLmNsaWVudFk9ZC5jbGllbnRZIT09dm9pZCAwP2QuY2xpZW50WTpkLnBhZ2VZLHRoaXMuc2NyZWVuWD1kLnNjcmVlblh8fDAsdGhpcy5zY3JlZW5ZPWQuc2NyZWVuWXx8MCk6KHRoaXMuY2xpZW50WD1hLmNsaWVudFghPT12b2lkIDA/YS5jbGllbnRYOmEucGFnZVgsdGhpcy5jbGllbnRZPWEuY2xpZW50WSE9PXZvaWQgMD9hLmNsaWVudFk6YS5wYWdlWSx0aGlzLnNjcmVlblg9YS5zY3JlZW5YfHwwLHRoaXMuc2NyZWVuWT1hLnNjcmVlbll8fDApO3RoaXMuYnV0dG9uPWEuYnV0dG9uO3RoaXMuZz1hLmtleUNvZGV8fDA7dGhpcy5rZXk9YS5rZXl8fCIiO3RoaXMuY3RybEtleT1hLmN0cmxLZXk7dGhpcy5hbHRLZXk9YS5hbHRLZXk7dGhpcy5zaGlmdEtleT1hLnNoaWZ0S2V5Owp0aGlzLm1ldGFLZXk9YS5tZXRhS2V5O3RoaXMuRz12P2EubWV0YUtleTphLmN0cmxLZXk7dGhpcy5wb2ludGVySWQ9YS5wb2ludGVySWR8fDA7dGhpcy5wb2ludGVyVHlwZT1hLnBvaW50ZXJUeXBlO3RoaXMuc3RhdGU9YS5zdGF0ZTt0aGlzLnRpbWVTdGFtcD1hLnRpbWVTdGFtcDt0aGlzLmg9YTthLmRlZmF1bHRQcmV2ZW50ZWQmJnoubC5qLmNhbGwodGhpcyl9fTtuKHoseSk7ei5wcm90b3R5cGUudj1mdW5jdGlvbigpe3oubC52LmNhbGwodGhpcyk7dGhpcy5oLnN0b3BQcm9wYWdhdGlvbj90aGlzLmguc3RvcFByb3BhZ2F0aW9uKCk6dGhpcy5oLmNhbmNlbEJ1YmJsZT0hMH07ei5wcm90b3R5cGUuaj1mdW5jdGlvbigpe3oubC5qLmNhbGwodGhpcyk7dmFyIGE9dGhpcy5oO2EucHJldmVudERlZmF1bHQ/YS5wcmV2ZW50RGVmYXVsdCgpOmEucmV0dXJuVmFsdWU9ITF9O3ZhciBoYj0iY2xvc3VyZV9saXN0ZW5hYmxlXyIrKE1hdGgucmFuZG9tKCkqMUU2fDApLGliPWZ1bmN0aW9uKGEpe3JldHVybiEoIWF8fCFhW2hiXSl9O3ZhciBqYj0wO3ZhciBrYj1mdW5jdGlvbihhLGIsYyxkLGUpe3RoaXMubGlzdGVuZXI9YTt0aGlzLnByb3h5PW51bGw7dGhpcy5zcmM9Yjt0aGlzLnR5cGU9Yzt0aGlzLmNhcHR1cmU9ISFkO3RoaXMucGE9ZTt0aGlzLmtleT0rK2piO3RoaXMuamE9dGhpcy5vYT0hMX0sbGI9ZnVuY3Rpb24oYSl7YS5qYT0hMDthLmxpc3RlbmVyPW51bGw7YS5wcm94eT1udWxsO2Euc3JjPW51bGw7YS5wYT1udWxsfTt2YXIgbWI9ZnVuY3Rpb24oYSl7dGhpcy5zcmM9YTt0aGlzLmc9e307dGhpcy5oPTB9O21iLnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZj1hLnRvU3RyaW5nKCk7YT10aGlzLmdbZl07YXx8KGE9dGhpcy5nW2ZdPVtdLHRoaXMuaCsrKTt2YXIgaD1uYihhLGIsZCxlKTtoPi0xPyhiPWFbaF0sY3x8KGIub2E9ITEpKTooYj1uZXcga2IoYix0aGlzLnNyYyxmLCEhZCxlKSxiLm9hPWMsYS5wdXNoKGIpKTtyZXR1cm4gYn07CnZhciBvYj1mdW5jdGlvbihhLGIpe3ZhciBjPWIudHlwZTtjIGluIGEuZyYmeGEoYS5nW2NdLGIpJiYobGIoYiksYS5nW2NdLmxlbmd0aD09MCYmKGRlbGV0ZSBhLmdbY10sYS5oLS0pKX0scGI9ZnVuY3Rpb24oYSxiLGMsZCxlKXthPWEuZ1tiLnRvU3RyaW5nKCldO2I9LTE7YSYmKGI9bmIoYSxjLGQsZSkpO3JldHVybiBiPi0xP2FbYl06bnVsbH0sbmI9ZnVuY3Rpb24oYSxiLGMsZCl7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDsrK2Upe3ZhciBmPWFbZV07aWYoIWYuamEmJmYubGlzdGVuZXI9PWImJmYuY2FwdHVyZT09ISFjJiZmLnBhPT1kKXJldHVybiBlfXJldHVybi0xfTt2YXIgcWI9ImNsb3N1cmVfbG1fIisoTWF0aC5yYW5kb20oKSoxRTZ8MCkscmI9e30sc2I9MCx1Yj1mdW5jdGlvbihhLGIsYyxkLGUpe2lmKGQmJmQub25jZSlyZXR1cm4gdGIoYSxiLGMsZCxlKTtpZihBcnJheS5pc0FycmF5KGIpKXtmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKyl1YihhLGJbZl0sYyxkLGUpO3JldHVybiBudWxsfWM9dmIoYyk7cmV0dXJuIGliKGEpP3diKGEsYixjLG0oZCk/ISFkLmNhcHR1cmU6ISFkLGUpOnhiKGEsYixjLCExLGQsZSl9LHhiPWZ1bmN0aW9uKGEsYixjLGQsZSxmKXtpZighYil0aHJvdyBFcnJvcigiSW52YWxpZCBldmVudCB0eXBlIik7dmFyIGg9bShlKT8hIWUuY2FwdHVyZTohIWUsaz15YihhKTtrfHwoYVtxYl09az1uZXcgbWIoYSkpO2M9ay5hZGQoYixjLGQsaCxmKTtpZihjLnByb3h5KXJldHVybiBjO2Q9emIoKTtjLnByb3h5PWQ7ZC5zcmM9YTtkLmxpc3RlbmVyPWM7aWYoYS5hZGRFdmVudExpc3RlbmVyKWdifHwoZT1oKSxlPT09dm9pZCAwJiYKKGU9ITEpLGEuYWRkRXZlbnRMaXN0ZW5lcihiLnRvU3RyaW5nKCksZCxlKTtlbHNlIGlmKGEuYXR0YWNoRXZlbnQpYS5hdHRhY2hFdmVudChBYihiLnRvU3RyaW5nKCkpLGQpO2Vsc2UgaWYoYS5hZGRMaXN0ZW5lciYmYS5yZW1vdmVMaXN0ZW5lcilwKGI9PT0iY2hhbmdlIiwiTWVkaWFRdWVyeUxpc3Qgb25seSBoYXMgYSBjaGFuZ2UgZXZlbnQiKSxhLmFkZExpc3RlbmVyKGQpO2Vsc2UgdGhyb3cgRXJyb3IoImFkZEV2ZW50TGlzdGVuZXIgYW5kIGF0dGFjaEV2ZW50IGFyZSB1bmF2YWlsYWJsZS4iKTtzYisrO3JldHVybiBjfSx6Yj1mdW5jdGlvbigpe3ZhciBhPUJiLGI9ZnVuY3Rpb24oYyl7cmV0dXJuIGEuY2FsbChiLnNyYyxiLmxpc3RlbmVyLGMpfTtyZXR1cm4gYn0sdGI9ZnVuY3Rpb24oYSxiLGMsZCxlKXtpZihBcnJheS5pc0FycmF5KGIpKXtmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKyl0YihhLGJbZl0sYyxkLGUpO3JldHVybiBudWxsfWM9dmIoYyk7cmV0dXJuIGliKGEpPwphLkEuYWRkKFN0cmluZyhiKSxjLCEwLG0oZCk/ISFkLmNhcHR1cmU6ISFkLGUpOnhiKGEsYixjLCEwLGQsZSl9LENiPWZ1bmN0aW9uKGEsYixjLGQsZSl7aWYoQXJyYXkuaXNBcnJheShiKSlmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKylDYihhLGJbZl0sYyxkLGUpO2Vsc2UgZD1tKGQpPyEhZC5jYXB0dXJlOiEhZCxjPXZiKGMpLGliKGEpPyhhPWEuQSxiPVN0cmluZyhiKS50b1N0cmluZygpLGIgaW4gYS5nJiYoZj1hLmdbYl0sYz1uYihmLGMsZCxlKSxjPi0xJiYobGIoZltjXSkscChmLmxlbmd0aCE9bnVsbCksQXJyYXkucHJvdG90eXBlLnNwbGljZS5jYWxsKGYsYywxKSxmLmxlbmd0aD09MCYmKGRlbGV0ZSBhLmdbYl0sYS5oLS0pKSkpOmEmJihhPXliKGEpKSYmKGM9cGIoYSxiLGMsZCxlKSkmJkEoYyl9LEE9ZnVuY3Rpb24oYSl7aWYodHlwZW9mIGEhPT0ibnVtYmVyIiYmYSYmIWEuamEpe3ZhciBiPWEuc3JjO2lmKGliKGIpKW9iKGIuQSxhKTtlbHNle3ZhciBjPWEudHlwZSwKZD1hLnByb3h5O2IucmVtb3ZlRXZlbnRMaXN0ZW5lcj9iLnJlbW92ZUV2ZW50TGlzdGVuZXIoYyxkLGEuY2FwdHVyZSk6Yi5kZXRhY2hFdmVudD9iLmRldGFjaEV2ZW50KEFiKGMpLGQpOmIuYWRkTGlzdGVuZXImJmIucmVtb3ZlTGlzdGVuZXImJmIucmVtb3ZlTGlzdGVuZXIoZCk7c2ItLTsoYz15YihiKSk/KG9iKGMsYSksYy5oPT0wJiYoYy5zcmM9bnVsbCxiW3FiXT1udWxsKSk6bGIoYSl9fX0sQWI9ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW4gcmI/cmJbYV06cmJbYV09Im9uIithfSxCYj1mdW5jdGlvbihhLGIpe2lmKGEuamEpYT0hMDtlbHNle2I9bmV3IHooYix0aGlzKTt2YXIgYz1hLmxpc3RlbmVyLGQ9YS5wYXx8YS5zcmM7YS5vYSYmQShhKTthPWMuY2FsbChkLGIpfXJldHVybiBhfSx5Yj1mdW5jdGlvbihhKXthPWFbcWJdO3JldHVybiBhIGluc3RhbmNlb2YgbWI/YTpudWxsfSxEYj0iX19jbG9zdXJlX2V2ZW50c19mbl8iKyhNYXRoLnJhbmRvbSgpKjFFOT4+PjApLHZiPWZ1bmN0aW9uKGEpe3AoYSwKIkxpc3RlbmVyIGNhbiBub3QgYmUgbnVsbC4iKTtpZih0eXBlb2YgYT09PSJmdW5jdGlvbiIpcmV0dXJuIGE7cChhLmhhbmRsZUV2ZW50LCJBbiBvYmplY3QgbGlzdGVuZXIgbXVzdCBoYXZlIGhhbmRsZUV2ZW50IG1ldGhvZC4iKTthW0RiXXx8KGFbRGJdPWZ1bmN0aW9uKGIpe3JldHVybiBhLmhhbmRsZUV2ZW50KGIpfSk7cmV0dXJuIGFbRGJdfTt2YXIgRWI9ZnVuY3Rpb24oYSl7dy5jYWxsKHRoaXMpO3RoaXMuaD1hO3RoaXMuZz17fX07bihFYix3KTsKdmFyIEZiPVtdLEI9ZnVuY3Rpb24oYSxiLGMsZCl7QXJyYXkuaXNBcnJheShjKXx8KGMmJihGYlswXT1jLnRvU3RyaW5nKCkpLGM9RmIpO2Zvcih2YXIgZT0wO2U8Yy5sZW5ndGg7ZSsrKXt2YXIgZj11YihiLGNbZV0sZHx8YS5oYW5kbGVFdmVudCwhMSxhLmh8fGEpO2lmKCFmKWJyZWFrO2EuZ1tmLmtleV09Zn1yZXR1cm4gYX0sQz1mdW5jdGlvbihhLGIsYyxkLGUsZil7aWYoQXJyYXkuaXNBcnJheShjKSlmb3IodmFyIGg9MDtoPGMubGVuZ3RoO2grKylDKGEsYixjW2hdLGQsZSxmKTtlbHNlIGQ9ZHx8YS5oYW5kbGVFdmVudCxlPW0oZSk/ISFlLmNhcHR1cmU6ISFlLGY9Znx8YS5ofHxhLGQ9dmIoZCksZT0hIWUsYz1pYihiKT9wYihiLkEsU3RyaW5nKGMpLGQsZSxmKTpiPyhiPXliKGIpKT9wYihiLGMsZCxlLGYpOm51bGw6bnVsbCxjJiYoQShjKSxkZWxldGUgYS5nW2Mua2V5XSk7cmV0dXJuIGF9LEdiPWZ1bmN0aW9uKGEpe0JhKGEuZyxmdW5jdGlvbihiLGMpe3RoaXMuZy5oYXNPd25Qcm9wZXJ0eShjKSYmCkEoYil9LGEpO2EuZz17fX07RWIucHJvdG90eXBlLkM9ZnVuY3Rpb24oKXtFYi5sLkMuY2FsbCh0aGlzKTtHYih0aGlzKX07RWIucHJvdG90eXBlLmhhbmRsZUV2ZW50PWZ1bmN0aW9uKCl7dGhyb3cgRXJyb3IoIkV2ZW50SGFuZGxlci5oYW5kbGVFdmVudCBub3QgaW1wbGVtZW50ZWQiKTt9O3ZhciBEPWZ1bmN0aW9uKCl7dy5jYWxsKHRoaXMpO3RoaXMuQT1uZXcgbWIodGhpcyk7dGhpcy5ZYT10aGlzO3RoaXMubGE9bnVsbH07bihELHcpO0QucHJvdG90eXBlW2hiXT0hMDtELnByb3RvdHlwZS5BYT1mdW5jdGlvbihhKXt0aGlzLmxhPWF9O0QucHJvdG90eXBlLnJlbW92ZUV2ZW50TGlzdGVuZXI9ZnVuY3Rpb24oYSxiLGMsZCl7Q2IodGhpcyxhLGIsYyxkKX07CnZhciBFPWZ1bmN0aW9uKGEsYil7SGIoYSk7dmFyIGM9YS5sYTtpZihjKXt2YXIgZD1bXTtmb3IodmFyIGU9MTtjO2M9Yy5sYSlkLnB1c2goYykscCgrK2U8MUUzLCJpbmZpbml0ZSBsb29wIil9YT1hLllhO2M9Yi50eXBlfHxiO3R5cGVvZiBiPT09InN0cmluZyI/Yj1uZXcgeShiLGEpOmIgaW5zdGFuY2VvZiB5P2IudGFyZ2V0PWIudGFyZ2V0fHxhOihlPWIsYj1uZXcgeShjLGEpLEdhKGIsZSkpO2U9ITA7dmFyIGY7aWYoZClmb3IoZj1kLmxlbmd0aC0xOyFiLkEmJmY+PTA7Zi0tKXt2YXIgaD1iLnU9ZFtmXTtlPUliKGgsYywhMCxiKSYmZX1iLkF8fChoPWIudT1hLGU9SWIoaCxjLCEwLGIpJiZlLGIuQXx8KGU9SWIoaCxjLCExLGIpJiZlKSk7aWYoZClmb3IoZj0wOyFiLkEmJmY8ZC5sZW5ndGg7ZisrKWg9Yi51PWRbZl0sZT1JYihoLGMsITEsYikmJmU7cmV0dXJuIGV9OwpELnByb3RvdHlwZS5DPWZ1bmN0aW9uKCl7RC5sLkMuY2FsbCh0aGlzKTtpZih0aGlzLkEpe3ZhciBhPXRoaXMuQSxiPTAsYztmb3IoYyBpbiBhLmcpe2Zvcih2YXIgZD1hLmdbY10sZT0wO2U8ZC5sZW5ndGg7ZSsrKSsrYixsYihkW2VdKTtkZWxldGUgYS5nW2NdO2EuaC0tfX10aGlzLmxhPW51bGx9O3ZhciB3Yj1mdW5jdGlvbihhLGIsYyxkLGUpe0hiKGEpO3JldHVybiBhLkEuYWRkKFN0cmluZyhiKSxjLCExLGQsZSl9LEliPWZ1bmN0aW9uKGEsYixjLGQpe2I9YS5BLmdbU3RyaW5nKGIpXTtpZighYilyZXR1cm4hMDtiPWIuY29uY2F0KCk7Zm9yKHZhciBlPSEwLGY9MDtmPGIubGVuZ3RoOysrZil7dmFyIGg9YltmXTtpZihoJiYhaC5qYSYmaC5jYXB0dXJlPT1jKXt2YXIgaz1oLmxpc3RlbmVyLHE9aC5wYXx8aC5zcmM7aC5vYSYmb2IoYS5BLGgpO2U9ay5jYWxsKHEsZCkhPT0hMSYmZX19cmV0dXJuIGUmJiFkLmRlZmF1bHRQcmV2ZW50ZWR9LEhiPWZ1bmN0aW9uKGEpe3AoYS5BLCJFdmVudCB0YXJnZXQgaXMgbm90IGluaXRpYWxpemVkLiBEaWQgeW91IGNhbGwgdGhlIHN1cGVyY2xhc3MgKGdvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0KSBjb25zdHJ1Y3Rvcj8iKX07dmFyIEpiPXQ/Ik1velVzZXJTZWxlY3QiOnV8fFZhPyJXZWJraXRVc2VyU2VsZWN0IjpudWxsLEtiPWZ1bmN0aW9uKGEsYil7Yj1iP251bGw6YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpO2lmKEpiJiYoYS5zdHlsZSYmKGEuc3R5bGVbSmJdPSJub25lIiksYikpZm9yKHZhciBjPTA7YT1iW2NdO2MrKylhLnN0eWxlJiYoYS5zdHlsZVtKYl09Im5vbmUiKX07dmFyIExiPWZ1bmN0aW9uKCl7fTtpYShMYik7TGIucHJvdG90eXBlLmc9MDt2YXIgRj1mdW5jdGlvbihhKXtELmNhbGwodGhpcyk7dGhpcy5HPWF8fHBhfHwocGE9bmV3IGZiKTt0aGlzLnphPU1iO3RoaXMuWT1udWxsO3RoaXMucz0hMTt0aGlzLmc9bnVsbDt0aGlzLk09dm9pZCAwO3RoaXMudT10aGlzLmo9dGhpcy5oPW51bGw7dGhpcy5TYT0hMX07bihGLEQpO0YucHJvdG90eXBlLlphPUxiLlYoKTsKdmFyIE1iPW51bGwsTmI9ZnVuY3Rpb24oYSxiKXtzd2l0Y2goYSl7Y2FzZSAxOnJldHVybiBiPyJkaXNhYmxlIjoiZW5hYmxlIjtjYXNlIDI6cmV0dXJuIGI/ImhpZ2hsaWdodCI6InVuaGlnaGxpZ2h0IjtjYXNlIDQ6cmV0dXJuIGI/ImFjdGl2YXRlIjoiZGVhY3RpdmF0ZSI7Y2FzZSA4OnJldHVybiBiPyJzZWxlY3QiOiJ1bnNlbGVjdCI7Y2FzZSAxNjpyZXR1cm4gYj8iY2hlY2siOiJ1bmNoZWNrIjtjYXNlIDMyOnJldHVybiBiPyJmb2N1cyI6ImJsdXIiO2Nhc2UgNjQ6cmV0dXJuIGI/Im9wZW4iOiJjbG9zZSJ9dGhyb3cgRXJyb3IoIkludmFsaWQgY29tcG9uZW50IHN0YXRlIik7fSxPYj1mdW5jdGlvbihhKXtyZXR1cm4gYS5ZfHwoYS5ZPSI6IisoYS5aYS5nKyspLnRvU3RyaW5nKDM2KSl9LFBiPWZ1bmN0aW9uKGEsYil7aWYoYS5oJiZhLmgudSl7dmFyIGM9YS5oLnUsZD1hLlk7ZCBpbiBjJiZkZWxldGUgY1tkXTtEYShhLmgudSxiLGEpfWEuWT1ifTtGLnByb3RvdHlwZS5pPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ307CnZhciBRYj1mdW5jdGlvbihhKXthLk18fChhLk09bmV3IEViKGEpKTtyZXR1cm4gcChhLk0pfTtGLnByb3RvdHlwZS5BYT1mdW5jdGlvbihhKXtpZih0aGlzLmgmJnRoaXMuaCE9YSl0aHJvdyBFcnJvcigiTWV0aG9kIG5vdCBzdXBwb3J0ZWQiKTtGLmwuQWEuY2FsbCh0aGlzLGEpfTtGLnByb3RvdHlwZS5tYT1mdW5jdGlvbigpe3RoaXMuZz1aYSh0aGlzLkcuZywiRElWIil9O0YucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbihhKXtSYih0aGlzLGEpfTsKdmFyIFJiPWZ1bmN0aW9uKGEsYixjKXtpZihhLnMpdGhyb3cgRXJyb3IoIkNvbXBvbmVudCBhbHJlYWR5IHJlbmRlcmVkIik7YS5nfHxhLm1hKCk7Yj9iLmluc2VydEJlZm9yZShhLmcsY3x8bnVsbCk6YS5HLmcuYm9keS5hcHBlbmRDaGlsZChhLmcpO2EuaCYmIWEuaC5zfHxhLkkoKX0sU2I9ZnVuY3Rpb24oYSxiKXtpZihhLnMpdGhyb3cgRXJyb3IoIkNvbXBvbmVudCBhbHJlYWR5IHJlbmRlcmVkIik7aWYoYiYmYS53YShiKSl7YS5TYT0hMDt2YXIgYz1iYihiKTthLkcmJmEuRy5nPT1jfHwoYS5HPWI/bmV3IGZiKGJiKGIpKTpwYXx8KHBhPW5ldyBmYikpO2EuRWEoYik7YS5JKCl9ZWxzZSB0aHJvdyBFcnJvcigiSW52YWxpZCBlbGVtZW50IHRvIGRlY29yYXRlIik7fTtnPUYucHJvdG90eXBlO2cud2E9ZnVuY3Rpb24oKXtyZXR1cm4hMH07Zy5FYT1mdW5jdGlvbihhKXt0aGlzLmc9YX07CmcuST1mdW5jdGlvbigpe3RoaXMucz0hMDtUYih0aGlzLGZ1bmN0aW9uKGEpeyFhLnMmJmEuaSgpJiZhLkkoKX0pfTtnLlU9ZnVuY3Rpb24oKXtUYih0aGlzLGZ1bmN0aW9uKGEpe2EucyYmYS5VKCl9KTt0aGlzLk0mJkdiKHRoaXMuTSk7dGhpcy5zPSExfTtnLkM9ZnVuY3Rpb24oKXt0aGlzLnMmJnRoaXMuVSgpO3RoaXMuTSYmKHRoaXMuTS5kaXNwb3NlKCksZGVsZXRlIHRoaXMuTSk7VGIodGhpcyxmdW5jdGlvbihhKXthLmRpc3Bvc2UoKX0pOyF0aGlzLlNhJiZ0aGlzLmcmJiRhKHRoaXMuZyk7dGhpcy5oPXRoaXMuZz10aGlzLnU9dGhpcy5qPW51bGw7Ri5sLkMuY2FsbCh0aGlzKX07Zy5CYT1mdW5jdGlvbihhLGIpe3RoaXMuQ2EoYSxIKHRoaXMpLGIpfTsKZy5DYT1mdW5jdGlvbihhLGIsYyl7cCghIWEsIlByb3ZpZGVkIGVsZW1lbnQgbXVzdCBub3QgYmUgbnVsbC4iKTtpZihhLnMmJihjfHwhdGhpcy5zKSl0aHJvdyBFcnJvcigiQ29tcG9uZW50IGFscmVhZHkgcmVuZGVyZWQiKTtpZihiPDB8fGI+SCh0aGlzKSl0aHJvdyBFcnJvcigiQ2hpbGQgY29tcG9uZW50IGluZGV4IG91dCBvZiBib3VuZHMiKTt0aGlzLnUmJnRoaXMuanx8KHRoaXMudT17fSx0aGlzLmo9W10pO2lmKGEuaD09dGhpcyl7dmFyIGQ9dGhpcy51LGU9T2IoYSk7ZFtlXT1hO3hhKHRoaXMuaixhKX1lbHNlIERhKHRoaXMudSxPYihhKSxhKTtpZihhPT10aGlzKXRocm93IEVycm9yKCJVbmFibGUgdG8gc2V0IHBhcmVudCBjb21wb25lbnQiKTtpZihkPXRoaXMmJmEuaCYmYS5ZKWU9YS5oLGQ9YS5ZLGUudSYmZD8oZT1lLnUsZD0oZSE9PW51bGwmJmQgaW4gZT9lW2RdOnZvaWQgMCl8fG51bGwpOmQ9bnVsbDtpZihkJiZhLmghPXRoaXMpdGhyb3cgRXJyb3IoIlVuYWJsZSB0byBzZXQgcGFyZW50IGNvbXBvbmVudCIpOwphLmg9dGhpcztGLmwuQWEuY2FsbChhLHRoaXMpO3phKHRoaXMuaixiLDAsYSk7YS5zJiZ0aGlzLnMmJmEuaD09dGhpcz8oYz10aGlzLm5hKCksKGMuY2hpbGROb2Rlc1tiXXx8bnVsbCkhPWEuaSgpJiYoYS5pKCkucGFyZW50RWxlbWVudD09YyYmYy5yZW1vdmVDaGlsZChhLmkoKSksYj1jLmNoaWxkTm9kZXNbYl18fG51bGwsYy5pbnNlcnRCZWZvcmUoYS5pKCksYikpKTpjPyh0aGlzLmd8fHRoaXMubWEoKSxiPUkodGhpcyxiKzEpLFJiKGEsdGhpcy5uYSgpLGI/Yi5nOm51bGwpKTp0aGlzLnMmJiFhLnMmJmEuZyYmYS5nLnBhcmVudE5vZGUmJmEuZy5wYXJlbnROb2RlLm5vZGVUeXBlPT0xJiZhLkkoKX07Zy5uYT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmd9Owp2YXIgVWI9ZnVuY3Rpb24oYSl7aWYoYS56YT09bnVsbCl7dmFyIGI9YS5zP2EuZzphLkcuZy5ib2R5O2E6e3ZhciBjPWJiKGIpO2lmKGMuZGVmYXVsdFZpZXcmJmMuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSYmKGM9Yy5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKGIsbnVsbCkpKXtjPWMuZGlyZWN0aW9ufHxjLmdldFByb3BlcnR5VmFsdWUoImRpcmVjdGlvbiIpfHwiIjticmVhayBhfWM9IiJ9YS56YT0icnRsIj09KGN8fChiLmN1cnJlbnRTdHlsZT9iLmN1cnJlbnRTdHlsZS5kaXJlY3Rpb246bnVsbCl8fGIuc3R5bGUmJmIuc3R5bGUuZGlyZWN0aW9uKX1yZXR1cm4gYS56YX0sSD1mdW5jdGlvbihhKXtyZXR1cm4gYS5qP2Euai5sZW5ndGg6MH0sST1mdW5jdGlvbihhLGIpe3JldHVybiBhLmo/YS5qW2JdfHxudWxsOm51bGx9LFRiPWZ1bmN0aW9uKGEsYixjKXthLmomJmEuai5mb3JFYWNoKGIsYyl9LFZiPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuaiYmYj9hLmouaW5kZXhPZihiKToKLTF9O3ZhciBXYj17bWI6ImFjdGl2ZWRlc2NlbmRhbnQiLHJiOiJhdG9taWMiLHNiOiJhdXRvY29tcGxldGUiLHViOiJidXN5Iix4YjoiY2hlY2tlZCIseWI6ImNvbGluZGV4IixEYjoiY29udHJvbHMiLEViOiJjdXJyZW50IixHYjoiZGVzY3JpYmVkYnkiLEpiOiJkaXNhYmxlZCIsTGI6ImRyb3BlZmZlY3QiLE1iOiJleHBhbmRlZCIsTmI6ImZsb3d0byIsUGI6ImdyYWJiZWQiLFRiOiJoYXNwb3B1cCIsVmI6ImhpZGRlbiIsWGI6ImludmFsaWQiLFliOiJsYWJlbCIsWmI6ImxhYmVsbGVkYnkiLGFjOiJsZXZlbCIsZmM6ImxpdmUiLHZjOiJtdWx0aWxpbmUiLHdjOiJtdWx0aXNlbGVjdGFibGUiLEFjOiJvcmllbnRhdGlvbiIsQmM6Im93bnMiLENjOiJwb3NpbnNldCIsRWM6InByZXNzZWQiLEljOiJyZWFkb25seSIsS2M6InJlbGV2YW50IixMYzoicmVxdWlyZWQiLFBjOiJyb3dpbmRleCIsU2M6InNlbGVjdGVkIixVYzoic2V0c2l6ZSIsV2M6InNvcnQiLG1kOiJ2YWx1ZW1heCIsbmQ6InZhbHVlbWluIiwKb2Q6InZhbHVlbm93IixwZDoidmFsdWV0ZXh0In07dmFyIFhiO3ZhciBZYj17bmI6ImFsZXJ0IixvYjoiYWxlcnRkaWFsb2ciLHBiOiJhcHBsaWNhdGlvbiIscWI6ImFydGljbGUiLHRiOiJiYW5uZXIiLHZiOiJidXR0b24iLHdiOiJjaGVja2JveCIsemI6ImNvbHVtbmhlYWRlciIsQWI6ImNvbWJvYm94IixCYjoiY29tcGxlbWVudGFyeSIsQ2I6ImNvbnRlbnRpbmZvIixGYjoiZGVmaW5pdGlvbiIsSGI6ImRpYWxvZyIsSWI6ImRpcmVjdG9yeSIsS2I6ImRvY3VtZW50IixPYjoiZm9ybSIsUWI6ImdyaWQiLFJiOiJncmlkY2VsbCIsU2I6Imdyb3VwIixVYjoiaGVhZGluZyIsV2I6ImltZyIsYmM6ImxpbmsiLGNjOiJsaXN0IixkYzoibGlzdGJveCIsZWM6Imxpc3RpdGVtIixoYzoibG9nIixpYzoibWFpbiIsamM6Im1hcnF1ZWUiLGtjOiJtYXRoIixsYzoibWVudSIsbWM6Im1lbnViYXIiLG5jOiJtZW51aXRlbSIsb2M6Im1lbnVpdGVtY2hlY2tib3giLHBjOiJtZW51aXRlbXJhZGlvIix4YzoibmF2aWdhdGlvbiIseWM6Im5vdGUiLHpjOiJvcHRpb24iLApEYzoicHJlc2VudGF0aW9uIixGYzoicHJvZ3Jlc3NiYXIiLEdjOiJyYWRpbyIsSGM6InJhZGlvZ3JvdXAiLEpjOiJyZWdpb24iLE1jOiJyb3ciLE5jOiJyb3dncm91cCIsT2M6InJvd2hlYWRlciIsUWM6InNjcm9sbGJhciIsUmM6InNlYXJjaCIsVGM6InNlcGFyYXRvciIsVmM6InNsaWRlciIsWGM6InNwaW5idXR0b24iLFljOiJzdGF0dXMiLFpjOiJzd2l0Y2giLGFkOiJ0YWIiLGJkOiJ0YWJsaXN0IixjZDoidGFicGFuZWwiLGRkOiJ0ZXh0Ym94IixlZDoidGV4dGluZm8iLGZkOiJ0aW1lciIsZ2Q6InRvb2xiYXIiLGhkOiJ0b29sdGlwIixqZDoidHJlZSIsa2Q6InRyZWVncmlkIixsZDoidHJlZWl0ZW0ifTt2YXIgWmI9ZnVuY3Rpb24oYSxiKXtiPyhwKENhKFliLGIpLCJObyBzdWNoIEFSSUEgcm9sZSAiK2IpLGEuc2V0QXR0cmlidXRlKCJyb2xlIixiKSk6YS5yZW1vdmVBdHRyaWJ1dGUoInJvbGUiKX0sYWM9ZnVuY3Rpb24oYSxiLGMpe0FycmF5LmlzQXJyYXkoYykmJihjPWMuam9pbigiICIpKTt2YXIgZD0kYihiKTtjPT09IiJ8fGM9PXZvaWQgMD8oWGJ8fChjPXt9LFhiPShjLmF0b21pYz0hMSxjLmF1dG9jb21wbGV0ZT0ibm9uZSIsYy5kcm9wZWZmZWN0PSJub25lIixjLmhhc3BvcHVwPSExLGMubGl2ZT0ib2ZmIixjLm11bHRpbGluZT0hMSxjLm11bHRpc2VsZWN0YWJsZT0hMSxjLm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIsYy5yZWFkb25seT0hMSxjLnJlbGV2YW50PSJhZGRpdGlvbnMgdGV4dCIsYy5yZXF1aXJlZD0hMSxjLnNvcnQ9Im5vbmUiLGMuYnVzeT0hMSxjLmRpc2FibGVkPSExLGMuaGlkZGVuPSExLGMuaW52YWxpZD0iZmFsc2UiLGMpKSxjPVhiLGIgaW4gYz9hLnNldEF0dHJpYnV0ZShkLApjW2JdKTphLnJlbW92ZUF0dHJpYnV0ZShkKSk6YS5zZXRBdHRyaWJ1dGUoZCxjKX0sJGI9ZnVuY3Rpb24oYSl7cChhLCJBUklBIGF0dHJpYnV0ZSBjYW5ub3QgYmUgZW1wdHkuIik7cChDYShXYixhKSwiTm8gc3VjaCBBUklBIGF0dHJpYnV0ZSAiK2EpO3JldHVybiJhcmlhLSIrYX07dmFyIGRjPWZ1bmN0aW9uKGEsYixjLGQsZSxmKXtpZih2JiZlKXJldHVybiBiYyhhKTtpZihlJiYhZClyZXR1cm4hMTtpZighdCl7dHlwZW9mIGI9PT0ibnVtYmVyIiYmKGI9Y2MoYikpO3ZhciBoPWI9PTE3fHxiPT0xOHx8diYmYj09OTE7aWYoKCFjfHx2KSYmaHx8diYmYj09MTYmJihkfHxmKSlyZXR1cm4hMX1pZih1JiZkJiZjKXN3aXRjaChhKXtjYXNlIDIyMDpjYXNlIDIxOTpjYXNlIDIyMTpjYXNlIDE5MjpjYXNlIDE4NjpjYXNlIDE4OTpjYXNlIDE4NzpjYXNlIDE4ODpjYXNlIDE5MDpjYXNlIDE5MTpjYXNlIDE5MjpjYXNlIDIyMjpyZXR1cm4hMX1zd2l0Y2goYSl7Y2FzZSAxMzpyZXR1cm4gdD9mfHxlPyExOiEoYyYmZCk6ITA7Y2FzZSAyNzpyZXR1cm4hdSYmIXR9cmV0dXJuIHQmJihkfHxlfHxmKT8hMTpiYyhhKX0sYmM9ZnVuY3Rpb24oYSl7aWYoYT49NDgmJmE8PTU3fHxhPj05NiYmYTw9MTA2fHxhPj02NSYmYTw9OTB8fHUmJmE9PTApcmV0dXJuITA7c3dpdGNoKGEpe2Nhc2UgMzI6Y2FzZSA0MzpjYXNlIDYzOmNhc2UgNjQ6Y2FzZSAxMDc6Y2FzZSAxMDk6Y2FzZSAxMTA6Y2FzZSAxMTE6Y2FzZSAxODY6Y2FzZSA1OTpjYXNlIDE4OTpjYXNlIDE4NzpjYXNlIDYxOmNhc2UgMTg4OmNhc2UgMTkwOmNhc2UgMTkxOmNhc2UgMTkyOmNhc2UgMjIyOmNhc2UgMjE5OmNhc2UgMjIwOmNhc2UgMjIxOmNhc2UgMTYzOmNhc2UgNTg6cmV0dXJuITA7CmNhc2UgMTczOmNhc2UgMTcxOnJldHVybiB0O2RlZmF1bHQ6cmV0dXJuITF9fSxjYz1mdW5jdGlvbihhKXtpZih0KWE9ZWMoYSk7ZWxzZSBpZih2JiZ1KXN3aXRjaChhKXtjYXNlIDkzOmE9OTF9cmV0dXJuIGF9LGVjPWZ1bmN0aW9uKGEpe3N3aXRjaChhKXtjYXNlIDYxOnJldHVybiAxODc7Y2FzZSA1OTpyZXR1cm4gMTg2O2Nhc2UgMTczOnJldHVybiAxODk7Y2FzZSAyMjQ6cmV0dXJuIDkxO2Nhc2UgMDpyZXR1cm4gMjI0O2RlZmF1bHQ6cmV0dXJuIGF9fTt2YXIgZmM9ZnVuY3Rpb24oYSxiLGMsZCl7ei5jYWxsKHRoaXMsZCk7dGhpcy50eXBlPSJrZXkiO3RoaXMuZz1hO3RoaXMucmVwZWF0PWN9O24oZmMseik7dmFyIEo9ZnVuY3Rpb24oYSxiKXtELmNhbGwodGhpcyk7YSYmZ2ModGhpcyxhLGIpfTtuKEosRCk7Zz1KLnByb3RvdHlwZTtnLlI9bnVsbDtnLnFhPW51bGw7Zy5KYT1udWxsO2cucmE9bnVsbDtnLkY9LTE7Zy5LPS0xO2cuRGE9ITE7CnZhciBoYz17MzoxMywxMjoxNDQsNjMyMzI6MzgsNjMyMzM6NDAsNjMyMzQ6MzcsNjMyMzU6MzksNjMyMzY6MTEyLDYzMjM3OjExMyw2MzIzODoxMTQsNjMyMzk6MTE1LDYzMjQwOjExNiw2MzI0MToxMTcsNjMyNDI6MTE4LDYzMjQzOjExOSw2MzI0NDoxMjAsNjMyNDU6MTIxLDYzMjQ2OjEyMiw2MzI0NzoxMjMsNjMyNDg6NDQsNjMyNzI6NDYsNjMyNzM6MzYsNjMyNzU6MzUsNjMyNzY6MzMsNjMyNzc6MzQsNjMyODk6MTQ0LDYzMzAyOjQ1fSxpYz17VXA6MzgsRG93bjo0MCxMZWZ0OjM3LFJpZ2h0OjM5LEVudGVyOjEzLEYxOjExMixGMjoxMTMsRjM6MTE0LEY0OjExNSxGNToxMTYsRjY6MTE3LEY3OjExOCxGODoxMTksRjk6MTIwLEYxMDoxMjEsRjExOjEyMixGMTI6MTIzLCJVKzAwN0YiOjQ2LEhvbWU6MzYsRW5kOjM1LFBhZ2VVcDozMyxQYWdlRG93bjozNCxJbnNlcnQ6NDV9LGpjPXYmJnQ7CkoucHJvdG90eXBlLmc9ZnVuY3Rpb24oYSl7dSYmKHRoaXMuRj09MTcmJiFhLmN0cmxLZXl8fHRoaXMuRj09MTgmJiFhLmFsdEtleXx8diYmdGhpcy5GPT05MSYmIWEubWV0YUtleSkmJih0aGlzLks9dGhpcy5GPS0xKTt0aGlzLkY9PS0xJiYoYS5jdHJsS2V5JiZhLmchPTE3P3RoaXMuRj0xNzphLmFsdEtleSYmYS5nIT0xOD90aGlzLkY9MTg6YS5tZXRhS2V5JiZhLmchPTkxJiYodGhpcy5GPTkxKSk7ZGMoYS5nLHRoaXMuRixhLnNoaWZ0S2V5LGEuY3RybEtleSxhLmFsdEtleSxhLm1ldGFLZXkpPyh0aGlzLks9Y2MoYS5nKSxqYyYmKHRoaXMuRGE9YS5hbHRLZXkpKTp0aGlzLmhhbmRsZUV2ZW50KGEpfTtKLnByb3RvdHlwZS5oPWZ1bmN0aW9uKGEpe3RoaXMuSz10aGlzLkY9LTE7dGhpcy5EYT1hLmFsdEtleX07CkoucHJvdG90eXBlLmhhbmRsZUV2ZW50PWZ1bmN0aW9uKGEpe3ZhciBiPWEuaCxjPWIuYWx0S2V5O2lmKHUmJmEudHlwZT09ImtleXByZXNzIil7dmFyIGQ9dGhpcy5LO3ZhciBlPWIuY2hhckNvZGU+PTAmJmIuY2hhckNvZGU8NjMyMzImJmJjKGQpP2IuY2hhckNvZGU6MH1lbHNlIGEudHlwZT09ImtleXByZXNzIj8oamMmJihjPXRoaXMuRGEpLGIua2V5Q29kZT09Yi5jaGFyQ29kZT9iLmtleUNvZGU8MzI/KGQ9Yi5rZXlDb2RlLGU9MCk6KGQ9dGhpcy5LLGU9Yi5jaGFyQ29kZSk6KGQ9Yi5rZXlDb2RlfHx0aGlzLkssZT1iLmNoYXJDb2RlfHwwKSk6KGQ9Yi5rZXlDb2RlfHx0aGlzLkssZT1iLmNoYXJDb2RlfHwwKSx2JiZlPT02MyYmZD09MjI0JiYoZD0xOTEpO3ZhciBmPWQ9Y2MoZCk7ZD9kPj02MzIzMiYmZCBpbiBoYz9mPWhjW2RdOmQ9PTI1JiZhLnNoaWZ0S2V5JiYoZj05KTpiLmtleUlkZW50aWZpZXImJmIua2V5SWRlbnRpZmllciBpbiBpYyYmKGY9aWNbYi5rZXlJZGVudGlmaWVyXSk7CmlmKCF0fHxhLnR5cGUhPSJrZXlwcmVzcyJ8fGRjKGYsdGhpcy5GLGEuc2hpZnRLZXksYS5jdHJsS2V5LGMsYS5tZXRhS2V5KSlhPWY9PXRoaXMuRix0aGlzLkY9ZixiPW5ldyBmYyhmLGUsYSxiKSxiLmFsdEtleT1jLEUodGhpcyxiKX07Si5wcm90b3R5cGUuaT1mdW5jdGlvbigpe3JldHVybiB0aGlzLlJ9O3ZhciBnYz1mdW5jdGlvbihhLGIsYyl7YS5yYSYma2MoYSk7YS5SPWI7YS5xYT11YihhLlIsImtleXByZXNzIixhLGMpO2EuSmE9dWIoYS5SLCJrZXlkb3duIixhLmcsYyxhKTthLnJhPXViKGEuUiwia2V5dXAiLGEuaCxjLGEpfSxrYz1mdW5jdGlvbihhKXthLnFhJiYoQShhLnFhKSxBKGEuSmEpLEEoYS5yYSksYS5xYT1udWxsLGEuSmE9bnVsbCxhLnJhPW51bGwpO2EuUj1udWxsO2EuRj0tMTthLks9LTF9O0oucHJvdG90eXBlLkM9ZnVuY3Rpb24oKXtKLmwuQy5jYWxsKHRoaXMpO2tjKHRoaXMpfTt2YXIgSz17Z2E6Im1vdXNlZG93biIsaGE6Im1vdXNldXAiLGZhOiJtb3VzZWNhbmNlbCIsc2M6Im1vdXNlbW92ZSIsdWM6Im1vdXNlb3ZlciIsdGM6Im1vdXNlb3V0IixxYzoibW91c2VlbnRlciIscmM6Im1vdXNlbGVhdmUifTt2YXIgbGM9ZnVuY3Rpb24oYSl7cmV0dXJuIHR5cGVvZiBhLmNsYXNzTmFtZT09InN0cmluZyI/YS5jbGFzc05hbWU6YS5nZXRBdHRyaWJ1dGUmJmEuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIn0sTD1mdW5jdGlvbihhKXtyZXR1cm4gYS5jbGFzc0xpc3Q/YS5jbGFzc0xpc3Q6bGMoYSkubWF0Y2goL1xTKy9nKXx8W119LG1jPWZ1bmN0aW9uKGEsYil7dHlwZW9mIGEuY2xhc3NOYW1lPT0ic3RyaW5nIj9hLmNsYXNzTmFtZT1iOmEuc2V0QXR0cmlidXRlJiZhLnNldEF0dHJpYnV0ZSgiY2xhc3MiLGIpfSxuYz1mdW5jdGlvbihhLGIpe2EuY2xhc3NMaXN0P2I9YS5jbGFzc0xpc3QuY29udGFpbnMoYik6KGE9TChhKSxiPXZhKGEsYik+PTApO3JldHVybiBifSxvYz1mdW5jdGlvbihhLGIpe2lmKGEuY2xhc3NMaXN0KWEuY2xhc3NMaXN0LmFkZChiKTtlbHNlIGlmKCFuYyhhLGIpKXt2YXIgYz1sYyhhKTttYyhhLGMrKGMubGVuZ3RoPjA/IiAiK2I6YikpfX0scGM9ZnVuY3Rpb24oYSxiKXtpZihhLmNsYXNzTGlzdClBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGIsCmZ1bmN0aW9uKGUpe29jKGEsZSl9KTtlbHNle3ZhciBjPXt9O0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoTChhKSxmdW5jdGlvbihlKXtjW2VdPSEwfSk7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChiLGZ1bmN0aW9uKGUpe2NbZV09ITB9KTtiPSIiO2Zvcih2YXIgZCBpbiBjKWIrPWIubGVuZ3RoPjA/IiAiK2Q6ZDttYyhhLGIpfX0scWM9ZnVuY3Rpb24oYSxiKXthLmNsYXNzTGlzdD9hLmNsYXNzTGlzdC5yZW1vdmUoYik6bmMoYSxiKSYmbWMoYSxBcnJheS5wcm90b3R5cGUuZmlsdGVyLmNhbGwoTChhKSxmdW5jdGlvbihjKXtyZXR1cm4gYyE9Yn0pLmpvaW4oIiAiKSl9LHJjPWZ1bmN0aW9uKGEsYil7YS5jbGFzc0xpc3Q/QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChiLGZ1bmN0aW9uKGMpe3FjKGEsYyl9KTptYyhhLEFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbChMKGEpLGZ1bmN0aW9uKGMpe3JldHVybiEodmEoYixjKT49MCl9KS5qb2luKCIgIikpfTt2YXIgdGM9ZnVuY3Rpb24oYSxiKXtpZighYSl0aHJvdyBFcnJvcigiSW52YWxpZCBjbGFzcyBuYW1lICIrYSk7aWYodHlwZW9mIGIhPT0iZnVuY3Rpb24iKXRocm93IEVycm9yKCJJbnZhbGlkIGRlY29yYXRvciBmdW5jdGlvbiAiK2IpO3NjW2FdPWJ9LHVjPXt9LHNjPXt9O3ZhciB2Yz1mdW5jdGlvbihhKXt0aGlzLkE9YX07aWEodmMpO3ZhciB3Yz1mdW5jdGlvbihhLGIpe2EmJihhLnRhYkluZGV4PWI/MDotMSl9LHljPWZ1bmN0aW9uKGEsYixjKXtjLmlkJiZQYihiLGMuaWQpO3ZhciBkPWEuZygpLGU9ITEsZj1MKGMpO2YmJkFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoZixmdW5jdGlvbihoKXtoPT1kP2U9ITA6aCYmdGhpcy51KGIsaCxkKX0sYSk7ZXx8b2MoYyxkKTt4YyhiLGMpO3JldHVybiBjfTt2Yy5wcm90b3R5cGUudT1mdW5jdGlvbihhLGIsYyl7Yj09YysiLWRpc2FibGVkIj9hLlgoITEpOmI9PWMrIi1ob3Jpem9udGFsIj96YyhhLCJob3Jpem9udGFsIik6Yj09YysiLXZlcnRpY2FsIiYmemMoYSwidmVydGljYWwiKX07CnZhciB4Yz1mdW5jdGlvbihhLGIpe2lmKGIpZm9yKHZhciBjPWIuZmlyc3RDaGlsZCxkO2MmJmMucGFyZW50Tm9kZT09Yjspe2Q9Yy5uZXh0U2libGluZztpZihjLm5vZGVUeXBlPT0xKXthOnt2YXIgZT1jO3AoZSk7ZT1MKGUpO2Zvcih2YXIgZj1lLmxlbmd0aCxoPTA7aDxmO2grKyl7dmFyIGs9ZVtoXTtpZihrPWsgaW4gc2M/c2Nba10oKTpudWxsKXtlPWs7YnJlYWsgYX19ZT1udWxsfWUmJihlLmc9YyxhLmlzRW5hYmxlZCgpfHxlLlgoITEpLGEuQmEoZSksU2IoZSxjKSl9ZWxzZSBjLm5vZGVWYWx1ZSYmSGEoYy5ub2RlVmFsdWUpIT0iInx8Yi5yZW1vdmVDaGlsZChjKTtjPWR9fSxBYz1mdW5jdGlvbihhLGIpe2I9Yi5pKCk7cChiLCJUaGUgY29udGFpbmVyIERPTSBlbGVtZW50IGNhbm5vdCBiZSBudWxsLiIpO0tiKGIsdCk7KGE9YS5BKSYmWmIoYixhKX07dmMucHJvdG90eXBlLmc9ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy1jb250YWluZXIifTsKdmMucHJvdG90eXBlLmo9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nKCksYz1bYixhLkw9PSJob3Jpem9udGFsIj9iKyItaG9yaXpvbnRhbCI6YisiLXZlcnRpY2FsIl07YS5pc0VuYWJsZWQoKXx8Yy5wdXNoKGIrIi1kaXNhYmxlZCIpO3JldHVybiBjfTt2YXIgQmM9ZnVuY3Rpb24oKXt9O3ZhciBNPWZ1bmN0aW9uKCl7fSxDYztpYShNKTt2YXIgRGM9e2J1dHRvbjoicHJlc3NlZCIsY2hlY2tib3g6ImNoZWNrZWQiLG1lbnVpdGVtOiJzZWxlY3RlZCIsbWVudWl0ZW1jaGVja2JveDoiY2hlY2tlZCIsbWVudWl0ZW1yYWRpbzoiY2hlY2tlZCIscmFkaW86ImNoZWNrZWQiLHRhYjoic2VsZWN0ZWQiLHRyZWVpdGVtOiJzZWxlY3RlZCJ9O00ucHJvdG90eXBlLk5hPWZ1bmN0aW9uKCl7fTtNLnByb3RvdHlwZS54YT1mdW5jdGlvbihhKXt2YXIgYj1hLkcsYz1iLmgsZD10aGlzLk4oKSxlPVtkXSxmPXRoaXMuTigpO2YhPWQmJmUucHVzaChmKTtkPWEubTtmb3IoZj1bXTtkOyl7dmFyIGg9ZCYtZDtmLnB1c2goRWModGhpcyxoKSk7ZCY9fmh9ZS5wdXNoLmFwcGx5KGUsZik7KGQ9YS5GYSkmJmUucHVzaC5hcHBseShlLGQpO3JldHVybiBjLmNhbGwoYiwiRElWIixlLmpvaW4oIiAiKSxhLmlhKX07Ck0ucHJvdG90eXBlLnlhPWZ1bmN0aW9uKGEsYil7Yi5pZCYmUGIoYSxiLmlkKTtiJiZiLmZpcnN0Q2hpbGQ/RmMoYSxiLmZpcnN0Q2hpbGQubmV4dFNpYmxpbmc/eWEoYi5jaGlsZE5vZGVzKTpiLmZpcnN0Q2hpbGQpOmEuaWE9bnVsbDt2YXIgYz0wLGQ9dGhpcy5OKCksZT10aGlzLk4oKSxmPSExLGg9ITEsaz15YShMKGIpKTtrLmZvckVhY2goZnVuY3Rpb24ocSl7Znx8cSE9ZD9ofHxxIT1lP2N8PUdjKHRoaXMscSk6aD0hMDooZj0hMCxlPT1kJiYoaD0hMCkpO0djKHRoaXMscSk9PTEmJihzYShiKSxkYihiKSYmZWIoYikmJmNiKGIsITEpKX0sdGhpcyk7YS5tPWM7Znx8KGsucHVzaChkKSxlPT1kJiYoaD0hMCkpO2h8fGsucHVzaChlKTsoYT1hLkZhKSYmay5wdXNoLmFwcGx5KGssYSk7ZiYmaCYmIWF8fG1jKGIsay5qb2luKCIgIikpO3JldHVybiBifTsKdmFyIEhjPWZ1bmN0aW9uKGEsYil7aWYoYT1hLk5hKCkpe3AoYiwiVGhlIGVsZW1lbnQgcGFzc2VkIGFzIGEgZmlyc3QgcGFyYW1ldGVyIGNhbm5vdCBiZSBudWxsLiIpO3ZhciBjPWIuZ2V0QXR0cmlidXRlKCJyb2xlIil8fG51bGw7YSE9YyYmWmIoYixhKX19LEljPWZ1bmN0aW9uKGEsYil7dmFyIGM7aWYoYS5EJjMyJiYoYz1hLmkoKSkpe2lmKCFiJiZhLm0mMzIpe3RyeXtjLmJsdXIoKX1jYXRjaChkKXt9YS5tJjMyJiZhLlFhKG51bGwpfShkYihjKSYmZWIoYykpIT1iJiZjYihjLGIpfX0sSmM9ZnVuY3Rpb24oYSxiLGMpe0NjfHwoQ2M9ezE6ImRpc2FibGVkIiw4OiJzZWxlY3RlZCIsMTY6ImNoZWNrZWQiLDY0OiJleHBhbmRlZCJ9KTtwKGEsIlRoZSBlbGVtZW50IHBhc3NlZCBhcyBhIGZpcnN0IHBhcmFtZXRlciBjYW5ub3QgYmUgbnVsbC4iKTtiPUNjW2JdO3ZhciBkPWEuZ2V0QXR0cmlidXRlKCJyb2xlIil8fG51bGw7ZCYmKGQ9RGNbZF18fGIsYj1iPT0iY2hlY2tlZCJ8fGI9PQoic2VsZWN0ZWQiP2Q6Yik7YiYmYWMoYSxiLGMpfTtNLnByb3RvdHlwZS5OPWZ1bmN0aW9uKCl7cmV0dXJuImdvb2ctY29udHJvbCJ9O3ZhciBFYz1mdW5jdGlvbihhLGIpe2EuZ3x8S2MoYSk7cmV0dXJuIGEuZ1tiXX0sR2M9ZnVuY3Rpb24oYSxiKXthLmh8fChhLmd8fEtjKGEpLGEuaD1FYShhLmcpKTthPXBhcnNlSW50KGEuaFtiXSwxMCk7cmV0dXJuIGlzTmFOKGEpPzA6YX0sS2M9ZnVuY3Rpb24oYSl7dmFyIGI9YS5OKCk7dmFyIGM9Yi5yZXBsYWNlKC9ceGEwfFxzL2csIiAiKS5pbmRleE9mKCIgIikhPS0xO3AoIWMsIkNvbnRyb2xSZW5kZXJlciBoYXMgYW4gaW52YWxpZCBjc3MgY2xhc3M6ICciK2IrIiciKTthLmc9ezE6YisiLWRpc2FibGVkIiwyOmIrIi1ob3ZlciIsNDpiKyItYWN0aXZlIiw4OmIrIi1zZWxlY3RlZCIsMTY6YisiLWNoZWNrZWQiLDMyOmIrIi1mb2N1c2VkIiw2NDpiKyItb3BlbiJ9fTt2YXIgTj1mdW5jdGlvbihhLGIsYyl7Ri5jYWxsKHRoaXMsYyk7aWYoIWIpe2ZvcihiPXRoaXMuY29uc3RydWN0b3I7Yjspe3ZhciBkPW5hKGIpO2lmKGQ9dWNbZF0pYnJlYWs7Yj0oYj1PYmplY3QuZ2V0UHJvdG90eXBlT2YoYi5wcm90b3R5cGUpKSYmYi5jb25zdHJ1Y3Rvcn1iPWQ/dHlwZW9mIGQuVj09PSJmdW5jdGlvbiI/ZC5WKCk6bmV3IGQ6bnVsbH10aGlzLnY9Yjt0aGlzLmlhPWEhPT12b2lkIDA/YTpudWxsfTtuKE4sRik7Zz1OLnByb3RvdHlwZTtnLmlhPW51bGw7Zy5tPTA7Zy5EPTM5O2cuUD0wO2cuT2E9ITA7Zy5GYT1udWxsO2cuSGE9ITA7Zy5tYT1mdW5jdGlvbigpe3ZhciBhPXRoaXMudi54YSh0aGlzKTt0aGlzLmc9YTtIYyh0aGlzLnYsYSk7S2IoYSwhMCk7dGhpcy5pc1Zpc2libGUoKXx8KGEuc3R5bGUuZGlzcGxheT0ibm9uZSIsYSYmYWMoYSwiaGlkZGVuIiwhMCkpfTtnLm5hPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaSgpfTtnLndhPWZ1bmN0aW9uKCl7cmV0dXJuITB9OwpnLkVhPWZ1bmN0aW9uKGEpe3RoaXMuZz1hPXRoaXMudi55YSh0aGlzLGEpO0hjKHRoaXMudixhKTtLYihhLCEwKTt0aGlzLk9hPWEuc3R5bGUuZGlzcGxheSE9Im5vbmUifTsKZy5JPWZ1bmN0aW9uKCl7Ti5sLkkuY2FsbCh0aGlzKTt2YXIgYT10aGlzLmc7cChhLCJDYW4gbm90IGNhbGwgZ2V0RWxlbWVudFN0cmljdCBiZWZvcmUgcmVuZGVyaW5nL2RlY29yYXRpbmcuIik7cCh0aGlzKTtwKGEpO3RoaXMuaXNWaXNpYmxlKCl8fGFjKGEsImhpZGRlbiIsIXRoaXMuaXNWaXNpYmxlKCkpO3RoaXMuaXNFbmFibGVkKCl8fEpjKGEsMSwhdGhpcy5pc0VuYWJsZWQoKSk7dGhpcy5EJjgmJkpjKGEsOCwhISh0aGlzLm0mOCkpO3RoaXMuRCYxNiYmSmMoYSwxNiwhISh0aGlzLm0mMTYpKTt0aGlzLkQmNjQmJkpjKGEsNjQsISEodGhpcy5tJjY0KSk7dmFyIGI9dGhpcy52O1ViKHRoaXMpJiYoYT10aGlzLmkoKSxiPWIuTigpKyItcnRsIiwoYT1hLmk/YS5pKCk6YSkmJnBjKGEsW2JdKSk7dGhpcy5pc0VuYWJsZWQoKSYmSWModGhpcyx0aGlzLmlzVmlzaWJsZSgpKTt0aGlzLkQmLTImJih0aGlzLkhhJiZMYyh0aGlzLCEwKSx0aGlzLkQmMzImJihhPXRoaXMuaSgpKSkmJihiPQp0aGlzLlp8fCh0aGlzLlo9bmV3IEopLGdjKGIsYSksQihCKEIoUWIodGhpcyksYiwia2V5Iix0aGlzLmFhKSxhLCJmb2N1cyIsdGhpcy5YYSksYSwiYmx1ciIsdGhpcy5RYSkpfTt2YXIgTGM9ZnVuY3Rpb24oYSxiKXt2YXIgYz1RYihhKSxkPWEuaSgpO2I/KEIoQihCKEIoYyxkLEsuZ2EsYS5zYSksZCxbSy5oYSxLLmZhXSxhLnZhKSxkLCJtb3VzZW92ZXIiLGEudWEpLGQsIm1vdXNlb3V0IixhLnRhKSxhLmNhIT1CYyYmQihjLGQsImNvbnRleHRtZW51IixhLmNhKSk6KEMoQyhDKEMoYyxkLEsuZ2EsYS5zYSksZCxbSy5oYSxLLmZhXSxhLnZhKSxkLCJtb3VzZW92ZXIiLGEudWEpLGQsIm1vdXNlb3V0IixhLnRhKSxhLmNhIT1CYyYmQyhjLGQsImNvbnRleHRtZW51IixhLmNhKSl9O04ucHJvdG90eXBlLlU9ZnVuY3Rpb24oKXtOLmwuVS5jYWxsKHRoaXMpO3RoaXMuWiYma2ModGhpcy5aKTt0aGlzLmlzVmlzaWJsZSgpJiZ0aGlzLmlzRW5hYmxlZCgpJiZJYyh0aGlzLCExKX07Ck4ucHJvdG90eXBlLkM9ZnVuY3Rpb24oKXtOLmwuQy5jYWxsKHRoaXMpO3RoaXMuWiYmKHRoaXMuWi5kaXNwb3NlKCksZGVsZXRlIHRoaXMuWik7ZGVsZXRlIHRoaXMudjt0aGlzLkZhPXRoaXMuaWE9bnVsbH07dmFyIEZjPWZ1bmN0aW9uKGEsYil7YS5pYT1ifTtOLnByb3RvdHlwZS5pc1Zpc2libGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5PYX07Ti5wcm90b3R5cGUuaXNFbmFibGVkPWZ1bmN0aW9uKCl7cmV0dXJuISh0aGlzLm0mMSl9O04ucHJvdG90eXBlLlg9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5oO2ImJnR5cGVvZiBiLmlzRW5hYmxlZD09ImZ1bmN0aW9uIiYmIWIuaXNFbmFibGVkKCl8fCFPKHRoaXMsMSwhYSl8fChhfHwoTWModGhpcywhMSksUCh0aGlzLCExKSksdGhpcy5pc1Zpc2libGUoKSYmSWModGhpcyxhKSxUKHRoaXMsMSwhYSwhMCkpfTt2YXIgUD1mdW5jdGlvbihhLGIpe08oYSwyLGIpJiZUKGEsMixiKX07Ck4ucHJvdG90eXBlLmlzQWN0aXZlPWZ1bmN0aW9uKCl7cmV0dXJuISEodGhpcy5tJjQpfTsKdmFyIE1jPWZ1bmN0aW9uKGEsYil7TyhhLDQsYikmJlQoYSw0LGIpfSxOYz1mdW5jdGlvbihhLGIpe08oYSw4LGIpJiZUKGEsOCxiKX0sT2M9ZnVuY3Rpb24oYSxiKXtPKGEsNjQsYikmJlQoYSw2NCxiKX0sVD1mdW5jdGlvbihhLGIsYyxkKXtpZighZCYmYj09MSlhLlgoIWMpO2Vsc2UgaWYoYS5EJmImJmMhPSEhKGEubSZiKSl7dmFyIGU9YS52O2lmKGQ9YS5pKCkpe2lmKGU9RWMoZSxiKSl7dmFyIGY9YS5pP2EuaSgpOmE7ZiYmKGM/cGM6cmMpKGYsW2VdKX1KYyhkLGIsYyl9YS5tPWM/YS5tfGI6YS5tJn5ifX0sUGM9ZnVuY3Rpb24oYSxiLGMpe2lmKGEucyYmYS5tJmImJiFjKXRocm93IEVycm9yKCJDb21wb25lbnQgYWxyZWFkeSByZW5kZXJlZCIpOyFjJiZhLm0mYiYmVChhLGIsITEpO2EuRD1jP2EuRHxiOmEuRCZ+Yn0sVT1mdW5jdGlvbihhLGIpe3JldHVybiEhKDI1NSZiKSYmISEoYS5EJmIpfSxPPWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4hIShhLkQmYikmJiEhKGEubSZiKSE9CmMmJighKGEuUCZiKXx8RShhLE5iKGIsYykpKSYmIWEuYmF9O04ucHJvdG90eXBlLnVhPWZ1bmN0aW9uKGEpeyFRYyhhLHRoaXMuaSgpKSYmRSh0aGlzLCJlbnRlciIpJiZ0aGlzLmlzRW5hYmxlZCgpJiZVKHRoaXMsMikmJlAodGhpcywhMCl9O04ucHJvdG90eXBlLnRhPWZ1bmN0aW9uKGEpeyFRYyhhLHRoaXMuaSgpKSYmRSh0aGlzLCJsZWF2ZSIpJiYoVSh0aGlzLDQpJiZNYyh0aGlzLCExKSxVKHRoaXMsMikmJlAodGhpcywhMSkpfTtOLnByb3RvdHlwZS5jYT1CYzt2YXIgUWM9ZnVuY3Rpb24oYSxiKXtyZXR1cm4hIWEucmVsYXRlZFRhcmdldCYmYWIoYixhLnJlbGF0ZWRUYXJnZXQpfTsKTi5wcm90b3R5cGUuc2E9ZnVuY3Rpb24oYSl7aWYodGhpcy5pc0VuYWJsZWQoKSYmKFUodGhpcywyKSYmUCh0aGlzLCEwKSwhKGEuaC5idXR0b24hPTB8fHYmJmEuY3RybEtleSkpKXtVKHRoaXMsNCkmJk1jKHRoaXMsITApO3ZhciBiO2lmKGI9dGhpcy52KXt2YXIgYztiPXRoaXMuRCYzMiYmKGM9dGhpcy5pKCkpP2RiKGMpJiZlYihjKTohMX1iJiZ0aGlzLmkoKS5mb2N1cygpfWEuaC5idXR0b24hPTB8fHYmJmEuY3RybEtleXx8YS5qKCl9O04ucHJvdG90eXBlLnZhPWZ1bmN0aW9uKGEpe3RoaXMuaXNFbmFibGVkKCkmJihVKHRoaXMsMikmJlAodGhpcywhMCksdGhpcy5pc0FjdGl2ZSgpJiZSYyh0aGlzLGEpJiZVKHRoaXMsNCkmJk1jKHRoaXMsITEpKX07CnZhciBSYz1mdW5jdGlvbihhLGIpe2lmKFUoYSwxNikpe3ZhciBjPSEoYS5tJjE2KTtPKGEsMTYsYykmJlQoYSwxNixjKX1VKGEsOCkmJk5jKGEsITApO1UoYSw2NCkmJk9jKGEsIShhLm0mNjQpKTtjPW5ldyB5KCJhY3Rpb24iLGEpO2ImJihjLmFsdEtleT1iLmFsdEtleSxjLmN0cmxLZXk9Yi5jdHJsS2V5LGMubWV0YUtleT1iLm1ldGFLZXksYy5zaGlmdEtleT1iLnNoaWZ0S2V5LGMuRz1iLkcsYy50aW1lU3RhbXA9Yi50aW1lU3RhbXApO3JldHVybiBFKGEsYyl9O04ucHJvdG90eXBlLlhhPWZ1bmN0aW9uKCl7VSh0aGlzLDMyKSYmTyh0aGlzLDMyLCEwKSYmVCh0aGlzLDMyLCEwKX07Ti5wcm90b3R5cGUuUWE9ZnVuY3Rpb24oKXtVKHRoaXMsNCkmJk1jKHRoaXMsITEpO1UodGhpcywzMikmJk8odGhpcywzMiwhMSkmJlQodGhpcywzMiwhMSl9OwpOLnByb3RvdHlwZS5hYT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5pc1Zpc2libGUoKSYmdGhpcy5pc0VuYWJsZWQoKSYmYS5nPT0xMyYmUmModGhpcyxhKT8oYS5qKCksYS52KCksITApOiExfTtpZih0eXBlb2YgTiE9PSJmdW5jdGlvbiIpdGhyb3cgRXJyb3IoIkludmFsaWQgY29tcG9uZW50IGNsYXNzICIrTik7aWYodHlwZW9mIE0hPT0iZnVuY3Rpb24iKXRocm93IEVycm9yKCJJbnZhbGlkIHJlbmRlcmVyIGNsYXNzICIrTSk7dmFyIFNjPW5hKE4pO3VjW1NjXT1NO3RjKCJnb29nLWNvbnRyb2wiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBOKG51bGwpfSk7dmFyIFY9ZnVuY3Rpb24oYSxiLGMpe0YuY2FsbCh0aGlzLGMpO3RoaXMuZWE9Ynx8dmMuVigpO3RoaXMuTD1hfHwidmVydGljYWwifTtuKFYsRik7Zz1WLnByb3RvdHlwZTtnLkthPW51bGw7Zy5kYT1udWxsO2cuZWE9bnVsbDtnLkw9bnVsbDtnLlM9ITA7Zy5UPSEwO2cubz0tMTtnLkI9bnVsbDtnLlc9ITE7Zy5PPW51bGw7dmFyIFRjPWZ1bmN0aW9uKGEpe3JldHVybiBhLkthfHxhLmkoKX07Zz1WLnByb3RvdHlwZTtnLm1hPWZ1bmN0aW9uKCl7dGhpcy5nPXRoaXMuRy5oKCJESVYiLHRoaXMuZWEuaih0aGlzKS5qb2luKCIgIikpfTtnLm5hPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaSgpfTtnLndhPWZ1bmN0aW9uKGEpe3JldHVybiBhLnRhZ05hbWU9PSJESVYifTtnLkVhPWZ1bmN0aW9uKGEpe3RoaXMuZz15Yyh0aGlzLmVhLHRoaXMsYSk7YS5zdHlsZS5kaXNwbGF5PT0ibm9uZSImJih0aGlzLlM9ITEpfTsKZy5JPWZ1bmN0aW9uKCl7Vi5sLkkuY2FsbCh0aGlzKTtUYih0aGlzLGZ1bmN0aW9uKGIpe2IucyYmVWModGhpcyxiKX0sdGhpcyk7dmFyIGE9dGhpcy5pKCk7QWModGhpcy5lYSx0aGlzKTtWYyh0aGlzLHRoaXMuUyk7QihCKEIoQihCKEIoQihCKFFiKHRoaXMpLHRoaXMsImVudGVyIix0aGlzLmViKSx0aGlzLCJoaWdobGlnaHQiLHRoaXMuZmIpLHRoaXMsInVuaGlnaGxpZ2h0Iix0aGlzLmxiKSx0aGlzLCJvcGVuIix0aGlzLmdiKSx0aGlzLCJjbG9zZSIsdGhpcy5iYiksYSxLLmdhLHRoaXMuV2EpLGJiKGEpLFtLLmhhLEsuZmFdLHRoaXMuY2IpLGEsW0suZ2EsSy5oYSxLLmZhLCJtb3VzZW92ZXIiLCJtb3VzZW91dCIsImNvbnRleHRtZW51Il0sdGhpcy5hYik7V2ModGhpcyl9O3ZhciBXYz1mdW5jdGlvbihhKXt2YXIgYj1RYihhKSxjPVRjKGEpO0IoQihCKGIsYywiZm9jdXMiLGEuUGEpLGMsImJsdXIiLGEuVWEpLGEuZGF8fChhLmRhPW5ldyBKKFRjKGEpKSksImtleSIsYS5WYSl9OwpnPVYucHJvdG90eXBlO2cuVT1mdW5jdGlvbigpe1hjKHRoaXMsLTEpO3RoaXMuQiYmT2ModGhpcy5CLCExKTt0aGlzLlc9ITE7Vi5sLlUuY2FsbCh0aGlzKX07Zy5DPWZ1bmN0aW9uKCl7Vi5sLkMuY2FsbCh0aGlzKTt0aGlzLmRhJiYodGhpcy5kYS5kaXNwb3NlKCksdGhpcy5kYT1udWxsKTt0aGlzLmVhPXRoaXMuQj10aGlzLk89dGhpcy5LYT1udWxsfTtnLmViPWZ1bmN0aW9uKCl7cmV0dXJuITB9OwpnLmZiPWZ1bmN0aW9uKGEpe3ZhciBiPVZiKHRoaXMsYS50YXJnZXQpO2lmKGI+LTEmJmIhPXRoaXMubyl7dmFyIGM9SSh0aGlzLHRoaXMubyk7YyYmUChjLCExKTt0aGlzLm89YjtjPUkodGhpcyx0aGlzLm8pO3RoaXMuVyYmTWMoYywhMCk7dGhpcy5CJiZjIT10aGlzLkImJihjLkQmNjQ/T2MoYywhMCk6T2ModGhpcy5CLCExKSl9Yj10aGlzLmkoKTtwKGIsIlRoZSBET00gZWxlbWVudCBmb3IgdGhlIGNvbnRhaW5lciBjYW5ub3QgYmUgbnVsbC4iKTthLnRhcmdldC5pKCkhPW51bGwmJmFjKGIsImFjdGl2ZWRlc2NlbmRhbnQiLGEudGFyZ2V0LmkoKS5pZCl9O2cubGI9ZnVuY3Rpb24oYSl7YS50YXJnZXQ9PUkodGhpcyx0aGlzLm8pJiYodGhpcy5vPS0xKTthPXRoaXMuaSgpO3AoYSwiVGhlIERPTSBlbGVtZW50IGZvciB0aGUgY29udGFpbmVyIGNhbm5vdCBiZSBudWxsLiIpO2EucmVtb3ZlQXR0cmlidXRlKCRiKCJhY3RpdmVkZXNjZW5kYW50IikpfTsKZy5nYj1mdW5jdGlvbihhKXsoYT1hLnRhcmdldCkmJmEhPXRoaXMuQiYmYS5oPT10aGlzJiYodGhpcy5CJiZPYyh0aGlzLkIsITEpLHRoaXMuQj1hKX07Zy5iYj1mdW5jdGlvbihhKXthLnRhcmdldD09dGhpcy5CJiYodGhpcy5CPW51bGwpO3ZhciBiPXRoaXMuaSgpLGM9YS50YXJnZXQuaSgpO2ImJmEudGFyZ2V0Lm0mMiYmYyYmKGE9IiIsYyYmKGE9Yy5pZCxwKGEsIlRoZSBhY3RpdmUgZWxlbWVudCBzaG91bGQgaGF2ZSBhbiBpZC4iKSksYWMoYiwiYWN0aXZlZGVzY2VuZGFudCIsYSkpfTtnLldhPWZ1bmN0aW9uKGEpe3RoaXMuVCYmKHRoaXMuVz0hMCk7dmFyIGI9VGModGhpcyk7YiYmZGIoYikmJmViKGIpP2IuZm9jdXMoKTphLmooKX07Zy5jYj1mdW5jdGlvbigpe3RoaXMuVz0hMX07CmcuYWI9ZnVuY3Rpb24oYSl7YTp7dmFyIGI9YS50YXJnZXQ7aWYodGhpcy5PKWZvcih2YXIgYz10aGlzLmkoKTtiJiZiIT09Yzspe3ZhciBkPWIuaWQ7aWYoZCBpbiB0aGlzLk8pe2I9dGhpcy5PW2RdO2JyZWFrIGF9Yj1iLnBhcmVudE5vZGV9Yj1udWxsfWlmKGIpc3dpdGNoKGEudHlwZSl7Y2FzZSBLLmdhOmIuc2EoYSk7YnJlYWs7Y2FzZSBLLmhhOmNhc2UgSy5mYTpiLnZhKGEpO2JyZWFrO2Nhc2UgIm1vdXNlb3ZlciI6Yi51YShhKTticmVhaztjYXNlICJtb3VzZW91dCI6Yi50YShhKTticmVhaztjYXNlICJjb250ZXh0bWVudSI6Yi5jYShhKX19O2cuUGE9ZnVuY3Rpb24oKXt9O2cuVWE9ZnVuY3Rpb24oKXtYYyh0aGlzLC0xKTt0aGlzLlc9ITE7dGhpcy5CJiZPYyh0aGlzLkIsITEpfTsKZy5WYT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5pc0VuYWJsZWQoKSYmdGhpcy5pc1Zpc2libGUoKSYmKEgodGhpcykhPTB8fHRoaXMuS2EpJiZZYyh0aGlzLGEpPyhhLmooKSxhLnYoKSwhMCk6ITF9Owp2YXIgWWM9ZnVuY3Rpb24oYSxiKXt2YXIgYz1JKGEsYS5vKTtpZihjJiZ0eXBlb2YgYy5hYT09ImZ1bmN0aW9uIiYmYy5hYShiKXx8YS5CJiZhLkIhPWMmJnR5cGVvZiBhLkIuYWE9PSJmdW5jdGlvbiImJmEuQi5hYShiKSlyZXR1cm4hMDtpZihiLnNoaWZ0S2V5fHxiLmN0cmxLZXl8fGIubWV0YUtleXx8Yi5hbHRLZXkpcmV0dXJuITE7c3dpdGNoKGIuZyl7Y2FzZSAyNzpUYyhhKS5ibHVyKCk7YnJlYWs7Y2FzZSAzNjpaYyhhKTticmVhaztjYXNlIDM1OiRjKGEpO2JyZWFrO2Nhc2UgMzg6aWYoYS5MPT0idmVydGljYWwiKWFkKGEpO2Vsc2UgcmV0dXJuITE7YnJlYWs7Y2FzZSAzNzppZihhLkw9PSJob3Jpem9udGFsIilVYihhKT9iZChhKTphZChhKTtlbHNlIHJldHVybiExO2JyZWFrO2Nhc2UgNDA6aWYoYS5MPT0idmVydGljYWwiKWJkKGEpO2Vsc2UgcmV0dXJuITE7YnJlYWs7Y2FzZSAzOTppZihhLkw9PSJob3Jpem9udGFsIilVYihhKT9hZChhKTpiZChhKTtlbHNlIHJldHVybiExOwpicmVhaztkZWZhdWx0OnJldHVybiExfXJldHVybiEwfSxVYz1mdW5jdGlvbihhLGIpe3ZhciBjPWIuaSgpO2M9Yy5pZHx8KGMuaWQ9T2IoYikpO2EuT3x8KGEuTz17fSk7YS5PW2NdPWJ9O1YucHJvdG90eXBlLkJhPWZ1bmN0aW9uKGEsYil7dWEoYSxOLCJUaGUgY2hpbGQgb2YgYSBjb250YWluZXIgbXVzdCBiZSBhIGNvbnRyb2wiKTtWLmwuQmEuY2FsbCh0aGlzLGEsYil9O1YucHJvdG90eXBlLkNhPWZ1bmN0aW9uKGEsYixjKXt1YShhLE4pO2EuUHw9MjthLlB8PTY0O1BjKGEsMzIsITEpO2EucyYmMCE9YS5IYSYmTGMoYSwhMSk7YS5IYT0hMTt2YXIgZD1hLmg9PXRoaXM/VmIodGhpcyxhKTotMTtWLmwuQ2EuY2FsbCh0aGlzLGEsYixjKTthLnMmJnRoaXMucyYmVWModGhpcyxhKTthPWQ7YT09LTEmJihhPUgodGhpcykpO2E9PXRoaXMubz90aGlzLm89TWF0aC5taW4oSCh0aGlzKS0xLGIpOmE+dGhpcy5vJiZiPD10aGlzLm8/dGhpcy5vKys6YTx0aGlzLm8mJmI+dGhpcy5vJiZ0aGlzLm8tLX07CnZhciB6Yz1mdW5jdGlvbihhLGIpe2lmKGEuaSgpKXRocm93IEVycm9yKCJDb21wb25lbnQgYWxyZWFkeSByZW5kZXJlZCIpO2EuTD1ifTtWLnByb3RvdHlwZS5pc1Zpc2libGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5TfTt2YXIgVmM9ZnVuY3Rpb24oYSxiKXthLlM9Yjt2YXIgYz1hLmkoKTtjJiYoYy5zdHlsZS5kaXNwbGF5PWI/IiI6Im5vbmUiLHdjKFRjKGEpLGEuVCYmYS5TKSl9O1YucHJvdG90eXBlLmlzRW5hYmxlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLlR9O1YucHJvdG90eXBlLlg9ZnVuY3Rpb24oYSl7dGhpcy5UIT1hJiZFKHRoaXMsYT8iZW5hYmxlIjoiZGlzYWJsZSIpJiYoYT8odGhpcy5UPSEwLFRiKHRoaXMsZnVuY3Rpb24oYil7Yi5UYT9kZWxldGUgYi5UYTpiLlgoITApfSkpOihUYih0aGlzLGZ1bmN0aW9uKGIpe2IuaXNFbmFibGVkKCk/Yi5YKCExKTpiLlRhPSEwfSksdGhpcy5XPXRoaXMuVD0hMSksd2MoVGModGhpcyksYSYmdGhpcy5TKSl9Owp2YXIgWGM9ZnVuY3Rpb24oYSxiKXsoYj1JKGEsYikpP1AoYiwhMCk6YS5vPi0xJiZQKEkoYSxhLm8pLCExKX0sWmM9ZnVuY3Rpb24oYSl7Y2QoYSxmdW5jdGlvbihiLGMpe3JldHVybihiKzEpJWN9LEgoYSktMSl9LCRjPWZ1bmN0aW9uKGEpe2NkKGEsZnVuY3Rpb24oYixjKXtiLS07cmV0dXJuIGI8MD9jLTE6Yn0sMCl9LGJkPWZ1bmN0aW9uKGEpe2NkKGEsZnVuY3Rpb24oYixjKXtyZXR1cm4oYisxKSVjfSxhLm8pfSxhZD1mdW5jdGlvbihhKXtjZChhLGZ1bmN0aW9uKGIsYyl7Yi0tO3JldHVybiBiPDA/Yy0xOmJ9LGEubyl9LGNkPWZ1bmN0aW9uKGEsYixjKXtjPWM8MD9WYihhLGEuQik6Yzt2YXIgZD1IKGEpO2M9Yi5jYWxsKGEsYyxkKTtmb3IodmFyIGU9MDtlPD1kOyl7dmFyIGY9SShhLGMpO2lmKGYmJmYuaXNWaXNpYmxlKCkmJmYuaXNFbmFibGVkKCkmJmYuRCYyKXthLkxhKGMpO2JyZWFrfWUrKztjPWIuY2FsbChhLGMsZCl9fTsKVi5wcm90b3R5cGUuTGE9ZnVuY3Rpb24oYSl7WGModGhpcyxhKX07dmFyIGRkPWZ1bmN0aW9uKCl7fTtuKGRkLE0pO2lhKGRkKTtnPWRkLnByb3RvdHlwZTtnLk49ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy10YWIifTtnLk5hPWZ1bmN0aW9uKCl7cmV0dXJuInRhYiJ9O2cueGE9ZnVuY3Rpb24oYSl7dmFyIGI9ZGQubC54YS5jYWxsKHRoaXMsYSk7KGE9YS5HYSgpKSYmdGhpcy5NYShiLGEpO3JldHVybiBifTtnLnlhPWZ1bmN0aW9uKGEsYil7Yj1kZC5sLnlhLmNhbGwodGhpcyxhLGIpO3ZhciBjPXRoaXMuR2EoYik7YyYmKGEuUmE9Yyk7YS5tJjgmJihjPWEuaCkmJnR5cGVvZiBjLko9PT0iZnVuY3Rpb24iJiYoVChhLDgsITEpLGMuSihhKSk7cmV0dXJuIGJ9O2cuR2E9ZnVuY3Rpb24oYSl7cmV0dXJuIGEudGl0bGV8fCIifTtnLk1hPWZ1bmN0aW9uKGEsYil7YSYmKGEudGl0bGU9Ynx8IiIpfTt2YXIgZWQ9ZnVuY3Rpb24oYSxiLGMpe04uY2FsbCh0aGlzLGEsYnx8ZGQuVigpLGMpO1BjKHRoaXMsOCwhMCk7dGhpcy5QfD05fTtuKGVkLE4pO2VkLnByb3RvdHlwZS5HYT1mdW5jdGlvbigpe3JldHVybiB0aGlzLlJhfTtlZC5wcm90b3R5cGUuTWE9ZnVuY3Rpb24oYSl7dGhpcy52Lk1hKHRoaXMuaSgpLGEpO3RoaXMuUmE9YX07dGMoImdvb2ctdGFiIixmdW5jdGlvbigpe3JldHVybiBuZXcgZWQobnVsbCl9KTt2YXIgVz1mdW5jdGlvbigpe3RoaXMuQT0idGFibGlzdCJ9O24oVyx2Yyk7aWEoVyk7Vy5wcm90b3R5cGUuZz1mdW5jdGlvbigpe3JldHVybiJnb29nLXRhYi1iYXIifTtXLnByb3RvdHlwZS51PWZ1bmN0aW9uKGEsYixjKXt0aGlzLnZ8fCh0aGlzLmh8fGZkKHRoaXMpLHRoaXMudj1FYSh0aGlzLmgpKTt2YXIgZD10aGlzLnZbYl07ZD8oemMoYSxnZChkKSksYS52PWQpOlcubC51LmNhbGwodGhpcyxhLGIsYyl9O1cucHJvdG90eXBlLmo9ZnVuY3Rpb24oYSl7dmFyIGI9Vy5sLmouY2FsbCh0aGlzLGEpO3RoaXMuaHx8ZmQodGhpcyk7Yi5wdXNoKHRoaXMuaFthLnZdKTtyZXR1cm4gYn07dmFyIGZkPWZ1bmN0aW9uKGEpe3ZhciBiPWEuZygpO2EuaD17dG9wOmIrIi10b3AiLGJvdHRvbTpiKyItYm90dG9tIixzdGFydDpiKyItc3RhcnQiLGVuZDpiKyItZW5kIn19O3ZhciBYPWZ1bmN0aW9uKGEsYixjKXthPWF8fCJ0b3AiO3pjKHRoaXMsZ2QoYSkpO3RoaXMudj1hO1YuY2FsbCh0aGlzLHRoaXMuTCxifHxXLlYoKSxjKTtoZCh0aGlzKX07bihYLFYpO2c9WC5wcm90b3R5cGU7Zy5IPW51bGw7Zy5JPWZ1bmN0aW9uKCl7WC5sLkkuY2FsbCh0aGlzKTtoZCh0aGlzKX07Zy5DPWZ1bmN0aW9uKCl7WC5sLkMuY2FsbCh0aGlzKTt0aGlzLkg9bnVsbH07Zy5MYT1mdW5jdGlvbihhKXtYLmwuTGEuY2FsbCh0aGlzLGEpO3RoaXMuSihJKHRoaXMsYSkpfTtnLko9ZnVuY3Rpb24oYSl7YT9OYyhhLCEwKTp0aGlzLkgmJk5jKHRoaXMuSCwhMSl9Owp2YXIgaWQ9ZnVuY3Rpb24oYSxiKXtpZihiJiZiPT1hLkgpe2Zvcih2YXIgYz1WYihhLGIpLGQ9Yy0xO2I9SShhLGQpO2QtLSl7dmFyIGU9YjtpZihlLmlzVmlzaWJsZSgpJiZlLmlzRW5hYmxlZCgpKXthLkooYik7cmV0dXJufX1mb3IoYys9MTtiPUkoYSxjKTtjKyspaWYoZD1iLGQuaXNWaXNpYmxlKCkmJmQuaXNFbmFibGVkKCkpe2EuSihiKTtyZXR1cm59YS5KKG51bGwpfX07Zz1YLnByb3RvdHlwZTtnLmpiPWZ1bmN0aW9uKGEpe3RoaXMuSCYmdGhpcy5IIT1hLnRhcmdldCYmTmModGhpcy5ILCExKTt0aGlzLkg9YS50YXJnZXR9O2cua2I9ZnVuY3Rpb24oYSl7YS50YXJnZXQ9PXRoaXMuSCYmKHRoaXMuSD1udWxsKX07Zy5oYj1mdW5jdGlvbihhKXtpZCh0aGlzLGEudGFyZ2V0KX07Zy5pYj1mdW5jdGlvbihhKXtpZCh0aGlzLGEudGFyZ2V0KX07Zy5QYT1mdW5jdGlvbigpe0kodGhpcyx0aGlzLm8pfHxYYyh0aGlzLFZiKHRoaXMsdGhpcy5IfHxJKHRoaXMsMCkpKX07CnZhciBoZD1mdW5jdGlvbihhKXtCKEIoQihCKFFiKGEpLGEsInNlbGVjdCIsYS5qYiksYSwidW5zZWxlY3QiLGEua2IpLGEsImRpc2FibGUiLGEuaGIpLGEsImhpZGUiLGEuaWIpfSxnZD1mdW5jdGlvbihhKXtyZXR1cm4gYT09InN0YXJ0Inx8YT09ImVuZCI/InZlcnRpY2FsIjoiaG9yaXpvbnRhbCJ9O3RjKCJnb29nLXRhYi1iYXIiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBYfSk7ZnVuY3Rpb24gamQoYSl7dmFyIGI9e3RvcDoiYm90dG9tIixib3R0b206InRvcCIsc3RhcnQ6InJpZ2h0IixlbmQ6ImxlZnQifVthLmxvY2F0aW9uXSxjPWEuZWxlbWVudElkLGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTtkLnRleHRDb250ZW50PSJcbiAgICBmaWVsZHNldCB7XG4gICAgICBwYWRkaW5nOiAxMHB4O1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgIzM2OTtcbiAgICB9XG5cbiAgICAjIitjKyIgLmdvb2ctdGFiLWNvbnRlbnQge1xuICAgICAgbWluLWhlaWdodDogM2VtO1xuICAgICAgbWFyZ2luOiAwO1xuICAgICAgYm9yZGVyOiAiK2EuYm9yZGVyKyIgc29saWQgIithLmJvcmRlckNvbG9yKyI7XG4gICAgICBib3JkZXItdG9wOiAwO1xuICAgICAgaGVpZ2h0OiAiK2EuY29udGVudEhlaWdodCsiO1xuICAgICAgcGFkZGluZzogNHB4IDhweDtcbiAgICAgIG1hcmdpbi1yaWdodDogNHB4O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgIG92ZXJmbG93OiBhdXRvO1xuICAgIH1cblxuICAgICMiKwpjKyIgLmdvb2ctdGFiLWJhci0iK2EubG9jYXRpb24rIiAuZ29vZy10YWItc2VsZWN0ZWQge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICIrYS5ib3JkZXJDb2xvcisiO1xuICAgICAgYm9yZGVyLSIrYisiOiAwcHg7XG4gICAgfVxuXG4gICAgIyIrYysiIC5nb29nLXRhYi1iYXItIithLmxvY2F0aW9uKyIge1xuICAgICAgcGFkZGluZy0iK2EubG9jYXRpb24rIjogNXB4ICFpbXBvcnRhbnQ7XG4gICAgICBib3JkZXItIitiKyI6IDFweCBzb2xpZCAiK2EuYm9yZGVyQ29sb3IrIiAhaW1wb3J0YW50O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICB9XG5cbiAgICAjIitjKyIgLmdvb2ctdGFiLWJhciB7XG4gICAgICAgbWFyZ2luOiAwO1xuICAgICAgIGJvcmRlcjogMDtcbiAgICAgICBwYWRkaW5nOiAwO1xuICAgICAgIGxpc3Qtc3R5bGU6IG5vbmU7XG4gICAgICAgY3Vyc29yOiBkZWZhdWx0O1xuICAgICAgIG91dGxpbmU6IG5vbmU7XG4gICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgICBtYXJnaW4tcmlnaHQ6IDRweDtcbiAgICAgIH1cblxuICAgICAjIisKYysiIC5nb29nLXRhYiB7XG4gICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgIHBhZGRpbmc6IDRweCA4cHg7XG4gICAgICAgY29sb3I6IHZhcigtLWNvbGFiLXByaW1hcnktdGV4dC1jb2xvcik7XG4gICAgICAgdGV4dC1kZWNvcmF0aW9uOiBpbml0aWFsO1xuICAgICAgIGN1cnNvcjogZGVmYXVsdDtcbiAgICAgIH1cblxuICAgICAgIyIrYysiIC5nb29nLXRhYi1ob3ZlciB7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWNvbGFiLWhpZ2hsaWdodGVkLXN1cmZhY2UtY29sb3IpO1xuICAgICAgfVxuICAgICAgIjtyZXR1cm4gZH0KdmFyIGtkPWZ1bmN0aW9uKGEpe3ZhciBiPWEuZWxlbWVudElkLGM9YS50YWJOYW1lcyxkPWEuc2VsZWN0ZWRJbmRleDsiY29udGVudEJvcmRlciJpbiBhfHwoYS5jb250ZW50Qm9yZGVyPSIwcHgiKTsiY29udGVudEhlaWdodCJpbiBhfHwoYS5jb250ZW50SGVpZ2h0PSJpbml0aWFsIik7ImJvcmRlckNvbG9yImluIGF8fChhLmJvcmRlckNvbG9yPSJ2YXIoLS1jb2xhYi1ib3JkZXItY29sb3IpIik7YS5sb2NhdGlvbnx8KGEubG9jYXRpb249InRvcCIpO3ZhciBlPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiMiK2IpLGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zi5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYi1iYXIiKTt2YXIgaD1hLmxvY2F0aW9uO2YuY2xhc3NMaXN0LmFkZCgiZ29vZy10YWItYmFyLSIraCk7Zm9yKHZhciBrPVtdLHE9ZmEoYyksRz1xLm5leHQoKTshRy5kb25lO0c9cS5uZXh0KCkpe0c9Ry52YWx1ZTt2YXIgeD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKeC5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYiIpO3gudGV4dENvbnRlbnQ9RztmLmFwcGVuZENoaWxkKHgpO2sucHVzaCh4KX1oIT0iYm90dG9tIiYmZS5hcHBlbmRDaGlsZChmKTtxPW51bGw7aWYoaD09InRvcCJ8fGg9PSJib3R0b20iKXE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikscS5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYi1iYXItY2xlYXIiKTtoPT0idG9wIiYmcSYmZS5hcHBlbmRDaGlsZChxKTtHPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO0cuY2xhc3NMaXN0LmFkZCgiZ29vZy10YWItY29udGVudCIpO3ZhciBoYT1bXTtjPWZhKGMpO2Zvcih4PWMubmV4dCgpOyF4LmRvbmU7eD1jLm5leHQoKSl4PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHguaWQ9ZS5pZCsiX2NvbnRlbnRfIitoYS5sZW5ndGgseC5zdHlsZS5kaXNwbGF5PSJub25lIixHLmFwcGVuZENoaWxkKHgpLGhhLnB1c2goeCk7ZS5hcHBlbmRDaGlsZChHKTtoPT0iYm90dG9tIiYmKHEmJgplLmFwcGVuZENoaWxkKHEpLGUuYXBwZW5kQ2hpbGQoZikpO3ZhciBRPW5ldyBYKGgpO1NiKFEsZik7dmFyIFI9LTE7d2IoUSwic2VsZWN0IixmdW5jdGlvbihTKXtTPWsuaW5kZXhPZihTLnRhcmdldC5pKCkpO1MhPVImJihSPj0wJiZSPGhhLmxlbmd0aCYmKGhhW1JdLnN0eWxlLmRpc3BsYXk9Im5vbmUiLFI9LTEpLFM+PTAmJlM8aGEubGVuZ3RoJiYoUj1TLGhhW1JdLnN0eWxlLmRpc3BsYXk9ImlubGluZSIsd2luZG93LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCJyZXNpemUiKSksZ29vZ2xlLmNvbGFiLm91dHB1dC5yZXNpemVJZnJhbWVUb0NvbnRlbnQoKSksUS5KKEkoUSxSKSkpfSk7US5KKEkoUSxkKSk7d2luZG93W2JdPXtzZXRTZWxlY3RlZFRhYkluZGV4OmZ1bmN0aW9uKFMpe1EuSihJKFEsUykpfX07ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChqZChhKSl9LGxkPVsiY29sYWJfbGliIiwiY3JlYXRlVGFiQmFyIl0sWT1sOwpsZFswXWluIFl8fHR5cGVvZiBZLmV4ZWNTY3JpcHQ9PSJ1bmRlZmluZWQifHxZLmV4ZWNTY3JpcHQoInZhciAiK2xkWzBdKTtmb3IodmFyIFo7bGQubGVuZ3RoJiYoWj1sZC5zaGlmdCgpKTspbGQubGVuZ3RofHxrZD09PXZvaWQgMD9ZW1pdJiZZW1pdIT09T2JqZWN0LnByb3RvdHlwZVtaXT9ZPVlbWl06WT1ZW1pdPXt9OllbWl09a2Q7fSkuY2FsbCh0aGlzKTsKLy8gY2xhbmctZm9ybWF0IG9uCg==", + "ok": true, + "headers": [ + [ + "content-length", + "41785" + ], + [ + "content-type", + "application/javascript" + ] + ], + "status": 200, + "status_text": "" + } + }, + "base_uri": "https://localhost:8080/", + "height": 229 + }, + "outputId": "585ed5bc-3d18-47dc-ef92-c548658042a7" + }, + "source": [ + "%%logica OfficeColumn,Offices,EmployeesPerOffice,EmployeesOfOffice\n", + "\n", + "Employee(name: \"Alice\", role: \"Product Manager\", office: \"SEA\");\n", + "Employee(name: \"Bob\", role: \"Engineer\", office: \"SEA\");\n", + "Employee(name: \"Caroline\", role: \"Engineer\", office: \"LAX\");\n", + "Employee(name: \"David\", role: \"Data Scientist\", office: \"LAX\");\n", + "Employee(name: \"Eve\", role: \"Data Scientist\", office: \"SEA\");\n", + "\n", + "OfficeColumn(office:) :- Employee(office:);\n", + "\n", + "Offices(office:) distinct :- Employee(office:);\n", + "\n", + "EmployeesPerOffice(office:,\n", + " num_employees? += 1,\n", + " role_count? Count=role) distinct :-\n", + " Employee(name: unused_name, office:, role:);\n", + "\n", + "EmployeesOfOffice(office:, employees? List= name) distinct :-\n", + " Employee(name:, office:);\n", + "\n" + ], + "execution_count": 18, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fd8e9cf0-d22c-11ef-a7c0-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id30\", \"tabNames\": [\"OfficeColumn\", \"Offices\", \"EmployeesPerOffice\", \"EmployeesOfOffice\", \"(Log)\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_e8442c04b2" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fd8f0f8c-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id30\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_579eaf00bc" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fd90e910-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_734a7de046" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fd9157c4-d22c-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id30_content_4\");\n", + "//# sourceURL=js_01283b29cc" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fd91b296-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"fd9157c4-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_7dd29853fd" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fd92096c-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id30\"].setSelectedTabIndex(4);\n", + "//# sourceURL=js_5da74a4f6f" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fd9552ac-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"fd90e910-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_0fee12ebb3" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fd97b592-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_4faec6d910" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fd98149c-d22c-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id30_content_0\");\n", + "//# sourceURL=js_1786975f38" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fd986f8c-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"fd98149c-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_a101490650" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fd98b320-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id30\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_f4caf397ee" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fd9a67d8-d22c-11ef-a7c0-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id31\", \"tabNames\": [\"SQL\", \"Result\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_8e39b081a1" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fd9aa928-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id31\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_886fb709c5" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fd9bec0c-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_e90ff70caa" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fd9c30c2-d22c-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id31_content_0\");\n", + "//# sourceURL=js_0c6164c58c" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fd9c7122-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"fd9c30c2-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_ad38f3bc8a" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fd9caf34-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id31\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_afc670de32" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The following query is stored at \u001b[1mOfficeColumn_sql\u001b[0m variable.\n", + "-- Initializing DuckDB environment.\n", + "create schema if not exists logica_home;\n", + "-- Empty record, has to have a field by DuckDB syntax.\n", + "drop type if exists logicarecord893574736 cascade; create type logicarecord893574736 as struct(nirvana numeric);\n", + "create sequence if not exists eternal_logical_sequence;\n", + "\n", + "\n", + "-- Logica type: logicarecord481217614\n", + "drop type if exists logicarecord481217614 cascade; create type logicarecord481217614 as struct(r logicarecord893574736);\n", + "\n", + "-- Logica type: logicarecord383307722\n", + "drop type if exists logicarecord383307722 cascade; create type logicarecord383307722 as struct(a timestamp);\n", + "WITH t_0_Employee AS (SELECT * FROM (\n", + " \n", + " SELECT\n", + " 'Alice' AS name,\n", + " 'Product Manager' AS role,\n", + " 'SEA' AS office\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " 'Bob' AS name,\n", + " 'Engineer' AS role,\n", + " 'SEA' AS office\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " 'Caroline' AS name,\n", + " 'Engineer' AS role,\n", + " 'LAX' AS office\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " 'David' AS name,\n", + " 'Data Scientist' AS role,\n", + " 'LAX' AS office\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " 'Eve' AS name,\n", + " 'Data Scientist' AS role,\n", + " 'SEA' AS office\n", + " \n", + ") AS UNUSED_TABLE_NAME )\n", + "SELECT\n", + " Employee.office AS office\n", + "FROM\n", + " t_0_Employee AS Employee;\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fd9da344-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"fd9bec0c-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_9f56a78c84" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fd9f248a-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_9cd9f18020" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fd9f67a6-d22c-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id31_content_1\");\n", + "//# sourceURL=js_1f91ac946f" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fd9fab76-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"fd9f67a6-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_a0a910e5e2" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fd9fea3c-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id31\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_0c75e34a5a" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The following table is stored at \u001b[1mOfficeColumn\u001b[0m variable.\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
office
0SEA
1SEA
2LAX
3LAX
4SEA
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fda1111e-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"fd9f248a-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_0c7f036032" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fda24c64-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"fd97b592-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_fceaa7f83a" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fda3f8e8-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_22c120790e" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fda445dc-d22c-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id30_content_4\");\n", + "//# sourceURL=js_e8fd50158d" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fda4889e-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"fda445dc-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_6f3b18b8c1" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fda4ce9e-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id30\"].setSelectedTabIndex(4);\n", + "//# sourceURL=js_dcddd3b3aa" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fda913d2-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"fda3f8e8-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_c3296dc61a" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fdaa9a04-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_dc71d14341" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fdaae0a4-d22c-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id30_content_1\");\n", + "//# sourceURL=js_9957732929" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fdab2488-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"fdaae0a4-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_d3383252e3" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fdab66fa-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id30\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_bb5a7f02de" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fdacfe48-d22c-11ef-a7c0-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id32\", \"tabNames\": [\"SQL\", \"Result\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_397d700a6e" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fdad4164-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id32\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_1d94080422" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fdae7c3c-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_4088a29869" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fdaec1b0-d22c-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id32_content_0\");\n", + "//# sourceURL=js_23b1459262" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fdaf051c-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"fdaec1b0-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_ea716157ea" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fdaf49be-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id32\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_91c0d7902b" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The following query is stored at \u001b[1mOffices_sql\u001b[0m variable.\n", + "-- Initializing DuckDB environment.\n", + "create schema if not exists logica_home;\n", + "-- Empty record, has to have a field by DuckDB syntax.\n", + "drop type if exists logicarecord893574736 cascade; create type logicarecord893574736 as struct(nirvana numeric);\n", + "create sequence if not exists eternal_logical_sequence;\n", + "\n", + "\n", + "-- Logica type: logicarecord481217614\n", + "drop type if exists logicarecord481217614 cascade; create type logicarecord481217614 as struct(r logicarecord893574736);\n", + "\n", + "-- Logica type: logicarecord383307722\n", + "drop type if exists logicarecord383307722 cascade; create type logicarecord383307722 as struct(a timestamp);\n", + "WITH t_0_Employee AS (SELECT * FROM (\n", + " \n", + " SELECT\n", + " 'Alice' AS name,\n", + " 'Product Manager' AS role,\n", + " 'SEA' AS office\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " 'Bob' AS name,\n", + " 'Engineer' AS role,\n", + " 'SEA' AS office\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " 'Caroline' AS name,\n", + " 'Engineer' AS role,\n", + " 'LAX' AS office\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " 'David' AS name,\n", + " 'Data Scientist' AS role,\n", + " 'LAX' AS office\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " 'Eve' AS name,\n", + " 'Data Scientist' AS role,\n", + " 'SEA' AS office\n", + " \n", + ") AS UNUSED_TABLE_NAME )\n", + "SELECT\n", + " Employee.office AS office\n", + "FROM\n", + " t_0_Employee AS Employee\n", + "GROUP BY Employee.office;\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fdb04530-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"fdae7c3c-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_c55291fd21" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fdb1df76-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_0f51d6da7b" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fdb23368-d22c-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id32_content_1\");\n", + "//# sourceURL=js_77a6e3680f" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fdb28098-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"fdb23368-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_36863806d1" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fdb2cc56-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id32\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_57ffb02144" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The following table is stored at \u001b[1mOffices\u001b[0m variable.\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
office
0SEA
1LAX
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fdb4284e-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"fdb1df76-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_b630f6a493" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fdb58d42-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"fdaa9a04-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_d2c3a6906e" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fdb75abe-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_5a7d5a6e95" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fdb7a654-d22c-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id30_content_4\");\n", + "//# sourceURL=js_07cf9a2d42" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fdb7f122-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"fdb7a654-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_e23e0a8bc5" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fdb85e28-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id30\"].setSelectedTabIndex(4);\n", + "//# sourceURL=js_7a8ee5862b" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fdbd6620-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"fdb75abe-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_4974e49eb9" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fdbf066a-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_78b679b8e7" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fdbf5584-d22c-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id30_content_2\");\n", + "//# sourceURL=js_a3413e45d4" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fdbf99c2-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"fdbf5584-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_77b1850b14" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fdbfdc0c-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id30\"].setSelectedTabIndex(2);\n", + "//# sourceURL=js_94d4b81505" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fdc1736e-d22c-11ef-a7c0-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id33\", \"tabNames\": [\"SQL\", \"Result\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_bec5412741" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fdc1b590-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id33\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_6ad3896679" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fdc308c8-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_c90c2a08b8" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fdc34e14-d22c-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id33_content_0\");\n", + "//# sourceURL=js_f3da57bdb3" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fdc3941e-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"fdc34e14-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_09fc657179" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fdc3d7c6-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id33\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_c8ca574873" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The following query is stored at \u001b[1mEmployeesPerOffice_sql\u001b[0m variable.\n", + "-- Initializing DuckDB environment.\n", + "create schema if not exists logica_home;\n", + "-- Empty record, has to have a field by DuckDB syntax.\n", + "drop type if exists logicarecord893574736 cascade; create type logicarecord893574736 as struct(nirvana numeric);\n", + "create sequence if not exists eternal_logical_sequence;\n", + "\n", + "\n", + "-- Logica type: logicarecord481217614\n", + "drop type if exists logicarecord481217614 cascade; create type logicarecord481217614 as struct(r logicarecord893574736);\n", + "\n", + "-- Logica type: logicarecord383307722\n", + "drop type if exists logicarecord383307722 cascade; create type logicarecord383307722 as struct(a timestamp);\n", + "WITH t_0_Employee AS (SELECT * FROM (\n", + " \n", + " SELECT\n", + " 'Alice' AS name,\n", + " 'Product Manager' AS role,\n", + " 'SEA' AS office\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " 'Bob' AS name,\n", + " 'Engineer' AS role,\n", + " 'SEA' AS office\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " 'Caroline' AS name,\n", + " 'Engineer' AS role,\n", + " 'LAX' AS office\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " 'David' AS name,\n", + " 'Data Scientist' AS role,\n", + " 'LAX' AS office\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " 'Eve' AS name,\n", + " 'Data Scientist' AS role,\n", + " 'SEA' AS office\n", + " \n", + ") AS UNUSED_TABLE_NAME )\n", + "SELECT\n", + " Employee.office AS office,\n", + " SUM(1) AS num_employees,\n", + " COUNT(DISTINCT Employee.role) AS role_count\n", + "FROM\n", + " t_0_Employee AS Employee\n", + "GROUP BY Employee.office;\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fdc54110-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"fdc308c8-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_2876d03730" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fdc71ae4-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_137136198d" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fdc76292-d22c-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id33_content_1\");\n", + "//# sourceURL=js_797a98fba7" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fdc7a752-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"fdc76292-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_824a339fe0" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fdc82998-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id33\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_f818bdf351" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The following table is stored at \u001b[1mEmployeesPerOffice\u001b[0m variable.\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
officenum_employeesrole_count
0SEA33
1LAX22
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fdc96efc-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"fdc71ae4-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_b9562d5235" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fdcabc08-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"fdbf066a-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_34f2344f4a" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fdcc66c0-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_e98c06c4fc" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fdccd79a-d22c-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id30_content_4\");\n", + "//# sourceURL=js_b302a6150e" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fdcdc498-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"fdccd79a-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_fe2094a7c4" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fdce5a66-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id30\"].setSelectedTabIndex(4);\n", + "//# sourceURL=js_ffdfa6b7c8" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fdd42d74-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"fdcc66c0-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_f75b6818e0" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fdd6ca52-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_90c37de284" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fdd7a9f4-d22c-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id30_content_3\");\n", + "//# sourceURL=js_a0750bea70" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fdd7f42c-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"fdd7a9f4-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_997b1aafb8" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fdd836d0-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id30\"].setSelectedTabIndex(3);\n", + "//# sourceURL=js_a3399f0ebb" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fdda0a14-d22c-11ef-a7c0-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id34\", \"tabNames\": [\"SQL\", \"Result\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_0b9dfca8fa" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fdda9286-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id34\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_231ec9ff61" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fddc6a52-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_b571797713" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fddcb444-d22c-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id34_content_0\");\n", + "//# sourceURL=js_5b5827b5d5" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fddcfa9e-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"fddcb444-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_e89f084023" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fddd3c66-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id34\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_d72f96c622" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The following query is stored at \u001b[1mEmployeesOfOffice_sql\u001b[0m variable.\n", + "-- Initializing DuckDB environment.\n", + "create schema if not exists logica_home;\n", + "-- Empty record, has to have a field by DuckDB syntax.\n", + "drop type if exists logicarecord893574736 cascade; create type logicarecord893574736 as struct(nirvana numeric);\n", + "create sequence if not exists eternal_logical_sequence;\n", + "\n", + "\n", + "-- Logica type: logicarecord481217614\n", + "drop type if exists logicarecord481217614 cascade; create type logicarecord481217614 as struct(r logicarecord893574736);\n", + "\n", + "-- Logica type: logicarecord383307722\n", + "drop type if exists logicarecord383307722 cascade; create type logicarecord383307722 as struct(a timestamp);\n", + "WITH t_0_Employee AS (SELECT * FROM (\n", + " \n", + " SELECT\n", + " 'Alice' AS name,\n", + " 'Product Manager' AS role,\n", + " 'SEA' AS office\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " 'Bob' AS name,\n", + " 'Engineer' AS role,\n", + " 'SEA' AS office\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " 'Caroline' AS name,\n", + " 'Engineer' AS role,\n", + " 'LAX' AS office\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " 'David' AS name,\n", + " 'Data Scientist' AS role,\n", + " 'LAX' AS office\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " 'Eve' AS name,\n", + " 'Data Scientist' AS role,\n", + " 'SEA' AS office\n", + " \n", + ") AS UNUSED_TABLE_NAME )\n", + "SELECT\n", + " Employee.office AS office,\n", + " ARRAY_AGG(Employee.name) AS employees\n", + "FROM\n", + " t_0_Employee AS Employee\n", + "GROUP BY Employee.office;\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fddeb956-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"fddc6a52-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_967533c330" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fde10116-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_12b0c03a5d" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fde14bda-d22c-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id34_content_1\");\n", + "//# sourceURL=js_6e5cd8f5a9" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fde1ace2-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"fde14bda-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_2aef3eb538" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fde1f184-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id34\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_0bd08d54a2" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The following table is stored at \u001b[1mEmployeesOfOffice\u001b[0m variable.\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
officeemployees
0SEA[Alice, Bob, Eve]
1LAX[Caroline, David]
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fde3b000-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"fde10116-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_7797121c46" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fde4fd2a-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"fdd6ca52-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_bd8d765f1b" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fde6f22e-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_f46955d503" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fde75886-d22c-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id30_content_4\");\n", + "//# sourceURL=js_49b0742935" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fde79db4-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"fde75886-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_6fe3b00f6f" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fde7edf0-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id30\"].setSelectedTabIndex(4);\n", + "//# sourceURL=js_3fd125564c" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "image/svg+xml": "\n\n\n\n\n\nConcertina\n\n\n\nEmployeesOfOffice\n\nEmployeesOfOffice\n\n\n\nEmployeesPerOffice\n\nEmployeesPerOffice\n\n\n\nOffices\n\nOffices\n\n\n\nOfficeColumn\n\nOfficeColumn\n\n\n\n", + "text/plain": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Running predicate: EmployeesOfOffice (8 ms)\n", + "Running predicate: EmployeesPerOffice (21 ms)\n", + "Running predicate: Offices (8 ms)\n", + "Running predicate: OfficeColumn (5 ms)\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fe379b02-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"fde6f22e-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_aa0e88a8e8" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fe3a9f5a-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_ffc9ad2031" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fe3b062a-d22c-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id30_content_0\");\n", + "//# sourceURL=js_67d1bc5117" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fe3b7812-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"fe3b062a-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_b14e655472" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fe3bd47e-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id30\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_a0b2a72836" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fe3dc900-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_4a0a92b509" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fe3e2cf6-d22c-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id31_content_1\");\n", + "//# sourceURL=js_443593f2d8" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fe3e9420-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"fe3e2cf6-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_d381e25b2e" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fe3efac8-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id31\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_7a8f3e18fa" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fe417f5a-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"fe3dc900-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_ef9c9d9825" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + " \n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fe444e2e-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"fe3a9f5a-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_930e8dc812" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fe47275c-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_247340f284" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fe478760-d22c-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id30_content_1\");\n", + "//# sourceURL=js_f54b015bbc" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fe4813c4-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"fe478760-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_31bc7d64a2" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fe4882be-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id30\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_5b9ff66dab" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fe4a8848-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_593810fdc9" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fe4aee78-d22c-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id32_content_1\");\n", + "//# sourceURL=js_1619191809" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fe4b580e-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"fe4aee78-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_6b92b97cc1" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fe4c2270-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id32\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_a6bd585a98" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fe4e9e6a-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"fe4a8848-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_8757d340ba" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + " \n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fe51202c-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"fe47275c-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_19d3dd4b01" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fe53f536-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_08195fa8e4" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fe545cc4-d22c-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id30_content_2\");\n", + "//# sourceURL=js_4aa5b88cd3" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fe54cd1c-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"fe545cc4-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_ad4d955800" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fe552816-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id30\"].setSelectedTabIndex(2);\n", + "//# sourceURL=js_7eeb1036de" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fe58534c-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_08bcd63f97" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fe58dda8-d22c-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id33_content_1\");\n", + "//# sourceURL=js_33d24ad082" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fe59551c-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"fe58dda8-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_1a1f00eb16" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fe59fc9c-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id33\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_9bc16e5ca5" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fe5ca55a-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"fe58534c-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_1c22d8cb3c" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + " \n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fe5f889c-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"fe53f536-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_7aab2142b6" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fe62c034-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_1d34b99b9c" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fe6323b2-d22c-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id30_content_3\");\n", + "//# sourceURL=js_772ee6d0e7" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fe6399d2-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"fe6323b2-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_4e2917dd77" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fe6408b8-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id30\"].setSelectedTabIndex(3);\n", + "//# sourceURL=js_5e9ab3a69a" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fe6659d8-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_2040714ffc" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fe66c378-d22c-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id34_content_1\");\n", + "//# sourceURL=js_866b7c2402" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fe672d90-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"fe66c378-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_7705d6e55d" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fe679226-d22c-11ef-a7c0-0242ac1c0002\"] = window[\"id34\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_6337f19f1e" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fe6ac14e-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"fe6659d8-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_7e525bd66d" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + " \n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"fe6d5e54-d22c-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"fe62c034-d22c-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_0f29736515" + ] + }, + "metadata": {} + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Cqv6UMREL7ev" + }, + "source": [ + "#### Intra-record aggregation\n", + "\n", + "Syntax for intra-record aggregation is\n", + "```\n", + "combine = [ :- ]\n", + "```\n", + "\n", + "There is also a short-hand syntax provided for storing result of the aggregation in a variable. This syntax is considered more readable and is recommended:\n", + "\n", + "```\n", + " =( [ :- body ])\n", + "```\n" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "4w444SJlMLm5", + "colab": { + "resources": { + "http://localhost:8080/nbextensions/google.colab/tabbar.css": { + "data": "Lmdvb2ctdGFie3Bvc2l0aW9uOnJlbGF0aXZlO3BhZGRpbmc6NHB4IDhweDtjb2xvcjojMDBjO3RleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7Y3Vyc29yOmRlZmF1bHR9Lmdvb2ctdGFiLWJhci10b3AgLmdvb2ctdGFie21hcmdpbjoxcHggNHB4IDAgMDtib3JkZXItYm90dG9tOjA7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLXRvcDphZnRlciwuZ29vZy10YWItYmFyLWJvdHRvbTphZnRlcntjb250ZW50OiIgIjtkaXNwbGF5OmJsb2NrO2hlaWdodDowO2NsZWFyOmJvdGg7dmlzaWJpbGl0eTpoaWRkZW59Lmdvb2ctdGFiLWJhci1ib3R0b20gLmdvb2ctdGFie21hcmdpbjowIDRweCAxcHggMDtib3JkZXItdG9wOjA7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLXN0YXJ0IC5nb29nLXRhYnttYXJnaW46MCAwIDRweCAxcHg7Ym9yZGVyLXJpZ2h0OjB9Lmdvb2ctdGFiLWJhci1lbmQgLmdvb2ctdGFie21hcmdpbjowIDFweCA0cHggMDtib3JkZXItbGVmdDowfS5nb29nLXRhYi1ob3ZlcntiYWNrZ3JvdW5kOiNlZWV9Lmdvb2ctdGFiLWRpc2FibGVke2NvbG9yOiM2NjZ9Lmdvb2ctdGFiLXNlbGVjdGVke2NvbG9yOiMwMDA7YmFja2dyb3VuZDojZmZmO3RleHQtZGVjb3JhdGlvbjpub25lO2ZvbnQtd2VpZ2h0OmJvbGQ7Ym9yZGVyOjFweCBzb2xpZCAjNmI5MGRhfS5nb29nLXRhYi1iYXItdG9we3BhZGRpbmctdG9wOjVweCFpbXBvcnRhbnQ7cGFkZGluZy1sZWZ0OjVweCFpbXBvcnRhbnQ7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgIzZiOTBkYSFpbXBvcnRhbnR9Lmdvb2ctdGFiLWJhci10b3AgLmdvb2ctdGFiLXNlbGVjdGVke3RvcDoxcHg7bWFyZ2luLXRvcDowO3BhZGRpbmctYm90dG9tOjVweH0uZ29vZy10YWItYmFyLWJvdHRvbSAuZ29vZy10YWItc2VsZWN0ZWR7dG9wOi0xcHg7bWFyZ2luLWJvdHRvbTowO3BhZGRpbmctdG9wOjVweH0uZ29vZy10YWItYmFyLXN0YXJ0IC5nb29nLXRhYi1zZWxlY3RlZHtsZWZ0OjFweDttYXJnaW4tbGVmdDowO3BhZGRpbmctcmlnaHQ6OXB4fS5nb29nLXRhYi1iYXItZW5kIC5nb29nLXRhYi1zZWxlY3RlZHtsZWZ0Oi0xcHg7bWFyZ2luLXJpZ2h0OjA7cGFkZGluZy1sZWZ0OjlweH0uZ29vZy10YWItYmFye21hcmdpbjowO2JvcmRlcjowO3BhZGRpbmc6MDtsaXN0LXN0eWxlOm5vbmU7Y3Vyc29yOmRlZmF1bHQ7b3V0bGluZTpub25lO2JhY2tncm91bmQ6I2ViZWZmOX0uZ29vZy10YWItYmFyLWNsZWFye2NsZWFyOmJvdGg7aGVpZ2h0OjA7b3ZlcmZsb3c6aGlkZGVufS5nb29nLXRhYi1iYXItc3RhcnR7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLWVuZHtmbG9hdDpyaWdodH0qIGh0bWwgLmdvb2ctdGFiLWJhci1zdGFydHttYXJnaW4tcmlnaHQ6LTNweH0qIGh0bWwgLmdvb2ctdGFiLWJhci1lbmR7bWFyZ2luLWxlZnQ6LTNweH1zZW50aW5lbHt9", + "ok": true, + "headers": [ + [ + "content-length", + "1404" + ], + [ + "content-type", + "text/css" + ] + ], + "status": 200, + "status_text": "" + }, + "http://localhost:8080/nbextensions/google.colab/tabbar_main.min.js": { + "data": "Ly8gY2xhbmctZm9ybWF0IG9mZgooZnVuY3Rpb24oKXt2YXIgZyxhYT1mdW5jdGlvbihhKXt2YXIgYj0wO3JldHVybiBmdW5jdGlvbigpe3JldHVybiBiPGEubGVuZ3RoP3tkb25lOiExLHZhbHVlOmFbYisrXX06e2RvbmU6ITB9fX0sYmE9dHlwZW9mIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzPT0iZnVuY3Rpb24iP09iamVjdC5kZWZpbmVQcm9wZXJ0eTpmdW5jdGlvbihhLGIsYyl7aWYoYT09QXJyYXkucHJvdG90eXBlfHxhPT1PYmplY3QucHJvdG90eXBlKXJldHVybiBhO2FbYl09Yy52YWx1ZTtyZXR1cm4gYX0sY2E9ZnVuY3Rpb24oYSl7YT1bIm9iamVjdCI9PXR5cGVvZiBnbG9iYWxUaGlzJiZnbG9iYWxUaGlzLGEsIm9iamVjdCI9PXR5cGVvZiB3aW5kb3cmJndpbmRvdywib2JqZWN0Ij09dHlwZW9mIHNlbGYmJnNlbGYsIm9iamVjdCI9PXR5cGVvZiBnbG9iYWwmJmdsb2JhbF07Zm9yKHZhciBiPTA7YjxhLmxlbmd0aDsrK2Ipe3ZhciBjPWFbYl07aWYoYyYmYy5NYXRoPT1NYXRoKXJldHVybiBjfXRocm93IEVycm9yKCJDYW5ub3QgZmluZCBnbG9iYWwgb2JqZWN0Iik7Cn0sZGE9Y2EodGhpcyksZWE9ZnVuY3Rpb24oYSxiKXtpZihiKWE6e3ZhciBjPWRhO2E9YS5zcGxpdCgiLiIpO2Zvcih2YXIgZD0wO2Q8YS5sZW5ndGgtMTtkKyspe3ZhciBlPWFbZF07aWYoIShlIGluIGMpKWJyZWFrIGE7Yz1jW2VdfWE9YVthLmxlbmd0aC0xXTtkPWNbYV07Yj1iKGQpO2IhPWQmJmIhPW51bGwmJmJhKGMsYSx7Y29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOmJ9KX19OwplYSgiU3ltYm9sIixmdW5jdGlvbihhKXtpZihhKXJldHVybiBhO3ZhciBiPWZ1bmN0aW9uKGYsaCl7dGhpcy5nPWY7YmEodGhpcywiZGVzY3JpcHRpb24iLHtjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6aH0pfTtiLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmd9O3ZhciBjPSJqc2NvbXBfc3ltYm9sXyIrKE1hdGgucmFuZG9tKCkqMUU5Pj4+MCkrIl8iLGQ9MCxlPWZ1bmN0aW9uKGYpe2lmKHRoaXMgaW5zdGFuY2VvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoIlN5bWJvbCBpcyBub3QgYSBjb25zdHJ1Y3RvciIpO3JldHVybiBuZXcgYihjKyhmfHwiIikrIl8iK2QrKyxmKX07cmV0dXJuIGV9KTsKdmFyIGZhPWZ1bmN0aW9uKGEpe3ZhciBiPXR5cGVvZiBTeW1ib2whPSJ1bmRlZmluZWQiJiZTeW1ib2wuaXRlcmF0b3ImJmFbU3ltYm9sLml0ZXJhdG9yXTtpZihiKXJldHVybiBiLmNhbGwoYSk7aWYodHlwZW9mIGEubGVuZ3RoPT0ibnVtYmVyIilyZXR1cm57bmV4dDphYShhKX07dGhyb3cgRXJyb3IoU3RyaW5nKGEpKyIgaXMgbm90IGFuIGl0ZXJhYmxlIG9yIEFycmF5TGlrZSIpO307ZWEoIlN5bWJvbC5kaXNwb3NlIixmdW5jdGlvbihhKXtyZXR1cm4gYT9hOlN5bWJvbCgiU3ltYm9sLmRpc3Bvc2UiKX0pOy8qCgogQ29weXJpZ2h0IFRoZSBDbG9zdXJlIExpYnJhcnkgQXV0aG9ycy4KIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wCiovCnZhciBsPXRoaXN8fHNlbGYsaWE9ZnVuY3Rpb24oYSl7YS5JYT12b2lkIDA7YS5WPWZ1bmN0aW9uKCl7cmV0dXJuIGEuSWE/YS5JYTphLklhPW5ldyBhfX0samE9ZnVuY3Rpb24oYSl7dmFyIGI9dHlwZW9mIGE7cmV0dXJuIGIhPSJvYmplY3QiP2I6YT9BcnJheS5pc0FycmF5KGEpPyJhcnJheSI6YjoibnVsbCJ9LGthPWZ1bmN0aW9uKGEpe3ZhciBiPWphKGEpO3JldHVybiBiPT0iYXJyYXkifHxiPT0ib2JqZWN0IiYmdHlwZW9mIGEubGVuZ3RoPT0ibnVtYmVyIn0sbT1mdW5jdGlvbihhKXt2YXIgYj10eXBlb2YgYTtyZXR1cm4gYj09Im9iamVjdCImJmEhPW51bGx8fGI9PSJmdW5jdGlvbiJ9LG5hPWZ1bmN0aW9uKGEpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYSxsYSkmJmFbbGFdfHwoYVtsYV09KyttYSl9LGxhPSJjbG9zdXJlX3VpZF8iKyhNYXRoLnJhbmRvbSgpKjFFOT4+PjApLG1hPTAsbj1mdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoKXt9Yy5wcm90b3R5cGU9CmIucHJvdG90eXBlO2EubD1iLnByb3RvdHlwZTthLnByb3RvdHlwZT1uZXcgYzthLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1hO2EucWQ9ZnVuY3Rpb24oZCxlLGYpe2Zvcih2YXIgaD1BcnJheShhcmd1bWVudHMubGVuZ3RoLTIpLGs9MjtrPGFyZ3VtZW50cy5sZW5ndGg7aysrKWhbay0yXT1hcmd1bWVudHNba107cmV0dXJuIGIucHJvdG90eXBlW2VdLmFwcGx5KGQsaCl9fTtmdW5jdGlvbiBvYShhLGIpe2lmKEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKUVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsb2EpO2Vsc2V7dmFyIGM9RXJyb3IoKS5zdGFjaztjJiYodGhpcy5zdGFjaz1jKX1hJiYodGhpcy5tZXNzYWdlPVN0cmluZyhhKSk7YiE9PXZvaWQgMCYmKHRoaXMuY2F1c2U9Yil9bihvYSxFcnJvcik7b2EucHJvdG90eXBlLm5hbWU9IkN1c3RvbUVycm9yIjt2YXIgcGE7ZnVuY3Rpb24gcWEoYSxiKXthPWEuc3BsaXQoIiVzIik7Zm9yKHZhciBjPSIiLGQ9YS5sZW5ndGgtMSxlPTA7ZTxkO2UrKyljKz1hW2VdKyhlPGIubGVuZ3RoP2JbZV06IiVzIik7b2EuY2FsbCh0aGlzLGMrYVtkXSl9bihxYSxvYSk7cWEucHJvdG90eXBlLm5hbWU9IkFzc2VydGlvbkVycm9yIjtmdW5jdGlvbiByYShhLGIsYyxkKXt2YXIgZT0iQXNzZXJ0aW9uIGZhaWxlZCI7aWYoYyl7ZSs9IjogIitjO3ZhciBmPWR9ZWxzZSBhJiYoZSs9IjogIithLGY9Yik7dGhyb3cgbmV3IHFhKCIiK2UsZnx8W10pO30KdmFyIHA9ZnVuY3Rpb24oYSxiLGMpe2F8fHJhKCIiLG51bGwsYixBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMikpO3JldHVybiBhfSxzYT1mdW5jdGlvbihhLGIsYyl7bShhKSYmYS5ub2RlVHlwZT09MXx8cmEoIkV4cGVjdGVkIEVsZW1lbnQgYnV0IGdvdCAlczogJXMuIixbamEoYSksYV0sYixBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMikpfSx1YT1mdW5jdGlvbihhLGIsYyxkKXthIGluc3RhbmNlb2YgYnx8cmEoIkV4cGVjdGVkIGluc3RhbmNlb2YgJXMgYnV0IGdvdCAlcy4iLFt0YShiKSx0YShhKV0sYyxBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMykpfTsKZnVuY3Rpb24gdGEoYSl7cmV0dXJuIGEgaW5zdGFuY2VvZiBGdW5jdGlvbj9hLmRpc3BsYXlOYW1lfHxhLm5hbWV8fCJ1bmtub3duIHR5cGUgbmFtZSI6YSBpbnN0YW5jZW9mIE9iamVjdD9hLmNvbnN0cnVjdG9yLmRpc3BsYXlOYW1lfHxhLmNvbnN0cnVjdG9yLm5hbWV8fE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhKTphPT09bnVsbD8ibnVsbCI6dHlwZW9mIGF9O3ZhciB2YT1BcnJheS5wcm90b3R5cGUuaW5kZXhPZj9mdW5jdGlvbihhLGIpe3AoYS5sZW5ndGghPW51bGwpO3JldHVybiBBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKGEsYix2b2lkIDApfTpmdW5jdGlvbihhLGIpe2lmKHR5cGVvZiBhPT09InN0cmluZyIpcmV0dXJuIHR5cGVvZiBiIT09InN0cmluZyJ8fGIubGVuZ3RoIT0xPy0xOmEuaW5kZXhPZihiLDApO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWlmKGMgaW4gYSYmYVtjXT09PWIpcmV0dXJuIGM7cmV0dXJuLTF9LHdhPUFycmF5LnByb3RvdHlwZS5mb3JFYWNoP2Z1bmN0aW9uKGEsYil7cChhLmxlbmd0aCE9bnVsbCk7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChhLGIsdm9pZCAwKX06ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9YS5sZW5ndGgsZD10eXBlb2YgYT09PSJzdHJpbmciP2Euc3BsaXQoIiIpOmEsZT0wO2U8YztlKyspZSBpbiBkJiZiLmNhbGwodm9pZCAwLGRbZV0sZSxhKX07CmZ1bmN0aW9uIHhhKGEsYil7Yj12YShhLGIpO3ZhciBjO2lmKGM9Yj49MClwKGEubGVuZ3RoIT1udWxsKSxBcnJheS5wcm90b3R5cGUuc3BsaWNlLmNhbGwoYSxiLDEpO3JldHVybiBjfWZ1bmN0aW9uIHlhKGEpe3ZhciBiPWEubGVuZ3RoO2lmKGI+MCl7Zm9yKHZhciBjPUFycmF5KGIpLGQ9MDtkPGI7ZCsrKWNbZF09YVtkXTtyZXR1cm4gY31yZXR1cm5bXX1mdW5jdGlvbiB6YShhLGIsYyxkKXtwKGEubGVuZ3RoIT1udWxsKTtBcnJheS5wcm90b3R5cGUuc3BsaWNlLmFwcGx5KGEsQWEoYXJndW1lbnRzLDEpKX1mdW5jdGlvbiBBYShhLGIsYyl7cChhLmxlbmd0aCE9bnVsbCk7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg8PTI/QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYSxiKTpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhLGIsYyl9O2Z1bmN0aW9uIEJhKGEsYixjKXtmb3IodmFyIGQgaW4gYSliLmNhbGwoYyxhW2RdLGQsYSl9ZnVuY3Rpb24gQ2EoYSxiKXtmb3IodmFyIGMgaW4gYSlpZihhW2NdPT1iKXJldHVybiEwO3JldHVybiExfWZ1bmN0aW9uIERhKGEsYixjKXtpZihhIT09bnVsbCYmYiBpbiBhKXRocm93IEVycm9yKCdUaGUgb2JqZWN0IGFscmVhZHkgY29udGFpbnMgdGhlIGtleSAiJytiKyciJyk7YVtiXT1jfWZ1bmN0aW9uIEVhKGEpe3ZhciBiPXt9LGM7Zm9yKGMgaW4gYSliW2FbY11dPWM7cmV0dXJuIGJ9dmFyIEZhPSJjb25zdHJ1Y3RvciBoYXNPd25Qcm9wZXJ0eSBpc1Byb3RvdHlwZU9mIHByb3BlcnR5SXNFbnVtZXJhYmxlIHRvTG9jYWxlU3RyaW5nIHRvU3RyaW5nIHZhbHVlT2YiLnNwbGl0KCIgIik7CmZ1bmN0aW9uIEdhKGEsYil7Zm9yKHZhciBjLGQsZT0xO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspe2Q9YXJndW1lbnRzW2VdO2ZvcihjIGluIGQpYVtjXT1kW2NdO2Zvcih2YXIgZj0wO2Y8RmEubGVuZ3RoO2YrKyljPUZhW2ZdLE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChkLGMpJiYoYVtjXT1kW2NdKX19O3ZhciBIYT1TdHJpbmcucHJvdG90eXBlLnRyaW0/ZnVuY3Rpb24oYSl7cmV0dXJuIGEudHJpbSgpfTpmdW5jdGlvbihhKXtyZXR1cm4vXltcc1x4YTBdKihbXHNcU10qPylbXHNceGEwXSokLy5leGVjKGEpWzFdfTsvKgoKIENvcHlyaWdodCBHb29nbGUgTExDCiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMAoqLwp2YXIgSWE9e307dmFyIEphPWZ1bmN0aW9uKGEpe2lmKElhIT09SWEpdGhyb3cgRXJyb3IoIkJhZCBzZWNyZXQiKTt0aGlzLmc9YX07SmEucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ307bmV3IEphKCJhYm91dDpibGFuayIpO25ldyBKYSgiYWJvdXQ6aW52YWxpZCN6Q2xvc3VyZXoiKTt2YXIgS2E9W10sTGE9ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJBIFVSTCB3aXRoIGNvbnRlbnQgJyIrYSsiJyB3YXMgc2FuaXRpemVkIGF3YXkuIil9O0thLmluZGV4T2YoTGEpPT09LTEmJkthLnB1c2goTGEpO3ZhciBNYSxOYTthOntmb3IodmFyIE9hPVsiQ0xPU1VSRV9GTEFHUyJdLFBhPWwsUWE9MDtRYTxPYS5sZW5ndGg7UWErKylpZihQYT1QYVtPYVtRYV1dLFBhPT1udWxsKXtOYT1udWxsO2JyZWFrIGF9TmE9UGF9dmFyIFJhPU5hJiZOYVs2MTA0MDEzMDFdO01hPVJhIT1udWxsP1JhOiExO2Z1bmN0aW9uIFNhKCl7dmFyIGE9bC5uYXZpZ2F0b3I7cmV0dXJuIGEmJihhPWEudXNlckFnZW50KT9hOiIifXZhciBUYSxVYT1sLm5hdmlnYXRvcjtUYT1VYT9VYS51c2VyQWdlbnREYXRhfHxudWxsOm51bGw7ZnVuY3Rpb24gcihhKXtyZXR1cm4gU2EoKS5pbmRleE9mKGEpIT0tMX07dmFyIFZhPXIoIkVkZ2UiKSx0PXIoIkdlY2tvIikmJiEoU2EoKS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoIndlYmtpdCIpIT0tMSYmIXIoIkVkZ2UiKSkmJiEocigiVHJpZGVudCIpfHxyKCJNU0lFIikpJiYhcigiRWRnZSIpLHU9U2EoKS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoIndlYmtpdCIpIT0tMSYmIXIoIkVkZ2UiKSx2PU1hJiZUYSYmVGEucGxhdGZvcm0/VGEucGxhdGZvcm09PT0ibWFjT1MiOnIoIk1hY2ludG9zaCIpO3ZhciBYYT1mdW5jdGlvbihhLGIpe0JhKGIsZnVuY3Rpb24oYyxkKXtkPT0ic3R5bGUiP2Euc3R5bGUuY3NzVGV4dD1jOmQ9PSJjbGFzcyI/YS5jbGFzc05hbWU9YzpkPT0iZm9yIj9hLmh0bWxGb3I9YzpXYS5oYXNPd25Qcm9wZXJ0eShkKT9hLnNldEF0dHJpYnV0ZShXYVtkXSxjKTpkLmxhc3RJbmRleE9mKCJhcmlhLSIsMCk9PTB8fGQubGFzdEluZGV4T2YoImRhdGEtIiwwKT09MD9hLnNldEF0dHJpYnV0ZShkLGMpOmFbZF09Y30pfSxXYT17Y2VsbHBhZGRpbmc6ImNlbGxQYWRkaW5nIixjZWxsc3BhY2luZzoiY2VsbFNwYWNpbmciLGNvbHNwYW46ImNvbFNwYW4iLGZyYW1lYm9yZGVyOiJmcmFtZUJvcmRlciIsaGVpZ2h0OiJoZWlnaHQiLG1heGxlbmd0aDoibWF4TGVuZ3RoIixub25jZToibm9uY2UiLHJvbGU6InJvbGUiLHJvd3NwYW46InJvd1NwYW4iLHR5cGU6InR5cGUiLHVzZW1hcDoidXNlTWFwIix2YWxpZ246InZBbGlnbiIsd2lkdGg6IndpZHRoIn0sWWE9ZnVuY3Rpb24oYSwKYixjKXtmdW5jdGlvbiBkKGspe2smJmIuYXBwZW5kQ2hpbGQodHlwZW9mIGs9PT0ic3RyaW5nIj9hLmNyZWF0ZVRleHROb2RlKGspOmspfWZvcih2YXIgZT0yO2U8Yy5sZW5ndGg7ZSsrKXt2YXIgZj1jW2VdO2lmKCFrYShmKXx8bShmKSYmZi5ub2RlVHlwZT4wKWQoZik7ZWxzZXthOntpZihmJiZ0eXBlb2YgZi5sZW5ndGg9PSJudW1iZXIiKXtpZihtKGYpKXt2YXIgaD10eXBlb2YgZi5pdGVtPT0iZnVuY3Rpb24ifHx0eXBlb2YgZi5pdGVtPT0ic3RyaW5nIjticmVhayBhfWlmKHR5cGVvZiBmPT09ImZ1bmN0aW9uIil7aD10eXBlb2YgZi5pdGVtPT0iZnVuY3Rpb24iO2JyZWFrIGF9fWg9ITF9d2EoaD95YShmKTpmLGQpfX19LFphPWZ1bmN0aW9uKGEsYil7Yj1TdHJpbmcoYik7YS5jb250ZW50VHlwZT09PSJhcHBsaWNhdGlvbi94aHRtbCt4bWwiJiYoYj1iLnRvTG93ZXJDYXNlKCkpO3JldHVybiBhLmNyZWF0ZUVsZW1lbnQoYil9LCRhPWZ1bmN0aW9uKGEpe2EmJmEucGFyZW50Tm9kZSYmCmEucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhKX0sYWI9ZnVuY3Rpb24oYSxiKXtpZighYXx8IWIpcmV0dXJuITE7aWYoYS5jb250YWlucyYmYi5ub2RlVHlwZT09MSlyZXR1cm4gYT09Ynx8YS5jb250YWlucyhiKTtpZih0eXBlb2YgYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiE9InVuZGVmaW5lZCIpcmV0dXJuIGE9PWJ8fCEhKGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24oYikmMTYpO2Zvcig7YiYmYSE9YjspYj1iLnBhcmVudE5vZGU7cmV0dXJuIGI9PWF9LGJiPWZ1bmN0aW9uKGEpe3AoYSwiTm9kZSBjYW5ub3QgYmUgbnVsbCBvciB1bmRlZmluZWQuIik7cmV0dXJuIGEubm9kZVR5cGU9PTk/YTphLm93bmVyRG9jdW1lbnR8fGEuZG9jdW1lbnR9LGNiPWZ1bmN0aW9uKGEsYil7Yj9hLnRhYkluZGV4PTA6KGEudGFiSW5kZXg9LTEsYS5yZW1vdmVBdHRyaWJ1dGUoInRhYkluZGV4IikpfSxkYj1mdW5jdGlvbihhKXtyZXR1cm4gYS5oYXNBdHRyaWJ1dGUoInRhYmluZGV4Iil9LGViPQpmdW5jdGlvbihhKXthPWEudGFiSW5kZXg7cmV0dXJuIHR5cGVvZiBhPT09Im51bWJlciImJmE+PTAmJmE8MzI3Njh9LGZiPWZ1bmN0aW9uKGEpe3RoaXMuZz1hfHxsLmRvY3VtZW50fHxkb2N1bWVudH07ZmIucHJvdG90eXBlLmk9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nO3JldHVybiB0eXBlb2YgYT09PSJzdHJpbmciP2IuZ2V0RWxlbWVudEJ5SWQoYSk6YX07ZmIucHJvdG90eXBlLmg9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXMuZyxlPWFyZ3VtZW50cyxmPWVbMV0saD1aYShkLFN0cmluZyhlWzBdKSk7ZiYmKHR5cGVvZiBmPT09InN0cmluZyI/aC5jbGFzc05hbWU9ZjpBcnJheS5pc0FycmF5KGYpP2guY2xhc3NOYW1lPWYuam9pbigiICIpOlhhKGgsZikpO2UubGVuZ3RoPjImJllhKGQsaCxlKTtyZXR1cm4gaH07dmFyIHc9ZnVuY3Rpb24oKXt0aGlzLmJhPXRoaXMuYmE7dGhpcy5rYT10aGlzLmthfTt3LnByb3RvdHlwZS5iYT0hMTt3LnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7dGhpcy5iYXx8KHRoaXMuYmE9ITAsdGhpcy5DKCkpfTt3LnByb3RvdHlwZVtTeW1ib2wuZGlzcG9zZV09ZnVuY3Rpb24oKXt0aGlzLmRpc3Bvc2UoKX07dy5wcm90b3R5cGUuQz1mdW5jdGlvbigpe2lmKHRoaXMua2EpZm9yKDt0aGlzLmthLmxlbmd0aDspdGhpcy5rYS5zaGlmdCgpKCl9O3ZhciB5PWZ1bmN0aW9uKGEsYil7dGhpcy50eXBlPWE7dGhpcy51PXRoaXMudGFyZ2V0PWI7dGhpcy5kZWZhdWx0UHJldmVudGVkPXRoaXMuQT0hMX07eS5wcm90b3R5cGUudj1mdW5jdGlvbigpe3RoaXMuQT0hMH07eS5wcm90b3R5cGUuaj1mdW5jdGlvbigpe3RoaXMuZGVmYXVsdFByZXZlbnRlZD0hMH07dmFyIGdiPWZ1bmN0aW9uKCl7aWYoIWwuYWRkRXZlbnRMaXN0ZW5lcnx8IU9iamVjdC5kZWZpbmVQcm9wZXJ0eSlyZXR1cm4hMTt2YXIgYT0hMSxiPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwicGFzc2l2ZSIse2dldDpmdW5jdGlvbigpe2E9ITB9fSk7dHJ5e3ZhciBjPWZ1bmN0aW9uKCl7fTtsLmFkZEV2ZW50TGlzdGVuZXIoInRlc3QiLGMsYik7bC5yZW1vdmVFdmVudExpc3RlbmVyKCJ0ZXN0IixjLGIpfWNhdGNoKGQpe31yZXR1cm4gYX0oKTt2YXIgej1mdW5jdGlvbihhLGIpe3kuY2FsbCh0aGlzLGE/YS50eXBlOiIiKTt0aGlzLnJlbGF0ZWRUYXJnZXQ9dGhpcy51PXRoaXMudGFyZ2V0PW51bGw7dGhpcy5idXR0b249dGhpcy5zY3JlZW5ZPXRoaXMuc2NyZWVuWD10aGlzLmNsaWVudFk9dGhpcy5jbGllbnRYPTA7dGhpcy5rZXk9IiI7dGhpcy5nPTA7dGhpcy5tZXRhS2V5PXRoaXMuc2hpZnRLZXk9dGhpcy5hbHRLZXk9dGhpcy5jdHJsS2V5PSExO3RoaXMuc3RhdGU9bnVsbDt0aGlzLkc9ITE7dGhpcy5wb2ludGVySWQ9MDt0aGlzLnBvaW50ZXJUeXBlPSIiO3RoaXMudGltZVN0YW1wPTA7dGhpcy5oPW51bGw7aWYoYSl7dmFyIGM9dGhpcy50eXBlPWEudHlwZSxkPWEuY2hhbmdlZFRvdWNoZXMmJmEuY2hhbmdlZFRvdWNoZXMubGVuZ3RoP2EuY2hhbmdlZFRvdWNoZXNbMF06bnVsbDt0aGlzLnRhcmdldD1hLnRhcmdldHx8YS5zcmNFbGVtZW50O3RoaXMudT1iO2I9YS5yZWxhdGVkVGFyZ2V0O2J8fChjPT0ibW91c2VvdmVyIj8KYj1hLmZyb21FbGVtZW50OmM9PSJtb3VzZW91dCImJihiPWEudG9FbGVtZW50KSk7dGhpcy5yZWxhdGVkVGFyZ2V0PWI7ZD8odGhpcy5jbGllbnRYPWQuY2xpZW50WCE9PXZvaWQgMD9kLmNsaWVudFg6ZC5wYWdlWCx0aGlzLmNsaWVudFk9ZC5jbGllbnRZIT09dm9pZCAwP2QuY2xpZW50WTpkLnBhZ2VZLHRoaXMuc2NyZWVuWD1kLnNjcmVlblh8fDAsdGhpcy5zY3JlZW5ZPWQuc2NyZWVuWXx8MCk6KHRoaXMuY2xpZW50WD1hLmNsaWVudFghPT12b2lkIDA/YS5jbGllbnRYOmEucGFnZVgsdGhpcy5jbGllbnRZPWEuY2xpZW50WSE9PXZvaWQgMD9hLmNsaWVudFk6YS5wYWdlWSx0aGlzLnNjcmVlblg9YS5zY3JlZW5YfHwwLHRoaXMuc2NyZWVuWT1hLnNjcmVlbll8fDApO3RoaXMuYnV0dG9uPWEuYnV0dG9uO3RoaXMuZz1hLmtleUNvZGV8fDA7dGhpcy5rZXk9YS5rZXl8fCIiO3RoaXMuY3RybEtleT1hLmN0cmxLZXk7dGhpcy5hbHRLZXk9YS5hbHRLZXk7dGhpcy5zaGlmdEtleT1hLnNoaWZ0S2V5Owp0aGlzLm1ldGFLZXk9YS5tZXRhS2V5O3RoaXMuRz12P2EubWV0YUtleTphLmN0cmxLZXk7dGhpcy5wb2ludGVySWQ9YS5wb2ludGVySWR8fDA7dGhpcy5wb2ludGVyVHlwZT1hLnBvaW50ZXJUeXBlO3RoaXMuc3RhdGU9YS5zdGF0ZTt0aGlzLnRpbWVTdGFtcD1hLnRpbWVTdGFtcDt0aGlzLmg9YTthLmRlZmF1bHRQcmV2ZW50ZWQmJnoubC5qLmNhbGwodGhpcyl9fTtuKHoseSk7ei5wcm90b3R5cGUudj1mdW5jdGlvbigpe3oubC52LmNhbGwodGhpcyk7dGhpcy5oLnN0b3BQcm9wYWdhdGlvbj90aGlzLmguc3RvcFByb3BhZ2F0aW9uKCk6dGhpcy5oLmNhbmNlbEJ1YmJsZT0hMH07ei5wcm90b3R5cGUuaj1mdW5jdGlvbigpe3oubC5qLmNhbGwodGhpcyk7dmFyIGE9dGhpcy5oO2EucHJldmVudERlZmF1bHQ/YS5wcmV2ZW50RGVmYXVsdCgpOmEucmV0dXJuVmFsdWU9ITF9O3ZhciBoYj0iY2xvc3VyZV9saXN0ZW5hYmxlXyIrKE1hdGgucmFuZG9tKCkqMUU2fDApLGliPWZ1bmN0aW9uKGEpe3JldHVybiEoIWF8fCFhW2hiXSl9O3ZhciBqYj0wO3ZhciBrYj1mdW5jdGlvbihhLGIsYyxkLGUpe3RoaXMubGlzdGVuZXI9YTt0aGlzLnByb3h5PW51bGw7dGhpcy5zcmM9Yjt0aGlzLnR5cGU9Yzt0aGlzLmNhcHR1cmU9ISFkO3RoaXMucGE9ZTt0aGlzLmtleT0rK2piO3RoaXMuamE9dGhpcy5vYT0hMX0sbGI9ZnVuY3Rpb24oYSl7YS5qYT0hMDthLmxpc3RlbmVyPW51bGw7YS5wcm94eT1udWxsO2Euc3JjPW51bGw7YS5wYT1udWxsfTt2YXIgbWI9ZnVuY3Rpb24oYSl7dGhpcy5zcmM9YTt0aGlzLmc9e307dGhpcy5oPTB9O21iLnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZj1hLnRvU3RyaW5nKCk7YT10aGlzLmdbZl07YXx8KGE9dGhpcy5nW2ZdPVtdLHRoaXMuaCsrKTt2YXIgaD1uYihhLGIsZCxlKTtoPi0xPyhiPWFbaF0sY3x8KGIub2E9ITEpKTooYj1uZXcga2IoYix0aGlzLnNyYyxmLCEhZCxlKSxiLm9hPWMsYS5wdXNoKGIpKTtyZXR1cm4gYn07CnZhciBvYj1mdW5jdGlvbihhLGIpe3ZhciBjPWIudHlwZTtjIGluIGEuZyYmeGEoYS5nW2NdLGIpJiYobGIoYiksYS5nW2NdLmxlbmd0aD09MCYmKGRlbGV0ZSBhLmdbY10sYS5oLS0pKX0scGI9ZnVuY3Rpb24oYSxiLGMsZCxlKXthPWEuZ1tiLnRvU3RyaW5nKCldO2I9LTE7YSYmKGI9bmIoYSxjLGQsZSkpO3JldHVybiBiPi0xP2FbYl06bnVsbH0sbmI9ZnVuY3Rpb24oYSxiLGMsZCl7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDsrK2Upe3ZhciBmPWFbZV07aWYoIWYuamEmJmYubGlzdGVuZXI9PWImJmYuY2FwdHVyZT09ISFjJiZmLnBhPT1kKXJldHVybiBlfXJldHVybi0xfTt2YXIgcWI9ImNsb3N1cmVfbG1fIisoTWF0aC5yYW5kb20oKSoxRTZ8MCkscmI9e30sc2I9MCx1Yj1mdW5jdGlvbihhLGIsYyxkLGUpe2lmKGQmJmQub25jZSlyZXR1cm4gdGIoYSxiLGMsZCxlKTtpZihBcnJheS5pc0FycmF5KGIpKXtmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKyl1YihhLGJbZl0sYyxkLGUpO3JldHVybiBudWxsfWM9dmIoYyk7cmV0dXJuIGliKGEpP3diKGEsYixjLG0oZCk/ISFkLmNhcHR1cmU6ISFkLGUpOnhiKGEsYixjLCExLGQsZSl9LHhiPWZ1bmN0aW9uKGEsYixjLGQsZSxmKXtpZighYil0aHJvdyBFcnJvcigiSW52YWxpZCBldmVudCB0eXBlIik7dmFyIGg9bShlKT8hIWUuY2FwdHVyZTohIWUsaz15YihhKTtrfHwoYVtxYl09az1uZXcgbWIoYSkpO2M9ay5hZGQoYixjLGQsaCxmKTtpZihjLnByb3h5KXJldHVybiBjO2Q9emIoKTtjLnByb3h5PWQ7ZC5zcmM9YTtkLmxpc3RlbmVyPWM7aWYoYS5hZGRFdmVudExpc3RlbmVyKWdifHwoZT1oKSxlPT09dm9pZCAwJiYKKGU9ITEpLGEuYWRkRXZlbnRMaXN0ZW5lcihiLnRvU3RyaW5nKCksZCxlKTtlbHNlIGlmKGEuYXR0YWNoRXZlbnQpYS5hdHRhY2hFdmVudChBYihiLnRvU3RyaW5nKCkpLGQpO2Vsc2UgaWYoYS5hZGRMaXN0ZW5lciYmYS5yZW1vdmVMaXN0ZW5lcilwKGI9PT0iY2hhbmdlIiwiTWVkaWFRdWVyeUxpc3Qgb25seSBoYXMgYSBjaGFuZ2UgZXZlbnQiKSxhLmFkZExpc3RlbmVyKGQpO2Vsc2UgdGhyb3cgRXJyb3IoImFkZEV2ZW50TGlzdGVuZXIgYW5kIGF0dGFjaEV2ZW50IGFyZSB1bmF2YWlsYWJsZS4iKTtzYisrO3JldHVybiBjfSx6Yj1mdW5jdGlvbigpe3ZhciBhPUJiLGI9ZnVuY3Rpb24oYyl7cmV0dXJuIGEuY2FsbChiLnNyYyxiLmxpc3RlbmVyLGMpfTtyZXR1cm4gYn0sdGI9ZnVuY3Rpb24oYSxiLGMsZCxlKXtpZihBcnJheS5pc0FycmF5KGIpKXtmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKyl0YihhLGJbZl0sYyxkLGUpO3JldHVybiBudWxsfWM9dmIoYyk7cmV0dXJuIGliKGEpPwphLkEuYWRkKFN0cmluZyhiKSxjLCEwLG0oZCk/ISFkLmNhcHR1cmU6ISFkLGUpOnhiKGEsYixjLCEwLGQsZSl9LENiPWZ1bmN0aW9uKGEsYixjLGQsZSl7aWYoQXJyYXkuaXNBcnJheShiKSlmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKylDYihhLGJbZl0sYyxkLGUpO2Vsc2UgZD1tKGQpPyEhZC5jYXB0dXJlOiEhZCxjPXZiKGMpLGliKGEpPyhhPWEuQSxiPVN0cmluZyhiKS50b1N0cmluZygpLGIgaW4gYS5nJiYoZj1hLmdbYl0sYz1uYihmLGMsZCxlKSxjPi0xJiYobGIoZltjXSkscChmLmxlbmd0aCE9bnVsbCksQXJyYXkucHJvdG90eXBlLnNwbGljZS5jYWxsKGYsYywxKSxmLmxlbmd0aD09MCYmKGRlbGV0ZSBhLmdbYl0sYS5oLS0pKSkpOmEmJihhPXliKGEpKSYmKGM9cGIoYSxiLGMsZCxlKSkmJkEoYyl9LEE9ZnVuY3Rpb24oYSl7aWYodHlwZW9mIGEhPT0ibnVtYmVyIiYmYSYmIWEuamEpe3ZhciBiPWEuc3JjO2lmKGliKGIpKW9iKGIuQSxhKTtlbHNle3ZhciBjPWEudHlwZSwKZD1hLnByb3h5O2IucmVtb3ZlRXZlbnRMaXN0ZW5lcj9iLnJlbW92ZUV2ZW50TGlzdGVuZXIoYyxkLGEuY2FwdHVyZSk6Yi5kZXRhY2hFdmVudD9iLmRldGFjaEV2ZW50KEFiKGMpLGQpOmIuYWRkTGlzdGVuZXImJmIucmVtb3ZlTGlzdGVuZXImJmIucmVtb3ZlTGlzdGVuZXIoZCk7c2ItLTsoYz15YihiKSk/KG9iKGMsYSksYy5oPT0wJiYoYy5zcmM9bnVsbCxiW3FiXT1udWxsKSk6bGIoYSl9fX0sQWI9ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW4gcmI/cmJbYV06cmJbYV09Im9uIithfSxCYj1mdW5jdGlvbihhLGIpe2lmKGEuamEpYT0hMDtlbHNle2I9bmV3IHooYix0aGlzKTt2YXIgYz1hLmxpc3RlbmVyLGQ9YS5wYXx8YS5zcmM7YS5vYSYmQShhKTthPWMuY2FsbChkLGIpfXJldHVybiBhfSx5Yj1mdW5jdGlvbihhKXthPWFbcWJdO3JldHVybiBhIGluc3RhbmNlb2YgbWI/YTpudWxsfSxEYj0iX19jbG9zdXJlX2V2ZW50c19mbl8iKyhNYXRoLnJhbmRvbSgpKjFFOT4+PjApLHZiPWZ1bmN0aW9uKGEpe3AoYSwKIkxpc3RlbmVyIGNhbiBub3QgYmUgbnVsbC4iKTtpZih0eXBlb2YgYT09PSJmdW5jdGlvbiIpcmV0dXJuIGE7cChhLmhhbmRsZUV2ZW50LCJBbiBvYmplY3QgbGlzdGVuZXIgbXVzdCBoYXZlIGhhbmRsZUV2ZW50IG1ldGhvZC4iKTthW0RiXXx8KGFbRGJdPWZ1bmN0aW9uKGIpe3JldHVybiBhLmhhbmRsZUV2ZW50KGIpfSk7cmV0dXJuIGFbRGJdfTt2YXIgRWI9ZnVuY3Rpb24oYSl7dy5jYWxsKHRoaXMpO3RoaXMuaD1hO3RoaXMuZz17fX07bihFYix3KTsKdmFyIEZiPVtdLEI9ZnVuY3Rpb24oYSxiLGMsZCl7QXJyYXkuaXNBcnJheShjKXx8KGMmJihGYlswXT1jLnRvU3RyaW5nKCkpLGM9RmIpO2Zvcih2YXIgZT0wO2U8Yy5sZW5ndGg7ZSsrKXt2YXIgZj11YihiLGNbZV0sZHx8YS5oYW5kbGVFdmVudCwhMSxhLmh8fGEpO2lmKCFmKWJyZWFrO2EuZ1tmLmtleV09Zn1yZXR1cm4gYX0sQz1mdW5jdGlvbihhLGIsYyxkLGUsZil7aWYoQXJyYXkuaXNBcnJheShjKSlmb3IodmFyIGg9MDtoPGMubGVuZ3RoO2grKylDKGEsYixjW2hdLGQsZSxmKTtlbHNlIGQ9ZHx8YS5oYW5kbGVFdmVudCxlPW0oZSk/ISFlLmNhcHR1cmU6ISFlLGY9Znx8YS5ofHxhLGQ9dmIoZCksZT0hIWUsYz1pYihiKT9wYihiLkEsU3RyaW5nKGMpLGQsZSxmKTpiPyhiPXliKGIpKT9wYihiLGMsZCxlLGYpOm51bGw6bnVsbCxjJiYoQShjKSxkZWxldGUgYS5nW2Mua2V5XSk7cmV0dXJuIGF9LEdiPWZ1bmN0aW9uKGEpe0JhKGEuZyxmdW5jdGlvbihiLGMpe3RoaXMuZy5oYXNPd25Qcm9wZXJ0eShjKSYmCkEoYil9LGEpO2EuZz17fX07RWIucHJvdG90eXBlLkM9ZnVuY3Rpb24oKXtFYi5sLkMuY2FsbCh0aGlzKTtHYih0aGlzKX07RWIucHJvdG90eXBlLmhhbmRsZUV2ZW50PWZ1bmN0aW9uKCl7dGhyb3cgRXJyb3IoIkV2ZW50SGFuZGxlci5oYW5kbGVFdmVudCBub3QgaW1wbGVtZW50ZWQiKTt9O3ZhciBEPWZ1bmN0aW9uKCl7dy5jYWxsKHRoaXMpO3RoaXMuQT1uZXcgbWIodGhpcyk7dGhpcy5ZYT10aGlzO3RoaXMubGE9bnVsbH07bihELHcpO0QucHJvdG90eXBlW2hiXT0hMDtELnByb3RvdHlwZS5BYT1mdW5jdGlvbihhKXt0aGlzLmxhPWF9O0QucHJvdG90eXBlLnJlbW92ZUV2ZW50TGlzdGVuZXI9ZnVuY3Rpb24oYSxiLGMsZCl7Q2IodGhpcyxhLGIsYyxkKX07CnZhciBFPWZ1bmN0aW9uKGEsYil7SGIoYSk7dmFyIGM9YS5sYTtpZihjKXt2YXIgZD1bXTtmb3IodmFyIGU9MTtjO2M9Yy5sYSlkLnB1c2goYykscCgrK2U8MUUzLCJpbmZpbml0ZSBsb29wIil9YT1hLllhO2M9Yi50eXBlfHxiO3R5cGVvZiBiPT09InN0cmluZyI/Yj1uZXcgeShiLGEpOmIgaW5zdGFuY2VvZiB5P2IudGFyZ2V0PWIudGFyZ2V0fHxhOihlPWIsYj1uZXcgeShjLGEpLEdhKGIsZSkpO2U9ITA7dmFyIGY7aWYoZClmb3IoZj1kLmxlbmd0aC0xOyFiLkEmJmY+PTA7Zi0tKXt2YXIgaD1iLnU9ZFtmXTtlPUliKGgsYywhMCxiKSYmZX1iLkF8fChoPWIudT1hLGU9SWIoaCxjLCEwLGIpJiZlLGIuQXx8KGU9SWIoaCxjLCExLGIpJiZlKSk7aWYoZClmb3IoZj0wOyFiLkEmJmY8ZC5sZW5ndGg7ZisrKWg9Yi51PWRbZl0sZT1JYihoLGMsITEsYikmJmU7cmV0dXJuIGV9OwpELnByb3RvdHlwZS5DPWZ1bmN0aW9uKCl7RC5sLkMuY2FsbCh0aGlzKTtpZih0aGlzLkEpe3ZhciBhPXRoaXMuQSxiPTAsYztmb3IoYyBpbiBhLmcpe2Zvcih2YXIgZD1hLmdbY10sZT0wO2U8ZC5sZW5ndGg7ZSsrKSsrYixsYihkW2VdKTtkZWxldGUgYS5nW2NdO2EuaC0tfX10aGlzLmxhPW51bGx9O3ZhciB3Yj1mdW5jdGlvbihhLGIsYyxkLGUpe0hiKGEpO3JldHVybiBhLkEuYWRkKFN0cmluZyhiKSxjLCExLGQsZSl9LEliPWZ1bmN0aW9uKGEsYixjLGQpe2I9YS5BLmdbU3RyaW5nKGIpXTtpZighYilyZXR1cm4hMDtiPWIuY29uY2F0KCk7Zm9yKHZhciBlPSEwLGY9MDtmPGIubGVuZ3RoOysrZil7dmFyIGg9YltmXTtpZihoJiYhaC5qYSYmaC5jYXB0dXJlPT1jKXt2YXIgaz1oLmxpc3RlbmVyLHE9aC5wYXx8aC5zcmM7aC5vYSYmb2IoYS5BLGgpO2U9ay5jYWxsKHEsZCkhPT0hMSYmZX19cmV0dXJuIGUmJiFkLmRlZmF1bHRQcmV2ZW50ZWR9LEhiPWZ1bmN0aW9uKGEpe3AoYS5BLCJFdmVudCB0YXJnZXQgaXMgbm90IGluaXRpYWxpemVkLiBEaWQgeW91IGNhbGwgdGhlIHN1cGVyY2xhc3MgKGdvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0KSBjb25zdHJ1Y3Rvcj8iKX07dmFyIEpiPXQ/Ik1velVzZXJTZWxlY3QiOnV8fFZhPyJXZWJraXRVc2VyU2VsZWN0IjpudWxsLEtiPWZ1bmN0aW9uKGEsYil7Yj1iP251bGw6YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpO2lmKEpiJiYoYS5zdHlsZSYmKGEuc3R5bGVbSmJdPSJub25lIiksYikpZm9yKHZhciBjPTA7YT1iW2NdO2MrKylhLnN0eWxlJiYoYS5zdHlsZVtKYl09Im5vbmUiKX07dmFyIExiPWZ1bmN0aW9uKCl7fTtpYShMYik7TGIucHJvdG90eXBlLmc9MDt2YXIgRj1mdW5jdGlvbihhKXtELmNhbGwodGhpcyk7dGhpcy5HPWF8fHBhfHwocGE9bmV3IGZiKTt0aGlzLnphPU1iO3RoaXMuWT1udWxsO3RoaXMucz0hMTt0aGlzLmc9bnVsbDt0aGlzLk09dm9pZCAwO3RoaXMudT10aGlzLmo9dGhpcy5oPW51bGw7dGhpcy5TYT0hMX07bihGLEQpO0YucHJvdG90eXBlLlphPUxiLlYoKTsKdmFyIE1iPW51bGwsTmI9ZnVuY3Rpb24oYSxiKXtzd2l0Y2goYSl7Y2FzZSAxOnJldHVybiBiPyJkaXNhYmxlIjoiZW5hYmxlIjtjYXNlIDI6cmV0dXJuIGI/ImhpZ2hsaWdodCI6InVuaGlnaGxpZ2h0IjtjYXNlIDQ6cmV0dXJuIGI/ImFjdGl2YXRlIjoiZGVhY3RpdmF0ZSI7Y2FzZSA4OnJldHVybiBiPyJzZWxlY3QiOiJ1bnNlbGVjdCI7Y2FzZSAxNjpyZXR1cm4gYj8iY2hlY2siOiJ1bmNoZWNrIjtjYXNlIDMyOnJldHVybiBiPyJmb2N1cyI6ImJsdXIiO2Nhc2UgNjQ6cmV0dXJuIGI/Im9wZW4iOiJjbG9zZSJ9dGhyb3cgRXJyb3IoIkludmFsaWQgY29tcG9uZW50IHN0YXRlIik7fSxPYj1mdW5jdGlvbihhKXtyZXR1cm4gYS5ZfHwoYS5ZPSI6IisoYS5aYS5nKyspLnRvU3RyaW5nKDM2KSl9LFBiPWZ1bmN0aW9uKGEsYil7aWYoYS5oJiZhLmgudSl7dmFyIGM9YS5oLnUsZD1hLlk7ZCBpbiBjJiZkZWxldGUgY1tkXTtEYShhLmgudSxiLGEpfWEuWT1ifTtGLnByb3RvdHlwZS5pPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ307CnZhciBRYj1mdW5jdGlvbihhKXthLk18fChhLk09bmV3IEViKGEpKTtyZXR1cm4gcChhLk0pfTtGLnByb3RvdHlwZS5BYT1mdW5jdGlvbihhKXtpZih0aGlzLmgmJnRoaXMuaCE9YSl0aHJvdyBFcnJvcigiTWV0aG9kIG5vdCBzdXBwb3J0ZWQiKTtGLmwuQWEuY2FsbCh0aGlzLGEpfTtGLnByb3RvdHlwZS5tYT1mdW5jdGlvbigpe3RoaXMuZz1aYSh0aGlzLkcuZywiRElWIil9O0YucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbihhKXtSYih0aGlzLGEpfTsKdmFyIFJiPWZ1bmN0aW9uKGEsYixjKXtpZihhLnMpdGhyb3cgRXJyb3IoIkNvbXBvbmVudCBhbHJlYWR5IHJlbmRlcmVkIik7YS5nfHxhLm1hKCk7Yj9iLmluc2VydEJlZm9yZShhLmcsY3x8bnVsbCk6YS5HLmcuYm9keS5hcHBlbmRDaGlsZChhLmcpO2EuaCYmIWEuaC5zfHxhLkkoKX0sU2I9ZnVuY3Rpb24oYSxiKXtpZihhLnMpdGhyb3cgRXJyb3IoIkNvbXBvbmVudCBhbHJlYWR5IHJlbmRlcmVkIik7aWYoYiYmYS53YShiKSl7YS5TYT0hMDt2YXIgYz1iYihiKTthLkcmJmEuRy5nPT1jfHwoYS5HPWI/bmV3IGZiKGJiKGIpKTpwYXx8KHBhPW5ldyBmYikpO2EuRWEoYik7YS5JKCl9ZWxzZSB0aHJvdyBFcnJvcigiSW52YWxpZCBlbGVtZW50IHRvIGRlY29yYXRlIik7fTtnPUYucHJvdG90eXBlO2cud2E9ZnVuY3Rpb24oKXtyZXR1cm4hMH07Zy5FYT1mdW5jdGlvbihhKXt0aGlzLmc9YX07CmcuST1mdW5jdGlvbigpe3RoaXMucz0hMDtUYih0aGlzLGZ1bmN0aW9uKGEpeyFhLnMmJmEuaSgpJiZhLkkoKX0pfTtnLlU9ZnVuY3Rpb24oKXtUYih0aGlzLGZ1bmN0aW9uKGEpe2EucyYmYS5VKCl9KTt0aGlzLk0mJkdiKHRoaXMuTSk7dGhpcy5zPSExfTtnLkM9ZnVuY3Rpb24oKXt0aGlzLnMmJnRoaXMuVSgpO3RoaXMuTSYmKHRoaXMuTS5kaXNwb3NlKCksZGVsZXRlIHRoaXMuTSk7VGIodGhpcyxmdW5jdGlvbihhKXthLmRpc3Bvc2UoKX0pOyF0aGlzLlNhJiZ0aGlzLmcmJiRhKHRoaXMuZyk7dGhpcy5oPXRoaXMuZz10aGlzLnU9dGhpcy5qPW51bGw7Ri5sLkMuY2FsbCh0aGlzKX07Zy5CYT1mdW5jdGlvbihhLGIpe3RoaXMuQ2EoYSxIKHRoaXMpLGIpfTsKZy5DYT1mdW5jdGlvbihhLGIsYyl7cCghIWEsIlByb3ZpZGVkIGVsZW1lbnQgbXVzdCBub3QgYmUgbnVsbC4iKTtpZihhLnMmJihjfHwhdGhpcy5zKSl0aHJvdyBFcnJvcigiQ29tcG9uZW50IGFscmVhZHkgcmVuZGVyZWQiKTtpZihiPDB8fGI+SCh0aGlzKSl0aHJvdyBFcnJvcigiQ2hpbGQgY29tcG9uZW50IGluZGV4IG91dCBvZiBib3VuZHMiKTt0aGlzLnUmJnRoaXMuanx8KHRoaXMudT17fSx0aGlzLmo9W10pO2lmKGEuaD09dGhpcyl7dmFyIGQ9dGhpcy51LGU9T2IoYSk7ZFtlXT1hO3hhKHRoaXMuaixhKX1lbHNlIERhKHRoaXMudSxPYihhKSxhKTtpZihhPT10aGlzKXRocm93IEVycm9yKCJVbmFibGUgdG8gc2V0IHBhcmVudCBjb21wb25lbnQiKTtpZihkPXRoaXMmJmEuaCYmYS5ZKWU9YS5oLGQ9YS5ZLGUudSYmZD8oZT1lLnUsZD0oZSE9PW51bGwmJmQgaW4gZT9lW2RdOnZvaWQgMCl8fG51bGwpOmQ9bnVsbDtpZihkJiZhLmghPXRoaXMpdGhyb3cgRXJyb3IoIlVuYWJsZSB0byBzZXQgcGFyZW50IGNvbXBvbmVudCIpOwphLmg9dGhpcztGLmwuQWEuY2FsbChhLHRoaXMpO3phKHRoaXMuaixiLDAsYSk7YS5zJiZ0aGlzLnMmJmEuaD09dGhpcz8oYz10aGlzLm5hKCksKGMuY2hpbGROb2Rlc1tiXXx8bnVsbCkhPWEuaSgpJiYoYS5pKCkucGFyZW50RWxlbWVudD09YyYmYy5yZW1vdmVDaGlsZChhLmkoKSksYj1jLmNoaWxkTm9kZXNbYl18fG51bGwsYy5pbnNlcnRCZWZvcmUoYS5pKCksYikpKTpjPyh0aGlzLmd8fHRoaXMubWEoKSxiPUkodGhpcyxiKzEpLFJiKGEsdGhpcy5uYSgpLGI/Yi5nOm51bGwpKTp0aGlzLnMmJiFhLnMmJmEuZyYmYS5nLnBhcmVudE5vZGUmJmEuZy5wYXJlbnROb2RlLm5vZGVUeXBlPT0xJiZhLkkoKX07Zy5uYT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmd9Owp2YXIgVWI9ZnVuY3Rpb24oYSl7aWYoYS56YT09bnVsbCl7dmFyIGI9YS5zP2EuZzphLkcuZy5ib2R5O2E6e3ZhciBjPWJiKGIpO2lmKGMuZGVmYXVsdFZpZXcmJmMuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSYmKGM9Yy5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKGIsbnVsbCkpKXtjPWMuZGlyZWN0aW9ufHxjLmdldFByb3BlcnR5VmFsdWUoImRpcmVjdGlvbiIpfHwiIjticmVhayBhfWM9IiJ9YS56YT0icnRsIj09KGN8fChiLmN1cnJlbnRTdHlsZT9iLmN1cnJlbnRTdHlsZS5kaXJlY3Rpb246bnVsbCl8fGIuc3R5bGUmJmIuc3R5bGUuZGlyZWN0aW9uKX1yZXR1cm4gYS56YX0sSD1mdW5jdGlvbihhKXtyZXR1cm4gYS5qP2Euai5sZW5ndGg6MH0sST1mdW5jdGlvbihhLGIpe3JldHVybiBhLmo/YS5qW2JdfHxudWxsOm51bGx9LFRiPWZ1bmN0aW9uKGEsYixjKXthLmomJmEuai5mb3JFYWNoKGIsYyl9LFZiPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuaiYmYj9hLmouaW5kZXhPZihiKToKLTF9O3ZhciBXYj17bWI6ImFjdGl2ZWRlc2NlbmRhbnQiLHJiOiJhdG9taWMiLHNiOiJhdXRvY29tcGxldGUiLHViOiJidXN5Iix4YjoiY2hlY2tlZCIseWI6ImNvbGluZGV4IixEYjoiY29udHJvbHMiLEViOiJjdXJyZW50IixHYjoiZGVzY3JpYmVkYnkiLEpiOiJkaXNhYmxlZCIsTGI6ImRyb3BlZmZlY3QiLE1iOiJleHBhbmRlZCIsTmI6ImZsb3d0byIsUGI6ImdyYWJiZWQiLFRiOiJoYXNwb3B1cCIsVmI6ImhpZGRlbiIsWGI6ImludmFsaWQiLFliOiJsYWJlbCIsWmI6ImxhYmVsbGVkYnkiLGFjOiJsZXZlbCIsZmM6ImxpdmUiLHZjOiJtdWx0aWxpbmUiLHdjOiJtdWx0aXNlbGVjdGFibGUiLEFjOiJvcmllbnRhdGlvbiIsQmM6Im93bnMiLENjOiJwb3NpbnNldCIsRWM6InByZXNzZWQiLEljOiJyZWFkb25seSIsS2M6InJlbGV2YW50IixMYzoicmVxdWlyZWQiLFBjOiJyb3dpbmRleCIsU2M6InNlbGVjdGVkIixVYzoic2V0c2l6ZSIsV2M6InNvcnQiLG1kOiJ2YWx1ZW1heCIsbmQ6InZhbHVlbWluIiwKb2Q6InZhbHVlbm93IixwZDoidmFsdWV0ZXh0In07dmFyIFhiO3ZhciBZYj17bmI6ImFsZXJ0IixvYjoiYWxlcnRkaWFsb2ciLHBiOiJhcHBsaWNhdGlvbiIscWI6ImFydGljbGUiLHRiOiJiYW5uZXIiLHZiOiJidXR0b24iLHdiOiJjaGVja2JveCIsemI6ImNvbHVtbmhlYWRlciIsQWI6ImNvbWJvYm94IixCYjoiY29tcGxlbWVudGFyeSIsQ2I6ImNvbnRlbnRpbmZvIixGYjoiZGVmaW5pdGlvbiIsSGI6ImRpYWxvZyIsSWI6ImRpcmVjdG9yeSIsS2I6ImRvY3VtZW50IixPYjoiZm9ybSIsUWI6ImdyaWQiLFJiOiJncmlkY2VsbCIsU2I6Imdyb3VwIixVYjoiaGVhZGluZyIsV2I6ImltZyIsYmM6ImxpbmsiLGNjOiJsaXN0IixkYzoibGlzdGJveCIsZWM6Imxpc3RpdGVtIixoYzoibG9nIixpYzoibWFpbiIsamM6Im1hcnF1ZWUiLGtjOiJtYXRoIixsYzoibWVudSIsbWM6Im1lbnViYXIiLG5jOiJtZW51aXRlbSIsb2M6Im1lbnVpdGVtY2hlY2tib3giLHBjOiJtZW51aXRlbXJhZGlvIix4YzoibmF2aWdhdGlvbiIseWM6Im5vdGUiLHpjOiJvcHRpb24iLApEYzoicHJlc2VudGF0aW9uIixGYzoicHJvZ3Jlc3NiYXIiLEdjOiJyYWRpbyIsSGM6InJhZGlvZ3JvdXAiLEpjOiJyZWdpb24iLE1jOiJyb3ciLE5jOiJyb3dncm91cCIsT2M6InJvd2hlYWRlciIsUWM6InNjcm9sbGJhciIsUmM6InNlYXJjaCIsVGM6InNlcGFyYXRvciIsVmM6InNsaWRlciIsWGM6InNwaW5idXR0b24iLFljOiJzdGF0dXMiLFpjOiJzd2l0Y2giLGFkOiJ0YWIiLGJkOiJ0YWJsaXN0IixjZDoidGFicGFuZWwiLGRkOiJ0ZXh0Ym94IixlZDoidGV4dGluZm8iLGZkOiJ0aW1lciIsZ2Q6InRvb2xiYXIiLGhkOiJ0b29sdGlwIixqZDoidHJlZSIsa2Q6InRyZWVncmlkIixsZDoidHJlZWl0ZW0ifTt2YXIgWmI9ZnVuY3Rpb24oYSxiKXtiPyhwKENhKFliLGIpLCJObyBzdWNoIEFSSUEgcm9sZSAiK2IpLGEuc2V0QXR0cmlidXRlKCJyb2xlIixiKSk6YS5yZW1vdmVBdHRyaWJ1dGUoInJvbGUiKX0sYWM9ZnVuY3Rpb24oYSxiLGMpe0FycmF5LmlzQXJyYXkoYykmJihjPWMuam9pbigiICIpKTt2YXIgZD0kYihiKTtjPT09IiJ8fGM9PXZvaWQgMD8oWGJ8fChjPXt9LFhiPShjLmF0b21pYz0hMSxjLmF1dG9jb21wbGV0ZT0ibm9uZSIsYy5kcm9wZWZmZWN0PSJub25lIixjLmhhc3BvcHVwPSExLGMubGl2ZT0ib2ZmIixjLm11bHRpbGluZT0hMSxjLm11bHRpc2VsZWN0YWJsZT0hMSxjLm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIsYy5yZWFkb25seT0hMSxjLnJlbGV2YW50PSJhZGRpdGlvbnMgdGV4dCIsYy5yZXF1aXJlZD0hMSxjLnNvcnQ9Im5vbmUiLGMuYnVzeT0hMSxjLmRpc2FibGVkPSExLGMuaGlkZGVuPSExLGMuaW52YWxpZD0iZmFsc2UiLGMpKSxjPVhiLGIgaW4gYz9hLnNldEF0dHJpYnV0ZShkLApjW2JdKTphLnJlbW92ZUF0dHJpYnV0ZShkKSk6YS5zZXRBdHRyaWJ1dGUoZCxjKX0sJGI9ZnVuY3Rpb24oYSl7cChhLCJBUklBIGF0dHJpYnV0ZSBjYW5ub3QgYmUgZW1wdHkuIik7cChDYShXYixhKSwiTm8gc3VjaCBBUklBIGF0dHJpYnV0ZSAiK2EpO3JldHVybiJhcmlhLSIrYX07dmFyIGRjPWZ1bmN0aW9uKGEsYixjLGQsZSxmKXtpZih2JiZlKXJldHVybiBiYyhhKTtpZihlJiYhZClyZXR1cm4hMTtpZighdCl7dHlwZW9mIGI9PT0ibnVtYmVyIiYmKGI9Y2MoYikpO3ZhciBoPWI9PTE3fHxiPT0xOHx8diYmYj09OTE7aWYoKCFjfHx2KSYmaHx8diYmYj09MTYmJihkfHxmKSlyZXR1cm4hMX1pZih1JiZkJiZjKXN3aXRjaChhKXtjYXNlIDIyMDpjYXNlIDIxOTpjYXNlIDIyMTpjYXNlIDE5MjpjYXNlIDE4NjpjYXNlIDE4OTpjYXNlIDE4NzpjYXNlIDE4ODpjYXNlIDE5MDpjYXNlIDE5MTpjYXNlIDE5MjpjYXNlIDIyMjpyZXR1cm4hMX1zd2l0Y2goYSl7Y2FzZSAxMzpyZXR1cm4gdD9mfHxlPyExOiEoYyYmZCk6ITA7Y2FzZSAyNzpyZXR1cm4hdSYmIXR9cmV0dXJuIHQmJihkfHxlfHxmKT8hMTpiYyhhKX0sYmM9ZnVuY3Rpb24oYSl7aWYoYT49NDgmJmE8PTU3fHxhPj05NiYmYTw9MTA2fHxhPj02NSYmYTw9OTB8fHUmJmE9PTApcmV0dXJuITA7c3dpdGNoKGEpe2Nhc2UgMzI6Y2FzZSA0MzpjYXNlIDYzOmNhc2UgNjQ6Y2FzZSAxMDc6Y2FzZSAxMDk6Y2FzZSAxMTA6Y2FzZSAxMTE6Y2FzZSAxODY6Y2FzZSA1OTpjYXNlIDE4OTpjYXNlIDE4NzpjYXNlIDYxOmNhc2UgMTg4OmNhc2UgMTkwOmNhc2UgMTkxOmNhc2UgMTkyOmNhc2UgMjIyOmNhc2UgMjE5OmNhc2UgMjIwOmNhc2UgMjIxOmNhc2UgMTYzOmNhc2UgNTg6cmV0dXJuITA7CmNhc2UgMTczOmNhc2UgMTcxOnJldHVybiB0O2RlZmF1bHQ6cmV0dXJuITF9fSxjYz1mdW5jdGlvbihhKXtpZih0KWE9ZWMoYSk7ZWxzZSBpZih2JiZ1KXN3aXRjaChhKXtjYXNlIDkzOmE9OTF9cmV0dXJuIGF9LGVjPWZ1bmN0aW9uKGEpe3N3aXRjaChhKXtjYXNlIDYxOnJldHVybiAxODc7Y2FzZSA1OTpyZXR1cm4gMTg2O2Nhc2UgMTczOnJldHVybiAxODk7Y2FzZSAyMjQ6cmV0dXJuIDkxO2Nhc2UgMDpyZXR1cm4gMjI0O2RlZmF1bHQ6cmV0dXJuIGF9fTt2YXIgZmM9ZnVuY3Rpb24oYSxiLGMsZCl7ei5jYWxsKHRoaXMsZCk7dGhpcy50eXBlPSJrZXkiO3RoaXMuZz1hO3RoaXMucmVwZWF0PWN9O24oZmMseik7dmFyIEo9ZnVuY3Rpb24oYSxiKXtELmNhbGwodGhpcyk7YSYmZ2ModGhpcyxhLGIpfTtuKEosRCk7Zz1KLnByb3RvdHlwZTtnLlI9bnVsbDtnLnFhPW51bGw7Zy5KYT1udWxsO2cucmE9bnVsbDtnLkY9LTE7Zy5LPS0xO2cuRGE9ITE7CnZhciBoYz17MzoxMywxMjoxNDQsNjMyMzI6MzgsNjMyMzM6NDAsNjMyMzQ6MzcsNjMyMzU6MzksNjMyMzY6MTEyLDYzMjM3OjExMyw2MzIzODoxMTQsNjMyMzk6MTE1LDYzMjQwOjExNiw2MzI0MToxMTcsNjMyNDI6MTE4LDYzMjQzOjExOSw2MzI0NDoxMjAsNjMyNDU6MTIxLDYzMjQ2OjEyMiw2MzI0NzoxMjMsNjMyNDg6NDQsNjMyNzI6NDYsNjMyNzM6MzYsNjMyNzU6MzUsNjMyNzY6MzMsNjMyNzc6MzQsNjMyODk6MTQ0LDYzMzAyOjQ1fSxpYz17VXA6MzgsRG93bjo0MCxMZWZ0OjM3LFJpZ2h0OjM5LEVudGVyOjEzLEYxOjExMixGMjoxMTMsRjM6MTE0LEY0OjExNSxGNToxMTYsRjY6MTE3LEY3OjExOCxGODoxMTksRjk6MTIwLEYxMDoxMjEsRjExOjEyMixGMTI6MTIzLCJVKzAwN0YiOjQ2LEhvbWU6MzYsRW5kOjM1LFBhZ2VVcDozMyxQYWdlRG93bjozNCxJbnNlcnQ6NDV9LGpjPXYmJnQ7CkoucHJvdG90eXBlLmc9ZnVuY3Rpb24oYSl7dSYmKHRoaXMuRj09MTcmJiFhLmN0cmxLZXl8fHRoaXMuRj09MTgmJiFhLmFsdEtleXx8diYmdGhpcy5GPT05MSYmIWEubWV0YUtleSkmJih0aGlzLks9dGhpcy5GPS0xKTt0aGlzLkY9PS0xJiYoYS5jdHJsS2V5JiZhLmchPTE3P3RoaXMuRj0xNzphLmFsdEtleSYmYS5nIT0xOD90aGlzLkY9MTg6YS5tZXRhS2V5JiZhLmchPTkxJiYodGhpcy5GPTkxKSk7ZGMoYS5nLHRoaXMuRixhLnNoaWZ0S2V5LGEuY3RybEtleSxhLmFsdEtleSxhLm1ldGFLZXkpPyh0aGlzLks9Y2MoYS5nKSxqYyYmKHRoaXMuRGE9YS5hbHRLZXkpKTp0aGlzLmhhbmRsZUV2ZW50KGEpfTtKLnByb3RvdHlwZS5oPWZ1bmN0aW9uKGEpe3RoaXMuSz10aGlzLkY9LTE7dGhpcy5EYT1hLmFsdEtleX07CkoucHJvdG90eXBlLmhhbmRsZUV2ZW50PWZ1bmN0aW9uKGEpe3ZhciBiPWEuaCxjPWIuYWx0S2V5O2lmKHUmJmEudHlwZT09ImtleXByZXNzIil7dmFyIGQ9dGhpcy5LO3ZhciBlPWIuY2hhckNvZGU+PTAmJmIuY2hhckNvZGU8NjMyMzImJmJjKGQpP2IuY2hhckNvZGU6MH1lbHNlIGEudHlwZT09ImtleXByZXNzIj8oamMmJihjPXRoaXMuRGEpLGIua2V5Q29kZT09Yi5jaGFyQ29kZT9iLmtleUNvZGU8MzI/KGQ9Yi5rZXlDb2RlLGU9MCk6KGQ9dGhpcy5LLGU9Yi5jaGFyQ29kZSk6KGQ9Yi5rZXlDb2RlfHx0aGlzLkssZT1iLmNoYXJDb2RlfHwwKSk6KGQ9Yi5rZXlDb2RlfHx0aGlzLkssZT1iLmNoYXJDb2RlfHwwKSx2JiZlPT02MyYmZD09MjI0JiYoZD0xOTEpO3ZhciBmPWQ9Y2MoZCk7ZD9kPj02MzIzMiYmZCBpbiBoYz9mPWhjW2RdOmQ9PTI1JiZhLnNoaWZ0S2V5JiYoZj05KTpiLmtleUlkZW50aWZpZXImJmIua2V5SWRlbnRpZmllciBpbiBpYyYmKGY9aWNbYi5rZXlJZGVudGlmaWVyXSk7CmlmKCF0fHxhLnR5cGUhPSJrZXlwcmVzcyJ8fGRjKGYsdGhpcy5GLGEuc2hpZnRLZXksYS5jdHJsS2V5LGMsYS5tZXRhS2V5KSlhPWY9PXRoaXMuRix0aGlzLkY9ZixiPW5ldyBmYyhmLGUsYSxiKSxiLmFsdEtleT1jLEUodGhpcyxiKX07Si5wcm90b3R5cGUuaT1mdW5jdGlvbigpe3JldHVybiB0aGlzLlJ9O3ZhciBnYz1mdW5jdGlvbihhLGIsYyl7YS5yYSYma2MoYSk7YS5SPWI7YS5xYT11YihhLlIsImtleXByZXNzIixhLGMpO2EuSmE9dWIoYS5SLCJrZXlkb3duIixhLmcsYyxhKTthLnJhPXViKGEuUiwia2V5dXAiLGEuaCxjLGEpfSxrYz1mdW5jdGlvbihhKXthLnFhJiYoQShhLnFhKSxBKGEuSmEpLEEoYS5yYSksYS5xYT1udWxsLGEuSmE9bnVsbCxhLnJhPW51bGwpO2EuUj1udWxsO2EuRj0tMTthLks9LTF9O0oucHJvdG90eXBlLkM9ZnVuY3Rpb24oKXtKLmwuQy5jYWxsKHRoaXMpO2tjKHRoaXMpfTt2YXIgSz17Z2E6Im1vdXNlZG93biIsaGE6Im1vdXNldXAiLGZhOiJtb3VzZWNhbmNlbCIsc2M6Im1vdXNlbW92ZSIsdWM6Im1vdXNlb3ZlciIsdGM6Im1vdXNlb3V0IixxYzoibW91c2VlbnRlciIscmM6Im1vdXNlbGVhdmUifTt2YXIgbGM9ZnVuY3Rpb24oYSl7cmV0dXJuIHR5cGVvZiBhLmNsYXNzTmFtZT09InN0cmluZyI/YS5jbGFzc05hbWU6YS5nZXRBdHRyaWJ1dGUmJmEuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIn0sTD1mdW5jdGlvbihhKXtyZXR1cm4gYS5jbGFzc0xpc3Q/YS5jbGFzc0xpc3Q6bGMoYSkubWF0Y2goL1xTKy9nKXx8W119LG1jPWZ1bmN0aW9uKGEsYil7dHlwZW9mIGEuY2xhc3NOYW1lPT0ic3RyaW5nIj9hLmNsYXNzTmFtZT1iOmEuc2V0QXR0cmlidXRlJiZhLnNldEF0dHJpYnV0ZSgiY2xhc3MiLGIpfSxuYz1mdW5jdGlvbihhLGIpe2EuY2xhc3NMaXN0P2I9YS5jbGFzc0xpc3QuY29udGFpbnMoYik6KGE9TChhKSxiPXZhKGEsYik+PTApO3JldHVybiBifSxvYz1mdW5jdGlvbihhLGIpe2lmKGEuY2xhc3NMaXN0KWEuY2xhc3NMaXN0LmFkZChiKTtlbHNlIGlmKCFuYyhhLGIpKXt2YXIgYz1sYyhhKTttYyhhLGMrKGMubGVuZ3RoPjA/IiAiK2I6YikpfX0scGM9ZnVuY3Rpb24oYSxiKXtpZihhLmNsYXNzTGlzdClBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGIsCmZ1bmN0aW9uKGUpe29jKGEsZSl9KTtlbHNle3ZhciBjPXt9O0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoTChhKSxmdW5jdGlvbihlKXtjW2VdPSEwfSk7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChiLGZ1bmN0aW9uKGUpe2NbZV09ITB9KTtiPSIiO2Zvcih2YXIgZCBpbiBjKWIrPWIubGVuZ3RoPjA/IiAiK2Q6ZDttYyhhLGIpfX0scWM9ZnVuY3Rpb24oYSxiKXthLmNsYXNzTGlzdD9hLmNsYXNzTGlzdC5yZW1vdmUoYik6bmMoYSxiKSYmbWMoYSxBcnJheS5wcm90b3R5cGUuZmlsdGVyLmNhbGwoTChhKSxmdW5jdGlvbihjKXtyZXR1cm4gYyE9Yn0pLmpvaW4oIiAiKSl9LHJjPWZ1bmN0aW9uKGEsYil7YS5jbGFzc0xpc3Q/QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChiLGZ1bmN0aW9uKGMpe3FjKGEsYyl9KTptYyhhLEFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbChMKGEpLGZ1bmN0aW9uKGMpe3JldHVybiEodmEoYixjKT49MCl9KS5qb2luKCIgIikpfTt2YXIgdGM9ZnVuY3Rpb24oYSxiKXtpZighYSl0aHJvdyBFcnJvcigiSW52YWxpZCBjbGFzcyBuYW1lICIrYSk7aWYodHlwZW9mIGIhPT0iZnVuY3Rpb24iKXRocm93IEVycm9yKCJJbnZhbGlkIGRlY29yYXRvciBmdW5jdGlvbiAiK2IpO3NjW2FdPWJ9LHVjPXt9LHNjPXt9O3ZhciB2Yz1mdW5jdGlvbihhKXt0aGlzLkE9YX07aWEodmMpO3ZhciB3Yz1mdW5jdGlvbihhLGIpe2EmJihhLnRhYkluZGV4PWI/MDotMSl9LHljPWZ1bmN0aW9uKGEsYixjKXtjLmlkJiZQYihiLGMuaWQpO3ZhciBkPWEuZygpLGU9ITEsZj1MKGMpO2YmJkFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoZixmdW5jdGlvbihoKXtoPT1kP2U9ITA6aCYmdGhpcy51KGIsaCxkKX0sYSk7ZXx8b2MoYyxkKTt4YyhiLGMpO3JldHVybiBjfTt2Yy5wcm90b3R5cGUudT1mdW5jdGlvbihhLGIsYyl7Yj09YysiLWRpc2FibGVkIj9hLlgoITEpOmI9PWMrIi1ob3Jpem9udGFsIj96YyhhLCJob3Jpem9udGFsIik6Yj09YysiLXZlcnRpY2FsIiYmemMoYSwidmVydGljYWwiKX07CnZhciB4Yz1mdW5jdGlvbihhLGIpe2lmKGIpZm9yKHZhciBjPWIuZmlyc3RDaGlsZCxkO2MmJmMucGFyZW50Tm9kZT09Yjspe2Q9Yy5uZXh0U2libGluZztpZihjLm5vZGVUeXBlPT0xKXthOnt2YXIgZT1jO3AoZSk7ZT1MKGUpO2Zvcih2YXIgZj1lLmxlbmd0aCxoPTA7aDxmO2grKyl7dmFyIGs9ZVtoXTtpZihrPWsgaW4gc2M/c2Nba10oKTpudWxsKXtlPWs7YnJlYWsgYX19ZT1udWxsfWUmJihlLmc9YyxhLmlzRW5hYmxlZCgpfHxlLlgoITEpLGEuQmEoZSksU2IoZSxjKSl9ZWxzZSBjLm5vZGVWYWx1ZSYmSGEoYy5ub2RlVmFsdWUpIT0iInx8Yi5yZW1vdmVDaGlsZChjKTtjPWR9fSxBYz1mdW5jdGlvbihhLGIpe2I9Yi5pKCk7cChiLCJUaGUgY29udGFpbmVyIERPTSBlbGVtZW50IGNhbm5vdCBiZSBudWxsLiIpO0tiKGIsdCk7KGE9YS5BKSYmWmIoYixhKX07dmMucHJvdG90eXBlLmc9ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy1jb250YWluZXIifTsKdmMucHJvdG90eXBlLmo9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nKCksYz1bYixhLkw9PSJob3Jpem9udGFsIj9iKyItaG9yaXpvbnRhbCI6YisiLXZlcnRpY2FsIl07YS5pc0VuYWJsZWQoKXx8Yy5wdXNoKGIrIi1kaXNhYmxlZCIpO3JldHVybiBjfTt2YXIgQmM9ZnVuY3Rpb24oKXt9O3ZhciBNPWZ1bmN0aW9uKCl7fSxDYztpYShNKTt2YXIgRGM9e2J1dHRvbjoicHJlc3NlZCIsY2hlY2tib3g6ImNoZWNrZWQiLG1lbnVpdGVtOiJzZWxlY3RlZCIsbWVudWl0ZW1jaGVja2JveDoiY2hlY2tlZCIsbWVudWl0ZW1yYWRpbzoiY2hlY2tlZCIscmFkaW86ImNoZWNrZWQiLHRhYjoic2VsZWN0ZWQiLHRyZWVpdGVtOiJzZWxlY3RlZCJ9O00ucHJvdG90eXBlLk5hPWZ1bmN0aW9uKCl7fTtNLnByb3RvdHlwZS54YT1mdW5jdGlvbihhKXt2YXIgYj1hLkcsYz1iLmgsZD10aGlzLk4oKSxlPVtkXSxmPXRoaXMuTigpO2YhPWQmJmUucHVzaChmKTtkPWEubTtmb3IoZj1bXTtkOyl7dmFyIGg9ZCYtZDtmLnB1c2goRWModGhpcyxoKSk7ZCY9fmh9ZS5wdXNoLmFwcGx5KGUsZik7KGQ9YS5GYSkmJmUucHVzaC5hcHBseShlLGQpO3JldHVybiBjLmNhbGwoYiwiRElWIixlLmpvaW4oIiAiKSxhLmlhKX07Ck0ucHJvdG90eXBlLnlhPWZ1bmN0aW9uKGEsYil7Yi5pZCYmUGIoYSxiLmlkKTtiJiZiLmZpcnN0Q2hpbGQ/RmMoYSxiLmZpcnN0Q2hpbGQubmV4dFNpYmxpbmc/eWEoYi5jaGlsZE5vZGVzKTpiLmZpcnN0Q2hpbGQpOmEuaWE9bnVsbDt2YXIgYz0wLGQ9dGhpcy5OKCksZT10aGlzLk4oKSxmPSExLGg9ITEsaz15YShMKGIpKTtrLmZvckVhY2goZnVuY3Rpb24ocSl7Znx8cSE9ZD9ofHxxIT1lP2N8PUdjKHRoaXMscSk6aD0hMDooZj0hMCxlPT1kJiYoaD0hMCkpO0djKHRoaXMscSk9PTEmJihzYShiKSxkYihiKSYmZWIoYikmJmNiKGIsITEpKX0sdGhpcyk7YS5tPWM7Znx8KGsucHVzaChkKSxlPT1kJiYoaD0hMCkpO2h8fGsucHVzaChlKTsoYT1hLkZhKSYmay5wdXNoLmFwcGx5KGssYSk7ZiYmaCYmIWF8fG1jKGIsay5qb2luKCIgIikpO3JldHVybiBifTsKdmFyIEhjPWZ1bmN0aW9uKGEsYil7aWYoYT1hLk5hKCkpe3AoYiwiVGhlIGVsZW1lbnQgcGFzc2VkIGFzIGEgZmlyc3QgcGFyYW1ldGVyIGNhbm5vdCBiZSBudWxsLiIpO3ZhciBjPWIuZ2V0QXR0cmlidXRlKCJyb2xlIil8fG51bGw7YSE9YyYmWmIoYixhKX19LEljPWZ1bmN0aW9uKGEsYil7dmFyIGM7aWYoYS5EJjMyJiYoYz1hLmkoKSkpe2lmKCFiJiZhLm0mMzIpe3RyeXtjLmJsdXIoKX1jYXRjaChkKXt9YS5tJjMyJiZhLlFhKG51bGwpfShkYihjKSYmZWIoYykpIT1iJiZjYihjLGIpfX0sSmM9ZnVuY3Rpb24oYSxiLGMpe0NjfHwoQ2M9ezE6ImRpc2FibGVkIiw4OiJzZWxlY3RlZCIsMTY6ImNoZWNrZWQiLDY0OiJleHBhbmRlZCJ9KTtwKGEsIlRoZSBlbGVtZW50IHBhc3NlZCBhcyBhIGZpcnN0IHBhcmFtZXRlciBjYW5ub3QgYmUgbnVsbC4iKTtiPUNjW2JdO3ZhciBkPWEuZ2V0QXR0cmlidXRlKCJyb2xlIil8fG51bGw7ZCYmKGQ9RGNbZF18fGIsYj1iPT0iY2hlY2tlZCJ8fGI9PQoic2VsZWN0ZWQiP2Q6Yik7YiYmYWMoYSxiLGMpfTtNLnByb3RvdHlwZS5OPWZ1bmN0aW9uKCl7cmV0dXJuImdvb2ctY29udHJvbCJ9O3ZhciBFYz1mdW5jdGlvbihhLGIpe2EuZ3x8S2MoYSk7cmV0dXJuIGEuZ1tiXX0sR2M9ZnVuY3Rpb24oYSxiKXthLmh8fChhLmd8fEtjKGEpLGEuaD1FYShhLmcpKTthPXBhcnNlSW50KGEuaFtiXSwxMCk7cmV0dXJuIGlzTmFOKGEpPzA6YX0sS2M9ZnVuY3Rpb24oYSl7dmFyIGI9YS5OKCk7dmFyIGM9Yi5yZXBsYWNlKC9ceGEwfFxzL2csIiAiKS5pbmRleE9mKCIgIikhPS0xO3AoIWMsIkNvbnRyb2xSZW5kZXJlciBoYXMgYW4gaW52YWxpZCBjc3MgY2xhc3M6ICciK2IrIiciKTthLmc9ezE6YisiLWRpc2FibGVkIiwyOmIrIi1ob3ZlciIsNDpiKyItYWN0aXZlIiw4OmIrIi1zZWxlY3RlZCIsMTY6YisiLWNoZWNrZWQiLDMyOmIrIi1mb2N1c2VkIiw2NDpiKyItb3BlbiJ9fTt2YXIgTj1mdW5jdGlvbihhLGIsYyl7Ri5jYWxsKHRoaXMsYyk7aWYoIWIpe2ZvcihiPXRoaXMuY29uc3RydWN0b3I7Yjspe3ZhciBkPW5hKGIpO2lmKGQ9dWNbZF0pYnJlYWs7Yj0oYj1PYmplY3QuZ2V0UHJvdG90eXBlT2YoYi5wcm90b3R5cGUpKSYmYi5jb25zdHJ1Y3Rvcn1iPWQ/dHlwZW9mIGQuVj09PSJmdW5jdGlvbiI/ZC5WKCk6bmV3IGQ6bnVsbH10aGlzLnY9Yjt0aGlzLmlhPWEhPT12b2lkIDA/YTpudWxsfTtuKE4sRik7Zz1OLnByb3RvdHlwZTtnLmlhPW51bGw7Zy5tPTA7Zy5EPTM5O2cuUD0wO2cuT2E9ITA7Zy5GYT1udWxsO2cuSGE9ITA7Zy5tYT1mdW5jdGlvbigpe3ZhciBhPXRoaXMudi54YSh0aGlzKTt0aGlzLmc9YTtIYyh0aGlzLnYsYSk7S2IoYSwhMCk7dGhpcy5pc1Zpc2libGUoKXx8KGEuc3R5bGUuZGlzcGxheT0ibm9uZSIsYSYmYWMoYSwiaGlkZGVuIiwhMCkpfTtnLm5hPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaSgpfTtnLndhPWZ1bmN0aW9uKCl7cmV0dXJuITB9OwpnLkVhPWZ1bmN0aW9uKGEpe3RoaXMuZz1hPXRoaXMudi55YSh0aGlzLGEpO0hjKHRoaXMudixhKTtLYihhLCEwKTt0aGlzLk9hPWEuc3R5bGUuZGlzcGxheSE9Im5vbmUifTsKZy5JPWZ1bmN0aW9uKCl7Ti5sLkkuY2FsbCh0aGlzKTt2YXIgYT10aGlzLmc7cChhLCJDYW4gbm90IGNhbGwgZ2V0RWxlbWVudFN0cmljdCBiZWZvcmUgcmVuZGVyaW5nL2RlY29yYXRpbmcuIik7cCh0aGlzKTtwKGEpO3RoaXMuaXNWaXNpYmxlKCl8fGFjKGEsImhpZGRlbiIsIXRoaXMuaXNWaXNpYmxlKCkpO3RoaXMuaXNFbmFibGVkKCl8fEpjKGEsMSwhdGhpcy5pc0VuYWJsZWQoKSk7dGhpcy5EJjgmJkpjKGEsOCwhISh0aGlzLm0mOCkpO3RoaXMuRCYxNiYmSmMoYSwxNiwhISh0aGlzLm0mMTYpKTt0aGlzLkQmNjQmJkpjKGEsNjQsISEodGhpcy5tJjY0KSk7dmFyIGI9dGhpcy52O1ViKHRoaXMpJiYoYT10aGlzLmkoKSxiPWIuTigpKyItcnRsIiwoYT1hLmk/YS5pKCk6YSkmJnBjKGEsW2JdKSk7dGhpcy5pc0VuYWJsZWQoKSYmSWModGhpcyx0aGlzLmlzVmlzaWJsZSgpKTt0aGlzLkQmLTImJih0aGlzLkhhJiZMYyh0aGlzLCEwKSx0aGlzLkQmMzImJihhPXRoaXMuaSgpKSkmJihiPQp0aGlzLlp8fCh0aGlzLlo9bmV3IEopLGdjKGIsYSksQihCKEIoUWIodGhpcyksYiwia2V5Iix0aGlzLmFhKSxhLCJmb2N1cyIsdGhpcy5YYSksYSwiYmx1ciIsdGhpcy5RYSkpfTt2YXIgTGM9ZnVuY3Rpb24oYSxiKXt2YXIgYz1RYihhKSxkPWEuaSgpO2I/KEIoQihCKEIoYyxkLEsuZ2EsYS5zYSksZCxbSy5oYSxLLmZhXSxhLnZhKSxkLCJtb3VzZW92ZXIiLGEudWEpLGQsIm1vdXNlb3V0IixhLnRhKSxhLmNhIT1CYyYmQihjLGQsImNvbnRleHRtZW51IixhLmNhKSk6KEMoQyhDKEMoYyxkLEsuZ2EsYS5zYSksZCxbSy5oYSxLLmZhXSxhLnZhKSxkLCJtb3VzZW92ZXIiLGEudWEpLGQsIm1vdXNlb3V0IixhLnRhKSxhLmNhIT1CYyYmQyhjLGQsImNvbnRleHRtZW51IixhLmNhKSl9O04ucHJvdG90eXBlLlU9ZnVuY3Rpb24oKXtOLmwuVS5jYWxsKHRoaXMpO3RoaXMuWiYma2ModGhpcy5aKTt0aGlzLmlzVmlzaWJsZSgpJiZ0aGlzLmlzRW5hYmxlZCgpJiZJYyh0aGlzLCExKX07Ck4ucHJvdG90eXBlLkM9ZnVuY3Rpb24oKXtOLmwuQy5jYWxsKHRoaXMpO3RoaXMuWiYmKHRoaXMuWi5kaXNwb3NlKCksZGVsZXRlIHRoaXMuWik7ZGVsZXRlIHRoaXMudjt0aGlzLkZhPXRoaXMuaWE9bnVsbH07dmFyIEZjPWZ1bmN0aW9uKGEsYil7YS5pYT1ifTtOLnByb3RvdHlwZS5pc1Zpc2libGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5PYX07Ti5wcm90b3R5cGUuaXNFbmFibGVkPWZ1bmN0aW9uKCl7cmV0dXJuISh0aGlzLm0mMSl9O04ucHJvdG90eXBlLlg9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5oO2ImJnR5cGVvZiBiLmlzRW5hYmxlZD09ImZ1bmN0aW9uIiYmIWIuaXNFbmFibGVkKCl8fCFPKHRoaXMsMSwhYSl8fChhfHwoTWModGhpcywhMSksUCh0aGlzLCExKSksdGhpcy5pc1Zpc2libGUoKSYmSWModGhpcyxhKSxUKHRoaXMsMSwhYSwhMCkpfTt2YXIgUD1mdW5jdGlvbihhLGIpe08oYSwyLGIpJiZUKGEsMixiKX07Ck4ucHJvdG90eXBlLmlzQWN0aXZlPWZ1bmN0aW9uKCl7cmV0dXJuISEodGhpcy5tJjQpfTsKdmFyIE1jPWZ1bmN0aW9uKGEsYil7TyhhLDQsYikmJlQoYSw0LGIpfSxOYz1mdW5jdGlvbihhLGIpe08oYSw4LGIpJiZUKGEsOCxiKX0sT2M9ZnVuY3Rpb24oYSxiKXtPKGEsNjQsYikmJlQoYSw2NCxiKX0sVD1mdW5jdGlvbihhLGIsYyxkKXtpZighZCYmYj09MSlhLlgoIWMpO2Vsc2UgaWYoYS5EJmImJmMhPSEhKGEubSZiKSl7dmFyIGU9YS52O2lmKGQ9YS5pKCkpe2lmKGU9RWMoZSxiKSl7dmFyIGY9YS5pP2EuaSgpOmE7ZiYmKGM/cGM6cmMpKGYsW2VdKX1KYyhkLGIsYyl9YS5tPWM/YS5tfGI6YS5tJn5ifX0sUGM9ZnVuY3Rpb24oYSxiLGMpe2lmKGEucyYmYS5tJmImJiFjKXRocm93IEVycm9yKCJDb21wb25lbnQgYWxyZWFkeSByZW5kZXJlZCIpOyFjJiZhLm0mYiYmVChhLGIsITEpO2EuRD1jP2EuRHxiOmEuRCZ+Yn0sVT1mdW5jdGlvbihhLGIpe3JldHVybiEhKDI1NSZiKSYmISEoYS5EJmIpfSxPPWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4hIShhLkQmYikmJiEhKGEubSZiKSE9CmMmJighKGEuUCZiKXx8RShhLE5iKGIsYykpKSYmIWEuYmF9O04ucHJvdG90eXBlLnVhPWZ1bmN0aW9uKGEpeyFRYyhhLHRoaXMuaSgpKSYmRSh0aGlzLCJlbnRlciIpJiZ0aGlzLmlzRW5hYmxlZCgpJiZVKHRoaXMsMikmJlAodGhpcywhMCl9O04ucHJvdG90eXBlLnRhPWZ1bmN0aW9uKGEpeyFRYyhhLHRoaXMuaSgpKSYmRSh0aGlzLCJsZWF2ZSIpJiYoVSh0aGlzLDQpJiZNYyh0aGlzLCExKSxVKHRoaXMsMikmJlAodGhpcywhMSkpfTtOLnByb3RvdHlwZS5jYT1CYzt2YXIgUWM9ZnVuY3Rpb24oYSxiKXtyZXR1cm4hIWEucmVsYXRlZFRhcmdldCYmYWIoYixhLnJlbGF0ZWRUYXJnZXQpfTsKTi5wcm90b3R5cGUuc2E9ZnVuY3Rpb24oYSl7aWYodGhpcy5pc0VuYWJsZWQoKSYmKFUodGhpcywyKSYmUCh0aGlzLCEwKSwhKGEuaC5idXR0b24hPTB8fHYmJmEuY3RybEtleSkpKXtVKHRoaXMsNCkmJk1jKHRoaXMsITApO3ZhciBiO2lmKGI9dGhpcy52KXt2YXIgYztiPXRoaXMuRCYzMiYmKGM9dGhpcy5pKCkpP2RiKGMpJiZlYihjKTohMX1iJiZ0aGlzLmkoKS5mb2N1cygpfWEuaC5idXR0b24hPTB8fHYmJmEuY3RybEtleXx8YS5qKCl9O04ucHJvdG90eXBlLnZhPWZ1bmN0aW9uKGEpe3RoaXMuaXNFbmFibGVkKCkmJihVKHRoaXMsMikmJlAodGhpcywhMCksdGhpcy5pc0FjdGl2ZSgpJiZSYyh0aGlzLGEpJiZVKHRoaXMsNCkmJk1jKHRoaXMsITEpKX07CnZhciBSYz1mdW5jdGlvbihhLGIpe2lmKFUoYSwxNikpe3ZhciBjPSEoYS5tJjE2KTtPKGEsMTYsYykmJlQoYSwxNixjKX1VKGEsOCkmJk5jKGEsITApO1UoYSw2NCkmJk9jKGEsIShhLm0mNjQpKTtjPW5ldyB5KCJhY3Rpb24iLGEpO2ImJihjLmFsdEtleT1iLmFsdEtleSxjLmN0cmxLZXk9Yi5jdHJsS2V5LGMubWV0YUtleT1iLm1ldGFLZXksYy5zaGlmdEtleT1iLnNoaWZ0S2V5LGMuRz1iLkcsYy50aW1lU3RhbXA9Yi50aW1lU3RhbXApO3JldHVybiBFKGEsYyl9O04ucHJvdG90eXBlLlhhPWZ1bmN0aW9uKCl7VSh0aGlzLDMyKSYmTyh0aGlzLDMyLCEwKSYmVCh0aGlzLDMyLCEwKX07Ti5wcm90b3R5cGUuUWE9ZnVuY3Rpb24oKXtVKHRoaXMsNCkmJk1jKHRoaXMsITEpO1UodGhpcywzMikmJk8odGhpcywzMiwhMSkmJlQodGhpcywzMiwhMSl9OwpOLnByb3RvdHlwZS5hYT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5pc1Zpc2libGUoKSYmdGhpcy5pc0VuYWJsZWQoKSYmYS5nPT0xMyYmUmModGhpcyxhKT8oYS5qKCksYS52KCksITApOiExfTtpZih0eXBlb2YgTiE9PSJmdW5jdGlvbiIpdGhyb3cgRXJyb3IoIkludmFsaWQgY29tcG9uZW50IGNsYXNzICIrTik7aWYodHlwZW9mIE0hPT0iZnVuY3Rpb24iKXRocm93IEVycm9yKCJJbnZhbGlkIHJlbmRlcmVyIGNsYXNzICIrTSk7dmFyIFNjPW5hKE4pO3VjW1NjXT1NO3RjKCJnb29nLWNvbnRyb2wiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBOKG51bGwpfSk7dmFyIFY9ZnVuY3Rpb24oYSxiLGMpe0YuY2FsbCh0aGlzLGMpO3RoaXMuZWE9Ynx8dmMuVigpO3RoaXMuTD1hfHwidmVydGljYWwifTtuKFYsRik7Zz1WLnByb3RvdHlwZTtnLkthPW51bGw7Zy5kYT1udWxsO2cuZWE9bnVsbDtnLkw9bnVsbDtnLlM9ITA7Zy5UPSEwO2cubz0tMTtnLkI9bnVsbDtnLlc9ITE7Zy5PPW51bGw7dmFyIFRjPWZ1bmN0aW9uKGEpe3JldHVybiBhLkthfHxhLmkoKX07Zz1WLnByb3RvdHlwZTtnLm1hPWZ1bmN0aW9uKCl7dGhpcy5nPXRoaXMuRy5oKCJESVYiLHRoaXMuZWEuaih0aGlzKS5qb2luKCIgIikpfTtnLm5hPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaSgpfTtnLndhPWZ1bmN0aW9uKGEpe3JldHVybiBhLnRhZ05hbWU9PSJESVYifTtnLkVhPWZ1bmN0aW9uKGEpe3RoaXMuZz15Yyh0aGlzLmVhLHRoaXMsYSk7YS5zdHlsZS5kaXNwbGF5PT0ibm9uZSImJih0aGlzLlM9ITEpfTsKZy5JPWZ1bmN0aW9uKCl7Vi5sLkkuY2FsbCh0aGlzKTtUYih0aGlzLGZ1bmN0aW9uKGIpe2IucyYmVWModGhpcyxiKX0sdGhpcyk7dmFyIGE9dGhpcy5pKCk7QWModGhpcy5lYSx0aGlzKTtWYyh0aGlzLHRoaXMuUyk7QihCKEIoQihCKEIoQihCKFFiKHRoaXMpLHRoaXMsImVudGVyIix0aGlzLmViKSx0aGlzLCJoaWdobGlnaHQiLHRoaXMuZmIpLHRoaXMsInVuaGlnaGxpZ2h0Iix0aGlzLmxiKSx0aGlzLCJvcGVuIix0aGlzLmdiKSx0aGlzLCJjbG9zZSIsdGhpcy5iYiksYSxLLmdhLHRoaXMuV2EpLGJiKGEpLFtLLmhhLEsuZmFdLHRoaXMuY2IpLGEsW0suZ2EsSy5oYSxLLmZhLCJtb3VzZW92ZXIiLCJtb3VzZW91dCIsImNvbnRleHRtZW51Il0sdGhpcy5hYik7V2ModGhpcyl9O3ZhciBXYz1mdW5jdGlvbihhKXt2YXIgYj1RYihhKSxjPVRjKGEpO0IoQihCKGIsYywiZm9jdXMiLGEuUGEpLGMsImJsdXIiLGEuVWEpLGEuZGF8fChhLmRhPW5ldyBKKFRjKGEpKSksImtleSIsYS5WYSl9OwpnPVYucHJvdG90eXBlO2cuVT1mdW5jdGlvbigpe1hjKHRoaXMsLTEpO3RoaXMuQiYmT2ModGhpcy5CLCExKTt0aGlzLlc9ITE7Vi5sLlUuY2FsbCh0aGlzKX07Zy5DPWZ1bmN0aW9uKCl7Vi5sLkMuY2FsbCh0aGlzKTt0aGlzLmRhJiYodGhpcy5kYS5kaXNwb3NlKCksdGhpcy5kYT1udWxsKTt0aGlzLmVhPXRoaXMuQj10aGlzLk89dGhpcy5LYT1udWxsfTtnLmViPWZ1bmN0aW9uKCl7cmV0dXJuITB9OwpnLmZiPWZ1bmN0aW9uKGEpe3ZhciBiPVZiKHRoaXMsYS50YXJnZXQpO2lmKGI+LTEmJmIhPXRoaXMubyl7dmFyIGM9SSh0aGlzLHRoaXMubyk7YyYmUChjLCExKTt0aGlzLm89YjtjPUkodGhpcyx0aGlzLm8pO3RoaXMuVyYmTWMoYywhMCk7dGhpcy5CJiZjIT10aGlzLkImJihjLkQmNjQ/T2MoYywhMCk6T2ModGhpcy5CLCExKSl9Yj10aGlzLmkoKTtwKGIsIlRoZSBET00gZWxlbWVudCBmb3IgdGhlIGNvbnRhaW5lciBjYW5ub3QgYmUgbnVsbC4iKTthLnRhcmdldC5pKCkhPW51bGwmJmFjKGIsImFjdGl2ZWRlc2NlbmRhbnQiLGEudGFyZ2V0LmkoKS5pZCl9O2cubGI9ZnVuY3Rpb24oYSl7YS50YXJnZXQ9PUkodGhpcyx0aGlzLm8pJiYodGhpcy5vPS0xKTthPXRoaXMuaSgpO3AoYSwiVGhlIERPTSBlbGVtZW50IGZvciB0aGUgY29udGFpbmVyIGNhbm5vdCBiZSBudWxsLiIpO2EucmVtb3ZlQXR0cmlidXRlKCRiKCJhY3RpdmVkZXNjZW5kYW50IikpfTsKZy5nYj1mdW5jdGlvbihhKXsoYT1hLnRhcmdldCkmJmEhPXRoaXMuQiYmYS5oPT10aGlzJiYodGhpcy5CJiZPYyh0aGlzLkIsITEpLHRoaXMuQj1hKX07Zy5iYj1mdW5jdGlvbihhKXthLnRhcmdldD09dGhpcy5CJiYodGhpcy5CPW51bGwpO3ZhciBiPXRoaXMuaSgpLGM9YS50YXJnZXQuaSgpO2ImJmEudGFyZ2V0Lm0mMiYmYyYmKGE9IiIsYyYmKGE9Yy5pZCxwKGEsIlRoZSBhY3RpdmUgZWxlbWVudCBzaG91bGQgaGF2ZSBhbiBpZC4iKSksYWMoYiwiYWN0aXZlZGVzY2VuZGFudCIsYSkpfTtnLldhPWZ1bmN0aW9uKGEpe3RoaXMuVCYmKHRoaXMuVz0hMCk7dmFyIGI9VGModGhpcyk7YiYmZGIoYikmJmViKGIpP2IuZm9jdXMoKTphLmooKX07Zy5jYj1mdW5jdGlvbigpe3RoaXMuVz0hMX07CmcuYWI9ZnVuY3Rpb24oYSl7YTp7dmFyIGI9YS50YXJnZXQ7aWYodGhpcy5PKWZvcih2YXIgYz10aGlzLmkoKTtiJiZiIT09Yzspe3ZhciBkPWIuaWQ7aWYoZCBpbiB0aGlzLk8pe2I9dGhpcy5PW2RdO2JyZWFrIGF9Yj1iLnBhcmVudE5vZGV9Yj1udWxsfWlmKGIpc3dpdGNoKGEudHlwZSl7Y2FzZSBLLmdhOmIuc2EoYSk7YnJlYWs7Y2FzZSBLLmhhOmNhc2UgSy5mYTpiLnZhKGEpO2JyZWFrO2Nhc2UgIm1vdXNlb3ZlciI6Yi51YShhKTticmVhaztjYXNlICJtb3VzZW91dCI6Yi50YShhKTticmVhaztjYXNlICJjb250ZXh0bWVudSI6Yi5jYShhKX19O2cuUGE9ZnVuY3Rpb24oKXt9O2cuVWE9ZnVuY3Rpb24oKXtYYyh0aGlzLC0xKTt0aGlzLlc9ITE7dGhpcy5CJiZPYyh0aGlzLkIsITEpfTsKZy5WYT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5pc0VuYWJsZWQoKSYmdGhpcy5pc1Zpc2libGUoKSYmKEgodGhpcykhPTB8fHRoaXMuS2EpJiZZYyh0aGlzLGEpPyhhLmooKSxhLnYoKSwhMCk6ITF9Owp2YXIgWWM9ZnVuY3Rpb24oYSxiKXt2YXIgYz1JKGEsYS5vKTtpZihjJiZ0eXBlb2YgYy5hYT09ImZ1bmN0aW9uIiYmYy5hYShiKXx8YS5CJiZhLkIhPWMmJnR5cGVvZiBhLkIuYWE9PSJmdW5jdGlvbiImJmEuQi5hYShiKSlyZXR1cm4hMDtpZihiLnNoaWZ0S2V5fHxiLmN0cmxLZXl8fGIubWV0YUtleXx8Yi5hbHRLZXkpcmV0dXJuITE7c3dpdGNoKGIuZyl7Y2FzZSAyNzpUYyhhKS5ibHVyKCk7YnJlYWs7Y2FzZSAzNjpaYyhhKTticmVhaztjYXNlIDM1OiRjKGEpO2JyZWFrO2Nhc2UgMzg6aWYoYS5MPT0idmVydGljYWwiKWFkKGEpO2Vsc2UgcmV0dXJuITE7YnJlYWs7Y2FzZSAzNzppZihhLkw9PSJob3Jpem9udGFsIilVYihhKT9iZChhKTphZChhKTtlbHNlIHJldHVybiExO2JyZWFrO2Nhc2UgNDA6aWYoYS5MPT0idmVydGljYWwiKWJkKGEpO2Vsc2UgcmV0dXJuITE7YnJlYWs7Y2FzZSAzOTppZihhLkw9PSJob3Jpem9udGFsIilVYihhKT9hZChhKTpiZChhKTtlbHNlIHJldHVybiExOwpicmVhaztkZWZhdWx0OnJldHVybiExfXJldHVybiEwfSxVYz1mdW5jdGlvbihhLGIpe3ZhciBjPWIuaSgpO2M9Yy5pZHx8KGMuaWQ9T2IoYikpO2EuT3x8KGEuTz17fSk7YS5PW2NdPWJ9O1YucHJvdG90eXBlLkJhPWZ1bmN0aW9uKGEsYil7dWEoYSxOLCJUaGUgY2hpbGQgb2YgYSBjb250YWluZXIgbXVzdCBiZSBhIGNvbnRyb2wiKTtWLmwuQmEuY2FsbCh0aGlzLGEsYil9O1YucHJvdG90eXBlLkNhPWZ1bmN0aW9uKGEsYixjKXt1YShhLE4pO2EuUHw9MjthLlB8PTY0O1BjKGEsMzIsITEpO2EucyYmMCE9YS5IYSYmTGMoYSwhMSk7YS5IYT0hMTt2YXIgZD1hLmg9PXRoaXM/VmIodGhpcyxhKTotMTtWLmwuQ2EuY2FsbCh0aGlzLGEsYixjKTthLnMmJnRoaXMucyYmVWModGhpcyxhKTthPWQ7YT09LTEmJihhPUgodGhpcykpO2E9PXRoaXMubz90aGlzLm89TWF0aC5taW4oSCh0aGlzKS0xLGIpOmE+dGhpcy5vJiZiPD10aGlzLm8/dGhpcy5vKys6YTx0aGlzLm8mJmI+dGhpcy5vJiZ0aGlzLm8tLX07CnZhciB6Yz1mdW5jdGlvbihhLGIpe2lmKGEuaSgpKXRocm93IEVycm9yKCJDb21wb25lbnQgYWxyZWFkeSByZW5kZXJlZCIpO2EuTD1ifTtWLnByb3RvdHlwZS5pc1Zpc2libGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5TfTt2YXIgVmM9ZnVuY3Rpb24oYSxiKXthLlM9Yjt2YXIgYz1hLmkoKTtjJiYoYy5zdHlsZS5kaXNwbGF5PWI/IiI6Im5vbmUiLHdjKFRjKGEpLGEuVCYmYS5TKSl9O1YucHJvdG90eXBlLmlzRW5hYmxlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLlR9O1YucHJvdG90eXBlLlg9ZnVuY3Rpb24oYSl7dGhpcy5UIT1hJiZFKHRoaXMsYT8iZW5hYmxlIjoiZGlzYWJsZSIpJiYoYT8odGhpcy5UPSEwLFRiKHRoaXMsZnVuY3Rpb24oYil7Yi5UYT9kZWxldGUgYi5UYTpiLlgoITApfSkpOihUYih0aGlzLGZ1bmN0aW9uKGIpe2IuaXNFbmFibGVkKCk/Yi5YKCExKTpiLlRhPSEwfSksdGhpcy5XPXRoaXMuVD0hMSksd2MoVGModGhpcyksYSYmdGhpcy5TKSl9Owp2YXIgWGM9ZnVuY3Rpb24oYSxiKXsoYj1JKGEsYikpP1AoYiwhMCk6YS5vPi0xJiZQKEkoYSxhLm8pLCExKX0sWmM9ZnVuY3Rpb24oYSl7Y2QoYSxmdW5jdGlvbihiLGMpe3JldHVybihiKzEpJWN9LEgoYSktMSl9LCRjPWZ1bmN0aW9uKGEpe2NkKGEsZnVuY3Rpb24oYixjKXtiLS07cmV0dXJuIGI8MD9jLTE6Yn0sMCl9LGJkPWZ1bmN0aW9uKGEpe2NkKGEsZnVuY3Rpb24oYixjKXtyZXR1cm4oYisxKSVjfSxhLm8pfSxhZD1mdW5jdGlvbihhKXtjZChhLGZ1bmN0aW9uKGIsYyl7Yi0tO3JldHVybiBiPDA/Yy0xOmJ9LGEubyl9LGNkPWZ1bmN0aW9uKGEsYixjKXtjPWM8MD9WYihhLGEuQik6Yzt2YXIgZD1IKGEpO2M9Yi5jYWxsKGEsYyxkKTtmb3IodmFyIGU9MDtlPD1kOyl7dmFyIGY9SShhLGMpO2lmKGYmJmYuaXNWaXNpYmxlKCkmJmYuaXNFbmFibGVkKCkmJmYuRCYyKXthLkxhKGMpO2JyZWFrfWUrKztjPWIuY2FsbChhLGMsZCl9fTsKVi5wcm90b3R5cGUuTGE9ZnVuY3Rpb24oYSl7WGModGhpcyxhKX07dmFyIGRkPWZ1bmN0aW9uKCl7fTtuKGRkLE0pO2lhKGRkKTtnPWRkLnByb3RvdHlwZTtnLk49ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy10YWIifTtnLk5hPWZ1bmN0aW9uKCl7cmV0dXJuInRhYiJ9O2cueGE9ZnVuY3Rpb24oYSl7dmFyIGI9ZGQubC54YS5jYWxsKHRoaXMsYSk7KGE9YS5HYSgpKSYmdGhpcy5NYShiLGEpO3JldHVybiBifTtnLnlhPWZ1bmN0aW9uKGEsYil7Yj1kZC5sLnlhLmNhbGwodGhpcyxhLGIpO3ZhciBjPXRoaXMuR2EoYik7YyYmKGEuUmE9Yyk7YS5tJjgmJihjPWEuaCkmJnR5cGVvZiBjLko9PT0iZnVuY3Rpb24iJiYoVChhLDgsITEpLGMuSihhKSk7cmV0dXJuIGJ9O2cuR2E9ZnVuY3Rpb24oYSl7cmV0dXJuIGEudGl0bGV8fCIifTtnLk1hPWZ1bmN0aW9uKGEsYil7YSYmKGEudGl0bGU9Ynx8IiIpfTt2YXIgZWQ9ZnVuY3Rpb24oYSxiLGMpe04uY2FsbCh0aGlzLGEsYnx8ZGQuVigpLGMpO1BjKHRoaXMsOCwhMCk7dGhpcy5QfD05fTtuKGVkLE4pO2VkLnByb3RvdHlwZS5HYT1mdW5jdGlvbigpe3JldHVybiB0aGlzLlJhfTtlZC5wcm90b3R5cGUuTWE9ZnVuY3Rpb24oYSl7dGhpcy52Lk1hKHRoaXMuaSgpLGEpO3RoaXMuUmE9YX07dGMoImdvb2ctdGFiIixmdW5jdGlvbigpe3JldHVybiBuZXcgZWQobnVsbCl9KTt2YXIgVz1mdW5jdGlvbigpe3RoaXMuQT0idGFibGlzdCJ9O24oVyx2Yyk7aWEoVyk7Vy5wcm90b3R5cGUuZz1mdW5jdGlvbigpe3JldHVybiJnb29nLXRhYi1iYXIifTtXLnByb3RvdHlwZS51PWZ1bmN0aW9uKGEsYixjKXt0aGlzLnZ8fCh0aGlzLmh8fGZkKHRoaXMpLHRoaXMudj1FYSh0aGlzLmgpKTt2YXIgZD10aGlzLnZbYl07ZD8oemMoYSxnZChkKSksYS52PWQpOlcubC51LmNhbGwodGhpcyxhLGIsYyl9O1cucHJvdG90eXBlLmo9ZnVuY3Rpb24oYSl7dmFyIGI9Vy5sLmouY2FsbCh0aGlzLGEpO3RoaXMuaHx8ZmQodGhpcyk7Yi5wdXNoKHRoaXMuaFthLnZdKTtyZXR1cm4gYn07dmFyIGZkPWZ1bmN0aW9uKGEpe3ZhciBiPWEuZygpO2EuaD17dG9wOmIrIi10b3AiLGJvdHRvbTpiKyItYm90dG9tIixzdGFydDpiKyItc3RhcnQiLGVuZDpiKyItZW5kIn19O3ZhciBYPWZ1bmN0aW9uKGEsYixjKXthPWF8fCJ0b3AiO3pjKHRoaXMsZ2QoYSkpO3RoaXMudj1hO1YuY2FsbCh0aGlzLHRoaXMuTCxifHxXLlYoKSxjKTtoZCh0aGlzKX07bihYLFYpO2c9WC5wcm90b3R5cGU7Zy5IPW51bGw7Zy5JPWZ1bmN0aW9uKCl7WC5sLkkuY2FsbCh0aGlzKTtoZCh0aGlzKX07Zy5DPWZ1bmN0aW9uKCl7WC5sLkMuY2FsbCh0aGlzKTt0aGlzLkg9bnVsbH07Zy5MYT1mdW5jdGlvbihhKXtYLmwuTGEuY2FsbCh0aGlzLGEpO3RoaXMuSihJKHRoaXMsYSkpfTtnLko9ZnVuY3Rpb24oYSl7YT9OYyhhLCEwKTp0aGlzLkgmJk5jKHRoaXMuSCwhMSl9Owp2YXIgaWQ9ZnVuY3Rpb24oYSxiKXtpZihiJiZiPT1hLkgpe2Zvcih2YXIgYz1WYihhLGIpLGQ9Yy0xO2I9SShhLGQpO2QtLSl7dmFyIGU9YjtpZihlLmlzVmlzaWJsZSgpJiZlLmlzRW5hYmxlZCgpKXthLkooYik7cmV0dXJufX1mb3IoYys9MTtiPUkoYSxjKTtjKyspaWYoZD1iLGQuaXNWaXNpYmxlKCkmJmQuaXNFbmFibGVkKCkpe2EuSihiKTtyZXR1cm59YS5KKG51bGwpfX07Zz1YLnByb3RvdHlwZTtnLmpiPWZ1bmN0aW9uKGEpe3RoaXMuSCYmdGhpcy5IIT1hLnRhcmdldCYmTmModGhpcy5ILCExKTt0aGlzLkg9YS50YXJnZXR9O2cua2I9ZnVuY3Rpb24oYSl7YS50YXJnZXQ9PXRoaXMuSCYmKHRoaXMuSD1udWxsKX07Zy5oYj1mdW5jdGlvbihhKXtpZCh0aGlzLGEudGFyZ2V0KX07Zy5pYj1mdW5jdGlvbihhKXtpZCh0aGlzLGEudGFyZ2V0KX07Zy5QYT1mdW5jdGlvbigpe0kodGhpcyx0aGlzLm8pfHxYYyh0aGlzLFZiKHRoaXMsdGhpcy5IfHxJKHRoaXMsMCkpKX07CnZhciBoZD1mdW5jdGlvbihhKXtCKEIoQihCKFFiKGEpLGEsInNlbGVjdCIsYS5qYiksYSwidW5zZWxlY3QiLGEua2IpLGEsImRpc2FibGUiLGEuaGIpLGEsImhpZGUiLGEuaWIpfSxnZD1mdW5jdGlvbihhKXtyZXR1cm4gYT09InN0YXJ0Inx8YT09ImVuZCI/InZlcnRpY2FsIjoiaG9yaXpvbnRhbCJ9O3RjKCJnb29nLXRhYi1iYXIiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBYfSk7ZnVuY3Rpb24gamQoYSl7dmFyIGI9e3RvcDoiYm90dG9tIixib3R0b206InRvcCIsc3RhcnQ6InJpZ2h0IixlbmQ6ImxlZnQifVthLmxvY2F0aW9uXSxjPWEuZWxlbWVudElkLGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTtkLnRleHRDb250ZW50PSJcbiAgICBmaWVsZHNldCB7XG4gICAgICBwYWRkaW5nOiAxMHB4O1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgIzM2OTtcbiAgICB9XG5cbiAgICAjIitjKyIgLmdvb2ctdGFiLWNvbnRlbnQge1xuICAgICAgbWluLWhlaWdodDogM2VtO1xuICAgICAgbWFyZ2luOiAwO1xuICAgICAgYm9yZGVyOiAiK2EuYm9yZGVyKyIgc29saWQgIithLmJvcmRlckNvbG9yKyI7XG4gICAgICBib3JkZXItdG9wOiAwO1xuICAgICAgaGVpZ2h0OiAiK2EuY29udGVudEhlaWdodCsiO1xuICAgICAgcGFkZGluZzogNHB4IDhweDtcbiAgICAgIG1hcmdpbi1yaWdodDogNHB4O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgIG92ZXJmbG93OiBhdXRvO1xuICAgIH1cblxuICAgICMiKwpjKyIgLmdvb2ctdGFiLWJhci0iK2EubG9jYXRpb24rIiAuZ29vZy10YWItc2VsZWN0ZWQge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICIrYS5ib3JkZXJDb2xvcisiO1xuICAgICAgYm9yZGVyLSIrYisiOiAwcHg7XG4gICAgfVxuXG4gICAgIyIrYysiIC5nb29nLXRhYi1iYXItIithLmxvY2F0aW9uKyIge1xuICAgICAgcGFkZGluZy0iK2EubG9jYXRpb24rIjogNXB4ICFpbXBvcnRhbnQ7XG4gICAgICBib3JkZXItIitiKyI6IDFweCBzb2xpZCAiK2EuYm9yZGVyQ29sb3IrIiAhaW1wb3J0YW50O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICB9XG5cbiAgICAjIitjKyIgLmdvb2ctdGFiLWJhciB7XG4gICAgICAgbWFyZ2luOiAwO1xuICAgICAgIGJvcmRlcjogMDtcbiAgICAgICBwYWRkaW5nOiAwO1xuICAgICAgIGxpc3Qtc3R5bGU6IG5vbmU7XG4gICAgICAgY3Vyc29yOiBkZWZhdWx0O1xuICAgICAgIG91dGxpbmU6IG5vbmU7XG4gICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgICBtYXJnaW4tcmlnaHQ6IDRweDtcbiAgICAgIH1cblxuICAgICAjIisKYysiIC5nb29nLXRhYiB7XG4gICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgIHBhZGRpbmc6IDRweCA4cHg7XG4gICAgICAgY29sb3I6IHZhcigtLWNvbGFiLXByaW1hcnktdGV4dC1jb2xvcik7XG4gICAgICAgdGV4dC1kZWNvcmF0aW9uOiBpbml0aWFsO1xuICAgICAgIGN1cnNvcjogZGVmYXVsdDtcbiAgICAgIH1cblxuICAgICAgIyIrYysiIC5nb29nLXRhYi1ob3ZlciB7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWNvbGFiLWhpZ2hsaWdodGVkLXN1cmZhY2UtY29sb3IpO1xuICAgICAgfVxuICAgICAgIjtyZXR1cm4gZH0KdmFyIGtkPWZ1bmN0aW9uKGEpe3ZhciBiPWEuZWxlbWVudElkLGM9YS50YWJOYW1lcyxkPWEuc2VsZWN0ZWRJbmRleDsiY29udGVudEJvcmRlciJpbiBhfHwoYS5jb250ZW50Qm9yZGVyPSIwcHgiKTsiY29udGVudEhlaWdodCJpbiBhfHwoYS5jb250ZW50SGVpZ2h0PSJpbml0aWFsIik7ImJvcmRlckNvbG9yImluIGF8fChhLmJvcmRlckNvbG9yPSJ2YXIoLS1jb2xhYi1ib3JkZXItY29sb3IpIik7YS5sb2NhdGlvbnx8KGEubG9jYXRpb249InRvcCIpO3ZhciBlPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiMiK2IpLGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zi5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYi1iYXIiKTt2YXIgaD1hLmxvY2F0aW9uO2YuY2xhc3NMaXN0LmFkZCgiZ29vZy10YWItYmFyLSIraCk7Zm9yKHZhciBrPVtdLHE9ZmEoYyksRz1xLm5leHQoKTshRy5kb25lO0c9cS5uZXh0KCkpe0c9Ry52YWx1ZTt2YXIgeD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKeC5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYiIpO3gudGV4dENvbnRlbnQ9RztmLmFwcGVuZENoaWxkKHgpO2sucHVzaCh4KX1oIT0iYm90dG9tIiYmZS5hcHBlbmRDaGlsZChmKTtxPW51bGw7aWYoaD09InRvcCJ8fGg9PSJib3R0b20iKXE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikscS5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYi1iYXItY2xlYXIiKTtoPT0idG9wIiYmcSYmZS5hcHBlbmRDaGlsZChxKTtHPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO0cuY2xhc3NMaXN0LmFkZCgiZ29vZy10YWItY29udGVudCIpO3ZhciBoYT1bXTtjPWZhKGMpO2Zvcih4PWMubmV4dCgpOyF4LmRvbmU7eD1jLm5leHQoKSl4PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHguaWQ9ZS5pZCsiX2NvbnRlbnRfIitoYS5sZW5ndGgseC5zdHlsZS5kaXNwbGF5PSJub25lIixHLmFwcGVuZENoaWxkKHgpLGhhLnB1c2goeCk7ZS5hcHBlbmRDaGlsZChHKTtoPT0iYm90dG9tIiYmKHEmJgplLmFwcGVuZENoaWxkKHEpLGUuYXBwZW5kQ2hpbGQoZikpO3ZhciBRPW5ldyBYKGgpO1NiKFEsZik7dmFyIFI9LTE7d2IoUSwic2VsZWN0IixmdW5jdGlvbihTKXtTPWsuaW5kZXhPZihTLnRhcmdldC5pKCkpO1MhPVImJihSPj0wJiZSPGhhLmxlbmd0aCYmKGhhW1JdLnN0eWxlLmRpc3BsYXk9Im5vbmUiLFI9LTEpLFM+PTAmJlM8aGEubGVuZ3RoJiYoUj1TLGhhW1JdLnN0eWxlLmRpc3BsYXk9ImlubGluZSIsd2luZG93LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCJyZXNpemUiKSksZ29vZ2xlLmNvbGFiLm91dHB1dC5yZXNpemVJZnJhbWVUb0NvbnRlbnQoKSksUS5KKEkoUSxSKSkpfSk7US5KKEkoUSxkKSk7d2luZG93W2JdPXtzZXRTZWxlY3RlZFRhYkluZGV4OmZ1bmN0aW9uKFMpe1EuSihJKFEsUykpfX07ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChqZChhKSl9LGxkPVsiY29sYWJfbGliIiwiY3JlYXRlVGFiQmFyIl0sWT1sOwpsZFswXWluIFl8fHR5cGVvZiBZLmV4ZWNTY3JpcHQ9PSJ1bmRlZmluZWQifHxZLmV4ZWNTY3JpcHQoInZhciAiK2xkWzBdKTtmb3IodmFyIFo7bGQubGVuZ3RoJiYoWj1sZC5zaGlmdCgpKTspbGQubGVuZ3RofHxrZD09PXZvaWQgMD9ZW1pdJiZZW1pdIT09T2JqZWN0LnByb3RvdHlwZVtaXT9ZPVlbWl06WT1ZW1pdPXt9OllbWl09a2Q7fSkuY2FsbCh0aGlzKTsKLy8gY2xhbmctZm9ybWF0IG9uCg==", + "ok": true, + "headers": [ + [ + "content-length", + "41785" + ], + [ + "content-type", + "application/javascript" + ] + ], + "status": 200, + "status_text": "" + } + }, + "base_uri": "https://localhost:8080/", + "height": 260 + }, + "outputId": "6630da53-cc41-49ba-8c31-57649f0bc09e" + }, + "source": [ + "%%logica AnonymizedStas\n", + "\n", + "AnonymizedCodeContribution(cl_lengths: [110, 220, 405], org: \"ads\");\n", + "AnonymizedCodeContribution(cl_lengths: [30, 51, 95], org: \"ads\");\n", + "AnonymizedCodeContribution(cl_lengths: [10, 20, 1000], org: \"games\");\n", + "\n", + "ClSize(l) = (\n", + " if l < 50 then\n", + " \"S\"\n", + " else if l < 100 then\n", + " \"M\"\n", + " else if l < 500 then\n", + " \"L\"\n", + " else \"XL\"\n", + ");\n", + "\n", + "AnonymizedStas(cl_sizes:, largest_cl:) :-\n", + " cl_sizes List= (ClSize(l) :- l in cl_lengths),\n", + " largest_cl Max= (l :- l in cl_lengths),\n", + " AnonymizedCodeContribution(cl_lengths:);\n" + ], + "execution_count": 19, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"05138b70-d22d-11ef-a7c0-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id35\", \"tabNames\": [\"AnonymizedStas\", \"(Log)\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_95ef08584e" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"05142b84-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id35\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_184e94348e" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0516f09e-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_8579b69dac" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"051756b0-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id35_content_1\");\n", + "//# sourceURL=js_ac124f6e1c" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"051840a2-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"051756b0-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_e18ef9bafe" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"051964d2-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id35\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_f915a244bc" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"052109d0-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"0516f09e-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_822bfa9401" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0523b66c-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_254a09a20f" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"05241576-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id35_content_0\");\n", + "//# sourceURL=js_d3fa77cf0d" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0524c7be-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"05241576-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_ada9a43006" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"05251bec-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id35\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_2124ed94f4" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"05285640-d22d-11ef-a7c0-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id36\", \"tabNames\": [\"SQL\", \"Result\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_cfcc7f38d7" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0528e024-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id36\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_7c198082e3" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"052b0aac-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_b9bcd62891" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"052b5aa2-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id36_content_0\");\n", + "//# sourceURL=js_a0065c3817" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"052ba1ba-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"052b5aa2-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_d57967d729" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"052c54e8-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id36\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_20b6218921" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The following query is stored at \u001b[1mAnonymizedStas_sql\u001b[0m variable.\n", + "-- Initializing DuckDB environment.\n", + "create schema if not exists logica_home;\n", + "-- Empty record, has to have a field by DuckDB syntax.\n", + "drop type if exists logicarecord893574736 cascade; create type logicarecord893574736 as struct(nirvana numeric);\n", + "create sequence if not exists eternal_logical_sequence;\n", + "\n", + "\n", + "-- Logica type: logicarecord481217614\n", + "drop type if exists logicarecord481217614 cascade; create type logicarecord481217614 as struct(r logicarecord893574736);\n", + "\n", + "-- Logica type: logicarecord383307722\n", + "drop type if exists logicarecord383307722 cascade; create type logicarecord383307722 as struct(a timestamp);\n", + "WITH t_0_AnonymizedCodeContribution AS (SELECT * FROM (\n", + " \n", + " SELECT\n", + " [110, 220, 405]::numeric[] AS cl_lengths,\n", + " 'ads' AS org\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " [30, 51, 95]::numeric[] AS cl_lengths,\n", + " 'ads' AS org\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " [10, 20, 1000]::numeric[] AS cl_lengths,\n", + " 'games' AS org\n", + " \n", + ") AS UNUSED_TABLE_NAME )\n", + "SELECT\n", + " (SELECT\n", + " ARRAY_AGG((CASE WHEN x_8.unnested_pod = 0 THEN CASE WHEN (x_7.unnested_pod < 50) THEN 'S' WHEN (x_7.unnested_pod < 100) THEN 'M' WHEN (x_7.unnested_pod < 500) THEN 'L' ELSE 'XL' END ELSE NULL END)) AS logica_value\n", + "FROM\n", + " (select unnest(AnonymizedCodeContribution.cl_lengths) as unnested_pod) as x_7, (select unnest([0]::numeric[]) as unnested_pod) as x_8) AS cl_sizes,\n", + " (SELECT\n", + " MAX((CASE WHEN x_14.unnested_pod = 0 THEN x_13.unnested_pod ELSE NULL END)) AS logica_value\n", + "FROM\n", + " (select unnest(AnonymizedCodeContribution.cl_lengths) as unnested_pod) as x_13, (select unnest([0]::numeric[]) as unnested_pod) as x_14) AS largest_cl\n", + "FROM\n", + " t_0_AnonymizedCodeContribution AS AnonymizedCodeContribution;\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"052d99de-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"052b0aac-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_17c51d05b6" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"052f5f76-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_b2b6381fe0" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"052fd834-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id36_content_1\");\n", + "//# sourceURL=js_d33f708445" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"053029a6-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"052fd834-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_38328e17ae" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"05307802-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id36\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_616d49adb8" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The following table is stored at \u001b[1mAnonymizedStas\u001b[0m variable.\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
cl_sizeslargest_cl
0[L, L, L]405
1[S, M, M]95
2[S, S, XL]1000
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0531dc06-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"052f5f76-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_6f1e404e54" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"05332d9a-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"0523b66c-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_eb25aff722" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0534d8ac-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_40276fcc5b" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0535280c-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id35_content_1\");\n", + "//# sourceURL=js_a9bd776185" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"05357456-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"0535280c-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_81a96967db" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0535be7a-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id35\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_9945e9aed2" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "image/svg+xml": "\n\n\n\n\n\nConcertina\n\n\n\nAnonymizedStas\n\nAnonymizedStas\n\n\n\n", + "text/plain": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Running predicate: AnonymizedStas (36 ms)\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0556c20a-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"0534d8ac-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_e1def19023" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0559ac0e-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_519261af15" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0559f20e-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id35_content_0\");\n", + "//# sourceURL=js_10f0affc9d" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"055a88c2-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"0559f20e-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_d911f82168" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"055b16ca-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id35\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_34541d459d" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"055cc056-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_1925955ff7" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"055d08b8-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id36_content_1\");\n", + "//# sourceURL=js_8bc91c8d9f" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"055dc8ca-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"055d08b8-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_aa1f23caee" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"055e5f56-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id36\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_740decc47a" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0560d33a-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"055cc056-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_8eac91c956" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + " \n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"05631280-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"0559ac0e-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_ed6d476c18" + ] + }, + "metadata": {} + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "XjZr5xAZfs_d" + }, + "source": [ + "#### Custom aggregation functions\n", + "\n", + "You can naturally define a custom aggregation as a function of a single positional argument.\n", + "Here is an example of defining a harmonic mean aggregation." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "Q5T6DTA_fqwR", + "colab": { + "resources": { + "http://localhost:8080/nbextensions/google.colab/tabbar.css": { + "data": "Lmdvb2ctdGFie3Bvc2l0aW9uOnJlbGF0aXZlO3BhZGRpbmc6NHB4IDhweDtjb2xvcjojMDBjO3RleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7Y3Vyc29yOmRlZmF1bHR9Lmdvb2ctdGFiLWJhci10b3AgLmdvb2ctdGFie21hcmdpbjoxcHggNHB4IDAgMDtib3JkZXItYm90dG9tOjA7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLXRvcDphZnRlciwuZ29vZy10YWItYmFyLWJvdHRvbTphZnRlcntjb250ZW50OiIgIjtkaXNwbGF5OmJsb2NrO2hlaWdodDowO2NsZWFyOmJvdGg7dmlzaWJpbGl0eTpoaWRkZW59Lmdvb2ctdGFiLWJhci1ib3R0b20gLmdvb2ctdGFie21hcmdpbjowIDRweCAxcHggMDtib3JkZXItdG9wOjA7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLXN0YXJ0IC5nb29nLXRhYnttYXJnaW46MCAwIDRweCAxcHg7Ym9yZGVyLXJpZ2h0OjB9Lmdvb2ctdGFiLWJhci1lbmQgLmdvb2ctdGFie21hcmdpbjowIDFweCA0cHggMDtib3JkZXItbGVmdDowfS5nb29nLXRhYi1ob3ZlcntiYWNrZ3JvdW5kOiNlZWV9Lmdvb2ctdGFiLWRpc2FibGVke2NvbG9yOiM2NjZ9Lmdvb2ctdGFiLXNlbGVjdGVke2NvbG9yOiMwMDA7YmFja2dyb3VuZDojZmZmO3RleHQtZGVjb3JhdGlvbjpub25lO2ZvbnQtd2VpZ2h0OmJvbGQ7Ym9yZGVyOjFweCBzb2xpZCAjNmI5MGRhfS5nb29nLXRhYi1iYXItdG9we3BhZGRpbmctdG9wOjVweCFpbXBvcnRhbnQ7cGFkZGluZy1sZWZ0OjVweCFpbXBvcnRhbnQ7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgIzZiOTBkYSFpbXBvcnRhbnR9Lmdvb2ctdGFiLWJhci10b3AgLmdvb2ctdGFiLXNlbGVjdGVke3RvcDoxcHg7bWFyZ2luLXRvcDowO3BhZGRpbmctYm90dG9tOjVweH0uZ29vZy10YWItYmFyLWJvdHRvbSAuZ29vZy10YWItc2VsZWN0ZWR7dG9wOi0xcHg7bWFyZ2luLWJvdHRvbTowO3BhZGRpbmctdG9wOjVweH0uZ29vZy10YWItYmFyLXN0YXJ0IC5nb29nLXRhYi1zZWxlY3RlZHtsZWZ0OjFweDttYXJnaW4tbGVmdDowO3BhZGRpbmctcmlnaHQ6OXB4fS5nb29nLXRhYi1iYXItZW5kIC5nb29nLXRhYi1zZWxlY3RlZHtsZWZ0Oi0xcHg7bWFyZ2luLXJpZ2h0OjA7cGFkZGluZy1sZWZ0OjlweH0uZ29vZy10YWItYmFye21hcmdpbjowO2JvcmRlcjowO3BhZGRpbmc6MDtsaXN0LXN0eWxlOm5vbmU7Y3Vyc29yOmRlZmF1bHQ7b3V0bGluZTpub25lO2JhY2tncm91bmQ6I2ViZWZmOX0uZ29vZy10YWItYmFyLWNsZWFye2NsZWFyOmJvdGg7aGVpZ2h0OjA7b3ZlcmZsb3c6aGlkZGVufS5nb29nLXRhYi1iYXItc3RhcnR7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLWVuZHtmbG9hdDpyaWdodH0qIGh0bWwgLmdvb2ctdGFiLWJhci1zdGFydHttYXJnaW4tcmlnaHQ6LTNweH0qIGh0bWwgLmdvb2ctdGFiLWJhci1lbmR7bWFyZ2luLWxlZnQ6LTNweH1zZW50aW5lbHt9", + "ok": true, + "headers": [ + [ + "content-length", + "1404" + ], + [ + "content-type", + "text/css" + ] + ], + "status": 200, + "status_text": "" + }, + "http://localhost:8080/nbextensions/google.colab/tabbar_main.min.js": { + "data": "Ly8gY2xhbmctZm9ybWF0IG9mZgooZnVuY3Rpb24oKXt2YXIgZyxhYT1mdW5jdGlvbihhKXt2YXIgYj0wO3JldHVybiBmdW5jdGlvbigpe3JldHVybiBiPGEubGVuZ3RoP3tkb25lOiExLHZhbHVlOmFbYisrXX06e2RvbmU6ITB9fX0sYmE9dHlwZW9mIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzPT0iZnVuY3Rpb24iP09iamVjdC5kZWZpbmVQcm9wZXJ0eTpmdW5jdGlvbihhLGIsYyl7aWYoYT09QXJyYXkucHJvdG90eXBlfHxhPT1PYmplY3QucHJvdG90eXBlKXJldHVybiBhO2FbYl09Yy52YWx1ZTtyZXR1cm4gYX0sY2E9ZnVuY3Rpb24oYSl7YT1bIm9iamVjdCI9PXR5cGVvZiBnbG9iYWxUaGlzJiZnbG9iYWxUaGlzLGEsIm9iamVjdCI9PXR5cGVvZiB3aW5kb3cmJndpbmRvdywib2JqZWN0Ij09dHlwZW9mIHNlbGYmJnNlbGYsIm9iamVjdCI9PXR5cGVvZiBnbG9iYWwmJmdsb2JhbF07Zm9yKHZhciBiPTA7YjxhLmxlbmd0aDsrK2Ipe3ZhciBjPWFbYl07aWYoYyYmYy5NYXRoPT1NYXRoKXJldHVybiBjfXRocm93IEVycm9yKCJDYW5ub3QgZmluZCBnbG9iYWwgb2JqZWN0Iik7Cn0sZGE9Y2EodGhpcyksZWE9ZnVuY3Rpb24oYSxiKXtpZihiKWE6e3ZhciBjPWRhO2E9YS5zcGxpdCgiLiIpO2Zvcih2YXIgZD0wO2Q8YS5sZW5ndGgtMTtkKyspe3ZhciBlPWFbZF07aWYoIShlIGluIGMpKWJyZWFrIGE7Yz1jW2VdfWE9YVthLmxlbmd0aC0xXTtkPWNbYV07Yj1iKGQpO2IhPWQmJmIhPW51bGwmJmJhKGMsYSx7Y29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOmJ9KX19OwplYSgiU3ltYm9sIixmdW5jdGlvbihhKXtpZihhKXJldHVybiBhO3ZhciBiPWZ1bmN0aW9uKGYsaCl7dGhpcy5nPWY7YmEodGhpcywiZGVzY3JpcHRpb24iLHtjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6aH0pfTtiLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmd9O3ZhciBjPSJqc2NvbXBfc3ltYm9sXyIrKE1hdGgucmFuZG9tKCkqMUU5Pj4+MCkrIl8iLGQ9MCxlPWZ1bmN0aW9uKGYpe2lmKHRoaXMgaW5zdGFuY2VvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoIlN5bWJvbCBpcyBub3QgYSBjb25zdHJ1Y3RvciIpO3JldHVybiBuZXcgYihjKyhmfHwiIikrIl8iK2QrKyxmKX07cmV0dXJuIGV9KTsKdmFyIGZhPWZ1bmN0aW9uKGEpe3ZhciBiPXR5cGVvZiBTeW1ib2whPSJ1bmRlZmluZWQiJiZTeW1ib2wuaXRlcmF0b3ImJmFbU3ltYm9sLml0ZXJhdG9yXTtpZihiKXJldHVybiBiLmNhbGwoYSk7aWYodHlwZW9mIGEubGVuZ3RoPT0ibnVtYmVyIilyZXR1cm57bmV4dDphYShhKX07dGhyb3cgRXJyb3IoU3RyaW5nKGEpKyIgaXMgbm90IGFuIGl0ZXJhYmxlIG9yIEFycmF5TGlrZSIpO307ZWEoIlN5bWJvbC5kaXNwb3NlIixmdW5jdGlvbihhKXtyZXR1cm4gYT9hOlN5bWJvbCgiU3ltYm9sLmRpc3Bvc2UiKX0pOy8qCgogQ29weXJpZ2h0IFRoZSBDbG9zdXJlIExpYnJhcnkgQXV0aG9ycy4KIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wCiovCnZhciBsPXRoaXN8fHNlbGYsaWE9ZnVuY3Rpb24oYSl7YS5JYT12b2lkIDA7YS5WPWZ1bmN0aW9uKCl7cmV0dXJuIGEuSWE/YS5JYTphLklhPW5ldyBhfX0samE9ZnVuY3Rpb24oYSl7dmFyIGI9dHlwZW9mIGE7cmV0dXJuIGIhPSJvYmplY3QiP2I6YT9BcnJheS5pc0FycmF5KGEpPyJhcnJheSI6YjoibnVsbCJ9LGthPWZ1bmN0aW9uKGEpe3ZhciBiPWphKGEpO3JldHVybiBiPT0iYXJyYXkifHxiPT0ib2JqZWN0IiYmdHlwZW9mIGEubGVuZ3RoPT0ibnVtYmVyIn0sbT1mdW5jdGlvbihhKXt2YXIgYj10eXBlb2YgYTtyZXR1cm4gYj09Im9iamVjdCImJmEhPW51bGx8fGI9PSJmdW5jdGlvbiJ9LG5hPWZ1bmN0aW9uKGEpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYSxsYSkmJmFbbGFdfHwoYVtsYV09KyttYSl9LGxhPSJjbG9zdXJlX3VpZF8iKyhNYXRoLnJhbmRvbSgpKjFFOT4+PjApLG1hPTAsbj1mdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoKXt9Yy5wcm90b3R5cGU9CmIucHJvdG90eXBlO2EubD1iLnByb3RvdHlwZTthLnByb3RvdHlwZT1uZXcgYzthLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1hO2EucWQ9ZnVuY3Rpb24oZCxlLGYpe2Zvcih2YXIgaD1BcnJheShhcmd1bWVudHMubGVuZ3RoLTIpLGs9MjtrPGFyZ3VtZW50cy5sZW5ndGg7aysrKWhbay0yXT1hcmd1bWVudHNba107cmV0dXJuIGIucHJvdG90eXBlW2VdLmFwcGx5KGQsaCl9fTtmdW5jdGlvbiBvYShhLGIpe2lmKEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKUVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsb2EpO2Vsc2V7dmFyIGM9RXJyb3IoKS5zdGFjaztjJiYodGhpcy5zdGFjaz1jKX1hJiYodGhpcy5tZXNzYWdlPVN0cmluZyhhKSk7YiE9PXZvaWQgMCYmKHRoaXMuY2F1c2U9Yil9bihvYSxFcnJvcik7b2EucHJvdG90eXBlLm5hbWU9IkN1c3RvbUVycm9yIjt2YXIgcGE7ZnVuY3Rpb24gcWEoYSxiKXthPWEuc3BsaXQoIiVzIik7Zm9yKHZhciBjPSIiLGQ9YS5sZW5ndGgtMSxlPTA7ZTxkO2UrKyljKz1hW2VdKyhlPGIubGVuZ3RoP2JbZV06IiVzIik7b2EuY2FsbCh0aGlzLGMrYVtkXSl9bihxYSxvYSk7cWEucHJvdG90eXBlLm5hbWU9IkFzc2VydGlvbkVycm9yIjtmdW5jdGlvbiByYShhLGIsYyxkKXt2YXIgZT0iQXNzZXJ0aW9uIGZhaWxlZCI7aWYoYyl7ZSs9IjogIitjO3ZhciBmPWR9ZWxzZSBhJiYoZSs9IjogIithLGY9Yik7dGhyb3cgbmV3IHFhKCIiK2UsZnx8W10pO30KdmFyIHA9ZnVuY3Rpb24oYSxiLGMpe2F8fHJhKCIiLG51bGwsYixBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMikpO3JldHVybiBhfSxzYT1mdW5jdGlvbihhLGIsYyl7bShhKSYmYS5ub2RlVHlwZT09MXx8cmEoIkV4cGVjdGVkIEVsZW1lbnQgYnV0IGdvdCAlczogJXMuIixbamEoYSksYV0sYixBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMikpfSx1YT1mdW5jdGlvbihhLGIsYyxkKXthIGluc3RhbmNlb2YgYnx8cmEoIkV4cGVjdGVkIGluc3RhbmNlb2YgJXMgYnV0IGdvdCAlcy4iLFt0YShiKSx0YShhKV0sYyxBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMykpfTsKZnVuY3Rpb24gdGEoYSl7cmV0dXJuIGEgaW5zdGFuY2VvZiBGdW5jdGlvbj9hLmRpc3BsYXlOYW1lfHxhLm5hbWV8fCJ1bmtub3duIHR5cGUgbmFtZSI6YSBpbnN0YW5jZW9mIE9iamVjdD9hLmNvbnN0cnVjdG9yLmRpc3BsYXlOYW1lfHxhLmNvbnN0cnVjdG9yLm5hbWV8fE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhKTphPT09bnVsbD8ibnVsbCI6dHlwZW9mIGF9O3ZhciB2YT1BcnJheS5wcm90b3R5cGUuaW5kZXhPZj9mdW5jdGlvbihhLGIpe3AoYS5sZW5ndGghPW51bGwpO3JldHVybiBBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKGEsYix2b2lkIDApfTpmdW5jdGlvbihhLGIpe2lmKHR5cGVvZiBhPT09InN0cmluZyIpcmV0dXJuIHR5cGVvZiBiIT09InN0cmluZyJ8fGIubGVuZ3RoIT0xPy0xOmEuaW5kZXhPZihiLDApO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWlmKGMgaW4gYSYmYVtjXT09PWIpcmV0dXJuIGM7cmV0dXJuLTF9LHdhPUFycmF5LnByb3RvdHlwZS5mb3JFYWNoP2Z1bmN0aW9uKGEsYil7cChhLmxlbmd0aCE9bnVsbCk7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChhLGIsdm9pZCAwKX06ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9YS5sZW5ndGgsZD10eXBlb2YgYT09PSJzdHJpbmciP2Euc3BsaXQoIiIpOmEsZT0wO2U8YztlKyspZSBpbiBkJiZiLmNhbGwodm9pZCAwLGRbZV0sZSxhKX07CmZ1bmN0aW9uIHhhKGEsYil7Yj12YShhLGIpO3ZhciBjO2lmKGM9Yj49MClwKGEubGVuZ3RoIT1udWxsKSxBcnJheS5wcm90b3R5cGUuc3BsaWNlLmNhbGwoYSxiLDEpO3JldHVybiBjfWZ1bmN0aW9uIHlhKGEpe3ZhciBiPWEubGVuZ3RoO2lmKGI+MCl7Zm9yKHZhciBjPUFycmF5KGIpLGQ9MDtkPGI7ZCsrKWNbZF09YVtkXTtyZXR1cm4gY31yZXR1cm5bXX1mdW5jdGlvbiB6YShhLGIsYyxkKXtwKGEubGVuZ3RoIT1udWxsKTtBcnJheS5wcm90b3R5cGUuc3BsaWNlLmFwcGx5KGEsQWEoYXJndW1lbnRzLDEpKX1mdW5jdGlvbiBBYShhLGIsYyl7cChhLmxlbmd0aCE9bnVsbCk7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg8PTI/QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYSxiKTpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhLGIsYyl9O2Z1bmN0aW9uIEJhKGEsYixjKXtmb3IodmFyIGQgaW4gYSliLmNhbGwoYyxhW2RdLGQsYSl9ZnVuY3Rpb24gQ2EoYSxiKXtmb3IodmFyIGMgaW4gYSlpZihhW2NdPT1iKXJldHVybiEwO3JldHVybiExfWZ1bmN0aW9uIERhKGEsYixjKXtpZihhIT09bnVsbCYmYiBpbiBhKXRocm93IEVycm9yKCdUaGUgb2JqZWN0IGFscmVhZHkgY29udGFpbnMgdGhlIGtleSAiJytiKyciJyk7YVtiXT1jfWZ1bmN0aW9uIEVhKGEpe3ZhciBiPXt9LGM7Zm9yKGMgaW4gYSliW2FbY11dPWM7cmV0dXJuIGJ9dmFyIEZhPSJjb25zdHJ1Y3RvciBoYXNPd25Qcm9wZXJ0eSBpc1Byb3RvdHlwZU9mIHByb3BlcnR5SXNFbnVtZXJhYmxlIHRvTG9jYWxlU3RyaW5nIHRvU3RyaW5nIHZhbHVlT2YiLnNwbGl0KCIgIik7CmZ1bmN0aW9uIEdhKGEsYil7Zm9yKHZhciBjLGQsZT0xO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspe2Q9YXJndW1lbnRzW2VdO2ZvcihjIGluIGQpYVtjXT1kW2NdO2Zvcih2YXIgZj0wO2Y8RmEubGVuZ3RoO2YrKyljPUZhW2ZdLE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChkLGMpJiYoYVtjXT1kW2NdKX19O3ZhciBIYT1TdHJpbmcucHJvdG90eXBlLnRyaW0/ZnVuY3Rpb24oYSl7cmV0dXJuIGEudHJpbSgpfTpmdW5jdGlvbihhKXtyZXR1cm4vXltcc1x4YTBdKihbXHNcU10qPylbXHNceGEwXSokLy5leGVjKGEpWzFdfTsvKgoKIENvcHlyaWdodCBHb29nbGUgTExDCiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMAoqLwp2YXIgSWE9e307dmFyIEphPWZ1bmN0aW9uKGEpe2lmKElhIT09SWEpdGhyb3cgRXJyb3IoIkJhZCBzZWNyZXQiKTt0aGlzLmc9YX07SmEucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ307bmV3IEphKCJhYm91dDpibGFuayIpO25ldyBKYSgiYWJvdXQ6aW52YWxpZCN6Q2xvc3VyZXoiKTt2YXIgS2E9W10sTGE9ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJBIFVSTCB3aXRoIGNvbnRlbnQgJyIrYSsiJyB3YXMgc2FuaXRpemVkIGF3YXkuIil9O0thLmluZGV4T2YoTGEpPT09LTEmJkthLnB1c2goTGEpO3ZhciBNYSxOYTthOntmb3IodmFyIE9hPVsiQ0xPU1VSRV9GTEFHUyJdLFBhPWwsUWE9MDtRYTxPYS5sZW5ndGg7UWErKylpZihQYT1QYVtPYVtRYV1dLFBhPT1udWxsKXtOYT1udWxsO2JyZWFrIGF9TmE9UGF9dmFyIFJhPU5hJiZOYVs2MTA0MDEzMDFdO01hPVJhIT1udWxsP1JhOiExO2Z1bmN0aW9uIFNhKCl7dmFyIGE9bC5uYXZpZ2F0b3I7cmV0dXJuIGEmJihhPWEudXNlckFnZW50KT9hOiIifXZhciBUYSxVYT1sLm5hdmlnYXRvcjtUYT1VYT9VYS51c2VyQWdlbnREYXRhfHxudWxsOm51bGw7ZnVuY3Rpb24gcihhKXtyZXR1cm4gU2EoKS5pbmRleE9mKGEpIT0tMX07dmFyIFZhPXIoIkVkZ2UiKSx0PXIoIkdlY2tvIikmJiEoU2EoKS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoIndlYmtpdCIpIT0tMSYmIXIoIkVkZ2UiKSkmJiEocigiVHJpZGVudCIpfHxyKCJNU0lFIikpJiYhcigiRWRnZSIpLHU9U2EoKS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoIndlYmtpdCIpIT0tMSYmIXIoIkVkZ2UiKSx2PU1hJiZUYSYmVGEucGxhdGZvcm0/VGEucGxhdGZvcm09PT0ibWFjT1MiOnIoIk1hY2ludG9zaCIpO3ZhciBYYT1mdW5jdGlvbihhLGIpe0JhKGIsZnVuY3Rpb24oYyxkKXtkPT0ic3R5bGUiP2Euc3R5bGUuY3NzVGV4dD1jOmQ9PSJjbGFzcyI/YS5jbGFzc05hbWU9YzpkPT0iZm9yIj9hLmh0bWxGb3I9YzpXYS5oYXNPd25Qcm9wZXJ0eShkKT9hLnNldEF0dHJpYnV0ZShXYVtkXSxjKTpkLmxhc3RJbmRleE9mKCJhcmlhLSIsMCk9PTB8fGQubGFzdEluZGV4T2YoImRhdGEtIiwwKT09MD9hLnNldEF0dHJpYnV0ZShkLGMpOmFbZF09Y30pfSxXYT17Y2VsbHBhZGRpbmc6ImNlbGxQYWRkaW5nIixjZWxsc3BhY2luZzoiY2VsbFNwYWNpbmciLGNvbHNwYW46ImNvbFNwYW4iLGZyYW1lYm9yZGVyOiJmcmFtZUJvcmRlciIsaGVpZ2h0OiJoZWlnaHQiLG1heGxlbmd0aDoibWF4TGVuZ3RoIixub25jZToibm9uY2UiLHJvbGU6InJvbGUiLHJvd3NwYW46InJvd1NwYW4iLHR5cGU6InR5cGUiLHVzZW1hcDoidXNlTWFwIix2YWxpZ246InZBbGlnbiIsd2lkdGg6IndpZHRoIn0sWWE9ZnVuY3Rpb24oYSwKYixjKXtmdW5jdGlvbiBkKGspe2smJmIuYXBwZW5kQ2hpbGQodHlwZW9mIGs9PT0ic3RyaW5nIj9hLmNyZWF0ZVRleHROb2RlKGspOmspfWZvcih2YXIgZT0yO2U8Yy5sZW5ndGg7ZSsrKXt2YXIgZj1jW2VdO2lmKCFrYShmKXx8bShmKSYmZi5ub2RlVHlwZT4wKWQoZik7ZWxzZXthOntpZihmJiZ0eXBlb2YgZi5sZW5ndGg9PSJudW1iZXIiKXtpZihtKGYpKXt2YXIgaD10eXBlb2YgZi5pdGVtPT0iZnVuY3Rpb24ifHx0eXBlb2YgZi5pdGVtPT0ic3RyaW5nIjticmVhayBhfWlmKHR5cGVvZiBmPT09ImZ1bmN0aW9uIil7aD10eXBlb2YgZi5pdGVtPT0iZnVuY3Rpb24iO2JyZWFrIGF9fWg9ITF9d2EoaD95YShmKTpmLGQpfX19LFphPWZ1bmN0aW9uKGEsYil7Yj1TdHJpbmcoYik7YS5jb250ZW50VHlwZT09PSJhcHBsaWNhdGlvbi94aHRtbCt4bWwiJiYoYj1iLnRvTG93ZXJDYXNlKCkpO3JldHVybiBhLmNyZWF0ZUVsZW1lbnQoYil9LCRhPWZ1bmN0aW9uKGEpe2EmJmEucGFyZW50Tm9kZSYmCmEucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhKX0sYWI9ZnVuY3Rpb24oYSxiKXtpZighYXx8IWIpcmV0dXJuITE7aWYoYS5jb250YWlucyYmYi5ub2RlVHlwZT09MSlyZXR1cm4gYT09Ynx8YS5jb250YWlucyhiKTtpZih0eXBlb2YgYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiE9InVuZGVmaW5lZCIpcmV0dXJuIGE9PWJ8fCEhKGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24oYikmMTYpO2Zvcig7YiYmYSE9YjspYj1iLnBhcmVudE5vZGU7cmV0dXJuIGI9PWF9LGJiPWZ1bmN0aW9uKGEpe3AoYSwiTm9kZSBjYW5ub3QgYmUgbnVsbCBvciB1bmRlZmluZWQuIik7cmV0dXJuIGEubm9kZVR5cGU9PTk/YTphLm93bmVyRG9jdW1lbnR8fGEuZG9jdW1lbnR9LGNiPWZ1bmN0aW9uKGEsYil7Yj9hLnRhYkluZGV4PTA6KGEudGFiSW5kZXg9LTEsYS5yZW1vdmVBdHRyaWJ1dGUoInRhYkluZGV4IikpfSxkYj1mdW5jdGlvbihhKXtyZXR1cm4gYS5oYXNBdHRyaWJ1dGUoInRhYmluZGV4Iil9LGViPQpmdW5jdGlvbihhKXthPWEudGFiSW5kZXg7cmV0dXJuIHR5cGVvZiBhPT09Im51bWJlciImJmE+PTAmJmE8MzI3Njh9LGZiPWZ1bmN0aW9uKGEpe3RoaXMuZz1hfHxsLmRvY3VtZW50fHxkb2N1bWVudH07ZmIucHJvdG90eXBlLmk9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nO3JldHVybiB0eXBlb2YgYT09PSJzdHJpbmciP2IuZ2V0RWxlbWVudEJ5SWQoYSk6YX07ZmIucHJvdG90eXBlLmg9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXMuZyxlPWFyZ3VtZW50cyxmPWVbMV0saD1aYShkLFN0cmluZyhlWzBdKSk7ZiYmKHR5cGVvZiBmPT09InN0cmluZyI/aC5jbGFzc05hbWU9ZjpBcnJheS5pc0FycmF5KGYpP2guY2xhc3NOYW1lPWYuam9pbigiICIpOlhhKGgsZikpO2UubGVuZ3RoPjImJllhKGQsaCxlKTtyZXR1cm4gaH07dmFyIHc9ZnVuY3Rpb24oKXt0aGlzLmJhPXRoaXMuYmE7dGhpcy5rYT10aGlzLmthfTt3LnByb3RvdHlwZS5iYT0hMTt3LnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7dGhpcy5iYXx8KHRoaXMuYmE9ITAsdGhpcy5DKCkpfTt3LnByb3RvdHlwZVtTeW1ib2wuZGlzcG9zZV09ZnVuY3Rpb24oKXt0aGlzLmRpc3Bvc2UoKX07dy5wcm90b3R5cGUuQz1mdW5jdGlvbigpe2lmKHRoaXMua2EpZm9yKDt0aGlzLmthLmxlbmd0aDspdGhpcy5rYS5zaGlmdCgpKCl9O3ZhciB5PWZ1bmN0aW9uKGEsYil7dGhpcy50eXBlPWE7dGhpcy51PXRoaXMudGFyZ2V0PWI7dGhpcy5kZWZhdWx0UHJldmVudGVkPXRoaXMuQT0hMX07eS5wcm90b3R5cGUudj1mdW5jdGlvbigpe3RoaXMuQT0hMH07eS5wcm90b3R5cGUuaj1mdW5jdGlvbigpe3RoaXMuZGVmYXVsdFByZXZlbnRlZD0hMH07dmFyIGdiPWZ1bmN0aW9uKCl7aWYoIWwuYWRkRXZlbnRMaXN0ZW5lcnx8IU9iamVjdC5kZWZpbmVQcm9wZXJ0eSlyZXR1cm4hMTt2YXIgYT0hMSxiPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwicGFzc2l2ZSIse2dldDpmdW5jdGlvbigpe2E9ITB9fSk7dHJ5e3ZhciBjPWZ1bmN0aW9uKCl7fTtsLmFkZEV2ZW50TGlzdGVuZXIoInRlc3QiLGMsYik7bC5yZW1vdmVFdmVudExpc3RlbmVyKCJ0ZXN0IixjLGIpfWNhdGNoKGQpe31yZXR1cm4gYX0oKTt2YXIgej1mdW5jdGlvbihhLGIpe3kuY2FsbCh0aGlzLGE/YS50eXBlOiIiKTt0aGlzLnJlbGF0ZWRUYXJnZXQ9dGhpcy51PXRoaXMudGFyZ2V0PW51bGw7dGhpcy5idXR0b249dGhpcy5zY3JlZW5ZPXRoaXMuc2NyZWVuWD10aGlzLmNsaWVudFk9dGhpcy5jbGllbnRYPTA7dGhpcy5rZXk9IiI7dGhpcy5nPTA7dGhpcy5tZXRhS2V5PXRoaXMuc2hpZnRLZXk9dGhpcy5hbHRLZXk9dGhpcy5jdHJsS2V5PSExO3RoaXMuc3RhdGU9bnVsbDt0aGlzLkc9ITE7dGhpcy5wb2ludGVySWQ9MDt0aGlzLnBvaW50ZXJUeXBlPSIiO3RoaXMudGltZVN0YW1wPTA7dGhpcy5oPW51bGw7aWYoYSl7dmFyIGM9dGhpcy50eXBlPWEudHlwZSxkPWEuY2hhbmdlZFRvdWNoZXMmJmEuY2hhbmdlZFRvdWNoZXMubGVuZ3RoP2EuY2hhbmdlZFRvdWNoZXNbMF06bnVsbDt0aGlzLnRhcmdldD1hLnRhcmdldHx8YS5zcmNFbGVtZW50O3RoaXMudT1iO2I9YS5yZWxhdGVkVGFyZ2V0O2J8fChjPT0ibW91c2VvdmVyIj8KYj1hLmZyb21FbGVtZW50OmM9PSJtb3VzZW91dCImJihiPWEudG9FbGVtZW50KSk7dGhpcy5yZWxhdGVkVGFyZ2V0PWI7ZD8odGhpcy5jbGllbnRYPWQuY2xpZW50WCE9PXZvaWQgMD9kLmNsaWVudFg6ZC5wYWdlWCx0aGlzLmNsaWVudFk9ZC5jbGllbnRZIT09dm9pZCAwP2QuY2xpZW50WTpkLnBhZ2VZLHRoaXMuc2NyZWVuWD1kLnNjcmVlblh8fDAsdGhpcy5zY3JlZW5ZPWQuc2NyZWVuWXx8MCk6KHRoaXMuY2xpZW50WD1hLmNsaWVudFghPT12b2lkIDA/YS5jbGllbnRYOmEucGFnZVgsdGhpcy5jbGllbnRZPWEuY2xpZW50WSE9PXZvaWQgMD9hLmNsaWVudFk6YS5wYWdlWSx0aGlzLnNjcmVlblg9YS5zY3JlZW5YfHwwLHRoaXMuc2NyZWVuWT1hLnNjcmVlbll8fDApO3RoaXMuYnV0dG9uPWEuYnV0dG9uO3RoaXMuZz1hLmtleUNvZGV8fDA7dGhpcy5rZXk9YS5rZXl8fCIiO3RoaXMuY3RybEtleT1hLmN0cmxLZXk7dGhpcy5hbHRLZXk9YS5hbHRLZXk7dGhpcy5zaGlmdEtleT1hLnNoaWZ0S2V5Owp0aGlzLm1ldGFLZXk9YS5tZXRhS2V5O3RoaXMuRz12P2EubWV0YUtleTphLmN0cmxLZXk7dGhpcy5wb2ludGVySWQ9YS5wb2ludGVySWR8fDA7dGhpcy5wb2ludGVyVHlwZT1hLnBvaW50ZXJUeXBlO3RoaXMuc3RhdGU9YS5zdGF0ZTt0aGlzLnRpbWVTdGFtcD1hLnRpbWVTdGFtcDt0aGlzLmg9YTthLmRlZmF1bHRQcmV2ZW50ZWQmJnoubC5qLmNhbGwodGhpcyl9fTtuKHoseSk7ei5wcm90b3R5cGUudj1mdW5jdGlvbigpe3oubC52LmNhbGwodGhpcyk7dGhpcy5oLnN0b3BQcm9wYWdhdGlvbj90aGlzLmguc3RvcFByb3BhZ2F0aW9uKCk6dGhpcy5oLmNhbmNlbEJ1YmJsZT0hMH07ei5wcm90b3R5cGUuaj1mdW5jdGlvbigpe3oubC5qLmNhbGwodGhpcyk7dmFyIGE9dGhpcy5oO2EucHJldmVudERlZmF1bHQ/YS5wcmV2ZW50RGVmYXVsdCgpOmEucmV0dXJuVmFsdWU9ITF9O3ZhciBoYj0iY2xvc3VyZV9saXN0ZW5hYmxlXyIrKE1hdGgucmFuZG9tKCkqMUU2fDApLGliPWZ1bmN0aW9uKGEpe3JldHVybiEoIWF8fCFhW2hiXSl9O3ZhciBqYj0wO3ZhciBrYj1mdW5jdGlvbihhLGIsYyxkLGUpe3RoaXMubGlzdGVuZXI9YTt0aGlzLnByb3h5PW51bGw7dGhpcy5zcmM9Yjt0aGlzLnR5cGU9Yzt0aGlzLmNhcHR1cmU9ISFkO3RoaXMucGE9ZTt0aGlzLmtleT0rK2piO3RoaXMuamE9dGhpcy5vYT0hMX0sbGI9ZnVuY3Rpb24oYSl7YS5qYT0hMDthLmxpc3RlbmVyPW51bGw7YS5wcm94eT1udWxsO2Euc3JjPW51bGw7YS5wYT1udWxsfTt2YXIgbWI9ZnVuY3Rpb24oYSl7dGhpcy5zcmM9YTt0aGlzLmc9e307dGhpcy5oPTB9O21iLnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZj1hLnRvU3RyaW5nKCk7YT10aGlzLmdbZl07YXx8KGE9dGhpcy5nW2ZdPVtdLHRoaXMuaCsrKTt2YXIgaD1uYihhLGIsZCxlKTtoPi0xPyhiPWFbaF0sY3x8KGIub2E9ITEpKTooYj1uZXcga2IoYix0aGlzLnNyYyxmLCEhZCxlKSxiLm9hPWMsYS5wdXNoKGIpKTtyZXR1cm4gYn07CnZhciBvYj1mdW5jdGlvbihhLGIpe3ZhciBjPWIudHlwZTtjIGluIGEuZyYmeGEoYS5nW2NdLGIpJiYobGIoYiksYS5nW2NdLmxlbmd0aD09MCYmKGRlbGV0ZSBhLmdbY10sYS5oLS0pKX0scGI9ZnVuY3Rpb24oYSxiLGMsZCxlKXthPWEuZ1tiLnRvU3RyaW5nKCldO2I9LTE7YSYmKGI9bmIoYSxjLGQsZSkpO3JldHVybiBiPi0xP2FbYl06bnVsbH0sbmI9ZnVuY3Rpb24oYSxiLGMsZCl7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDsrK2Upe3ZhciBmPWFbZV07aWYoIWYuamEmJmYubGlzdGVuZXI9PWImJmYuY2FwdHVyZT09ISFjJiZmLnBhPT1kKXJldHVybiBlfXJldHVybi0xfTt2YXIgcWI9ImNsb3N1cmVfbG1fIisoTWF0aC5yYW5kb20oKSoxRTZ8MCkscmI9e30sc2I9MCx1Yj1mdW5jdGlvbihhLGIsYyxkLGUpe2lmKGQmJmQub25jZSlyZXR1cm4gdGIoYSxiLGMsZCxlKTtpZihBcnJheS5pc0FycmF5KGIpKXtmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKyl1YihhLGJbZl0sYyxkLGUpO3JldHVybiBudWxsfWM9dmIoYyk7cmV0dXJuIGliKGEpP3diKGEsYixjLG0oZCk/ISFkLmNhcHR1cmU6ISFkLGUpOnhiKGEsYixjLCExLGQsZSl9LHhiPWZ1bmN0aW9uKGEsYixjLGQsZSxmKXtpZighYil0aHJvdyBFcnJvcigiSW52YWxpZCBldmVudCB0eXBlIik7dmFyIGg9bShlKT8hIWUuY2FwdHVyZTohIWUsaz15YihhKTtrfHwoYVtxYl09az1uZXcgbWIoYSkpO2M9ay5hZGQoYixjLGQsaCxmKTtpZihjLnByb3h5KXJldHVybiBjO2Q9emIoKTtjLnByb3h5PWQ7ZC5zcmM9YTtkLmxpc3RlbmVyPWM7aWYoYS5hZGRFdmVudExpc3RlbmVyKWdifHwoZT1oKSxlPT09dm9pZCAwJiYKKGU9ITEpLGEuYWRkRXZlbnRMaXN0ZW5lcihiLnRvU3RyaW5nKCksZCxlKTtlbHNlIGlmKGEuYXR0YWNoRXZlbnQpYS5hdHRhY2hFdmVudChBYihiLnRvU3RyaW5nKCkpLGQpO2Vsc2UgaWYoYS5hZGRMaXN0ZW5lciYmYS5yZW1vdmVMaXN0ZW5lcilwKGI9PT0iY2hhbmdlIiwiTWVkaWFRdWVyeUxpc3Qgb25seSBoYXMgYSBjaGFuZ2UgZXZlbnQiKSxhLmFkZExpc3RlbmVyKGQpO2Vsc2UgdGhyb3cgRXJyb3IoImFkZEV2ZW50TGlzdGVuZXIgYW5kIGF0dGFjaEV2ZW50IGFyZSB1bmF2YWlsYWJsZS4iKTtzYisrO3JldHVybiBjfSx6Yj1mdW5jdGlvbigpe3ZhciBhPUJiLGI9ZnVuY3Rpb24oYyl7cmV0dXJuIGEuY2FsbChiLnNyYyxiLmxpc3RlbmVyLGMpfTtyZXR1cm4gYn0sdGI9ZnVuY3Rpb24oYSxiLGMsZCxlKXtpZihBcnJheS5pc0FycmF5KGIpKXtmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKyl0YihhLGJbZl0sYyxkLGUpO3JldHVybiBudWxsfWM9dmIoYyk7cmV0dXJuIGliKGEpPwphLkEuYWRkKFN0cmluZyhiKSxjLCEwLG0oZCk/ISFkLmNhcHR1cmU6ISFkLGUpOnhiKGEsYixjLCEwLGQsZSl9LENiPWZ1bmN0aW9uKGEsYixjLGQsZSl7aWYoQXJyYXkuaXNBcnJheShiKSlmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKylDYihhLGJbZl0sYyxkLGUpO2Vsc2UgZD1tKGQpPyEhZC5jYXB0dXJlOiEhZCxjPXZiKGMpLGliKGEpPyhhPWEuQSxiPVN0cmluZyhiKS50b1N0cmluZygpLGIgaW4gYS5nJiYoZj1hLmdbYl0sYz1uYihmLGMsZCxlKSxjPi0xJiYobGIoZltjXSkscChmLmxlbmd0aCE9bnVsbCksQXJyYXkucHJvdG90eXBlLnNwbGljZS5jYWxsKGYsYywxKSxmLmxlbmd0aD09MCYmKGRlbGV0ZSBhLmdbYl0sYS5oLS0pKSkpOmEmJihhPXliKGEpKSYmKGM9cGIoYSxiLGMsZCxlKSkmJkEoYyl9LEE9ZnVuY3Rpb24oYSl7aWYodHlwZW9mIGEhPT0ibnVtYmVyIiYmYSYmIWEuamEpe3ZhciBiPWEuc3JjO2lmKGliKGIpKW9iKGIuQSxhKTtlbHNle3ZhciBjPWEudHlwZSwKZD1hLnByb3h5O2IucmVtb3ZlRXZlbnRMaXN0ZW5lcj9iLnJlbW92ZUV2ZW50TGlzdGVuZXIoYyxkLGEuY2FwdHVyZSk6Yi5kZXRhY2hFdmVudD9iLmRldGFjaEV2ZW50KEFiKGMpLGQpOmIuYWRkTGlzdGVuZXImJmIucmVtb3ZlTGlzdGVuZXImJmIucmVtb3ZlTGlzdGVuZXIoZCk7c2ItLTsoYz15YihiKSk/KG9iKGMsYSksYy5oPT0wJiYoYy5zcmM9bnVsbCxiW3FiXT1udWxsKSk6bGIoYSl9fX0sQWI9ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW4gcmI/cmJbYV06cmJbYV09Im9uIithfSxCYj1mdW5jdGlvbihhLGIpe2lmKGEuamEpYT0hMDtlbHNle2I9bmV3IHooYix0aGlzKTt2YXIgYz1hLmxpc3RlbmVyLGQ9YS5wYXx8YS5zcmM7YS5vYSYmQShhKTthPWMuY2FsbChkLGIpfXJldHVybiBhfSx5Yj1mdW5jdGlvbihhKXthPWFbcWJdO3JldHVybiBhIGluc3RhbmNlb2YgbWI/YTpudWxsfSxEYj0iX19jbG9zdXJlX2V2ZW50c19mbl8iKyhNYXRoLnJhbmRvbSgpKjFFOT4+PjApLHZiPWZ1bmN0aW9uKGEpe3AoYSwKIkxpc3RlbmVyIGNhbiBub3QgYmUgbnVsbC4iKTtpZih0eXBlb2YgYT09PSJmdW5jdGlvbiIpcmV0dXJuIGE7cChhLmhhbmRsZUV2ZW50LCJBbiBvYmplY3QgbGlzdGVuZXIgbXVzdCBoYXZlIGhhbmRsZUV2ZW50IG1ldGhvZC4iKTthW0RiXXx8KGFbRGJdPWZ1bmN0aW9uKGIpe3JldHVybiBhLmhhbmRsZUV2ZW50KGIpfSk7cmV0dXJuIGFbRGJdfTt2YXIgRWI9ZnVuY3Rpb24oYSl7dy5jYWxsKHRoaXMpO3RoaXMuaD1hO3RoaXMuZz17fX07bihFYix3KTsKdmFyIEZiPVtdLEI9ZnVuY3Rpb24oYSxiLGMsZCl7QXJyYXkuaXNBcnJheShjKXx8KGMmJihGYlswXT1jLnRvU3RyaW5nKCkpLGM9RmIpO2Zvcih2YXIgZT0wO2U8Yy5sZW5ndGg7ZSsrKXt2YXIgZj11YihiLGNbZV0sZHx8YS5oYW5kbGVFdmVudCwhMSxhLmh8fGEpO2lmKCFmKWJyZWFrO2EuZ1tmLmtleV09Zn1yZXR1cm4gYX0sQz1mdW5jdGlvbihhLGIsYyxkLGUsZil7aWYoQXJyYXkuaXNBcnJheShjKSlmb3IodmFyIGg9MDtoPGMubGVuZ3RoO2grKylDKGEsYixjW2hdLGQsZSxmKTtlbHNlIGQ9ZHx8YS5oYW5kbGVFdmVudCxlPW0oZSk/ISFlLmNhcHR1cmU6ISFlLGY9Znx8YS5ofHxhLGQ9dmIoZCksZT0hIWUsYz1pYihiKT9wYihiLkEsU3RyaW5nKGMpLGQsZSxmKTpiPyhiPXliKGIpKT9wYihiLGMsZCxlLGYpOm51bGw6bnVsbCxjJiYoQShjKSxkZWxldGUgYS5nW2Mua2V5XSk7cmV0dXJuIGF9LEdiPWZ1bmN0aW9uKGEpe0JhKGEuZyxmdW5jdGlvbihiLGMpe3RoaXMuZy5oYXNPd25Qcm9wZXJ0eShjKSYmCkEoYil9LGEpO2EuZz17fX07RWIucHJvdG90eXBlLkM9ZnVuY3Rpb24oKXtFYi5sLkMuY2FsbCh0aGlzKTtHYih0aGlzKX07RWIucHJvdG90eXBlLmhhbmRsZUV2ZW50PWZ1bmN0aW9uKCl7dGhyb3cgRXJyb3IoIkV2ZW50SGFuZGxlci5oYW5kbGVFdmVudCBub3QgaW1wbGVtZW50ZWQiKTt9O3ZhciBEPWZ1bmN0aW9uKCl7dy5jYWxsKHRoaXMpO3RoaXMuQT1uZXcgbWIodGhpcyk7dGhpcy5ZYT10aGlzO3RoaXMubGE9bnVsbH07bihELHcpO0QucHJvdG90eXBlW2hiXT0hMDtELnByb3RvdHlwZS5BYT1mdW5jdGlvbihhKXt0aGlzLmxhPWF9O0QucHJvdG90eXBlLnJlbW92ZUV2ZW50TGlzdGVuZXI9ZnVuY3Rpb24oYSxiLGMsZCl7Q2IodGhpcyxhLGIsYyxkKX07CnZhciBFPWZ1bmN0aW9uKGEsYil7SGIoYSk7dmFyIGM9YS5sYTtpZihjKXt2YXIgZD1bXTtmb3IodmFyIGU9MTtjO2M9Yy5sYSlkLnB1c2goYykscCgrK2U8MUUzLCJpbmZpbml0ZSBsb29wIil9YT1hLllhO2M9Yi50eXBlfHxiO3R5cGVvZiBiPT09InN0cmluZyI/Yj1uZXcgeShiLGEpOmIgaW5zdGFuY2VvZiB5P2IudGFyZ2V0PWIudGFyZ2V0fHxhOihlPWIsYj1uZXcgeShjLGEpLEdhKGIsZSkpO2U9ITA7dmFyIGY7aWYoZClmb3IoZj1kLmxlbmd0aC0xOyFiLkEmJmY+PTA7Zi0tKXt2YXIgaD1iLnU9ZFtmXTtlPUliKGgsYywhMCxiKSYmZX1iLkF8fChoPWIudT1hLGU9SWIoaCxjLCEwLGIpJiZlLGIuQXx8KGU9SWIoaCxjLCExLGIpJiZlKSk7aWYoZClmb3IoZj0wOyFiLkEmJmY8ZC5sZW5ndGg7ZisrKWg9Yi51PWRbZl0sZT1JYihoLGMsITEsYikmJmU7cmV0dXJuIGV9OwpELnByb3RvdHlwZS5DPWZ1bmN0aW9uKCl7RC5sLkMuY2FsbCh0aGlzKTtpZih0aGlzLkEpe3ZhciBhPXRoaXMuQSxiPTAsYztmb3IoYyBpbiBhLmcpe2Zvcih2YXIgZD1hLmdbY10sZT0wO2U8ZC5sZW5ndGg7ZSsrKSsrYixsYihkW2VdKTtkZWxldGUgYS5nW2NdO2EuaC0tfX10aGlzLmxhPW51bGx9O3ZhciB3Yj1mdW5jdGlvbihhLGIsYyxkLGUpe0hiKGEpO3JldHVybiBhLkEuYWRkKFN0cmluZyhiKSxjLCExLGQsZSl9LEliPWZ1bmN0aW9uKGEsYixjLGQpe2I9YS5BLmdbU3RyaW5nKGIpXTtpZighYilyZXR1cm4hMDtiPWIuY29uY2F0KCk7Zm9yKHZhciBlPSEwLGY9MDtmPGIubGVuZ3RoOysrZil7dmFyIGg9YltmXTtpZihoJiYhaC5qYSYmaC5jYXB0dXJlPT1jKXt2YXIgaz1oLmxpc3RlbmVyLHE9aC5wYXx8aC5zcmM7aC5vYSYmb2IoYS5BLGgpO2U9ay5jYWxsKHEsZCkhPT0hMSYmZX19cmV0dXJuIGUmJiFkLmRlZmF1bHRQcmV2ZW50ZWR9LEhiPWZ1bmN0aW9uKGEpe3AoYS5BLCJFdmVudCB0YXJnZXQgaXMgbm90IGluaXRpYWxpemVkLiBEaWQgeW91IGNhbGwgdGhlIHN1cGVyY2xhc3MgKGdvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0KSBjb25zdHJ1Y3Rvcj8iKX07dmFyIEpiPXQ/Ik1velVzZXJTZWxlY3QiOnV8fFZhPyJXZWJraXRVc2VyU2VsZWN0IjpudWxsLEtiPWZ1bmN0aW9uKGEsYil7Yj1iP251bGw6YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpO2lmKEpiJiYoYS5zdHlsZSYmKGEuc3R5bGVbSmJdPSJub25lIiksYikpZm9yKHZhciBjPTA7YT1iW2NdO2MrKylhLnN0eWxlJiYoYS5zdHlsZVtKYl09Im5vbmUiKX07dmFyIExiPWZ1bmN0aW9uKCl7fTtpYShMYik7TGIucHJvdG90eXBlLmc9MDt2YXIgRj1mdW5jdGlvbihhKXtELmNhbGwodGhpcyk7dGhpcy5HPWF8fHBhfHwocGE9bmV3IGZiKTt0aGlzLnphPU1iO3RoaXMuWT1udWxsO3RoaXMucz0hMTt0aGlzLmc9bnVsbDt0aGlzLk09dm9pZCAwO3RoaXMudT10aGlzLmo9dGhpcy5oPW51bGw7dGhpcy5TYT0hMX07bihGLEQpO0YucHJvdG90eXBlLlphPUxiLlYoKTsKdmFyIE1iPW51bGwsTmI9ZnVuY3Rpb24oYSxiKXtzd2l0Y2goYSl7Y2FzZSAxOnJldHVybiBiPyJkaXNhYmxlIjoiZW5hYmxlIjtjYXNlIDI6cmV0dXJuIGI/ImhpZ2hsaWdodCI6InVuaGlnaGxpZ2h0IjtjYXNlIDQ6cmV0dXJuIGI/ImFjdGl2YXRlIjoiZGVhY3RpdmF0ZSI7Y2FzZSA4OnJldHVybiBiPyJzZWxlY3QiOiJ1bnNlbGVjdCI7Y2FzZSAxNjpyZXR1cm4gYj8iY2hlY2siOiJ1bmNoZWNrIjtjYXNlIDMyOnJldHVybiBiPyJmb2N1cyI6ImJsdXIiO2Nhc2UgNjQ6cmV0dXJuIGI/Im9wZW4iOiJjbG9zZSJ9dGhyb3cgRXJyb3IoIkludmFsaWQgY29tcG9uZW50IHN0YXRlIik7fSxPYj1mdW5jdGlvbihhKXtyZXR1cm4gYS5ZfHwoYS5ZPSI6IisoYS5aYS5nKyspLnRvU3RyaW5nKDM2KSl9LFBiPWZ1bmN0aW9uKGEsYil7aWYoYS5oJiZhLmgudSl7dmFyIGM9YS5oLnUsZD1hLlk7ZCBpbiBjJiZkZWxldGUgY1tkXTtEYShhLmgudSxiLGEpfWEuWT1ifTtGLnByb3RvdHlwZS5pPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ307CnZhciBRYj1mdW5jdGlvbihhKXthLk18fChhLk09bmV3IEViKGEpKTtyZXR1cm4gcChhLk0pfTtGLnByb3RvdHlwZS5BYT1mdW5jdGlvbihhKXtpZih0aGlzLmgmJnRoaXMuaCE9YSl0aHJvdyBFcnJvcigiTWV0aG9kIG5vdCBzdXBwb3J0ZWQiKTtGLmwuQWEuY2FsbCh0aGlzLGEpfTtGLnByb3RvdHlwZS5tYT1mdW5jdGlvbigpe3RoaXMuZz1aYSh0aGlzLkcuZywiRElWIil9O0YucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbihhKXtSYih0aGlzLGEpfTsKdmFyIFJiPWZ1bmN0aW9uKGEsYixjKXtpZihhLnMpdGhyb3cgRXJyb3IoIkNvbXBvbmVudCBhbHJlYWR5IHJlbmRlcmVkIik7YS5nfHxhLm1hKCk7Yj9iLmluc2VydEJlZm9yZShhLmcsY3x8bnVsbCk6YS5HLmcuYm9keS5hcHBlbmRDaGlsZChhLmcpO2EuaCYmIWEuaC5zfHxhLkkoKX0sU2I9ZnVuY3Rpb24oYSxiKXtpZihhLnMpdGhyb3cgRXJyb3IoIkNvbXBvbmVudCBhbHJlYWR5IHJlbmRlcmVkIik7aWYoYiYmYS53YShiKSl7YS5TYT0hMDt2YXIgYz1iYihiKTthLkcmJmEuRy5nPT1jfHwoYS5HPWI/bmV3IGZiKGJiKGIpKTpwYXx8KHBhPW5ldyBmYikpO2EuRWEoYik7YS5JKCl9ZWxzZSB0aHJvdyBFcnJvcigiSW52YWxpZCBlbGVtZW50IHRvIGRlY29yYXRlIik7fTtnPUYucHJvdG90eXBlO2cud2E9ZnVuY3Rpb24oKXtyZXR1cm4hMH07Zy5FYT1mdW5jdGlvbihhKXt0aGlzLmc9YX07CmcuST1mdW5jdGlvbigpe3RoaXMucz0hMDtUYih0aGlzLGZ1bmN0aW9uKGEpeyFhLnMmJmEuaSgpJiZhLkkoKX0pfTtnLlU9ZnVuY3Rpb24oKXtUYih0aGlzLGZ1bmN0aW9uKGEpe2EucyYmYS5VKCl9KTt0aGlzLk0mJkdiKHRoaXMuTSk7dGhpcy5zPSExfTtnLkM9ZnVuY3Rpb24oKXt0aGlzLnMmJnRoaXMuVSgpO3RoaXMuTSYmKHRoaXMuTS5kaXNwb3NlKCksZGVsZXRlIHRoaXMuTSk7VGIodGhpcyxmdW5jdGlvbihhKXthLmRpc3Bvc2UoKX0pOyF0aGlzLlNhJiZ0aGlzLmcmJiRhKHRoaXMuZyk7dGhpcy5oPXRoaXMuZz10aGlzLnU9dGhpcy5qPW51bGw7Ri5sLkMuY2FsbCh0aGlzKX07Zy5CYT1mdW5jdGlvbihhLGIpe3RoaXMuQ2EoYSxIKHRoaXMpLGIpfTsKZy5DYT1mdW5jdGlvbihhLGIsYyl7cCghIWEsIlByb3ZpZGVkIGVsZW1lbnQgbXVzdCBub3QgYmUgbnVsbC4iKTtpZihhLnMmJihjfHwhdGhpcy5zKSl0aHJvdyBFcnJvcigiQ29tcG9uZW50IGFscmVhZHkgcmVuZGVyZWQiKTtpZihiPDB8fGI+SCh0aGlzKSl0aHJvdyBFcnJvcigiQ2hpbGQgY29tcG9uZW50IGluZGV4IG91dCBvZiBib3VuZHMiKTt0aGlzLnUmJnRoaXMuanx8KHRoaXMudT17fSx0aGlzLmo9W10pO2lmKGEuaD09dGhpcyl7dmFyIGQ9dGhpcy51LGU9T2IoYSk7ZFtlXT1hO3hhKHRoaXMuaixhKX1lbHNlIERhKHRoaXMudSxPYihhKSxhKTtpZihhPT10aGlzKXRocm93IEVycm9yKCJVbmFibGUgdG8gc2V0IHBhcmVudCBjb21wb25lbnQiKTtpZihkPXRoaXMmJmEuaCYmYS5ZKWU9YS5oLGQ9YS5ZLGUudSYmZD8oZT1lLnUsZD0oZSE9PW51bGwmJmQgaW4gZT9lW2RdOnZvaWQgMCl8fG51bGwpOmQ9bnVsbDtpZihkJiZhLmghPXRoaXMpdGhyb3cgRXJyb3IoIlVuYWJsZSB0byBzZXQgcGFyZW50IGNvbXBvbmVudCIpOwphLmg9dGhpcztGLmwuQWEuY2FsbChhLHRoaXMpO3phKHRoaXMuaixiLDAsYSk7YS5zJiZ0aGlzLnMmJmEuaD09dGhpcz8oYz10aGlzLm5hKCksKGMuY2hpbGROb2Rlc1tiXXx8bnVsbCkhPWEuaSgpJiYoYS5pKCkucGFyZW50RWxlbWVudD09YyYmYy5yZW1vdmVDaGlsZChhLmkoKSksYj1jLmNoaWxkTm9kZXNbYl18fG51bGwsYy5pbnNlcnRCZWZvcmUoYS5pKCksYikpKTpjPyh0aGlzLmd8fHRoaXMubWEoKSxiPUkodGhpcyxiKzEpLFJiKGEsdGhpcy5uYSgpLGI/Yi5nOm51bGwpKTp0aGlzLnMmJiFhLnMmJmEuZyYmYS5nLnBhcmVudE5vZGUmJmEuZy5wYXJlbnROb2RlLm5vZGVUeXBlPT0xJiZhLkkoKX07Zy5uYT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmd9Owp2YXIgVWI9ZnVuY3Rpb24oYSl7aWYoYS56YT09bnVsbCl7dmFyIGI9YS5zP2EuZzphLkcuZy5ib2R5O2E6e3ZhciBjPWJiKGIpO2lmKGMuZGVmYXVsdFZpZXcmJmMuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSYmKGM9Yy5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKGIsbnVsbCkpKXtjPWMuZGlyZWN0aW9ufHxjLmdldFByb3BlcnR5VmFsdWUoImRpcmVjdGlvbiIpfHwiIjticmVhayBhfWM9IiJ9YS56YT0icnRsIj09KGN8fChiLmN1cnJlbnRTdHlsZT9iLmN1cnJlbnRTdHlsZS5kaXJlY3Rpb246bnVsbCl8fGIuc3R5bGUmJmIuc3R5bGUuZGlyZWN0aW9uKX1yZXR1cm4gYS56YX0sSD1mdW5jdGlvbihhKXtyZXR1cm4gYS5qP2Euai5sZW5ndGg6MH0sST1mdW5jdGlvbihhLGIpe3JldHVybiBhLmo/YS5qW2JdfHxudWxsOm51bGx9LFRiPWZ1bmN0aW9uKGEsYixjKXthLmomJmEuai5mb3JFYWNoKGIsYyl9LFZiPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuaiYmYj9hLmouaW5kZXhPZihiKToKLTF9O3ZhciBXYj17bWI6ImFjdGl2ZWRlc2NlbmRhbnQiLHJiOiJhdG9taWMiLHNiOiJhdXRvY29tcGxldGUiLHViOiJidXN5Iix4YjoiY2hlY2tlZCIseWI6ImNvbGluZGV4IixEYjoiY29udHJvbHMiLEViOiJjdXJyZW50IixHYjoiZGVzY3JpYmVkYnkiLEpiOiJkaXNhYmxlZCIsTGI6ImRyb3BlZmZlY3QiLE1iOiJleHBhbmRlZCIsTmI6ImZsb3d0byIsUGI6ImdyYWJiZWQiLFRiOiJoYXNwb3B1cCIsVmI6ImhpZGRlbiIsWGI6ImludmFsaWQiLFliOiJsYWJlbCIsWmI6ImxhYmVsbGVkYnkiLGFjOiJsZXZlbCIsZmM6ImxpdmUiLHZjOiJtdWx0aWxpbmUiLHdjOiJtdWx0aXNlbGVjdGFibGUiLEFjOiJvcmllbnRhdGlvbiIsQmM6Im93bnMiLENjOiJwb3NpbnNldCIsRWM6InByZXNzZWQiLEljOiJyZWFkb25seSIsS2M6InJlbGV2YW50IixMYzoicmVxdWlyZWQiLFBjOiJyb3dpbmRleCIsU2M6InNlbGVjdGVkIixVYzoic2V0c2l6ZSIsV2M6InNvcnQiLG1kOiJ2YWx1ZW1heCIsbmQ6InZhbHVlbWluIiwKb2Q6InZhbHVlbm93IixwZDoidmFsdWV0ZXh0In07dmFyIFhiO3ZhciBZYj17bmI6ImFsZXJ0IixvYjoiYWxlcnRkaWFsb2ciLHBiOiJhcHBsaWNhdGlvbiIscWI6ImFydGljbGUiLHRiOiJiYW5uZXIiLHZiOiJidXR0b24iLHdiOiJjaGVja2JveCIsemI6ImNvbHVtbmhlYWRlciIsQWI6ImNvbWJvYm94IixCYjoiY29tcGxlbWVudGFyeSIsQ2I6ImNvbnRlbnRpbmZvIixGYjoiZGVmaW5pdGlvbiIsSGI6ImRpYWxvZyIsSWI6ImRpcmVjdG9yeSIsS2I6ImRvY3VtZW50IixPYjoiZm9ybSIsUWI6ImdyaWQiLFJiOiJncmlkY2VsbCIsU2I6Imdyb3VwIixVYjoiaGVhZGluZyIsV2I6ImltZyIsYmM6ImxpbmsiLGNjOiJsaXN0IixkYzoibGlzdGJveCIsZWM6Imxpc3RpdGVtIixoYzoibG9nIixpYzoibWFpbiIsamM6Im1hcnF1ZWUiLGtjOiJtYXRoIixsYzoibWVudSIsbWM6Im1lbnViYXIiLG5jOiJtZW51aXRlbSIsb2M6Im1lbnVpdGVtY2hlY2tib3giLHBjOiJtZW51aXRlbXJhZGlvIix4YzoibmF2aWdhdGlvbiIseWM6Im5vdGUiLHpjOiJvcHRpb24iLApEYzoicHJlc2VudGF0aW9uIixGYzoicHJvZ3Jlc3NiYXIiLEdjOiJyYWRpbyIsSGM6InJhZGlvZ3JvdXAiLEpjOiJyZWdpb24iLE1jOiJyb3ciLE5jOiJyb3dncm91cCIsT2M6InJvd2hlYWRlciIsUWM6InNjcm9sbGJhciIsUmM6InNlYXJjaCIsVGM6InNlcGFyYXRvciIsVmM6InNsaWRlciIsWGM6InNwaW5idXR0b24iLFljOiJzdGF0dXMiLFpjOiJzd2l0Y2giLGFkOiJ0YWIiLGJkOiJ0YWJsaXN0IixjZDoidGFicGFuZWwiLGRkOiJ0ZXh0Ym94IixlZDoidGV4dGluZm8iLGZkOiJ0aW1lciIsZ2Q6InRvb2xiYXIiLGhkOiJ0b29sdGlwIixqZDoidHJlZSIsa2Q6InRyZWVncmlkIixsZDoidHJlZWl0ZW0ifTt2YXIgWmI9ZnVuY3Rpb24oYSxiKXtiPyhwKENhKFliLGIpLCJObyBzdWNoIEFSSUEgcm9sZSAiK2IpLGEuc2V0QXR0cmlidXRlKCJyb2xlIixiKSk6YS5yZW1vdmVBdHRyaWJ1dGUoInJvbGUiKX0sYWM9ZnVuY3Rpb24oYSxiLGMpe0FycmF5LmlzQXJyYXkoYykmJihjPWMuam9pbigiICIpKTt2YXIgZD0kYihiKTtjPT09IiJ8fGM9PXZvaWQgMD8oWGJ8fChjPXt9LFhiPShjLmF0b21pYz0hMSxjLmF1dG9jb21wbGV0ZT0ibm9uZSIsYy5kcm9wZWZmZWN0PSJub25lIixjLmhhc3BvcHVwPSExLGMubGl2ZT0ib2ZmIixjLm11bHRpbGluZT0hMSxjLm11bHRpc2VsZWN0YWJsZT0hMSxjLm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIsYy5yZWFkb25seT0hMSxjLnJlbGV2YW50PSJhZGRpdGlvbnMgdGV4dCIsYy5yZXF1aXJlZD0hMSxjLnNvcnQ9Im5vbmUiLGMuYnVzeT0hMSxjLmRpc2FibGVkPSExLGMuaGlkZGVuPSExLGMuaW52YWxpZD0iZmFsc2UiLGMpKSxjPVhiLGIgaW4gYz9hLnNldEF0dHJpYnV0ZShkLApjW2JdKTphLnJlbW92ZUF0dHJpYnV0ZShkKSk6YS5zZXRBdHRyaWJ1dGUoZCxjKX0sJGI9ZnVuY3Rpb24oYSl7cChhLCJBUklBIGF0dHJpYnV0ZSBjYW5ub3QgYmUgZW1wdHkuIik7cChDYShXYixhKSwiTm8gc3VjaCBBUklBIGF0dHJpYnV0ZSAiK2EpO3JldHVybiJhcmlhLSIrYX07dmFyIGRjPWZ1bmN0aW9uKGEsYixjLGQsZSxmKXtpZih2JiZlKXJldHVybiBiYyhhKTtpZihlJiYhZClyZXR1cm4hMTtpZighdCl7dHlwZW9mIGI9PT0ibnVtYmVyIiYmKGI9Y2MoYikpO3ZhciBoPWI9PTE3fHxiPT0xOHx8diYmYj09OTE7aWYoKCFjfHx2KSYmaHx8diYmYj09MTYmJihkfHxmKSlyZXR1cm4hMX1pZih1JiZkJiZjKXN3aXRjaChhKXtjYXNlIDIyMDpjYXNlIDIxOTpjYXNlIDIyMTpjYXNlIDE5MjpjYXNlIDE4NjpjYXNlIDE4OTpjYXNlIDE4NzpjYXNlIDE4ODpjYXNlIDE5MDpjYXNlIDE5MTpjYXNlIDE5MjpjYXNlIDIyMjpyZXR1cm4hMX1zd2l0Y2goYSl7Y2FzZSAxMzpyZXR1cm4gdD9mfHxlPyExOiEoYyYmZCk6ITA7Y2FzZSAyNzpyZXR1cm4hdSYmIXR9cmV0dXJuIHQmJihkfHxlfHxmKT8hMTpiYyhhKX0sYmM9ZnVuY3Rpb24oYSl7aWYoYT49NDgmJmE8PTU3fHxhPj05NiYmYTw9MTA2fHxhPj02NSYmYTw9OTB8fHUmJmE9PTApcmV0dXJuITA7c3dpdGNoKGEpe2Nhc2UgMzI6Y2FzZSA0MzpjYXNlIDYzOmNhc2UgNjQ6Y2FzZSAxMDc6Y2FzZSAxMDk6Y2FzZSAxMTA6Y2FzZSAxMTE6Y2FzZSAxODY6Y2FzZSA1OTpjYXNlIDE4OTpjYXNlIDE4NzpjYXNlIDYxOmNhc2UgMTg4OmNhc2UgMTkwOmNhc2UgMTkxOmNhc2UgMTkyOmNhc2UgMjIyOmNhc2UgMjE5OmNhc2UgMjIwOmNhc2UgMjIxOmNhc2UgMTYzOmNhc2UgNTg6cmV0dXJuITA7CmNhc2UgMTczOmNhc2UgMTcxOnJldHVybiB0O2RlZmF1bHQ6cmV0dXJuITF9fSxjYz1mdW5jdGlvbihhKXtpZih0KWE9ZWMoYSk7ZWxzZSBpZih2JiZ1KXN3aXRjaChhKXtjYXNlIDkzOmE9OTF9cmV0dXJuIGF9LGVjPWZ1bmN0aW9uKGEpe3N3aXRjaChhKXtjYXNlIDYxOnJldHVybiAxODc7Y2FzZSA1OTpyZXR1cm4gMTg2O2Nhc2UgMTczOnJldHVybiAxODk7Y2FzZSAyMjQ6cmV0dXJuIDkxO2Nhc2UgMDpyZXR1cm4gMjI0O2RlZmF1bHQ6cmV0dXJuIGF9fTt2YXIgZmM9ZnVuY3Rpb24oYSxiLGMsZCl7ei5jYWxsKHRoaXMsZCk7dGhpcy50eXBlPSJrZXkiO3RoaXMuZz1hO3RoaXMucmVwZWF0PWN9O24oZmMseik7dmFyIEo9ZnVuY3Rpb24oYSxiKXtELmNhbGwodGhpcyk7YSYmZ2ModGhpcyxhLGIpfTtuKEosRCk7Zz1KLnByb3RvdHlwZTtnLlI9bnVsbDtnLnFhPW51bGw7Zy5KYT1udWxsO2cucmE9bnVsbDtnLkY9LTE7Zy5LPS0xO2cuRGE9ITE7CnZhciBoYz17MzoxMywxMjoxNDQsNjMyMzI6MzgsNjMyMzM6NDAsNjMyMzQ6MzcsNjMyMzU6MzksNjMyMzY6MTEyLDYzMjM3OjExMyw2MzIzODoxMTQsNjMyMzk6MTE1LDYzMjQwOjExNiw2MzI0MToxMTcsNjMyNDI6MTE4LDYzMjQzOjExOSw2MzI0NDoxMjAsNjMyNDU6MTIxLDYzMjQ2OjEyMiw2MzI0NzoxMjMsNjMyNDg6NDQsNjMyNzI6NDYsNjMyNzM6MzYsNjMyNzU6MzUsNjMyNzY6MzMsNjMyNzc6MzQsNjMyODk6MTQ0LDYzMzAyOjQ1fSxpYz17VXA6MzgsRG93bjo0MCxMZWZ0OjM3LFJpZ2h0OjM5LEVudGVyOjEzLEYxOjExMixGMjoxMTMsRjM6MTE0LEY0OjExNSxGNToxMTYsRjY6MTE3LEY3OjExOCxGODoxMTksRjk6MTIwLEYxMDoxMjEsRjExOjEyMixGMTI6MTIzLCJVKzAwN0YiOjQ2LEhvbWU6MzYsRW5kOjM1LFBhZ2VVcDozMyxQYWdlRG93bjozNCxJbnNlcnQ6NDV9LGpjPXYmJnQ7CkoucHJvdG90eXBlLmc9ZnVuY3Rpb24oYSl7dSYmKHRoaXMuRj09MTcmJiFhLmN0cmxLZXl8fHRoaXMuRj09MTgmJiFhLmFsdEtleXx8diYmdGhpcy5GPT05MSYmIWEubWV0YUtleSkmJih0aGlzLks9dGhpcy5GPS0xKTt0aGlzLkY9PS0xJiYoYS5jdHJsS2V5JiZhLmchPTE3P3RoaXMuRj0xNzphLmFsdEtleSYmYS5nIT0xOD90aGlzLkY9MTg6YS5tZXRhS2V5JiZhLmchPTkxJiYodGhpcy5GPTkxKSk7ZGMoYS5nLHRoaXMuRixhLnNoaWZ0S2V5LGEuY3RybEtleSxhLmFsdEtleSxhLm1ldGFLZXkpPyh0aGlzLks9Y2MoYS5nKSxqYyYmKHRoaXMuRGE9YS5hbHRLZXkpKTp0aGlzLmhhbmRsZUV2ZW50KGEpfTtKLnByb3RvdHlwZS5oPWZ1bmN0aW9uKGEpe3RoaXMuSz10aGlzLkY9LTE7dGhpcy5EYT1hLmFsdEtleX07CkoucHJvdG90eXBlLmhhbmRsZUV2ZW50PWZ1bmN0aW9uKGEpe3ZhciBiPWEuaCxjPWIuYWx0S2V5O2lmKHUmJmEudHlwZT09ImtleXByZXNzIil7dmFyIGQ9dGhpcy5LO3ZhciBlPWIuY2hhckNvZGU+PTAmJmIuY2hhckNvZGU8NjMyMzImJmJjKGQpP2IuY2hhckNvZGU6MH1lbHNlIGEudHlwZT09ImtleXByZXNzIj8oamMmJihjPXRoaXMuRGEpLGIua2V5Q29kZT09Yi5jaGFyQ29kZT9iLmtleUNvZGU8MzI/KGQ9Yi5rZXlDb2RlLGU9MCk6KGQ9dGhpcy5LLGU9Yi5jaGFyQ29kZSk6KGQ9Yi5rZXlDb2RlfHx0aGlzLkssZT1iLmNoYXJDb2RlfHwwKSk6KGQ9Yi5rZXlDb2RlfHx0aGlzLkssZT1iLmNoYXJDb2RlfHwwKSx2JiZlPT02MyYmZD09MjI0JiYoZD0xOTEpO3ZhciBmPWQ9Y2MoZCk7ZD9kPj02MzIzMiYmZCBpbiBoYz9mPWhjW2RdOmQ9PTI1JiZhLnNoaWZ0S2V5JiYoZj05KTpiLmtleUlkZW50aWZpZXImJmIua2V5SWRlbnRpZmllciBpbiBpYyYmKGY9aWNbYi5rZXlJZGVudGlmaWVyXSk7CmlmKCF0fHxhLnR5cGUhPSJrZXlwcmVzcyJ8fGRjKGYsdGhpcy5GLGEuc2hpZnRLZXksYS5jdHJsS2V5LGMsYS5tZXRhS2V5KSlhPWY9PXRoaXMuRix0aGlzLkY9ZixiPW5ldyBmYyhmLGUsYSxiKSxiLmFsdEtleT1jLEUodGhpcyxiKX07Si5wcm90b3R5cGUuaT1mdW5jdGlvbigpe3JldHVybiB0aGlzLlJ9O3ZhciBnYz1mdW5jdGlvbihhLGIsYyl7YS5yYSYma2MoYSk7YS5SPWI7YS5xYT11YihhLlIsImtleXByZXNzIixhLGMpO2EuSmE9dWIoYS5SLCJrZXlkb3duIixhLmcsYyxhKTthLnJhPXViKGEuUiwia2V5dXAiLGEuaCxjLGEpfSxrYz1mdW5jdGlvbihhKXthLnFhJiYoQShhLnFhKSxBKGEuSmEpLEEoYS5yYSksYS5xYT1udWxsLGEuSmE9bnVsbCxhLnJhPW51bGwpO2EuUj1udWxsO2EuRj0tMTthLks9LTF9O0oucHJvdG90eXBlLkM9ZnVuY3Rpb24oKXtKLmwuQy5jYWxsKHRoaXMpO2tjKHRoaXMpfTt2YXIgSz17Z2E6Im1vdXNlZG93biIsaGE6Im1vdXNldXAiLGZhOiJtb3VzZWNhbmNlbCIsc2M6Im1vdXNlbW92ZSIsdWM6Im1vdXNlb3ZlciIsdGM6Im1vdXNlb3V0IixxYzoibW91c2VlbnRlciIscmM6Im1vdXNlbGVhdmUifTt2YXIgbGM9ZnVuY3Rpb24oYSl7cmV0dXJuIHR5cGVvZiBhLmNsYXNzTmFtZT09InN0cmluZyI/YS5jbGFzc05hbWU6YS5nZXRBdHRyaWJ1dGUmJmEuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIn0sTD1mdW5jdGlvbihhKXtyZXR1cm4gYS5jbGFzc0xpc3Q/YS5jbGFzc0xpc3Q6bGMoYSkubWF0Y2goL1xTKy9nKXx8W119LG1jPWZ1bmN0aW9uKGEsYil7dHlwZW9mIGEuY2xhc3NOYW1lPT0ic3RyaW5nIj9hLmNsYXNzTmFtZT1iOmEuc2V0QXR0cmlidXRlJiZhLnNldEF0dHJpYnV0ZSgiY2xhc3MiLGIpfSxuYz1mdW5jdGlvbihhLGIpe2EuY2xhc3NMaXN0P2I9YS5jbGFzc0xpc3QuY29udGFpbnMoYik6KGE9TChhKSxiPXZhKGEsYik+PTApO3JldHVybiBifSxvYz1mdW5jdGlvbihhLGIpe2lmKGEuY2xhc3NMaXN0KWEuY2xhc3NMaXN0LmFkZChiKTtlbHNlIGlmKCFuYyhhLGIpKXt2YXIgYz1sYyhhKTttYyhhLGMrKGMubGVuZ3RoPjA/IiAiK2I6YikpfX0scGM9ZnVuY3Rpb24oYSxiKXtpZihhLmNsYXNzTGlzdClBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGIsCmZ1bmN0aW9uKGUpe29jKGEsZSl9KTtlbHNle3ZhciBjPXt9O0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoTChhKSxmdW5jdGlvbihlKXtjW2VdPSEwfSk7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChiLGZ1bmN0aW9uKGUpe2NbZV09ITB9KTtiPSIiO2Zvcih2YXIgZCBpbiBjKWIrPWIubGVuZ3RoPjA/IiAiK2Q6ZDttYyhhLGIpfX0scWM9ZnVuY3Rpb24oYSxiKXthLmNsYXNzTGlzdD9hLmNsYXNzTGlzdC5yZW1vdmUoYik6bmMoYSxiKSYmbWMoYSxBcnJheS5wcm90b3R5cGUuZmlsdGVyLmNhbGwoTChhKSxmdW5jdGlvbihjKXtyZXR1cm4gYyE9Yn0pLmpvaW4oIiAiKSl9LHJjPWZ1bmN0aW9uKGEsYil7YS5jbGFzc0xpc3Q/QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChiLGZ1bmN0aW9uKGMpe3FjKGEsYyl9KTptYyhhLEFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbChMKGEpLGZ1bmN0aW9uKGMpe3JldHVybiEodmEoYixjKT49MCl9KS5qb2luKCIgIikpfTt2YXIgdGM9ZnVuY3Rpb24oYSxiKXtpZighYSl0aHJvdyBFcnJvcigiSW52YWxpZCBjbGFzcyBuYW1lICIrYSk7aWYodHlwZW9mIGIhPT0iZnVuY3Rpb24iKXRocm93IEVycm9yKCJJbnZhbGlkIGRlY29yYXRvciBmdW5jdGlvbiAiK2IpO3NjW2FdPWJ9LHVjPXt9LHNjPXt9O3ZhciB2Yz1mdW5jdGlvbihhKXt0aGlzLkE9YX07aWEodmMpO3ZhciB3Yz1mdW5jdGlvbihhLGIpe2EmJihhLnRhYkluZGV4PWI/MDotMSl9LHljPWZ1bmN0aW9uKGEsYixjKXtjLmlkJiZQYihiLGMuaWQpO3ZhciBkPWEuZygpLGU9ITEsZj1MKGMpO2YmJkFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoZixmdW5jdGlvbihoKXtoPT1kP2U9ITA6aCYmdGhpcy51KGIsaCxkKX0sYSk7ZXx8b2MoYyxkKTt4YyhiLGMpO3JldHVybiBjfTt2Yy5wcm90b3R5cGUudT1mdW5jdGlvbihhLGIsYyl7Yj09YysiLWRpc2FibGVkIj9hLlgoITEpOmI9PWMrIi1ob3Jpem9udGFsIj96YyhhLCJob3Jpem9udGFsIik6Yj09YysiLXZlcnRpY2FsIiYmemMoYSwidmVydGljYWwiKX07CnZhciB4Yz1mdW5jdGlvbihhLGIpe2lmKGIpZm9yKHZhciBjPWIuZmlyc3RDaGlsZCxkO2MmJmMucGFyZW50Tm9kZT09Yjspe2Q9Yy5uZXh0U2libGluZztpZihjLm5vZGVUeXBlPT0xKXthOnt2YXIgZT1jO3AoZSk7ZT1MKGUpO2Zvcih2YXIgZj1lLmxlbmd0aCxoPTA7aDxmO2grKyl7dmFyIGs9ZVtoXTtpZihrPWsgaW4gc2M/c2Nba10oKTpudWxsKXtlPWs7YnJlYWsgYX19ZT1udWxsfWUmJihlLmc9YyxhLmlzRW5hYmxlZCgpfHxlLlgoITEpLGEuQmEoZSksU2IoZSxjKSl9ZWxzZSBjLm5vZGVWYWx1ZSYmSGEoYy5ub2RlVmFsdWUpIT0iInx8Yi5yZW1vdmVDaGlsZChjKTtjPWR9fSxBYz1mdW5jdGlvbihhLGIpe2I9Yi5pKCk7cChiLCJUaGUgY29udGFpbmVyIERPTSBlbGVtZW50IGNhbm5vdCBiZSBudWxsLiIpO0tiKGIsdCk7KGE9YS5BKSYmWmIoYixhKX07dmMucHJvdG90eXBlLmc9ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy1jb250YWluZXIifTsKdmMucHJvdG90eXBlLmo9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nKCksYz1bYixhLkw9PSJob3Jpem9udGFsIj9iKyItaG9yaXpvbnRhbCI6YisiLXZlcnRpY2FsIl07YS5pc0VuYWJsZWQoKXx8Yy5wdXNoKGIrIi1kaXNhYmxlZCIpO3JldHVybiBjfTt2YXIgQmM9ZnVuY3Rpb24oKXt9O3ZhciBNPWZ1bmN0aW9uKCl7fSxDYztpYShNKTt2YXIgRGM9e2J1dHRvbjoicHJlc3NlZCIsY2hlY2tib3g6ImNoZWNrZWQiLG1lbnVpdGVtOiJzZWxlY3RlZCIsbWVudWl0ZW1jaGVja2JveDoiY2hlY2tlZCIsbWVudWl0ZW1yYWRpbzoiY2hlY2tlZCIscmFkaW86ImNoZWNrZWQiLHRhYjoic2VsZWN0ZWQiLHRyZWVpdGVtOiJzZWxlY3RlZCJ9O00ucHJvdG90eXBlLk5hPWZ1bmN0aW9uKCl7fTtNLnByb3RvdHlwZS54YT1mdW5jdGlvbihhKXt2YXIgYj1hLkcsYz1iLmgsZD10aGlzLk4oKSxlPVtkXSxmPXRoaXMuTigpO2YhPWQmJmUucHVzaChmKTtkPWEubTtmb3IoZj1bXTtkOyl7dmFyIGg9ZCYtZDtmLnB1c2goRWModGhpcyxoKSk7ZCY9fmh9ZS5wdXNoLmFwcGx5KGUsZik7KGQ9YS5GYSkmJmUucHVzaC5hcHBseShlLGQpO3JldHVybiBjLmNhbGwoYiwiRElWIixlLmpvaW4oIiAiKSxhLmlhKX07Ck0ucHJvdG90eXBlLnlhPWZ1bmN0aW9uKGEsYil7Yi5pZCYmUGIoYSxiLmlkKTtiJiZiLmZpcnN0Q2hpbGQ/RmMoYSxiLmZpcnN0Q2hpbGQubmV4dFNpYmxpbmc/eWEoYi5jaGlsZE5vZGVzKTpiLmZpcnN0Q2hpbGQpOmEuaWE9bnVsbDt2YXIgYz0wLGQ9dGhpcy5OKCksZT10aGlzLk4oKSxmPSExLGg9ITEsaz15YShMKGIpKTtrLmZvckVhY2goZnVuY3Rpb24ocSl7Znx8cSE9ZD9ofHxxIT1lP2N8PUdjKHRoaXMscSk6aD0hMDooZj0hMCxlPT1kJiYoaD0hMCkpO0djKHRoaXMscSk9PTEmJihzYShiKSxkYihiKSYmZWIoYikmJmNiKGIsITEpKX0sdGhpcyk7YS5tPWM7Znx8KGsucHVzaChkKSxlPT1kJiYoaD0hMCkpO2h8fGsucHVzaChlKTsoYT1hLkZhKSYmay5wdXNoLmFwcGx5KGssYSk7ZiYmaCYmIWF8fG1jKGIsay5qb2luKCIgIikpO3JldHVybiBifTsKdmFyIEhjPWZ1bmN0aW9uKGEsYil7aWYoYT1hLk5hKCkpe3AoYiwiVGhlIGVsZW1lbnQgcGFzc2VkIGFzIGEgZmlyc3QgcGFyYW1ldGVyIGNhbm5vdCBiZSBudWxsLiIpO3ZhciBjPWIuZ2V0QXR0cmlidXRlKCJyb2xlIil8fG51bGw7YSE9YyYmWmIoYixhKX19LEljPWZ1bmN0aW9uKGEsYil7dmFyIGM7aWYoYS5EJjMyJiYoYz1hLmkoKSkpe2lmKCFiJiZhLm0mMzIpe3RyeXtjLmJsdXIoKX1jYXRjaChkKXt9YS5tJjMyJiZhLlFhKG51bGwpfShkYihjKSYmZWIoYykpIT1iJiZjYihjLGIpfX0sSmM9ZnVuY3Rpb24oYSxiLGMpe0NjfHwoQ2M9ezE6ImRpc2FibGVkIiw4OiJzZWxlY3RlZCIsMTY6ImNoZWNrZWQiLDY0OiJleHBhbmRlZCJ9KTtwKGEsIlRoZSBlbGVtZW50IHBhc3NlZCBhcyBhIGZpcnN0IHBhcmFtZXRlciBjYW5ub3QgYmUgbnVsbC4iKTtiPUNjW2JdO3ZhciBkPWEuZ2V0QXR0cmlidXRlKCJyb2xlIil8fG51bGw7ZCYmKGQ9RGNbZF18fGIsYj1iPT0iY2hlY2tlZCJ8fGI9PQoic2VsZWN0ZWQiP2Q6Yik7YiYmYWMoYSxiLGMpfTtNLnByb3RvdHlwZS5OPWZ1bmN0aW9uKCl7cmV0dXJuImdvb2ctY29udHJvbCJ9O3ZhciBFYz1mdW5jdGlvbihhLGIpe2EuZ3x8S2MoYSk7cmV0dXJuIGEuZ1tiXX0sR2M9ZnVuY3Rpb24oYSxiKXthLmh8fChhLmd8fEtjKGEpLGEuaD1FYShhLmcpKTthPXBhcnNlSW50KGEuaFtiXSwxMCk7cmV0dXJuIGlzTmFOKGEpPzA6YX0sS2M9ZnVuY3Rpb24oYSl7dmFyIGI9YS5OKCk7dmFyIGM9Yi5yZXBsYWNlKC9ceGEwfFxzL2csIiAiKS5pbmRleE9mKCIgIikhPS0xO3AoIWMsIkNvbnRyb2xSZW5kZXJlciBoYXMgYW4gaW52YWxpZCBjc3MgY2xhc3M6ICciK2IrIiciKTthLmc9ezE6YisiLWRpc2FibGVkIiwyOmIrIi1ob3ZlciIsNDpiKyItYWN0aXZlIiw4OmIrIi1zZWxlY3RlZCIsMTY6YisiLWNoZWNrZWQiLDMyOmIrIi1mb2N1c2VkIiw2NDpiKyItb3BlbiJ9fTt2YXIgTj1mdW5jdGlvbihhLGIsYyl7Ri5jYWxsKHRoaXMsYyk7aWYoIWIpe2ZvcihiPXRoaXMuY29uc3RydWN0b3I7Yjspe3ZhciBkPW5hKGIpO2lmKGQ9dWNbZF0pYnJlYWs7Yj0oYj1PYmplY3QuZ2V0UHJvdG90eXBlT2YoYi5wcm90b3R5cGUpKSYmYi5jb25zdHJ1Y3Rvcn1iPWQ/dHlwZW9mIGQuVj09PSJmdW5jdGlvbiI/ZC5WKCk6bmV3IGQ6bnVsbH10aGlzLnY9Yjt0aGlzLmlhPWEhPT12b2lkIDA/YTpudWxsfTtuKE4sRik7Zz1OLnByb3RvdHlwZTtnLmlhPW51bGw7Zy5tPTA7Zy5EPTM5O2cuUD0wO2cuT2E9ITA7Zy5GYT1udWxsO2cuSGE9ITA7Zy5tYT1mdW5jdGlvbigpe3ZhciBhPXRoaXMudi54YSh0aGlzKTt0aGlzLmc9YTtIYyh0aGlzLnYsYSk7S2IoYSwhMCk7dGhpcy5pc1Zpc2libGUoKXx8KGEuc3R5bGUuZGlzcGxheT0ibm9uZSIsYSYmYWMoYSwiaGlkZGVuIiwhMCkpfTtnLm5hPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaSgpfTtnLndhPWZ1bmN0aW9uKCl7cmV0dXJuITB9OwpnLkVhPWZ1bmN0aW9uKGEpe3RoaXMuZz1hPXRoaXMudi55YSh0aGlzLGEpO0hjKHRoaXMudixhKTtLYihhLCEwKTt0aGlzLk9hPWEuc3R5bGUuZGlzcGxheSE9Im5vbmUifTsKZy5JPWZ1bmN0aW9uKCl7Ti5sLkkuY2FsbCh0aGlzKTt2YXIgYT10aGlzLmc7cChhLCJDYW4gbm90IGNhbGwgZ2V0RWxlbWVudFN0cmljdCBiZWZvcmUgcmVuZGVyaW5nL2RlY29yYXRpbmcuIik7cCh0aGlzKTtwKGEpO3RoaXMuaXNWaXNpYmxlKCl8fGFjKGEsImhpZGRlbiIsIXRoaXMuaXNWaXNpYmxlKCkpO3RoaXMuaXNFbmFibGVkKCl8fEpjKGEsMSwhdGhpcy5pc0VuYWJsZWQoKSk7dGhpcy5EJjgmJkpjKGEsOCwhISh0aGlzLm0mOCkpO3RoaXMuRCYxNiYmSmMoYSwxNiwhISh0aGlzLm0mMTYpKTt0aGlzLkQmNjQmJkpjKGEsNjQsISEodGhpcy5tJjY0KSk7dmFyIGI9dGhpcy52O1ViKHRoaXMpJiYoYT10aGlzLmkoKSxiPWIuTigpKyItcnRsIiwoYT1hLmk/YS5pKCk6YSkmJnBjKGEsW2JdKSk7dGhpcy5pc0VuYWJsZWQoKSYmSWModGhpcyx0aGlzLmlzVmlzaWJsZSgpKTt0aGlzLkQmLTImJih0aGlzLkhhJiZMYyh0aGlzLCEwKSx0aGlzLkQmMzImJihhPXRoaXMuaSgpKSkmJihiPQp0aGlzLlp8fCh0aGlzLlo9bmV3IEopLGdjKGIsYSksQihCKEIoUWIodGhpcyksYiwia2V5Iix0aGlzLmFhKSxhLCJmb2N1cyIsdGhpcy5YYSksYSwiYmx1ciIsdGhpcy5RYSkpfTt2YXIgTGM9ZnVuY3Rpb24oYSxiKXt2YXIgYz1RYihhKSxkPWEuaSgpO2I/KEIoQihCKEIoYyxkLEsuZ2EsYS5zYSksZCxbSy5oYSxLLmZhXSxhLnZhKSxkLCJtb3VzZW92ZXIiLGEudWEpLGQsIm1vdXNlb3V0IixhLnRhKSxhLmNhIT1CYyYmQihjLGQsImNvbnRleHRtZW51IixhLmNhKSk6KEMoQyhDKEMoYyxkLEsuZ2EsYS5zYSksZCxbSy5oYSxLLmZhXSxhLnZhKSxkLCJtb3VzZW92ZXIiLGEudWEpLGQsIm1vdXNlb3V0IixhLnRhKSxhLmNhIT1CYyYmQyhjLGQsImNvbnRleHRtZW51IixhLmNhKSl9O04ucHJvdG90eXBlLlU9ZnVuY3Rpb24oKXtOLmwuVS5jYWxsKHRoaXMpO3RoaXMuWiYma2ModGhpcy5aKTt0aGlzLmlzVmlzaWJsZSgpJiZ0aGlzLmlzRW5hYmxlZCgpJiZJYyh0aGlzLCExKX07Ck4ucHJvdG90eXBlLkM9ZnVuY3Rpb24oKXtOLmwuQy5jYWxsKHRoaXMpO3RoaXMuWiYmKHRoaXMuWi5kaXNwb3NlKCksZGVsZXRlIHRoaXMuWik7ZGVsZXRlIHRoaXMudjt0aGlzLkZhPXRoaXMuaWE9bnVsbH07dmFyIEZjPWZ1bmN0aW9uKGEsYil7YS5pYT1ifTtOLnByb3RvdHlwZS5pc1Zpc2libGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5PYX07Ti5wcm90b3R5cGUuaXNFbmFibGVkPWZ1bmN0aW9uKCl7cmV0dXJuISh0aGlzLm0mMSl9O04ucHJvdG90eXBlLlg9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5oO2ImJnR5cGVvZiBiLmlzRW5hYmxlZD09ImZ1bmN0aW9uIiYmIWIuaXNFbmFibGVkKCl8fCFPKHRoaXMsMSwhYSl8fChhfHwoTWModGhpcywhMSksUCh0aGlzLCExKSksdGhpcy5pc1Zpc2libGUoKSYmSWModGhpcyxhKSxUKHRoaXMsMSwhYSwhMCkpfTt2YXIgUD1mdW5jdGlvbihhLGIpe08oYSwyLGIpJiZUKGEsMixiKX07Ck4ucHJvdG90eXBlLmlzQWN0aXZlPWZ1bmN0aW9uKCl7cmV0dXJuISEodGhpcy5tJjQpfTsKdmFyIE1jPWZ1bmN0aW9uKGEsYil7TyhhLDQsYikmJlQoYSw0LGIpfSxOYz1mdW5jdGlvbihhLGIpe08oYSw4LGIpJiZUKGEsOCxiKX0sT2M9ZnVuY3Rpb24oYSxiKXtPKGEsNjQsYikmJlQoYSw2NCxiKX0sVD1mdW5jdGlvbihhLGIsYyxkKXtpZighZCYmYj09MSlhLlgoIWMpO2Vsc2UgaWYoYS5EJmImJmMhPSEhKGEubSZiKSl7dmFyIGU9YS52O2lmKGQ9YS5pKCkpe2lmKGU9RWMoZSxiKSl7dmFyIGY9YS5pP2EuaSgpOmE7ZiYmKGM/cGM6cmMpKGYsW2VdKX1KYyhkLGIsYyl9YS5tPWM/YS5tfGI6YS5tJn5ifX0sUGM9ZnVuY3Rpb24oYSxiLGMpe2lmKGEucyYmYS5tJmImJiFjKXRocm93IEVycm9yKCJDb21wb25lbnQgYWxyZWFkeSByZW5kZXJlZCIpOyFjJiZhLm0mYiYmVChhLGIsITEpO2EuRD1jP2EuRHxiOmEuRCZ+Yn0sVT1mdW5jdGlvbihhLGIpe3JldHVybiEhKDI1NSZiKSYmISEoYS5EJmIpfSxPPWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4hIShhLkQmYikmJiEhKGEubSZiKSE9CmMmJighKGEuUCZiKXx8RShhLE5iKGIsYykpKSYmIWEuYmF9O04ucHJvdG90eXBlLnVhPWZ1bmN0aW9uKGEpeyFRYyhhLHRoaXMuaSgpKSYmRSh0aGlzLCJlbnRlciIpJiZ0aGlzLmlzRW5hYmxlZCgpJiZVKHRoaXMsMikmJlAodGhpcywhMCl9O04ucHJvdG90eXBlLnRhPWZ1bmN0aW9uKGEpeyFRYyhhLHRoaXMuaSgpKSYmRSh0aGlzLCJsZWF2ZSIpJiYoVSh0aGlzLDQpJiZNYyh0aGlzLCExKSxVKHRoaXMsMikmJlAodGhpcywhMSkpfTtOLnByb3RvdHlwZS5jYT1CYzt2YXIgUWM9ZnVuY3Rpb24oYSxiKXtyZXR1cm4hIWEucmVsYXRlZFRhcmdldCYmYWIoYixhLnJlbGF0ZWRUYXJnZXQpfTsKTi5wcm90b3R5cGUuc2E9ZnVuY3Rpb24oYSl7aWYodGhpcy5pc0VuYWJsZWQoKSYmKFUodGhpcywyKSYmUCh0aGlzLCEwKSwhKGEuaC5idXR0b24hPTB8fHYmJmEuY3RybEtleSkpKXtVKHRoaXMsNCkmJk1jKHRoaXMsITApO3ZhciBiO2lmKGI9dGhpcy52KXt2YXIgYztiPXRoaXMuRCYzMiYmKGM9dGhpcy5pKCkpP2RiKGMpJiZlYihjKTohMX1iJiZ0aGlzLmkoKS5mb2N1cygpfWEuaC5idXR0b24hPTB8fHYmJmEuY3RybEtleXx8YS5qKCl9O04ucHJvdG90eXBlLnZhPWZ1bmN0aW9uKGEpe3RoaXMuaXNFbmFibGVkKCkmJihVKHRoaXMsMikmJlAodGhpcywhMCksdGhpcy5pc0FjdGl2ZSgpJiZSYyh0aGlzLGEpJiZVKHRoaXMsNCkmJk1jKHRoaXMsITEpKX07CnZhciBSYz1mdW5jdGlvbihhLGIpe2lmKFUoYSwxNikpe3ZhciBjPSEoYS5tJjE2KTtPKGEsMTYsYykmJlQoYSwxNixjKX1VKGEsOCkmJk5jKGEsITApO1UoYSw2NCkmJk9jKGEsIShhLm0mNjQpKTtjPW5ldyB5KCJhY3Rpb24iLGEpO2ImJihjLmFsdEtleT1iLmFsdEtleSxjLmN0cmxLZXk9Yi5jdHJsS2V5LGMubWV0YUtleT1iLm1ldGFLZXksYy5zaGlmdEtleT1iLnNoaWZ0S2V5LGMuRz1iLkcsYy50aW1lU3RhbXA9Yi50aW1lU3RhbXApO3JldHVybiBFKGEsYyl9O04ucHJvdG90eXBlLlhhPWZ1bmN0aW9uKCl7VSh0aGlzLDMyKSYmTyh0aGlzLDMyLCEwKSYmVCh0aGlzLDMyLCEwKX07Ti5wcm90b3R5cGUuUWE9ZnVuY3Rpb24oKXtVKHRoaXMsNCkmJk1jKHRoaXMsITEpO1UodGhpcywzMikmJk8odGhpcywzMiwhMSkmJlQodGhpcywzMiwhMSl9OwpOLnByb3RvdHlwZS5hYT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5pc1Zpc2libGUoKSYmdGhpcy5pc0VuYWJsZWQoKSYmYS5nPT0xMyYmUmModGhpcyxhKT8oYS5qKCksYS52KCksITApOiExfTtpZih0eXBlb2YgTiE9PSJmdW5jdGlvbiIpdGhyb3cgRXJyb3IoIkludmFsaWQgY29tcG9uZW50IGNsYXNzICIrTik7aWYodHlwZW9mIE0hPT0iZnVuY3Rpb24iKXRocm93IEVycm9yKCJJbnZhbGlkIHJlbmRlcmVyIGNsYXNzICIrTSk7dmFyIFNjPW5hKE4pO3VjW1NjXT1NO3RjKCJnb29nLWNvbnRyb2wiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBOKG51bGwpfSk7dmFyIFY9ZnVuY3Rpb24oYSxiLGMpe0YuY2FsbCh0aGlzLGMpO3RoaXMuZWE9Ynx8dmMuVigpO3RoaXMuTD1hfHwidmVydGljYWwifTtuKFYsRik7Zz1WLnByb3RvdHlwZTtnLkthPW51bGw7Zy5kYT1udWxsO2cuZWE9bnVsbDtnLkw9bnVsbDtnLlM9ITA7Zy5UPSEwO2cubz0tMTtnLkI9bnVsbDtnLlc9ITE7Zy5PPW51bGw7dmFyIFRjPWZ1bmN0aW9uKGEpe3JldHVybiBhLkthfHxhLmkoKX07Zz1WLnByb3RvdHlwZTtnLm1hPWZ1bmN0aW9uKCl7dGhpcy5nPXRoaXMuRy5oKCJESVYiLHRoaXMuZWEuaih0aGlzKS5qb2luKCIgIikpfTtnLm5hPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaSgpfTtnLndhPWZ1bmN0aW9uKGEpe3JldHVybiBhLnRhZ05hbWU9PSJESVYifTtnLkVhPWZ1bmN0aW9uKGEpe3RoaXMuZz15Yyh0aGlzLmVhLHRoaXMsYSk7YS5zdHlsZS5kaXNwbGF5PT0ibm9uZSImJih0aGlzLlM9ITEpfTsKZy5JPWZ1bmN0aW9uKCl7Vi5sLkkuY2FsbCh0aGlzKTtUYih0aGlzLGZ1bmN0aW9uKGIpe2IucyYmVWModGhpcyxiKX0sdGhpcyk7dmFyIGE9dGhpcy5pKCk7QWModGhpcy5lYSx0aGlzKTtWYyh0aGlzLHRoaXMuUyk7QihCKEIoQihCKEIoQihCKFFiKHRoaXMpLHRoaXMsImVudGVyIix0aGlzLmViKSx0aGlzLCJoaWdobGlnaHQiLHRoaXMuZmIpLHRoaXMsInVuaGlnaGxpZ2h0Iix0aGlzLmxiKSx0aGlzLCJvcGVuIix0aGlzLmdiKSx0aGlzLCJjbG9zZSIsdGhpcy5iYiksYSxLLmdhLHRoaXMuV2EpLGJiKGEpLFtLLmhhLEsuZmFdLHRoaXMuY2IpLGEsW0suZ2EsSy5oYSxLLmZhLCJtb3VzZW92ZXIiLCJtb3VzZW91dCIsImNvbnRleHRtZW51Il0sdGhpcy5hYik7V2ModGhpcyl9O3ZhciBXYz1mdW5jdGlvbihhKXt2YXIgYj1RYihhKSxjPVRjKGEpO0IoQihCKGIsYywiZm9jdXMiLGEuUGEpLGMsImJsdXIiLGEuVWEpLGEuZGF8fChhLmRhPW5ldyBKKFRjKGEpKSksImtleSIsYS5WYSl9OwpnPVYucHJvdG90eXBlO2cuVT1mdW5jdGlvbigpe1hjKHRoaXMsLTEpO3RoaXMuQiYmT2ModGhpcy5CLCExKTt0aGlzLlc9ITE7Vi5sLlUuY2FsbCh0aGlzKX07Zy5DPWZ1bmN0aW9uKCl7Vi5sLkMuY2FsbCh0aGlzKTt0aGlzLmRhJiYodGhpcy5kYS5kaXNwb3NlKCksdGhpcy5kYT1udWxsKTt0aGlzLmVhPXRoaXMuQj10aGlzLk89dGhpcy5LYT1udWxsfTtnLmViPWZ1bmN0aW9uKCl7cmV0dXJuITB9OwpnLmZiPWZ1bmN0aW9uKGEpe3ZhciBiPVZiKHRoaXMsYS50YXJnZXQpO2lmKGI+LTEmJmIhPXRoaXMubyl7dmFyIGM9SSh0aGlzLHRoaXMubyk7YyYmUChjLCExKTt0aGlzLm89YjtjPUkodGhpcyx0aGlzLm8pO3RoaXMuVyYmTWMoYywhMCk7dGhpcy5CJiZjIT10aGlzLkImJihjLkQmNjQ/T2MoYywhMCk6T2ModGhpcy5CLCExKSl9Yj10aGlzLmkoKTtwKGIsIlRoZSBET00gZWxlbWVudCBmb3IgdGhlIGNvbnRhaW5lciBjYW5ub3QgYmUgbnVsbC4iKTthLnRhcmdldC5pKCkhPW51bGwmJmFjKGIsImFjdGl2ZWRlc2NlbmRhbnQiLGEudGFyZ2V0LmkoKS5pZCl9O2cubGI9ZnVuY3Rpb24oYSl7YS50YXJnZXQ9PUkodGhpcyx0aGlzLm8pJiYodGhpcy5vPS0xKTthPXRoaXMuaSgpO3AoYSwiVGhlIERPTSBlbGVtZW50IGZvciB0aGUgY29udGFpbmVyIGNhbm5vdCBiZSBudWxsLiIpO2EucmVtb3ZlQXR0cmlidXRlKCRiKCJhY3RpdmVkZXNjZW5kYW50IikpfTsKZy5nYj1mdW5jdGlvbihhKXsoYT1hLnRhcmdldCkmJmEhPXRoaXMuQiYmYS5oPT10aGlzJiYodGhpcy5CJiZPYyh0aGlzLkIsITEpLHRoaXMuQj1hKX07Zy5iYj1mdW5jdGlvbihhKXthLnRhcmdldD09dGhpcy5CJiYodGhpcy5CPW51bGwpO3ZhciBiPXRoaXMuaSgpLGM9YS50YXJnZXQuaSgpO2ImJmEudGFyZ2V0Lm0mMiYmYyYmKGE9IiIsYyYmKGE9Yy5pZCxwKGEsIlRoZSBhY3RpdmUgZWxlbWVudCBzaG91bGQgaGF2ZSBhbiBpZC4iKSksYWMoYiwiYWN0aXZlZGVzY2VuZGFudCIsYSkpfTtnLldhPWZ1bmN0aW9uKGEpe3RoaXMuVCYmKHRoaXMuVz0hMCk7dmFyIGI9VGModGhpcyk7YiYmZGIoYikmJmViKGIpP2IuZm9jdXMoKTphLmooKX07Zy5jYj1mdW5jdGlvbigpe3RoaXMuVz0hMX07CmcuYWI9ZnVuY3Rpb24oYSl7YTp7dmFyIGI9YS50YXJnZXQ7aWYodGhpcy5PKWZvcih2YXIgYz10aGlzLmkoKTtiJiZiIT09Yzspe3ZhciBkPWIuaWQ7aWYoZCBpbiB0aGlzLk8pe2I9dGhpcy5PW2RdO2JyZWFrIGF9Yj1iLnBhcmVudE5vZGV9Yj1udWxsfWlmKGIpc3dpdGNoKGEudHlwZSl7Y2FzZSBLLmdhOmIuc2EoYSk7YnJlYWs7Y2FzZSBLLmhhOmNhc2UgSy5mYTpiLnZhKGEpO2JyZWFrO2Nhc2UgIm1vdXNlb3ZlciI6Yi51YShhKTticmVhaztjYXNlICJtb3VzZW91dCI6Yi50YShhKTticmVhaztjYXNlICJjb250ZXh0bWVudSI6Yi5jYShhKX19O2cuUGE9ZnVuY3Rpb24oKXt9O2cuVWE9ZnVuY3Rpb24oKXtYYyh0aGlzLC0xKTt0aGlzLlc9ITE7dGhpcy5CJiZPYyh0aGlzLkIsITEpfTsKZy5WYT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5pc0VuYWJsZWQoKSYmdGhpcy5pc1Zpc2libGUoKSYmKEgodGhpcykhPTB8fHRoaXMuS2EpJiZZYyh0aGlzLGEpPyhhLmooKSxhLnYoKSwhMCk6ITF9Owp2YXIgWWM9ZnVuY3Rpb24oYSxiKXt2YXIgYz1JKGEsYS5vKTtpZihjJiZ0eXBlb2YgYy5hYT09ImZ1bmN0aW9uIiYmYy5hYShiKXx8YS5CJiZhLkIhPWMmJnR5cGVvZiBhLkIuYWE9PSJmdW5jdGlvbiImJmEuQi5hYShiKSlyZXR1cm4hMDtpZihiLnNoaWZ0S2V5fHxiLmN0cmxLZXl8fGIubWV0YUtleXx8Yi5hbHRLZXkpcmV0dXJuITE7c3dpdGNoKGIuZyl7Y2FzZSAyNzpUYyhhKS5ibHVyKCk7YnJlYWs7Y2FzZSAzNjpaYyhhKTticmVhaztjYXNlIDM1OiRjKGEpO2JyZWFrO2Nhc2UgMzg6aWYoYS5MPT0idmVydGljYWwiKWFkKGEpO2Vsc2UgcmV0dXJuITE7YnJlYWs7Y2FzZSAzNzppZihhLkw9PSJob3Jpem9udGFsIilVYihhKT9iZChhKTphZChhKTtlbHNlIHJldHVybiExO2JyZWFrO2Nhc2UgNDA6aWYoYS5MPT0idmVydGljYWwiKWJkKGEpO2Vsc2UgcmV0dXJuITE7YnJlYWs7Y2FzZSAzOTppZihhLkw9PSJob3Jpem9udGFsIilVYihhKT9hZChhKTpiZChhKTtlbHNlIHJldHVybiExOwpicmVhaztkZWZhdWx0OnJldHVybiExfXJldHVybiEwfSxVYz1mdW5jdGlvbihhLGIpe3ZhciBjPWIuaSgpO2M9Yy5pZHx8KGMuaWQ9T2IoYikpO2EuT3x8KGEuTz17fSk7YS5PW2NdPWJ9O1YucHJvdG90eXBlLkJhPWZ1bmN0aW9uKGEsYil7dWEoYSxOLCJUaGUgY2hpbGQgb2YgYSBjb250YWluZXIgbXVzdCBiZSBhIGNvbnRyb2wiKTtWLmwuQmEuY2FsbCh0aGlzLGEsYil9O1YucHJvdG90eXBlLkNhPWZ1bmN0aW9uKGEsYixjKXt1YShhLE4pO2EuUHw9MjthLlB8PTY0O1BjKGEsMzIsITEpO2EucyYmMCE9YS5IYSYmTGMoYSwhMSk7YS5IYT0hMTt2YXIgZD1hLmg9PXRoaXM/VmIodGhpcyxhKTotMTtWLmwuQ2EuY2FsbCh0aGlzLGEsYixjKTthLnMmJnRoaXMucyYmVWModGhpcyxhKTthPWQ7YT09LTEmJihhPUgodGhpcykpO2E9PXRoaXMubz90aGlzLm89TWF0aC5taW4oSCh0aGlzKS0xLGIpOmE+dGhpcy5vJiZiPD10aGlzLm8/dGhpcy5vKys6YTx0aGlzLm8mJmI+dGhpcy5vJiZ0aGlzLm8tLX07CnZhciB6Yz1mdW5jdGlvbihhLGIpe2lmKGEuaSgpKXRocm93IEVycm9yKCJDb21wb25lbnQgYWxyZWFkeSByZW5kZXJlZCIpO2EuTD1ifTtWLnByb3RvdHlwZS5pc1Zpc2libGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5TfTt2YXIgVmM9ZnVuY3Rpb24oYSxiKXthLlM9Yjt2YXIgYz1hLmkoKTtjJiYoYy5zdHlsZS5kaXNwbGF5PWI/IiI6Im5vbmUiLHdjKFRjKGEpLGEuVCYmYS5TKSl9O1YucHJvdG90eXBlLmlzRW5hYmxlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLlR9O1YucHJvdG90eXBlLlg9ZnVuY3Rpb24oYSl7dGhpcy5UIT1hJiZFKHRoaXMsYT8iZW5hYmxlIjoiZGlzYWJsZSIpJiYoYT8odGhpcy5UPSEwLFRiKHRoaXMsZnVuY3Rpb24oYil7Yi5UYT9kZWxldGUgYi5UYTpiLlgoITApfSkpOihUYih0aGlzLGZ1bmN0aW9uKGIpe2IuaXNFbmFibGVkKCk/Yi5YKCExKTpiLlRhPSEwfSksdGhpcy5XPXRoaXMuVD0hMSksd2MoVGModGhpcyksYSYmdGhpcy5TKSl9Owp2YXIgWGM9ZnVuY3Rpb24oYSxiKXsoYj1JKGEsYikpP1AoYiwhMCk6YS5vPi0xJiZQKEkoYSxhLm8pLCExKX0sWmM9ZnVuY3Rpb24oYSl7Y2QoYSxmdW5jdGlvbihiLGMpe3JldHVybihiKzEpJWN9LEgoYSktMSl9LCRjPWZ1bmN0aW9uKGEpe2NkKGEsZnVuY3Rpb24oYixjKXtiLS07cmV0dXJuIGI8MD9jLTE6Yn0sMCl9LGJkPWZ1bmN0aW9uKGEpe2NkKGEsZnVuY3Rpb24oYixjKXtyZXR1cm4oYisxKSVjfSxhLm8pfSxhZD1mdW5jdGlvbihhKXtjZChhLGZ1bmN0aW9uKGIsYyl7Yi0tO3JldHVybiBiPDA/Yy0xOmJ9LGEubyl9LGNkPWZ1bmN0aW9uKGEsYixjKXtjPWM8MD9WYihhLGEuQik6Yzt2YXIgZD1IKGEpO2M9Yi5jYWxsKGEsYyxkKTtmb3IodmFyIGU9MDtlPD1kOyl7dmFyIGY9SShhLGMpO2lmKGYmJmYuaXNWaXNpYmxlKCkmJmYuaXNFbmFibGVkKCkmJmYuRCYyKXthLkxhKGMpO2JyZWFrfWUrKztjPWIuY2FsbChhLGMsZCl9fTsKVi5wcm90b3R5cGUuTGE9ZnVuY3Rpb24oYSl7WGModGhpcyxhKX07dmFyIGRkPWZ1bmN0aW9uKCl7fTtuKGRkLE0pO2lhKGRkKTtnPWRkLnByb3RvdHlwZTtnLk49ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy10YWIifTtnLk5hPWZ1bmN0aW9uKCl7cmV0dXJuInRhYiJ9O2cueGE9ZnVuY3Rpb24oYSl7dmFyIGI9ZGQubC54YS5jYWxsKHRoaXMsYSk7KGE9YS5HYSgpKSYmdGhpcy5NYShiLGEpO3JldHVybiBifTtnLnlhPWZ1bmN0aW9uKGEsYil7Yj1kZC5sLnlhLmNhbGwodGhpcyxhLGIpO3ZhciBjPXRoaXMuR2EoYik7YyYmKGEuUmE9Yyk7YS5tJjgmJihjPWEuaCkmJnR5cGVvZiBjLko9PT0iZnVuY3Rpb24iJiYoVChhLDgsITEpLGMuSihhKSk7cmV0dXJuIGJ9O2cuR2E9ZnVuY3Rpb24oYSl7cmV0dXJuIGEudGl0bGV8fCIifTtnLk1hPWZ1bmN0aW9uKGEsYil7YSYmKGEudGl0bGU9Ynx8IiIpfTt2YXIgZWQ9ZnVuY3Rpb24oYSxiLGMpe04uY2FsbCh0aGlzLGEsYnx8ZGQuVigpLGMpO1BjKHRoaXMsOCwhMCk7dGhpcy5QfD05fTtuKGVkLE4pO2VkLnByb3RvdHlwZS5HYT1mdW5jdGlvbigpe3JldHVybiB0aGlzLlJhfTtlZC5wcm90b3R5cGUuTWE9ZnVuY3Rpb24oYSl7dGhpcy52Lk1hKHRoaXMuaSgpLGEpO3RoaXMuUmE9YX07dGMoImdvb2ctdGFiIixmdW5jdGlvbigpe3JldHVybiBuZXcgZWQobnVsbCl9KTt2YXIgVz1mdW5jdGlvbigpe3RoaXMuQT0idGFibGlzdCJ9O24oVyx2Yyk7aWEoVyk7Vy5wcm90b3R5cGUuZz1mdW5jdGlvbigpe3JldHVybiJnb29nLXRhYi1iYXIifTtXLnByb3RvdHlwZS51PWZ1bmN0aW9uKGEsYixjKXt0aGlzLnZ8fCh0aGlzLmh8fGZkKHRoaXMpLHRoaXMudj1FYSh0aGlzLmgpKTt2YXIgZD10aGlzLnZbYl07ZD8oemMoYSxnZChkKSksYS52PWQpOlcubC51LmNhbGwodGhpcyxhLGIsYyl9O1cucHJvdG90eXBlLmo9ZnVuY3Rpb24oYSl7dmFyIGI9Vy5sLmouY2FsbCh0aGlzLGEpO3RoaXMuaHx8ZmQodGhpcyk7Yi5wdXNoKHRoaXMuaFthLnZdKTtyZXR1cm4gYn07dmFyIGZkPWZ1bmN0aW9uKGEpe3ZhciBiPWEuZygpO2EuaD17dG9wOmIrIi10b3AiLGJvdHRvbTpiKyItYm90dG9tIixzdGFydDpiKyItc3RhcnQiLGVuZDpiKyItZW5kIn19O3ZhciBYPWZ1bmN0aW9uKGEsYixjKXthPWF8fCJ0b3AiO3pjKHRoaXMsZ2QoYSkpO3RoaXMudj1hO1YuY2FsbCh0aGlzLHRoaXMuTCxifHxXLlYoKSxjKTtoZCh0aGlzKX07bihYLFYpO2c9WC5wcm90b3R5cGU7Zy5IPW51bGw7Zy5JPWZ1bmN0aW9uKCl7WC5sLkkuY2FsbCh0aGlzKTtoZCh0aGlzKX07Zy5DPWZ1bmN0aW9uKCl7WC5sLkMuY2FsbCh0aGlzKTt0aGlzLkg9bnVsbH07Zy5MYT1mdW5jdGlvbihhKXtYLmwuTGEuY2FsbCh0aGlzLGEpO3RoaXMuSihJKHRoaXMsYSkpfTtnLko9ZnVuY3Rpb24oYSl7YT9OYyhhLCEwKTp0aGlzLkgmJk5jKHRoaXMuSCwhMSl9Owp2YXIgaWQ9ZnVuY3Rpb24oYSxiKXtpZihiJiZiPT1hLkgpe2Zvcih2YXIgYz1WYihhLGIpLGQ9Yy0xO2I9SShhLGQpO2QtLSl7dmFyIGU9YjtpZihlLmlzVmlzaWJsZSgpJiZlLmlzRW5hYmxlZCgpKXthLkooYik7cmV0dXJufX1mb3IoYys9MTtiPUkoYSxjKTtjKyspaWYoZD1iLGQuaXNWaXNpYmxlKCkmJmQuaXNFbmFibGVkKCkpe2EuSihiKTtyZXR1cm59YS5KKG51bGwpfX07Zz1YLnByb3RvdHlwZTtnLmpiPWZ1bmN0aW9uKGEpe3RoaXMuSCYmdGhpcy5IIT1hLnRhcmdldCYmTmModGhpcy5ILCExKTt0aGlzLkg9YS50YXJnZXR9O2cua2I9ZnVuY3Rpb24oYSl7YS50YXJnZXQ9PXRoaXMuSCYmKHRoaXMuSD1udWxsKX07Zy5oYj1mdW5jdGlvbihhKXtpZCh0aGlzLGEudGFyZ2V0KX07Zy5pYj1mdW5jdGlvbihhKXtpZCh0aGlzLGEudGFyZ2V0KX07Zy5QYT1mdW5jdGlvbigpe0kodGhpcyx0aGlzLm8pfHxYYyh0aGlzLFZiKHRoaXMsdGhpcy5IfHxJKHRoaXMsMCkpKX07CnZhciBoZD1mdW5jdGlvbihhKXtCKEIoQihCKFFiKGEpLGEsInNlbGVjdCIsYS5qYiksYSwidW5zZWxlY3QiLGEua2IpLGEsImRpc2FibGUiLGEuaGIpLGEsImhpZGUiLGEuaWIpfSxnZD1mdW5jdGlvbihhKXtyZXR1cm4gYT09InN0YXJ0Inx8YT09ImVuZCI/InZlcnRpY2FsIjoiaG9yaXpvbnRhbCJ9O3RjKCJnb29nLXRhYi1iYXIiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBYfSk7ZnVuY3Rpb24gamQoYSl7dmFyIGI9e3RvcDoiYm90dG9tIixib3R0b206InRvcCIsc3RhcnQ6InJpZ2h0IixlbmQ6ImxlZnQifVthLmxvY2F0aW9uXSxjPWEuZWxlbWVudElkLGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTtkLnRleHRDb250ZW50PSJcbiAgICBmaWVsZHNldCB7XG4gICAgICBwYWRkaW5nOiAxMHB4O1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgIzM2OTtcbiAgICB9XG5cbiAgICAjIitjKyIgLmdvb2ctdGFiLWNvbnRlbnQge1xuICAgICAgbWluLWhlaWdodDogM2VtO1xuICAgICAgbWFyZ2luOiAwO1xuICAgICAgYm9yZGVyOiAiK2EuYm9yZGVyKyIgc29saWQgIithLmJvcmRlckNvbG9yKyI7XG4gICAgICBib3JkZXItdG9wOiAwO1xuICAgICAgaGVpZ2h0OiAiK2EuY29udGVudEhlaWdodCsiO1xuICAgICAgcGFkZGluZzogNHB4IDhweDtcbiAgICAgIG1hcmdpbi1yaWdodDogNHB4O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgIG92ZXJmbG93OiBhdXRvO1xuICAgIH1cblxuICAgICMiKwpjKyIgLmdvb2ctdGFiLWJhci0iK2EubG9jYXRpb24rIiAuZ29vZy10YWItc2VsZWN0ZWQge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICIrYS5ib3JkZXJDb2xvcisiO1xuICAgICAgYm9yZGVyLSIrYisiOiAwcHg7XG4gICAgfVxuXG4gICAgIyIrYysiIC5nb29nLXRhYi1iYXItIithLmxvY2F0aW9uKyIge1xuICAgICAgcGFkZGluZy0iK2EubG9jYXRpb24rIjogNXB4ICFpbXBvcnRhbnQ7XG4gICAgICBib3JkZXItIitiKyI6IDFweCBzb2xpZCAiK2EuYm9yZGVyQ29sb3IrIiAhaW1wb3J0YW50O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICB9XG5cbiAgICAjIitjKyIgLmdvb2ctdGFiLWJhciB7XG4gICAgICAgbWFyZ2luOiAwO1xuICAgICAgIGJvcmRlcjogMDtcbiAgICAgICBwYWRkaW5nOiAwO1xuICAgICAgIGxpc3Qtc3R5bGU6IG5vbmU7XG4gICAgICAgY3Vyc29yOiBkZWZhdWx0O1xuICAgICAgIG91dGxpbmU6IG5vbmU7XG4gICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgICBtYXJnaW4tcmlnaHQ6IDRweDtcbiAgICAgIH1cblxuICAgICAjIisKYysiIC5nb29nLXRhYiB7XG4gICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgIHBhZGRpbmc6IDRweCA4cHg7XG4gICAgICAgY29sb3I6IHZhcigtLWNvbGFiLXByaW1hcnktdGV4dC1jb2xvcik7XG4gICAgICAgdGV4dC1kZWNvcmF0aW9uOiBpbml0aWFsO1xuICAgICAgIGN1cnNvcjogZGVmYXVsdDtcbiAgICAgIH1cblxuICAgICAgIyIrYysiIC5nb29nLXRhYi1ob3ZlciB7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWNvbGFiLWhpZ2hsaWdodGVkLXN1cmZhY2UtY29sb3IpO1xuICAgICAgfVxuICAgICAgIjtyZXR1cm4gZH0KdmFyIGtkPWZ1bmN0aW9uKGEpe3ZhciBiPWEuZWxlbWVudElkLGM9YS50YWJOYW1lcyxkPWEuc2VsZWN0ZWRJbmRleDsiY29udGVudEJvcmRlciJpbiBhfHwoYS5jb250ZW50Qm9yZGVyPSIwcHgiKTsiY29udGVudEhlaWdodCJpbiBhfHwoYS5jb250ZW50SGVpZ2h0PSJpbml0aWFsIik7ImJvcmRlckNvbG9yImluIGF8fChhLmJvcmRlckNvbG9yPSJ2YXIoLS1jb2xhYi1ib3JkZXItY29sb3IpIik7YS5sb2NhdGlvbnx8KGEubG9jYXRpb249InRvcCIpO3ZhciBlPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiMiK2IpLGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zi5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYi1iYXIiKTt2YXIgaD1hLmxvY2F0aW9uO2YuY2xhc3NMaXN0LmFkZCgiZ29vZy10YWItYmFyLSIraCk7Zm9yKHZhciBrPVtdLHE9ZmEoYyksRz1xLm5leHQoKTshRy5kb25lO0c9cS5uZXh0KCkpe0c9Ry52YWx1ZTt2YXIgeD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKeC5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYiIpO3gudGV4dENvbnRlbnQ9RztmLmFwcGVuZENoaWxkKHgpO2sucHVzaCh4KX1oIT0iYm90dG9tIiYmZS5hcHBlbmRDaGlsZChmKTtxPW51bGw7aWYoaD09InRvcCJ8fGg9PSJib3R0b20iKXE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikscS5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYi1iYXItY2xlYXIiKTtoPT0idG9wIiYmcSYmZS5hcHBlbmRDaGlsZChxKTtHPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO0cuY2xhc3NMaXN0LmFkZCgiZ29vZy10YWItY29udGVudCIpO3ZhciBoYT1bXTtjPWZhKGMpO2Zvcih4PWMubmV4dCgpOyF4LmRvbmU7eD1jLm5leHQoKSl4PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHguaWQ9ZS5pZCsiX2NvbnRlbnRfIitoYS5sZW5ndGgseC5zdHlsZS5kaXNwbGF5PSJub25lIixHLmFwcGVuZENoaWxkKHgpLGhhLnB1c2goeCk7ZS5hcHBlbmRDaGlsZChHKTtoPT0iYm90dG9tIiYmKHEmJgplLmFwcGVuZENoaWxkKHEpLGUuYXBwZW5kQ2hpbGQoZikpO3ZhciBRPW5ldyBYKGgpO1NiKFEsZik7dmFyIFI9LTE7d2IoUSwic2VsZWN0IixmdW5jdGlvbihTKXtTPWsuaW5kZXhPZihTLnRhcmdldC5pKCkpO1MhPVImJihSPj0wJiZSPGhhLmxlbmd0aCYmKGhhW1JdLnN0eWxlLmRpc3BsYXk9Im5vbmUiLFI9LTEpLFM+PTAmJlM8aGEubGVuZ3RoJiYoUj1TLGhhW1JdLnN0eWxlLmRpc3BsYXk9ImlubGluZSIsd2luZG93LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCJyZXNpemUiKSksZ29vZ2xlLmNvbGFiLm91dHB1dC5yZXNpemVJZnJhbWVUb0NvbnRlbnQoKSksUS5KKEkoUSxSKSkpfSk7US5KKEkoUSxkKSk7d2luZG93W2JdPXtzZXRTZWxlY3RlZFRhYkluZGV4OmZ1bmN0aW9uKFMpe1EuSihJKFEsUykpfX07ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChqZChhKSl9LGxkPVsiY29sYWJfbGliIiwiY3JlYXRlVGFiQmFyIl0sWT1sOwpsZFswXWluIFl8fHR5cGVvZiBZLmV4ZWNTY3JpcHQ9PSJ1bmRlZmluZWQifHxZLmV4ZWNTY3JpcHQoInZhciAiK2xkWzBdKTtmb3IodmFyIFo7bGQubGVuZ3RoJiYoWj1sZC5zaGlmdCgpKTspbGQubGVuZ3RofHxrZD09PXZvaWQgMD9ZW1pdJiZZW1pdIT09T2JqZWN0LnByb3RvdHlwZVtaXT9ZPVlbWl06WT1ZW1pdPXt9OllbWl09a2Q7fSkuY2FsbCh0aGlzKTsKLy8gY2xhbmctZm9ybWF0IG9uCg==", + "ok": true, + "headers": [ + [ + "content-length", + "41785" + ], + [ + "content-type", + "application/javascript" + ] + ], + "status": 200, + "status_text": "" + } + }, + "base_uri": "https://localhost:8080/", + "height": 229 + }, + "outputId": "53853673-1513-46fb-c7c5-f72d5ad1b541" + }, + "source": [ + "%%logica OrgStats\n", + "\n", + "AnonymizedCodeContribution(cl_lengths: [110, 220, 405], org: \"ads\");\n", + "AnonymizedCodeContribution(cl_lengths: [30, 51, 95], org: \"ads\");\n", + "AnonymizedCodeContribution(cl_lengths: [10, 20, 1000], org: \"games\");\n", + "\n", + "HarmonicMean(x) = Sum(1) / Sum(1 / x);\n", + "\n", + "OrgStats(\n", + " org:,\n", + " mean_cl_size? Avg= cl_size,\n", + " harmonic_mean_cl_size? HarmonicMean= cl_size) distinct :-\n", + " AnonymizedCodeContribution(cl_lengths:, org:),\n", + " cl_size in cl_lengths;\n" + ], + "execution_count": 20, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"06d81444-d22d-11ef-a7c0-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id37\", \"tabNames\": [\"OrgStats\", \"(Log)\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_bd7709aa51" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"06d86e8a-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id37\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_67d7ed80a3" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"06daf560-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_ff2a942f37" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"06db6284-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id37_content_1\");\n", + "//# sourceURL=js_bd613f8364" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"06dbd00c-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"06db6284-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_80f3395601" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"06dc3100-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id37\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_7a7f08489a" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"06e04df8-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"06daf560-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_e0f89e4cbf" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"06e299e6-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_f8ac76fb35" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"06e31402-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id37_content_0\");\n", + "//# sourceURL=js_d9adbac0e7" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"06e35e4e-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"06e31402-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_8a6a873dc4" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"06e3c906-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id37\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_aba23bf39e" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"06e5f726-d22d-11ef-a7c0-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id38\", \"tabNames\": [\"SQL\", \"Result\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_3c3f56acfb" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"06e66940-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id38\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_1ceab20dd7" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"06e7a2b0-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_eb08de7a57" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"06e7e8ce-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id38_content_0\");\n", + "//# sourceURL=js_53116cc7ef" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"06e82bb8-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"06e7e8ce-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_0281a657f3" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"06e86d9e-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id38\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_225307ca35" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The following query is stored at \u001b[1mOrgStats_sql\u001b[0m variable.\n", + "-- Initializing DuckDB environment.\n", + "create schema if not exists logica_home;\n", + "-- Empty record, has to have a field by DuckDB syntax.\n", + "drop type if exists logicarecord893574736 cascade; create type logicarecord893574736 as struct(nirvana numeric);\n", + "create sequence if not exists eternal_logical_sequence;\n", + "\n", + "\n", + "-- Logica type: logicarecord481217614\n", + "drop type if exists logicarecord481217614 cascade; create type logicarecord481217614 as struct(r logicarecord893574736);\n", + "\n", + "-- Logica type: logicarecord383307722\n", + "drop type if exists logicarecord383307722 cascade; create type logicarecord383307722 as struct(a timestamp);\n", + "WITH t_0_AnonymizedCodeContribution AS (SELECT * FROM (\n", + " \n", + " SELECT\n", + " [110, 220, 405]::numeric[] AS cl_lengths,\n", + " 'ads' AS org\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " [30, 51, 95]::numeric[] AS cl_lengths,\n", + " 'ads' AS org\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " [10, 20, 1000]::numeric[] AS cl_lengths,\n", + " 'games' AS org\n", + " \n", + ") AS UNUSED_TABLE_NAME )\n", + "SELECT\n", + " AnonymizedCodeContribution.org AS org,\n", + " AVG(x_5.unnested_pod) AS mean_cl_size,\n", + " ((SUM(1)) / (SUM(((1) / (x_5.unnested_pod))))) AS harmonic_mean_cl_size\n", + "FROM\n", + " t_0_AnonymizedCodeContribution AS AnonymizedCodeContribution, (select unnest(AnonymizedCodeContribution.cl_lengths) as unnested_pod) as x_5\n", + "GROUP BY AnonymizedCodeContribution.org;\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"06e966a4-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"06e7a2b0-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_f654c4c554" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"06eae3c6-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_06b45447e8" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"06eb5b12-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id38_content_1\");\n", + "//# sourceURL=js_02c7e752d7" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"06eba2f2-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"06eb5b12-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_3b66b9cbdb" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"06ebe4ce-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id38\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_208a48a515" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The following table is stored at \u001b[1mOrgStats\u001b[0m variable.\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
orgmean_cl_sizeharmonic_mean_cl_size
0ads151.83333375.402468
1games343.33333319.867550
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"06ed6ab0-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"06eae3c6-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_b210f789cc" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"06eeb140-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"06e299e6-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_08240a36df" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"06f0339e-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_30b6e7acd4" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"06f076e2-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id37_content_1\");\n", + "//# sourceURL=js_b9351e4384" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"06f0b79c-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"06f076e2-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_2dcaaeb31c" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"06f0f720-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id37\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_ae3a7f8e95" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "image/svg+xml": "\n\n\n\n\n\nConcertina\n\n\n\nOrgStats\n\nOrgStats\n\n\n\n", + "text/plain": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Running predicate: OrgStats (7 ms)\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"07068eaa-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"06f0339e-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_8f37e4532b" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"07084d94-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_b8aaa9d4c2" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"070895a6-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id37_content_0\");\n", + "//# sourceURL=js_b193a73c96" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0708dc1e-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"070895a6-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_9a87a6b04e" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"07091e54-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id37\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_0d286f6748" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"070a4aae-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_cde1164433" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"070ba2c8-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id38_content_1\");\n", + "//# sourceURL=js_9fcf852b5c" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"070bf160-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"070ba2c8-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_05677a67d7" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"070c3be8-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id38\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_885b00dab7" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"070e5e96-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"070a4aae-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_c492267b36" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + " \n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0713bd00-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"07084d94-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_a22f8def66" + ] + }, + "metadata": {} + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "08a0mLwQBCpb" + }, + "source": [ + "### Inifinite predicates\n", + "\n", + "Predicates defined above all had a finite number of records.\n", + "\n", + "Here we define and use an infinite predicate IsEngineer that mathematically is the set of all possible records with role equal to \"Eng\"." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "1f5WYb9kRe0O", + "colab": { + "resources": { + "http://localhost:8080/nbextensions/google.colab/tabbar.css": { + "data": "Lmdvb2ctdGFie3Bvc2l0aW9uOnJlbGF0aXZlO3BhZGRpbmc6NHB4IDhweDtjb2xvcjojMDBjO3RleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7Y3Vyc29yOmRlZmF1bHR9Lmdvb2ctdGFiLWJhci10b3AgLmdvb2ctdGFie21hcmdpbjoxcHggNHB4IDAgMDtib3JkZXItYm90dG9tOjA7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLXRvcDphZnRlciwuZ29vZy10YWItYmFyLWJvdHRvbTphZnRlcntjb250ZW50OiIgIjtkaXNwbGF5OmJsb2NrO2hlaWdodDowO2NsZWFyOmJvdGg7dmlzaWJpbGl0eTpoaWRkZW59Lmdvb2ctdGFiLWJhci1ib3R0b20gLmdvb2ctdGFie21hcmdpbjowIDRweCAxcHggMDtib3JkZXItdG9wOjA7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLXN0YXJ0IC5nb29nLXRhYnttYXJnaW46MCAwIDRweCAxcHg7Ym9yZGVyLXJpZ2h0OjB9Lmdvb2ctdGFiLWJhci1lbmQgLmdvb2ctdGFie21hcmdpbjowIDFweCA0cHggMDtib3JkZXItbGVmdDowfS5nb29nLXRhYi1ob3ZlcntiYWNrZ3JvdW5kOiNlZWV9Lmdvb2ctdGFiLWRpc2FibGVke2NvbG9yOiM2NjZ9Lmdvb2ctdGFiLXNlbGVjdGVke2NvbG9yOiMwMDA7YmFja2dyb3VuZDojZmZmO3RleHQtZGVjb3JhdGlvbjpub25lO2ZvbnQtd2VpZ2h0OmJvbGQ7Ym9yZGVyOjFweCBzb2xpZCAjNmI5MGRhfS5nb29nLXRhYi1iYXItdG9we3BhZGRpbmctdG9wOjVweCFpbXBvcnRhbnQ7cGFkZGluZy1sZWZ0OjVweCFpbXBvcnRhbnQ7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgIzZiOTBkYSFpbXBvcnRhbnR9Lmdvb2ctdGFiLWJhci10b3AgLmdvb2ctdGFiLXNlbGVjdGVke3RvcDoxcHg7bWFyZ2luLXRvcDowO3BhZGRpbmctYm90dG9tOjVweH0uZ29vZy10YWItYmFyLWJvdHRvbSAuZ29vZy10YWItc2VsZWN0ZWR7dG9wOi0xcHg7bWFyZ2luLWJvdHRvbTowO3BhZGRpbmctdG9wOjVweH0uZ29vZy10YWItYmFyLXN0YXJ0IC5nb29nLXRhYi1zZWxlY3RlZHtsZWZ0OjFweDttYXJnaW4tbGVmdDowO3BhZGRpbmctcmlnaHQ6OXB4fS5nb29nLXRhYi1iYXItZW5kIC5nb29nLXRhYi1zZWxlY3RlZHtsZWZ0Oi0xcHg7bWFyZ2luLXJpZ2h0OjA7cGFkZGluZy1sZWZ0OjlweH0uZ29vZy10YWItYmFye21hcmdpbjowO2JvcmRlcjowO3BhZGRpbmc6MDtsaXN0LXN0eWxlOm5vbmU7Y3Vyc29yOmRlZmF1bHQ7b3V0bGluZTpub25lO2JhY2tncm91bmQ6I2ViZWZmOX0uZ29vZy10YWItYmFyLWNsZWFye2NsZWFyOmJvdGg7aGVpZ2h0OjA7b3ZlcmZsb3c6aGlkZGVufS5nb29nLXRhYi1iYXItc3RhcnR7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLWVuZHtmbG9hdDpyaWdodH0qIGh0bWwgLmdvb2ctdGFiLWJhci1zdGFydHttYXJnaW4tcmlnaHQ6LTNweH0qIGh0bWwgLmdvb2ctdGFiLWJhci1lbmR7bWFyZ2luLWxlZnQ6LTNweH1zZW50aW5lbHt9", + "ok": true, + "headers": [ + [ + "content-length", + "1404" + ], + [ + "content-type", + "text/css" + ] + ], + "status": 200, + "status_text": "" + }, + "http://localhost:8080/nbextensions/google.colab/tabbar_main.min.js": { + "data": "Ly8gY2xhbmctZm9ybWF0IG9mZgooZnVuY3Rpb24oKXt2YXIgZyxhYT1mdW5jdGlvbihhKXt2YXIgYj0wO3JldHVybiBmdW5jdGlvbigpe3JldHVybiBiPGEubGVuZ3RoP3tkb25lOiExLHZhbHVlOmFbYisrXX06e2RvbmU6ITB9fX0sYmE9dHlwZW9mIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzPT0iZnVuY3Rpb24iP09iamVjdC5kZWZpbmVQcm9wZXJ0eTpmdW5jdGlvbihhLGIsYyl7aWYoYT09QXJyYXkucHJvdG90eXBlfHxhPT1PYmplY3QucHJvdG90eXBlKXJldHVybiBhO2FbYl09Yy52YWx1ZTtyZXR1cm4gYX0sY2E9ZnVuY3Rpb24oYSl7YT1bIm9iamVjdCI9PXR5cGVvZiBnbG9iYWxUaGlzJiZnbG9iYWxUaGlzLGEsIm9iamVjdCI9PXR5cGVvZiB3aW5kb3cmJndpbmRvdywib2JqZWN0Ij09dHlwZW9mIHNlbGYmJnNlbGYsIm9iamVjdCI9PXR5cGVvZiBnbG9iYWwmJmdsb2JhbF07Zm9yKHZhciBiPTA7YjxhLmxlbmd0aDsrK2Ipe3ZhciBjPWFbYl07aWYoYyYmYy5NYXRoPT1NYXRoKXJldHVybiBjfXRocm93IEVycm9yKCJDYW5ub3QgZmluZCBnbG9iYWwgb2JqZWN0Iik7Cn0sZGE9Y2EodGhpcyksZWE9ZnVuY3Rpb24oYSxiKXtpZihiKWE6e3ZhciBjPWRhO2E9YS5zcGxpdCgiLiIpO2Zvcih2YXIgZD0wO2Q8YS5sZW5ndGgtMTtkKyspe3ZhciBlPWFbZF07aWYoIShlIGluIGMpKWJyZWFrIGE7Yz1jW2VdfWE9YVthLmxlbmd0aC0xXTtkPWNbYV07Yj1iKGQpO2IhPWQmJmIhPW51bGwmJmJhKGMsYSx7Y29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOmJ9KX19OwplYSgiU3ltYm9sIixmdW5jdGlvbihhKXtpZihhKXJldHVybiBhO3ZhciBiPWZ1bmN0aW9uKGYsaCl7dGhpcy5nPWY7YmEodGhpcywiZGVzY3JpcHRpb24iLHtjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6aH0pfTtiLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmd9O3ZhciBjPSJqc2NvbXBfc3ltYm9sXyIrKE1hdGgucmFuZG9tKCkqMUU5Pj4+MCkrIl8iLGQ9MCxlPWZ1bmN0aW9uKGYpe2lmKHRoaXMgaW5zdGFuY2VvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoIlN5bWJvbCBpcyBub3QgYSBjb25zdHJ1Y3RvciIpO3JldHVybiBuZXcgYihjKyhmfHwiIikrIl8iK2QrKyxmKX07cmV0dXJuIGV9KTsKdmFyIGZhPWZ1bmN0aW9uKGEpe3ZhciBiPXR5cGVvZiBTeW1ib2whPSJ1bmRlZmluZWQiJiZTeW1ib2wuaXRlcmF0b3ImJmFbU3ltYm9sLml0ZXJhdG9yXTtpZihiKXJldHVybiBiLmNhbGwoYSk7aWYodHlwZW9mIGEubGVuZ3RoPT0ibnVtYmVyIilyZXR1cm57bmV4dDphYShhKX07dGhyb3cgRXJyb3IoU3RyaW5nKGEpKyIgaXMgbm90IGFuIGl0ZXJhYmxlIG9yIEFycmF5TGlrZSIpO307ZWEoIlN5bWJvbC5kaXNwb3NlIixmdW5jdGlvbihhKXtyZXR1cm4gYT9hOlN5bWJvbCgiU3ltYm9sLmRpc3Bvc2UiKX0pOy8qCgogQ29weXJpZ2h0IFRoZSBDbG9zdXJlIExpYnJhcnkgQXV0aG9ycy4KIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wCiovCnZhciBsPXRoaXN8fHNlbGYsaWE9ZnVuY3Rpb24oYSl7YS5JYT12b2lkIDA7YS5WPWZ1bmN0aW9uKCl7cmV0dXJuIGEuSWE/YS5JYTphLklhPW5ldyBhfX0samE9ZnVuY3Rpb24oYSl7dmFyIGI9dHlwZW9mIGE7cmV0dXJuIGIhPSJvYmplY3QiP2I6YT9BcnJheS5pc0FycmF5KGEpPyJhcnJheSI6YjoibnVsbCJ9LGthPWZ1bmN0aW9uKGEpe3ZhciBiPWphKGEpO3JldHVybiBiPT0iYXJyYXkifHxiPT0ib2JqZWN0IiYmdHlwZW9mIGEubGVuZ3RoPT0ibnVtYmVyIn0sbT1mdW5jdGlvbihhKXt2YXIgYj10eXBlb2YgYTtyZXR1cm4gYj09Im9iamVjdCImJmEhPW51bGx8fGI9PSJmdW5jdGlvbiJ9LG5hPWZ1bmN0aW9uKGEpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYSxsYSkmJmFbbGFdfHwoYVtsYV09KyttYSl9LGxhPSJjbG9zdXJlX3VpZF8iKyhNYXRoLnJhbmRvbSgpKjFFOT4+PjApLG1hPTAsbj1mdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoKXt9Yy5wcm90b3R5cGU9CmIucHJvdG90eXBlO2EubD1iLnByb3RvdHlwZTthLnByb3RvdHlwZT1uZXcgYzthLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1hO2EucWQ9ZnVuY3Rpb24oZCxlLGYpe2Zvcih2YXIgaD1BcnJheShhcmd1bWVudHMubGVuZ3RoLTIpLGs9MjtrPGFyZ3VtZW50cy5sZW5ndGg7aysrKWhbay0yXT1hcmd1bWVudHNba107cmV0dXJuIGIucHJvdG90eXBlW2VdLmFwcGx5KGQsaCl9fTtmdW5jdGlvbiBvYShhLGIpe2lmKEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKUVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsb2EpO2Vsc2V7dmFyIGM9RXJyb3IoKS5zdGFjaztjJiYodGhpcy5zdGFjaz1jKX1hJiYodGhpcy5tZXNzYWdlPVN0cmluZyhhKSk7YiE9PXZvaWQgMCYmKHRoaXMuY2F1c2U9Yil9bihvYSxFcnJvcik7b2EucHJvdG90eXBlLm5hbWU9IkN1c3RvbUVycm9yIjt2YXIgcGE7ZnVuY3Rpb24gcWEoYSxiKXthPWEuc3BsaXQoIiVzIik7Zm9yKHZhciBjPSIiLGQ9YS5sZW5ndGgtMSxlPTA7ZTxkO2UrKyljKz1hW2VdKyhlPGIubGVuZ3RoP2JbZV06IiVzIik7b2EuY2FsbCh0aGlzLGMrYVtkXSl9bihxYSxvYSk7cWEucHJvdG90eXBlLm5hbWU9IkFzc2VydGlvbkVycm9yIjtmdW5jdGlvbiByYShhLGIsYyxkKXt2YXIgZT0iQXNzZXJ0aW9uIGZhaWxlZCI7aWYoYyl7ZSs9IjogIitjO3ZhciBmPWR9ZWxzZSBhJiYoZSs9IjogIithLGY9Yik7dGhyb3cgbmV3IHFhKCIiK2UsZnx8W10pO30KdmFyIHA9ZnVuY3Rpb24oYSxiLGMpe2F8fHJhKCIiLG51bGwsYixBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMikpO3JldHVybiBhfSxzYT1mdW5jdGlvbihhLGIsYyl7bShhKSYmYS5ub2RlVHlwZT09MXx8cmEoIkV4cGVjdGVkIEVsZW1lbnQgYnV0IGdvdCAlczogJXMuIixbamEoYSksYV0sYixBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMikpfSx1YT1mdW5jdGlvbihhLGIsYyxkKXthIGluc3RhbmNlb2YgYnx8cmEoIkV4cGVjdGVkIGluc3RhbmNlb2YgJXMgYnV0IGdvdCAlcy4iLFt0YShiKSx0YShhKV0sYyxBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMykpfTsKZnVuY3Rpb24gdGEoYSl7cmV0dXJuIGEgaW5zdGFuY2VvZiBGdW5jdGlvbj9hLmRpc3BsYXlOYW1lfHxhLm5hbWV8fCJ1bmtub3duIHR5cGUgbmFtZSI6YSBpbnN0YW5jZW9mIE9iamVjdD9hLmNvbnN0cnVjdG9yLmRpc3BsYXlOYW1lfHxhLmNvbnN0cnVjdG9yLm5hbWV8fE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhKTphPT09bnVsbD8ibnVsbCI6dHlwZW9mIGF9O3ZhciB2YT1BcnJheS5wcm90b3R5cGUuaW5kZXhPZj9mdW5jdGlvbihhLGIpe3AoYS5sZW5ndGghPW51bGwpO3JldHVybiBBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKGEsYix2b2lkIDApfTpmdW5jdGlvbihhLGIpe2lmKHR5cGVvZiBhPT09InN0cmluZyIpcmV0dXJuIHR5cGVvZiBiIT09InN0cmluZyJ8fGIubGVuZ3RoIT0xPy0xOmEuaW5kZXhPZihiLDApO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWlmKGMgaW4gYSYmYVtjXT09PWIpcmV0dXJuIGM7cmV0dXJuLTF9LHdhPUFycmF5LnByb3RvdHlwZS5mb3JFYWNoP2Z1bmN0aW9uKGEsYil7cChhLmxlbmd0aCE9bnVsbCk7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChhLGIsdm9pZCAwKX06ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9YS5sZW5ndGgsZD10eXBlb2YgYT09PSJzdHJpbmciP2Euc3BsaXQoIiIpOmEsZT0wO2U8YztlKyspZSBpbiBkJiZiLmNhbGwodm9pZCAwLGRbZV0sZSxhKX07CmZ1bmN0aW9uIHhhKGEsYil7Yj12YShhLGIpO3ZhciBjO2lmKGM9Yj49MClwKGEubGVuZ3RoIT1udWxsKSxBcnJheS5wcm90b3R5cGUuc3BsaWNlLmNhbGwoYSxiLDEpO3JldHVybiBjfWZ1bmN0aW9uIHlhKGEpe3ZhciBiPWEubGVuZ3RoO2lmKGI+MCl7Zm9yKHZhciBjPUFycmF5KGIpLGQ9MDtkPGI7ZCsrKWNbZF09YVtkXTtyZXR1cm4gY31yZXR1cm5bXX1mdW5jdGlvbiB6YShhLGIsYyxkKXtwKGEubGVuZ3RoIT1udWxsKTtBcnJheS5wcm90b3R5cGUuc3BsaWNlLmFwcGx5KGEsQWEoYXJndW1lbnRzLDEpKX1mdW5jdGlvbiBBYShhLGIsYyl7cChhLmxlbmd0aCE9bnVsbCk7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg8PTI/QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYSxiKTpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhLGIsYyl9O2Z1bmN0aW9uIEJhKGEsYixjKXtmb3IodmFyIGQgaW4gYSliLmNhbGwoYyxhW2RdLGQsYSl9ZnVuY3Rpb24gQ2EoYSxiKXtmb3IodmFyIGMgaW4gYSlpZihhW2NdPT1iKXJldHVybiEwO3JldHVybiExfWZ1bmN0aW9uIERhKGEsYixjKXtpZihhIT09bnVsbCYmYiBpbiBhKXRocm93IEVycm9yKCdUaGUgb2JqZWN0IGFscmVhZHkgY29udGFpbnMgdGhlIGtleSAiJytiKyciJyk7YVtiXT1jfWZ1bmN0aW9uIEVhKGEpe3ZhciBiPXt9LGM7Zm9yKGMgaW4gYSliW2FbY11dPWM7cmV0dXJuIGJ9dmFyIEZhPSJjb25zdHJ1Y3RvciBoYXNPd25Qcm9wZXJ0eSBpc1Byb3RvdHlwZU9mIHByb3BlcnR5SXNFbnVtZXJhYmxlIHRvTG9jYWxlU3RyaW5nIHRvU3RyaW5nIHZhbHVlT2YiLnNwbGl0KCIgIik7CmZ1bmN0aW9uIEdhKGEsYil7Zm9yKHZhciBjLGQsZT0xO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspe2Q9YXJndW1lbnRzW2VdO2ZvcihjIGluIGQpYVtjXT1kW2NdO2Zvcih2YXIgZj0wO2Y8RmEubGVuZ3RoO2YrKyljPUZhW2ZdLE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChkLGMpJiYoYVtjXT1kW2NdKX19O3ZhciBIYT1TdHJpbmcucHJvdG90eXBlLnRyaW0/ZnVuY3Rpb24oYSl7cmV0dXJuIGEudHJpbSgpfTpmdW5jdGlvbihhKXtyZXR1cm4vXltcc1x4YTBdKihbXHNcU10qPylbXHNceGEwXSokLy5leGVjKGEpWzFdfTsvKgoKIENvcHlyaWdodCBHb29nbGUgTExDCiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMAoqLwp2YXIgSWE9e307dmFyIEphPWZ1bmN0aW9uKGEpe2lmKElhIT09SWEpdGhyb3cgRXJyb3IoIkJhZCBzZWNyZXQiKTt0aGlzLmc9YX07SmEucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ307bmV3IEphKCJhYm91dDpibGFuayIpO25ldyBKYSgiYWJvdXQ6aW52YWxpZCN6Q2xvc3VyZXoiKTt2YXIgS2E9W10sTGE9ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJBIFVSTCB3aXRoIGNvbnRlbnQgJyIrYSsiJyB3YXMgc2FuaXRpemVkIGF3YXkuIil9O0thLmluZGV4T2YoTGEpPT09LTEmJkthLnB1c2goTGEpO3ZhciBNYSxOYTthOntmb3IodmFyIE9hPVsiQ0xPU1VSRV9GTEFHUyJdLFBhPWwsUWE9MDtRYTxPYS5sZW5ndGg7UWErKylpZihQYT1QYVtPYVtRYV1dLFBhPT1udWxsKXtOYT1udWxsO2JyZWFrIGF9TmE9UGF9dmFyIFJhPU5hJiZOYVs2MTA0MDEzMDFdO01hPVJhIT1udWxsP1JhOiExO2Z1bmN0aW9uIFNhKCl7dmFyIGE9bC5uYXZpZ2F0b3I7cmV0dXJuIGEmJihhPWEudXNlckFnZW50KT9hOiIifXZhciBUYSxVYT1sLm5hdmlnYXRvcjtUYT1VYT9VYS51c2VyQWdlbnREYXRhfHxudWxsOm51bGw7ZnVuY3Rpb24gcihhKXtyZXR1cm4gU2EoKS5pbmRleE9mKGEpIT0tMX07dmFyIFZhPXIoIkVkZ2UiKSx0PXIoIkdlY2tvIikmJiEoU2EoKS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoIndlYmtpdCIpIT0tMSYmIXIoIkVkZ2UiKSkmJiEocigiVHJpZGVudCIpfHxyKCJNU0lFIikpJiYhcigiRWRnZSIpLHU9U2EoKS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoIndlYmtpdCIpIT0tMSYmIXIoIkVkZ2UiKSx2PU1hJiZUYSYmVGEucGxhdGZvcm0/VGEucGxhdGZvcm09PT0ibWFjT1MiOnIoIk1hY2ludG9zaCIpO3ZhciBYYT1mdW5jdGlvbihhLGIpe0JhKGIsZnVuY3Rpb24oYyxkKXtkPT0ic3R5bGUiP2Euc3R5bGUuY3NzVGV4dD1jOmQ9PSJjbGFzcyI/YS5jbGFzc05hbWU9YzpkPT0iZm9yIj9hLmh0bWxGb3I9YzpXYS5oYXNPd25Qcm9wZXJ0eShkKT9hLnNldEF0dHJpYnV0ZShXYVtkXSxjKTpkLmxhc3RJbmRleE9mKCJhcmlhLSIsMCk9PTB8fGQubGFzdEluZGV4T2YoImRhdGEtIiwwKT09MD9hLnNldEF0dHJpYnV0ZShkLGMpOmFbZF09Y30pfSxXYT17Y2VsbHBhZGRpbmc6ImNlbGxQYWRkaW5nIixjZWxsc3BhY2luZzoiY2VsbFNwYWNpbmciLGNvbHNwYW46ImNvbFNwYW4iLGZyYW1lYm9yZGVyOiJmcmFtZUJvcmRlciIsaGVpZ2h0OiJoZWlnaHQiLG1heGxlbmd0aDoibWF4TGVuZ3RoIixub25jZToibm9uY2UiLHJvbGU6InJvbGUiLHJvd3NwYW46InJvd1NwYW4iLHR5cGU6InR5cGUiLHVzZW1hcDoidXNlTWFwIix2YWxpZ246InZBbGlnbiIsd2lkdGg6IndpZHRoIn0sWWE9ZnVuY3Rpb24oYSwKYixjKXtmdW5jdGlvbiBkKGspe2smJmIuYXBwZW5kQ2hpbGQodHlwZW9mIGs9PT0ic3RyaW5nIj9hLmNyZWF0ZVRleHROb2RlKGspOmspfWZvcih2YXIgZT0yO2U8Yy5sZW5ndGg7ZSsrKXt2YXIgZj1jW2VdO2lmKCFrYShmKXx8bShmKSYmZi5ub2RlVHlwZT4wKWQoZik7ZWxzZXthOntpZihmJiZ0eXBlb2YgZi5sZW5ndGg9PSJudW1iZXIiKXtpZihtKGYpKXt2YXIgaD10eXBlb2YgZi5pdGVtPT0iZnVuY3Rpb24ifHx0eXBlb2YgZi5pdGVtPT0ic3RyaW5nIjticmVhayBhfWlmKHR5cGVvZiBmPT09ImZ1bmN0aW9uIil7aD10eXBlb2YgZi5pdGVtPT0iZnVuY3Rpb24iO2JyZWFrIGF9fWg9ITF9d2EoaD95YShmKTpmLGQpfX19LFphPWZ1bmN0aW9uKGEsYil7Yj1TdHJpbmcoYik7YS5jb250ZW50VHlwZT09PSJhcHBsaWNhdGlvbi94aHRtbCt4bWwiJiYoYj1iLnRvTG93ZXJDYXNlKCkpO3JldHVybiBhLmNyZWF0ZUVsZW1lbnQoYil9LCRhPWZ1bmN0aW9uKGEpe2EmJmEucGFyZW50Tm9kZSYmCmEucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhKX0sYWI9ZnVuY3Rpb24oYSxiKXtpZighYXx8IWIpcmV0dXJuITE7aWYoYS5jb250YWlucyYmYi5ub2RlVHlwZT09MSlyZXR1cm4gYT09Ynx8YS5jb250YWlucyhiKTtpZih0eXBlb2YgYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiE9InVuZGVmaW5lZCIpcmV0dXJuIGE9PWJ8fCEhKGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24oYikmMTYpO2Zvcig7YiYmYSE9YjspYj1iLnBhcmVudE5vZGU7cmV0dXJuIGI9PWF9LGJiPWZ1bmN0aW9uKGEpe3AoYSwiTm9kZSBjYW5ub3QgYmUgbnVsbCBvciB1bmRlZmluZWQuIik7cmV0dXJuIGEubm9kZVR5cGU9PTk/YTphLm93bmVyRG9jdW1lbnR8fGEuZG9jdW1lbnR9LGNiPWZ1bmN0aW9uKGEsYil7Yj9hLnRhYkluZGV4PTA6KGEudGFiSW5kZXg9LTEsYS5yZW1vdmVBdHRyaWJ1dGUoInRhYkluZGV4IikpfSxkYj1mdW5jdGlvbihhKXtyZXR1cm4gYS5oYXNBdHRyaWJ1dGUoInRhYmluZGV4Iil9LGViPQpmdW5jdGlvbihhKXthPWEudGFiSW5kZXg7cmV0dXJuIHR5cGVvZiBhPT09Im51bWJlciImJmE+PTAmJmE8MzI3Njh9LGZiPWZ1bmN0aW9uKGEpe3RoaXMuZz1hfHxsLmRvY3VtZW50fHxkb2N1bWVudH07ZmIucHJvdG90eXBlLmk9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nO3JldHVybiB0eXBlb2YgYT09PSJzdHJpbmciP2IuZ2V0RWxlbWVudEJ5SWQoYSk6YX07ZmIucHJvdG90eXBlLmg9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXMuZyxlPWFyZ3VtZW50cyxmPWVbMV0saD1aYShkLFN0cmluZyhlWzBdKSk7ZiYmKHR5cGVvZiBmPT09InN0cmluZyI/aC5jbGFzc05hbWU9ZjpBcnJheS5pc0FycmF5KGYpP2guY2xhc3NOYW1lPWYuam9pbigiICIpOlhhKGgsZikpO2UubGVuZ3RoPjImJllhKGQsaCxlKTtyZXR1cm4gaH07dmFyIHc9ZnVuY3Rpb24oKXt0aGlzLmJhPXRoaXMuYmE7dGhpcy5rYT10aGlzLmthfTt3LnByb3RvdHlwZS5iYT0hMTt3LnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7dGhpcy5iYXx8KHRoaXMuYmE9ITAsdGhpcy5DKCkpfTt3LnByb3RvdHlwZVtTeW1ib2wuZGlzcG9zZV09ZnVuY3Rpb24oKXt0aGlzLmRpc3Bvc2UoKX07dy5wcm90b3R5cGUuQz1mdW5jdGlvbigpe2lmKHRoaXMua2EpZm9yKDt0aGlzLmthLmxlbmd0aDspdGhpcy5rYS5zaGlmdCgpKCl9O3ZhciB5PWZ1bmN0aW9uKGEsYil7dGhpcy50eXBlPWE7dGhpcy51PXRoaXMudGFyZ2V0PWI7dGhpcy5kZWZhdWx0UHJldmVudGVkPXRoaXMuQT0hMX07eS5wcm90b3R5cGUudj1mdW5jdGlvbigpe3RoaXMuQT0hMH07eS5wcm90b3R5cGUuaj1mdW5jdGlvbigpe3RoaXMuZGVmYXVsdFByZXZlbnRlZD0hMH07dmFyIGdiPWZ1bmN0aW9uKCl7aWYoIWwuYWRkRXZlbnRMaXN0ZW5lcnx8IU9iamVjdC5kZWZpbmVQcm9wZXJ0eSlyZXR1cm4hMTt2YXIgYT0hMSxiPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwicGFzc2l2ZSIse2dldDpmdW5jdGlvbigpe2E9ITB9fSk7dHJ5e3ZhciBjPWZ1bmN0aW9uKCl7fTtsLmFkZEV2ZW50TGlzdGVuZXIoInRlc3QiLGMsYik7bC5yZW1vdmVFdmVudExpc3RlbmVyKCJ0ZXN0IixjLGIpfWNhdGNoKGQpe31yZXR1cm4gYX0oKTt2YXIgej1mdW5jdGlvbihhLGIpe3kuY2FsbCh0aGlzLGE/YS50eXBlOiIiKTt0aGlzLnJlbGF0ZWRUYXJnZXQ9dGhpcy51PXRoaXMudGFyZ2V0PW51bGw7dGhpcy5idXR0b249dGhpcy5zY3JlZW5ZPXRoaXMuc2NyZWVuWD10aGlzLmNsaWVudFk9dGhpcy5jbGllbnRYPTA7dGhpcy5rZXk9IiI7dGhpcy5nPTA7dGhpcy5tZXRhS2V5PXRoaXMuc2hpZnRLZXk9dGhpcy5hbHRLZXk9dGhpcy5jdHJsS2V5PSExO3RoaXMuc3RhdGU9bnVsbDt0aGlzLkc9ITE7dGhpcy5wb2ludGVySWQ9MDt0aGlzLnBvaW50ZXJUeXBlPSIiO3RoaXMudGltZVN0YW1wPTA7dGhpcy5oPW51bGw7aWYoYSl7dmFyIGM9dGhpcy50eXBlPWEudHlwZSxkPWEuY2hhbmdlZFRvdWNoZXMmJmEuY2hhbmdlZFRvdWNoZXMubGVuZ3RoP2EuY2hhbmdlZFRvdWNoZXNbMF06bnVsbDt0aGlzLnRhcmdldD1hLnRhcmdldHx8YS5zcmNFbGVtZW50O3RoaXMudT1iO2I9YS5yZWxhdGVkVGFyZ2V0O2J8fChjPT0ibW91c2VvdmVyIj8KYj1hLmZyb21FbGVtZW50OmM9PSJtb3VzZW91dCImJihiPWEudG9FbGVtZW50KSk7dGhpcy5yZWxhdGVkVGFyZ2V0PWI7ZD8odGhpcy5jbGllbnRYPWQuY2xpZW50WCE9PXZvaWQgMD9kLmNsaWVudFg6ZC5wYWdlWCx0aGlzLmNsaWVudFk9ZC5jbGllbnRZIT09dm9pZCAwP2QuY2xpZW50WTpkLnBhZ2VZLHRoaXMuc2NyZWVuWD1kLnNjcmVlblh8fDAsdGhpcy5zY3JlZW5ZPWQuc2NyZWVuWXx8MCk6KHRoaXMuY2xpZW50WD1hLmNsaWVudFghPT12b2lkIDA/YS5jbGllbnRYOmEucGFnZVgsdGhpcy5jbGllbnRZPWEuY2xpZW50WSE9PXZvaWQgMD9hLmNsaWVudFk6YS5wYWdlWSx0aGlzLnNjcmVlblg9YS5zY3JlZW5YfHwwLHRoaXMuc2NyZWVuWT1hLnNjcmVlbll8fDApO3RoaXMuYnV0dG9uPWEuYnV0dG9uO3RoaXMuZz1hLmtleUNvZGV8fDA7dGhpcy5rZXk9YS5rZXl8fCIiO3RoaXMuY3RybEtleT1hLmN0cmxLZXk7dGhpcy5hbHRLZXk9YS5hbHRLZXk7dGhpcy5zaGlmdEtleT1hLnNoaWZ0S2V5Owp0aGlzLm1ldGFLZXk9YS5tZXRhS2V5O3RoaXMuRz12P2EubWV0YUtleTphLmN0cmxLZXk7dGhpcy5wb2ludGVySWQ9YS5wb2ludGVySWR8fDA7dGhpcy5wb2ludGVyVHlwZT1hLnBvaW50ZXJUeXBlO3RoaXMuc3RhdGU9YS5zdGF0ZTt0aGlzLnRpbWVTdGFtcD1hLnRpbWVTdGFtcDt0aGlzLmg9YTthLmRlZmF1bHRQcmV2ZW50ZWQmJnoubC5qLmNhbGwodGhpcyl9fTtuKHoseSk7ei5wcm90b3R5cGUudj1mdW5jdGlvbigpe3oubC52LmNhbGwodGhpcyk7dGhpcy5oLnN0b3BQcm9wYWdhdGlvbj90aGlzLmguc3RvcFByb3BhZ2F0aW9uKCk6dGhpcy5oLmNhbmNlbEJ1YmJsZT0hMH07ei5wcm90b3R5cGUuaj1mdW5jdGlvbigpe3oubC5qLmNhbGwodGhpcyk7dmFyIGE9dGhpcy5oO2EucHJldmVudERlZmF1bHQ/YS5wcmV2ZW50RGVmYXVsdCgpOmEucmV0dXJuVmFsdWU9ITF9O3ZhciBoYj0iY2xvc3VyZV9saXN0ZW5hYmxlXyIrKE1hdGgucmFuZG9tKCkqMUU2fDApLGliPWZ1bmN0aW9uKGEpe3JldHVybiEoIWF8fCFhW2hiXSl9O3ZhciBqYj0wO3ZhciBrYj1mdW5jdGlvbihhLGIsYyxkLGUpe3RoaXMubGlzdGVuZXI9YTt0aGlzLnByb3h5PW51bGw7dGhpcy5zcmM9Yjt0aGlzLnR5cGU9Yzt0aGlzLmNhcHR1cmU9ISFkO3RoaXMucGE9ZTt0aGlzLmtleT0rK2piO3RoaXMuamE9dGhpcy5vYT0hMX0sbGI9ZnVuY3Rpb24oYSl7YS5qYT0hMDthLmxpc3RlbmVyPW51bGw7YS5wcm94eT1udWxsO2Euc3JjPW51bGw7YS5wYT1udWxsfTt2YXIgbWI9ZnVuY3Rpb24oYSl7dGhpcy5zcmM9YTt0aGlzLmc9e307dGhpcy5oPTB9O21iLnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZj1hLnRvU3RyaW5nKCk7YT10aGlzLmdbZl07YXx8KGE9dGhpcy5nW2ZdPVtdLHRoaXMuaCsrKTt2YXIgaD1uYihhLGIsZCxlKTtoPi0xPyhiPWFbaF0sY3x8KGIub2E9ITEpKTooYj1uZXcga2IoYix0aGlzLnNyYyxmLCEhZCxlKSxiLm9hPWMsYS5wdXNoKGIpKTtyZXR1cm4gYn07CnZhciBvYj1mdW5jdGlvbihhLGIpe3ZhciBjPWIudHlwZTtjIGluIGEuZyYmeGEoYS5nW2NdLGIpJiYobGIoYiksYS5nW2NdLmxlbmd0aD09MCYmKGRlbGV0ZSBhLmdbY10sYS5oLS0pKX0scGI9ZnVuY3Rpb24oYSxiLGMsZCxlKXthPWEuZ1tiLnRvU3RyaW5nKCldO2I9LTE7YSYmKGI9bmIoYSxjLGQsZSkpO3JldHVybiBiPi0xP2FbYl06bnVsbH0sbmI9ZnVuY3Rpb24oYSxiLGMsZCl7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDsrK2Upe3ZhciBmPWFbZV07aWYoIWYuamEmJmYubGlzdGVuZXI9PWImJmYuY2FwdHVyZT09ISFjJiZmLnBhPT1kKXJldHVybiBlfXJldHVybi0xfTt2YXIgcWI9ImNsb3N1cmVfbG1fIisoTWF0aC5yYW5kb20oKSoxRTZ8MCkscmI9e30sc2I9MCx1Yj1mdW5jdGlvbihhLGIsYyxkLGUpe2lmKGQmJmQub25jZSlyZXR1cm4gdGIoYSxiLGMsZCxlKTtpZihBcnJheS5pc0FycmF5KGIpKXtmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKyl1YihhLGJbZl0sYyxkLGUpO3JldHVybiBudWxsfWM9dmIoYyk7cmV0dXJuIGliKGEpP3diKGEsYixjLG0oZCk/ISFkLmNhcHR1cmU6ISFkLGUpOnhiKGEsYixjLCExLGQsZSl9LHhiPWZ1bmN0aW9uKGEsYixjLGQsZSxmKXtpZighYil0aHJvdyBFcnJvcigiSW52YWxpZCBldmVudCB0eXBlIik7dmFyIGg9bShlKT8hIWUuY2FwdHVyZTohIWUsaz15YihhKTtrfHwoYVtxYl09az1uZXcgbWIoYSkpO2M9ay5hZGQoYixjLGQsaCxmKTtpZihjLnByb3h5KXJldHVybiBjO2Q9emIoKTtjLnByb3h5PWQ7ZC5zcmM9YTtkLmxpc3RlbmVyPWM7aWYoYS5hZGRFdmVudExpc3RlbmVyKWdifHwoZT1oKSxlPT09dm9pZCAwJiYKKGU9ITEpLGEuYWRkRXZlbnRMaXN0ZW5lcihiLnRvU3RyaW5nKCksZCxlKTtlbHNlIGlmKGEuYXR0YWNoRXZlbnQpYS5hdHRhY2hFdmVudChBYihiLnRvU3RyaW5nKCkpLGQpO2Vsc2UgaWYoYS5hZGRMaXN0ZW5lciYmYS5yZW1vdmVMaXN0ZW5lcilwKGI9PT0iY2hhbmdlIiwiTWVkaWFRdWVyeUxpc3Qgb25seSBoYXMgYSBjaGFuZ2UgZXZlbnQiKSxhLmFkZExpc3RlbmVyKGQpO2Vsc2UgdGhyb3cgRXJyb3IoImFkZEV2ZW50TGlzdGVuZXIgYW5kIGF0dGFjaEV2ZW50IGFyZSB1bmF2YWlsYWJsZS4iKTtzYisrO3JldHVybiBjfSx6Yj1mdW5jdGlvbigpe3ZhciBhPUJiLGI9ZnVuY3Rpb24oYyl7cmV0dXJuIGEuY2FsbChiLnNyYyxiLmxpc3RlbmVyLGMpfTtyZXR1cm4gYn0sdGI9ZnVuY3Rpb24oYSxiLGMsZCxlKXtpZihBcnJheS5pc0FycmF5KGIpKXtmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKyl0YihhLGJbZl0sYyxkLGUpO3JldHVybiBudWxsfWM9dmIoYyk7cmV0dXJuIGliKGEpPwphLkEuYWRkKFN0cmluZyhiKSxjLCEwLG0oZCk/ISFkLmNhcHR1cmU6ISFkLGUpOnhiKGEsYixjLCEwLGQsZSl9LENiPWZ1bmN0aW9uKGEsYixjLGQsZSl7aWYoQXJyYXkuaXNBcnJheShiKSlmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKylDYihhLGJbZl0sYyxkLGUpO2Vsc2UgZD1tKGQpPyEhZC5jYXB0dXJlOiEhZCxjPXZiKGMpLGliKGEpPyhhPWEuQSxiPVN0cmluZyhiKS50b1N0cmluZygpLGIgaW4gYS5nJiYoZj1hLmdbYl0sYz1uYihmLGMsZCxlKSxjPi0xJiYobGIoZltjXSkscChmLmxlbmd0aCE9bnVsbCksQXJyYXkucHJvdG90eXBlLnNwbGljZS5jYWxsKGYsYywxKSxmLmxlbmd0aD09MCYmKGRlbGV0ZSBhLmdbYl0sYS5oLS0pKSkpOmEmJihhPXliKGEpKSYmKGM9cGIoYSxiLGMsZCxlKSkmJkEoYyl9LEE9ZnVuY3Rpb24oYSl7aWYodHlwZW9mIGEhPT0ibnVtYmVyIiYmYSYmIWEuamEpe3ZhciBiPWEuc3JjO2lmKGliKGIpKW9iKGIuQSxhKTtlbHNle3ZhciBjPWEudHlwZSwKZD1hLnByb3h5O2IucmVtb3ZlRXZlbnRMaXN0ZW5lcj9iLnJlbW92ZUV2ZW50TGlzdGVuZXIoYyxkLGEuY2FwdHVyZSk6Yi5kZXRhY2hFdmVudD9iLmRldGFjaEV2ZW50KEFiKGMpLGQpOmIuYWRkTGlzdGVuZXImJmIucmVtb3ZlTGlzdGVuZXImJmIucmVtb3ZlTGlzdGVuZXIoZCk7c2ItLTsoYz15YihiKSk/KG9iKGMsYSksYy5oPT0wJiYoYy5zcmM9bnVsbCxiW3FiXT1udWxsKSk6bGIoYSl9fX0sQWI9ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW4gcmI/cmJbYV06cmJbYV09Im9uIithfSxCYj1mdW5jdGlvbihhLGIpe2lmKGEuamEpYT0hMDtlbHNle2I9bmV3IHooYix0aGlzKTt2YXIgYz1hLmxpc3RlbmVyLGQ9YS5wYXx8YS5zcmM7YS5vYSYmQShhKTthPWMuY2FsbChkLGIpfXJldHVybiBhfSx5Yj1mdW5jdGlvbihhKXthPWFbcWJdO3JldHVybiBhIGluc3RhbmNlb2YgbWI/YTpudWxsfSxEYj0iX19jbG9zdXJlX2V2ZW50c19mbl8iKyhNYXRoLnJhbmRvbSgpKjFFOT4+PjApLHZiPWZ1bmN0aW9uKGEpe3AoYSwKIkxpc3RlbmVyIGNhbiBub3QgYmUgbnVsbC4iKTtpZih0eXBlb2YgYT09PSJmdW5jdGlvbiIpcmV0dXJuIGE7cChhLmhhbmRsZUV2ZW50LCJBbiBvYmplY3QgbGlzdGVuZXIgbXVzdCBoYXZlIGhhbmRsZUV2ZW50IG1ldGhvZC4iKTthW0RiXXx8KGFbRGJdPWZ1bmN0aW9uKGIpe3JldHVybiBhLmhhbmRsZUV2ZW50KGIpfSk7cmV0dXJuIGFbRGJdfTt2YXIgRWI9ZnVuY3Rpb24oYSl7dy5jYWxsKHRoaXMpO3RoaXMuaD1hO3RoaXMuZz17fX07bihFYix3KTsKdmFyIEZiPVtdLEI9ZnVuY3Rpb24oYSxiLGMsZCl7QXJyYXkuaXNBcnJheShjKXx8KGMmJihGYlswXT1jLnRvU3RyaW5nKCkpLGM9RmIpO2Zvcih2YXIgZT0wO2U8Yy5sZW5ndGg7ZSsrKXt2YXIgZj11YihiLGNbZV0sZHx8YS5oYW5kbGVFdmVudCwhMSxhLmh8fGEpO2lmKCFmKWJyZWFrO2EuZ1tmLmtleV09Zn1yZXR1cm4gYX0sQz1mdW5jdGlvbihhLGIsYyxkLGUsZil7aWYoQXJyYXkuaXNBcnJheShjKSlmb3IodmFyIGg9MDtoPGMubGVuZ3RoO2grKylDKGEsYixjW2hdLGQsZSxmKTtlbHNlIGQ9ZHx8YS5oYW5kbGVFdmVudCxlPW0oZSk/ISFlLmNhcHR1cmU6ISFlLGY9Znx8YS5ofHxhLGQ9dmIoZCksZT0hIWUsYz1pYihiKT9wYihiLkEsU3RyaW5nKGMpLGQsZSxmKTpiPyhiPXliKGIpKT9wYihiLGMsZCxlLGYpOm51bGw6bnVsbCxjJiYoQShjKSxkZWxldGUgYS5nW2Mua2V5XSk7cmV0dXJuIGF9LEdiPWZ1bmN0aW9uKGEpe0JhKGEuZyxmdW5jdGlvbihiLGMpe3RoaXMuZy5oYXNPd25Qcm9wZXJ0eShjKSYmCkEoYil9LGEpO2EuZz17fX07RWIucHJvdG90eXBlLkM9ZnVuY3Rpb24oKXtFYi5sLkMuY2FsbCh0aGlzKTtHYih0aGlzKX07RWIucHJvdG90eXBlLmhhbmRsZUV2ZW50PWZ1bmN0aW9uKCl7dGhyb3cgRXJyb3IoIkV2ZW50SGFuZGxlci5oYW5kbGVFdmVudCBub3QgaW1wbGVtZW50ZWQiKTt9O3ZhciBEPWZ1bmN0aW9uKCl7dy5jYWxsKHRoaXMpO3RoaXMuQT1uZXcgbWIodGhpcyk7dGhpcy5ZYT10aGlzO3RoaXMubGE9bnVsbH07bihELHcpO0QucHJvdG90eXBlW2hiXT0hMDtELnByb3RvdHlwZS5BYT1mdW5jdGlvbihhKXt0aGlzLmxhPWF9O0QucHJvdG90eXBlLnJlbW92ZUV2ZW50TGlzdGVuZXI9ZnVuY3Rpb24oYSxiLGMsZCl7Q2IodGhpcyxhLGIsYyxkKX07CnZhciBFPWZ1bmN0aW9uKGEsYil7SGIoYSk7dmFyIGM9YS5sYTtpZihjKXt2YXIgZD1bXTtmb3IodmFyIGU9MTtjO2M9Yy5sYSlkLnB1c2goYykscCgrK2U8MUUzLCJpbmZpbml0ZSBsb29wIil9YT1hLllhO2M9Yi50eXBlfHxiO3R5cGVvZiBiPT09InN0cmluZyI/Yj1uZXcgeShiLGEpOmIgaW5zdGFuY2VvZiB5P2IudGFyZ2V0PWIudGFyZ2V0fHxhOihlPWIsYj1uZXcgeShjLGEpLEdhKGIsZSkpO2U9ITA7dmFyIGY7aWYoZClmb3IoZj1kLmxlbmd0aC0xOyFiLkEmJmY+PTA7Zi0tKXt2YXIgaD1iLnU9ZFtmXTtlPUliKGgsYywhMCxiKSYmZX1iLkF8fChoPWIudT1hLGU9SWIoaCxjLCEwLGIpJiZlLGIuQXx8KGU9SWIoaCxjLCExLGIpJiZlKSk7aWYoZClmb3IoZj0wOyFiLkEmJmY8ZC5sZW5ndGg7ZisrKWg9Yi51PWRbZl0sZT1JYihoLGMsITEsYikmJmU7cmV0dXJuIGV9OwpELnByb3RvdHlwZS5DPWZ1bmN0aW9uKCl7RC5sLkMuY2FsbCh0aGlzKTtpZih0aGlzLkEpe3ZhciBhPXRoaXMuQSxiPTAsYztmb3IoYyBpbiBhLmcpe2Zvcih2YXIgZD1hLmdbY10sZT0wO2U8ZC5sZW5ndGg7ZSsrKSsrYixsYihkW2VdKTtkZWxldGUgYS5nW2NdO2EuaC0tfX10aGlzLmxhPW51bGx9O3ZhciB3Yj1mdW5jdGlvbihhLGIsYyxkLGUpe0hiKGEpO3JldHVybiBhLkEuYWRkKFN0cmluZyhiKSxjLCExLGQsZSl9LEliPWZ1bmN0aW9uKGEsYixjLGQpe2I9YS5BLmdbU3RyaW5nKGIpXTtpZighYilyZXR1cm4hMDtiPWIuY29uY2F0KCk7Zm9yKHZhciBlPSEwLGY9MDtmPGIubGVuZ3RoOysrZil7dmFyIGg9YltmXTtpZihoJiYhaC5qYSYmaC5jYXB0dXJlPT1jKXt2YXIgaz1oLmxpc3RlbmVyLHE9aC5wYXx8aC5zcmM7aC5vYSYmb2IoYS5BLGgpO2U9ay5jYWxsKHEsZCkhPT0hMSYmZX19cmV0dXJuIGUmJiFkLmRlZmF1bHRQcmV2ZW50ZWR9LEhiPWZ1bmN0aW9uKGEpe3AoYS5BLCJFdmVudCB0YXJnZXQgaXMgbm90IGluaXRpYWxpemVkLiBEaWQgeW91IGNhbGwgdGhlIHN1cGVyY2xhc3MgKGdvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0KSBjb25zdHJ1Y3Rvcj8iKX07dmFyIEpiPXQ/Ik1velVzZXJTZWxlY3QiOnV8fFZhPyJXZWJraXRVc2VyU2VsZWN0IjpudWxsLEtiPWZ1bmN0aW9uKGEsYil7Yj1iP251bGw6YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpO2lmKEpiJiYoYS5zdHlsZSYmKGEuc3R5bGVbSmJdPSJub25lIiksYikpZm9yKHZhciBjPTA7YT1iW2NdO2MrKylhLnN0eWxlJiYoYS5zdHlsZVtKYl09Im5vbmUiKX07dmFyIExiPWZ1bmN0aW9uKCl7fTtpYShMYik7TGIucHJvdG90eXBlLmc9MDt2YXIgRj1mdW5jdGlvbihhKXtELmNhbGwodGhpcyk7dGhpcy5HPWF8fHBhfHwocGE9bmV3IGZiKTt0aGlzLnphPU1iO3RoaXMuWT1udWxsO3RoaXMucz0hMTt0aGlzLmc9bnVsbDt0aGlzLk09dm9pZCAwO3RoaXMudT10aGlzLmo9dGhpcy5oPW51bGw7dGhpcy5TYT0hMX07bihGLEQpO0YucHJvdG90eXBlLlphPUxiLlYoKTsKdmFyIE1iPW51bGwsTmI9ZnVuY3Rpb24oYSxiKXtzd2l0Y2goYSl7Y2FzZSAxOnJldHVybiBiPyJkaXNhYmxlIjoiZW5hYmxlIjtjYXNlIDI6cmV0dXJuIGI/ImhpZ2hsaWdodCI6InVuaGlnaGxpZ2h0IjtjYXNlIDQ6cmV0dXJuIGI/ImFjdGl2YXRlIjoiZGVhY3RpdmF0ZSI7Y2FzZSA4OnJldHVybiBiPyJzZWxlY3QiOiJ1bnNlbGVjdCI7Y2FzZSAxNjpyZXR1cm4gYj8iY2hlY2siOiJ1bmNoZWNrIjtjYXNlIDMyOnJldHVybiBiPyJmb2N1cyI6ImJsdXIiO2Nhc2UgNjQ6cmV0dXJuIGI/Im9wZW4iOiJjbG9zZSJ9dGhyb3cgRXJyb3IoIkludmFsaWQgY29tcG9uZW50IHN0YXRlIik7fSxPYj1mdW5jdGlvbihhKXtyZXR1cm4gYS5ZfHwoYS5ZPSI6IisoYS5aYS5nKyspLnRvU3RyaW5nKDM2KSl9LFBiPWZ1bmN0aW9uKGEsYil7aWYoYS5oJiZhLmgudSl7dmFyIGM9YS5oLnUsZD1hLlk7ZCBpbiBjJiZkZWxldGUgY1tkXTtEYShhLmgudSxiLGEpfWEuWT1ifTtGLnByb3RvdHlwZS5pPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ307CnZhciBRYj1mdW5jdGlvbihhKXthLk18fChhLk09bmV3IEViKGEpKTtyZXR1cm4gcChhLk0pfTtGLnByb3RvdHlwZS5BYT1mdW5jdGlvbihhKXtpZih0aGlzLmgmJnRoaXMuaCE9YSl0aHJvdyBFcnJvcigiTWV0aG9kIG5vdCBzdXBwb3J0ZWQiKTtGLmwuQWEuY2FsbCh0aGlzLGEpfTtGLnByb3RvdHlwZS5tYT1mdW5jdGlvbigpe3RoaXMuZz1aYSh0aGlzLkcuZywiRElWIil9O0YucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbihhKXtSYih0aGlzLGEpfTsKdmFyIFJiPWZ1bmN0aW9uKGEsYixjKXtpZihhLnMpdGhyb3cgRXJyb3IoIkNvbXBvbmVudCBhbHJlYWR5IHJlbmRlcmVkIik7YS5nfHxhLm1hKCk7Yj9iLmluc2VydEJlZm9yZShhLmcsY3x8bnVsbCk6YS5HLmcuYm9keS5hcHBlbmRDaGlsZChhLmcpO2EuaCYmIWEuaC5zfHxhLkkoKX0sU2I9ZnVuY3Rpb24oYSxiKXtpZihhLnMpdGhyb3cgRXJyb3IoIkNvbXBvbmVudCBhbHJlYWR5IHJlbmRlcmVkIik7aWYoYiYmYS53YShiKSl7YS5TYT0hMDt2YXIgYz1iYihiKTthLkcmJmEuRy5nPT1jfHwoYS5HPWI/bmV3IGZiKGJiKGIpKTpwYXx8KHBhPW5ldyBmYikpO2EuRWEoYik7YS5JKCl9ZWxzZSB0aHJvdyBFcnJvcigiSW52YWxpZCBlbGVtZW50IHRvIGRlY29yYXRlIik7fTtnPUYucHJvdG90eXBlO2cud2E9ZnVuY3Rpb24oKXtyZXR1cm4hMH07Zy5FYT1mdW5jdGlvbihhKXt0aGlzLmc9YX07CmcuST1mdW5jdGlvbigpe3RoaXMucz0hMDtUYih0aGlzLGZ1bmN0aW9uKGEpeyFhLnMmJmEuaSgpJiZhLkkoKX0pfTtnLlU9ZnVuY3Rpb24oKXtUYih0aGlzLGZ1bmN0aW9uKGEpe2EucyYmYS5VKCl9KTt0aGlzLk0mJkdiKHRoaXMuTSk7dGhpcy5zPSExfTtnLkM9ZnVuY3Rpb24oKXt0aGlzLnMmJnRoaXMuVSgpO3RoaXMuTSYmKHRoaXMuTS5kaXNwb3NlKCksZGVsZXRlIHRoaXMuTSk7VGIodGhpcyxmdW5jdGlvbihhKXthLmRpc3Bvc2UoKX0pOyF0aGlzLlNhJiZ0aGlzLmcmJiRhKHRoaXMuZyk7dGhpcy5oPXRoaXMuZz10aGlzLnU9dGhpcy5qPW51bGw7Ri5sLkMuY2FsbCh0aGlzKX07Zy5CYT1mdW5jdGlvbihhLGIpe3RoaXMuQ2EoYSxIKHRoaXMpLGIpfTsKZy5DYT1mdW5jdGlvbihhLGIsYyl7cCghIWEsIlByb3ZpZGVkIGVsZW1lbnQgbXVzdCBub3QgYmUgbnVsbC4iKTtpZihhLnMmJihjfHwhdGhpcy5zKSl0aHJvdyBFcnJvcigiQ29tcG9uZW50IGFscmVhZHkgcmVuZGVyZWQiKTtpZihiPDB8fGI+SCh0aGlzKSl0aHJvdyBFcnJvcigiQ2hpbGQgY29tcG9uZW50IGluZGV4IG91dCBvZiBib3VuZHMiKTt0aGlzLnUmJnRoaXMuanx8KHRoaXMudT17fSx0aGlzLmo9W10pO2lmKGEuaD09dGhpcyl7dmFyIGQ9dGhpcy51LGU9T2IoYSk7ZFtlXT1hO3hhKHRoaXMuaixhKX1lbHNlIERhKHRoaXMudSxPYihhKSxhKTtpZihhPT10aGlzKXRocm93IEVycm9yKCJVbmFibGUgdG8gc2V0IHBhcmVudCBjb21wb25lbnQiKTtpZihkPXRoaXMmJmEuaCYmYS5ZKWU9YS5oLGQ9YS5ZLGUudSYmZD8oZT1lLnUsZD0oZSE9PW51bGwmJmQgaW4gZT9lW2RdOnZvaWQgMCl8fG51bGwpOmQ9bnVsbDtpZihkJiZhLmghPXRoaXMpdGhyb3cgRXJyb3IoIlVuYWJsZSB0byBzZXQgcGFyZW50IGNvbXBvbmVudCIpOwphLmg9dGhpcztGLmwuQWEuY2FsbChhLHRoaXMpO3phKHRoaXMuaixiLDAsYSk7YS5zJiZ0aGlzLnMmJmEuaD09dGhpcz8oYz10aGlzLm5hKCksKGMuY2hpbGROb2Rlc1tiXXx8bnVsbCkhPWEuaSgpJiYoYS5pKCkucGFyZW50RWxlbWVudD09YyYmYy5yZW1vdmVDaGlsZChhLmkoKSksYj1jLmNoaWxkTm9kZXNbYl18fG51bGwsYy5pbnNlcnRCZWZvcmUoYS5pKCksYikpKTpjPyh0aGlzLmd8fHRoaXMubWEoKSxiPUkodGhpcyxiKzEpLFJiKGEsdGhpcy5uYSgpLGI/Yi5nOm51bGwpKTp0aGlzLnMmJiFhLnMmJmEuZyYmYS5nLnBhcmVudE5vZGUmJmEuZy5wYXJlbnROb2RlLm5vZGVUeXBlPT0xJiZhLkkoKX07Zy5uYT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmd9Owp2YXIgVWI9ZnVuY3Rpb24oYSl7aWYoYS56YT09bnVsbCl7dmFyIGI9YS5zP2EuZzphLkcuZy5ib2R5O2E6e3ZhciBjPWJiKGIpO2lmKGMuZGVmYXVsdFZpZXcmJmMuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSYmKGM9Yy5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKGIsbnVsbCkpKXtjPWMuZGlyZWN0aW9ufHxjLmdldFByb3BlcnR5VmFsdWUoImRpcmVjdGlvbiIpfHwiIjticmVhayBhfWM9IiJ9YS56YT0icnRsIj09KGN8fChiLmN1cnJlbnRTdHlsZT9iLmN1cnJlbnRTdHlsZS5kaXJlY3Rpb246bnVsbCl8fGIuc3R5bGUmJmIuc3R5bGUuZGlyZWN0aW9uKX1yZXR1cm4gYS56YX0sSD1mdW5jdGlvbihhKXtyZXR1cm4gYS5qP2Euai5sZW5ndGg6MH0sST1mdW5jdGlvbihhLGIpe3JldHVybiBhLmo/YS5qW2JdfHxudWxsOm51bGx9LFRiPWZ1bmN0aW9uKGEsYixjKXthLmomJmEuai5mb3JFYWNoKGIsYyl9LFZiPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuaiYmYj9hLmouaW5kZXhPZihiKToKLTF9O3ZhciBXYj17bWI6ImFjdGl2ZWRlc2NlbmRhbnQiLHJiOiJhdG9taWMiLHNiOiJhdXRvY29tcGxldGUiLHViOiJidXN5Iix4YjoiY2hlY2tlZCIseWI6ImNvbGluZGV4IixEYjoiY29udHJvbHMiLEViOiJjdXJyZW50IixHYjoiZGVzY3JpYmVkYnkiLEpiOiJkaXNhYmxlZCIsTGI6ImRyb3BlZmZlY3QiLE1iOiJleHBhbmRlZCIsTmI6ImZsb3d0byIsUGI6ImdyYWJiZWQiLFRiOiJoYXNwb3B1cCIsVmI6ImhpZGRlbiIsWGI6ImludmFsaWQiLFliOiJsYWJlbCIsWmI6ImxhYmVsbGVkYnkiLGFjOiJsZXZlbCIsZmM6ImxpdmUiLHZjOiJtdWx0aWxpbmUiLHdjOiJtdWx0aXNlbGVjdGFibGUiLEFjOiJvcmllbnRhdGlvbiIsQmM6Im93bnMiLENjOiJwb3NpbnNldCIsRWM6InByZXNzZWQiLEljOiJyZWFkb25seSIsS2M6InJlbGV2YW50IixMYzoicmVxdWlyZWQiLFBjOiJyb3dpbmRleCIsU2M6InNlbGVjdGVkIixVYzoic2V0c2l6ZSIsV2M6InNvcnQiLG1kOiJ2YWx1ZW1heCIsbmQ6InZhbHVlbWluIiwKb2Q6InZhbHVlbm93IixwZDoidmFsdWV0ZXh0In07dmFyIFhiO3ZhciBZYj17bmI6ImFsZXJ0IixvYjoiYWxlcnRkaWFsb2ciLHBiOiJhcHBsaWNhdGlvbiIscWI6ImFydGljbGUiLHRiOiJiYW5uZXIiLHZiOiJidXR0b24iLHdiOiJjaGVja2JveCIsemI6ImNvbHVtbmhlYWRlciIsQWI6ImNvbWJvYm94IixCYjoiY29tcGxlbWVudGFyeSIsQ2I6ImNvbnRlbnRpbmZvIixGYjoiZGVmaW5pdGlvbiIsSGI6ImRpYWxvZyIsSWI6ImRpcmVjdG9yeSIsS2I6ImRvY3VtZW50IixPYjoiZm9ybSIsUWI6ImdyaWQiLFJiOiJncmlkY2VsbCIsU2I6Imdyb3VwIixVYjoiaGVhZGluZyIsV2I6ImltZyIsYmM6ImxpbmsiLGNjOiJsaXN0IixkYzoibGlzdGJveCIsZWM6Imxpc3RpdGVtIixoYzoibG9nIixpYzoibWFpbiIsamM6Im1hcnF1ZWUiLGtjOiJtYXRoIixsYzoibWVudSIsbWM6Im1lbnViYXIiLG5jOiJtZW51aXRlbSIsb2M6Im1lbnVpdGVtY2hlY2tib3giLHBjOiJtZW51aXRlbXJhZGlvIix4YzoibmF2aWdhdGlvbiIseWM6Im5vdGUiLHpjOiJvcHRpb24iLApEYzoicHJlc2VudGF0aW9uIixGYzoicHJvZ3Jlc3NiYXIiLEdjOiJyYWRpbyIsSGM6InJhZGlvZ3JvdXAiLEpjOiJyZWdpb24iLE1jOiJyb3ciLE5jOiJyb3dncm91cCIsT2M6InJvd2hlYWRlciIsUWM6InNjcm9sbGJhciIsUmM6InNlYXJjaCIsVGM6InNlcGFyYXRvciIsVmM6InNsaWRlciIsWGM6InNwaW5idXR0b24iLFljOiJzdGF0dXMiLFpjOiJzd2l0Y2giLGFkOiJ0YWIiLGJkOiJ0YWJsaXN0IixjZDoidGFicGFuZWwiLGRkOiJ0ZXh0Ym94IixlZDoidGV4dGluZm8iLGZkOiJ0aW1lciIsZ2Q6InRvb2xiYXIiLGhkOiJ0b29sdGlwIixqZDoidHJlZSIsa2Q6InRyZWVncmlkIixsZDoidHJlZWl0ZW0ifTt2YXIgWmI9ZnVuY3Rpb24oYSxiKXtiPyhwKENhKFliLGIpLCJObyBzdWNoIEFSSUEgcm9sZSAiK2IpLGEuc2V0QXR0cmlidXRlKCJyb2xlIixiKSk6YS5yZW1vdmVBdHRyaWJ1dGUoInJvbGUiKX0sYWM9ZnVuY3Rpb24oYSxiLGMpe0FycmF5LmlzQXJyYXkoYykmJihjPWMuam9pbigiICIpKTt2YXIgZD0kYihiKTtjPT09IiJ8fGM9PXZvaWQgMD8oWGJ8fChjPXt9LFhiPShjLmF0b21pYz0hMSxjLmF1dG9jb21wbGV0ZT0ibm9uZSIsYy5kcm9wZWZmZWN0PSJub25lIixjLmhhc3BvcHVwPSExLGMubGl2ZT0ib2ZmIixjLm11bHRpbGluZT0hMSxjLm11bHRpc2VsZWN0YWJsZT0hMSxjLm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIsYy5yZWFkb25seT0hMSxjLnJlbGV2YW50PSJhZGRpdGlvbnMgdGV4dCIsYy5yZXF1aXJlZD0hMSxjLnNvcnQ9Im5vbmUiLGMuYnVzeT0hMSxjLmRpc2FibGVkPSExLGMuaGlkZGVuPSExLGMuaW52YWxpZD0iZmFsc2UiLGMpKSxjPVhiLGIgaW4gYz9hLnNldEF0dHJpYnV0ZShkLApjW2JdKTphLnJlbW92ZUF0dHJpYnV0ZShkKSk6YS5zZXRBdHRyaWJ1dGUoZCxjKX0sJGI9ZnVuY3Rpb24oYSl7cChhLCJBUklBIGF0dHJpYnV0ZSBjYW5ub3QgYmUgZW1wdHkuIik7cChDYShXYixhKSwiTm8gc3VjaCBBUklBIGF0dHJpYnV0ZSAiK2EpO3JldHVybiJhcmlhLSIrYX07dmFyIGRjPWZ1bmN0aW9uKGEsYixjLGQsZSxmKXtpZih2JiZlKXJldHVybiBiYyhhKTtpZihlJiYhZClyZXR1cm4hMTtpZighdCl7dHlwZW9mIGI9PT0ibnVtYmVyIiYmKGI9Y2MoYikpO3ZhciBoPWI9PTE3fHxiPT0xOHx8diYmYj09OTE7aWYoKCFjfHx2KSYmaHx8diYmYj09MTYmJihkfHxmKSlyZXR1cm4hMX1pZih1JiZkJiZjKXN3aXRjaChhKXtjYXNlIDIyMDpjYXNlIDIxOTpjYXNlIDIyMTpjYXNlIDE5MjpjYXNlIDE4NjpjYXNlIDE4OTpjYXNlIDE4NzpjYXNlIDE4ODpjYXNlIDE5MDpjYXNlIDE5MTpjYXNlIDE5MjpjYXNlIDIyMjpyZXR1cm4hMX1zd2l0Y2goYSl7Y2FzZSAxMzpyZXR1cm4gdD9mfHxlPyExOiEoYyYmZCk6ITA7Y2FzZSAyNzpyZXR1cm4hdSYmIXR9cmV0dXJuIHQmJihkfHxlfHxmKT8hMTpiYyhhKX0sYmM9ZnVuY3Rpb24oYSl7aWYoYT49NDgmJmE8PTU3fHxhPj05NiYmYTw9MTA2fHxhPj02NSYmYTw9OTB8fHUmJmE9PTApcmV0dXJuITA7c3dpdGNoKGEpe2Nhc2UgMzI6Y2FzZSA0MzpjYXNlIDYzOmNhc2UgNjQ6Y2FzZSAxMDc6Y2FzZSAxMDk6Y2FzZSAxMTA6Y2FzZSAxMTE6Y2FzZSAxODY6Y2FzZSA1OTpjYXNlIDE4OTpjYXNlIDE4NzpjYXNlIDYxOmNhc2UgMTg4OmNhc2UgMTkwOmNhc2UgMTkxOmNhc2UgMTkyOmNhc2UgMjIyOmNhc2UgMjE5OmNhc2UgMjIwOmNhc2UgMjIxOmNhc2UgMTYzOmNhc2UgNTg6cmV0dXJuITA7CmNhc2UgMTczOmNhc2UgMTcxOnJldHVybiB0O2RlZmF1bHQ6cmV0dXJuITF9fSxjYz1mdW5jdGlvbihhKXtpZih0KWE9ZWMoYSk7ZWxzZSBpZih2JiZ1KXN3aXRjaChhKXtjYXNlIDkzOmE9OTF9cmV0dXJuIGF9LGVjPWZ1bmN0aW9uKGEpe3N3aXRjaChhKXtjYXNlIDYxOnJldHVybiAxODc7Y2FzZSA1OTpyZXR1cm4gMTg2O2Nhc2UgMTczOnJldHVybiAxODk7Y2FzZSAyMjQ6cmV0dXJuIDkxO2Nhc2UgMDpyZXR1cm4gMjI0O2RlZmF1bHQ6cmV0dXJuIGF9fTt2YXIgZmM9ZnVuY3Rpb24oYSxiLGMsZCl7ei5jYWxsKHRoaXMsZCk7dGhpcy50eXBlPSJrZXkiO3RoaXMuZz1hO3RoaXMucmVwZWF0PWN9O24oZmMseik7dmFyIEo9ZnVuY3Rpb24oYSxiKXtELmNhbGwodGhpcyk7YSYmZ2ModGhpcyxhLGIpfTtuKEosRCk7Zz1KLnByb3RvdHlwZTtnLlI9bnVsbDtnLnFhPW51bGw7Zy5KYT1udWxsO2cucmE9bnVsbDtnLkY9LTE7Zy5LPS0xO2cuRGE9ITE7CnZhciBoYz17MzoxMywxMjoxNDQsNjMyMzI6MzgsNjMyMzM6NDAsNjMyMzQ6MzcsNjMyMzU6MzksNjMyMzY6MTEyLDYzMjM3OjExMyw2MzIzODoxMTQsNjMyMzk6MTE1LDYzMjQwOjExNiw2MzI0MToxMTcsNjMyNDI6MTE4LDYzMjQzOjExOSw2MzI0NDoxMjAsNjMyNDU6MTIxLDYzMjQ2OjEyMiw2MzI0NzoxMjMsNjMyNDg6NDQsNjMyNzI6NDYsNjMyNzM6MzYsNjMyNzU6MzUsNjMyNzY6MzMsNjMyNzc6MzQsNjMyODk6MTQ0LDYzMzAyOjQ1fSxpYz17VXA6MzgsRG93bjo0MCxMZWZ0OjM3LFJpZ2h0OjM5LEVudGVyOjEzLEYxOjExMixGMjoxMTMsRjM6MTE0LEY0OjExNSxGNToxMTYsRjY6MTE3LEY3OjExOCxGODoxMTksRjk6MTIwLEYxMDoxMjEsRjExOjEyMixGMTI6MTIzLCJVKzAwN0YiOjQ2LEhvbWU6MzYsRW5kOjM1LFBhZ2VVcDozMyxQYWdlRG93bjozNCxJbnNlcnQ6NDV9LGpjPXYmJnQ7CkoucHJvdG90eXBlLmc9ZnVuY3Rpb24oYSl7dSYmKHRoaXMuRj09MTcmJiFhLmN0cmxLZXl8fHRoaXMuRj09MTgmJiFhLmFsdEtleXx8diYmdGhpcy5GPT05MSYmIWEubWV0YUtleSkmJih0aGlzLks9dGhpcy5GPS0xKTt0aGlzLkY9PS0xJiYoYS5jdHJsS2V5JiZhLmchPTE3P3RoaXMuRj0xNzphLmFsdEtleSYmYS5nIT0xOD90aGlzLkY9MTg6YS5tZXRhS2V5JiZhLmchPTkxJiYodGhpcy5GPTkxKSk7ZGMoYS5nLHRoaXMuRixhLnNoaWZ0S2V5LGEuY3RybEtleSxhLmFsdEtleSxhLm1ldGFLZXkpPyh0aGlzLks9Y2MoYS5nKSxqYyYmKHRoaXMuRGE9YS5hbHRLZXkpKTp0aGlzLmhhbmRsZUV2ZW50KGEpfTtKLnByb3RvdHlwZS5oPWZ1bmN0aW9uKGEpe3RoaXMuSz10aGlzLkY9LTE7dGhpcy5EYT1hLmFsdEtleX07CkoucHJvdG90eXBlLmhhbmRsZUV2ZW50PWZ1bmN0aW9uKGEpe3ZhciBiPWEuaCxjPWIuYWx0S2V5O2lmKHUmJmEudHlwZT09ImtleXByZXNzIil7dmFyIGQ9dGhpcy5LO3ZhciBlPWIuY2hhckNvZGU+PTAmJmIuY2hhckNvZGU8NjMyMzImJmJjKGQpP2IuY2hhckNvZGU6MH1lbHNlIGEudHlwZT09ImtleXByZXNzIj8oamMmJihjPXRoaXMuRGEpLGIua2V5Q29kZT09Yi5jaGFyQ29kZT9iLmtleUNvZGU8MzI/KGQ9Yi5rZXlDb2RlLGU9MCk6KGQ9dGhpcy5LLGU9Yi5jaGFyQ29kZSk6KGQ9Yi5rZXlDb2RlfHx0aGlzLkssZT1iLmNoYXJDb2RlfHwwKSk6KGQ9Yi5rZXlDb2RlfHx0aGlzLkssZT1iLmNoYXJDb2RlfHwwKSx2JiZlPT02MyYmZD09MjI0JiYoZD0xOTEpO3ZhciBmPWQ9Y2MoZCk7ZD9kPj02MzIzMiYmZCBpbiBoYz9mPWhjW2RdOmQ9PTI1JiZhLnNoaWZ0S2V5JiYoZj05KTpiLmtleUlkZW50aWZpZXImJmIua2V5SWRlbnRpZmllciBpbiBpYyYmKGY9aWNbYi5rZXlJZGVudGlmaWVyXSk7CmlmKCF0fHxhLnR5cGUhPSJrZXlwcmVzcyJ8fGRjKGYsdGhpcy5GLGEuc2hpZnRLZXksYS5jdHJsS2V5LGMsYS5tZXRhS2V5KSlhPWY9PXRoaXMuRix0aGlzLkY9ZixiPW5ldyBmYyhmLGUsYSxiKSxiLmFsdEtleT1jLEUodGhpcyxiKX07Si5wcm90b3R5cGUuaT1mdW5jdGlvbigpe3JldHVybiB0aGlzLlJ9O3ZhciBnYz1mdW5jdGlvbihhLGIsYyl7YS5yYSYma2MoYSk7YS5SPWI7YS5xYT11YihhLlIsImtleXByZXNzIixhLGMpO2EuSmE9dWIoYS5SLCJrZXlkb3duIixhLmcsYyxhKTthLnJhPXViKGEuUiwia2V5dXAiLGEuaCxjLGEpfSxrYz1mdW5jdGlvbihhKXthLnFhJiYoQShhLnFhKSxBKGEuSmEpLEEoYS5yYSksYS5xYT1udWxsLGEuSmE9bnVsbCxhLnJhPW51bGwpO2EuUj1udWxsO2EuRj0tMTthLks9LTF9O0oucHJvdG90eXBlLkM9ZnVuY3Rpb24oKXtKLmwuQy5jYWxsKHRoaXMpO2tjKHRoaXMpfTt2YXIgSz17Z2E6Im1vdXNlZG93biIsaGE6Im1vdXNldXAiLGZhOiJtb3VzZWNhbmNlbCIsc2M6Im1vdXNlbW92ZSIsdWM6Im1vdXNlb3ZlciIsdGM6Im1vdXNlb3V0IixxYzoibW91c2VlbnRlciIscmM6Im1vdXNlbGVhdmUifTt2YXIgbGM9ZnVuY3Rpb24oYSl7cmV0dXJuIHR5cGVvZiBhLmNsYXNzTmFtZT09InN0cmluZyI/YS5jbGFzc05hbWU6YS5nZXRBdHRyaWJ1dGUmJmEuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIn0sTD1mdW5jdGlvbihhKXtyZXR1cm4gYS5jbGFzc0xpc3Q/YS5jbGFzc0xpc3Q6bGMoYSkubWF0Y2goL1xTKy9nKXx8W119LG1jPWZ1bmN0aW9uKGEsYil7dHlwZW9mIGEuY2xhc3NOYW1lPT0ic3RyaW5nIj9hLmNsYXNzTmFtZT1iOmEuc2V0QXR0cmlidXRlJiZhLnNldEF0dHJpYnV0ZSgiY2xhc3MiLGIpfSxuYz1mdW5jdGlvbihhLGIpe2EuY2xhc3NMaXN0P2I9YS5jbGFzc0xpc3QuY29udGFpbnMoYik6KGE9TChhKSxiPXZhKGEsYik+PTApO3JldHVybiBifSxvYz1mdW5jdGlvbihhLGIpe2lmKGEuY2xhc3NMaXN0KWEuY2xhc3NMaXN0LmFkZChiKTtlbHNlIGlmKCFuYyhhLGIpKXt2YXIgYz1sYyhhKTttYyhhLGMrKGMubGVuZ3RoPjA/IiAiK2I6YikpfX0scGM9ZnVuY3Rpb24oYSxiKXtpZihhLmNsYXNzTGlzdClBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGIsCmZ1bmN0aW9uKGUpe29jKGEsZSl9KTtlbHNle3ZhciBjPXt9O0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoTChhKSxmdW5jdGlvbihlKXtjW2VdPSEwfSk7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChiLGZ1bmN0aW9uKGUpe2NbZV09ITB9KTtiPSIiO2Zvcih2YXIgZCBpbiBjKWIrPWIubGVuZ3RoPjA/IiAiK2Q6ZDttYyhhLGIpfX0scWM9ZnVuY3Rpb24oYSxiKXthLmNsYXNzTGlzdD9hLmNsYXNzTGlzdC5yZW1vdmUoYik6bmMoYSxiKSYmbWMoYSxBcnJheS5wcm90b3R5cGUuZmlsdGVyLmNhbGwoTChhKSxmdW5jdGlvbihjKXtyZXR1cm4gYyE9Yn0pLmpvaW4oIiAiKSl9LHJjPWZ1bmN0aW9uKGEsYil7YS5jbGFzc0xpc3Q/QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChiLGZ1bmN0aW9uKGMpe3FjKGEsYyl9KTptYyhhLEFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbChMKGEpLGZ1bmN0aW9uKGMpe3JldHVybiEodmEoYixjKT49MCl9KS5qb2luKCIgIikpfTt2YXIgdGM9ZnVuY3Rpb24oYSxiKXtpZighYSl0aHJvdyBFcnJvcigiSW52YWxpZCBjbGFzcyBuYW1lICIrYSk7aWYodHlwZW9mIGIhPT0iZnVuY3Rpb24iKXRocm93IEVycm9yKCJJbnZhbGlkIGRlY29yYXRvciBmdW5jdGlvbiAiK2IpO3NjW2FdPWJ9LHVjPXt9LHNjPXt9O3ZhciB2Yz1mdW5jdGlvbihhKXt0aGlzLkE9YX07aWEodmMpO3ZhciB3Yz1mdW5jdGlvbihhLGIpe2EmJihhLnRhYkluZGV4PWI/MDotMSl9LHljPWZ1bmN0aW9uKGEsYixjKXtjLmlkJiZQYihiLGMuaWQpO3ZhciBkPWEuZygpLGU9ITEsZj1MKGMpO2YmJkFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoZixmdW5jdGlvbihoKXtoPT1kP2U9ITA6aCYmdGhpcy51KGIsaCxkKX0sYSk7ZXx8b2MoYyxkKTt4YyhiLGMpO3JldHVybiBjfTt2Yy5wcm90b3R5cGUudT1mdW5jdGlvbihhLGIsYyl7Yj09YysiLWRpc2FibGVkIj9hLlgoITEpOmI9PWMrIi1ob3Jpem9udGFsIj96YyhhLCJob3Jpem9udGFsIik6Yj09YysiLXZlcnRpY2FsIiYmemMoYSwidmVydGljYWwiKX07CnZhciB4Yz1mdW5jdGlvbihhLGIpe2lmKGIpZm9yKHZhciBjPWIuZmlyc3RDaGlsZCxkO2MmJmMucGFyZW50Tm9kZT09Yjspe2Q9Yy5uZXh0U2libGluZztpZihjLm5vZGVUeXBlPT0xKXthOnt2YXIgZT1jO3AoZSk7ZT1MKGUpO2Zvcih2YXIgZj1lLmxlbmd0aCxoPTA7aDxmO2grKyl7dmFyIGs9ZVtoXTtpZihrPWsgaW4gc2M/c2Nba10oKTpudWxsKXtlPWs7YnJlYWsgYX19ZT1udWxsfWUmJihlLmc9YyxhLmlzRW5hYmxlZCgpfHxlLlgoITEpLGEuQmEoZSksU2IoZSxjKSl9ZWxzZSBjLm5vZGVWYWx1ZSYmSGEoYy5ub2RlVmFsdWUpIT0iInx8Yi5yZW1vdmVDaGlsZChjKTtjPWR9fSxBYz1mdW5jdGlvbihhLGIpe2I9Yi5pKCk7cChiLCJUaGUgY29udGFpbmVyIERPTSBlbGVtZW50IGNhbm5vdCBiZSBudWxsLiIpO0tiKGIsdCk7KGE9YS5BKSYmWmIoYixhKX07dmMucHJvdG90eXBlLmc9ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy1jb250YWluZXIifTsKdmMucHJvdG90eXBlLmo9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nKCksYz1bYixhLkw9PSJob3Jpem9udGFsIj9iKyItaG9yaXpvbnRhbCI6YisiLXZlcnRpY2FsIl07YS5pc0VuYWJsZWQoKXx8Yy5wdXNoKGIrIi1kaXNhYmxlZCIpO3JldHVybiBjfTt2YXIgQmM9ZnVuY3Rpb24oKXt9O3ZhciBNPWZ1bmN0aW9uKCl7fSxDYztpYShNKTt2YXIgRGM9e2J1dHRvbjoicHJlc3NlZCIsY2hlY2tib3g6ImNoZWNrZWQiLG1lbnVpdGVtOiJzZWxlY3RlZCIsbWVudWl0ZW1jaGVja2JveDoiY2hlY2tlZCIsbWVudWl0ZW1yYWRpbzoiY2hlY2tlZCIscmFkaW86ImNoZWNrZWQiLHRhYjoic2VsZWN0ZWQiLHRyZWVpdGVtOiJzZWxlY3RlZCJ9O00ucHJvdG90eXBlLk5hPWZ1bmN0aW9uKCl7fTtNLnByb3RvdHlwZS54YT1mdW5jdGlvbihhKXt2YXIgYj1hLkcsYz1iLmgsZD10aGlzLk4oKSxlPVtkXSxmPXRoaXMuTigpO2YhPWQmJmUucHVzaChmKTtkPWEubTtmb3IoZj1bXTtkOyl7dmFyIGg9ZCYtZDtmLnB1c2goRWModGhpcyxoKSk7ZCY9fmh9ZS5wdXNoLmFwcGx5KGUsZik7KGQ9YS5GYSkmJmUucHVzaC5hcHBseShlLGQpO3JldHVybiBjLmNhbGwoYiwiRElWIixlLmpvaW4oIiAiKSxhLmlhKX07Ck0ucHJvdG90eXBlLnlhPWZ1bmN0aW9uKGEsYil7Yi5pZCYmUGIoYSxiLmlkKTtiJiZiLmZpcnN0Q2hpbGQ/RmMoYSxiLmZpcnN0Q2hpbGQubmV4dFNpYmxpbmc/eWEoYi5jaGlsZE5vZGVzKTpiLmZpcnN0Q2hpbGQpOmEuaWE9bnVsbDt2YXIgYz0wLGQ9dGhpcy5OKCksZT10aGlzLk4oKSxmPSExLGg9ITEsaz15YShMKGIpKTtrLmZvckVhY2goZnVuY3Rpb24ocSl7Znx8cSE9ZD9ofHxxIT1lP2N8PUdjKHRoaXMscSk6aD0hMDooZj0hMCxlPT1kJiYoaD0hMCkpO0djKHRoaXMscSk9PTEmJihzYShiKSxkYihiKSYmZWIoYikmJmNiKGIsITEpKX0sdGhpcyk7YS5tPWM7Znx8KGsucHVzaChkKSxlPT1kJiYoaD0hMCkpO2h8fGsucHVzaChlKTsoYT1hLkZhKSYmay5wdXNoLmFwcGx5KGssYSk7ZiYmaCYmIWF8fG1jKGIsay5qb2luKCIgIikpO3JldHVybiBifTsKdmFyIEhjPWZ1bmN0aW9uKGEsYil7aWYoYT1hLk5hKCkpe3AoYiwiVGhlIGVsZW1lbnQgcGFzc2VkIGFzIGEgZmlyc3QgcGFyYW1ldGVyIGNhbm5vdCBiZSBudWxsLiIpO3ZhciBjPWIuZ2V0QXR0cmlidXRlKCJyb2xlIil8fG51bGw7YSE9YyYmWmIoYixhKX19LEljPWZ1bmN0aW9uKGEsYil7dmFyIGM7aWYoYS5EJjMyJiYoYz1hLmkoKSkpe2lmKCFiJiZhLm0mMzIpe3RyeXtjLmJsdXIoKX1jYXRjaChkKXt9YS5tJjMyJiZhLlFhKG51bGwpfShkYihjKSYmZWIoYykpIT1iJiZjYihjLGIpfX0sSmM9ZnVuY3Rpb24oYSxiLGMpe0NjfHwoQ2M9ezE6ImRpc2FibGVkIiw4OiJzZWxlY3RlZCIsMTY6ImNoZWNrZWQiLDY0OiJleHBhbmRlZCJ9KTtwKGEsIlRoZSBlbGVtZW50IHBhc3NlZCBhcyBhIGZpcnN0IHBhcmFtZXRlciBjYW5ub3QgYmUgbnVsbC4iKTtiPUNjW2JdO3ZhciBkPWEuZ2V0QXR0cmlidXRlKCJyb2xlIil8fG51bGw7ZCYmKGQ9RGNbZF18fGIsYj1iPT0iY2hlY2tlZCJ8fGI9PQoic2VsZWN0ZWQiP2Q6Yik7YiYmYWMoYSxiLGMpfTtNLnByb3RvdHlwZS5OPWZ1bmN0aW9uKCl7cmV0dXJuImdvb2ctY29udHJvbCJ9O3ZhciBFYz1mdW5jdGlvbihhLGIpe2EuZ3x8S2MoYSk7cmV0dXJuIGEuZ1tiXX0sR2M9ZnVuY3Rpb24oYSxiKXthLmh8fChhLmd8fEtjKGEpLGEuaD1FYShhLmcpKTthPXBhcnNlSW50KGEuaFtiXSwxMCk7cmV0dXJuIGlzTmFOKGEpPzA6YX0sS2M9ZnVuY3Rpb24oYSl7dmFyIGI9YS5OKCk7dmFyIGM9Yi5yZXBsYWNlKC9ceGEwfFxzL2csIiAiKS5pbmRleE9mKCIgIikhPS0xO3AoIWMsIkNvbnRyb2xSZW5kZXJlciBoYXMgYW4gaW52YWxpZCBjc3MgY2xhc3M6ICciK2IrIiciKTthLmc9ezE6YisiLWRpc2FibGVkIiwyOmIrIi1ob3ZlciIsNDpiKyItYWN0aXZlIiw4OmIrIi1zZWxlY3RlZCIsMTY6YisiLWNoZWNrZWQiLDMyOmIrIi1mb2N1c2VkIiw2NDpiKyItb3BlbiJ9fTt2YXIgTj1mdW5jdGlvbihhLGIsYyl7Ri5jYWxsKHRoaXMsYyk7aWYoIWIpe2ZvcihiPXRoaXMuY29uc3RydWN0b3I7Yjspe3ZhciBkPW5hKGIpO2lmKGQ9dWNbZF0pYnJlYWs7Yj0oYj1PYmplY3QuZ2V0UHJvdG90eXBlT2YoYi5wcm90b3R5cGUpKSYmYi5jb25zdHJ1Y3Rvcn1iPWQ/dHlwZW9mIGQuVj09PSJmdW5jdGlvbiI/ZC5WKCk6bmV3IGQ6bnVsbH10aGlzLnY9Yjt0aGlzLmlhPWEhPT12b2lkIDA/YTpudWxsfTtuKE4sRik7Zz1OLnByb3RvdHlwZTtnLmlhPW51bGw7Zy5tPTA7Zy5EPTM5O2cuUD0wO2cuT2E9ITA7Zy5GYT1udWxsO2cuSGE9ITA7Zy5tYT1mdW5jdGlvbigpe3ZhciBhPXRoaXMudi54YSh0aGlzKTt0aGlzLmc9YTtIYyh0aGlzLnYsYSk7S2IoYSwhMCk7dGhpcy5pc1Zpc2libGUoKXx8KGEuc3R5bGUuZGlzcGxheT0ibm9uZSIsYSYmYWMoYSwiaGlkZGVuIiwhMCkpfTtnLm5hPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaSgpfTtnLndhPWZ1bmN0aW9uKCl7cmV0dXJuITB9OwpnLkVhPWZ1bmN0aW9uKGEpe3RoaXMuZz1hPXRoaXMudi55YSh0aGlzLGEpO0hjKHRoaXMudixhKTtLYihhLCEwKTt0aGlzLk9hPWEuc3R5bGUuZGlzcGxheSE9Im5vbmUifTsKZy5JPWZ1bmN0aW9uKCl7Ti5sLkkuY2FsbCh0aGlzKTt2YXIgYT10aGlzLmc7cChhLCJDYW4gbm90IGNhbGwgZ2V0RWxlbWVudFN0cmljdCBiZWZvcmUgcmVuZGVyaW5nL2RlY29yYXRpbmcuIik7cCh0aGlzKTtwKGEpO3RoaXMuaXNWaXNpYmxlKCl8fGFjKGEsImhpZGRlbiIsIXRoaXMuaXNWaXNpYmxlKCkpO3RoaXMuaXNFbmFibGVkKCl8fEpjKGEsMSwhdGhpcy5pc0VuYWJsZWQoKSk7dGhpcy5EJjgmJkpjKGEsOCwhISh0aGlzLm0mOCkpO3RoaXMuRCYxNiYmSmMoYSwxNiwhISh0aGlzLm0mMTYpKTt0aGlzLkQmNjQmJkpjKGEsNjQsISEodGhpcy5tJjY0KSk7dmFyIGI9dGhpcy52O1ViKHRoaXMpJiYoYT10aGlzLmkoKSxiPWIuTigpKyItcnRsIiwoYT1hLmk/YS5pKCk6YSkmJnBjKGEsW2JdKSk7dGhpcy5pc0VuYWJsZWQoKSYmSWModGhpcyx0aGlzLmlzVmlzaWJsZSgpKTt0aGlzLkQmLTImJih0aGlzLkhhJiZMYyh0aGlzLCEwKSx0aGlzLkQmMzImJihhPXRoaXMuaSgpKSkmJihiPQp0aGlzLlp8fCh0aGlzLlo9bmV3IEopLGdjKGIsYSksQihCKEIoUWIodGhpcyksYiwia2V5Iix0aGlzLmFhKSxhLCJmb2N1cyIsdGhpcy5YYSksYSwiYmx1ciIsdGhpcy5RYSkpfTt2YXIgTGM9ZnVuY3Rpb24oYSxiKXt2YXIgYz1RYihhKSxkPWEuaSgpO2I/KEIoQihCKEIoYyxkLEsuZ2EsYS5zYSksZCxbSy5oYSxLLmZhXSxhLnZhKSxkLCJtb3VzZW92ZXIiLGEudWEpLGQsIm1vdXNlb3V0IixhLnRhKSxhLmNhIT1CYyYmQihjLGQsImNvbnRleHRtZW51IixhLmNhKSk6KEMoQyhDKEMoYyxkLEsuZ2EsYS5zYSksZCxbSy5oYSxLLmZhXSxhLnZhKSxkLCJtb3VzZW92ZXIiLGEudWEpLGQsIm1vdXNlb3V0IixhLnRhKSxhLmNhIT1CYyYmQyhjLGQsImNvbnRleHRtZW51IixhLmNhKSl9O04ucHJvdG90eXBlLlU9ZnVuY3Rpb24oKXtOLmwuVS5jYWxsKHRoaXMpO3RoaXMuWiYma2ModGhpcy5aKTt0aGlzLmlzVmlzaWJsZSgpJiZ0aGlzLmlzRW5hYmxlZCgpJiZJYyh0aGlzLCExKX07Ck4ucHJvdG90eXBlLkM9ZnVuY3Rpb24oKXtOLmwuQy5jYWxsKHRoaXMpO3RoaXMuWiYmKHRoaXMuWi5kaXNwb3NlKCksZGVsZXRlIHRoaXMuWik7ZGVsZXRlIHRoaXMudjt0aGlzLkZhPXRoaXMuaWE9bnVsbH07dmFyIEZjPWZ1bmN0aW9uKGEsYil7YS5pYT1ifTtOLnByb3RvdHlwZS5pc1Zpc2libGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5PYX07Ti5wcm90b3R5cGUuaXNFbmFibGVkPWZ1bmN0aW9uKCl7cmV0dXJuISh0aGlzLm0mMSl9O04ucHJvdG90eXBlLlg9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5oO2ImJnR5cGVvZiBiLmlzRW5hYmxlZD09ImZ1bmN0aW9uIiYmIWIuaXNFbmFibGVkKCl8fCFPKHRoaXMsMSwhYSl8fChhfHwoTWModGhpcywhMSksUCh0aGlzLCExKSksdGhpcy5pc1Zpc2libGUoKSYmSWModGhpcyxhKSxUKHRoaXMsMSwhYSwhMCkpfTt2YXIgUD1mdW5jdGlvbihhLGIpe08oYSwyLGIpJiZUKGEsMixiKX07Ck4ucHJvdG90eXBlLmlzQWN0aXZlPWZ1bmN0aW9uKCl7cmV0dXJuISEodGhpcy5tJjQpfTsKdmFyIE1jPWZ1bmN0aW9uKGEsYil7TyhhLDQsYikmJlQoYSw0LGIpfSxOYz1mdW5jdGlvbihhLGIpe08oYSw4LGIpJiZUKGEsOCxiKX0sT2M9ZnVuY3Rpb24oYSxiKXtPKGEsNjQsYikmJlQoYSw2NCxiKX0sVD1mdW5jdGlvbihhLGIsYyxkKXtpZighZCYmYj09MSlhLlgoIWMpO2Vsc2UgaWYoYS5EJmImJmMhPSEhKGEubSZiKSl7dmFyIGU9YS52O2lmKGQ9YS5pKCkpe2lmKGU9RWMoZSxiKSl7dmFyIGY9YS5pP2EuaSgpOmE7ZiYmKGM/cGM6cmMpKGYsW2VdKX1KYyhkLGIsYyl9YS5tPWM/YS5tfGI6YS5tJn5ifX0sUGM9ZnVuY3Rpb24oYSxiLGMpe2lmKGEucyYmYS5tJmImJiFjKXRocm93IEVycm9yKCJDb21wb25lbnQgYWxyZWFkeSByZW5kZXJlZCIpOyFjJiZhLm0mYiYmVChhLGIsITEpO2EuRD1jP2EuRHxiOmEuRCZ+Yn0sVT1mdW5jdGlvbihhLGIpe3JldHVybiEhKDI1NSZiKSYmISEoYS5EJmIpfSxPPWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4hIShhLkQmYikmJiEhKGEubSZiKSE9CmMmJighKGEuUCZiKXx8RShhLE5iKGIsYykpKSYmIWEuYmF9O04ucHJvdG90eXBlLnVhPWZ1bmN0aW9uKGEpeyFRYyhhLHRoaXMuaSgpKSYmRSh0aGlzLCJlbnRlciIpJiZ0aGlzLmlzRW5hYmxlZCgpJiZVKHRoaXMsMikmJlAodGhpcywhMCl9O04ucHJvdG90eXBlLnRhPWZ1bmN0aW9uKGEpeyFRYyhhLHRoaXMuaSgpKSYmRSh0aGlzLCJsZWF2ZSIpJiYoVSh0aGlzLDQpJiZNYyh0aGlzLCExKSxVKHRoaXMsMikmJlAodGhpcywhMSkpfTtOLnByb3RvdHlwZS5jYT1CYzt2YXIgUWM9ZnVuY3Rpb24oYSxiKXtyZXR1cm4hIWEucmVsYXRlZFRhcmdldCYmYWIoYixhLnJlbGF0ZWRUYXJnZXQpfTsKTi5wcm90b3R5cGUuc2E9ZnVuY3Rpb24oYSl7aWYodGhpcy5pc0VuYWJsZWQoKSYmKFUodGhpcywyKSYmUCh0aGlzLCEwKSwhKGEuaC5idXR0b24hPTB8fHYmJmEuY3RybEtleSkpKXtVKHRoaXMsNCkmJk1jKHRoaXMsITApO3ZhciBiO2lmKGI9dGhpcy52KXt2YXIgYztiPXRoaXMuRCYzMiYmKGM9dGhpcy5pKCkpP2RiKGMpJiZlYihjKTohMX1iJiZ0aGlzLmkoKS5mb2N1cygpfWEuaC5idXR0b24hPTB8fHYmJmEuY3RybEtleXx8YS5qKCl9O04ucHJvdG90eXBlLnZhPWZ1bmN0aW9uKGEpe3RoaXMuaXNFbmFibGVkKCkmJihVKHRoaXMsMikmJlAodGhpcywhMCksdGhpcy5pc0FjdGl2ZSgpJiZSYyh0aGlzLGEpJiZVKHRoaXMsNCkmJk1jKHRoaXMsITEpKX07CnZhciBSYz1mdW5jdGlvbihhLGIpe2lmKFUoYSwxNikpe3ZhciBjPSEoYS5tJjE2KTtPKGEsMTYsYykmJlQoYSwxNixjKX1VKGEsOCkmJk5jKGEsITApO1UoYSw2NCkmJk9jKGEsIShhLm0mNjQpKTtjPW5ldyB5KCJhY3Rpb24iLGEpO2ImJihjLmFsdEtleT1iLmFsdEtleSxjLmN0cmxLZXk9Yi5jdHJsS2V5LGMubWV0YUtleT1iLm1ldGFLZXksYy5zaGlmdEtleT1iLnNoaWZ0S2V5LGMuRz1iLkcsYy50aW1lU3RhbXA9Yi50aW1lU3RhbXApO3JldHVybiBFKGEsYyl9O04ucHJvdG90eXBlLlhhPWZ1bmN0aW9uKCl7VSh0aGlzLDMyKSYmTyh0aGlzLDMyLCEwKSYmVCh0aGlzLDMyLCEwKX07Ti5wcm90b3R5cGUuUWE9ZnVuY3Rpb24oKXtVKHRoaXMsNCkmJk1jKHRoaXMsITEpO1UodGhpcywzMikmJk8odGhpcywzMiwhMSkmJlQodGhpcywzMiwhMSl9OwpOLnByb3RvdHlwZS5hYT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5pc1Zpc2libGUoKSYmdGhpcy5pc0VuYWJsZWQoKSYmYS5nPT0xMyYmUmModGhpcyxhKT8oYS5qKCksYS52KCksITApOiExfTtpZih0eXBlb2YgTiE9PSJmdW5jdGlvbiIpdGhyb3cgRXJyb3IoIkludmFsaWQgY29tcG9uZW50IGNsYXNzICIrTik7aWYodHlwZW9mIE0hPT0iZnVuY3Rpb24iKXRocm93IEVycm9yKCJJbnZhbGlkIHJlbmRlcmVyIGNsYXNzICIrTSk7dmFyIFNjPW5hKE4pO3VjW1NjXT1NO3RjKCJnb29nLWNvbnRyb2wiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBOKG51bGwpfSk7dmFyIFY9ZnVuY3Rpb24oYSxiLGMpe0YuY2FsbCh0aGlzLGMpO3RoaXMuZWE9Ynx8dmMuVigpO3RoaXMuTD1hfHwidmVydGljYWwifTtuKFYsRik7Zz1WLnByb3RvdHlwZTtnLkthPW51bGw7Zy5kYT1udWxsO2cuZWE9bnVsbDtnLkw9bnVsbDtnLlM9ITA7Zy5UPSEwO2cubz0tMTtnLkI9bnVsbDtnLlc9ITE7Zy5PPW51bGw7dmFyIFRjPWZ1bmN0aW9uKGEpe3JldHVybiBhLkthfHxhLmkoKX07Zz1WLnByb3RvdHlwZTtnLm1hPWZ1bmN0aW9uKCl7dGhpcy5nPXRoaXMuRy5oKCJESVYiLHRoaXMuZWEuaih0aGlzKS5qb2luKCIgIikpfTtnLm5hPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaSgpfTtnLndhPWZ1bmN0aW9uKGEpe3JldHVybiBhLnRhZ05hbWU9PSJESVYifTtnLkVhPWZ1bmN0aW9uKGEpe3RoaXMuZz15Yyh0aGlzLmVhLHRoaXMsYSk7YS5zdHlsZS5kaXNwbGF5PT0ibm9uZSImJih0aGlzLlM9ITEpfTsKZy5JPWZ1bmN0aW9uKCl7Vi5sLkkuY2FsbCh0aGlzKTtUYih0aGlzLGZ1bmN0aW9uKGIpe2IucyYmVWModGhpcyxiKX0sdGhpcyk7dmFyIGE9dGhpcy5pKCk7QWModGhpcy5lYSx0aGlzKTtWYyh0aGlzLHRoaXMuUyk7QihCKEIoQihCKEIoQihCKFFiKHRoaXMpLHRoaXMsImVudGVyIix0aGlzLmViKSx0aGlzLCJoaWdobGlnaHQiLHRoaXMuZmIpLHRoaXMsInVuaGlnaGxpZ2h0Iix0aGlzLmxiKSx0aGlzLCJvcGVuIix0aGlzLmdiKSx0aGlzLCJjbG9zZSIsdGhpcy5iYiksYSxLLmdhLHRoaXMuV2EpLGJiKGEpLFtLLmhhLEsuZmFdLHRoaXMuY2IpLGEsW0suZ2EsSy5oYSxLLmZhLCJtb3VzZW92ZXIiLCJtb3VzZW91dCIsImNvbnRleHRtZW51Il0sdGhpcy5hYik7V2ModGhpcyl9O3ZhciBXYz1mdW5jdGlvbihhKXt2YXIgYj1RYihhKSxjPVRjKGEpO0IoQihCKGIsYywiZm9jdXMiLGEuUGEpLGMsImJsdXIiLGEuVWEpLGEuZGF8fChhLmRhPW5ldyBKKFRjKGEpKSksImtleSIsYS5WYSl9OwpnPVYucHJvdG90eXBlO2cuVT1mdW5jdGlvbigpe1hjKHRoaXMsLTEpO3RoaXMuQiYmT2ModGhpcy5CLCExKTt0aGlzLlc9ITE7Vi5sLlUuY2FsbCh0aGlzKX07Zy5DPWZ1bmN0aW9uKCl7Vi5sLkMuY2FsbCh0aGlzKTt0aGlzLmRhJiYodGhpcy5kYS5kaXNwb3NlKCksdGhpcy5kYT1udWxsKTt0aGlzLmVhPXRoaXMuQj10aGlzLk89dGhpcy5LYT1udWxsfTtnLmViPWZ1bmN0aW9uKCl7cmV0dXJuITB9OwpnLmZiPWZ1bmN0aW9uKGEpe3ZhciBiPVZiKHRoaXMsYS50YXJnZXQpO2lmKGI+LTEmJmIhPXRoaXMubyl7dmFyIGM9SSh0aGlzLHRoaXMubyk7YyYmUChjLCExKTt0aGlzLm89YjtjPUkodGhpcyx0aGlzLm8pO3RoaXMuVyYmTWMoYywhMCk7dGhpcy5CJiZjIT10aGlzLkImJihjLkQmNjQ/T2MoYywhMCk6T2ModGhpcy5CLCExKSl9Yj10aGlzLmkoKTtwKGIsIlRoZSBET00gZWxlbWVudCBmb3IgdGhlIGNvbnRhaW5lciBjYW5ub3QgYmUgbnVsbC4iKTthLnRhcmdldC5pKCkhPW51bGwmJmFjKGIsImFjdGl2ZWRlc2NlbmRhbnQiLGEudGFyZ2V0LmkoKS5pZCl9O2cubGI9ZnVuY3Rpb24oYSl7YS50YXJnZXQ9PUkodGhpcyx0aGlzLm8pJiYodGhpcy5vPS0xKTthPXRoaXMuaSgpO3AoYSwiVGhlIERPTSBlbGVtZW50IGZvciB0aGUgY29udGFpbmVyIGNhbm5vdCBiZSBudWxsLiIpO2EucmVtb3ZlQXR0cmlidXRlKCRiKCJhY3RpdmVkZXNjZW5kYW50IikpfTsKZy5nYj1mdW5jdGlvbihhKXsoYT1hLnRhcmdldCkmJmEhPXRoaXMuQiYmYS5oPT10aGlzJiYodGhpcy5CJiZPYyh0aGlzLkIsITEpLHRoaXMuQj1hKX07Zy5iYj1mdW5jdGlvbihhKXthLnRhcmdldD09dGhpcy5CJiYodGhpcy5CPW51bGwpO3ZhciBiPXRoaXMuaSgpLGM9YS50YXJnZXQuaSgpO2ImJmEudGFyZ2V0Lm0mMiYmYyYmKGE9IiIsYyYmKGE9Yy5pZCxwKGEsIlRoZSBhY3RpdmUgZWxlbWVudCBzaG91bGQgaGF2ZSBhbiBpZC4iKSksYWMoYiwiYWN0aXZlZGVzY2VuZGFudCIsYSkpfTtnLldhPWZ1bmN0aW9uKGEpe3RoaXMuVCYmKHRoaXMuVz0hMCk7dmFyIGI9VGModGhpcyk7YiYmZGIoYikmJmViKGIpP2IuZm9jdXMoKTphLmooKX07Zy5jYj1mdW5jdGlvbigpe3RoaXMuVz0hMX07CmcuYWI9ZnVuY3Rpb24oYSl7YTp7dmFyIGI9YS50YXJnZXQ7aWYodGhpcy5PKWZvcih2YXIgYz10aGlzLmkoKTtiJiZiIT09Yzspe3ZhciBkPWIuaWQ7aWYoZCBpbiB0aGlzLk8pe2I9dGhpcy5PW2RdO2JyZWFrIGF9Yj1iLnBhcmVudE5vZGV9Yj1udWxsfWlmKGIpc3dpdGNoKGEudHlwZSl7Y2FzZSBLLmdhOmIuc2EoYSk7YnJlYWs7Y2FzZSBLLmhhOmNhc2UgSy5mYTpiLnZhKGEpO2JyZWFrO2Nhc2UgIm1vdXNlb3ZlciI6Yi51YShhKTticmVhaztjYXNlICJtb3VzZW91dCI6Yi50YShhKTticmVhaztjYXNlICJjb250ZXh0bWVudSI6Yi5jYShhKX19O2cuUGE9ZnVuY3Rpb24oKXt9O2cuVWE9ZnVuY3Rpb24oKXtYYyh0aGlzLC0xKTt0aGlzLlc9ITE7dGhpcy5CJiZPYyh0aGlzLkIsITEpfTsKZy5WYT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5pc0VuYWJsZWQoKSYmdGhpcy5pc1Zpc2libGUoKSYmKEgodGhpcykhPTB8fHRoaXMuS2EpJiZZYyh0aGlzLGEpPyhhLmooKSxhLnYoKSwhMCk6ITF9Owp2YXIgWWM9ZnVuY3Rpb24oYSxiKXt2YXIgYz1JKGEsYS5vKTtpZihjJiZ0eXBlb2YgYy5hYT09ImZ1bmN0aW9uIiYmYy5hYShiKXx8YS5CJiZhLkIhPWMmJnR5cGVvZiBhLkIuYWE9PSJmdW5jdGlvbiImJmEuQi5hYShiKSlyZXR1cm4hMDtpZihiLnNoaWZ0S2V5fHxiLmN0cmxLZXl8fGIubWV0YUtleXx8Yi5hbHRLZXkpcmV0dXJuITE7c3dpdGNoKGIuZyl7Y2FzZSAyNzpUYyhhKS5ibHVyKCk7YnJlYWs7Y2FzZSAzNjpaYyhhKTticmVhaztjYXNlIDM1OiRjKGEpO2JyZWFrO2Nhc2UgMzg6aWYoYS5MPT0idmVydGljYWwiKWFkKGEpO2Vsc2UgcmV0dXJuITE7YnJlYWs7Y2FzZSAzNzppZihhLkw9PSJob3Jpem9udGFsIilVYihhKT9iZChhKTphZChhKTtlbHNlIHJldHVybiExO2JyZWFrO2Nhc2UgNDA6aWYoYS5MPT0idmVydGljYWwiKWJkKGEpO2Vsc2UgcmV0dXJuITE7YnJlYWs7Y2FzZSAzOTppZihhLkw9PSJob3Jpem9udGFsIilVYihhKT9hZChhKTpiZChhKTtlbHNlIHJldHVybiExOwpicmVhaztkZWZhdWx0OnJldHVybiExfXJldHVybiEwfSxVYz1mdW5jdGlvbihhLGIpe3ZhciBjPWIuaSgpO2M9Yy5pZHx8KGMuaWQ9T2IoYikpO2EuT3x8KGEuTz17fSk7YS5PW2NdPWJ9O1YucHJvdG90eXBlLkJhPWZ1bmN0aW9uKGEsYil7dWEoYSxOLCJUaGUgY2hpbGQgb2YgYSBjb250YWluZXIgbXVzdCBiZSBhIGNvbnRyb2wiKTtWLmwuQmEuY2FsbCh0aGlzLGEsYil9O1YucHJvdG90eXBlLkNhPWZ1bmN0aW9uKGEsYixjKXt1YShhLE4pO2EuUHw9MjthLlB8PTY0O1BjKGEsMzIsITEpO2EucyYmMCE9YS5IYSYmTGMoYSwhMSk7YS5IYT0hMTt2YXIgZD1hLmg9PXRoaXM/VmIodGhpcyxhKTotMTtWLmwuQ2EuY2FsbCh0aGlzLGEsYixjKTthLnMmJnRoaXMucyYmVWModGhpcyxhKTthPWQ7YT09LTEmJihhPUgodGhpcykpO2E9PXRoaXMubz90aGlzLm89TWF0aC5taW4oSCh0aGlzKS0xLGIpOmE+dGhpcy5vJiZiPD10aGlzLm8/dGhpcy5vKys6YTx0aGlzLm8mJmI+dGhpcy5vJiZ0aGlzLm8tLX07CnZhciB6Yz1mdW5jdGlvbihhLGIpe2lmKGEuaSgpKXRocm93IEVycm9yKCJDb21wb25lbnQgYWxyZWFkeSByZW5kZXJlZCIpO2EuTD1ifTtWLnByb3RvdHlwZS5pc1Zpc2libGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5TfTt2YXIgVmM9ZnVuY3Rpb24oYSxiKXthLlM9Yjt2YXIgYz1hLmkoKTtjJiYoYy5zdHlsZS5kaXNwbGF5PWI/IiI6Im5vbmUiLHdjKFRjKGEpLGEuVCYmYS5TKSl9O1YucHJvdG90eXBlLmlzRW5hYmxlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLlR9O1YucHJvdG90eXBlLlg9ZnVuY3Rpb24oYSl7dGhpcy5UIT1hJiZFKHRoaXMsYT8iZW5hYmxlIjoiZGlzYWJsZSIpJiYoYT8odGhpcy5UPSEwLFRiKHRoaXMsZnVuY3Rpb24oYil7Yi5UYT9kZWxldGUgYi5UYTpiLlgoITApfSkpOihUYih0aGlzLGZ1bmN0aW9uKGIpe2IuaXNFbmFibGVkKCk/Yi5YKCExKTpiLlRhPSEwfSksdGhpcy5XPXRoaXMuVD0hMSksd2MoVGModGhpcyksYSYmdGhpcy5TKSl9Owp2YXIgWGM9ZnVuY3Rpb24oYSxiKXsoYj1JKGEsYikpP1AoYiwhMCk6YS5vPi0xJiZQKEkoYSxhLm8pLCExKX0sWmM9ZnVuY3Rpb24oYSl7Y2QoYSxmdW5jdGlvbihiLGMpe3JldHVybihiKzEpJWN9LEgoYSktMSl9LCRjPWZ1bmN0aW9uKGEpe2NkKGEsZnVuY3Rpb24oYixjKXtiLS07cmV0dXJuIGI8MD9jLTE6Yn0sMCl9LGJkPWZ1bmN0aW9uKGEpe2NkKGEsZnVuY3Rpb24oYixjKXtyZXR1cm4oYisxKSVjfSxhLm8pfSxhZD1mdW5jdGlvbihhKXtjZChhLGZ1bmN0aW9uKGIsYyl7Yi0tO3JldHVybiBiPDA/Yy0xOmJ9LGEubyl9LGNkPWZ1bmN0aW9uKGEsYixjKXtjPWM8MD9WYihhLGEuQik6Yzt2YXIgZD1IKGEpO2M9Yi5jYWxsKGEsYyxkKTtmb3IodmFyIGU9MDtlPD1kOyl7dmFyIGY9SShhLGMpO2lmKGYmJmYuaXNWaXNpYmxlKCkmJmYuaXNFbmFibGVkKCkmJmYuRCYyKXthLkxhKGMpO2JyZWFrfWUrKztjPWIuY2FsbChhLGMsZCl9fTsKVi5wcm90b3R5cGUuTGE9ZnVuY3Rpb24oYSl7WGModGhpcyxhKX07dmFyIGRkPWZ1bmN0aW9uKCl7fTtuKGRkLE0pO2lhKGRkKTtnPWRkLnByb3RvdHlwZTtnLk49ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy10YWIifTtnLk5hPWZ1bmN0aW9uKCl7cmV0dXJuInRhYiJ9O2cueGE9ZnVuY3Rpb24oYSl7dmFyIGI9ZGQubC54YS5jYWxsKHRoaXMsYSk7KGE9YS5HYSgpKSYmdGhpcy5NYShiLGEpO3JldHVybiBifTtnLnlhPWZ1bmN0aW9uKGEsYil7Yj1kZC5sLnlhLmNhbGwodGhpcyxhLGIpO3ZhciBjPXRoaXMuR2EoYik7YyYmKGEuUmE9Yyk7YS5tJjgmJihjPWEuaCkmJnR5cGVvZiBjLko9PT0iZnVuY3Rpb24iJiYoVChhLDgsITEpLGMuSihhKSk7cmV0dXJuIGJ9O2cuR2E9ZnVuY3Rpb24oYSl7cmV0dXJuIGEudGl0bGV8fCIifTtnLk1hPWZ1bmN0aW9uKGEsYil7YSYmKGEudGl0bGU9Ynx8IiIpfTt2YXIgZWQ9ZnVuY3Rpb24oYSxiLGMpe04uY2FsbCh0aGlzLGEsYnx8ZGQuVigpLGMpO1BjKHRoaXMsOCwhMCk7dGhpcy5QfD05fTtuKGVkLE4pO2VkLnByb3RvdHlwZS5HYT1mdW5jdGlvbigpe3JldHVybiB0aGlzLlJhfTtlZC5wcm90b3R5cGUuTWE9ZnVuY3Rpb24oYSl7dGhpcy52Lk1hKHRoaXMuaSgpLGEpO3RoaXMuUmE9YX07dGMoImdvb2ctdGFiIixmdW5jdGlvbigpe3JldHVybiBuZXcgZWQobnVsbCl9KTt2YXIgVz1mdW5jdGlvbigpe3RoaXMuQT0idGFibGlzdCJ9O24oVyx2Yyk7aWEoVyk7Vy5wcm90b3R5cGUuZz1mdW5jdGlvbigpe3JldHVybiJnb29nLXRhYi1iYXIifTtXLnByb3RvdHlwZS51PWZ1bmN0aW9uKGEsYixjKXt0aGlzLnZ8fCh0aGlzLmh8fGZkKHRoaXMpLHRoaXMudj1FYSh0aGlzLmgpKTt2YXIgZD10aGlzLnZbYl07ZD8oemMoYSxnZChkKSksYS52PWQpOlcubC51LmNhbGwodGhpcyxhLGIsYyl9O1cucHJvdG90eXBlLmo9ZnVuY3Rpb24oYSl7dmFyIGI9Vy5sLmouY2FsbCh0aGlzLGEpO3RoaXMuaHx8ZmQodGhpcyk7Yi5wdXNoKHRoaXMuaFthLnZdKTtyZXR1cm4gYn07dmFyIGZkPWZ1bmN0aW9uKGEpe3ZhciBiPWEuZygpO2EuaD17dG9wOmIrIi10b3AiLGJvdHRvbTpiKyItYm90dG9tIixzdGFydDpiKyItc3RhcnQiLGVuZDpiKyItZW5kIn19O3ZhciBYPWZ1bmN0aW9uKGEsYixjKXthPWF8fCJ0b3AiO3pjKHRoaXMsZ2QoYSkpO3RoaXMudj1hO1YuY2FsbCh0aGlzLHRoaXMuTCxifHxXLlYoKSxjKTtoZCh0aGlzKX07bihYLFYpO2c9WC5wcm90b3R5cGU7Zy5IPW51bGw7Zy5JPWZ1bmN0aW9uKCl7WC5sLkkuY2FsbCh0aGlzKTtoZCh0aGlzKX07Zy5DPWZ1bmN0aW9uKCl7WC5sLkMuY2FsbCh0aGlzKTt0aGlzLkg9bnVsbH07Zy5MYT1mdW5jdGlvbihhKXtYLmwuTGEuY2FsbCh0aGlzLGEpO3RoaXMuSihJKHRoaXMsYSkpfTtnLko9ZnVuY3Rpb24oYSl7YT9OYyhhLCEwKTp0aGlzLkgmJk5jKHRoaXMuSCwhMSl9Owp2YXIgaWQ9ZnVuY3Rpb24oYSxiKXtpZihiJiZiPT1hLkgpe2Zvcih2YXIgYz1WYihhLGIpLGQ9Yy0xO2I9SShhLGQpO2QtLSl7dmFyIGU9YjtpZihlLmlzVmlzaWJsZSgpJiZlLmlzRW5hYmxlZCgpKXthLkooYik7cmV0dXJufX1mb3IoYys9MTtiPUkoYSxjKTtjKyspaWYoZD1iLGQuaXNWaXNpYmxlKCkmJmQuaXNFbmFibGVkKCkpe2EuSihiKTtyZXR1cm59YS5KKG51bGwpfX07Zz1YLnByb3RvdHlwZTtnLmpiPWZ1bmN0aW9uKGEpe3RoaXMuSCYmdGhpcy5IIT1hLnRhcmdldCYmTmModGhpcy5ILCExKTt0aGlzLkg9YS50YXJnZXR9O2cua2I9ZnVuY3Rpb24oYSl7YS50YXJnZXQ9PXRoaXMuSCYmKHRoaXMuSD1udWxsKX07Zy5oYj1mdW5jdGlvbihhKXtpZCh0aGlzLGEudGFyZ2V0KX07Zy5pYj1mdW5jdGlvbihhKXtpZCh0aGlzLGEudGFyZ2V0KX07Zy5QYT1mdW5jdGlvbigpe0kodGhpcyx0aGlzLm8pfHxYYyh0aGlzLFZiKHRoaXMsdGhpcy5IfHxJKHRoaXMsMCkpKX07CnZhciBoZD1mdW5jdGlvbihhKXtCKEIoQihCKFFiKGEpLGEsInNlbGVjdCIsYS5qYiksYSwidW5zZWxlY3QiLGEua2IpLGEsImRpc2FibGUiLGEuaGIpLGEsImhpZGUiLGEuaWIpfSxnZD1mdW5jdGlvbihhKXtyZXR1cm4gYT09InN0YXJ0Inx8YT09ImVuZCI/InZlcnRpY2FsIjoiaG9yaXpvbnRhbCJ9O3RjKCJnb29nLXRhYi1iYXIiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBYfSk7ZnVuY3Rpb24gamQoYSl7dmFyIGI9e3RvcDoiYm90dG9tIixib3R0b206InRvcCIsc3RhcnQ6InJpZ2h0IixlbmQ6ImxlZnQifVthLmxvY2F0aW9uXSxjPWEuZWxlbWVudElkLGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTtkLnRleHRDb250ZW50PSJcbiAgICBmaWVsZHNldCB7XG4gICAgICBwYWRkaW5nOiAxMHB4O1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgIzM2OTtcbiAgICB9XG5cbiAgICAjIitjKyIgLmdvb2ctdGFiLWNvbnRlbnQge1xuICAgICAgbWluLWhlaWdodDogM2VtO1xuICAgICAgbWFyZ2luOiAwO1xuICAgICAgYm9yZGVyOiAiK2EuYm9yZGVyKyIgc29saWQgIithLmJvcmRlckNvbG9yKyI7XG4gICAgICBib3JkZXItdG9wOiAwO1xuICAgICAgaGVpZ2h0OiAiK2EuY29udGVudEhlaWdodCsiO1xuICAgICAgcGFkZGluZzogNHB4IDhweDtcbiAgICAgIG1hcmdpbi1yaWdodDogNHB4O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgIG92ZXJmbG93OiBhdXRvO1xuICAgIH1cblxuICAgICMiKwpjKyIgLmdvb2ctdGFiLWJhci0iK2EubG9jYXRpb24rIiAuZ29vZy10YWItc2VsZWN0ZWQge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICIrYS5ib3JkZXJDb2xvcisiO1xuICAgICAgYm9yZGVyLSIrYisiOiAwcHg7XG4gICAgfVxuXG4gICAgIyIrYysiIC5nb29nLXRhYi1iYXItIithLmxvY2F0aW9uKyIge1xuICAgICAgcGFkZGluZy0iK2EubG9jYXRpb24rIjogNXB4ICFpbXBvcnRhbnQ7XG4gICAgICBib3JkZXItIitiKyI6IDFweCBzb2xpZCAiK2EuYm9yZGVyQ29sb3IrIiAhaW1wb3J0YW50O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICB9XG5cbiAgICAjIitjKyIgLmdvb2ctdGFiLWJhciB7XG4gICAgICAgbWFyZ2luOiAwO1xuICAgICAgIGJvcmRlcjogMDtcbiAgICAgICBwYWRkaW5nOiAwO1xuICAgICAgIGxpc3Qtc3R5bGU6IG5vbmU7XG4gICAgICAgY3Vyc29yOiBkZWZhdWx0O1xuICAgICAgIG91dGxpbmU6IG5vbmU7XG4gICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgICBtYXJnaW4tcmlnaHQ6IDRweDtcbiAgICAgIH1cblxuICAgICAjIisKYysiIC5nb29nLXRhYiB7XG4gICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgIHBhZGRpbmc6IDRweCA4cHg7XG4gICAgICAgY29sb3I6IHZhcigtLWNvbGFiLXByaW1hcnktdGV4dC1jb2xvcik7XG4gICAgICAgdGV4dC1kZWNvcmF0aW9uOiBpbml0aWFsO1xuICAgICAgIGN1cnNvcjogZGVmYXVsdDtcbiAgICAgIH1cblxuICAgICAgIyIrYysiIC5nb29nLXRhYi1ob3ZlciB7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWNvbGFiLWhpZ2hsaWdodGVkLXN1cmZhY2UtY29sb3IpO1xuICAgICAgfVxuICAgICAgIjtyZXR1cm4gZH0KdmFyIGtkPWZ1bmN0aW9uKGEpe3ZhciBiPWEuZWxlbWVudElkLGM9YS50YWJOYW1lcyxkPWEuc2VsZWN0ZWRJbmRleDsiY29udGVudEJvcmRlciJpbiBhfHwoYS5jb250ZW50Qm9yZGVyPSIwcHgiKTsiY29udGVudEhlaWdodCJpbiBhfHwoYS5jb250ZW50SGVpZ2h0PSJpbml0aWFsIik7ImJvcmRlckNvbG9yImluIGF8fChhLmJvcmRlckNvbG9yPSJ2YXIoLS1jb2xhYi1ib3JkZXItY29sb3IpIik7YS5sb2NhdGlvbnx8KGEubG9jYXRpb249InRvcCIpO3ZhciBlPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiMiK2IpLGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zi5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYi1iYXIiKTt2YXIgaD1hLmxvY2F0aW9uO2YuY2xhc3NMaXN0LmFkZCgiZ29vZy10YWItYmFyLSIraCk7Zm9yKHZhciBrPVtdLHE9ZmEoYyksRz1xLm5leHQoKTshRy5kb25lO0c9cS5uZXh0KCkpe0c9Ry52YWx1ZTt2YXIgeD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKeC5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYiIpO3gudGV4dENvbnRlbnQ9RztmLmFwcGVuZENoaWxkKHgpO2sucHVzaCh4KX1oIT0iYm90dG9tIiYmZS5hcHBlbmRDaGlsZChmKTtxPW51bGw7aWYoaD09InRvcCJ8fGg9PSJib3R0b20iKXE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikscS5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYi1iYXItY2xlYXIiKTtoPT0idG9wIiYmcSYmZS5hcHBlbmRDaGlsZChxKTtHPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO0cuY2xhc3NMaXN0LmFkZCgiZ29vZy10YWItY29udGVudCIpO3ZhciBoYT1bXTtjPWZhKGMpO2Zvcih4PWMubmV4dCgpOyF4LmRvbmU7eD1jLm5leHQoKSl4PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHguaWQ9ZS5pZCsiX2NvbnRlbnRfIitoYS5sZW5ndGgseC5zdHlsZS5kaXNwbGF5PSJub25lIixHLmFwcGVuZENoaWxkKHgpLGhhLnB1c2goeCk7ZS5hcHBlbmRDaGlsZChHKTtoPT0iYm90dG9tIiYmKHEmJgplLmFwcGVuZENoaWxkKHEpLGUuYXBwZW5kQ2hpbGQoZikpO3ZhciBRPW5ldyBYKGgpO1NiKFEsZik7dmFyIFI9LTE7d2IoUSwic2VsZWN0IixmdW5jdGlvbihTKXtTPWsuaW5kZXhPZihTLnRhcmdldC5pKCkpO1MhPVImJihSPj0wJiZSPGhhLmxlbmd0aCYmKGhhW1JdLnN0eWxlLmRpc3BsYXk9Im5vbmUiLFI9LTEpLFM+PTAmJlM8aGEubGVuZ3RoJiYoUj1TLGhhW1JdLnN0eWxlLmRpc3BsYXk9ImlubGluZSIsd2luZG93LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCJyZXNpemUiKSksZ29vZ2xlLmNvbGFiLm91dHB1dC5yZXNpemVJZnJhbWVUb0NvbnRlbnQoKSksUS5KKEkoUSxSKSkpfSk7US5KKEkoUSxkKSk7d2luZG93W2JdPXtzZXRTZWxlY3RlZFRhYkluZGV4OmZ1bmN0aW9uKFMpe1EuSihJKFEsUykpfX07ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChqZChhKSl9LGxkPVsiY29sYWJfbGliIiwiY3JlYXRlVGFiQmFyIl0sWT1sOwpsZFswXWluIFl8fHR5cGVvZiBZLmV4ZWNTY3JpcHQ9PSJ1bmRlZmluZWQifHxZLmV4ZWNTY3JpcHQoInZhciAiK2xkWzBdKTtmb3IodmFyIFo7bGQubGVuZ3RoJiYoWj1sZC5zaGlmdCgpKTspbGQubGVuZ3RofHxrZD09PXZvaWQgMD9ZW1pdJiZZW1pdIT09T2JqZWN0LnByb3RvdHlwZVtaXT9ZPVlbWl06WT1ZW1pdPXt9OllbWl09a2Q7fSkuY2FsbCh0aGlzKTsKLy8gY2xhbmctZm9ybWF0IG9uCg==", + "ok": true, + "headers": [ + [ + "content-length", + "41785" + ], + [ + "content-type", + "application/javascript" + ] + ], + "status": 200, + "status_text": "" + } + }, + "base_uri": "https://localhost:8080/", + "height": 229 + }, + "outputId": "ebc1e069-9d2b-4837-d338-2558db5092b1" + }, + "source": [ + "%%logica Engineers\n", + "\n", + "Employee(name: \"Alice\", role: \"Product Manager\", office: \"SEA\");\n", + "Employee(name: \"Bob\", role: \"Engineer\", office: \"SEA\");\n", + "Employee(name: \"Caroline\", role: \"Engineer\", office: \"LAX\");\n", + "Employee(name: \"David\", role: \"Data Scientist\", office: \"LAX\");\n", + "Employee(name: \"Eve\", role: \"Data Scientist\", office: \"SEA\");\n", + "\n", + "IsEngineer(record) :- record.role == \"Engineer\";\n", + "\n", + "Engineers(..r) :- Employee(..r), IsEngineer(r);" + ], + "execution_count": 21, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0a83154e-d22d-11ef-a7c0-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id39\", \"tabNames\": [\"Engineers\", \"(Log)\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_f7eb6ecc5e" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0a837a02-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id39\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_a504f16196" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0a858e3c-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_afaa010d50" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0a85ebb6-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id39_content_1\");\n", + "//# sourceURL=js_d3aa517a8d" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0a865e2a-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"0a85ebb6-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_ac2d2f7c30" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0a86abfa-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id39\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_212ef845de" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0a8add06-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"0a858e3c-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_4d2469e3bd" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0a8d06f8-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_22319f1fd7" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0a8d6256-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id39_content_0\");\n", + "//# sourceURL=js_65bcd539d4" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0a8dd218-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"0a8d6256-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_ed4166cdde" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0a8e23da-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id39\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_62b9c4011a" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0a90728e-d22d-11ef-a7c0-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id40\", \"tabNames\": [\"SQL\", \"Result\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_cac8f49a0e" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0a90d378-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id40\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_6046d84673" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0a9303aa-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_44315c89ec" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0a93639a-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id40_content_0\");\n", + "//# sourceURL=js_1a2b297492" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0a93ce84-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"0a93639a-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_604d0af990" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0a94127c-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id40\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_dbdd0ae68a" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The following query is stored at \u001b[1mEngineers_sql\u001b[0m variable.\n", + "-- Initializing DuckDB environment.\n", + "create schema if not exists logica_home;\n", + "-- Empty record, has to have a field by DuckDB syntax.\n", + "drop type if exists logicarecord893574736 cascade; create type logicarecord893574736 as struct(nirvana numeric);\n", + "create sequence if not exists eternal_logical_sequence;\n", + "\n", + "\n", + "-- Logica type: logicarecord481217614\n", + "drop type if exists logicarecord481217614 cascade; create type logicarecord481217614 as struct(r logicarecord893574736);\n", + "\n", + "-- Logica type: logicarecord383307722\n", + "drop type if exists logicarecord383307722 cascade; create type logicarecord383307722 as struct(a timestamp);\n", + "\n", + "-- Logica type: logicarecord145182482\n", + "drop type if exists logicarecord145182482 cascade; create type logicarecord145182482 as struct(role text);\n", + "\n", + "-- Logica type: logicarecord853346926\n", + "drop type if exists logicarecord853346926 cascade; create type logicarecord853346926 as struct(name text, office text, role text);\n", + "WITH t_0_Employee AS (SELECT * FROM (\n", + " \n", + " SELECT\n", + " 'Alice' AS name,\n", + " 'Product Manager' AS role,\n", + " 'SEA' AS office\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " 'Bob' AS name,\n", + " 'Engineer' AS role,\n", + " 'SEA' AS office\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " 'Caroline' AS name,\n", + " 'Engineer' AS role,\n", + " 'LAX' AS office\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " 'David' AS name,\n", + " 'Data Scientist' AS role,\n", + " 'LAX' AS office\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " 'Eve' AS name,\n", + " 'Data Scientist' AS role,\n", + " 'SEA' AS office\n", + " \n", + ") AS UNUSED_TABLE_NAME )\n", + "SELECT\n", + " Employee.*\n", + "FROM\n", + " t_0_Employee AS Employee\n", + "WHERE\n", + " (Employee.role = 'Engineer');\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0a969768-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"0a9303aa-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_80a4f762af" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0a990f3e-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_bcca4fd67c" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0a998a54-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id40_content_1\");\n", + "//# sourceURL=js_d42eaed477" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0a99fe1c-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"0a998a54-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_f0b758374d" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0a9a6726-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id40\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_d878672321" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The following table is stored at \u001b[1mEngineers\u001b[0m variable.\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
nameroleoffice
0BobEngineerSEA
1CarolineEngineerLAX
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0a9d30dc-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"0a990f3e-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_e86a04e23f" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0a9f0b32-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"0a8d06f8-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_2434b8a95e" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0aa17c5a-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_1a9c1a5ec6" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0aa1f784-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id39_content_1\");\n", + "//# sourceURL=js_e619314487" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0aa26a5c-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"0aa1f784-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_6009d2c468" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0aa2c2ae-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id39\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_9203867ed0" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "image/svg+xml": "\n\n\n\n\n\nConcertina\n\n\n\nEngineers\n\nEngineers\n\n\n\n", + "text/plain": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Running predicate: Engineers (4 ms)\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0ab4ba40-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"0aa17c5a-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_fa693a13d3" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0ab7444a-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_d1b6cc17c4" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0ab7a804-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id39_content_0\");\n", + "//# sourceURL=js_56f372a377" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0ab8074a-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"0ab7a804-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_f4f2b85e96" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0ab8699c-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id39\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_39441ded4b" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0aba7976-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_831c804725" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0abadd4e-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id40_content_1\");\n", + "//# sourceURL=js_e2582251e3" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0abb491e-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"0abadd4e-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_64efc8dc3e" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0abba4a4-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id40\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_bc4e163d90" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0abe311a-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"0aba7976-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_3bd718cff3" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + " \n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0ac0d97e-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"0ab7444a-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_ccda435bc8" + ] + }, + "metadata": {} + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "8-T2QJ84SNXT" + }, + "source": [ + "If you tried to render IsEngineer you would get an error:\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "AZgQyWZwc709" + }, + "source": [ + "![variable_error.png](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAA3oAAAAcCAYAAAA3Fs2iAAAbmUlEQVR4Xu2dB/jX0xfHT5Ikm0h2iZLIJrJCpYzsPbPK3iOrjKhk71FCZWUXIlFIdpRdZGWGpEX/53V///Pr9ukz7nf81te5z9Pze/p+P+Pe9z33nPM+59z7rTVv3rx5Ys0QMAQMAUPAEDAEDAFDwBAwBAwBQ6BkEKhlRK9k5tIGYggYAoaAIWAIGAKGgCFgCBgChoBDwIieCYIhYAgYAoaAIWAIGAKGgCFgCBgCJYaAEb0Sm1AbjiFgCBgChoAhYAgYAoaAIWAIGAJG9EwGDAFDwBAwBAwBQ8AQMAQMAUPAECgxBIzoldiE2nAMAUPAEDAEDAFDwBAwBAwBQ8AQMKJnMmAIGAKGgCFgCBgChoAhYAgYAoZAiSFgRK/EJtSGYwgYAoaAIWAIGAKGgCFgCBgChoARPZMBQ8AQMAQMAUPAEDAEDAFDwBAwBEoMASN6JTahNhxDwBAwBAwBQ8AQMAQMAUPAEDAEjOiZDBgChoAhYAgYAoaAIWAIGAKGgCFQYggY0SuxCbXhGAKGgCFgCBgChoAhYAgYAoaAIZAT0WvXrp189tlnDrX33ntPll566f8kgpMnT5addtrJjX3TTTeVhx9+uCRw0HG98sorstpqq5XEmGwQ6Qh07txZdt11VznxxBNLHqp8x3rPPffIkCFD5LnnnovF6IsvvpBddtml/DtbP8UXpQsvvFAGDRokPXv2lEMOOaT4L0h44iabbCKXXXaZ7L777qnvHDVqlBx//PHy8ccfV1rfSv1F+a7X++67TwYMGCAvvvhilUK0xRZbyM8//+z6cM0118i+++5bpf2pKS//6KOP5Oyzz3a+5j///COffvqpLLrootWu+8VY8+pzjRkzRlZZZZVqN8Zoh6rKR9xoo43kqquukt12263KMHrggQfkoosucu9fddVV5dVXX62yvuT64pyJHkb28MMPz/U9Ig0bikyduvB9EyeKNGuW+/OqwR3XXXedsEBzJXpRx1CHssYaa8jLL79cZSOrqkVcZQPO48XPP/+8nH766YIxKoV24403SosWLcoDF6UwpqQx5DvWLKKn77P1U3HSU2yiBxm49NJLEzvct29fgWiEEj0IHuQCZ8RacRDId72GEr3K0uVbb721nHnmmUb0AsUC/7JBgwZywQUXSJ06daptQqEYa55AQK9evRyBWGaZZQIRyu0yyBG67Nhjj83txpirq8rGVQeip3AQ9L3pppuM6MVKE0SPiFaXLgt+3by5SN26BQtgVTygUKJHlG/99dcv7/piiy0m66yzTlUMxb2zqhZxlQ04jxdXlnOQR9fslgpCwIheBQGbw2OLTfR+/fVX+eGHH1wPPvnkE+eI33zzzbLmmmu6z4jY4niFEr0chmKXVjACRvQqGOAKfvwOO+wgJ5xwghx44IEV/Kb/xuON6BV3no3opeEJ0TvpJJHu3ZOvGj5cpFMnkVGjyq6dMEGkUSORMWPK/tK22kqkXTuRadNEBg4UmT1b5IwzRHr0KPt+wACRnj1FpkwRadxY5MorRTp3nv/OmTNF6tUTGTKk7NqRI0Xq1xfp31+kY8ecJKJQoofAbL755rHvJNJDlIcysNq1a0vbtm2lR48estRSS7nr44wZpbUHHHCAHH300c556dChg1xxxRVy1113yY8//igo0N69e8viiy/unvHXX3+5qNkLL7wgK6ywgruP0qhcSs9whI444gh3DyUWENXrr79eyE5qe/TRR4Xo7Pfffy+rr766K8ugryGN7Fm9evXkSuYx0rp16+bKHc4//3zBEXzttddk6tSpsuKKK8r+++8vJ598siyyyCLOodtmm21c5pX+asO5mz59utx+++2ZXRk6dKhzBqOtWbNm8uyzzxZlrDzkq6++cnNGafTvv/8ua6+9tpxyyikLlCx8+OGHThbIKhLxbNmypfTr18+NmzZv3jwhIwHuv/32m8PomGOOkUMPPbS8nxjRN9980/2f+YiWbk6aNMl9zruaN2/u8HviiSfKo1gqf3vuuadQ0jB37lw56qij5CTWbUCjjzyTOTrooIPK7yBS9vTTT8vw4cNd2U7avOpNV199tYwfP146duzonHXWzmabbSb333+/uyRrrKwPsAL7unXruuwma2/ZZZd19yvR43PGyjXHHXfcQhHSrEAJpR6sP9YJcwJefnVE1rzqeKdNmyZ///23NGzYUGrVqhWA9vxLRo8e7d5JWRlR0oceekhmzJjh+nLeeee5C/v37+/+sW5Yr+DH96wlbegucPv666+d7thxxx2d3GpDPu6++273DMrAWat77713+ffIJ3NFX9AL6A/Ks/icUmKwOOecc+TLL790ugLMH3nkkQop3Xz33Xdl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)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "5H9clFNVcw3o" + }, + "source": [ + "\n", + "Infinite predicates can only be used as parts of other predicates and play role of filters, or auxiliary functions. Here is an example of using an infinite predicate for computing a string describing an employee." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "rfVaUNu3SMEw", + "colab": { + "resources": { + "http://localhost:8080/nbextensions/google.colab/tabbar.css": { + "data": "Lmdvb2ctdGFie3Bvc2l0aW9uOnJlbGF0aXZlO3BhZGRpbmc6NHB4IDhweDtjb2xvcjojMDBjO3RleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7Y3Vyc29yOmRlZmF1bHR9Lmdvb2ctdGFiLWJhci10b3AgLmdvb2ctdGFie21hcmdpbjoxcHggNHB4IDAgMDtib3JkZXItYm90dG9tOjA7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLXRvcDphZnRlciwuZ29vZy10YWItYmFyLWJvdHRvbTphZnRlcntjb250ZW50OiIgIjtkaXNwbGF5OmJsb2NrO2hlaWdodDowO2NsZWFyOmJvdGg7dmlzaWJpbGl0eTpoaWRkZW59Lmdvb2ctdGFiLWJhci1ib3R0b20gLmdvb2ctdGFie21hcmdpbjowIDRweCAxcHggMDtib3JkZXItdG9wOjA7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLXN0YXJ0IC5nb29nLXRhYnttYXJnaW46MCAwIDRweCAxcHg7Ym9yZGVyLXJpZ2h0OjB9Lmdvb2ctdGFiLWJhci1lbmQgLmdvb2ctdGFie21hcmdpbjowIDFweCA0cHggMDtib3JkZXItbGVmdDowfS5nb29nLXRhYi1ob3ZlcntiYWNrZ3JvdW5kOiNlZWV9Lmdvb2ctdGFiLWRpc2FibGVke2NvbG9yOiM2NjZ9Lmdvb2ctdGFiLXNlbGVjdGVke2NvbG9yOiMwMDA7YmFja2dyb3VuZDojZmZmO3RleHQtZGVjb3JhdGlvbjpub25lO2ZvbnQtd2VpZ2h0OmJvbGQ7Ym9yZGVyOjFweCBzb2xpZCAjNmI5MGRhfS5nb29nLXRhYi1iYXItdG9we3BhZGRpbmctdG9wOjVweCFpbXBvcnRhbnQ7cGFkZGluZy1sZWZ0OjVweCFpbXBvcnRhbnQ7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgIzZiOTBkYSFpbXBvcnRhbnR9Lmdvb2ctdGFiLWJhci10b3AgLmdvb2ctdGFiLXNlbGVjdGVke3RvcDoxcHg7bWFyZ2luLXRvcDowO3BhZGRpbmctYm90dG9tOjVweH0uZ29vZy10YWItYmFyLWJvdHRvbSAuZ29vZy10YWItc2VsZWN0ZWR7dG9wOi0xcHg7bWFyZ2luLWJvdHRvbTowO3BhZGRpbmctdG9wOjVweH0uZ29vZy10YWItYmFyLXN0YXJ0IC5nb29nLXRhYi1zZWxlY3RlZHtsZWZ0OjFweDttYXJnaW4tbGVmdDowO3BhZGRpbmctcmlnaHQ6OXB4fS5nb29nLXRhYi1iYXItZW5kIC5nb29nLXRhYi1zZWxlY3RlZHtsZWZ0Oi0xcHg7bWFyZ2luLXJpZ2h0OjA7cGFkZGluZy1sZWZ0OjlweH0uZ29vZy10YWItYmFye21hcmdpbjowO2JvcmRlcjowO3BhZGRpbmc6MDtsaXN0LXN0eWxlOm5vbmU7Y3Vyc29yOmRlZmF1bHQ7b3V0bGluZTpub25lO2JhY2tncm91bmQ6I2ViZWZmOX0uZ29vZy10YWItYmFyLWNsZWFye2NsZWFyOmJvdGg7aGVpZ2h0OjA7b3ZlcmZsb3c6aGlkZGVufS5nb29nLXRhYi1iYXItc3RhcnR7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLWVuZHtmbG9hdDpyaWdodH0qIGh0bWwgLmdvb2ctdGFiLWJhci1zdGFydHttYXJnaW4tcmlnaHQ6LTNweH0qIGh0bWwgLmdvb2ctdGFiLWJhci1lbmR7bWFyZ2luLWxlZnQ6LTNweH1zZW50aW5lbHt9", + "ok": true, + "headers": [ + [ + "content-length", + "1404" + ], + [ + "content-type", + "text/css" + ] + ], + "status": 200, + "status_text": "" + }, + "http://localhost:8080/nbextensions/google.colab/tabbar_main.min.js": { + "data": "Ly8gY2xhbmctZm9ybWF0IG9mZgooZnVuY3Rpb24oKXt2YXIgZyxhYT1mdW5jdGlvbihhKXt2YXIgYj0wO3JldHVybiBmdW5jdGlvbigpe3JldHVybiBiPGEubGVuZ3RoP3tkb25lOiExLHZhbHVlOmFbYisrXX06e2RvbmU6ITB9fX0sYmE9dHlwZW9mIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzPT0iZnVuY3Rpb24iP09iamVjdC5kZWZpbmVQcm9wZXJ0eTpmdW5jdGlvbihhLGIsYyl7aWYoYT09QXJyYXkucHJvdG90eXBlfHxhPT1PYmplY3QucHJvdG90eXBlKXJldHVybiBhO2FbYl09Yy52YWx1ZTtyZXR1cm4gYX0sY2E9ZnVuY3Rpb24oYSl7YT1bIm9iamVjdCI9PXR5cGVvZiBnbG9iYWxUaGlzJiZnbG9iYWxUaGlzLGEsIm9iamVjdCI9PXR5cGVvZiB3aW5kb3cmJndpbmRvdywib2JqZWN0Ij09dHlwZW9mIHNlbGYmJnNlbGYsIm9iamVjdCI9PXR5cGVvZiBnbG9iYWwmJmdsb2JhbF07Zm9yKHZhciBiPTA7YjxhLmxlbmd0aDsrK2Ipe3ZhciBjPWFbYl07aWYoYyYmYy5NYXRoPT1NYXRoKXJldHVybiBjfXRocm93IEVycm9yKCJDYW5ub3QgZmluZCBnbG9iYWwgb2JqZWN0Iik7Cn0sZGE9Y2EodGhpcyksZWE9ZnVuY3Rpb24oYSxiKXtpZihiKWE6e3ZhciBjPWRhO2E9YS5zcGxpdCgiLiIpO2Zvcih2YXIgZD0wO2Q8YS5sZW5ndGgtMTtkKyspe3ZhciBlPWFbZF07aWYoIShlIGluIGMpKWJyZWFrIGE7Yz1jW2VdfWE9YVthLmxlbmd0aC0xXTtkPWNbYV07Yj1iKGQpO2IhPWQmJmIhPW51bGwmJmJhKGMsYSx7Y29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOmJ9KX19OwplYSgiU3ltYm9sIixmdW5jdGlvbihhKXtpZihhKXJldHVybiBhO3ZhciBiPWZ1bmN0aW9uKGYsaCl7dGhpcy5nPWY7YmEodGhpcywiZGVzY3JpcHRpb24iLHtjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6aH0pfTtiLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmd9O3ZhciBjPSJqc2NvbXBfc3ltYm9sXyIrKE1hdGgucmFuZG9tKCkqMUU5Pj4+MCkrIl8iLGQ9MCxlPWZ1bmN0aW9uKGYpe2lmKHRoaXMgaW5zdGFuY2VvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoIlN5bWJvbCBpcyBub3QgYSBjb25zdHJ1Y3RvciIpO3JldHVybiBuZXcgYihjKyhmfHwiIikrIl8iK2QrKyxmKX07cmV0dXJuIGV9KTsKdmFyIGZhPWZ1bmN0aW9uKGEpe3ZhciBiPXR5cGVvZiBTeW1ib2whPSJ1bmRlZmluZWQiJiZTeW1ib2wuaXRlcmF0b3ImJmFbU3ltYm9sLml0ZXJhdG9yXTtpZihiKXJldHVybiBiLmNhbGwoYSk7aWYodHlwZW9mIGEubGVuZ3RoPT0ibnVtYmVyIilyZXR1cm57bmV4dDphYShhKX07dGhyb3cgRXJyb3IoU3RyaW5nKGEpKyIgaXMgbm90IGFuIGl0ZXJhYmxlIG9yIEFycmF5TGlrZSIpO307ZWEoIlN5bWJvbC5kaXNwb3NlIixmdW5jdGlvbihhKXtyZXR1cm4gYT9hOlN5bWJvbCgiU3ltYm9sLmRpc3Bvc2UiKX0pOy8qCgogQ29weXJpZ2h0IFRoZSBDbG9zdXJlIExpYnJhcnkgQXV0aG9ycy4KIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wCiovCnZhciBsPXRoaXN8fHNlbGYsaWE9ZnVuY3Rpb24oYSl7YS5JYT12b2lkIDA7YS5WPWZ1bmN0aW9uKCl7cmV0dXJuIGEuSWE/YS5JYTphLklhPW5ldyBhfX0samE9ZnVuY3Rpb24oYSl7dmFyIGI9dHlwZW9mIGE7cmV0dXJuIGIhPSJvYmplY3QiP2I6YT9BcnJheS5pc0FycmF5KGEpPyJhcnJheSI6YjoibnVsbCJ9LGthPWZ1bmN0aW9uKGEpe3ZhciBiPWphKGEpO3JldHVybiBiPT0iYXJyYXkifHxiPT0ib2JqZWN0IiYmdHlwZW9mIGEubGVuZ3RoPT0ibnVtYmVyIn0sbT1mdW5jdGlvbihhKXt2YXIgYj10eXBlb2YgYTtyZXR1cm4gYj09Im9iamVjdCImJmEhPW51bGx8fGI9PSJmdW5jdGlvbiJ9LG5hPWZ1bmN0aW9uKGEpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYSxsYSkmJmFbbGFdfHwoYVtsYV09KyttYSl9LGxhPSJjbG9zdXJlX3VpZF8iKyhNYXRoLnJhbmRvbSgpKjFFOT4+PjApLG1hPTAsbj1mdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoKXt9Yy5wcm90b3R5cGU9CmIucHJvdG90eXBlO2EubD1iLnByb3RvdHlwZTthLnByb3RvdHlwZT1uZXcgYzthLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1hO2EucWQ9ZnVuY3Rpb24oZCxlLGYpe2Zvcih2YXIgaD1BcnJheShhcmd1bWVudHMubGVuZ3RoLTIpLGs9MjtrPGFyZ3VtZW50cy5sZW5ndGg7aysrKWhbay0yXT1hcmd1bWVudHNba107cmV0dXJuIGIucHJvdG90eXBlW2VdLmFwcGx5KGQsaCl9fTtmdW5jdGlvbiBvYShhLGIpe2lmKEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKUVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsb2EpO2Vsc2V7dmFyIGM9RXJyb3IoKS5zdGFjaztjJiYodGhpcy5zdGFjaz1jKX1hJiYodGhpcy5tZXNzYWdlPVN0cmluZyhhKSk7YiE9PXZvaWQgMCYmKHRoaXMuY2F1c2U9Yil9bihvYSxFcnJvcik7b2EucHJvdG90eXBlLm5hbWU9IkN1c3RvbUVycm9yIjt2YXIgcGE7ZnVuY3Rpb24gcWEoYSxiKXthPWEuc3BsaXQoIiVzIik7Zm9yKHZhciBjPSIiLGQ9YS5sZW5ndGgtMSxlPTA7ZTxkO2UrKyljKz1hW2VdKyhlPGIubGVuZ3RoP2JbZV06IiVzIik7b2EuY2FsbCh0aGlzLGMrYVtkXSl9bihxYSxvYSk7cWEucHJvdG90eXBlLm5hbWU9IkFzc2VydGlvbkVycm9yIjtmdW5jdGlvbiByYShhLGIsYyxkKXt2YXIgZT0iQXNzZXJ0aW9uIGZhaWxlZCI7aWYoYyl7ZSs9IjogIitjO3ZhciBmPWR9ZWxzZSBhJiYoZSs9IjogIithLGY9Yik7dGhyb3cgbmV3IHFhKCIiK2UsZnx8W10pO30KdmFyIHA9ZnVuY3Rpb24oYSxiLGMpe2F8fHJhKCIiLG51bGwsYixBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMikpO3JldHVybiBhfSxzYT1mdW5jdGlvbihhLGIsYyl7bShhKSYmYS5ub2RlVHlwZT09MXx8cmEoIkV4cGVjdGVkIEVsZW1lbnQgYnV0IGdvdCAlczogJXMuIixbamEoYSksYV0sYixBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMikpfSx1YT1mdW5jdGlvbihhLGIsYyxkKXthIGluc3RhbmNlb2YgYnx8cmEoIkV4cGVjdGVkIGluc3RhbmNlb2YgJXMgYnV0IGdvdCAlcy4iLFt0YShiKSx0YShhKV0sYyxBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMykpfTsKZnVuY3Rpb24gdGEoYSl7cmV0dXJuIGEgaW5zdGFuY2VvZiBGdW5jdGlvbj9hLmRpc3BsYXlOYW1lfHxhLm5hbWV8fCJ1bmtub3duIHR5cGUgbmFtZSI6YSBpbnN0YW5jZW9mIE9iamVjdD9hLmNvbnN0cnVjdG9yLmRpc3BsYXlOYW1lfHxhLmNvbnN0cnVjdG9yLm5hbWV8fE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhKTphPT09bnVsbD8ibnVsbCI6dHlwZW9mIGF9O3ZhciB2YT1BcnJheS5wcm90b3R5cGUuaW5kZXhPZj9mdW5jdGlvbihhLGIpe3AoYS5sZW5ndGghPW51bGwpO3JldHVybiBBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKGEsYix2b2lkIDApfTpmdW5jdGlvbihhLGIpe2lmKHR5cGVvZiBhPT09InN0cmluZyIpcmV0dXJuIHR5cGVvZiBiIT09InN0cmluZyJ8fGIubGVuZ3RoIT0xPy0xOmEuaW5kZXhPZihiLDApO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWlmKGMgaW4gYSYmYVtjXT09PWIpcmV0dXJuIGM7cmV0dXJuLTF9LHdhPUFycmF5LnByb3RvdHlwZS5mb3JFYWNoP2Z1bmN0aW9uKGEsYil7cChhLmxlbmd0aCE9bnVsbCk7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChhLGIsdm9pZCAwKX06ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9YS5sZW5ndGgsZD10eXBlb2YgYT09PSJzdHJpbmciP2Euc3BsaXQoIiIpOmEsZT0wO2U8YztlKyspZSBpbiBkJiZiLmNhbGwodm9pZCAwLGRbZV0sZSxhKX07CmZ1bmN0aW9uIHhhKGEsYil7Yj12YShhLGIpO3ZhciBjO2lmKGM9Yj49MClwKGEubGVuZ3RoIT1udWxsKSxBcnJheS5wcm90b3R5cGUuc3BsaWNlLmNhbGwoYSxiLDEpO3JldHVybiBjfWZ1bmN0aW9uIHlhKGEpe3ZhciBiPWEubGVuZ3RoO2lmKGI+MCl7Zm9yKHZhciBjPUFycmF5KGIpLGQ9MDtkPGI7ZCsrKWNbZF09YVtkXTtyZXR1cm4gY31yZXR1cm5bXX1mdW5jdGlvbiB6YShhLGIsYyxkKXtwKGEubGVuZ3RoIT1udWxsKTtBcnJheS5wcm90b3R5cGUuc3BsaWNlLmFwcGx5KGEsQWEoYXJndW1lbnRzLDEpKX1mdW5jdGlvbiBBYShhLGIsYyl7cChhLmxlbmd0aCE9bnVsbCk7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg8PTI/QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYSxiKTpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhLGIsYyl9O2Z1bmN0aW9uIEJhKGEsYixjKXtmb3IodmFyIGQgaW4gYSliLmNhbGwoYyxhW2RdLGQsYSl9ZnVuY3Rpb24gQ2EoYSxiKXtmb3IodmFyIGMgaW4gYSlpZihhW2NdPT1iKXJldHVybiEwO3JldHVybiExfWZ1bmN0aW9uIERhKGEsYixjKXtpZihhIT09bnVsbCYmYiBpbiBhKXRocm93IEVycm9yKCdUaGUgb2JqZWN0IGFscmVhZHkgY29udGFpbnMgdGhlIGtleSAiJytiKyciJyk7YVtiXT1jfWZ1bmN0aW9uIEVhKGEpe3ZhciBiPXt9LGM7Zm9yKGMgaW4gYSliW2FbY11dPWM7cmV0dXJuIGJ9dmFyIEZhPSJjb25zdHJ1Y3RvciBoYXNPd25Qcm9wZXJ0eSBpc1Byb3RvdHlwZU9mIHByb3BlcnR5SXNFbnVtZXJhYmxlIHRvTG9jYWxlU3RyaW5nIHRvU3RyaW5nIHZhbHVlT2YiLnNwbGl0KCIgIik7CmZ1bmN0aW9uIEdhKGEsYil7Zm9yKHZhciBjLGQsZT0xO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspe2Q9YXJndW1lbnRzW2VdO2ZvcihjIGluIGQpYVtjXT1kW2NdO2Zvcih2YXIgZj0wO2Y8RmEubGVuZ3RoO2YrKyljPUZhW2ZdLE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChkLGMpJiYoYVtjXT1kW2NdKX19O3ZhciBIYT1TdHJpbmcucHJvdG90eXBlLnRyaW0/ZnVuY3Rpb24oYSl7cmV0dXJuIGEudHJpbSgpfTpmdW5jdGlvbihhKXtyZXR1cm4vXltcc1x4YTBdKihbXHNcU10qPylbXHNceGEwXSokLy5leGVjKGEpWzFdfTsvKgoKIENvcHlyaWdodCBHb29nbGUgTExDCiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMAoqLwp2YXIgSWE9e307dmFyIEphPWZ1bmN0aW9uKGEpe2lmKElhIT09SWEpdGhyb3cgRXJyb3IoIkJhZCBzZWNyZXQiKTt0aGlzLmc9YX07SmEucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ307bmV3IEphKCJhYm91dDpibGFuayIpO25ldyBKYSgiYWJvdXQ6aW52YWxpZCN6Q2xvc3VyZXoiKTt2YXIgS2E9W10sTGE9ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJBIFVSTCB3aXRoIGNvbnRlbnQgJyIrYSsiJyB3YXMgc2FuaXRpemVkIGF3YXkuIil9O0thLmluZGV4T2YoTGEpPT09LTEmJkthLnB1c2goTGEpO3ZhciBNYSxOYTthOntmb3IodmFyIE9hPVsiQ0xPU1VSRV9GTEFHUyJdLFBhPWwsUWE9MDtRYTxPYS5sZW5ndGg7UWErKylpZihQYT1QYVtPYVtRYV1dLFBhPT1udWxsKXtOYT1udWxsO2JyZWFrIGF9TmE9UGF9dmFyIFJhPU5hJiZOYVs2MTA0MDEzMDFdO01hPVJhIT1udWxsP1JhOiExO2Z1bmN0aW9uIFNhKCl7dmFyIGE9bC5uYXZpZ2F0b3I7cmV0dXJuIGEmJihhPWEudXNlckFnZW50KT9hOiIifXZhciBUYSxVYT1sLm5hdmlnYXRvcjtUYT1VYT9VYS51c2VyQWdlbnREYXRhfHxudWxsOm51bGw7ZnVuY3Rpb24gcihhKXtyZXR1cm4gU2EoKS5pbmRleE9mKGEpIT0tMX07dmFyIFZhPXIoIkVkZ2UiKSx0PXIoIkdlY2tvIikmJiEoU2EoKS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoIndlYmtpdCIpIT0tMSYmIXIoIkVkZ2UiKSkmJiEocigiVHJpZGVudCIpfHxyKCJNU0lFIikpJiYhcigiRWRnZSIpLHU9U2EoKS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoIndlYmtpdCIpIT0tMSYmIXIoIkVkZ2UiKSx2PU1hJiZUYSYmVGEucGxhdGZvcm0/VGEucGxhdGZvcm09PT0ibWFjT1MiOnIoIk1hY2ludG9zaCIpO3ZhciBYYT1mdW5jdGlvbihhLGIpe0JhKGIsZnVuY3Rpb24oYyxkKXtkPT0ic3R5bGUiP2Euc3R5bGUuY3NzVGV4dD1jOmQ9PSJjbGFzcyI/YS5jbGFzc05hbWU9YzpkPT0iZm9yIj9hLmh0bWxGb3I9YzpXYS5oYXNPd25Qcm9wZXJ0eShkKT9hLnNldEF0dHJpYnV0ZShXYVtkXSxjKTpkLmxhc3RJbmRleE9mKCJhcmlhLSIsMCk9PTB8fGQubGFzdEluZGV4T2YoImRhdGEtIiwwKT09MD9hLnNldEF0dHJpYnV0ZShkLGMpOmFbZF09Y30pfSxXYT17Y2VsbHBhZGRpbmc6ImNlbGxQYWRkaW5nIixjZWxsc3BhY2luZzoiY2VsbFNwYWNpbmciLGNvbHNwYW46ImNvbFNwYW4iLGZyYW1lYm9yZGVyOiJmcmFtZUJvcmRlciIsaGVpZ2h0OiJoZWlnaHQiLG1heGxlbmd0aDoibWF4TGVuZ3RoIixub25jZToibm9uY2UiLHJvbGU6InJvbGUiLHJvd3NwYW46InJvd1NwYW4iLHR5cGU6InR5cGUiLHVzZW1hcDoidXNlTWFwIix2YWxpZ246InZBbGlnbiIsd2lkdGg6IndpZHRoIn0sWWE9ZnVuY3Rpb24oYSwKYixjKXtmdW5jdGlvbiBkKGspe2smJmIuYXBwZW5kQ2hpbGQodHlwZW9mIGs9PT0ic3RyaW5nIj9hLmNyZWF0ZVRleHROb2RlKGspOmspfWZvcih2YXIgZT0yO2U8Yy5sZW5ndGg7ZSsrKXt2YXIgZj1jW2VdO2lmKCFrYShmKXx8bShmKSYmZi5ub2RlVHlwZT4wKWQoZik7ZWxzZXthOntpZihmJiZ0eXBlb2YgZi5sZW5ndGg9PSJudW1iZXIiKXtpZihtKGYpKXt2YXIgaD10eXBlb2YgZi5pdGVtPT0iZnVuY3Rpb24ifHx0eXBlb2YgZi5pdGVtPT0ic3RyaW5nIjticmVhayBhfWlmKHR5cGVvZiBmPT09ImZ1bmN0aW9uIil7aD10eXBlb2YgZi5pdGVtPT0iZnVuY3Rpb24iO2JyZWFrIGF9fWg9ITF9d2EoaD95YShmKTpmLGQpfX19LFphPWZ1bmN0aW9uKGEsYil7Yj1TdHJpbmcoYik7YS5jb250ZW50VHlwZT09PSJhcHBsaWNhdGlvbi94aHRtbCt4bWwiJiYoYj1iLnRvTG93ZXJDYXNlKCkpO3JldHVybiBhLmNyZWF0ZUVsZW1lbnQoYil9LCRhPWZ1bmN0aW9uKGEpe2EmJmEucGFyZW50Tm9kZSYmCmEucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhKX0sYWI9ZnVuY3Rpb24oYSxiKXtpZighYXx8IWIpcmV0dXJuITE7aWYoYS5jb250YWlucyYmYi5ub2RlVHlwZT09MSlyZXR1cm4gYT09Ynx8YS5jb250YWlucyhiKTtpZih0eXBlb2YgYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiE9InVuZGVmaW5lZCIpcmV0dXJuIGE9PWJ8fCEhKGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24oYikmMTYpO2Zvcig7YiYmYSE9YjspYj1iLnBhcmVudE5vZGU7cmV0dXJuIGI9PWF9LGJiPWZ1bmN0aW9uKGEpe3AoYSwiTm9kZSBjYW5ub3QgYmUgbnVsbCBvciB1bmRlZmluZWQuIik7cmV0dXJuIGEubm9kZVR5cGU9PTk/YTphLm93bmVyRG9jdW1lbnR8fGEuZG9jdW1lbnR9LGNiPWZ1bmN0aW9uKGEsYil7Yj9hLnRhYkluZGV4PTA6KGEudGFiSW5kZXg9LTEsYS5yZW1vdmVBdHRyaWJ1dGUoInRhYkluZGV4IikpfSxkYj1mdW5jdGlvbihhKXtyZXR1cm4gYS5oYXNBdHRyaWJ1dGUoInRhYmluZGV4Iil9LGViPQpmdW5jdGlvbihhKXthPWEudGFiSW5kZXg7cmV0dXJuIHR5cGVvZiBhPT09Im51bWJlciImJmE+PTAmJmE8MzI3Njh9LGZiPWZ1bmN0aW9uKGEpe3RoaXMuZz1hfHxsLmRvY3VtZW50fHxkb2N1bWVudH07ZmIucHJvdG90eXBlLmk9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nO3JldHVybiB0eXBlb2YgYT09PSJzdHJpbmciP2IuZ2V0RWxlbWVudEJ5SWQoYSk6YX07ZmIucHJvdG90eXBlLmg9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXMuZyxlPWFyZ3VtZW50cyxmPWVbMV0saD1aYShkLFN0cmluZyhlWzBdKSk7ZiYmKHR5cGVvZiBmPT09InN0cmluZyI/aC5jbGFzc05hbWU9ZjpBcnJheS5pc0FycmF5KGYpP2guY2xhc3NOYW1lPWYuam9pbigiICIpOlhhKGgsZikpO2UubGVuZ3RoPjImJllhKGQsaCxlKTtyZXR1cm4gaH07dmFyIHc9ZnVuY3Rpb24oKXt0aGlzLmJhPXRoaXMuYmE7dGhpcy5rYT10aGlzLmthfTt3LnByb3RvdHlwZS5iYT0hMTt3LnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7dGhpcy5iYXx8KHRoaXMuYmE9ITAsdGhpcy5DKCkpfTt3LnByb3RvdHlwZVtTeW1ib2wuZGlzcG9zZV09ZnVuY3Rpb24oKXt0aGlzLmRpc3Bvc2UoKX07dy5wcm90b3R5cGUuQz1mdW5jdGlvbigpe2lmKHRoaXMua2EpZm9yKDt0aGlzLmthLmxlbmd0aDspdGhpcy5rYS5zaGlmdCgpKCl9O3ZhciB5PWZ1bmN0aW9uKGEsYil7dGhpcy50eXBlPWE7dGhpcy51PXRoaXMudGFyZ2V0PWI7dGhpcy5kZWZhdWx0UHJldmVudGVkPXRoaXMuQT0hMX07eS5wcm90b3R5cGUudj1mdW5jdGlvbigpe3RoaXMuQT0hMH07eS5wcm90b3R5cGUuaj1mdW5jdGlvbigpe3RoaXMuZGVmYXVsdFByZXZlbnRlZD0hMH07dmFyIGdiPWZ1bmN0aW9uKCl7aWYoIWwuYWRkRXZlbnRMaXN0ZW5lcnx8IU9iamVjdC5kZWZpbmVQcm9wZXJ0eSlyZXR1cm4hMTt2YXIgYT0hMSxiPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwicGFzc2l2ZSIse2dldDpmdW5jdGlvbigpe2E9ITB9fSk7dHJ5e3ZhciBjPWZ1bmN0aW9uKCl7fTtsLmFkZEV2ZW50TGlzdGVuZXIoInRlc3QiLGMsYik7bC5yZW1vdmVFdmVudExpc3RlbmVyKCJ0ZXN0IixjLGIpfWNhdGNoKGQpe31yZXR1cm4gYX0oKTt2YXIgej1mdW5jdGlvbihhLGIpe3kuY2FsbCh0aGlzLGE/YS50eXBlOiIiKTt0aGlzLnJlbGF0ZWRUYXJnZXQ9dGhpcy51PXRoaXMudGFyZ2V0PW51bGw7dGhpcy5idXR0b249dGhpcy5zY3JlZW5ZPXRoaXMuc2NyZWVuWD10aGlzLmNsaWVudFk9dGhpcy5jbGllbnRYPTA7dGhpcy5rZXk9IiI7dGhpcy5nPTA7dGhpcy5tZXRhS2V5PXRoaXMuc2hpZnRLZXk9dGhpcy5hbHRLZXk9dGhpcy5jdHJsS2V5PSExO3RoaXMuc3RhdGU9bnVsbDt0aGlzLkc9ITE7dGhpcy5wb2ludGVySWQ9MDt0aGlzLnBvaW50ZXJUeXBlPSIiO3RoaXMudGltZVN0YW1wPTA7dGhpcy5oPW51bGw7aWYoYSl7dmFyIGM9dGhpcy50eXBlPWEudHlwZSxkPWEuY2hhbmdlZFRvdWNoZXMmJmEuY2hhbmdlZFRvdWNoZXMubGVuZ3RoP2EuY2hhbmdlZFRvdWNoZXNbMF06bnVsbDt0aGlzLnRhcmdldD1hLnRhcmdldHx8YS5zcmNFbGVtZW50O3RoaXMudT1iO2I9YS5yZWxhdGVkVGFyZ2V0O2J8fChjPT0ibW91c2VvdmVyIj8KYj1hLmZyb21FbGVtZW50OmM9PSJtb3VzZW91dCImJihiPWEudG9FbGVtZW50KSk7dGhpcy5yZWxhdGVkVGFyZ2V0PWI7ZD8odGhpcy5jbGllbnRYPWQuY2xpZW50WCE9PXZvaWQgMD9kLmNsaWVudFg6ZC5wYWdlWCx0aGlzLmNsaWVudFk9ZC5jbGllbnRZIT09dm9pZCAwP2QuY2xpZW50WTpkLnBhZ2VZLHRoaXMuc2NyZWVuWD1kLnNjcmVlblh8fDAsdGhpcy5zY3JlZW5ZPWQuc2NyZWVuWXx8MCk6KHRoaXMuY2xpZW50WD1hLmNsaWVudFghPT12b2lkIDA/YS5jbGllbnRYOmEucGFnZVgsdGhpcy5jbGllbnRZPWEuY2xpZW50WSE9PXZvaWQgMD9hLmNsaWVudFk6YS5wYWdlWSx0aGlzLnNjcmVlblg9YS5zY3JlZW5YfHwwLHRoaXMuc2NyZWVuWT1hLnNjcmVlbll8fDApO3RoaXMuYnV0dG9uPWEuYnV0dG9uO3RoaXMuZz1hLmtleUNvZGV8fDA7dGhpcy5rZXk9YS5rZXl8fCIiO3RoaXMuY3RybEtleT1hLmN0cmxLZXk7dGhpcy5hbHRLZXk9YS5hbHRLZXk7dGhpcy5zaGlmdEtleT1hLnNoaWZ0S2V5Owp0aGlzLm1ldGFLZXk9YS5tZXRhS2V5O3RoaXMuRz12P2EubWV0YUtleTphLmN0cmxLZXk7dGhpcy5wb2ludGVySWQ9YS5wb2ludGVySWR8fDA7dGhpcy5wb2ludGVyVHlwZT1hLnBvaW50ZXJUeXBlO3RoaXMuc3RhdGU9YS5zdGF0ZTt0aGlzLnRpbWVTdGFtcD1hLnRpbWVTdGFtcDt0aGlzLmg9YTthLmRlZmF1bHRQcmV2ZW50ZWQmJnoubC5qLmNhbGwodGhpcyl9fTtuKHoseSk7ei5wcm90b3R5cGUudj1mdW5jdGlvbigpe3oubC52LmNhbGwodGhpcyk7dGhpcy5oLnN0b3BQcm9wYWdhdGlvbj90aGlzLmguc3RvcFByb3BhZ2F0aW9uKCk6dGhpcy5oLmNhbmNlbEJ1YmJsZT0hMH07ei5wcm90b3R5cGUuaj1mdW5jdGlvbigpe3oubC5qLmNhbGwodGhpcyk7dmFyIGE9dGhpcy5oO2EucHJldmVudERlZmF1bHQ/YS5wcmV2ZW50RGVmYXVsdCgpOmEucmV0dXJuVmFsdWU9ITF9O3ZhciBoYj0iY2xvc3VyZV9saXN0ZW5hYmxlXyIrKE1hdGgucmFuZG9tKCkqMUU2fDApLGliPWZ1bmN0aW9uKGEpe3JldHVybiEoIWF8fCFhW2hiXSl9O3ZhciBqYj0wO3ZhciBrYj1mdW5jdGlvbihhLGIsYyxkLGUpe3RoaXMubGlzdGVuZXI9YTt0aGlzLnByb3h5PW51bGw7dGhpcy5zcmM9Yjt0aGlzLnR5cGU9Yzt0aGlzLmNhcHR1cmU9ISFkO3RoaXMucGE9ZTt0aGlzLmtleT0rK2piO3RoaXMuamE9dGhpcy5vYT0hMX0sbGI9ZnVuY3Rpb24oYSl7YS5qYT0hMDthLmxpc3RlbmVyPW51bGw7YS5wcm94eT1udWxsO2Euc3JjPW51bGw7YS5wYT1udWxsfTt2YXIgbWI9ZnVuY3Rpb24oYSl7dGhpcy5zcmM9YTt0aGlzLmc9e307dGhpcy5oPTB9O21iLnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZj1hLnRvU3RyaW5nKCk7YT10aGlzLmdbZl07YXx8KGE9dGhpcy5nW2ZdPVtdLHRoaXMuaCsrKTt2YXIgaD1uYihhLGIsZCxlKTtoPi0xPyhiPWFbaF0sY3x8KGIub2E9ITEpKTooYj1uZXcga2IoYix0aGlzLnNyYyxmLCEhZCxlKSxiLm9hPWMsYS5wdXNoKGIpKTtyZXR1cm4gYn07CnZhciBvYj1mdW5jdGlvbihhLGIpe3ZhciBjPWIudHlwZTtjIGluIGEuZyYmeGEoYS5nW2NdLGIpJiYobGIoYiksYS5nW2NdLmxlbmd0aD09MCYmKGRlbGV0ZSBhLmdbY10sYS5oLS0pKX0scGI9ZnVuY3Rpb24oYSxiLGMsZCxlKXthPWEuZ1tiLnRvU3RyaW5nKCldO2I9LTE7YSYmKGI9bmIoYSxjLGQsZSkpO3JldHVybiBiPi0xP2FbYl06bnVsbH0sbmI9ZnVuY3Rpb24oYSxiLGMsZCl7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDsrK2Upe3ZhciBmPWFbZV07aWYoIWYuamEmJmYubGlzdGVuZXI9PWImJmYuY2FwdHVyZT09ISFjJiZmLnBhPT1kKXJldHVybiBlfXJldHVybi0xfTt2YXIgcWI9ImNsb3N1cmVfbG1fIisoTWF0aC5yYW5kb20oKSoxRTZ8MCkscmI9e30sc2I9MCx1Yj1mdW5jdGlvbihhLGIsYyxkLGUpe2lmKGQmJmQub25jZSlyZXR1cm4gdGIoYSxiLGMsZCxlKTtpZihBcnJheS5pc0FycmF5KGIpKXtmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKyl1YihhLGJbZl0sYyxkLGUpO3JldHVybiBudWxsfWM9dmIoYyk7cmV0dXJuIGliKGEpP3diKGEsYixjLG0oZCk/ISFkLmNhcHR1cmU6ISFkLGUpOnhiKGEsYixjLCExLGQsZSl9LHhiPWZ1bmN0aW9uKGEsYixjLGQsZSxmKXtpZighYil0aHJvdyBFcnJvcigiSW52YWxpZCBldmVudCB0eXBlIik7dmFyIGg9bShlKT8hIWUuY2FwdHVyZTohIWUsaz15YihhKTtrfHwoYVtxYl09az1uZXcgbWIoYSkpO2M9ay5hZGQoYixjLGQsaCxmKTtpZihjLnByb3h5KXJldHVybiBjO2Q9emIoKTtjLnByb3h5PWQ7ZC5zcmM9YTtkLmxpc3RlbmVyPWM7aWYoYS5hZGRFdmVudExpc3RlbmVyKWdifHwoZT1oKSxlPT09dm9pZCAwJiYKKGU9ITEpLGEuYWRkRXZlbnRMaXN0ZW5lcihiLnRvU3RyaW5nKCksZCxlKTtlbHNlIGlmKGEuYXR0YWNoRXZlbnQpYS5hdHRhY2hFdmVudChBYihiLnRvU3RyaW5nKCkpLGQpO2Vsc2UgaWYoYS5hZGRMaXN0ZW5lciYmYS5yZW1vdmVMaXN0ZW5lcilwKGI9PT0iY2hhbmdlIiwiTWVkaWFRdWVyeUxpc3Qgb25seSBoYXMgYSBjaGFuZ2UgZXZlbnQiKSxhLmFkZExpc3RlbmVyKGQpO2Vsc2UgdGhyb3cgRXJyb3IoImFkZEV2ZW50TGlzdGVuZXIgYW5kIGF0dGFjaEV2ZW50IGFyZSB1bmF2YWlsYWJsZS4iKTtzYisrO3JldHVybiBjfSx6Yj1mdW5jdGlvbigpe3ZhciBhPUJiLGI9ZnVuY3Rpb24oYyl7cmV0dXJuIGEuY2FsbChiLnNyYyxiLmxpc3RlbmVyLGMpfTtyZXR1cm4gYn0sdGI9ZnVuY3Rpb24oYSxiLGMsZCxlKXtpZihBcnJheS5pc0FycmF5KGIpKXtmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKyl0YihhLGJbZl0sYyxkLGUpO3JldHVybiBudWxsfWM9dmIoYyk7cmV0dXJuIGliKGEpPwphLkEuYWRkKFN0cmluZyhiKSxjLCEwLG0oZCk/ISFkLmNhcHR1cmU6ISFkLGUpOnhiKGEsYixjLCEwLGQsZSl9LENiPWZ1bmN0aW9uKGEsYixjLGQsZSl7aWYoQXJyYXkuaXNBcnJheShiKSlmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKylDYihhLGJbZl0sYyxkLGUpO2Vsc2UgZD1tKGQpPyEhZC5jYXB0dXJlOiEhZCxjPXZiKGMpLGliKGEpPyhhPWEuQSxiPVN0cmluZyhiKS50b1N0cmluZygpLGIgaW4gYS5nJiYoZj1hLmdbYl0sYz1uYihmLGMsZCxlKSxjPi0xJiYobGIoZltjXSkscChmLmxlbmd0aCE9bnVsbCksQXJyYXkucHJvdG90eXBlLnNwbGljZS5jYWxsKGYsYywxKSxmLmxlbmd0aD09MCYmKGRlbGV0ZSBhLmdbYl0sYS5oLS0pKSkpOmEmJihhPXliKGEpKSYmKGM9cGIoYSxiLGMsZCxlKSkmJkEoYyl9LEE9ZnVuY3Rpb24oYSl7aWYodHlwZW9mIGEhPT0ibnVtYmVyIiYmYSYmIWEuamEpe3ZhciBiPWEuc3JjO2lmKGliKGIpKW9iKGIuQSxhKTtlbHNle3ZhciBjPWEudHlwZSwKZD1hLnByb3h5O2IucmVtb3ZlRXZlbnRMaXN0ZW5lcj9iLnJlbW92ZUV2ZW50TGlzdGVuZXIoYyxkLGEuY2FwdHVyZSk6Yi5kZXRhY2hFdmVudD9iLmRldGFjaEV2ZW50KEFiKGMpLGQpOmIuYWRkTGlzdGVuZXImJmIucmVtb3ZlTGlzdGVuZXImJmIucmVtb3ZlTGlzdGVuZXIoZCk7c2ItLTsoYz15YihiKSk/KG9iKGMsYSksYy5oPT0wJiYoYy5zcmM9bnVsbCxiW3FiXT1udWxsKSk6bGIoYSl9fX0sQWI9ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW4gcmI/cmJbYV06cmJbYV09Im9uIithfSxCYj1mdW5jdGlvbihhLGIpe2lmKGEuamEpYT0hMDtlbHNle2I9bmV3IHooYix0aGlzKTt2YXIgYz1hLmxpc3RlbmVyLGQ9YS5wYXx8YS5zcmM7YS5vYSYmQShhKTthPWMuY2FsbChkLGIpfXJldHVybiBhfSx5Yj1mdW5jdGlvbihhKXthPWFbcWJdO3JldHVybiBhIGluc3RhbmNlb2YgbWI/YTpudWxsfSxEYj0iX19jbG9zdXJlX2V2ZW50c19mbl8iKyhNYXRoLnJhbmRvbSgpKjFFOT4+PjApLHZiPWZ1bmN0aW9uKGEpe3AoYSwKIkxpc3RlbmVyIGNhbiBub3QgYmUgbnVsbC4iKTtpZih0eXBlb2YgYT09PSJmdW5jdGlvbiIpcmV0dXJuIGE7cChhLmhhbmRsZUV2ZW50LCJBbiBvYmplY3QgbGlzdGVuZXIgbXVzdCBoYXZlIGhhbmRsZUV2ZW50IG1ldGhvZC4iKTthW0RiXXx8KGFbRGJdPWZ1bmN0aW9uKGIpe3JldHVybiBhLmhhbmRsZUV2ZW50KGIpfSk7cmV0dXJuIGFbRGJdfTt2YXIgRWI9ZnVuY3Rpb24oYSl7dy5jYWxsKHRoaXMpO3RoaXMuaD1hO3RoaXMuZz17fX07bihFYix3KTsKdmFyIEZiPVtdLEI9ZnVuY3Rpb24oYSxiLGMsZCl7QXJyYXkuaXNBcnJheShjKXx8KGMmJihGYlswXT1jLnRvU3RyaW5nKCkpLGM9RmIpO2Zvcih2YXIgZT0wO2U8Yy5sZW5ndGg7ZSsrKXt2YXIgZj11YihiLGNbZV0sZHx8YS5oYW5kbGVFdmVudCwhMSxhLmh8fGEpO2lmKCFmKWJyZWFrO2EuZ1tmLmtleV09Zn1yZXR1cm4gYX0sQz1mdW5jdGlvbihhLGIsYyxkLGUsZil7aWYoQXJyYXkuaXNBcnJheShjKSlmb3IodmFyIGg9MDtoPGMubGVuZ3RoO2grKylDKGEsYixjW2hdLGQsZSxmKTtlbHNlIGQ9ZHx8YS5oYW5kbGVFdmVudCxlPW0oZSk/ISFlLmNhcHR1cmU6ISFlLGY9Znx8YS5ofHxhLGQ9dmIoZCksZT0hIWUsYz1pYihiKT9wYihiLkEsU3RyaW5nKGMpLGQsZSxmKTpiPyhiPXliKGIpKT9wYihiLGMsZCxlLGYpOm51bGw6bnVsbCxjJiYoQShjKSxkZWxldGUgYS5nW2Mua2V5XSk7cmV0dXJuIGF9LEdiPWZ1bmN0aW9uKGEpe0JhKGEuZyxmdW5jdGlvbihiLGMpe3RoaXMuZy5oYXNPd25Qcm9wZXJ0eShjKSYmCkEoYil9LGEpO2EuZz17fX07RWIucHJvdG90eXBlLkM9ZnVuY3Rpb24oKXtFYi5sLkMuY2FsbCh0aGlzKTtHYih0aGlzKX07RWIucHJvdG90eXBlLmhhbmRsZUV2ZW50PWZ1bmN0aW9uKCl7dGhyb3cgRXJyb3IoIkV2ZW50SGFuZGxlci5oYW5kbGVFdmVudCBub3QgaW1wbGVtZW50ZWQiKTt9O3ZhciBEPWZ1bmN0aW9uKCl7dy5jYWxsKHRoaXMpO3RoaXMuQT1uZXcgbWIodGhpcyk7dGhpcy5ZYT10aGlzO3RoaXMubGE9bnVsbH07bihELHcpO0QucHJvdG90eXBlW2hiXT0hMDtELnByb3RvdHlwZS5BYT1mdW5jdGlvbihhKXt0aGlzLmxhPWF9O0QucHJvdG90eXBlLnJlbW92ZUV2ZW50TGlzdGVuZXI9ZnVuY3Rpb24oYSxiLGMsZCl7Q2IodGhpcyxhLGIsYyxkKX07CnZhciBFPWZ1bmN0aW9uKGEsYil7SGIoYSk7dmFyIGM9YS5sYTtpZihjKXt2YXIgZD1bXTtmb3IodmFyIGU9MTtjO2M9Yy5sYSlkLnB1c2goYykscCgrK2U8MUUzLCJpbmZpbml0ZSBsb29wIil9YT1hLllhO2M9Yi50eXBlfHxiO3R5cGVvZiBiPT09InN0cmluZyI/Yj1uZXcgeShiLGEpOmIgaW5zdGFuY2VvZiB5P2IudGFyZ2V0PWIudGFyZ2V0fHxhOihlPWIsYj1uZXcgeShjLGEpLEdhKGIsZSkpO2U9ITA7dmFyIGY7aWYoZClmb3IoZj1kLmxlbmd0aC0xOyFiLkEmJmY+PTA7Zi0tKXt2YXIgaD1iLnU9ZFtmXTtlPUliKGgsYywhMCxiKSYmZX1iLkF8fChoPWIudT1hLGU9SWIoaCxjLCEwLGIpJiZlLGIuQXx8KGU9SWIoaCxjLCExLGIpJiZlKSk7aWYoZClmb3IoZj0wOyFiLkEmJmY8ZC5sZW5ndGg7ZisrKWg9Yi51PWRbZl0sZT1JYihoLGMsITEsYikmJmU7cmV0dXJuIGV9OwpELnByb3RvdHlwZS5DPWZ1bmN0aW9uKCl7RC5sLkMuY2FsbCh0aGlzKTtpZih0aGlzLkEpe3ZhciBhPXRoaXMuQSxiPTAsYztmb3IoYyBpbiBhLmcpe2Zvcih2YXIgZD1hLmdbY10sZT0wO2U8ZC5sZW5ndGg7ZSsrKSsrYixsYihkW2VdKTtkZWxldGUgYS5nW2NdO2EuaC0tfX10aGlzLmxhPW51bGx9O3ZhciB3Yj1mdW5jdGlvbihhLGIsYyxkLGUpe0hiKGEpO3JldHVybiBhLkEuYWRkKFN0cmluZyhiKSxjLCExLGQsZSl9LEliPWZ1bmN0aW9uKGEsYixjLGQpe2I9YS5BLmdbU3RyaW5nKGIpXTtpZighYilyZXR1cm4hMDtiPWIuY29uY2F0KCk7Zm9yKHZhciBlPSEwLGY9MDtmPGIubGVuZ3RoOysrZil7dmFyIGg9YltmXTtpZihoJiYhaC5qYSYmaC5jYXB0dXJlPT1jKXt2YXIgaz1oLmxpc3RlbmVyLHE9aC5wYXx8aC5zcmM7aC5vYSYmb2IoYS5BLGgpO2U9ay5jYWxsKHEsZCkhPT0hMSYmZX19cmV0dXJuIGUmJiFkLmRlZmF1bHRQcmV2ZW50ZWR9LEhiPWZ1bmN0aW9uKGEpe3AoYS5BLCJFdmVudCB0YXJnZXQgaXMgbm90IGluaXRpYWxpemVkLiBEaWQgeW91IGNhbGwgdGhlIHN1cGVyY2xhc3MgKGdvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0KSBjb25zdHJ1Y3Rvcj8iKX07dmFyIEpiPXQ/Ik1velVzZXJTZWxlY3QiOnV8fFZhPyJXZWJraXRVc2VyU2VsZWN0IjpudWxsLEtiPWZ1bmN0aW9uKGEsYil7Yj1iP251bGw6YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpO2lmKEpiJiYoYS5zdHlsZSYmKGEuc3R5bGVbSmJdPSJub25lIiksYikpZm9yKHZhciBjPTA7YT1iW2NdO2MrKylhLnN0eWxlJiYoYS5zdHlsZVtKYl09Im5vbmUiKX07dmFyIExiPWZ1bmN0aW9uKCl7fTtpYShMYik7TGIucHJvdG90eXBlLmc9MDt2YXIgRj1mdW5jdGlvbihhKXtELmNhbGwodGhpcyk7dGhpcy5HPWF8fHBhfHwocGE9bmV3IGZiKTt0aGlzLnphPU1iO3RoaXMuWT1udWxsO3RoaXMucz0hMTt0aGlzLmc9bnVsbDt0aGlzLk09dm9pZCAwO3RoaXMudT10aGlzLmo9dGhpcy5oPW51bGw7dGhpcy5TYT0hMX07bihGLEQpO0YucHJvdG90eXBlLlphPUxiLlYoKTsKdmFyIE1iPW51bGwsTmI9ZnVuY3Rpb24oYSxiKXtzd2l0Y2goYSl7Y2FzZSAxOnJldHVybiBiPyJkaXNhYmxlIjoiZW5hYmxlIjtjYXNlIDI6cmV0dXJuIGI/ImhpZ2hsaWdodCI6InVuaGlnaGxpZ2h0IjtjYXNlIDQ6cmV0dXJuIGI/ImFjdGl2YXRlIjoiZGVhY3RpdmF0ZSI7Y2FzZSA4OnJldHVybiBiPyJzZWxlY3QiOiJ1bnNlbGVjdCI7Y2FzZSAxNjpyZXR1cm4gYj8iY2hlY2siOiJ1bmNoZWNrIjtjYXNlIDMyOnJldHVybiBiPyJmb2N1cyI6ImJsdXIiO2Nhc2UgNjQ6cmV0dXJuIGI/Im9wZW4iOiJjbG9zZSJ9dGhyb3cgRXJyb3IoIkludmFsaWQgY29tcG9uZW50IHN0YXRlIik7fSxPYj1mdW5jdGlvbihhKXtyZXR1cm4gYS5ZfHwoYS5ZPSI6IisoYS5aYS5nKyspLnRvU3RyaW5nKDM2KSl9LFBiPWZ1bmN0aW9uKGEsYil7aWYoYS5oJiZhLmgudSl7dmFyIGM9YS5oLnUsZD1hLlk7ZCBpbiBjJiZkZWxldGUgY1tkXTtEYShhLmgudSxiLGEpfWEuWT1ifTtGLnByb3RvdHlwZS5pPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ307CnZhciBRYj1mdW5jdGlvbihhKXthLk18fChhLk09bmV3IEViKGEpKTtyZXR1cm4gcChhLk0pfTtGLnByb3RvdHlwZS5BYT1mdW5jdGlvbihhKXtpZih0aGlzLmgmJnRoaXMuaCE9YSl0aHJvdyBFcnJvcigiTWV0aG9kIG5vdCBzdXBwb3J0ZWQiKTtGLmwuQWEuY2FsbCh0aGlzLGEpfTtGLnByb3RvdHlwZS5tYT1mdW5jdGlvbigpe3RoaXMuZz1aYSh0aGlzLkcuZywiRElWIil9O0YucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbihhKXtSYih0aGlzLGEpfTsKdmFyIFJiPWZ1bmN0aW9uKGEsYixjKXtpZihhLnMpdGhyb3cgRXJyb3IoIkNvbXBvbmVudCBhbHJlYWR5IHJlbmRlcmVkIik7YS5nfHxhLm1hKCk7Yj9iLmluc2VydEJlZm9yZShhLmcsY3x8bnVsbCk6YS5HLmcuYm9keS5hcHBlbmRDaGlsZChhLmcpO2EuaCYmIWEuaC5zfHxhLkkoKX0sU2I9ZnVuY3Rpb24oYSxiKXtpZihhLnMpdGhyb3cgRXJyb3IoIkNvbXBvbmVudCBhbHJlYWR5IHJlbmRlcmVkIik7aWYoYiYmYS53YShiKSl7YS5TYT0hMDt2YXIgYz1iYihiKTthLkcmJmEuRy5nPT1jfHwoYS5HPWI/bmV3IGZiKGJiKGIpKTpwYXx8KHBhPW5ldyBmYikpO2EuRWEoYik7YS5JKCl9ZWxzZSB0aHJvdyBFcnJvcigiSW52YWxpZCBlbGVtZW50IHRvIGRlY29yYXRlIik7fTtnPUYucHJvdG90eXBlO2cud2E9ZnVuY3Rpb24oKXtyZXR1cm4hMH07Zy5FYT1mdW5jdGlvbihhKXt0aGlzLmc9YX07CmcuST1mdW5jdGlvbigpe3RoaXMucz0hMDtUYih0aGlzLGZ1bmN0aW9uKGEpeyFhLnMmJmEuaSgpJiZhLkkoKX0pfTtnLlU9ZnVuY3Rpb24oKXtUYih0aGlzLGZ1bmN0aW9uKGEpe2EucyYmYS5VKCl9KTt0aGlzLk0mJkdiKHRoaXMuTSk7dGhpcy5zPSExfTtnLkM9ZnVuY3Rpb24oKXt0aGlzLnMmJnRoaXMuVSgpO3RoaXMuTSYmKHRoaXMuTS5kaXNwb3NlKCksZGVsZXRlIHRoaXMuTSk7VGIodGhpcyxmdW5jdGlvbihhKXthLmRpc3Bvc2UoKX0pOyF0aGlzLlNhJiZ0aGlzLmcmJiRhKHRoaXMuZyk7dGhpcy5oPXRoaXMuZz10aGlzLnU9dGhpcy5qPW51bGw7Ri5sLkMuY2FsbCh0aGlzKX07Zy5CYT1mdW5jdGlvbihhLGIpe3RoaXMuQ2EoYSxIKHRoaXMpLGIpfTsKZy5DYT1mdW5jdGlvbihhLGIsYyl7cCghIWEsIlByb3ZpZGVkIGVsZW1lbnQgbXVzdCBub3QgYmUgbnVsbC4iKTtpZihhLnMmJihjfHwhdGhpcy5zKSl0aHJvdyBFcnJvcigiQ29tcG9uZW50IGFscmVhZHkgcmVuZGVyZWQiKTtpZihiPDB8fGI+SCh0aGlzKSl0aHJvdyBFcnJvcigiQ2hpbGQgY29tcG9uZW50IGluZGV4IG91dCBvZiBib3VuZHMiKTt0aGlzLnUmJnRoaXMuanx8KHRoaXMudT17fSx0aGlzLmo9W10pO2lmKGEuaD09dGhpcyl7dmFyIGQ9dGhpcy51LGU9T2IoYSk7ZFtlXT1hO3hhKHRoaXMuaixhKX1lbHNlIERhKHRoaXMudSxPYihhKSxhKTtpZihhPT10aGlzKXRocm93IEVycm9yKCJVbmFibGUgdG8gc2V0IHBhcmVudCBjb21wb25lbnQiKTtpZihkPXRoaXMmJmEuaCYmYS5ZKWU9YS5oLGQ9YS5ZLGUudSYmZD8oZT1lLnUsZD0oZSE9PW51bGwmJmQgaW4gZT9lW2RdOnZvaWQgMCl8fG51bGwpOmQ9bnVsbDtpZihkJiZhLmghPXRoaXMpdGhyb3cgRXJyb3IoIlVuYWJsZSB0byBzZXQgcGFyZW50IGNvbXBvbmVudCIpOwphLmg9dGhpcztGLmwuQWEuY2FsbChhLHRoaXMpO3phKHRoaXMuaixiLDAsYSk7YS5zJiZ0aGlzLnMmJmEuaD09dGhpcz8oYz10aGlzLm5hKCksKGMuY2hpbGROb2Rlc1tiXXx8bnVsbCkhPWEuaSgpJiYoYS5pKCkucGFyZW50RWxlbWVudD09YyYmYy5yZW1vdmVDaGlsZChhLmkoKSksYj1jLmNoaWxkTm9kZXNbYl18fG51bGwsYy5pbnNlcnRCZWZvcmUoYS5pKCksYikpKTpjPyh0aGlzLmd8fHRoaXMubWEoKSxiPUkodGhpcyxiKzEpLFJiKGEsdGhpcy5uYSgpLGI/Yi5nOm51bGwpKTp0aGlzLnMmJiFhLnMmJmEuZyYmYS5nLnBhcmVudE5vZGUmJmEuZy5wYXJlbnROb2RlLm5vZGVUeXBlPT0xJiZhLkkoKX07Zy5uYT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmd9Owp2YXIgVWI9ZnVuY3Rpb24oYSl7aWYoYS56YT09bnVsbCl7dmFyIGI9YS5zP2EuZzphLkcuZy5ib2R5O2E6e3ZhciBjPWJiKGIpO2lmKGMuZGVmYXVsdFZpZXcmJmMuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSYmKGM9Yy5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKGIsbnVsbCkpKXtjPWMuZGlyZWN0aW9ufHxjLmdldFByb3BlcnR5VmFsdWUoImRpcmVjdGlvbiIpfHwiIjticmVhayBhfWM9IiJ9YS56YT0icnRsIj09KGN8fChiLmN1cnJlbnRTdHlsZT9iLmN1cnJlbnRTdHlsZS5kaXJlY3Rpb246bnVsbCl8fGIuc3R5bGUmJmIuc3R5bGUuZGlyZWN0aW9uKX1yZXR1cm4gYS56YX0sSD1mdW5jdGlvbihhKXtyZXR1cm4gYS5qP2Euai5sZW5ndGg6MH0sST1mdW5jdGlvbihhLGIpe3JldHVybiBhLmo/YS5qW2JdfHxudWxsOm51bGx9LFRiPWZ1bmN0aW9uKGEsYixjKXthLmomJmEuai5mb3JFYWNoKGIsYyl9LFZiPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuaiYmYj9hLmouaW5kZXhPZihiKToKLTF9O3ZhciBXYj17bWI6ImFjdGl2ZWRlc2NlbmRhbnQiLHJiOiJhdG9taWMiLHNiOiJhdXRvY29tcGxldGUiLHViOiJidXN5Iix4YjoiY2hlY2tlZCIseWI6ImNvbGluZGV4IixEYjoiY29udHJvbHMiLEViOiJjdXJyZW50IixHYjoiZGVzY3JpYmVkYnkiLEpiOiJkaXNhYmxlZCIsTGI6ImRyb3BlZmZlY3QiLE1iOiJleHBhbmRlZCIsTmI6ImZsb3d0byIsUGI6ImdyYWJiZWQiLFRiOiJoYXNwb3B1cCIsVmI6ImhpZGRlbiIsWGI6ImludmFsaWQiLFliOiJsYWJlbCIsWmI6ImxhYmVsbGVkYnkiLGFjOiJsZXZlbCIsZmM6ImxpdmUiLHZjOiJtdWx0aWxpbmUiLHdjOiJtdWx0aXNlbGVjdGFibGUiLEFjOiJvcmllbnRhdGlvbiIsQmM6Im93bnMiLENjOiJwb3NpbnNldCIsRWM6InByZXNzZWQiLEljOiJyZWFkb25seSIsS2M6InJlbGV2YW50IixMYzoicmVxdWlyZWQiLFBjOiJyb3dpbmRleCIsU2M6InNlbGVjdGVkIixVYzoic2V0c2l6ZSIsV2M6InNvcnQiLG1kOiJ2YWx1ZW1heCIsbmQ6InZhbHVlbWluIiwKb2Q6InZhbHVlbm93IixwZDoidmFsdWV0ZXh0In07dmFyIFhiO3ZhciBZYj17bmI6ImFsZXJ0IixvYjoiYWxlcnRkaWFsb2ciLHBiOiJhcHBsaWNhdGlvbiIscWI6ImFydGljbGUiLHRiOiJiYW5uZXIiLHZiOiJidXR0b24iLHdiOiJjaGVja2JveCIsemI6ImNvbHVtbmhlYWRlciIsQWI6ImNvbWJvYm94IixCYjoiY29tcGxlbWVudGFyeSIsQ2I6ImNvbnRlbnRpbmZvIixGYjoiZGVmaW5pdGlvbiIsSGI6ImRpYWxvZyIsSWI6ImRpcmVjdG9yeSIsS2I6ImRvY3VtZW50IixPYjoiZm9ybSIsUWI6ImdyaWQiLFJiOiJncmlkY2VsbCIsU2I6Imdyb3VwIixVYjoiaGVhZGluZyIsV2I6ImltZyIsYmM6ImxpbmsiLGNjOiJsaXN0IixkYzoibGlzdGJveCIsZWM6Imxpc3RpdGVtIixoYzoibG9nIixpYzoibWFpbiIsamM6Im1hcnF1ZWUiLGtjOiJtYXRoIixsYzoibWVudSIsbWM6Im1lbnViYXIiLG5jOiJtZW51aXRlbSIsb2M6Im1lbnVpdGVtY2hlY2tib3giLHBjOiJtZW51aXRlbXJhZGlvIix4YzoibmF2aWdhdGlvbiIseWM6Im5vdGUiLHpjOiJvcHRpb24iLApEYzoicHJlc2VudGF0aW9uIixGYzoicHJvZ3Jlc3NiYXIiLEdjOiJyYWRpbyIsSGM6InJhZGlvZ3JvdXAiLEpjOiJyZWdpb24iLE1jOiJyb3ciLE5jOiJyb3dncm91cCIsT2M6InJvd2hlYWRlciIsUWM6InNjcm9sbGJhciIsUmM6InNlYXJjaCIsVGM6InNlcGFyYXRvciIsVmM6InNsaWRlciIsWGM6InNwaW5idXR0b24iLFljOiJzdGF0dXMiLFpjOiJzd2l0Y2giLGFkOiJ0YWIiLGJkOiJ0YWJsaXN0IixjZDoidGFicGFuZWwiLGRkOiJ0ZXh0Ym94IixlZDoidGV4dGluZm8iLGZkOiJ0aW1lciIsZ2Q6InRvb2xiYXIiLGhkOiJ0b29sdGlwIixqZDoidHJlZSIsa2Q6InRyZWVncmlkIixsZDoidHJlZWl0ZW0ifTt2YXIgWmI9ZnVuY3Rpb24oYSxiKXtiPyhwKENhKFliLGIpLCJObyBzdWNoIEFSSUEgcm9sZSAiK2IpLGEuc2V0QXR0cmlidXRlKCJyb2xlIixiKSk6YS5yZW1vdmVBdHRyaWJ1dGUoInJvbGUiKX0sYWM9ZnVuY3Rpb24oYSxiLGMpe0FycmF5LmlzQXJyYXkoYykmJihjPWMuam9pbigiICIpKTt2YXIgZD0kYihiKTtjPT09IiJ8fGM9PXZvaWQgMD8oWGJ8fChjPXt9LFhiPShjLmF0b21pYz0hMSxjLmF1dG9jb21wbGV0ZT0ibm9uZSIsYy5kcm9wZWZmZWN0PSJub25lIixjLmhhc3BvcHVwPSExLGMubGl2ZT0ib2ZmIixjLm11bHRpbGluZT0hMSxjLm11bHRpc2VsZWN0YWJsZT0hMSxjLm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIsYy5yZWFkb25seT0hMSxjLnJlbGV2YW50PSJhZGRpdGlvbnMgdGV4dCIsYy5yZXF1aXJlZD0hMSxjLnNvcnQ9Im5vbmUiLGMuYnVzeT0hMSxjLmRpc2FibGVkPSExLGMuaGlkZGVuPSExLGMuaW52YWxpZD0iZmFsc2UiLGMpKSxjPVhiLGIgaW4gYz9hLnNldEF0dHJpYnV0ZShkLApjW2JdKTphLnJlbW92ZUF0dHJpYnV0ZShkKSk6YS5zZXRBdHRyaWJ1dGUoZCxjKX0sJGI9ZnVuY3Rpb24oYSl7cChhLCJBUklBIGF0dHJpYnV0ZSBjYW5ub3QgYmUgZW1wdHkuIik7cChDYShXYixhKSwiTm8gc3VjaCBBUklBIGF0dHJpYnV0ZSAiK2EpO3JldHVybiJhcmlhLSIrYX07dmFyIGRjPWZ1bmN0aW9uKGEsYixjLGQsZSxmKXtpZih2JiZlKXJldHVybiBiYyhhKTtpZihlJiYhZClyZXR1cm4hMTtpZighdCl7dHlwZW9mIGI9PT0ibnVtYmVyIiYmKGI9Y2MoYikpO3ZhciBoPWI9PTE3fHxiPT0xOHx8diYmYj09OTE7aWYoKCFjfHx2KSYmaHx8diYmYj09MTYmJihkfHxmKSlyZXR1cm4hMX1pZih1JiZkJiZjKXN3aXRjaChhKXtjYXNlIDIyMDpjYXNlIDIxOTpjYXNlIDIyMTpjYXNlIDE5MjpjYXNlIDE4NjpjYXNlIDE4OTpjYXNlIDE4NzpjYXNlIDE4ODpjYXNlIDE5MDpjYXNlIDE5MTpjYXNlIDE5MjpjYXNlIDIyMjpyZXR1cm4hMX1zd2l0Y2goYSl7Y2FzZSAxMzpyZXR1cm4gdD9mfHxlPyExOiEoYyYmZCk6ITA7Y2FzZSAyNzpyZXR1cm4hdSYmIXR9cmV0dXJuIHQmJihkfHxlfHxmKT8hMTpiYyhhKX0sYmM9ZnVuY3Rpb24oYSl7aWYoYT49NDgmJmE8PTU3fHxhPj05NiYmYTw9MTA2fHxhPj02NSYmYTw9OTB8fHUmJmE9PTApcmV0dXJuITA7c3dpdGNoKGEpe2Nhc2UgMzI6Y2FzZSA0MzpjYXNlIDYzOmNhc2UgNjQ6Y2FzZSAxMDc6Y2FzZSAxMDk6Y2FzZSAxMTA6Y2FzZSAxMTE6Y2FzZSAxODY6Y2FzZSA1OTpjYXNlIDE4OTpjYXNlIDE4NzpjYXNlIDYxOmNhc2UgMTg4OmNhc2UgMTkwOmNhc2UgMTkxOmNhc2UgMTkyOmNhc2UgMjIyOmNhc2UgMjE5OmNhc2UgMjIwOmNhc2UgMjIxOmNhc2UgMTYzOmNhc2UgNTg6cmV0dXJuITA7CmNhc2UgMTczOmNhc2UgMTcxOnJldHVybiB0O2RlZmF1bHQ6cmV0dXJuITF9fSxjYz1mdW5jdGlvbihhKXtpZih0KWE9ZWMoYSk7ZWxzZSBpZih2JiZ1KXN3aXRjaChhKXtjYXNlIDkzOmE9OTF9cmV0dXJuIGF9LGVjPWZ1bmN0aW9uKGEpe3N3aXRjaChhKXtjYXNlIDYxOnJldHVybiAxODc7Y2FzZSA1OTpyZXR1cm4gMTg2O2Nhc2UgMTczOnJldHVybiAxODk7Y2FzZSAyMjQ6cmV0dXJuIDkxO2Nhc2UgMDpyZXR1cm4gMjI0O2RlZmF1bHQ6cmV0dXJuIGF9fTt2YXIgZmM9ZnVuY3Rpb24oYSxiLGMsZCl7ei5jYWxsKHRoaXMsZCk7dGhpcy50eXBlPSJrZXkiO3RoaXMuZz1hO3RoaXMucmVwZWF0PWN9O24oZmMseik7dmFyIEo9ZnVuY3Rpb24oYSxiKXtELmNhbGwodGhpcyk7YSYmZ2ModGhpcyxhLGIpfTtuKEosRCk7Zz1KLnByb3RvdHlwZTtnLlI9bnVsbDtnLnFhPW51bGw7Zy5KYT1udWxsO2cucmE9bnVsbDtnLkY9LTE7Zy5LPS0xO2cuRGE9ITE7CnZhciBoYz17MzoxMywxMjoxNDQsNjMyMzI6MzgsNjMyMzM6NDAsNjMyMzQ6MzcsNjMyMzU6MzksNjMyMzY6MTEyLDYzMjM3OjExMyw2MzIzODoxMTQsNjMyMzk6MTE1LDYzMjQwOjExNiw2MzI0MToxMTcsNjMyNDI6MTE4LDYzMjQzOjExOSw2MzI0NDoxMjAsNjMyNDU6MTIxLDYzMjQ2OjEyMiw2MzI0NzoxMjMsNjMyNDg6NDQsNjMyNzI6NDYsNjMyNzM6MzYsNjMyNzU6MzUsNjMyNzY6MzMsNjMyNzc6MzQsNjMyODk6MTQ0LDYzMzAyOjQ1fSxpYz17VXA6MzgsRG93bjo0MCxMZWZ0OjM3LFJpZ2h0OjM5LEVudGVyOjEzLEYxOjExMixGMjoxMTMsRjM6MTE0LEY0OjExNSxGNToxMTYsRjY6MTE3LEY3OjExOCxGODoxMTksRjk6MTIwLEYxMDoxMjEsRjExOjEyMixGMTI6MTIzLCJVKzAwN0YiOjQ2LEhvbWU6MzYsRW5kOjM1LFBhZ2VVcDozMyxQYWdlRG93bjozNCxJbnNlcnQ6NDV9LGpjPXYmJnQ7CkoucHJvdG90eXBlLmc9ZnVuY3Rpb24oYSl7dSYmKHRoaXMuRj09MTcmJiFhLmN0cmxLZXl8fHRoaXMuRj09MTgmJiFhLmFsdEtleXx8diYmdGhpcy5GPT05MSYmIWEubWV0YUtleSkmJih0aGlzLks9dGhpcy5GPS0xKTt0aGlzLkY9PS0xJiYoYS5jdHJsS2V5JiZhLmchPTE3P3RoaXMuRj0xNzphLmFsdEtleSYmYS5nIT0xOD90aGlzLkY9MTg6YS5tZXRhS2V5JiZhLmchPTkxJiYodGhpcy5GPTkxKSk7ZGMoYS5nLHRoaXMuRixhLnNoaWZ0S2V5LGEuY3RybEtleSxhLmFsdEtleSxhLm1ldGFLZXkpPyh0aGlzLks9Y2MoYS5nKSxqYyYmKHRoaXMuRGE9YS5hbHRLZXkpKTp0aGlzLmhhbmRsZUV2ZW50KGEpfTtKLnByb3RvdHlwZS5oPWZ1bmN0aW9uKGEpe3RoaXMuSz10aGlzLkY9LTE7dGhpcy5EYT1hLmFsdEtleX07CkoucHJvdG90eXBlLmhhbmRsZUV2ZW50PWZ1bmN0aW9uKGEpe3ZhciBiPWEuaCxjPWIuYWx0S2V5O2lmKHUmJmEudHlwZT09ImtleXByZXNzIil7dmFyIGQ9dGhpcy5LO3ZhciBlPWIuY2hhckNvZGU+PTAmJmIuY2hhckNvZGU8NjMyMzImJmJjKGQpP2IuY2hhckNvZGU6MH1lbHNlIGEudHlwZT09ImtleXByZXNzIj8oamMmJihjPXRoaXMuRGEpLGIua2V5Q29kZT09Yi5jaGFyQ29kZT9iLmtleUNvZGU8MzI/KGQ9Yi5rZXlDb2RlLGU9MCk6KGQ9dGhpcy5LLGU9Yi5jaGFyQ29kZSk6KGQ9Yi5rZXlDb2RlfHx0aGlzLkssZT1iLmNoYXJDb2RlfHwwKSk6KGQ9Yi5rZXlDb2RlfHx0aGlzLkssZT1iLmNoYXJDb2RlfHwwKSx2JiZlPT02MyYmZD09MjI0JiYoZD0xOTEpO3ZhciBmPWQ9Y2MoZCk7ZD9kPj02MzIzMiYmZCBpbiBoYz9mPWhjW2RdOmQ9PTI1JiZhLnNoaWZ0S2V5JiYoZj05KTpiLmtleUlkZW50aWZpZXImJmIua2V5SWRlbnRpZmllciBpbiBpYyYmKGY9aWNbYi5rZXlJZGVudGlmaWVyXSk7CmlmKCF0fHxhLnR5cGUhPSJrZXlwcmVzcyJ8fGRjKGYsdGhpcy5GLGEuc2hpZnRLZXksYS5jdHJsS2V5LGMsYS5tZXRhS2V5KSlhPWY9PXRoaXMuRix0aGlzLkY9ZixiPW5ldyBmYyhmLGUsYSxiKSxiLmFsdEtleT1jLEUodGhpcyxiKX07Si5wcm90b3R5cGUuaT1mdW5jdGlvbigpe3JldHVybiB0aGlzLlJ9O3ZhciBnYz1mdW5jdGlvbihhLGIsYyl7YS5yYSYma2MoYSk7YS5SPWI7YS5xYT11YihhLlIsImtleXByZXNzIixhLGMpO2EuSmE9dWIoYS5SLCJrZXlkb3duIixhLmcsYyxhKTthLnJhPXViKGEuUiwia2V5dXAiLGEuaCxjLGEpfSxrYz1mdW5jdGlvbihhKXthLnFhJiYoQShhLnFhKSxBKGEuSmEpLEEoYS5yYSksYS5xYT1udWxsLGEuSmE9bnVsbCxhLnJhPW51bGwpO2EuUj1udWxsO2EuRj0tMTthLks9LTF9O0oucHJvdG90eXBlLkM9ZnVuY3Rpb24oKXtKLmwuQy5jYWxsKHRoaXMpO2tjKHRoaXMpfTt2YXIgSz17Z2E6Im1vdXNlZG93biIsaGE6Im1vdXNldXAiLGZhOiJtb3VzZWNhbmNlbCIsc2M6Im1vdXNlbW92ZSIsdWM6Im1vdXNlb3ZlciIsdGM6Im1vdXNlb3V0IixxYzoibW91c2VlbnRlciIscmM6Im1vdXNlbGVhdmUifTt2YXIgbGM9ZnVuY3Rpb24oYSl7cmV0dXJuIHR5cGVvZiBhLmNsYXNzTmFtZT09InN0cmluZyI/YS5jbGFzc05hbWU6YS5nZXRBdHRyaWJ1dGUmJmEuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIn0sTD1mdW5jdGlvbihhKXtyZXR1cm4gYS5jbGFzc0xpc3Q/YS5jbGFzc0xpc3Q6bGMoYSkubWF0Y2goL1xTKy9nKXx8W119LG1jPWZ1bmN0aW9uKGEsYil7dHlwZW9mIGEuY2xhc3NOYW1lPT0ic3RyaW5nIj9hLmNsYXNzTmFtZT1iOmEuc2V0QXR0cmlidXRlJiZhLnNldEF0dHJpYnV0ZSgiY2xhc3MiLGIpfSxuYz1mdW5jdGlvbihhLGIpe2EuY2xhc3NMaXN0P2I9YS5jbGFzc0xpc3QuY29udGFpbnMoYik6KGE9TChhKSxiPXZhKGEsYik+PTApO3JldHVybiBifSxvYz1mdW5jdGlvbihhLGIpe2lmKGEuY2xhc3NMaXN0KWEuY2xhc3NMaXN0LmFkZChiKTtlbHNlIGlmKCFuYyhhLGIpKXt2YXIgYz1sYyhhKTttYyhhLGMrKGMubGVuZ3RoPjA/IiAiK2I6YikpfX0scGM9ZnVuY3Rpb24oYSxiKXtpZihhLmNsYXNzTGlzdClBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGIsCmZ1bmN0aW9uKGUpe29jKGEsZSl9KTtlbHNle3ZhciBjPXt9O0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoTChhKSxmdW5jdGlvbihlKXtjW2VdPSEwfSk7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChiLGZ1bmN0aW9uKGUpe2NbZV09ITB9KTtiPSIiO2Zvcih2YXIgZCBpbiBjKWIrPWIubGVuZ3RoPjA/IiAiK2Q6ZDttYyhhLGIpfX0scWM9ZnVuY3Rpb24oYSxiKXthLmNsYXNzTGlzdD9hLmNsYXNzTGlzdC5yZW1vdmUoYik6bmMoYSxiKSYmbWMoYSxBcnJheS5wcm90b3R5cGUuZmlsdGVyLmNhbGwoTChhKSxmdW5jdGlvbihjKXtyZXR1cm4gYyE9Yn0pLmpvaW4oIiAiKSl9LHJjPWZ1bmN0aW9uKGEsYil7YS5jbGFzc0xpc3Q/QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChiLGZ1bmN0aW9uKGMpe3FjKGEsYyl9KTptYyhhLEFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbChMKGEpLGZ1bmN0aW9uKGMpe3JldHVybiEodmEoYixjKT49MCl9KS5qb2luKCIgIikpfTt2YXIgdGM9ZnVuY3Rpb24oYSxiKXtpZighYSl0aHJvdyBFcnJvcigiSW52YWxpZCBjbGFzcyBuYW1lICIrYSk7aWYodHlwZW9mIGIhPT0iZnVuY3Rpb24iKXRocm93IEVycm9yKCJJbnZhbGlkIGRlY29yYXRvciBmdW5jdGlvbiAiK2IpO3NjW2FdPWJ9LHVjPXt9LHNjPXt9O3ZhciB2Yz1mdW5jdGlvbihhKXt0aGlzLkE9YX07aWEodmMpO3ZhciB3Yz1mdW5jdGlvbihhLGIpe2EmJihhLnRhYkluZGV4PWI/MDotMSl9LHljPWZ1bmN0aW9uKGEsYixjKXtjLmlkJiZQYihiLGMuaWQpO3ZhciBkPWEuZygpLGU9ITEsZj1MKGMpO2YmJkFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoZixmdW5jdGlvbihoKXtoPT1kP2U9ITA6aCYmdGhpcy51KGIsaCxkKX0sYSk7ZXx8b2MoYyxkKTt4YyhiLGMpO3JldHVybiBjfTt2Yy5wcm90b3R5cGUudT1mdW5jdGlvbihhLGIsYyl7Yj09YysiLWRpc2FibGVkIj9hLlgoITEpOmI9PWMrIi1ob3Jpem9udGFsIj96YyhhLCJob3Jpem9udGFsIik6Yj09YysiLXZlcnRpY2FsIiYmemMoYSwidmVydGljYWwiKX07CnZhciB4Yz1mdW5jdGlvbihhLGIpe2lmKGIpZm9yKHZhciBjPWIuZmlyc3RDaGlsZCxkO2MmJmMucGFyZW50Tm9kZT09Yjspe2Q9Yy5uZXh0U2libGluZztpZihjLm5vZGVUeXBlPT0xKXthOnt2YXIgZT1jO3AoZSk7ZT1MKGUpO2Zvcih2YXIgZj1lLmxlbmd0aCxoPTA7aDxmO2grKyl7dmFyIGs9ZVtoXTtpZihrPWsgaW4gc2M/c2Nba10oKTpudWxsKXtlPWs7YnJlYWsgYX19ZT1udWxsfWUmJihlLmc9YyxhLmlzRW5hYmxlZCgpfHxlLlgoITEpLGEuQmEoZSksU2IoZSxjKSl9ZWxzZSBjLm5vZGVWYWx1ZSYmSGEoYy5ub2RlVmFsdWUpIT0iInx8Yi5yZW1vdmVDaGlsZChjKTtjPWR9fSxBYz1mdW5jdGlvbihhLGIpe2I9Yi5pKCk7cChiLCJUaGUgY29udGFpbmVyIERPTSBlbGVtZW50IGNhbm5vdCBiZSBudWxsLiIpO0tiKGIsdCk7KGE9YS5BKSYmWmIoYixhKX07dmMucHJvdG90eXBlLmc9ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy1jb250YWluZXIifTsKdmMucHJvdG90eXBlLmo9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nKCksYz1bYixhLkw9PSJob3Jpem9udGFsIj9iKyItaG9yaXpvbnRhbCI6YisiLXZlcnRpY2FsIl07YS5pc0VuYWJsZWQoKXx8Yy5wdXNoKGIrIi1kaXNhYmxlZCIpO3JldHVybiBjfTt2YXIgQmM9ZnVuY3Rpb24oKXt9O3ZhciBNPWZ1bmN0aW9uKCl7fSxDYztpYShNKTt2YXIgRGM9e2J1dHRvbjoicHJlc3NlZCIsY2hlY2tib3g6ImNoZWNrZWQiLG1lbnVpdGVtOiJzZWxlY3RlZCIsbWVudWl0ZW1jaGVja2JveDoiY2hlY2tlZCIsbWVudWl0ZW1yYWRpbzoiY2hlY2tlZCIscmFkaW86ImNoZWNrZWQiLHRhYjoic2VsZWN0ZWQiLHRyZWVpdGVtOiJzZWxlY3RlZCJ9O00ucHJvdG90eXBlLk5hPWZ1bmN0aW9uKCl7fTtNLnByb3RvdHlwZS54YT1mdW5jdGlvbihhKXt2YXIgYj1hLkcsYz1iLmgsZD10aGlzLk4oKSxlPVtkXSxmPXRoaXMuTigpO2YhPWQmJmUucHVzaChmKTtkPWEubTtmb3IoZj1bXTtkOyl7dmFyIGg9ZCYtZDtmLnB1c2goRWModGhpcyxoKSk7ZCY9fmh9ZS5wdXNoLmFwcGx5KGUsZik7KGQ9YS5GYSkmJmUucHVzaC5hcHBseShlLGQpO3JldHVybiBjLmNhbGwoYiwiRElWIixlLmpvaW4oIiAiKSxhLmlhKX07Ck0ucHJvdG90eXBlLnlhPWZ1bmN0aW9uKGEsYil7Yi5pZCYmUGIoYSxiLmlkKTtiJiZiLmZpcnN0Q2hpbGQ/RmMoYSxiLmZpcnN0Q2hpbGQubmV4dFNpYmxpbmc/eWEoYi5jaGlsZE5vZGVzKTpiLmZpcnN0Q2hpbGQpOmEuaWE9bnVsbDt2YXIgYz0wLGQ9dGhpcy5OKCksZT10aGlzLk4oKSxmPSExLGg9ITEsaz15YShMKGIpKTtrLmZvckVhY2goZnVuY3Rpb24ocSl7Znx8cSE9ZD9ofHxxIT1lP2N8PUdjKHRoaXMscSk6aD0hMDooZj0hMCxlPT1kJiYoaD0hMCkpO0djKHRoaXMscSk9PTEmJihzYShiKSxkYihiKSYmZWIoYikmJmNiKGIsITEpKX0sdGhpcyk7YS5tPWM7Znx8KGsucHVzaChkKSxlPT1kJiYoaD0hMCkpO2h8fGsucHVzaChlKTsoYT1hLkZhKSYmay5wdXNoLmFwcGx5KGssYSk7ZiYmaCYmIWF8fG1jKGIsay5qb2luKCIgIikpO3JldHVybiBifTsKdmFyIEhjPWZ1bmN0aW9uKGEsYil7aWYoYT1hLk5hKCkpe3AoYiwiVGhlIGVsZW1lbnQgcGFzc2VkIGFzIGEgZmlyc3QgcGFyYW1ldGVyIGNhbm5vdCBiZSBudWxsLiIpO3ZhciBjPWIuZ2V0QXR0cmlidXRlKCJyb2xlIil8fG51bGw7YSE9YyYmWmIoYixhKX19LEljPWZ1bmN0aW9uKGEsYil7dmFyIGM7aWYoYS5EJjMyJiYoYz1hLmkoKSkpe2lmKCFiJiZhLm0mMzIpe3RyeXtjLmJsdXIoKX1jYXRjaChkKXt9YS5tJjMyJiZhLlFhKG51bGwpfShkYihjKSYmZWIoYykpIT1iJiZjYihjLGIpfX0sSmM9ZnVuY3Rpb24oYSxiLGMpe0NjfHwoQ2M9ezE6ImRpc2FibGVkIiw4OiJzZWxlY3RlZCIsMTY6ImNoZWNrZWQiLDY0OiJleHBhbmRlZCJ9KTtwKGEsIlRoZSBlbGVtZW50IHBhc3NlZCBhcyBhIGZpcnN0IHBhcmFtZXRlciBjYW5ub3QgYmUgbnVsbC4iKTtiPUNjW2JdO3ZhciBkPWEuZ2V0QXR0cmlidXRlKCJyb2xlIil8fG51bGw7ZCYmKGQ9RGNbZF18fGIsYj1iPT0iY2hlY2tlZCJ8fGI9PQoic2VsZWN0ZWQiP2Q6Yik7YiYmYWMoYSxiLGMpfTtNLnByb3RvdHlwZS5OPWZ1bmN0aW9uKCl7cmV0dXJuImdvb2ctY29udHJvbCJ9O3ZhciBFYz1mdW5jdGlvbihhLGIpe2EuZ3x8S2MoYSk7cmV0dXJuIGEuZ1tiXX0sR2M9ZnVuY3Rpb24oYSxiKXthLmh8fChhLmd8fEtjKGEpLGEuaD1FYShhLmcpKTthPXBhcnNlSW50KGEuaFtiXSwxMCk7cmV0dXJuIGlzTmFOKGEpPzA6YX0sS2M9ZnVuY3Rpb24oYSl7dmFyIGI9YS5OKCk7dmFyIGM9Yi5yZXBsYWNlKC9ceGEwfFxzL2csIiAiKS5pbmRleE9mKCIgIikhPS0xO3AoIWMsIkNvbnRyb2xSZW5kZXJlciBoYXMgYW4gaW52YWxpZCBjc3MgY2xhc3M6ICciK2IrIiciKTthLmc9ezE6YisiLWRpc2FibGVkIiwyOmIrIi1ob3ZlciIsNDpiKyItYWN0aXZlIiw4OmIrIi1zZWxlY3RlZCIsMTY6YisiLWNoZWNrZWQiLDMyOmIrIi1mb2N1c2VkIiw2NDpiKyItb3BlbiJ9fTt2YXIgTj1mdW5jdGlvbihhLGIsYyl7Ri5jYWxsKHRoaXMsYyk7aWYoIWIpe2ZvcihiPXRoaXMuY29uc3RydWN0b3I7Yjspe3ZhciBkPW5hKGIpO2lmKGQ9dWNbZF0pYnJlYWs7Yj0oYj1PYmplY3QuZ2V0UHJvdG90eXBlT2YoYi5wcm90b3R5cGUpKSYmYi5jb25zdHJ1Y3Rvcn1iPWQ/dHlwZW9mIGQuVj09PSJmdW5jdGlvbiI/ZC5WKCk6bmV3IGQ6bnVsbH10aGlzLnY9Yjt0aGlzLmlhPWEhPT12b2lkIDA/YTpudWxsfTtuKE4sRik7Zz1OLnByb3RvdHlwZTtnLmlhPW51bGw7Zy5tPTA7Zy5EPTM5O2cuUD0wO2cuT2E9ITA7Zy5GYT1udWxsO2cuSGE9ITA7Zy5tYT1mdW5jdGlvbigpe3ZhciBhPXRoaXMudi54YSh0aGlzKTt0aGlzLmc9YTtIYyh0aGlzLnYsYSk7S2IoYSwhMCk7dGhpcy5pc1Zpc2libGUoKXx8KGEuc3R5bGUuZGlzcGxheT0ibm9uZSIsYSYmYWMoYSwiaGlkZGVuIiwhMCkpfTtnLm5hPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaSgpfTtnLndhPWZ1bmN0aW9uKCl7cmV0dXJuITB9OwpnLkVhPWZ1bmN0aW9uKGEpe3RoaXMuZz1hPXRoaXMudi55YSh0aGlzLGEpO0hjKHRoaXMudixhKTtLYihhLCEwKTt0aGlzLk9hPWEuc3R5bGUuZGlzcGxheSE9Im5vbmUifTsKZy5JPWZ1bmN0aW9uKCl7Ti5sLkkuY2FsbCh0aGlzKTt2YXIgYT10aGlzLmc7cChhLCJDYW4gbm90IGNhbGwgZ2V0RWxlbWVudFN0cmljdCBiZWZvcmUgcmVuZGVyaW5nL2RlY29yYXRpbmcuIik7cCh0aGlzKTtwKGEpO3RoaXMuaXNWaXNpYmxlKCl8fGFjKGEsImhpZGRlbiIsIXRoaXMuaXNWaXNpYmxlKCkpO3RoaXMuaXNFbmFibGVkKCl8fEpjKGEsMSwhdGhpcy5pc0VuYWJsZWQoKSk7dGhpcy5EJjgmJkpjKGEsOCwhISh0aGlzLm0mOCkpO3RoaXMuRCYxNiYmSmMoYSwxNiwhISh0aGlzLm0mMTYpKTt0aGlzLkQmNjQmJkpjKGEsNjQsISEodGhpcy5tJjY0KSk7dmFyIGI9dGhpcy52O1ViKHRoaXMpJiYoYT10aGlzLmkoKSxiPWIuTigpKyItcnRsIiwoYT1hLmk/YS5pKCk6YSkmJnBjKGEsW2JdKSk7dGhpcy5pc0VuYWJsZWQoKSYmSWModGhpcyx0aGlzLmlzVmlzaWJsZSgpKTt0aGlzLkQmLTImJih0aGlzLkhhJiZMYyh0aGlzLCEwKSx0aGlzLkQmMzImJihhPXRoaXMuaSgpKSkmJihiPQp0aGlzLlp8fCh0aGlzLlo9bmV3IEopLGdjKGIsYSksQihCKEIoUWIodGhpcyksYiwia2V5Iix0aGlzLmFhKSxhLCJmb2N1cyIsdGhpcy5YYSksYSwiYmx1ciIsdGhpcy5RYSkpfTt2YXIgTGM9ZnVuY3Rpb24oYSxiKXt2YXIgYz1RYihhKSxkPWEuaSgpO2I/KEIoQihCKEIoYyxkLEsuZ2EsYS5zYSksZCxbSy5oYSxLLmZhXSxhLnZhKSxkLCJtb3VzZW92ZXIiLGEudWEpLGQsIm1vdXNlb3V0IixhLnRhKSxhLmNhIT1CYyYmQihjLGQsImNvbnRleHRtZW51IixhLmNhKSk6KEMoQyhDKEMoYyxkLEsuZ2EsYS5zYSksZCxbSy5oYSxLLmZhXSxhLnZhKSxkLCJtb3VzZW92ZXIiLGEudWEpLGQsIm1vdXNlb3V0IixhLnRhKSxhLmNhIT1CYyYmQyhjLGQsImNvbnRleHRtZW51IixhLmNhKSl9O04ucHJvdG90eXBlLlU9ZnVuY3Rpb24oKXtOLmwuVS5jYWxsKHRoaXMpO3RoaXMuWiYma2ModGhpcy5aKTt0aGlzLmlzVmlzaWJsZSgpJiZ0aGlzLmlzRW5hYmxlZCgpJiZJYyh0aGlzLCExKX07Ck4ucHJvdG90eXBlLkM9ZnVuY3Rpb24oKXtOLmwuQy5jYWxsKHRoaXMpO3RoaXMuWiYmKHRoaXMuWi5kaXNwb3NlKCksZGVsZXRlIHRoaXMuWik7ZGVsZXRlIHRoaXMudjt0aGlzLkZhPXRoaXMuaWE9bnVsbH07dmFyIEZjPWZ1bmN0aW9uKGEsYil7YS5pYT1ifTtOLnByb3RvdHlwZS5pc1Zpc2libGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5PYX07Ti5wcm90b3R5cGUuaXNFbmFibGVkPWZ1bmN0aW9uKCl7cmV0dXJuISh0aGlzLm0mMSl9O04ucHJvdG90eXBlLlg9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5oO2ImJnR5cGVvZiBiLmlzRW5hYmxlZD09ImZ1bmN0aW9uIiYmIWIuaXNFbmFibGVkKCl8fCFPKHRoaXMsMSwhYSl8fChhfHwoTWModGhpcywhMSksUCh0aGlzLCExKSksdGhpcy5pc1Zpc2libGUoKSYmSWModGhpcyxhKSxUKHRoaXMsMSwhYSwhMCkpfTt2YXIgUD1mdW5jdGlvbihhLGIpe08oYSwyLGIpJiZUKGEsMixiKX07Ck4ucHJvdG90eXBlLmlzQWN0aXZlPWZ1bmN0aW9uKCl7cmV0dXJuISEodGhpcy5tJjQpfTsKdmFyIE1jPWZ1bmN0aW9uKGEsYil7TyhhLDQsYikmJlQoYSw0LGIpfSxOYz1mdW5jdGlvbihhLGIpe08oYSw4LGIpJiZUKGEsOCxiKX0sT2M9ZnVuY3Rpb24oYSxiKXtPKGEsNjQsYikmJlQoYSw2NCxiKX0sVD1mdW5jdGlvbihhLGIsYyxkKXtpZighZCYmYj09MSlhLlgoIWMpO2Vsc2UgaWYoYS5EJmImJmMhPSEhKGEubSZiKSl7dmFyIGU9YS52O2lmKGQ9YS5pKCkpe2lmKGU9RWMoZSxiKSl7dmFyIGY9YS5pP2EuaSgpOmE7ZiYmKGM/cGM6cmMpKGYsW2VdKX1KYyhkLGIsYyl9YS5tPWM/YS5tfGI6YS5tJn5ifX0sUGM9ZnVuY3Rpb24oYSxiLGMpe2lmKGEucyYmYS5tJmImJiFjKXRocm93IEVycm9yKCJDb21wb25lbnQgYWxyZWFkeSByZW5kZXJlZCIpOyFjJiZhLm0mYiYmVChhLGIsITEpO2EuRD1jP2EuRHxiOmEuRCZ+Yn0sVT1mdW5jdGlvbihhLGIpe3JldHVybiEhKDI1NSZiKSYmISEoYS5EJmIpfSxPPWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4hIShhLkQmYikmJiEhKGEubSZiKSE9CmMmJighKGEuUCZiKXx8RShhLE5iKGIsYykpKSYmIWEuYmF9O04ucHJvdG90eXBlLnVhPWZ1bmN0aW9uKGEpeyFRYyhhLHRoaXMuaSgpKSYmRSh0aGlzLCJlbnRlciIpJiZ0aGlzLmlzRW5hYmxlZCgpJiZVKHRoaXMsMikmJlAodGhpcywhMCl9O04ucHJvdG90eXBlLnRhPWZ1bmN0aW9uKGEpeyFRYyhhLHRoaXMuaSgpKSYmRSh0aGlzLCJsZWF2ZSIpJiYoVSh0aGlzLDQpJiZNYyh0aGlzLCExKSxVKHRoaXMsMikmJlAodGhpcywhMSkpfTtOLnByb3RvdHlwZS5jYT1CYzt2YXIgUWM9ZnVuY3Rpb24oYSxiKXtyZXR1cm4hIWEucmVsYXRlZFRhcmdldCYmYWIoYixhLnJlbGF0ZWRUYXJnZXQpfTsKTi5wcm90b3R5cGUuc2E9ZnVuY3Rpb24oYSl7aWYodGhpcy5pc0VuYWJsZWQoKSYmKFUodGhpcywyKSYmUCh0aGlzLCEwKSwhKGEuaC5idXR0b24hPTB8fHYmJmEuY3RybEtleSkpKXtVKHRoaXMsNCkmJk1jKHRoaXMsITApO3ZhciBiO2lmKGI9dGhpcy52KXt2YXIgYztiPXRoaXMuRCYzMiYmKGM9dGhpcy5pKCkpP2RiKGMpJiZlYihjKTohMX1iJiZ0aGlzLmkoKS5mb2N1cygpfWEuaC5idXR0b24hPTB8fHYmJmEuY3RybEtleXx8YS5qKCl9O04ucHJvdG90eXBlLnZhPWZ1bmN0aW9uKGEpe3RoaXMuaXNFbmFibGVkKCkmJihVKHRoaXMsMikmJlAodGhpcywhMCksdGhpcy5pc0FjdGl2ZSgpJiZSYyh0aGlzLGEpJiZVKHRoaXMsNCkmJk1jKHRoaXMsITEpKX07CnZhciBSYz1mdW5jdGlvbihhLGIpe2lmKFUoYSwxNikpe3ZhciBjPSEoYS5tJjE2KTtPKGEsMTYsYykmJlQoYSwxNixjKX1VKGEsOCkmJk5jKGEsITApO1UoYSw2NCkmJk9jKGEsIShhLm0mNjQpKTtjPW5ldyB5KCJhY3Rpb24iLGEpO2ImJihjLmFsdEtleT1iLmFsdEtleSxjLmN0cmxLZXk9Yi5jdHJsS2V5LGMubWV0YUtleT1iLm1ldGFLZXksYy5zaGlmdEtleT1iLnNoaWZ0S2V5LGMuRz1iLkcsYy50aW1lU3RhbXA9Yi50aW1lU3RhbXApO3JldHVybiBFKGEsYyl9O04ucHJvdG90eXBlLlhhPWZ1bmN0aW9uKCl7VSh0aGlzLDMyKSYmTyh0aGlzLDMyLCEwKSYmVCh0aGlzLDMyLCEwKX07Ti5wcm90b3R5cGUuUWE9ZnVuY3Rpb24oKXtVKHRoaXMsNCkmJk1jKHRoaXMsITEpO1UodGhpcywzMikmJk8odGhpcywzMiwhMSkmJlQodGhpcywzMiwhMSl9OwpOLnByb3RvdHlwZS5hYT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5pc1Zpc2libGUoKSYmdGhpcy5pc0VuYWJsZWQoKSYmYS5nPT0xMyYmUmModGhpcyxhKT8oYS5qKCksYS52KCksITApOiExfTtpZih0eXBlb2YgTiE9PSJmdW5jdGlvbiIpdGhyb3cgRXJyb3IoIkludmFsaWQgY29tcG9uZW50IGNsYXNzICIrTik7aWYodHlwZW9mIE0hPT0iZnVuY3Rpb24iKXRocm93IEVycm9yKCJJbnZhbGlkIHJlbmRlcmVyIGNsYXNzICIrTSk7dmFyIFNjPW5hKE4pO3VjW1NjXT1NO3RjKCJnb29nLWNvbnRyb2wiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBOKG51bGwpfSk7dmFyIFY9ZnVuY3Rpb24oYSxiLGMpe0YuY2FsbCh0aGlzLGMpO3RoaXMuZWE9Ynx8dmMuVigpO3RoaXMuTD1hfHwidmVydGljYWwifTtuKFYsRik7Zz1WLnByb3RvdHlwZTtnLkthPW51bGw7Zy5kYT1udWxsO2cuZWE9bnVsbDtnLkw9bnVsbDtnLlM9ITA7Zy5UPSEwO2cubz0tMTtnLkI9bnVsbDtnLlc9ITE7Zy5PPW51bGw7dmFyIFRjPWZ1bmN0aW9uKGEpe3JldHVybiBhLkthfHxhLmkoKX07Zz1WLnByb3RvdHlwZTtnLm1hPWZ1bmN0aW9uKCl7dGhpcy5nPXRoaXMuRy5oKCJESVYiLHRoaXMuZWEuaih0aGlzKS5qb2luKCIgIikpfTtnLm5hPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaSgpfTtnLndhPWZ1bmN0aW9uKGEpe3JldHVybiBhLnRhZ05hbWU9PSJESVYifTtnLkVhPWZ1bmN0aW9uKGEpe3RoaXMuZz15Yyh0aGlzLmVhLHRoaXMsYSk7YS5zdHlsZS5kaXNwbGF5PT0ibm9uZSImJih0aGlzLlM9ITEpfTsKZy5JPWZ1bmN0aW9uKCl7Vi5sLkkuY2FsbCh0aGlzKTtUYih0aGlzLGZ1bmN0aW9uKGIpe2IucyYmVWModGhpcyxiKX0sdGhpcyk7dmFyIGE9dGhpcy5pKCk7QWModGhpcy5lYSx0aGlzKTtWYyh0aGlzLHRoaXMuUyk7QihCKEIoQihCKEIoQihCKFFiKHRoaXMpLHRoaXMsImVudGVyIix0aGlzLmViKSx0aGlzLCJoaWdobGlnaHQiLHRoaXMuZmIpLHRoaXMsInVuaGlnaGxpZ2h0Iix0aGlzLmxiKSx0aGlzLCJvcGVuIix0aGlzLmdiKSx0aGlzLCJjbG9zZSIsdGhpcy5iYiksYSxLLmdhLHRoaXMuV2EpLGJiKGEpLFtLLmhhLEsuZmFdLHRoaXMuY2IpLGEsW0suZ2EsSy5oYSxLLmZhLCJtb3VzZW92ZXIiLCJtb3VzZW91dCIsImNvbnRleHRtZW51Il0sdGhpcy5hYik7V2ModGhpcyl9O3ZhciBXYz1mdW5jdGlvbihhKXt2YXIgYj1RYihhKSxjPVRjKGEpO0IoQihCKGIsYywiZm9jdXMiLGEuUGEpLGMsImJsdXIiLGEuVWEpLGEuZGF8fChhLmRhPW5ldyBKKFRjKGEpKSksImtleSIsYS5WYSl9OwpnPVYucHJvdG90eXBlO2cuVT1mdW5jdGlvbigpe1hjKHRoaXMsLTEpO3RoaXMuQiYmT2ModGhpcy5CLCExKTt0aGlzLlc9ITE7Vi5sLlUuY2FsbCh0aGlzKX07Zy5DPWZ1bmN0aW9uKCl7Vi5sLkMuY2FsbCh0aGlzKTt0aGlzLmRhJiYodGhpcy5kYS5kaXNwb3NlKCksdGhpcy5kYT1udWxsKTt0aGlzLmVhPXRoaXMuQj10aGlzLk89dGhpcy5LYT1udWxsfTtnLmViPWZ1bmN0aW9uKCl7cmV0dXJuITB9OwpnLmZiPWZ1bmN0aW9uKGEpe3ZhciBiPVZiKHRoaXMsYS50YXJnZXQpO2lmKGI+LTEmJmIhPXRoaXMubyl7dmFyIGM9SSh0aGlzLHRoaXMubyk7YyYmUChjLCExKTt0aGlzLm89YjtjPUkodGhpcyx0aGlzLm8pO3RoaXMuVyYmTWMoYywhMCk7dGhpcy5CJiZjIT10aGlzLkImJihjLkQmNjQ/T2MoYywhMCk6T2ModGhpcy5CLCExKSl9Yj10aGlzLmkoKTtwKGIsIlRoZSBET00gZWxlbWVudCBmb3IgdGhlIGNvbnRhaW5lciBjYW5ub3QgYmUgbnVsbC4iKTthLnRhcmdldC5pKCkhPW51bGwmJmFjKGIsImFjdGl2ZWRlc2NlbmRhbnQiLGEudGFyZ2V0LmkoKS5pZCl9O2cubGI9ZnVuY3Rpb24oYSl7YS50YXJnZXQ9PUkodGhpcyx0aGlzLm8pJiYodGhpcy5vPS0xKTthPXRoaXMuaSgpO3AoYSwiVGhlIERPTSBlbGVtZW50IGZvciB0aGUgY29udGFpbmVyIGNhbm5vdCBiZSBudWxsLiIpO2EucmVtb3ZlQXR0cmlidXRlKCRiKCJhY3RpdmVkZXNjZW5kYW50IikpfTsKZy5nYj1mdW5jdGlvbihhKXsoYT1hLnRhcmdldCkmJmEhPXRoaXMuQiYmYS5oPT10aGlzJiYodGhpcy5CJiZPYyh0aGlzLkIsITEpLHRoaXMuQj1hKX07Zy5iYj1mdW5jdGlvbihhKXthLnRhcmdldD09dGhpcy5CJiYodGhpcy5CPW51bGwpO3ZhciBiPXRoaXMuaSgpLGM9YS50YXJnZXQuaSgpO2ImJmEudGFyZ2V0Lm0mMiYmYyYmKGE9IiIsYyYmKGE9Yy5pZCxwKGEsIlRoZSBhY3RpdmUgZWxlbWVudCBzaG91bGQgaGF2ZSBhbiBpZC4iKSksYWMoYiwiYWN0aXZlZGVzY2VuZGFudCIsYSkpfTtnLldhPWZ1bmN0aW9uKGEpe3RoaXMuVCYmKHRoaXMuVz0hMCk7dmFyIGI9VGModGhpcyk7YiYmZGIoYikmJmViKGIpP2IuZm9jdXMoKTphLmooKX07Zy5jYj1mdW5jdGlvbigpe3RoaXMuVz0hMX07CmcuYWI9ZnVuY3Rpb24oYSl7YTp7dmFyIGI9YS50YXJnZXQ7aWYodGhpcy5PKWZvcih2YXIgYz10aGlzLmkoKTtiJiZiIT09Yzspe3ZhciBkPWIuaWQ7aWYoZCBpbiB0aGlzLk8pe2I9dGhpcy5PW2RdO2JyZWFrIGF9Yj1iLnBhcmVudE5vZGV9Yj1udWxsfWlmKGIpc3dpdGNoKGEudHlwZSl7Y2FzZSBLLmdhOmIuc2EoYSk7YnJlYWs7Y2FzZSBLLmhhOmNhc2UgSy5mYTpiLnZhKGEpO2JyZWFrO2Nhc2UgIm1vdXNlb3ZlciI6Yi51YShhKTticmVhaztjYXNlICJtb3VzZW91dCI6Yi50YShhKTticmVhaztjYXNlICJjb250ZXh0bWVudSI6Yi5jYShhKX19O2cuUGE9ZnVuY3Rpb24oKXt9O2cuVWE9ZnVuY3Rpb24oKXtYYyh0aGlzLC0xKTt0aGlzLlc9ITE7dGhpcy5CJiZPYyh0aGlzLkIsITEpfTsKZy5WYT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5pc0VuYWJsZWQoKSYmdGhpcy5pc1Zpc2libGUoKSYmKEgodGhpcykhPTB8fHRoaXMuS2EpJiZZYyh0aGlzLGEpPyhhLmooKSxhLnYoKSwhMCk6ITF9Owp2YXIgWWM9ZnVuY3Rpb24oYSxiKXt2YXIgYz1JKGEsYS5vKTtpZihjJiZ0eXBlb2YgYy5hYT09ImZ1bmN0aW9uIiYmYy5hYShiKXx8YS5CJiZhLkIhPWMmJnR5cGVvZiBhLkIuYWE9PSJmdW5jdGlvbiImJmEuQi5hYShiKSlyZXR1cm4hMDtpZihiLnNoaWZ0S2V5fHxiLmN0cmxLZXl8fGIubWV0YUtleXx8Yi5hbHRLZXkpcmV0dXJuITE7c3dpdGNoKGIuZyl7Y2FzZSAyNzpUYyhhKS5ibHVyKCk7YnJlYWs7Y2FzZSAzNjpaYyhhKTticmVhaztjYXNlIDM1OiRjKGEpO2JyZWFrO2Nhc2UgMzg6aWYoYS5MPT0idmVydGljYWwiKWFkKGEpO2Vsc2UgcmV0dXJuITE7YnJlYWs7Y2FzZSAzNzppZihhLkw9PSJob3Jpem9udGFsIilVYihhKT9iZChhKTphZChhKTtlbHNlIHJldHVybiExO2JyZWFrO2Nhc2UgNDA6aWYoYS5MPT0idmVydGljYWwiKWJkKGEpO2Vsc2UgcmV0dXJuITE7YnJlYWs7Y2FzZSAzOTppZihhLkw9PSJob3Jpem9udGFsIilVYihhKT9hZChhKTpiZChhKTtlbHNlIHJldHVybiExOwpicmVhaztkZWZhdWx0OnJldHVybiExfXJldHVybiEwfSxVYz1mdW5jdGlvbihhLGIpe3ZhciBjPWIuaSgpO2M9Yy5pZHx8KGMuaWQ9T2IoYikpO2EuT3x8KGEuTz17fSk7YS5PW2NdPWJ9O1YucHJvdG90eXBlLkJhPWZ1bmN0aW9uKGEsYil7dWEoYSxOLCJUaGUgY2hpbGQgb2YgYSBjb250YWluZXIgbXVzdCBiZSBhIGNvbnRyb2wiKTtWLmwuQmEuY2FsbCh0aGlzLGEsYil9O1YucHJvdG90eXBlLkNhPWZ1bmN0aW9uKGEsYixjKXt1YShhLE4pO2EuUHw9MjthLlB8PTY0O1BjKGEsMzIsITEpO2EucyYmMCE9YS5IYSYmTGMoYSwhMSk7YS5IYT0hMTt2YXIgZD1hLmg9PXRoaXM/VmIodGhpcyxhKTotMTtWLmwuQ2EuY2FsbCh0aGlzLGEsYixjKTthLnMmJnRoaXMucyYmVWModGhpcyxhKTthPWQ7YT09LTEmJihhPUgodGhpcykpO2E9PXRoaXMubz90aGlzLm89TWF0aC5taW4oSCh0aGlzKS0xLGIpOmE+dGhpcy5vJiZiPD10aGlzLm8/dGhpcy5vKys6YTx0aGlzLm8mJmI+dGhpcy5vJiZ0aGlzLm8tLX07CnZhciB6Yz1mdW5jdGlvbihhLGIpe2lmKGEuaSgpKXRocm93IEVycm9yKCJDb21wb25lbnQgYWxyZWFkeSByZW5kZXJlZCIpO2EuTD1ifTtWLnByb3RvdHlwZS5pc1Zpc2libGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5TfTt2YXIgVmM9ZnVuY3Rpb24oYSxiKXthLlM9Yjt2YXIgYz1hLmkoKTtjJiYoYy5zdHlsZS5kaXNwbGF5PWI/IiI6Im5vbmUiLHdjKFRjKGEpLGEuVCYmYS5TKSl9O1YucHJvdG90eXBlLmlzRW5hYmxlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLlR9O1YucHJvdG90eXBlLlg9ZnVuY3Rpb24oYSl7dGhpcy5UIT1hJiZFKHRoaXMsYT8iZW5hYmxlIjoiZGlzYWJsZSIpJiYoYT8odGhpcy5UPSEwLFRiKHRoaXMsZnVuY3Rpb24oYil7Yi5UYT9kZWxldGUgYi5UYTpiLlgoITApfSkpOihUYih0aGlzLGZ1bmN0aW9uKGIpe2IuaXNFbmFibGVkKCk/Yi5YKCExKTpiLlRhPSEwfSksdGhpcy5XPXRoaXMuVD0hMSksd2MoVGModGhpcyksYSYmdGhpcy5TKSl9Owp2YXIgWGM9ZnVuY3Rpb24oYSxiKXsoYj1JKGEsYikpP1AoYiwhMCk6YS5vPi0xJiZQKEkoYSxhLm8pLCExKX0sWmM9ZnVuY3Rpb24oYSl7Y2QoYSxmdW5jdGlvbihiLGMpe3JldHVybihiKzEpJWN9LEgoYSktMSl9LCRjPWZ1bmN0aW9uKGEpe2NkKGEsZnVuY3Rpb24oYixjKXtiLS07cmV0dXJuIGI8MD9jLTE6Yn0sMCl9LGJkPWZ1bmN0aW9uKGEpe2NkKGEsZnVuY3Rpb24oYixjKXtyZXR1cm4oYisxKSVjfSxhLm8pfSxhZD1mdW5jdGlvbihhKXtjZChhLGZ1bmN0aW9uKGIsYyl7Yi0tO3JldHVybiBiPDA/Yy0xOmJ9LGEubyl9LGNkPWZ1bmN0aW9uKGEsYixjKXtjPWM8MD9WYihhLGEuQik6Yzt2YXIgZD1IKGEpO2M9Yi5jYWxsKGEsYyxkKTtmb3IodmFyIGU9MDtlPD1kOyl7dmFyIGY9SShhLGMpO2lmKGYmJmYuaXNWaXNpYmxlKCkmJmYuaXNFbmFibGVkKCkmJmYuRCYyKXthLkxhKGMpO2JyZWFrfWUrKztjPWIuY2FsbChhLGMsZCl9fTsKVi5wcm90b3R5cGUuTGE9ZnVuY3Rpb24oYSl7WGModGhpcyxhKX07dmFyIGRkPWZ1bmN0aW9uKCl7fTtuKGRkLE0pO2lhKGRkKTtnPWRkLnByb3RvdHlwZTtnLk49ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy10YWIifTtnLk5hPWZ1bmN0aW9uKCl7cmV0dXJuInRhYiJ9O2cueGE9ZnVuY3Rpb24oYSl7dmFyIGI9ZGQubC54YS5jYWxsKHRoaXMsYSk7KGE9YS5HYSgpKSYmdGhpcy5NYShiLGEpO3JldHVybiBifTtnLnlhPWZ1bmN0aW9uKGEsYil7Yj1kZC5sLnlhLmNhbGwodGhpcyxhLGIpO3ZhciBjPXRoaXMuR2EoYik7YyYmKGEuUmE9Yyk7YS5tJjgmJihjPWEuaCkmJnR5cGVvZiBjLko9PT0iZnVuY3Rpb24iJiYoVChhLDgsITEpLGMuSihhKSk7cmV0dXJuIGJ9O2cuR2E9ZnVuY3Rpb24oYSl7cmV0dXJuIGEudGl0bGV8fCIifTtnLk1hPWZ1bmN0aW9uKGEsYil7YSYmKGEudGl0bGU9Ynx8IiIpfTt2YXIgZWQ9ZnVuY3Rpb24oYSxiLGMpe04uY2FsbCh0aGlzLGEsYnx8ZGQuVigpLGMpO1BjKHRoaXMsOCwhMCk7dGhpcy5QfD05fTtuKGVkLE4pO2VkLnByb3RvdHlwZS5HYT1mdW5jdGlvbigpe3JldHVybiB0aGlzLlJhfTtlZC5wcm90b3R5cGUuTWE9ZnVuY3Rpb24oYSl7dGhpcy52Lk1hKHRoaXMuaSgpLGEpO3RoaXMuUmE9YX07dGMoImdvb2ctdGFiIixmdW5jdGlvbigpe3JldHVybiBuZXcgZWQobnVsbCl9KTt2YXIgVz1mdW5jdGlvbigpe3RoaXMuQT0idGFibGlzdCJ9O24oVyx2Yyk7aWEoVyk7Vy5wcm90b3R5cGUuZz1mdW5jdGlvbigpe3JldHVybiJnb29nLXRhYi1iYXIifTtXLnByb3RvdHlwZS51PWZ1bmN0aW9uKGEsYixjKXt0aGlzLnZ8fCh0aGlzLmh8fGZkKHRoaXMpLHRoaXMudj1FYSh0aGlzLmgpKTt2YXIgZD10aGlzLnZbYl07ZD8oemMoYSxnZChkKSksYS52PWQpOlcubC51LmNhbGwodGhpcyxhLGIsYyl9O1cucHJvdG90eXBlLmo9ZnVuY3Rpb24oYSl7dmFyIGI9Vy5sLmouY2FsbCh0aGlzLGEpO3RoaXMuaHx8ZmQodGhpcyk7Yi5wdXNoKHRoaXMuaFthLnZdKTtyZXR1cm4gYn07dmFyIGZkPWZ1bmN0aW9uKGEpe3ZhciBiPWEuZygpO2EuaD17dG9wOmIrIi10b3AiLGJvdHRvbTpiKyItYm90dG9tIixzdGFydDpiKyItc3RhcnQiLGVuZDpiKyItZW5kIn19O3ZhciBYPWZ1bmN0aW9uKGEsYixjKXthPWF8fCJ0b3AiO3pjKHRoaXMsZ2QoYSkpO3RoaXMudj1hO1YuY2FsbCh0aGlzLHRoaXMuTCxifHxXLlYoKSxjKTtoZCh0aGlzKX07bihYLFYpO2c9WC5wcm90b3R5cGU7Zy5IPW51bGw7Zy5JPWZ1bmN0aW9uKCl7WC5sLkkuY2FsbCh0aGlzKTtoZCh0aGlzKX07Zy5DPWZ1bmN0aW9uKCl7WC5sLkMuY2FsbCh0aGlzKTt0aGlzLkg9bnVsbH07Zy5MYT1mdW5jdGlvbihhKXtYLmwuTGEuY2FsbCh0aGlzLGEpO3RoaXMuSihJKHRoaXMsYSkpfTtnLko9ZnVuY3Rpb24oYSl7YT9OYyhhLCEwKTp0aGlzLkgmJk5jKHRoaXMuSCwhMSl9Owp2YXIgaWQ9ZnVuY3Rpb24oYSxiKXtpZihiJiZiPT1hLkgpe2Zvcih2YXIgYz1WYihhLGIpLGQ9Yy0xO2I9SShhLGQpO2QtLSl7dmFyIGU9YjtpZihlLmlzVmlzaWJsZSgpJiZlLmlzRW5hYmxlZCgpKXthLkooYik7cmV0dXJufX1mb3IoYys9MTtiPUkoYSxjKTtjKyspaWYoZD1iLGQuaXNWaXNpYmxlKCkmJmQuaXNFbmFibGVkKCkpe2EuSihiKTtyZXR1cm59YS5KKG51bGwpfX07Zz1YLnByb3RvdHlwZTtnLmpiPWZ1bmN0aW9uKGEpe3RoaXMuSCYmdGhpcy5IIT1hLnRhcmdldCYmTmModGhpcy5ILCExKTt0aGlzLkg9YS50YXJnZXR9O2cua2I9ZnVuY3Rpb24oYSl7YS50YXJnZXQ9PXRoaXMuSCYmKHRoaXMuSD1udWxsKX07Zy5oYj1mdW5jdGlvbihhKXtpZCh0aGlzLGEudGFyZ2V0KX07Zy5pYj1mdW5jdGlvbihhKXtpZCh0aGlzLGEudGFyZ2V0KX07Zy5QYT1mdW5jdGlvbigpe0kodGhpcyx0aGlzLm8pfHxYYyh0aGlzLFZiKHRoaXMsdGhpcy5IfHxJKHRoaXMsMCkpKX07CnZhciBoZD1mdW5jdGlvbihhKXtCKEIoQihCKFFiKGEpLGEsInNlbGVjdCIsYS5qYiksYSwidW5zZWxlY3QiLGEua2IpLGEsImRpc2FibGUiLGEuaGIpLGEsImhpZGUiLGEuaWIpfSxnZD1mdW5jdGlvbihhKXtyZXR1cm4gYT09InN0YXJ0Inx8YT09ImVuZCI/InZlcnRpY2FsIjoiaG9yaXpvbnRhbCJ9O3RjKCJnb29nLXRhYi1iYXIiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBYfSk7ZnVuY3Rpb24gamQoYSl7dmFyIGI9e3RvcDoiYm90dG9tIixib3R0b206InRvcCIsc3RhcnQ6InJpZ2h0IixlbmQ6ImxlZnQifVthLmxvY2F0aW9uXSxjPWEuZWxlbWVudElkLGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTtkLnRleHRDb250ZW50PSJcbiAgICBmaWVsZHNldCB7XG4gICAgICBwYWRkaW5nOiAxMHB4O1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgIzM2OTtcbiAgICB9XG5cbiAgICAjIitjKyIgLmdvb2ctdGFiLWNvbnRlbnQge1xuICAgICAgbWluLWhlaWdodDogM2VtO1xuICAgICAgbWFyZ2luOiAwO1xuICAgICAgYm9yZGVyOiAiK2EuYm9yZGVyKyIgc29saWQgIithLmJvcmRlckNvbG9yKyI7XG4gICAgICBib3JkZXItdG9wOiAwO1xuICAgICAgaGVpZ2h0OiAiK2EuY29udGVudEhlaWdodCsiO1xuICAgICAgcGFkZGluZzogNHB4IDhweDtcbiAgICAgIG1hcmdpbi1yaWdodDogNHB4O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgIG92ZXJmbG93OiBhdXRvO1xuICAgIH1cblxuICAgICMiKwpjKyIgLmdvb2ctdGFiLWJhci0iK2EubG9jYXRpb24rIiAuZ29vZy10YWItc2VsZWN0ZWQge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICIrYS5ib3JkZXJDb2xvcisiO1xuICAgICAgYm9yZGVyLSIrYisiOiAwcHg7XG4gICAgfVxuXG4gICAgIyIrYysiIC5nb29nLXRhYi1iYXItIithLmxvY2F0aW9uKyIge1xuICAgICAgcGFkZGluZy0iK2EubG9jYXRpb24rIjogNXB4ICFpbXBvcnRhbnQ7XG4gICAgICBib3JkZXItIitiKyI6IDFweCBzb2xpZCAiK2EuYm9yZGVyQ29sb3IrIiAhaW1wb3J0YW50O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICB9XG5cbiAgICAjIitjKyIgLmdvb2ctdGFiLWJhciB7XG4gICAgICAgbWFyZ2luOiAwO1xuICAgICAgIGJvcmRlcjogMDtcbiAgICAgICBwYWRkaW5nOiAwO1xuICAgICAgIGxpc3Qtc3R5bGU6IG5vbmU7XG4gICAgICAgY3Vyc29yOiBkZWZhdWx0O1xuICAgICAgIG91dGxpbmU6IG5vbmU7XG4gICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgICBtYXJnaW4tcmlnaHQ6IDRweDtcbiAgICAgIH1cblxuICAgICAjIisKYysiIC5nb29nLXRhYiB7XG4gICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgIHBhZGRpbmc6IDRweCA4cHg7XG4gICAgICAgY29sb3I6IHZhcigtLWNvbGFiLXByaW1hcnktdGV4dC1jb2xvcik7XG4gICAgICAgdGV4dC1kZWNvcmF0aW9uOiBpbml0aWFsO1xuICAgICAgIGN1cnNvcjogZGVmYXVsdDtcbiAgICAgIH1cblxuICAgICAgIyIrYysiIC5nb29nLXRhYi1ob3ZlciB7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWNvbGFiLWhpZ2hsaWdodGVkLXN1cmZhY2UtY29sb3IpO1xuICAgICAgfVxuICAgICAgIjtyZXR1cm4gZH0KdmFyIGtkPWZ1bmN0aW9uKGEpe3ZhciBiPWEuZWxlbWVudElkLGM9YS50YWJOYW1lcyxkPWEuc2VsZWN0ZWRJbmRleDsiY29udGVudEJvcmRlciJpbiBhfHwoYS5jb250ZW50Qm9yZGVyPSIwcHgiKTsiY29udGVudEhlaWdodCJpbiBhfHwoYS5jb250ZW50SGVpZ2h0PSJpbml0aWFsIik7ImJvcmRlckNvbG9yImluIGF8fChhLmJvcmRlckNvbG9yPSJ2YXIoLS1jb2xhYi1ib3JkZXItY29sb3IpIik7YS5sb2NhdGlvbnx8KGEubG9jYXRpb249InRvcCIpO3ZhciBlPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiMiK2IpLGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zi5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYi1iYXIiKTt2YXIgaD1hLmxvY2F0aW9uO2YuY2xhc3NMaXN0LmFkZCgiZ29vZy10YWItYmFyLSIraCk7Zm9yKHZhciBrPVtdLHE9ZmEoYyksRz1xLm5leHQoKTshRy5kb25lO0c9cS5uZXh0KCkpe0c9Ry52YWx1ZTt2YXIgeD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKeC5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYiIpO3gudGV4dENvbnRlbnQ9RztmLmFwcGVuZENoaWxkKHgpO2sucHVzaCh4KX1oIT0iYm90dG9tIiYmZS5hcHBlbmRDaGlsZChmKTtxPW51bGw7aWYoaD09InRvcCJ8fGg9PSJib3R0b20iKXE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikscS5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYi1iYXItY2xlYXIiKTtoPT0idG9wIiYmcSYmZS5hcHBlbmRDaGlsZChxKTtHPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO0cuY2xhc3NMaXN0LmFkZCgiZ29vZy10YWItY29udGVudCIpO3ZhciBoYT1bXTtjPWZhKGMpO2Zvcih4PWMubmV4dCgpOyF4LmRvbmU7eD1jLm5leHQoKSl4PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHguaWQ9ZS5pZCsiX2NvbnRlbnRfIitoYS5sZW5ndGgseC5zdHlsZS5kaXNwbGF5PSJub25lIixHLmFwcGVuZENoaWxkKHgpLGhhLnB1c2goeCk7ZS5hcHBlbmRDaGlsZChHKTtoPT0iYm90dG9tIiYmKHEmJgplLmFwcGVuZENoaWxkKHEpLGUuYXBwZW5kQ2hpbGQoZikpO3ZhciBRPW5ldyBYKGgpO1NiKFEsZik7dmFyIFI9LTE7d2IoUSwic2VsZWN0IixmdW5jdGlvbihTKXtTPWsuaW5kZXhPZihTLnRhcmdldC5pKCkpO1MhPVImJihSPj0wJiZSPGhhLmxlbmd0aCYmKGhhW1JdLnN0eWxlLmRpc3BsYXk9Im5vbmUiLFI9LTEpLFM+PTAmJlM8aGEubGVuZ3RoJiYoUj1TLGhhW1JdLnN0eWxlLmRpc3BsYXk9ImlubGluZSIsd2luZG93LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCJyZXNpemUiKSksZ29vZ2xlLmNvbGFiLm91dHB1dC5yZXNpemVJZnJhbWVUb0NvbnRlbnQoKSksUS5KKEkoUSxSKSkpfSk7US5KKEkoUSxkKSk7d2luZG93W2JdPXtzZXRTZWxlY3RlZFRhYkluZGV4OmZ1bmN0aW9uKFMpe1EuSihJKFEsUykpfX07ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChqZChhKSl9LGxkPVsiY29sYWJfbGliIiwiY3JlYXRlVGFiQmFyIl0sWT1sOwpsZFswXWluIFl8fHR5cGVvZiBZLmV4ZWNTY3JpcHQ9PSJ1bmRlZmluZWQifHxZLmV4ZWNTY3JpcHQoInZhciAiK2xkWzBdKTtmb3IodmFyIFo7bGQubGVuZ3RoJiYoWj1sZC5zaGlmdCgpKTspbGQubGVuZ3RofHxrZD09PXZvaWQgMD9ZW1pdJiZZW1pdIT09T2JqZWN0LnByb3RvdHlwZVtaXT9ZPVlbWl06WT1ZW1pdPXt9OllbWl09a2Q7fSkuY2FsbCh0aGlzKTsKLy8gY2xhbmctZm9ybWF0IG9uCg==", + "ok": true, + "headers": [ + [ + "content-length", + "41785" + ], + [ + "content-type", + "application/javascript" + ] + ], + "status": 200, + "status_text": "" + } + }, + "base_uri": "https://localhost:8080/", + "height": 323 + }, + "outputId": "05bc659f-28d5-4531-b3d6-5c202d395df1" + }, + "source": [ + "%%logica Description\n", + "\n", + "Employee(name: \"Alice\", role: \"Product Manager\", office: \"SEA\");\n", + "Employee(name: \"Bob\", role: \"Engineer\", office: \"SEA\");\n", + "Employee(name: \"Caroline\", role: \"Engineer\", office: \"LAX\");\n", + "Employee(name: \"David\", role: \"Data Scientist\", office: \"LAX\");\n", + "Employee(name: \"Eve\", role: \"Data Scientist\", office: \"SEA\");\n", + "\n", + "Describe(record, result) :-\n", + " result ==\n", + " record.name ++ \" is \" ++ record.role ++ \" @ \" ++ record.office;\n", + "\n", + "Description(d) :- Employee(..r), Describe(r, d);" + ], + "execution_count": 47, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bbae3c44-d22e-11ef-a7c0-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id107\", \"tabNames\": [\"Description\", \"(Log)\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_a3b0d59a27" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bbaea7f6-d22e-11ef-a7c0-0242ac1c0002\"] = window[\"id107\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_8ddb643f96" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bbb09e58-d22e-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_8a1f9e2e7e" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bbb0f844-d22e-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id107_content_1\");\n", + "//# sourceURL=js_a59d323784" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bbb1885e-d22e-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"bbb0f844-d22e-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_c72650fe13" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bbb1e13c-d22e-11ef-a7c0-0242ac1c0002\"] = window[\"id107\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_ad269cdb1f" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bbb6e772-d22e-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"bbb09e58-d22e-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_2631ae10d7" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bbb98f90-d22e-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_3180d82bca" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bbb9fb2e-d22e-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id107_content_0\");\n", + "//# sourceURL=js_5ba7f419ed" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bbba6050-d22e-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"bbb9fb2e-d22e-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_e9230b7a95" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bbbab6d6-d22e-11ef-a7c0-0242ac1c0002\"] = window[\"id107\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_522d0c8444" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bbbdcc7c-d22e-11ef-a7c0-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id108\", \"tabNames\": [\"SQL\", \"Result\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_a9d850dbe8" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bbbe3bf8-d22e-11ef-a7c0-0242ac1c0002\"] = window[\"id108\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_1ea97616db" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bbc0b996-d22e-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_24291c8fea" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bbc14366-d22e-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id108_content_0\");\n", + "//# sourceURL=js_747e05da16" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bbc1a5ae-d22e-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"bbc14366-d22e-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_0ef24c032d" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bbc2062a-d22e-11ef-a7c0-0242ac1c0002\"] = window[\"id108\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_964daab291" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The following query is stored at \u001b[1mDescription_sql\u001b[0m variable.\n", + "-- Initializing DuckDB environment.\n", + "create schema if not exists logica_home;\n", + "-- Empty record, has to have a field by DuckDB syntax.\n", + "drop type if exists logicarecord893574736 cascade; create type logicarecord893574736 as struct(nirvana numeric);\n", + "create sequence if not exists eternal_logical_sequence;\n", + "\n", + "\n", + "-- Logica type: logicarecord481217614\n", + "drop type if exists logicarecord481217614 cascade; create type logicarecord481217614 as struct(r logicarecord893574736);\n", + "\n", + "-- Logica type: logicarecord383307722\n", + "drop type if exists logicarecord383307722 cascade; create type logicarecord383307722 as struct(a timestamp);\n", + "\n", + "-- Logica type: logicarecord853346926\n", + "drop type if exists logicarecord853346926 cascade; create type logicarecord853346926 as struct(name text, office text, role text);\n", + "WITH t_0_Employee AS (SELECT * FROM (\n", + " \n", + " SELECT\n", + " 'Alice' AS name,\n", + " 'Product Manager' AS role,\n", + " 'SEA' AS office\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " 'Bob' AS name,\n", + " 'Engineer' AS role,\n", + " 'SEA' AS office\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " 'Caroline' AS name,\n", + " 'Engineer' AS role,\n", + " 'LAX' AS office\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " 'David' AS name,\n", + " 'Data Scientist' AS role,\n", + " 'LAX' AS office\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " 'Eve' AS name,\n", + " 'Data Scientist' AS role,\n", + " 'SEA' AS office\n", + " \n", + ") AS UNUSED_TABLE_NAME )\n", + "SELECT\n", + " ((((((((Employee.name) || (' is '))) || (Employee.role))) || (' @ '))) || (Employee.office)) AS col0\n", + "FROM\n", + " t_0_Employee AS Employee;\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bbc34274-d22e-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"bbc0b996-d22e-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_2dc1da416e" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bbc4e28c-d22e-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_4eeab075ec" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bbc5325a-d22e-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id108_content_1\");\n", + "//# sourceURL=js_2ab34bae92" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bbc57daa-d22e-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"bbc5325a-d22e-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_2ca0fe61a5" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bbc5c710-d22e-11ef-a7c0-0242ac1c0002\"] = window[\"id108\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_71ebe33ea5" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The following table is stored at \u001b[1mDescription\u001b[0m variable.\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
col0
0Alice is Product Manager @ SEA
1Bob is Engineer @ SEA
2Caroline is Engineer @ LAX
3David is Data Scientist @ LAX
4Eve is Data Scientist @ SEA
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bbc71444-d22e-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"bbc4e28c-d22e-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_38c205170e" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bbc8625e-d22e-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"bbb98f90-d22e-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_d9722dbc07" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bbcac2b0-d22e-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_e4330f42c6" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bbcb2b24-d22e-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id107_content_1\");\n", + "//# sourceURL=js_32e7f4f52d" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bbcb81c8-d22e-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"bbcb2b24-d22e-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_783818c809" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bbcbd70e-d22e-11ef-a7c0-0242ac1c0002\"] = window[\"id107\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_527945663f" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "image/svg+xml": "\n\n\n\n\n\nConcertina\n\n\n\nDescription\n\nDescription\n\n\n\n", + "text/plain": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Running predicate: Description (6 ms)\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bbe0715a-d22e-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"bbcac2b0-d22e-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_15fac25798" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bbe22770-d22e-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_a9e15eddc5" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bbe274f0-d22e-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id107_content_0\");\n", + "//# sourceURL=js_9be67898b4" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bbe2bcee-d22e-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"bbe274f0-d22e-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_9e6b3bbf81" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bbe30500-d22e-11ef-a7c0-0242ac1c0002\"] = window[\"id107\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_8d8e3212d5" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bbe425b6-d22e-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_5613a02921" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bbe46e22-d22e-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id108_content_1\");\n", + "//# sourceURL=js_c3eec92123" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bbe4b526-d22e-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"bbe46e22-d22e-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_4a3daf250c" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bbe4fc34-d22e-11ef-a7c0-0242ac1c0002\"] = window[\"id108\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_e162ec2f3b" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bbe75aa6-d22e-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"bbe425b6-d22e-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_81d75bd4eb" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + " \n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bbe8d5de-d22e-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"bbe22770-d22e-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_c0147f66c3" + ] + }, + "metadata": {} + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "t27kwMtmaoYW" + }, + "source": [ + "## Functions\n", + "\n", + "In set theory a function $f$ from $A$ to $B$ is simply a subset of Cartesian product $A \\times B$, i.e. $f \\subseteq A \\times B$ with the convention that $f(x)$ stands for $y$ such that $(x, y) \\in f$.\n", + "\n", + "Logica is following approach. When you define a predicate using function syntax\n", + "\n", + "\n", + "```\n", + "() = [:- ].\n", + "```\n", + "\n", + "it is interpreted exactly as\n", + "\n", + "```\n", + "(, logica_value: ) [:- ]\n", + "```\n", + "\n", + "Then if a predicate is used in an expression then it is automatically replaced with an auxiliary variable and a call extracting this variable from `logica_value` column is appended to the body.\n", + "\n" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "L0Pvfx6gwznJ", + "colab": { + "resources": { + "http://localhost:8080/nbextensions/google.colab/tabbar.css": { + "data": "Lmdvb2ctdGFie3Bvc2l0aW9uOnJlbGF0aXZlO3BhZGRpbmc6NHB4IDhweDtjb2xvcjojMDBjO3RleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7Y3Vyc29yOmRlZmF1bHR9Lmdvb2ctdGFiLWJhci10b3AgLmdvb2ctdGFie21hcmdpbjoxcHggNHB4IDAgMDtib3JkZXItYm90dG9tOjA7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLXRvcDphZnRlciwuZ29vZy10YWItYmFyLWJvdHRvbTphZnRlcntjb250ZW50OiIgIjtkaXNwbGF5OmJsb2NrO2hlaWdodDowO2NsZWFyOmJvdGg7dmlzaWJpbGl0eTpoaWRkZW59Lmdvb2ctdGFiLWJhci1ib3R0b20gLmdvb2ctdGFie21hcmdpbjowIDRweCAxcHggMDtib3JkZXItdG9wOjA7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLXN0YXJ0IC5nb29nLXRhYnttYXJnaW46MCAwIDRweCAxcHg7Ym9yZGVyLXJpZ2h0OjB9Lmdvb2ctdGFiLWJhci1lbmQgLmdvb2ctdGFie21hcmdpbjowIDFweCA0cHggMDtib3JkZXItbGVmdDowfS5nb29nLXRhYi1ob3ZlcntiYWNrZ3JvdW5kOiNlZWV9Lmdvb2ctdGFiLWRpc2FibGVke2NvbG9yOiM2NjZ9Lmdvb2ctdGFiLXNlbGVjdGVke2NvbG9yOiMwMDA7YmFja2dyb3VuZDojZmZmO3RleHQtZGVjb3JhdGlvbjpub25lO2ZvbnQtd2VpZ2h0OmJvbGQ7Ym9yZGVyOjFweCBzb2xpZCAjNmI5MGRhfS5nb29nLXRhYi1iYXItdG9we3BhZGRpbmctdG9wOjVweCFpbXBvcnRhbnQ7cGFkZGluZy1sZWZ0OjVweCFpbXBvcnRhbnQ7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgIzZiOTBkYSFpbXBvcnRhbnR9Lmdvb2ctdGFiLWJhci10b3AgLmdvb2ctdGFiLXNlbGVjdGVke3RvcDoxcHg7bWFyZ2luLXRvcDowO3BhZGRpbmctYm90dG9tOjVweH0uZ29vZy10YWItYmFyLWJvdHRvbSAuZ29vZy10YWItc2VsZWN0ZWR7dG9wOi0xcHg7bWFyZ2luLWJvdHRvbTowO3BhZGRpbmctdG9wOjVweH0uZ29vZy10YWItYmFyLXN0YXJ0IC5nb29nLXRhYi1zZWxlY3RlZHtsZWZ0OjFweDttYXJnaW4tbGVmdDowO3BhZGRpbmctcmlnaHQ6OXB4fS5nb29nLXRhYi1iYXItZW5kIC5nb29nLXRhYi1zZWxlY3RlZHtsZWZ0Oi0xcHg7bWFyZ2luLXJpZ2h0OjA7cGFkZGluZy1sZWZ0OjlweH0uZ29vZy10YWItYmFye21hcmdpbjowO2JvcmRlcjowO3BhZGRpbmc6MDtsaXN0LXN0eWxlOm5vbmU7Y3Vyc29yOmRlZmF1bHQ7b3V0bGluZTpub25lO2JhY2tncm91bmQ6I2ViZWZmOX0uZ29vZy10YWItYmFyLWNsZWFye2NsZWFyOmJvdGg7aGVpZ2h0OjA7b3ZlcmZsb3c6aGlkZGVufS5nb29nLXRhYi1iYXItc3RhcnR7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLWVuZHtmbG9hdDpyaWdodH0qIGh0bWwgLmdvb2ctdGFiLWJhci1zdGFydHttYXJnaW4tcmlnaHQ6LTNweH0qIGh0bWwgLmdvb2ctdGFiLWJhci1lbmR7bWFyZ2luLWxlZnQ6LTNweH1zZW50aW5lbHt9", + "ok": true, + "headers": [ + [ + "content-length", + "1404" + ], + [ + "content-type", + "text/css" + ] + ], + "status": 200, + "status_text": "" + }, + "http://localhost:8080/nbextensions/google.colab/tabbar_main.min.js": { + "data": "Ly8gY2xhbmctZm9ybWF0IG9mZgooZnVuY3Rpb24oKXt2YXIgZyxhYT1mdW5jdGlvbihhKXt2YXIgYj0wO3JldHVybiBmdW5jdGlvbigpe3JldHVybiBiPGEubGVuZ3RoP3tkb25lOiExLHZhbHVlOmFbYisrXX06e2RvbmU6ITB9fX0sYmE9dHlwZW9mIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzPT0iZnVuY3Rpb24iP09iamVjdC5kZWZpbmVQcm9wZXJ0eTpmdW5jdGlvbihhLGIsYyl7aWYoYT09QXJyYXkucHJvdG90eXBlfHxhPT1PYmplY3QucHJvdG90eXBlKXJldHVybiBhO2FbYl09Yy52YWx1ZTtyZXR1cm4gYX0sY2E9ZnVuY3Rpb24oYSl7YT1bIm9iamVjdCI9PXR5cGVvZiBnbG9iYWxUaGlzJiZnbG9iYWxUaGlzLGEsIm9iamVjdCI9PXR5cGVvZiB3aW5kb3cmJndpbmRvdywib2JqZWN0Ij09dHlwZW9mIHNlbGYmJnNlbGYsIm9iamVjdCI9PXR5cGVvZiBnbG9iYWwmJmdsb2JhbF07Zm9yKHZhciBiPTA7YjxhLmxlbmd0aDsrK2Ipe3ZhciBjPWFbYl07aWYoYyYmYy5NYXRoPT1NYXRoKXJldHVybiBjfXRocm93IEVycm9yKCJDYW5ub3QgZmluZCBnbG9iYWwgb2JqZWN0Iik7Cn0sZGE9Y2EodGhpcyksZWE9ZnVuY3Rpb24oYSxiKXtpZihiKWE6e3ZhciBjPWRhO2E9YS5zcGxpdCgiLiIpO2Zvcih2YXIgZD0wO2Q8YS5sZW5ndGgtMTtkKyspe3ZhciBlPWFbZF07aWYoIShlIGluIGMpKWJyZWFrIGE7Yz1jW2VdfWE9YVthLmxlbmd0aC0xXTtkPWNbYV07Yj1iKGQpO2IhPWQmJmIhPW51bGwmJmJhKGMsYSx7Y29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOmJ9KX19OwplYSgiU3ltYm9sIixmdW5jdGlvbihhKXtpZihhKXJldHVybiBhO3ZhciBiPWZ1bmN0aW9uKGYsaCl7dGhpcy5nPWY7YmEodGhpcywiZGVzY3JpcHRpb24iLHtjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6aH0pfTtiLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmd9O3ZhciBjPSJqc2NvbXBfc3ltYm9sXyIrKE1hdGgucmFuZG9tKCkqMUU5Pj4+MCkrIl8iLGQ9MCxlPWZ1bmN0aW9uKGYpe2lmKHRoaXMgaW5zdGFuY2VvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoIlN5bWJvbCBpcyBub3QgYSBjb25zdHJ1Y3RvciIpO3JldHVybiBuZXcgYihjKyhmfHwiIikrIl8iK2QrKyxmKX07cmV0dXJuIGV9KTsKdmFyIGZhPWZ1bmN0aW9uKGEpe3ZhciBiPXR5cGVvZiBTeW1ib2whPSJ1bmRlZmluZWQiJiZTeW1ib2wuaXRlcmF0b3ImJmFbU3ltYm9sLml0ZXJhdG9yXTtpZihiKXJldHVybiBiLmNhbGwoYSk7aWYodHlwZW9mIGEubGVuZ3RoPT0ibnVtYmVyIilyZXR1cm57bmV4dDphYShhKX07dGhyb3cgRXJyb3IoU3RyaW5nKGEpKyIgaXMgbm90IGFuIGl0ZXJhYmxlIG9yIEFycmF5TGlrZSIpO307ZWEoIlN5bWJvbC5kaXNwb3NlIixmdW5jdGlvbihhKXtyZXR1cm4gYT9hOlN5bWJvbCgiU3ltYm9sLmRpc3Bvc2UiKX0pOy8qCgogQ29weXJpZ2h0IFRoZSBDbG9zdXJlIExpYnJhcnkgQXV0aG9ycy4KIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wCiovCnZhciBsPXRoaXN8fHNlbGYsaWE9ZnVuY3Rpb24oYSl7YS5JYT12b2lkIDA7YS5WPWZ1bmN0aW9uKCl7cmV0dXJuIGEuSWE/YS5JYTphLklhPW5ldyBhfX0samE9ZnVuY3Rpb24oYSl7dmFyIGI9dHlwZW9mIGE7cmV0dXJuIGIhPSJvYmplY3QiP2I6YT9BcnJheS5pc0FycmF5KGEpPyJhcnJheSI6YjoibnVsbCJ9LGthPWZ1bmN0aW9uKGEpe3ZhciBiPWphKGEpO3JldHVybiBiPT0iYXJyYXkifHxiPT0ib2JqZWN0IiYmdHlwZW9mIGEubGVuZ3RoPT0ibnVtYmVyIn0sbT1mdW5jdGlvbihhKXt2YXIgYj10eXBlb2YgYTtyZXR1cm4gYj09Im9iamVjdCImJmEhPW51bGx8fGI9PSJmdW5jdGlvbiJ9LG5hPWZ1bmN0aW9uKGEpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYSxsYSkmJmFbbGFdfHwoYVtsYV09KyttYSl9LGxhPSJjbG9zdXJlX3VpZF8iKyhNYXRoLnJhbmRvbSgpKjFFOT4+PjApLG1hPTAsbj1mdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoKXt9Yy5wcm90b3R5cGU9CmIucHJvdG90eXBlO2EubD1iLnByb3RvdHlwZTthLnByb3RvdHlwZT1uZXcgYzthLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1hO2EucWQ9ZnVuY3Rpb24oZCxlLGYpe2Zvcih2YXIgaD1BcnJheShhcmd1bWVudHMubGVuZ3RoLTIpLGs9MjtrPGFyZ3VtZW50cy5sZW5ndGg7aysrKWhbay0yXT1hcmd1bWVudHNba107cmV0dXJuIGIucHJvdG90eXBlW2VdLmFwcGx5KGQsaCl9fTtmdW5jdGlvbiBvYShhLGIpe2lmKEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKUVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsb2EpO2Vsc2V7dmFyIGM9RXJyb3IoKS5zdGFjaztjJiYodGhpcy5zdGFjaz1jKX1hJiYodGhpcy5tZXNzYWdlPVN0cmluZyhhKSk7YiE9PXZvaWQgMCYmKHRoaXMuY2F1c2U9Yil9bihvYSxFcnJvcik7b2EucHJvdG90eXBlLm5hbWU9IkN1c3RvbUVycm9yIjt2YXIgcGE7ZnVuY3Rpb24gcWEoYSxiKXthPWEuc3BsaXQoIiVzIik7Zm9yKHZhciBjPSIiLGQ9YS5sZW5ndGgtMSxlPTA7ZTxkO2UrKyljKz1hW2VdKyhlPGIubGVuZ3RoP2JbZV06IiVzIik7b2EuY2FsbCh0aGlzLGMrYVtkXSl9bihxYSxvYSk7cWEucHJvdG90eXBlLm5hbWU9IkFzc2VydGlvbkVycm9yIjtmdW5jdGlvbiByYShhLGIsYyxkKXt2YXIgZT0iQXNzZXJ0aW9uIGZhaWxlZCI7aWYoYyl7ZSs9IjogIitjO3ZhciBmPWR9ZWxzZSBhJiYoZSs9IjogIithLGY9Yik7dGhyb3cgbmV3IHFhKCIiK2UsZnx8W10pO30KdmFyIHA9ZnVuY3Rpb24oYSxiLGMpe2F8fHJhKCIiLG51bGwsYixBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMikpO3JldHVybiBhfSxzYT1mdW5jdGlvbihhLGIsYyl7bShhKSYmYS5ub2RlVHlwZT09MXx8cmEoIkV4cGVjdGVkIEVsZW1lbnQgYnV0IGdvdCAlczogJXMuIixbamEoYSksYV0sYixBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMikpfSx1YT1mdW5jdGlvbihhLGIsYyxkKXthIGluc3RhbmNlb2YgYnx8cmEoIkV4cGVjdGVkIGluc3RhbmNlb2YgJXMgYnV0IGdvdCAlcy4iLFt0YShiKSx0YShhKV0sYyxBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMykpfTsKZnVuY3Rpb24gdGEoYSl7cmV0dXJuIGEgaW5zdGFuY2VvZiBGdW5jdGlvbj9hLmRpc3BsYXlOYW1lfHxhLm5hbWV8fCJ1bmtub3duIHR5cGUgbmFtZSI6YSBpbnN0YW5jZW9mIE9iamVjdD9hLmNvbnN0cnVjdG9yLmRpc3BsYXlOYW1lfHxhLmNvbnN0cnVjdG9yLm5hbWV8fE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhKTphPT09bnVsbD8ibnVsbCI6dHlwZW9mIGF9O3ZhciB2YT1BcnJheS5wcm90b3R5cGUuaW5kZXhPZj9mdW5jdGlvbihhLGIpe3AoYS5sZW5ndGghPW51bGwpO3JldHVybiBBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKGEsYix2b2lkIDApfTpmdW5jdGlvbihhLGIpe2lmKHR5cGVvZiBhPT09InN0cmluZyIpcmV0dXJuIHR5cGVvZiBiIT09InN0cmluZyJ8fGIubGVuZ3RoIT0xPy0xOmEuaW5kZXhPZihiLDApO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWlmKGMgaW4gYSYmYVtjXT09PWIpcmV0dXJuIGM7cmV0dXJuLTF9LHdhPUFycmF5LnByb3RvdHlwZS5mb3JFYWNoP2Z1bmN0aW9uKGEsYil7cChhLmxlbmd0aCE9bnVsbCk7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChhLGIsdm9pZCAwKX06ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9YS5sZW5ndGgsZD10eXBlb2YgYT09PSJzdHJpbmciP2Euc3BsaXQoIiIpOmEsZT0wO2U8YztlKyspZSBpbiBkJiZiLmNhbGwodm9pZCAwLGRbZV0sZSxhKX07CmZ1bmN0aW9uIHhhKGEsYil7Yj12YShhLGIpO3ZhciBjO2lmKGM9Yj49MClwKGEubGVuZ3RoIT1udWxsKSxBcnJheS5wcm90b3R5cGUuc3BsaWNlLmNhbGwoYSxiLDEpO3JldHVybiBjfWZ1bmN0aW9uIHlhKGEpe3ZhciBiPWEubGVuZ3RoO2lmKGI+MCl7Zm9yKHZhciBjPUFycmF5KGIpLGQ9MDtkPGI7ZCsrKWNbZF09YVtkXTtyZXR1cm4gY31yZXR1cm5bXX1mdW5jdGlvbiB6YShhLGIsYyxkKXtwKGEubGVuZ3RoIT1udWxsKTtBcnJheS5wcm90b3R5cGUuc3BsaWNlLmFwcGx5KGEsQWEoYXJndW1lbnRzLDEpKX1mdW5jdGlvbiBBYShhLGIsYyl7cChhLmxlbmd0aCE9bnVsbCk7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg8PTI/QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYSxiKTpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhLGIsYyl9O2Z1bmN0aW9uIEJhKGEsYixjKXtmb3IodmFyIGQgaW4gYSliLmNhbGwoYyxhW2RdLGQsYSl9ZnVuY3Rpb24gQ2EoYSxiKXtmb3IodmFyIGMgaW4gYSlpZihhW2NdPT1iKXJldHVybiEwO3JldHVybiExfWZ1bmN0aW9uIERhKGEsYixjKXtpZihhIT09bnVsbCYmYiBpbiBhKXRocm93IEVycm9yKCdUaGUgb2JqZWN0IGFscmVhZHkgY29udGFpbnMgdGhlIGtleSAiJytiKyciJyk7YVtiXT1jfWZ1bmN0aW9uIEVhKGEpe3ZhciBiPXt9LGM7Zm9yKGMgaW4gYSliW2FbY11dPWM7cmV0dXJuIGJ9dmFyIEZhPSJjb25zdHJ1Y3RvciBoYXNPd25Qcm9wZXJ0eSBpc1Byb3RvdHlwZU9mIHByb3BlcnR5SXNFbnVtZXJhYmxlIHRvTG9jYWxlU3RyaW5nIHRvU3RyaW5nIHZhbHVlT2YiLnNwbGl0KCIgIik7CmZ1bmN0aW9uIEdhKGEsYil7Zm9yKHZhciBjLGQsZT0xO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspe2Q9YXJndW1lbnRzW2VdO2ZvcihjIGluIGQpYVtjXT1kW2NdO2Zvcih2YXIgZj0wO2Y8RmEubGVuZ3RoO2YrKyljPUZhW2ZdLE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChkLGMpJiYoYVtjXT1kW2NdKX19O3ZhciBIYT1TdHJpbmcucHJvdG90eXBlLnRyaW0/ZnVuY3Rpb24oYSl7cmV0dXJuIGEudHJpbSgpfTpmdW5jdGlvbihhKXtyZXR1cm4vXltcc1x4YTBdKihbXHNcU10qPylbXHNceGEwXSokLy5leGVjKGEpWzFdfTsvKgoKIENvcHlyaWdodCBHb29nbGUgTExDCiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMAoqLwp2YXIgSWE9e307dmFyIEphPWZ1bmN0aW9uKGEpe2lmKElhIT09SWEpdGhyb3cgRXJyb3IoIkJhZCBzZWNyZXQiKTt0aGlzLmc9YX07SmEucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ307bmV3IEphKCJhYm91dDpibGFuayIpO25ldyBKYSgiYWJvdXQ6aW52YWxpZCN6Q2xvc3VyZXoiKTt2YXIgS2E9W10sTGE9ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJBIFVSTCB3aXRoIGNvbnRlbnQgJyIrYSsiJyB3YXMgc2FuaXRpemVkIGF3YXkuIil9O0thLmluZGV4T2YoTGEpPT09LTEmJkthLnB1c2goTGEpO3ZhciBNYSxOYTthOntmb3IodmFyIE9hPVsiQ0xPU1VSRV9GTEFHUyJdLFBhPWwsUWE9MDtRYTxPYS5sZW5ndGg7UWErKylpZihQYT1QYVtPYVtRYV1dLFBhPT1udWxsKXtOYT1udWxsO2JyZWFrIGF9TmE9UGF9dmFyIFJhPU5hJiZOYVs2MTA0MDEzMDFdO01hPVJhIT1udWxsP1JhOiExO2Z1bmN0aW9uIFNhKCl7dmFyIGE9bC5uYXZpZ2F0b3I7cmV0dXJuIGEmJihhPWEudXNlckFnZW50KT9hOiIifXZhciBUYSxVYT1sLm5hdmlnYXRvcjtUYT1VYT9VYS51c2VyQWdlbnREYXRhfHxudWxsOm51bGw7ZnVuY3Rpb24gcihhKXtyZXR1cm4gU2EoKS5pbmRleE9mKGEpIT0tMX07dmFyIFZhPXIoIkVkZ2UiKSx0PXIoIkdlY2tvIikmJiEoU2EoKS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoIndlYmtpdCIpIT0tMSYmIXIoIkVkZ2UiKSkmJiEocigiVHJpZGVudCIpfHxyKCJNU0lFIikpJiYhcigiRWRnZSIpLHU9U2EoKS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoIndlYmtpdCIpIT0tMSYmIXIoIkVkZ2UiKSx2PU1hJiZUYSYmVGEucGxhdGZvcm0/VGEucGxhdGZvcm09PT0ibWFjT1MiOnIoIk1hY2ludG9zaCIpO3ZhciBYYT1mdW5jdGlvbihhLGIpe0JhKGIsZnVuY3Rpb24oYyxkKXtkPT0ic3R5bGUiP2Euc3R5bGUuY3NzVGV4dD1jOmQ9PSJjbGFzcyI/YS5jbGFzc05hbWU9YzpkPT0iZm9yIj9hLmh0bWxGb3I9YzpXYS5oYXNPd25Qcm9wZXJ0eShkKT9hLnNldEF0dHJpYnV0ZShXYVtkXSxjKTpkLmxhc3RJbmRleE9mKCJhcmlhLSIsMCk9PTB8fGQubGFzdEluZGV4T2YoImRhdGEtIiwwKT09MD9hLnNldEF0dHJpYnV0ZShkLGMpOmFbZF09Y30pfSxXYT17Y2VsbHBhZGRpbmc6ImNlbGxQYWRkaW5nIixjZWxsc3BhY2luZzoiY2VsbFNwYWNpbmciLGNvbHNwYW46ImNvbFNwYW4iLGZyYW1lYm9yZGVyOiJmcmFtZUJvcmRlciIsaGVpZ2h0OiJoZWlnaHQiLG1heGxlbmd0aDoibWF4TGVuZ3RoIixub25jZToibm9uY2UiLHJvbGU6InJvbGUiLHJvd3NwYW46InJvd1NwYW4iLHR5cGU6InR5cGUiLHVzZW1hcDoidXNlTWFwIix2YWxpZ246InZBbGlnbiIsd2lkdGg6IndpZHRoIn0sWWE9ZnVuY3Rpb24oYSwKYixjKXtmdW5jdGlvbiBkKGspe2smJmIuYXBwZW5kQ2hpbGQodHlwZW9mIGs9PT0ic3RyaW5nIj9hLmNyZWF0ZVRleHROb2RlKGspOmspfWZvcih2YXIgZT0yO2U8Yy5sZW5ndGg7ZSsrKXt2YXIgZj1jW2VdO2lmKCFrYShmKXx8bShmKSYmZi5ub2RlVHlwZT4wKWQoZik7ZWxzZXthOntpZihmJiZ0eXBlb2YgZi5sZW5ndGg9PSJudW1iZXIiKXtpZihtKGYpKXt2YXIgaD10eXBlb2YgZi5pdGVtPT0iZnVuY3Rpb24ifHx0eXBlb2YgZi5pdGVtPT0ic3RyaW5nIjticmVhayBhfWlmKHR5cGVvZiBmPT09ImZ1bmN0aW9uIil7aD10eXBlb2YgZi5pdGVtPT0iZnVuY3Rpb24iO2JyZWFrIGF9fWg9ITF9d2EoaD95YShmKTpmLGQpfX19LFphPWZ1bmN0aW9uKGEsYil7Yj1TdHJpbmcoYik7YS5jb250ZW50VHlwZT09PSJhcHBsaWNhdGlvbi94aHRtbCt4bWwiJiYoYj1iLnRvTG93ZXJDYXNlKCkpO3JldHVybiBhLmNyZWF0ZUVsZW1lbnQoYil9LCRhPWZ1bmN0aW9uKGEpe2EmJmEucGFyZW50Tm9kZSYmCmEucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhKX0sYWI9ZnVuY3Rpb24oYSxiKXtpZighYXx8IWIpcmV0dXJuITE7aWYoYS5jb250YWlucyYmYi5ub2RlVHlwZT09MSlyZXR1cm4gYT09Ynx8YS5jb250YWlucyhiKTtpZih0eXBlb2YgYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiE9InVuZGVmaW5lZCIpcmV0dXJuIGE9PWJ8fCEhKGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24oYikmMTYpO2Zvcig7YiYmYSE9YjspYj1iLnBhcmVudE5vZGU7cmV0dXJuIGI9PWF9LGJiPWZ1bmN0aW9uKGEpe3AoYSwiTm9kZSBjYW5ub3QgYmUgbnVsbCBvciB1bmRlZmluZWQuIik7cmV0dXJuIGEubm9kZVR5cGU9PTk/YTphLm93bmVyRG9jdW1lbnR8fGEuZG9jdW1lbnR9LGNiPWZ1bmN0aW9uKGEsYil7Yj9hLnRhYkluZGV4PTA6KGEudGFiSW5kZXg9LTEsYS5yZW1vdmVBdHRyaWJ1dGUoInRhYkluZGV4IikpfSxkYj1mdW5jdGlvbihhKXtyZXR1cm4gYS5oYXNBdHRyaWJ1dGUoInRhYmluZGV4Iil9LGViPQpmdW5jdGlvbihhKXthPWEudGFiSW5kZXg7cmV0dXJuIHR5cGVvZiBhPT09Im51bWJlciImJmE+PTAmJmE8MzI3Njh9LGZiPWZ1bmN0aW9uKGEpe3RoaXMuZz1hfHxsLmRvY3VtZW50fHxkb2N1bWVudH07ZmIucHJvdG90eXBlLmk9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nO3JldHVybiB0eXBlb2YgYT09PSJzdHJpbmciP2IuZ2V0RWxlbWVudEJ5SWQoYSk6YX07ZmIucHJvdG90eXBlLmg9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXMuZyxlPWFyZ3VtZW50cyxmPWVbMV0saD1aYShkLFN0cmluZyhlWzBdKSk7ZiYmKHR5cGVvZiBmPT09InN0cmluZyI/aC5jbGFzc05hbWU9ZjpBcnJheS5pc0FycmF5KGYpP2guY2xhc3NOYW1lPWYuam9pbigiICIpOlhhKGgsZikpO2UubGVuZ3RoPjImJllhKGQsaCxlKTtyZXR1cm4gaH07dmFyIHc9ZnVuY3Rpb24oKXt0aGlzLmJhPXRoaXMuYmE7dGhpcy5rYT10aGlzLmthfTt3LnByb3RvdHlwZS5iYT0hMTt3LnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7dGhpcy5iYXx8KHRoaXMuYmE9ITAsdGhpcy5DKCkpfTt3LnByb3RvdHlwZVtTeW1ib2wuZGlzcG9zZV09ZnVuY3Rpb24oKXt0aGlzLmRpc3Bvc2UoKX07dy5wcm90b3R5cGUuQz1mdW5jdGlvbigpe2lmKHRoaXMua2EpZm9yKDt0aGlzLmthLmxlbmd0aDspdGhpcy5rYS5zaGlmdCgpKCl9O3ZhciB5PWZ1bmN0aW9uKGEsYil7dGhpcy50eXBlPWE7dGhpcy51PXRoaXMudGFyZ2V0PWI7dGhpcy5kZWZhdWx0UHJldmVudGVkPXRoaXMuQT0hMX07eS5wcm90b3R5cGUudj1mdW5jdGlvbigpe3RoaXMuQT0hMH07eS5wcm90b3R5cGUuaj1mdW5jdGlvbigpe3RoaXMuZGVmYXVsdFByZXZlbnRlZD0hMH07dmFyIGdiPWZ1bmN0aW9uKCl7aWYoIWwuYWRkRXZlbnRMaXN0ZW5lcnx8IU9iamVjdC5kZWZpbmVQcm9wZXJ0eSlyZXR1cm4hMTt2YXIgYT0hMSxiPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwicGFzc2l2ZSIse2dldDpmdW5jdGlvbigpe2E9ITB9fSk7dHJ5e3ZhciBjPWZ1bmN0aW9uKCl7fTtsLmFkZEV2ZW50TGlzdGVuZXIoInRlc3QiLGMsYik7bC5yZW1vdmVFdmVudExpc3RlbmVyKCJ0ZXN0IixjLGIpfWNhdGNoKGQpe31yZXR1cm4gYX0oKTt2YXIgej1mdW5jdGlvbihhLGIpe3kuY2FsbCh0aGlzLGE/YS50eXBlOiIiKTt0aGlzLnJlbGF0ZWRUYXJnZXQ9dGhpcy51PXRoaXMudGFyZ2V0PW51bGw7dGhpcy5idXR0b249dGhpcy5zY3JlZW5ZPXRoaXMuc2NyZWVuWD10aGlzLmNsaWVudFk9dGhpcy5jbGllbnRYPTA7dGhpcy5rZXk9IiI7dGhpcy5nPTA7dGhpcy5tZXRhS2V5PXRoaXMuc2hpZnRLZXk9dGhpcy5hbHRLZXk9dGhpcy5jdHJsS2V5PSExO3RoaXMuc3RhdGU9bnVsbDt0aGlzLkc9ITE7dGhpcy5wb2ludGVySWQ9MDt0aGlzLnBvaW50ZXJUeXBlPSIiO3RoaXMudGltZVN0YW1wPTA7dGhpcy5oPW51bGw7aWYoYSl7dmFyIGM9dGhpcy50eXBlPWEudHlwZSxkPWEuY2hhbmdlZFRvdWNoZXMmJmEuY2hhbmdlZFRvdWNoZXMubGVuZ3RoP2EuY2hhbmdlZFRvdWNoZXNbMF06bnVsbDt0aGlzLnRhcmdldD1hLnRhcmdldHx8YS5zcmNFbGVtZW50O3RoaXMudT1iO2I9YS5yZWxhdGVkVGFyZ2V0O2J8fChjPT0ibW91c2VvdmVyIj8KYj1hLmZyb21FbGVtZW50OmM9PSJtb3VzZW91dCImJihiPWEudG9FbGVtZW50KSk7dGhpcy5yZWxhdGVkVGFyZ2V0PWI7ZD8odGhpcy5jbGllbnRYPWQuY2xpZW50WCE9PXZvaWQgMD9kLmNsaWVudFg6ZC5wYWdlWCx0aGlzLmNsaWVudFk9ZC5jbGllbnRZIT09dm9pZCAwP2QuY2xpZW50WTpkLnBhZ2VZLHRoaXMuc2NyZWVuWD1kLnNjcmVlblh8fDAsdGhpcy5zY3JlZW5ZPWQuc2NyZWVuWXx8MCk6KHRoaXMuY2xpZW50WD1hLmNsaWVudFghPT12b2lkIDA/YS5jbGllbnRYOmEucGFnZVgsdGhpcy5jbGllbnRZPWEuY2xpZW50WSE9PXZvaWQgMD9hLmNsaWVudFk6YS5wYWdlWSx0aGlzLnNjcmVlblg9YS5zY3JlZW5YfHwwLHRoaXMuc2NyZWVuWT1hLnNjcmVlbll8fDApO3RoaXMuYnV0dG9uPWEuYnV0dG9uO3RoaXMuZz1hLmtleUNvZGV8fDA7dGhpcy5rZXk9YS5rZXl8fCIiO3RoaXMuY3RybEtleT1hLmN0cmxLZXk7dGhpcy5hbHRLZXk9YS5hbHRLZXk7dGhpcy5zaGlmdEtleT1hLnNoaWZ0S2V5Owp0aGlzLm1ldGFLZXk9YS5tZXRhS2V5O3RoaXMuRz12P2EubWV0YUtleTphLmN0cmxLZXk7dGhpcy5wb2ludGVySWQ9YS5wb2ludGVySWR8fDA7dGhpcy5wb2ludGVyVHlwZT1hLnBvaW50ZXJUeXBlO3RoaXMuc3RhdGU9YS5zdGF0ZTt0aGlzLnRpbWVTdGFtcD1hLnRpbWVTdGFtcDt0aGlzLmg9YTthLmRlZmF1bHRQcmV2ZW50ZWQmJnoubC5qLmNhbGwodGhpcyl9fTtuKHoseSk7ei5wcm90b3R5cGUudj1mdW5jdGlvbigpe3oubC52LmNhbGwodGhpcyk7dGhpcy5oLnN0b3BQcm9wYWdhdGlvbj90aGlzLmguc3RvcFByb3BhZ2F0aW9uKCk6dGhpcy5oLmNhbmNlbEJ1YmJsZT0hMH07ei5wcm90b3R5cGUuaj1mdW5jdGlvbigpe3oubC5qLmNhbGwodGhpcyk7dmFyIGE9dGhpcy5oO2EucHJldmVudERlZmF1bHQ/YS5wcmV2ZW50RGVmYXVsdCgpOmEucmV0dXJuVmFsdWU9ITF9O3ZhciBoYj0iY2xvc3VyZV9saXN0ZW5hYmxlXyIrKE1hdGgucmFuZG9tKCkqMUU2fDApLGliPWZ1bmN0aW9uKGEpe3JldHVybiEoIWF8fCFhW2hiXSl9O3ZhciBqYj0wO3ZhciBrYj1mdW5jdGlvbihhLGIsYyxkLGUpe3RoaXMubGlzdGVuZXI9YTt0aGlzLnByb3h5PW51bGw7dGhpcy5zcmM9Yjt0aGlzLnR5cGU9Yzt0aGlzLmNhcHR1cmU9ISFkO3RoaXMucGE9ZTt0aGlzLmtleT0rK2piO3RoaXMuamE9dGhpcy5vYT0hMX0sbGI9ZnVuY3Rpb24oYSl7YS5qYT0hMDthLmxpc3RlbmVyPW51bGw7YS5wcm94eT1udWxsO2Euc3JjPW51bGw7YS5wYT1udWxsfTt2YXIgbWI9ZnVuY3Rpb24oYSl7dGhpcy5zcmM9YTt0aGlzLmc9e307dGhpcy5oPTB9O21iLnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZj1hLnRvU3RyaW5nKCk7YT10aGlzLmdbZl07YXx8KGE9dGhpcy5nW2ZdPVtdLHRoaXMuaCsrKTt2YXIgaD1uYihhLGIsZCxlKTtoPi0xPyhiPWFbaF0sY3x8KGIub2E9ITEpKTooYj1uZXcga2IoYix0aGlzLnNyYyxmLCEhZCxlKSxiLm9hPWMsYS5wdXNoKGIpKTtyZXR1cm4gYn07CnZhciBvYj1mdW5jdGlvbihhLGIpe3ZhciBjPWIudHlwZTtjIGluIGEuZyYmeGEoYS5nW2NdLGIpJiYobGIoYiksYS5nW2NdLmxlbmd0aD09MCYmKGRlbGV0ZSBhLmdbY10sYS5oLS0pKX0scGI9ZnVuY3Rpb24oYSxiLGMsZCxlKXthPWEuZ1tiLnRvU3RyaW5nKCldO2I9LTE7YSYmKGI9bmIoYSxjLGQsZSkpO3JldHVybiBiPi0xP2FbYl06bnVsbH0sbmI9ZnVuY3Rpb24oYSxiLGMsZCl7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDsrK2Upe3ZhciBmPWFbZV07aWYoIWYuamEmJmYubGlzdGVuZXI9PWImJmYuY2FwdHVyZT09ISFjJiZmLnBhPT1kKXJldHVybiBlfXJldHVybi0xfTt2YXIgcWI9ImNsb3N1cmVfbG1fIisoTWF0aC5yYW5kb20oKSoxRTZ8MCkscmI9e30sc2I9MCx1Yj1mdW5jdGlvbihhLGIsYyxkLGUpe2lmKGQmJmQub25jZSlyZXR1cm4gdGIoYSxiLGMsZCxlKTtpZihBcnJheS5pc0FycmF5KGIpKXtmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKyl1YihhLGJbZl0sYyxkLGUpO3JldHVybiBudWxsfWM9dmIoYyk7cmV0dXJuIGliKGEpP3diKGEsYixjLG0oZCk/ISFkLmNhcHR1cmU6ISFkLGUpOnhiKGEsYixjLCExLGQsZSl9LHhiPWZ1bmN0aW9uKGEsYixjLGQsZSxmKXtpZighYil0aHJvdyBFcnJvcigiSW52YWxpZCBldmVudCB0eXBlIik7dmFyIGg9bShlKT8hIWUuY2FwdHVyZTohIWUsaz15YihhKTtrfHwoYVtxYl09az1uZXcgbWIoYSkpO2M9ay5hZGQoYixjLGQsaCxmKTtpZihjLnByb3h5KXJldHVybiBjO2Q9emIoKTtjLnByb3h5PWQ7ZC5zcmM9YTtkLmxpc3RlbmVyPWM7aWYoYS5hZGRFdmVudExpc3RlbmVyKWdifHwoZT1oKSxlPT09dm9pZCAwJiYKKGU9ITEpLGEuYWRkRXZlbnRMaXN0ZW5lcihiLnRvU3RyaW5nKCksZCxlKTtlbHNlIGlmKGEuYXR0YWNoRXZlbnQpYS5hdHRhY2hFdmVudChBYihiLnRvU3RyaW5nKCkpLGQpO2Vsc2UgaWYoYS5hZGRMaXN0ZW5lciYmYS5yZW1vdmVMaXN0ZW5lcilwKGI9PT0iY2hhbmdlIiwiTWVkaWFRdWVyeUxpc3Qgb25seSBoYXMgYSBjaGFuZ2UgZXZlbnQiKSxhLmFkZExpc3RlbmVyKGQpO2Vsc2UgdGhyb3cgRXJyb3IoImFkZEV2ZW50TGlzdGVuZXIgYW5kIGF0dGFjaEV2ZW50IGFyZSB1bmF2YWlsYWJsZS4iKTtzYisrO3JldHVybiBjfSx6Yj1mdW5jdGlvbigpe3ZhciBhPUJiLGI9ZnVuY3Rpb24oYyl7cmV0dXJuIGEuY2FsbChiLnNyYyxiLmxpc3RlbmVyLGMpfTtyZXR1cm4gYn0sdGI9ZnVuY3Rpb24oYSxiLGMsZCxlKXtpZihBcnJheS5pc0FycmF5KGIpKXtmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKyl0YihhLGJbZl0sYyxkLGUpO3JldHVybiBudWxsfWM9dmIoYyk7cmV0dXJuIGliKGEpPwphLkEuYWRkKFN0cmluZyhiKSxjLCEwLG0oZCk/ISFkLmNhcHR1cmU6ISFkLGUpOnhiKGEsYixjLCEwLGQsZSl9LENiPWZ1bmN0aW9uKGEsYixjLGQsZSl7aWYoQXJyYXkuaXNBcnJheShiKSlmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKylDYihhLGJbZl0sYyxkLGUpO2Vsc2UgZD1tKGQpPyEhZC5jYXB0dXJlOiEhZCxjPXZiKGMpLGliKGEpPyhhPWEuQSxiPVN0cmluZyhiKS50b1N0cmluZygpLGIgaW4gYS5nJiYoZj1hLmdbYl0sYz1uYihmLGMsZCxlKSxjPi0xJiYobGIoZltjXSkscChmLmxlbmd0aCE9bnVsbCksQXJyYXkucHJvdG90eXBlLnNwbGljZS5jYWxsKGYsYywxKSxmLmxlbmd0aD09MCYmKGRlbGV0ZSBhLmdbYl0sYS5oLS0pKSkpOmEmJihhPXliKGEpKSYmKGM9cGIoYSxiLGMsZCxlKSkmJkEoYyl9LEE9ZnVuY3Rpb24oYSl7aWYodHlwZW9mIGEhPT0ibnVtYmVyIiYmYSYmIWEuamEpe3ZhciBiPWEuc3JjO2lmKGliKGIpKW9iKGIuQSxhKTtlbHNle3ZhciBjPWEudHlwZSwKZD1hLnByb3h5O2IucmVtb3ZlRXZlbnRMaXN0ZW5lcj9iLnJlbW92ZUV2ZW50TGlzdGVuZXIoYyxkLGEuY2FwdHVyZSk6Yi5kZXRhY2hFdmVudD9iLmRldGFjaEV2ZW50KEFiKGMpLGQpOmIuYWRkTGlzdGVuZXImJmIucmVtb3ZlTGlzdGVuZXImJmIucmVtb3ZlTGlzdGVuZXIoZCk7c2ItLTsoYz15YihiKSk/KG9iKGMsYSksYy5oPT0wJiYoYy5zcmM9bnVsbCxiW3FiXT1udWxsKSk6bGIoYSl9fX0sQWI9ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW4gcmI/cmJbYV06cmJbYV09Im9uIithfSxCYj1mdW5jdGlvbihhLGIpe2lmKGEuamEpYT0hMDtlbHNle2I9bmV3IHooYix0aGlzKTt2YXIgYz1hLmxpc3RlbmVyLGQ9YS5wYXx8YS5zcmM7YS5vYSYmQShhKTthPWMuY2FsbChkLGIpfXJldHVybiBhfSx5Yj1mdW5jdGlvbihhKXthPWFbcWJdO3JldHVybiBhIGluc3RhbmNlb2YgbWI/YTpudWxsfSxEYj0iX19jbG9zdXJlX2V2ZW50c19mbl8iKyhNYXRoLnJhbmRvbSgpKjFFOT4+PjApLHZiPWZ1bmN0aW9uKGEpe3AoYSwKIkxpc3RlbmVyIGNhbiBub3QgYmUgbnVsbC4iKTtpZih0eXBlb2YgYT09PSJmdW5jdGlvbiIpcmV0dXJuIGE7cChhLmhhbmRsZUV2ZW50LCJBbiBvYmplY3QgbGlzdGVuZXIgbXVzdCBoYXZlIGhhbmRsZUV2ZW50IG1ldGhvZC4iKTthW0RiXXx8KGFbRGJdPWZ1bmN0aW9uKGIpe3JldHVybiBhLmhhbmRsZUV2ZW50KGIpfSk7cmV0dXJuIGFbRGJdfTt2YXIgRWI9ZnVuY3Rpb24oYSl7dy5jYWxsKHRoaXMpO3RoaXMuaD1hO3RoaXMuZz17fX07bihFYix3KTsKdmFyIEZiPVtdLEI9ZnVuY3Rpb24oYSxiLGMsZCl7QXJyYXkuaXNBcnJheShjKXx8KGMmJihGYlswXT1jLnRvU3RyaW5nKCkpLGM9RmIpO2Zvcih2YXIgZT0wO2U8Yy5sZW5ndGg7ZSsrKXt2YXIgZj11YihiLGNbZV0sZHx8YS5oYW5kbGVFdmVudCwhMSxhLmh8fGEpO2lmKCFmKWJyZWFrO2EuZ1tmLmtleV09Zn1yZXR1cm4gYX0sQz1mdW5jdGlvbihhLGIsYyxkLGUsZil7aWYoQXJyYXkuaXNBcnJheShjKSlmb3IodmFyIGg9MDtoPGMubGVuZ3RoO2grKylDKGEsYixjW2hdLGQsZSxmKTtlbHNlIGQ9ZHx8YS5oYW5kbGVFdmVudCxlPW0oZSk/ISFlLmNhcHR1cmU6ISFlLGY9Znx8YS5ofHxhLGQ9dmIoZCksZT0hIWUsYz1pYihiKT9wYihiLkEsU3RyaW5nKGMpLGQsZSxmKTpiPyhiPXliKGIpKT9wYihiLGMsZCxlLGYpOm51bGw6bnVsbCxjJiYoQShjKSxkZWxldGUgYS5nW2Mua2V5XSk7cmV0dXJuIGF9LEdiPWZ1bmN0aW9uKGEpe0JhKGEuZyxmdW5jdGlvbihiLGMpe3RoaXMuZy5oYXNPd25Qcm9wZXJ0eShjKSYmCkEoYil9LGEpO2EuZz17fX07RWIucHJvdG90eXBlLkM9ZnVuY3Rpb24oKXtFYi5sLkMuY2FsbCh0aGlzKTtHYih0aGlzKX07RWIucHJvdG90eXBlLmhhbmRsZUV2ZW50PWZ1bmN0aW9uKCl7dGhyb3cgRXJyb3IoIkV2ZW50SGFuZGxlci5oYW5kbGVFdmVudCBub3QgaW1wbGVtZW50ZWQiKTt9O3ZhciBEPWZ1bmN0aW9uKCl7dy5jYWxsKHRoaXMpO3RoaXMuQT1uZXcgbWIodGhpcyk7dGhpcy5ZYT10aGlzO3RoaXMubGE9bnVsbH07bihELHcpO0QucHJvdG90eXBlW2hiXT0hMDtELnByb3RvdHlwZS5BYT1mdW5jdGlvbihhKXt0aGlzLmxhPWF9O0QucHJvdG90eXBlLnJlbW92ZUV2ZW50TGlzdGVuZXI9ZnVuY3Rpb24oYSxiLGMsZCl7Q2IodGhpcyxhLGIsYyxkKX07CnZhciBFPWZ1bmN0aW9uKGEsYil7SGIoYSk7dmFyIGM9YS5sYTtpZihjKXt2YXIgZD1bXTtmb3IodmFyIGU9MTtjO2M9Yy5sYSlkLnB1c2goYykscCgrK2U8MUUzLCJpbmZpbml0ZSBsb29wIil9YT1hLllhO2M9Yi50eXBlfHxiO3R5cGVvZiBiPT09InN0cmluZyI/Yj1uZXcgeShiLGEpOmIgaW5zdGFuY2VvZiB5P2IudGFyZ2V0PWIudGFyZ2V0fHxhOihlPWIsYj1uZXcgeShjLGEpLEdhKGIsZSkpO2U9ITA7dmFyIGY7aWYoZClmb3IoZj1kLmxlbmd0aC0xOyFiLkEmJmY+PTA7Zi0tKXt2YXIgaD1iLnU9ZFtmXTtlPUliKGgsYywhMCxiKSYmZX1iLkF8fChoPWIudT1hLGU9SWIoaCxjLCEwLGIpJiZlLGIuQXx8KGU9SWIoaCxjLCExLGIpJiZlKSk7aWYoZClmb3IoZj0wOyFiLkEmJmY8ZC5sZW5ndGg7ZisrKWg9Yi51PWRbZl0sZT1JYihoLGMsITEsYikmJmU7cmV0dXJuIGV9OwpELnByb3RvdHlwZS5DPWZ1bmN0aW9uKCl7RC5sLkMuY2FsbCh0aGlzKTtpZih0aGlzLkEpe3ZhciBhPXRoaXMuQSxiPTAsYztmb3IoYyBpbiBhLmcpe2Zvcih2YXIgZD1hLmdbY10sZT0wO2U8ZC5sZW5ndGg7ZSsrKSsrYixsYihkW2VdKTtkZWxldGUgYS5nW2NdO2EuaC0tfX10aGlzLmxhPW51bGx9O3ZhciB3Yj1mdW5jdGlvbihhLGIsYyxkLGUpe0hiKGEpO3JldHVybiBhLkEuYWRkKFN0cmluZyhiKSxjLCExLGQsZSl9LEliPWZ1bmN0aW9uKGEsYixjLGQpe2I9YS5BLmdbU3RyaW5nKGIpXTtpZighYilyZXR1cm4hMDtiPWIuY29uY2F0KCk7Zm9yKHZhciBlPSEwLGY9MDtmPGIubGVuZ3RoOysrZil7dmFyIGg9YltmXTtpZihoJiYhaC5qYSYmaC5jYXB0dXJlPT1jKXt2YXIgaz1oLmxpc3RlbmVyLHE9aC5wYXx8aC5zcmM7aC5vYSYmb2IoYS5BLGgpO2U9ay5jYWxsKHEsZCkhPT0hMSYmZX19cmV0dXJuIGUmJiFkLmRlZmF1bHRQcmV2ZW50ZWR9LEhiPWZ1bmN0aW9uKGEpe3AoYS5BLCJFdmVudCB0YXJnZXQgaXMgbm90IGluaXRpYWxpemVkLiBEaWQgeW91IGNhbGwgdGhlIHN1cGVyY2xhc3MgKGdvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0KSBjb25zdHJ1Y3Rvcj8iKX07dmFyIEpiPXQ/Ik1velVzZXJTZWxlY3QiOnV8fFZhPyJXZWJraXRVc2VyU2VsZWN0IjpudWxsLEtiPWZ1bmN0aW9uKGEsYil7Yj1iP251bGw6YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpO2lmKEpiJiYoYS5zdHlsZSYmKGEuc3R5bGVbSmJdPSJub25lIiksYikpZm9yKHZhciBjPTA7YT1iW2NdO2MrKylhLnN0eWxlJiYoYS5zdHlsZVtKYl09Im5vbmUiKX07dmFyIExiPWZ1bmN0aW9uKCl7fTtpYShMYik7TGIucHJvdG90eXBlLmc9MDt2YXIgRj1mdW5jdGlvbihhKXtELmNhbGwodGhpcyk7dGhpcy5HPWF8fHBhfHwocGE9bmV3IGZiKTt0aGlzLnphPU1iO3RoaXMuWT1udWxsO3RoaXMucz0hMTt0aGlzLmc9bnVsbDt0aGlzLk09dm9pZCAwO3RoaXMudT10aGlzLmo9dGhpcy5oPW51bGw7dGhpcy5TYT0hMX07bihGLEQpO0YucHJvdG90eXBlLlphPUxiLlYoKTsKdmFyIE1iPW51bGwsTmI9ZnVuY3Rpb24oYSxiKXtzd2l0Y2goYSl7Y2FzZSAxOnJldHVybiBiPyJkaXNhYmxlIjoiZW5hYmxlIjtjYXNlIDI6cmV0dXJuIGI/ImhpZ2hsaWdodCI6InVuaGlnaGxpZ2h0IjtjYXNlIDQ6cmV0dXJuIGI/ImFjdGl2YXRlIjoiZGVhY3RpdmF0ZSI7Y2FzZSA4OnJldHVybiBiPyJzZWxlY3QiOiJ1bnNlbGVjdCI7Y2FzZSAxNjpyZXR1cm4gYj8iY2hlY2siOiJ1bmNoZWNrIjtjYXNlIDMyOnJldHVybiBiPyJmb2N1cyI6ImJsdXIiO2Nhc2UgNjQ6cmV0dXJuIGI/Im9wZW4iOiJjbG9zZSJ9dGhyb3cgRXJyb3IoIkludmFsaWQgY29tcG9uZW50IHN0YXRlIik7fSxPYj1mdW5jdGlvbihhKXtyZXR1cm4gYS5ZfHwoYS5ZPSI6IisoYS5aYS5nKyspLnRvU3RyaW5nKDM2KSl9LFBiPWZ1bmN0aW9uKGEsYil7aWYoYS5oJiZhLmgudSl7dmFyIGM9YS5oLnUsZD1hLlk7ZCBpbiBjJiZkZWxldGUgY1tkXTtEYShhLmgudSxiLGEpfWEuWT1ifTtGLnByb3RvdHlwZS5pPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ307CnZhciBRYj1mdW5jdGlvbihhKXthLk18fChhLk09bmV3IEViKGEpKTtyZXR1cm4gcChhLk0pfTtGLnByb3RvdHlwZS5BYT1mdW5jdGlvbihhKXtpZih0aGlzLmgmJnRoaXMuaCE9YSl0aHJvdyBFcnJvcigiTWV0aG9kIG5vdCBzdXBwb3J0ZWQiKTtGLmwuQWEuY2FsbCh0aGlzLGEpfTtGLnByb3RvdHlwZS5tYT1mdW5jdGlvbigpe3RoaXMuZz1aYSh0aGlzLkcuZywiRElWIil9O0YucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbihhKXtSYih0aGlzLGEpfTsKdmFyIFJiPWZ1bmN0aW9uKGEsYixjKXtpZihhLnMpdGhyb3cgRXJyb3IoIkNvbXBvbmVudCBhbHJlYWR5IHJlbmRlcmVkIik7YS5nfHxhLm1hKCk7Yj9iLmluc2VydEJlZm9yZShhLmcsY3x8bnVsbCk6YS5HLmcuYm9keS5hcHBlbmRDaGlsZChhLmcpO2EuaCYmIWEuaC5zfHxhLkkoKX0sU2I9ZnVuY3Rpb24oYSxiKXtpZihhLnMpdGhyb3cgRXJyb3IoIkNvbXBvbmVudCBhbHJlYWR5IHJlbmRlcmVkIik7aWYoYiYmYS53YShiKSl7YS5TYT0hMDt2YXIgYz1iYihiKTthLkcmJmEuRy5nPT1jfHwoYS5HPWI/bmV3IGZiKGJiKGIpKTpwYXx8KHBhPW5ldyBmYikpO2EuRWEoYik7YS5JKCl9ZWxzZSB0aHJvdyBFcnJvcigiSW52YWxpZCBlbGVtZW50IHRvIGRlY29yYXRlIik7fTtnPUYucHJvdG90eXBlO2cud2E9ZnVuY3Rpb24oKXtyZXR1cm4hMH07Zy5FYT1mdW5jdGlvbihhKXt0aGlzLmc9YX07CmcuST1mdW5jdGlvbigpe3RoaXMucz0hMDtUYih0aGlzLGZ1bmN0aW9uKGEpeyFhLnMmJmEuaSgpJiZhLkkoKX0pfTtnLlU9ZnVuY3Rpb24oKXtUYih0aGlzLGZ1bmN0aW9uKGEpe2EucyYmYS5VKCl9KTt0aGlzLk0mJkdiKHRoaXMuTSk7dGhpcy5zPSExfTtnLkM9ZnVuY3Rpb24oKXt0aGlzLnMmJnRoaXMuVSgpO3RoaXMuTSYmKHRoaXMuTS5kaXNwb3NlKCksZGVsZXRlIHRoaXMuTSk7VGIodGhpcyxmdW5jdGlvbihhKXthLmRpc3Bvc2UoKX0pOyF0aGlzLlNhJiZ0aGlzLmcmJiRhKHRoaXMuZyk7dGhpcy5oPXRoaXMuZz10aGlzLnU9dGhpcy5qPW51bGw7Ri5sLkMuY2FsbCh0aGlzKX07Zy5CYT1mdW5jdGlvbihhLGIpe3RoaXMuQ2EoYSxIKHRoaXMpLGIpfTsKZy5DYT1mdW5jdGlvbihhLGIsYyl7cCghIWEsIlByb3ZpZGVkIGVsZW1lbnQgbXVzdCBub3QgYmUgbnVsbC4iKTtpZihhLnMmJihjfHwhdGhpcy5zKSl0aHJvdyBFcnJvcigiQ29tcG9uZW50IGFscmVhZHkgcmVuZGVyZWQiKTtpZihiPDB8fGI+SCh0aGlzKSl0aHJvdyBFcnJvcigiQ2hpbGQgY29tcG9uZW50IGluZGV4IG91dCBvZiBib3VuZHMiKTt0aGlzLnUmJnRoaXMuanx8KHRoaXMudT17fSx0aGlzLmo9W10pO2lmKGEuaD09dGhpcyl7dmFyIGQ9dGhpcy51LGU9T2IoYSk7ZFtlXT1hO3hhKHRoaXMuaixhKX1lbHNlIERhKHRoaXMudSxPYihhKSxhKTtpZihhPT10aGlzKXRocm93IEVycm9yKCJVbmFibGUgdG8gc2V0IHBhcmVudCBjb21wb25lbnQiKTtpZihkPXRoaXMmJmEuaCYmYS5ZKWU9YS5oLGQ9YS5ZLGUudSYmZD8oZT1lLnUsZD0oZSE9PW51bGwmJmQgaW4gZT9lW2RdOnZvaWQgMCl8fG51bGwpOmQ9bnVsbDtpZihkJiZhLmghPXRoaXMpdGhyb3cgRXJyb3IoIlVuYWJsZSB0byBzZXQgcGFyZW50IGNvbXBvbmVudCIpOwphLmg9dGhpcztGLmwuQWEuY2FsbChhLHRoaXMpO3phKHRoaXMuaixiLDAsYSk7YS5zJiZ0aGlzLnMmJmEuaD09dGhpcz8oYz10aGlzLm5hKCksKGMuY2hpbGROb2Rlc1tiXXx8bnVsbCkhPWEuaSgpJiYoYS5pKCkucGFyZW50RWxlbWVudD09YyYmYy5yZW1vdmVDaGlsZChhLmkoKSksYj1jLmNoaWxkTm9kZXNbYl18fG51bGwsYy5pbnNlcnRCZWZvcmUoYS5pKCksYikpKTpjPyh0aGlzLmd8fHRoaXMubWEoKSxiPUkodGhpcyxiKzEpLFJiKGEsdGhpcy5uYSgpLGI/Yi5nOm51bGwpKTp0aGlzLnMmJiFhLnMmJmEuZyYmYS5nLnBhcmVudE5vZGUmJmEuZy5wYXJlbnROb2RlLm5vZGVUeXBlPT0xJiZhLkkoKX07Zy5uYT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmd9Owp2YXIgVWI9ZnVuY3Rpb24oYSl7aWYoYS56YT09bnVsbCl7dmFyIGI9YS5zP2EuZzphLkcuZy5ib2R5O2E6e3ZhciBjPWJiKGIpO2lmKGMuZGVmYXVsdFZpZXcmJmMuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSYmKGM9Yy5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKGIsbnVsbCkpKXtjPWMuZGlyZWN0aW9ufHxjLmdldFByb3BlcnR5VmFsdWUoImRpcmVjdGlvbiIpfHwiIjticmVhayBhfWM9IiJ9YS56YT0icnRsIj09KGN8fChiLmN1cnJlbnRTdHlsZT9iLmN1cnJlbnRTdHlsZS5kaXJlY3Rpb246bnVsbCl8fGIuc3R5bGUmJmIuc3R5bGUuZGlyZWN0aW9uKX1yZXR1cm4gYS56YX0sSD1mdW5jdGlvbihhKXtyZXR1cm4gYS5qP2Euai5sZW5ndGg6MH0sST1mdW5jdGlvbihhLGIpe3JldHVybiBhLmo/YS5qW2JdfHxudWxsOm51bGx9LFRiPWZ1bmN0aW9uKGEsYixjKXthLmomJmEuai5mb3JFYWNoKGIsYyl9LFZiPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuaiYmYj9hLmouaW5kZXhPZihiKToKLTF9O3ZhciBXYj17bWI6ImFjdGl2ZWRlc2NlbmRhbnQiLHJiOiJhdG9taWMiLHNiOiJhdXRvY29tcGxldGUiLHViOiJidXN5Iix4YjoiY2hlY2tlZCIseWI6ImNvbGluZGV4IixEYjoiY29udHJvbHMiLEViOiJjdXJyZW50IixHYjoiZGVzY3JpYmVkYnkiLEpiOiJkaXNhYmxlZCIsTGI6ImRyb3BlZmZlY3QiLE1iOiJleHBhbmRlZCIsTmI6ImZsb3d0byIsUGI6ImdyYWJiZWQiLFRiOiJoYXNwb3B1cCIsVmI6ImhpZGRlbiIsWGI6ImludmFsaWQiLFliOiJsYWJlbCIsWmI6ImxhYmVsbGVkYnkiLGFjOiJsZXZlbCIsZmM6ImxpdmUiLHZjOiJtdWx0aWxpbmUiLHdjOiJtdWx0aXNlbGVjdGFibGUiLEFjOiJvcmllbnRhdGlvbiIsQmM6Im93bnMiLENjOiJwb3NpbnNldCIsRWM6InByZXNzZWQiLEljOiJyZWFkb25seSIsS2M6InJlbGV2YW50IixMYzoicmVxdWlyZWQiLFBjOiJyb3dpbmRleCIsU2M6InNlbGVjdGVkIixVYzoic2V0c2l6ZSIsV2M6InNvcnQiLG1kOiJ2YWx1ZW1heCIsbmQ6InZhbHVlbWluIiwKb2Q6InZhbHVlbm93IixwZDoidmFsdWV0ZXh0In07dmFyIFhiO3ZhciBZYj17bmI6ImFsZXJ0IixvYjoiYWxlcnRkaWFsb2ciLHBiOiJhcHBsaWNhdGlvbiIscWI6ImFydGljbGUiLHRiOiJiYW5uZXIiLHZiOiJidXR0b24iLHdiOiJjaGVja2JveCIsemI6ImNvbHVtbmhlYWRlciIsQWI6ImNvbWJvYm94IixCYjoiY29tcGxlbWVudGFyeSIsQ2I6ImNvbnRlbnRpbmZvIixGYjoiZGVmaW5pdGlvbiIsSGI6ImRpYWxvZyIsSWI6ImRpcmVjdG9yeSIsS2I6ImRvY3VtZW50IixPYjoiZm9ybSIsUWI6ImdyaWQiLFJiOiJncmlkY2VsbCIsU2I6Imdyb3VwIixVYjoiaGVhZGluZyIsV2I6ImltZyIsYmM6ImxpbmsiLGNjOiJsaXN0IixkYzoibGlzdGJveCIsZWM6Imxpc3RpdGVtIixoYzoibG9nIixpYzoibWFpbiIsamM6Im1hcnF1ZWUiLGtjOiJtYXRoIixsYzoibWVudSIsbWM6Im1lbnViYXIiLG5jOiJtZW51aXRlbSIsb2M6Im1lbnVpdGVtY2hlY2tib3giLHBjOiJtZW51aXRlbXJhZGlvIix4YzoibmF2aWdhdGlvbiIseWM6Im5vdGUiLHpjOiJvcHRpb24iLApEYzoicHJlc2VudGF0aW9uIixGYzoicHJvZ3Jlc3NiYXIiLEdjOiJyYWRpbyIsSGM6InJhZGlvZ3JvdXAiLEpjOiJyZWdpb24iLE1jOiJyb3ciLE5jOiJyb3dncm91cCIsT2M6InJvd2hlYWRlciIsUWM6InNjcm9sbGJhciIsUmM6InNlYXJjaCIsVGM6InNlcGFyYXRvciIsVmM6InNsaWRlciIsWGM6InNwaW5idXR0b24iLFljOiJzdGF0dXMiLFpjOiJzd2l0Y2giLGFkOiJ0YWIiLGJkOiJ0YWJsaXN0IixjZDoidGFicGFuZWwiLGRkOiJ0ZXh0Ym94IixlZDoidGV4dGluZm8iLGZkOiJ0aW1lciIsZ2Q6InRvb2xiYXIiLGhkOiJ0b29sdGlwIixqZDoidHJlZSIsa2Q6InRyZWVncmlkIixsZDoidHJlZWl0ZW0ifTt2YXIgWmI9ZnVuY3Rpb24oYSxiKXtiPyhwKENhKFliLGIpLCJObyBzdWNoIEFSSUEgcm9sZSAiK2IpLGEuc2V0QXR0cmlidXRlKCJyb2xlIixiKSk6YS5yZW1vdmVBdHRyaWJ1dGUoInJvbGUiKX0sYWM9ZnVuY3Rpb24oYSxiLGMpe0FycmF5LmlzQXJyYXkoYykmJihjPWMuam9pbigiICIpKTt2YXIgZD0kYihiKTtjPT09IiJ8fGM9PXZvaWQgMD8oWGJ8fChjPXt9LFhiPShjLmF0b21pYz0hMSxjLmF1dG9jb21wbGV0ZT0ibm9uZSIsYy5kcm9wZWZmZWN0PSJub25lIixjLmhhc3BvcHVwPSExLGMubGl2ZT0ib2ZmIixjLm11bHRpbGluZT0hMSxjLm11bHRpc2VsZWN0YWJsZT0hMSxjLm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIsYy5yZWFkb25seT0hMSxjLnJlbGV2YW50PSJhZGRpdGlvbnMgdGV4dCIsYy5yZXF1aXJlZD0hMSxjLnNvcnQ9Im5vbmUiLGMuYnVzeT0hMSxjLmRpc2FibGVkPSExLGMuaGlkZGVuPSExLGMuaW52YWxpZD0iZmFsc2UiLGMpKSxjPVhiLGIgaW4gYz9hLnNldEF0dHJpYnV0ZShkLApjW2JdKTphLnJlbW92ZUF0dHJpYnV0ZShkKSk6YS5zZXRBdHRyaWJ1dGUoZCxjKX0sJGI9ZnVuY3Rpb24oYSl7cChhLCJBUklBIGF0dHJpYnV0ZSBjYW5ub3QgYmUgZW1wdHkuIik7cChDYShXYixhKSwiTm8gc3VjaCBBUklBIGF0dHJpYnV0ZSAiK2EpO3JldHVybiJhcmlhLSIrYX07dmFyIGRjPWZ1bmN0aW9uKGEsYixjLGQsZSxmKXtpZih2JiZlKXJldHVybiBiYyhhKTtpZihlJiYhZClyZXR1cm4hMTtpZighdCl7dHlwZW9mIGI9PT0ibnVtYmVyIiYmKGI9Y2MoYikpO3ZhciBoPWI9PTE3fHxiPT0xOHx8diYmYj09OTE7aWYoKCFjfHx2KSYmaHx8diYmYj09MTYmJihkfHxmKSlyZXR1cm4hMX1pZih1JiZkJiZjKXN3aXRjaChhKXtjYXNlIDIyMDpjYXNlIDIxOTpjYXNlIDIyMTpjYXNlIDE5MjpjYXNlIDE4NjpjYXNlIDE4OTpjYXNlIDE4NzpjYXNlIDE4ODpjYXNlIDE5MDpjYXNlIDE5MTpjYXNlIDE5MjpjYXNlIDIyMjpyZXR1cm4hMX1zd2l0Y2goYSl7Y2FzZSAxMzpyZXR1cm4gdD9mfHxlPyExOiEoYyYmZCk6ITA7Y2FzZSAyNzpyZXR1cm4hdSYmIXR9cmV0dXJuIHQmJihkfHxlfHxmKT8hMTpiYyhhKX0sYmM9ZnVuY3Rpb24oYSl7aWYoYT49NDgmJmE8PTU3fHxhPj05NiYmYTw9MTA2fHxhPj02NSYmYTw9OTB8fHUmJmE9PTApcmV0dXJuITA7c3dpdGNoKGEpe2Nhc2UgMzI6Y2FzZSA0MzpjYXNlIDYzOmNhc2UgNjQ6Y2FzZSAxMDc6Y2FzZSAxMDk6Y2FzZSAxMTA6Y2FzZSAxMTE6Y2FzZSAxODY6Y2FzZSA1OTpjYXNlIDE4OTpjYXNlIDE4NzpjYXNlIDYxOmNhc2UgMTg4OmNhc2UgMTkwOmNhc2UgMTkxOmNhc2UgMTkyOmNhc2UgMjIyOmNhc2UgMjE5OmNhc2UgMjIwOmNhc2UgMjIxOmNhc2UgMTYzOmNhc2UgNTg6cmV0dXJuITA7CmNhc2UgMTczOmNhc2UgMTcxOnJldHVybiB0O2RlZmF1bHQ6cmV0dXJuITF9fSxjYz1mdW5jdGlvbihhKXtpZih0KWE9ZWMoYSk7ZWxzZSBpZih2JiZ1KXN3aXRjaChhKXtjYXNlIDkzOmE9OTF9cmV0dXJuIGF9LGVjPWZ1bmN0aW9uKGEpe3N3aXRjaChhKXtjYXNlIDYxOnJldHVybiAxODc7Y2FzZSA1OTpyZXR1cm4gMTg2O2Nhc2UgMTczOnJldHVybiAxODk7Y2FzZSAyMjQ6cmV0dXJuIDkxO2Nhc2UgMDpyZXR1cm4gMjI0O2RlZmF1bHQ6cmV0dXJuIGF9fTt2YXIgZmM9ZnVuY3Rpb24oYSxiLGMsZCl7ei5jYWxsKHRoaXMsZCk7dGhpcy50eXBlPSJrZXkiO3RoaXMuZz1hO3RoaXMucmVwZWF0PWN9O24oZmMseik7dmFyIEo9ZnVuY3Rpb24oYSxiKXtELmNhbGwodGhpcyk7YSYmZ2ModGhpcyxhLGIpfTtuKEosRCk7Zz1KLnByb3RvdHlwZTtnLlI9bnVsbDtnLnFhPW51bGw7Zy5KYT1udWxsO2cucmE9bnVsbDtnLkY9LTE7Zy5LPS0xO2cuRGE9ITE7CnZhciBoYz17MzoxMywxMjoxNDQsNjMyMzI6MzgsNjMyMzM6NDAsNjMyMzQ6MzcsNjMyMzU6MzksNjMyMzY6MTEyLDYzMjM3OjExMyw2MzIzODoxMTQsNjMyMzk6MTE1LDYzMjQwOjExNiw2MzI0MToxMTcsNjMyNDI6MTE4LDYzMjQzOjExOSw2MzI0NDoxMjAsNjMyNDU6MTIxLDYzMjQ2OjEyMiw2MzI0NzoxMjMsNjMyNDg6NDQsNjMyNzI6NDYsNjMyNzM6MzYsNjMyNzU6MzUsNjMyNzY6MzMsNjMyNzc6MzQsNjMyODk6MTQ0LDYzMzAyOjQ1fSxpYz17VXA6MzgsRG93bjo0MCxMZWZ0OjM3LFJpZ2h0OjM5LEVudGVyOjEzLEYxOjExMixGMjoxMTMsRjM6MTE0LEY0OjExNSxGNToxMTYsRjY6MTE3LEY3OjExOCxGODoxMTksRjk6MTIwLEYxMDoxMjEsRjExOjEyMixGMTI6MTIzLCJVKzAwN0YiOjQ2LEhvbWU6MzYsRW5kOjM1LFBhZ2VVcDozMyxQYWdlRG93bjozNCxJbnNlcnQ6NDV9LGpjPXYmJnQ7CkoucHJvdG90eXBlLmc9ZnVuY3Rpb24oYSl7dSYmKHRoaXMuRj09MTcmJiFhLmN0cmxLZXl8fHRoaXMuRj09MTgmJiFhLmFsdEtleXx8diYmdGhpcy5GPT05MSYmIWEubWV0YUtleSkmJih0aGlzLks9dGhpcy5GPS0xKTt0aGlzLkY9PS0xJiYoYS5jdHJsS2V5JiZhLmchPTE3P3RoaXMuRj0xNzphLmFsdEtleSYmYS5nIT0xOD90aGlzLkY9MTg6YS5tZXRhS2V5JiZhLmchPTkxJiYodGhpcy5GPTkxKSk7ZGMoYS5nLHRoaXMuRixhLnNoaWZ0S2V5LGEuY3RybEtleSxhLmFsdEtleSxhLm1ldGFLZXkpPyh0aGlzLks9Y2MoYS5nKSxqYyYmKHRoaXMuRGE9YS5hbHRLZXkpKTp0aGlzLmhhbmRsZUV2ZW50KGEpfTtKLnByb3RvdHlwZS5oPWZ1bmN0aW9uKGEpe3RoaXMuSz10aGlzLkY9LTE7dGhpcy5EYT1hLmFsdEtleX07CkoucHJvdG90eXBlLmhhbmRsZUV2ZW50PWZ1bmN0aW9uKGEpe3ZhciBiPWEuaCxjPWIuYWx0S2V5O2lmKHUmJmEudHlwZT09ImtleXByZXNzIil7dmFyIGQ9dGhpcy5LO3ZhciBlPWIuY2hhckNvZGU+PTAmJmIuY2hhckNvZGU8NjMyMzImJmJjKGQpP2IuY2hhckNvZGU6MH1lbHNlIGEudHlwZT09ImtleXByZXNzIj8oamMmJihjPXRoaXMuRGEpLGIua2V5Q29kZT09Yi5jaGFyQ29kZT9iLmtleUNvZGU8MzI/KGQ9Yi5rZXlDb2RlLGU9MCk6KGQ9dGhpcy5LLGU9Yi5jaGFyQ29kZSk6KGQ9Yi5rZXlDb2RlfHx0aGlzLkssZT1iLmNoYXJDb2RlfHwwKSk6KGQ9Yi5rZXlDb2RlfHx0aGlzLkssZT1iLmNoYXJDb2RlfHwwKSx2JiZlPT02MyYmZD09MjI0JiYoZD0xOTEpO3ZhciBmPWQ9Y2MoZCk7ZD9kPj02MzIzMiYmZCBpbiBoYz9mPWhjW2RdOmQ9PTI1JiZhLnNoaWZ0S2V5JiYoZj05KTpiLmtleUlkZW50aWZpZXImJmIua2V5SWRlbnRpZmllciBpbiBpYyYmKGY9aWNbYi5rZXlJZGVudGlmaWVyXSk7CmlmKCF0fHxhLnR5cGUhPSJrZXlwcmVzcyJ8fGRjKGYsdGhpcy5GLGEuc2hpZnRLZXksYS5jdHJsS2V5LGMsYS5tZXRhS2V5KSlhPWY9PXRoaXMuRix0aGlzLkY9ZixiPW5ldyBmYyhmLGUsYSxiKSxiLmFsdEtleT1jLEUodGhpcyxiKX07Si5wcm90b3R5cGUuaT1mdW5jdGlvbigpe3JldHVybiB0aGlzLlJ9O3ZhciBnYz1mdW5jdGlvbihhLGIsYyl7YS5yYSYma2MoYSk7YS5SPWI7YS5xYT11YihhLlIsImtleXByZXNzIixhLGMpO2EuSmE9dWIoYS5SLCJrZXlkb3duIixhLmcsYyxhKTthLnJhPXViKGEuUiwia2V5dXAiLGEuaCxjLGEpfSxrYz1mdW5jdGlvbihhKXthLnFhJiYoQShhLnFhKSxBKGEuSmEpLEEoYS5yYSksYS5xYT1udWxsLGEuSmE9bnVsbCxhLnJhPW51bGwpO2EuUj1udWxsO2EuRj0tMTthLks9LTF9O0oucHJvdG90eXBlLkM9ZnVuY3Rpb24oKXtKLmwuQy5jYWxsKHRoaXMpO2tjKHRoaXMpfTt2YXIgSz17Z2E6Im1vdXNlZG93biIsaGE6Im1vdXNldXAiLGZhOiJtb3VzZWNhbmNlbCIsc2M6Im1vdXNlbW92ZSIsdWM6Im1vdXNlb3ZlciIsdGM6Im1vdXNlb3V0IixxYzoibW91c2VlbnRlciIscmM6Im1vdXNlbGVhdmUifTt2YXIgbGM9ZnVuY3Rpb24oYSl7cmV0dXJuIHR5cGVvZiBhLmNsYXNzTmFtZT09InN0cmluZyI/YS5jbGFzc05hbWU6YS5nZXRBdHRyaWJ1dGUmJmEuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIn0sTD1mdW5jdGlvbihhKXtyZXR1cm4gYS5jbGFzc0xpc3Q/YS5jbGFzc0xpc3Q6bGMoYSkubWF0Y2goL1xTKy9nKXx8W119LG1jPWZ1bmN0aW9uKGEsYil7dHlwZW9mIGEuY2xhc3NOYW1lPT0ic3RyaW5nIj9hLmNsYXNzTmFtZT1iOmEuc2V0QXR0cmlidXRlJiZhLnNldEF0dHJpYnV0ZSgiY2xhc3MiLGIpfSxuYz1mdW5jdGlvbihhLGIpe2EuY2xhc3NMaXN0P2I9YS5jbGFzc0xpc3QuY29udGFpbnMoYik6KGE9TChhKSxiPXZhKGEsYik+PTApO3JldHVybiBifSxvYz1mdW5jdGlvbihhLGIpe2lmKGEuY2xhc3NMaXN0KWEuY2xhc3NMaXN0LmFkZChiKTtlbHNlIGlmKCFuYyhhLGIpKXt2YXIgYz1sYyhhKTttYyhhLGMrKGMubGVuZ3RoPjA/IiAiK2I6YikpfX0scGM9ZnVuY3Rpb24oYSxiKXtpZihhLmNsYXNzTGlzdClBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGIsCmZ1bmN0aW9uKGUpe29jKGEsZSl9KTtlbHNle3ZhciBjPXt9O0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoTChhKSxmdW5jdGlvbihlKXtjW2VdPSEwfSk7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChiLGZ1bmN0aW9uKGUpe2NbZV09ITB9KTtiPSIiO2Zvcih2YXIgZCBpbiBjKWIrPWIubGVuZ3RoPjA/IiAiK2Q6ZDttYyhhLGIpfX0scWM9ZnVuY3Rpb24oYSxiKXthLmNsYXNzTGlzdD9hLmNsYXNzTGlzdC5yZW1vdmUoYik6bmMoYSxiKSYmbWMoYSxBcnJheS5wcm90b3R5cGUuZmlsdGVyLmNhbGwoTChhKSxmdW5jdGlvbihjKXtyZXR1cm4gYyE9Yn0pLmpvaW4oIiAiKSl9LHJjPWZ1bmN0aW9uKGEsYil7YS5jbGFzc0xpc3Q/QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChiLGZ1bmN0aW9uKGMpe3FjKGEsYyl9KTptYyhhLEFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbChMKGEpLGZ1bmN0aW9uKGMpe3JldHVybiEodmEoYixjKT49MCl9KS5qb2luKCIgIikpfTt2YXIgdGM9ZnVuY3Rpb24oYSxiKXtpZighYSl0aHJvdyBFcnJvcigiSW52YWxpZCBjbGFzcyBuYW1lICIrYSk7aWYodHlwZW9mIGIhPT0iZnVuY3Rpb24iKXRocm93IEVycm9yKCJJbnZhbGlkIGRlY29yYXRvciBmdW5jdGlvbiAiK2IpO3NjW2FdPWJ9LHVjPXt9LHNjPXt9O3ZhciB2Yz1mdW5jdGlvbihhKXt0aGlzLkE9YX07aWEodmMpO3ZhciB3Yz1mdW5jdGlvbihhLGIpe2EmJihhLnRhYkluZGV4PWI/MDotMSl9LHljPWZ1bmN0aW9uKGEsYixjKXtjLmlkJiZQYihiLGMuaWQpO3ZhciBkPWEuZygpLGU9ITEsZj1MKGMpO2YmJkFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoZixmdW5jdGlvbihoKXtoPT1kP2U9ITA6aCYmdGhpcy51KGIsaCxkKX0sYSk7ZXx8b2MoYyxkKTt4YyhiLGMpO3JldHVybiBjfTt2Yy5wcm90b3R5cGUudT1mdW5jdGlvbihhLGIsYyl7Yj09YysiLWRpc2FibGVkIj9hLlgoITEpOmI9PWMrIi1ob3Jpem9udGFsIj96YyhhLCJob3Jpem9udGFsIik6Yj09YysiLXZlcnRpY2FsIiYmemMoYSwidmVydGljYWwiKX07CnZhciB4Yz1mdW5jdGlvbihhLGIpe2lmKGIpZm9yKHZhciBjPWIuZmlyc3RDaGlsZCxkO2MmJmMucGFyZW50Tm9kZT09Yjspe2Q9Yy5uZXh0U2libGluZztpZihjLm5vZGVUeXBlPT0xKXthOnt2YXIgZT1jO3AoZSk7ZT1MKGUpO2Zvcih2YXIgZj1lLmxlbmd0aCxoPTA7aDxmO2grKyl7dmFyIGs9ZVtoXTtpZihrPWsgaW4gc2M/c2Nba10oKTpudWxsKXtlPWs7YnJlYWsgYX19ZT1udWxsfWUmJihlLmc9YyxhLmlzRW5hYmxlZCgpfHxlLlgoITEpLGEuQmEoZSksU2IoZSxjKSl9ZWxzZSBjLm5vZGVWYWx1ZSYmSGEoYy5ub2RlVmFsdWUpIT0iInx8Yi5yZW1vdmVDaGlsZChjKTtjPWR9fSxBYz1mdW5jdGlvbihhLGIpe2I9Yi5pKCk7cChiLCJUaGUgY29udGFpbmVyIERPTSBlbGVtZW50IGNhbm5vdCBiZSBudWxsLiIpO0tiKGIsdCk7KGE9YS5BKSYmWmIoYixhKX07dmMucHJvdG90eXBlLmc9ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy1jb250YWluZXIifTsKdmMucHJvdG90eXBlLmo9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nKCksYz1bYixhLkw9PSJob3Jpem9udGFsIj9iKyItaG9yaXpvbnRhbCI6YisiLXZlcnRpY2FsIl07YS5pc0VuYWJsZWQoKXx8Yy5wdXNoKGIrIi1kaXNhYmxlZCIpO3JldHVybiBjfTt2YXIgQmM9ZnVuY3Rpb24oKXt9O3ZhciBNPWZ1bmN0aW9uKCl7fSxDYztpYShNKTt2YXIgRGM9e2J1dHRvbjoicHJlc3NlZCIsY2hlY2tib3g6ImNoZWNrZWQiLG1lbnVpdGVtOiJzZWxlY3RlZCIsbWVudWl0ZW1jaGVja2JveDoiY2hlY2tlZCIsbWVudWl0ZW1yYWRpbzoiY2hlY2tlZCIscmFkaW86ImNoZWNrZWQiLHRhYjoic2VsZWN0ZWQiLHRyZWVpdGVtOiJzZWxlY3RlZCJ9O00ucHJvdG90eXBlLk5hPWZ1bmN0aW9uKCl7fTtNLnByb3RvdHlwZS54YT1mdW5jdGlvbihhKXt2YXIgYj1hLkcsYz1iLmgsZD10aGlzLk4oKSxlPVtkXSxmPXRoaXMuTigpO2YhPWQmJmUucHVzaChmKTtkPWEubTtmb3IoZj1bXTtkOyl7dmFyIGg9ZCYtZDtmLnB1c2goRWModGhpcyxoKSk7ZCY9fmh9ZS5wdXNoLmFwcGx5KGUsZik7KGQ9YS5GYSkmJmUucHVzaC5hcHBseShlLGQpO3JldHVybiBjLmNhbGwoYiwiRElWIixlLmpvaW4oIiAiKSxhLmlhKX07Ck0ucHJvdG90eXBlLnlhPWZ1bmN0aW9uKGEsYil7Yi5pZCYmUGIoYSxiLmlkKTtiJiZiLmZpcnN0Q2hpbGQ/RmMoYSxiLmZpcnN0Q2hpbGQubmV4dFNpYmxpbmc/eWEoYi5jaGlsZE5vZGVzKTpiLmZpcnN0Q2hpbGQpOmEuaWE9bnVsbDt2YXIgYz0wLGQ9dGhpcy5OKCksZT10aGlzLk4oKSxmPSExLGg9ITEsaz15YShMKGIpKTtrLmZvckVhY2goZnVuY3Rpb24ocSl7Znx8cSE9ZD9ofHxxIT1lP2N8PUdjKHRoaXMscSk6aD0hMDooZj0hMCxlPT1kJiYoaD0hMCkpO0djKHRoaXMscSk9PTEmJihzYShiKSxkYihiKSYmZWIoYikmJmNiKGIsITEpKX0sdGhpcyk7YS5tPWM7Znx8KGsucHVzaChkKSxlPT1kJiYoaD0hMCkpO2h8fGsucHVzaChlKTsoYT1hLkZhKSYmay5wdXNoLmFwcGx5KGssYSk7ZiYmaCYmIWF8fG1jKGIsay5qb2luKCIgIikpO3JldHVybiBifTsKdmFyIEhjPWZ1bmN0aW9uKGEsYil7aWYoYT1hLk5hKCkpe3AoYiwiVGhlIGVsZW1lbnQgcGFzc2VkIGFzIGEgZmlyc3QgcGFyYW1ldGVyIGNhbm5vdCBiZSBudWxsLiIpO3ZhciBjPWIuZ2V0QXR0cmlidXRlKCJyb2xlIil8fG51bGw7YSE9YyYmWmIoYixhKX19LEljPWZ1bmN0aW9uKGEsYil7dmFyIGM7aWYoYS5EJjMyJiYoYz1hLmkoKSkpe2lmKCFiJiZhLm0mMzIpe3RyeXtjLmJsdXIoKX1jYXRjaChkKXt9YS5tJjMyJiZhLlFhKG51bGwpfShkYihjKSYmZWIoYykpIT1iJiZjYihjLGIpfX0sSmM9ZnVuY3Rpb24oYSxiLGMpe0NjfHwoQ2M9ezE6ImRpc2FibGVkIiw4OiJzZWxlY3RlZCIsMTY6ImNoZWNrZWQiLDY0OiJleHBhbmRlZCJ9KTtwKGEsIlRoZSBlbGVtZW50IHBhc3NlZCBhcyBhIGZpcnN0IHBhcmFtZXRlciBjYW5ub3QgYmUgbnVsbC4iKTtiPUNjW2JdO3ZhciBkPWEuZ2V0QXR0cmlidXRlKCJyb2xlIil8fG51bGw7ZCYmKGQ9RGNbZF18fGIsYj1iPT0iY2hlY2tlZCJ8fGI9PQoic2VsZWN0ZWQiP2Q6Yik7YiYmYWMoYSxiLGMpfTtNLnByb3RvdHlwZS5OPWZ1bmN0aW9uKCl7cmV0dXJuImdvb2ctY29udHJvbCJ9O3ZhciBFYz1mdW5jdGlvbihhLGIpe2EuZ3x8S2MoYSk7cmV0dXJuIGEuZ1tiXX0sR2M9ZnVuY3Rpb24oYSxiKXthLmh8fChhLmd8fEtjKGEpLGEuaD1FYShhLmcpKTthPXBhcnNlSW50KGEuaFtiXSwxMCk7cmV0dXJuIGlzTmFOKGEpPzA6YX0sS2M9ZnVuY3Rpb24oYSl7dmFyIGI9YS5OKCk7dmFyIGM9Yi5yZXBsYWNlKC9ceGEwfFxzL2csIiAiKS5pbmRleE9mKCIgIikhPS0xO3AoIWMsIkNvbnRyb2xSZW5kZXJlciBoYXMgYW4gaW52YWxpZCBjc3MgY2xhc3M6ICciK2IrIiciKTthLmc9ezE6YisiLWRpc2FibGVkIiwyOmIrIi1ob3ZlciIsNDpiKyItYWN0aXZlIiw4OmIrIi1zZWxlY3RlZCIsMTY6YisiLWNoZWNrZWQiLDMyOmIrIi1mb2N1c2VkIiw2NDpiKyItb3BlbiJ9fTt2YXIgTj1mdW5jdGlvbihhLGIsYyl7Ri5jYWxsKHRoaXMsYyk7aWYoIWIpe2ZvcihiPXRoaXMuY29uc3RydWN0b3I7Yjspe3ZhciBkPW5hKGIpO2lmKGQ9dWNbZF0pYnJlYWs7Yj0oYj1PYmplY3QuZ2V0UHJvdG90eXBlT2YoYi5wcm90b3R5cGUpKSYmYi5jb25zdHJ1Y3Rvcn1iPWQ/dHlwZW9mIGQuVj09PSJmdW5jdGlvbiI/ZC5WKCk6bmV3IGQ6bnVsbH10aGlzLnY9Yjt0aGlzLmlhPWEhPT12b2lkIDA/YTpudWxsfTtuKE4sRik7Zz1OLnByb3RvdHlwZTtnLmlhPW51bGw7Zy5tPTA7Zy5EPTM5O2cuUD0wO2cuT2E9ITA7Zy5GYT1udWxsO2cuSGE9ITA7Zy5tYT1mdW5jdGlvbigpe3ZhciBhPXRoaXMudi54YSh0aGlzKTt0aGlzLmc9YTtIYyh0aGlzLnYsYSk7S2IoYSwhMCk7dGhpcy5pc1Zpc2libGUoKXx8KGEuc3R5bGUuZGlzcGxheT0ibm9uZSIsYSYmYWMoYSwiaGlkZGVuIiwhMCkpfTtnLm5hPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaSgpfTtnLndhPWZ1bmN0aW9uKCl7cmV0dXJuITB9OwpnLkVhPWZ1bmN0aW9uKGEpe3RoaXMuZz1hPXRoaXMudi55YSh0aGlzLGEpO0hjKHRoaXMudixhKTtLYihhLCEwKTt0aGlzLk9hPWEuc3R5bGUuZGlzcGxheSE9Im5vbmUifTsKZy5JPWZ1bmN0aW9uKCl7Ti5sLkkuY2FsbCh0aGlzKTt2YXIgYT10aGlzLmc7cChhLCJDYW4gbm90IGNhbGwgZ2V0RWxlbWVudFN0cmljdCBiZWZvcmUgcmVuZGVyaW5nL2RlY29yYXRpbmcuIik7cCh0aGlzKTtwKGEpO3RoaXMuaXNWaXNpYmxlKCl8fGFjKGEsImhpZGRlbiIsIXRoaXMuaXNWaXNpYmxlKCkpO3RoaXMuaXNFbmFibGVkKCl8fEpjKGEsMSwhdGhpcy5pc0VuYWJsZWQoKSk7dGhpcy5EJjgmJkpjKGEsOCwhISh0aGlzLm0mOCkpO3RoaXMuRCYxNiYmSmMoYSwxNiwhISh0aGlzLm0mMTYpKTt0aGlzLkQmNjQmJkpjKGEsNjQsISEodGhpcy5tJjY0KSk7dmFyIGI9dGhpcy52O1ViKHRoaXMpJiYoYT10aGlzLmkoKSxiPWIuTigpKyItcnRsIiwoYT1hLmk/YS5pKCk6YSkmJnBjKGEsW2JdKSk7dGhpcy5pc0VuYWJsZWQoKSYmSWModGhpcyx0aGlzLmlzVmlzaWJsZSgpKTt0aGlzLkQmLTImJih0aGlzLkhhJiZMYyh0aGlzLCEwKSx0aGlzLkQmMzImJihhPXRoaXMuaSgpKSkmJihiPQp0aGlzLlp8fCh0aGlzLlo9bmV3IEopLGdjKGIsYSksQihCKEIoUWIodGhpcyksYiwia2V5Iix0aGlzLmFhKSxhLCJmb2N1cyIsdGhpcy5YYSksYSwiYmx1ciIsdGhpcy5RYSkpfTt2YXIgTGM9ZnVuY3Rpb24oYSxiKXt2YXIgYz1RYihhKSxkPWEuaSgpO2I/KEIoQihCKEIoYyxkLEsuZ2EsYS5zYSksZCxbSy5oYSxLLmZhXSxhLnZhKSxkLCJtb3VzZW92ZXIiLGEudWEpLGQsIm1vdXNlb3V0IixhLnRhKSxhLmNhIT1CYyYmQihjLGQsImNvbnRleHRtZW51IixhLmNhKSk6KEMoQyhDKEMoYyxkLEsuZ2EsYS5zYSksZCxbSy5oYSxLLmZhXSxhLnZhKSxkLCJtb3VzZW92ZXIiLGEudWEpLGQsIm1vdXNlb3V0IixhLnRhKSxhLmNhIT1CYyYmQyhjLGQsImNvbnRleHRtZW51IixhLmNhKSl9O04ucHJvdG90eXBlLlU9ZnVuY3Rpb24oKXtOLmwuVS5jYWxsKHRoaXMpO3RoaXMuWiYma2ModGhpcy5aKTt0aGlzLmlzVmlzaWJsZSgpJiZ0aGlzLmlzRW5hYmxlZCgpJiZJYyh0aGlzLCExKX07Ck4ucHJvdG90eXBlLkM9ZnVuY3Rpb24oKXtOLmwuQy5jYWxsKHRoaXMpO3RoaXMuWiYmKHRoaXMuWi5kaXNwb3NlKCksZGVsZXRlIHRoaXMuWik7ZGVsZXRlIHRoaXMudjt0aGlzLkZhPXRoaXMuaWE9bnVsbH07dmFyIEZjPWZ1bmN0aW9uKGEsYil7YS5pYT1ifTtOLnByb3RvdHlwZS5pc1Zpc2libGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5PYX07Ti5wcm90b3R5cGUuaXNFbmFibGVkPWZ1bmN0aW9uKCl7cmV0dXJuISh0aGlzLm0mMSl9O04ucHJvdG90eXBlLlg9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5oO2ImJnR5cGVvZiBiLmlzRW5hYmxlZD09ImZ1bmN0aW9uIiYmIWIuaXNFbmFibGVkKCl8fCFPKHRoaXMsMSwhYSl8fChhfHwoTWModGhpcywhMSksUCh0aGlzLCExKSksdGhpcy5pc1Zpc2libGUoKSYmSWModGhpcyxhKSxUKHRoaXMsMSwhYSwhMCkpfTt2YXIgUD1mdW5jdGlvbihhLGIpe08oYSwyLGIpJiZUKGEsMixiKX07Ck4ucHJvdG90eXBlLmlzQWN0aXZlPWZ1bmN0aW9uKCl7cmV0dXJuISEodGhpcy5tJjQpfTsKdmFyIE1jPWZ1bmN0aW9uKGEsYil7TyhhLDQsYikmJlQoYSw0LGIpfSxOYz1mdW5jdGlvbihhLGIpe08oYSw4LGIpJiZUKGEsOCxiKX0sT2M9ZnVuY3Rpb24oYSxiKXtPKGEsNjQsYikmJlQoYSw2NCxiKX0sVD1mdW5jdGlvbihhLGIsYyxkKXtpZighZCYmYj09MSlhLlgoIWMpO2Vsc2UgaWYoYS5EJmImJmMhPSEhKGEubSZiKSl7dmFyIGU9YS52O2lmKGQ9YS5pKCkpe2lmKGU9RWMoZSxiKSl7dmFyIGY9YS5pP2EuaSgpOmE7ZiYmKGM/cGM6cmMpKGYsW2VdKX1KYyhkLGIsYyl9YS5tPWM/YS5tfGI6YS5tJn5ifX0sUGM9ZnVuY3Rpb24oYSxiLGMpe2lmKGEucyYmYS5tJmImJiFjKXRocm93IEVycm9yKCJDb21wb25lbnQgYWxyZWFkeSByZW5kZXJlZCIpOyFjJiZhLm0mYiYmVChhLGIsITEpO2EuRD1jP2EuRHxiOmEuRCZ+Yn0sVT1mdW5jdGlvbihhLGIpe3JldHVybiEhKDI1NSZiKSYmISEoYS5EJmIpfSxPPWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4hIShhLkQmYikmJiEhKGEubSZiKSE9CmMmJighKGEuUCZiKXx8RShhLE5iKGIsYykpKSYmIWEuYmF9O04ucHJvdG90eXBlLnVhPWZ1bmN0aW9uKGEpeyFRYyhhLHRoaXMuaSgpKSYmRSh0aGlzLCJlbnRlciIpJiZ0aGlzLmlzRW5hYmxlZCgpJiZVKHRoaXMsMikmJlAodGhpcywhMCl9O04ucHJvdG90eXBlLnRhPWZ1bmN0aW9uKGEpeyFRYyhhLHRoaXMuaSgpKSYmRSh0aGlzLCJsZWF2ZSIpJiYoVSh0aGlzLDQpJiZNYyh0aGlzLCExKSxVKHRoaXMsMikmJlAodGhpcywhMSkpfTtOLnByb3RvdHlwZS5jYT1CYzt2YXIgUWM9ZnVuY3Rpb24oYSxiKXtyZXR1cm4hIWEucmVsYXRlZFRhcmdldCYmYWIoYixhLnJlbGF0ZWRUYXJnZXQpfTsKTi5wcm90b3R5cGUuc2E9ZnVuY3Rpb24oYSl7aWYodGhpcy5pc0VuYWJsZWQoKSYmKFUodGhpcywyKSYmUCh0aGlzLCEwKSwhKGEuaC5idXR0b24hPTB8fHYmJmEuY3RybEtleSkpKXtVKHRoaXMsNCkmJk1jKHRoaXMsITApO3ZhciBiO2lmKGI9dGhpcy52KXt2YXIgYztiPXRoaXMuRCYzMiYmKGM9dGhpcy5pKCkpP2RiKGMpJiZlYihjKTohMX1iJiZ0aGlzLmkoKS5mb2N1cygpfWEuaC5idXR0b24hPTB8fHYmJmEuY3RybEtleXx8YS5qKCl9O04ucHJvdG90eXBlLnZhPWZ1bmN0aW9uKGEpe3RoaXMuaXNFbmFibGVkKCkmJihVKHRoaXMsMikmJlAodGhpcywhMCksdGhpcy5pc0FjdGl2ZSgpJiZSYyh0aGlzLGEpJiZVKHRoaXMsNCkmJk1jKHRoaXMsITEpKX07CnZhciBSYz1mdW5jdGlvbihhLGIpe2lmKFUoYSwxNikpe3ZhciBjPSEoYS5tJjE2KTtPKGEsMTYsYykmJlQoYSwxNixjKX1VKGEsOCkmJk5jKGEsITApO1UoYSw2NCkmJk9jKGEsIShhLm0mNjQpKTtjPW5ldyB5KCJhY3Rpb24iLGEpO2ImJihjLmFsdEtleT1iLmFsdEtleSxjLmN0cmxLZXk9Yi5jdHJsS2V5LGMubWV0YUtleT1iLm1ldGFLZXksYy5zaGlmdEtleT1iLnNoaWZ0S2V5LGMuRz1iLkcsYy50aW1lU3RhbXA9Yi50aW1lU3RhbXApO3JldHVybiBFKGEsYyl9O04ucHJvdG90eXBlLlhhPWZ1bmN0aW9uKCl7VSh0aGlzLDMyKSYmTyh0aGlzLDMyLCEwKSYmVCh0aGlzLDMyLCEwKX07Ti5wcm90b3R5cGUuUWE9ZnVuY3Rpb24oKXtVKHRoaXMsNCkmJk1jKHRoaXMsITEpO1UodGhpcywzMikmJk8odGhpcywzMiwhMSkmJlQodGhpcywzMiwhMSl9OwpOLnByb3RvdHlwZS5hYT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5pc1Zpc2libGUoKSYmdGhpcy5pc0VuYWJsZWQoKSYmYS5nPT0xMyYmUmModGhpcyxhKT8oYS5qKCksYS52KCksITApOiExfTtpZih0eXBlb2YgTiE9PSJmdW5jdGlvbiIpdGhyb3cgRXJyb3IoIkludmFsaWQgY29tcG9uZW50IGNsYXNzICIrTik7aWYodHlwZW9mIE0hPT0iZnVuY3Rpb24iKXRocm93IEVycm9yKCJJbnZhbGlkIHJlbmRlcmVyIGNsYXNzICIrTSk7dmFyIFNjPW5hKE4pO3VjW1NjXT1NO3RjKCJnb29nLWNvbnRyb2wiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBOKG51bGwpfSk7dmFyIFY9ZnVuY3Rpb24oYSxiLGMpe0YuY2FsbCh0aGlzLGMpO3RoaXMuZWE9Ynx8dmMuVigpO3RoaXMuTD1hfHwidmVydGljYWwifTtuKFYsRik7Zz1WLnByb3RvdHlwZTtnLkthPW51bGw7Zy5kYT1udWxsO2cuZWE9bnVsbDtnLkw9bnVsbDtnLlM9ITA7Zy5UPSEwO2cubz0tMTtnLkI9bnVsbDtnLlc9ITE7Zy5PPW51bGw7dmFyIFRjPWZ1bmN0aW9uKGEpe3JldHVybiBhLkthfHxhLmkoKX07Zz1WLnByb3RvdHlwZTtnLm1hPWZ1bmN0aW9uKCl7dGhpcy5nPXRoaXMuRy5oKCJESVYiLHRoaXMuZWEuaih0aGlzKS5qb2luKCIgIikpfTtnLm5hPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaSgpfTtnLndhPWZ1bmN0aW9uKGEpe3JldHVybiBhLnRhZ05hbWU9PSJESVYifTtnLkVhPWZ1bmN0aW9uKGEpe3RoaXMuZz15Yyh0aGlzLmVhLHRoaXMsYSk7YS5zdHlsZS5kaXNwbGF5PT0ibm9uZSImJih0aGlzLlM9ITEpfTsKZy5JPWZ1bmN0aW9uKCl7Vi5sLkkuY2FsbCh0aGlzKTtUYih0aGlzLGZ1bmN0aW9uKGIpe2IucyYmVWModGhpcyxiKX0sdGhpcyk7dmFyIGE9dGhpcy5pKCk7QWModGhpcy5lYSx0aGlzKTtWYyh0aGlzLHRoaXMuUyk7QihCKEIoQihCKEIoQihCKFFiKHRoaXMpLHRoaXMsImVudGVyIix0aGlzLmViKSx0aGlzLCJoaWdobGlnaHQiLHRoaXMuZmIpLHRoaXMsInVuaGlnaGxpZ2h0Iix0aGlzLmxiKSx0aGlzLCJvcGVuIix0aGlzLmdiKSx0aGlzLCJjbG9zZSIsdGhpcy5iYiksYSxLLmdhLHRoaXMuV2EpLGJiKGEpLFtLLmhhLEsuZmFdLHRoaXMuY2IpLGEsW0suZ2EsSy5oYSxLLmZhLCJtb3VzZW92ZXIiLCJtb3VzZW91dCIsImNvbnRleHRtZW51Il0sdGhpcy5hYik7V2ModGhpcyl9O3ZhciBXYz1mdW5jdGlvbihhKXt2YXIgYj1RYihhKSxjPVRjKGEpO0IoQihCKGIsYywiZm9jdXMiLGEuUGEpLGMsImJsdXIiLGEuVWEpLGEuZGF8fChhLmRhPW5ldyBKKFRjKGEpKSksImtleSIsYS5WYSl9OwpnPVYucHJvdG90eXBlO2cuVT1mdW5jdGlvbigpe1hjKHRoaXMsLTEpO3RoaXMuQiYmT2ModGhpcy5CLCExKTt0aGlzLlc9ITE7Vi5sLlUuY2FsbCh0aGlzKX07Zy5DPWZ1bmN0aW9uKCl7Vi5sLkMuY2FsbCh0aGlzKTt0aGlzLmRhJiYodGhpcy5kYS5kaXNwb3NlKCksdGhpcy5kYT1udWxsKTt0aGlzLmVhPXRoaXMuQj10aGlzLk89dGhpcy5LYT1udWxsfTtnLmViPWZ1bmN0aW9uKCl7cmV0dXJuITB9OwpnLmZiPWZ1bmN0aW9uKGEpe3ZhciBiPVZiKHRoaXMsYS50YXJnZXQpO2lmKGI+LTEmJmIhPXRoaXMubyl7dmFyIGM9SSh0aGlzLHRoaXMubyk7YyYmUChjLCExKTt0aGlzLm89YjtjPUkodGhpcyx0aGlzLm8pO3RoaXMuVyYmTWMoYywhMCk7dGhpcy5CJiZjIT10aGlzLkImJihjLkQmNjQ/T2MoYywhMCk6T2ModGhpcy5CLCExKSl9Yj10aGlzLmkoKTtwKGIsIlRoZSBET00gZWxlbWVudCBmb3IgdGhlIGNvbnRhaW5lciBjYW5ub3QgYmUgbnVsbC4iKTthLnRhcmdldC5pKCkhPW51bGwmJmFjKGIsImFjdGl2ZWRlc2NlbmRhbnQiLGEudGFyZ2V0LmkoKS5pZCl9O2cubGI9ZnVuY3Rpb24oYSl7YS50YXJnZXQ9PUkodGhpcyx0aGlzLm8pJiYodGhpcy5vPS0xKTthPXRoaXMuaSgpO3AoYSwiVGhlIERPTSBlbGVtZW50IGZvciB0aGUgY29udGFpbmVyIGNhbm5vdCBiZSBudWxsLiIpO2EucmVtb3ZlQXR0cmlidXRlKCRiKCJhY3RpdmVkZXNjZW5kYW50IikpfTsKZy5nYj1mdW5jdGlvbihhKXsoYT1hLnRhcmdldCkmJmEhPXRoaXMuQiYmYS5oPT10aGlzJiYodGhpcy5CJiZPYyh0aGlzLkIsITEpLHRoaXMuQj1hKX07Zy5iYj1mdW5jdGlvbihhKXthLnRhcmdldD09dGhpcy5CJiYodGhpcy5CPW51bGwpO3ZhciBiPXRoaXMuaSgpLGM9YS50YXJnZXQuaSgpO2ImJmEudGFyZ2V0Lm0mMiYmYyYmKGE9IiIsYyYmKGE9Yy5pZCxwKGEsIlRoZSBhY3RpdmUgZWxlbWVudCBzaG91bGQgaGF2ZSBhbiBpZC4iKSksYWMoYiwiYWN0aXZlZGVzY2VuZGFudCIsYSkpfTtnLldhPWZ1bmN0aW9uKGEpe3RoaXMuVCYmKHRoaXMuVz0hMCk7dmFyIGI9VGModGhpcyk7YiYmZGIoYikmJmViKGIpP2IuZm9jdXMoKTphLmooKX07Zy5jYj1mdW5jdGlvbigpe3RoaXMuVz0hMX07CmcuYWI9ZnVuY3Rpb24oYSl7YTp7dmFyIGI9YS50YXJnZXQ7aWYodGhpcy5PKWZvcih2YXIgYz10aGlzLmkoKTtiJiZiIT09Yzspe3ZhciBkPWIuaWQ7aWYoZCBpbiB0aGlzLk8pe2I9dGhpcy5PW2RdO2JyZWFrIGF9Yj1iLnBhcmVudE5vZGV9Yj1udWxsfWlmKGIpc3dpdGNoKGEudHlwZSl7Y2FzZSBLLmdhOmIuc2EoYSk7YnJlYWs7Y2FzZSBLLmhhOmNhc2UgSy5mYTpiLnZhKGEpO2JyZWFrO2Nhc2UgIm1vdXNlb3ZlciI6Yi51YShhKTticmVhaztjYXNlICJtb3VzZW91dCI6Yi50YShhKTticmVhaztjYXNlICJjb250ZXh0bWVudSI6Yi5jYShhKX19O2cuUGE9ZnVuY3Rpb24oKXt9O2cuVWE9ZnVuY3Rpb24oKXtYYyh0aGlzLC0xKTt0aGlzLlc9ITE7dGhpcy5CJiZPYyh0aGlzLkIsITEpfTsKZy5WYT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5pc0VuYWJsZWQoKSYmdGhpcy5pc1Zpc2libGUoKSYmKEgodGhpcykhPTB8fHRoaXMuS2EpJiZZYyh0aGlzLGEpPyhhLmooKSxhLnYoKSwhMCk6ITF9Owp2YXIgWWM9ZnVuY3Rpb24oYSxiKXt2YXIgYz1JKGEsYS5vKTtpZihjJiZ0eXBlb2YgYy5hYT09ImZ1bmN0aW9uIiYmYy5hYShiKXx8YS5CJiZhLkIhPWMmJnR5cGVvZiBhLkIuYWE9PSJmdW5jdGlvbiImJmEuQi5hYShiKSlyZXR1cm4hMDtpZihiLnNoaWZ0S2V5fHxiLmN0cmxLZXl8fGIubWV0YUtleXx8Yi5hbHRLZXkpcmV0dXJuITE7c3dpdGNoKGIuZyl7Y2FzZSAyNzpUYyhhKS5ibHVyKCk7YnJlYWs7Y2FzZSAzNjpaYyhhKTticmVhaztjYXNlIDM1OiRjKGEpO2JyZWFrO2Nhc2UgMzg6aWYoYS5MPT0idmVydGljYWwiKWFkKGEpO2Vsc2UgcmV0dXJuITE7YnJlYWs7Y2FzZSAzNzppZihhLkw9PSJob3Jpem9udGFsIilVYihhKT9iZChhKTphZChhKTtlbHNlIHJldHVybiExO2JyZWFrO2Nhc2UgNDA6aWYoYS5MPT0idmVydGljYWwiKWJkKGEpO2Vsc2UgcmV0dXJuITE7YnJlYWs7Y2FzZSAzOTppZihhLkw9PSJob3Jpem9udGFsIilVYihhKT9hZChhKTpiZChhKTtlbHNlIHJldHVybiExOwpicmVhaztkZWZhdWx0OnJldHVybiExfXJldHVybiEwfSxVYz1mdW5jdGlvbihhLGIpe3ZhciBjPWIuaSgpO2M9Yy5pZHx8KGMuaWQ9T2IoYikpO2EuT3x8KGEuTz17fSk7YS5PW2NdPWJ9O1YucHJvdG90eXBlLkJhPWZ1bmN0aW9uKGEsYil7dWEoYSxOLCJUaGUgY2hpbGQgb2YgYSBjb250YWluZXIgbXVzdCBiZSBhIGNvbnRyb2wiKTtWLmwuQmEuY2FsbCh0aGlzLGEsYil9O1YucHJvdG90eXBlLkNhPWZ1bmN0aW9uKGEsYixjKXt1YShhLE4pO2EuUHw9MjthLlB8PTY0O1BjKGEsMzIsITEpO2EucyYmMCE9YS5IYSYmTGMoYSwhMSk7YS5IYT0hMTt2YXIgZD1hLmg9PXRoaXM/VmIodGhpcyxhKTotMTtWLmwuQ2EuY2FsbCh0aGlzLGEsYixjKTthLnMmJnRoaXMucyYmVWModGhpcyxhKTthPWQ7YT09LTEmJihhPUgodGhpcykpO2E9PXRoaXMubz90aGlzLm89TWF0aC5taW4oSCh0aGlzKS0xLGIpOmE+dGhpcy5vJiZiPD10aGlzLm8/dGhpcy5vKys6YTx0aGlzLm8mJmI+dGhpcy5vJiZ0aGlzLm8tLX07CnZhciB6Yz1mdW5jdGlvbihhLGIpe2lmKGEuaSgpKXRocm93IEVycm9yKCJDb21wb25lbnQgYWxyZWFkeSByZW5kZXJlZCIpO2EuTD1ifTtWLnByb3RvdHlwZS5pc1Zpc2libGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5TfTt2YXIgVmM9ZnVuY3Rpb24oYSxiKXthLlM9Yjt2YXIgYz1hLmkoKTtjJiYoYy5zdHlsZS5kaXNwbGF5PWI/IiI6Im5vbmUiLHdjKFRjKGEpLGEuVCYmYS5TKSl9O1YucHJvdG90eXBlLmlzRW5hYmxlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLlR9O1YucHJvdG90eXBlLlg9ZnVuY3Rpb24oYSl7dGhpcy5UIT1hJiZFKHRoaXMsYT8iZW5hYmxlIjoiZGlzYWJsZSIpJiYoYT8odGhpcy5UPSEwLFRiKHRoaXMsZnVuY3Rpb24oYil7Yi5UYT9kZWxldGUgYi5UYTpiLlgoITApfSkpOihUYih0aGlzLGZ1bmN0aW9uKGIpe2IuaXNFbmFibGVkKCk/Yi5YKCExKTpiLlRhPSEwfSksdGhpcy5XPXRoaXMuVD0hMSksd2MoVGModGhpcyksYSYmdGhpcy5TKSl9Owp2YXIgWGM9ZnVuY3Rpb24oYSxiKXsoYj1JKGEsYikpP1AoYiwhMCk6YS5vPi0xJiZQKEkoYSxhLm8pLCExKX0sWmM9ZnVuY3Rpb24oYSl7Y2QoYSxmdW5jdGlvbihiLGMpe3JldHVybihiKzEpJWN9LEgoYSktMSl9LCRjPWZ1bmN0aW9uKGEpe2NkKGEsZnVuY3Rpb24oYixjKXtiLS07cmV0dXJuIGI8MD9jLTE6Yn0sMCl9LGJkPWZ1bmN0aW9uKGEpe2NkKGEsZnVuY3Rpb24oYixjKXtyZXR1cm4oYisxKSVjfSxhLm8pfSxhZD1mdW5jdGlvbihhKXtjZChhLGZ1bmN0aW9uKGIsYyl7Yi0tO3JldHVybiBiPDA/Yy0xOmJ9LGEubyl9LGNkPWZ1bmN0aW9uKGEsYixjKXtjPWM8MD9WYihhLGEuQik6Yzt2YXIgZD1IKGEpO2M9Yi5jYWxsKGEsYyxkKTtmb3IodmFyIGU9MDtlPD1kOyl7dmFyIGY9SShhLGMpO2lmKGYmJmYuaXNWaXNpYmxlKCkmJmYuaXNFbmFibGVkKCkmJmYuRCYyKXthLkxhKGMpO2JyZWFrfWUrKztjPWIuY2FsbChhLGMsZCl9fTsKVi5wcm90b3R5cGUuTGE9ZnVuY3Rpb24oYSl7WGModGhpcyxhKX07dmFyIGRkPWZ1bmN0aW9uKCl7fTtuKGRkLE0pO2lhKGRkKTtnPWRkLnByb3RvdHlwZTtnLk49ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy10YWIifTtnLk5hPWZ1bmN0aW9uKCl7cmV0dXJuInRhYiJ9O2cueGE9ZnVuY3Rpb24oYSl7dmFyIGI9ZGQubC54YS5jYWxsKHRoaXMsYSk7KGE9YS5HYSgpKSYmdGhpcy5NYShiLGEpO3JldHVybiBifTtnLnlhPWZ1bmN0aW9uKGEsYil7Yj1kZC5sLnlhLmNhbGwodGhpcyxhLGIpO3ZhciBjPXRoaXMuR2EoYik7YyYmKGEuUmE9Yyk7YS5tJjgmJihjPWEuaCkmJnR5cGVvZiBjLko9PT0iZnVuY3Rpb24iJiYoVChhLDgsITEpLGMuSihhKSk7cmV0dXJuIGJ9O2cuR2E9ZnVuY3Rpb24oYSl7cmV0dXJuIGEudGl0bGV8fCIifTtnLk1hPWZ1bmN0aW9uKGEsYil7YSYmKGEudGl0bGU9Ynx8IiIpfTt2YXIgZWQ9ZnVuY3Rpb24oYSxiLGMpe04uY2FsbCh0aGlzLGEsYnx8ZGQuVigpLGMpO1BjKHRoaXMsOCwhMCk7dGhpcy5QfD05fTtuKGVkLE4pO2VkLnByb3RvdHlwZS5HYT1mdW5jdGlvbigpe3JldHVybiB0aGlzLlJhfTtlZC5wcm90b3R5cGUuTWE9ZnVuY3Rpb24oYSl7dGhpcy52Lk1hKHRoaXMuaSgpLGEpO3RoaXMuUmE9YX07dGMoImdvb2ctdGFiIixmdW5jdGlvbigpe3JldHVybiBuZXcgZWQobnVsbCl9KTt2YXIgVz1mdW5jdGlvbigpe3RoaXMuQT0idGFibGlzdCJ9O24oVyx2Yyk7aWEoVyk7Vy5wcm90b3R5cGUuZz1mdW5jdGlvbigpe3JldHVybiJnb29nLXRhYi1iYXIifTtXLnByb3RvdHlwZS51PWZ1bmN0aW9uKGEsYixjKXt0aGlzLnZ8fCh0aGlzLmh8fGZkKHRoaXMpLHRoaXMudj1FYSh0aGlzLmgpKTt2YXIgZD10aGlzLnZbYl07ZD8oemMoYSxnZChkKSksYS52PWQpOlcubC51LmNhbGwodGhpcyxhLGIsYyl9O1cucHJvdG90eXBlLmo9ZnVuY3Rpb24oYSl7dmFyIGI9Vy5sLmouY2FsbCh0aGlzLGEpO3RoaXMuaHx8ZmQodGhpcyk7Yi5wdXNoKHRoaXMuaFthLnZdKTtyZXR1cm4gYn07dmFyIGZkPWZ1bmN0aW9uKGEpe3ZhciBiPWEuZygpO2EuaD17dG9wOmIrIi10b3AiLGJvdHRvbTpiKyItYm90dG9tIixzdGFydDpiKyItc3RhcnQiLGVuZDpiKyItZW5kIn19O3ZhciBYPWZ1bmN0aW9uKGEsYixjKXthPWF8fCJ0b3AiO3pjKHRoaXMsZ2QoYSkpO3RoaXMudj1hO1YuY2FsbCh0aGlzLHRoaXMuTCxifHxXLlYoKSxjKTtoZCh0aGlzKX07bihYLFYpO2c9WC5wcm90b3R5cGU7Zy5IPW51bGw7Zy5JPWZ1bmN0aW9uKCl7WC5sLkkuY2FsbCh0aGlzKTtoZCh0aGlzKX07Zy5DPWZ1bmN0aW9uKCl7WC5sLkMuY2FsbCh0aGlzKTt0aGlzLkg9bnVsbH07Zy5MYT1mdW5jdGlvbihhKXtYLmwuTGEuY2FsbCh0aGlzLGEpO3RoaXMuSihJKHRoaXMsYSkpfTtnLko9ZnVuY3Rpb24oYSl7YT9OYyhhLCEwKTp0aGlzLkgmJk5jKHRoaXMuSCwhMSl9Owp2YXIgaWQ9ZnVuY3Rpb24oYSxiKXtpZihiJiZiPT1hLkgpe2Zvcih2YXIgYz1WYihhLGIpLGQ9Yy0xO2I9SShhLGQpO2QtLSl7dmFyIGU9YjtpZihlLmlzVmlzaWJsZSgpJiZlLmlzRW5hYmxlZCgpKXthLkooYik7cmV0dXJufX1mb3IoYys9MTtiPUkoYSxjKTtjKyspaWYoZD1iLGQuaXNWaXNpYmxlKCkmJmQuaXNFbmFibGVkKCkpe2EuSihiKTtyZXR1cm59YS5KKG51bGwpfX07Zz1YLnByb3RvdHlwZTtnLmpiPWZ1bmN0aW9uKGEpe3RoaXMuSCYmdGhpcy5IIT1hLnRhcmdldCYmTmModGhpcy5ILCExKTt0aGlzLkg9YS50YXJnZXR9O2cua2I9ZnVuY3Rpb24oYSl7YS50YXJnZXQ9PXRoaXMuSCYmKHRoaXMuSD1udWxsKX07Zy5oYj1mdW5jdGlvbihhKXtpZCh0aGlzLGEudGFyZ2V0KX07Zy5pYj1mdW5jdGlvbihhKXtpZCh0aGlzLGEudGFyZ2V0KX07Zy5QYT1mdW5jdGlvbigpe0kodGhpcyx0aGlzLm8pfHxYYyh0aGlzLFZiKHRoaXMsdGhpcy5IfHxJKHRoaXMsMCkpKX07CnZhciBoZD1mdW5jdGlvbihhKXtCKEIoQihCKFFiKGEpLGEsInNlbGVjdCIsYS5qYiksYSwidW5zZWxlY3QiLGEua2IpLGEsImRpc2FibGUiLGEuaGIpLGEsImhpZGUiLGEuaWIpfSxnZD1mdW5jdGlvbihhKXtyZXR1cm4gYT09InN0YXJ0Inx8YT09ImVuZCI/InZlcnRpY2FsIjoiaG9yaXpvbnRhbCJ9O3RjKCJnb29nLXRhYi1iYXIiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBYfSk7ZnVuY3Rpb24gamQoYSl7dmFyIGI9e3RvcDoiYm90dG9tIixib3R0b206InRvcCIsc3RhcnQ6InJpZ2h0IixlbmQ6ImxlZnQifVthLmxvY2F0aW9uXSxjPWEuZWxlbWVudElkLGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTtkLnRleHRDb250ZW50PSJcbiAgICBmaWVsZHNldCB7XG4gICAgICBwYWRkaW5nOiAxMHB4O1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgIzM2OTtcbiAgICB9XG5cbiAgICAjIitjKyIgLmdvb2ctdGFiLWNvbnRlbnQge1xuICAgICAgbWluLWhlaWdodDogM2VtO1xuICAgICAgbWFyZ2luOiAwO1xuICAgICAgYm9yZGVyOiAiK2EuYm9yZGVyKyIgc29saWQgIithLmJvcmRlckNvbG9yKyI7XG4gICAgICBib3JkZXItdG9wOiAwO1xuICAgICAgaGVpZ2h0OiAiK2EuY29udGVudEhlaWdodCsiO1xuICAgICAgcGFkZGluZzogNHB4IDhweDtcbiAgICAgIG1hcmdpbi1yaWdodDogNHB4O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgIG92ZXJmbG93OiBhdXRvO1xuICAgIH1cblxuICAgICMiKwpjKyIgLmdvb2ctdGFiLWJhci0iK2EubG9jYXRpb24rIiAuZ29vZy10YWItc2VsZWN0ZWQge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICIrYS5ib3JkZXJDb2xvcisiO1xuICAgICAgYm9yZGVyLSIrYisiOiAwcHg7XG4gICAgfVxuXG4gICAgIyIrYysiIC5nb29nLXRhYi1iYXItIithLmxvY2F0aW9uKyIge1xuICAgICAgcGFkZGluZy0iK2EubG9jYXRpb24rIjogNXB4ICFpbXBvcnRhbnQ7XG4gICAgICBib3JkZXItIitiKyI6IDFweCBzb2xpZCAiK2EuYm9yZGVyQ29sb3IrIiAhaW1wb3J0YW50O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICB9XG5cbiAgICAjIitjKyIgLmdvb2ctdGFiLWJhciB7XG4gICAgICAgbWFyZ2luOiAwO1xuICAgICAgIGJvcmRlcjogMDtcbiAgICAgICBwYWRkaW5nOiAwO1xuICAgICAgIGxpc3Qtc3R5bGU6IG5vbmU7XG4gICAgICAgY3Vyc29yOiBkZWZhdWx0O1xuICAgICAgIG91dGxpbmU6IG5vbmU7XG4gICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgICBtYXJnaW4tcmlnaHQ6IDRweDtcbiAgICAgIH1cblxuICAgICAjIisKYysiIC5nb29nLXRhYiB7XG4gICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgIHBhZGRpbmc6IDRweCA4cHg7XG4gICAgICAgY29sb3I6IHZhcigtLWNvbGFiLXByaW1hcnktdGV4dC1jb2xvcik7XG4gICAgICAgdGV4dC1kZWNvcmF0aW9uOiBpbml0aWFsO1xuICAgICAgIGN1cnNvcjogZGVmYXVsdDtcbiAgICAgIH1cblxuICAgICAgIyIrYysiIC5nb29nLXRhYi1ob3ZlciB7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWNvbGFiLWhpZ2hsaWdodGVkLXN1cmZhY2UtY29sb3IpO1xuICAgICAgfVxuICAgICAgIjtyZXR1cm4gZH0KdmFyIGtkPWZ1bmN0aW9uKGEpe3ZhciBiPWEuZWxlbWVudElkLGM9YS50YWJOYW1lcyxkPWEuc2VsZWN0ZWRJbmRleDsiY29udGVudEJvcmRlciJpbiBhfHwoYS5jb250ZW50Qm9yZGVyPSIwcHgiKTsiY29udGVudEhlaWdodCJpbiBhfHwoYS5jb250ZW50SGVpZ2h0PSJpbml0aWFsIik7ImJvcmRlckNvbG9yImluIGF8fChhLmJvcmRlckNvbG9yPSJ2YXIoLS1jb2xhYi1ib3JkZXItY29sb3IpIik7YS5sb2NhdGlvbnx8KGEubG9jYXRpb249InRvcCIpO3ZhciBlPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiMiK2IpLGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zi5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYi1iYXIiKTt2YXIgaD1hLmxvY2F0aW9uO2YuY2xhc3NMaXN0LmFkZCgiZ29vZy10YWItYmFyLSIraCk7Zm9yKHZhciBrPVtdLHE9ZmEoYyksRz1xLm5leHQoKTshRy5kb25lO0c9cS5uZXh0KCkpe0c9Ry52YWx1ZTt2YXIgeD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKeC5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYiIpO3gudGV4dENvbnRlbnQ9RztmLmFwcGVuZENoaWxkKHgpO2sucHVzaCh4KX1oIT0iYm90dG9tIiYmZS5hcHBlbmRDaGlsZChmKTtxPW51bGw7aWYoaD09InRvcCJ8fGg9PSJib3R0b20iKXE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikscS5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYi1iYXItY2xlYXIiKTtoPT0idG9wIiYmcSYmZS5hcHBlbmRDaGlsZChxKTtHPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO0cuY2xhc3NMaXN0LmFkZCgiZ29vZy10YWItY29udGVudCIpO3ZhciBoYT1bXTtjPWZhKGMpO2Zvcih4PWMubmV4dCgpOyF4LmRvbmU7eD1jLm5leHQoKSl4PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHguaWQ9ZS5pZCsiX2NvbnRlbnRfIitoYS5sZW5ndGgseC5zdHlsZS5kaXNwbGF5PSJub25lIixHLmFwcGVuZENoaWxkKHgpLGhhLnB1c2goeCk7ZS5hcHBlbmRDaGlsZChHKTtoPT0iYm90dG9tIiYmKHEmJgplLmFwcGVuZENoaWxkKHEpLGUuYXBwZW5kQ2hpbGQoZikpO3ZhciBRPW5ldyBYKGgpO1NiKFEsZik7dmFyIFI9LTE7d2IoUSwic2VsZWN0IixmdW5jdGlvbihTKXtTPWsuaW5kZXhPZihTLnRhcmdldC5pKCkpO1MhPVImJihSPj0wJiZSPGhhLmxlbmd0aCYmKGhhW1JdLnN0eWxlLmRpc3BsYXk9Im5vbmUiLFI9LTEpLFM+PTAmJlM8aGEubGVuZ3RoJiYoUj1TLGhhW1JdLnN0eWxlLmRpc3BsYXk9ImlubGluZSIsd2luZG93LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCJyZXNpemUiKSksZ29vZ2xlLmNvbGFiLm91dHB1dC5yZXNpemVJZnJhbWVUb0NvbnRlbnQoKSksUS5KKEkoUSxSKSkpfSk7US5KKEkoUSxkKSk7d2luZG93W2JdPXtzZXRTZWxlY3RlZFRhYkluZGV4OmZ1bmN0aW9uKFMpe1EuSihJKFEsUykpfX07ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChqZChhKSl9LGxkPVsiY29sYWJfbGliIiwiY3JlYXRlVGFiQmFyIl0sWT1sOwpsZFswXWluIFl8fHR5cGVvZiBZLmV4ZWNTY3JpcHQ9PSJ1bmRlZmluZWQifHxZLmV4ZWNTY3JpcHQoInZhciAiK2xkWzBdKTtmb3IodmFyIFo7bGQubGVuZ3RoJiYoWj1sZC5zaGlmdCgpKTspbGQubGVuZ3RofHxrZD09PXZvaWQgMD9ZW1pdJiZZW1pdIT09T2JqZWN0LnByb3RvdHlwZVtaXT9ZPVlbWl06WT1ZW1pdPXt9OllbWl09a2Q7fSkuY2FsbCh0aGlzKTsKLy8gY2xhbmctZm9ybWF0IG9uCg==", + "ok": true, + "headers": [ + [ + "content-length", + "41785" + ], + [ + "content-type", + "application/javascript" + ] + ], + "status": 200, + "status_text": "" + } + }, + "base_uri": "https://localhost:8080/", + "height": 291 + }, + "outputId": "6bd155c5-68b9-43a4-d718-0195f4129ffb" + }, + "source": [ + "%%logica ExampleFunctionOne, ExampleFunctionTwo, Test\n", + "\n", + "ExampleFunctionOne(x) = y :- x == \"a\", y == \"b\";\n", + "\n", + "ExampleFunctionTwo(\"b\", logica_value: \"c\");\n", + "\n", + "Test(\"test_1\", x, y) :- ExampleFunctionOne(x, logica_value: y);\n", + "Test(\"test_2\", x, y) :- ExampleFunctionOne(x) == y;\n", + "Test(\"test_3\", x, ExampleFunctionOne(x));\n", + "Test(\"test_4\", x, ExampleFunctionTwo(ExampleFunctionOne(x)));\n", + "\n" + ], + "execution_count": 23, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0ee2f122-d22d-11ef-a7c0-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id43\", \"tabNames\": [\"ExampleFunctionOne\", \"ExampleFunctionTwo\", \"Test\", \"(Log)\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_dc2f7c3586" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0ee35126-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id43\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_c39a971d35" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0ee5a05c-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_ee6e448653" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0ee61a5a-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id43_content_3\");\n", + "//# sourceURL=js_00c2278c56" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0ee66c30-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"0ee61a5a-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_eecbea15c0" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0ee71f04-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id43\"].setSelectedTabIndex(3);\n", + "//# sourceURL=js_663f3418e5" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0ee9f42c-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"0ee5a05c-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_2583e7df5e" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0eeba808-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_cdd8843693" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0eebf6aa-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id43_content_0\");\n", + "//# sourceURL=js_b14476cf45" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0eec45d8-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"0eebf6aa-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_b388419756" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0eec8f70-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id43\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_6a27b38aa5" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0eee37d0-d22d-11ef-a7c0-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id44\", \"tabNames\": [\"SQL\", \"Result\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_74a020d3a0" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0eee7eac-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id44\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_4feb7fe3b8" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0eefd84c-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_5380bd6b65" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0ef024d2-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id44_content_0\");\n", + "//# sourceURL=js_e5035ccd53" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0ef06e7e-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"0ef024d2-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_8b016319aa" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0ef0bc62-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id44\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_0257a6bf86" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The following query is stored at \u001b[1mExampleFunctionOne_sql\u001b[0m variable.\n", + "-- Initializing DuckDB environment.\n", + "create schema if not exists logica_home;\n", + "-- Empty record, has to have a field by DuckDB syntax.\n", + "drop type if exists logicarecord893574736 cascade; create type logicarecord893574736 as struct(nirvana numeric);\n", + "create sequence if not exists eternal_logical_sequence;\n", + "\n", + "\n", + "-- Logica type: logicarecord481217614\n", + "drop type if exists logicarecord481217614 cascade; create type logicarecord481217614 as struct(r logicarecord893574736);\n", + "\n", + "-- Logica type: logicarecord383307722\n", + "drop type if exists logicarecord383307722 cascade; create type logicarecord383307722 as struct(a timestamp);\n", + "SELECT\n", + " 'a' AS col0,\n", + " 'b' AS logica_value;\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0ef1c864-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"0eefd84c-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_0d57089258" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0ef359b8-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_f4481285b1" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0ef3a670-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id44_content_1\");\n", + "//# sourceURL=js_342c74d72d" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0ef3f012-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"0ef3a670-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_5c212a26e9" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0ef436c6-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id44\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_188a6d636e" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The following table is stored at \u001b[1mExampleFunctionOne\u001b[0m variable.\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
col0logica_value
0ab
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0ef57ef0-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"0ef359b8-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_271199de9a" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0ef6baea-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"0eeba808-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_f0327c5e8f" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0ef842fc-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_245d068185" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0ef88da2-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id43_content_3\");\n", + "//# sourceURL=js_b978e2d015" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0ef8d8ac-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"0ef88da2-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_86aba3ba7d" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0ef91fba-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id43\"].setSelectedTabIndex(3);\n", + "//# sourceURL=js_d3b4a0898a" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0efa5e3e-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"0ef842fc-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_2281d392ec" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0efbfa32-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_3441eb4571" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0efc5004-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id43_content_1\");\n", + "//# sourceURL=js_2720d155d2" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0efd0d32-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"0efc5004-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_88a7a3db00" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0efd61ec-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id43\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_f103b1590b" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0effc07c-d22d-11ef-a7c0-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id45\", \"tabNames\": [\"SQL\", \"Result\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_add4564dc9" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0f0004f6-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id45\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_a728dd729b" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0f013f24-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_c0da59b114" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0f018ace-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id45_content_0\");\n", + "//# sourceURL=js_6bfcb3e677" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0f01d24a-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"0f018ace-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_0c79e972e6" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0f021660-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id45\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_f03b106412" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The following query is stored at \u001b[1mExampleFunctionTwo_sql\u001b[0m variable.\n", + "-- Initializing DuckDB environment.\n", + "create schema if not exists logica_home;\n", + "-- Empty record, has to have a field by DuckDB syntax.\n", + "drop type if exists logicarecord893574736 cascade; create type logicarecord893574736 as struct(nirvana numeric);\n", + "create sequence if not exists eternal_logical_sequence;\n", + "\n", + "\n", + "-- Logica type: logicarecord481217614\n", + "drop type if exists logicarecord481217614 cascade; create type logicarecord481217614 as struct(r logicarecord893574736);\n", + "\n", + "-- Logica type: logicarecord383307722\n", + "drop type if exists logicarecord383307722 cascade; create type logicarecord383307722 as struct(a timestamp);\n", + "SELECT\n", + " 'b' AS col0,\n", + " 'c' AS logica_value;\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0f0317ea-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"0f013f24-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_cc8eda38c5" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0f04a808-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_08d2d1810c" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0f04f312-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id45_content_1\");\n", + "//# sourceURL=js_6fba8d2197" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0f0543d0-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"0f04f312-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_20168ba9a6" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0f05884a-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id45\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_0dd7ba48bd" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The following table is stored at \u001b[1mExampleFunctionTwo\u001b[0m variable.\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
col0logica_value
0bc
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0f06c99e-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"0f04a808-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_9d8d8b769c" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0f080278-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"0efbfa32-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_4796294566" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0f09863e-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_1ab121c0e3" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0f09d1ac-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id43_content_3\");\n", + "//# sourceURL=js_d64aea8318" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0f0a1a9a-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"0f09d1ac-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_1edad4958c" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0f0a618a-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id43\"].setSelectedTabIndex(3);\n", + "//# sourceURL=js_897c28491e" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0f124454-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"0f09863e-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_0954357536" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0f140a00-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_fbc217566d" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0f145820-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id43_content_2\");\n", + "//# sourceURL=js_fd8bc94962" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0f14ad66-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"0f145820-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_5e50780534" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0f14fbd6-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id43\"].setSelectedTabIndex(2);\n", + "//# sourceURL=js_881cf21de2" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0f1728fc-d22d-11ef-a7c0-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id46\", \"tabNames\": [\"SQL\", \"Result\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_150c8a0103" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0f177870-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id46\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_8a499e83e7" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0f18aede-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_6a41cdf741" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0f18fa88-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id46_content_0\");\n", + "//# sourceURL=js_37f715978d" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0f19401a-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"0f18fa88-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_9bce0e7fc2" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0f19873c-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id46\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_6c8f4eaf1d" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The following query is stored at \u001b[1mTest_sql\u001b[0m variable.\n", + "-- Initializing DuckDB environment.\n", + "create schema if not exists logica_home;\n", + "-- Empty record, has to have a field by DuckDB syntax.\n", + "drop type if exists logicarecord893574736 cascade; create type logicarecord893574736 as struct(nirvana numeric);\n", + "create sequence if not exists eternal_logical_sequence;\n", + "\n", + "\n", + "-- Logica type: logicarecord481217614\n", + "drop type if exists logicarecord481217614 cascade; create type logicarecord481217614 as struct(r logicarecord893574736);\n", + "\n", + "-- Logica type: logicarecord383307722\n", + "drop type if exists logicarecord383307722 cascade; create type logicarecord383307722 as struct(a timestamp);\n", + "SELECT * FROM (\n", + " \n", + " SELECT\n", + " 'test_1' AS col0,\n", + " 'a' AS col1,\n", + " 'b' AS col2\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " 'test_2' AS col0,\n", + " 'a' AS col1,\n", + " 'b' AS col2\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " 'test_3' AS col0,\n", + " 'a' AS col1,\n", + " 'b' AS col2\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " 'test_4' AS col0,\n", + " 'a' AS col1,\n", + " 'c' AS col2\n", + " FROM\n", + " (SELECT 'singleton' as s) as unused_singleton\n", + " WHERE\n", + " ('b' = 'b')\n", + " \n", + ") AS UNUSED_TABLE_NAME ;\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0f1ac098-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"0f18aede-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_f97cf76268" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0f1c7032-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_ba39a62604" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0f1cbfa6-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id46_content_1\");\n", + "//# sourceURL=js_297bb4824b" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0f1de62e-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"0f1cbfa6-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_5bd2cc856c" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0f1e38f4-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id46\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_1c73131b30" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The following table is stored at \u001b[1mTest\u001b[0m variable.\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
col0col1col2
0test_1ab
1test_2ab
2test_3ab
3test_4ac
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0f1fcb24-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"0f1c7032-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_ed7b49f121" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0f216628-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"0f140a00-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_1950ffc7f8" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0f2375d0-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_895741dbbf" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0f23f168-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id43_content_3\");\n", + "//# sourceURL=js_ccc8f4ff60" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0f24471c-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"0f23f168-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_3ab9fc43db" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0f2494c4-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id43\"].setSelectedTabIndex(3);\n", + "//# sourceURL=js_18d7b417fe" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "image/svg+xml": "\n\n\n\n\n\nConcertina\n\n\n\nExampleFunctionOne\n\nExampleFunctionOne\n\n\n\nTest\n\nTest\n\n\n\nExampleFunctionTwo\n\nExampleFunctionTwo\n\n\n\n", + "text/plain": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Running predicate: ExampleFunctionOne (2 ms)\n", + "Running predicate: Test (6 ms)\n", + "Running predicate: ExampleFunctionTwo (3 ms)\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0f5ac292-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"0f2375d0-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_fd3db171b3" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0f5d2456-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_88bad77ca5" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0f5d6fa6-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id43_content_0\");\n", + "//# sourceURL=js_501d8eea7c" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0f5db9c0-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"0f5d6fa6-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_b96a3f8f52" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0f5dfd4a-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id43\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_61c4536ff9" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0f5fa80c-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_aa9e1e86e7" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0f5ff47e-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id44_content_1\");\n", + "//# sourceURL=js_66ae727f03" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0f607c82-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"0f5ff47e-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_186f6f6b80" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0f6121d2-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id44\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_f482474568" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0f64f032-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"0f5fa80c-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_04bbec203b" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + " \n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0f6b91c6-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"0f5d2456-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_d74a47ca1b" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0f6eaea6-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_a6a8465896" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0f6f1850-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id43_content_1\");\n", + "//# sourceURL=js_0220653797" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0f6fca5c-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"0f6f1850-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_ae69c93b4c" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0f703406-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id43\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_a927979878" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0f72a510-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_e85d0d1c00" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0f7316c6-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id45_content_1\");\n", + "//# sourceURL=js_e692965f8a" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0f73862e-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"0f7316c6-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_63d7b81684" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0f746044-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id45\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_4cf4e8b217" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0f76dd2e-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"0f72a510-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_8ac166cf04" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + " \n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0f7a10b6-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"0f6eaea6-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_e07232041a" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0f7d717a-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_4d07ef7318" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0f7de466-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id43_content_2\");\n", + "//# sourceURL=js_265c955af1" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0f7e8d1c-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"0f7de466-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_d368a6f8d2" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0f7f2362-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id43\"].setSelectedTabIndex(2);\n", + "//# sourceURL=js_c8e9b55208" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0f814282-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_699deb3c8c" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0f81c46e-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id46_content_1\");\n", + "//# sourceURL=js_2e6d5436a0" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0f8274b8-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"0f81c46e-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_fd95ef7c74" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0f832638-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id46\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_e187e9b1f2" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0f860a10-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"0f814282-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_92aafa3895" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + " \n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"0f8809aa-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"0f7d717a-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_6263e43362" + ] + }, + "metadata": {} + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "9YHMZSsryqYy" + }, + "source": [ + "Thus function notation does not add any new capabilities, but often makes syntax much cleaner." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "H1HUmd-mb9MW", + "colab": { + "resources": { + "http://localhost:8080/nbextensions/google.colab/tabbar.css": { + "data": "Lmdvb2ctdGFie3Bvc2l0aW9uOnJlbGF0aXZlO3BhZGRpbmc6NHB4IDhweDtjb2xvcjojMDBjO3RleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7Y3Vyc29yOmRlZmF1bHR9Lmdvb2ctdGFiLWJhci10b3AgLmdvb2ctdGFie21hcmdpbjoxcHggNHB4IDAgMDtib3JkZXItYm90dG9tOjA7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLXRvcDphZnRlciwuZ29vZy10YWItYmFyLWJvdHRvbTphZnRlcntjb250ZW50OiIgIjtkaXNwbGF5OmJsb2NrO2hlaWdodDowO2NsZWFyOmJvdGg7dmlzaWJpbGl0eTpoaWRkZW59Lmdvb2ctdGFiLWJhci1ib3R0b20gLmdvb2ctdGFie21hcmdpbjowIDRweCAxcHggMDtib3JkZXItdG9wOjA7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLXN0YXJ0IC5nb29nLXRhYnttYXJnaW46MCAwIDRweCAxcHg7Ym9yZGVyLXJpZ2h0OjB9Lmdvb2ctdGFiLWJhci1lbmQgLmdvb2ctdGFie21hcmdpbjowIDFweCA0cHggMDtib3JkZXItbGVmdDowfS5nb29nLXRhYi1ob3ZlcntiYWNrZ3JvdW5kOiNlZWV9Lmdvb2ctdGFiLWRpc2FibGVke2NvbG9yOiM2NjZ9Lmdvb2ctdGFiLXNlbGVjdGVke2NvbG9yOiMwMDA7YmFja2dyb3VuZDojZmZmO3RleHQtZGVjb3JhdGlvbjpub25lO2ZvbnQtd2VpZ2h0OmJvbGQ7Ym9yZGVyOjFweCBzb2xpZCAjNmI5MGRhfS5nb29nLXRhYi1iYXItdG9we3BhZGRpbmctdG9wOjVweCFpbXBvcnRhbnQ7cGFkZGluZy1sZWZ0OjVweCFpbXBvcnRhbnQ7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgIzZiOTBkYSFpbXBvcnRhbnR9Lmdvb2ctdGFiLWJhci10b3AgLmdvb2ctdGFiLXNlbGVjdGVke3RvcDoxcHg7bWFyZ2luLXRvcDowO3BhZGRpbmctYm90dG9tOjVweH0uZ29vZy10YWItYmFyLWJvdHRvbSAuZ29vZy10YWItc2VsZWN0ZWR7dG9wOi0xcHg7bWFyZ2luLWJvdHRvbTowO3BhZGRpbmctdG9wOjVweH0uZ29vZy10YWItYmFyLXN0YXJ0IC5nb29nLXRhYi1zZWxlY3RlZHtsZWZ0OjFweDttYXJnaW4tbGVmdDowO3BhZGRpbmctcmlnaHQ6OXB4fS5nb29nLXRhYi1iYXItZW5kIC5nb29nLXRhYi1zZWxlY3RlZHtsZWZ0Oi0xcHg7bWFyZ2luLXJpZ2h0OjA7cGFkZGluZy1sZWZ0OjlweH0uZ29vZy10YWItYmFye21hcmdpbjowO2JvcmRlcjowO3BhZGRpbmc6MDtsaXN0LXN0eWxlOm5vbmU7Y3Vyc29yOmRlZmF1bHQ7b3V0bGluZTpub25lO2JhY2tncm91bmQ6I2ViZWZmOX0uZ29vZy10YWItYmFyLWNsZWFye2NsZWFyOmJvdGg7aGVpZ2h0OjA7b3ZlcmZsb3c6aGlkZGVufS5nb29nLXRhYi1iYXItc3RhcnR7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLWVuZHtmbG9hdDpyaWdodH0qIGh0bWwgLmdvb2ctdGFiLWJhci1zdGFydHttYXJnaW4tcmlnaHQ6LTNweH0qIGh0bWwgLmdvb2ctdGFiLWJhci1lbmR7bWFyZ2luLWxlZnQ6LTNweH1zZW50aW5lbHt9", + "ok": true, + "headers": [ + [ + "content-length", + "1404" + ], + [ + "content-type", + "text/css" + ] + ], + "status": 200, + "status_text": "" + }, + "http://localhost:8080/nbextensions/google.colab/tabbar_main.min.js": { + "data": "Ly8gY2xhbmctZm9ybWF0IG9mZgooZnVuY3Rpb24oKXt2YXIgZyxhYT1mdW5jdGlvbihhKXt2YXIgYj0wO3JldHVybiBmdW5jdGlvbigpe3JldHVybiBiPGEubGVuZ3RoP3tkb25lOiExLHZhbHVlOmFbYisrXX06e2RvbmU6ITB9fX0sYmE9dHlwZW9mIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzPT0iZnVuY3Rpb24iP09iamVjdC5kZWZpbmVQcm9wZXJ0eTpmdW5jdGlvbihhLGIsYyl7aWYoYT09QXJyYXkucHJvdG90eXBlfHxhPT1PYmplY3QucHJvdG90eXBlKXJldHVybiBhO2FbYl09Yy52YWx1ZTtyZXR1cm4gYX0sY2E9ZnVuY3Rpb24oYSl7YT1bIm9iamVjdCI9PXR5cGVvZiBnbG9iYWxUaGlzJiZnbG9iYWxUaGlzLGEsIm9iamVjdCI9PXR5cGVvZiB3aW5kb3cmJndpbmRvdywib2JqZWN0Ij09dHlwZW9mIHNlbGYmJnNlbGYsIm9iamVjdCI9PXR5cGVvZiBnbG9iYWwmJmdsb2JhbF07Zm9yKHZhciBiPTA7YjxhLmxlbmd0aDsrK2Ipe3ZhciBjPWFbYl07aWYoYyYmYy5NYXRoPT1NYXRoKXJldHVybiBjfXRocm93IEVycm9yKCJDYW5ub3QgZmluZCBnbG9iYWwgb2JqZWN0Iik7Cn0sZGE9Y2EodGhpcyksZWE9ZnVuY3Rpb24oYSxiKXtpZihiKWE6e3ZhciBjPWRhO2E9YS5zcGxpdCgiLiIpO2Zvcih2YXIgZD0wO2Q8YS5sZW5ndGgtMTtkKyspe3ZhciBlPWFbZF07aWYoIShlIGluIGMpKWJyZWFrIGE7Yz1jW2VdfWE9YVthLmxlbmd0aC0xXTtkPWNbYV07Yj1iKGQpO2IhPWQmJmIhPW51bGwmJmJhKGMsYSx7Y29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOmJ9KX19OwplYSgiU3ltYm9sIixmdW5jdGlvbihhKXtpZihhKXJldHVybiBhO3ZhciBiPWZ1bmN0aW9uKGYsaCl7dGhpcy5nPWY7YmEodGhpcywiZGVzY3JpcHRpb24iLHtjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6aH0pfTtiLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmd9O3ZhciBjPSJqc2NvbXBfc3ltYm9sXyIrKE1hdGgucmFuZG9tKCkqMUU5Pj4+MCkrIl8iLGQ9MCxlPWZ1bmN0aW9uKGYpe2lmKHRoaXMgaW5zdGFuY2VvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoIlN5bWJvbCBpcyBub3QgYSBjb25zdHJ1Y3RvciIpO3JldHVybiBuZXcgYihjKyhmfHwiIikrIl8iK2QrKyxmKX07cmV0dXJuIGV9KTsKdmFyIGZhPWZ1bmN0aW9uKGEpe3ZhciBiPXR5cGVvZiBTeW1ib2whPSJ1bmRlZmluZWQiJiZTeW1ib2wuaXRlcmF0b3ImJmFbU3ltYm9sLml0ZXJhdG9yXTtpZihiKXJldHVybiBiLmNhbGwoYSk7aWYodHlwZW9mIGEubGVuZ3RoPT0ibnVtYmVyIilyZXR1cm57bmV4dDphYShhKX07dGhyb3cgRXJyb3IoU3RyaW5nKGEpKyIgaXMgbm90IGFuIGl0ZXJhYmxlIG9yIEFycmF5TGlrZSIpO307ZWEoIlN5bWJvbC5kaXNwb3NlIixmdW5jdGlvbihhKXtyZXR1cm4gYT9hOlN5bWJvbCgiU3ltYm9sLmRpc3Bvc2UiKX0pOy8qCgogQ29weXJpZ2h0IFRoZSBDbG9zdXJlIExpYnJhcnkgQXV0aG9ycy4KIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wCiovCnZhciBsPXRoaXN8fHNlbGYsaWE9ZnVuY3Rpb24oYSl7YS5JYT12b2lkIDA7YS5WPWZ1bmN0aW9uKCl7cmV0dXJuIGEuSWE/YS5JYTphLklhPW5ldyBhfX0samE9ZnVuY3Rpb24oYSl7dmFyIGI9dHlwZW9mIGE7cmV0dXJuIGIhPSJvYmplY3QiP2I6YT9BcnJheS5pc0FycmF5KGEpPyJhcnJheSI6YjoibnVsbCJ9LGthPWZ1bmN0aW9uKGEpe3ZhciBiPWphKGEpO3JldHVybiBiPT0iYXJyYXkifHxiPT0ib2JqZWN0IiYmdHlwZW9mIGEubGVuZ3RoPT0ibnVtYmVyIn0sbT1mdW5jdGlvbihhKXt2YXIgYj10eXBlb2YgYTtyZXR1cm4gYj09Im9iamVjdCImJmEhPW51bGx8fGI9PSJmdW5jdGlvbiJ9LG5hPWZ1bmN0aW9uKGEpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYSxsYSkmJmFbbGFdfHwoYVtsYV09KyttYSl9LGxhPSJjbG9zdXJlX3VpZF8iKyhNYXRoLnJhbmRvbSgpKjFFOT4+PjApLG1hPTAsbj1mdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoKXt9Yy5wcm90b3R5cGU9CmIucHJvdG90eXBlO2EubD1iLnByb3RvdHlwZTthLnByb3RvdHlwZT1uZXcgYzthLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1hO2EucWQ9ZnVuY3Rpb24oZCxlLGYpe2Zvcih2YXIgaD1BcnJheShhcmd1bWVudHMubGVuZ3RoLTIpLGs9MjtrPGFyZ3VtZW50cy5sZW5ndGg7aysrKWhbay0yXT1hcmd1bWVudHNba107cmV0dXJuIGIucHJvdG90eXBlW2VdLmFwcGx5KGQsaCl9fTtmdW5jdGlvbiBvYShhLGIpe2lmKEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKUVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsb2EpO2Vsc2V7dmFyIGM9RXJyb3IoKS5zdGFjaztjJiYodGhpcy5zdGFjaz1jKX1hJiYodGhpcy5tZXNzYWdlPVN0cmluZyhhKSk7YiE9PXZvaWQgMCYmKHRoaXMuY2F1c2U9Yil9bihvYSxFcnJvcik7b2EucHJvdG90eXBlLm5hbWU9IkN1c3RvbUVycm9yIjt2YXIgcGE7ZnVuY3Rpb24gcWEoYSxiKXthPWEuc3BsaXQoIiVzIik7Zm9yKHZhciBjPSIiLGQ9YS5sZW5ndGgtMSxlPTA7ZTxkO2UrKyljKz1hW2VdKyhlPGIubGVuZ3RoP2JbZV06IiVzIik7b2EuY2FsbCh0aGlzLGMrYVtkXSl9bihxYSxvYSk7cWEucHJvdG90eXBlLm5hbWU9IkFzc2VydGlvbkVycm9yIjtmdW5jdGlvbiByYShhLGIsYyxkKXt2YXIgZT0iQXNzZXJ0aW9uIGZhaWxlZCI7aWYoYyl7ZSs9IjogIitjO3ZhciBmPWR9ZWxzZSBhJiYoZSs9IjogIithLGY9Yik7dGhyb3cgbmV3IHFhKCIiK2UsZnx8W10pO30KdmFyIHA9ZnVuY3Rpb24oYSxiLGMpe2F8fHJhKCIiLG51bGwsYixBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMikpO3JldHVybiBhfSxzYT1mdW5jdGlvbihhLGIsYyl7bShhKSYmYS5ub2RlVHlwZT09MXx8cmEoIkV4cGVjdGVkIEVsZW1lbnQgYnV0IGdvdCAlczogJXMuIixbamEoYSksYV0sYixBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMikpfSx1YT1mdW5jdGlvbihhLGIsYyxkKXthIGluc3RhbmNlb2YgYnx8cmEoIkV4cGVjdGVkIGluc3RhbmNlb2YgJXMgYnV0IGdvdCAlcy4iLFt0YShiKSx0YShhKV0sYyxBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMykpfTsKZnVuY3Rpb24gdGEoYSl7cmV0dXJuIGEgaW5zdGFuY2VvZiBGdW5jdGlvbj9hLmRpc3BsYXlOYW1lfHxhLm5hbWV8fCJ1bmtub3duIHR5cGUgbmFtZSI6YSBpbnN0YW5jZW9mIE9iamVjdD9hLmNvbnN0cnVjdG9yLmRpc3BsYXlOYW1lfHxhLmNvbnN0cnVjdG9yLm5hbWV8fE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhKTphPT09bnVsbD8ibnVsbCI6dHlwZW9mIGF9O3ZhciB2YT1BcnJheS5wcm90b3R5cGUuaW5kZXhPZj9mdW5jdGlvbihhLGIpe3AoYS5sZW5ndGghPW51bGwpO3JldHVybiBBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKGEsYix2b2lkIDApfTpmdW5jdGlvbihhLGIpe2lmKHR5cGVvZiBhPT09InN0cmluZyIpcmV0dXJuIHR5cGVvZiBiIT09InN0cmluZyJ8fGIubGVuZ3RoIT0xPy0xOmEuaW5kZXhPZihiLDApO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWlmKGMgaW4gYSYmYVtjXT09PWIpcmV0dXJuIGM7cmV0dXJuLTF9LHdhPUFycmF5LnByb3RvdHlwZS5mb3JFYWNoP2Z1bmN0aW9uKGEsYil7cChhLmxlbmd0aCE9bnVsbCk7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChhLGIsdm9pZCAwKX06ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9YS5sZW5ndGgsZD10eXBlb2YgYT09PSJzdHJpbmciP2Euc3BsaXQoIiIpOmEsZT0wO2U8YztlKyspZSBpbiBkJiZiLmNhbGwodm9pZCAwLGRbZV0sZSxhKX07CmZ1bmN0aW9uIHhhKGEsYil7Yj12YShhLGIpO3ZhciBjO2lmKGM9Yj49MClwKGEubGVuZ3RoIT1udWxsKSxBcnJheS5wcm90b3R5cGUuc3BsaWNlLmNhbGwoYSxiLDEpO3JldHVybiBjfWZ1bmN0aW9uIHlhKGEpe3ZhciBiPWEubGVuZ3RoO2lmKGI+MCl7Zm9yKHZhciBjPUFycmF5KGIpLGQ9MDtkPGI7ZCsrKWNbZF09YVtkXTtyZXR1cm4gY31yZXR1cm5bXX1mdW5jdGlvbiB6YShhLGIsYyxkKXtwKGEubGVuZ3RoIT1udWxsKTtBcnJheS5wcm90b3R5cGUuc3BsaWNlLmFwcGx5KGEsQWEoYXJndW1lbnRzLDEpKX1mdW5jdGlvbiBBYShhLGIsYyl7cChhLmxlbmd0aCE9bnVsbCk7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg8PTI/QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYSxiKTpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhLGIsYyl9O2Z1bmN0aW9uIEJhKGEsYixjKXtmb3IodmFyIGQgaW4gYSliLmNhbGwoYyxhW2RdLGQsYSl9ZnVuY3Rpb24gQ2EoYSxiKXtmb3IodmFyIGMgaW4gYSlpZihhW2NdPT1iKXJldHVybiEwO3JldHVybiExfWZ1bmN0aW9uIERhKGEsYixjKXtpZihhIT09bnVsbCYmYiBpbiBhKXRocm93IEVycm9yKCdUaGUgb2JqZWN0IGFscmVhZHkgY29udGFpbnMgdGhlIGtleSAiJytiKyciJyk7YVtiXT1jfWZ1bmN0aW9uIEVhKGEpe3ZhciBiPXt9LGM7Zm9yKGMgaW4gYSliW2FbY11dPWM7cmV0dXJuIGJ9dmFyIEZhPSJjb25zdHJ1Y3RvciBoYXNPd25Qcm9wZXJ0eSBpc1Byb3RvdHlwZU9mIHByb3BlcnR5SXNFbnVtZXJhYmxlIHRvTG9jYWxlU3RyaW5nIHRvU3RyaW5nIHZhbHVlT2YiLnNwbGl0KCIgIik7CmZ1bmN0aW9uIEdhKGEsYil7Zm9yKHZhciBjLGQsZT0xO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspe2Q9YXJndW1lbnRzW2VdO2ZvcihjIGluIGQpYVtjXT1kW2NdO2Zvcih2YXIgZj0wO2Y8RmEubGVuZ3RoO2YrKyljPUZhW2ZdLE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChkLGMpJiYoYVtjXT1kW2NdKX19O3ZhciBIYT1TdHJpbmcucHJvdG90eXBlLnRyaW0/ZnVuY3Rpb24oYSl7cmV0dXJuIGEudHJpbSgpfTpmdW5jdGlvbihhKXtyZXR1cm4vXltcc1x4YTBdKihbXHNcU10qPylbXHNceGEwXSokLy5leGVjKGEpWzFdfTsvKgoKIENvcHlyaWdodCBHb29nbGUgTExDCiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMAoqLwp2YXIgSWE9e307dmFyIEphPWZ1bmN0aW9uKGEpe2lmKElhIT09SWEpdGhyb3cgRXJyb3IoIkJhZCBzZWNyZXQiKTt0aGlzLmc9YX07SmEucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ307bmV3IEphKCJhYm91dDpibGFuayIpO25ldyBKYSgiYWJvdXQ6aW52YWxpZCN6Q2xvc3VyZXoiKTt2YXIgS2E9W10sTGE9ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJBIFVSTCB3aXRoIGNvbnRlbnQgJyIrYSsiJyB3YXMgc2FuaXRpemVkIGF3YXkuIil9O0thLmluZGV4T2YoTGEpPT09LTEmJkthLnB1c2goTGEpO3ZhciBNYSxOYTthOntmb3IodmFyIE9hPVsiQ0xPU1VSRV9GTEFHUyJdLFBhPWwsUWE9MDtRYTxPYS5sZW5ndGg7UWErKylpZihQYT1QYVtPYVtRYV1dLFBhPT1udWxsKXtOYT1udWxsO2JyZWFrIGF9TmE9UGF9dmFyIFJhPU5hJiZOYVs2MTA0MDEzMDFdO01hPVJhIT1udWxsP1JhOiExO2Z1bmN0aW9uIFNhKCl7dmFyIGE9bC5uYXZpZ2F0b3I7cmV0dXJuIGEmJihhPWEudXNlckFnZW50KT9hOiIifXZhciBUYSxVYT1sLm5hdmlnYXRvcjtUYT1VYT9VYS51c2VyQWdlbnREYXRhfHxudWxsOm51bGw7ZnVuY3Rpb24gcihhKXtyZXR1cm4gU2EoKS5pbmRleE9mKGEpIT0tMX07dmFyIFZhPXIoIkVkZ2UiKSx0PXIoIkdlY2tvIikmJiEoU2EoKS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoIndlYmtpdCIpIT0tMSYmIXIoIkVkZ2UiKSkmJiEocigiVHJpZGVudCIpfHxyKCJNU0lFIikpJiYhcigiRWRnZSIpLHU9U2EoKS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoIndlYmtpdCIpIT0tMSYmIXIoIkVkZ2UiKSx2PU1hJiZUYSYmVGEucGxhdGZvcm0/VGEucGxhdGZvcm09PT0ibWFjT1MiOnIoIk1hY2ludG9zaCIpO3ZhciBYYT1mdW5jdGlvbihhLGIpe0JhKGIsZnVuY3Rpb24oYyxkKXtkPT0ic3R5bGUiP2Euc3R5bGUuY3NzVGV4dD1jOmQ9PSJjbGFzcyI/YS5jbGFzc05hbWU9YzpkPT0iZm9yIj9hLmh0bWxGb3I9YzpXYS5oYXNPd25Qcm9wZXJ0eShkKT9hLnNldEF0dHJpYnV0ZShXYVtkXSxjKTpkLmxhc3RJbmRleE9mKCJhcmlhLSIsMCk9PTB8fGQubGFzdEluZGV4T2YoImRhdGEtIiwwKT09MD9hLnNldEF0dHJpYnV0ZShkLGMpOmFbZF09Y30pfSxXYT17Y2VsbHBhZGRpbmc6ImNlbGxQYWRkaW5nIixjZWxsc3BhY2luZzoiY2VsbFNwYWNpbmciLGNvbHNwYW46ImNvbFNwYW4iLGZyYW1lYm9yZGVyOiJmcmFtZUJvcmRlciIsaGVpZ2h0OiJoZWlnaHQiLG1heGxlbmd0aDoibWF4TGVuZ3RoIixub25jZToibm9uY2UiLHJvbGU6InJvbGUiLHJvd3NwYW46InJvd1NwYW4iLHR5cGU6InR5cGUiLHVzZW1hcDoidXNlTWFwIix2YWxpZ246InZBbGlnbiIsd2lkdGg6IndpZHRoIn0sWWE9ZnVuY3Rpb24oYSwKYixjKXtmdW5jdGlvbiBkKGspe2smJmIuYXBwZW5kQ2hpbGQodHlwZW9mIGs9PT0ic3RyaW5nIj9hLmNyZWF0ZVRleHROb2RlKGspOmspfWZvcih2YXIgZT0yO2U8Yy5sZW5ndGg7ZSsrKXt2YXIgZj1jW2VdO2lmKCFrYShmKXx8bShmKSYmZi5ub2RlVHlwZT4wKWQoZik7ZWxzZXthOntpZihmJiZ0eXBlb2YgZi5sZW5ndGg9PSJudW1iZXIiKXtpZihtKGYpKXt2YXIgaD10eXBlb2YgZi5pdGVtPT0iZnVuY3Rpb24ifHx0eXBlb2YgZi5pdGVtPT0ic3RyaW5nIjticmVhayBhfWlmKHR5cGVvZiBmPT09ImZ1bmN0aW9uIil7aD10eXBlb2YgZi5pdGVtPT0iZnVuY3Rpb24iO2JyZWFrIGF9fWg9ITF9d2EoaD95YShmKTpmLGQpfX19LFphPWZ1bmN0aW9uKGEsYil7Yj1TdHJpbmcoYik7YS5jb250ZW50VHlwZT09PSJhcHBsaWNhdGlvbi94aHRtbCt4bWwiJiYoYj1iLnRvTG93ZXJDYXNlKCkpO3JldHVybiBhLmNyZWF0ZUVsZW1lbnQoYil9LCRhPWZ1bmN0aW9uKGEpe2EmJmEucGFyZW50Tm9kZSYmCmEucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhKX0sYWI9ZnVuY3Rpb24oYSxiKXtpZighYXx8IWIpcmV0dXJuITE7aWYoYS5jb250YWlucyYmYi5ub2RlVHlwZT09MSlyZXR1cm4gYT09Ynx8YS5jb250YWlucyhiKTtpZih0eXBlb2YgYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiE9InVuZGVmaW5lZCIpcmV0dXJuIGE9PWJ8fCEhKGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24oYikmMTYpO2Zvcig7YiYmYSE9YjspYj1iLnBhcmVudE5vZGU7cmV0dXJuIGI9PWF9LGJiPWZ1bmN0aW9uKGEpe3AoYSwiTm9kZSBjYW5ub3QgYmUgbnVsbCBvciB1bmRlZmluZWQuIik7cmV0dXJuIGEubm9kZVR5cGU9PTk/YTphLm93bmVyRG9jdW1lbnR8fGEuZG9jdW1lbnR9LGNiPWZ1bmN0aW9uKGEsYil7Yj9hLnRhYkluZGV4PTA6KGEudGFiSW5kZXg9LTEsYS5yZW1vdmVBdHRyaWJ1dGUoInRhYkluZGV4IikpfSxkYj1mdW5jdGlvbihhKXtyZXR1cm4gYS5oYXNBdHRyaWJ1dGUoInRhYmluZGV4Iil9LGViPQpmdW5jdGlvbihhKXthPWEudGFiSW5kZXg7cmV0dXJuIHR5cGVvZiBhPT09Im51bWJlciImJmE+PTAmJmE8MzI3Njh9LGZiPWZ1bmN0aW9uKGEpe3RoaXMuZz1hfHxsLmRvY3VtZW50fHxkb2N1bWVudH07ZmIucHJvdG90eXBlLmk9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nO3JldHVybiB0eXBlb2YgYT09PSJzdHJpbmciP2IuZ2V0RWxlbWVudEJ5SWQoYSk6YX07ZmIucHJvdG90eXBlLmg9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXMuZyxlPWFyZ3VtZW50cyxmPWVbMV0saD1aYShkLFN0cmluZyhlWzBdKSk7ZiYmKHR5cGVvZiBmPT09InN0cmluZyI/aC5jbGFzc05hbWU9ZjpBcnJheS5pc0FycmF5KGYpP2guY2xhc3NOYW1lPWYuam9pbigiICIpOlhhKGgsZikpO2UubGVuZ3RoPjImJllhKGQsaCxlKTtyZXR1cm4gaH07dmFyIHc9ZnVuY3Rpb24oKXt0aGlzLmJhPXRoaXMuYmE7dGhpcy5rYT10aGlzLmthfTt3LnByb3RvdHlwZS5iYT0hMTt3LnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7dGhpcy5iYXx8KHRoaXMuYmE9ITAsdGhpcy5DKCkpfTt3LnByb3RvdHlwZVtTeW1ib2wuZGlzcG9zZV09ZnVuY3Rpb24oKXt0aGlzLmRpc3Bvc2UoKX07dy5wcm90b3R5cGUuQz1mdW5jdGlvbigpe2lmKHRoaXMua2EpZm9yKDt0aGlzLmthLmxlbmd0aDspdGhpcy5rYS5zaGlmdCgpKCl9O3ZhciB5PWZ1bmN0aW9uKGEsYil7dGhpcy50eXBlPWE7dGhpcy51PXRoaXMudGFyZ2V0PWI7dGhpcy5kZWZhdWx0UHJldmVudGVkPXRoaXMuQT0hMX07eS5wcm90b3R5cGUudj1mdW5jdGlvbigpe3RoaXMuQT0hMH07eS5wcm90b3R5cGUuaj1mdW5jdGlvbigpe3RoaXMuZGVmYXVsdFByZXZlbnRlZD0hMH07dmFyIGdiPWZ1bmN0aW9uKCl7aWYoIWwuYWRkRXZlbnRMaXN0ZW5lcnx8IU9iamVjdC5kZWZpbmVQcm9wZXJ0eSlyZXR1cm4hMTt2YXIgYT0hMSxiPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwicGFzc2l2ZSIse2dldDpmdW5jdGlvbigpe2E9ITB9fSk7dHJ5e3ZhciBjPWZ1bmN0aW9uKCl7fTtsLmFkZEV2ZW50TGlzdGVuZXIoInRlc3QiLGMsYik7bC5yZW1vdmVFdmVudExpc3RlbmVyKCJ0ZXN0IixjLGIpfWNhdGNoKGQpe31yZXR1cm4gYX0oKTt2YXIgej1mdW5jdGlvbihhLGIpe3kuY2FsbCh0aGlzLGE/YS50eXBlOiIiKTt0aGlzLnJlbGF0ZWRUYXJnZXQ9dGhpcy51PXRoaXMudGFyZ2V0PW51bGw7dGhpcy5idXR0b249dGhpcy5zY3JlZW5ZPXRoaXMuc2NyZWVuWD10aGlzLmNsaWVudFk9dGhpcy5jbGllbnRYPTA7dGhpcy5rZXk9IiI7dGhpcy5nPTA7dGhpcy5tZXRhS2V5PXRoaXMuc2hpZnRLZXk9dGhpcy5hbHRLZXk9dGhpcy5jdHJsS2V5PSExO3RoaXMuc3RhdGU9bnVsbDt0aGlzLkc9ITE7dGhpcy5wb2ludGVySWQ9MDt0aGlzLnBvaW50ZXJUeXBlPSIiO3RoaXMudGltZVN0YW1wPTA7dGhpcy5oPW51bGw7aWYoYSl7dmFyIGM9dGhpcy50eXBlPWEudHlwZSxkPWEuY2hhbmdlZFRvdWNoZXMmJmEuY2hhbmdlZFRvdWNoZXMubGVuZ3RoP2EuY2hhbmdlZFRvdWNoZXNbMF06bnVsbDt0aGlzLnRhcmdldD1hLnRhcmdldHx8YS5zcmNFbGVtZW50O3RoaXMudT1iO2I9YS5yZWxhdGVkVGFyZ2V0O2J8fChjPT0ibW91c2VvdmVyIj8KYj1hLmZyb21FbGVtZW50OmM9PSJtb3VzZW91dCImJihiPWEudG9FbGVtZW50KSk7dGhpcy5yZWxhdGVkVGFyZ2V0PWI7ZD8odGhpcy5jbGllbnRYPWQuY2xpZW50WCE9PXZvaWQgMD9kLmNsaWVudFg6ZC5wYWdlWCx0aGlzLmNsaWVudFk9ZC5jbGllbnRZIT09dm9pZCAwP2QuY2xpZW50WTpkLnBhZ2VZLHRoaXMuc2NyZWVuWD1kLnNjcmVlblh8fDAsdGhpcy5zY3JlZW5ZPWQuc2NyZWVuWXx8MCk6KHRoaXMuY2xpZW50WD1hLmNsaWVudFghPT12b2lkIDA/YS5jbGllbnRYOmEucGFnZVgsdGhpcy5jbGllbnRZPWEuY2xpZW50WSE9PXZvaWQgMD9hLmNsaWVudFk6YS5wYWdlWSx0aGlzLnNjcmVlblg9YS5zY3JlZW5YfHwwLHRoaXMuc2NyZWVuWT1hLnNjcmVlbll8fDApO3RoaXMuYnV0dG9uPWEuYnV0dG9uO3RoaXMuZz1hLmtleUNvZGV8fDA7dGhpcy5rZXk9YS5rZXl8fCIiO3RoaXMuY3RybEtleT1hLmN0cmxLZXk7dGhpcy5hbHRLZXk9YS5hbHRLZXk7dGhpcy5zaGlmdEtleT1hLnNoaWZ0S2V5Owp0aGlzLm1ldGFLZXk9YS5tZXRhS2V5O3RoaXMuRz12P2EubWV0YUtleTphLmN0cmxLZXk7dGhpcy5wb2ludGVySWQ9YS5wb2ludGVySWR8fDA7dGhpcy5wb2ludGVyVHlwZT1hLnBvaW50ZXJUeXBlO3RoaXMuc3RhdGU9YS5zdGF0ZTt0aGlzLnRpbWVTdGFtcD1hLnRpbWVTdGFtcDt0aGlzLmg9YTthLmRlZmF1bHRQcmV2ZW50ZWQmJnoubC5qLmNhbGwodGhpcyl9fTtuKHoseSk7ei5wcm90b3R5cGUudj1mdW5jdGlvbigpe3oubC52LmNhbGwodGhpcyk7dGhpcy5oLnN0b3BQcm9wYWdhdGlvbj90aGlzLmguc3RvcFByb3BhZ2F0aW9uKCk6dGhpcy5oLmNhbmNlbEJ1YmJsZT0hMH07ei5wcm90b3R5cGUuaj1mdW5jdGlvbigpe3oubC5qLmNhbGwodGhpcyk7dmFyIGE9dGhpcy5oO2EucHJldmVudERlZmF1bHQ/YS5wcmV2ZW50RGVmYXVsdCgpOmEucmV0dXJuVmFsdWU9ITF9O3ZhciBoYj0iY2xvc3VyZV9saXN0ZW5hYmxlXyIrKE1hdGgucmFuZG9tKCkqMUU2fDApLGliPWZ1bmN0aW9uKGEpe3JldHVybiEoIWF8fCFhW2hiXSl9O3ZhciBqYj0wO3ZhciBrYj1mdW5jdGlvbihhLGIsYyxkLGUpe3RoaXMubGlzdGVuZXI9YTt0aGlzLnByb3h5PW51bGw7dGhpcy5zcmM9Yjt0aGlzLnR5cGU9Yzt0aGlzLmNhcHR1cmU9ISFkO3RoaXMucGE9ZTt0aGlzLmtleT0rK2piO3RoaXMuamE9dGhpcy5vYT0hMX0sbGI9ZnVuY3Rpb24oYSl7YS5qYT0hMDthLmxpc3RlbmVyPW51bGw7YS5wcm94eT1udWxsO2Euc3JjPW51bGw7YS5wYT1udWxsfTt2YXIgbWI9ZnVuY3Rpb24oYSl7dGhpcy5zcmM9YTt0aGlzLmc9e307dGhpcy5oPTB9O21iLnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZj1hLnRvU3RyaW5nKCk7YT10aGlzLmdbZl07YXx8KGE9dGhpcy5nW2ZdPVtdLHRoaXMuaCsrKTt2YXIgaD1uYihhLGIsZCxlKTtoPi0xPyhiPWFbaF0sY3x8KGIub2E9ITEpKTooYj1uZXcga2IoYix0aGlzLnNyYyxmLCEhZCxlKSxiLm9hPWMsYS5wdXNoKGIpKTtyZXR1cm4gYn07CnZhciBvYj1mdW5jdGlvbihhLGIpe3ZhciBjPWIudHlwZTtjIGluIGEuZyYmeGEoYS5nW2NdLGIpJiYobGIoYiksYS5nW2NdLmxlbmd0aD09MCYmKGRlbGV0ZSBhLmdbY10sYS5oLS0pKX0scGI9ZnVuY3Rpb24oYSxiLGMsZCxlKXthPWEuZ1tiLnRvU3RyaW5nKCldO2I9LTE7YSYmKGI9bmIoYSxjLGQsZSkpO3JldHVybiBiPi0xP2FbYl06bnVsbH0sbmI9ZnVuY3Rpb24oYSxiLGMsZCl7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDsrK2Upe3ZhciBmPWFbZV07aWYoIWYuamEmJmYubGlzdGVuZXI9PWImJmYuY2FwdHVyZT09ISFjJiZmLnBhPT1kKXJldHVybiBlfXJldHVybi0xfTt2YXIgcWI9ImNsb3N1cmVfbG1fIisoTWF0aC5yYW5kb20oKSoxRTZ8MCkscmI9e30sc2I9MCx1Yj1mdW5jdGlvbihhLGIsYyxkLGUpe2lmKGQmJmQub25jZSlyZXR1cm4gdGIoYSxiLGMsZCxlKTtpZihBcnJheS5pc0FycmF5KGIpKXtmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKyl1YihhLGJbZl0sYyxkLGUpO3JldHVybiBudWxsfWM9dmIoYyk7cmV0dXJuIGliKGEpP3diKGEsYixjLG0oZCk/ISFkLmNhcHR1cmU6ISFkLGUpOnhiKGEsYixjLCExLGQsZSl9LHhiPWZ1bmN0aW9uKGEsYixjLGQsZSxmKXtpZighYil0aHJvdyBFcnJvcigiSW52YWxpZCBldmVudCB0eXBlIik7dmFyIGg9bShlKT8hIWUuY2FwdHVyZTohIWUsaz15YihhKTtrfHwoYVtxYl09az1uZXcgbWIoYSkpO2M9ay5hZGQoYixjLGQsaCxmKTtpZihjLnByb3h5KXJldHVybiBjO2Q9emIoKTtjLnByb3h5PWQ7ZC5zcmM9YTtkLmxpc3RlbmVyPWM7aWYoYS5hZGRFdmVudExpc3RlbmVyKWdifHwoZT1oKSxlPT09dm9pZCAwJiYKKGU9ITEpLGEuYWRkRXZlbnRMaXN0ZW5lcihiLnRvU3RyaW5nKCksZCxlKTtlbHNlIGlmKGEuYXR0YWNoRXZlbnQpYS5hdHRhY2hFdmVudChBYihiLnRvU3RyaW5nKCkpLGQpO2Vsc2UgaWYoYS5hZGRMaXN0ZW5lciYmYS5yZW1vdmVMaXN0ZW5lcilwKGI9PT0iY2hhbmdlIiwiTWVkaWFRdWVyeUxpc3Qgb25seSBoYXMgYSBjaGFuZ2UgZXZlbnQiKSxhLmFkZExpc3RlbmVyKGQpO2Vsc2UgdGhyb3cgRXJyb3IoImFkZEV2ZW50TGlzdGVuZXIgYW5kIGF0dGFjaEV2ZW50IGFyZSB1bmF2YWlsYWJsZS4iKTtzYisrO3JldHVybiBjfSx6Yj1mdW5jdGlvbigpe3ZhciBhPUJiLGI9ZnVuY3Rpb24oYyl7cmV0dXJuIGEuY2FsbChiLnNyYyxiLmxpc3RlbmVyLGMpfTtyZXR1cm4gYn0sdGI9ZnVuY3Rpb24oYSxiLGMsZCxlKXtpZihBcnJheS5pc0FycmF5KGIpKXtmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKyl0YihhLGJbZl0sYyxkLGUpO3JldHVybiBudWxsfWM9dmIoYyk7cmV0dXJuIGliKGEpPwphLkEuYWRkKFN0cmluZyhiKSxjLCEwLG0oZCk/ISFkLmNhcHR1cmU6ISFkLGUpOnhiKGEsYixjLCEwLGQsZSl9LENiPWZ1bmN0aW9uKGEsYixjLGQsZSl7aWYoQXJyYXkuaXNBcnJheShiKSlmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKylDYihhLGJbZl0sYyxkLGUpO2Vsc2UgZD1tKGQpPyEhZC5jYXB0dXJlOiEhZCxjPXZiKGMpLGliKGEpPyhhPWEuQSxiPVN0cmluZyhiKS50b1N0cmluZygpLGIgaW4gYS5nJiYoZj1hLmdbYl0sYz1uYihmLGMsZCxlKSxjPi0xJiYobGIoZltjXSkscChmLmxlbmd0aCE9bnVsbCksQXJyYXkucHJvdG90eXBlLnNwbGljZS5jYWxsKGYsYywxKSxmLmxlbmd0aD09MCYmKGRlbGV0ZSBhLmdbYl0sYS5oLS0pKSkpOmEmJihhPXliKGEpKSYmKGM9cGIoYSxiLGMsZCxlKSkmJkEoYyl9LEE9ZnVuY3Rpb24oYSl7aWYodHlwZW9mIGEhPT0ibnVtYmVyIiYmYSYmIWEuamEpe3ZhciBiPWEuc3JjO2lmKGliKGIpKW9iKGIuQSxhKTtlbHNle3ZhciBjPWEudHlwZSwKZD1hLnByb3h5O2IucmVtb3ZlRXZlbnRMaXN0ZW5lcj9iLnJlbW92ZUV2ZW50TGlzdGVuZXIoYyxkLGEuY2FwdHVyZSk6Yi5kZXRhY2hFdmVudD9iLmRldGFjaEV2ZW50KEFiKGMpLGQpOmIuYWRkTGlzdGVuZXImJmIucmVtb3ZlTGlzdGVuZXImJmIucmVtb3ZlTGlzdGVuZXIoZCk7c2ItLTsoYz15YihiKSk/KG9iKGMsYSksYy5oPT0wJiYoYy5zcmM9bnVsbCxiW3FiXT1udWxsKSk6bGIoYSl9fX0sQWI9ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW4gcmI/cmJbYV06cmJbYV09Im9uIithfSxCYj1mdW5jdGlvbihhLGIpe2lmKGEuamEpYT0hMDtlbHNle2I9bmV3IHooYix0aGlzKTt2YXIgYz1hLmxpc3RlbmVyLGQ9YS5wYXx8YS5zcmM7YS5vYSYmQShhKTthPWMuY2FsbChkLGIpfXJldHVybiBhfSx5Yj1mdW5jdGlvbihhKXthPWFbcWJdO3JldHVybiBhIGluc3RhbmNlb2YgbWI/YTpudWxsfSxEYj0iX19jbG9zdXJlX2V2ZW50c19mbl8iKyhNYXRoLnJhbmRvbSgpKjFFOT4+PjApLHZiPWZ1bmN0aW9uKGEpe3AoYSwKIkxpc3RlbmVyIGNhbiBub3QgYmUgbnVsbC4iKTtpZih0eXBlb2YgYT09PSJmdW5jdGlvbiIpcmV0dXJuIGE7cChhLmhhbmRsZUV2ZW50LCJBbiBvYmplY3QgbGlzdGVuZXIgbXVzdCBoYXZlIGhhbmRsZUV2ZW50IG1ldGhvZC4iKTthW0RiXXx8KGFbRGJdPWZ1bmN0aW9uKGIpe3JldHVybiBhLmhhbmRsZUV2ZW50KGIpfSk7cmV0dXJuIGFbRGJdfTt2YXIgRWI9ZnVuY3Rpb24oYSl7dy5jYWxsKHRoaXMpO3RoaXMuaD1hO3RoaXMuZz17fX07bihFYix3KTsKdmFyIEZiPVtdLEI9ZnVuY3Rpb24oYSxiLGMsZCl7QXJyYXkuaXNBcnJheShjKXx8KGMmJihGYlswXT1jLnRvU3RyaW5nKCkpLGM9RmIpO2Zvcih2YXIgZT0wO2U8Yy5sZW5ndGg7ZSsrKXt2YXIgZj11YihiLGNbZV0sZHx8YS5oYW5kbGVFdmVudCwhMSxhLmh8fGEpO2lmKCFmKWJyZWFrO2EuZ1tmLmtleV09Zn1yZXR1cm4gYX0sQz1mdW5jdGlvbihhLGIsYyxkLGUsZil7aWYoQXJyYXkuaXNBcnJheShjKSlmb3IodmFyIGg9MDtoPGMubGVuZ3RoO2grKylDKGEsYixjW2hdLGQsZSxmKTtlbHNlIGQ9ZHx8YS5oYW5kbGVFdmVudCxlPW0oZSk/ISFlLmNhcHR1cmU6ISFlLGY9Znx8YS5ofHxhLGQ9dmIoZCksZT0hIWUsYz1pYihiKT9wYihiLkEsU3RyaW5nKGMpLGQsZSxmKTpiPyhiPXliKGIpKT9wYihiLGMsZCxlLGYpOm51bGw6bnVsbCxjJiYoQShjKSxkZWxldGUgYS5nW2Mua2V5XSk7cmV0dXJuIGF9LEdiPWZ1bmN0aW9uKGEpe0JhKGEuZyxmdW5jdGlvbihiLGMpe3RoaXMuZy5oYXNPd25Qcm9wZXJ0eShjKSYmCkEoYil9LGEpO2EuZz17fX07RWIucHJvdG90eXBlLkM9ZnVuY3Rpb24oKXtFYi5sLkMuY2FsbCh0aGlzKTtHYih0aGlzKX07RWIucHJvdG90eXBlLmhhbmRsZUV2ZW50PWZ1bmN0aW9uKCl7dGhyb3cgRXJyb3IoIkV2ZW50SGFuZGxlci5oYW5kbGVFdmVudCBub3QgaW1wbGVtZW50ZWQiKTt9O3ZhciBEPWZ1bmN0aW9uKCl7dy5jYWxsKHRoaXMpO3RoaXMuQT1uZXcgbWIodGhpcyk7dGhpcy5ZYT10aGlzO3RoaXMubGE9bnVsbH07bihELHcpO0QucHJvdG90eXBlW2hiXT0hMDtELnByb3RvdHlwZS5BYT1mdW5jdGlvbihhKXt0aGlzLmxhPWF9O0QucHJvdG90eXBlLnJlbW92ZUV2ZW50TGlzdGVuZXI9ZnVuY3Rpb24oYSxiLGMsZCl7Q2IodGhpcyxhLGIsYyxkKX07CnZhciBFPWZ1bmN0aW9uKGEsYil7SGIoYSk7dmFyIGM9YS5sYTtpZihjKXt2YXIgZD1bXTtmb3IodmFyIGU9MTtjO2M9Yy5sYSlkLnB1c2goYykscCgrK2U8MUUzLCJpbmZpbml0ZSBsb29wIil9YT1hLllhO2M9Yi50eXBlfHxiO3R5cGVvZiBiPT09InN0cmluZyI/Yj1uZXcgeShiLGEpOmIgaW5zdGFuY2VvZiB5P2IudGFyZ2V0PWIudGFyZ2V0fHxhOihlPWIsYj1uZXcgeShjLGEpLEdhKGIsZSkpO2U9ITA7dmFyIGY7aWYoZClmb3IoZj1kLmxlbmd0aC0xOyFiLkEmJmY+PTA7Zi0tKXt2YXIgaD1iLnU9ZFtmXTtlPUliKGgsYywhMCxiKSYmZX1iLkF8fChoPWIudT1hLGU9SWIoaCxjLCEwLGIpJiZlLGIuQXx8KGU9SWIoaCxjLCExLGIpJiZlKSk7aWYoZClmb3IoZj0wOyFiLkEmJmY8ZC5sZW5ndGg7ZisrKWg9Yi51PWRbZl0sZT1JYihoLGMsITEsYikmJmU7cmV0dXJuIGV9OwpELnByb3RvdHlwZS5DPWZ1bmN0aW9uKCl7RC5sLkMuY2FsbCh0aGlzKTtpZih0aGlzLkEpe3ZhciBhPXRoaXMuQSxiPTAsYztmb3IoYyBpbiBhLmcpe2Zvcih2YXIgZD1hLmdbY10sZT0wO2U8ZC5sZW5ndGg7ZSsrKSsrYixsYihkW2VdKTtkZWxldGUgYS5nW2NdO2EuaC0tfX10aGlzLmxhPW51bGx9O3ZhciB3Yj1mdW5jdGlvbihhLGIsYyxkLGUpe0hiKGEpO3JldHVybiBhLkEuYWRkKFN0cmluZyhiKSxjLCExLGQsZSl9LEliPWZ1bmN0aW9uKGEsYixjLGQpe2I9YS5BLmdbU3RyaW5nKGIpXTtpZighYilyZXR1cm4hMDtiPWIuY29uY2F0KCk7Zm9yKHZhciBlPSEwLGY9MDtmPGIubGVuZ3RoOysrZil7dmFyIGg9YltmXTtpZihoJiYhaC5qYSYmaC5jYXB0dXJlPT1jKXt2YXIgaz1oLmxpc3RlbmVyLHE9aC5wYXx8aC5zcmM7aC5vYSYmb2IoYS5BLGgpO2U9ay5jYWxsKHEsZCkhPT0hMSYmZX19cmV0dXJuIGUmJiFkLmRlZmF1bHRQcmV2ZW50ZWR9LEhiPWZ1bmN0aW9uKGEpe3AoYS5BLCJFdmVudCB0YXJnZXQgaXMgbm90IGluaXRpYWxpemVkLiBEaWQgeW91IGNhbGwgdGhlIHN1cGVyY2xhc3MgKGdvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0KSBjb25zdHJ1Y3Rvcj8iKX07dmFyIEpiPXQ/Ik1velVzZXJTZWxlY3QiOnV8fFZhPyJXZWJraXRVc2VyU2VsZWN0IjpudWxsLEtiPWZ1bmN0aW9uKGEsYil7Yj1iP251bGw6YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpO2lmKEpiJiYoYS5zdHlsZSYmKGEuc3R5bGVbSmJdPSJub25lIiksYikpZm9yKHZhciBjPTA7YT1iW2NdO2MrKylhLnN0eWxlJiYoYS5zdHlsZVtKYl09Im5vbmUiKX07dmFyIExiPWZ1bmN0aW9uKCl7fTtpYShMYik7TGIucHJvdG90eXBlLmc9MDt2YXIgRj1mdW5jdGlvbihhKXtELmNhbGwodGhpcyk7dGhpcy5HPWF8fHBhfHwocGE9bmV3IGZiKTt0aGlzLnphPU1iO3RoaXMuWT1udWxsO3RoaXMucz0hMTt0aGlzLmc9bnVsbDt0aGlzLk09dm9pZCAwO3RoaXMudT10aGlzLmo9dGhpcy5oPW51bGw7dGhpcy5TYT0hMX07bihGLEQpO0YucHJvdG90eXBlLlphPUxiLlYoKTsKdmFyIE1iPW51bGwsTmI9ZnVuY3Rpb24oYSxiKXtzd2l0Y2goYSl7Y2FzZSAxOnJldHVybiBiPyJkaXNhYmxlIjoiZW5hYmxlIjtjYXNlIDI6cmV0dXJuIGI/ImhpZ2hsaWdodCI6InVuaGlnaGxpZ2h0IjtjYXNlIDQ6cmV0dXJuIGI/ImFjdGl2YXRlIjoiZGVhY3RpdmF0ZSI7Y2FzZSA4OnJldHVybiBiPyJzZWxlY3QiOiJ1bnNlbGVjdCI7Y2FzZSAxNjpyZXR1cm4gYj8iY2hlY2siOiJ1bmNoZWNrIjtjYXNlIDMyOnJldHVybiBiPyJmb2N1cyI6ImJsdXIiO2Nhc2UgNjQ6cmV0dXJuIGI/Im9wZW4iOiJjbG9zZSJ9dGhyb3cgRXJyb3IoIkludmFsaWQgY29tcG9uZW50IHN0YXRlIik7fSxPYj1mdW5jdGlvbihhKXtyZXR1cm4gYS5ZfHwoYS5ZPSI6IisoYS5aYS5nKyspLnRvU3RyaW5nKDM2KSl9LFBiPWZ1bmN0aW9uKGEsYil7aWYoYS5oJiZhLmgudSl7dmFyIGM9YS5oLnUsZD1hLlk7ZCBpbiBjJiZkZWxldGUgY1tkXTtEYShhLmgudSxiLGEpfWEuWT1ifTtGLnByb3RvdHlwZS5pPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ307CnZhciBRYj1mdW5jdGlvbihhKXthLk18fChhLk09bmV3IEViKGEpKTtyZXR1cm4gcChhLk0pfTtGLnByb3RvdHlwZS5BYT1mdW5jdGlvbihhKXtpZih0aGlzLmgmJnRoaXMuaCE9YSl0aHJvdyBFcnJvcigiTWV0aG9kIG5vdCBzdXBwb3J0ZWQiKTtGLmwuQWEuY2FsbCh0aGlzLGEpfTtGLnByb3RvdHlwZS5tYT1mdW5jdGlvbigpe3RoaXMuZz1aYSh0aGlzLkcuZywiRElWIil9O0YucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbihhKXtSYih0aGlzLGEpfTsKdmFyIFJiPWZ1bmN0aW9uKGEsYixjKXtpZihhLnMpdGhyb3cgRXJyb3IoIkNvbXBvbmVudCBhbHJlYWR5IHJlbmRlcmVkIik7YS5nfHxhLm1hKCk7Yj9iLmluc2VydEJlZm9yZShhLmcsY3x8bnVsbCk6YS5HLmcuYm9keS5hcHBlbmRDaGlsZChhLmcpO2EuaCYmIWEuaC5zfHxhLkkoKX0sU2I9ZnVuY3Rpb24oYSxiKXtpZihhLnMpdGhyb3cgRXJyb3IoIkNvbXBvbmVudCBhbHJlYWR5IHJlbmRlcmVkIik7aWYoYiYmYS53YShiKSl7YS5TYT0hMDt2YXIgYz1iYihiKTthLkcmJmEuRy5nPT1jfHwoYS5HPWI/bmV3IGZiKGJiKGIpKTpwYXx8KHBhPW5ldyBmYikpO2EuRWEoYik7YS5JKCl9ZWxzZSB0aHJvdyBFcnJvcigiSW52YWxpZCBlbGVtZW50IHRvIGRlY29yYXRlIik7fTtnPUYucHJvdG90eXBlO2cud2E9ZnVuY3Rpb24oKXtyZXR1cm4hMH07Zy5FYT1mdW5jdGlvbihhKXt0aGlzLmc9YX07CmcuST1mdW5jdGlvbigpe3RoaXMucz0hMDtUYih0aGlzLGZ1bmN0aW9uKGEpeyFhLnMmJmEuaSgpJiZhLkkoKX0pfTtnLlU9ZnVuY3Rpb24oKXtUYih0aGlzLGZ1bmN0aW9uKGEpe2EucyYmYS5VKCl9KTt0aGlzLk0mJkdiKHRoaXMuTSk7dGhpcy5zPSExfTtnLkM9ZnVuY3Rpb24oKXt0aGlzLnMmJnRoaXMuVSgpO3RoaXMuTSYmKHRoaXMuTS5kaXNwb3NlKCksZGVsZXRlIHRoaXMuTSk7VGIodGhpcyxmdW5jdGlvbihhKXthLmRpc3Bvc2UoKX0pOyF0aGlzLlNhJiZ0aGlzLmcmJiRhKHRoaXMuZyk7dGhpcy5oPXRoaXMuZz10aGlzLnU9dGhpcy5qPW51bGw7Ri5sLkMuY2FsbCh0aGlzKX07Zy5CYT1mdW5jdGlvbihhLGIpe3RoaXMuQ2EoYSxIKHRoaXMpLGIpfTsKZy5DYT1mdW5jdGlvbihhLGIsYyl7cCghIWEsIlByb3ZpZGVkIGVsZW1lbnQgbXVzdCBub3QgYmUgbnVsbC4iKTtpZihhLnMmJihjfHwhdGhpcy5zKSl0aHJvdyBFcnJvcigiQ29tcG9uZW50IGFscmVhZHkgcmVuZGVyZWQiKTtpZihiPDB8fGI+SCh0aGlzKSl0aHJvdyBFcnJvcigiQ2hpbGQgY29tcG9uZW50IGluZGV4IG91dCBvZiBib3VuZHMiKTt0aGlzLnUmJnRoaXMuanx8KHRoaXMudT17fSx0aGlzLmo9W10pO2lmKGEuaD09dGhpcyl7dmFyIGQ9dGhpcy51LGU9T2IoYSk7ZFtlXT1hO3hhKHRoaXMuaixhKX1lbHNlIERhKHRoaXMudSxPYihhKSxhKTtpZihhPT10aGlzKXRocm93IEVycm9yKCJVbmFibGUgdG8gc2V0IHBhcmVudCBjb21wb25lbnQiKTtpZihkPXRoaXMmJmEuaCYmYS5ZKWU9YS5oLGQ9YS5ZLGUudSYmZD8oZT1lLnUsZD0oZSE9PW51bGwmJmQgaW4gZT9lW2RdOnZvaWQgMCl8fG51bGwpOmQ9bnVsbDtpZihkJiZhLmghPXRoaXMpdGhyb3cgRXJyb3IoIlVuYWJsZSB0byBzZXQgcGFyZW50IGNvbXBvbmVudCIpOwphLmg9dGhpcztGLmwuQWEuY2FsbChhLHRoaXMpO3phKHRoaXMuaixiLDAsYSk7YS5zJiZ0aGlzLnMmJmEuaD09dGhpcz8oYz10aGlzLm5hKCksKGMuY2hpbGROb2Rlc1tiXXx8bnVsbCkhPWEuaSgpJiYoYS5pKCkucGFyZW50RWxlbWVudD09YyYmYy5yZW1vdmVDaGlsZChhLmkoKSksYj1jLmNoaWxkTm9kZXNbYl18fG51bGwsYy5pbnNlcnRCZWZvcmUoYS5pKCksYikpKTpjPyh0aGlzLmd8fHRoaXMubWEoKSxiPUkodGhpcyxiKzEpLFJiKGEsdGhpcy5uYSgpLGI/Yi5nOm51bGwpKTp0aGlzLnMmJiFhLnMmJmEuZyYmYS5nLnBhcmVudE5vZGUmJmEuZy5wYXJlbnROb2RlLm5vZGVUeXBlPT0xJiZhLkkoKX07Zy5uYT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmd9Owp2YXIgVWI9ZnVuY3Rpb24oYSl7aWYoYS56YT09bnVsbCl7dmFyIGI9YS5zP2EuZzphLkcuZy5ib2R5O2E6e3ZhciBjPWJiKGIpO2lmKGMuZGVmYXVsdFZpZXcmJmMuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSYmKGM9Yy5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKGIsbnVsbCkpKXtjPWMuZGlyZWN0aW9ufHxjLmdldFByb3BlcnR5VmFsdWUoImRpcmVjdGlvbiIpfHwiIjticmVhayBhfWM9IiJ9YS56YT0icnRsIj09KGN8fChiLmN1cnJlbnRTdHlsZT9iLmN1cnJlbnRTdHlsZS5kaXJlY3Rpb246bnVsbCl8fGIuc3R5bGUmJmIuc3R5bGUuZGlyZWN0aW9uKX1yZXR1cm4gYS56YX0sSD1mdW5jdGlvbihhKXtyZXR1cm4gYS5qP2Euai5sZW5ndGg6MH0sST1mdW5jdGlvbihhLGIpe3JldHVybiBhLmo/YS5qW2JdfHxudWxsOm51bGx9LFRiPWZ1bmN0aW9uKGEsYixjKXthLmomJmEuai5mb3JFYWNoKGIsYyl9LFZiPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuaiYmYj9hLmouaW5kZXhPZihiKToKLTF9O3ZhciBXYj17bWI6ImFjdGl2ZWRlc2NlbmRhbnQiLHJiOiJhdG9taWMiLHNiOiJhdXRvY29tcGxldGUiLHViOiJidXN5Iix4YjoiY2hlY2tlZCIseWI6ImNvbGluZGV4IixEYjoiY29udHJvbHMiLEViOiJjdXJyZW50IixHYjoiZGVzY3JpYmVkYnkiLEpiOiJkaXNhYmxlZCIsTGI6ImRyb3BlZmZlY3QiLE1iOiJleHBhbmRlZCIsTmI6ImZsb3d0byIsUGI6ImdyYWJiZWQiLFRiOiJoYXNwb3B1cCIsVmI6ImhpZGRlbiIsWGI6ImludmFsaWQiLFliOiJsYWJlbCIsWmI6ImxhYmVsbGVkYnkiLGFjOiJsZXZlbCIsZmM6ImxpdmUiLHZjOiJtdWx0aWxpbmUiLHdjOiJtdWx0aXNlbGVjdGFibGUiLEFjOiJvcmllbnRhdGlvbiIsQmM6Im93bnMiLENjOiJwb3NpbnNldCIsRWM6InByZXNzZWQiLEljOiJyZWFkb25seSIsS2M6InJlbGV2YW50IixMYzoicmVxdWlyZWQiLFBjOiJyb3dpbmRleCIsU2M6InNlbGVjdGVkIixVYzoic2V0c2l6ZSIsV2M6InNvcnQiLG1kOiJ2YWx1ZW1heCIsbmQ6InZhbHVlbWluIiwKb2Q6InZhbHVlbm93IixwZDoidmFsdWV0ZXh0In07dmFyIFhiO3ZhciBZYj17bmI6ImFsZXJ0IixvYjoiYWxlcnRkaWFsb2ciLHBiOiJhcHBsaWNhdGlvbiIscWI6ImFydGljbGUiLHRiOiJiYW5uZXIiLHZiOiJidXR0b24iLHdiOiJjaGVja2JveCIsemI6ImNvbHVtbmhlYWRlciIsQWI6ImNvbWJvYm94IixCYjoiY29tcGxlbWVudGFyeSIsQ2I6ImNvbnRlbnRpbmZvIixGYjoiZGVmaW5pdGlvbiIsSGI6ImRpYWxvZyIsSWI6ImRpcmVjdG9yeSIsS2I6ImRvY3VtZW50IixPYjoiZm9ybSIsUWI6ImdyaWQiLFJiOiJncmlkY2VsbCIsU2I6Imdyb3VwIixVYjoiaGVhZGluZyIsV2I6ImltZyIsYmM6ImxpbmsiLGNjOiJsaXN0IixkYzoibGlzdGJveCIsZWM6Imxpc3RpdGVtIixoYzoibG9nIixpYzoibWFpbiIsamM6Im1hcnF1ZWUiLGtjOiJtYXRoIixsYzoibWVudSIsbWM6Im1lbnViYXIiLG5jOiJtZW51aXRlbSIsb2M6Im1lbnVpdGVtY2hlY2tib3giLHBjOiJtZW51aXRlbXJhZGlvIix4YzoibmF2aWdhdGlvbiIseWM6Im5vdGUiLHpjOiJvcHRpb24iLApEYzoicHJlc2VudGF0aW9uIixGYzoicHJvZ3Jlc3NiYXIiLEdjOiJyYWRpbyIsSGM6InJhZGlvZ3JvdXAiLEpjOiJyZWdpb24iLE1jOiJyb3ciLE5jOiJyb3dncm91cCIsT2M6InJvd2hlYWRlciIsUWM6InNjcm9sbGJhciIsUmM6InNlYXJjaCIsVGM6InNlcGFyYXRvciIsVmM6InNsaWRlciIsWGM6InNwaW5idXR0b24iLFljOiJzdGF0dXMiLFpjOiJzd2l0Y2giLGFkOiJ0YWIiLGJkOiJ0YWJsaXN0IixjZDoidGFicGFuZWwiLGRkOiJ0ZXh0Ym94IixlZDoidGV4dGluZm8iLGZkOiJ0aW1lciIsZ2Q6InRvb2xiYXIiLGhkOiJ0b29sdGlwIixqZDoidHJlZSIsa2Q6InRyZWVncmlkIixsZDoidHJlZWl0ZW0ifTt2YXIgWmI9ZnVuY3Rpb24oYSxiKXtiPyhwKENhKFliLGIpLCJObyBzdWNoIEFSSUEgcm9sZSAiK2IpLGEuc2V0QXR0cmlidXRlKCJyb2xlIixiKSk6YS5yZW1vdmVBdHRyaWJ1dGUoInJvbGUiKX0sYWM9ZnVuY3Rpb24oYSxiLGMpe0FycmF5LmlzQXJyYXkoYykmJihjPWMuam9pbigiICIpKTt2YXIgZD0kYihiKTtjPT09IiJ8fGM9PXZvaWQgMD8oWGJ8fChjPXt9LFhiPShjLmF0b21pYz0hMSxjLmF1dG9jb21wbGV0ZT0ibm9uZSIsYy5kcm9wZWZmZWN0PSJub25lIixjLmhhc3BvcHVwPSExLGMubGl2ZT0ib2ZmIixjLm11bHRpbGluZT0hMSxjLm11bHRpc2VsZWN0YWJsZT0hMSxjLm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIsYy5yZWFkb25seT0hMSxjLnJlbGV2YW50PSJhZGRpdGlvbnMgdGV4dCIsYy5yZXF1aXJlZD0hMSxjLnNvcnQ9Im5vbmUiLGMuYnVzeT0hMSxjLmRpc2FibGVkPSExLGMuaGlkZGVuPSExLGMuaW52YWxpZD0iZmFsc2UiLGMpKSxjPVhiLGIgaW4gYz9hLnNldEF0dHJpYnV0ZShkLApjW2JdKTphLnJlbW92ZUF0dHJpYnV0ZShkKSk6YS5zZXRBdHRyaWJ1dGUoZCxjKX0sJGI9ZnVuY3Rpb24oYSl7cChhLCJBUklBIGF0dHJpYnV0ZSBjYW5ub3QgYmUgZW1wdHkuIik7cChDYShXYixhKSwiTm8gc3VjaCBBUklBIGF0dHJpYnV0ZSAiK2EpO3JldHVybiJhcmlhLSIrYX07dmFyIGRjPWZ1bmN0aW9uKGEsYixjLGQsZSxmKXtpZih2JiZlKXJldHVybiBiYyhhKTtpZihlJiYhZClyZXR1cm4hMTtpZighdCl7dHlwZW9mIGI9PT0ibnVtYmVyIiYmKGI9Y2MoYikpO3ZhciBoPWI9PTE3fHxiPT0xOHx8diYmYj09OTE7aWYoKCFjfHx2KSYmaHx8diYmYj09MTYmJihkfHxmKSlyZXR1cm4hMX1pZih1JiZkJiZjKXN3aXRjaChhKXtjYXNlIDIyMDpjYXNlIDIxOTpjYXNlIDIyMTpjYXNlIDE5MjpjYXNlIDE4NjpjYXNlIDE4OTpjYXNlIDE4NzpjYXNlIDE4ODpjYXNlIDE5MDpjYXNlIDE5MTpjYXNlIDE5MjpjYXNlIDIyMjpyZXR1cm4hMX1zd2l0Y2goYSl7Y2FzZSAxMzpyZXR1cm4gdD9mfHxlPyExOiEoYyYmZCk6ITA7Y2FzZSAyNzpyZXR1cm4hdSYmIXR9cmV0dXJuIHQmJihkfHxlfHxmKT8hMTpiYyhhKX0sYmM9ZnVuY3Rpb24oYSl7aWYoYT49NDgmJmE8PTU3fHxhPj05NiYmYTw9MTA2fHxhPj02NSYmYTw9OTB8fHUmJmE9PTApcmV0dXJuITA7c3dpdGNoKGEpe2Nhc2UgMzI6Y2FzZSA0MzpjYXNlIDYzOmNhc2UgNjQ6Y2FzZSAxMDc6Y2FzZSAxMDk6Y2FzZSAxMTA6Y2FzZSAxMTE6Y2FzZSAxODY6Y2FzZSA1OTpjYXNlIDE4OTpjYXNlIDE4NzpjYXNlIDYxOmNhc2UgMTg4OmNhc2UgMTkwOmNhc2UgMTkxOmNhc2UgMTkyOmNhc2UgMjIyOmNhc2UgMjE5OmNhc2UgMjIwOmNhc2UgMjIxOmNhc2UgMTYzOmNhc2UgNTg6cmV0dXJuITA7CmNhc2UgMTczOmNhc2UgMTcxOnJldHVybiB0O2RlZmF1bHQ6cmV0dXJuITF9fSxjYz1mdW5jdGlvbihhKXtpZih0KWE9ZWMoYSk7ZWxzZSBpZih2JiZ1KXN3aXRjaChhKXtjYXNlIDkzOmE9OTF9cmV0dXJuIGF9LGVjPWZ1bmN0aW9uKGEpe3N3aXRjaChhKXtjYXNlIDYxOnJldHVybiAxODc7Y2FzZSA1OTpyZXR1cm4gMTg2O2Nhc2UgMTczOnJldHVybiAxODk7Y2FzZSAyMjQ6cmV0dXJuIDkxO2Nhc2UgMDpyZXR1cm4gMjI0O2RlZmF1bHQ6cmV0dXJuIGF9fTt2YXIgZmM9ZnVuY3Rpb24oYSxiLGMsZCl7ei5jYWxsKHRoaXMsZCk7dGhpcy50eXBlPSJrZXkiO3RoaXMuZz1hO3RoaXMucmVwZWF0PWN9O24oZmMseik7dmFyIEo9ZnVuY3Rpb24oYSxiKXtELmNhbGwodGhpcyk7YSYmZ2ModGhpcyxhLGIpfTtuKEosRCk7Zz1KLnByb3RvdHlwZTtnLlI9bnVsbDtnLnFhPW51bGw7Zy5KYT1udWxsO2cucmE9bnVsbDtnLkY9LTE7Zy5LPS0xO2cuRGE9ITE7CnZhciBoYz17MzoxMywxMjoxNDQsNjMyMzI6MzgsNjMyMzM6NDAsNjMyMzQ6MzcsNjMyMzU6MzksNjMyMzY6MTEyLDYzMjM3OjExMyw2MzIzODoxMTQsNjMyMzk6MTE1LDYzMjQwOjExNiw2MzI0MToxMTcsNjMyNDI6MTE4LDYzMjQzOjExOSw2MzI0NDoxMjAsNjMyNDU6MTIxLDYzMjQ2OjEyMiw2MzI0NzoxMjMsNjMyNDg6NDQsNjMyNzI6NDYsNjMyNzM6MzYsNjMyNzU6MzUsNjMyNzY6MzMsNjMyNzc6MzQsNjMyODk6MTQ0LDYzMzAyOjQ1fSxpYz17VXA6MzgsRG93bjo0MCxMZWZ0OjM3LFJpZ2h0OjM5LEVudGVyOjEzLEYxOjExMixGMjoxMTMsRjM6MTE0LEY0OjExNSxGNToxMTYsRjY6MTE3LEY3OjExOCxGODoxMTksRjk6MTIwLEYxMDoxMjEsRjExOjEyMixGMTI6MTIzLCJVKzAwN0YiOjQ2LEhvbWU6MzYsRW5kOjM1LFBhZ2VVcDozMyxQYWdlRG93bjozNCxJbnNlcnQ6NDV9LGpjPXYmJnQ7CkoucHJvdG90eXBlLmc9ZnVuY3Rpb24oYSl7dSYmKHRoaXMuRj09MTcmJiFhLmN0cmxLZXl8fHRoaXMuRj09MTgmJiFhLmFsdEtleXx8diYmdGhpcy5GPT05MSYmIWEubWV0YUtleSkmJih0aGlzLks9dGhpcy5GPS0xKTt0aGlzLkY9PS0xJiYoYS5jdHJsS2V5JiZhLmchPTE3P3RoaXMuRj0xNzphLmFsdEtleSYmYS5nIT0xOD90aGlzLkY9MTg6YS5tZXRhS2V5JiZhLmchPTkxJiYodGhpcy5GPTkxKSk7ZGMoYS5nLHRoaXMuRixhLnNoaWZ0S2V5LGEuY3RybEtleSxhLmFsdEtleSxhLm1ldGFLZXkpPyh0aGlzLks9Y2MoYS5nKSxqYyYmKHRoaXMuRGE9YS5hbHRLZXkpKTp0aGlzLmhhbmRsZUV2ZW50KGEpfTtKLnByb3RvdHlwZS5oPWZ1bmN0aW9uKGEpe3RoaXMuSz10aGlzLkY9LTE7dGhpcy5EYT1hLmFsdEtleX07CkoucHJvdG90eXBlLmhhbmRsZUV2ZW50PWZ1bmN0aW9uKGEpe3ZhciBiPWEuaCxjPWIuYWx0S2V5O2lmKHUmJmEudHlwZT09ImtleXByZXNzIil7dmFyIGQ9dGhpcy5LO3ZhciBlPWIuY2hhckNvZGU+PTAmJmIuY2hhckNvZGU8NjMyMzImJmJjKGQpP2IuY2hhckNvZGU6MH1lbHNlIGEudHlwZT09ImtleXByZXNzIj8oamMmJihjPXRoaXMuRGEpLGIua2V5Q29kZT09Yi5jaGFyQ29kZT9iLmtleUNvZGU8MzI/KGQ9Yi5rZXlDb2RlLGU9MCk6KGQ9dGhpcy5LLGU9Yi5jaGFyQ29kZSk6KGQ9Yi5rZXlDb2RlfHx0aGlzLkssZT1iLmNoYXJDb2RlfHwwKSk6KGQ9Yi5rZXlDb2RlfHx0aGlzLkssZT1iLmNoYXJDb2RlfHwwKSx2JiZlPT02MyYmZD09MjI0JiYoZD0xOTEpO3ZhciBmPWQ9Y2MoZCk7ZD9kPj02MzIzMiYmZCBpbiBoYz9mPWhjW2RdOmQ9PTI1JiZhLnNoaWZ0S2V5JiYoZj05KTpiLmtleUlkZW50aWZpZXImJmIua2V5SWRlbnRpZmllciBpbiBpYyYmKGY9aWNbYi5rZXlJZGVudGlmaWVyXSk7CmlmKCF0fHxhLnR5cGUhPSJrZXlwcmVzcyJ8fGRjKGYsdGhpcy5GLGEuc2hpZnRLZXksYS5jdHJsS2V5LGMsYS5tZXRhS2V5KSlhPWY9PXRoaXMuRix0aGlzLkY9ZixiPW5ldyBmYyhmLGUsYSxiKSxiLmFsdEtleT1jLEUodGhpcyxiKX07Si5wcm90b3R5cGUuaT1mdW5jdGlvbigpe3JldHVybiB0aGlzLlJ9O3ZhciBnYz1mdW5jdGlvbihhLGIsYyl7YS5yYSYma2MoYSk7YS5SPWI7YS5xYT11YihhLlIsImtleXByZXNzIixhLGMpO2EuSmE9dWIoYS5SLCJrZXlkb3duIixhLmcsYyxhKTthLnJhPXViKGEuUiwia2V5dXAiLGEuaCxjLGEpfSxrYz1mdW5jdGlvbihhKXthLnFhJiYoQShhLnFhKSxBKGEuSmEpLEEoYS5yYSksYS5xYT1udWxsLGEuSmE9bnVsbCxhLnJhPW51bGwpO2EuUj1udWxsO2EuRj0tMTthLks9LTF9O0oucHJvdG90eXBlLkM9ZnVuY3Rpb24oKXtKLmwuQy5jYWxsKHRoaXMpO2tjKHRoaXMpfTt2YXIgSz17Z2E6Im1vdXNlZG93biIsaGE6Im1vdXNldXAiLGZhOiJtb3VzZWNhbmNlbCIsc2M6Im1vdXNlbW92ZSIsdWM6Im1vdXNlb3ZlciIsdGM6Im1vdXNlb3V0IixxYzoibW91c2VlbnRlciIscmM6Im1vdXNlbGVhdmUifTt2YXIgbGM9ZnVuY3Rpb24oYSl7cmV0dXJuIHR5cGVvZiBhLmNsYXNzTmFtZT09InN0cmluZyI/YS5jbGFzc05hbWU6YS5nZXRBdHRyaWJ1dGUmJmEuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIn0sTD1mdW5jdGlvbihhKXtyZXR1cm4gYS5jbGFzc0xpc3Q/YS5jbGFzc0xpc3Q6bGMoYSkubWF0Y2goL1xTKy9nKXx8W119LG1jPWZ1bmN0aW9uKGEsYil7dHlwZW9mIGEuY2xhc3NOYW1lPT0ic3RyaW5nIj9hLmNsYXNzTmFtZT1iOmEuc2V0QXR0cmlidXRlJiZhLnNldEF0dHJpYnV0ZSgiY2xhc3MiLGIpfSxuYz1mdW5jdGlvbihhLGIpe2EuY2xhc3NMaXN0P2I9YS5jbGFzc0xpc3QuY29udGFpbnMoYik6KGE9TChhKSxiPXZhKGEsYik+PTApO3JldHVybiBifSxvYz1mdW5jdGlvbihhLGIpe2lmKGEuY2xhc3NMaXN0KWEuY2xhc3NMaXN0LmFkZChiKTtlbHNlIGlmKCFuYyhhLGIpKXt2YXIgYz1sYyhhKTttYyhhLGMrKGMubGVuZ3RoPjA/IiAiK2I6YikpfX0scGM9ZnVuY3Rpb24oYSxiKXtpZihhLmNsYXNzTGlzdClBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGIsCmZ1bmN0aW9uKGUpe29jKGEsZSl9KTtlbHNle3ZhciBjPXt9O0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoTChhKSxmdW5jdGlvbihlKXtjW2VdPSEwfSk7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChiLGZ1bmN0aW9uKGUpe2NbZV09ITB9KTtiPSIiO2Zvcih2YXIgZCBpbiBjKWIrPWIubGVuZ3RoPjA/IiAiK2Q6ZDttYyhhLGIpfX0scWM9ZnVuY3Rpb24oYSxiKXthLmNsYXNzTGlzdD9hLmNsYXNzTGlzdC5yZW1vdmUoYik6bmMoYSxiKSYmbWMoYSxBcnJheS5wcm90b3R5cGUuZmlsdGVyLmNhbGwoTChhKSxmdW5jdGlvbihjKXtyZXR1cm4gYyE9Yn0pLmpvaW4oIiAiKSl9LHJjPWZ1bmN0aW9uKGEsYil7YS5jbGFzc0xpc3Q/QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChiLGZ1bmN0aW9uKGMpe3FjKGEsYyl9KTptYyhhLEFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbChMKGEpLGZ1bmN0aW9uKGMpe3JldHVybiEodmEoYixjKT49MCl9KS5qb2luKCIgIikpfTt2YXIgdGM9ZnVuY3Rpb24oYSxiKXtpZighYSl0aHJvdyBFcnJvcigiSW52YWxpZCBjbGFzcyBuYW1lICIrYSk7aWYodHlwZW9mIGIhPT0iZnVuY3Rpb24iKXRocm93IEVycm9yKCJJbnZhbGlkIGRlY29yYXRvciBmdW5jdGlvbiAiK2IpO3NjW2FdPWJ9LHVjPXt9LHNjPXt9O3ZhciB2Yz1mdW5jdGlvbihhKXt0aGlzLkE9YX07aWEodmMpO3ZhciB3Yz1mdW5jdGlvbihhLGIpe2EmJihhLnRhYkluZGV4PWI/MDotMSl9LHljPWZ1bmN0aW9uKGEsYixjKXtjLmlkJiZQYihiLGMuaWQpO3ZhciBkPWEuZygpLGU9ITEsZj1MKGMpO2YmJkFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoZixmdW5jdGlvbihoKXtoPT1kP2U9ITA6aCYmdGhpcy51KGIsaCxkKX0sYSk7ZXx8b2MoYyxkKTt4YyhiLGMpO3JldHVybiBjfTt2Yy5wcm90b3R5cGUudT1mdW5jdGlvbihhLGIsYyl7Yj09YysiLWRpc2FibGVkIj9hLlgoITEpOmI9PWMrIi1ob3Jpem9udGFsIj96YyhhLCJob3Jpem9udGFsIik6Yj09YysiLXZlcnRpY2FsIiYmemMoYSwidmVydGljYWwiKX07CnZhciB4Yz1mdW5jdGlvbihhLGIpe2lmKGIpZm9yKHZhciBjPWIuZmlyc3RDaGlsZCxkO2MmJmMucGFyZW50Tm9kZT09Yjspe2Q9Yy5uZXh0U2libGluZztpZihjLm5vZGVUeXBlPT0xKXthOnt2YXIgZT1jO3AoZSk7ZT1MKGUpO2Zvcih2YXIgZj1lLmxlbmd0aCxoPTA7aDxmO2grKyl7dmFyIGs9ZVtoXTtpZihrPWsgaW4gc2M/c2Nba10oKTpudWxsKXtlPWs7YnJlYWsgYX19ZT1udWxsfWUmJihlLmc9YyxhLmlzRW5hYmxlZCgpfHxlLlgoITEpLGEuQmEoZSksU2IoZSxjKSl9ZWxzZSBjLm5vZGVWYWx1ZSYmSGEoYy5ub2RlVmFsdWUpIT0iInx8Yi5yZW1vdmVDaGlsZChjKTtjPWR9fSxBYz1mdW5jdGlvbihhLGIpe2I9Yi5pKCk7cChiLCJUaGUgY29udGFpbmVyIERPTSBlbGVtZW50IGNhbm5vdCBiZSBudWxsLiIpO0tiKGIsdCk7KGE9YS5BKSYmWmIoYixhKX07dmMucHJvdG90eXBlLmc9ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy1jb250YWluZXIifTsKdmMucHJvdG90eXBlLmo9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nKCksYz1bYixhLkw9PSJob3Jpem9udGFsIj9iKyItaG9yaXpvbnRhbCI6YisiLXZlcnRpY2FsIl07YS5pc0VuYWJsZWQoKXx8Yy5wdXNoKGIrIi1kaXNhYmxlZCIpO3JldHVybiBjfTt2YXIgQmM9ZnVuY3Rpb24oKXt9O3ZhciBNPWZ1bmN0aW9uKCl7fSxDYztpYShNKTt2YXIgRGM9e2J1dHRvbjoicHJlc3NlZCIsY2hlY2tib3g6ImNoZWNrZWQiLG1lbnVpdGVtOiJzZWxlY3RlZCIsbWVudWl0ZW1jaGVja2JveDoiY2hlY2tlZCIsbWVudWl0ZW1yYWRpbzoiY2hlY2tlZCIscmFkaW86ImNoZWNrZWQiLHRhYjoic2VsZWN0ZWQiLHRyZWVpdGVtOiJzZWxlY3RlZCJ9O00ucHJvdG90eXBlLk5hPWZ1bmN0aW9uKCl7fTtNLnByb3RvdHlwZS54YT1mdW5jdGlvbihhKXt2YXIgYj1hLkcsYz1iLmgsZD10aGlzLk4oKSxlPVtkXSxmPXRoaXMuTigpO2YhPWQmJmUucHVzaChmKTtkPWEubTtmb3IoZj1bXTtkOyl7dmFyIGg9ZCYtZDtmLnB1c2goRWModGhpcyxoKSk7ZCY9fmh9ZS5wdXNoLmFwcGx5KGUsZik7KGQ9YS5GYSkmJmUucHVzaC5hcHBseShlLGQpO3JldHVybiBjLmNhbGwoYiwiRElWIixlLmpvaW4oIiAiKSxhLmlhKX07Ck0ucHJvdG90eXBlLnlhPWZ1bmN0aW9uKGEsYil7Yi5pZCYmUGIoYSxiLmlkKTtiJiZiLmZpcnN0Q2hpbGQ/RmMoYSxiLmZpcnN0Q2hpbGQubmV4dFNpYmxpbmc/eWEoYi5jaGlsZE5vZGVzKTpiLmZpcnN0Q2hpbGQpOmEuaWE9bnVsbDt2YXIgYz0wLGQ9dGhpcy5OKCksZT10aGlzLk4oKSxmPSExLGg9ITEsaz15YShMKGIpKTtrLmZvckVhY2goZnVuY3Rpb24ocSl7Znx8cSE9ZD9ofHxxIT1lP2N8PUdjKHRoaXMscSk6aD0hMDooZj0hMCxlPT1kJiYoaD0hMCkpO0djKHRoaXMscSk9PTEmJihzYShiKSxkYihiKSYmZWIoYikmJmNiKGIsITEpKX0sdGhpcyk7YS5tPWM7Znx8KGsucHVzaChkKSxlPT1kJiYoaD0hMCkpO2h8fGsucHVzaChlKTsoYT1hLkZhKSYmay5wdXNoLmFwcGx5KGssYSk7ZiYmaCYmIWF8fG1jKGIsay5qb2luKCIgIikpO3JldHVybiBifTsKdmFyIEhjPWZ1bmN0aW9uKGEsYil7aWYoYT1hLk5hKCkpe3AoYiwiVGhlIGVsZW1lbnQgcGFzc2VkIGFzIGEgZmlyc3QgcGFyYW1ldGVyIGNhbm5vdCBiZSBudWxsLiIpO3ZhciBjPWIuZ2V0QXR0cmlidXRlKCJyb2xlIil8fG51bGw7YSE9YyYmWmIoYixhKX19LEljPWZ1bmN0aW9uKGEsYil7dmFyIGM7aWYoYS5EJjMyJiYoYz1hLmkoKSkpe2lmKCFiJiZhLm0mMzIpe3RyeXtjLmJsdXIoKX1jYXRjaChkKXt9YS5tJjMyJiZhLlFhKG51bGwpfShkYihjKSYmZWIoYykpIT1iJiZjYihjLGIpfX0sSmM9ZnVuY3Rpb24oYSxiLGMpe0NjfHwoQ2M9ezE6ImRpc2FibGVkIiw4OiJzZWxlY3RlZCIsMTY6ImNoZWNrZWQiLDY0OiJleHBhbmRlZCJ9KTtwKGEsIlRoZSBlbGVtZW50IHBhc3NlZCBhcyBhIGZpcnN0IHBhcmFtZXRlciBjYW5ub3QgYmUgbnVsbC4iKTtiPUNjW2JdO3ZhciBkPWEuZ2V0QXR0cmlidXRlKCJyb2xlIil8fG51bGw7ZCYmKGQ9RGNbZF18fGIsYj1iPT0iY2hlY2tlZCJ8fGI9PQoic2VsZWN0ZWQiP2Q6Yik7YiYmYWMoYSxiLGMpfTtNLnByb3RvdHlwZS5OPWZ1bmN0aW9uKCl7cmV0dXJuImdvb2ctY29udHJvbCJ9O3ZhciBFYz1mdW5jdGlvbihhLGIpe2EuZ3x8S2MoYSk7cmV0dXJuIGEuZ1tiXX0sR2M9ZnVuY3Rpb24oYSxiKXthLmh8fChhLmd8fEtjKGEpLGEuaD1FYShhLmcpKTthPXBhcnNlSW50KGEuaFtiXSwxMCk7cmV0dXJuIGlzTmFOKGEpPzA6YX0sS2M9ZnVuY3Rpb24oYSl7dmFyIGI9YS5OKCk7dmFyIGM9Yi5yZXBsYWNlKC9ceGEwfFxzL2csIiAiKS5pbmRleE9mKCIgIikhPS0xO3AoIWMsIkNvbnRyb2xSZW5kZXJlciBoYXMgYW4gaW52YWxpZCBjc3MgY2xhc3M6ICciK2IrIiciKTthLmc9ezE6YisiLWRpc2FibGVkIiwyOmIrIi1ob3ZlciIsNDpiKyItYWN0aXZlIiw4OmIrIi1zZWxlY3RlZCIsMTY6YisiLWNoZWNrZWQiLDMyOmIrIi1mb2N1c2VkIiw2NDpiKyItb3BlbiJ9fTt2YXIgTj1mdW5jdGlvbihhLGIsYyl7Ri5jYWxsKHRoaXMsYyk7aWYoIWIpe2ZvcihiPXRoaXMuY29uc3RydWN0b3I7Yjspe3ZhciBkPW5hKGIpO2lmKGQ9dWNbZF0pYnJlYWs7Yj0oYj1PYmplY3QuZ2V0UHJvdG90eXBlT2YoYi5wcm90b3R5cGUpKSYmYi5jb25zdHJ1Y3Rvcn1iPWQ/dHlwZW9mIGQuVj09PSJmdW5jdGlvbiI/ZC5WKCk6bmV3IGQ6bnVsbH10aGlzLnY9Yjt0aGlzLmlhPWEhPT12b2lkIDA/YTpudWxsfTtuKE4sRik7Zz1OLnByb3RvdHlwZTtnLmlhPW51bGw7Zy5tPTA7Zy5EPTM5O2cuUD0wO2cuT2E9ITA7Zy5GYT1udWxsO2cuSGE9ITA7Zy5tYT1mdW5jdGlvbigpe3ZhciBhPXRoaXMudi54YSh0aGlzKTt0aGlzLmc9YTtIYyh0aGlzLnYsYSk7S2IoYSwhMCk7dGhpcy5pc1Zpc2libGUoKXx8KGEuc3R5bGUuZGlzcGxheT0ibm9uZSIsYSYmYWMoYSwiaGlkZGVuIiwhMCkpfTtnLm5hPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaSgpfTtnLndhPWZ1bmN0aW9uKCl7cmV0dXJuITB9OwpnLkVhPWZ1bmN0aW9uKGEpe3RoaXMuZz1hPXRoaXMudi55YSh0aGlzLGEpO0hjKHRoaXMudixhKTtLYihhLCEwKTt0aGlzLk9hPWEuc3R5bGUuZGlzcGxheSE9Im5vbmUifTsKZy5JPWZ1bmN0aW9uKCl7Ti5sLkkuY2FsbCh0aGlzKTt2YXIgYT10aGlzLmc7cChhLCJDYW4gbm90IGNhbGwgZ2V0RWxlbWVudFN0cmljdCBiZWZvcmUgcmVuZGVyaW5nL2RlY29yYXRpbmcuIik7cCh0aGlzKTtwKGEpO3RoaXMuaXNWaXNpYmxlKCl8fGFjKGEsImhpZGRlbiIsIXRoaXMuaXNWaXNpYmxlKCkpO3RoaXMuaXNFbmFibGVkKCl8fEpjKGEsMSwhdGhpcy5pc0VuYWJsZWQoKSk7dGhpcy5EJjgmJkpjKGEsOCwhISh0aGlzLm0mOCkpO3RoaXMuRCYxNiYmSmMoYSwxNiwhISh0aGlzLm0mMTYpKTt0aGlzLkQmNjQmJkpjKGEsNjQsISEodGhpcy5tJjY0KSk7dmFyIGI9dGhpcy52O1ViKHRoaXMpJiYoYT10aGlzLmkoKSxiPWIuTigpKyItcnRsIiwoYT1hLmk/YS5pKCk6YSkmJnBjKGEsW2JdKSk7dGhpcy5pc0VuYWJsZWQoKSYmSWModGhpcyx0aGlzLmlzVmlzaWJsZSgpKTt0aGlzLkQmLTImJih0aGlzLkhhJiZMYyh0aGlzLCEwKSx0aGlzLkQmMzImJihhPXRoaXMuaSgpKSkmJihiPQp0aGlzLlp8fCh0aGlzLlo9bmV3IEopLGdjKGIsYSksQihCKEIoUWIodGhpcyksYiwia2V5Iix0aGlzLmFhKSxhLCJmb2N1cyIsdGhpcy5YYSksYSwiYmx1ciIsdGhpcy5RYSkpfTt2YXIgTGM9ZnVuY3Rpb24oYSxiKXt2YXIgYz1RYihhKSxkPWEuaSgpO2I/KEIoQihCKEIoYyxkLEsuZ2EsYS5zYSksZCxbSy5oYSxLLmZhXSxhLnZhKSxkLCJtb3VzZW92ZXIiLGEudWEpLGQsIm1vdXNlb3V0IixhLnRhKSxhLmNhIT1CYyYmQihjLGQsImNvbnRleHRtZW51IixhLmNhKSk6KEMoQyhDKEMoYyxkLEsuZ2EsYS5zYSksZCxbSy5oYSxLLmZhXSxhLnZhKSxkLCJtb3VzZW92ZXIiLGEudWEpLGQsIm1vdXNlb3V0IixhLnRhKSxhLmNhIT1CYyYmQyhjLGQsImNvbnRleHRtZW51IixhLmNhKSl9O04ucHJvdG90eXBlLlU9ZnVuY3Rpb24oKXtOLmwuVS5jYWxsKHRoaXMpO3RoaXMuWiYma2ModGhpcy5aKTt0aGlzLmlzVmlzaWJsZSgpJiZ0aGlzLmlzRW5hYmxlZCgpJiZJYyh0aGlzLCExKX07Ck4ucHJvdG90eXBlLkM9ZnVuY3Rpb24oKXtOLmwuQy5jYWxsKHRoaXMpO3RoaXMuWiYmKHRoaXMuWi5kaXNwb3NlKCksZGVsZXRlIHRoaXMuWik7ZGVsZXRlIHRoaXMudjt0aGlzLkZhPXRoaXMuaWE9bnVsbH07dmFyIEZjPWZ1bmN0aW9uKGEsYil7YS5pYT1ifTtOLnByb3RvdHlwZS5pc1Zpc2libGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5PYX07Ti5wcm90b3R5cGUuaXNFbmFibGVkPWZ1bmN0aW9uKCl7cmV0dXJuISh0aGlzLm0mMSl9O04ucHJvdG90eXBlLlg9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5oO2ImJnR5cGVvZiBiLmlzRW5hYmxlZD09ImZ1bmN0aW9uIiYmIWIuaXNFbmFibGVkKCl8fCFPKHRoaXMsMSwhYSl8fChhfHwoTWModGhpcywhMSksUCh0aGlzLCExKSksdGhpcy5pc1Zpc2libGUoKSYmSWModGhpcyxhKSxUKHRoaXMsMSwhYSwhMCkpfTt2YXIgUD1mdW5jdGlvbihhLGIpe08oYSwyLGIpJiZUKGEsMixiKX07Ck4ucHJvdG90eXBlLmlzQWN0aXZlPWZ1bmN0aW9uKCl7cmV0dXJuISEodGhpcy5tJjQpfTsKdmFyIE1jPWZ1bmN0aW9uKGEsYil7TyhhLDQsYikmJlQoYSw0LGIpfSxOYz1mdW5jdGlvbihhLGIpe08oYSw4LGIpJiZUKGEsOCxiKX0sT2M9ZnVuY3Rpb24oYSxiKXtPKGEsNjQsYikmJlQoYSw2NCxiKX0sVD1mdW5jdGlvbihhLGIsYyxkKXtpZighZCYmYj09MSlhLlgoIWMpO2Vsc2UgaWYoYS5EJmImJmMhPSEhKGEubSZiKSl7dmFyIGU9YS52O2lmKGQ9YS5pKCkpe2lmKGU9RWMoZSxiKSl7dmFyIGY9YS5pP2EuaSgpOmE7ZiYmKGM/cGM6cmMpKGYsW2VdKX1KYyhkLGIsYyl9YS5tPWM/YS5tfGI6YS5tJn5ifX0sUGM9ZnVuY3Rpb24oYSxiLGMpe2lmKGEucyYmYS5tJmImJiFjKXRocm93IEVycm9yKCJDb21wb25lbnQgYWxyZWFkeSByZW5kZXJlZCIpOyFjJiZhLm0mYiYmVChhLGIsITEpO2EuRD1jP2EuRHxiOmEuRCZ+Yn0sVT1mdW5jdGlvbihhLGIpe3JldHVybiEhKDI1NSZiKSYmISEoYS5EJmIpfSxPPWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4hIShhLkQmYikmJiEhKGEubSZiKSE9CmMmJighKGEuUCZiKXx8RShhLE5iKGIsYykpKSYmIWEuYmF9O04ucHJvdG90eXBlLnVhPWZ1bmN0aW9uKGEpeyFRYyhhLHRoaXMuaSgpKSYmRSh0aGlzLCJlbnRlciIpJiZ0aGlzLmlzRW5hYmxlZCgpJiZVKHRoaXMsMikmJlAodGhpcywhMCl9O04ucHJvdG90eXBlLnRhPWZ1bmN0aW9uKGEpeyFRYyhhLHRoaXMuaSgpKSYmRSh0aGlzLCJsZWF2ZSIpJiYoVSh0aGlzLDQpJiZNYyh0aGlzLCExKSxVKHRoaXMsMikmJlAodGhpcywhMSkpfTtOLnByb3RvdHlwZS5jYT1CYzt2YXIgUWM9ZnVuY3Rpb24oYSxiKXtyZXR1cm4hIWEucmVsYXRlZFRhcmdldCYmYWIoYixhLnJlbGF0ZWRUYXJnZXQpfTsKTi5wcm90b3R5cGUuc2E9ZnVuY3Rpb24oYSl7aWYodGhpcy5pc0VuYWJsZWQoKSYmKFUodGhpcywyKSYmUCh0aGlzLCEwKSwhKGEuaC5idXR0b24hPTB8fHYmJmEuY3RybEtleSkpKXtVKHRoaXMsNCkmJk1jKHRoaXMsITApO3ZhciBiO2lmKGI9dGhpcy52KXt2YXIgYztiPXRoaXMuRCYzMiYmKGM9dGhpcy5pKCkpP2RiKGMpJiZlYihjKTohMX1iJiZ0aGlzLmkoKS5mb2N1cygpfWEuaC5idXR0b24hPTB8fHYmJmEuY3RybEtleXx8YS5qKCl9O04ucHJvdG90eXBlLnZhPWZ1bmN0aW9uKGEpe3RoaXMuaXNFbmFibGVkKCkmJihVKHRoaXMsMikmJlAodGhpcywhMCksdGhpcy5pc0FjdGl2ZSgpJiZSYyh0aGlzLGEpJiZVKHRoaXMsNCkmJk1jKHRoaXMsITEpKX07CnZhciBSYz1mdW5jdGlvbihhLGIpe2lmKFUoYSwxNikpe3ZhciBjPSEoYS5tJjE2KTtPKGEsMTYsYykmJlQoYSwxNixjKX1VKGEsOCkmJk5jKGEsITApO1UoYSw2NCkmJk9jKGEsIShhLm0mNjQpKTtjPW5ldyB5KCJhY3Rpb24iLGEpO2ImJihjLmFsdEtleT1iLmFsdEtleSxjLmN0cmxLZXk9Yi5jdHJsS2V5LGMubWV0YUtleT1iLm1ldGFLZXksYy5zaGlmdEtleT1iLnNoaWZ0S2V5LGMuRz1iLkcsYy50aW1lU3RhbXA9Yi50aW1lU3RhbXApO3JldHVybiBFKGEsYyl9O04ucHJvdG90eXBlLlhhPWZ1bmN0aW9uKCl7VSh0aGlzLDMyKSYmTyh0aGlzLDMyLCEwKSYmVCh0aGlzLDMyLCEwKX07Ti5wcm90b3R5cGUuUWE9ZnVuY3Rpb24oKXtVKHRoaXMsNCkmJk1jKHRoaXMsITEpO1UodGhpcywzMikmJk8odGhpcywzMiwhMSkmJlQodGhpcywzMiwhMSl9OwpOLnByb3RvdHlwZS5hYT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5pc1Zpc2libGUoKSYmdGhpcy5pc0VuYWJsZWQoKSYmYS5nPT0xMyYmUmModGhpcyxhKT8oYS5qKCksYS52KCksITApOiExfTtpZih0eXBlb2YgTiE9PSJmdW5jdGlvbiIpdGhyb3cgRXJyb3IoIkludmFsaWQgY29tcG9uZW50IGNsYXNzICIrTik7aWYodHlwZW9mIE0hPT0iZnVuY3Rpb24iKXRocm93IEVycm9yKCJJbnZhbGlkIHJlbmRlcmVyIGNsYXNzICIrTSk7dmFyIFNjPW5hKE4pO3VjW1NjXT1NO3RjKCJnb29nLWNvbnRyb2wiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBOKG51bGwpfSk7dmFyIFY9ZnVuY3Rpb24oYSxiLGMpe0YuY2FsbCh0aGlzLGMpO3RoaXMuZWE9Ynx8dmMuVigpO3RoaXMuTD1hfHwidmVydGljYWwifTtuKFYsRik7Zz1WLnByb3RvdHlwZTtnLkthPW51bGw7Zy5kYT1udWxsO2cuZWE9bnVsbDtnLkw9bnVsbDtnLlM9ITA7Zy5UPSEwO2cubz0tMTtnLkI9bnVsbDtnLlc9ITE7Zy5PPW51bGw7dmFyIFRjPWZ1bmN0aW9uKGEpe3JldHVybiBhLkthfHxhLmkoKX07Zz1WLnByb3RvdHlwZTtnLm1hPWZ1bmN0aW9uKCl7dGhpcy5nPXRoaXMuRy5oKCJESVYiLHRoaXMuZWEuaih0aGlzKS5qb2luKCIgIikpfTtnLm5hPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaSgpfTtnLndhPWZ1bmN0aW9uKGEpe3JldHVybiBhLnRhZ05hbWU9PSJESVYifTtnLkVhPWZ1bmN0aW9uKGEpe3RoaXMuZz15Yyh0aGlzLmVhLHRoaXMsYSk7YS5zdHlsZS5kaXNwbGF5PT0ibm9uZSImJih0aGlzLlM9ITEpfTsKZy5JPWZ1bmN0aW9uKCl7Vi5sLkkuY2FsbCh0aGlzKTtUYih0aGlzLGZ1bmN0aW9uKGIpe2IucyYmVWModGhpcyxiKX0sdGhpcyk7dmFyIGE9dGhpcy5pKCk7QWModGhpcy5lYSx0aGlzKTtWYyh0aGlzLHRoaXMuUyk7QihCKEIoQihCKEIoQihCKFFiKHRoaXMpLHRoaXMsImVudGVyIix0aGlzLmViKSx0aGlzLCJoaWdobGlnaHQiLHRoaXMuZmIpLHRoaXMsInVuaGlnaGxpZ2h0Iix0aGlzLmxiKSx0aGlzLCJvcGVuIix0aGlzLmdiKSx0aGlzLCJjbG9zZSIsdGhpcy5iYiksYSxLLmdhLHRoaXMuV2EpLGJiKGEpLFtLLmhhLEsuZmFdLHRoaXMuY2IpLGEsW0suZ2EsSy5oYSxLLmZhLCJtb3VzZW92ZXIiLCJtb3VzZW91dCIsImNvbnRleHRtZW51Il0sdGhpcy5hYik7V2ModGhpcyl9O3ZhciBXYz1mdW5jdGlvbihhKXt2YXIgYj1RYihhKSxjPVRjKGEpO0IoQihCKGIsYywiZm9jdXMiLGEuUGEpLGMsImJsdXIiLGEuVWEpLGEuZGF8fChhLmRhPW5ldyBKKFRjKGEpKSksImtleSIsYS5WYSl9OwpnPVYucHJvdG90eXBlO2cuVT1mdW5jdGlvbigpe1hjKHRoaXMsLTEpO3RoaXMuQiYmT2ModGhpcy5CLCExKTt0aGlzLlc9ITE7Vi5sLlUuY2FsbCh0aGlzKX07Zy5DPWZ1bmN0aW9uKCl7Vi5sLkMuY2FsbCh0aGlzKTt0aGlzLmRhJiYodGhpcy5kYS5kaXNwb3NlKCksdGhpcy5kYT1udWxsKTt0aGlzLmVhPXRoaXMuQj10aGlzLk89dGhpcy5LYT1udWxsfTtnLmViPWZ1bmN0aW9uKCl7cmV0dXJuITB9OwpnLmZiPWZ1bmN0aW9uKGEpe3ZhciBiPVZiKHRoaXMsYS50YXJnZXQpO2lmKGI+LTEmJmIhPXRoaXMubyl7dmFyIGM9SSh0aGlzLHRoaXMubyk7YyYmUChjLCExKTt0aGlzLm89YjtjPUkodGhpcyx0aGlzLm8pO3RoaXMuVyYmTWMoYywhMCk7dGhpcy5CJiZjIT10aGlzLkImJihjLkQmNjQ/T2MoYywhMCk6T2ModGhpcy5CLCExKSl9Yj10aGlzLmkoKTtwKGIsIlRoZSBET00gZWxlbWVudCBmb3IgdGhlIGNvbnRhaW5lciBjYW5ub3QgYmUgbnVsbC4iKTthLnRhcmdldC5pKCkhPW51bGwmJmFjKGIsImFjdGl2ZWRlc2NlbmRhbnQiLGEudGFyZ2V0LmkoKS5pZCl9O2cubGI9ZnVuY3Rpb24oYSl7YS50YXJnZXQ9PUkodGhpcyx0aGlzLm8pJiYodGhpcy5vPS0xKTthPXRoaXMuaSgpO3AoYSwiVGhlIERPTSBlbGVtZW50IGZvciB0aGUgY29udGFpbmVyIGNhbm5vdCBiZSBudWxsLiIpO2EucmVtb3ZlQXR0cmlidXRlKCRiKCJhY3RpdmVkZXNjZW5kYW50IikpfTsKZy5nYj1mdW5jdGlvbihhKXsoYT1hLnRhcmdldCkmJmEhPXRoaXMuQiYmYS5oPT10aGlzJiYodGhpcy5CJiZPYyh0aGlzLkIsITEpLHRoaXMuQj1hKX07Zy5iYj1mdW5jdGlvbihhKXthLnRhcmdldD09dGhpcy5CJiYodGhpcy5CPW51bGwpO3ZhciBiPXRoaXMuaSgpLGM9YS50YXJnZXQuaSgpO2ImJmEudGFyZ2V0Lm0mMiYmYyYmKGE9IiIsYyYmKGE9Yy5pZCxwKGEsIlRoZSBhY3RpdmUgZWxlbWVudCBzaG91bGQgaGF2ZSBhbiBpZC4iKSksYWMoYiwiYWN0aXZlZGVzY2VuZGFudCIsYSkpfTtnLldhPWZ1bmN0aW9uKGEpe3RoaXMuVCYmKHRoaXMuVz0hMCk7dmFyIGI9VGModGhpcyk7YiYmZGIoYikmJmViKGIpP2IuZm9jdXMoKTphLmooKX07Zy5jYj1mdW5jdGlvbigpe3RoaXMuVz0hMX07CmcuYWI9ZnVuY3Rpb24oYSl7YTp7dmFyIGI9YS50YXJnZXQ7aWYodGhpcy5PKWZvcih2YXIgYz10aGlzLmkoKTtiJiZiIT09Yzspe3ZhciBkPWIuaWQ7aWYoZCBpbiB0aGlzLk8pe2I9dGhpcy5PW2RdO2JyZWFrIGF9Yj1iLnBhcmVudE5vZGV9Yj1udWxsfWlmKGIpc3dpdGNoKGEudHlwZSl7Y2FzZSBLLmdhOmIuc2EoYSk7YnJlYWs7Y2FzZSBLLmhhOmNhc2UgSy5mYTpiLnZhKGEpO2JyZWFrO2Nhc2UgIm1vdXNlb3ZlciI6Yi51YShhKTticmVhaztjYXNlICJtb3VzZW91dCI6Yi50YShhKTticmVhaztjYXNlICJjb250ZXh0bWVudSI6Yi5jYShhKX19O2cuUGE9ZnVuY3Rpb24oKXt9O2cuVWE9ZnVuY3Rpb24oKXtYYyh0aGlzLC0xKTt0aGlzLlc9ITE7dGhpcy5CJiZPYyh0aGlzLkIsITEpfTsKZy5WYT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5pc0VuYWJsZWQoKSYmdGhpcy5pc1Zpc2libGUoKSYmKEgodGhpcykhPTB8fHRoaXMuS2EpJiZZYyh0aGlzLGEpPyhhLmooKSxhLnYoKSwhMCk6ITF9Owp2YXIgWWM9ZnVuY3Rpb24oYSxiKXt2YXIgYz1JKGEsYS5vKTtpZihjJiZ0eXBlb2YgYy5hYT09ImZ1bmN0aW9uIiYmYy5hYShiKXx8YS5CJiZhLkIhPWMmJnR5cGVvZiBhLkIuYWE9PSJmdW5jdGlvbiImJmEuQi5hYShiKSlyZXR1cm4hMDtpZihiLnNoaWZ0S2V5fHxiLmN0cmxLZXl8fGIubWV0YUtleXx8Yi5hbHRLZXkpcmV0dXJuITE7c3dpdGNoKGIuZyl7Y2FzZSAyNzpUYyhhKS5ibHVyKCk7YnJlYWs7Y2FzZSAzNjpaYyhhKTticmVhaztjYXNlIDM1OiRjKGEpO2JyZWFrO2Nhc2UgMzg6aWYoYS5MPT0idmVydGljYWwiKWFkKGEpO2Vsc2UgcmV0dXJuITE7YnJlYWs7Y2FzZSAzNzppZihhLkw9PSJob3Jpem9udGFsIilVYihhKT9iZChhKTphZChhKTtlbHNlIHJldHVybiExO2JyZWFrO2Nhc2UgNDA6aWYoYS5MPT0idmVydGljYWwiKWJkKGEpO2Vsc2UgcmV0dXJuITE7YnJlYWs7Y2FzZSAzOTppZihhLkw9PSJob3Jpem9udGFsIilVYihhKT9hZChhKTpiZChhKTtlbHNlIHJldHVybiExOwpicmVhaztkZWZhdWx0OnJldHVybiExfXJldHVybiEwfSxVYz1mdW5jdGlvbihhLGIpe3ZhciBjPWIuaSgpO2M9Yy5pZHx8KGMuaWQ9T2IoYikpO2EuT3x8KGEuTz17fSk7YS5PW2NdPWJ9O1YucHJvdG90eXBlLkJhPWZ1bmN0aW9uKGEsYil7dWEoYSxOLCJUaGUgY2hpbGQgb2YgYSBjb250YWluZXIgbXVzdCBiZSBhIGNvbnRyb2wiKTtWLmwuQmEuY2FsbCh0aGlzLGEsYil9O1YucHJvdG90eXBlLkNhPWZ1bmN0aW9uKGEsYixjKXt1YShhLE4pO2EuUHw9MjthLlB8PTY0O1BjKGEsMzIsITEpO2EucyYmMCE9YS5IYSYmTGMoYSwhMSk7YS5IYT0hMTt2YXIgZD1hLmg9PXRoaXM/VmIodGhpcyxhKTotMTtWLmwuQ2EuY2FsbCh0aGlzLGEsYixjKTthLnMmJnRoaXMucyYmVWModGhpcyxhKTthPWQ7YT09LTEmJihhPUgodGhpcykpO2E9PXRoaXMubz90aGlzLm89TWF0aC5taW4oSCh0aGlzKS0xLGIpOmE+dGhpcy5vJiZiPD10aGlzLm8/dGhpcy5vKys6YTx0aGlzLm8mJmI+dGhpcy5vJiZ0aGlzLm8tLX07CnZhciB6Yz1mdW5jdGlvbihhLGIpe2lmKGEuaSgpKXRocm93IEVycm9yKCJDb21wb25lbnQgYWxyZWFkeSByZW5kZXJlZCIpO2EuTD1ifTtWLnByb3RvdHlwZS5pc1Zpc2libGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5TfTt2YXIgVmM9ZnVuY3Rpb24oYSxiKXthLlM9Yjt2YXIgYz1hLmkoKTtjJiYoYy5zdHlsZS5kaXNwbGF5PWI/IiI6Im5vbmUiLHdjKFRjKGEpLGEuVCYmYS5TKSl9O1YucHJvdG90eXBlLmlzRW5hYmxlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLlR9O1YucHJvdG90eXBlLlg9ZnVuY3Rpb24oYSl7dGhpcy5UIT1hJiZFKHRoaXMsYT8iZW5hYmxlIjoiZGlzYWJsZSIpJiYoYT8odGhpcy5UPSEwLFRiKHRoaXMsZnVuY3Rpb24oYil7Yi5UYT9kZWxldGUgYi5UYTpiLlgoITApfSkpOihUYih0aGlzLGZ1bmN0aW9uKGIpe2IuaXNFbmFibGVkKCk/Yi5YKCExKTpiLlRhPSEwfSksdGhpcy5XPXRoaXMuVD0hMSksd2MoVGModGhpcyksYSYmdGhpcy5TKSl9Owp2YXIgWGM9ZnVuY3Rpb24oYSxiKXsoYj1JKGEsYikpP1AoYiwhMCk6YS5vPi0xJiZQKEkoYSxhLm8pLCExKX0sWmM9ZnVuY3Rpb24oYSl7Y2QoYSxmdW5jdGlvbihiLGMpe3JldHVybihiKzEpJWN9LEgoYSktMSl9LCRjPWZ1bmN0aW9uKGEpe2NkKGEsZnVuY3Rpb24oYixjKXtiLS07cmV0dXJuIGI8MD9jLTE6Yn0sMCl9LGJkPWZ1bmN0aW9uKGEpe2NkKGEsZnVuY3Rpb24oYixjKXtyZXR1cm4oYisxKSVjfSxhLm8pfSxhZD1mdW5jdGlvbihhKXtjZChhLGZ1bmN0aW9uKGIsYyl7Yi0tO3JldHVybiBiPDA/Yy0xOmJ9LGEubyl9LGNkPWZ1bmN0aW9uKGEsYixjKXtjPWM8MD9WYihhLGEuQik6Yzt2YXIgZD1IKGEpO2M9Yi5jYWxsKGEsYyxkKTtmb3IodmFyIGU9MDtlPD1kOyl7dmFyIGY9SShhLGMpO2lmKGYmJmYuaXNWaXNpYmxlKCkmJmYuaXNFbmFibGVkKCkmJmYuRCYyKXthLkxhKGMpO2JyZWFrfWUrKztjPWIuY2FsbChhLGMsZCl9fTsKVi5wcm90b3R5cGUuTGE9ZnVuY3Rpb24oYSl7WGModGhpcyxhKX07dmFyIGRkPWZ1bmN0aW9uKCl7fTtuKGRkLE0pO2lhKGRkKTtnPWRkLnByb3RvdHlwZTtnLk49ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy10YWIifTtnLk5hPWZ1bmN0aW9uKCl7cmV0dXJuInRhYiJ9O2cueGE9ZnVuY3Rpb24oYSl7dmFyIGI9ZGQubC54YS5jYWxsKHRoaXMsYSk7KGE9YS5HYSgpKSYmdGhpcy5NYShiLGEpO3JldHVybiBifTtnLnlhPWZ1bmN0aW9uKGEsYil7Yj1kZC5sLnlhLmNhbGwodGhpcyxhLGIpO3ZhciBjPXRoaXMuR2EoYik7YyYmKGEuUmE9Yyk7YS5tJjgmJihjPWEuaCkmJnR5cGVvZiBjLko9PT0iZnVuY3Rpb24iJiYoVChhLDgsITEpLGMuSihhKSk7cmV0dXJuIGJ9O2cuR2E9ZnVuY3Rpb24oYSl7cmV0dXJuIGEudGl0bGV8fCIifTtnLk1hPWZ1bmN0aW9uKGEsYil7YSYmKGEudGl0bGU9Ynx8IiIpfTt2YXIgZWQ9ZnVuY3Rpb24oYSxiLGMpe04uY2FsbCh0aGlzLGEsYnx8ZGQuVigpLGMpO1BjKHRoaXMsOCwhMCk7dGhpcy5QfD05fTtuKGVkLE4pO2VkLnByb3RvdHlwZS5HYT1mdW5jdGlvbigpe3JldHVybiB0aGlzLlJhfTtlZC5wcm90b3R5cGUuTWE9ZnVuY3Rpb24oYSl7dGhpcy52Lk1hKHRoaXMuaSgpLGEpO3RoaXMuUmE9YX07dGMoImdvb2ctdGFiIixmdW5jdGlvbigpe3JldHVybiBuZXcgZWQobnVsbCl9KTt2YXIgVz1mdW5jdGlvbigpe3RoaXMuQT0idGFibGlzdCJ9O24oVyx2Yyk7aWEoVyk7Vy5wcm90b3R5cGUuZz1mdW5jdGlvbigpe3JldHVybiJnb29nLXRhYi1iYXIifTtXLnByb3RvdHlwZS51PWZ1bmN0aW9uKGEsYixjKXt0aGlzLnZ8fCh0aGlzLmh8fGZkKHRoaXMpLHRoaXMudj1FYSh0aGlzLmgpKTt2YXIgZD10aGlzLnZbYl07ZD8oemMoYSxnZChkKSksYS52PWQpOlcubC51LmNhbGwodGhpcyxhLGIsYyl9O1cucHJvdG90eXBlLmo9ZnVuY3Rpb24oYSl7dmFyIGI9Vy5sLmouY2FsbCh0aGlzLGEpO3RoaXMuaHx8ZmQodGhpcyk7Yi5wdXNoKHRoaXMuaFthLnZdKTtyZXR1cm4gYn07dmFyIGZkPWZ1bmN0aW9uKGEpe3ZhciBiPWEuZygpO2EuaD17dG9wOmIrIi10b3AiLGJvdHRvbTpiKyItYm90dG9tIixzdGFydDpiKyItc3RhcnQiLGVuZDpiKyItZW5kIn19O3ZhciBYPWZ1bmN0aW9uKGEsYixjKXthPWF8fCJ0b3AiO3pjKHRoaXMsZ2QoYSkpO3RoaXMudj1hO1YuY2FsbCh0aGlzLHRoaXMuTCxifHxXLlYoKSxjKTtoZCh0aGlzKX07bihYLFYpO2c9WC5wcm90b3R5cGU7Zy5IPW51bGw7Zy5JPWZ1bmN0aW9uKCl7WC5sLkkuY2FsbCh0aGlzKTtoZCh0aGlzKX07Zy5DPWZ1bmN0aW9uKCl7WC5sLkMuY2FsbCh0aGlzKTt0aGlzLkg9bnVsbH07Zy5MYT1mdW5jdGlvbihhKXtYLmwuTGEuY2FsbCh0aGlzLGEpO3RoaXMuSihJKHRoaXMsYSkpfTtnLko9ZnVuY3Rpb24oYSl7YT9OYyhhLCEwKTp0aGlzLkgmJk5jKHRoaXMuSCwhMSl9Owp2YXIgaWQ9ZnVuY3Rpb24oYSxiKXtpZihiJiZiPT1hLkgpe2Zvcih2YXIgYz1WYihhLGIpLGQ9Yy0xO2I9SShhLGQpO2QtLSl7dmFyIGU9YjtpZihlLmlzVmlzaWJsZSgpJiZlLmlzRW5hYmxlZCgpKXthLkooYik7cmV0dXJufX1mb3IoYys9MTtiPUkoYSxjKTtjKyspaWYoZD1iLGQuaXNWaXNpYmxlKCkmJmQuaXNFbmFibGVkKCkpe2EuSihiKTtyZXR1cm59YS5KKG51bGwpfX07Zz1YLnByb3RvdHlwZTtnLmpiPWZ1bmN0aW9uKGEpe3RoaXMuSCYmdGhpcy5IIT1hLnRhcmdldCYmTmModGhpcy5ILCExKTt0aGlzLkg9YS50YXJnZXR9O2cua2I9ZnVuY3Rpb24oYSl7YS50YXJnZXQ9PXRoaXMuSCYmKHRoaXMuSD1udWxsKX07Zy5oYj1mdW5jdGlvbihhKXtpZCh0aGlzLGEudGFyZ2V0KX07Zy5pYj1mdW5jdGlvbihhKXtpZCh0aGlzLGEudGFyZ2V0KX07Zy5QYT1mdW5jdGlvbigpe0kodGhpcyx0aGlzLm8pfHxYYyh0aGlzLFZiKHRoaXMsdGhpcy5IfHxJKHRoaXMsMCkpKX07CnZhciBoZD1mdW5jdGlvbihhKXtCKEIoQihCKFFiKGEpLGEsInNlbGVjdCIsYS5qYiksYSwidW5zZWxlY3QiLGEua2IpLGEsImRpc2FibGUiLGEuaGIpLGEsImhpZGUiLGEuaWIpfSxnZD1mdW5jdGlvbihhKXtyZXR1cm4gYT09InN0YXJ0Inx8YT09ImVuZCI/InZlcnRpY2FsIjoiaG9yaXpvbnRhbCJ9O3RjKCJnb29nLXRhYi1iYXIiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBYfSk7ZnVuY3Rpb24gamQoYSl7dmFyIGI9e3RvcDoiYm90dG9tIixib3R0b206InRvcCIsc3RhcnQ6InJpZ2h0IixlbmQ6ImxlZnQifVthLmxvY2F0aW9uXSxjPWEuZWxlbWVudElkLGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTtkLnRleHRDb250ZW50PSJcbiAgICBmaWVsZHNldCB7XG4gICAgICBwYWRkaW5nOiAxMHB4O1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgIzM2OTtcbiAgICB9XG5cbiAgICAjIitjKyIgLmdvb2ctdGFiLWNvbnRlbnQge1xuICAgICAgbWluLWhlaWdodDogM2VtO1xuICAgICAgbWFyZ2luOiAwO1xuICAgICAgYm9yZGVyOiAiK2EuYm9yZGVyKyIgc29saWQgIithLmJvcmRlckNvbG9yKyI7XG4gICAgICBib3JkZXItdG9wOiAwO1xuICAgICAgaGVpZ2h0OiAiK2EuY29udGVudEhlaWdodCsiO1xuICAgICAgcGFkZGluZzogNHB4IDhweDtcbiAgICAgIG1hcmdpbi1yaWdodDogNHB4O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgIG92ZXJmbG93OiBhdXRvO1xuICAgIH1cblxuICAgICMiKwpjKyIgLmdvb2ctdGFiLWJhci0iK2EubG9jYXRpb24rIiAuZ29vZy10YWItc2VsZWN0ZWQge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICIrYS5ib3JkZXJDb2xvcisiO1xuICAgICAgYm9yZGVyLSIrYisiOiAwcHg7XG4gICAgfVxuXG4gICAgIyIrYysiIC5nb29nLXRhYi1iYXItIithLmxvY2F0aW9uKyIge1xuICAgICAgcGFkZGluZy0iK2EubG9jYXRpb24rIjogNXB4ICFpbXBvcnRhbnQ7XG4gICAgICBib3JkZXItIitiKyI6IDFweCBzb2xpZCAiK2EuYm9yZGVyQ29sb3IrIiAhaW1wb3J0YW50O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICB9XG5cbiAgICAjIitjKyIgLmdvb2ctdGFiLWJhciB7XG4gICAgICAgbWFyZ2luOiAwO1xuICAgICAgIGJvcmRlcjogMDtcbiAgICAgICBwYWRkaW5nOiAwO1xuICAgICAgIGxpc3Qtc3R5bGU6IG5vbmU7XG4gICAgICAgY3Vyc29yOiBkZWZhdWx0O1xuICAgICAgIG91dGxpbmU6IG5vbmU7XG4gICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgICBtYXJnaW4tcmlnaHQ6IDRweDtcbiAgICAgIH1cblxuICAgICAjIisKYysiIC5nb29nLXRhYiB7XG4gICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgIHBhZGRpbmc6IDRweCA4cHg7XG4gICAgICAgY29sb3I6IHZhcigtLWNvbGFiLXByaW1hcnktdGV4dC1jb2xvcik7XG4gICAgICAgdGV4dC1kZWNvcmF0aW9uOiBpbml0aWFsO1xuICAgICAgIGN1cnNvcjogZGVmYXVsdDtcbiAgICAgIH1cblxuICAgICAgIyIrYysiIC5nb29nLXRhYi1ob3ZlciB7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWNvbGFiLWhpZ2hsaWdodGVkLXN1cmZhY2UtY29sb3IpO1xuICAgICAgfVxuICAgICAgIjtyZXR1cm4gZH0KdmFyIGtkPWZ1bmN0aW9uKGEpe3ZhciBiPWEuZWxlbWVudElkLGM9YS50YWJOYW1lcyxkPWEuc2VsZWN0ZWRJbmRleDsiY29udGVudEJvcmRlciJpbiBhfHwoYS5jb250ZW50Qm9yZGVyPSIwcHgiKTsiY29udGVudEhlaWdodCJpbiBhfHwoYS5jb250ZW50SGVpZ2h0PSJpbml0aWFsIik7ImJvcmRlckNvbG9yImluIGF8fChhLmJvcmRlckNvbG9yPSJ2YXIoLS1jb2xhYi1ib3JkZXItY29sb3IpIik7YS5sb2NhdGlvbnx8KGEubG9jYXRpb249InRvcCIpO3ZhciBlPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiMiK2IpLGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zi5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYi1iYXIiKTt2YXIgaD1hLmxvY2F0aW9uO2YuY2xhc3NMaXN0LmFkZCgiZ29vZy10YWItYmFyLSIraCk7Zm9yKHZhciBrPVtdLHE9ZmEoYyksRz1xLm5leHQoKTshRy5kb25lO0c9cS5uZXh0KCkpe0c9Ry52YWx1ZTt2YXIgeD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKeC5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYiIpO3gudGV4dENvbnRlbnQ9RztmLmFwcGVuZENoaWxkKHgpO2sucHVzaCh4KX1oIT0iYm90dG9tIiYmZS5hcHBlbmRDaGlsZChmKTtxPW51bGw7aWYoaD09InRvcCJ8fGg9PSJib3R0b20iKXE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikscS5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYi1iYXItY2xlYXIiKTtoPT0idG9wIiYmcSYmZS5hcHBlbmRDaGlsZChxKTtHPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO0cuY2xhc3NMaXN0LmFkZCgiZ29vZy10YWItY29udGVudCIpO3ZhciBoYT1bXTtjPWZhKGMpO2Zvcih4PWMubmV4dCgpOyF4LmRvbmU7eD1jLm5leHQoKSl4PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHguaWQ9ZS5pZCsiX2NvbnRlbnRfIitoYS5sZW5ndGgseC5zdHlsZS5kaXNwbGF5PSJub25lIixHLmFwcGVuZENoaWxkKHgpLGhhLnB1c2goeCk7ZS5hcHBlbmRDaGlsZChHKTtoPT0iYm90dG9tIiYmKHEmJgplLmFwcGVuZENoaWxkKHEpLGUuYXBwZW5kQ2hpbGQoZikpO3ZhciBRPW5ldyBYKGgpO1NiKFEsZik7dmFyIFI9LTE7d2IoUSwic2VsZWN0IixmdW5jdGlvbihTKXtTPWsuaW5kZXhPZihTLnRhcmdldC5pKCkpO1MhPVImJihSPj0wJiZSPGhhLmxlbmd0aCYmKGhhW1JdLnN0eWxlLmRpc3BsYXk9Im5vbmUiLFI9LTEpLFM+PTAmJlM8aGEubGVuZ3RoJiYoUj1TLGhhW1JdLnN0eWxlLmRpc3BsYXk9ImlubGluZSIsd2luZG93LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCJyZXNpemUiKSksZ29vZ2xlLmNvbGFiLm91dHB1dC5yZXNpemVJZnJhbWVUb0NvbnRlbnQoKSksUS5KKEkoUSxSKSkpfSk7US5KKEkoUSxkKSk7d2luZG93W2JdPXtzZXRTZWxlY3RlZFRhYkluZGV4OmZ1bmN0aW9uKFMpe1EuSihJKFEsUykpfX07ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChqZChhKSl9LGxkPVsiY29sYWJfbGliIiwiY3JlYXRlVGFiQmFyIl0sWT1sOwpsZFswXWluIFl8fHR5cGVvZiBZLmV4ZWNTY3JpcHQ9PSJ1bmRlZmluZWQifHxZLmV4ZWNTY3JpcHQoInZhciAiK2xkWzBdKTtmb3IodmFyIFo7bGQubGVuZ3RoJiYoWj1sZC5zaGlmdCgpKTspbGQubGVuZ3RofHxrZD09PXZvaWQgMD9ZW1pdJiZZW1pdIT09T2JqZWN0LnByb3RvdHlwZVtaXT9ZPVlbWl06WT1ZW1pdPXt9OllbWl09a2Q7fSkuY2FsbCh0aGlzKTsKLy8gY2xhbmctZm9ybWF0IG9uCg==", + "ok": true, + "headers": [ + [ + "content-length", + "41785" + ], + [ + "content-type", + "application/javascript" + ] + ], + "status": 200, + "status_text": "" + } + }, + "base_uri": "https://localhost:8080/", + "height": 323 + }, + "outputId": "12aee4d9-2486-4889-8bdf-18df91aa8dcb" + }, + "source": [ + "%%logica Test\n", + "\n", + "F(x:, y:) :- y == x ^ 2 - 2 * x + 1;\n", + "\n", + "Test(x:, y:) :- x in [0, 0.5, 1.0, 1.5, 2.0], F(x:, y:);" + ], + "execution_count": 24, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"1b266fae-d22d-11ef-a7c0-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id47\", \"tabNames\": [\"Test\", \"(Log)\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_d33e227a76" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"1b2716a2-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id47\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_74ee81ed14" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"1b29d400-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_4e032aa2a1" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"1b2a2f5e-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id47_content_1\");\n", + "//# sourceURL=js_d298f5ef45" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"1b2b02ee-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"1b2a2f5e-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_116129ba32" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"1b2b63e2-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id47\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_356079e262" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"1b2f26d0-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"1b29d400-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_265f2b1000" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"1b316cf6-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_5d330d8d10" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"1b31b3dc-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id47_content_0\");\n", + "//# sourceURL=js_8ed93e5fef" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"1b326322-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"1b31b3dc-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_e7b6fb68d8" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"1b32cef2-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id47\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_e372a85d1c" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"1b34598e-d22d-11ef-a7c0-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id48\", \"tabNames\": [\"SQL\", \"Result\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_c1da092d0c" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"1b3496b0-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id48\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_05db9bcd00" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"1b35c59e-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_e6bb72403c" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"1b360a86-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id48_content_0\");\n", + "//# sourceURL=js_bc28817018" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"1b364d20-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"1b360a86-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_a034b9c486" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"1b36921c-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id48\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_05a0c9b338" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The following query is stored at \u001b[1mTest_sql\u001b[0m variable.\n", + "-- Initializing DuckDB environment.\n", + "create schema if not exists logica_home;\n", + "-- Empty record, has to have a field by DuckDB syntax.\n", + "drop type if exists logicarecord893574736 cascade; create type logicarecord893574736 as struct(nirvana numeric);\n", + "create sequence if not exists eternal_logical_sequence;\n", + "\n", + "\n", + "-- Logica type: logicarecord481217614\n", + "drop type if exists logicarecord481217614 cascade; create type logicarecord481217614 as struct(r logicarecord893574736);\n", + "\n", + "-- Logica type: logicarecord383307722\n", + "drop type if exists logicarecord383307722 cascade; create type logicarecord383307722 as struct(a timestamp);\n", + "SELECT\n", + " x_2.unnested_pod AS x,\n", + " (((((POW(x_2.unnested_pod, 2))) - (((2) * (x_2.unnested_pod))))) + (1)) AS y\n", + "FROM\n", + " (select unnest([0, 0.5, 1.0, 1.5, 2.0]::numeric[]) as unnested_pod) as x_2;\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"1b3798b0-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"1b35c59e-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_a20e88b80c" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"1b390bd2-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_0714bf8d88" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"1b394fde-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id48_content_1\");\n", + "//# sourceURL=js_bf3583f1ca" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"1b3991f6-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"1b394fde-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_6bcba611db" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"1b39d512-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id48\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_34cf6177a5" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The following table is stored at \u001b[1mTest\u001b[0m variable.\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
xy
00.01.00
10.50.25
21.00.00
31.50.25
42.01.00
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"1b3afb40-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"1b390bd2-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_63aa680017" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"1b3c2bbe-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"1b316cf6-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_d4a27b23f0" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"1b3d8a68-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_fd331f126d" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"1b3dcda2-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id47_content_1\");\n", + "//# sourceURL=js_f932c89b7c" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"1b3e0f60-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"1b3dcda2-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_ddfbb2404e" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"1b3e4de0-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id47\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_7420c9fbef" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "image/svg+xml": "\n\n\n\n\n\nConcertina\n\n\n\nTest\n\nTest\n\n\n\n", + "text/plain": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Running predicate: Test (8 ms)\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"1b55e78e-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"1b3d8a68-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_e0a99b94ec" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"1b58bbb2-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_66abc86ad6" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"1b595806-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id47_content_0\");\n", + "//# sourceURL=js_7ea480d96b" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"1b599d98-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"1b595806-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_f4346df2cf" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"1b5a35fa-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id47\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_6934e778a8" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"1b5c3cf6-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_911e7e4783" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"1b5d321e-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id48_content_1\");\n", + "//# sourceURL=js_8f4ce2d6ab" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"1b5d8bd8-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"1b5d321e-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_e7a767208d" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"1b5de510-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id48\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_c70612cfe4" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"1b61cebe-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"1b5c3cf6-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_97e38ef2da" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + " \n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"1b644df6-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"1b58bbb2-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_e9fcbb6c66" + ] + }, + "metadata": {} + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "8j0eyM1LanX_", + "colab": { + "resources": { + "http://localhost:8080/nbextensions/google.colab/tabbar.css": { + "data": "Lmdvb2ctdGFie3Bvc2l0aW9uOnJlbGF0aXZlO3BhZGRpbmc6NHB4IDhweDtjb2xvcjojMDBjO3RleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7Y3Vyc29yOmRlZmF1bHR9Lmdvb2ctdGFiLWJhci10b3AgLmdvb2ctdGFie21hcmdpbjoxcHggNHB4IDAgMDtib3JkZXItYm90dG9tOjA7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLXRvcDphZnRlciwuZ29vZy10YWItYmFyLWJvdHRvbTphZnRlcntjb250ZW50OiIgIjtkaXNwbGF5OmJsb2NrO2hlaWdodDowO2NsZWFyOmJvdGg7dmlzaWJpbGl0eTpoaWRkZW59Lmdvb2ctdGFiLWJhci1ib3R0b20gLmdvb2ctdGFie21hcmdpbjowIDRweCAxcHggMDtib3JkZXItdG9wOjA7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLXN0YXJ0IC5nb29nLXRhYnttYXJnaW46MCAwIDRweCAxcHg7Ym9yZGVyLXJpZ2h0OjB9Lmdvb2ctdGFiLWJhci1lbmQgLmdvb2ctdGFie21hcmdpbjowIDFweCA0cHggMDtib3JkZXItbGVmdDowfS5nb29nLXRhYi1ob3ZlcntiYWNrZ3JvdW5kOiNlZWV9Lmdvb2ctdGFiLWRpc2FibGVke2NvbG9yOiM2NjZ9Lmdvb2ctdGFiLXNlbGVjdGVke2NvbG9yOiMwMDA7YmFja2dyb3VuZDojZmZmO3RleHQtZGVjb3JhdGlvbjpub25lO2ZvbnQtd2VpZ2h0OmJvbGQ7Ym9yZGVyOjFweCBzb2xpZCAjNmI5MGRhfS5nb29nLXRhYi1iYXItdG9we3BhZGRpbmctdG9wOjVweCFpbXBvcnRhbnQ7cGFkZGluZy1sZWZ0OjVweCFpbXBvcnRhbnQ7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgIzZiOTBkYSFpbXBvcnRhbnR9Lmdvb2ctdGFiLWJhci10b3AgLmdvb2ctdGFiLXNlbGVjdGVke3RvcDoxcHg7bWFyZ2luLXRvcDowO3BhZGRpbmctYm90dG9tOjVweH0uZ29vZy10YWItYmFyLWJvdHRvbSAuZ29vZy10YWItc2VsZWN0ZWR7dG9wOi0xcHg7bWFyZ2luLWJvdHRvbTowO3BhZGRpbmctdG9wOjVweH0uZ29vZy10YWItYmFyLXN0YXJ0IC5nb29nLXRhYi1zZWxlY3RlZHtsZWZ0OjFweDttYXJnaW4tbGVmdDowO3BhZGRpbmctcmlnaHQ6OXB4fS5nb29nLXRhYi1iYXItZW5kIC5nb29nLXRhYi1zZWxlY3RlZHtsZWZ0Oi0xcHg7bWFyZ2luLXJpZ2h0OjA7cGFkZGluZy1sZWZ0OjlweH0uZ29vZy10YWItYmFye21hcmdpbjowO2JvcmRlcjowO3BhZGRpbmc6MDtsaXN0LXN0eWxlOm5vbmU7Y3Vyc29yOmRlZmF1bHQ7b3V0bGluZTpub25lO2JhY2tncm91bmQ6I2ViZWZmOX0uZ29vZy10YWItYmFyLWNsZWFye2NsZWFyOmJvdGg7aGVpZ2h0OjA7b3ZlcmZsb3c6aGlkZGVufS5nb29nLXRhYi1iYXItc3RhcnR7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLWVuZHtmbG9hdDpyaWdodH0qIGh0bWwgLmdvb2ctdGFiLWJhci1zdGFydHttYXJnaW4tcmlnaHQ6LTNweH0qIGh0bWwgLmdvb2ctdGFiLWJhci1lbmR7bWFyZ2luLWxlZnQ6LTNweH1zZW50aW5lbHt9", + "ok": true, + "headers": [ + [ + "content-length", + "1404" + ], + [ + "content-type", + "text/css" + ] + ], + "status": 200, + "status_text": "" + }, + "http://localhost:8080/nbextensions/google.colab/tabbar_main.min.js": { + "data": "Ly8gY2xhbmctZm9ybWF0IG9mZgooZnVuY3Rpb24oKXt2YXIgZyxhYT1mdW5jdGlvbihhKXt2YXIgYj0wO3JldHVybiBmdW5jdGlvbigpe3JldHVybiBiPGEubGVuZ3RoP3tkb25lOiExLHZhbHVlOmFbYisrXX06e2RvbmU6ITB9fX0sYmE9dHlwZW9mIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzPT0iZnVuY3Rpb24iP09iamVjdC5kZWZpbmVQcm9wZXJ0eTpmdW5jdGlvbihhLGIsYyl7aWYoYT09QXJyYXkucHJvdG90eXBlfHxhPT1PYmplY3QucHJvdG90eXBlKXJldHVybiBhO2FbYl09Yy52YWx1ZTtyZXR1cm4gYX0sY2E9ZnVuY3Rpb24oYSl7YT1bIm9iamVjdCI9PXR5cGVvZiBnbG9iYWxUaGlzJiZnbG9iYWxUaGlzLGEsIm9iamVjdCI9PXR5cGVvZiB3aW5kb3cmJndpbmRvdywib2JqZWN0Ij09dHlwZW9mIHNlbGYmJnNlbGYsIm9iamVjdCI9PXR5cGVvZiBnbG9iYWwmJmdsb2JhbF07Zm9yKHZhciBiPTA7YjxhLmxlbmd0aDsrK2Ipe3ZhciBjPWFbYl07aWYoYyYmYy5NYXRoPT1NYXRoKXJldHVybiBjfXRocm93IEVycm9yKCJDYW5ub3QgZmluZCBnbG9iYWwgb2JqZWN0Iik7Cn0sZGE9Y2EodGhpcyksZWE9ZnVuY3Rpb24oYSxiKXtpZihiKWE6e3ZhciBjPWRhO2E9YS5zcGxpdCgiLiIpO2Zvcih2YXIgZD0wO2Q8YS5sZW5ndGgtMTtkKyspe3ZhciBlPWFbZF07aWYoIShlIGluIGMpKWJyZWFrIGE7Yz1jW2VdfWE9YVthLmxlbmd0aC0xXTtkPWNbYV07Yj1iKGQpO2IhPWQmJmIhPW51bGwmJmJhKGMsYSx7Y29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOmJ9KX19OwplYSgiU3ltYm9sIixmdW5jdGlvbihhKXtpZihhKXJldHVybiBhO3ZhciBiPWZ1bmN0aW9uKGYsaCl7dGhpcy5nPWY7YmEodGhpcywiZGVzY3JpcHRpb24iLHtjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6aH0pfTtiLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmd9O3ZhciBjPSJqc2NvbXBfc3ltYm9sXyIrKE1hdGgucmFuZG9tKCkqMUU5Pj4+MCkrIl8iLGQ9MCxlPWZ1bmN0aW9uKGYpe2lmKHRoaXMgaW5zdGFuY2VvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoIlN5bWJvbCBpcyBub3QgYSBjb25zdHJ1Y3RvciIpO3JldHVybiBuZXcgYihjKyhmfHwiIikrIl8iK2QrKyxmKX07cmV0dXJuIGV9KTsKdmFyIGZhPWZ1bmN0aW9uKGEpe3ZhciBiPXR5cGVvZiBTeW1ib2whPSJ1bmRlZmluZWQiJiZTeW1ib2wuaXRlcmF0b3ImJmFbU3ltYm9sLml0ZXJhdG9yXTtpZihiKXJldHVybiBiLmNhbGwoYSk7aWYodHlwZW9mIGEubGVuZ3RoPT0ibnVtYmVyIilyZXR1cm57bmV4dDphYShhKX07dGhyb3cgRXJyb3IoU3RyaW5nKGEpKyIgaXMgbm90IGFuIGl0ZXJhYmxlIG9yIEFycmF5TGlrZSIpO307ZWEoIlN5bWJvbC5kaXNwb3NlIixmdW5jdGlvbihhKXtyZXR1cm4gYT9hOlN5bWJvbCgiU3ltYm9sLmRpc3Bvc2UiKX0pOy8qCgogQ29weXJpZ2h0IFRoZSBDbG9zdXJlIExpYnJhcnkgQXV0aG9ycy4KIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wCiovCnZhciBsPXRoaXN8fHNlbGYsaWE9ZnVuY3Rpb24oYSl7YS5JYT12b2lkIDA7YS5WPWZ1bmN0aW9uKCl7cmV0dXJuIGEuSWE/YS5JYTphLklhPW5ldyBhfX0samE9ZnVuY3Rpb24oYSl7dmFyIGI9dHlwZW9mIGE7cmV0dXJuIGIhPSJvYmplY3QiP2I6YT9BcnJheS5pc0FycmF5KGEpPyJhcnJheSI6YjoibnVsbCJ9LGthPWZ1bmN0aW9uKGEpe3ZhciBiPWphKGEpO3JldHVybiBiPT0iYXJyYXkifHxiPT0ib2JqZWN0IiYmdHlwZW9mIGEubGVuZ3RoPT0ibnVtYmVyIn0sbT1mdW5jdGlvbihhKXt2YXIgYj10eXBlb2YgYTtyZXR1cm4gYj09Im9iamVjdCImJmEhPW51bGx8fGI9PSJmdW5jdGlvbiJ9LG5hPWZ1bmN0aW9uKGEpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYSxsYSkmJmFbbGFdfHwoYVtsYV09KyttYSl9LGxhPSJjbG9zdXJlX3VpZF8iKyhNYXRoLnJhbmRvbSgpKjFFOT4+PjApLG1hPTAsbj1mdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoKXt9Yy5wcm90b3R5cGU9CmIucHJvdG90eXBlO2EubD1iLnByb3RvdHlwZTthLnByb3RvdHlwZT1uZXcgYzthLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1hO2EucWQ9ZnVuY3Rpb24oZCxlLGYpe2Zvcih2YXIgaD1BcnJheShhcmd1bWVudHMubGVuZ3RoLTIpLGs9MjtrPGFyZ3VtZW50cy5sZW5ndGg7aysrKWhbay0yXT1hcmd1bWVudHNba107cmV0dXJuIGIucHJvdG90eXBlW2VdLmFwcGx5KGQsaCl9fTtmdW5jdGlvbiBvYShhLGIpe2lmKEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKUVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsb2EpO2Vsc2V7dmFyIGM9RXJyb3IoKS5zdGFjaztjJiYodGhpcy5zdGFjaz1jKX1hJiYodGhpcy5tZXNzYWdlPVN0cmluZyhhKSk7YiE9PXZvaWQgMCYmKHRoaXMuY2F1c2U9Yil9bihvYSxFcnJvcik7b2EucHJvdG90eXBlLm5hbWU9IkN1c3RvbUVycm9yIjt2YXIgcGE7ZnVuY3Rpb24gcWEoYSxiKXthPWEuc3BsaXQoIiVzIik7Zm9yKHZhciBjPSIiLGQ9YS5sZW5ndGgtMSxlPTA7ZTxkO2UrKyljKz1hW2VdKyhlPGIubGVuZ3RoP2JbZV06IiVzIik7b2EuY2FsbCh0aGlzLGMrYVtkXSl9bihxYSxvYSk7cWEucHJvdG90eXBlLm5hbWU9IkFzc2VydGlvbkVycm9yIjtmdW5jdGlvbiByYShhLGIsYyxkKXt2YXIgZT0iQXNzZXJ0aW9uIGZhaWxlZCI7aWYoYyl7ZSs9IjogIitjO3ZhciBmPWR9ZWxzZSBhJiYoZSs9IjogIithLGY9Yik7dGhyb3cgbmV3IHFhKCIiK2UsZnx8W10pO30KdmFyIHA9ZnVuY3Rpb24oYSxiLGMpe2F8fHJhKCIiLG51bGwsYixBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMikpO3JldHVybiBhfSxzYT1mdW5jdGlvbihhLGIsYyl7bShhKSYmYS5ub2RlVHlwZT09MXx8cmEoIkV4cGVjdGVkIEVsZW1lbnQgYnV0IGdvdCAlczogJXMuIixbamEoYSksYV0sYixBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMikpfSx1YT1mdW5jdGlvbihhLGIsYyxkKXthIGluc3RhbmNlb2YgYnx8cmEoIkV4cGVjdGVkIGluc3RhbmNlb2YgJXMgYnV0IGdvdCAlcy4iLFt0YShiKSx0YShhKV0sYyxBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMykpfTsKZnVuY3Rpb24gdGEoYSl7cmV0dXJuIGEgaW5zdGFuY2VvZiBGdW5jdGlvbj9hLmRpc3BsYXlOYW1lfHxhLm5hbWV8fCJ1bmtub3duIHR5cGUgbmFtZSI6YSBpbnN0YW5jZW9mIE9iamVjdD9hLmNvbnN0cnVjdG9yLmRpc3BsYXlOYW1lfHxhLmNvbnN0cnVjdG9yLm5hbWV8fE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhKTphPT09bnVsbD8ibnVsbCI6dHlwZW9mIGF9O3ZhciB2YT1BcnJheS5wcm90b3R5cGUuaW5kZXhPZj9mdW5jdGlvbihhLGIpe3AoYS5sZW5ndGghPW51bGwpO3JldHVybiBBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKGEsYix2b2lkIDApfTpmdW5jdGlvbihhLGIpe2lmKHR5cGVvZiBhPT09InN0cmluZyIpcmV0dXJuIHR5cGVvZiBiIT09InN0cmluZyJ8fGIubGVuZ3RoIT0xPy0xOmEuaW5kZXhPZihiLDApO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWlmKGMgaW4gYSYmYVtjXT09PWIpcmV0dXJuIGM7cmV0dXJuLTF9LHdhPUFycmF5LnByb3RvdHlwZS5mb3JFYWNoP2Z1bmN0aW9uKGEsYil7cChhLmxlbmd0aCE9bnVsbCk7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChhLGIsdm9pZCAwKX06ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9YS5sZW5ndGgsZD10eXBlb2YgYT09PSJzdHJpbmciP2Euc3BsaXQoIiIpOmEsZT0wO2U8YztlKyspZSBpbiBkJiZiLmNhbGwodm9pZCAwLGRbZV0sZSxhKX07CmZ1bmN0aW9uIHhhKGEsYil7Yj12YShhLGIpO3ZhciBjO2lmKGM9Yj49MClwKGEubGVuZ3RoIT1udWxsKSxBcnJheS5wcm90b3R5cGUuc3BsaWNlLmNhbGwoYSxiLDEpO3JldHVybiBjfWZ1bmN0aW9uIHlhKGEpe3ZhciBiPWEubGVuZ3RoO2lmKGI+MCl7Zm9yKHZhciBjPUFycmF5KGIpLGQ9MDtkPGI7ZCsrKWNbZF09YVtkXTtyZXR1cm4gY31yZXR1cm5bXX1mdW5jdGlvbiB6YShhLGIsYyxkKXtwKGEubGVuZ3RoIT1udWxsKTtBcnJheS5wcm90b3R5cGUuc3BsaWNlLmFwcGx5KGEsQWEoYXJndW1lbnRzLDEpKX1mdW5jdGlvbiBBYShhLGIsYyl7cChhLmxlbmd0aCE9bnVsbCk7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg8PTI/QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYSxiKTpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhLGIsYyl9O2Z1bmN0aW9uIEJhKGEsYixjKXtmb3IodmFyIGQgaW4gYSliLmNhbGwoYyxhW2RdLGQsYSl9ZnVuY3Rpb24gQ2EoYSxiKXtmb3IodmFyIGMgaW4gYSlpZihhW2NdPT1iKXJldHVybiEwO3JldHVybiExfWZ1bmN0aW9uIERhKGEsYixjKXtpZihhIT09bnVsbCYmYiBpbiBhKXRocm93IEVycm9yKCdUaGUgb2JqZWN0IGFscmVhZHkgY29udGFpbnMgdGhlIGtleSAiJytiKyciJyk7YVtiXT1jfWZ1bmN0aW9uIEVhKGEpe3ZhciBiPXt9LGM7Zm9yKGMgaW4gYSliW2FbY11dPWM7cmV0dXJuIGJ9dmFyIEZhPSJjb25zdHJ1Y3RvciBoYXNPd25Qcm9wZXJ0eSBpc1Byb3RvdHlwZU9mIHByb3BlcnR5SXNFbnVtZXJhYmxlIHRvTG9jYWxlU3RyaW5nIHRvU3RyaW5nIHZhbHVlT2YiLnNwbGl0KCIgIik7CmZ1bmN0aW9uIEdhKGEsYil7Zm9yKHZhciBjLGQsZT0xO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspe2Q9YXJndW1lbnRzW2VdO2ZvcihjIGluIGQpYVtjXT1kW2NdO2Zvcih2YXIgZj0wO2Y8RmEubGVuZ3RoO2YrKyljPUZhW2ZdLE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChkLGMpJiYoYVtjXT1kW2NdKX19O3ZhciBIYT1TdHJpbmcucHJvdG90eXBlLnRyaW0/ZnVuY3Rpb24oYSl7cmV0dXJuIGEudHJpbSgpfTpmdW5jdGlvbihhKXtyZXR1cm4vXltcc1x4YTBdKihbXHNcU10qPylbXHNceGEwXSokLy5leGVjKGEpWzFdfTsvKgoKIENvcHlyaWdodCBHb29nbGUgTExDCiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMAoqLwp2YXIgSWE9e307dmFyIEphPWZ1bmN0aW9uKGEpe2lmKElhIT09SWEpdGhyb3cgRXJyb3IoIkJhZCBzZWNyZXQiKTt0aGlzLmc9YX07SmEucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ307bmV3IEphKCJhYm91dDpibGFuayIpO25ldyBKYSgiYWJvdXQ6aW52YWxpZCN6Q2xvc3VyZXoiKTt2YXIgS2E9W10sTGE9ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJBIFVSTCB3aXRoIGNvbnRlbnQgJyIrYSsiJyB3YXMgc2FuaXRpemVkIGF3YXkuIil9O0thLmluZGV4T2YoTGEpPT09LTEmJkthLnB1c2goTGEpO3ZhciBNYSxOYTthOntmb3IodmFyIE9hPVsiQ0xPU1VSRV9GTEFHUyJdLFBhPWwsUWE9MDtRYTxPYS5sZW5ndGg7UWErKylpZihQYT1QYVtPYVtRYV1dLFBhPT1udWxsKXtOYT1udWxsO2JyZWFrIGF9TmE9UGF9dmFyIFJhPU5hJiZOYVs2MTA0MDEzMDFdO01hPVJhIT1udWxsP1JhOiExO2Z1bmN0aW9uIFNhKCl7dmFyIGE9bC5uYXZpZ2F0b3I7cmV0dXJuIGEmJihhPWEudXNlckFnZW50KT9hOiIifXZhciBUYSxVYT1sLm5hdmlnYXRvcjtUYT1VYT9VYS51c2VyQWdlbnREYXRhfHxudWxsOm51bGw7ZnVuY3Rpb24gcihhKXtyZXR1cm4gU2EoKS5pbmRleE9mKGEpIT0tMX07dmFyIFZhPXIoIkVkZ2UiKSx0PXIoIkdlY2tvIikmJiEoU2EoKS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoIndlYmtpdCIpIT0tMSYmIXIoIkVkZ2UiKSkmJiEocigiVHJpZGVudCIpfHxyKCJNU0lFIikpJiYhcigiRWRnZSIpLHU9U2EoKS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoIndlYmtpdCIpIT0tMSYmIXIoIkVkZ2UiKSx2PU1hJiZUYSYmVGEucGxhdGZvcm0/VGEucGxhdGZvcm09PT0ibWFjT1MiOnIoIk1hY2ludG9zaCIpO3ZhciBYYT1mdW5jdGlvbihhLGIpe0JhKGIsZnVuY3Rpb24oYyxkKXtkPT0ic3R5bGUiP2Euc3R5bGUuY3NzVGV4dD1jOmQ9PSJjbGFzcyI/YS5jbGFzc05hbWU9YzpkPT0iZm9yIj9hLmh0bWxGb3I9YzpXYS5oYXNPd25Qcm9wZXJ0eShkKT9hLnNldEF0dHJpYnV0ZShXYVtkXSxjKTpkLmxhc3RJbmRleE9mKCJhcmlhLSIsMCk9PTB8fGQubGFzdEluZGV4T2YoImRhdGEtIiwwKT09MD9hLnNldEF0dHJpYnV0ZShkLGMpOmFbZF09Y30pfSxXYT17Y2VsbHBhZGRpbmc6ImNlbGxQYWRkaW5nIixjZWxsc3BhY2luZzoiY2VsbFNwYWNpbmciLGNvbHNwYW46ImNvbFNwYW4iLGZyYW1lYm9yZGVyOiJmcmFtZUJvcmRlciIsaGVpZ2h0OiJoZWlnaHQiLG1heGxlbmd0aDoibWF4TGVuZ3RoIixub25jZToibm9uY2UiLHJvbGU6InJvbGUiLHJvd3NwYW46InJvd1NwYW4iLHR5cGU6InR5cGUiLHVzZW1hcDoidXNlTWFwIix2YWxpZ246InZBbGlnbiIsd2lkdGg6IndpZHRoIn0sWWE9ZnVuY3Rpb24oYSwKYixjKXtmdW5jdGlvbiBkKGspe2smJmIuYXBwZW5kQ2hpbGQodHlwZW9mIGs9PT0ic3RyaW5nIj9hLmNyZWF0ZVRleHROb2RlKGspOmspfWZvcih2YXIgZT0yO2U8Yy5sZW5ndGg7ZSsrKXt2YXIgZj1jW2VdO2lmKCFrYShmKXx8bShmKSYmZi5ub2RlVHlwZT4wKWQoZik7ZWxzZXthOntpZihmJiZ0eXBlb2YgZi5sZW5ndGg9PSJudW1iZXIiKXtpZihtKGYpKXt2YXIgaD10eXBlb2YgZi5pdGVtPT0iZnVuY3Rpb24ifHx0eXBlb2YgZi5pdGVtPT0ic3RyaW5nIjticmVhayBhfWlmKHR5cGVvZiBmPT09ImZ1bmN0aW9uIil7aD10eXBlb2YgZi5pdGVtPT0iZnVuY3Rpb24iO2JyZWFrIGF9fWg9ITF9d2EoaD95YShmKTpmLGQpfX19LFphPWZ1bmN0aW9uKGEsYil7Yj1TdHJpbmcoYik7YS5jb250ZW50VHlwZT09PSJhcHBsaWNhdGlvbi94aHRtbCt4bWwiJiYoYj1iLnRvTG93ZXJDYXNlKCkpO3JldHVybiBhLmNyZWF0ZUVsZW1lbnQoYil9LCRhPWZ1bmN0aW9uKGEpe2EmJmEucGFyZW50Tm9kZSYmCmEucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhKX0sYWI9ZnVuY3Rpb24oYSxiKXtpZighYXx8IWIpcmV0dXJuITE7aWYoYS5jb250YWlucyYmYi5ub2RlVHlwZT09MSlyZXR1cm4gYT09Ynx8YS5jb250YWlucyhiKTtpZih0eXBlb2YgYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiE9InVuZGVmaW5lZCIpcmV0dXJuIGE9PWJ8fCEhKGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24oYikmMTYpO2Zvcig7YiYmYSE9YjspYj1iLnBhcmVudE5vZGU7cmV0dXJuIGI9PWF9LGJiPWZ1bmN0aW9uKGEpe3AoYSwiTm9kZSBjYW5ub3QgYmUgbnVsbCBvciB1bmRlZmluZWQuIik7cmV0dXJuIGEubm9kZVR5cGU9PTk/YTphLm93bmVyRG9jdW1lbnR8fGEuZG9jdW1lbnR9LGNiPWZ1bmN0aW9uKGEsYil7Yj9hLnRhYkluZGV4PTA6KGEudGFiSW5kZXg9LTEsYS5yZW1vdmVBdHRyaWJ1dGUoInRhYkluZGV4IikpfSxkYj1mdW5jdGlvbihhKXtyZXR1cm4gYS5oYXNBdHRyaWJ1dGUoInRhYmluZGV4Iil9LGViPQpmdW5jdGlvbihhKXthPWEudGFiSW5kZXg7cmV0dXJuIHR5cGVvZiBhPT09Im51bWJlciImJmE+PTAmJmE8MzI3Njh9LGZiPWZ1bmN0aW9uKGEpe3RoaXMuZz1hfHxsLmRvY3VtZW50fHxkb2N1bWVudH07ZmIucHJvdG90eXBlLmk9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nO3JldHVybiB0eXBlb2YgYT09PSJzdHJpbmciP2IuZ2V0RWxlbWVudEJ5SWQoYSk6YX07ZmIucHJvdG90eXBlLmg9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXMuZyxlPWFyZ3VtZW50cyxmPWVbMV0saD1aYShkLFN0cmluZyhlWzBdKSk7ZiYmKHR5cGVvZiBmPT09InN0cmluZyI/aC5jbGFzc05hbWU9ZjpBcnJheS5pc0FycmF5KGYpP2guY2xhc3NOYW1lPWYuam9pbigiICIpOlhhKGgsZikpO2UubGVuZ3RoPjImJllhKGQsaCxlKTtyZXR1cm4gaH07dmFyIHc9ZnVuY3Rpb24oKXt0aGlzLmJhPXRoaXMuYmE7dGhpcy5rYT10aGlzLmthfTt3LnByb3RvdHlwZS5iYT0hMTt3LnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7dGhpcy5iYXx8KHRoaXMuYmE9ITAsdGhpcy5DKCkpfTt3LnByb3RvdHlwZVtTeW1ib2wuZGlzcG9zZV09ZnVuY3Rpb24oKXt0aGlzLmRpc3Bvc2UoKX07dy5wcm90b3R5cGUuQz1mdW5jdGlvbigpe2lmKHRoaXMua2EpZm9yKDt0aGlzLmthLmxlbmd0aDspdGhpcy5rYS5zaGlmdCgpKCl9O3ZhciB5PWZ1bmN0aW9uKGEsYil7dGhpcy50eXBlPWE7dGhpcy51PXRoaXMudGFyZ2V0PWI7dGhpcy5kZWZhdWx0UHJldmVudGVkPXRoaXMuQT0hMX07eS5wcm90b3R5cGUudj1mdW5jdGlvbigpe3RoaXMuQT0hMH07eS5wcm90b3R5cGUuaj1mdW5jdGlvbigpe3RoaXMuZGVmYXVsdFByZXZlbnRlZD0hMH07dmFyIGdiPWZ1bmN0aW9uKCl7aWYoIWwuYWRkRXZlbnRMaXN0ZW5lcnx8IU9iamVjdC5kZWZpbmVQcm9wZXJ0eSlyZXR1cm4hMTt2YXIgYT0hMSxiPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwicGFzc2l2ZSIse2dldDpmdW5jdGlvbigpe2E9ITB9fSk7dHJ5e3ZhciBjPWZ1bmN0aW9uKCl7fTtsLmFkZEV2ZW50TGlzdGVuZXIoInRlc3QiLGMsYik7bC5yZW1vdmVFdmVudExpc3RlbmVyKCJ0ZXN0IixjLGIpfWNhdGNoKGQpe31yZXR1cm4gYX0oKTt2YXIgej1mdW5jdGlvbihhLGIpe3kuY2FsbCh0aGlzLGE/YS50eXBlOiIiKTt0aGlzLnJlbGF0ZWRUYXJnZXQ9dGhpcy51PXRoaXMudGFyZ2V0PW51bGw7dGhpcy5idXR0b249dGhpcy5zY3JlZW5ZPXRoaXMuc2NyZWVuWD10aGlzLmNsaWVudFk9dGhpcy5jbGllbnRYPTA7dGhpcy5rZXk9IiI7dGhpcy5nPTA7dGhpcy5tZXRhS2V5PXRoaXMuc2hpZnRLZXk9dGhpcy5hbHRLZXk9dGhpcy5jdHJsS2V5PSExO3RoaXMuc3RhdGU9bnVsbDt0aGlzLkc9ITE7dGhpcy5wb2ludGVySWQ9MDt0aGlzLnBvaW50ZXJUeXBlPSIiO3RoaXMudGltZVN0YW1wPTA7dGhpcy5oPW51bGw7aWYoYSl7dmFyIGM9dGhpcy50eXBlPWEudHlwZSxkPWEuY2hhbmdlZFRvdWNoZXMmJmEuY2hhbmdlZFRvdWNoZXMubGVuZ3RoP2EuY2hhbmdlZFRvdWNoZXNbMF06bnVsbDt0aGlzLnRhcmdldD1hLnRhcmdldHx8YS5zcmNFbGVtZW50O3RoaXMudT1iO2I9YS5yZWxhdGVkVGFyZ2V0O2J8fChjPT0ibW91c2VvdmVyIj8KYj1hLmZyb21FbGVtZW50OmM9PSJtb3VzZW91dCImJihiPWEudG9FbGVtZW50KSk7dGhpcy5yZWxhdGVkVGFyZ2V0PWI7ZD8odGhpcy5jbGllbnRYPWQuY2xpZW50WCE9PXZvaWQgMD9kLmNsaWVudFg6ZC5wYWdlWCx0aGlzLmNsaWVudFk9ZC5jbGllbnRZIT09dm9pZCAwP2QuY2xpZW50WTpkLnBhZ2VZLHRoaXMuc2NyZWVuWD1kLnNjcmVlblh8fDAsdGhpcy5zY3JlZW5ZPWQuc2NyZWVuWXx8MCk6KHRoaXMuY2xpZW50WD1hLmNsaWVudFghPT12b2lkIDA/YS5jbGllbnRYOmEucGFnZVgsdGhpcy5jbGllbnRZPWEuY2xpZW50WSE9PXZvaWQgMD9hLmNsaWVudFk6YS5wYWdlWSx0aGlzLnNjcmVlblg9YS5zY3JlZW5YfHwwLHRoaXMuc2NyZWVuWT1hLnNjcmVlbll8fDApO3RoaXMuYnV0dG9uPWEuYnV0dG9uO3RoaXMuZz1hLmtleUNvZGV8fDA7dGhpcy5rZXk9YS5rZXl8fCIiO3RoaXMuY3RybEtleT1hLmN0cmxLZXk7dGhpcy5hbHRLZXk9YS5hbHRLZXk7dGhpcy5zaGlmdEtleT1hLnNoaWZ0S2V5Owp0aGlzLm1ldGFLZXk9YS5tZXRhS2V5O3RoaXMuRz12P2EubWV0YUtleTphLmN0cmxLZXk7dGhpcy5wb2ludGVySWQ9YS5wb2ludGVySWR8fDA7dGhpcy5wb2ludGVyVHlwZT1hLnBvaW50ZXJUeXBlO3RoaXMuc3RhdGU9YS5zdGF0ZTt0aGlzLnRpbWVTdGFtcD1hLnRpbWVTdGFtcDt0aGlzLmg9YTthLmRlZmF1bHRQcmV2ZW50ZWQmJnoubC5qLmNhbGwodGhpcyl9fTtuKHoseSk7ei5wcm90b3R5cGUudj1mdW5jdGlvbigpe3oubC52LmNhbGwodGhpcyk7dGhpcy5oLnN0b3BQcm9wYWdhdGlvbj90aGlzLmguc3RvcFByb3BhZ2F0aW9uKCk6dGhpcy5oLmNhbmNlbEJ1YmJsZT0hMH07ei5wcm90b3R5cGUuaj1mdW5jdGlvbigpe3oubC5qLmNhbGwodGhpcyk7dmFyIGE9dGhpcy5oO2EucHJldmVudERlZmF1bHQ/YS5wcmV2ZW50RGVmYXVsdCgpOmEucmV0dXJuVmFsdWU9ITF9O3ZhciBoYj0iY2xvc3VyZV9saXN0ZW5hYmxlXyIrKE1hdGgucmFuZG9tKCkqMUU2fDApLGliPWZ1bmN0aW9uKGEpe3JldHVybiEoIWF8fCFhW2hiXSl9O3ZhciBqYj0wO3ZhciBrYj1mdW5jdGlvbihhLGIsYyxkLGUpe3RoaXMubGlzdGVuZXI9YTt0aGlzLnByb3h5PW51bGw7dGhpcy5zcmM9Yjt0aGlzLnR5cGU9Yzt0aGlzLmNhcHR1cmU9ISFkO3RoaXMucGE9ZTt0aGlzLmtleT0rK2piO3RoaXMuamE9dGhpcy5vYT0hMX0sbGI9ZnVuY3Rpb24oYSl7YS5qYT0hMDthLmxpc3RlbmVyPW51bGw7YS5wcm94eT1udWxsO2Euc3JjPW51bGw7YS5wYT1udWxsfTt2YXIgbWI9ZnVuY3Rpb24oYSl7dGhpcy5zcmM9YTt0aGlzLmc9e307dGhpcy5oPTB9O21iLnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZj1hLnRvU3RyaW5nKCk7YT10aGlzLmdbZl07YXx8KGE9dGhpcy5nW2ZdPVtdLHRoaXMuaCsrKTt2YXIgaD1uYihhLGIsZCxlKTtoPi0xPyhiPWFbaF0sY3x8KGIub2E9ITEpKTooYj1uZXcga2IoYix0aGlzLnNyYyxmLCEhZCxlKSxiLm9hPWMsYS5wdXNoKGIpKTtyZXR1cm4gYn07CnZhciBvYj1mdW5jdGlvbihhLGIpe3ZhciBjPWIudHlwZTtjIGluIGEuZyYmeGEoYS5nW2NdLGIpJiYobGIoYiksYS5nW2NdLmxlbmd0aD09MCYmKGRlbGV0ZSBhLmdbY10sYS5oLS0pKX0scGI9ZnVuY3Rpb24oYSxiLGMsZCxlKXthPWEuZ1tiLnRvU3RyaW5nKCldO2I9LTE7YSYmKGI9bmIoYSxjLGQsZSkpO3JldHVybiBiPi0xP2FbYl06bnVsbH0sbmI9ZnVuY3Rpb24oYSxiLGMsZCl7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDsrK2Upe3ZhciBmPWFbZV07aWYoIWYuamEmJmYubGlzdGVuZXI9PWImJmYuY2FwdHVyZT09ISFjJiZmLnBhPT1kKXJldHVybiBlfXJldHVybi0xfTt2YXIgcWI9ImNsb3N1cmVfbG1fIisoTWF0aC5yYW5kb20oKSoxRTZ8MCkscmI9e30sc2I9MCx1Yj1mdW5jdGlvbihhLGIsYyxkLGUpe2lmKGQmJmQub25jZSlyZXR1cm4gdGIoYSxiLGMsZCxlKTtpZihBcnJheS5pc0FycmF5KGIpKXtmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKyl1YihhLGJbZl0sYyxkLGUpO3JldHVybiBudWxsfWM9dmIoYyk7cmV0dXJuIGliKGEpP3diKGEsYixjLG0oZCk/ISFkLmNhcHR1cmU6ISFkLGUpOnhiKGEsYixjLCExLGQsZSl9LHhiPWZ1bmN0aW9uKGEsYixjLGQsZSxmKXtpZighYil0aHJvdyBFcnJvcigiSW52YWxpZCBldmVudCB0eXBlIik7dmFyIGg9bShlKT8hIWUuY2FwdHVyZTohIWUsaz15YihhKTtrfHwoYVtxYl09az1uZXcgbWIoYSkpO2M9ay5hZGQoYixjLGQsaCxmKTtpZihjLnByb3h5KXJldHVybiBjO2Q9emIoKTtjLnByb3h5PWQ7ZC5zcmM9YTtkLmxpc3RlbmVyPWM7aWYoYS5hZGRFdmVudExpc3RlbmVyKWdifHwoZT1oKSxlPT09dm9pZCAwJiYKKGU9ITEpLGEuYWRkRXZlbnRMaXN0ZW5lcihiLnRvU3RyaW5nKCksZCxlKTtlbHNlIGlmKGEuYXR0YWNoRXZlbnQpYS5hdHRhY2hFdmVudChBYihiLnRvU3RyaW5nKCkpLGQpO2Vsc2UgaWYoYS5hZGRMaXN0ZW5lciYmYS5yZW1vdmVMaXN0ZW5lcilwKGI9PT0iY2hhbmdlIiwiTWVkaWFRdWVyeUxpc3Qgb25seSBoYXMgYSBjaGFuZ2UgZXZlbnQiKSxhLmFkZExpc3RlbmVyKGQpO2Vsc2UgdGhyb3cgRXJyb3IoImFkZEV2ZW50TGlzdGVuZXIgYW5kIGF0dGFjaEV2ZW50IGFyZSB1bmF2YWlsYWJsZS4iKTtzYisrO3JldHVybiBjfSx6Yj1mdW5jdGlvbigpe3ZhciBhPUJiLGI9ZnVuY3Rpb24oYyl7cmV0dXJuIGEuY2FsbChiLnNyYyxiLmxpc3RlbmVyLGMpfTtyZXR1cm4gYn0sdGI9ZnVuY3Rpb24oYSxiLGMsZCxlKXtpZihBcnJheS5pc0FycmF5KGIpKXtmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKyl0YihhLGJbZl0sYyxkLGUpO3JldHVybiBudWxsfWM9dmIoYyk7cmV0dXJuIGliKGEpPwphLkEuYWRkKFN0cmluZyhiKSxjLCEwLG0oZCk/ISFkLmNhcHR1cmU6ISFkLGUpOnhiKGEsYixjLCEwLGQsZSl9LENiPWZ1bmN0aW9uKGEsYixjLGQsZSl7aWYoQXJyYXkuaXNBcnJheShiKSlmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKylDYihhLGJbZl0sYyxkLGUpO2Vsc2UgZD1tKGQpPyEhZC5jYXB0dXJlOiEhZCxjPXZiKGMpLGliKGEpPyhhPWEuQSxiPVN0cmluZyhiKS50b1N0cmluZygpLGIgaW4gYS5nJiYoZj1hLmdbYl0sYz1uYihmLGMsZCxlKSxjPi0xJiYobGIoZltjXSkscChmLmxlbmd0aCE9bnVsbCksQXJyYXkucHJvdG90eXBlLnNwbGljZS5jYWxsKGYsYywxKSxmLmxlbmd0aD09MCYmKGRlbGV0ZSBhLmdbYl0sYS5oLS0pKSkpOmEmJihhPXliKGEpKSYmKGM9cGIoYSxiLGMsZCxlKSkmJkEoYyl9LEE9ZnVuY3Rpb24oYSl7aWYodHlwZW9mIGEhPT0ibnVtYmVyIiYmYSYmIWEuamEpe3ZhciBiPWEuc3JjO2lmKGliKGIpKW9iKGIuQSxhKTtlbHNle3ZhciBjPWEudHlwZSwKZD1hLnByb3h5O2IucmVtb3ZlRXZlbnRMaXN0ZW5lcj9iLnJlbW92ZUV2ZW50TGlzdGVuZXIoYyxkLGEuY2FwdHVyZSk6Yi5kZXRhY2hFdmVudD9iLmRldGFjaEV2ZW50KEFiKGMpLGQpOmIuYWRkTGlzdGVuZXImJmIucmVtb3ZlTGlzdGVuZXImJmIucmVtb3ZlTGlzdGVuZXIoZCk7c2ItLTsoYz15YihiKSk/KG9iKGMsYSksYy5oPT0wJiYoYy5zcmM9bnVsbCxiW3FiXT1udWxsKSk6bGIoYSl9fX0sQWI9ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW4gcmI/cmJbYV06cmJbYV09Im9uIithfSxCYj1mdW5jdGlvbihhLGIpe2lmKGEuamEpYT0hMDtlbHNle2I9bmV3IHooYix0aGlzKTt2YXIgYz1hLmxpc3RlbmVyLGQ9YS5wYXx8YS5zcmM7YS5vYSYmQShhKTthPWMuY2FsbChkLGIpfXJldHVybiBhfSx5Yj1mdW5jdGlvbihhKXthPWFbcWJdO3JldHVybiBhIGluc3RhbmNlb2YgbWI/YTpudWxsfSxEYj0iX19jbG9zdXJlX2V2ZW50c19mbl8iKyhNYXRoLnJhbmRvbSgpKjFFOT4+PjApLHZiPWZ1bmN0aW9uKGEpe3AoYSwKIkxpc3RlbmVyIGNhbiBub3QgYmUgbnVsbC4iKTtpZih0eXBlb2YgYT09PSJmdW5jdGlvbiIpcmV0dXJuIGE7cChhLmhhbmRsZUV2ZW50LCJBbiBvYmplY3QgbGlzdGVuZXIgbXVzdCBoYXZlIGhhbmRsZUV2ZW50IG1ldGhvZC4iKTthW0RiXXx8KGFbRGJdPWZ1bmN0aW9uKGIpe3JldHVybiBhLmhhbmRsZUV2ZW50KGIpfSk7cmV0dXJuIGFbRGJdfTt2YXIgRWI9ZnVuY3Rpb24oYSl7dy5jYWxsKHRoaXMpO3RoaXMuaD1hO3RoaXMuZz17fX07bihFYix3KTsKdmFyIEZiPVtdLEI9ZnVuY3Rpb24oYSxiLGMsZCl7QXJyYXkuaXNBcnJheShjKXx8KGMmJihGYlswXT1jLnRvU3RyaW5nKCkpLGM9RmIpO2Zvcih2YXIgZT0wO2U8Yy5sZW5ndGg7ZSsrKXt2YXIgZj11YihiLGNbZV0sZHx8YS5oYW5kbGVFdmVudCwhMSxhLmh8fGEpO2lmKCFmKWJyZWFrO2EuZ1tmLmtleV09Zn1yZXR1cm4gYX0sQz1mdW5jdGlvbihhLGIsYyxkLGUsZil7aWYoQXJyYXkuaXNBcnJheShjKSlmb3IodmFyIGg9MDtoPGMubGVuZ3RoO2grKylDKGEsYixjW2hdLGQsZSxmKTtlbHNlIGQ9ZHx8YS5oYW5kbGVFdmVudCxlPW0oZSk/ISFlLmNhcHR1cmU6ISFlLGY9Znx8YS5ofHxhLGQ9dmIoZCksZT0hIWUsYz1pYihiKT9wYihiLkEsU3RyaW5nKGMpLGQsZSxmKTpiPyhiPXliKGIpKT9wYihiLGMsZCxlLGYpOm51bGw6bnVsbCxjJiYoQShjKSxkZWxldGUgYS5nW2Mua2V5XSk7cmV0dXJuIGF9LEdiPWZ1bmN0aW9uKGEpe0JhKGEuZyxmdW5jdGlvbihiLGMpe3RoaXMuZy5oYXNPd25Qcm9wZXJ0eShjKSYmCkEoYil9LGEpO2EuZz17fX07RWIucHJvdG90eXBlLkM9ZnVuY3Rpb24oKXtFYi5sLkMuY2FsbCh0aGlzKTtHYih0aGlzKX07RWIucHJvdG90eXBlLmhhbmRsZUV2ZW50PWZ1bmN0aW9uKCl7dGhyb3cgRXJyb3IoIkV2ZW50SGFuZGxlci5oYW5kbGVFdmVudCBub3QgaW1wbGVtZW50ZWQiKTt9O3ZhciBEPWZ1bmN0aW9uKCl7dy5jYWxsKHRoaXMpO3RoaXMuQT1uZXcgbWIodGhpcyk7dGhpcy5ZYT10aGlzO3RoaXMubGE9bnVsbH07bihELHcpO0QucHJvdG90eXBlW2hiXT0hMDtELnByb3RvdHlwZS5BYT1mdW5jdGlvbihhKXt0aGlzLmxhPWF9O0QucHJvdG90eXBlLnJlbW92ZUV2ZW50TGlzdGVuZXI9ZnVuY3Rpb24oYSxiLGMsZCl7Q2IodGhpcyxhLGIsYyxkKX07CnZhciBFPWZ1bmN0aW9uKGEsYil7SGIoYSk7dmFyIGM9YS5sYTtpZihjKXt2YXIgZD1bXTtmb3IodmFyIGU9MTtjO2M9Yy5sYSlkLnB1c2goYykscCgrK2U8MUUzLCJpbmZpbml0ZSBsb29wIil9YT1hLllhO2M9Yi50eXBlfHxiO3R5cGVvZiBiPT09InN0cmluZyI/Yj1uZXcgeShiLGEpOmIgaW5zdGFuY2VvZiB5P2IudGFyZ2V0PWIudGFyZ2V0fHxhOihlPWIsYj1uZXcgeShjLGEpLEdhKGIsZSkpO2U9ITA7dmFyIGY7aWYoZClmb3IoZj1kLmxlbmd0aC0xOyFiLkEmJmY+PTA7Zi0tKXt2YXIgaD1iLnU9ZFtmXTtlPUliKGgsYywhMCxiKSYmZX1iLkF8fChoPWIudT1hLGU9SWIoaCxjLCEwLGIpJiZlLGIuQXx8KGU9SWIoaCxjLCExLGIpJiZlKSk7aWYoZClmb3IoZj0wOyFiLkEmJmY8ZC5sZW5ndGg7ZisrKWg9Yi51PWRbZl0sZT1JYihoLGMsITEsYikmJmU7cmV0dXJuIGV9OwpELnByb3RvdHlwZS5DPWZ1bmN0aW9uKCl7RC5sLkMuY2FsbCh0aGlzKTtpZih0aGlzLkEpe3ZhciBhPXRoaXMuQSxiPTAsYztmb3IoYyBpbiBhLmcpe2Zvcih2YXIgZD1hLmdbY10sZT0wO2U8ZC5sZW5ndGg7ZSsrKSsrYixsYihkW2VdKTtkZWxldGUgYS5nW2NdO2EuaC0tfX10aGlzLmxhPW51bGx9O3ZhciB3Yj1mdW5jdGlvbihhLGIsYyxkLGUpe0hiKGEpO3JldHVybiBhLkEuYWRkKFN0cmluZyhiKSxjLCExLGQsZSl9LEliPWZ1bmN0aW9uKGEsYixjLGQpe2I9YS5BLmdbU3RyaW5nKGIpXTtpZighYilyZXR1cm4hMDtiPWIuY29uY2F0KCk7Zm9yKHZhciBlPSEwLGY9MDtmPGIubGVuZ3RoOysrZil7dmFyIGg9YltmXTtpZihoJiYhaC5qYSYmaC5jYXB0dXJlPT1jKXt2YXIgaz1oLmxpc3RlbmVyLHE9aC5wYXx8aC5zcmM7aC5vYSYmb2IoYS5BLGgpO2U9ay5jYWxsKHEsZCkhPT0hMSYmZX19cmV0dXJuIGUmJiFkLmRlZmF1bHRQcmV2ZW50ZWR9LEhiPWZ1bmN0aW9uKGEpe3AoYS5BLCJFdmVudCB0YXJnZXQgaXMgbm90IGluaXRpYWxpemVkLiBEaWQgeW91IGNhbGwgdGhlIHN1cGVyY2xhc3MgKGdvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0KSBjb25zdHJ1Y3Rvcj8iKX07dmFyIEpiPXQ/Ik1velVzZXJTZWxlY3QiOnV8fFZhPyJXZWJraXRVc2VyU2VsZWN0IjpudWxsLEtiPWZ1bmN0aW9uKGEsYil7Yj1iP251bGw6YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpO2lmKEpiJiYoYS5zdHlsZSYmKGEuc3R5bGVbSmJdPSJub25lIiksYikpZm9yKHZhciBjPTA7YT1iW2NdO2MrKylhLnN0eWxlJiYoYS5zdHlsZVtKYl09Im5vbmUiKX07dmFyIExiPWZ1bmN0aW9uKCl7fTtpYShMYik7TGIucHJvdG90eXBlLmc9MDt2YXIgRj1mdW5jdGlvbihhKXtELmNhbGwodGhpcyk7dGhpcy5HPWF8fHBhfHwocGE9bmV3IGZiKTt0aGlzLnphPU1iO3RoaXMuWT1udWxsO3RoaXMucz0hMTt0aGlzLmc9bnVsbDt0aGlzLk09dm9pZCAwO3RoaXMudT10aGlzLmo9dGhpcy5oPW51bGw7dGhpcy5TYT0hMX07bihGLEQpO0YucHJvdG90eXBlLlphPUxiLlYoKTsKdmFyIE1iPW51bGwsTmI9ZnVuY3Rpb24oYSxiKXtzd2l0Y2goYSl7Y2FzZSAxOnJldHVybiBiPyJkaXNhYmxlIjoiZW5hYmxlIjtjYXNlIDI6cmV0dXJuIGI/ImhpZ2hsaWdodCI6InVuaGlnaGxpZ2h0IjtjYXNlIDQ6cmV0dXJuIGI/ImFjdGl2YXRlIjoiZGVhY3RpdmF0ZSI7Y2FzZSA4OnJldHVybiBiPyJzZWxlY3QiOiJ1bnNlbGVjdCI7Y2FzZSAxNjpyZXR1cm4gYj8iY2hlY2siOiJ1bmNoZWNrIjtjYXNlIDMyOnJldHVybiBiPyJmb2N1cyI6ImJsdXIiO2Nhc2UgNjQ6cmV0dXJuIGI/Im9wZW4iOiJjbG9zZSJ9dGhyb3cgRXJyb3IoIkludmFsaWQgY29tcG9uZW50IHN0YXRlIik7fSxPYj1mdW5jdGlvbihhKXtyZXR1cm4gYS5ZfHwoYS5ZPSI6IisoYS5aYS5nKyspLnRvU3RyaW5nKDM2KSl9LFBiPWZ1bmN0aW9uKGEsYil7aWYoYS5oJiZhLmgudSl7dmFyIGM9YS5oLnUsZD1hLlk7ZCBpbiBjJiZkZWxldGUgY1tkXTtEYShhLmgudSxiLGEpfWEuWT1ifTtGLnByb3RvdHlwZS5pPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ307CnZhciBRYj1mdW5jdGlvbihhKXthLk18fChhLk09bmV3IEViKGEpKTtyZXR1cm4gcChhLk0pfTtGLnByb3RvdHlwZS5BYT1mdW5jdGlvbihhKXtpZih0aGlzLmgmJnRoaXMuaCE9YSl0aHJvdyBFcnJvcigiTWV0aG9kIG5vdCBzdXBwb3J0ZWQiKTtGLmwuQWEuY2FsbCh0aGlzLGEpfTtGLnByb3RvdHlwZS5tYT1mdW5jdGlvbigpe3RoaXMuZz1aYSh0aGlzLkcuZywiRElWIil9O0YucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbihhKXtSYih0aGlzLGEpfTsKdmFyIFJiPWZ1bmN0aW9uKGEsYixjKXtpZihhLnMpdGhyb3cgRXJyb3IoIkNvbXBvbmVudCBhbHJlYWR5IHJlbmRlcmVkIik7YS5nfHxhLm1hKCk7Yj9iLmluc2VydEJlZm9yZShhLmcsY3x8bnVsbCk6YS5HLmcuYm9keS5hcHBlbmRDaGlsZChhLmcpO2EuaCYmIWEuaC5zfHxhLkkoKX0sU2I9ZnVuY3Rpb24oYSxiKXtpZihhLnMpdGhyb3cgRXJyb3IoIkNvbXBvbmVudCBhbHJlYWR5IHJlbmRlcmVkIik7aWYoYiYmYS53YShiKSl7YS5TYT0hMDt2YXIgYz1iYihiKTthLkcmJmEuRy5nPT1jfHwoYS5HPWI/bmV3IGZiKGJiKGIpKTpwYXx8KHBhPW5ldyBmYikpO2EuRWEoYik7YS5JKCl9ZWxzZSB0aHJvdyBFcnJvcigiSW52YWxpZCBlbGVtZW50IHRvIGRlY29yYXRlIik7fTtnPUYucHJvdG90eXBlO2cud2E9ZnVuY3Rpb24oKXtyZXR1cm4hMH07Zy5FYT1mdW5jdGlvbihhKXt0aGlzLmc9YX07CmcuST1mdW5jdGlvbigpe3RoaXMucz0hMDtUYih0aGlzLGZ1bmN0aW9uKGEpeyFhLnMmJmEuaSgpJiZhLkkoKX0pfTtnLlU9ZnVuY3Rpb24oKXtUYih0aGlzLGZ1bmN0aW9uKGEpe2EucyYmYS5VKCl9KTt0aGlzLk0mJkdiKHRoaXMuTSk7dGhpcy5zPSExfTtnLkM9ZnVuY3Rpb24oKXt0aGlzLnMmJnRoaXMuVSgpO3RoaXMuTSYmKHRoaXMuTS5kaXNwb3NlKCksZGVsZXRlIHRoaXMuTSk7VGIodGhpcyxmdW5jdGlvbihhKXthLmRpc3Bvc2UoKX0pOyF0aGlzLlNhJiZ0aGlzLmcmJiRhKHRoaXMuZyk7dGhpcy5oPXRoaXMuZz10aGlzLnU9dGhpcy5qPW51bGw7Ri5sLkMuY2FsbCh0aGlzKX07Zy5CYT1mdW5jdGlvbihhLGIpe3RoaXMuQ2EoYSxIKHRoaXMpLGIpfTsKZy5DYT1mdW5jdGlvbihhLGIsYyl7cCghIWEsIlByb3ZpZGVkIGVsZW1lbnQgbXVzdCBub3QgYmUgbnVsbC4iKTtpZihhLnMmJihjfHwhdGhpcy5zKSl0aHJvdyBFcnJvcigiQ29tcG9uZW50IGFscmVhZHkgcmVuZGVyZWQiKTtpZihiPDB8fGI+SCh0aGlzKSl0aHJvdyBFcnJvcigiQ2hpbGQgY29tcG9uZW50IGluZGV4IG91dCBvZiBib3VuZHMiKTt0aGlzLnUmJnRoaXMuanx8KHRoaXMudT17fSx0aGlzLmo9W10pO2lmKGEuaD09dGhpcyl7dmFyIGQ9dGhpcy51LGU9T2IoYSk7ZFtlXT1hO3hhKHRoaXMuaixhKX1lbHNlIERhKHRoaXMudSxPYihhKSxhKTtpZihhPT10aGlzKXRocm93IEVycm9yKCJVbmFibGUgdG8gc2V0IHBhcmVudCBjb21wb25lbnQiKTtpZihkPXRoaXMmJmEuaCYmYS5ZKWU9YS5oLGQ9YS5ZLGUudSYmZD8oZT1lLnUsZD0oZSE9PW51bGwmJmQgaW4gZT9lW2RdOnZvaWQgMCl8fG51bGwpOmQ9bnVsbDtpZihkJiZhLmghPXRoaXMpdGhyb3cgRXJyb3IoIlVuYWJsZSB0byBzZXQgcGFyZW50IGNvbXBvbmVudCIpOwphLmg9dGhpcztGLmwuQWEuY2FsbChhLHRoaXMpO3phKHRoaXMuaixiLDAsYSk7YS5zJiZ0aGlzLnMmJmEuaD09dGhpcz8oYz10aGlzLm5hKCksKGMuY2hpbGROb2Rlc1tiXXx8bnVsbCkhPWEuaSgpJiYoYS5pKCkucGFyZW50RWxlbWVudD09YyYmYy5yZW1vdmVDaGlsZChhLmkoKSksYj1jLmNoaWxkTm9kZXNbYl18fG51bGwsYy5pbnNlcnRCZWZvcmUoYS5pKCksYikpKTpjPyh0aGlzLmd8fHRoaXMubWEoKSxiPUkodGhpcyxiKzEpLFJiKGEsdGhpcy5uYSgpLGI/Yi5nOm51bGwpKTp0aGlzLnMmJiFhLnMmJmEuZyYmYS5nLnBhcmVudE5vZGUmJmEuZy5wYXJlbnROb2RlLm5vZGVUeXBlPT0xJiZhLkkoKX07Zy5uYT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmd9Owp2YXIgVWI9ZnVuY3Rpb24oYSl7aWYoYS56YT09bnVsbCl7dmFyIGI9YS5zP2EuZzphLkcuZy5ib2R5O2E6e3ZhciBjPWJiKGIpO2lmKGMuZGVmYXVsdFZpZXcmJmMuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSYmKGM9Yy5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKGIsbnVsbCkpKXtjPWMuZGlyZWN0aW9ufHxjLmdldFByb3BlcnR5VmFsdWUoImRpcmVjdGlvbiIpfHwiIjticmVhayBhfWM9IiJ9YS56YT0icnRsIj09KGN8fChiLmN1cnJlbnRTdHlsZT9iLmN1cnJlbnRTdHlsZS5kaXJlY3Rpb246bnVsbCl8fGIuc3R5bGUmJmIuc3R5bGUuZGlyZWN0aW9uKX1yZXR1cm4gYS56YX0sSD1mdW5jdGlvbihhKXtyZXR1cm4gYS5qP2Euai5sZW5ndGg6MH0sST1mdW5jdGlvbihhLGIpe3JldHVybiBhLmo/YS5qW2JdfHxudWxsOm51bGx9LFRiPWZ1bmN0aW9uKGEsYixjKXthLmomJmEuai5mb3JFYWNoKGIsYyl9LFZiPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuaiYmYj9hLmouaW5kZXhPZihiKToKLTF9O3ZhciBXYj17bWI6ImFjdGl2ZWRlc2NlbmRhbnQiLHJiOiJhdG9taWMiLHNiOiJhdXRvY29tcGxldGUiLHViOiJidXN5Iix4YjoiY2hlY2tlZCIseWI6ImNvbGluZGV4IixEYjoiY29udHJvbHMiLEViOiJjdXJyZW50IixHYjoiZGVzY3JpYmVkYnkiLEpiOiJkaXNhYmxlZCIsTGI6ImRyb3BlZmZlY3QiLE1iOiJleHBhbmRlZCIsTmI6ImZsb3d0byIsUGI6ImdyYWJiZWQiLFRiOiJoYXNwb3B1cCIsVmI6ImhpZGRlbiIsWGI6ImludmFsaWQiLFliOiJsYWJlbCIsWmI6ImxhYmVsbGVkYnkiLGFjOiJsZXZlbCIsZmM6ImxpdmUiLHZjOiJtdWx0aWxpbmUiLHdjOiJtdWx0aXNlbGVjdGFibGUiLEFjOiJvcmllbnRhdGlvbiIsQmM6Im93bnMiLENjOiJwb3NpbnNldCIsRWM6InByZXNzZWQiLEljOiJyZWFkb25seSIsS2M6InJlbGV2YW50IixMYzoicmVxdWlyZWQiLFBjOiJyb3dpbmRleCIsU2M6InNlbGVjdGVkIixVYzoic2V0c2l6ZSIsV2M6InNvcnQiLG1kOiJ2YWx1ZW1heCIsbmQ6InZhbHVlbWluIiwKb2Q6InZhbHVlbm93IixwZDoidmFsdWV0ZXh0In07dmFyIFhiO3ZhciBZYj17bmI6ImFsZXJ0IixvYjoiYWxlcnRkaWFsb2ciLHBiOiJhcHBsaWNhdGlvbiIscWI6ImFydGljbGUiLHRiOiJiYW5uZXIiLHZiOiJidXR0b24iLHdiOiJjaGVja2JveCIsemI6ImNvbHVtbmhlYWRlciIsQWI6ImNvbWJvYm94IixCYjoiY29tcGxlbWVudGFyeSIsQ2I6ImNvbnRlbnRpbmZvIixGYjoiZGVmaW5pdGlvbiIsSGI6ImRpYWxvZyIsSWI6ImRpcmVjdG9yeSIsS2I6ImRvY3VtZW50IixPYjoiZm9ybSIsUWI6ImdyaWQiLFJiOiJncmlkY2VsbCIsU2I6Imdyb3VwIixVYjoiaGVhZGluZyIsV2I6ImltZyIsYmM6ImxpbmsiLGNjOiJsaXN0IixkYzoibGlzdGJveCIsZWM6Imxpc3RpdGVtIixoYzoibG9nIixpYzoibWFpbiIsamM6Im1hcnF1ZWUiLGtjOiJtYXRoIixsYzoibWVudSIsbWM6Im1lbnViYXIiLG5jOiJtZW51aXRlbSIsb2M6Im1lbnVpdGVtY2hlY2tib3giLHBjOiJtZW51aXRlbXJhZGlvIix4YzoibmF2aWdhdGlvbiIseWM6Im5vdGUiLHpjOiJvcHRpb24iLApEYzoicHJlc2VudGF0aW9uIixGYzoicHJvZ3Jlc3NiYXIiLEdjOiJyYWRpbyIsSGM6InJhZGlvZ3JvdXAiLEpjOiJyZWdpb24iLE1jOiJyb3ciLE5jOiJyb3dncm91cCIsT2M6InJvd2hlYWRlciIsUWM6InNjcm9sbGJhciIsUmM6InNlYXJjaCIsVGM6InNlcGFyYXRvciIsVmM6InNsaWRlciIsWGM6InNwaW5idXR0b24iLFljOiJzdGF0dXMiLFpjOiJzd2l0Y2giLGFkOiJ0YWIiLGJkOiJ0YWJsaXN0IixjZDoidGFicGFuZWwiLGRkOiJ0ZXh0Ym94IixlZDoidGV4dGluZm8iLGZkOiJ0aW1lciIsZ2Q6InRvb2xiYXIiLGhkOiJ0b29sdGlwIixqZDoidHJlZSIsa2Q6InRyZWVncmlkIixsZDoidHJlZWl0ZW0ifTt2YXIgWmI9ZnVuY3Rpb24oYSxiKXtiPyhwKENhKFliLGIpLCJObyBzdWNoIEFSSUEgcm9sZSAiK2IpLGEuc2V0QXR0cmlidXRlKCJyb2xlIixiKSk6YS5yZW1vdmVBdHRyaWJ1dGUoInJvbGUiKX0sYWM9ZnVuY3Rpb24oYSxiLGMpe0FycmF5LmlzQXJyYXkoYykmJihjPWMuam9pbigiICIpKTt2YXIgZD0kYihiKTtjPT09IiJ8fGM9PXZvaWQgMD8oWGJ8fChjPXt9LFhiPShjLmF0b21pYz0hMSxjLmF1dG9jb21wbGV0ZT0ibm9uZSIsYy5kcm9wZWZmZWN0PSJub25lIixjLmhhc3BvcHVwPSExLGMubGl2ZT0ib2ZmIixjLm11bHRpbGluZT0hMSxjLm11bHRpc2VsZWN0YWJsZT0hMSxjLm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIsYy5yZWFkb25seT0hMSxjLnJlbGV2YW50PSJhZGRpdGlvbnMgdGV4dCIsYy5yZXF1aXJlZD0hMSxjLnNvcnQ9Im5vbmUiLGMuYnVzeT0hMSxjLmRpc2FibGVkPSExLGMuaGlkZGVuPSExLGMuaW52YWxpZD0iZmFsc2UiLGMpKSxjPVhiLGIgaW4gYz9hLnNldEF0dHJpYnV0ZShkLApjW2JdKTphLnJlbW92ZUF0dHJpYnV0ZShkKSk6YS5zZXRBdHRyaWJ1dGUoZCxjKX0sJGI9ZnVuY3Rpb24oYSl7cChhLCJBUklBIGF0dHJpYnV0ZSBjYW5ub3QgYmUgZW1wdHkuIik7cChDYShXYixhKSwiTm8gc3VjaCBBUklBIGF0dHJpYnV0ZSAiK2EpO3JldHVybiJhcmlhLSIrYX07dmFyIGRjPWZ1bmN0aW9uKGEsYixjLGQsZSxmKXtpZih2JiZlKXJldHVybiBiYyhhKTtpZihlJiYhZClyZXR1cm4hMTtpZighdCl7dHlwZW9mIGI9PT0ibnVtYmVyIiYmKGI9Y2MoYikpO3ZhciBoPWI9PTE3fHxiPT0xOHx8diYmYj09OTE7aWYoKCFjfHx2KSYmaHx8diYmYj09MTYmJihkfHxmKSlyZXR1cm4hMX1pZih1JiZkJiZjKXN3aXRjaChhKXtjYXNlIDIyMDpjYXNlIDIxOTpjYXNlIDIyMTpjYXNlIDE5MjpjYXNlIDE4NjpjYXNlIDE4OTpjYXNlIDE4NzpjYXNlIDE4ODpjYXNlIDE5MDpjYXNlIDE5MTpjYXNlIDE5MjpjYXNlIDIyMjpyZXR1cm4hMX1zd2l0Y2goYSl7Y2FzZSAxMzpyZXR1cm4gdD9mfHxlPyExOiEoYyYmZCk6ITA7Y2FzZSAyNzpyZXR1cm4hdSYmIXR9cmV0dXJuIHQmJihkfHxlfHxmKT8hMTpiYyhhKX0sYmM9ZnVuY3Rpb24oYSl7aWYoYT49NDgmJmE8PTU3fHxhPj05NiYmYTw9MTA2fHxhPj02NSYmYTw9OTB8fHUmJmE9PTApcmV0dXJuITA7c3dpdGNoKGEpe2Nhc2UgMzI6Y2FzZSA0MzpjYXNlIDYzOmNhc2UgNjQ6Y2FzZSAxMDc6Y2FzZSAxMDk6Y2FzZSAxMTA6Y2FzZSAxMTE6Y2FzZSAxODY6Y2FzZSA1OTpjYXNlIDE4OTpjYXNlIDE4NzpjYXNlIDYxOmNhc2UgMTg4OmNhc2UgMTkwOmNhc2UgMTkxOmNhc2UgMTkyOmNhc2UgMjIyOmNhc2UgMjE5OmNhc2UgMjIwOmNhc2UgMjIxOmNhc2UgMTYzOmNhc2UgNTg6cmV0dXJuITA7CmNhc2UgMTczOmNhc2UgMTcxOnJldHVybiB0O2RlZmF1bHQ6cmV0dXJuITF9fSxjYz1mdW5jdGlvbihhKXtpZih0KWE9ZWMoYSk7ZWxzZSBpZih2JiZ1KXN3aXRjaChhKXtjYXNlIDkzOmE9OTF9cmV0dXJuIGF9LGVjPWZ1bmN0aW9uKGEpe3N3aXRjaChhKXtjYXNlIDYxOnJldHVybiAxODc7Y2FzZSA1OTpyZXR1cm4gMTg2O2Nhc2UgMTczOnJldHVybiAxODk7Y2FzZSAyMjQ6cmV0dXJuIDkxO2Nhc2UgMDpyZXR1cm4gMjI0O2RlZmF1bHQ6cmV0dXJuIGF9fTt2YXIgZmM9ZnVuY3Rpb24oYSxiLGMsZCl7ei5jYWxsKHRoaXMsZCk7dGhpcy50eXBlPSJrZXkiO3RoaXMuZz1hO3RoaXMucmVwZWF0PWN9O24oZmMseik7dmFyIEo9ZnVuY3Rpb24oYSxiKXtELmNhbGwodGhpcyk7YSYmZ2ModGhpcyxhLGIpfTtuKEosRCk7Zz1KLnByb3RvdHlwZTtnLlI9bnVsbDtnLnFhPW51bGw7Zy5KYT1udWxsO2cucmE9bnVsbDtnLkY9LTE7Zy5LPS0xO2cuRGE9ITE7CnZhciBoYz17MzoxMywxMjoxNDQsNjMyMzI6MzgsNjMyMzM6NDAsNjMyMzQ6MzcsNjMyMzU6MzksNjMyMzY6MTEyLDYzMjM3OjExMyw2MzIzODoxMTQsNjMyMzk6MTE1LDYzMjQwOjExNiw2MzI0MToxMTcsNjMyNDI6MTE4LDYzMjQzOjExOSw2MzI0NDoxMjAsNjMyNDU6MTIxLDYzMjQ2OjEyMiw2MzI0NzoxMjMsNjMyNDg6NDQsNjMyNzI6NDYsNjMyNzM6MzYsNjMyNzU6MzUsNjMyNzY6MzMsNjMyNzc6MzQsNjMyODk6MTQ0LDYzMzAyOjQ1fSxpYz17VXA6MzgsRG93bjo0MCxMZWZ0OjM3LFJpZ2h0OjM5LEVudGVyOjEzLEYxOjExMixGMjoxMTMsRjM6MTE0LEY0OjExNSxGNToxMTYsRjY6MTE3LEY3OjExOCxGODoxMTksRjk6MTIwLEYxMDoxMjEsRjExOjEyMixGMTI6MTIzLCJVKzAwN0YiOjQ2LEhvbWU6MzYsRW5kOjM1LFBhZ2VVcDozMyxQYWdlRG93bjozNCxJbnNlcnQ6NDV9LGpjPXYmJnQ7CkoucHJvdG90eXBlLmc9ZnVuY3Rpb24oYSl7dSYmKHRoaXMuRj09MTcmJiFhLmN0cmxLZXl8fHRoaXMuRj09MTgmJiFhLmFsdEtleXx8diYmdGhpcy5GPT05MSYmIWEubWV0YUtleSkmJih0aGlzLks9dGhpcy5GPS0xKTt0aGlzLkY9PS0xJiYoYS5jdHJsS2V5JiZhLmchPTE3P3RoaXMuRj0xNzphLmFsdEtleSYmYS5nIT0xOD90aGlzLkY9MTg6YS5tZXRhS2V5JiZhLmchPTkxJiYodGhpcy5GPTkxKSk7ZGMoYS5nLHRoaXMuRixhLnNoaWZ0S2V5LGEuY3RybEtleSxhLmFsdEtleSxhLm1ldGFLZXkpPyh0aGlzLks9Y2MoYS5nKSxqYyYmKHRoaXMuRGE9YS5hbHRLZXkpKTp0aGlzLmhhbmRsZUV2ZW50KGEpfTtKLnByb3RvdHlwZS5oPWZ1bmN0aW9uKGEpe3RoaXMuSz10aGlzLkY9LTE7dGhpcy5EYT1hLmFsdEtleX07CkoucHJvdG90eXBlLmhhbmRsZUV2ZW50PWZ1bmN0aW9uKGEpe3ZhciBiPWEuaCxjPWIuYWx0S2V5O2lmKHUmJmEudHlwZT09ImtleXByZXNzIil7dmFyIGQ9dGhpcy5LO3ZhciBlPWIuY2hhckNvZGU+PTAmJmIuY2hhckNvZGU8NjMyMzImJmJjKGQpP2IuY2hhckNvZGU6MH1lbHNlIGEudHlwZT09ImtleXByZXNzIj8oamMmJihjPXRoaXMuRGEpLGIua2V5Q29kZT09Yi5jaGFyQ29kZT9iLmtleUNvZGU8MzI/KGQ9Yi5rZXlDb2RlLGU9MCk6KGQ9dGhpcy5LLGU9Yi5jaGFyQ29kZSk6KGQ9Yi5rZXlDb2RlfHx0aGlzLkssZT1iLmNoYXJDb2RlfHwwKSk6KGQ9Yi5rZXlDb2RlfHx0aGlzLkssZT1iLmNoYXJDb2RlfHwwKSx2JiZlPT02MyYmZD09MjI0JiYoZD0xOTEpO3ZhciBmPWQ9Y2MoZCk7ZD9kPj02MzIzMiYmZCBpbiBoYz9mPWhjW2RdOmQ9PTI1JiZhLnNoaWZ0S2V5JiYoZj05KTpiLmtleUlkZW50aWZpZXImJmIua2V5SWRlbnRpZmllciBpbiBpYyYmKGY9aWNbYi5rZXlJZGVudGlmaWVyXSk7CmlmKCF0fHxhLnR5cGUhPSJrZXlwcmVzcyJ8fGRjKGYsdGhpcy5GLGEuc2hpZnRLZXksYS5jdHJsS2V5LGMsYS5tZXRhS2V5KSlhPWY9PXRoaXMuRix0aGlzLkY9ZixiPW5ldyBmYyhmLGUsYSxiKSxiLmFsdEtleT1jLEUodGhpcyxiKX07Si5wcm90b3R5cGUuaT1mdW5jdGlvbigpe3JldHVybiB0aGlzLlJ9O3ZhciBnYz1mdW5jdGlvbihhLGIsYyl7YS5yYSYma2MoYSk7YS5SPWI7YS5xYT11YihhLlIsImtleXByZXNzIixhLGMpO2EuSmE9dWIoYS5SLCJrZXlkb3duIixhLmcsYyxhKTthLnJhPXViKGEuUiwia2V5dXAiLGEuaCxjLGEpfSxrYz1mdW5jdGlvbihhKXthLnFhJiYoQShhLnFhKSxBKGEuSmEpLEEoYS5yYSksYS5xYT1udWxsLGEuSmE9bnVsbCxhLnJhPW51bGwpO2EuUj1udWxsO2EuRj0tMTthLks9LTF9O0oucHJvdG90eXBlLkM9ZnVuY3Rpb24oKXtKLmwuQy5jYWxsKHRoaXMpO2tjKHRoaXMpfTt2YXIgSz17Z2E6Im1vdXNlZG93biIsaGE6Im1vdXNldXAiLGZhOiJtb3VzZWNhbmNlbCIsc2M6Im1vdXNlbW92ZSIsdWM6Im1vdXNlb3ZlciIsdGM6Im1vdXNlb3V0IixxYzoibW91c2VlbnRlciIscmM6Im1vdXNlbGVhdmUifTt2YXIgbGM9ZnVuY3Rpb24oYSl7cmV0dXJuIHR5cGVvZiBhLmNsYXNzTmFtZT09InN0cmluZyI/YS5jbGFzc05hbWU6YS5nZXRBdHRyaWJ1dGUmJmEuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIn0sTD1mdW5jdGlvbihhKXtyZXR1cm4gYS5jbGFzc0xpc3Q/YS5jbGFzc0xpc3Q6bGMoYSkubWF0Y2goL1xTKy9nKXx8W119LG1jPWZ1bmN0aW9uKGEsYil7dHlwZW9mIGEuY2xhc3NOYW1lPT0ic3RyaW5nIj9hLmNsYXNzTmFtZT1iOmEuc2V0QXR0cmlidXRlJiZhLnNldEF0dHJpYnV0ZSgiY2xhc3MiLGIpfSxuYz1mdW5jdGlvbihhLGIpe2EuY2xhc3NMaXN0P2I9YS5jbGFzc0xpc3QuY29udGFpbnMoYik6KGE9TChhKSxiPXZhKGEsYik+PTApO3JldHVybiBifSxvYz1mdW5jdGlvbihhLGIpe2lmKGEuY2xhc3NMaXN0KWEuY2xhc3NMaXN0LmFkZChiKTtlbHNlIGlmKCFuYyhhLGIpKXt2YXIgYz1sYyhhKTttYyhhLGMrKGMubGVuZ3RoPjA/IiAiK2I6YikpfX0scGM9ZnVuY3Rpb24oYSxiKXtpZihhLmNsYXNzTGlzdClBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGIsCmZ1bmN0aW9uKGUpe29jKGEsZSl9KTtlbHNle3ZhciBjPXt9O0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoTChhKSxmdW5jdGlvbihlKXtjW2VdPSEwfSk7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChiLGZ1bmN0aW9uKGUpe2NbZV09ITB9KTtiPSIiO2Zvcih2YXIgZCBpbiBjKWIrPWIubGVuZ3RoPjA/IiAiK2Q6ZDttYyhhLGIpfX0scWM9ZnVuY3Rpb24oYSxiKXthLmNsYXNzTGlzdD9hLmNsYXNzTGlzdC5yZW1vdmUoYik6bmMoYSxiKSYmbWMoYSxBcnJheS5wcm90b3R5cGUuZmlsdGVyLmNhbGwoTChhKSxmdW5jdGlvbihjKXtyZXR1cm4gYyE9Yn0pLmpvaW4oIiAiKSl9LHJjPWZ1bmN0aW9uKGEsYil7YS5jbGFzc0xpc3Q/QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChiLGZ1bmN0aW9uKGMpe3FjKGEsYyl9KTptYyhhLEFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbChMKGEpLGZ1bmN0aW9uKGMpe3JldHVybiEodmEoYixjKT49MCl9KS5qb2luKCIgIikpfTt2YXIgdGM9ZnVuY3Rpb24oYSxiKXtpZighYSl0aHJvdyBFcnJvcigiSW52YWxpZCBjbGFzcyBuYW1lICIrYSk7aWYodHlwZW9mIGIhPT0iZnVuY3Rpb24iKXRocm93IEVycm9yKCJJbnZhbGlkIGRlY29yYXRvciBmdW5jdGlvbiAiK2IpO3NjW2FdPWJ9LHVjPXt9LHNjPXt9O3ZhciB2Yz1mdW5jdGlvbihhKXt0aGlzLkE9YX07aWEodmMpO3ZhciB3Yz1mdW5jdGlvbihhLGIpe2EmJihhLnRhYkluZGV4PWI/MDotMSl9LHljPWZ1bmN0aW9uKGEsYixjKXtjLmlkJiZQYihiLGMuaWQpO3ZhciBkPWEuZygpLGU9ITEsZj1MKGMpO2YmJkFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoZixmdW5jdGlvbihoKXtoPT1kP2U9ITA6aCYmdGhpcy51KGIsaCxkKX0sYSk7ZXx8b2MoYyxkKTt4YyhiLGMpO3JldHVybiBjfTt2Yy5wcm90b3R5cGUudT1mdW5jdGlvbihhLGIsYyl7Yj09YysiLWRpc2FibGVkIj9hLlgoITEpOmI9PWMrIi1ob3Jpem9udGFsIj96YyhhLCJob3Jpem9udGFsIik6Yj09YysiLXZlcnRpY2FsIiYmemMoYSwidmVydGljYWwiKX07CnZhciB4Yz1mdW5jdGlvbihhLGIpe2lmKGIpZm9yKHZhciBjPWIuZmlyc3RDaGlsZCxkO2MmJmMucGFyZW50Tm9kZT09Yjspe2Q9Yy5uZXh0U2libGluZztpZihjLm5vZGVUeXBlPT0xKXthOnt2YXIgZT1jO3AoZSk7ZT1MKGUpO2Zvcih2YXIgZj1lLmxlbmd0aCxoPTA7aDxmO2grKyl7dmFyIGs9ZVtoXTtpZihrPWsgaW4gc2M/c2Nba10oKTpudWxsKXtlPWs7YnJlYWsgYX19ZT1udWxsfWUmJihlLmc9YyxhLmlzRW5hYmxlZCgpfHxlLlgoITEpLGEuQmEoZSksU2IoZSxjKSl9ZWxzZSBjLm5vZGVWYWx1ZSYmSGEoYy5ub2RlVmFsdWUpIT0iInx8Yi5yZW1vdmVDaGlsZChjKTtjPWR9fSxBYz1mdW5jdGlvbihhLGIpe2I9Yi5pKCk7cChiLCJUaGUgY29udGFpbmVyIERPTSBlbGVtZW50IGNhbm5vdCBiZSBudWxsLiIpO0tiKGIsdCk7KGE9YS5BKSYmWmIoYixhKX07dmMucHJvdG90eXBlLmc9ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy1jb250YWluZXIifTsKdmMucHJvdG90eXBlLmo9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nKCksYz1bYixhLkw9PSJob3Jpem9udGFsIj9iKyItaG9yaXpvbnRhbCI6YisiLXZlcnRpY2FsIl07YS5pc0VuYWJsZWQoKXx8Yy5wdXNoKGIrIi1kaXNhYmxlZCIpO3JldHVybiBjfTt2YXIgQmM9ZnVuY3Rpb24oKXt9O3ZhciBNPWZ1bmN0aW9uKCl7fSxDYztpYShNKTt2YXIgRGM9e2J1dHRvbjoicHJlc3NlZCIsY2hlY2tib3g6ImNoZWNrZWQiLG1lbnVpdGVtOiJzZWxlY3RlZCIsbWVudWl0ZW1jaGVja2JveDoiY2hlY2tlZCIsbWVudWl0ZW1yYWRpbzoiY2hlY2tlZCIscmFkaW86ImNoZWNrZWQiLHRhYjoic2VsZWN0ZWQiLHRyZWVpdGVtOiJzZWxlY3RlZCJ9O00ucHJvdG90eXBlLk5hPWZ1bmN0aW9uKCl7fTtNLnByb3RvdHlwZS54YT1mdW5jdGlvbihhKXt2YXIgYj1hLkcsYz1iLmgsZD10aGlzLk4oKSxlPVtkXSxmPXRoaXMuTigpO2YhPWQmJmUucHVzaChmKTtkPWEubTtmb3IoZj1bXTtkOyl7dmFyIGg9ZCYtZDtmLnB1c2goRWModGhpcyxoKSk7ZCY9fmh9ZS5wdXNoLmFwcGx5KGUsZik7KGQ9YS5GYSkmJmUucHVzaC5hcHBseShlLGQpO3JldHVybiBjLmNhbGwoYiwiRElWIixlLmpvaW4oIiAiKSxhLmlhKX07Ck0ucHJvdG90eXBlLnlhPWZ1bmN0aW9uKGEsYil7Yi5pZCYmUGIoYSxiLmlkKTtiJiZiLmZpcnN0Q2hpbGQ/RmMoYSxiLmZpcnN0Q2hpbGQubmV4dFNpYmxpbmc/eWEoYi5jaGlsZE5vZGVzKTpiLmZpcnN0Q2hpbGQpOmEuaWE9bnVsbDt2YXIgYz0wLGQ9dGhpcy5OKCksZT10aGlzLk4oKSxmPSExLGg9ITEsaz15YShMKGIpKTtrLmZvckVhY2goZnVuY3Rpb24ocSl7Znx8cSE9ZD9ofHxxIT1lP2N8PUdjKHRoaXMscSk6aD0hMDooZj0hMCxlPT1kJiYoaD0hMCkpO0djKHRoaXMscSk9PTEmJihzYShiKSxkYihiKSYmZWIoYikmJmNiKGIsITEpKX0sdGhpcyk7YS5tPWM7Znx8KGsucHVzaChkKSxlPT1kJiYoaD0hMCkpO2h8fGsucHVzaChlKTsoYT1hLkZhKSYmay5wdXNoLmFwcGx5KGssYSk7ZiYmaCYmIWF8fG1jKGIsay5qb2luKCIgIikpO3JldHVybiBifTsKdmFyIEhjPWZ1bmN0aW9uKGEsYil7aWYoYT1hLk5hKCkpe3AoYiwiVGhlIGVsZW1lbnQgcGFzc2VkIGFzIGEgZmlyc3QgcGFyYW1ldGVyIGNhbm5vdCBiZSBudWxsLiIpO3ZhciBjPWIuZ2V0QXR0cmlidXRlKCJyb2xlIil8fG51bGw7YSE9YyYmWmIoYixhKX19LEljPWZ1bmN0aW9uKGEsYil7dmFyIGM7aWYoYS5EJjMyJiYoYz1hLmkoKSkpe2lmKCFiJiZhLm0mMzIpe3RyeXtjLmJsdXIoKX1jYXRjaChkKXt9YS5tJjMyJiZhLlFhKG51bGwpfShkYihjKSYmZWIoYykpIT1iJiZjYihjLGIpfX0sSmM9ZnVuY3Rpb24oYSxiLGMpe0NjfHwoQ2M9ezE6ImRpc2FibGVkIiw4OiJzZWxlY3RlZCIsMTY6ImNoZWNrZWQiLDY0OiJleHBhbmRlZCJ9KTtwKGEsIlRoZSBlbGVtZW50IHBhc3NlZCBhcyBhIGZpcnN0IHBhcmFtZXRlciBjYW5ub3QgYmUgbnVsbC4iKTtiPUNjW2JdO3ZhciBkPWEuZ2V0QXR0cmlidXRlKCJyb2xlIil8fG51bGw7ZCYmKGQ9RGNbZF18fGIsYj1iPT0iY2hlY2tlZCJ8fGI9PQoic2VsZWN0ZWQiP2Q6Yik7YiYmYWMoYSxiLGMpfTtNLnByb3RvdHlwZS5OPWZ1bmN0aW9uKCl7cmV0dXJuImdvb2ctY29udHJvbCJ9O3ZhciBFYz1mdW5jdGlvbihhLGIpe2EuZ3x8S2MoYSk7cmV0dXJuIGEuZ1tiXX0sR2M9ZnVuY3Rpb24oYSxiKXthLmh8fChhLmd8fEtjKGEpLGEuaD1FYShhLmcpKTthPXBhcnNlSW50KGEuaFtiXSwxMCk7cmV0dXJuIGlzTmFOKGEpPzA6YX0sS2M9ZnVuY3Rpb24oYSl7dmFyIGI9YS5OKCk7dmFyIGM9Yi5yZXBsYWNlKC9ceGEwfFxzL2csIiAiKS5pbmRleE9mKCIgIikhPS0xO3AoIWMsIkNvbnRyb2xSZW5kZXJlciBoYXMgYW4gaW52YWxpZCBjc3MgY2xhc3M6ICciK2IrIiciKTthLmc9ezE6YisiLWRpc2FibGVkIiwyOmIrIi1ob3ZlciIsNDpiKyItYWN0aXZlIiw4OmIrIi1zZWxlY3RlZCIsMTY6YisiLWNoZWNrZWQiLDMyOmIrIi1mb2N1c2VkIiw2NDpiKyItb3BlbiJ9fTt2YXIgTj1mdW5jdGlvbihhLGIsYyl7Ri5jYWxsKHRoaXMsYyk7aWYoIWIpe2ZvcihiPXRoaXMuY29uc3RydWN0b3I7Yjspe3ZhciBkPW5hKGIpO2lmKGQ9dWNbZF0pYnJlYWs7Yj0oYj1PYmplY3QuZ2V0UHJvdG90eXBlT2YoYi5wcm90b3R5cGUpKSYmYi5jb25zdHJ1Y3Rvcn1iPWQ/dHlwZW9mIGQuVj09PSJmdW5jdGlvbiI/ZC5WKCk6bmV3IGQ6bnVsbH10aGlzLnY9Yjt0aGlzLmlhPWEhPT12b2lkIDA/YTpudWxsfTtuKE4sRik7Zz1OLnByb3RvdHlwZTtnLmlhPW51bGw7Zy5tPTA7Zy5EPTM5O2cuUD0wO2cuT2E9ITA7Zy5GYT1udWxsO2cuSGE9ITA7Zy5tYT1mdW5jdGlvbigpe3ZhciBhPXRoaXMudi54YSh0aGlzKTt0aGlzLmc9YTtIYyh0aGlzLnYsYSk7S2IoYSwhMCk7dGhpcy5pc1Zpc2libGUoKXx8KGEuc3R5bGUuZGlzcGxheT0ibm9uZSIsYSYmYWMoYSwiaGlkZGVuIiwhMCkpfTtnLm5hPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaSgpfTtnLndhPWZ1bmN0aW9uKCl7cmV0dXJuITB9OwpnLkVhPWZ1bmN0aW9uKGEpe3RoaXMuZz1hPXRoaXMudi55YSh0aGlzLGEpO0hjKHRoaXMudixhKTtLYihhLCEwKTt0aGlzLk9hPWEuc3R5bGUuZGlzcGxheSE9Im5vbmUifTsKZy5JPWZ1bmN0aW9uKCl7Ti5sLkkuY2FsbCh0aGlzKTt2YXIgYT10aGlzLmc7cChhLCJDYW4gbm90IGNhbGwgZ2V0RWxlbWVudFN0cmljdCBiZWZvcmUgcmVuZGVyaW5nL2RlY29yYXRpbmcuIik7cCh0aGlzKTtwKGEpO3RoaXMuaXNWaXNpYmxlKCl8fGFjKGEsImhpZGRlbiIsIXRoaXMuaXNWaXNpYmxlKCkpO3RoaXMuaXNFbmFibGVkKCl8fEpjKGEsMSwhdGhpcy5pc0VuYWJsZWQoKSk7dGhpcy5EJjgmJkpjKGEsOCwhISh0aGlzLm0mOCkpO3RoaXMuRCYxNiYmSmMoYSwxNiwhISh0aGlzLm0mMTYpKTt0aGlzLkQmNjQmJkpjKGEsNjQsISEodGhpcy5tJjY0KSk7dmFyIGI9dGhpcy52O1ViKHRoaXMpJiYoYT10aGlzLmkoKSxiPWIuTigpKyItcnRsIiwoYT1hLmk/YS5pKCk6YSkmJnBjKGEsW2JdKSk7dGhpcy5pc0VuYWJsZWQoKSYmSWModGhpcyx0aGlzLmlzVmlzaWJsZSgpKTt0aGlzLkQmLTImJih0aGlzLkhhJiZMYyh0aGlzLCEwKSx0aGlzLkQmMzImJihhPXRoaXMuaSgpKSkmJihiPQp0aGlzLlp8fCh0aGlzLlo9bmV3IEopLGdjKGIsYSksQihCKEIoUWIodGhpcyksYiwia2V5Iix0aGlzLmFhKSxhLCJmb2N1cyIsdGhpcy5YYSksYSwiYmx1ciIsdGhpcy5RYSkpfTt2YXIgTGM9ZnVuY3Rpb24oYSxiKXt2YXIgYz1RYihhKSxkPWEuaSgpO2I/KEIoQihCKEIoYyxkLEsuZ2EsYS5zYSksZCxbSy5oYSxLLmZhXSxhLnZhKSxkLCJtb3VzZW92ZXIiLGEudWEpLGQsIm1vdXNlb3V0IixhLnRhKSxhLmNhIT1CYyYmQihjLGQsImNvbnRleHRtZW51IixhLmNhKSk6KEMoQyhDKEMoYyxkLEsuZ2EsYS5zYSksZCxbSy5oYSxLLmZhXSxhLnZhKSxkLCJtb3VzZW92ZXIiLGEudWEpLGQsIm1vdXNlb3V0IixhLnRhKSxhLmNhIT1CYyYmQyhjLGQsImNvbnRleHRtZW51IixhLmNhKSl9O04ucHJvdG90eXBlLlU9ZnVuY3Rpb24oKXtOLmwuVS5jYWxsKHRoaXMpO3RoaXMuWiYma2ModGhpcy5aKTt0aGlzLmlzVmlzaWJsZSgpJiZ0aGlzLmlzRW5hYmxlZCgpJiZJYyh0aGlzLCExKX07Ck4ucHJvdG90eXBlLkM9ZnVuY3Rpb24oKXtOLmwuQy5jYWxsKHRoaXMpO3RoaXMuWiYmKHRoaXMuWi5kaXNwb3NlKCksZGVsZXRlIHRoaXMuWik7ZGVsZXRlIHRoaXMudjt0aGlzLkZhPXRoaXMuaWE9bnVsbH07dmFyIEZjPWZ1bmN0aW9uKGEsYil7YS5pYT1ifTtOLnByb3RvdHlwZS5pc1Zpc2libGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5PYX07Ti5wcm90b3R5cGUuaXNFbmFibGVkPWZ1bmN0aW9uKCl7cmV0dXJuISh0aGlzLm0mMSl9O04ucHJvdG90eXBlLlg9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5oO2ImJnR5cGVvZiBiLmlzRW5hYmxlZD09ImZ1bmN0aW9uIiYmIWIuaXNFbmFibGVkKCl8fCFPKHRoaXMsMSwhYSl8fChhfHwoTWModGhpcywhMSksUCh0aGlzLCExKSksdGhpcy5pc1Zpc2libGUoKSYmSWModGhpcyxhKSxUKHRoaXMsMSwhYSwhMCkpfTt2YXIgUD1mdW5jdGlvbihhLGIpe08oYSwyLGIpJiZUKGEsMixiKX07Ck4ucHJvdG90eXBlLmlzQWN0aXZlPWZ1bmN0aW9uKCl7cmV0dXJuISEodGhpcy5tJjQpfTsKdmFyIE1jPWZ1bmN0aW9uKGEsYil7TyhhLDQsYikmJlQoYSw0LGIpfSxOYz1mdW5jdGlvbihhLGIpe08oYSw4LGIpJiZUKGEsOCxiKX0sT2M9ZnVuY3Rpb24oYSxiKXtPKGEsNjQsYikmJlQoYSw2NCxiKX0sVD1mdW5jdGlvbihhLGIsYyxkKXtpZighZCYmYj09MSlhLlgoIWMpO2Vsc2UgaWYoYS5EJmImJmMhPSEhKGEubSZiKSl7dmFyIGU9YS52O2lmKGQ9YS5pKCkpe2lmKGU9RWMoZSxiKSl7dmFyIGY9YS5pP2EuaSgpOmE7ZiYmKGM/cGM6cmMpKGYsW2VdKX1KYyhkLGIsYyl9YS5tPWM/YS5tfGI6YS5tJn5ifX0sUGM9ZnVuY3Rpb24oYSxiLGMpe2lmKGEucyYmYS5tJmImJiFjKXRocm93IEVycm9yKCJDb21wb25lbnQgYWxyZWFkeSByZW5kZXJlZCIpOyFjJiZhLm0mYiYmVChhLGIsITEpO2EuRD1jP2EuRHxiOmEuRCZ+Yn0sVT1mdW5jdGlvbihhLGIpe3JldHVybiEhKDI1NSZiKSYmISEoYS5EJmIpfSxPPWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4hIShhLkQmYikmJiEhKGEubSZiKSE9CmMmJighKGEuUCZiKXx8RShhLE5iKGIsYykpKSYmIWEuYmF9O04ucHJvdG90eXBlLnVhPWZ1bmN0aW9uKGEpeyFRYyhhLHRoaXMuaSgpKSYmRSh0aGlzLCJlbnRlciIpJiZ0aGlzLmlzRW5hYmxlZCgpJiZVKHRoaXMsMikmJlAodGhpcywhMCl9O04ucHJvdG90eXBlLnRhPWZ1bmN0aW9uKGEpeyFRYyhhLHRoaXMuaSgpKSYmRSh0aGlzLCJsZWF2ZSIpJiYoVSh0aGlzLDQpJiZNYyh0aGlzLCExKSxVKHRoaXMsMikmJlAodGhpcywhMSkpfTtOLnByb3RvdHlwZS5jYT1CYzt2YXIgUWM9ZnVuY3Rpb24oYSxiKXtyZXR1cm4hIWEucmVsYXRlZFRhcmdldCYmYWIoYixhLnJlbGF0ZWRUYXJnZXQpfTsKTi5wcm90b3R5cGUuc2E9ZnVuY3Rpb24oYSl7aWYodGhpcy5pc0VuYWJsZWQoKSYmKFUodGhpcywyKSYmUCh0aGlzLCEwKSwhKGEuaC5idXR0b24hPTB8fHYmJmEuY3RybEtleSkpKXtVKHRoaXMsNCkmJk1jKHRoaXMsITApO3ZhciBiO2lmKGI9dGhpcy52KXt2YXIgYztiPXRoaXMuRCYzMiYmKGM9dGhpcy5pKCkpP2RiKGMpJiZlYihjKTohMX1iJiZ0aGlzLmkoKS5mb2N1cygpfWEuaC5idXR0b24hPTB8fHYmJmEuY3RybEtleXx8YS5qKCl9O04ucHJvdG90eXBlLnZhPWZ1bmN0aW9uKGEpe3RoaXMuaXNFbmFibGVkKCkmJihVKHRoaXMsMikmJlAodGhpcywhMCksdGhpcy5pc0FjdGl2ZSgpJiZSYyh0aGlzLGEpJiZVKHRoaXMsNCkmJk1jKHRoaXMsITEpKX07CnZhciBSYz1mdW5jdGlvbihhLGIpe2lmKFUoYSwxNikpe3ZhciBjPSEoYS5tJjE2KTtPKGEsMTYsYykmJlQoYSwxNixjKX1VKGEsOCkmJk5jKGEsITApO1UoYSw2NCkmJk9jKGEsIShhLm0mNjQpKTtjPW5ldyB5KCJhY3Rpb24iLGEpO2ImJihjLmFsdEtleT1iLmFsdEtleSxjLmN0cmxLZXk9Yi5jdHJsS2V5LGMubWV0YUtleT1iLm1ldGFLZXksYy5zaGlmdEtleT1iLnNoaWZ0S2V5LGMuRz1iLkcsYy50aW1lU3RhbXA9Yi50aW1lU3RhbXApO3JldHVybiBFKGEsYyl9O04ucHJvdG90eXBlLlhhPWZ1bmN0aW9uKCl7VSh0aGlzLDMyKSYmTyh0aGlzLDMyLCEwKSYmVCh0aGlzLDMyLCEwKX07Ti5wcm90b3R5cGUuUWE9ZnVuY3Rpb24oKXtVKHRoaXMsNCkmJk1jKHRoaXMsITEpO1UodGhpcywzMikmJk8odGhpcywzMiwhMSkmJlQodGhpcywzMiwhMSl9OwpOLnByb3RvdHlwZS5hYT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5pc1Zpc2libGUoKSYmdGhpcy5pc0VuYWJsZWQoKSYmYS5nPT0xMyYmUmModGhpcyxhKT8oYS5qKCksYS52KCksITApOiExfTtpZih0eXBlb2YgTiE9PSJmdW5jdGlvbiIpdGhyb3cgRXJyb3IoIkludmFsaWQgY29tcG9uZW50IGNsYXNzICIrTik7aWYodHlwZW9mIE0hPT0iZnVuY3Rpb24iKXRocm93IEVycm9yKCJJbnZhbGlkIHJlbmRlcmVyIGNsYXNzICIrTSk7dmFyIFNjPW5hKE4pO3VjW1NjXT1NO3RjKCJnb29nLWNvbnRyb2wiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBOKG51bGwpfSk7dmFyIFY9ZnVuY3Rpb24oYSxiLGMpe0YuY2FsbCh0aGlzLGMpO3RoaXMuZWE9Ynx8dmMuVigpO3RoaXMuTD1hfHwidmVydGljYWwifTtuKFYsRik7Zz1WLnByb3RvdHlwZTtnLkthPW51bGw7Zy5kYT1udWxsO2cuZWE9bnVsbDtnLkw9bnVsbDtnLlM9ITA7Zy5UPSEwO2cubz0tMTtnLkI9bnVsbDtnLlc9ITE7Zy5PPW51bGw7dmFyIFRjPWZ1bmN0aW9uKGEpe3JldHVybiBhLkthfHxhLmkoKX07Zz1WLnByb3RvdHlwZTtnLm1hPWZ1bmN0aW9uKCl7dGhpcy5nPXRoaXMuRy5oKCJESVYiLHRoaXMuZWEuaih0aGlzKS5qb2luKCIgIikpfTtnLm5hPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaSgpfTtnLndhPWZ1bmN0aW9uKGEpe3JldHVybiBhLnRhZ05hbWU9PSJESVYifTtnLkVhPWZ1bmN0aW9uKGEpe3RoaXMuZz15Yyh0aGlzLmVhLHRoaXMsYSk7YS5zdHlsZS5kaXNwbGF5PT0ibm9uZSImJih0aGlzLlM9ITEpfTsKZy5JPWZ1bmN0aW9uKCl7Vi5sLkkuY2FsbCh0aGlzKTtUYih0aGlzLGZ1bmN0aW9uKGIpe2IucyYmVWModGhpcyxiKX0sdGhpcyk7dmFyIGE9dGhpcy5pKCk7QWModGhpcy5lYSx0aGlzKTtWYyh0aGlzLHRoaXMuUyk7QihCKEIoQihCKEIoQihCKFFiKHRoaXMpLHRoaXMsImVudGVyIix0aGlzLmViKSx0aGlzLCJoaWdobGlnaHQiLHRoaXMuZmIpLHRoaXMsInVuaGlnaGxpZ2h0Iix0aGlzLmxiKSx0aGlzLCJvcGVuIix0aGlzLmdiKSx0aGlzLCJjbG9zZSIsdGhpcy5iYiksYSxLLmdhLHRoaXMuV2EpLGJiKGEpLFtLLmhhLEsuZmFdLHRoaXMuY2IpLGEsW0suZ2EsSy5oYSxLLmZhLCJtb3VzZW92ZXIiLCJtb3VzZW91dCIsImNvbnRleHRtZW51Il0sdGhpcy5hYik7V2ModGhpcyl9O3ZhciBXYz1mdW5jdGlvbihhKXt2YXIgYj1RYihhKSxjPVRjKGEpO0IoQihCKGIsYywiZm9jdXMiLGEuUGEpLGMsImJsdXIiLGEuVWEpLGEuZGF8fChhLmRhPW5ldyBKKFRjKGEpKSksImtleSIsYS5WYSl9OwpnPVYucHJvdG90eXBlO2cuVT1mdW5jdGlvbigpe1hjKHRoaXMsLTEpO3RoaXMuQiYmT2ModGhpcy5CLCExKTt0aGlzLlc9ITE7Vi5sLlUuY2FsbCh0aGlzKX07Zy5DPWZ1bmN0aW9uKCl7Vi5sLkMuY2FsbCh0aGlzKTt0aGlzLmRhJiYodGhpcy5kYS5kaXNwb3NlKCksdGhpcy5kYT1udWxsKTt0aGlzLmVhPXRoaXMuQj10aGlzLk89dGhpcy5LYT1udWxsfTtnLmViPWZ1bmN0aW9uKCl7cmV0dXJuITB9OwpnLmZiPWZ1bmN0aW9uKGEpe3ZhciBiPVZiKHRoaXMsYS50YXJnZXQpO2lmKGI+LTEmJmIhPXRoaXMubyl7dmFyIGM9SSh0aGlzLHRoaXMubyk7YyYmUChjLCExKTt0aGlzLm89YjtjPUkodGhpcyx0aGlzLm8pO3RoaXMuVyYmTWMoYywhMCk7dGhpcy5CJiZjIT10aGlzLkImJihjLkQmNjQ/T2MoYywhMCk6T2ModGhpcy5CLCExKSl9Yj10aGlzLmkoKTtwKGIsIlRoZSBET00gZWxlbWVudCBmb3IgdGhlIGNvbnRhaW5lciBjYW5ub3QgYmUgbnVsbC4iKTthLnRhcmdldC5pKCkhPW51bGwmJmFjKGIsImFjdGl2ZWRlc2NlbmRhbnQiLGEudGFyZ2V0LmkoKS5pZCl9O2cubGI9ZnVuY3Rpb24oYSl7YS50YXJnZXQ9PUkodGhpcyx0aGlzLm8pJiYodGhpcy5vPS0xKTthPXRoaXMuaSgpO3AoYSwiVGhlIERPTSBlbGVtZW50IGZvciB0aGUgY29udGFpbmVyIGNhbm5vdCBiZSBudWxsLiIpO2EucmVtb3ZlQXR0cmlidXRlKCRiKCJhY3RpdmVkZXNjZW5kYW50IikpfTsKZy5nYj1mdW5jdGlvbihhKXsoYT1hLnRhcmdldCkmJmEhPXRoaXMuQiYmYS5oPT10aGlzJiYodGhpcy5CJiZPYyh0aGlzLkIsITEpLHRoaXMuQj1hKX07Zy5iYj1mdW5jdGlvbihhKXthLnRhcmdldD09dGhpcy5CJiYodGhpcy5CPW51bGwpO3ZhciBiPXRoaXMuaSgpLGM9YS50YXJnZXQuaSgpO2ImJmEudGFyZ2V0Lm0mMiYmYyYmKGE9IiIsYyYmKGE9Yy5pZCxwKGEsIlRoZSBhY3RpdmUgZWxlbWVudCBzaG91bGQgaGF2ZSBhbiBpZC4iKSksYWMoYiwiYWN0aXZlZGVzY2VuZGFudCIsYSkpfTtnLldhPWZ1bmN0aW9uKGEpe3RoaXMuVCYmKHRoaXMuVz0hMCk7dmFyIGI9VGModGhpcyk7YiYmZGIoYikmJmViKGIpP2IuZm9jdXMoKTphLmooKX07Zy5jYj1mdW5jdGlvbigpe3RoaXMuVz0hMX07CmcuYWI9ZnVuY3Rpb24oYSl7YTp7dmFyIGI9YS50YXJnZXQ7aWYodGhpcy5PKWZvcih2YXIgYz10aGlzLmkoKTtiJiZiIT09Yzspe3ZhciBkPWIuaWQ7aWYoZCBpbiB0aGlzLk8pe2I9dGhpcy5PW2RdO2JyZWFrIGF9Yj1iLnBhcmVudE5vZGV9Yj1udWxsfWlmKGIpc3dpdGNoKGEudHlwZSl7Y2FzZSBLLmdhOmIuc2EoYSk7YnJlYWs7Y2FzZSBLLmhhOmNhc2UgSy5mYTpiLnZhKGEpO2JyZWFrO2Nhc2UgIm1vdXNlb3ZlciI6Yi51YShhKTticmVhaztjYXNlICJtb3VzZW91dCI6Yi50YShhKTticmVhaztjYXNlICJjb250ZXh0bWVudSI6Yi5jYShhKX19O2cuUGE9ZnVuY3Rpb24oKXt9O2cuVWE9ZnVuY3Rpb24oKXtYYyh0aGlzLC0xKTt0aGlzLlc9ITE7dGhpcy5CJiZPYyh0aGlzLkIsITEpfTsKZy5WYT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5pc0VuYWJsZWQoKSYmdGhpcy5pc1Zpc2libGUoKSYmKEgodGhpcykhPTB8fHRoaXMuS2EpJiZZYyh0aGlzLGEpPyhhLmooKSxhLnYoKSwhMCk6ITF9Owp2YXIgWWM9ZnVuY3Rpb24oYSxiKXt2YXIgYz1JKGEsYS5vKTtpZihjJiZ0eXBlb2YgYy5hYT09ImZ1bmN0aW9uIiYmYy5hYShiKXx8YS5CJiZhLkIhPWMmJnR5cGVvZiBhLkIuYWE9PSJmdW5jdGlvbiImJmEuQi5hYShiKSlyZXR1cm4hMDtpZihiLnNoaWZ0S2V5fHxiLmN0cmxLZXl8fGIubWV0YUtleXx8Yi5hbHRLZXkpcmV0dXJuITE7c3dpdGNoKGIuZyl7Y2FzZSAyNzpUYyhhKS5ibHVyKCk7YnJlYWs7Y2FzZSAzNjpaYyhhKTticmVhaztjYXNlIDM1OiRjKGEpO2JyZWFrO2Nhc2UgMzg6aWYoYS5MPT0idmVydGljYWwiKWFkKGEpO2Vsc2UgcmV0dXJuITE7YnJlYWs7Y2FzZSAzNzppZihhLkw9PSJob3Jpem9udGFsIilVYihhKT9iZChhKTphZChhKTtlbHNlIHJldHVybiExO2JyZWFrO2Nhc2UgNDA6aWYoYS5MPT0idmVydGljYWwiKWJkKGEpO2Vsc2UgcmV0dXJuITE7YnJlYWs7Y2FzZSAzOTppZihhLkw9PSJob3Jpem9udGFsIilVYihhKT9hZChhKTpiZChhKTtlbHNlIHJldHVybiExOwpicmVhaztkZWZhdWx0OnJldHVybiExfXJldHVybiEwfSxVYz1mdW5jdGlvbihhLGIpe3ZhciBjPWIuaSgpO2M9Yy5pZHx8KGMuaWQ9T2IoYikpO2EuT3x8KGEuTz17fSk7YS5PW2NdPWJ9O1YucHJvdG90eXBlLkJhPWZ1bmN0aW9uKGEsYil7dWEoYSxOLCJUaGUgY2hpbGQgb2YgYSBjb250YWluZXIgbXVzdCBiZSBhIGNvbnRyb2wiKTtWLmwuQmEuY2FsbCh0aGlzLGEsYil9O1YucHJvdG90eXBlLkNhPWZ1bmN0aW9uKGEsYixjKXt1YShhLE4pO2EuUHw9MjthLlB8PTY0O1BjKGEsMzIsITEpO2EucyYmMCE9YS5IYSYmTGMoYSwhMSk7YS5IYT0hMTt2YXIgZD1hLmg9PXRoaXM/VmIodGhpcyxhKTotMTtWLmwuQ2EuY2FsbCh0aGlzLGEsYixjKTthLnMmJnRoaXMucyYmVWModGhpcyxhKTthPWQ7YT09LTEmJihhPUgodGhpcykpO2E9PXRoaXMubz90aGlzLm89TWF0aC5taW4oSCh0aGlzKS0xLGIpOmE+dGhpcy5vJiZiPD10aGlzLm8/dGhpcy5vKys6YTx0aGlzLm8mJmI+dGhpcy5vJiZ0aGlzLm8tLX07CnZhciB6Yz1mdW5jdGlvbihhLGIpe2lmKGEuaSgpKXRocm93IEVycm9yKCJDb21wb25lbnQgYWxyZWFkeSByZW5kZXJlZCIpO2EuTD1ifTtWLnByb3RvdHlwZS5pc1Zpc2libGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5TfTt2YXIgVmM9ZnVuY3Rpb24oYSxiKXthLlM9Yjt2YXIgYz1hLmkoKTtjJiYoYy5zdHlsZS5kaXNwbGF5PWI/IiI6Im5vbmUiLHdjKFRjKGEpLGEuVCYmYS5TKSl9O1YucHJvdG90eXBlLmlzRW5hYmxlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLlR9O1YucHJvdG90eXBlLlg9ZnVuY3Rpb24oYSl7dGhpcy5UIT1hJiZFKHRoaXMsYT8iZW5hYmxlIjoiZGlzYWJsZSIpJiYoYT8odGhpcy5UPSEwLFRiKHRoaXMsZnVuY3Rpb24oYil7Yi5UYT9kZWxldGUgYi5UYTpiLlgoITApfSkpOihUYih0aGlzLGZ1bmN0aW9uKGIpe2IuaXNFbmFibGVkKCk/Yi5YKCExKTpiLlRhPSEwfSksdGhpcy5XPXRoaXMuVD0hMSksd2MoVGModGhpcyksYSYmdGhpcy5TKSl9Owp2YXIgWGM9ZnVuY3Rpb24oYSxiKXsoYj1JKGEsYikpP1AoYiwhMCk6YS5vPi0xJiZQKEkoYSxhLm8pLCExKX0sWmM9ZnVuY3Rpb24oYSl7Y2QoYSxmdW5jdGlvbihiLGMpe3JldHVybihiKzEpJWN9LEgoYSktMSl9LCRjPWZ1bmN0aW9uKGEpe2NkKGEsZnVuY3Rpb24oYixjKXtiLS07cmV0dXJuIGI8MD9jLTE6Yn0sMCl9LGJkPWZ1bmN0aW9uKGEpe2NkKGEsZnVuY3Rpb24oYixjKXtyZXR1cm4oYisxKSVjfSxhLm8pfSxhZD1mdW5jdGlvbihhKXtjZChhLGZ1bmN0aW9uKGIsYyl7Yi0tO3JldHVybiBiPDA/Yy0xOmJ9LGEubyl9LGNkPWZ1bmN0aW9uKGEsYixjKXtjPWM8MD9WYihhLGEuQik6Yzt2YXIgZD1IKGEpO2M9Yi5jYWxsKGEsYyxkKTtmb3IodmFyIGU9MDtlPD1kOyl7dmFyIGY9SShhLGMpO2lmKGYmJmYuaXNWaXNpYmxlKCkmJmYuaXNFbmFibGVkKCkmJmYuRCYyKXthLkxhKGMpO2JyZWFrfWUrKztjPWIuY2FsbChhLGMsZCl9fTsKVi5wcm90b3R5cGUuTGE9ZnVuY3Rpb24oYSl7WGModGhpcyxhKX07dmFyIGRkPWZ1bmN0aW9uKCl7fTtuKGRkLE0pO2lhKGRkKTtnPWRkLnByb3RvdHlwZTtnLk49ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy10YWIifTtnLk5hPWZ1bmN0aW9uKCl7cmV0dXJuInRhYiJ9O2cueGE9ZnVuY3Rpb24oYSl7dmFyIGI9ZGQubC54YS5jYWxsKHRoaXMsYSk7KGE9YS5HYSgpKSYmdGhpcy5NYShiLGEpO3JldHVybiBifTtnLnlhPWZ1bmN0aW9uKGEsYil7Yj1kZC5sLnlhLmNhbGwodGhpcyxhLGIpO3ZhciBjPXRoaXMuR2EoYik7YyYmKGEuUmE9Yyk7YS5tJjgmJihjPWEuaCkmJnR5cGVvZiBjLko9PT0iZnVuY3Rpb24iJiYoVChhLDgsITEpLGMuSihhKSk7cmV0dXJuIGJ9O2cuR2E9ZnVuY3Rpb24oYSl7cmV0dXJuIGEudGl0bGV8fCIifTtnLk1hPWZ1bmN0aW9uKGEsYil7YSYmKGEudGl0bGU9Ynx8IiIpfTt2YXIgZWQ9ZnVuY3Rpb24oYSxiLGMpe04uY2FsbCh0aGlzLGEsYnx8ZGQuVigpLGMpO1BjKHRoaXMsOCwhMCk7dGhpcy5QfD05fTtuKGVkLE4pO2VkLnByb3RvdHlwZS5HYT1mdW5jdGlvbigpe3JldHVybiB0aGlzLlJhfTtlZC5wcm90b3R5cGUuTWE9ZnVuY3Rpb24oYSl7dGhpcy52Lk1hKHRoaXMuaSgpLGEpO3RoaXMuUmE9YX07dGMoImdvb2ctdGFiIixmdW5jdGlvbigpe3JldHVybiBuZXcgZWQobnVsbCl9KTt2YXIgVz1mdW5jdGlvbigpe3RoaXMuQT0idGFibGlzdCJ9O24oVyx2Yyk7aWEoVyk7Vy5wcm90b3R5cGUuZz1mdW5jdGlvbigpe3JldHVybiJnb29nLXRhYi1iYXIifTtXLnByb3RvdHlwZS51PWZ1bmN0aW9uKGEsYixjKXt0aGlzLnZ8fCh0aGlzLmh8fGZkKHRoaXMpLHRoaXMudj1FYSh0aGlzLmgpKTt2YXIgZD10aGlzLnZbYl07ZD8oemMoYSxnZChkKSksYS52PWQpOlcubC51LmNhbGwodGhpcyxhLGIsYyl9O1cucHJvdG90eXBlLmo9ZnVuY3Rpb24oYSl7dmFyIGI9Vy5sLmouY2FsbCh0aGlzLGEpO3RoaXMuaHx8ZmQodGhpcyk7Yi5wdXNoKHRoaXMuaFthLnZdKTtyZXR1cm4gYn07dmFyIGZkPWZ1bmN0aW9uKGEpe3ZhciBiPWEuZygpO2EuaD17dG9wOmIrIi10b3AiLGJvdHRvbTpiKyItYm90dG9tIixzdGFydDpiKyItc3RhcnQiLGVuZDpiKyItZW5kIn19O3ZhciBYPWZ1bmN0aW9uKGEsYixjKXthPWF8fCJ0b3AiO3pjKHRoaXMsZ2QoYSkpO3RoaXMudj1hO1YuY2FsbCh0aGlzLHRoaXMuTCxifHxXLlYoKSxjKTtoZCh0aGlzKX07bihYLFYpO2c9WC5wcm90b3R5cGU7Zy5IPW51bGw7Zy5JPWZ1bmN0aW9uKCl7WC5sLkkuY2FsbCh0aGlzKTtoZCh0aGlzKX07Zy5DPWZ1bmN0aW9uKCl7WC5sLkMuY2FsbCh0aGlzKTt0aGlzLkg9bnVsbH07Zy5MYT1mdW5jdGlvbihhKXtYLmwuTGEuY2FsbCh0aGlzLGEpO3RoaXMuSihJKHRoaXMsYSkpfTtnLko9ZnVuY3Rpb24oYSl7YT9OYyhhLCEwKTp0aGlzLkgmJk5jKHRoaXMuSCwhMSl9Owp2YXIgaWQ9ZnVuY3Rpb24oYSxiKXtpZihiJiZiPT1hLkgpe2Zvcih2YXIgYz1WYihhLGIpLGQ9Yy0xO2I9SShhLGQpO2QtLSl7dmFyIGU9YjtpZihlLmlzVmlzaWJsZSgpJiZlLmlzRW5hYmxlZCgpKXthLkooYik7cmV0dXJufX1mb3IoYys9MTtiPUkoYSxjKTtjKyspaWYoZD1iLGQuaXNWaXNpYmxlKCkmJmQuaXNFbmFibGVkKCkpe2EuSihiKTtyZXR1cm59YS5KKG51bGwpfX07Zz1YLnByb3RvdHlwZTtnLmpiPWZ1bmN0aW9uKGEpe3RoaXMuSCYmdGhpcy5IIT1hLnRhcmdldCYmTmModGhpcy5ILCExKTt0aGlzLkg9YS50YXJnZXR9O2cua2I9ZnVuY3Rpb24oYSl7YS50YXJnZXQ9PXRoaXMuSCYmKHRoaXMuSD1udWxsKX07Zy5oYj1mdW5jdGlvbihhKXtpZCh0aGlzLGEudGFyZ2V0KX07Zy5pYj1mdW5jdGlvbihhKXtpZCh0aGlzLGEudGFyZ2V0KX07Zy5QYT1mdW5jdGlvbigpe0kodGhpcyx0aGlzLm8pfHxYYyh0aGlzLFZiKHRoaXMsdGhpcy5IfHxJKHRoaXMsMCkpKX07CnZhciBoZD1mdW5jdGlvbihhKXtCKEIoQihCKFFiKGEpLGEsInNlbGVjdCIsYS5qYiksYSwidW5zZWxlY3QiLGEua2IpLGEsImRpc2FibGUiLGEuaGIpLGEsImhpZGUiLGEuaWIpfSxnZD1mdW5jdGlvbihhKXtyZXR1cm4gYT09InN0YXJ0Inx8YT09ImVuZCI/InZlcnRpY2FsIjoiaG9yaXpvbnRhbCJ9O3RjKCJnb29nLXRhYi1iYXIiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBYfSk7ZnVuY3Rpb24gamQoYSl7dmFyIGI9e3RvcDoiYm90dG9tIixib3R0b206InRvcCIsc3RhcnQ6InJpZ2h0IixlbmQ6ImxlZnQifVthLmxvY2F0aW9uXSxjPWEuZWxlbWVudElkLGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTtkLnRleHRDb250ZW50PSJcbiAgICBmaWVsZHNldCB7XG4gICAgICBwYWRkaW5nOiAxMHB4O1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgIzM2OTtcbiAgICB9XG5cbiAgICAjIitjKyIgLmdvb2ctdGFiLWNvbnRlbnQge1xuICAgICAgbWluLWhlaWdodDogM2VtO1xuICAgICAgbWFyZ2luOiAwO1xuICAgICAgYm9yZGVyOiAiK2EuYm9yZGVyKyIgc29saWQgIithLmJvcmRlckNvbG9yKyI7XG4gICAgICBib3JkZXItdG9wOiAwO1xuICAgICAgaGVpZ2h0OiAiK2EuY29udGVudEhlaWdodCsiO1xuICAgICAgcGFkZGluZzogNHB4IDhweDtcbiAgICAgIG1hcmdpbi1yaWdodDogNHB4O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgIG92ZXJmbG93OiBhdXRvO1xuICAgIH1cblxuICAgICMiKwpjKyIgLmdvb2ctdGFiLWJhci0iK2EubG9jYXRpb24rIiAuZ29vZy10YWItc2VsZWN0ZWQge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICIrYS5ib3JkZXJDb2xvcisiO1xuICAgICAgYm9yZGVyLSIrYisiOiAwcHg7XG4gICAgfVxuXG4gICAgIyIrYysiIC5nb29nLXRhYi1iYXItIithLmxvY2F0aW9uKyIge1xuICAgICAgcGFkZGluZy0iK2EubG9jYXRpb24rIjogNXB4ICFpbXBvcnRhbnQ7XG4gICAgICBib3JkZXItIitiKyI6IDFweCBzb2xpZCAiK2EuYm9yZGVyQ29sb3IrIiAhaW1wb3J0YW50O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICB9XG5cbiAgICAjIitjKyIgLmdvb2ctdGFiLWJhciB7XG4gICAgICAgbWFyZ2luOiAwO1xuICAgICAgIGJvcmRlcjogMDtcbiAgICAgICBwYWRkaW5nOiAwO1xuICAgICAgIGxpc3Qtc3R5bGU6IG5vbmU7XG4gICAgICAgY3Vyc29yOiBkZWZhdWx0O1xuICAgICAgIG91dGxpbmU6IG5vbmU7XG4gICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgICBtYXJnaW4tcmlnaHQ6IDRweDtcbiAgICAgIH1cblxuICAgICAjIisKYysiIC5nb29nLXRhYiB7XG4gICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgIHBhZGRpbmc6IDRweCA4cHg7XG4gICAgICAgY29sb3I6IHZhcigtLWNvbGFiLXByaW1hcnktdGV4dC1jb2xvcik7XG4gICAgICAgdGV4dC1kZWNvcmF0aW9uOiBpbml0aWFsO1xuICAgICAgIGN1cnNvcjogZGVmYXVsdDtcbiAgICAgIH1cblxuICAgICAgIyIrYysiIC5nb29nLXRhYi1ob3ZlciB7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWNvbGFiLWhpZ2hsaWdodGVkLXN1cmZhY2UtY29sb3IpO1xuICAgICAgfVxuICAgICAgIjtyZXR1cm4gZH0KdmFyIGtkPWZ1bmN0aW9uKGEpe3ZhciBiPWEuZWxlbWVudElkLGM9YS50YWJOYW1lcyxkPWEuc2VsZWN0ZWRJbmRleDsiY29udGVudEJvcmRlciJpbiBhfHwoYS5jb250ZW50Qm9yZGVyPSIwcHgiKTsiY29udGVudEhlaWdodCJpbiBhfHwoYS5jb250ZW50SGVpZ2h0PSJpbml0aWFsIik7ImJvcmRlckNvbG9yImluIGF8fChhLmJvcmRlckNvbG9yPSJ2YXIoLS1jb2xhYi1ib3JkZXItY29sb3IpIik7YS5sb2NhdGlvbnx8KGEubG9jYXRpb249InRvcCIpO3ZhciBlPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiMiK2IpLGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zi5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYi1iYXIiKTt2YXIgaD1hLmxvY2F0aW9uO2YuY2xhc3NMaXN0LmFkZCgiZ29vZy10YWItYmFyLSIraCk7Zm9yKHZhciBrPVtdLHE9ZmEoYyksRz1xLm5leHQoKTshRy5kb25lO0c9cS5uZXh0KCkpe0c9Ry52YWx1ZTt2YXIgeD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKeC5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYiIpO3gudGV4dENvbnRlbnQ9RztmLmFwcGVuZENoaWxkKHgpO2sucHVzaCh4KX1oIT0iYm90dG9tIiYmZS5hcHBlbmRDaGlsZChmKTtxPW51bGw7aWYoaD09InRvcCJ8fGg9PSJib3R0b20iKXE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikscS5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYi1iYXItY2xlYXIiKTtoPT0idG9wIiYmcSYmZS5hcHBlbmRDaGlsZChxKTtHPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO0cuY2xhc3NMaXN0LmFkZCgiZ29vZy10YWItY29udGVudCIpO3ZhciBoYT1bXTtjPWZhKGMpO2Zvcih4PWMubmV4dCgpOyF4LmRvbmU7eD1jLm5leHQoKSl4PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHguaWQ9ZS5pZCsiX2NvbnRlbnRfIitoYS5sZW5ndGgseC5zdHlsZS5kaXNwbGF5PSJub25lIixHLmFwcGVuZENoaWxkKHgpLGhhLnB1c2goeCk7ZS5hcHBlbmRDaGlsZChHKTtoPT0iYm90dG9tIiYmKHEmJgplLmFwcGVuZENoaWxkKHEpLGUuYXBwZW5kQ2hpbGQoZikpO3ZhciBRPW5ldyBYKGgpO1NiKFEsZik7dmFyIFI9LTE7d2IoUSwic2VsZWN0IixmdW5jdGlvbihTKXtTPWsuaW5kZXhPZihTLnRhcmdldC5pKCkpO1MhPVImJihSPj0wJiZSPGhhLmxlbmd0aCYmKGhhW1JdLnN0eWxlLmRpc3BsYXk9Im5vbmUiLFI9LTEpLFM+PTAmJlM8aGEubGVuZ3RoJiYoUj1TLGhhW1JdLnN0eWxlLmRpc3BsYXk9ImlubGluZSIsd2luZG93LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCJyZXNpemUiKSksZ29vZ2xlLmNvbGFiLm91dHB1dC5yZXNpemVJZnJhbWVUb0NvbnRlbnQoKSksUS5KKEkoUSxSKSkpfSk7US5KKEkoUSxkKSk7d2luZG93W2JdPXtzZXRTZWxlY3RlZFRhYkluZGV4OmZ1bmN0aW9uKFMpe1EuSihJKFEsUykpfX07ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChqZChhKSl9LGxkPVsiY29sYWJfbGliIiwiY3JlYXRlVGFiQmFyIl0sWT1sOwpsZFswXWluIFl8fHR5cGVvZiBZLmV4ZWNTY3JpcHQ9PSJ1bmRlZmluZWQifHxZLmV4ZWNTY3JpcHQoInZhciAiK2xkWzBdKTtmb3IodmFyIFo7bGQubGVuZ3RoJiYoWj1sZC5zaGlmdCgpKTspbGQubGVuZ3RofHxrZD09PXZvaWQgMD9ZW1pdJiZZW1pdIT09T2JqZWN0LnByb3RvdHlwZVtaXT9ZPVlbWl06WT1ZW1pdPXt9OllbWl09a2Q7fSkuY2FsbCh0aGlzKTsKLy8gY2xhbmctZm9ybWF0IG9uCg==", + "ok": true, + "headers": [ + [ + "content-length", + "41785" + ], + [ + "content-type", + "application/javascript" + ] + ], + "status": 200, + "status_text": "" + } + }, + "base_uri": "https://localhost:8080/", + "height": 323 + }, + "outputId": "7d2a2b03-5abe-4bd9-bb9e-8807fa8934a6" + }, + "source": [ + "%%logica Test\n", + "\n", + "F(x) = x ^ 2 - 2 * x + 1;\n", + "\n", + "Test(x:, y: F(x)) :- x in [0, 0.5, 1.0, 1.5, 2.0];" + ], + "execution_count": 25, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"1c4069b2-d22d-11ef-a7c0-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id49\", \"tabNames\": [\"Test\", \"(Log)\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_17d74bd73b" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"1c411916-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id49\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_ce77abfac2" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"1c4362ac-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_858853c149" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"1c443f4c-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id49_content_1\");\n", + "//# sourceURL=js_97cb6aa9fe" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"1c44ade2-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"1c443f4c-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_5e4a56924a" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"1c4514c6-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id49\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_a1b9a9a2ce" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"1c491238-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"1c4362ac-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_3da2ca72ce" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"1c4b492c-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_b2a9520a36" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"1c4badf4-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id49_content_0\");\n", + "//# sourceURL=js_e283235867" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"1c4c1064-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"1c4badf4-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_bc27e033a8" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"1c4c6fa0-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id49\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_d64e0690e1" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"1c4e84ac-d22d-11ef-a7c0-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id50\", \"tabNames\": [\"SQL\", \"Result\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_f1f170b5f0" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"1c4ed4ac-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id50\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_c276b0dc7b" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"1c50113c-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_7051030a72" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"1c5094c2-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id50_content_0\");\n", + "//# sourceURL=js_ef05061365" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"1c50e184-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"1c5094c2-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_548db96d4d" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"1c5126bc-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id50\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_3ef5337078" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The following query is stored at \u001b[1mTest_sql\u001b[0m variable.\n", + "-- Initializing DuckDB environment.\n", + "create schema if not exists logica_home;\n", + "-- Empty record, has to have a field by DuckDB syntax.\n", + "drop type if exists logicarecord893574736 cascade; create type logicarecord893574736 as struct(nirvana numeric);\n", + "create sequence if not exists eternal_logical_sequence;\n", + "\n", + "\n", + "-- Logica type: logicarecord481217614\n", + "drop type if exists logicarecord481217614 cascade; create type logicarecord481217614 as struct(r logicarecord893574736);\n", + "\n", + "-- Logica type: logicarecord383307722\n", + "drop type if exists logicarecord383307722 cascade; create type logicarecord383307722 as struct(a timestamp);\n", + "SELECT\n", + " x_3.unnested_pod AS x,\n", + " (((((POW(x_3.unnested_pod, 2))) - (((2) * (x_3.unnested_pod))))) + (1)) AS y\n", + "FROM\n", + " (select unnest([0, 0.5, 1.0, 1.5, 2.0]::numeric[]) as unnested_pod) as x_3;\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"1c52346c-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"1c50113c-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_59cd436add" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"1c53ceb2-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_9568a37b3e" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"1c541c14-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id50_content_1\");\n", + "//# sourceURL=js_fdc877cd76" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"1c5462a0-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"1c541c14-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_5c36be519e" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"1c54a5ee-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id50\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_a590db8433" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The following table is stored at \u001b[1mTest\u001b[0m variable.\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
xy
00.01.00
10.50.25
21.00.00
31.50.25
42.01.00
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"1c55e922-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"1c53ceb2-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_25965e985a" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"1c57277e-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"1c4b492c-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_d404f30f8b" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"1c58b3b4-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_a4eeea2a1f" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"1c58fec8-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id49_content_1\");\n", + "//# sourceURL=js_58d868ceb4" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"1c5945ae-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"1c58fec8-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_67f454efda" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"1c598956-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id49\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_6eb822c817" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "image/svg+xml": "\n\n\n\n\n\nConcertina\n\n\n\nTest\n\nTest\n\n\n\n", + "text/plain": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Running predicate: Test (7 ms)\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"1c6f728e-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"1c58b3b4-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_9c021a3d69" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"1c714de8-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_7d7187c341" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"1c71a04a-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id49_content_0\");\n", + "//# sourceURL=js_8b4d1cfdd3" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"1c7209f4-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"1c71a04a-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_61d3487ed6" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"1c7257f6-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id49\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_33a7e544d8" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"1c73dcc0-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_300187175b" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"1c7430ee-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id50_content_1\");\n", + "//# sourceURL=js_0d6f84144f" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"1c7488be-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"1c7430ee-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_44561dc6cd" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"1c74d1d4-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id50\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_67749ddd98" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"1c7735fa-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"1c73dcc0-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_b640408e0d" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + " \n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"1c78e940-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"1c714de8-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_d790a8af80" + ] + }, + "metadata": {} + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "O8Tz_rL3NXdh" + }, + "source": [ + "### Functional aggregation\n", + "\n", + "You can compute predicate's value via an aggregation, just like with any other field.\n", + "If predicate value is aggregated then keyword `distinct` is not needed (must not be used actually), as it's already very clear\n", + "that an aggregation is performed." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "-ZWQ1qPsNXrx", + "colab": { + "resources": { + "http://localhost:8080/nbextensions/google.colab/tabbar.css": { + "data": "Lmdvb2ctdGFie3Bvc2l0aW9uOnJlbGF0aXZlO3BhZGRpbmc6NHB4IDhweDtjb2xvcjojMDBjO3RleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7Y3Vyc29yOmRlZmF1bHR9Lmdvb2ctdGFiLWJhci10b3AgLmdvb2ctdGFie21hcmdpbjoxcHggNHB4IDAgMDtib3JkZXItYm90dG9tOjA7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLXRvcDphZnRlciwuZ29vZy10YWItYmFyLWJvdHRvbTphZnRlcntjb250ZW50OiIgIjtkaXNwbGF5OmJsb2NrO2hlaWdodDowO2NsZWFyOmJvdGg7dmlzaWJpbGl0eTpoaWRkZW59Lmdvb2ctdGFiLWJhci1ib3R0b20gLmdvb2ctdGFie21hcmdpbjowIDRweCAxcHggMDtib3JkZXItdG9wOjA7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLXN0YXJ0IC5nb29nLXRhYnttYXJnaW46MCAwIDRweCAxcHg7Ym9yZGVyLXJpZ2h0OjB9Lmdvb2ctdGFiLWJhci1lbmQgLmdvb2ctdGFie21hcmdpbjowIDFweCA0cHggMDtib3JkZXItbGVmdDowfS5nb29nLXRhYi1ob3ZlcntiYWNrZ3JvdW5kOiNlZWV9Lmdvb2ctdGFiLWRpc2FibGVke2NvbG9yOiM2NjZ9Lmdvb2ctdGFiLXNlbGVjdGVke2NvbG9yOiMwMDA7YmFja2dyb3VuZDojZmZmO3RleHQtZGVjb3JhdGlvbjpub25lO2ZvbnQtd2VpZ2h0OmJvbGQ7Ym9yZGVyOjFweCBzb2xpZCAjNmI5MGRhfS5nb29nLXRhYi1iYXItdG9we3BhZGRpbmctdG9wOjVweCFpbXBvcnRhbnQ7cGFkZGluZy1sZWZ0OjVweCFpbXBvcnRhbnQ7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgIzZiOTBkYSFpbXBvcnRhbnR9Lmdvb2ctdGFiLWJhci10b3AgLmdvb2ctdGFiLXNlbGVjdGVke3RvcDoxcHg7bWFyZ2luLXRvcDowO3BhZGRpbmctYm90dG9tOjVweH0uZ29vZy10YWItYmFyLWJvdHRvbSAuZ29vZy10YWItc2VsZWN0ZWR7dG9wOi0xcHg7bWFyZ2luLWJvdHRvbTowO3BhZGRpbmctdG9wOjVweH0uZ29vZy10YWItYmFyLXN0YXJ0IC5nb29nLXRhYi1zZWxlY3RlZHtsZWZ0OjFweDttYXJnaW4tbGVmdDowO3BhZGRpbmctcmlnaHQ6OXB4fS5nb29nLXRhYi1iYXItZW5kIC5nb29nLXRhYi1zZWxlY3RlZHtsZWZ0Oi0xcHg7bWFyZ2luLXJpZ2h0OjA7cGFkZGluZy1sZWZ0OjlweH0uZ29vZy10YWItYmFye21hcmdpbjowO2JvcmRlcjowO3BhZGRpbmc6MDtsaXN0LXN0eWxlOm5vbmU7Y3Vyc29yOmRlZmF1bHQ7b3V0bGluZTpub25lO2JhY2tncm91bmQ6I2ViZWZmOX0uZ29vZy10YWItYmFyLWNsZWFye2NsZWFyOmJvdGg7aGVpZ2h0OjA7b3ZlcmZsb3c6aGlkZGVufS5nb29nLXRhYi1iYXItc3RhcnR7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLWVuZHtmbG9hdDpyaWdodH0qIGh0bWwgLmdvb2ctdGFiLWJhci1zdGFydHttYXJnaW4tcmlnaHQ6LTNweH0qIGh0bWwgLmdvb2ctdGFiLWJhci1lbmR7bWFyZ2luLWxlZnQ6LTNweH1zZW50aW5lbHt9", + "ok": true, + "headers": [ + [ + "content-length", + "1404" + ], + [ + "content-type", + "text/css" + ] + ], + "status": 200, + "status_text": "" + }, + "http://localhost:8080/nbextensions/google.colab/tabbar_main.min.js": { + "data": "Ly8gY2xhbmctZm9ybWF0IG9mZgooZnVuY3Rpb24oKXt2YXIgZyxhYT1mdW5jdGlvbihhKXt2YXIgYj0wO3JldHVybiBmdW5jdGlvbigpe3JldHVybiBiPGEubGVuZ3RoP3tkb25lOiExLHZhbHVlOmFbYisrXX06e2RvbmU6ITB9fX0sYmE9dHlwZW9mIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzPT0iZnVuY3Rpb24iP09iamVjdC5kZWZpbmVQcm9wZXJ0eTpmdW5jdGlvbihhLGIsYyl7aWYoYT09QXJyYXkucHJvdG90eXBlfHxhPT1PYmplY3QucHJvdG90eXBlKXJldHVybiBhO2FbYl09Yy52YWx1ZTtyZXR1cm4gYX0sY2E9ZnVuY3Rpb24oYSl7YT1bIm9iamVjdCI9PXR5cGVvZiBnbG9iYWxUaGlzJiZnbG9iYWxUaGlzLGEsIm9iamVjdCI9PXR5cGVvZiB3aW5kb3cmJndpbmRvdywib2JqZWN0Ij09dHlwZW9mIHNlbGYmJnNlbGYsIm9iamVjdCI9PXR5cGVvZiBnbG9iYWwmJmdsb2JhbF07Zm9yKHZhciBiPTA7YjxhLmxlbmd0aDsrK2Ipe3ZhciBjPWFbYl07aWYoYyYmYy5NYXRoPT1NYXRoKXJldHVybiBjfXRocm93IEVycm9yKCJDYW5ub3QgZmluZCBnbG9iYWwgb2JqZWN0Iik7Cn0sZGE9Y2EodGhpcyksZWE9ZnVuY3Rpb24oYSxiKXtpZihiKWE6e3ZhciBjPWRhO2E9YS5zcGxpdCgiLiIpO2Zvcih2YXIgZD0wO2Q8YS5sZW5ndGgtMTtkKyspe3ZhciBlPWFbZF07aWYoIShlIGluIGMpKWJyZWFrIGE7Yz1jW2VdfWE9YVthLmxlbmd0aC0xXTtkPWNbYV07Yj1iKGQpO2IhPWQmJmIhPW51bGwmJmJhKGMsYSx7Y29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOmJ9KX19OwplYSgiU3ltYm9sIixmdW5jdGlvbihhKXtpZihhKXJldHVybiBhO3ZhciBiPWZ1bmN0aW9uKGYsaCl7dGhpcy5nPWY7YmEodGhpcywiZGVzY3JpcHRpb24iLHtjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6aH0pfTtiLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmd9O3ZhciBjPSJqc2NvbXBfc3ltYm9sXyIrKE1hdGgucmFuZG9tKCkqMUU5Pj4+MCkrIl8iLGQ9MCxlPWZ1bmN0aW9uKGYpe2lmKHRoaXMgaW5zdGFuY2VvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoIlN5bWJvbCBpcyBub3QgYSBjb25zdHJ1Y3RvciIpO3JldHVybiBuZXcgYihjKyhmfHwiIikrIl8iK2QrKyxmKX07cmV0dXJuIGV9KTsKdmFyIGZhPWZ1bmN0aW9uKGEpe3ZhciBiPXR5cGVvZiBTeW1ib2whPSJ1bmRlZmluZWQiJiZTeW1ib2wuaXRlcmF0b3ImJmFbU3ltYm9sLml0ZXJhdG9yXTtpZihiKXJldHVybiBiLmNhbGwoYSk7aWYodHlwZW9mIGEubGVuZ3RoPT0ibnVtYmVyIilyZXR1cm57bmV4dDphYShhKX07dGhyb3cgRXJyb3IoU3RyaW5nKGEpKyIgaXMgbm90IGFuIGl0ZXJhYmxlIG9yIEFycmF5TGlrZSIpO307ZWEoIlN5bWJvbC5kaXNwb3NlIixmdW5jdGlvbihhKXtyZXR1cm4gYT9hOlN5bWJvbCgiU3ltYm9sLmRpc3Bvc2UiKX0pOy8qCgogQ29weXJpZ2h0IFRoZSBDbG9zdXJlIExpYnJhcnkgQXV0aG9ycy4KIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wCiovCnZhciBsPXRoaXN8fHNlbGYsaWE9ZnVuY3Rpb24oYSl7YS5JYT12b2lkIDA7YS5WPWZ1bmN0aW9uKCl7cmV0dXJuIGEuSWE/YS5JYTphLklhPW5ldyBhfX0samE9ZnVuY3Rpb24oYSl7dmFyIGI9dHlwZW9mIGE7cmV0dXJuIGIhPSJvYmplY3QiP2I6YT9BcnJheS5pc0FycmF5KGEpPyJhcnJheSI6YjoibnVsbCJ9LGthPWZ1bmN0aW9uKGEpe3ZhciBiPWphKGEpO3JldHVybiBiPT0iYXJyYXkifHxiPT0ib2JqZWN0IiYmdHlwZW9mIGEubGVuZ3RoPT0ibnVtYmVyIn0sbT1mdW5jdGlvbihhKXt2YXIgYj10eXBlb2YgYTtyZXR1cm4gYj09Im9iamVjdCImJmEhPW51bGx8fGI9PSJmdW5jdGlvbiJ9LG5hPWZ1bmN0aW9uKGEpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYSxsYSkmJmFbbGFdfHwoYVtsYV09KyttYSl9LGxhPSJjbG9zdXJlX3VpZF8iKyhNYXRoLnJhbmRvbSgpKjFFOT4+PjApLG1hPTAsbj1mdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoKXt9Yy5wcm90b3R5cGU9CmIucHJvdG90eXBlO2EubD1iLnByb3RvdHlwZTthLnByb3RvdHlwZT1uZXcgYzthLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1hO2EucWQ9ZnVuY3Rpb24oZCxlLGYpe2Zvcih2YXIgaD1BcnJheShhcmd1bWVudHMubGVuZ3RoLTIpLGs9MjtrPGFyZ3VtZW50cy5sZW5ndGg7aysrKWhbay0yXT1hcmd1bWVudHNba107cmV0dXJuIGIucHJvdG90eXBlW2VdLmFwcGx5KGQsaCl9fTtmdW5jdGlvbiBvYShhLGIpe2lmKEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKUVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsb2EpO2Vsc2V7dmFyIGM9RXJyb3IoKS5zdGFjaztjJiYodGhpcy5zdGFjaz1jKX1hJiYodGhpcy5tZXNzYWdlPVN0cmluZyhhKSk7YiE9PXZvaWQgMCYmKHRoaXMuY2F1c2U9Yil9bihvYSxFcnJvcik7b2EucHJvdG90eXBlLm5hbWU9IkN1c3RvbUVycm9yIjt2YXIgcGE7ZnVuY3Rpb24gcWEoYSxiKXthPWEuc3BsaXQoIiVzIik7Zm9yKHZhciBjPSIiLGQ9YS5sZW5ndGgtMSxlPTA7ZTxkO2UrKyljKz1hW2VdKyhlPGIubGVuZ3RoP2JbZV06IiVzIik7b2EuY2FsbCh0aGlzLGMrYVtkXSl9bihxYSxvYSk7cWEucHJvdG90eXBlLm5hbWU9IkFzc2VydGlvbkVycm9yIjtmdW5jdGlvbiByYShhLGIsYyxkKXt2YXIgZT0iQXNzZXJ0aW9uIGZhaWxlZCI7aWYoYyl7ZSs9IjogIitjO3ZhciBmPWR9ZWxzZSBhJiYoZSs9IjogIithLGY9Yik7dGhyb3cgbmV3IHFhKCIiK2UsZnx8W10pO30KdmFyIHA9ZnVuY3Rpb24oYSxiLGMpe2F8fHJhKCIiLG51bGwsYixBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMikpO3JldHVybiBhfSxzYT1mdW5jdGlvbihhLGIsYyl7bShhKSYmYS5ub2RlVHlwZT09MXx8cmEoIkV4cGVjdGVkIEVsZW1lbnQgYnV0IGdvdCAlczogJXMuIixbamEoYSksYV0sYixBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMikpfSx1YT1mdW5jdGlvbihhLGIsYyxkKXthIGluc3RhbmNlb2YgYnx8cmEoIkV4cGVjdGVkIGluc3RhbmNlb2YgJXMgYnV0IGdvdCAlcy4iLFt0YShiKSx0YShhKV0sYyxBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMykpfTsKZnVuY3Rpb24gdGEoYSl7cmV0dXJuIGEgaW5zdGFuY2VvZiBGdW5jdGlvbj9hLmRpc3BsYXlOYW1lfHxhLm5hbWV8fCJ1bmtub3duIHR5cGUgbmFtZSI6YSBpbnN0YW5jZW9mIE9iamVjdD9hLmNvbnN0cnVjdG9yLmRpc3BsYXlOYW1lfHxhLmNvbnN0cnVjdG9yLm5hbWV8fE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhKTphPT09bnVsbD8ibnVsbCI6dHlwZW9mIGF9O3ZhciB2YT1BcnJheS5wcm90b3R5cGUuaW5kZXhPZj9mdW5jdGlvbihhLGIpe3AoYS5sZW5ndGghPW51bGwpO3JldHVybiBBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKGEsYix2b2lkIDApfTpmdW5jdGlvbihhLGIpe2lmKHR5cGVvZiBhPT09InN0cmluZyIpcmV0dXJuIHR5cGVvZiBiIT09InN0cmluZyJ8fGIubGVuZ3RoIT0xPy0xOmEuaW5kZXhPZihiLDApO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWlmKGMgaW4gYSYmYVtjXT09PWIpcmV0dXJuIGM7cmV0dXJuLTF9LHdhPUFycmF5LnByb3RvdHlwZS5mb3JFYWNoP2Z1bmN0aW9uKGEsYil7cChhLmxlbmd0aCE9bnVsbCk7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChhLGIsdm9pZCAwKX06ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9YS5sZW5ndGgsZD10eXBlb2YgYT09PSJzdHJpbmciP2Euc3BsaXQoIiIpOmEsZT0wO2U8YztlKyspZSBpbiBkJiZiLmNhbGwodm9pZCAwLGRbZV0sZSxhKX07CmZ1bmN0aW9uIHhhKGEsYil7Yj12YShhLGIpO3ZhciBjO2lmKGM9Yj49MClwKGEubGVuZ3RoIT1udWxsKSxBcnJheS5wcm90b3R5cGUuc3BsaWNlLmNhbGwoYSxiLDEpO3JldHVybiBjfWZ1bmN0aW9uIHlhKGEpe3ZhciBiPWEubGVuZ3RoO2lmKGI+MCl7Zm9yKHZhciBjPUFycmF5KGIpLGQ9MDtkPGI7ZCsrKWNbZF09YVtkXTtyZXR1cm4gY31yZXR1cm5bXX1mdW5jdGlvbiB6YShhLGIsYyxkKXtwKGEubGVuZ3RoIT1udWxsKTtBcnJheS5wcm90b3R5cGUuc3BsaWNlLmFwcGx5KGEsQWEoYXJndW1lbnRzLDEpKX1mdW5jdGlvbiBBYShhLGIsYyl7cChhLmxlbmd0aCE9bnVsbCk7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg8PTI/QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYSxiKTpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhLGIsYyl9O2Z1bmN0aW9uIEJhKGEsYixjKXtmb3IodmFyIGQgaW4gYSliLmNhbGwoYyxhW2RdLGQsYSl9ZnVuY3Rpb24gQ2EoYSxiKXtmb3IodmFyIGMgaW4gYSlpZihhW2NdPT1iKXJldHVybiEwO3JldHVybiExfWZ1bmN0aW9uIERhKGEsYixjKXtpZihhIT09bnVsbCYmYiBpbiBhKXRocm93IEVycm9yKCdUaGUgb2JqZWN0IGFscmVhZHkgY29udGFpbnMgdGhlIGtleSAiJytiKyciJyk7YVtiXT1jfWZ1bmN0aW9uIEVhKGEpe3ZhciBiPXt9LGM7Zm9yKGMgaW4gYSliW2FbY11dPWM7cmV0dXJuIGJ9dmFyIEZhPSJjb25zdHJ1Y3RvciBoYXNPd25Qcm9wZXJ0eSBpc1Byb3RvdHlwZU9mIHByb3BlcnR5SXNFbnVtZXJhYmxlIHRvTG9jYWxlU3RyaW5nIHRvU3RyaW5nIHZhbHVlT2YiLnNwbGl0KCIgIik7CmZ1bmN0aW9uIEdhKGEsYil7Zm9yKHZhciBjLGQsZT0xO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspe2Q9YXJndW1lbnRzW2VdO2ZvcihjIGluIGQpYVtjXT1kW2NdO2Zvcih2YXIgZj0wO2Y8RmEubGVuZ3RoO2YrKyljPUZhW2ZdLE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChkLGMpJiYoYVtjXT1kW2NdKX19O3ZhciBIYT1TdHJpbmcucHJvdG90eXBlLnRyaW0/ZnVuY3Rpb24oYSl7cmV0dXJuIGEudHJpbSgpfTpmdW5jdGlvbihhKXtyZXR1cm4vXltcc1x4YTBdKihbXHNcU10qPylbXHNceGEwXSokLy5leGVjKGEpWzFdfTsvKgoKIENvcHlyaWdodCBHb29nbGUgTExDCiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMAoqLwp2YXIgSWE9e307dmFyIEphPWZ1bmN0aW9uKGEpe2lmKElhIT09SWEpdGhyb3cgRXJyb3IoIkJhZCBzZWNyZXQiKTt0aGlzLmc9YX07SmEucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ307bmV3IEphKCJhYm91dDpibGFuayIpO25ldyBKYSgiYWJvdXQ6aW52YWxpZCN6Q2xvc3VyZXoiKTt2YXIgS2E9W10sTGE9ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJBIFVSTCB3aXRoIGNvbnRlbnQgJyIrYSsiJyB3YXMgc2FuaXRpemVkIGF3YXkuIil9O0thLmluZGV4T2YoTGEpPT09LTEmJkthLnB1c2goTGEpO3ZhciBNYSxOYTthOntmb3IodmFyIE9hPVsiQ0xPU1VSRV9GTEFHUyJdLFBhPWwsUWE9MDtRYTxPYS5sZW5ndGg7UWErKylpZihQYT1QYVtPYVtRYV1dLFBhPT1udWxsKXtOYT1udWxsO2JyZWFrIGF9TmE9UGF9dmFyIFJhPU5hJiZOYVs2MTA0MDEzMDFdO01hPVJhIT1udWxsP1JhOiExO2Z1bmN0aW9uIFNhKCl7dmFyIGE9bC5uYXZpZ2F0b3I7cmV0dXJuIGEmJihhPWEudXNlckFnZW50KT9hOiIifXZhciBUYSxVYT1sLm5hdmlnYXRvcjtUYT1VYT9VYS51c2VyQWdlbnREYXRhfHxudWxsOm51bGw7ZnVuY3Rpb24gcihhKXtyZXR1cm4gU2EoKS5pbmRleE9mKGEpIT0tMX07dmFyIFZhPXIoIkVkZ2UiKSx0PXIoIkdlY2tvIikmJiEoU2EoKS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoIndlYmtpdCIpIT0tMSYmIXIoIkVkZ2UiKSkmJiEocigiVHJpZGVudCIpfHxyKCJNU0lFIikpJiYhcigiRWRnZSIpLHU9U2EoKS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoIndlYmtpdCIpIT0tMSYmIXIoIkVkZ2UiKSx2PU1hJiZUYSYmVGEucGxhdGZvcm0/VGEucGxhdGZvcm09PT0ibWFjT1MiOnIoIk1hY2ludG9zaCIpO3ZhciBYYT1mdW5jdGlvbihhLGIpe0JhKGIsZnVuY3Rpb24oYyxkKXtkPT0ic3R5bGUiP2Euc3R5bGUuY3NzVGV4dD1jOmQ9PSJjbGFzcyI/YS5jbGFzc05hbWU9YzpkPT0iZm9yIj9hLmh0bWxGb3I9YzpXYS5oYXNPd25Qcm9wZXJ0eShkKT9hLnNldEF0dHJpYnV0ZShXYVtkXSxjKTpkLmxhc3RJbmRleE9mKCJhcmlhLSIsMCk9PTB8fGQubGFzdEluZGV4T2YoImRhdGEtIiwwKT09MD9hLnNldEF0dHJpYnV0ZShkLGMpOmFbZF09Y30pfSxXYT17Y2VsbHBhZGRpbmc6ImNlbGxQYWRkaW5nIixjZWxsc3BhY2luZzoiY2VsbFNwYWNpbmciLGNvbHNwYW46ImNvbFNwYW4iLGZyYW1lYm9yZGVyOiJmcmFtZUJvcmRlciIsaGVpZ2h0OiJoZWlnaHQiLG1heGxlbmd0aDoibWF4TGVuZ3RoIixub25jZToibm9uY2UiLHJvbGU6InJvbGUiLHJvd3NwYW46InJvd1NwYW4iLHR5cGU6InR5cGUiLHVzZW1hcDoidXNlTWFwIix2YWxpZ246InZBbGlnbiIsd2lkdGg6IndpZHRoIn0sWWE9ZnVuY3Rpb24oYSwKYixjKXtmdW5jdGlvbiBkKGspe2smJmIuYXBwZW5kQ2hpbGQodHlwZW9mIGs9PT0ic3RyaW5nIj9hLmNyZWF0ZVRleHROb2RlKGspOmspfWZvcih2YXIgZT0yO2U8Yy5sZW5ndGg7ZSsrKXt2YXIgZj1jW2VdO2lmKCFrYShmKXx8bShmKSYmZi5ub2RlVHlwZT4wKWQoZik7ZWxzZXthOntpZihmJiZ0eXBlb2YgZi5sZW5ndGg9PSJudW1iZXIiKXtpZihtKGYpKXt2YXIgaD10eXBlb2YgZi5pdGVtPT0iZnVuY3Rpb24ifHx0eXBlb2YgZi5pdGVtPT0ic3RyaW5nIjticmVhayBhfWlmKHR5cGVvZiBmPT09ImZ1bmN0aW9uIil7aD10eXBlb2YgZi5pdGVtPT0iZnVuY3Rpb24iO2JyZWFrIGF9fWg9ITF9d2EoaD95YShmKTpmLGQpfX19LFphPWZ1bmN0aW9uKGEsYil7Yj1TdHJpbmcoYik7YS5jb250ZW50VHlwZT09PSJhcHBsaWNhdGlvbi94aHRtbCt4bWwiJiYoYj1iLnRvTG93ZXJDYXNlKCkpO3JldHVybiBhLmNyZWF0ZUVsZW1lbnQoYil9LCRhPWZ1bmN0aW9uKGEpe2EmJmEucGFyZW50Tm9kZSYmCmEucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhKX0sYWI9ZnVuY3Rpb24oYSxiKXtpZighYXx8IWIpcmV0dXJuITE7aWYoYS5jb250YWlucyYmYi5ub2RlVHlwZT09MSlyZXR1cm4gYT09Ynx8YS5jb250YWlucyhiKTtpZih0eXBlb2YgYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiE9InVuZGVmaW5lZCIpcmV0dXJuIGE9PWJ8fCEhKGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24oYikmMTYpO2Zvcig7YiYmYSE9YjspYj1iLnBhcmVudE5vZGU7cmV0dXJuIGI9PWF9LGJiPWZ1bmN0aW9uKGEpe3AoYSwiTm9kZSBjYW5ub3QgYmUgbnVsbCBvciB1bmRlZmluZWQuIik7cmV0dXJuIGEubm9kZVR5cGU9PTk/YTphLm93bmVyRG9jdW1lbnR8fGEuZG9jdW1lbnR9LGNiPWZ1bmN0aW9uKGEsYil7Yj9hLnRhYkluZGV4PTA6KGEudGFiSW5kZXg9LTEsYS5yZW1vdmVBdHRyaWJ1dGUoInRhYkluZGV4IikpfSxkYj1mdW5jdGlvbihhKXtyZXR1cm4gYS5oYXNBdHRyaWJ1dGUoInRhYmluZGV4Iil9LGViPQpmdW5jdGlvbihhKXthPWEudGFiSW5kZXg7cmV0dXJuIHR5cGVvZiBhPT09Im51bWJlciImJmE+PTAmJmE8MzI3Njh9LGZiPWZ1bmN0aW9uKGEpe3RoaXMuZz1hfHxsLmRvY3VtZW50fHxkb2N1bWVudH07ZmIucHJvdG90eXBlLmk9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nO3JldHVybiB0eXBlb2YgYT09PSJzdHJpbmciP2IuZ2V0RWxlbWVudEJ5SWQoYSk6YX07ZmIucHJvdG90eXBlLmg9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXMuZyxlPWFyZ3VtZW50cyxmPWVbMV0saD1aYShkLFN0cmluZyhlWzBdKSk7ZiYmKHR5cGVvZiBmPT09InN0cmluZyI/aC5jbGFzc05hbWU9ZjpBcnJheS5pc0FycmF5KGYpP2guY2xhc3NOYW1lPWYuam9pbigiICIpOlhhKGgsZikpO2UubGVuZ3RoPjImJllhKGQsaCxlKTtyZXR1cm4gaH07dmFyIHc9ZnVuY3Rpb24oKXt0aGlzLmJhPXRoaXMuYmE7dGhpcy5rYT10aGlzLmthfTt3LnByb3RvdHlwZS5iYT0hMTt3LnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7dGhpcy5iYXx8KHRoaXMuYmE9ITAsdGhpcy5DKCkpfTt3LnByb3RvdHlwZVtTeW1ib2wuZGlzcG9zZV09ZnVuY3Rpb24oKXt0aGlzLmRpc3Bvc2UoKX07dy5wcm90b3R5cGUuQz1mdW5jdGlvbigpe2lmKHRoaXMua2EpZm9yKDt0aGlzLmthLmxlbmd0aDspdGhpcy5rYS5zaGlmdCgpKCl9O3ZhciB5PWZ1bmN0aW9uKGEsYil7dGhpcy50eXBlPWE7dGhpcy51PXRoaXMudGFyZ2V0PWI7dGhpcy5kZWZhdWx0UHJldmVudGVkPXRoaXMuQT0hMX07eS5wcm90b3R5cGUudj1mdW5jdGlvbigpe3RoaXMuQT0hMH07eS5wcm90b3R5cGUuaj1mdW5jdGlvbigpe3RoaXMuZGVmYXVsdFByZXZlbnRlZD0hMH07dmFyIGdiPWZ1bmN0aW9uKCl7aWYoIWwuYWRkRXZlbnRMaXN0ZW5lcnx8IU9iamVjdC5kZWZpbmVQcm9wZXJ0eSlyZXR1cm4hMTt2YXIgYT0hMSxiPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwicGFzc2l2ZSIse2dldDpmdW5jdGlvbigpe2E9ITB9fSk7dHJ5e3ZhciBjPWZ1bmN0aW9uKCl7fTtsLmFkZEV2ZW50TGlzdGVuZXIoInRlc3QiLGMsYik7bC5yZW1vdmVFdmVudExpc3RlbmVyKCJ0ZXN0IixjLGIpfWNhdGNoKGQpe31yZXR1cm4gYX0oKTt2YXIgej1mdW5jdGlvbihhLGIpe3kuY2FsbCh0aGlzLGE/YS50eXBlOiIiKTt0aGlzLnJlbGF0ZWRUYXJnZXQ9dGhpcy51PXRoaXMudGFyZ2V0PW51bGw7dGhpcy5idXR0b249dGhpcy5zY3JlZW5ZPXRoaXMuc2NyZWVuWD10aGlzLmNsaWVudFk9dGhpcy5jbGllbnRYPTA7dGhpcy5rZXk9IiI7dGhpcy5nPTA7dGhpcy5tZXRhS2V5PXRoaXMuc2hpZnRLZXk9dGhpcy5hbHRLZXk9dGhpcy5jdHJsS2V5PSExO3RoaXMuc3RhdGU9bnVsbDt0aGlzLkc9ITE7dGhpcy5wb2ludGVySWQ9MDt0aGlzLnBvaW50ZXJUeXBlPSIiO3RoaXMudGltZVN0YW1wPTA7dGhpcy5oPW51bGw7aWYoYSl7dmFyIGM9dGhpcy50eXBlPWEudHlwZSxkPWEuY2hhbmdlZFRvdWNoZXMmJmEuY2hhbmdlZFRvdWNoZXMubGVuZ3RoP2EuY2hhbmdlZFRvdWNoZXNbMF06bnVsbDt0aGlzLnRhcmdldD1hLnRhcmdldHx8YS5zcmNFbGVtZW50O3RoaXMudT1iO2I9YS5yZWxhdGVkVGFyZ2V0O2J8fChjPT0ibW91c2VvdmVyIj8KYj1hLmZyb21FbGVtZW50OmM9PSJtb3VzZW91dCImJihiPWEudG9FbGVtZW50KSk7dGhpcy5yZWxhdGVkVGFyZ2V0PWI7ZD8odGhpcy5jbGllbnRYPWQuY2xpZW50WCE9PXZvaWQgMD9kLmNsaWVudFg6ZC5wYWdlWCx0aGlzLmNsaWVudFk9ZC5jbGllbnRZIT09dm9pZCAwP2QuY2xpZW50WTpkLnBhZ2VZLHRoaXMuc2NyZWVuWD1kLnNjcmVlblh8fDAsdGhpcy5zY3JlZW5ZPWQuc2NyZWVuWXx8MCk6KHRoaXMuY2xpZW50WD1hLmNsaWVudFghPT12b2lkIDA/YS5jbGllbnRYOmEucGFnZVgsdGhpcy5jbGllbnRZPWEuY2xpZW50WSE9PXZvaWQgMD9hLmNsaWVudFk6YS5wYWdlWSx0aGlzLnNjcmVlblg9YS5zY3JlZW5YfHwwLHRoaXMuc2NyZWVuWT1hLnNjcmVlbll8fDApO3RoaXMuYnV0dG9uPWEuYnV0dG9uO3RoaXMuZz1hLmtleUNvZGV8fDA7dGhpcy5rZXk9YS5rZXl8fCIiO3RoaXMuY3RybEtleT1hLmN0cmxLZXk7dGhpcy5hbHRLZXk9YS5hbHRLZXk7dGhpcy5zaGlmdEtleT1hLnNoaWZ0S2V5Owp0aGlzLm1ldGFLZXk9YS5tZXRhS2V5O3RoaXMuRz12P2EubWV0YUtleTphLmN0cmxLZXk7dGhpcy5wb2ludGVySWQ9YS5wb2ludGVySWR8fDA7dGhpcy5wb2ludGVyVHlwZT1hLnBvaW50ZXJUeXBlO3RoaXMuc3RhdGU9YS5zdGF0ZTt0aGlzLnRpbWVTdGFtcD1hLnRpbWVTdGFtcDt0aGlzLmg9YTthLmRlZmF1bHRQcmV2ZW50ZWQmJnoubC5qLmNhbGwodGhpcyl9fTtuKHoseSk7ei5wcm90b3R5cGUudj1mdW5jdGlvbigpe3oubC52LmNhbGwodGhpcyk7dGhpcy5oLnN0b3BQcm9wYWdhdGlvbj90aGlzLmguc3RvcFByb3BhZ2F0aW9uKCk6dGhpcy5oLmNhbmNlbEJ1YmJsZT0hMH07ei5wcm90b3R5cGUuaj1mdW5jdGlvbigpe3oubC5qLmNhbGwodGhpcyk7dmFyIGE9dGhpcy5oO2EucHJldmVudERlZmF1bHQ/YS5wcmV2ZW50RGVmYXVsdCgpOmEucmV0dXJuVmFsdWU9ITF9O3ZhciBoYj0iY2xvc3VyZV9saXN0ZW5hYmxlXyIrKE1hdGgucmFuZG9tKCkqMUU2fDApLGliPWZ1bmN0aW9uKGEpe3JldHVybiEoIWF8fCFhW2hiXSl9O3ZhciBqYj0wO3ZhciBrYj1mdW5jdGlvbihhLGIsYyxkLGUpe3RoaXMubGlzdGVuZXI9YTt0aGlzLnByb3h5PW51bGw7dGhpcy5zcmM9Yjt0aGlzLnR5cGU9Yzt0aGlzLmNhcHR1cmU9ISFkO3RoaXMucGE9ZTt0aGlzLmtleT0rK2piO3RoaXMuamE9dGhpcy5vYT0hMX0sbGI9ZnVuY3Rpb24oYSl7YS5qYT0hMDthLmxpc3RlbmVyPW51bGw7YS5wcm94eT1udWxsO2Euc3JjPW51bGw7YS5wYT1udWxsfTt2YXIgbWI9ZnVuY3Rpb24oYSl7dGhpcy5zcmM9YTt0aGlzLmc9e307dGhpcy5oPTB9O21iLnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZj1hLnRvU3RyaW5nKCk7YT10aGlzLmdbZl07YXx8KGE9dGhpcy5nW2ZdPVtdLHRoaXMuaCsrKTt2YXIgaD1uYihhLGIsZCxlKTtoPi0xPyhiPWFbaF0sY3x8KGIub2E9ITEpKTooYj1uZXcga2IoYix0aGlzLnNyYyxmLCEhZCxlKSxiLm9hPWMsYS5wdXNoKGIpKTtyZXR1cm4gYn07CnZhciBvYj1mdW5jdGlvbihhLGIpe3ZhciBjPWIudHlwZTtjIGluIGEuZyYmeGEoYS5nW2NdLGIpJiYobGIoYiksYS5nW2NdLmxlbmd0aD09MCYmKGRlbGV0ZSBhLmdbY10sYS5oLS0pKX0scGI9ZnVuY3Rpb24oYSxiLGMsZCxlKXthPWEuZ1tiLnRvU3RyaW5nKCldO2I9LTE7YSYmKGI9bmIoYSxjLGQsZSkpO3JldHVybiBiPi0xP2FbYl06bnVsbH0sbmI9ZnVuY3Rpb24oYSxiLGMsZCl7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDsrK2Upe3ZhciBmPWFbZV07aWYoIWYuamEmJmYubGlzdGVuZXI9PWImJmYuY2FwdHVyZT09ISFjJiZmLnBhPT1kKXJldHVybiBlfXJldHVybi0xfTt2YXIgcWI9ImNsb3N1cmVfbG1fIisoTWF0aC5yYW5kb20oKSoxRTZ8MCkscmI9e30sc2I9MCx1Yj1mdW5jdGlvbihhLGIsYyxkLGUpe2lmKGQmJmQub25jZSlyZXR1cm4gdGIoYSxiLGMsZCxlKTtpZihBcnJheS5pc0FycmF5KGIpKXtmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKyl1YihhLGJbZl0sYyxkLGUpO3JldHVybiBudWxsfWM9dmIoYyk7cmV0dXJuIGliKGEpP3diKGEsYixjLG0oZCk/ISFkLmNhcHR1cmU6ISFkLGUpOnhiKGEsYixjLCExLGQsZSl9LHhiPWZ1bmN0aW9uKGEsYixjLGQsZSxmKXtpZighYil0aHJvdyBFcnJvcigiSW52YWxpZCBldmVudCB0eXBlIik7dmFyIGg9bShlKT8hIWUuY2FwdHVyZTohIWUsaz15YihhKTtrfHwoYVtxYl09az1uZXcgbWIoYSkpO2M9ay5hZGQoYixjLGQsaCxmKTtpZihjLnByb3h5KXJldHVybiBjO2Q9emIoKTtjLnByb3h5PWQ7ZC5zcmM9YTtkLmxpc3RlbmVyPWM7aWYoYS5hZGRFdmVudExpc3RlbmVyKWdifHwoZT1oKSxlPT09dm9pZCAwJiYKKGU9ITEpLGEuYWRkRXZlbnRMaXN0ZW5lcihiLnRvU3RyaW5nKCksZCxlKTtlbHNlIGlmKGEuYXR0YWNoRXZlbnQpYS5hdHRhY2hFdmVudChBYihiLnRvU3RyaW5nKCkpLGQpO2Vsc2UgaWYoYS5hZGRMaXN0ZW5lciYmYS5yZW1vdmVMaXN0ZW5lcilwKGI9PT0iY2hhbmdlIiwiTWVkaWFRdWVyeUxpc3Qgb25seSBoYXMgYSBjaGFuZ2UgZXZlbnQiKSxhLmFkZExpc3RlbmVyKGQpO2Vsc2UgdGhyb3cgRXJyb3IoImFkZEV2ZW50TGlzdGVuZXIgYW5kIGF0dGFjaEV2ZW50IGFyZSB1bmF2YWlsYWJsZS4iKTtzYisrO3JldHVybiBjfSx6Yj1mdW5jdGlvbigpe3ZhciBhPUJiLGI9ZnVuY3Rpb24oYyl7cmV0dXJuIGEuY2FsbChiLnNyYyxiLmxpc3RlbmVyLGMpfTtyZXR1cm4gYn0sdGI9ZnVuY3Rpb24oYSxiLGMsZCxlKXtpZihBcnJheS5pc0FycmF5KGIpKXtmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKyl0YihhLGJbZl0sYyxkLGUpO3JldHVybiBudWxsfWM9dmIoYyk7cmV0dXJuIGliKGEpPwphLkEuYWRkKFN0cmluZyhiKSxjLCEwLG0oZCk/ISFkLmNhcHR1cmU6ISFkLGUpOnhiKGEsYixjLCEwLGQsZSl9LENiPWZ1bmN0aW9uKGEsYixjLGQsZSl7aWYoQXJyYXkuaXNBcnJheShiKSlmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKylDYihhLGJbZl0sYyxkLGUpO2Vsc2UgZD1tKGQpPyEhZC5jYXB0dXJlOiEhZCxjPXZiKGMpLGliKGEpPyhhPWEuQSxiPVN0cmluZyhiKS50b1N0cmluZygpLGIgaW4gYS5nJiYoZj1hLmdbYl0sYz1uYihmLGMsZCxlKSxjPi0xJiYobGIoZltjXSkscChmLmxlbmd0aCE9bnVsbCksQXJyYXkucHJvdG90eXBlLnNwbGljZS5jYWxsKGYsYywxKSxmLmxlbmd0aD09MCYmKGRlbGV0ZSBhLmdbYl0sYS5oLS0pKSkpOmEmJihhPXliKGEpKSYmKGM9cGIoYSxiLGMsZCxlKSkmJkEoYyl9LEE9ZnVuY3Rpb24oYSl7aWYodHlwZW9mIGEhPT0ibnVtYmVyIiYmYSYmIWEuamEpe3ZhciBiPWEuc3JjO2lmKGliKGIpKW9iKGIuQSxhKTtlbHNle3ZhciBjPWEudHlwZSwKZD1hLnByb3h5O2IucmVtb3ZlRXZlbnRMaXN0ZW5lcj9iLnJlbW92ZUV2ZW50TGlzdGVuZXIoYyxkLGEuY2FwdHVyZSk6Yi5kZXRhY2hFdmVudD9iLmRldGFjaEV2ZW50KEFiKGMpLGQpOmIuYWRkTGlzdGVuZXImJmIucmVtb3ZlTGlzdGVuZXImJmIucmVtb3ZlTGlzdGVuZXIoZCk7c2ItLTsoYz15YihiKSk/KG9iKGMsYSksYy5oPT0wJiYoYy5zcmM9bnVsbCxiW3FiXT1udWxsKSk6bGIoYSl9fX0sQWI9ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW4gcmI/cmJbYV06cmJbYV09Im9uIithfSxCYj1mdW5jdGlvbihhLGIpe2lmKGEuamEpYT0hMDtlbHNle2I9bmV3IHooYix0aGlzKTt2YXIgYz1hLmxpc3RlbmVyLGQ9YS5wYXx8YS5zcmM7YS5vYSYmQShhKTthPWMuY2FsbChkLGIpfXJldHVybiBhfSx5Yj1mdW5jdGlvbihhKXthPWFbcWJdO3JldHVybiBhIGluc3RhbmNlb2YgbWI/YTpudWxsfSxEYj0iX19jbG9zdXJlX2V2ZW50c19mbl8iKyhNYXRoLnJhbmRvbSgpKjFFOT4+PjApLHZiPWZ1bmN0aW9uKGEpe3AoYSwKIkxpc3RlbmVyIGNhbiBub3QgYmUgbnVsbC4iKTtpZih0eXBlb2YgYT09PSJmdW5jdGlvbiIpcmV0dXJuIGE7cChhLmhhbmRsZUV2ZW50LCJBbiBvYmplY3QgbGlzdGVuZXIgbXVzdCBoYXZlIGhhbmRsZUV2ZW50IG1ldGhvZC4iKTthW0RiXXx8KGFbRGJdPWZ1bmN0aW9uKGIpe3JldHVybiBhLmhhbmRsZUV2ZW50KGIpfSk7cmV0dXJuIGFbRGJdfTt2YXIgRWI9ZnVuY3Rpb24oYSl7dy5jYWxsKHRoaXMpO3RoaXMuaD1hO3RoaXMuZz17fX07bihFYix3KTsKdmFyIEZiPVtdLEI9ZnVuY3Rpb24oYSxiLGMsZCl7QXJyYXkuaXNBcnJheShjKXx8KGMmJihGYlswXT1jLnRvU3RyaW5nKCkpLGM9RmIpO2Zvcih2YXIgZT0wO2U8Yy5sZW5ndGg7ZSsrKXt2YXIgZj11YihiLGNbZV0sZHx8YS5oYW5kbGVFdmVudCwhMSxhLmh8fGEpO2lmKCFmKWJyZWFrO2EuZ1tmLmtleV09Zn1yZXR1cm4gYX0sQz1mdW5jdGlvbihhLGIsYyxkLGUsZil7aWYoQXJyYXkuaXNBcnJheShjKSlmb3IodmFyIGg9MDtoPGMubGVuZ3RoO2grKylDKGEsYixjW2hdLGQsZSxmKTtlbHNlIGQ9ZHx8YS5oYW5kbGVFdmVudCxlPW0oZSk/ISFlLmNhcHR1cmU6ISFlLGY9Znx8YS5ofHxhLGQ9dmIoZCksZT0hIWUsYz1pYihiKT9wYihiLkEsU3RyaW5nKGMpLGQsZSxmKTpiPyhiPXliKGIpKT9wYihiLGMsZCxlLGYpOm51bGw6bnVsbCxjJiYoQShjKSxkZWxldGUgYS5nW2Mua2V5XSk7cmV0dXJuIGF9LEdiPWZ1bmN0aW9uKGEpe0JhKGEuZyxmdW5jdGlvbihiLGMpe3RoaXMuZy5oYXNPd25Qcm9wZXJ0eShjKSYmCkEoYil9LGEpO2EuZz17fX07RWIucHJvdG90eXBlLkM9ZnVuY3Rpb24oKXtFYi5sLkMuY2FsbCh0aGlzKTtHYih0aGlzKX07RWIucHJvdG90eXBlLmhhbmRsZUV2ZW50PWZ1bmN0aW9uKCl7dGhyb3cgRXJyb3IoIkV2ZW50SGFuZGxlci5oYW5kbGVFdmVudCBub3QgaW1wbGVtZW50ZWQiKTt9O3ZhciBEPWZ1bmN0aW9uKCl7dy5jYWxsKHRoaXMpO3RoaXMuQT1uZXcgbWIodGhpcyk7dGhpcy5ZYT10aGlzO3RoaXMubGE9bnVsbH07bihELHcpO0QucHJvdG90eXBlW2hiXT0hMDtELnByb3RvdHlwZS5BYT1mdW5jdGlvbihhKXt0aGlzLmxhPWF9O0QucHJvdG90eXBlLnJlbW92ZUV2ZW50TGlzdGVuZXI9ZnVuY3Rpb24oYSxiLGMsZCl7Q2IodGhpcyxhLGIsYyxkKX07CnZhciBFPWZ1bmN0aW9uKGEsYil7SGIoYSk7dmFyIGM9YS5sYTtpZihjKXt2YXIgZD1bXTtmb3IodmFyIGU9MTtjO2M9Yy5sYSlkLnB1c2goYykscCgrK2U8MUUzLCJpbmZpbml0ZSBsb29wIil9YT1hLllhO2M9Yi50eXBlfHxiO3R5cGVvZiBiPT09InN0cmluZyI/Yj1uZXcgeShiLGEpOmIgaW5zdGFuY2VvZiB5P2IudGFyZ2V0PWIudGFyZ2V0fHxhOihlPWIsYj1uZXcgeShjLGEpLEdhKGIsZSkpO2U9ITA7dmFyIGY7aWYoZClmb3IoZj1kLmxlbmd0aC0xOyFiLkEmJmY+PTA7Zi0tKXt2YXIgaD1iLnU9ZFtmXTtlPUliKGgsYywhMCxiKSYmZX1iLkF8fChoPWIudT1hLGU9SWIoaCxjLCEwLGIpJiZlLGIuQXx8KGU9SWIoaCxjLCExLGIpJiZlKSk7aWYoZClmb3IoZj0wOyFiLkEmJmY8ZC5sZW5ndGg7ZisrKWg9Yi51PWRbZl0sZT1JYihoLGMsITEsYikmJmU7cmV0dXJuIGV9OwpELnByb3RvdHlwZS5DPWZ1bmN0aW9uKCl7RC5sLkMuY2FsbCh0aGlzKTtpZih0aGlzLkEpe3ZhciBhPXRoaXMuQSxiPTAsYztmb3IoYyBpbiBhLmcpe2Zvcih2YXIgZD1hLmdbY10sZT0wO2U8ZC5sZW5ndGg7ZSsrKSsrYixsYihkW2VdKTtkZWxldGUgYS5nW2NdO2EuaC0tfX10aGlzLmxhPW51bGx9O3ZhciB3Yj1mdW5jdGlvbihhLGIsYyxkLGUpe0hiKGEpO3JldHVybiBhLkEuYWRkKFN0cmluZyhiKSxjLCExLGQsZSl9LEliPWZ1bmN0aW9uKGEsYixjLGQpe2I9YS5BLmdbU3RyaW5nKGIpXTtpZighYilyZXR1cm4hMDtiPWIuY29uY2F0KCk7Zm9yKHZhciBlPSEwLGY9MDtmPGIubGVuZ3RoOysrZil7dmFyIGg9YltmXTtpZihoJiYhaC5qYSYmaC5jYXB0dXJlPT1jKXt2YXIgaz1oLmxpc3RlbmVyLHE9aC5wYXx8aC5zcmM7aC5vYSYmb2IoYS5BLGgpO2U9ay5jYWxsKHEsZCkhPT0hMSYmZX19cmV0dXJuIGUmJiFkLmRlZmF1bHRQcmV2ZW50ZWR9LEhiPWZ1bmN0aW9uKGEpe3AoYS5BLCJFdmVudCB0YXJnZXQgaXMgbm90IGluaXRpYWxpemVkLiBEaWQgeW91IGNhbGwgdGhlIHN1cGVyY2xhc3MgKGdvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0KSBjb25zdHJ1Y3Rvcj8iKX07dmFyIEpiPXQ/Ik1velVzZXJTZWxlY3QiOnV8fFZhPyJXZWJraXRVc2VyU2VsZWN0IjpudWxsLEtiPWZ1bmN0aW9uKGEsYil7Yj1iP251bGw6YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpO2lmKEpiJiYoYS5zdHlsZSYmKGEuc3R5bGVbSmJdPSJub25lIiksYikpZm9yKHZhciBjPTA7YT1iW2NdO2MrKylhLnN0eWxlJiYoYS5zdHlsZVtKYl09Im5vbmUiKX07dmFyIExiPWZ1bmN0aW9uKCl7fTtpYShMYik7TGIucHJvdG90eXBlLmc9MDt2YXIgRj1mdW5jdGlvbihhKXtELmNhbGwodGhpcyk7dGhpcy5HPWF8fHBhfHwocGE9bmV3IGZiKTt0aGlzLnphPU1iO3RoaXMuWT1udWxsO3RoaXMucz0hMTt0aGlzLmc9bnVsbDt0aGlzLk09dm9pZCAwO3RoaXMudT10aGlzLmo9dGhpcy5oPW51bGw7dGhpcy5TYT0hMX07bihGLEQpO0YucHJvdG90eXBlLlphPUxiLlYoKTsKdmFyIE1iPW51bGwsTmI9ZnVuY3Rpb24oYSxiKXtzd2l0Y2goYSl7Y2FzZSAxOnJldHVybiBiPyJkaXNhYmxlIjoiZW5hYmxlIjtjYXNlIDI6cmV0dXJuIGI/ImhpZ2hsaWdodCI6InVuaGlnaGxpZ2h0IjtjYXNlIDQ6cmV0dXJuIGI/ImFjdGl2YXRlIjoiZGVhY3RpdmF0ZSI7Y2FzZSA4OnJldHVybiBiPyJzZWxlY3QiOiJ1bnNlbGVjdCI7Y2FzZSAxNjpyZXR1cm4gYj8iY2hlY2siOiJ1bmNoZWNrIjtjYXNlIDMyOnJldHVybiBiPyJmb2N1cyI6ImJsdXIiO2Nhc2UgNjQ6cmV0dXJuIGI/Im9wZW4iOiJjbG9zZSJ9dGhyb3cgRXJyb3IoIkludmFsaWQgY29tcG9uZW50IHN0YXRlIik7fSxPYj1mdW5jdGlvbihhKXtyZXR1cm4gYS5ZfHwoYS5ZPSI6IisoYS5aYS5nKyspLnRvU3RyaW5nKDM2KSl9LFBiPWZ1bmN0aW9uKGEsYil7aWYoYS5oJiZhLmgudSl7dmFyIGM9YS5oLnUsZD1hLlk7ZCBpbiBjJiZkZWxldGUgY1tkXTtEYShhLmgudSxiLGEpfWEuWT1ifTtGLnByb3RvdHlwZS5pPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ307CnZhciBRYj1mdW5jdGlvbihhKXthLk18fChhLk09bmV3IEViKGEpKTtyZXR1cm4gcChhLk0pfTtGLnByb3RvdHlwZS5BYT1mdW5jdGlvbihhKXtpZih0aGlzLmgmJnRoaXMuaCE9YSl0aHJvdyBFcnJvcigiTWV0aG9kIG5vdCBzdXBwb3J0ZWQiKTtGLmwuQWEuY2FsbCh0aGlzLGEpfTtGLnByb3RvdHlwZS5tYT1mdW5jdGlvbigpe3RoaXMuZz1aYSh0aGlzLkcuZywiRElWIil9O0YucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbihhKXtSYih0aGlzLGEpfTsKdmFyIFJiPWZ1bmN0aW9uKGEsYixjKXtpZihhLnMpdGhyb3cgRXJyb3IoIkNvbXBvbmVudCBhbHJlYWR5IHJlbmRlcmVkIik7YS5nfHxhLm1hKCk7Yj9iLmluc2VydEJlZm9yZShhLmcsY3x8bnVsbCk6YS5HLmcuYm9keS5hcHBlbmRDaGlsZChhLmcpO2EuaCYmIWEuaC5zfHxhLkkoKX0sU2I9ZnVuY3Rpb24oYSxiKXtpZihhLnMpdGhyb3cgRXJyb3IoIkNvbXBvbmVudCBhbHJlYWR5IHJlbmRlcmVkIik7aWYoYiYmYS53YShiKSl7YS5TYT0hMDt2YXIgYz1iYihiKTthLkcmJmEuRy5nPT1jfHwoYS5HPWI/bmV3IGZiKGJiKGIpKTpwYXx8KHBhPW5ldyBmYikpO2EuRWEoYik7YS5JKCl9ZWxzZSB0aHJvdyBFcnJvcigiSW52YWxpZCBlbGVtZW50IHRvIGRlY29yYXRlIik7fTtnPUYucHJvdG90eXBlO2cud2E9ZnVuY3Rpb24oKXtyZXR1cm4hMH07Zy5FYT1mdW5jdGlvbihhKXt0aGlzLmc9YX07CmcuST1mdW5jdGlvbigpe3RoaXMucz0hMDtUYih0aGlzLGZ1bmN0aW9uKGEpeyFhLnMmJmEuaSgpJiZhLkkoKX0pfTtnLlU9ZnVuY3Rpb24oKXtUYih0aGlzLGZ1bmN0aW9uKGEpe2EucyYmYS5VKCl9KTt0aGlzLk0mJkdiKHRoaXMuTSk7dGhpcy5zPSExfTtnLkM9ZnVuY3Rpb24oKXt0aGlzLnMmJnRoaXMuVSgpO3RoaXMuTSYmKHRoaXMuTS5kaXNwb3NlKCksZGVsZXRlIHRoaXMuTSk7VGIodGhpcyxmdW5jdGlvbihhKXthLmRpc3Bvc2UoKX0pOyF0aGlzLlNhJiZ0aGlzLmcmJiRhKHRoaXMuZyk7dGhpcy5oPXRoaXMuZz10aGlzLnU9dGhpcy5qPW51bGw7Ri5sLkMuY2FsbCh0aGlzKX07Zy5CYT1mdW5jdGlvbihhLGIpe3RoaXMuQ2EoYSxIKHRoaXMpLGIpfTsKZy5DYT1mdW5jdGlvbihhLGIsYyl7cCghIWEsIlByb3ZpZGVkIGVsZW1lbnQgbXVzdCBub3QgYmUgbnVsbC4iKTtpZihhLnMmJihjfHwhdGhpcy5zKSl0aHJvdyBFcnJvcigiQ29tcG9uZW50IGFscmVhZHkgcmVuZGVyZWQiKTtpZihiPDB8fGI+SCh0aGlzKSl0aHJvdyBFcnJvcigiQ2hpbGQgY29tcG9uZW50IGluZGV4IG91dCBvZiBib3VuZHMiKTt0aGlzLnUmJnRoaXMuanx8KHRoaXMudT17fSx0aGlzLmo9W10pO2lmKGEuaD09dGhpcyl7dmFyIGQ9dGhpcy51LGU9T2IoYSk7ZFtlXT1hO3hhKHRoaXMuaixhKX1lbHNlIERhKHRoaXMudSxPYihhKSxhKTtpZihhPT10aGlzKXRocm93IEVycm9yKCJVbmFibGUgdG8gc2V0IHBhcmVudCBjb21wb25lbnQiKTtpZihkPXRoaXMmJmEuaCYmYS5ZKWU9YS5oLGQ9YS5ZLGUudSYmZD8oZT1lLnUsZD0oZSE9PW51bGwmJmQgaW4gZT9lW2RdOnZvaWQgMCl8fG51bGwpOmQ9bnVsbDtpZihkJiZhLmghPXRoaXMpdGhyb3cgRXJyb3IoIlVuYWJsZSB0byBzZXQgcGFyZW50IGNvbXBvbmVudCIpOwphLmg9dGhpcztGLmwuQWEuY2FsbChhLHRoaXMpO3phKHRoaXMuaixiLDAsYSk7YS5zJiZ0aGlzLnMmJmEuaD09dGhpcz8oYz10aGlzLm5hKCksKGMuY2hpbGROb2Rlc1tiXXx8bnVsbCkhPWEuaSgpJiYoYS5pKCkucGFyZW50RWxlbWVudD09YyYmYy5yZW1vdmVDaGlsZChhLmkoKSksYj1jLmNoaWxkTm9kZXNbYl18fG51bGwsYy5pbnNlcnRCZWZvcmUoYS5pKCksYikpKTpjPyh0aGlzLmd8fHRoaXMubWEoKSxiPUkodGhpcyxiKzEpLFJiKGEsdGhpcy5uYSgpLGI/Yi5nOm51bGwpKTp0aGlzLnMmJiFhLnMmJmEuZyYmYS5nLnBhcmVudE5vZGUmJmEuZy5wYXJlbnROb2RlLm5vZGVUeXBlPT0xJiZhLkkoKX07Zy5uYT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmd9Owp2YXIgVWI9ZnVuY3Rpb24oYSl7aWYoYS56YT09bnVsbCl7dmFyIGI9YS5zP2EuZzphLkcuZy5ib2R5O2E6e3ZhciBjPWJiKGIpO2lmKGMuZGVmYXVsdFZpZXcmJmMuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSYmKGM9Yy5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKGIsbnVsbCkpKXtjPWMuZGlyZWN0aW9ufHxjLmdldFByb3BlcnR5VmFsdWUoImRpcmVjdGlvbiIpfHwiIjticmVhayBhfWM9IiJ9YS56YT0icnRsIj09KGN8fChiLmN1cnJlbnRTdHlsZT9iLmN1cnJlbnRTdHlsZS5kaXJlY3Rpb246bnVsbCl8fGIuc3R5bGUmJmIuc3R5bGUuZGlyZWN0aW9uKX1yZXR1cm4gYS56YX0sSD1mdW5jdGlvbihhKXtyZXR1cm4gYS5qP2Euai5sZW5ndGg6MH0sST1mdW5jdGlvbihhLGIpe3JldHVybiBhLmo/YS5qW2JdfHxudWxsOm51bGx9LFRiPWZ1bmN0aW9uKGEsYixjKXthLmomJmEuai5mb3JFYWNoKGIsYyl9LFZiPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuaiYmYj9hLmouaW5kZXhPZihiKToKLTF9O3ZhciBXYj17bWI6ImFjdGl2ZWRlc2NlbmRhbnQiLHJiOiJhdG9taWMiLHNiOiJhdXRvY29tcGxldGUiLHViOiJidXN5Iix4YjoiY2hlY2tlZCIseWI6ImNvbGluZGV4IixEYjoiY29udHJvbHMiLEViOiJjdXJyZW50IixHYjoiZGVzY3JpYmVkYnkiLEpiOiJkaXNhYmxlZCIsTGI6ImRyb3BlZmZlY3QiLE1iOiJleHBhbmRlZCIsTmI6ImZsb3d0byIsUGI6ImdyYWJiZWQiLFRiOiJoYXNwb3B1cCIsVmI6ImhpZGRlbiIsWGI6ImludmFsaWQiLFliOiJsYWJlbCIsWmI6ImxhYmVsbGVkYnkiLGFjOiJsZXZlbCIsZmM6ImxpdmUiLHZjOiJtdWx0aWxpbmUiLHdjOiJtdWx0aXNlbGVjdGFibGUiLEFjOiJvcmllbnRhdGlvbiIsQmM6Im93bnMiLENjOiJwb3NpbnNldCIsRWM6InByZXNzZWQiLEljOiJyZWFkb25seSIsS2M6InJlbGV2YW50IixMYzoicmVxdWlyZWQiLFBjOiJyb3dpbmRleCIsU2M6InNlbGVjdGVkIixVYzoic2V0c2l6ZSIsV2M6InNvcnQiLG1kOiJ2YWx1ZW1heCIsbmQ6InZhbHVlbWluIiwKb2Q6InZhbHVlbm93IixwZDoidmFsdWV0ZXh0In07dmFyIFhiO3ZhciBZYj17bmI6ImFsZXJ0IixvYjoiYWxlcnRkaWFsb2ciLHBiOiJhcHBsaWNhdGlvbiIscWI6ImFydGljbGUiLHRiOiJiYW5uZXIiLHZiOiJidXR0b24iLHdiOiJjaGVja2JveCIsemI6ImNvbHVtbmhlYWRlciIsQWI6ImNvbWJvYm94IixCYjoiY29tcGxlbWVudGFyeSIsQ2I6ImNvbnRlbnRpbmZvIixGYjoiZGVmaW5pdGlvbiIsSGI6ImRpYWxvZyIsSWI6ImRpcmVjdG9yeSIsS2I6ImRvY3VtZW50IixPYjoiZm9ybSIsUWI6ImdyaWQiLFJiOiJncmlkY2VsbCIsU2I6Imdyb3VwIixVYjoiaGVhZGluZyIsV2I6ImltZyIsYmM6ImxpbmsiLGNjOiJsaXN0IixkYzoibGlzdGJveCIsZWM6Imxpc3RpdGVtIixoYzoibG9nIixpYzoibWFpbiIsamM6Im1hcnF1ZWUiLGtjOiJtYXRoIixsYzoibWVudSIsbWM6Im1lbnViYXIiLG5jOiJtZW51aXRlbSIsb2M6Im1lbnVpdGVtY2hlY2tib3giLHBjOiJtZW51aXRlbXJhZGlvIix4YzoibmF2aWdhdGlvbiIseWM6Im5vdGUiLHpjOiJvcHRpb24iLApEYzoicHJlc2VudGF0aW9uIixGYzoicHJvZ3Jlc3NiYXIiLEdjOiJyYWRpbyIsSGM6InJhZGlvZ3JvdXAiLEpjOiJyZWdpb24iLE1jOiJyb3ciLE5jOiJyb3dncm91cCIsT2M6InJvd2hlYWRlciIsUWM6InNjcm9sbGJhciIsUmM6InNlYXJjaCIsVGM6InNlcGFyYXRvciIsVmM6InNsaWRlciIsWGM6InNwaW5idXR0b24iLFljOiJzdGF0dXMiLFpjOiJzd2l0Y2giLGFkOiJ0YWIiLGJkOiJ0YWJsaXN0IixjZDoidGFicGFuZWwiLGRkOiJ0ZXh0Ym94IixlZDoidGV4dGluZm8iLGZkOiJ0aW1lciIsZ2Q6InRvb2xiYXIiLGhkOiJ0b29sdGlwIixqZDoidHJlZSIsa2Q6InRyZWVncmlkIixsZDoidHJlZWl0ZW0ifTt2YXIgWmI9ZnVuY3Rpb24oYSxiKXtiPyhwKENhKFliLGIpLCJObyBzdWNoIEFSSUEgcm9sZSAiK2IpLGEuc2V0QXR0cmlidXRlKCJyb2xlIixiKSk6YS5yZW1vdmVBdHRyaWJ1dGUoInJvbGUiKX0sYWM9ZnVuY3Rpb24oYSxiLGMpe0FycmF5LmlzQXJyYXkoYykmJihjPWMuam9pbigiICIpKTt2YXIgZD0kYihiKTtjPT09IiJ8fGM9PXZvaWQgMD8oWGJ8fChjPXt9LFhiPShjLmF0b21pYz0hMSxjLmF1dG9jb21wbGV0ZT0ibm9uZSIsYy5kcm9wZWZmZWN0PSJub25lIixjLmhhc3BvcHVwPSExLGMubGl2ZT0ib2ZmIixjLm11bHRpbGluZT0hMSxjLm11bHRpc2VsZWN0YWJsZT0hMSxjLm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIsYy5yZWFkb25seT0hMSxjLnJlbGV2YW50PSJhZGRpdGlvbnMgdGV4dCIsYy5yZXF1aXJlZD0hMSxjLnNvcnQ9Im5vbmUiLGMuYnVzeT0hMSxjLmRpc2FibGVkPSExLGMuaGlkZGVuPSExLGMuaW52YWxpZD0iZmFsc2UiLGMpKSxjPVhiLGIgaW4gYz9hLnNldEF0dHJpYnV0ZShkLApjW2JdKTphLnJlbW92ZUF0dHJpYnV0ZShkKSk6YS5zZXRBdHRyaWJ1dGUoZCxjKX0sJGI9ZnVuY3Rpb24oYSl7cChhLCJBUklBIGF0dHJpYnV0ZSBjYW5ub3QgYmUgZW1wdHkuIik7cChDYShXYixhKSwiTm8gc3VjaCBBUklBIGF0dHJpYnV0ZSAiK2EpO3JldHVybiJhcmlhLSIrYX07dmFyIGRjPWZ1bmN0aW9uKGEsYixjLGQsZSxmKXtpZih2JiZlKXJldHVybiBiYyhhKTtpZihlJiYhZClyZXR1cm4hMTtpZighdCl7dHlwZW9mIGI9PT0ibnVtYmVyIiYmKGI9Y2MoYikpO3ZhciBoPWI9PTE3fHxiPT0xOHx8diYmYj09OTE7aWYoKCFjfHx2KSYmaHx8diYmYj09MTYmJihkfHxmKSlyZXR1cm4hMX1pZih1JiZkJiZjKXN3aXRjaChhKXtjYXNlIDIyMDpjYXNlIDIxOTpjYXNlIDIyMTpjYXNlIDE5MjpjYXNlIDE4NjpjYXNlIDE4OTpjYXNlIDE4NzpjYXNlIDE4ODpjYXNlIDE5MDpjYXNlIDE5MTpjYXNlIDE5MjpjYXNlIDIyMjpyZXR1cm4hMX1zd2l0Y2goYSl7Y2FzZSAxMzpyZXR1cm4gdD9mfHxlPyExOiEoYyYmZCk6ITA7Y2FzZSAyNzpyZXR1cm4hdSYmIXR9cmV0dXJuIHQmJihkfHxlfHxmKT8hMTpiYyhhKX0sYmM9ZnVuY3Rpb24oYSl7aWYoYT49NDgmJmE8PTU3fHxhPj05NiYmYTw9MTA2fHxhPj02NSYmYTw9OTB8fHUmJmE9PTApcmV0dXJuITA7c3dpdGNoKGEpe2Nhc2UgMzI6Y2FzZSA0MzpjYXNlIDYzOmNhc2UgNjQ6Y2FzZSAxMDc6Y2FzZSAxMDk6Y2FzZSAxMTA6Y2FzZSAxMTE6Y2FzZSAxODY6Y2FzZSA1OTpjYXNlIDE4OTpjYXNlIDE4NzpjYXNlIDYxOmNhc2UgMTg4OmNhc2UgMTkwOmNhc2UgMTkxOmNhc2UgMTkyOmNhc2UgMjIyOmNhc2UgMjE5OmNhc2UgMjIwOmNhc2UgMjIxOmNhc2UgMTYzOmNhc2UgNTg6cmV0dXJuITA7CmNhc2UgMTczOmNhc2UgMTcxOnJldHVybiB0O2RlZmF1bHQ6cmV0dXJuITF9fSxjYz1mdW5jdGlvbihhKXtpZih0KWE9ZWMoYSk7ZWxzZSBpZih2JiZ1KXN3aXRjaChhKXtjYXNlIDkzOmE9OTF9cmV0dXJuIGF9LGVjPWZ1bmN0aW9uKGEpe3N3aXRjaChhKXtjYXNlIDYxOnJldHVybiAxODc7Y2FzZSA1OTpyZXR1cm4gMTg2O2Nhc2UgMTczOnJldHVybiAxODk7Y2FzZSAyMjQ6cmV0dXJuIDkxO2Nhc2UgMDpyZXR1cm4gMjI0O2RlZmF1bHQ6cmV0dXJuIGF9fTt2YXIgZmM9ZnVuY3Rpb24oYSxiLGMsZCl7ei5jYWxsKHRoaXMsZCk7dGhpcy50eXBlPSJrZXkiO3RoaXMuZz1hO3RoaXMucmVwZWF0PWN9O24oZmMseik7dmFyIEo9ZnVuY3Rpb24oYSxiKXtELmNhbGwodGhpcyk7YSYmZ2ModGhpcyxhLGIpfTtuKEosRCk7Zz1KLnByb3RvdHlwZTtnLlI9bnVsbDtnLnFhPW51bGw7Zy5KYT1udWxsO2cucmE9bnVsbDtnLkY9LTE7Zy5LPS0xO2cuRGE9ITE7CnZhciBoYz17MzoxMywxMjoxNDQsNjMyMzI6MzgsNjMyMzM6NDAsNjMyMzQ6MzcsNjMyMzU6MzksNjMyMzY6MTEyLDYzMjM3OjExMyw2MzIzODoxMTQsNjMyMzk6MTE1LDYzMjQwOjExNiw2MzI0MToxMTcsNjMyNDI6MTE4LDYzMjQzOjExOSw2MzI0NDoxMjAsNjMyNDU6MTIxLDYzMjQ2OjEyMiw2MzI0NzoxMjMsNjMyNDg6NDQsNjMyNzI6NDYsNjMyNzM6MzYsNjMyNzU6MzUsNjMyNzY6MzMsNjMyNzc6MzQsNjMyODk6MTQ0LDYzMzAyOjQ1fSxpYz17VXA6MzgsRG93bjo0MCxMZWZ0OjM3LFJpZ2h0OjM5LEVudGVyOjEzLEYxOjExMixGMjoxMTMsRjM6MTE0LEY0OjExNSxGNToxMTYsRjY6MTE3LEY3OjExOCxGODoxMTksRjk6MTIwLEYxMDoxMjEsRjExOjEyMixGMTI6MTIzLCJVKzAwN0YiOjQ2LEhvbWU6MzYsRW5kOjM1LFBhZ2VVcDozMyxQYWdlRG93bjozNCxJbnNlcnQ6NDV9LGpjPXYmJnQ7CkoucHJvdG90eXBlLmc9ZnVuY3Rpb24oYSl7dSYmKHRoaXMuRj09MTcmJiFhLmN0cmxLZXl8fHRoaXMuRj09MTgmJiFhLmFsdEtleXx8diYmdGhpcy5GPT05MSYmIWEubWV0YUtleSkmJih0aGlzLks9dGhpcy5GPS0xKTt0aGlzLkY9PS0xJiYoYS5jdHJsS2V5JiZhLmchPTE3P3RoaXMuRj0xNzphLmFsdEtleSYmYS5nIT0xOD90aGlzLkY9MTg6YS5tZXRhS2V5JiZhLmchPTkxJiYodGhpcy5GPTkxKSk7ZGMoYS5nLHRoaXMuRixhLnNoaWZ0S2V5LGEuY3RybEtleSxhLmFsdEtleSxhLm1ldGFLZXkpPyh0aGlzLks9Y2MoYS5nKSxqYyYmKHRoaXMuRGE9YS5hbHRLZXkpKTp0aGlzLmhhbmRsZUV2ZW50KGEpfTtKLnByb3RvdHlwZS5oPWZ1bmN0aW9uKGEpe3RoaXMuSz10aGlzLkY9LTE7dGhpcy5EYT1hLmFsdEtleX07CkoucHJvdG90eXBlLmhhbmRsZUV2ZW50PWZ1bmN0aW9uKGEpe3ZhciBiPWEuaCxjPWIuYWx0S2V5O2lmKHUmJmEudHlwZT09ImtleXByZXNzIil7dmFyIGQ9dGhpcy5LO3ZhciBlPWIuY2hhckNvZGU+PTAmJmIuY2hhckNvZGU8NjMyMzImJmJjKGQpP2IuY2hhckNvZGU6MH1lbHNlIGEudHlwZT09ImtleXByZXNzIj8oamMmJihjPXRoaXMuRGEpLGIua2V5Q29kZT09Yi5jaGFyQ29kZT9iLmtleUNvZGU8MzI/KGQ9Yi5rZXlDb2RlLGU9MCk6KGQ9dGhpcy5LLGU9Yi5jaGFyQ29kZSk6KGQ9Yi5rZXlDb2RlfHx0aGlzLkssZT1iLmNoYXJDb2RlfHwwKSk6KGQ9Yi5rZXlDb2RlfHx0aGlzLkssZT1iLmNoYXJDb2RlfHwwKSx2JiZlPT02MyYmZD09MjI0JiYoZD0xOTEpO3ZhciBmPWQ9Y2MoZCk7ZD9kPj02MzIzMiYmZCBpbiBoYz9mPWhjW2RdOmQ9PTI1JiZhLnNoaWZ0S2V5JiYoZj05KTpiLmtleUlkZW50aWZpZXImJmIua2V5SWRlbnRpZmllciBpbiBpYyYmKGY9aWNbYi5rZXlJZGVudGlmaWVyXSk7CmlmKCF0fHxhLnR5cGUhPSJrZXlwcmVzcyJ8fGRjKGYsdGhpcy5GLGEuc2hpZnRLZXksYS5jdHJsS2V5LGMsYS5tZXRhS2V5KSlhPWY9PXRoaXMuRix0aGlzLkY9ZixiPW5ldyBmYyhmLGUsYSxiKSxiLmFsdEtleT1jLEUodGhpcyxiKX07Si5wcm90b3R5cGUuaT1mdW5jdGlvbigpe3JldHVybiB0aGlzLlJ9O3ZhciBnYz1mdW5jdGlvbihhLGIsYyl7YS5yYSYma2MoYSk7YS5SPWI7YS5xYT11YihhLlIsImtleXByZXNzIixhLGMpO2EuSmE9dWIoYS5SLCJrZXlkb3duIixhLmcsYyxhKTthLnJhPXViKGEuUiwia2V5dXAiLGEuaCxjLGEpfSxrYz1mdW5jdGlvbihhKXthLnFhJiYoQShhLnFhKSxBKGEuSmEpLEEoYS5yYSksYS5xYT1udWxsLGEuSmE9bnVsbCxhLnJhPW51bGwpO2EuUj1udWxsO2EuRj0tMTthLks9LTF9O0oucHJvdG90eXBlLkM9ZnVuY3Rpb24oKXtKLmwuQy5jYWxsKHRoaXMpO2tjKHRoaXMpfTt2YXIgSz17Z2E6Im1vdXNlZG93biIsaGE6Im1vdXNldXAiLGZhOiJtb3VzZWNhbmNlbCIsc2M6Im1vdXNlbW92ZSIsdWM6Im1vdXNlb3ZlciIsdGM6Im1vdXNlb3V0IixxYzoibW91c2VlbnRlciIscmM6Im1vdXNlbGVhdmUifTt2YXIgbGM9ZnVuY3Rpb24oYSl7cmV0dXJuIHR5cGVvZiBhLmNsYXNzTmFtZT09InN0cmluZyI/YS5jbGFzc05hbWU6YS5nZXRBdHRyaWJ1dGUmJmEuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIn0sTD1mdW5jdGlvbihhKXtyZXR1cm4gYS5jbGFzc0xpc3Q/YS5jbGFzc0xpc3Q6bGMoYSkubWF0Y2goL1xTKy9nKXx8W119LG1jPWZ1bmN0aW9uKGEsYil7dHlwZW9mIGEuY2xhc3NOYW1lPT0ic3RyaW5nIj9hLmNsYXNzTmFtZT1iOmEuc2V0QXR0cmlidXRlJiZhLnNldEF0dHJpYnV0ZSgiY2xhc3MiLGIpfSxuYz1mdW5jdGlvbihhLGIpe2EuY2xhc3NMaXN0P2I9YS5jbGFzc0xpc3QuY29udGFpbnMoYik6KGE9TChhKSxiPXZhKGEsYik+PTApO3JldHVybiBifSxvYz1mdW5jdGlvbihhLGIpe2lmKGEuY2xhc3NMaXN0KWEuY2xhc3NMaXN0LmFkZChiKTtlbHNlIGlmKCFuYyhhLGIpKXt2YXIgYz1sYyhhKTttYyhhLGMrKGMubGVuZ3RoPjA/IiAiK2I6YikpfX0scGM9ZnVuY3Rpb24oYSxiKXtpZihhLmNsYXNzTGlzdClBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGIsCmZ1bmN0aW9uKGUpe29jKGEsZSl9KTtlbHNle3ZhciBjPXt9O0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoTChhKSxmdW5jdGlvbihlKXtjW2VdPSEwfSk7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChiLGZ1bmN0aW9uKGUpe2NbZV09ITB9KTtiPSIiO2Zvcih2YXIgZCBpbiBjKWIrPWIubGVuZ3RoPjA/IiAiK2Q6ZDttYyhhLGIpfX0scWM9ZnVuY3Rpb24oYSxiKXthLmNsYXNzTGlzdD9hLmNsYXNzTGlzdC5yZW1vdmUoYik6bmMoYSxiKSYmbWMoYSxBcnJheS5wcm90b3R5cGUuZmlsdGVyLmNhbGwoTChhKSxmdW5jdGlvbihjKXtyZXR1cm4gYyE9Yn0pLmpvaW4oIiAiKSl9LHJjPWZ1bmN0aW9uKGEsYil7YS5jbGFzc0xpc3Q/QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChiLGZ1bmN0aW9uKGMpe3FjKGEsYyl9KTptYyhhLEFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbChMKGEpLGZ1bmN0aW9uKGMpe3JldHVybiEodmEoYixjKT49MCl9KS5qb2luKCIgIikpfTt2YXIgdGM9ZnVuY3Rpb24oYSxiKXtpZighYSl0aHJvdyBFcnJvcigiSW52YWxpZCBjbGFzcyBuYW1lICIrYSk7aWYodHlwZW9mIGIhPT0iZnVuY3Rpb24iKXRocm93IEVycm9yKCJJbnZhbGlkIGRlY29yYXRvciBmdW5jdGlvbiAiK2IpO3NjW2FdPWJ9LHVjPXt9LHNjPXt9O3ZhciB2Yz1mdW5jdGlvbihhKXt0aGlzLkE9YX07aWEodmMpO3ZhciB3Yz1mdW5jdGlvbihhLGIpe2EmJihhLnRhYkluZGV4PWI/MDotMSl9LHljPWZ1bmN0aW9uKGEsYixjKXtjLmlkJiZQYihiLGMuaWQpO3ZhciBkPWEuZygpLGU9ITEsZj1MKGMpO2YmJkFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoZixmdW5jdGlvbihoKXtoPT1kP2U9ITA6aCYmdGhpcy51KGIsaCxkKX0sYSk7ZXx8b2MoYyxkKTt4YyhiLGMpO3JldHVybiBjfTt2Yy5wcm90b3R5cGUudT1mdW5jdGlvbihhLGIsYyl7Yj09YysiLWRpc2FibGVkIj9hLlgoITEpOmI9PWMrIi1ob3Jpem9udGFsIj96YyhhLCJob3Jpem9udGFsIik6Yj09YysiLXZlcnRpY2FsIiYmemMoYSwidmVydGljYWwiKX07CnZhciB4Yz1mdW5jdGlvbihhLGIpe2lmKGIpZm9yKHZhciBjPWIuZmlyc3RDaGlsZCxkO2MmJmMucGFyZW50Tm9kZT09Yjspe2Q9Yy5uZXh0U2libGluZztpZihjLm5vZGVUeXBlPT0xKXthOnt2YXIgZT1jO3AoZSk7ZT1MKGUpO2Zvcih2YXIgZj1lLmxlbmd0aCxoPTA7aDxmO2grKyl7dmFyIGs9ZVtoXTtpZihrPWsgaW4gc2M/c2Nba10oKTpudWxsKXtlPWs7YnJlYWsgYX19ZT1udWxsfWUmJihlLmc9YyxhLmlzRW5hYmxlZCgpfHxlLlgoITEpLGEuQmEoZSksU2IoZSxjKSl9ZWxzZSBjLm5vZGVWYWx1ZSYmSGEoYy5ub2RlVmFsdWUpIT0iInx8Yi5yZW1vdmVDaGlsZChjKTtjPWR9fSxBYz1mdW5jdGlvbihhLGIpe2I9Yi5pKCk7cChiLCJUaGUgY29udGFpbmVyIERPTSBlbGVtZW50IGNhbm5vdCBiZSBudWxsLiIpO0tiKGIsdCk7KGE9YS5BKSYmWmIoYixhKX07dmMucHJvdG90eXBlLmc9ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy1jb250YWluZXIifTsKdmMucHJvdG90eXBlLmo9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nKCksYz1bYixhLkw9PSJob3Jpem9udGFsIj9iKyItaG9yaXpvbnRhbCI6YisiLXZlcnRpY2FsIl07YS5pc0VuYWJsZWQoKXx8Yy5wdXNoKGIrIi1kaXNhYmxlZCIpO3JldHVybiBjfTt2YXIgQmM9ZnVuY3Rpb24oKXt9O3ZhciBNPWZ1bmN0aW9uKCl7fSxDYztpYShNKTt2YXIgRGM9e2J1dHRvbjoicHJlc3NlZCIsY2hlY2tib3g6ImNoZWNrZWQiLG1lbnVpdGVtOiJzZWxlY3RlZCIsbWVudWl0ZW1jaGVja2JveDoiY2hlY2tlZCIsbWVudWl0ZW1yYWRpbzoiY2hlY2tlZCIscmFkaW86ImNoZWNrZWQiLHRhYjoic2VsZWN0ZWQiLHRyZWVpdGVtOiJzZWxlY3RlZCJ9O00ucHJvdG90eXBlLk5hPWZ1bmN0aW9uKCl7fTtNLnByb3RvdHlwZS54YT1mdW5jdGlvbihhKXt2YXIgYj1hLkcsYz1iLmgsZD10aGlzLk4oKSxlPVtkXSxmPXRoaXMuTigpO2YhPWQmJmUucHVzaChmKTtkPWEubTtmb3IoZj1bXTtkOyl7dmFyIGg9ZCYtZDtmLnB1c2goRWModGhpcyxoKSk7ZCY9fmh9ZS5wdXNoLmFwcGx5KGUsZik7KGQ9YS5GYSkmJmUucHVzaC5hcHBseShlLGQpO3JldHVybiBjLmNhbGwoYiwiRElWIixlLmpvaW4oIiAiKSxhLmlhKX07Ck0ucHJvdG90eXBlLnlhPWZ1bmN0aW9uKGEsYil7Yi5pZCYmUGIoYSxiLmlkKTtiJiZiLmZpcnN0Q2hpbGQ/RmMoYSxiLmZpcnN0Q2hpbGQubmV4dFNpYmxpbmc/eWEoYi5jaGlsZE5vZGVzKTpiLmZpcnN0Q2hpbGQpOmEuaWE9bnVsbDt2YXIgYz0wLGQ9dGhpcy5OKCksZT10aGlzLk4oKSxmPSExLGg9ITEsaz15YShMKGIpKTtrLmZvckVhY2goZnVuY3Rpb24ocSl7Znx8cSE9ZD9ofHxxIT1lP2N8PUdjKHRoaXMscSk6aD0hMDooZj0hMCxlPT1kJiYoaD0hMCkpO0djKHRoaXMscSk9PTEmJihzYShiKSxkYihiKSYmZWIoYikmJmNiKGIsITEpKX0sdGhpcyk7YS5tPWM7Znx8KGsucHVzaChkKSxlPT1kJiYoaD0hMCkpO2h8fGsucHVzaChlKTsoYT1hLkZhKSYmay5wdXNoLmFwcGx5KGssYSk7ZiYmaCYmIWF8fG1jKGIsay5qb2luKCIgIikpO3JldHVybiBifTsKdmFyIEhjPWZ1bmN0aW9uKGEsYil7aWYoYT1hLk5hKCkpe3AoYiwiVGhlIGVsZW1lbnQgcGFzc2VkIGFzIGEgZmlyc3QgcGFyYW1ldGVyIGNhbm5vdCBiZSBudWxsLiIpO3ZhciBjPWIuZ2V0QXR0cmlidXRlKCJyb2xlIil8fG51bGw7YSE9YyYmWmIoYixhKX19LEljPWZ1bmN0aW9uKGEsYil7dmFyIGM7aWYoYS5EJjMyJiYoYz1hLmkoKSkpe2lmKCFiJiZhLm0mMzIpe3RyeXtjLmJsdXIoKX1jYXRjaChkKXt9YS5tJjMyJiZhLlFhKG51bGwpfShkYihjKSYmZWIoYykpIT1iJiZjYihjLGIpfX0sSmM9ZnVuY3Rpb24oYSxiLGMpe0NjfHwoQ2M9ezE6ImRpc2FibGVkIiw4OiJzZWxlY3RlZCIsMTY6ImNoZWNrZWQiLDY0OiJleHBhbmRlZCJ9KTtwKGEsIlRoZSBlbGVtZW50IHBhc3NlZCBhcyBhIGZpcnN0IHBhcmFtZXRlciBjYW5ub3QgYmUgbnVsbC4iKTtiPUNjW2JdO3ZhciBkPWEuZ2V0QXR0cmlidXRlKCJyb2xlIil8fG51bGw7ZCYmKGQ9RGNbZF18fGIsYj1iPT0iY2hlY2tlZCJ8fGI9PQoic2VsZWN0ZWQiP2Q6Yik7YiYmYWMoYSxiLGMpfTtNLnByb3RvdHlwZS5OPWZ1bmN0aW9uKCl7cmV0dXJuImdvb2ctY29udHJvbCJ9O3ZhciBFYz1mdW5jdGlvbihhLGIpe2EuZ3x8S2MoYSk7cmV0dXJuIGEuZ1tiXX0sR2M9ZnVuY3Rpb24oYSxiKXthLmh8fChhLmd8fEtjKGEpLGEuaD1FYShhLmcpKTthPXBhcnNlSW50KGEuaFtiXSwxMCk7cmV0dXJuIGlzTmFOKGEpPzA6YX0sS2M9ZnVuY3Rpb24oYSl7dmFyIGI9YS5OKCk7dmFyIGM9Yi5yZXBsYWNlKC9ceGEwfFxzL2csIiAiKS5pbmRleE9mKCIgIikhPS0xO3AoIWMsIkNvbnRyb2xSZW5kZXJlciBoYXMgYW4gaW52YWxpZCBjc3MgY2xhc3M6ICciK2IrIiciKTthLmc9ezE6YisiLWRpc2FibGVkIiwyOmIrIi1ob3ZlciIsNDpiKyItYWN0aXZlIiw4OmIrIi1zZWxlY3RlZCIsMTY6YisiLWNoZWNrZWQiLDMyOmIrIi1mb2N1c2VkIiw2NDpiKyItb3BlbiJ9fTt2YXIgTj1mdW5jdGlvbihhLGIsYyl7Ri5jYWxsKHRoaXMsYyk7aWYoIWIpe2ZvcihiPXRoaXMuY29uc3RydWN0b3I7Yjspe3ZhciBkPW5hKGIpO2lmKGQ9dWNbZF0pYnJlYWs7Yj0oYj1PYmplY3QuZ2V0UHJvdG90eXBlT2YoYi5wcm90b3R5cGUpKSYmYi5jb25zdHJ1Y3Rvcn1iPWQ/dHlwZW9mIGQuVj09PSJmdW5jdGlvbiI/ZC5WKCk6bmV3IGQ6bnVsbH10aGlzLnY9Yjt0aGlzLmlhPWEhPT12b2lkIDA/YTpudWxsfTtuKE4sRik7Zz1OLnByb3RvdHlwZTtnLmlhPW51bGw7Zy5tPTA7Zy5EPTM5O2cuUD0wO2cuT2E9ITA7Zy5GYT1udWxsO2cuSGE9ITA7Zy5tYT1mdW5jdGlvbigpe3ZhciBhPXRoaXMudi54YSh0aGlzKTt0aGlzLmc9YTtIYyh0aGlzLnYsYSk7S2IoYSwhMCk7dGhpcy5pc1Zpc2libGUoKXx8KGEuc3R5bGUuZGlzcGxheT0ibm9uZSIsYSYmYWMoYSwiaGlkZGVuIiwhMCkpfTtnLm5hPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaSgpfTtnLndhPWZ1bmN0aW9uKCl7cmV0dXJuITB9OwpnLkVhPWZ1bmN0aW9uKGEpe3RoaXMuZz1hPXRoaXMudi55YSh0aGlzLGEpO0hjKHRoaXMudixhKTtLYihhLCEwKTt0aGlzLk9hPWEuc3R5bGUuZGlzcGxheSE9Im5vbmUifTsKZy5JPWZ1bmN0aW9uKCl7Ti5sLkkuY2FsbCh0aGlzKTt2YXIgYT10aGlzLmc7cChhLCJDYW4gbm90IGNhbGwgZ2V0RWxlbWVudFN0cmljdCBiZWZvcmUgcmVuZGVyaW5nL2RlY29yYXRpbmcuIik7cCh0aGlzKTtwKGEpO3RoaXMuaXNWaXNpYmxlKCl8fGFjKGEsImhpZGRlbiIsIXRoaXMuaXNWaXNpYmxlKCkpO3RoaXMuaXNFbmFibGVkKCl8fEpjKGEsMSwhdGhpcy5pc0VuYWJsZWQoKSk7dGhpcy5EJjgmJkpjKGEsOCwhISh0aGlzLm0mOCkpO3RoaXMuRCYxNiYmSmMoYSwxNiwhISh0aGlzLm0mMTYpKTt0aGlzLkQmNjQmJkpjKGEsNjQsISEodGhpcy5tJjY0KSk7dmFyIGI9dGhpcy52O1ViKHRoaXMpJiYoYT10aGlzLmkoKSxiPWIuTigpKyItcnRsIiwoYT1hLmk/YS5pKCk6YSkmJnBjKGEsW2JdKSk7dGhpcy5pc0VuYWJsZWQoKSYmSWModGhpcyx0aGlzLmlzVmlzaWJsZSgpKTt0aGlzLkQmLTImJih0aGlzLkhhJiZMYyh0aGlzLCEwKSx0aGlzLkQmMzImJihhPXRoaXMuaSgpKSkmJihiPQp0aGlzLlp8fCh0aGlzLlo9bmV3IEopLGdjKGIsYSksQihCKEIoUWIodGhpcyksYiwia2V5Iix0aGlzLmFhKSxhLCJmb2N1cyIsdGhpcy5YYSksYSwiYmx1ciIsdGhpcy5RYSkpfTt2YXIgTGM9ZnVuY3Rpb24oYSxiKXt2YXIgYz1RYihhKSxkPWEuaSgpO2I/KEIoQihCKEIoYyxkLEsuZ2EsYS5zYSksZCxbSy5oYSxLLmZhXSxhLnZhKSxkLCJtb3VzZW92ZXIiLGEudWEpLGQsIm1vdXNlb3V0IixhLnRhKSxhLmNhIT1CYyYmQihjLGQsImNvbnRleHRtZW51IixhLmNhKSk6KEMoQyhDKEMoYyxkLEsuZ2EsYS5zYSksZCxbSy5oYSxLLmZhXSxhLnZhKSxkLCJtb3VzZW92ZXIiLGEudWEpLGQsIm1vdXNlb3V0IixhLnRhKSxhLmNhIT1CYyYmQyhjLGQsImNvbnRleHRtZW51IixhLmNhKSl9O04ucHJvdG90eXBlLlU9ZnVuY3Rpb24oKXtOLmwuVS5jYWxsKHRoaXMpO3RoaXMuWiYma2ModGhpcy5aKTt0aGlzLmlzVmlzaWJsZSgpJiZ0aGlzLmlzRW5hYmxlZCgpJiZJYyh0aGlzLCExKX07Ck4ucHJvdG90eXBlLkM9ZnVuY3Rpb24oKXtOLmwuQy5jYWxsKHRoaXMpO3RoaXMuWiYmKHRoaXMuWi5kaXNwb3NlKCksZGVsZXRlIHRoaXMuWik7ZGVsZXRlIHRoaXMudjt0aGlzLkZhPXRoaXMuaWE9bnVsbH07dmFyIEZjPWZ1bmN0aW9uKGEsYil7YS5pYT1ifTtOLnByb3RvdHlwZS5pc1Zpc2libGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5PYX07Ti5wcm90b3R5cGUuaXNFbmFibGVkPWZ1bmN0aW9uKCl7cmV0dXJuISh0aGlzLm0mMSl9O04ucHJvdG90eXBlLlg9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5oO2ImJnR5cGVvZiBiLmlzRW5hYmxlZD09ImZ1bmN0aW9uIiYmIWIuaXNFbmFibGVkKCl8fCFPKHRoaXMsMSwhYSl8fChhfHwoTWModGhpcywhMSksUCh0aGlzLCExKSksdGhpcy5pc1Zpc2libGUoKSYmSWModGhpcyxhKSxUKHRoaXMsMSwhYSwhMCkpfTt2YXIgUD1mdW5jdGlvbihhLGIpe08oYSwyLGIpJiZUKGEsMixiKX07Ck4ucHJvdG90eXBlLmlzQWN0aXZlPWZ1bmN0aW9uKCl7cmV0dXJuISEodGhpcy5tJjQpfTsKdmFyIE1jPWZ1bmN0aW9uKGEsYil7TyhhLDQsYikmJlQoYSw0LGIpfSxOYz1mdW5jdGlvbihhLGIpe08oYSw4LGIpJiZUKGEsOCxiKX0sT2M9ZnVuY3Rpb24oYSxiKXtPKGEsNjQsYikmJlQoYSw2NCxiKX0sVD1mdW5jdGlvbihhLGIsYyxkKXtpZighZCYmYj09MSlhLlgoIWMpO2Vsc2UgaWYoYS5EJmImJmMhPSEhKGEubSZiKSl7dmFyIGU9YS52O2lmKGQ9YS5pKCkpe2lmKGU9RWMoZSxiKSl7dmFyIGY9YS5pP2EuaSgpOmE7ZiYmKGM/cGM6cmMpKGYsW2VdKX1KYyhkLGIsYyl9YS5tPWM/YS5tfGI6YS5tJn5ifX0sUGM9ZnVuY3Rpb24oYSxiLGMpe2lmKGEucyYmYS5tJmImJiFjKXRocm93IEVycm9yKCJDb21wb25lbnQgYWxyZWFkeSByZW5kZXJlZCIpOyFjJiZhLm0mYiYmVChhLGIsITEpO2EuRD1jP2EuRHxiOmEuRCZ+Yn0sVT1mdW5jdGlvbihhLGIpe3JldHVybiEhKDI1NSZiKSYmISEoYS5EJmIpfSxPPWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4hIShhLkQmYikmJiEhKGEubSZiKSE9CmMmJighKGEuUCZiKXx8RShhLE5iKGIsYykpKSYmIWEuYmF9O04ucHJvdG90eXBlLnVhPWZ1bmN0aW9uKGEpeyFRYyhhLHRoaXMuaSgpKSYmRSh0aGlzLCJlbnRlciIpJiZ0aGlzLmlzRW5hYmxlZCgpJiZVKHRoaXMsMikmJlAodGhpcywhMCl9O04ucHJvdG90eXBlLnRhPWZ1bmN0aW9uKGEpeyFRYyhhLHRoaXMuaSgpKSYmRSh0aGlzLCJsZWF2ZSIpJiYoVSh0aGlzLDQpJiZNYyh0aGlzLCExKSxVKHRoaXMsMikmJlAodGhpcywhMSkpfTtOLnByb3RvdHlwZS5jYT1CYzt2YXIgUWM9ZnVuY3Rpb24oYSxiKXtyZXR1cm4hIWEucmVsYXRlZFRhcmdldCYmYWIoYixhLnJlbGF0ZWRUYXJnZXQpfTsKTi5wcm90b3R5cGUuc2E9ZnVuY3Rpb24oYSl7aWYodGhpcy5pc0VuYWJsZWQoKSYmKFUodGhpcywyKSYmUCh0aGlzLCEwKSwhKGEuaC5idXR0b24hPTB8fHYmJmEuY3RybEtleSkpKXtVKHRoaXMsNCkmJk1jKHRoaXMsITApO3ZhciBiO2lmKGI9dGhpcy52KXt2YXIgYztiPXRoaXMuRCYzMiYmKGM9dGhpcy5pKCkpP2RiKGMpJiZlYihjKTohMX1iJiZ0aGlzLmkoKS5mb2N1cygpfWEuaC5idXR0b24hPTB8fHYmJmEuY3RybEtleXx8YS5qKCl9O04ucHJvdG90eXBlLnZhPWZ1bmN0aW9uKGEpe3RoaXMuaXNFbmFibGVkKCkmJihVKHRoaXMsMikmJlAodGhpcywhMCksdGhpcy5pc0FjdGl2ZSgpJiZSYyh0aGlzLGEpJiZVKHRoaXMsNCkmJk1jKHRoaXMsITEpKX07CnZhciBSYz1mdW5jdGlvbihhLGIpe2lmKFUoYSwxNikpe3ZhciBjPSEoYS5tJjE2KTtPKGEsMTYsYykmJlQoYSwxNixjKX1VKGEsOCkmJk5jKGEsITApO1UoYSw2NCkmJk9jKGEsIShhLm0mNjQpKTtjPW5ldyB5KCJhY3Rpb24iLGEpO2ImJihjLmFsdEtleT1iLmFsdEtleSxjLmN0cmxLZXk9Yi5jdHJsS2V5LGMubWV0YUtleT1iLm1ldGFLZXksYy5zaGlmdEtleT1iLnNoaWZ0S2V5LGMuRz1iLkcsYy50aW1lU3RhbXA9Yi50aW1lU3RhbXApO3JldHVybiBFKGEsYyl9O04ucHJvdG90eXBlLlhhPWZ1bmN0aW9uKCl7VSh0aGlzLDMyKSYmTyh0aGlzLDMyLCEwKSYmVCh0aGlzLDMyLCEwKX07Ti5wcm90b3R5cGUuUWE9ZnVuY3Rpb24oKXtVKHRoaXMsNCkmJk1jKHRoaXMsITEpO1UodGhpcywzMikmJk8odGhpcywzMiwhMSkmJlQodGhpcywzMiwhMSl9OwpOLnByb3RvdHlwZS5hYT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5pc1Zpc2libGUoKSYmdGhpcy5pc0VuYWJsZWQoKSYmYS5nPT0xMyYmUmModGhpcyxhKT8oYS5qKCksYS52KCksITApOiExfTtpZih0eXBlb2YgTiE9PSJmdW5jdGlvbiIpdGhyb3cgRXJyb3IoIkludmFsaWQgY29tcG9uZW50IGNsYXNzICIrTik7aWYodHlwZW9mIE0hPT0iZnVuY3Rpb24iKXRocm93IEVycm9yKCJJbnZhbGlkIHJlbmRlcmVyIGNsYXNzICIrTSk7dmFyIFNjPW5hKE4pO3VjW1NjXT1NO3RjKCJnb29nLWNvbnRyb2wiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBOKG51bGwpfSk7dmFyIFY9ZnVuY3Rpb24oYSxiLGMpe0YuY2FsbCh0aGlzLGMpO3RoaXMuZWE9Ynx8dmMuVigpO3RoaXMuTD1hfHwidmVydGljYWwifTtuKFYsRik7Zz1WLnByb3RvdHlwZTtnLkthPW51bGw7Zy5kYT1udWxsO2cuZWE9bnVsbDtnLkw9bnVsbDtnLlM9ITA7Zy5UPSEwO2cubz0tMTtnLkI9bnVsbDtnLlc9ITE7Zy5PPW51bGw7dmFyIFRjPWZ1bmN0aW9uKGEpe3JldHVybiBhLkthfHxhLmkoKX07Zz1WLnByb3RvdHlwZTtnLm1hPWZ1bmN0aW9uKCl7dGhpcy5nPXRoaXMuRy5oKCJESVYiLHRoaXMuZWEuaih0aGlzKS5qb2luKCIgIikpfTtnLm5hPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaSgpfTtnLndhPWZ1bmN0aW9uKGEpe3JldHVybiBhLnRhZ05hbWU9PSJESVYifTtnLkVhPWZ1bmN0aW9uKGEpe3RoaXMuZz15Yyh0aGlzLmVhLHRoaXMsYSk7YS5zdHlsZS5kaXNwbGF5PT0ibm9uZSImJih0aGlzLlM9ITEpfTsKZy5JPWZ1bmN0aW9uKCl7Vi5sLkkuY2FsbCh0aGlzKTtUYih0aGlzLGZ1bmN0aW9uKGIpe2IucyYmVWModGhpcyxiKX0sdGhpcyk7dmFyIGE9dGhpcy5pKCk7QWModGhpcy5lYSx0aGlzKTtWYyh0aGlzLHRoaXMuUyk7QihCKEIoQihCKEIoQihCKFFiKHRoaXMpLHRoaXMsImVudGVyIix0aGlzLmViKSx0aGlzLCJoaWdobGlnaHQiLHRoaXMuZmIpLHRoaXMsInVuaGlnaGxpZ2h0Iix0aGlzLmxiKSx0aGlzLCJvcGVuIix0aGlzLmdiKSx0aGlzLCJjbG9zZSIsdGhpcy5iYiksYSxLLmdhLHRoaXMuV2EpLGJiKGEpLFtLLmhhLEsuZmFdLHRoaXMuY2IpLGEsW0suZ2EsSy5oYSxLLmZhLCJtb3VzZW92ZXIiLCJtb3VzZW91dCIsImNvbnRleHRtZW51Il0sdGhpcy5hYik7V2ModGhpcyl9O3ZhciBXYz1mdW5jdGlvbihhKXt2YXIgYj1RYihhKSxjPVRjKGEpO0IoQihCKGIsYywiZm9jdXMiLGEuUGEpLGMsImJsdXIiLGEuVWEpLGEuZGF8fChhLmRhPW5ldyBKKFRjKGEpKSksImtleSIsYS5WYSl9OwpnPVYucHJvdG90eXBlO2cuVT1mdW5jdGlvbigpe1hjKHRoaXMsLTEpO3RoaXMuQiYmT2ModGhpcy5CLCExKTt0aGlzLlc9ITE7Vi5sLlUuY2FsbCh0aGlzKX07Zy5DPWZ1bmN0aW9uKCl7Vi5sLkMuY2FsbCh0aGlzKTt0aGlzLmRhJiYodGhpcy5kYS5kaXNwb3NlKCksdGhpcy5kYT1udWxsKTt0aGlzLmVhPXRoaXMuQj10aGlzLk89dGhpcy5LYT1udWxsfTtnLmViPWZ1bmN0aW9uKCl7cmV0dXJuITB9OwpnLmZiPWZ1bmN0aW9uKGEpe3ZhciBiPVZiKHRoaXMsYS50YXJnZXQpO2lmKGI+LTEmJmIhPXRoaXMubyl7dmFyIGM9SSh0aGlzLHRoaXMubyk7YyYmUChjLCExKTt0aGlzLm89YjtjPUkodGhpcyx0aGlzLm8pO3RoaXMuVyYmTWMoYywhMCk7dGhpcy5CJiZjIT10aGlzLkImJihjLkQmNjQ/T2MoYywhMCk6T2ModGhpcy5CLCExKSl9Yj10aGlzLmkoKTtwKGIsIlRoZSBET00gZWxlbWVudCBmb3IgdGhlIGNvbnRhaW5lciBjYW5ub3QgYmUgbnVsbC4iKTthLnRhcmdldC5pKCkhPW51bGwmJmFjKGIsImFjdGl2ZWRlc2NlbmRhbnQiLGEudGFyZ2V0LmkoKS5pZCl9O2cubGI9ZnVuY3Rpb24oYSl7YS50YXJnZXQ9PUkodGhpcyx0aGlzLm8pJiYodGhpcy5vPS0xKTthPXRoaXMuaSgpO3AoYSwiVGhlIERPTSBlbGVtZW50IGZvciB0aGUgY29udGFpbmVyIGNhbm5vdCBiZSBudWxsLiIpO2EucmVtb3ZlQXR0cmlidXRlKCRiKCJhY3RpdmVkZXNjZW5kYW50IikpfTsKZy5nYj1mdW5jdGlvbihhKXsoYT1hLnRhcmdldCkmJmEhPXRoaXMuQiYmYS5oPT10aGlzJiYodGhpcy5CJiZPYyh0aGlzLkIsITEpLHRoaXMuQj1hKX07Zy5iYj1mdW5jdGlvbihhKXthLnRhcmdldD09dGhpcy5CJiYodGhpcy5CPW51bGwpO3ZhciBiPXRoaXMuaSgpLGM9YS50YXJnZXQuaSgpO2ImJmEudGFyZ2V0Lm0mMiYmYyYmKGE9IiIsYyYmKGE9Yy5pZCxwKGEsIlRoZSBhY3RpdmUgZWxlbWVudCBzaG91bGQgaGF2ZSBhbiBpZC4iKSksYWMoYiwiYWN0aXZlZGVzY2VuZGFudCIsYSkpfTtnLldhPWZ1bmN0aW9uKGEpe3RoaXMuVCYmKHRoaXMuVz0hMCk7dmFyIGI9VGModGhpcyk7YiYmZGIoYikmJmViKGIpP2IuZm9jdXMoKTphLmooKX07Zy5jYj1mdW5jdGlvbigpe3RoaXMuVz0hMX07CmcuYWI9ZnVuY3Rpb24oYSl7YTp7dmFyIGI9YS50YXJnZXQ7aWYodGhpcy5PKWZvcih2YXIgYz10aGlzLmkoKTtiJiZiIT09Yzspe3ZhciBkPWIuaWQ7aWYoZCBpbiB0aGlzLk8pe2I9dGhpcy5PW2RdO2JyZWFrIGF9Yj1iLnBhcmVudE5vZGV9Yj1udWxsfWlmKGIpc3dpdGNoKGEudHlwZSl7Y2FzZSBLLmdhOmIuc2EoYSk7YnJlYWs7Y2FzZSBLLmhhOmNhc2UgSy5mYTpiLnZhKGEpO2JyZWFrO2Nhc2UgIm1vdXNlb3ZlciI6Yi51YShhKTticmVhaztjYXNlICJtb3VzZW91dCI6Yi50YShhKTticmVhaztjYXNlICJjb250ZXh0bWVudSI6Yi5jYShhKX19O2cuUGE9ZnVuY3Rpb24oKXt9O2cuVWE9ZnVuY3Rpb24oKXtYYyh0aGlzLC0xKTt0aGlzLlc9ITE7dGhpcy5CJiZPYyh0aGlzLkIsITEpfTsKZy5WYT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5pc0VuYWJsZWQoKSYmdGhpcy5pc1Zpc2libGUoKSYmKEgodGhpcykhPTB8fHRoaXMuS2EpJiZZYyh0aGlzLGEpPyhhLmooKSxhLnYoKSwhMCk6ITF9Owp2YXIgWWM9ZnVuY3Rpb24oYSxiKXt2YXIgYz1JKGEsYS5vKTtpZihjJiZ0eXBlb2YgYy5hYT09ImZ1bmN0aW9uIiYmYy5hYShiKXx8YS5CJiZhLkIhPWMmJnR5cGVvZiBhLkIuYWE9PSJmdW5jdGlvbiImJmEuQi5hYShiKSlyZXR1cm4hMDtpZihiLnNoaWZ0S2V5fHxiLmN0cmxLZXl8fGIubWV0YUtleXx8Yi5hbHRLZXkpcmV0dXJuITE7c3dpdGNoKGIuZyl7Y2FzZSAyNzpUYyhhKS5ibHVyKCk7YnJlYWs7Y2FzZSAzNjpaYyhhKTticmVhaztjYXNlIDM1OiRjKGEpO2JyZWFrO2Nhc2UgMzg6aWYoYS5MPT0idmVydGljYWwiKWFkKGEpO2Vsc2UgcmV0dXJuITE7YnJlYWs7Y2FzZSAzNzppZihhLkw9PSJob3Jpem9udGFsIilVYihhKT9iZChhKTphZChhKTtlbHNlIHJldHVybiExO2JyZWFrO2Nhc2UgNDA6aWYoYS5MPT0idmVydGljYWwiKWJkKGEpO2Vsc2UgcmV0dXJuITE7YnJlYWs7Y2FzZSAzOTppZihhLkw9PSJob3Jpem9udGFsIilVYihhKT9hZChhKTpiZChhKTtlbHNlIHJldHVybiExOwpicmVhaztkZWZhdWx0OnJldHVybiExfXJldHVybiEwfSxVYz1mdW5jdGlvbihhLGIpe3ZhciBjPWIuaSgpO2M9Yy5pZHx8KGMuaWQ9T2IoYikpO2EuT3x8KGEuTz17fSk7YS5PW2NdPWJ9O1YucHJvdG90eXBlLkJhPWZ1bmN0aW9uKGEsYil7dWEoYSxOLCJUaGUgY2hpbGQgb2YgYSBjb250YWluZXIgbXVzdCBiZSBhIGNvbnRyb2wiKTtWLmwuQmEuY2FsbCh0aGlzLGEsYil9O1YucHJvdG90eXBlLkNhPWZ1bmN0aW9uKGEsYixjKXt1YShhLE4pO2EuUHw9MjthLlB8PTY0O1BjKGEsMzIsITEpO2EucyYmMCE9YS5IYSYmTGMoYSwhMSk7YS5IYT0hMTt2YXIgZD1hLmg9PXRoaXM/VmIodGhpcyxhKTotMTtWLmwuQ2EuY2FsbCh0aGlzLGEsYixjKTthLnMmJnRoaXMucyYmVWModGhpcyxhKTthPWQ7YT09LTEmJihhPUgodGhpcykpO2E9PXRoaXMubz90aGlzLm89TWF0aC5taW4oSCh0aGlzKS0xLGIpOmE+dGhpcy5vJiZiPD10aGlzLm8/dGhpcy5vKys6YTx0aGlzLm8mJmI+dGhpcy5vJiZ0aGlzLm8tLX07CnZhciB6Yz1mdW5jdGlvbihhLGIpe2lmKGEuaSgpKXRocm93IEVycm9yKCJDb21wb25lbnQgYWxyZWFkeSByZW5kZXJlZCIpO2EuTD1ifTtWLnByb3RvdHlwZS5pc1Zpc2libGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5TfTt2YXIgVmM9ZnVuY3Rpb24oYSxiKXthLlM9Yjt2YXIgYz1hLmkoKTtjJiYoYy5zdHlsZS5kaXNwbGF5PWI/IiI6Im5vbmUiLHdjKFRjKGEpLGEuVCYmYS5TKSl9O1YucHJvdG90eXBlLmlzRW5hYmxlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLlR9O1YucHJvdG90eXBlLlg9ZnVuY3Rpb24oYSl7dGhpcy5UIT1hJiZFKHRoaXMsYT8iZW5hYmxlIjoiZGlzYWJsZSIpJiYoYT8odGhpcy5UPSEwLFRiKHRoaXMsZnVuY3Rpb24oYil7Yi5UYT9kZWxldGUgYi5UYTpiLlgoITApfSkpOihUYih0aGlzLGZ1bmN0aW9uKGIpe2IuaXNFbmFibGVkKCk/Yi5YKCExKTpiLlRhPSEwfSksdGhpcy5XPXRoaXMuVD0hMSksd2MoVGModGhpcyksYSYmdGhpcy5TKSl9Owp2YXIgWGM9ZnVuY3Rpb24oYSxiKXsoYj1JKGEsYikpP1AoYiwhMCk6YS5vPi0xJiZQKEkoYSxhLm8pLCExKX0sWmM9ZnVuY3Rpb24oYSl7Y2QoYSxmdW5jdGlvbihiLGMpe3JldHVybihiKzEpJWN9LEgoYSktMSl9LCRjPWZ1bmN0aW9uKGEpe2NkKGEsZnVuY3Rpb24oYixjKXtiLS07cmV0dXJuIGI8MD9jLTE6Yn0sMCl9LGJkPWZ1bmN0aW9uKGEpe2NkKGEsZnVuY3Rpb24oYixjKXtyZXR1cm4oYisxKSVjfSxhLm8pfSxhZD1mdW5jdGlvbihhKXtjZChhLGZ1bmN0aW9uKGIsYyl7Yi0tO3JldHVybiBiPDA/Yy0xOmJ9LGEubyl9LGNkPWZ1bmN0aW9uKGEsYixjKXtjPWM8MD9WYihhLGEuQik6Yzt2YXIgZD1IKGEpO2M9Yi5jYWxsKGEsYyxkKTtmb3IodmFyIGU9MDtlPD1kOyl7dmFyIGY9SShhLGMpO2lmKGYmJmYuaXNWaXNpYmxlKCkmJmYuaXNFbmFibGVkKCkmJmYuRCYyKXthLkxhKGMpO2JyZWFrfWUrKztjPWIuY2FsbChhLGMsZCl9fTsKVi5wcm90b3R5cGUuTGE9ZnVuY3Rpb24oYSl7WGModGhpcyxhKX07dmFyIGRkPWZ1bmN0aW9uKCl7fTtuKGRkLE0pO2lhKGRkKTtnPWRkLnByb3RvdHlwZTtnLk49ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy10YWIifTtnLk5hPWZ1bmN0aW9uKCl7cmV0dXJuInRhYiJ9O2cueGE9ZnVuY3Rpb24oYSl7dmFyIGI9ZGQubC54YS5jYWxsKHRoaXMsYSk7KGE9YS5HYSgpKSYmdGhpcy5NYShiLGEpO3JldHVybiBifTtnLnlhPWZ1bmN0aW9uKGEsYil7Yj1kZC5sLnlhLmNhbGwodGhpcyxhLGIpO3ZhciBjPXRoaXMuR2EoYik7YyYmKGEuUmE9Yyk7YS5tJjgmJihjPWEuaCkmJnR5cGVvZiBjLko9PT0iZnVuY3Rpb24iJiYoVChhLDgsITEpLGMuSihhKSk7cmV0dXJuIGJ9O2cuR2E9ZnVuY3Rpb24oYSl7cmV0dXJuIGEudGl0bGV8fCIifTtnLk1hPWZ1bmN0aW9uKGEsYil7YSYmKGEudGl0bGU9Ynx8IiIpfTt2YXIgZWQ9ZnVuY3Rpb24oYSxiLGMpe04uY2FsbCh0aGlzLGEsYnx8ZGQuVigpLGMpO1BjKHRoaXMsOCwhMCk7dGhpcy5QfD05fTtuKGVkLE4pO2VkLnByb3RvdHlwZS5HYT1mdW5jdGlvbigpe3JldHVybiB0aGlzLlJhfTtlZC5wcm90b3R5cGUuTWE9ZnVuY3Rpb24oYSl7dGhpcy52Lk1hKHRoaXMuaSgpLGEpO3RoaXMuUmE9YX07dGMoImdvb2ctdGFiIixmdW5jdGlvbigpe3JldHVybiBuZXcgZWQobnVsbCl9KTt2YXIgVz1mdW5jdGlvbigpe3RoaXMuQT0idGFibGlzdCJ9O24oVyx2Yyk7aWEoVyk7Vy5wcm90b3R5cGUuZz1mdW5jdGlvbigpe3JldHVybiJnb29nLXRhYi1iYXIifTtXLnByb3RvdHlwZS51PWZ1bmN0aW9uKGEsYixjKXt0aGlzLnZ8fCh0aGlzLmh8fGZkKHRoaXMpLHRoaXMudj1FYSh0aGlzLmgpKTt2YXIgZD10aGlzLnZbYl07ZD8oemMoYSxnZChkKSksYS52PWQpOlcubC51LmNhbGwodGhpcyxhLGIsYyl9O1cucHJvdG90eXBlLmo9ZnVuY3Rpb24oYSl7dmFyIGI9Vy5sLmouY2FsbCh0aGlzLGEpO3RoaXMuaHx8ZmQodGhpcyk7Yi5wdXNoKHRoaXMuaFthLnZdKTtyZXR1cm4gYn07dmFyIGZkPWZ1bmN0aW9uKGEpe3ZhciBiPWEuZygpO2EuaD17dG9wOmIrIi10b3AiLGJvdHRvbTpiKyItYm90dG9tIixzdGFydDpiKyItc3RhcnQiLGVuZDpiKyItZW5kIn19O3ZhciBYPWZ1bmN0aW9uKGEsYixjKXthPWF8fCJ0b3AiO3pjKHRoaXMsZ2QoYSkpO3RoaXMudj1hO1YuY2FsbCh0aGlzLHRoaXMuTCxifHxXLlYoKSxjKTtoZCh0aGlzKX07bihYLFYpO2c9WC5wcm90b3R5cGU7Zy5IPW51bGw7Zy5JPWZ1bmN0aW9uKCl7WC5sLkkuY2FsbCh0aGlzKTtoZCh0aGlzKX07Zy5DPWZ1bmN0aW9uKCl7WC5sLkMuY2FsbCh0aGlzKTt0aGlzLkg9bnVsbH07Zy5MYT1mdW5jdGlvbihhKXtYLmwuTGEuY2FsbCh0aGlzLGEpO3RoaXMuSihJKHRoaXMsYSkpfTtnLko9ZnVuY3Rpb24oYSl7YT9OYyhhLCEwKTp0aGlzLkgmJk5jKHRoaXMuSCwhMSl9Owp2YXIgaWQ9ZnVuY3Rpb24oYSxiKXtpZihiJiZiPT1hLkgpe2Zvcih2YXIgYz1WYihhLGIpLGQ9Yy0xO2I9SShhLGQpO2QtLSl7dmFyIGU9YjtpZihlLmlzVmlzaWJsZSgpJiZlLmlzRW5hYmxlZCgpKXthLkooYik7cmV0dXJufX1mb3IoYys9MTtiPUkoYSxjKTtjKyspaWYoZD1iLGQuaXNWaXNpYmxlKCkmJmQuaXNFbmFibGVkKCkpe2EuSihiKTtyZXR1cm59YS5KKG51bGwpfX07Zz1YLnByb3RvdHlwZTtnLmpiPWZ1bmN0aW9uKGEpe3RoaXMuSCYmdGhpcy5IIT1hLnRhcmdldCYmTmModGhpcy5ILCExKTt0aGlzLkg9YS50YXJnZXR9O2cua2I9ZnVuY3Rpb24oYSl7YS50YXJnZXQ9PXRoaXMuSCYmKHRoaXMuSD1udWxsKX07Zy5oYj1mdW5jdGlvbihhKXtpZCh0aGlzLGEudGFyZ2V0KX07Zy5pYj1mdW5jdGlvbihhKXtpZCh0aGlzLGEudGFyZ2V0KX07Zy5QYT1mdW5jdGlvbigpe0kodGhpcyx0aGlzLm8pfHxYYyh0aGlzLFZiKHRoaXMsdGhpcy5IfHxJKHRoaXMsMCkpKX07CnZhciBoZD1mdW5jdGlvbihhKXtCKEIoQihCKFFiKGEpLGEsInNlbGVjdCIsYS5qYiksYSwidW5zZWxlY3QiLGEua2IpLGEsImRpc2FibGUiLGEuaGIpLGEsImhpZGUiLGEuaWIpfSxnZD1mdW5jdGlvbihhKXtyZXR1cm4gYT09InN0YXJ0Inx8YT09ImVuZCI/InZlcnRpY2FsIjoiaG9yaXpvbnRhbCJ9O3RjKCJnb29nLXRhYi1iYXIiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBYfSk7ZnVuY3Rpb24gamQoYSl7dmFyIGI9e3RvcDoiYm90dG9tIixib3R0b206InRvcCIsc3RhcnQ6InJpZ2h0IixlbmQ6ImxlZnQifVthLmxvY2F0aW9uXSxjPWEuZWxlbWVudElkLGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTtkLnRleHRDb250ZW50PSJcbiAgICBmaWVsZHNldCB7XG4gICAgICBwYWRkaW5nOiAxMHB4O1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgIzM2OTtcbiAgICB9XG5cbiAgICAjIitjKyIgLmdvb2ctdGFiLWNvbnRlbnQge1xuICAgICAgbWluLWhlaWdodDogM2VtO1xuICAgICAgbWFyZ2luOiAwO1xuICAgICAgYm9yZGVyOiAiK2EuYm9yZGVyKyIgc29saWQgIithLmJvcmRlckNvbG9yKyI7XG4gICAgICBib3JkZXItdG9wOiAwO1xuICAgICAgaGVpZ2h0OiAiK2EuY29udGVudEhlaWdodCsiO1xuICAgICAgcGFkZGluZzogNHB4IDhweDtcbiAgICAgIG1hcmdpbi1yaWdodDogNHB4O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgIG92ZXJmbG93OiBhdXRvO1xuICAgIH1cblxuICAgICMiKwpjKyIgLmdvb2ctdGFiLWJhci0iK2EubG9jYXRpb24rIiAuZ29vZy10YWItc2VsZWN0ZWQge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICIrYS5ib3JkZXJDb2xvcisiO1xuICAgICAgYm9yZGVyLSIrYisiOiAwcHg7XG4gICAgfVxuXG4gICAgIyIrYysiIC5nb29nLXRhYi1iYXItIithLmxvY2F0aW9uKyIge1xuICAgICAgcGFkZGluZy0iK2EubG9jYXRpb24rIjogNXB4ICFpbXBvcnRhbnQ7XG4gICAgICBib3JkZXItIitiKyI6IDFweCBzb2xpZCAiK2EuYm9yZGVyQ29sb3IrIiAhaW1wb3J0YW50O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICB9XG5cbiAgICAjIitjKyIgLmdvb2ctdGFiLWJhciB7XG4gICAgICAgbWFyZ2luOiAwO1xuICAgICAgIGJvcmRlcjogMDtcbiAgICAgICBwYWRkaW5nOiAwO1xuICAgICAgIGxpc3Qtc3R5bGU6IG5vbmU7XG4gICAgICAgY3Vyc29yOiBkZWZhdWx0O1xuICAgICAgIG91dGxpbmU6IG5vbmU7XG4gICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgICBtYXJnaW4tcmlnaHQ6IDRweDtcbiAgICAgIH1cblxuICAgICAjIisKYysiIC5nb29nLXRhYiB7XG4gICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgIHBhZGRpbmc6IDRweCA4cHg7XG4gICAgICAgY29sb3I6IHZhcigtLWNvbGFiLXByaW1hcnktdGV4dC1jb2xvcik7XG4gICAgICAgdGV4dC1kZWNvcmF0aW9uOiBpbml0aWFsO1xuICAgICAgIGN1cnNvcjogZGVmYXVsdDtcbiAgICAgIH1cblxuICAgICAgIyIrYysiIC5nb29nLXRhYi1ob3ZlciB7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWNvbGFiLWhpZ2hsaWdodGVkLXN1cmZhY2UtY29sb3IpO1xuICAgICAgfVxuICAgICAgIjtyZXR1cm4gZH0KdmFyIGtkPWZ1bmN0aW9uKGEpe3ZhciBiPWEuZWxlbWVudElkLGM9YS50YWJOYW1lcyxkPWEuc2VsZWN0ZWRJbmRleDsiY29udGVudEJvcmRlciJpbiBhfHwoYS5jb250ZW50Qm9yZGVyPSIwcHgiKTsiY29udGVudEhlaWdodCJpbiBhfHwoYS5jb250ZW50SGVpZ2h0PSJpbml0aWFsIik7ImJvcmRlckNvbG9yImluIGF8fChhLmJvcmRlckNvbG9yPSJ2YXIoLS1jb2xhYi1ib3JkZXItY29sb3IpIik7YS5sb2NhdGlvbnx8KGEubG9jYXRpb249InRvcCIpO3ZhciBlPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiMiK2IpLGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zi5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYi1iYXIiKTt2YXIgaD1hLmxvY2F0aW9uO2YuY2xhc3NMaXN0LmFkZCgiZ29vZy10YWItYmFyLSIraCk7Zm9yKHZhciBrPVtdLHE9ZmEoYyksRz1xLm5leHQoKTshRy5kb25lO0c9cS5uZXh0KCkpe0c9Ry52YWx1ZTt2YXIgeD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKeC5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYiIpO3gudGV4dENvbnRlbnQ9RztmLmFwcGVuZENoaWxkKHgpO2sucHVzaCh4KX1oIT0iYm90dG9tIiYmZS5hcHBlbmRDaGlsZChmKTtxPW51bGw7aWYoaD09InRvcCJ8fGg9PSJib3R0b20iKXE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikscS5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYi1iYXItY2xlYXIiKTtoPT0idG9wIiYmcSYmZS5hcHBlbmRDaGlsZChxKTtHPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO0cuY2xhc3NMaXN0LmFkZCgiZ29vZy10YWItY29udGVudCIpO3ZhciBoYT1bXTtjPWZhKGMpO2Zvcih4PWMubmV4dCgpOyF4LmRvbmU7eD1jLm5leHQoKSl4PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHguaWQ9ZS5pZCsiX2NvbnRlbnRfIitoYS5sZW5ndGgseC5zdHlsZS5kaXNwbGF5PSJub25lIixHLmFwcGVuZENoaWxkKHgpLGhhLnB1c2goeCk7ZS5hcHBlbmRDaGlsZChHKTtoPT0iYm90dG9tIiYmKHEmJgplLmFwcGVuZENoaWxkKHEpLGUuYXBwZW5kQ2hpbGQoZikpO3ZhciBRPW5ldyBYKGgpO1NiKFEsZik7dmFyIFI9LTE7d2IoUSwic2VsZWN0IixmdW5jdGlvbihTKXtTPWsuaW5kZXhPZihTLnRhcmdldC5pKCkpO1MhPVImJihSPj0wJiZSPGhhLmxlbmd0aCYmKGhhW1JdLnN0eWxlLmRpc3BsYXk9Im5vbmUiLFI9LTEpLFM+PTAmJlM8aGEubGVuZ3RoJiYoUj1TLGhhW1JdLnN0eWxlLmRpc3BsYXk9ImlubGluZSIsd2luZG93LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCJyZXNpemUiKSksZ29vZ2xlLmNvbGFiLm91dHB1dC5yZXNpemVJZnJhbWVUb0NvbnRlbnQoKSksUS5KKEkoUSxSKSkpfSk7US5KKEkoUSxkKSk7d2luZG93W2JdPXtzZXRTZWxlY3RlZFRhYkluZGV4OmZ1bmN0aW9uKFMpe1EuSihJKFEsUykpfX07ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChqZChhKSl9LGxkPVsiY29sYWJfbGliIiwiY3JlYXRlVGFiQmFyIl0sWT1sOwpsZFswXWluIFl8fHR5cGVvZiBZLmV4ZWNTY3JpcHQ9PSJ1bmRlZmluZWQifHxZLmV4ZWNTY3JpcHQoInZhciAiK2xkWzBdKTtmb3IodmFyIFo7bGQubGVuZ3RoJiYoWj1sZC5zaGlmdCgpKTspbGQubGVuZ3RofHxrZD09PXZvaWQgMD9ZW1pdJiZZW1pdIT09T2JqZWN0LnByb3RvdHlwZVtaXT9ZPVlbWl06WT1ZW1pdPXt9OllbWl09a2Q7fSkuY2FsbCh0aGlzKTsKLy8gY2xhbmctZm9ybWF0IG9uCg==", + "ok": true, + "headers": [ + [ + "content-length", + "41785" + ], + [ + "content-type", + "application/javascript" + ] + ], + "status": 200, + "status_text": "" + } + }, + "base_uri": "https://localhost:8080/", + "height": 260 + }, + "outputId": "59e05c72-7e72-4370-dfaa-a71a07f13bfa" + }, + "source": [ + "%%logica EmployeesOfRole\n", + "\n", + "Employee(name: \"Alice\", role: \"Product Manager\", office: \"SEA\");\n", + "Employee(name: \"Bob\", role: \"Engineer\", office: \"SEA\");\n", + "Employee(name: \"Caroline\", role: \"Engineer\", office: \"LAX\");\n", + "Employee(name: \"David\", role: \"Data Scientist\", office: \"LAX\");\n", + "Employee(name: \"Eve\", role: \"Data Scientist\", office: \"SEA\");\n", + "\n", + "EmployeesOfRole(role) List= name :- Employee(name:, role:);" + ], + "execution_count": 26, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"1e398550-d22d-11ef-a7c0-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id51\", \"tabNames\": [\"EmployeesOfRole\", \"(Log)\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_74a56fa284" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"1e39f04e-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id51\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_668ba79ad3" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"1e3bc248-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_10da334de9" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"1e3c235a-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id51_content_1\");\n", + "//# sourceURL=js_aaf77f7975" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"1e3c88e0-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"1e3c235a-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_6b90b55789" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"1e3ce65a-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id51\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_a1c372a89e" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"1e404bc4-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"1e3bc248-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_b00590031f" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"1e424ec4-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_941d225a16" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"1e42d74a-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id51_content_0\");\n", + "//# sourceURL=js_59f9946216" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"1e432b00-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"1e42d74a-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_8015cfcb3d" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"1e43786c-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id51\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_58dc5cac11" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"1e454570-d22d-11ef-a7c0-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id52\", \"tabNames\": [\"SQL\", \"Result\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_69a1121ee3" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"1e458774-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id52\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_7089490824" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"1e46bee6-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_7684067080" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"1e4705ae-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id52_content_0\");\n", + "//# sourceURL=js_efe18b76d8" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"1e475536-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"1e4705ae-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_ee96e91e70" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"1e47ce9e-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id52\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_ed002a15dc" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The following query is stored at \u001b[1mEmployeesOfRole_sql\u001b[0m variable.\n", + "-- Initializing DuckDB environment.\n", + "create schema if not exists logica_home;\n", + "-- Empty record, has to have a field by DuckDB syntax.\n", + "drop type if exists logicarecord893574736 cascade; create type logicarecord893574736 as struct(nirvana numeric);\n", + "create sequence if not exists eternal_logical_sequence;\n", + "\n", + "\n", + "-- Logica type: logicarecord481217614\n", + "drop type if exists logicarecord481217614 cascade; create type logicarecord481217614 as struct(r logicarecord893574736);\n", + "\n", + "-- Logica type: logicarecord383307722\n", + "drop type if exists logicarecord383307722 cascade; create type logicarecord383307722 as struct(a timestamp);\n", + "WITH t_0_Employee AS (SELECT * FROM (\n", + " \n", + " SELECT\n", + " 'Alice' AS name,\n", + " 'Product Manager' AS role,\n", + " 'SEA' AS office\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " 'Bob' AS name,\n", + " 'Engineer' AS role,\n", + " 'SEA' AS office\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " 'Caroline' AS name,\n", + " 'Engineer' AS role,\n", + " 'LAX' AS office\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " 'David' AS name,\n", + " 'Data Scientist' AS role,\n", + " 'LAX' AS office\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " 'Eve' AS name,\n", + " 'Data Scientist' AS role,\n", + " 'SEA' AS office\n", + " \n", + ") AS UNUSED_TABLE_NAME )\n", + "SELECT\n", + " Employee.role AS col0,\n", + " ARRAY_AGG(Employee.name) AS logica_value\n", + "FROM\n", + " t_0_Employee AS Employee\n", + "GROUP BY Employee.role;\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"1e49a23c-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"1e46bee6-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_7e7829ac11" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"1e4c41d6-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_3f8f219516" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"1e4cdf7e-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id52_content_1\");\n", + "//# sourceURL=js_8b33e6652e" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"1e4d38fc-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"1e4cdf7e-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_393c7e7707" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"1e4d88de-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id52\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_d127f76c9c" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The following table is stored at \u001b[1mEmployeesOfRole\u001b[0m variable.\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
col0logica_value
0Engineer[Bob, Caroline]
1Product Manager[Alice]
2Data Scientist[David, Eve]
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"1e4ed694-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"1e4c41d6-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_9513b4d011" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"1e501dba-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"1e424ec4-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_f7de4c7e08" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"1e51b83c-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_bb314f0f1e" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"1e520940-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id51_content_1\");\n", + "//# sourceURL=js_939ff78792" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"1e5251de-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"1e520940-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_cb88c525d2" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"1e529612-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id51\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_3c31ef679f" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "image/svg+xml": "\n\n\n\n\n\nConcertina\n\n\n\nEmployeesOfRole\n\nEmployeesOfRole\n\n\n\n", + "text/plain": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Running predicate: EmployeesOfRole (9 ms)\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"1e6e5dfc-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"1e51b83c-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_81f5ad61ac" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"1e707df8-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_fc0f3706a9" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"1e70cdf8-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id51_content_0\");\n", + "//# sourceURL=js_e7cff4d2a6" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"1e711b50-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"1e70cdf8-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_763923af3c" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"1e71666e-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id51\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_87e29956d7" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"1e72964c-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_6712da6060" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"1e72e03e-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id52_content_1\");\n", + "//# sourceURL=js_329904dc3d" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"1e732828-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"1e72e03e-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_3d9dda7795" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"1e73715c-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id52\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_17000e3d84" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"1e757dee-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"1e72964c-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_e29867e371" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + " \n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"1e779250-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"1e707df8-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_4927706016" + ] + }, + "metadata": {} + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "M6feYNXXN-vk" + }, + "source": [ + "Here are some more examples of functions." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "GnnU6ZRhbhA0", + "colab": { + "resources": { + "http://localhost:8080/nbextensions/google.colab/tabbar.css": { + "data": "Lmdvb2ctdGFie3Bvc2l0aW9uOnJlbGF0aXZlO3BhZGRpbmc6NHB4IDhweDtjb2xvcjojMDBjO3RleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7Y3Vyc29yOmRlZmF1bHR9Lmdvb2ctdGFiLWJhci10b3AgLmdvb2ctdGFie21hcmdpbjoxcHggNHB4IDAgMDtib3JkZXItYm90dG9tOjA7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLXRvcDphZnRlciwuZ29vZy10YWItYmFyLWJvdHRvbTphZnRlcntjb250ZW50OiIgIjtkaXNwbGF5OmJsb2NrO2hlaWdodDowO2NsZWFyOmJvdGg7dmlzaWJpbGl0eTpoaWRkZW59Lmdvb2ctdGFiLWJhci1ib3R0b20gLmdvb2ctdGFie21hcmdpbjowIDRweCAxcHggMDtib3JkZXItdG9wOjA7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLXN0YXJ0IC5nb29nLXRhYnttYXJnaW46MCAwIDRweCAxcHg7Ym9yZGVyLXJpZ2h0OjB9Lmdvb2ctdGFiLWJhci1lbmQgLmdvb2ctdGFie21hcmdpbjowIDFweCA0cHggMDtib3JkZXItbGVmdDowfS5nb29nLXRhYi1ob3ZlcntiYWNrZ3JvdW5kOiNlZWV9Lmdvb2ctdGFiLWRpc2FibGVke2NvbG9yOiM2NjZ9Lmdvb2ctdGFiLXNlbGVjdGVke2NvbG9yOiMwMDA7YmFja2dyb3VuZDojZmZmO3RleHQtZGVjb3JhdGlvbjpub25lO2ZvbnQtd2VpZ2h0OmJvbGQ7Ym9yZGVyOjFweCBzb2xpZCAjNmI5MGRhfS5nb29nLXRhYi1iYXItdG9we3BhZGRpbmctdG9wOjVweCFpbXBvcnRhbnQ7cGFkZGluZy1sZWZ0OjVweCFpbXBvcnRhbnQ7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgIzZiOTBkYSFpbXBvcnRhbnR9Lmdvb2ctdGFiLWJhci10b3AgLmdvb2ctdGFiLXNlbGVjdGVke3RvcDoxcHg7bWFyZ2luLXRvcDowO3BhZGRpbmctYm90dG9tOjVweH0uZ29vZy10YWItYmFyLWJvdHRvbSAuZ29vZy10YWItc2VsZWN0ZWR7dG9wOi0xcHg7bWFyZ2luLWJvdHRvbTowO3BhZGRpbmctdG9wOjVweH0uZ29vZy10YWItYmFyLXN0YXJ0IC5nb29nLXRhYi1zZWxlY3RlZHtsZWZ0OjFweDttYXJnaW4tbGVmdDowO3BhZGRpbmctcmlnaHQ6OXB4fS5nb29nLXRhYi1iYXItZW5kIC5nb29nLXRhYi1zZWxlY3RlZHtsZWZ0Oi0xcHg7bWFyZ2luLXJpZ2h0OjA7cGFkZGluZy1sZWZ0OjlweH0uZ29vZy10YWItYmFye21hcmdpbjowO2JvcmRlcjowO3BhZGRpbmc6MDtsaXN0LXN0eWxlOm5vbmU7Y3Vyc29yOmRlZmF1bHQ7b3V0bGluZTpub25lO2JhY2tncm91bmQ6I2ViZWZmOX0uZ29vZy10YWItYmFyLWNsZWFye2NsZWFyOmJvdGg7aGVpZ2h0OjA7b3ZlcmZsb3c6aGlkZGVufS5nb29nLXRhYi1iYXItc3RhcnR7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLWVuZHtmbG9hdDpyaWdodH0qIGh0bWwgLmdvb2ctdGFiLWJhci1zdGFydHttYXJnaW4tcmlnaHQ6LTNweH0qIGh0bWwgLmdvb2ctdGFiLWJhci1lbmR7bWFyZ2luLWxlZnQ6LTNweH1zZW50aW5lbHt9", + "ok": true, + "headers": [ + [ + "content-length", + "1404" + ], + [ + "content-type", + "text/css" + ] + ], + "status": 200, + "status_text": "" + }, + "http://localhost:8080/nbextensions/google.colab/tabbar_main.min.js": { + "data": "Ly8gY2xhbmctZm9ybWF0IG9mZgooZnVuY3Rpb24oKXt2YXIgZyxhYT1mdW5jdGlvbihhKXt2YXIgYj0wO3JldHVybiBmdW5jdGlvbigpe3JldHVybiBiPGEubGVuZ3RoP3tkb25lOiExLHZhbHVlOmFbYisrXX06e2RvbmU6ITB9fX0sYmE9dHlwZW9mIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzPT0iZnVuY3Rpb24iP09iamVjdC5kZWZpbmVQcm9wZXJ0eTpmdW5jdGlvbihhLGIsYyl7aWYoYT09QXJyYXkucHJvdG90eXBlfHxhPT1PYmplY3QucHJvdG90eXBlKXJldHVybiBhO2FbYl09Yy52YWx1ZTtyZXR1cm4gYX0sY2E9ZnVuY3Rpb24oYSl7YT1bIm9iamVjdCI9PXR5cGVvZiBnbG9iYWxUaGlzJiZnbG9iYWxUaGlzLGEsIm9iamVjdCI9PXR5cGVvZiB3aW5kb3cmJndpbmRvdywib2JqZWN0Ij09dHlwZW9mIHNlbGYmJnNlbGYsIm9iamVjdCI9PXR5cGVvZiBnbG9iYWwmJmdsb2JhbF07Zm9yKHZhciBiPTA7YjxhLmxlbmd0aDsrK2Ipe3ZhciBjPWFbYl07aWYoYyYmYy5NYXRoPT1NYXRoKXJldHVybiBjfXRocm93IEVycm9yKCJDYW5ub3QgZmluZCBnbG9iYWwgb2JqZWN0Iik7Cn0sZGE9Y2EodGhpcyksZWE9ZnVuY3Rpb24oYSxiKXtpZihiKWE6e3ZhciBjPWRhO2E9YS5zcGxpdCgiLiIpO2Zvcih2YXIgZD0wO2Q8YS5sZW5ndGgtMTtkKyspe3ZhciBlPWFbZF07aWYoIShlIGluIGMpKWJyZWFrIGE7Yz1jW2VdfWE9YVthLmxlbmd0aC0xXTtkPWNbYV07Yj1iKGQpO2IhPWQmJmIhPW51bGwmJmJhKGMsYSx7Y29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOmJ9KX19OwplYSgiU3ltYm9sIixmdW5jdGlvbihhKXtpZihhKXJldHVybiBhO3ZhciBiPWZ1bmN0aW9uKGYsaCl7dGhpcy5nPWY7YmEodGhpcywiZGVzY3JpcHRpb24iLHtjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6aH0pfTtiLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmd9O3ZhciBjPSJqc2NvbXBfc3ltYm9sXyIrKE1hdGgucmFuZG9tKCkqMUU5Pj4+MCkrIl8iLGQ9MCxlPWZ1bmN0aW9uKGYpe2lmKHRoaXMgaW5zdGFuY2VvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoIlN5bWJvbCBpcyBub3QgYSBjb25zdHJ1Y3RvciIpO3JldHVybiBuZXcgYihjKyhmfHwiIikrIl8iK2QrKyxmKX07cmV0dXJuIGV9KTsKdmFyIGZhPWZ1bmN0aW9uKGEpe3ZhciBiPXR5cGVvZiBTeW1ib2whPSJ1bmRlZmluZWQiJiZTeW1ib2wuaXRlcmF0b3ImJmFbU3ltYm9sLml0ZXJhdG9yXTtpZihiKXJldHVybiBiLmNhbGwoYSk7aWYodHlwZW9mIGEubGVuZ3RoPT0ibnVtYmVyIilyZXR1cm57bmV4dDphYShhKX07dGhyb3cgRXJyb3IoU3RyaW5nKGEpKyIgaXMgbm90IGFuIGl0ZXJhYmxlIG9yIEFycmF5TGlrZSIpO307ZWEoIlN5bWJvbC5kaXNwb3NlIixmdW5jdGlvbihhKXtyZXR1cm4gYT9hOlN5bWJvbCgiU3ltYm9sLmRpc3Bvc2UiKX0pOy8qCgogQ29weXJpZ2h0IFRoZSBDbG9zdXJlIExpYnJhcnkgQXV0aG9ycy4KIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wCiovCnZhciBsPXRoaXN8fHNlbGYsaWE9ZnVuY3Rpb24oYSl7YS5JYT12b2lkIDA7YS5WPWZ1bmN0aW9uKCl7cmV0dXJuIGEuSWE/YS5JYTphLklhPW5ldyBhfX0samE9ZnVuY3Rpb24oYSl7dmFyIGI9dHlwZW9mIGE7cmV0dXJuIGIhPSJvYmplY3QiP2I6YT9BcnJheS5pc0FycmF5KGEpPyJhcnJheSI6YjoibnVsbCJ9LGthPWZ1bmN0aW9uKGEpe3ZhciBiPWphKGEpO3JldHVybiBiPT0iYXJyYXkifHxiPT0ib2JqZWN0IiYmdHlwZW9mIGEubGVuZ3RoPT0ibnVtYmVyIn0sbT1mdW5jdGlvbihhKXt2YXIgYj10eXBlb2YgYTtyZXR1cm4gYj09Im9iamVjdCImJmEhPW51bGx8fGI9PSJmdW5jdGlvbiJ9LG5hPWZ1bmN0aW9uKGEpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYSxsYSkmJmFbbGFdfHwoYVtsYV09KyttYSl9LGxhPSJjbG9zdXJlX3VpZF8iKyhNYXRoLnJhbmRvbSgpKjFFOT4+PjApLG1hPTAsbj1mdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoKXt9Yy5wcm90b3R5cGU9CmIucHJvdG90eXBlO2EubD1iLnByb3RvdHlwZTthLnByb3RvdHlwZT1uZXcgYzthLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1hO2EucWQ9ZnVuY3Rpb24oZCxlLGYpe2Zvcih2YXIgaD1BcnJheShhcmd1bWVudHMubGVuZ3RoLTIpLGs9MjtrPGFyZ3VtZW50cy5sZW5ndGg7aysrKWhbay0yXT1hcmd1bWVudHNba107cmV0dXJuIGIucHJvdG90eXBlW2VdLmFwcGx5KGQsaCl9fTtmdW5jdGlvbiBvYShhLGIpe2lmKEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKUVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsb2EpO2Vsc2V7dmFyIGM9RXJyb3IoKS5zdGFjaztjJiYodGhpcy5zdGFjaz1jKX1hJiYodGhpcy5tZXNzYWdlPVN0cmluZyhhKSk7YiE9PXZvaWQgMCYmKHRoaXMuY2F1c2U9Yil9bihvYSxFcnJvcik7b2EucHJvdG90eXBlLm5hbWU9IkN1c3RvbUVycm9yIjt2YXIgcGE7ZnVuY3Rpb24gcWEoYSxiKXthPWEuc3BsaXQoIiVzIik7Zm9yKHZhciBjPSIiLGQ9YS5sZW5ndGgtMSxlPTA7ZTxkO2UrKyljKz1hW2VdKyhlPGIubGVuZ3RoP2JbZV06IiVzIik7b2EuY2FsbCh0aGlzLGMrYVtkXSl9bihxYSxvYSk7cWEucHJvdG90eXBlLm5hbWU9IkFzc2VydGlvbkVycm9yIjtmdW5jdGlvbiByYShhLGIsYyxkKXt2YXIgZT0iQXNzZXJ0aW9uIGZhaWxlZCI7aWYoYyl7ZSs9IjogIitjO3ZhciBmPWR9ZWxzZSBhJiYoZSs9IjogIithLGY9Yik7dGhyb3cgbmV3IHFhKCIiK2UsZnx8W10pO30KdmFyIHA9ZnVuY3Rpb24oYSxiLGMpe2F8fHJhKCIiLG51bGwsYixBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMikpO3JldHVybiBhfSxzYT1mdW5jdGlvbihhLGIsYyl7bShhKSYmYS5ub2RlVHlwZT09MXx8cmEoIkV4cGVjdGVkIEVsZW1lbnQgYnV0IGdvdCAlczogJXMuIixbamEoYSksYV0sYixBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMikpfSx1YT1mdW5jdGlvbihhLGIsYyxkKXthIGluc3RhbmNlb2YgYnx8cmEoIkV4cGVjdGVkIGluc3RhbmNlb2YgJXMgYnV0IGdvdCAlcy4iLFt0YShiKSx0YShhKV0sYyxBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMykpfTsKZnVuY3Rpb24gdGEoYSl7cmV0dXJuIGEgaW5zdGFuY2VvZiBGdW5jdGlvbj9hLmRpc3BsYXlOYW1lfHxhLm5hbWV8fCJ1bmtub3duIHR5cGUgbmFtZSI6YSBpbnN0YW5jZW9mIE9iamVjdD9hLmNvbnN0cnVjdG9yLmRpc3BsYXlOYW1lfHxhLmNvbnN0cnVjdG9yLm5hbWV8fE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhKTphPT09bnVsbD8ibnVsbCI6dHlwZW9mIGF9O3ZhciB2YT1BcnJheS5wcm90b3R5cGUuaW5kZXhPZj9mdW5jdGlvbihhLGIpe3AoYS5sZW5ndGghPW51bGwpO3JldHVybiBBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKGEsYix2b2lkIDApfTpmdW5jdGlvbihhLGIpe2lmKHR5cGVvZiBhPT09InN0cmluZyIpcmV0dXJuIHR5cGVvZiBiIT09InN0cmluZyJ8fGIubGVuZ3RoIT0xPy0xOmEuaW5kZXhPZihiLDApO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWlmKGMgaW4gYSYmYVtjXT09PWIpcmV0dXJuIGM7cmV0dXJuLTF9LHdhPUFycmF5LnByb3RvdHlwZS5mb3JFYWNoP2Z1bmN0aW9uKGEsYil7cChhLmxlbmd0aCE9bnVsbCk7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChhLGIsdm9pZCAwKX06ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9YS5sZW5ndGgsZD10eXBlb2YgYT09PSJzdHJpbmciP2Euc3BsaXQoIiIpOmEsZT0wO2U8YztlKyspZSBpbiBkJiZiLmNhbGwodm9pZCAwLGRbZV0sZSxhKX07CmZ1bmN0aW9uIHhhKGEsYil7Yj12YShhLGIpO3ZhciBjO2lmKGM9Yj49MClwKGEubGVuZ3RoIT1udWxsKSxBcnJheS5wcm90b3R5cGUuc3BsaWNlLmNhbGwoYSxiLDEpO3JldHVybiBjfWZ1bmN0aW9uIHlhKGEpe3ZhciBiPWEubGVuZ3RoO2lmKGI+MCl7Zm9yKHZhciBjPUFycmF5KGIpLGQ9MDtkPGI7ZCsrKWNbZF09YVtkXTtyZXR1cm4gY31yZXR1cm5bXX1mdW5jdGlvbiB6YShhLGIsYyxkKXtwKGEubGVuZ3RoIT1udWxsKTtBcnJheS5wcm90b3R5cGUuc3BsaWNlLmFwcGx5KGEsQWEoYXJndW1lbnRzLDEpKX1mdW5jdGlvbiBBYShhLGIsYyl7cChhLmxlbmd0aCE9bnVsbCk7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg8PTI/QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYSxiKTpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhLGIsYyl9O2Z1bmN0aW9uIEJhKGEsYixjKXtmb3IodmFyIGQgaW4gYSliLmNhbGwoYyxhW2RdLGQsYSl9ZnVuY3Rpb24gQ2EoYSxiKXtmb3IodmFyIGMgaW4gYSlpZihhW2NdPT1iKXJldHVybiEwO3JldHVybiExfWZ1bmN0aW9uIERhKGEsYixjKXtpZihhIT09bnVsbCYmYiBpbiBhKXRocm93IEVycm9yKCdUaGUgb2JqZWN0IGFscmVhZHkgY29udGFpbnMgdGhlIGtleSAiJytiKyciJyk7YVtiXT1jfWZ1bmN0aW9uIEVhKGEpe3ZhciBiPXt9LGM7Zm9yKGMgaW4gYSliW2FbY11dPWM7cmV0dXJuIGJ9dmFyIEZhPSJjb25zdHJ1Y3RvciBoYXNPd25Qcm9wZXJ0eSBpc1Byb3RvdHlwZU9mIHByb3BlcnR5SXNFbnVtZXJhYmxlIHRvTG9jYWxlU3RyaW5nIHRvU3RyaW5nIHZhbHVlT2YiLnNwbGl0KCIgIik7CmZ1bmN0aW9uIEdhKGEsYil7Zm9yKHZhciBjLGQsZT0xO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspe2Q9YXJndW1lbnRzW2VdO2ZvcihjIGluIGQpYVtjXT1kW2NdO2Zvcih2YXIgZj0wO2Y8RmEubGVuZ3RoO2YrKyljPUZhW2ZdLE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChkLGMpJiYoYVtjXT1kW2NdKX19O3ZhciBIYT1TdHJpbmcucHJvdG90eXBlLnRyaW0/ZnVuY3Rpb24oYSl7cmV0dXJuIGEudHJpbSgpfTpmdW5jdGlvbihhKXtyZXR1cm4vXltcc1x4YTBdKihbXHNcU10qPylbXHNceGEwXSokLy5leGVjKGEpWzFdfTsvKgoKIENvcHlyaWdodCBHb29nbGUgTExDCiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMAoqLwp2YXIgSWE9e307dmFyIEphPWZ1bmN0aW9uKGEpe2lmKElhIT09SWEpdGhyb3cgRXJyb3IoIkJhZCBzZWNyZXQiKTt0aGlzLmc9YX07SmEucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ307bmV3IEphKCJhYm91dDpibGFuayIpO25ldyBKYSgiYWJvdXQ6aW52YWxpZCN6Q2xvc3VyZXoiKTt2YXIgS2E9W10sTGE9ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJBIFVSTCB3aXRoIGNvbnRlbnQgJyIrYSsiJyB3YXMgc2FuaXRpemVkIGF3YXkuIil9O0thLmluZGV4T2YoTGEpPT09LTEmJkthLnB1c2goTGEpO3ZhciBNYSxOYTthOntmb3IodmFyIE9hPVsiQ0xPU1VSRV9GTEFHUyJdLFBhPWwsUWE9MDtRYTxPYS5sZW5ndGg7UWErKylpZihQYT1QYVtPYVtRYV1dLFBhPT1udWxsKXtOYT1udWxsO2JyZWFrIGF9TmE9UGF9dmFyIFJhPU5hJiZOYVs2MTA0MDEzMDFdO01hPVJhIT1udWxsP1JhOiExO2Z1bmN0aW9uIFNhKCl7dmFyIGE9bC5uYXZpZ2F0b3I7cmV0dXJuIGEmJihhPWEudXNlckFnZW50KT9hOiIifXZhciBUYSxVYT1sLm5hdmlnYXRvcjtUYT1VYT9VYS51c2VyQWdlbnREYXRhfHxudWxsOm51bGw7ZnVuY3Rpb24gcihhKXtyZXR1cm4gU2EoKS5pbmRleE9mKGEpIT0tMX07dmFyIFZhPXIoIkVkZ2UiKSx0PXIoIkdlY2tvIikmJiEoU2EoKS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoIndlYmtpdCIpIT0tMSYmIXIoIkVkZ2UiKSkmJiEocigiVHJpZGVudCIpfHxyKCJNU0lFIikpJiYhcigiRWRnZSIpLHU9U2EoKS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoIndlYmtpdCIpIT0tMSYmIXIoIkVkZ2UiKSx2PU1hJiZUYSYmVGEucGxhdGZvcm0/VGEucGxhdGZvcm09PT0ibWFjT1MiOnIoIk1hY2ludG9zaCIpO3ZhciBYYT1mdW5jdGlvbihhLGIpe0JhKGIsZnVuY3Rpb24oYyxkKXtkPT0ic3R5bGUiP2Euc3R5bGUuY3NzVGV4dD1jOmQ9PSJjbGFzcyI/YS5jbGFzc05hbWU9YzpkPT0iZm9yIj9hLmh0bWxGb3I9YzpXYS5oYXNPd25Qcm9wZXJ0eShkKT9hLnNldEF0dHJpYnV0ZShXYVtkXSxjKTpkLmxhc3RJbmRleE9mKCJhcmlhLSIsMCk9PTB8fGQubGFzdEluZGV4T2YoImRhdGEtIiwwKT09MD9hLnNldEF0dHJpYnV0ZShkLGMpOmFbZF09Y30pfSxXYT17Y2VsbHBhZGRpbmc6ImNlbGxQYWRkaW5nIixjZWxsc3BhY2luZzoiY2VsbFNwYWNpbmciLGNvbHNwYW46ImNvbFNwYW4iLGZyYW1lYm9yZGVyOiJmcmFtZUJvcmRlciIsaGVpZ2h0OiJoZWlnaHQiLG1heGxlbmd0aDoibWF4TGVuZ3RoIixub25jZToibm9uY2UiLHJvbGU6InJvbGUiLHJvd3NwYW46InJvd1NwYW4iLHR5cGU6InR5cGUiLHVzZW1hcDoidXNlTWFwIix2YWxpZ246InZBbGlnbiIsd2lkdGg6IndpZHRoIn0sWWE9ZnVuY3Rpb24oYSwKYixjKXtmdW5jdGlvbiBkKGspe2smJmIuYXBwZW5kQ2hpbGQodHlwZW9mIGs9PT0ic3RyaW5nIj9hLmNyZWF0ZVRleHROb2RlKGspOmspfWZvcih2YXIgZT0yO2U8Yy5sZW5ndGg7ZSsrKXt2YXIgZj1jW2VdO2lmKCFrYShmKXx8bShmKSYmZi5ub2RlVHlwZT4wKWQoZik7ZWxzZXthOntpZihmJiZ0eXBlb2YgZi5sZW5ndGg9PSJudW1iZXIiKXtpZihtKGYpKXt2YXIgaD10eXBlb2YgZi5pdGVtPT0iZnVuY3Rpb24ifHx0eXBlb2YgZi5pdGVtPT0ic3RyaW5nIjticmVhayBhfWlmKHR5cGVvZiBmPT09ImZ1bmN0aW9uIil7aD10eXBlb2YgZi5pdGVtPT0iZnVuY3Rpb24iO2JyZWFrIGF9fWg9ITF9d2EoaD95YShmKTpmLGQpfX19LFphPWZ1bmN0aW9uKGEsYil7Yj1TdHJpbmcoYik7YS5jb250ZW50VHlwZT09PSJhcHBsaWNhdGlvbi94aHRtbCt4bWwiJiYoYj1iLnRvTG93ZXJDYXNlKCkpO3JldHVybiBhLmNyZWF0ZUVsZW1lbnQoYil9LCRhPWZ1bmN0aW9uKGEpe2EmJmEucGFyZW50Tm9kZSYmCmEucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhKX0sYWI9ZnVuY3Rpb24oYSxiKXtpZighYXx8IWIpcmV0dXJuITE7aWYoYS5jb250YWlucyYmYi5ub2RlVHlwZT09MSlyZXR1cm4gYT09Ynx8YS5jb250YWlucyhiKTtpZih0eXBlb2YgYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiE9InVuZGVmaW5lZCIpcmV0dXJuIGE9PWJ8fCEhKGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24oYikmMTYpO2Zvcig7YiYmYSE9YjspYj1iLnBhcmVudE5vZGU7cmV0dXJuIGI9PWF9LGJiPWZ1bmN0aW9uKGEpe3AoYSwiTm9kZSBjYW5ub3QgYmUgbnVsbCBvciB1bmRlZmluZWQuIik7cmV0dXJuIGEubm9kZVR5cGU9PTk/YTphLm93bmVyRG9jdW1lbnR8fGEuZG9jdW1lbnR9LGNiPWZ1bmN0aW9uKGEsYil7Yj9hLnRhYkluZGV4PTA6KGEudGFiSW5kZXg9LTEsYS5yZW1vdmVBdHRyaWJ1dGUoInRhYkluZGV4IikpfSxkYj1mdW5jdGlvbihhKXtyZXR1cm4gYS5oYXNBdHRyaWJ1dGUoInRhYmluZGV4Iil9LGViPQpmdW5jdGlvbihhKXthPWEudGFiSW5kZXg7cmV0dXJuIHR5cGVvZiBhPT09Im51bWJlciImJmE+PTAmJmE8MzI3Njh9LGZiPWZ1bmN0aW9uKGEpe3RoaXMuZz1hfHxsLmRvY3VtZW50fHxkb2N1bWVudH07ZmIucHJvdG90eXBlLmk9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nO3JldHVybiB0eXBlb2YgYT09PSJzdHJpbmciP2IuZ2V0RWxlbWVudEJ5SWQoYSk6YX07ZmIucHJvdG90eXBlLmg9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXMuZyxlPWFyZ3VtZW50cyxmPWVbMV0saD1aYShkLFN0cmluZyhlWzBdKSk7ZiYmKHR5cGVvZiBmPT09InN0cmluZyI/aC5jbGFzc05hbWU9ZjpBcnJheS5pc0FycmF5KGYpP2guY2xhc3NOYW1lPWYuam9pbigiICIpOlhhKGgsZikpO2UubGVuZ3RoPjImJllhKGQsaCxlKTtyZXR1cm4gaH07dmFyIHc9ZnVuY3Rpb24oKXt0aGlzLmJhPXRoaXMuYmE7dGhpcy5rYT10aGlzLmthfTt3LnByb3RvdHlwZS5iYT0hMTt3LnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7dGhpcy5iYXx8KHRoaXMuYmE9ITAsdGhpcy5DKCkpfTt3LnByb3RvdHlwZVtTeW1ib2wuZGlzcG9zZV09ZnVuY3Rpb24oKXt0aGlzLmRpc3Bvc2UoKX07dy5wcm90b3R5cGUuQz1mdW5jdGlvbigpe2lmKHRoaXMua2EpZm9yKDt0aGlzLmthLmxlbmd0aDspdGhpcy5rYS5zaGlmdCgpKCl9O3ZhciB5PWZ1bmN0aW9uKGEsYil7dGhpcy50eXBlPWE7dGhpcy51PXRoaXMudGFyZ2V0PWI7dGhpcy5kZWZhdWx0UHJldmVudGVkPXRoaXMuQT0hMX07eS5wcm90b3R5cGUudj1mdW5jdGlvbigpe3RoaXMuQT0hMH07eS5wcm90b3R5cGUuaj1mdW5jdGlvbigpe3RoaXMuZGVmYXVsdFByZXZlbnRlZD0hMH07dmFyIGdiPWZ1bmN0aW9uKCl7aWYoIWwuYWRkRXZlbnRMaXN0ZW5lcnx8IU9iamVjdC5kZWZpbmVQcm9wZXJ0eSlyZXR1cm4hMTt2YXIgYT0hMSxiPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwicGFzc2l2ZSIse2dldDpmdW5jdGlvbigpe2E9ITB9fSk7dHJ5e3ZhciBjPWZ1bmN0aW9uKCl7fTtsLmFkZEV2ZW50TGlzdGVuZXIoInRlc3QiLGMsYik7bC5yZW1vdmVFdmVudExpc3RlbmVyKCJ0ZXN0IixjLGIpfWNhdGNoKGQpe31yZXR1cm4gYX0oKTt2YXIgej1mdW5jdGlvbihhLGIpe3kuY2FsbCh0aGlzLGE/YS50eXBlOiIiKTt0aGlzLnJlbGF0ZWRUYXJnZXQ9dGhpcy51PXRoaXMudGFyZ2V0PW51bGw7dGhpcy5idXR0b249dGhpcy5zY3JlZW5ZPXRoaXMuc2NyZWVuWD10aGlzLmNsaWVudFk9dGhpcy5jbGllbnRYPTA7dGhpcy5rZXk9IiI7dGhpcy5nPTA7dGhpcy5tZXRhS2V5PXRoaXMuc2hpZnRLZXk9dGhpcy5hbHRLZXk9dGhpcy5jdHJsS2V5PSExO3RoaXMuc3RhdGU9bnVsbDt0aGlzLkc9ITE7dGhpcy5wb2ludGVySWQ9MDt0aGlzLnBvaW50ZXJUeXBlPSIiO3RoaXMudGltZVN0YW1wPTA7dGhpcy5oPW51bGw7aWYoYSl7dmFyIGM9dGhpcy50eXBlPWEudHlwZSxkPWEuY2hhbmdlZFRvdWNoZXMmJmEuY2hhbmdlZFRvdWNoZXMubGVuZ3RoP2EuY2hhbmdlZFRvdWNoZXNbMF06bnVsbDt0aGlzLnRhcmdldD1hLnRhcmdldHx8YS5zcmNFbGVtZW50O3RoaXMudT1iO2I9YS5yZWxhdGVkVGFyZ2V0O2J8fChjPT0ibW91c2VvdmVyIj8KYj1hLmZyb21FbGVtZW50OmM9PSJtb3VzZW91dCImJihiPWEudG9FbGVtZW50KSk7dGhpcy5yZWxhdGVkVGFyZ2V0PWI7ZD8odGhpcy5jbGllbnRYPWQuY2xpZW50WCE9PXZvaWQgMD9kLmNsaWVudFg6ZC5wYWdlWCx0aGlzLmNsaWVudFk9ZC5jbGllbnRZIT09dm9pZCAwP2QuY2xpZW50WTpkLnBhZ2VZLHRoaXMuc2NyZWVuWD1kLnNjcmVlblh8fDAsdGhpcy5zY3JlZW5ZPWQuc2NyZWVuWXx8MCk6KHRoaXMuY2xpZW50WD1hLmNsaWVudFghPT12b2lkIDA/YS5jbGllbnRYOmEucGFnZVgsdGhpcy5jbGllbnRZPWEuY2xpZW50WSE9PXZvaWQgMD9hLmNsaWVudFk6YS5wYWdlWSx0aGlzLnNjcmVlblg9YS5zY3JlZW5YfHwwLHRoaXMuc2NyZWVuWT1hLnNjcmVlbll8fDApO3RoaXMuYnV0dG9uPWEuYnV0dG9uO3RoaXMuZz1hLmtleUNvZGV8fDA7dGhpcy5rZXk9YS5rZXl8fCIiO3RoaXMuY3RybEtleT1hLmN0cmxLZXk7dGhpcy5hbHRLZXk9YS5hbHRLZXk7dGhpcy5zaGlmdEtleT1hLnNoaWZ0S2V5Owp0aGlzLm1ldGFLZXk9YS5tZXRhS2V5O3RoaXMuRz12P2EubWV0YUtleTphLmN0cmxLZXk7dGhpcy5wb2ludGVySWQ9YS5wb2ludGVySWR8fDA7dGhpcy5wb2ludGVyVHlwZT1hLnBvaW50ZXJUeXBlO3RoaXMuc3RhdGU9YS5zdGF0ZTt0aGlzLnRpbWVTdGFtcD1hLnRpbWVTdGFtcDt0aGlzLmg9YTthLmRlZmF1bHRQcmV2ZW50ZWQmJnoubC5qLmNhbGwodGhpcyl9fTtuKHoseSk7ei5wcm90b3R5cGUudj1mdW5jdGlvbigpe3oubC52LmNhbGwodGhpcyk7dGhpcy5oLnN0b3BQcm9wYWdhdGlvbj90aGlzLmguc3RvcFByb3BhZ2F0aW9uKCk6dGhpcy5oLmNhbmNlbEJ1YmJsZT0hMH07ei5wcm90b3R5cGUuaj1mdW5jdGlvbigpe3oubC5qLmNhbGwodGhpcyk7dmFyIGE9dGhpcy5oO2EucHJldmVudERlZmF1bHQ/YS5wcmV2ZW50RGVmYXVsdCgpOmEucmV0dXJuVmFsdWU9ITF9O3ZhciBoYj0iY2xvc3VyZV9saXN0ZW5hYmxlXyIrKE1hdGgucmFuZG9tKCkqMUU2fDApLGliPWZ1bmN0aW9uKGEpe3JldHVybiEoIWF8fCFhW2hiXSl9O3ZhciBqYj0wO3ZhciBrYj1mdW5jdGlvbihhLGIsYyxkLGUpe3RoaXMubGlzdGVuZXI9YTt0aGlzLnByb3h5PW51bGw7dGhpcy5zcmM9Yjt0aGlzLnR5cGU9Yzt0aGlzLmNhcHR1cmU9ISFkO3RoaXMucGE9ZTt0aGlzLmtleT0rK2piO3RoaXMuamE9dGhpcy5vYT0hMX0sbGI9ZnVuY3Rpb24oYSl7YS5qYT0hMDthLmxpc3RlbmVyPW51bGw7YS5wcm94eT1udWxsO2Euc3JjPW51bGw7YS5wYT1udWxsfTt2YXIgbWI9ZnVuY3Rpb24oYSl7dGhpcy5zcmM9YTt0aGlzLmc9e307dGhpcy5oPTB9O21iLnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZj1hLnRvU3RyaW5nKCk7YT10aGlzLmdbZl07YXx8KGE9dGhpcy5nW2ZdPVtdLHRoaXMuaCsrKTt2YXIgaD1uYihhLGIsZCxlKTtoPi0xPyhiPWFbaF0sY3x8KGIub2E9ITEpKTooYj1uZXcga2IoYix0aGlzLnNyYyxmLCEhZCxlKSxiLm9hPWMsYS5wdXNoKGIpKTtyZXR1cm4gYn07CnZhciBvYj1mdW5jdGlvbihhLGIpe3ZhciBjPWIudHlwZTtjIGluIGEuZyYmeGEoYS5nW2NdLGIpJiYobGIoYiksYS5nW2NdLmxlbmd0aD09MCYmKGRlbGV0ZSBhLmdbY10sYS5oLS0pKX0scGI9ZnVuY3Rpb24oYSxiLGMsZCxlKXthPWEuZ1tiLnRvU3RyaW5nKCldO2I9LTE7YSYmKGI9bmIoYSxjLGQsZSkpO3JldHVybiBiPi0xP2FbYl06bnVsbH0sbmI9ZnVuY3Rpb24oYSxiLGMsZCl7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDsrK2Upe3ZhciBmPWFbZV07aWYoIWYuamEmJmYubGlzdGVuZXI9PWImJmYuY2FwdHVyZT09ISFjJiZmLnBhPT1kKXJldHVybiBlfXJldHVybi0xfTt2YXIgcWI9ImNsb3N1cmVfbG1fIisoTWF0aC5yYW5kb20oKSoxRTZ8MCkscmI9e30sc2I9MCx1Yj1mdW5jdGlvbihhLGIsYyxkLGUpe2lmKGQmJmQub25jZSlyZXR1cm4gdGIoYSxiLGMsZCxlKTtpZihBcnJheS5pc0FycmF5KGIpKXtmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKyl1YihhLGJbZl0sYyxkLGUpO3JldHVybiBudWxsfWM9dmIoYyk7cmV0dXJuIGliKGEpP3diKGEsYixjLG0oZCk/ISFkLmNhcHR1cmU6ISFkLGUpOnhiKGEsYixjLCExLGQsZSl9LHhiPWZ1bmN0aW9uKGEsYixjLGQsZSxmKXtpZighYil0aHJvdyBFcnJvcigiSW52YWxpZCBldmVudCB0eXBlIik7dmFyIGg9bShlKT8hIWUuY2FwdHVyZTohIWUsaz15YihhKTtrfHwoYVtxYl09az1uZXcgbWIoYSkpO2M9ay5hZGQoYixjLGQsaCxmKTtpZihjLnByb3h5KXJldHVybiBjO2Q9emIoKTtjLnByb3h5PWQ7ZC5zcmM9YTtkLmxpc3RlbmVyPWM7aWYoYS5hZGRFdmVudExpc3RlbmVyKWdifHwoZT1oKSxlPT09dm9pZCAwJiYKKGU9ITEpLGEuYWRkRXZlbnRMaXN0ZW5lcihiLnRvU3RyaW5nKCksZCxlKTtlbHNlIGlmKGEuYXR0YWNoRXZlbnQpYS5hdHRhY2hFdmVudChBYihiLnRvU3RyaW5nKCkpLGQpO2Vsc2UgaWYoYS5hZGRMaXN0ZW5lciYmYS5yZW1vdmVMaXN0ZW5lcilwKGI9PT0iY2hhbmdlIiwiTWVkaWFRdWVyeUxpc3Qgb25seSBoYXMgYSBjaGFuZ2UgZXZlbnQiKSxhLmFkZExpc3RlbmVyKGQpO2Vsc2UgdGhyb3cgRXJyb3IoImFkZEV2ZW50TGlzdGVuZXIgYW5kIGF0dGFjaEV2ZW50IGFyZSB1bmF2YWlsYWJsZS4iKTtzYisrO3JldHVybiBjfSx6Yj1mdW5jdGlvbigpe3ZhciBhPUJiLGI9ZnVuY3Rpb24oYyl7cmV0dXJuIGEuY2FsbChiLnNyYyxiLmxpc3RlbmVyLGMpfTtyZXR1cm4gYn0sdGI9ZnVuY3Rpb24oYSxiLGMsZCxlKXtpZihBcnJheS5pc0FycmF5KGIpKXtmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKyl0YihhLGJbZl0sYyxkLGUpO3JldHVybiBudWxsfWM9dmIoYyk7cmV0dXJuIGliKGEpPwphLkEuYWRkKFN0cmluZyhiKSxjLCEwLG0oZCk/ISFkLmNhcHR1cmU6ISFkLGUpOnhiKGEsYixjLCEwLGQsZSl9LENiPWZ1bmN0aW9uKGEsYixjLGQsZSl7aWYoQXJyYXkuaXNBcnJheShiKSlmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKylDYihhLGJbZl0sYyxkLGUpO2Vsc2UgZD1tKGQpPyEhZC5jYXB0dXJlOiEhZCxjPXZiKGMpLGliKGEpPyhhPWEuQSxiPVN0cmluZyhiKS50b1N0cmluZygpLGIgaW4gYS5nJiYoZj1hLmdbYl0sYz1uYihmLGMsZCxlKSxjPi0xJiYobGIoZltjXSkscChmLmxlbmd0aCE9bnVsbCksQXJyYXkucHJvdG90eXBlLnNwbGljZS5jYWxsKGYsYywxKSxmLmxlbmd0aD09MCYmKGRlbGV0ZSBhLmdbYl0sYS5oLS0pKSkpOmEmJihhPXliKGEpKSYmKGM9cGIoYSxiLGMsZCxlKSkmJkEoYyl9LEE9ZnVuY3Rpb24oYSl7aWYodHlwZW9mIGEhPT0ibnVtYmVyIiYmYSYmIWEuamEpe3ZhciBiPWEuc3JjO2lmKGliKGIpKW9iKGIuQSxhKTtlbHNle3ZhciBjPWEudHlwZSwKZD1hLnByb3h5O2IucmVtb3ZlRXZlbnRMaXN0ZW5lcj9iLnJlbW92ZUV2ZW50TGlzdGVuZXIoYyxkLGEuY2FwdHVyZSk6Yi5kZXRhY2hFdmVudD9iLmRldGFjaEV2ZW50KEFiKGMpLGQpOmIuYWRkTGlzdGVuZXImJmIucmVtb3ZlTGlzdGVuZXImJmIucmVtb3ZlTGlzdGVuZXIoZCk7c2ItLTsoYz15YihiKSk/KG9iKGMsYSksYy5oPT0wJiYoYy5zcmM9bnVsbCxiW3FiXT1udWxsKSk6bGIoYSl9fX0sQWI9ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW4gcmI/cmJbYV06cmJbYV09Im9uIithfSxCYj1mdW5jdGlvbihhLGIpe2lmKGEuamEpYT0hMDtlbHNle2I9bmV3IHooYix0aGlzKTt2YXIgYz1hLmxpc3RlbmVyLGQ9YS5wYXx8YS5zcmM7YS5vYSYmQShhKTthPWMuY2FsbChkLGIpfXJldHVybiBhfSx5Yj1mdW5jdGlvbihhKXthPWFbcWJdO3JldHVybiBhIGluc3RhbmNlb2YgbWI/YTpudWxsfSxEYj0iX19jbG9zdXJlX2V2ZW50c19mbl8iKyhNYXRoLnJhbmRvbSgpKjFFOT4+PjApLHZiPWZ1bmN0aW9uKGEpe3AoYSwKIkxpc3RlbmVyIGNhbiBub3QgYmUgbnVsbC4iKTtpZih0eXBlb2YgYT09PSJmdW5jdGlvbiIpcmV0dXJuIGE7cChhLmhhbmRsZUV2ZW50LCJBbiBvYmplY3QgbGlzdGVuZXIgbXVzdCBoYXZlIGhhbmRsZUV2ZW50IG1ldGhvZC4iKTthW0RiXXx8KGFbRGJdPWZ1bmN0aW9uKGIpe3JldHVybiBhLmhhbmRsZUV2ZW50KGIpfSk7cmV0dXJuIGFbRGJdfTt2YXIgRWI9ZnVuY3Rpb24oYSl7dy5jYWxsKHRoaXMpO3RoaXMuaD1hO3RoaXMuZz17fX07bihFYix3KTsKdmFyIEZiPVtdLEI9ZnVuY3Rpb24oYSxiLGMsZCl7QXJyYXkuaXNBcnJheShjKXx8KGMmJihGYlswXT1jLnRvU3RyaW5nKCkpLGM9RmIpO2Zvcih2YXIgZT0wO2U8Yy5sZW5ndGg7ZSsrKXt2YXIgZj11YihiLGNbZV0sZHx8YS5oYW5kbGVFdmVudCwhMSxhLmh8fGEpO2lmKCFmKWJyZWFrO2EuZ1tmLmtleV09Zn1yZXR1cm4gYX0sQz1mdW5jdGlvbihhLGIsYyxkLGUsZil7aWYoQXJyYXkuaXNBcnJheShjKSlmb3IodmFyIGg9MDtoPGMubGVuZ3RoO2grKylDKGEsYixjW2hdLGQsZSxmKTtlbHNlIGQ9ZHx8YS5oYW5kbGVFdmVudCxlPW0oZSk/ISFlLmNhcHR1cmU6ISFlLGY9Znx8YS5ofHxhLGQ9dmIoZCksZT0hIWUsYz1pYihiKT9wYihiLkEsU3RyaW5nKGMpLGQsZSxmKTpiPyhiPXliKGIpKT9wYihiLGMsZCxlLGYpOm51bGw6bnVsbCxjJiYoQShjKSxkZWxldGUgYS5nW2Mua2V5XSk7cmV0dXJuIGF9LEdiPWZ1bmN0aW9uKGEpe0JhKGEuZyxmdW5jdGlvbihiLGMpe3RoaXMuZy5oYXNPd25Qcm9wZXJ0eShjKSYmCkEoYil9LGEpO2EuZz17fX07RWIucHJvdG90eXBlLkM9ZnVuY3Rpb24oKXtFYi5sLkMuY2FsbCh0aGlzKTtHYih0aGlzKX07RWIucHJvdG90eXBlLmhhbmRsZUV2ZW50PWZ1bmN0aW9uKCl7dGhyb3cgRXJyb3IoIkV2ZW50SGFuZGxlci5oYW5kbGVFdmVudCBub3QgaW1wbGVtZW50ZWQiKTt9O3ZhciBEPWZ1bmN0aW9uKCl7dy5jYWxsKHRoaXMpO3RoaXMuQT1uZXcgbWIodGhpcyk7dGhpcy5ZYT10aGlzO3RoaXMubGE9bnVsbH07bihELHcpO0QucHJvdG90eXBlW2hiXT0hMDtELnByb3RvdHlwZS5BYT1mdW5jdGlvbihhKXt0aGlzLmxhPWF9O0QucHJvdG90eXBlLnJlbW92ZUV2ZW50TGlzdGVuZXI9ZnVuY3Rpb24oYSxiLGMsZCl7Q2IodGhpcyxhLGIsYyxkKX07CnZhciBFPWZ1bmN0aW9uKGEsYil7SGIoYSk7dmFyIGM9YS5sYTtpZihjKXt2YXIgZD1bXTtmb3IodmFyIGU9MTtjO2M9Yy5sYSlkLnB1c2goYykscCgrK2U8MUUzLCJpbmZpbml0ZSBsb29wIil9YT1hLllhO2M9Yi50eXBlfHxiO3R5cGVvZiBiPT09InN0cmluZyI/Yj1uZXcgeShiLGEpOmIgaW5zdGFuY2VvZiB5P2IudGFyZ2V0PWIudGFyZ2V0fHxhOihlPWIsYj1uZXcgeShjLGEpLEdhKGIsZSkpO2U9ITA7dmFyIGY7aWYoZClmb3IoZj1kLmxlbmd0aC0xOyFiLkEmJmY+PTA7Zi0tKXt2YXIgaD1iLnU9ZFtmXTtlPUliKGgsYywhMCxiKSYmZX1iLkF8fChoPWIudT1hLGU9SWIoaCxjLCEwLGIpJiZlLGIuQXx8KGU9SWIoaCxjLCExLGIpJiZlKSk7aWYoZClmb3IoZj0wOyFiLkEmJmY8ZC5sZW5ndGg7ZisrKWg9Yi51PWRbZl0sZT1JYihoLGMsITEsYikmJmU7cmV0dXJuIGV9OwpELnByb3RvdHlwZS5DPWZ1bmN0aW9uKCl7RC5sLkMuY2FsbCh0aGlzKTtpZih0aGlzLkEpe3ZhciBhPXRoaXMuQSxiPTAsYztmb3IoYyBpbiBhLmcpe2Zvcih2YXIgZD1hLmdbY10sZT0wO2U8ZC5sZW5ndGg7ZSsrKSsrYixsYihkW2VdKTtkZWxldGUgYS5nW2NdO2EuaC0tfX10aGlzLmxhPW51bGx9O3ZhciB3Yj1mdW5jdGlvbihhLGIsYyxkLGUpe0hiKGEpO3JldHVybiBhLkEuYWRkKFN0cmluZyhiKSxjLCExLGQsZSl9LEliPWZ1bmN0aW9uKGEsYixjLGQpe2I9YS5BLmdbU3RyaW5nKGIpXTtpZighYilyZXR1cm4hMDtiPWIuY29uY2F0KCk7Zm9yKHZhciBlPSEwLGY9MDtmPGIubGVuZ3RoOysrZil7dmFyIGg9YltmXTtpZihoJiYhaC5qYSYmaC5jYXB0dXJlPT1jKXt2YXIgaz1oLmxpc3RlbmVyLHE9aC5wYXx8aC5zcmM7aC5vYSYmb2IoYS5BLGgpO2U9ay5jYWxsKHEsZCkhPT0hMSYmZX19cmV0dXJuIGUmJiFkLmRlZmF1bHRQcmV2ZW50ZWR9LEhiPWZ1bmN0aW9uKGEpe3AoYS5BLCJFdmVudCB0YXJnZXQgaXMgbm90IGluaXRpYWxpemVkLiBEaWQgeW91IGNhbGwgdGhlIHN1cGVyY2xhc3MgKGdvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0KSBjb25zdHJ1Y3Rvcj8iKX07dmFyIEpiPXQ/Ik1velVzZXJTZWxlY3QiOnV8fFZhPyJXZWJraXRVc2VyU2VsZWN0IjpudWxsLEtiPWZ1bmN0aW9uKGEsYil7Yj1iP251bGw6YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpO2lmKEpiJiYoYS5zdHlsZSYmKGEuc3R5bGVbSmJdPSJub25lIiksYikpZm9yKHZhciBjPTA7YT1iW2NdO2MrKylhLnN0eWxlJiYoYS5zdHlsZVtKYl09Im5vbmUiKX07dmFyIExiPWZ1bmN0aW9uKCl7fTtpYShMYik7TGIucHJvdG90eXBlLmc9MDt2YXIgRj1mdW5jdGlvbihhKXtELmNhbGwodGhpcyk7dGhpcy5HPWF8fHBhfHwocGE9bmV3IGZiKTt0aGlzLnphPU1iO3RoaXMuWT1udWxsO3RoaXMucz0hMTt0aGlzLmc9bnVsbDt0aGlzLk09dm9pZCAwO3RoaXMudT10aGlzLmo9dGhpcy5oPW51bGw7dGhpcy5TYT0hMX07bihGLEQpO0YucHJvdG90eXBlLlphPUxiLlYoKTsKdmFyIE1iPW51bGwsTmI9ZnVuY3Rpb24oYSxiKXtzd2l0Y2goYSl7Y2FzZSAxOnJldHVybiBiPyJkaXNhYmxlIjoiZW5hYmxlIjtjYXNlIDI6cmV0dXJuIGI/ImhpZ2hsaWdodCI6InVuaGlnaGxpZ2h0IjtjYXNlIDQ6cmV0dXJuIGI/ImFjdGl2YXRlIjoiZGVhY3RpdmF0ZSI7Y2FzZSA4OnJldHVybiBiPyJzZWxlY3QiOiJ1bnNlbGVjdCI7Y2FzZSAxNjpyZXR1cm4gYj8iY2hlY2siOiJ1bmNoZWNrIjtjYXNlIDMyOnJldHVybiBiPyJmb2N1cyI6ImJsdXIiO2Nhc2UgNjQ6cmV0dXJuIGI/Im9wZW4iOiJjbG9zZSJ9dGhyb3cgRXJyb3IoIkludmFsaWQgY29tcG9uZW50IHN0YXRlIik7fSxPYj1mdW5jdGlvbihhKXtyZXR1cm4gYS5ZfHwoYS5ZPSI6IisoYS5aYS5nKyspLnRvU3RyaW5nKDM2KSl9LFBiPWZ1bmN0aW9uKGEsYil7aWYoYS5oJiZhLmgudSl7dmFyIGM9YS5oLnUsZD1hLlk7ZCBpbiBjJiZkZWxldGUgY1tkXTtEYShhLmgudSxiLGEpfWEuWT1ifTtGLnByb3RvdHlwZS5pPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ307CnZhciBRYj1mdW5jdGlvbihhKXthLk18fChhLk09bmV3IEViKGEpKTtyZXR1cm4gcChhLk0pfTtGLnByb3RvdHlwZS5BYT1mdW5jdGlvbihhKXtpZih0aGlzLmgmJnRoaXMuaCE9YSl0aHJvdyBFcnJvcigiTWV0aG9kIG5vdCBzdXBwb3J0ZWQiKTtGLmwuQWEuY2FsbCh0aGlzLGEpfTtGLnByb3RvdHlwZS5tYT1mdW5jdGlvbigpe3RoaXMuZz1aYSh0aGlzLkcuZywiRElWIil9O0YucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbihhKXtSYih0aGlzLGEpfTsKdmFyIFJiPWZ1bmN0aW9uKGEsYixjKXtpZihhLnMpdGhyb3cgRXJyb3IoIkNvbXBvbmVudCBhbHJlYWR5IHJlbmRlcmVkIik7YS5nfHxhLm1hKCk7Yj9iLmluc2VydEJlZm9yZShhLmcsY3x8bnVsbCk6YS5HLmcuYm9keS5hcHBlbmRDaGlsZChhLmcpO2EuaCYmIWEuaC5zfHxhLkkoKX0sU2I9ZnVuY3Rpb24oYSxiKXtpZihhLnMpdGhyb3cgRXJyb3IoIkNvbXBvbmVudCBhbHJlYWR5IHJlbmRlcmVkIik7aWYoYiYmYS53YShiKSl7YS5TYT0hMDt2YXIgYz1iYihiKTthLkcmJmEuRy5nPT1jfHwoYS5HPWI/bmV3IGZiKGJiKGIpKTpwYXx8KHBhPW5ldyBmYikpO2EuRWEoYik7YS5JKCl9ZWxzZSB0aHJvdyBFcnJvcigiSW52YWxpZCBlbGVtZW50IHRvIGRlY29yYXRlIik7fTtnPUYucHJvdG90eXBlO2cud2E9ZnVuY3Rpb24oKXtyZXR1cm4hMH07Zy5FYT1mdW5jdGlvbihhKXt0aGlzLmc9YX07CmcuST1mdW5jdGlvbigpe3RoaXMucz0hMDtUYih0aGlzLGZ1bmN0aW9uKGEpeyFhLnMmJmEuaSgpJiZhLkkoKX0pfTtnLlU9ZnVuY3Rpb24oKXtUYih0aGlzLGZ1bmN0aW9uKGEpe2EucyYmYS5VKCl9KTt0aGlzLk0mJkdiKHRoaXMuTSk7dGhpcy5zPSExfTtnLkM9ZnVuY3Rpb24oKXt0aGlzLnMmJnRoaXMuVSgpO3RoaXMuTSYmKHRoaXMuTS5kaXNwb3NlKCksZGVsZXRlIHRoaXMuTSk7VGIodGhpcyxmdW5jdGlvbihhKXthLmRpc3Bvc2UoKX0pOyF0aGlzLlNhJiZ0aGlzLmcmJiRhKHRoaXMuZyk7dGhpcy5oPXRoaXMuZz10aGlzLnU9dGhpcy5qPW51bGw7Ri5sLkMuY2FsbCh0aGlzKX07Zy5CYT1mdW5jdGlvbihhLGIpe3RoaXMuQ2EoYSxIKHRoaXMpLGIpfTsKZy5DYT1mdW5jdGlvbihhLGIsYyl7cCghIWEsIlByb3ZpZGVkIGVsZW1lbnQgbXVzdCBub3QgYmUgbnVsbC4iKTtpZihhLnMmJihjfHwhdGhpcy5zKSl0aHJvdyBFcnJvcigiQ29tcG9uZW50IGFscmVhZHkgcmVuZGVyZWQiKTtpZihiPDB8fGI+SCh0aGlzKSl0aHJvdyBFcnJvcigiQ2hpbGQgY29tcG9uZW50IGluZGV4IG91dCBvZiBib3VuZHMiKTt0aGlzLnUmJnRoaXMuanx8KHRoaXMudT17fSx0aGlzLmo9W10pO2lmKGEuaD09dGhpcyl7dmFyIGQ9dGhpcy51LGU9T2IoYSk7ZFtlXT1hO3hhKHRoaXMuaixhKX1lbHNlIERhKHRoaXMudSxPYihhKSxhKTtpZihhPT10aGlzKXRocm93IEVycm9yKCJVbmFibGUgdG8gc2V0IHBhcmVudCBjb21wb25lbnQiKTtpZihkPXRoaXMmJmEuaCYmYS5ZKWU9YS5oLGQ9YS5ZLGUudSYmZD8oZT1lLnUsZD0oZSE9PW51bGwmJmQgaW4gZT9lW2RdOnZvaWQgMCl8fG51bGwpOmQ9bnVsbDtpZihkJiZhLmghPXRoaXMpdGhyb3cgRXJyb3IoIlVuYWJsZSB0byBzZXQgcGFyZW50IGNvbXBvbmVudCIpOwphLmg9dGhpcztGLmwuQWEuY2FsbChhLHRoaXMpO3phKHRoaXMuaixiLDAsYSk7YS5zJiZ0aGlzLnMmJmEuaD09dGhpcz8oYz10aGlzLm5hKCksKGMuY2hpbGROb2Rlc1tiXXx8bnVsbCkhPWEuaSgpJiYoYS5pKCkucGFyZW50RWxlbWVudD09YyYmYy5yZW1vdmVDaGlsZChhLmkoKSksYj1jLmNoaWxkTm9kZXNbYl18fG51bGwsYy5pbnNlcnRCZWZvcmUoYS5pKCksYikpKTpjPyh0aGlzLmd8fHRoaXMubWEoKSxiPUkodGhpcyxiKzEpLFJiKGEsdGhpcy5uYSgpLGI/Yi5nOm51bGwpKTp0aGlzLnMmJiFhLnMmJmEuZyYmYS5nLnBhcmVudE5vZGUmJmEuZy5wYXJlbnROb2RlLm5vZGVUeXBlPT0xJiZhLkkoKX07Zy5uYT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmd9Owp2YXIgVWI9ZnVuY3Rpb24oYSl7aWYoYS56YT09bnVsbCl7dmFyIGI9YS5zP2EuZzphLkcuZy5ib2R5O2E6e3ZhciBjPWJiKGIpO2lmKGMuZGVmYXVsdFZpZXcmJmMuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSYmKGM9Yy5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKGIsbnVsbCkpKXtjPWMuZGlyZWN0aW9ufHxjLmdldFByb3BlcnR5VmFsdWUoImRpcmVjdGlvbiIpfHwiIjticmVhayBhfWM9IiJ9YS56YT0icnRsIj09KGN8fChiLmN1cnJlbnRTdHlsZT9iLmN1cnJlbnRTdHlsZS5kaXJlY3Rpb246bnVsbCl8fGIuc3R5bGUmJmIuc3R5bGUuZGlyZWN0aW9uKX1yZXR1cm4gYS56YX0sSD1mdW5jdGlvbihhKXtyZXR1cm4gYS5qP2Euai5sZW5ndGg6MH0sST1mdW5jdGlvbihhLGIpe3JldHVybiBhLmo/YS5qW2JdfHxudWxsOm51bGx9LFRiPWZ1bmN0aW9uKGEsYixjKXthLmomJmEuai5mb3JFYWNoKGIsYyl9LFZiPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuaiYmYj9hLmouaW5kZXhPZihiKToKLTF9O3ZhciBXYj17bWI6ImFjdGl2ZWRlc2NlbmRhbnQiLHJiOiJhdG9taWMiLHNiOiJhdXRvY29tcGxldGUiLHViOiJidXN5Iix4YjoiY2hlY2tlZCIseWI6ImNvbGluZGV4IixEYjoiY29udHJvbHMiLEViOiJjdXJyZW50IixHYjoiZGVzY3JpYmVkYnkiLEpiOiJkaXNhYmxlZCIsTGI6ImRyb3BlZmZlY3QiLE1iOiJleHBhbmRlZCIsTmI6ImZsb3d0byIsUGI6ImdyYWJiZWQiLFRiOiJoYXNwb3B1cCIsVmI6ImhpZGRlbiIsWGI6ImludmFsaWQiLFliOiJsYWJlbCIsWmI6ImxhYmVsbGVkYnkiLGFjOiJsZXZlbCIsZmM6ImxpdmUiLHZjOiJtdWx0aWxpbmUiLHdjOiJtdWx0aXNlbGVjdGFibGUiLEFjOiJvcmllbnRhdGlvbiIsQmM6Im93bnMiLENjOiJwb3NpbnNldCIsRWM6InByZXNzZWQiLEljOiJyZWFkb25seSIsS2M6InJlbGV2YW50IixMYzoicmVxdWlyZWQiLFBjOiJyb3dpbmRleCIsU2M6InNlbGVjdGVkIixVYzoic2V0c2l6ZSIsV2M6InNvcnQiLG1kOiJ2YWx1ZW1heCIsbmQ6InZhbHVlbWluIiwKb2Q6InZhbHVlbm93IixwZDoidmFsdWV0ZXh0In07dmFyIFhiO3ZhciBZYj17bmI6ImFsZXJ0IixvYjoiYWxlcnRkaWFsb2ciLHBiOiJhcHBsaWNhdGlvbiIscWI6ImFydGljbGUiLHRiOiJiYW5uZXIiLHZiOiJidXR0b24iLHdiOiJjaGVja2JveCIsemI6ImNvbHVtbmhlYWRlciIsQWI6ImNvbWJvYm94IixCYjoiY29tcGxlbWVudGFyeSIsQ2I6ImNvbnRlbnRpbmZvIixGYjoiZGVmaW5pdGlvbiIsSGI6ImRpYWxvZyIsSWI6ImRpcmVjdG9yeSIsS2I6ImRvY3VtZW50IixPYjoiZm9ybSIsUWI6ImdyaWQiLFJiOiJncmlkY2VsbCIsU2I6Imdyb3VwIixVYjoiaGVhZGluZyIsV2I6ImltZyIsYmM6ImxpbmsiLGNjOiJsaXN0IixkYzoibGlzdGJveCIsZWM6Imxpc3RpdGVtIixoYzoibG9nIixpYzoibWFpbiIsamM6Im1hcnF1ZWUiLGtjOiJtYXRoIixsYzoibWVudSIsbWM6Im1lbnViYXIiLG5jOiJtZW51aXRlbSIsb2M6Im1lbnVpdGVtY2hlY2tib3giLHBjOiJtZW51aXRlbXJhZGlvIix4YzoibmF2aWdhdGlvbiIseWM6Im5vdGUiLHpjOiJvcHRpb24iLApEYzoicHJlc2VudGF0aW9uIixGYzoicHJvZ3Jlc3NiYXIiLEdjOiJyYWRpbyIsSGM6InJhZGlvZ3JvdXAiLEpjOiJyZWdpb24iLE1jOiJyb3ciLE5jOiJyb3dncm91cCIsT2M6InJvd2hlYWRlciIsUWM6InNjcm9sbGJhciIsUmM6InNlYXJjaCIsVGM6InNlcGFyYXRvciIsVmM6InNsaWRlciIsWGM6InNwaW5idXR0b24iLFljOiJzdGF0dXMiLFpjOiJzd2l0Y2giLGFkOiJ0YWIiLGJkOiJ0YWJsaXN0IixjZDoidGFicGFuZWwiLGRkOiJ0ZXh0Ym94IixlZDoidGV4dGluZm8iLGZkOiJ0aW1lciIsZ2Q6InRvb2xiYXIiLGhkOiJ0b29sdGlwIixqZDoidHJlZSIsa2Q6InRyZWVncmlkIixsZDoidHJlZWl0ZW0ifTt2YXIgWmI9ZnVuY3Rpb24oYSxiKXtiPyhwKENhKFliLGIpLCJObyBzdWNoIEFSSUEgcm9sZSAiK2IpLGEuc2V0QXR0cmlidXRlKCJyb2xlIixiKSk6YS5yZW1vdmVBdHRyaWJ1dGUoInJvbGUiKX0sYWM9ZnVuY3Rpb24oYSxiLGMpe0FycmF5LmlzQXJyYXkoYykmJihjPWMuam9pbigiICIpKTt2YXIgZD0kYihiKTtjPT09IiJ8fGM9PXZvaWQgMD8oWGJ8fChjPXt9LFhiPShjLmF0b21pYz0hMSxjLmF1dG9jb21wbGV0ZT0ibm9uZSIsYy5kcm9wZWZmZWN0PSJub25lIixjLmhhc3BvcHVwPSExLGMubGl2ZT0ib2ZmIixjLm11bHRpbGluZT0hMSxjLm11bHRpc2VsZWN0YWJsZT0hMSxjLm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIsYy5yZWFkb25seT0hMSxjLnJlbGV2YW50PSJhZGRpdGlvbnMgdGV4dCIsYy5yZXF1aXJlZD0hMSxjLnNvcnQ9Im5vbmUiLGMuYnVzeT0hMSxjLmRpc2FibGVkPSExLGMuaGlkZGVuPSExLGMuaW52YWxpZD0iZmFsc2UiLGMpKSxjPVhiLGIgaW4gYz9hLnNldEF0dHJpYnV0ZShkLApjW2JdKTphLnJlbW92ZUF0dHJpYnV0ZShkKSk6YS5zZXRBdHRyaWJ1dGUoZCxjKX0sJGI9ZnVuY3Rpb24oYSl7cChhLCJBUklBIGF0dHJpYnV0ZSBjYW5ub3QgYmUgZW1wdHkuIik7cChDYShXYixhKSwiTm8gc3VjaCBBUklBIGF0dHJpYnV0ZSAiK2EpO3JldHVybiJhcmlhLSIrYX07dmFyIGRjPWZ1bmN0aW9uKGEsYixjLGQsZSxmKXtpZih2JiZlKXJldHVybiBiYyhhKTtpZihlJiYhZClyZXR1cm4hMTtpZighdCl7dHlwZW9mIGI9PT0ibnVtYmVyIiYmKGI9Y2MoYikpO3ZhciBoPWI9PTE3fHxiPT0xOHx8diYmYj09OTE7aWYoKCFjfHx2KSYmaHx8diYmYj09MTYmJihkfHxmKSlyZXR1cm4hMX1pZih1JiZkJiZjKXN3aXRjaChhKXtjYXNlIDIyMDpjYXNlIDIxOTpjYXNlIDIyMTpjYXNlIDE5MjpjYXNlIDE4NjpjYXNlIDE4OTpjYXNlIDE4NzpjYXNlIDE4ODpjYXNlIDE5MDpjYXNlIDE5MTpjYXNlIDE5MjpjYXNlIDIyMjpyZXR1cm4hMX1zd2l0Y2goYSl7Y2FzZSAxMzpyZXR1cm4gdD9mfHxlPyExOiEoYyYmZCk6ITA7Y2FzZSAyNzpyZXR1cm4hdSYmIXR9cmV0dXJuIHQmJihkfHxlfHxmKT8hMTpiYyhhKX0sYmM9ZnVuY3Rpb24oYSl7aWYoYT49NDgmJmE8PTU3fHxhPj05NiYmYTw9MTA2fHxhPj02NSYmYTw9OTB8fHUmJmE9PTApcmV0dXJuITA7c3dpdGNoKGEpe2Nhc2UgMzI6Y2FzZSA0MzpjYXNlIDYzOmNhc2UgNjQ6Y2FzZSAxMDc6Y2FzZSAxMDk6Y2FzZSAxMTA6Y2FzZSAxMTE6Y2FzZSAxODY6Y2FzZSA1OTpjYXNlIDE4OTpjYXNlIDE4NzpjYXNlIDYxOmNhc2UgMTg4OmNhc2UgMTkwOmNhc2UgMTkxOmNhc2UgMTkyOmNhc2UgMjIyOmNhc2UgMjE5OmNhc2UgMjIwOmNhc2UgMjIxOmNhc2UgMTYzOmNhc2UgNTg6cmV0dXJuITA7CmNhc2UgMTczOmNhc2UgMTcxOnJldHVybiB0O2RlZmF1bHQ6cmV0dXJuITF9fSxjYz1mdW5jdGlvbihhKXtpZih0KWE9ZWMoYSk7ZWxzZSBpZih2JiZ1KXN3aXRjaChhKXtjYXNlIDkzOmE9OTF9cmV0dXJuIGF9LGVjPWZ1bmN0aW9uKGEpe3N3aXRjaChhKXtjYXNlIDYxOnJldHVybiAxODc7Y2FzZSA1OTpyZXR1cm4gMTg2O2Nhc2UgMTczOnJldHVybiAxODk7Y2FzZSAyMjQ6cmV0dXJuIDkxO2Nhc2UgMDpyZXR1cm4gMjI0O2RlZmF1bHQ6cmV0dXJuIGF9fTt2YXIgZmM9ZnVuY3Rpb24oYSxiLGMsZCl7ei5jYWxsKHRoaXMsZCk7dGhpcy50eXBlPSJrZXkiO3RoaXMuZz1hO3RoaXMucmVwZWF0PWN9O24oZmMseik7dmFyIEo9ZnVuY3Rpb24oYSxiKXtELmNhbGwodGhpcyk7YSYmZ2ModGhpcyxhLGIpfTtuKEosRCk7Zz1KLnByb3RvdHlwZTtnLlI9bnVsbDtnLnFhPW51bGw7Zy5KYT1udWxsO2cucmE9bnVsbDtnLkY9LTE7Zy5LPS0xO2cuRGE9ITE7CnZhciBoYz17MzoxMywxMjoxNDQsNjMyMzI6MzgsNjMyMzM6NDAsNjMyMzQ6MzcsNjMyMzU6MzksNjMyMzY6MTEyLDYzMjM3OjExMyw2MzIzODoxMTQsNjMyMzk6MTE1LDYzMjQwOjExNiw2MzI0MToxMTcsNjMyNDI6MTE4LDYzMjQzOjExOSw2MzI0NDoxMjAsNjMyNDU6MTIxLDYzMjQ2OjEyMiw2MzI0NzoxMjMsNjMyNDg6NDQsNjMyNzI6NDYsNjMyNzM6MzYsNjMyNzU6MzUsNjMyNzY6MzMsNjMyNzc6MzQsNjMyODk6MTQ0LDYzMzAyOjQ1fSxpYz17VXA6MzgsRG93bjo0MCxMZWZ0OjM3LFJpZ2h0OjM5LEVudGVyOjEzLEYxOjExMixGMjoxMTMsRjM6MTE0LEY0OjExNSxGNToxMTYsRjY6MTE3LEY3OjExOCxGODoxMTksRjk6MTIwLEYxMDoxMjEsRjExOjEyMixGMTI6MTIzLCJVKzAwN0YiOjQ2LEhvbWU6MzYsRW5kOjM1LFBhZ2VVcDozMyxQYWdlRG93bjozNCxJbnNlcnQ6NDV9LGpjPXYmJnQ7CkoucHJvdG90eXBlLmc9ZnVuY3Rpb24oYSl7dSYmKHRoaXMuRj09MTcmJiFhLmN0cmxLZXl8fHRoaXMuRj09MTgmJiFhLmFsdEtleXx8diYmdGhpcy5GPT05MSYmIWEubWV0YUtleSkmJih0aGlzLks9dGhpcy5GPS0xKTt0aGlzLkY9PS0xJiYoYS5jdHJsS2V5JiZhLmchPTE3P3RoaXMuRj0xNzphLmFsdEtleSYmYS5nIT0xOD90aGlzLkY9MTg6YS5tZXRhS2V5JiZhLmchPTkxJiYodGhpcy5GPTkxKSk7ZGMoYS5nLHRoaXMuRixhLnNoaWZ0S2V5LGEuY3RybEtleSxhLmFsdEtleSxhLm1ldGFLZXkpPyh0aGlzLks9Y2MoYS5nKSxqYyYmKHRoaXMuRGE9YS5hbHRLZXkpKTp0aGlzLmhhbmRsZUV2ZW50KGEpfTtKLnByb3RvdHlwZS5oPWZ1bmN0aW9uKGEpe3RoaXMuSz10aGlzLkY9LTE7dGhpcy5EYT1hLmFsdEtleX07CkoucHJvdG90eXBlLmhhbmRsZUV2ZW50PWZ1bmN0aW9uKGEpe3ZhciBiPWEuaCxjPWIuYWx0S2V5O2lmKHUmJmEudHlwZT09ImtleXByZXNzIil7dmFyIGQ9dGhpcy5LO3ZhciBlPWIuY2hhckNvZGU+PTAmJmIuY2hhckNvZGU8NjMyMzImJmJjKGQpP2IuY2hhckNvZGU6MH1lbHNlIGEudHlwZT09ImtleXByZXNzIj8oamMmJihjPXRoaXMuRGEpLGIua2V5Q29kZT09Yi5jaGFyQ29kZT9iLmtleUNvZGU8MzI/KGQ9Yi5rZXlDb2RlLGU9MCk6KGQ9dGhpcy5LLGU9Yi5jaGFyQ29kZSk6KGQ9Yi5rZXlDb2RlfHx0aGlzLkssZT1iLmNoYXJDb2RlfHwwKSk6KGQ9Yi5rZXlDb2RlfHx0aGlzLkssZT1iLmNoYXJDb2RlfHwwKSx2JiZlPT02MyYmZD09MjI0JiYoZD0xOTEpO3ZhciBmPWQ9Y2MoZCk7ZD9kPj02MzIzMiYmZCBpbiBoYz9mPWhjW2RdOmQ9PTI1JiZhLnNoaWZ0S2V5JiYoZj05KTpiLmtleUlkZW50aWZpZXImJmIua2V5SWRlbnRpZmllciBpbiBpYyYmKGY9aWNbYi5rZXlJZGVudGlmaWVyXSk7CmlmKCF0fHxhLnR5cGUhPSJrZXlwcmVzcyJ8fGRjKGYsdGhpcy5GLGEuc2hpZnRLZXksYS5jdHJsS2V5LGMsYS5tZXRhS2V5KSlhPWY9PXRoaXMuRix0aGlzLkY9ZixiPW5ldyBmYyhmLGUsYSxiKSxiLmFsdEtleT1jLEUodGhpcyxiKX07Si5wcm90b3R5cGUuaT1mdW5jdGlvbigpe3JldHVybiB0aGlzLlJ9O3ZhciBnYz1mdW5jdGlvbihhLGIsYyl7YS5yYSYma2MoYSk7YS5SPWI7YS5xYT11YihhLlIsImtleXByZXNzIixhLGMpO2EuSmE9dWIoYS5SLCJrZXlkb3duIixhLmcsYyxhKTthLnJhPXViKGEuUiwia2V5dXAiLGEuaCxjLGEpfSxrYz1mdW5jdGlvbihhKXthLnFhJiYoQShhLnFhKSxBKGEuSmEpLEEoYS5yYSksYS5xYT1udWxsLGEuSmE9bnVsbCxhLnJhPW51bGwpO2EuUj1udWxsO2EuRj0tMTthLks9LTF9O0oucHJvdG90eXBlLkM9ZnVuY3Rpb24oKXtKLmwuQy5jYWxsKHRoaXMpO2tjKHRoaXMpfTt2YXIgSz17Z2E6Im1vdXNlZG93biIsaGE6Im1vdXNldXAiLGZhOiJtb3VzZWNhbmNlbCIsc2M6Im1vdXNlbW92ZSIsdWM6Im1vdXNlb3ZlciIsdGM6Im1vdXNlb3V0IixxYzoibW91c2VlbnRlciIscmM6Im1vdXNlbGVhdmUifTt2YXIgbGM9ZnVuY3Rpb24oYSl7cmV0dXJuIHR5cGVvZiBhLmNsYXNzTmFtZT09InN0cmluZyI/YS5jbGFzc05hbWU6YS5nZXRBdHRyaWJ1dGUmJmEuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIn0sTD1mdW5jdGlvbihhKXtyZXR1cm4gYS5jbGFzc0xpc3Q/YS5jbGFzc0xpc3Q6bGMoYSkubWF0Y2goL1xTKy9nKXx8W119LG1jPWZ1bmN0aW9uKGEsYil7dHlwZW9mIGEuY2xhc3NOYW1lPT0ic3RyaW5nIj9hLmNsYXNzTmFtZT1iOmEuc2V0QXR0cmlidXRlJiZhLnNldEF0dHJpYnV0ZSgiY2xhc3MiLGIpfSxuYz1mdW5jdGlvbihhLGIpe2EuY2xhc3NMaXN0P2I9YS5jbGFzc0xpc3QuY29udGFpbnMoYik6KGE9TChhKSxiPXZhKGEsYik+PTApO3JldHVybiBifSxvYz1mdW5jdGlvbihhLGIpe2lmKGEuY2xhc3NMaXN0KWEuY2xhc3NMaXN0LmFkZChiKTtlbHNlIGlmKCFuYyhhLGIpKXt2YXIgYz1sYyhhKTttYyhhLGMrKGMubGVuZ3RoPjA/IiAiK2I6YikpfX0scGM9ZnVuY3Rpb24oYSxiKXtpZihhLmNsYXNzTGlzdClBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGIsCmZ1bmN0aW9uKGUpe29jKGEsZSl9KTtlbHNle3ZhciBjPXt9O0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoTChhKSxmdW5jdGlvbihlKXtjW2VdPSEwfSk7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChiLGZ1bmN0aW9uKGUpe2NbZV09ITB9KTtiPSIiO2Zvcih2YXIgZCBpbiBjKWIrPWIubGVuZ3RoPjA/IiAiK2Q6ZDttYyhhLGIpfX0scWM9ZnVuY3Rpb24oYSxiKXthLmNsYXNzTGlzdD9hLmNsYXNzTGlzdC5yZW1vdmUoYik6bmMoYSxiKSYmbWMoYSxBcnJheS5wcm90b3R5cGUuZmlsdGVyLmNhbGwoTChhKSxmdW5jdGlvbihjKXtyZXR1cm4gYyE9Yn0pLmpvaW4oIiAiKSl9LHJjPWZ1bmN0aW9uKGEsYil7YS5jbGFzc0xpc3Q/QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChiLGZ1bmN0aW9uKGMpe3FjKGEsYyl9KTptYyhhLEFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbChMKGEpLGZ1bmN0aW9uKGMpe3JldHVybiEodmEoYixjKT49MCl9KS5qb2luKCIgIikpfTt2YXIgdGM9ZnVuY3Rpb24oYSxiKXtpZighYSl0aHJvdyBFcnJvcigiSW52YWxpZCBjbGFzcyBuYW1lICIrYSk7aWYodHlwZW9mIGIhPT0iZnVuY3Rpb24iKXRocm93IEVycm9yKCJJbnZhbGlkIGRlY29yYXRvciBmdW5jdGlvbiAiK2IpO3NjW2FdPWJ9LHVjPXt9LHNjPXt9O3ZhciB2Yz1mdW5jdGlvbihhKXt0aGlzLkE9YX07aWEodmMpO3ZhciB3Yz1mdW5jdGlvbihhLGIpe2EmJihhLnRhYkluZGV4PWI/MDotMSl9LHljPWZ1bmN0aW9uKGEsYixjKXtjLmlkJiZQYihiLGMuaWQpO3ZhciBkPWEuZygpLGU9ITEsZj1MKGMpO2YmJkFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoZixmdW5jdGlvbihoKXtoPT1kP2U9ITA6aCYmdGhpcy51KGIsaCxkKX0sYSk7ZXx8b2MoYyxkKTt4YyhiLGMpO3JldHVybiBjfTt2Yy5wcm90b3R5cGUudT1mdW5jdGlvbihhLGIsYyl7Yj09YysiLWRpc2FibGVkIj9hLlgoITEpOmI9PWMrIi1ob3Jpem9udGFsIj96YyhhLCJob3Jpem9udGFsIik6Yj09YysiLXZlcnRpY2FsIiYmemMoYSwidmVydGljYWwiKX07CnZhciB4Yz1mdW5jdGlvbihhLGIpe2lmKGIpZm9yKHZhciBjPWIuZmlyc3RDaGlsZCxkO2MmJmMucGFyZW50Tm9kZT09Yjspe2Q9Yy5uZXh0U2libGluZztpZihjLm5vZGVUeXBlPT0xKXthOnt2YXIgZT1jO3AoZSk7ZT1MKGUpO2Zvcih2YXIgZj1lLmxlbmd0aCxoPTA7aDxmO2grKyl7dmFyIGs9ZVtoXTtpZihrPWsgaW4gc2M/c2Nba10oKTpudWxsKXtlPWs7YnJlYWsgYX19ZT1udWxsfWUmJihlLmc9YyxhLmlzRW5hYmxlZCgpfHxlLlgoITEpLGEuQmEoZSksU2IoZSxjKSl9ZWxzZSBjLm5vZGVWYWx1ZSYmSGEoYy5ub2RlVmFsdWUpIT0iInx8Yi5yZW1vdmVDaGlsZChjKTtjPWR9fSxBYz1mdW5jdGlvbihhLGIpe2I9Yi5pKCk7cChiLCJUaGUgY29udGFpbmVyIERPTSBlbGVtZW50IGNhbm5vdCBiZSBudWxsLiIpO0tiKGIsdCk7KGE9YS5BKSYmWmIoYixhKX07dmMucHJvdG90eXBlLmc9ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy1jb250YWluZXIifTsKdmMucHJvdG90eXBlLmo9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nKCksYz1bYixhLkw9PSJob3Jpem9udGFsIj9iKyItaG9yaXpvbnRhbCI6YisiLXZlcnRpY2FsIl07YS5pc0VuYWJsZWQoKXx8Yy5wdXNoKGIrIi1kaXNhYmxlZCIpO3JldHVybiBjfTt2YXIgQmM9ZnVuY3Rpb24oKXt9O3ZhciBNPWZ1bmN0aW9uKCl7fSxDYztpYShNKTt2YXIgRGM9e2J1dHRvbjoicHJlc3NlZCIsY2hlY2tib3g6ImNoZWNrZWQiLG1lbnVpdGVtOiJzZWxlY3RlZCIsbWVudWl0ZW1jaGVja2JveDoiY2hlY2tlZCIsbWVudWl0ZW1yYWRpbzoiY2hlY2tlZCIscmFkaW86ImNoZWNrZWQiLHRhYjoic2VsZWN0ZWQiLHRyZWVpdGVtOiJzZWxlY3RlZCJ9O00ucHJvdG90eXBlLk5hPWZ1bmN0aW9uKCl7fTtNLnByb3RvdHlwZS54YT1mdW5jdGlvbihhKXt2YXIgYj1hLkcsYz1iLmgsZD10aGlzLk4oKSxlPVtkXSxmPXRoaXMuTigpO2YhPWQmJmUucHVzaChmKTtkPWEubTtmb3IoZj1bXTtkOyl7dmFyIGg9ZCYtZDtmLnB1c2goRWModGhpcyxoKSk7ZCY9fmh9ZS5wdXNoLmFwcGx5KGUsZik7KGQ9YS5GYSkmJmUucHVzaC5hcHBseShlLGQpO3JldHVybiBjLmNhbGwoYiwiRElWIixlLmpvaW4oIiAiKSxhLmlhKX07Ck0ucHJvdG90eXBlLnlhPWZ1bmN0aW9uKGEsYil7Yi5pZCYmUGIoYSxiLmlkKTtiJiZiLmZpcnN0Q2hpbGQ/RmMoYSxiLmZpcnN0Q2hpbGQubmV4dFNpYmxpbmc/eWEoYi5jaGlsZE5vZGVzKTpiLmZpcnN0Q2hpbGQpOmEuaWE9bnVsbDt2YXIgYz0wLGQ9dGhpcy5OKCksZT10aGlzLk4oKSxmPSExLGg9ITEsaz15YShMKGIpKTtrLmZvckVhY2goZnVuY3Rpb24ocSl7Znx8cSE9ZD9ofHxxIT1lP2N8PUdjKHRoaXMscSk6aD0hMDooZj0hMCxlPT1kJiYoaD0hMCkpO0djKHRoaXMscSk9PTEmJihzYShiKSxkYihiKSYmZWIoYikmJmNiKGIsITEpKX0sdGhpcyk7YS5tPWM7Znx8KGsucHVzaChkKSxlPT1kJiYoaD0hMCkpO2h8fGsucHVzaChlKTsoYT1hLkZhKSYmay5wdXNoLmFwcGx5KGssYSk7ZiYmaCYmIWF8fG1jKGIsay5qb2luKCIgIikpO3JldHVybiBifTsKdmFyIEhjPWZ1bmN0aW9uKGEsYil7aWYoYT1hLk5hKCkpe3AoYiwiVGhlIGVsZW1lbnQgcGFzc2VkIGFzIGEgZmlyc3QgcGFyYW1ldGVyIGNhbm5vdCBiZSBudWxsLiIpO3ZhciBjPWIuZ2V0QXR0cmlidXRlKCJyb2xlIil8fG51bGw7YSE9YyYmWmIoYixhKX19LEljPWZ1bmN0aW9uKGEsYil7dmFyIGM7aWYoYS5EJjMyJiYoYz1hLmkoKSkpe2lmKCFiJiZhLm0mMzIpe3RyeXtjLmJsdXIoKX1jYXRjaChkKXt9YS5tJjMyJiZhLlFhKG51bGwpfShkYihjKSYmZWIoYykpIT1iJiZjYihjLGIpfX0sSmM9ZnVuY3Rpb24oYSxiLGMpe0NjfHwoQ2M9ezE6ImRpc2FibGVkIiw4OiJzZWxlY3RlZCIsMTY6ImNoZWNrZWQiLDY0OiJleHBhbmRlZCJ9KTtwKGEsIlRoZSBlbGVtZW50IHBhc3NlZCBhcyBhIGZpcnN0IHBhcmFtZXRlciBjYW5ub3QgYmUgbnVsbC4iKTtiPUNjW2JdO3ZhciBkPWEuZ2V0QXR0cmlidXRlKCJyb2xlIil8fG51bGw7ZCYmKGQ9RGNbZF18fGIsYj1iPT0iY2hlY2tlZCJ8fGI9PQoic2VsZWN0ZWQiP2Q6Yik7YiYmYWMoYSxiLGMpfTtNLnByb3RvdHlwZS5OPWZ1bmN0aW9uKCl7cmV0dXJuImdvb2ctY29udHJvbCJ9O3ZhciBFYz1mdW5jdGlvbihhLGIpe2EuZ3x8S2MoYSk7cmV0dXJuIGEuZ1tiXX0sR2M9ZnVuY3Rpb24oYSxiKXthLmh8fChhLmd8fEtjKGEpLGEuaD1FYShhLmcpKTthPXBhcnNlSW50KGEuaFtiXSwxMCk7cmV0dXJuIGlzTmFOKGEpPzA6YX0sS2M9ZnVuY3Rpb24oYSl7dmFyIGI9YS5OKCk7dmFyIGM9Yi5yZXBsYWNlKC9ceGEwfFxzL2csIiAiKS5pbmRleE9mKCIgIikhPS0xO3AoIWMsIkNvbnRyb2xSZW5kZXJlciBoYXMgYW4gaW52YWxpZCBjc3MgY2xhc3M6ICciK2IrIiciKTthLmc9ezE6YisiLWRpc2FibGVkIiwyOmIrIi1ob3ZlciIsNDpiKyItYWN0aXZlIiw4OmIrIi1zZWxlY3RlZCIsMTY6YisiLWNoZWNrZWQiLDMyOmIrIi1mb2N1c2VkIiw2NDpiKyItb3BlbiJ9fTt2YXIgTj1mdW5jdGlvbihhLGIsYyl7Ri5jYWxsKHRoaXMsYyk7aWYoIWIpe2ZvcihiPXRoaXMuY29uc3RydWN0b3I7Yjspe3ZhciBkPW5hKGIpO2lmKGQ9dWNbZF0pYnJlYWs7Yj0oYj1PYmplY3QuZ2V0UHJvdG90eXBlT2YoYi5wcm90b3R5cGUpKSYmYi5jb25zdHJ1Y3Rvcn1iPWQ/dHlwZW9mIGQuVj09PSJmdW5jdGlvbiI/ZC5WKCk6bmV3IGQ6bnVsbH10aGlzLnY9Yjt0aGlzLmlhPWEhPT12b2lkIDA/YTpudWxsfTtuKE4sRik7Zz1OLnByb3RvdHlwZTtnLmlhPW51bGw7Zy5tPTA7Zy5EPTM5O2cuUD0wO2cuT2E9ITA7Zy5GYT1udWxsO2cuSGE9ITA7Zy5tYT1mdW5jdGlvbigpe3ZhciBhPXRoaXMudi54YSh0aGlzKTt0aGlzLmc9YTtIYyh0aGlzLnYsYSk7S2IoYSwhMCk7dGhpcy5pc1Zpc2libGUoKXx8KGEuc3R5bGUuZGlzcGxheT0ibm9uZSIsYSYmYWMoYSwiaGlkZGVuIiwhMCkpfTtnLm5hPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaSgpfTtnLndhPWZ1bmN0aW9uKCl7cmV0dXJuITB9OwpnLkVhPWZ1bmN0aW9uKGEpe3RoaXMuZz1hPXRoaXMudi55YSh0aGlzLGEpO0hjKHRoaXMudixhKTtLYihhLCEwKTt0aGlzLk9hPWEuc3R5bGUuZGlzcGxheSE9Im5vbmUifTsKZy5JPWZ1bmN0aW9uKCl7Ti5sLkkuY2FsbCh0aGlzKTt2YXIgYT10aGlzLmc7cChhLCJDYW4gbm90IGNhbGwgZ2V0RWxlbWVudFN0cmljdCBiZWZvcmUgcmVuZGVyaW5nL2RlY29yYXRpbmcuIik7cCh0aGlzKTtwKGEpO3RoaXMuaXNWaXNpYmxlKCl8fGFjKGEsImhpZGRlbiIsIXRoaXMuaXNWaXNpYmxlKCkpO3RoaXMuaXNFbmFibGVkKCl8fEpjKGEsMSwhdGhpcy5pc0VuYWJsZWQoKSk7dGhpcy5EJjgmJkpjKGEsOCwhISh0aGlzLm0mOCkpO3RoaXMuRCYxNiYmSmMoYSwxNiwhISh0aGlzLm0mMTYpKTt0aGlzLkQmNjQmJkpjKGEsNjQsISEodGhpcy5tJjY0KSk7dmFyIGI9dGhpcy52O1ViKHRoaXMpJiYoYT10aGlzLmkoKSxiPWIuTigpKyItcnRsIiwoYT1hLmk/YS5pKCk6YSkmJnBjKGEsW2JdKSk7dGhpcy5pc0VuYWJsZWQoKSYmSWModGhpcyx0aGlzLmlzVmlzaWJsZSgpKTt0aGlzLkQmLTImJih0aGlzLkhhJiZMYyh0aGlzLCEwKSx0aGlzLkQmMzImJihhPXRoaXMuaSgpKSkmJihiPQp0aGlzLlp8fCh0aGlzLlo9bmV3IEopLGdjKGIsYSksQihCKEIoUWIodGhpcyksYiwia2V5Iix0aGlzLmFhKSxhLCJmb2N1cyIsdGhpcy5YYSksYSwiYmx1ciIsdGhpcy5RYSkpfTt2YXIgTGM9ZnVuY3Rpb24oYSxiKXt2YXIgYz1RYihhKSxkPWEuaSgpO2I/KEIoQihCKEIoYyxkLEsuZ2EsYS5zYSksZCxbSy5oYSxLLmZhXSxhLnZhKSxkLCJtb3VzZW92ZXIiLGEudWEpLGQsIm1vdXNlb3V0IixhLnRhKSxhLmNhIT1CYyYmQihjLGQsImNvbnRleHRtZW51IixhLmNhKSk6KEMoQyhDKEMoYyxkLEsuZ2EsYS5zYSksZCxbSy5oYSxLLmZhXSxhLnZhKSxkLCJtb3VzZW92ZXIiLGEudWEpLGQsIm1vdXNlb3V0IixhLnRhKSxhLmNhIT1CYyYmQyhjLGQsImNvbnRleHRtZW51IixhLmNhKSl9O04ucHJvdG90eXBlLlU9ZnVuY3Rpb24oKXtOLmwuVS5jYWxsKHRoaXMpO3RoaXMuWiYma2ModGhpcy5aKTt0aGlzLmlzVmlzaWJsZSgpJiZ0aGlzLmlzRW5hYmxlZCgpJiZJYyh0aGlzLCExKX07Ck4ucHJvdG90eXBlLkM9ZnVuY3Rpb24oKXtOLmwuQy5jYWxsKHRoaXMpO3RoaXMuWiYmKHRoaXMuWi5kaXNwb3NlKCksZGVsZXRlIHRoaXMuWik7ZGVsZXRlIHRoaXMudjt0aGlzLkZhPXRoaXMuaWE9bnVsbH07dmFyIEZjPWZ1bmN0aW9uKGEsYil7YS5pYT1ifTtOLnByb3RvdHlwZS5pc1Zpc2libGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5PYX07Ti5wcm90b3R5cGUuaXNFbmFibGVkPWZ1bmN0aW9uKCl7cmV0dXJuISh0aGlzLm0mMSl9O04ucHJvdG90eXBlLlg9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5oO2ImJnR5cGVvZiBiLmlzRW5hYmxlZD09ImZ1bmN0aW9uIiYmIWIuaXNFbmFibGVkKCl8fCFPKHRoaXMsMSwhYSl8fChhfHwoTWModGhpcywhMSksUCh0aGlzLCExKSksdGhpcy5pc1Zpc2libGUoKSYmSWModGhpcyxhKSxUKHRoaXMsMSwhYSwhMCkpfTt2YXIgUD1mdW5jdGlvbihhLGIpe08oYSwyLGIpJiZUKGEsMixiKX07Ck4ucHJvdG90eXBlLmlzQWN0aXZlPWZ1bmN0aW9uKCl7cmV0dXJuISEodGhpcy5tJjQpfTsKdmFyIE1jPWZ1bmN0aW9uKGEsYil7TyhhLDQsYikmJlQoYSw0LGIpfSxOYz1mdW5jdGlvbihhLGIpe08oYSw4LGIpJiZUKGEsOCxiKX0sT2M9ZnVuY3Rpb24oYSxiKXtPKGEsNjQsYikmJlQoYSw2NCxiKX0sVD1mdW5jdGlvbihhLGIsYyxkKXtpZighZCYmYj09MSlhLlgoIWMpO2Vsc2UgaWYoYS5EJmImJmMhPSEhKGEubSZiKSl7dmFyIGU9YS52O2lmKGQ9YS5pKCkpe2lmKGU9RWMoZSxiKSl7dmFyIGY9YS5pP2EuaSgpOmE7ZiYmKGM/cGM6cmMpKGYsW2VdKX1KYyhkLGIsYyl9YS5tPWM/YS5tfGI6YS5tJn5ifX0sUGM9ZnVuY3Rpb24oYSxiLGMpe2lmKGEucyYmYS5tJmImJiFjKXRocm93IEVycm9yKCJDb21wb25lbnQgYWxyZWFkeSByZW5kZXJlZCIpOyFjJiZhLm0mYiYmVChhLGIsITEpO2EuRD1jP2EuRHxiOmEuRCZ+Yn0sVT1mdW5jdGlvbihhLGIpe3JldHVybiEhKDI1NSZiKSYmISEoYS5EJmIpfSxPPWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4hIShhLkQmYikmJiEhKGEubSZiKSE9CmMmJighKGEuUCZiKXx8RShhLE5iKGIsYykpKSYmIWEuYmF9O04ucHJvdG90eXBlLnVhPWZ1bmN0aW9uKGEpeyFRYyhhLHRoaXMuaSgpKSYmRSh0aGlzLCJlbnRlciIpJiZ0aGlzLmlzRW5hYmxlZCgpJiZVKHRoaXMsMikmJlAodGhpcywhMCl9O04ucHJvdG90eXBlLnRhPWZ1bmN0aW9uKGEpeyFRYyhhLHRoaXMuaSgpKSYmRSh0aGlzLCJsZWF2ZSIpJiYoVSh0aGlzLDQpJiZNYyh0aGlzLCExKSxVKHRoaXMsMikmJlAodGhpcywhMSkpfTtOLnByb3RvdHlwZS5jYT1CYzt2YXIgUWM9ZnVuY3Rpb24oYSxiKXtyZXR1cm4hIWEucmVsYXRlZFRhcmdldCYmYWIoYixhLnJlbGF0ZWRUYXJnZXQpfTsKTi5wcm90b3R5cGUuc2E9ZnVuY3Rpb24oYSl7aWYodGhpcy5pc0VuYWJsZWQoKSYmKFUodGhpcywyKSYmUCh0aGlzLCEwKSwhKGEuaC5idXR0b24hPTB8fHYmJmEuY3RybEtleSkpKXtVKHRoaXMsNCkmJk1jKHRoaXMsITApO3ZhciBiO2lmKGI9dGhpcy52KXt2YXIgYztiPXRoaXMuRCYzMiYmKGM9dGhpcy5pKCkpP2RiKGMpJiZlYihjKTohMX1iJiZ0aGlzLmkoKS5mb2N1cygpfWEuaC5idXR0b24hPTB8fHYmJmEuY3RybEtleXx8YS5qKCl9O04ucHJvdG90eXBlLnZhPWZ1bmN0aW9uKGEpe3RoaXMuaXNFbmFibGVkKCkmJihVKHRoaXMsMikmJlAodGhpcywhMCksdGhpcy5pc0FjdGl2ZSgpJiZSYyh0aGlzLGEpJiZVKHRoaXMsNCkmJk1jKHRoaXMsITEpKX07CnZhciBSYz1mdW5jdGlvbihhLGIpe2lmKFUoYSwxNikpe3ZhciBjPSEoYS5tJjE2KTtPKGEsMTYsYykmJlQoYSwxNixjKX1VKGEsOCkmJk5jKGEsITApO1UoYSw2NCkmJk9jKGEsIShhLm0mNjQpKTtjPW5ldyB5KCJhY3Rpb24iLGEpO2ImJihjLmFsdEtleT1iLmFsdEtleSxjLmN0cmxLZXk9Yi5jdHJsS2V5LGMubWV0YUtleT1iLm1ldGFLZXksYy5zaGlmdEtleT1iLnNoaWZ0S2V5LGMuRz1iLkcsYy50aW1lU3RhbXA9Yi50aW1lU3RhbXApO3JldHVybiBFKGEsYyl9O04ucHJvdG90eXBlLlhhPWZ1bmN0aW9uKCl7VSh0aGlzLDMyKSYmTyh0aGlzLDMyLCEwKSYmVCh0aGlzLDMyLCEwKX07Ti5wcm90b3R5cGUuUWE9ZnVuY3Rpb24oKXtVKHRoaXMsNCkmJk1jKHRoaXMsITEpO1UodGhpcywzMikmJk8odGhpcywzMiwhMSkmJlQodGhpcywzMiwhMSl9OwpOLnByb3RvdHlwZS5hYT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5pc1Zpc2libGUoKSYmdGhpcy5pc0VuYWJsZWQoKSYmYS5nPT0xMyYmUmModGhpcyxhKT8oYS5qKCksYS52KCksITApOiExfTtpZih0eXBlb2YgTiE9PSJmdW5jdGlvbiIpdGhyb3cgRXJyb3IoIkludmFsaWQgY29tcG9uZW50IGNsYXNzICIrTik7aWYodHlwZW9mIE0hPT0iZnVuY3Rpb24iKXRocm93IEVycm9yKCJJbnZhbGlkIHJlbmRlcmVyIGNsYXNzICIrTSk7dmFyIFNjPW5hKE4pO3VjW1NjXT1NO3RjKCJnb29nLWNvbnRyb2wiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBOKG51bGwpfSk7dmFyIFY9ZnVuY3Rpb24oYSxiLGMpe0YuY2FsbCh0aGlzLGMpO3RoaXMuZWE9Ynx8dmMuVigpO3RoaXMuTD1hfHwidmVydGljYWwifTtuKFYsRik7Zz1WLnByb3RvdHlwZTtnLkthPW51bGw7Zy5kYT1udWxsO2cuZWE9bnVsbDtnLkw9bnVsbDtnLlM9ITA7Zy5UPSEwO2cubz0tMTtnLkI9bnVsbDtnLlc9ITE7Zy5PPW51bGw7dmFyIFRjPWZ1bmN0aW9uKGEpe3JldHVybiBhLkthfHxhLmkoKX07Zz1WLnByb3RvdHlwZTtnLm1hPWZ1bmN0aW9uKCl7dGhpcy5nPXRoaXMuRy5oKCJESVYiLHRoaXMuZWEuaih0aGlzKS5qb2luKCIgIikpfTtnLm5hPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaSgpfTtnLndhPWZ1bmN0aW9uKGEpe3JldHVybiBhLnRhZ05hbWU9PSJESVYifTtnLkVhPWZ1bmN0aW9uKGEpe3RoaXMuZz15Yyh0aGlzLmVhLHRoaXMsYSk7YS5zdHlsZS5kaXNwbGF5PT0ibm9uZSImJih0aGlzLlM9ITEpfTsKZy5JPWZ1bmN0aW9uKCl7Vi5sLkkuY2FsbCh0aGlzKTtUYih0aGlzLGZ1bmN0aW9uKGIpe2IucyYmVWModGhpcyxiKX0sdGhpcyk7dmFyIGE9dGhpcy5pKCk7QWModGhpcy5lYSx0aGlzKTtWYyh0aGlzLHRoaXMuUyk7QihCKEIoQihCKEIoQihCKFFiKHRoaXMpLHRoaXMsImVudGVyIix0aGlzLmViKSx0aGlzLCJoaWdobGlnaHQiLHRoaXMuZmIpLHRoaXMsInVuaGlnaGxpZ2h0Iix0aGlzLmxiKSx0aGlzLCJvcGVuIix0aGlzLmdiKSx0aGlzLCJjbG9zZSIsdGhpcy5iYiksYSxLLmdhLHRoaXMuV2EpLGJiKGEpLFtLLmhhLEsuZmFdLHRoaXMuY2IpLGEsW0suZ2EsSy5oYSxLLmZhLCJtb3VzZW92ZXIiLCJtb3VzZW91dCIsImNvbnRleHRtZW51Il0sdGhpcy5hYik7V2ModGhpcyl9O3ZhciBXYz1mdW5jdGlvbihhKXt2YXIgYj1RYihhKSxjPVRjKGEpO0IoQihCKGIsYywiZm9jdXMiLGEuUGEpLGMsImJsdXIiLGEuVWEpLGEuZGF8fChhLmRhPW5ldyBKKFRjKGEpKSksImtleSIsYS5WYSl9OwpnPVYucHJvdG90eXBlO2cuVT1mdW5jdGlvbigpe1hjKHRoaXMsLTEpO3RoaXMuQiYmT2ModGhpcy5CLCExKTt0aGlzLlc9ITE7Vi5sLlUuY2FsbCh0aGlzKX07Zy5DPWZ1bmN0aW9uKCl7Vi5sLkMuY2FsbCh0aGlzKTt0aGlzLmRhJiYodGhpcy5kYS5kaXNwb3NlKCksdGhpcy5kYT1udWxsKTt0aGlzLmVhPXRoaXMuQj10aGlzLk89dGhpcy5LYT1udWxsfTtnLmViPWZ1bmN0aW9uKCl7cmV0dXJuITB9OwpnLmZiPWZ1bmN0aW9uKGEpe3ZhciBiPVZiKHRoaXMsYS50YXJnZXQpO2lmKGI+LTEmJmIhPXRoaXMubyl7dmFyIGM9SSh0aGlzLHRoaXMubyk7YyYmUChjLCExKTt0aGlzLm89YjtjPUkodGhpcyx0aGlzLm8pO3RoaXMuVyYmTWMoYywhMCk7dGhpcy5CJiZjIT10aGlzLkImJihjLkQmNjQ/T2MoYywhMCk6T2ModGhpcy5CLCExKSl9Yj10aGlzLmkoKTtwKGIsIlRoZSBET00gZWxlbWVudCBmb3IgdGhlIGNvbnRhaW5lciBjYW5ub3QgYmUgbnVsbC4iKTthLnRhcmdldC5pKCkhPW51bGwmJmFjKGIsImFjdGl2ZWRlc2NlbmRhbnQiLGEudGFyZ2V0LmkoKS5pZCl9O2cubGI9ZnVuY3Rpb24oYSl7YS50YXJnZXQ9PUkodGhpcyx0aGlzLm8pJiYodGhpcy5vPS0xKTthPXRoaXMuaSgpO3AoYSwiVGhlIERPTSBlbGVtZW50IGZvciB0aGUgY29udGFpbmVyIGNhbm5vdCBiZSBudWxsLiIpO2EucmVtb3ZlQXR0cmlidXRlKCRiKCJhY3RpdmVkZXNjZW5kYW50IikpfTsKZy5nYj1mdW5jdGlvbihhKXsoYT1hLnRhcmdldCkmJmEhPXRoaXMuQiYmYS5oPT10aGlzJiYodGhpcy5CJiZPYyh0aGlzLkIsITEpLHRoaXMuQj1hKX07Zy5iYj1mdW5jdGlvbihhKXthLnRhcmdldD09dGhpcy5CJiYodGhpcy5CPW51bGwpO3ZhciBiPXRoaXMuaSgpLGM9YS50YXJnZXQuaSgpO2ImJmEudGFyZ2V0Lm0mMiYmYyYmKGE9IiIsYyYmKGE9Yy5pZCxwKGEsIlRoZSBhY3RpdmUgZWxlbWVudCBzaG91bGQgaGF2ZSBhbiBpZC4iKSksYWMoYiwiYWN0aXZlZGVzY2VuZGFudCIsYSkpfTtnLldhPWZ1bmN0aW9uKGEpe3RoaXMuVCYmKHRoaXMuVz0hMCk7dmFyIGI9VGModGhpcyk7YiYmZGIoYikmJmViKGIpP2IuZm9jdXMoKTphLmooKX07Zy5jYj1mdW5jdGlvbigpe3RoaXMuVz0hMX07CmcuYWI9ZnVuY3Rpb24oYSl7YTp7dmFyIGI9YS50YXJnZXQ7aWYodGhpcy5PKWZvcih2YXIgYz10aGlzLmkoKTtiJiZiIT09Yzspe3ZhciBkPWIuaWQ7aWYoZCBpbiB0aGlzLk8pe2I9dGhpcy5PW2RdO2JyZWFrIGF9Yj1iLnBhcmVudE5vZGV9Yj1udWxsfWlmKGIpc3dpdGNoKGEudHlwZSl7Y2FzZSBLLmdhOmIuc2EoYSk7YnJlYWs7Y2FzZSBLLmhhOmNhc2UgSy5mYTpiLnZhKGEpO2JyZWFrO2Nhc2UgIm1vdXNlb3ZlciI6Yi51YShhKTticmVhaztjYXNlICJtb3VzZW91dCI6Yi50YShhKTticmVhaztjYXNlICJjb250ZXh0bWVudSI6Yi5jYShhKX19O2cuUGE9ZnVuY3Rpb24oKXt9O2cuVWE9ZnVuY3Rpb24oKXtYYyh0aGlzLC0xKTt0aGlzLlc9ITE7dGhpcy5CJiZPYyh0aGlzLkIsITEpfTsKZy5WYT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5pc0VuYWJsZWQoKSYmdGhpcy5pc1Zpc2libGUoKSYmKEgodGhpcykhPTB8fHRoaXMuS2EpJiZZYyh0aGlzLGEpPyhhLmooKSxhLnYoKSwhMCk6ITF9Owp2YXIgWWM9ZnVuY3Rpb24oYSxiKXt2YXIgYz1JKGEsYS5vKTtpZihjJiZ0eXBlb2YgYy5hYT09ImZ1bmN0aW9uIiYmYy5hYShiKXx8YS5CJiZhLkIhPWMmJnR5cGVvZiBhLkIuYWE9PSJmdW5jdGlvbiImJmEuQi5hYShiKSlyZXR1cm4hMDtpZihiLnNoaWZ0S2V5fHxiLmN0cmxLZXl8fGIubWV0YUtleXx8Yi5hbHRLZXkpcmV0dXJuITE7c3dpdGNoKGIuZyl7Y2FzZSAyNzpUYyhhKS5ibHVyKCk7YnJlYWs7Y2FzZSAzNjpaYyhhKTticmVhaztjYXNlIDM1OiRjKGEpO2JyZWFrO2Nhc2UgMzg6aWYoYS5MPT0idmVydGljYWwiKWFkKGEpO2Vsc2UgcmV0dXJuITE7YnJlYWs7Y2FzZSAzNzppZihhLkw9PSJob3Jpem9udGFsIilVYihhKT9iZChhKTphZChhKTtlbHNlIHJldHVybiExO2JyZWFrO2Nhc2UgNDA6aWYoYS5MPT0idmVydGljYWwiKWJkKGEpO2Vsc2UgcmV0dXJuITE7YnJlYWs7Y2FzZSAzOTppZihhLkw9PSJob3Jpem9udGFsIilVYihhKT9hZChhKTpiZChhKTtlbHNlIHJldHVybiExOwpicmVhaztkZWZhdWx0OnJldHVybiExfXJldHVybiEwfSxVYz1mdW5jdGlvbihhLGIpe3ZhciBjPWIuaSgpO2M9Yy5pZHx8KGMuaWQ9T2IoYikpO2EuT3x8KGEuTz17fSk7YS5PW2NdPWJ9O1YucHJvdG90eXBlLkJhPWZ1bmN0aW9uKGEsYil7dWEoYSxOLCJUaGUgY2hpbGQgb2YgYSBjb250YWluZXIgbXVzdCBiZSBhIGNvbnRyb2wiKTtWLmwuQmEuY2FsbCh0aGlzLGEsYil9O1YucHJvdG90eXBlLkNhPWZ1bmN0aW9uKGEsYixjKXt1YShhLE4pO2EuUHw9MjthLlB8PTY0O1BjKGEsMzIsITEpO2EucyYmMCE9YS5IYSYmTGMoYSwhMSk7YS5IYT0hMTt2YXIgZD1hLmg9PXRoaXM/VmIodGhpcyxhKTotMTtWLmwuQ2EuY2FsbCh0aGlzLGEsYixjKTthLnMmJnRoaXMucyYmVWModGhpcyxhKTthPWQ7YT09LTEmJihhPUgodGhpcykpO2E9PXRoaXMubz90aGlzLm89TWF0aC5taW4oSCh0aGlzKS0xLGIpOmE+dGhpcy5vJiZiPD10aGlzLm8/dGhpcy5vKys6YTx0aGlzLm8mJmI+dGhpcy5vJiZ0aGlzLm8tLX07CnZhciB6Yz1mdW5jdGlvbihhLGIpe2lmKGEuaSgpKXRocm93IEVycm9yKCJDb21wb25lbnQgYWxyZWFkeSByZW5kZXJlZCIpO2EuTD1ifTtWLnByb3RvdHlwZS5pc1Zpc2libGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5TfTt2YXIgVmM9ZnVuY3Rpb24oYSxiKXthLlM9Yjt2YXIgYz1hLmkoKTtjJiYoYy5zdHlsZS5kaXNwbGF5PWI/IiI6Im5vbmUiLHdjKFRjKGEpLGEuVCYmYS5TKSl9O1YucHJvdG90eXBlLmlzRW5hYmxlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLlR9O1YucHJvdG90eXBlLlg9ZnVuY3Rpb24oYSl7dGhpcy5UIT1hJiZFKHRoaXMsYT8iZW5hYmxlIjoiZGlzYWJsZSIpJiYoYT8odGhpcy5UPSEwLFRiKHRoaXMsZnVuY3Rpb24oYil7Yi5UYT9kZWxldGUgYi5UYTpiLlgoITApfSkpOihUYih0aGlzLGZ1bmN0aW9uKGIpe2IuaXNFbmFibGVkKCk/Yi5YKCExKTpiLlRhPSEwfSksdGhpcy5XPXRoaXMuVD0hMSksd2MoVGModGhpcyksYSYmdGhpcy5TKSl9Owp2YXIgWGM9ZnVuY3Rpb24oYSxiKXsoYj1JKGEsYikpP1AoYiwhMCk6YS5vPi0xJiZQKEkoYSxhLm8pLCExKX0sWmM9ZnVuY3Rpb24oYSl7Y2QoYSxmdW5jdGlvbihiLGMpe3JldHVybihiKzEpJWN9LEgoYSktMSl9LCRjPWZ1bmN0aW9uKGEpe2NkKGEsZnVuY3Rpb24oYixjKXtiLS07cmV0dXJuIGI8MD9jLTE6Yn0sMCl9LGJkPWZ1bmN0aW9uKGEpe2NkKGEsZnVuY3Rpb24oYixjKXtyZXR1cm4oYisxKSVjfSxhLm8pfSxhZD1mdW5jdGlvbihhKXtjZChhLGZ1bmN0aW9uKGIsYyl7Yi0tO3JldHVybiBiPDA/Yy0xOmJ9LGEubyl9LGNkPWZ1bmN0aW9uKGEsYixjKXtjPWM8MD9WYihhLGEuQik6Yzt2YXIgZD1IKGEpO2M9Yi5jYWxsKGEsYyxkKTtmb3IodmFyIGU9MDtlPD1kOyl7dmFyIGY9SShhLGMpO2lmKGYmJmYuaXNWaXNpYmxlKCkmJmYuaXNFbmFibGVkKCkmJmYuRCYyKXthLkxhKGMpO2JyZWFrfWUrKztjPWIuY2FsbChhLGMsZCl9fTsKVi5wcm90b3R5cGUuTGE9ZnVuY3Rpb24oYSl7WGModGhpcyxhKX07dmFyIGRkPWZ1bmN0aW9uKCl7fTtuKGRkLE0pO2lhKGRkKTtnPWRkLnByb3RvdHlwZTtnLk49ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy10YWIifTtnLk5hPWZ1bmN0aW9uKCl7cmV0dXJuInRhYiJ9O2cueGE9ZnVuY3Rpb24oYSl7dmFyIGI9ZGQubC54YS5jYWxsKHRoaXMsYSk7KGE9YS5HYSgpKSYmdGhpcy5NYShiLGEpO3JldHVybiBifTtnLnlhPWZ1bmN0aW9uKGEsYil7Yj1kZC5sLnlhLmNhbGwodGhpcyxhLGIpO3ZhciBjPXRoaXMuR2EoYik7YyYmKGEuUmE9Yyk7YS5tJjgmJihjPWEuaCkmJnR5cGVvZiBjLko9PT0iZnVuY3Rpb24iJiYoVChhLDgsITEpLGMuSihhKSk7cmV0dXJuIGJ9O2cuR2E9ZnVuY3Rpb24oYSl7cmV0dXJuIGEudGl0bGV8fCIifTtnLk1hPWZ1bmN0aW9uKGEsYil7YSYmKGEudGl0bGU9Ynx8IiIpfTt2YXIgZWQ9ZnVuY3Rpb24oYSxiLGMpe04uY2FsbCh0aGlzLGEsYnx8ZGQuVigpLGMpO1BjKHRoaXMsOCwhMCk7dGhpcy5QfD05fTtuKGVkLE4pO2VkLnByb3RvdHlwZS5HYT1mdW5jdGlvbigpe3JldHVybiB0aGlzLlJhfTtlZC5wcm90b3R5cGUuTWE9ZnVuY3Rpb24oYSl7dGhpcy52Lk1hKHRoaXMuaSgpLGEpO3RoaXMuUmE9YX07dGMoImdvb2ctdGFiIixmdW5jdGlvbigpe3JldHVybiBuZXcgZWQobnVsbCl9KTt2YXIgVz1mdW5jdGlvbigpe3RoaXMuQT0idGFibGlzdCJ9O24oVyx2Yyk7aWEoVyk7Vy5wcm90b3R5cGUuZz1mdW5jdGlvbigpe3JldHVybiJnb29nLXRhYi1iYXIifTtXLnByb3RvdHlwZS51PWZ1bmN0aW9uKGEsYixjKXt0aGlzLnZ8fCh0aGlzLmh8fGZkKHRoaXMpLHRoaXMudj1FYSh0aGlzLmgpKTt2YXIgZD10aGlzLnZbYl07ZD8oemMoYSxnZChkKSksYS52PWQpOlcubC51LmNhbGwodGhpcyxhLGIsYyl9O1cucHJvdG90eXBlLmo9ZnVuY3Rpb24oYSl7dmFyIGI9Vy5sLmouY2FsbCh0aGlzLGEpO3RoaXMuaHx8ZmQodGhpcyk7Yi5wdXNoKHRoaXMuaFthLnZdKTtyZXR1cm4gYn07dmFyIGZkPWZ1bmN0aW9uKGEpe3ZhciBiPWEuZygpO2EuaD17dG9wOmIrIi10b3AiLGJvdHRvbTpiKyItYm90dG9tIixzdGFydDpiKyItc3RhcnQiLGVuZDpiKyItZW5kIn19O3ZhciBYPWZ1bmN0aW9uKGEsYixjKXthPWF8fCJ0b3AiO3pjKHRoaXMsZ2QoYSkpO3RoaXMudj1hO1YuY2FsbCh0aGlzLHRoaXMuTCxifHxXLlYoKSxjKTtoZCh0aGlzKX07bihYLFYpO2c9WC5wcm90b3R5cGU7Zy5IPW51bGw7Zy5JPWZ1bmN0aW9uKCl7WC5sLkkuY2FsbCh0aGlzKTtoZCh0aGlzKX07Zy5DPWZ1bmN0aW9uKCl7WC5sLkMuY2FsbCh0aGlzKTt0aGlzLkg9bnVsbH07Zy5MYT1mdW5jdGlvbihhKXtYLmwuTGEuY2FsbCh0aGlzLGEpO3RoaXMuSihJKHRoaXMsYSkpfTtnLko9ZnVuY3Rpb24oYSl7YT9OYyhhLCEwKTp0aGlzLkgmJk5jKHRoaXMuSCwhMSl9Owp2YXIgaWQ9ZnVuY3Rpb24oYSxiKXtpZihiJiZiPT1hLkgpe2Zvcih2YXIgYz1WYihhLGIpLGQ9Yy0xO2I9SShhLGQpO2QtLSl7dmFyIGU9YjtpZihlLmlzVmlzaWJsZSgpJiZlLmlzRW5hYmxlZCgpKXthLkooYik7cmV0dXJufX1mb3IoYys9MTtiPUkoYSxjKTtjKyspaWYoZD1iLGQuaXNWaXNpYmxlKCkmJmQuaXNFbmFibGVkKCkpe2EuSihiKTtyZXR1cm59YS5KKG51bGwpfX07Zz1YLnByb3RvdHlwZTtnLmpiPWZ1bmN0aW9uKGEpe3RoaXMuSCYmdGhpcy5IIT1hLnRhcmdldCYmTmModGhpcy5ILCExKTt0aGlzLkg9YS50YXJnZXR9O2cua2I9ZnVuY3Rpb24oYSl7YS50YXJnZXQ9PXRoaXMuSCYmKHRoaXMuSD1udWxsKX07Zy5oYj1mdW5jdGlvbihhKXtpZCh0aGlzLGEudGFyZ2V0KX07Zy5pYj1mdW5jdGlvbihhKXtpZCh0aGlzLGEudGFyZ2V0KX07Zy5QYT1mdW5jdGlvbigpe0kodGhpcyx0aGlzLm8pfHxYYyh0aGlzLFZiKHRoaXMsdGhpcy5IfHxJKHRoaXMsMCkpKX07CnZhciBoZD1mdW5jdGlvbihhKXtCKEIoQihCKFFiKGEpLGEsInNlbGVjdCIsYS5qYiksYSwidW5zZWxlY3QiLGEua2IpLGEsImRpc2FibGUiLGEuaGIpLGEsImhpZGUiLGEuaWIpfSxnZD1mdW5jdGlvbihhKXtyZXR1cm4gYT09InN0YXJ0Inx8YT09ImVuZCI/InZlcnRpY2FsIjoiaG9yaXpvbnRhbCJ9O3RjKCJnb29nLXRhYi1iYXIiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBYfSk7ZnVuY3Rpb24gamQoYSl7dmFyIGI9e3RvcDoiYm90dG9tIixib3R0b206InRvcCIsc3RhcnQ6InJpZ2h0IixlbmQ6ImxlZnQifVthLmxvY2F0aW9uXSxjPWEuZWxlbWVudElkLGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTtkLnRleHRDb250ZW50PSJcbiAgICBmaWVsZHNldCB7XG4gICAgICBwYWRkaW5nOiAxMHB4O1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgIzM2OTtcbiAgICB9XG5cbiAgICAjIitjKyIgLmdvb2ctdGFiLWNvbnRlbnQge1xuICAgICAgbWluLWhlaWdodDogM2VtO1xuICAgICAgbWFyZ2luOiAwO1xuICAgICAgYm9yZGVyOiAiK2EuYm9yZGVyKyIgc29saWQgIithLmJvcmRlckNvbG9yKyI7XG4gICAgICBib3JkZXItdG9wOiAwO1xuICAgICAgaGVpZ2h0OiAiK2EuY29udGVudEhlaWdodCsiO1xuICAgICAgcGFkZGluZzogNHB4IDhweDtcbiAgICAgIG1hcmdpbi1yaWdodDogNHB4O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgIG92ZXJmbG93OiBhdXRvO1xuICAgIH1cblxuICAgICMiKwpjKyIgLmdvb2ctdGFiLWJhci0iK2EubG9jYXRpb24rIiAuZ29vZy10YWItc2VsZWN0ZWQge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICIrYS5ib3JkZXJDb2xvcisiO1xuICAgICAgYm9yZGVyLSIrYisiOiAwcHg7XG4gICAgfVxuXG4gICAgIyIrYysiIC5nb29nLXRhYi1iYXItIithLmxvY2F0aW9uKyIge1xuICAgICAgcGFkZGluZy0iK2EubG9jYXRpb24rIjogNXB4ICFpbXBvcnRhbnQ7XG4gICAgICBib3JkZXItIitiKyI6IDFweCBzb2xpZCAiK2EuYm9yZGVyQ29sb3IrIiAhaW1wb3J0YW50O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICB9XG5cbiAgICAjIitjKyIgLmdvb2ctdGFiLWJhciB7XG4gICAgICAgbWFyZ2luOiAwO1xuICAgICAgIGJvcmRlcjogMDtcbiAgICAgICBwYWRkaW5nOiAwO1xuICAgICAgIGxpc3Qtc3R5bGU6IG5vbmU7XG4gICAgICAgY3Vyc29yOiBkZWZhdWx0O1xuICAgICAgIG91dGxpbmU6IG5vbmU7XG4gICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgICBtYXJnaW4tcmlnaHQ6IDRweDtcbiAgICAgIH1cblxuICAgICAjIisKYysiIC5nb29nLXRhYiB7XG4gICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgIHBhZGRpbmc6IDRweCA4cHg7XG4gICAgICAgY29sb3I6IHZhcigtLWNvbGFiLXByaW1hcnktdGV4dC1jb2xvcik7XG4gICAgICAgdGV4dC1kZWNvcmF0aW9uOiBpbml0aWFsO1xuICAgICAgIGN1cnNvcjogZGVmYXVsdDtcbiAgICAgIH1cblxuICAgICAgIyIrYysiIC5nb29nLXRhYi1ob3ZlciB7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWNvbGFiLWhpZ2hsaWdodGVkLXN1cmZhY2UtY29sb3IpO1xuICAgICAgfVxuICAgICAgIjtyZXR1cm4gZH0KdmFyIGtkPWZ1bmN0aW9uKGEpe3ZhciBiPWEuZWxlbWVudElkLGM9YS50YWJOYW1lcyxkPWEuc2VsZWN0ZWRJbmRleDsiY29udGVudEJvcmRlciJpbiBhfHwoYS5jb250ZW50Qm9yZGVyPSIwcHgiKTsiY29udGVudEhlaWdodCJpbiBhfHwoYS5jb250ZW50SGVpZ2h0PSJpbml0aWFsIik7ImJvcmRlckNvbG9yImluIGF8fChhLmJvcmRlckNvbG9yPSJ2YXIoLS1jb2xhYi1ib3JkZXItY29sb3IpIik7YS5sb2NhdGlvbnx8KGEubG9jYXRpb249InRvcCIpO3ZhciBlPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiMiK2IpLGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zi5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYi1iYXIiKTt2YXIgaD1hLmxvY2F0aW9uO2YuY2xhc3NMaXN0LmFkZCgiZ29vZy10YWItYmFyLSIraCk7Zm9yKHZhciBrPVtdLHE9ZmEoYyksRz1xLm5leHQoKTshRy5kb25lO0c9cS5uZXh0KCkpe0c9Ry52YWx1ZTt2YXIgeD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKeC5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYiIpO3gudGV4dENvbnRlbnQ9RztmLmFwcGVuZENoaWxkKHgpO2sucHVzaCh4KX1oIT0iYm90dG9tIiYmZS5hcHBlbmRDaGlsZChmKTtxPW51bGw7aWYoaD09InRvcCJ8fGg9PSJib3R0b20iKXE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikscS5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYi1iYXItY2xlYXIiKTtoPT0idG9wIiYmcSYmZS5hcHBlbmRDaGlsZChxKTtHPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO0cuY2xhc3NMaXN0LmFkZCgiZ29vZy10YWItY29udGVudCIpO3ZhciBoYT1bXTtjPWZhKGMpO2Zvcih4PWMubmV4dCgpOyF4LmRvbmU7eD1jLm5leHQoKSl4PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHguaWQ9ZS5pZCsiX2NvbnRlbnRfIitoYS5sZW5ndGgseC5zdHlsZS5kaXNwbGF5PSJub25lIixHLmFwcGVuZENoaWxkKHgpLGhhLnB1c2goeCk7ZS5hcHBlbmRDaGlsZChHKTtoPT0iYm90dG9tIiYmKHEmJgplLmFwcGVuZENoaWxkKHEpLGUuYXBwZW5kQ2hpbGQoZikpO3ZhciBRPW5ldyBYKGgpO1NiKFEsZik7dmFyIFI9LTE7d2IoUSwic2VsZWN0IixmdW5jdGlvbihTKXtTPWsuaW5kZXhPZihTLnRhcmdldC5pKCkpO1MhPVImJihSPj0wJiZSPGhhLmxlbmd0aCYmKGhhW1JdLnN0eWxlLmRpc3BsYXk9Im5vbmUiLFI9LTEpLFM+PTAmJlM8aGEubGVuZ3RoJiYoUj1TLGhhW1JdLnN0eWxlLmRpc3BsYXk9ImlubGluZSIsd2luZG93LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCJyZXNpemUiKSksZ29vZ2xlLmNvbGFiLm91dHB1dC5yZXNpemVJZnJhbWVUb0NvbnRlbnQoKSksUS5KKEkoUSxSKSkpfSk7US5KKEkoUSxkKSk7d2luZG93W2JdPXtzZXRTZWxlY3RlZFRhYkluZGV4OmZ1bmN0aW9uKFMpe1EuSihJKFEsUykpfX07ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChqZChhKSl9LGxkPVsiY29sYWJfbGliIiwiY3JlYXRlVGFiQmFyIl0sWT1sOwpsZFswXWluIFl8fHR5cGVvZiBZLmV4ZWNTY3JpcHQ9PSJ1bmRlZmluZWQifHxZLmV4ZWNTY3JpcHQoInZhciAiK2xkWzBdKTtmb3IodmFyIFo7bGQubGVuZ3RoJiYoWj1sZC5zaGlmdCgpKTspbGQubGVuZ3RofHxrZD09PXZvaWQgMD9ZW1pdJiZZW1pdIT09T2JqZWN0LnByb3RvdHlwZVtaXT9ZPVlbWl06WT1ZW1pdPXt9OllbWl09a2Q7fSkuY2FsbCh0aGlzKTsKLy8gY2xhbmctZm9ybWF0IG9uCg==", + "ok": true, + "headers": [ + [ + "content-length", + "41785" + ], + [ + "content-type", + "application/javascript" + ] + ], + "status": 200, + "status_text": "" + } + }, + "base_uri": "https://localhost:8080/", + "height": 260 + }, + "outputId": "9fcf8c80-873f-41b0-dac3-da365138d35c" + }, + "source": [ + "%%logica EmployeeRole, ToolUsed, UsesTool, UsersOfTool\n", + "\n", + "Employee(name: \"Alice\", role: \"Product Manager\", office: \"SEA\");\n", + "Employee(name: \"Bob\", role: \"Engineer\", office: \"SEA\");\n", + "Employee(name: \"Caroline\", role: \"Engineer\", office: \"LAX\");\n", + "Employee(name: \"David\", role: \"Data Scientist\", office: \"LAX\");\n", + "Employee(name: \"Eve\", role: \"Data Scientist\", office: \"SEA\");\n", + "\n", + "RoleFullName(\"Product Manager\") = \"Product Manager\";\n", + "RoleFullName(\"Engineer\") = \"Software Engineer\";\n", + "RoleFullName(\"Data Scientist\") = \"Statistician\";\n", + "\n", + "EmployeeRole(name:, role_full_name: RoleFullName(role)) :- Employee(name:, role:);\n", + "\n", + "ToolUsed(\"Product Manager\") = \"spreadsheet\";\n", + "ToolUsed(\"Engineer\") = \"cloud\";\n", + "ToolUsed(\"Engineer\") = \"python\";\n", + "ToolUsed(\"Data Scientist\") = \"spreadsheet\";\n", + "ToolUsed(\"Data Scientist\") = \"python\";\n", + "\n", + "UsesTool(name:, tool: ToolUsed(role)) :- Employee(name:, role:);\n", + "\n", + "UsersOfTool(tool:) List= name :- UsesTool(name:, tool:);" + ], + "execution_count": 27, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"291766ae-d22d-11ef-a7c0-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id53\", \"tabNames\": [\"EmployeeRole\", \"ToolUsed\", \"UsesTool\", \"UsersOfTool\", \"(Log)\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_afe0a65ec8" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"2917d986-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id53\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_2ea3657878" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"2919eda2-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_905c87d242" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"291a4374-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id53_content_4\");\n", + "//# sourceURL=js_3a25a80110" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"291aecca-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"291a4374-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_f1eb3c0e99" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"291b5ebc-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id53\"].setSelectedTabIndex(4);\n", + "//# sourceURL=js_4ccaa014f5" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"291f2132-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"2919eda2-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_4cb1595d5d" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"2921bad2-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_db9588f5d7" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"292238e0-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id53_content_0\");\n", + "//# sourceURL=js_042a859d4b" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"29229894-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"292238e0-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_7020d39948" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"2922f3fc-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id53\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_890cf6f0ef" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"2925c55a-d22d-11ef-a7c0-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id54\", \"tabNames\": [\"SQL\", \"Result\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_a4b066d62f" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"2926d832-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id54\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_08daa6adb5" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"2928c7b4-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_640f077e81" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"2929383e-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id54_content_0\");\n", + "//# sourceURL=js_41f000e666" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"29298096-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"2929383e-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_d2a9f879ec" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"2929e748-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id54\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_6c08b79083" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The following query is stored at \u001b[1mEmployeeRole_sql\u001b[0m variable.\n", + "-- Initializing DuckDB environment.\n", + "create schema if not exists logica_home;\n", + "-- Empty record, has to have a field by DuckDB syntax.\n", + "drop type if exists logicarecord893574736 cascade; create type logicarecord893574736 as struct(nirvana numeric);\n", + "create sequence if not exists eternal_logical_sequence;\n", + "\n", + "\n", + "-- Logica type: logicarecord481217614\n", + "drop type if exists logicarecord481217614 cascade; create type logicarecord481217614 as struct(r logicarecord893574736);\n", + "\n", + "-- Logica type: logicarecord383307722\n", + "drop type if exists logicarecord383307722 cascade; create type logicarecord383307722 as struct(a timestamp);\n", + "WITH t_0_Employee AS (SELECT * FROM (\n", + " \n", + " SELECT\n", + " 'Alice' AS name,\n", + " 'Product Manager' AS role,\n", + " 'SEA' AS office\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " 'Bob' AS name,\n", + " 'Engineer' AS role,\n", + " 'SEA' AS office\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " 'Caroline' AS name,\n", + " 'Engineer' AS role,\n", + " 'LAX' AS office\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " 'David' AS name,\n", + " 'Data Scientist' AS role,\n", + " 'LAX' AS office\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " 'Eve' AS name,\n", + " 'Data Scientist' AS role,\n", + " 'SEA' AS office\n", + " \n", + ") AS UNUSED_TABLE_NAME ),\n", + "t_1_RoleFullName AS (SELECT * FROM (\n", + " \n", + " SELECT\n", + " 'Product Manager' AS col0,\n", + " 'Product Manager' AS logica_value\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " 'Engineer' AS col0,\n", + " 'Software Engineer' AS logica_value\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " 'Data Scientist' AS col0,\n", + " 'Statistician' AS logica_value\n", + " \n", + ") AS UNUSED_TABLE_NAME )\n", + "SELECT\n", + " Employee.name AS name,\n", + " RoleFullName.logica_value AS role_full_name\n", + "FROM\n", + " t_0_Employee AS Employee, t_1_RoleFullName AS RoleFullName\n", + "WHERE\n", + " (RoleFullName.col0 = Employee.role);\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"292b656e-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"2928c7b4-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_5080e85b22" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"292d7868-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_5715d3eb82" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"292dd0f6-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id54_content_1\");\n", + "//# sourceURL=js_2926c43f22" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"292e18a4-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"292dd0f6-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_311a3ef551" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"292e7b32-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id54\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_6773f7df32" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The following table is stored at \u001b[1mEmployeeRole\u001b[0m variable.\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
namerole_full_name
0AliceProduct Manager
1BobSoftware Engineer
2CarolineSoftware Engineer
3DavidStatistician
4EveStatistician
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"29302e96-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"292d7868-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_81c6f6daf2" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"2935763a-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"2921bad2-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_6f80273f08" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"2939454e-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_f09fea907d" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"29399ee0-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id53_content_4\");\n", + "//# sourceURL=js_819a512452" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"2939fd18-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"29399ee0-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_46dce83fca" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"293a64a6-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id53\"].setSelectedTabIndex(4);\n", + "//# sourceURL=js_92e4e69604" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"293c7340-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"2939454e-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_d6df4e11e7" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"293fb0a0-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_79b5f2b1cb" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"29409588-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id53_content_1\");\n", + "//# sourceURL=js_64c6146d50" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"2940f53c-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"29409588-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_ec128867e3" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"2941ceda-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id53\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_80a49638a6" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"2943c140-d22d-11ef-a7c0-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id55\", \"tabNames\": [\"SQL\", \"Result\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_f74e94c6e2" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"29442392-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id55\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_e4fb4ec20c" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"29459cae-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_2d7923d60b" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"2945f24e-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id55_content_0\");\n", + "//# sourceURL=js_5934a7c17e" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"29463f4c-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"2945f24e-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_7c2e94359b" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"29469244-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id55\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_1b35cb4f61" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The following query is stored at \u001b[1mToolUsed_sql\u001b[0m variable.\n", + "-- Initializing DuckDB environment.\n", + "create schema if not exists logica_home;\n", + "-- Empty record, has to have a field by DuckDB syntax.\n", + "drop type if exists logicarecord893574736 cascade; create type logicarecord893574736 as struct(nirvana numeric);\n", + "create sequence if not exists eternal_logical_sequence;\n", + "\n", + "\n", + "-- Logica type: logicarecord481217614\n", + "drop type if exists logicarecord481217614 cascade; create type logicarecord481217614 as struct(r logicarecord893574736);\n", + "\n", + "-- Logica type: logicarecord383307722\n", + "drop type if exists logicarecord383307722 cascade; create type logicarecord383307722 as struct(a timestamp);\n", + "SELECT * FROM (\n", + " \n", + " SELECT\n", + " 'Product Manager' AS col0,\n", + " 'spreadsheet' AS logica_value\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " 'Engineer' AS col0,\n", + " 'cloud' AS logica_value\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " 'Engineer' AS col0,\n", + " 'python' AS logica_value\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " 'Data Scientist' AS col0,\n", + " 'spreadsheet' AS logica_value\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " 'Data Scientist' AS col0,\n", + " 'python' AS logica_value\n", + " \n", + ") AS UNUSED_TABLE_NAME ;\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"2947af44-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"29459cae-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_9775ce4278" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"2949e7c8-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_3375061f19" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"294a3a2a-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id55_content_1\");\n", + "//# sourceURL=js_bc17b07dc6" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"294a7bac-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"294a3a2a-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_3c4038d99d" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"294ac3f0-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id55\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_e0dd809139" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The following table is stored at \u001b[1mToolUsed\u001b[0m variable.\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
col0logica_value
0Product Managerspreadsheet
1Engineercloud
2Engineerpython
3Data Scientistspreadsheet
4Data Scientistpython
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"294c4a86-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"2949e7c8-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_99a601e05a" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"294deff8-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"293fb0a0-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_71687ea148" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"294fb766-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_b6ccf0b33b" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"2950a4d2-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id53_content_4\");\n", + "//# sourceURL=js_8880f0cbf1" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"2950fe46-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"2950a4d2-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_80233a0ecd" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"29514ff4-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id53\"].setSelectedTabIndex(4);\n", + "//# sourceURL=js_b82a902aa8" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"295a2fde-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"294fb766-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_5afae5a737" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"295c5a66-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_3a5a69cdaa" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"295ca214-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id53_content_2\");\n", + "//# sourceURL=js_d6f069aa2b" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"295cf408-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"295ca214-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_0fe23d6fd1" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"295d4462-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id53\"].setSelectedTabIndex(2);\n", + "//# sourceURL=js_5c4c7c45a9" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"295f5e78-d22d-11ef-a7c0-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id56\", \"tabNames\": [\"SQL\", \"Result\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_3bdb17bd4c" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"295fb72e-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id56\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_c12054a6bd" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"29612bea-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_9a0730c7b0" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"29617afa-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id56_content_0\");\n", + "//# sourceURL=js_37465a0da5" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"2961c050-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"29617afa-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_113e5b7adf" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"2962144c-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id56\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_b135c07705" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The following query is stored at \u001b[1mUsesTool_sql\u001b[0m variable.\n", + "-- Initializing DuckDB environment.\n", + "create schema if not exists logica_home;\n", + "-- Empty record, has to have a field by DuckDB syntax.\n", + "drop type if exists logicarecord893574736 cascade; create type logicarecord893574736 as struct(nirvana numeric);\n", + "create sequence if not exists eternal_logical_sequence;\n", + "\n", + "\n", + "-- Logica type: logicarecord481217614\n", + "drop type if exists logicarecord481217614 cascade; create type logicarecord481217614 as struct(r logicarecord893574736);\n", + "\n", + "-- Logica type: logicarecord383307722\n", + "drop type if exists logicarecord383307722 cascade; create type logicarecord383307722 as struct(a timestamp);\n", + "WITH t_0_Employee AS (SELECT * FROM (\n", + " \n", + " SELECT\n", + " 'Alice' AS name,\n", + " 'Product Manager' AS role,\n", + " 'SEA' AS office\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " 'Bob' AS name,\n", + " 'Engineer' AS role,\n", + " 'SEA' AS office\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " 'Caroline' AS name,\n", + " 'Engineer' AS role,\n", + " 'LAX' AS office\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " 'David' AS name,\n", + " 'Data Scientist' AS role,\n", + " 'LAX' AS office\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " 'Eve' AS name,\n", + " 'Data Scientist' AS role,\n", + " 'SEA' AS office\n", + " \n", + ") AS UNUSED_TABLE_NAME ),\n", + "t_1_ToolUsed AS (SELECT * FROM (\n", + " \n", + " SELECT\n", + " 'Product Manager' AS col0,\n", + " 'spreadsheet' AS logica_value\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " 'Engineer' AS col0,\n", + " 'cloud' AS logica_value\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " 'Engineer' AS col0,\n", + " 'python' AS logica_value\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " 'Data Scientist' AS col0,\n", + " 'spreadsheet' AS logica_value\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " 'Data Scientist' AS col0,\n", + " 'python' AS logica_value\n", + " \n", + ") AS UNUSED_TABLE_NAME )\n", + "SELECT\n", + " Employee.name AS name,\n", + " ToolUsed.logica_value AS tool\n", + "FROM\n", + " t_0_Employee AS Employee, t_1_ToolUsed AS ToolUsed\n", + "WHERE\n", + " (ToolUsed.col0 = Employee.role);\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"2963c954-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"29612bea-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_678f0e9ecd" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"2965df28-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_6d6c8cba12" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"296673de-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id56_content_1\");\n", + "//# sourceURL=js_da27d7ea9e" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"296e7a20-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"296673de-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_e1b987185a" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"296f43c4-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id56\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_4e90a2aec7" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The following table is stored at \u001b[1mUsesTool\u001b[0m variable.\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
nametool
0Alicespreadsheet
1Bobpython
2Bobcloud
3Carolinepython
4Carolinecloud
5Davidpython
6Davidspreadsheet
7Evepython
8Evespreadsheet
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"2971ec6e-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"2965df28-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_42b31de447" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"2974caec-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"295c5a66-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_1623ac6275" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"297847f8-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_e1bf6e395c" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"2978b97c-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id53_content_4\");\n", + "//# sourceURL=js_8fdd20b384" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"29793604-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"2978b97c-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_90eb9fbdf6" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"2979b340-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id53\"].setSelectedTabIndex(4);\n", + "//# sourceURL=js_db013f2a58" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"29818f20-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"297847f8-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_53d5020a98" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"2985458e-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_24c272e2e5" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"2985c658-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id53_content_3\");\n", + "//# sourceURL=js_424c371e58" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"29863674-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"2985c658-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_89af71b7e5" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"2986a30c-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id53\"].setSelectedTabIndex(3);\n", + "//# sourceURL=js_ce26c7d146" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"2988e9f0-d22d-11ef-a7c0-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id57\", \"tabNames\": [\"SQL\", \"Result\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_9e9f9e3118" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"29894c74-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id57\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_27b46c8c1a" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"298b3778-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_cdf16de7e8" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"298ba67c-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id57_content_0\");\n", + "//# sourceURL=js_f52d4355b0" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"298c2926-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"298ba67c-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_ca32d8ab0b" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"298c7e30-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id57\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_cd4fb54e98" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The following query is stored at \u001b[1mUsersOfTool_sql\u001b[0m variable.\n", + "-- Initializing DuckDB environment.\n", + "create schema if not exists logica_home;\n", + "-- Empty record, has to have a field by DuckDB syntax.\n", + "drop type if exists logicarecord893574736 cascade; create type logicarecord893574736 as struct(nirvana numeric);\n", + "create sequence if not exists eternal_logical_sequence;\n", + "\n", + "\n", + "-- Logica type: logicarecord481217614\n", + "drop type if exists logicarecord481217614 cascade; create type logicarecord481217614 as struct(r logicarecord893574736);\n", + "\n", + "-- Logica type: logicarecord383307722\n", + "drop type if exists logicarecord383307722 cascade; create type logicarecord383307722 as struct(a timestamp);\n", + "WITH t_0_Employee AS (SELECT * FROM (\n", + " \n", + " SELECT\n", + " 'Alice' AS name,\n", + " 'Product Manager' AS role,\n", + " 'SEA' AS office\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " 'Bob' AS name,\n", + " 'Engineer' AS role,\n", + " 'SEA' AS office\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " 'Caroline' AS name,\n", + " 'Engineer' AS role,\n", + " 'LAX' AS office\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " 'David' AS name,\n", + " 'Data Scientist' AS role,\n", + " 'LAX' AS office\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " 'Eve' AS name,\n", + " 'Data Scientist' AS role,\n", + " 'SEA' AS office\n", + " \n", + ") AS UNUSED_TABLE_NAME ),\n", + "t_1_ToolUsed AS (SELECT * FROM (\n", + " \n", + " SELECT\n", + " 'Product Manager' AS col0,\n", + " 'spreadsheet' AS logica_value\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " 'Engineer' AS col0,\n", + " 'cloud' AS logica_value\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " 'Engineer' AS col0,\n", + " 'python' AS logica_value\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " 'Data Scientist' AS col0,\n", + " 'spreadsheet' AS logica_value\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " 'Data Scientist' AS col0,\n", + " 'python' AS logica_value\n", + " \n", + ") AS UNUSED_TABLE_NAME )\n", + "SELECT\n", + " ToolUsed.logica_value AS tool,\n", + " ARRAY_AGG(Employee.name) AS logica_value\n", + "FROM\n", + " t_0_Employee AS Employee, t_1_ToolUsed AS ToolUsed\n", + "WHERE\n", + " (ToolUsed.col0 = Employee.role)\n", + "GROUP BY ToolUsed.logica_value;\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"298e3860-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"298b3778-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_1c3d6f7eb3" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"29904650-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_ef63898445" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"29909b32-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id57_content_1\");\n", + "//# sourceURL=js_9f177b6876" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"2990ddfe-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"29909b32-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_6d0d8a2bce" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"29912296-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id57\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_a62ee33d8d" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The following table is stored at \u001b[1mUsersOfTool\u001b[0m variable.\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
toollogica_value
0cloud[Bob, Caroline]
1spreadsheet[Alice, David, Eve]
2python[Bob, Caroline, David, Eve]
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"29931be6-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"29904650-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_8fa52649fc" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"2994b492-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"2985458e-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_b0c896f3e1" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"29966ae4-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_43d51c5490" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"2996b74c-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id53_content_4\");\n", + "//# sourceURL=js_b4146d8872" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"299708dc-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"2996b74c-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_f9c9a817bb" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"299767be-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id53\"].setSelectedTabIndex(4);\n", + "//# sourceURL=js_61bde6ff85" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "image/svg+xml": "\n\n\n\n\n\nConcertina\n\n\n\nToolUsed\n\nToolUsed\n\n\n\nUsesTool\n\nUsesTool\n\n\n\nUsersOfTool\n\nUsersOfTool\n\n\n\nEmployeeRole\n\nEmployeeRole\n\n\n\n", + "text/plain": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Running predicate: ToolUsed (5 ms)\n", + "Running predicate: UsesTool (8 ms)\n", + "Running predicate: UsersOfTool (9 ms)\n", + "Running predicate: EmployeeRole (6 ms)\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"29c828d6-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"29966ae4-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_f6ebdc16ac" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"29cbf5f6-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_266a49b9db" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"29cc56c2-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id53_content_0\");\n", + "//# sourceURL=js_07e4d0ccc7" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"29ccb9e6-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"29cc56c2-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_d242593b8e" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"29cd1dfa-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id53\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_f741e21c96" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"29cf505c-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_557b6f87df" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"29cfad2c-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id54_content_1\");\n", + "//# sourceURL=js_3ddf676a3a" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"29d0624e-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"29cfad2c-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_a069049b1f" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"29d0dd8c-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id54\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_79d081e11f" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"29d42686-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"29cf505c-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_4352872da9" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + " \n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"29d63c78-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"29cbf5f6-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_954a4eb759" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"29d91736-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_5bd2e834a0" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"29d966a0-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id53_content_1\");\n", + "//# sourceURL=js_f8f571bfd6" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"29d9d7a2-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"29d966a0-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_2ba22067bc" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"29da7ee6-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id53\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_443f1e8f68" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"29dcf5d6-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_da9ac440e5" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"29dd6728-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id55_content_1\");\n", + "//# sourceURL=js_4a4e8a2b02" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"29ddcfb0-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"29dd6728-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_c93be22754" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"29de36b2-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id55\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_d795777528" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"29e097a4-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"29dcf5d6-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_194e0fcb5c" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + " \n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"29e33626-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"29d91736-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_6640b7cb23" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"29e5d070-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_7b57f914e4" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"29e6ca7a-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id53_content_2\");\n", + "//# sourceURL=js_9f8488d139" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"29e722fe-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"29e6ca7a-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_4c7e3527ad" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"29e76912-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id53\"].setSelectedTabIndex(2);\n", + "//# sourceURL=js_31da9863dc" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"29e8f520-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_24ce3d32e2" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"29e95d1c-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id56_content_1\");\n", + "//# sourceURL=js_a6aadf6f33" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"29e9a830-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"29e95d1c-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_0042aba68b" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"29e9f20e-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id56\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_1297a1ef72" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"29eb898e-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"29e8f520-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_8d1656d721" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + " \n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"29edc5be-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"29e5d070-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_259e90cc68" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"29f07106-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_799c91040c" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"29f0d466-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id53_content_3\");\n", + "//# sourceURL=js_b4eca91239" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"29f15486-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"29f0d466-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_3027646f83" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"29f1b8a4-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id53\"].setSelectedTabIndex(3);\n", + "//# sourceURL=js_950778b1d1" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"29f3a722-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_addfad41ec" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"29f3f4de-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id57_content_1\");\n", + "//# sourceURL=js_04dda61d28" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"29f499e8-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"29f3f4de-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_40115ef23d" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"29f4eb32-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id57\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_5bc61b7f40" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"29f6bc1e-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"29f3a722-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_2f1dc46ae2" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + " \n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"29f887ec-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"29f07106-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_d59fdfc560" + ] + }, + "metadata": {} + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "b5O9U_bAhEo1" + }, + "source": [ + "## Example: Popular Baby Names\n", + "\n", + "Here we use Logica to compute most popular baby name by year and plot the popularity of these most popular names over time." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "ICf5qvL_hHkL", + "colab": { + "resources": { + "http://localhost:8080/nbextensions/google.colab/tabbar.css": { + "data": "Lmdvb2ctdGFie3Bvc2l0aW9uOnJlbGF0aXZlO3BhZGRpbmc6NHB4IDhweDtjb2xvcjojMDBjO3RleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7Y3Vyc29yOmRlZmF1bHR9Lmdvb2ctdGFiLWJhci10b3AgLmdvb2ctdGFie21hcmdpbjoxcHggNHB4IDAgMDtib3JkZXItYm90dG9tOjA7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLXRvcDphZnRlciwuZ29vZy10YWItYmFyLWJvdHRvbTphZnRlcntjb250ZW50OiIgIjtkaXNwbGF5OmJsb2NrO2hlaWdodDowO2NsZWFyOmJvdGg7dmlzaWJpbGl0eTpoaWRkZW59Lmdvb2ctdGFiLWJhci1ib3R0b20gLmdvb2ctdGFie21hcmdpbjowIDRweCAxcHggMDtib3JkZXItdG9wOjA7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLXN0YXJ0IC5nb29nLXRhYnttYXJnaW46MCAwIDRweCAxcHg7Ym9yZGVyLXJpZ2h0OjB9Lmdvb2ctdGFiLWJhci1lbmQgLmdvb2ctdGFie21hcmdpbjowIDFweCA0cHggMDtib3JkZXItbGVmdDowfS5nb29nLXRhYi1ob3ZlcntiYWNrZ3JvdW5kOiNlZWV9Lmdvb2ctdGFiLWRpc2FibGVke2NvbG9yOiM2NjZ9Lmdvb2ctdGFiLXNlbGVjdGVke2NvbG9yOiMwMDA7YmFja2dyb3VuZDojZmZmO3RleHQtZGVjb3JhdGlvbjpub25lO2ZvbnQtd2VpZ2h0OmJvbGQ7Ym9yZGVyOjFweCBzb2xpZCAjNmI5MGRhfS5nb29nLXRhYi1iYXItdG9we3BhZGRpbmctdG9wOjVweCFpbXBvcnRhbnQ7cGFkZGluZy1sZWZ0OjVweCFpbXBvcnRhbnQ7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgIzZiOTBkYSFpbXBvcnRhbnR9Lmdvb2ctdGFiLWJhci10b3AgLmdvb2ctdGFiLXNlbGVjdGVke3RvcDoxcHg7bWFyZ2luLXRvcDowO3BhZGRpbmctYm90dG9tOjVweH0uZ29vZy10YWItYmFyLWJvdHRvbSAuZ29vZy10YWItc2VsZWN0ZWR7dG9wOi0xcHg7bWFyZ2luLWJvdHRvbTowO3BhZGRpbmctdG9wOjVweH0uZ29vZy10YWItYmFyLXN0YXJ0IC5nb29nLXRhYi1zZWxlY3RlZHtsZWZ0OjFweDttYXJnaW4tbGVmdDowO3BhZGRpbmctcmlnaHQ6OXB4fS5nb29nLXRhYi1iYXItZW5kIC5nb29nLXRhYi1zZWxlY3RlZHtsZWZ0Oi0xcHg7bWFyZ2luLXJpZ2h0OjA7cGFkZGluZy1sZWZ0OjlweH0uZ29vZy10YWItYmFye21hcmdpbjowO2JvcmRlcjowO3BhZGRpbmc6MDtsaXN0LXN0eWxlOm5vbmU7Y3Vyc29yOmRlZmF1bHQ7b3V0bGluZTpub25lO2JhY2tncm91bmQ6I2ViZWZmOX0uZ29vZy10YWItYmFyLWNsZWFye2NsZWFyOmJvdGg7aGVpZ2h0OjA7b3ZlcmZsb3c6aGlkZGVufS5nb29nLXRhYi1iYXItc3RhcnR7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLWVuZHtmbG9hdDpyaWdodH0qIGh0bWwgLmdvb2ctdGFiLWJhci1zdGFydHttYXJnaW4tcmlnaHQ6LTNweH0qIGh0bWwgLmdvb2ctdGFiLWJhci1lbmR7bWFyZ2luLWxlZnQ6LTNweH1zZW50aW5lbHt9", + "ok": true, + "headers": [ + [ + "content-length", + "1404" + ], + [ + "content-type", + "text/css" + ] + ], + "status": 200, + "status_text": "" + }, + "http://localhost:8080/nbextensions/google.colab/tabbar_main.min.js": { + "data": "Ly8gY2xhbmctZm9ybWF0IG9mZgooZnVuY3Rpb24oKXt2YXIgZyxhYT1mdW5jdGlvbihhKXt2YXIgYj0wO3JldHVybiBmdW5jdGlvbigpe3JldHVybiBiPGEubGVuZ3RoP3tkb25lOiExLHZhbHVlOmFbYisrXX06e2RvbmU6ITB9fX0sYmE9dHlwZW9mIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzPT0iZnVuY3Rpb24iP09iamVjdC5kZWZpbmVQcm9wZXJ0eTpmdW5jdGlvbihhLGIsYyl7aWYoYT09QXJyYXkucHJvdG90eXBlfHxhPT1PYmplY3QucHJvdG90eXBlKXJldHVybiBhO2FbYl09Yy52YWx1ZTtyZXR1cm4gYX0sY2E9ZnVuY3Rpb24oYSl7YT1bIm9iamVjdCI9PXR5cGVvZiBnbG9iYWxUaGlzJiZnbG9iYWxUaGlzLGEsIm9iamVjdCI9PXR5cGVvZiB3aW5kb3cmJndpbmRvdywib2JqZWN0Ij09dHlwZW9mIHNlbGYmJnNlbGYsIm9iamVjdCI9PXR5cGVvZiBnbG9iYWwmJmdsb2JhbF07Zm9yKHZhciBiPTA7YjxhLmxlbmd0aDsrK2Ipe3ZhciBjPWFbYl07aWYoYyYmYy5NYXRoPT1NYXRoKXJldHVybiBjfXRocm93IEVycm9yKCJDYW5ub3QgZmluZCBnbG9iYWwgb2JqZWN0Iik7Cn0sZGE9Y2EodGhpcyksZWE9ZnVuY3Rpb24oYSxiKXtpZihiKWE6e3ZhciBjPWRhO2E9YS5zcGxpdCgiLiIpO2Zvcih2YXIgZD0wO2Q8YS5sZW5ndGgtMTtkKyspe3ZhciBlPWFbZF07aWYoIShlIGluIGMpKWJyZWFrIGE7Yz1jW2VdfWE9YVthLmxlbmd0aC0xXTtkPWNbYV07Yj1iKGQpO2IhPWQmJmIhPW51bGwmJmJhKGMsYSx7Y29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOmJ9KX19OwplYSgiU3ltYm9sIixmdW5jdGlvbihhKXtpZihhKXJldHVybiBhO3ZhciBiPWZ1bmN0aW9uKGYsaCl7dGhpcy5nPWY7YmEodGhpcywiZGVzY3JpcHRpb24iLHtjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6aH0pfTtiLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmd9O3ZhciBjPSJqc2NvbXBfc3ltYm9sXyIrKE1hdGgucmFuZG9tKCkqMUU5Pj4+MCkrIl8iLGQ9MCxlPWZ1bmN0aW9uKGYpe2lmKHRoaXMgaW5zdGFuY2VvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoIlN5bWJvbCBpcyBub3QgYSBjb25zdHJ1Y3RvciIpO3JldHVybiBuZXcgYihjKyhmfHwiIikrIl8iK2QrKyxmKX07cmV0dXJuIGV9KTsKdmFyIGZhPWZ1bmN0aW9uKGEpe3ZhciBiPXR5cGVvZiBTeW1ib2whPSJ1bmRlZmluZWQiJiZTeW1ib2wuaXRlcmF0b3ImJmFbU3ltYm9sLml0ZXJhdG9yXTtpZihiKXJldHVybiBiLmNhbGwoYSk7aWYodHlwZW9mIGEubGVuZ3RoPT0ibnVtYmVyIilyZXR1cm57bmV4dDphYShhKX07dGhyb3cgRXJyb3IoU3RyaW5nKGEpKyIgaXMgbm90IGFuIGl0ZXJhYmxlIG9yIEFycmF5TGlrZSIpO307ZWEoIlN5bWJvbC5kaXNwb3NlIixmdW5jdGlvbihhKXtyZXR1cm4gYT9hOlN5bWJvbCgiU3ltYm9sLmRpc3Bvc2UiKX0pOy8qCgogQ29weXJpZ2h0IFRoZSBDbG9zdXJlIExpYnJhcnkgQXV0aG9ycy4KIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wCiovCnZhciBsPXRoaXN8fHNlbGYsaWE9ZnVuY3Rpb24oYSl7YS5JYT12b2lkIDA7YS5WPWZ1bmN0aW9uKCl7cmV0dXJuIGEuSWE/YS5JYTphLklhPW5ldyBhfX0samE9ZnVuY3Rpb24oYSl7dmFyIGI9dHlwZW9mIGE7cmV0dXJuIGIhPSJvYmplY3QiP2I6YT9BcnJheS5pc0FycmF5KGEpPyJhcnJheSI6YjoibnVsbCJ9LGthPWZ1bmN0aW9uKGEpe3ZhciBiPWphKGEpO3JldHVybiBiPT0iYXJyYXkifHxiPT0ib2JqZWN0IiYmdHlwZW9mIGEubGVuZ3RoPT0ibnVtYmVyIn0sbT1mdW5jdGlvbihhKXt2YXIgYj10eXBlb2YgYTtyZXR1cm4gYj09Im9iamVjdCImJmEhPW51bGx8fGI9PSJmdW5jdGlvbiJ9LG5hPWZ1bmN0aW9uKGEpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYSxsYSkmJmFbbGFdfHwoYVtsYV09KyttYSl9LGxhPSJjbG9zdXJlX3VpZF8iKyhNYXRoLnJhbmRvbSgpKjFFOT4+PjApLG1hPTAsbj1mdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoKXt9Yy5wcm90b3R5cGU9CmIucHJvdG90eXBlO2EubD1iLnByb3RvdHlwZTthLnByb3RvdHlwZT1uZXcgYzthLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1hO2EucWQ9ZnVuY3Rpb24oZCxlLGYpe2Zvcih2YXIgaD1BcnJheShhcmd1bWVudHMubGVuZ3RoLTIpLGs9MjtrPGFyZ3VtZW50cy5sZW5ndGg7aysrKWhbay0yXT1hcmd1bWVudHNba107cmV0dXJuIGIucHJvdG90eXBlW2VdLmFwcGx5KGQsaCl9fTtmdW5jdGlvbiBvYShhLGIpe2lmKEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKUVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsb2EpO2Vsc2V7dmFyIGM9RXJyb3IoKS5zdGFjaztjJiYodGhpcy5zdGFjaz1jKX1hJiYodGhpcy5tZXNzYWdlPVN0cmluZyhhKSk7YiE9PXZvaWQgMCYmKHRoaXMuY2F1c2U9Yil9bihvYSxFcnJvcik7b2EucHJvdG90eXBlLm5hbWU9IkN1c3RvbUVycm9yIjt2YXIgcGE7ZnVuY3Rpb24gcWEoYSxiKXthPWEuc3BsaXQoIiVzIik7Zm9yKHZhciBjPSIiLGQ9YS5sZW5ndGgtMSxlPTA7ZTxkO2UrKyljKz1hW2VdKyhlPGIubGVuZ3RoP2JbZV06IiVzIik7b2EuY2FsbCh0aGlzLGMrYVtkXSl9bihxYSxvYSk7cWEucHJvdG90eXBlLm5hbWU9IkFzc2VydGlvbkVycm9yIjtmdW5jdGlvbiByYShhLGIsYyxkKXt2YXIgZT0iQXNzZXJ0aW9uIGZhaWxlZCI7aWYoYyl7ZSs9IjogIitjO3ZhciBmPWR9ZWxzZSBhJiYoZSs9IjogIithLGY9Yik7dGhyb3cgbmV3IHFhKCIiK2UsZnx8W10pO30KdmFyIHA9ZnVuY3Rpb24oYSxiLGMpe2F8fHJhKCIiLG51bGwsYixBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMikpO3JldHVybiBhfSxzYT1mdW5jdGlvbihhLGIsYyl7bShhKSYmYS5ub2RlVHlwZT09MXx8cmEoIkV4cGVjdGVkIEVsZW1lbnQgYnV0IGdvdCAlczogJXMuIixbamEoYSksYV0sYixBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMikpfSx1YT1mdW5jdGlvbihhLGIsYyxkKXthIGluc3RhbmNlb2YgYnx8cmEoIkV4cGVjdGVkIGluc3RhbmNlb2YgJXMgYnV0IGdvdCAlcy4iLFt0YShiKSx0YShhKV0sYyxBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMykpfTsKZnVuY3Rpb24gdGEoYSl7cmV0dXJuIGEgaW5zdGFuY2VvZiBGdW5jdGlvbj9hLmRpc3BsYXlOYW1lfHxhLm5hbWV8fCJ1bmtub3duIHR5cGUgbmFtZSI6YSBpbnN0YW5jZW9mIE9iamVjdD9hLmNvbnN0cnVjdG9yLmRpc3BsYXlOYW1lfHxhLmNvbnN0cnVjdG9yLm5hbWV8fE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhKTphPT09bnVsbD8ibnVsbCI6dHlwZW9mIGF9O3ZhciB2YT1BcnJheS5wcm90b3R5cGUuaW5kZXhPZj9mdW5jdGlvbihhLGIpe3AoYS5sZW5ndGghPW51bGwpO3JldHVybiBBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKGEsYix2b2lkIDApfTpmdW5jdGlvbihhLGIpe2lmKHR5cGVvZiBhPT09InN0cmluZyIpcmV0dXJuIHR5cGVvZiBiIT09InN0cmluZyJ8fGIubGVuZ3RoIT0xPy0xOmEuaW5kZXhPZihiLDApO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWlmKGMgaW4gYSYmYVtjXT09PWIpcmV0dXJuIGM7cmV0dXJuLTF9LHdhPUFycmF5LnByb3RvdHlwZS5mb3JFYWNoP2Z1bmN0aW9uKGEsYil7cChhLmxlbmd0aCE9bnVsbCk7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChhLGIsdm9pZCAwKX06ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9YS5sZW5ndGgsZD10eXBlb2YgYT09PSJzdHJpbmciP2Euc3BsaXQoIiIpOmEsZT0wO2U8YztlKyspZSBpbiBkJiZiLmNhbGwodm9pZCAwLGRbZV0sZSxhKX07CmZ1bmN0aW9uIHhhKGEsYil7Yj12YShhLGIpO3ZhciBjO2lmKGM9Yj49MClwKGEubGVuZ3RoIT1udWxsKSxBcnJheS5wcm90b3R5cGUuc3BsaWNlLmNhbGwoYSxiLDEpO3JldHVybiBjfWZ1bmN0aW9uIHlhKGEpe3ZhciBiPWEubGVuZ3RoO2lmKGI+MCl7Zm9yKHZhciBjPUFycmF5KGIpLGQ9MDtkPGI7ZCsrKWNbZF09YVtkXTtyZXR1cm4gY31yZXR1cm5bXX1mdW5jdGlvbiB6YShhLGIsYyxkKXtwKGEubGVuZ3RoIT1udWxsKTtBcnJheS5wcm90b3R5cGUuc3BsaWNlLmFwcGx5KGEsQWEoYXJndW1lbnRzLDEpKX1mdW5jdGlvbiBBYShhLGIsYyl7cChhLmxlbmd0aCE9bnVsbCk7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg8PTI/QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYSxiKTpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhLGIsYyl9O2Z1bmN0aW9uIEJhKGEsYixjKXtmb3IodmFyIGQgaW4gYSliLmNhbGwoYyxhW2RdLGQsYSl9ZnVuY3Rpb24gQ2EoYSxiKXtmb3IodmFyIGMgaW4gYSlpZihhW2NdPT1iKXJldHVybiEwO3JldHVybiExfWZ1bmN0aW9uIERhKGEsYixjKXtpZihhIT09bnVsbCYmYiBpbiBhKXRocm93IEVycm9yKCdUaGUgb2JqZWN0IGFscmVhZHkgY29udGFpbnMgdGhlIGtleSAiJytiKyciJyk7YVtiXT1jfWZ1bmN0aW9uIEVhKGEpe3ZhciBiPXt9LGM7Zm9yKGMgaW4gYSliW2FbY11dPWM7cmV0dXJuIGJ9dmFyIEZhPSJjb25zdHJ1Y3RvciBoYXNPd25Qcm9wZXJ0eSBpc1Byb3RvdHlwZU9mIHByb3BlcnR5SXNFbnVtZXJhYmxlIHRvTG9jYWxlU3RyaW5nIHRvU3RyaW5nIHZhbHVlT2YiLnNwbGl0KCIgIik7CmZ1bmN0aW9uIEdhKGEsYil7Zm9yKHZhciBjLGQsZT0xO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspe2Q9YXJndW1lbnRzW2VdO2ZvcihjIGluIGQpYVtjXT1kW2NdO2Zvcih2YXIgZj0wO2Y8RmEubGVuZ3RoO2YrKyljPUZhW2ZdLE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChkLGMpJiYoYVtjXT1kW2NdKX19O3ZhciBIYT1TdHJpbmcucHJvdG90eXBlLnRyaW0/ZnVuY3Rpb24oYSl7cmV0dXJuIGEudHJpbSgpfTpmdW5jdGlvbihhKXtyZXR1cm4vXltcc1x4YTBdKihbXHNcU10qPylbXHNceGEwXSokLy5leGVjKGEpWzFdfTsvKgoKIENvcHlyaWdodCBHb29nbGUgTExDCiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMAoqLwp2YXIgSWE9e307dmFyIEphPWZ1bmN0aW9uKGEpe2lmKElhIT09SWEpdGhyb3cgRXJyb3IoIkJhZCBzZWNyZXQiKTt0aGlzLmc9YX07SmEucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ307bmV3IEphKCJhYm91dDpibGFuayIpO25ldyBKYSgiYWJvdXQ6aW52YWxpZCN6Q2xvc3VyZXoiKTt2YXIgS2E9W10sTGE9ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJBIFVSTCB3aXRoIGNvbnRlbnQgJyIrYSsiJyB3YXMgc2FuaXRpemVkIGF3YXkuIil9O0thLmluZGV4T2YoTGEpPT09LTEmJkthLnB1c2goTGEpO3ZhciBNYSxOYTthOntmb3IodmFyIE9hPVsiQ0xPU1VSRV9GTEFHUyJdLFBhPWwsUWE9MDtRYTxPYS5sZW5ndGg7UWErKylpZihQYT1QYVtPYVtRYV1dLFBhPT1udWxsKXtOYT1udWxsO2JyZWFrIGF9TmE9UGF9dmFyIFJhPU5hJiZOYVs2MTA0MDEzMDFdO01hPVJhIT1udWxsP1JhOiExO2Z1bmN0aW9uIFNhKCl7dmFyIGE9bC5uYXZpZ2F0b3I7cmV0dXJuIGEmJihhPWEudXNlckFnZW50KT9hOiIifXZhciBUYSxVYT1sLm5hdmlnYXRvcjtUYT1VYT9VYS51c2VyQWdlbnREYXRhfHxudWxsOm51bGw7ZnVuY3Rpb24gcihhKXtyZXR1cm4gU2EoKS5pbmRleE9mKGEpIT0tMX07dmFyIFZhPXIoIkVkZ2UiKSx0PXIoIkdlY2tvIikmJiEoU2EoKS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoIndlYmtpdCIpIT0tMSYmIXIoIkVkZ2UiKSkmJiEocigiVHJpZGVudCIpfHxyKCJNU0lFIikpJiYhcigiRWRnZSIpLHU9U2EoKS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoIndlYmtpdCIpIT0tMSYmIXIoIkVkZ2UiKSx2PU1hJiZUYSYmVGEucGxhdGZvcm0/VGEucGxhdGZvcm09PT0ibWFjT1MiOnIoIk1hY2ludG9zaCIpO3ZhciBYYT1mdW5jdGlvbihhLGIpe0JhKGIsZnVuY3Rpb24oYyxkKXtkPT0ic3R5bGUiP2Euc3R5bGUuY3NzVGV4dD1jOmQ9PSJjbGFzcyI/YS5jbGFzc05hbWU9YzpkPT0iZm9yIj9hLmh0bWxGb3I9YzpXYS5oYXNPd25Qcm9wZXJ0eShkKT9hLnNldEF0dHJpYnV0ZShXYVtkXSxjKTpkLmxhc3RJbmRleE9mKCJhcmlhLSIsMCk9PTB8fGQubGFzdEluZGV4T2YoImRhdGEtIiwwKT09MD9hLnNldEF0dHJpYnV0ZShkLGMpOmFbZF09Y30pfSxXYT17Y2VsbHBhZGRpbmc6ImNlbGxQYWRkaW5nIixjZWxsc3BhY2luZzoiY2VsbFNwYWNpbmciLGNvbHNwYW46ImNvbFNwYW4iLGZyYW1lYm9yZGVyOiJmcmFtZUJvcmRlciIsaGVpZ2h0OiJoZWlnaHQiLG1heGxlbmd0aDoibWF4TGVuZ3RoIixub25jZToibm9uY2UiLHJvbGU6InJvbGUiLHJvd3NwYW46InJvd1NwYW4iLHR5cGU6InR5cGUiLHVzZW1hcDoidXNlTWFwIix2YWxpZ246InZBbGlnbiIsd2lkdGg6IndpZHRoIn0sWWE9ZnVuY3Rpb24oYSwKYixjKXtmdW5jdGlvbiBkKGspe2smJmIuYXBwZW5kQ2hpbGQodHlwZW9mIGs9PT0ic3RyaW5nIj9hLmNyZWF0ZVRleHROb2RlKGspOmspfWZvcih2YXIgZT0yO2U8Yy5sZW5ndGg7ZSsrKXt2YXIgZj1jW2VdO2lmKCFrYShmKXx8bShmKSYmZi5ub2RlVHlwZT4wKWQoZik7ZWxzZXthOntpZihmJiZ0eXBlb2YgZi5sZW5ndGg9PSJudW1iZXIiKXtpZihtKGYpKXt2YXIgaD10eXBlb2YgZi5pdGVtPT0iZnVuY3Rpb24ifHx0eXBlb2YgZi5pdGVtPT0ic3RyaW5nIjticmVhayBhfWlmKHR5cGVvZiBmPT09ImZ1bmN0aW9uIil7aD10eXBlb2YgZi5pdGVtPT0iZnVuY3Rpb24iO2JyZWFrIGF9fWg9ITF9d2EoaD95YShmKTpmLGQpfX19LFphPWZ1bmN0aW9uKGEsYil7Yj1TdHJpbmcoYik7YS5jb250ZW50VHlwZT09PSJhcHBsaWNhdGlvbi94aHRtbCt4bWwiJiYoYj1iLnRvTG93ZXJDYXNlKCkpO3JldHVybiBhLmNyZWF0ZUVsZW1lbnQoYil9LCRhPWZ1bmN0aW9uKGEpe2EmJmEucGFyZW50Tm9kZSYmCmEucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhKX0sYWI9ZnVuY3Rpb24oYSxiKXtpZighYXx8IWIpcmV0dXJuITE7aWYoYS5jb250YWlucyYmYi5ub2RlVHlwZT09MSlyZXR1cm4gYT09Ynx8YS5jb250YWlucyhiKTtpZih0eXBlb2YgYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiE9InVuZGVmaW5lZCIpcmV0dXJuIGE9PWJ8fCEhKGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24oYikmMTYpO2Zvcig7YiYmYSE9YjspYj1iLnBhcmVudE5vZGU7cmV0dXJuIGI9PWF9LGJiPWZ1bmN0aW9uKGEpe3AoYSwiTm9kZSBjYW5ub3QgYmUgbnVsbCBvciB1bmRlZmluZWQuIik7cmV0dXJuIGEubm9kZVR5cGU9PTk/YTphLm93bmVyRG9jdW1lbnR8fGEuZG9jdW1lbnR9LGNiPWZ1bmN0aW9uKGEsYil7Yj9hLnRhYkluZGV4PTA6KGEudGFiSW5kZXg9LTEsYS5yZW1vdmVBdHRyaWJ1dGUoInRhYkluZGV4IikpfSxkYj1mdW5jdGlvbihhKXtyZXR1cm4gYS5oYXNBdHRyaWJ1dGUoInRhYmluZGV4Iil9LGViPQpmdW5jdGlvbihhKXthPWEudGFiSW5kZXg7cmV0dXJuIHR5cGVvZiBhPT09Im51bWJlciImJmE+PTAmJmE8MzI3Njh9LGZiPWZ1bmN0aW9uKGEpe3RoaXMuZz1hfHxsLmRvY3VtZW50fHxkb2N1bWVudH07ZmIucHJvdG90eXBlLmk9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nO3JldHVybiB0eXBlb2YgYT09PSJzdHJpbmciP2IuZ2V0RWxlbWVudEJ5SWQoYSk6YX07ZmIucHJvdG90eXBlLmg9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXMuZyxlPWFyZ3VtZW50cyxmPWVbMV0saD1aYShkLFN0cmluZyhlWzBdKSk7ZiYmKHR5cGVvZiBmPT09InN0cmluZyI/aC5jbGFzc05hbWU9ZjpBcnJheS5pc0FycmF5KGYpP2guY2xhc3NOYW1lPWYuam9pbigiICIpOlhhKGgsZikpO2UubGVuZ3RoPjImJllhKGQsaCxlKTtyZXR1cm4gaH07dmFyIHc9ZnVuY3Rpb24oKXt0aGlzLmJhPXRoaXMuYmE7dGhpcy5rYT10aGlzLmthfTt3LnByb3RvdHlwZS5iYT0hMTt3LnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7dGhpcy5iYXx8KHRoaXMuYmE9ITAsdGhpcy5DKCkpfTt3LnByb3RvdHlwZVtTeW1ib2wuZGlzcG9zZV09ZnVuY3Rpb24oKXt0aGlzLmRpc3Bvc2UoKX07dy5wcm90b3R5cGUuQz1mdW5jdGlvbigpe2lmKHRoaXMua2EpZm9yKDt0aGlzLmthLmxlbmd0aDspdGhpcy5rYS5zaGlmdCgpKCl9O3ZhciB5PWZ1bmN0aW9uKGEsYil7dGhpcy50eXBlPWE7dGhpcy51PXRoaXMudGFyZ2V0PWI7dGhpcy5kZWZhdWx0UHJldmVudGVkPXRoaXMuQT0hMX07eS5wcm90b3R5cGUudj1mdW5jdGlvbigpe3RoaXMuQT0hMH07eS5wcm90b3R5cGUuaj1mdW5jdGlvbigpe3RoaXMuZGVmYXVsdFByZXZlbnRlZD0hMH07dmFyIGdiPWZ1bmN0aW9uKCl7aWYoIWwuYWRkRXZlbnRMaXN0ZW5lcnx8IU9iamVjdC5kZWZpbmVQcm9wZXJ0eSlyZXR1cm4hMTt2YXIgYT0hMSxiPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwicGFzc2l2ZSIse2dldDpmdW5jdGlvbigpe2E9ITB9fSk7dHJ5e3ZhciBjPWZ1bmN0aW9uKCl7fTtsLmFkZEV2ZW50TGlzdGVuZXIoInRlc3QiLGMsYik7bC5yZW1vdmVFdmVudExpc3RlbmVyKCJ0ZXN0IixjLGIpfWNhdGNoKGQpe31yZXR1cm4gYX0oKTt2YXIgej1mdW5jdGlvbihhLGIpe3kuY2FsbCh0aGlzLGE/YS50eXBlOiIiKTt0aGlzLnJlbGF0ZWRUYXJnZXQ9dGhpcy51PXRoaXMudGFyZ2V0PW51bGw7dGhpcy5idXR0b249dGhpcy5zY3JlZW5ZPXRoaXMuc2NyZWVuWD10aGlzLmNsaWVudFk9dGhpcy5jbGllbnRYPTA7dGhpcy5rZXk9IiI7dGhpcy5nPTA7dGhpcy5tZXRhS2V5PXRoaXMuc2hpZnRLZXk9dGhpcy5hbHRLZXk9dGhpcy5jdHJsS2V5PSExO3RoaXMuc3RhdGU9bnVsbDt0aGlzLkc9ITE7dGhpcy5wb2ludGVySWQ9MDt0aGlzLnBvaW50ZXJUeXBlPSIiO3RoaXMudGltZVN0YW1wPTA7dGhpcy5oPW51bGw7aWYoYSl7dmFyIGM9dGhpcy50eXBlPWEudHlwZSxkPWEuY2hhbmdlZFRvdWNoZXMmJmEuY2hhbmdlZFRvdWNoZXMubGVuZ3RoP2EuY2hhbmdlZFRvdWNoZXNbMF06bnVsbDt0aGlzLnRhcmdldD1hLnRhcmdldHx8YS5zcmNFbGVtZW50O3RoaXMudT1iO2I9YS5yZWxhdGVkVGFyZ2V0O2J8fChjPT0ibW91c2VvdmVyIj8KYj1hLmZyb21FbGVtZW50OmM9PSJtb3VzZW91dCImJihiPWEudG9FbGVtZW50KSk7dGhpcy5yZWxhdGVkVGFyZ2V0PWI7ZD8odGhpcy5jbGllbnRYPWQuY2xpZW50WCE9PXZvaWQgMD9kLmNsaWVudFg6ZC5wYWdlWCx0aGlzLmNsaWVudFk9ZC5jbGllbnRZIT09dm9pZCAwP2QuY2xpZW50WTpkLnBhZ2VZLHRoaXMuc2NyZWVuWD1kLnNjcmVlblh8fDAsdGhpcy5zY3JlZW5ZPWQuc2NyZWVuWXx8MCk6KHRoaXMuY2xpZW50WD1hLmNsaWVudFghPT12b2lkIDA/YS5jbGllbnRYOmEucGFnZVgsdGhpcy5jbGllbnRZPWEuY2xpZW50WSE9PXZvaWQgMD9hLmNsaWVudFk6YS5wYWdlWSx0aGlzLnNjcmVlblg9YS5zY3JlZW5YfHwwLHRoaXMuc2NyZWVuWT1hLnNjcmVlbll8fDApO3RoaXMuYnV0dG9uPWEuYnV0dG9uO3RoaXMuZz1hLmtleUNvZGV8fDA7dGhpcy5rZXk9YS5rZXl8fCIiO3RoaXMuY3RybEtleT1hLmN0cmxLZXk7dGhpcy5hbHRLZXk9YS5hbHRLZXk7dGhpcy5zaGlmdEtleT1hLnNoaWZ0S2V5Owp0aGlzLm1ldGFLZXk9YS5tZXRhS2V5O3RoaXMuRz12P2EubWV0YUtleTphLmN0cmxLZXk7dGhpcy5wb2ludGVySWQ9YS5wb2ludGVySWR8fDA7dGhpcy5wb2ludGVyVHlwZT1hLnBvaW50ZXJUeXBlO3RoaXMuc3RhdGU9YS5zdGF0ZTt0aGlzLnRpbWVTdGFtcD1hLnRpbWVTdGFtcDt0aGlzLmg9YTthLmRlZmF1bHRQcmV2ZW50ZWQmJnoubC5qLmNhbGwodGhpcyl9fTtuKHoseSk7ei5wcm90b3R5cGUudj1mdW5jdGlvbigpe3oubC52LmNhbGwodGhpcyk7dGhpcy5oLnN0b3BQcm9wYWdhdGlvbj90aGlzLmguc3RvcFByb3BhZ2F0aW9uKCk6dGhpcy5oLmNhbmNlbEJ1YmJsZT0hMH07ei5wcm90b3R5cGUuaj1mdW5jdGlvbigpe3oubC5qLmNhbGwodGhpcyk7dmFyIGE9dGhpcy5oO2EucHJldmVudERlZmF1bHQ/YS5wcmV2ZW50RGVmYXVsdCgpOmEucmV0dXJuVmFsdWU9ITF9O3ZhciBoYj0iY2xvc3VyZV9saXN0ZW5hYmxlXyIrKE1hdGgucmFuZG9tKCkqMUU2fDApLGliPWZ1bmN0aW9uKGEpe3JldHVybiEoIWF8fCFhW2hiXSl9O3ZhciBqYj0wO3ZhciBrYj1mdW5jdGlvbihhLGIsYyxkLGUpe3RoaXMubGlzdGVuZXI9YTt0aGlzLnByb3h5PW51bGw7dGhpcy5zcmM9Yjt0aGlzLnR5cGU9Yzt0aGlzLmNhcHR1cmU9ISFkO3RoaXMucGE9ZTt0aGlzLmtleT0rK2piO3RoaXMuamE9dGhpcy5vYT0hMX0sbGI9ZnVuY3Rpb24oYSl7YS5qYT0hMDthLmxpc3RlbmVyPW51bGw7YS5wcm94eT1udWxsO2Euc3JjPW51bGw7YS5wYT1udWxsfTt2YXIgbWI9ZnVuY3Rpb24oYSl7dGhpcy5zcmM9YTt0aGlzLmc9e307dGhpcy5oPTB9O21iLnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZj1hLnRvU3RyaW5nKCk7YT10aGlzLmdbZl07YXx8KGE9dGhpcy5nW2ZdPVtdLHRoaXMuaCsrKTt2YXIgaD1uYihhLGIsZCxlKTtoPi0xPyhiPWFbaF0sY3x8KGIub2E9ITEpKTooYj1uZXcga2IoYix0aGlzLnNyYyxmLCEhZCxlKSxiLm9hPWMsYS5wdXNoKGIpKTtyZXR1cm4gYn07CnZhciBvYj1mdW5jdGlvbihhLGIpe3ZhciBjPWIudHlwZTtjIGluIGEuZyYmeGEoYS5nW2NdLGIpJiYobGIoYiksYS5nW2NdLmxlbmd0aD09MCYmKGRlbGV0ZSBhLmdbY10sYS5oLS0pKX0scGI9ZnVuY3Rpb24oYSxiLGMsZCxlKXthPWEuZ1tiLnRvU3RyaW5nKCldO2I9LTE7YSYmKGI9bmIoYSxjLGQsZSkpO3JldHVybiBiPi0xP2FbYl06bnVsbH0sbmI9ZnVuY3Rpb24oYSxiLGMsZCl7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDsrK2Upe3ZhciBmPWFbZV07aWYoIWYuamEmJmYubGlzdGVuZXI9PWImJmYuY2FwdHVyZT09ISFjJiZmLnBhPT1kKXJldHVybiBlfXJldHVybi0xfTt2YXIgcWI9ImNsb3N1cmVfbG1fIisoTWF0aC5yYW5kb20oKSoxRTZ8MCkscmI9e30sc2I9MCx1Yj1mdW5jdGlvbihhLGIsYyxkLGUpe2lmKGQmJmQub25jZSlyZXR1cm4gdGIoYSxiLGMsZCxlKTtpZihBcnJheS5pc0FycmF5KGIpKXtmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKyl1YihhLGJbZl0sYyxkLGUpO3JldHVybiBudWxsfWM9dmIoYyk7cmV0dXJuIGliKGEpP3diKGEsYixjLG0oZCk/ISFkLmNhcHR1cmU6ISFkLGUpOnhiKGEsYixjLCExLGQsZSl9LHhiPWZ1bmN0aW9uKGEsYixjLGQsZSxmKXtpZighYil0aHJvdyBFcnJvcigiSW52YWxpZCBldmVudCB0eXBlIik7dmFyIGg9bShlKT8hIWUuY2FwdHVyZTohIWUsaz15YihhKTtrfHwoYVtxYl09az1uZXcgbWIoYSkpO2M9ay5hZGQoYixjLGQsaCxmKTtpZihjLnByb3h5KXJldHVybiBjO2Q9emIoKTtjLnByb3h5PWQ7ZC5zcmM9YTtkLmxpc3RlbmVyPWM7aWYoYS5hZGRFdmVudExpc3RlbmVyKWdifHwoZT1oKSxlPT09dm9pZCAwJiYKKGU9ITEpLGEuYWRkRXZlbnRMaXN0ZW5lcihiLnRvU3RyaW5nKCksZCxlKTtlbHNlIGlmKGEuYXR0YWNoRXZlbnQpYS5hdHRhY2hFdmVudChBYihiLnRvU3RyaW5nKCkpLGQpO2Vsc2UgaWYoYS5hZGRMaXN0ZW5lciYmYS5yZW1vdmVMaXN0ZW5lcilwKGI9PT0iY2hhbmdlIiwiTWVkaWFRdWVyeUxpc3Qgb25seSBoYXMgYSBjaGFuZ2UgZXZlbnQiKSxhLmFkZExpc3RlbmVyKGQpO2Vsc2UgdGhyb3cgRXJyb3IoImFkZEV2ZW50TGlzdGVuZXIgYW5kIGF0dGFjaEV2ZW50IGFyZSB1bmF2YWlsYWJsZS4iKTtzYisrO3JldHVybiBjfSx6Yj1mdW5jdGlvbigpe3ZhciBhPUJiLGI9ZnVuY3Rpb24oYyl7cmV0dXJuIGEuY2FsbChiLnNyYyxiLmxpc3RlbmVyLGMpfTtyZXR1cm4gYn0sdGI9ZnVuY3Rpb24oYSxiLGMsZCxlKXtpZihBcnJheS5pc0FycmF5KGIpKXtmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKyl0YihhLGJbZl0sYyxkLGUpO3JldHVybiBudWxsfWM9dmIoYyk7cmV0dXJuIGliKGEpPwphLkEuYWRkKFN0cmluZyhiKSxjLCEwLG0oZCk/ISFkLmNhcHR1cmU6ISFkLGUpOnhiKGEsYixjLCEwLGQsZSl9LENiPWZ1bmN0aW9uKGEsYixjLGQsZSl7aWYoQXJyYXkuaXNBcnJheShiKSlmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKylDYihhLGJbZl0sYyxkLGUpO2Vsc2UgZD1tKGQpPyEhZC5jYXB0dXJlOiEhZCxjPXZiKGMpLGliKGEpPyhhPWEuQSxiPVN0cmluZyhiKS50b1N0cmluZygpLGIgaW4gYS5nJiYoZj1hLmdbYl0sYz1uYihmLGMsZCxlKSxjPi0xJiYobGIoZltjXSkscChmLmxlbmd0aCE9bnVsbCksQXJyYXkucHJvdG90eXBlLnNwbGljZS5jYWxsKGYsYywxKSxmLmxlbmd0aD09MCYmKGRlbGV0ZSBhLmdbYl0sYS5oLS0pKSkpOmEmJihhPXliKGEpKSYmKGM9cGIoYSxiLGMsZCxlKSkmJkEoYyl9LEE9ZnVuY3Rpb24oYSl7aWYodHlwZW9mIGEhPT0ibnVtYmVyIiYmYSYmIWEuamEpe3ZhciBiPWEuc3JjO2lmKGliKGIpKW9iKGIuQSxhKTtlbHNle3ZhciBjPWEudHlwZSwKZD1hLnByb3h5O2IucmVtb3ZlRXZlbnRMaXN0ZW5lcj9iLnJlbW92ZUV2ZW50TGlzdGVuZXIoYyxkLGEuY2FwdHVyZSk6Yi5kZXRhY2hFdmVudD9iLmRldGFjaEV2ZW50KEFiKGMpLGQpOmIuYWRkTGlzdGVuZXImJmIucmVtb3ZlTGlzdGVuZXImJmIucmVtb3ZlTGlzdGVuZXIoZCk7c2ItLTsoYz15YihiKSk/KG9iKGMsYSksYy5oPT0wJiYoYy5zcmM9bnVsbCxiW3FiXT1udWxsKSk6bGIoYSl9fX0sQWI9ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW4gcmI/cmJbYV06cmJbYV09Im9uIithfSxCYj1mdW5jdGlvbihhLGIpe2lmKGEuamEpYT0hMDtlbHNle2I9bmV3IHooYix0aGlzKTt2YXIgYz1hLmxpc3RlbmVyLGQ9YS5wYXx8YS5zcmM7YS5vYSYmQShhKTthPWMuY2FsbChkLGIpfXJldHVybiBhfSx5Yj1mdW5jdGlvbihhKXthPWFbcWJdO3JldHVybiBhIGluc3RhbmNlb2YgbWI/YTpudWxsfSxEYj0iX19jbG9zdXJlX2V2ZW50c19mbl8iKyhNYXRoLnJhbmRvbSgpKjFFOT4+PjApLHZiPWZ1bmN0aW9uKGEpe3AoYSwKIkxpc3RlbmVyIGNhbiBub3QgYmUgbnVsbC4iKTtpZih0eXBlb2YgYT09PSJmdW5jdGlvbiIpcmV0dXJuIGE7cChhLmhhbmRsZUV2ZW50LCJBbiBvYmplY3QgbGlzdGVuZXIgbXVzdCBoYXZlIGhhbmRsZUV2ZW50IG1ldGhvZC4iKTthW0RiXXx8KGFbRGJdPWZ1bmN0aW9uKGIpe3JldHVybiBhLmhhbmRsZUV2ZW50KGIpfSk7cmV0dXJuIGFbRGJdfTt2YXIgRWI9ZnVuY3Rpb24oYSl7dy5jYWxsKHRoaXMpO3RoaXMuaD1hO3RoaXMuZz17fX07bihFYix3KTsKdmFyIEZiPVtdLEI9ZnVuY3Rpb24oYSxiLGMsZCl7QXJyYXkuaXNBcnJheShjKXx8KGMmJihGYlswXT1jLnRvU3RyaW5nKCkpLGM9RmIpO2Zvcih2YXIgZT0wO2U8Yy5sZW5ndGg7ZSsrKXt2YXIgZj11YihiLGNbZV0sZHx8YS5oYW5kbGVFdmVudCwhMSxhLmh8fGEpO2lmKCFmKWJyZWFrO2EuZ1tmLmtleV09Zn1yZXR1cm4gYX0sQz1mdW5jdGlvbihhLGIsYyxkLGUsZil7aWYoQXJyYXkuaXNBcnJheShjKSlmb3IodmFyIGg9MDtoPGMubGVuZ3RoO2grKylDKGEsYixjW2hdLGQsZSxmKTtlbHNlIGQ9ZHx8YS5oYW5kbGVFdmVudCxlPW0oZSk/ISFlLmNhcHR1cmU6ISFlLGY9Znx8YS5ofHxhLGQ9dmIoZCksZT0hIWUsYz1pYihiKT9wYihiLkEsU3RyaW5nKGMpLGQsZSxmKTpiPyhiPXliKGIpKT9wYihiLGMsZCxlLGYpOm51bGw6bnVsbCxjJiYoQShjKSxkZWxldGUgYS5nW2Mua2V5XSk7cmV0dXJuIGF9LEdiPWZ1bmN0aW9uKGEpe0JhKGEuZyxmdW5jdGlvbihiLGMpe3RoaXMuZy5oYXNPd25Qcm9wZXJ0eShjKSYmCkEoYil9LGEpO2EuZz17fX07RWIucHJvdG90eXBlLkM9ZnVuY3Rpb24oKXtFYi5sLkMuY2FsbCh0aGlzKTtHYih0aGlzKX07RWIucHJvdG90eXBlLmhhbmRsZUV2ZW50PWZ1bmN0aW9uKCl7dGhyb3cgRXJyb3IoIkV2ZW50SGFuZGxlci5oYW5kbGVFdmVudCBub3QgaW1wbGVtZW50ZWQiKTt9O3ZhciBEPWZ1bmN0aW9uKCl7dy5jYWxsKHRoaXMpO3RoaXMuQT1uZXcgbWIodGhpcyk7dGhpcy5ZYT10aGlzO3RoaXMubGE9bnVsbH07bihELHcpO0QucHJvdG90eXBlW2hiXT0hMDtELnByb3RvdHlwZS5BYT1mdW5jdGlvbihhKXt0aGlzLmxhPWF9O0QucHJvdG90eXBlLnJlbW92ZUV2ZW50TGlzdGVuZXI9ZnVuY3Rpb24oYSxiLGMsZCl7Q2IodGhpcyxhLGIsYyxkKX07CnZhciBFPWZ1bmN0aW9uKGEsYil7SGIoYSk7dmFyIGM9YS5sYTtpZihjKXt2YXIgZD1bXTtmb3IodmFyIGU9MTtjO2M9Yy5sYSlkLnB1c2goYykscCgrK2U8MUUzLCJpbmZpbml0ZSBsb29wIil9YT1hLllhO2M9Yi50eXBlfHxiO3R5cGVvZiBiPT09InN0cmluZyI/Yj1uZXcgeShiLGEpOmIgaW5zdGFuY2VvZiB5P2IudGFyZ2V0PWIudGFyZ2V0fHxhOihlPWIsYj1uZXcgeShjLGEpLEdhKGIsZSkpO2U9ITA7dmFyIGY7aWYoZClmb3IoZj1kLmxlbmd0aC0xOyFiLkEmJmY+PTA7Zi0tKXt2YXIgaD1iLnU9ZFtmXTtlPUliKGgsYywhMCxiKSYmZX1iLkF8fChoPWIudT1hLGU9SWIoaCxjLCEwLGIpJiZlLGIuQXx8KGU9SWIoaCxjLCExLGIpJiZlKSk7aWYoZClmb3IoZj0wOyFiLkEmJmY8ZC5sZW5ndGg7ZisrKWg9Yi51PWRbZl0sZT1JYihoLGMsITEsYikmJmU7cmV0dXJuIGV9OwpELnByb3RvdHlwZS5DPWZ1bmN0aW9uKCl7RC5sLkMuY2FsbCh0aGlzKTtpZih0aGlzLkEpe3ZhciBhPXRoaXMuQSxiPTAsYztmb3IoYyBpbiBhLmcpe2Zvcih2YXIgZD1hLmdbY10sZT0wO2U8ZC5sZW5ndGg7ZSsrKSsrYixsYihkW2VdKTtkZWxldGUgYS5nW2NdO2EuaC0tfX10aGlzLmxhPW51bGx9O3ZhciB3Yj1mdW5jdGlvbihhLGIsYyxkLGUpe0hiKGEpO3JldHVybiBhLkEuYWRkKFN0cmluZyhiKSxjLCExLGQsZSl9LEliPWZ1bmN0aW9uKGEsYixjLGQpe2I9YS5BLmdbU3RyaW5nKGIpXTtpZighYilyZXR1cm4hMDtiPWIuY29uY2F0KCk7Zm9yKHZhciBlPSEwLGY9MDtmPGIubGVuZ3RoOysrZil7dmFyIGg9YltmXTtpZihoJiYhaC5qYSYmaC5jYXB0dXJlPT1jKXt2YXIgaz1oLmxpc3RlbmVyLHE9aC5wYXx8aC5zcmM7aC5vYSYmb2IoYS5BLGgpO2U9ay5jYWxsKHEsZCkhPT0hMSYmZX19cmV0dXJuIGUmJiFkLmRlZmF1bHRQcmV2ZW50ZWR9LEhiPWZ1bmN0aW9uKGEpe3AoYS5BLCJFdmVudCB0YXJnZXQgaXMgbm90IGluaXRpYWxpemVkLiBEaWQgeW91IGNhbGwgdGhlIHN1cGVyY2xhc3MgKGdvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0KSBjb25zdHJ1Y3Rvcj8iKX07dmFyIEpiPXQ/Ik1velVzZXJTZWxlY3QiOnV8fFZhPyJXZWJraXRVc2VyU2VsZWN0IjpudWxsLEtiPWZ1bmN0aW9uKGEsYil7Yj1iP251bGw6YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpO2lmKEpiJiYoYS5zdHlsZSYmKGEuc3R5bGVbSmJdPSJub25lIiksYikpZm9yKHZhciBjPTA7YT1iW2NdO2MrKylhLnN0eWxlJiYoYS5zdHlsZVtKYl09Im5vbmUiKX07dmFyIExiPWZ1bmN0aW9uKCl7fTtpYShMYik7TGIucHJvdG90eXBlLmc9MDt2YXIgRj1mdW5jdGlvbihhKXtELmNhbGwodGhpcyk7dGhpcy5HPWF8fHBhfHwocGE9bmV3IGZiKTt0aGlzLnphPU1iO3RoaXMuWT1udWxsO3RoaXMucz0hMTt0aGlzLmc9bnVsbDt0aGlzLk09dm9pZCAwO3RoaXMudT10aGlzLmo9dGhpcy5oPW51bGw7dGhpcy5TYT0hMX07bihGLEQpO0YucHJvdG90eXBlLlphPUxiLlYoKTsKdmFyIE1iPW51bGwsTmI9ZnVuY3Rpb24oYSxiKXtzd2l0Y2goYSl7Y2FzZSAxOnJldHVybiBiPyJkaXNhYmxlIjoiZW5hYmxlIjtjYXNlIDI6cmV0dXJuIGI/ImhpZ2hsaWdodCI6InVuaGlnaGxpZ2h0IjtjYXNlIDQ6cmV0dXJuIGI/ImFjdGl2YXRlIjoiZGVhY3RpdmF0ZSI7Y2FzZSA4OnJldHVybiBiPyJzZWxlY3QiOiJ1bnNlbGVjdCI7Y2FzZSAxNjpyZXR1cm4gYj8iY2hlY2siOiJ1bmNoZWNrIjtjYXNlIDMyOnJldHVybiBiPyJmb2N1cyI6ImJsdXIiO2Nhc2UgNjQ6cmV0dXJuIGI/Im9wZW4iOiJjbG9zZSJ9dGhyb3cgRXJyb3IoIkludmFsaWQgY29tcG9uZW50IHN0YXRlIik7fSxPYj1mdW5jdGlvbihhKXtyZXR1cm4gYS5ZfHwoYS5ZPSI6IisoYS5aYS5nKyspLnRvU3RyaW5nKDM2KSl9LFBiPWZ1bmN0aW9uKGEsYil7aWYoYS5oJiZhLmgudSl7dmFyIGM9YS5oLnUsZD1hLlk7ZCBpbiBjJiZkZWxldGUgY1tkXTtEYShhLmgudSxiLGEpfWEuWT1ifTtGLnByb3RvdHlwZS5pPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ307CnZhciBRYj1mdW5jdGlvbihhKXthLk18fChhLk09bmV3IEViKGEpKTtyZXR1cm4gcChhLk0pfTtGLnByb3RvdHlwZS5BYT1mdW5jdGlvbihhKXtpZih0aGlzLmgmJnRoaXMuaCE9YSl0aHJvdyBFcnJvcigiTWV0aG9kIG5vdCBzdXBwb3J0ZWQiKTtGLmwuQWEuY2FsbCh0aGlzLGEpfTtGLnByb3RvdHlwZS5tYT1mdW5jdGlvbigpe3RoaXMuZz1aYSh0aGlzLkcuZywiRElWIil9O0YucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbihhKXtSYih0aGlzLGEpfTsKdmFyIFJiPWZ1bmN0aW9uKGEsYixjKXtpZihhLnMpdGhyb3cgRXJyb3IoIkNvbXBvbmVudCBhbHJlYWR5IHJlbmRlcmVkIik7YS5nfHxhLm1hKCk7Yj9iLmluc2VydEJlZm9yZShhLmcsY3x8bnVsbCk6YS5HLmcuYm9keS5hcHBlbmRDaGlsZChhLmcpO2EuaCYmIWEuaC5zfHxhLkkoKX0sU2I9ZnVuY3Rpb24oYSxiKXtpZihhLnMpdGhyb3cgRXJyb3IoIkNvbXBvbmVudCBhbHJlYWR5IHJlbmRlcmVkIik7aWYoYiYmYS53YShiKSl7YS5TYT0hMDt2YXIgYz1iYihiKTthLkcmJmEuRy5nPT1jfHwoYS5HPWI/bmV3IGZiKGJiKGIpKTpwYXx8KHBhPW5ldyBmYikpO2EuRWEoYik7YS5JKCl9ZWxzZSB0aHJvdyBFcnJvcigiSW52YWxpZCBlbGVtZW50IHRvIGRlY29yYXRlIik7fTtnPUYucHJvdG90eXBlO2cud2E9ZnVuY3Rpb24oKXtyZXR1cm4hMH07Zy5FYT1mdW5jdGlvbihhKXt0aGlzLmc9YX07CmcuST1mdW5jdGlvbigpe3RoaXMucz0hMDtUYih0aGlzLGZ1bmN0aW9uKGEpeyFhLnMmJmEuaSgpJiZhLkkoKX0pfTtnLlU9ZnVuY3Rpb24oKXtUYih0aGlzLGZ1bmN0aW9uKGEpe2EucyYmYS5VKCl9KTt0aGlzLk0mJkdiKHRoaXMuTSk7dGhpcy5zPSExfTtnLkM9ZnVuY3Rpb24oKXt0aGlzLnMmJnRoaXMuVSgpO3RoaXMuTSYmKHRoaXMuTS5kaXNwb3NlKCksZGVsZXRlIHRoaXMuTSk7VGIodGhpcyxmdW5jdGlvbihhKXthLmRpc3Bvc2UoKX0pOyF0aGlzLlNhJiZ0aGlzLmcmJiRhKHRoaXMuZyk7dGhpcy5oPXRoaXMuZz10aGlzLnU9dGhpcy5qPW51bGw7Ri5sLkMuY2FsbCh0aGlzKX07Zy5CYT1mdW5jdGlvbihhLGIpe3RoaXMuQ2EoYSxIKHRoaXMpLGIpfTsKZy5DYT1mdW5jdGlvbihhLGIsYyl7cCghIWEsIlByb3ZpZGVkIGVsZW1lbnQgbXVzdCBub3QgYmUgbnVsbC4iKTtpZihhLnMmJihjfHwhdGhpcy5zKSl0aHJvdyBFcnJvcigiQ29tcG9uZW50IGFscmVhZHkgcmVuZGVyZWQiKTtpZihiPDB8fGI+SCh0aGlzKSl0aHJvdyBFcnJvcigiQ2hpbGQgY29tcG9uZW50IGluZGV4IG91dCBvZiBib3VuZHMiKTt0aGlzLnUmJnRoaXMuanx8KHRoaXMudT17fSx0aGlzLmo9W10pO2lmKGEuaD09dGhpcyl7dmFyIGQ9dGhpcy51LGU9T2IoYSk7ZFtlXT1hO3hhKHRoaXMuaixhKX1lbHNlIERhKHRoaXMudSxPYihhKSxhKTtpZihhPT10aGlzKXRocm93IEVycm9yKCJVbmFibGUgdG8gc2V0IHBhcmVudCBjb21wb25lbnQiKTtpZihkPXRoaXMmJmEuaCYmYS5ZKWU9YS5oLGQ9YS5ZLGUudSYmZD8oZT1lLnUsZD0oZSE9PW51bGwmJmQgaW4gZT9lW2RdOnZvaWQgMCl8fG51bGwpOmQ9bnVsbDtpZihkJiZhLmghPXRoaXMpdGhyb3cgRXJyb3IoIlVuYWJsZSB0byBzZXQgcGFyZW50IGNvbXBvbmVudCIpOwphLmg9dGhpcztGLmwuQWEuY2FsbChhLHRoaXMpO3phKHRoaXMuaixiLDAsYSk7YS5zJiZ0aGlzLnMmJmEuaD09dGhpcz8oYz10aGlzLm5hKCksKGMuY2hpbGROb2Rlc1tiXXx8bnVsbCkhPWEuaSgpJiYoYS5pKCkucGFyZW50RWxlbWVudD09YyYmYy5yZW1vdmVDaGlsZChhLmkoKSksYj1jLmNoaWxkTm9kZXNbYl18fG51bGwsYy5pbnNlcnRCZWZvcmUoYS5pKCksYikpKTpjPyh0aGlzLmd8fHRoaXMubWEoKSxiPUkodGhpcyxiKzEpLFJiKGEsdGhpcy5uYSgpLGI/Yi5nOm51bGwpKTp0aGlzLnMmJiFhLnMmJmEuZyYmYS5nLnBhcmVudE5vZGUmJmEuZy5wYXJlbnROb2RlLm5vZGVUeXBlPT0xJiZhLkkoKX07Zy5uYT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmd9Owp2YXIgVWI9ZnVuY3Rpb24oYSl7aWYoYS56YT09bnVsbCl7dmFyIGI9YS5zP2EuZzphLkcuZy5ib2R5O2E6e3ZhciBjPWJiKGIpO2lmKGMuZGVmYXVsdFZpZXcmJmMuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSYmKGM9Yy5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKGIsbnVsbCkpKXtjPWMuZGlyZWN0aW9ufHxjLmdldFByb3BlcnR5VmFsdWUoImRpcmVjdGlvbiIpfHwiIjticmVhayBhfWM9IiJ9YS56YT0icnRsIj09KGN8fChiLmN1cnJlbnRTdHlsZT9iLmN1cnJlbnRTdHlsZS5kaXJlY3Rpb246bnVsbCl8fGIuc3R5bGUmJmIuc3R5bGUuZGlyZWN0aW9uKX1yZXR1cm4gYS56YX0sSD1mdW5jdGlvbihhKXtyZXR1cm4gYS5qP2Euai5sZW5ndGg6MH0sST1mdW5jdGlvbihhLGIpe3JldHVybiBhLmo/YS5qW2JdfHxudWxsOm51bGx9LFRiPWZ1bmN0aW9uKGEsYixjKXthLmomJmEuai5mb3JFYWNoKGIsYyl9LFZiPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuaiYmYj9hLmouaW5kZXhPZihiKToKLTF9O3ZhciBXYj17bWI6ImFjdGl2ZWRlc2NlbmRhbnQiLHJiOiJhdG9taWMiLHNiOiJhdXRvY29tcGxldGUiLHViOiJidXN5Iix4YjoiY2hlY2tlZCIseWI6ImNvbGluZGV4IixEYjoiY29udHJvbHMiLEViOiJjdXJyZW50IixHYjoiZGVzY3JpYmVkYnkiLEpiOiJkaXNhYmxlZCIsTGI6ImRyb3BlZmZlY3QiLE1iOiJleHBhbmRlZCIsTmI6ImZsb3d0byIsUGI6ImdyYWJiZWQiLFRiOiJoYXNwb3B1cCIsVmI6ImhpZGRlbiIsWGI6ImludmFsaWQiLFliOiJsYWJlbCIsWmI6ImxhYmVsbGVkYnkiLGFjOiJsZXZlbCIsZmM6ImxpdmUiLHZjOiJtdWx0aWxpbmUiLHdjOiJtdWx0aXNlbGVjdGFibGUiLEFjOiJvcmllbnRhdGlvbiIsQmM6Im93bnMiLENjOiJwb3NpbnNldCIsRWM6InByZXNzZWQiLEljOiJyZWFkb25seSIsS2M6InJlbGV2YW50IixMYzoicmVxdWlyZWQiLFBjOiJyb3dpbmRleCIsU2M6InNlbGVjdGVkIixVYzoic2V0c2l6ZSIsV2M6InNvcnQiLG1kOiJ2YWx1ZW1heCIsbmQ6InZhbHVlbWluIiwKb2Q6InZhbHVlbm93IixwZDoidmFsdWV0ZXh0In07dmFyIFhiO3ZhciBZYj17bmI6ImFsZXJ0IixvYjoiYWxlcnRkaWFsb2ciLHBiOiJhcHBsaWNhdGlvbiIscWI6ImFydGljbGUiLHRiOiJiYW5uZXIiLHZiOiJidXR0b24iLHdiOiJjaGVja2JveCIsemI6ImNvbHVtbmhlYWRlciIsQWI6ImNvbWJvYm94IixCYjoiY29tcGxlbWVudGFyeSIsQ2I6ImNvbnRlbnRpbmZvIixGYjoiZGVmaW5pdGlvbiIsSGI6ImRpYWxvZyIsSWI6ImRpcmVjdG9yeSIsS2I6ImRvY3VtZW50IixPYjoiZm9ybSIsUWI6ImdyaWQiLFJiOiJncmlkY2VsbCIsU2I6Imdyb3VwIixVYjoiaGVhZGluZyIsV2I6ImltZyIsYmM6ImxpbmsiLGNjOiJsaXN0IixkYzoibGlzdGJveCIsZWM6Imxpc3RpdGVtIixoYzoibG9nIixpYzoibWFpbiIsamM6Im1hcnF1ZWUiLGtjOiJtYXRoIixsYzoibWVudSIsbWM6Im1lbnViYXIiLG5jOiJtZW51aXRlbSIsb2M6Im1lbnVpdGVtY2hlY2tib3giLHBjOiJtZW51aXRlbXJhZGlvIix4YzoibmF2aWdhdGlvbiIseWM6Im5vdGUiLHpjOiJvcHRpb24iLApEYzoicHJlc2VudGF0aW9uIixGYzoicHJvZ3Jlc3NiYXIiLEdjOiJyYWRpbyIsSGM6InJhZGlvZ3JvdXAiLEpjOiJyZWdpb24iLE1jOiJyb3ciLE5jOiJyb3dncm91cCIsT2M6InJvd2hlYWRlciIsUWM6InNjcm9sbGJhciIsUmM6InNlYXJjaCIsVGM6InNlcGFyYXRvciIsVmM6InNsaWRlciIsWGM6InNwaW5idXR0b24iLFljOiJzdGF0dXMiLFpjOiJzd2l0Y2giLGFkOiJ0YWIiLGJkOiJ0YWJsaXN0IixjZDoidGFicGFuZWwiLGRkOiJ0ZXh0Ym94IixlZDoidGV4dGluZm8iLGZkOiJ0aW1lciIsZ2Q6InRvb2xiYXIiLGhkOiJ0b29sdGlwIixqZDoidHJlZSIsa2Q6InRyZWVncmlkIixsZDoidHJlZWl0ZW0ifTt2YXIgWmI9ZnVuY3Rpb24oYSxiKXtiPyhwKENhKFliLGIpLCJObyBzdWNoIEFSSUEgcm9sZSAiK2IpLGEuc2V0QXR0cmlidXRlKCJyb2xlIixiKSk6YS5yZW1vdmVBdHRyaWJ1dGUoInJvbGUiKX0sYWM9ZnVuY3Rpb24oYSxiLGMpe0FycmF5LmlzQXJyYXkoYykmJihjPWMuam9pbigiICIpKTt2YXIgZD0kYihiKTtjPT09IiJ8fGM9PXZvaWQgMD8oWGJ8fChjPXt9LFhiPShjLmF0b21pYz0hMSxjLmF1dG9jb21wbGV0ZT0ibm9uZSIsYy5kcm9wZWZmZWN0PSJub25lIixjLmhhc3BvcHVwPSExLGMubGl2ZT0ib2ZmIixjLm11bHRpbGluZT0hMSxjLm11bHRpc2VsZWN0YWJsZT0hMSxjLm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIsYy5yZWFkb25seT0hMSxjLnJlbGV2YW50PSJhZGRpdGlvbnMgdGV4dCIsYy5yZXF1aXJlZD0hMSxjLnNvcnQ9Im5vbmUiLGMuYnVzeT0hMSxjLmRpc2FibGVkPSExLGMuaGlkZGVuPSExLGMuaW52YWxpZD0iZmFsc2UiLGMpKSxjPVhiLGIgaW4gYz9hLnNldEF0dHJpYnV0ZShkLApjW2JdKTphLnJlbW92ZUF0dHJpYnV0ZShkKSk6YS5zZXRBdHRyaWJ1dGUoZCxjKX0sJGI9ZnVuY3Rpb24oYSl7cChhLCJBUklBIGF0dHJpYnV0ZSBjYW5ub3QgYmUgZW1wdHkuIik7cChDYShXYixhKSwiTm8gc3VjaCBBUklBIGF0dHJpYnV0ZSAiK2EpO3JldHVybiJhcmlhLSIrYX07dmFyIGRjPWZ1bmN0aW9uKGEsYixjLGQsZSxmKXtpZih2JiZlKXJldHVybiBiYyhhKTtpZihlJiYhZClyZXR1cm4hMTtpZighdCl7dHlwZW9mIGI9PT0ibnVtYmVyIiYmKGI9Y2MoYikpO3ZhciBoPWI9PTE3fHxiPT0xOHx8diYmYj09OTE7aWYoKCFjfHx2KSYmaHx8diYmYj09MTYmJihkfHxmKSlyZXR1cm4hMX1pZih1JiZkJiZjKXN3aXRjaChhKXtjYXNlIDIyMDpjYXNlIDIxOTpjYXNlIDIyMTpjYXNlIDE5MjpjYXNlIDE4NjpjYXNlIDE4OTpjYXNlIDE4NzpjYXNlIDE4ODpjYXNlIDE5MDpjYXNlIDE5MTpjYXNlIDE5MjpjYXNlIDIyMjpyZXR1cm4hMX1zd2l0Y2goYSl7Y2FzZSAxMzpyZXR1cm4gdD9mfHxlPyExOiEoYyYmZCk6ITA7Y2FzZSAyNzpyZXR1cm4hdSYmIXR9cmV0dXJuIHQmJihkfHxlfHxmKT8hMTpiYyhhKX0sYmM9ZnVuY3Rpb24oYSl7aWYoYT49NDgmJmE8PTU3fHxhPj05NiYmYTw9MTA2fHxhPj02NSYmYTw9OTB8fHUmJmE9PTApcmV0dXJuITA7c3dpdGNoKGEpe2Nhc2UgMzI6Y2FzZSA0MzpjYXNlIDYzOmNhc2UgNjQ6Y2FzZSAxMDc6Y2FzZSAxMDk6Y2FzZSAxMTA6Y2FzZSAxMTE6Y2FzZSAxODY6Y2FzZSA1OTpjYXNlIDE4OTpjYXNlIDE4NzpjYXNlIDYxOmNhc2UgMTg4OmNhc2UgMTkwOmNhc2UgMTkxOmNhc2UgMTkyOmNhc2UgMjIyOmNhc2UgMjE5OmNhc2UgMjIwOmNhc2UgMjIxOmNhc2UgMTYzOmNhc2UgNTg6cmV0dXJuITA7CmNhc2UgMTczOmNhc2UgMTcxOnJldHVybiB0O2RlZmF1bHQ6cmV0dXJuITF9fSxjYz1mdW5jdGlvbihhKXtpZih0KWE9ZWMoYSk7ZWxzZSBpZih2JiZ1KXN3aXRjaChhKXtjYXNlIDkzOmE9OTF9cmV0dXJuIGF9LGVjPWZ1bmN0aW9uKGEpe3N3aXRjaChhKXtjYXNlIDYxOnJldHVybiAxODc7Y2FzZSA1OTpyZXR1cm4gMTg2O2Nhc2UgMTczOnJldHVybiAxODk7Y2FzZSAyMjQ6cmV0dXJuIDkxO2Nhc2UgMDpyZXR1cm4gMjI0O2RlZmF1bHQ6cmV0dXJuIGF9fTt2YXIgZmM9ZnVuY3Rpb24oYSxiLGMsZCl7ei5jYWxsKHRoaXMsZCk7dGhpcy50eXBlPSJrZXkiO3RoaXMuZz1hO3RoaXMucmVwZWF0PWN9O24oZmMseik7dmFyIEo9ZnVuY3Rpb24oYSxiKXtELmNhbGwodGhpcyk7YSYmZ2ModGhpcyxhLGIpfTtuKEosRCk7Zz1KLnByb3RvdHlwZTtnLlI9bnVsbDtnLnFhPW51bGw7Zy5KYT1udWxsO2cucmE9bnVsbDtnLkY9LTE7Zy5LPS0xO2cuRGE9ITE7CnZhciBoYz17MzoxMywxMjoxNDQsNjMyMzI6MzgsNjMyMzM6NDAsNjMyMzQ6MzcsNjMyMzU6MzksNjMyMzY6MTEyLDYzMjM3OjExMyw2MzIzODoxMTQsNjMyMzk6MTE1LDYzMjQwOjExNiw2MzI0MToxMTcsNjMyNDI6MTE4LDYzMjQzOjExOSw2MzI0NDoxMjAsNjMyNDU6MTIxLDYzMjQ2OjEyMiw2MzI0NzoxMjMsNjMyNDg6NDQsNjMyNzI6NDYsNjMyNzM6MzYsNjMyNzU6MzUsNjMyNzY6MzMsNjMyNzc6MzQsNjMyODk6MTQ0LDYzMzAyOjQ1fSxpYz17VXA6MzgsRG93bjo0MCxMZWZ0OjM3LFJpZ2h0OjM5LEVudGVyOjEzLEYxOjExMixGMjoxMTMsRjM6MTE0LEY0OjExNSxGNToxMTYsRjY6MTE3LEY3OjExOCxGODoxMTksRjk6MTIwLEYxMDoxMjEsRjExOjEyMixGMTI6MTIzLCJVKzAwN0YiOjQ2LEhvbWU6MzYsRW5kOjM1LFBhZ2VVcDozMyxQYWdlRG93bjozNCxJbnNlcnQ6NDV9LGpjPXYmJnQ7CkoucHJvdG90eXBlLmc9ZnVuY3Rpb24oYSl7dSYmKHRoaXMuRj09MTcmJiFhLmN0cmxLZXl8fHRoaXMuRj09MTgmJiFhLmFsdEtleXx8diYmdGhpcy5GPT05MSYmIWEubWV0YUtleSkmJih0aGlzLks9dGhpcy5GPS0xKTt0aGlzLkY9PS0xJiYoYS5jdHJsS2V5JiZhLmchPTE3P3RoaXMuRj0xNzphLmFsdEtleSYmYS5nIT0xOD90aGlzLkY9MTg6YS5tZXRhS2V5JiZhLmchPTkxJiYodGhpcy5GPTkxKSk7ZGMoYS5nLHRoaXMuRixhLnNoaWZ0S2V5LGEuY3RybEtleSxhLmFsdEtleSxhLm1ldGFLZXkpPyh0aGlzLks9Y2MoYS5nKSxqYyYmKHRoaXMuRGE9YS5hbHRLZXkpKTp0aGlzLmhhbmRsZUV2ZW50KGEpfTtKLnByb3RvdHlwZS5oPWZ1bmN0aW9uKGEpe3RoaXMuSz10aGlzLkY9LTE7dGhpcy5EYT1hLmFsdEtleX07CkoucHJvdG90eXBlLmhhbmRsZUV2ZW50PWZ1bmN0aW9uKGEpe3ZhciBiPWEuaCxjPWIuYWx0S2V5O2lmKHUmJmEudHlwZT09ImtleXByZXNzIil7dmFyIGQ9dGhpcy5LO3ZhciBlPWIuY2hhckNvZGU+PTAmJmIuY2hhckNvZGU8NjMyMzImJmJjKGQpP2IuY2hhckNvZGU6MH1lbHNlIGEudHlwZT09ImtleXByZXNzIj8oamMmJihjPXRoaXMuRGEpLGIua2V5Q29kZT09Yi5jaGFyQ29kZT9iLmtleUNvZGU8MzI/KGQ9Yi5rZXlDb2RlLGU9MCk6KGQ9dGhpcy5LLGU9Yi5jaGFyQ29kZSk6KGQ9Yi5rZXlDb2RlfHx0aGlzLkssZT1iLmNoYXJDb2RlfHwwKSk6KGQ9Yi5rZXlDb2RlfHx0aGlzLkssZT1iLmNoYXJDb2RlfHwwKSx2JiZlPT02MyYmZD09MjI0JiYoZD0xOTEpO3ZhciBmPWQ9Y2MoZCk7ZD9kPj02MzIzMiYmZCBpbiBoYz9mPWhjW2RdOmQ9PTI1JiZhLnNoaWZ0S2V5JiYoZj05KTpiLmtleUlkZW50aWZpZXImJmIua2V5SWRlbnRpZmllciBpbiBpYyYmKGY9aWNbYi5rZXlJZGVudGlmaWVyXSk7CmlmKCF0fHxhLnR5cGUhPSJrZXlwcmVzcyJ8fGRjKGYsdGhpcy5GLGEuc2hpZnRLZXksYS5jdHJsS2V5LGMsYS5tZXRhS2V5KSlhPWY9PXRoaXMuRix0aGlzLkY9ZixiPW5ldyBmYyhmLGUsYSxiKSxiLmFsdEtleT1jLEUodGhpcyxiKX07Si5wcm90b3R5cGUuaT1mdW5jdGlvbigpe3JldHVybiB0aGlzLlJ9O3ZhciBnYz1mdW5jdGlvbihhLGIsYyl7YS5yYSYma2MoYSk7YS5SPWI7YS5xYT11YihhLlIsImtleXByZXNzIixhLGMpO2EuSmE9dWIoYS5SLCJrZXlkb3duIixhLmcsYyxhKTthLnJhPXViKGEuUiwia2V5dXAiLGEuaCxjLGEpfSxrYz1mdW5jdGlvbihhKXthLnFhJiYoQShhLnFhKSxBKGEuSmEpLEEoYS5yYSksYS5xYT1udWxsLGEuSmE9bnVsbCxhLnJhPW51bGwpO2EuUj1udWxsO2EuRj0tMTthLks9LTF9O0oucHJvdG90eXBlLkM9ZnVuY3Rpb24oKXtKLmwuQy5jYWxsKHRoaXMpO2tjKHRoaXMpfTt2YXIgSz17Z2E6Im1vdXNlZG93biIsaGE6Im1vdXNldXAiLGZhOiJtb3VzZWNhbmNlbCIsc2M6Im1vdXNlbW92ZSIsdWM6Im1vdXNlb3ZlciIsdGM6Im1vdXNlb3V0IixxYzoibW91c2VlbnRlciIscmM6Im1vdXNlbGVhdmUifTt2YXIgbGM9ZnVuY3Rpb24oYSl7cmV0dXJuIHR5cGVvZiBhLmNsYXNzTmFtZT09InN0cmluZyI/YS5jbGFzc05hbWU6YS5nZXRBdHRyaWJ1dGUmJmEuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIn0sTD1mdW5jdGlvbihhKXtyZXR1cm4gYS5jbGFzc0xpc3Q/YS5jbGFzc0xpc3Q6bGMoYSkubWF0Y2goL1xTKy9nKXx8W119LG1jPWZ1bmN0aW9uKGEsYil7dHlwZW9mIGEuY2xhc3NOYW1lPT0ic3RyaW5nIj9hLmNsYXNzTmFtZT1iOmEuc2V0QXR0cmlidXRlJiZhLnNldEF0dHJpYnV0ZSgiY2xhc3MiLGIpfSxuYz1mdW5jdGlvbihhLGIpe2EuY2xhc3NMaXN0P2I9YS5jbGFzc0xpc3QuY29udGFpbnMoYik6KGE9TChhKSxiPXZhKGEsYik+PTApO3JldHVybiBifSxvYz1mdW5jdGlvbihhLGIpe2lmKGEuY2xhc3NMaXN0KWEuY2xhc3NMaXN0LmFkZChiKTtlbHNlIGlmKCFuYyhhLGIpKXt2YXIgYz1sYyhhKTttYyhhLGMrKGMubGVuZ3RoPjA/IiAiK2I6YikpfX0scGM9ZnVuY3Rpb24oYSxiKXtpZihhLmNsYXNzTGlzdClBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGIsCmZ1bmN0aW9uKGUpe29jKGEsZSl9KTtlbHNle3ZhciBjPXt9O0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoTChhKSxmdW5jdGlvbihlKXtjW2VdPSEwfSk7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChiLGZ1bmN0aW9uKGUpe2NbZV09ITB9KTtiPSIiO2Zvcih2YXIgZCBpbiBjKWIrPWIubGVuZ3RoPjA/IiAiK2Q6ZDttYyhhLGIpfX0scWM9ZnVuY3Rpb24oYSxiKXthLmNsYXNzTGlzdD9hLmNsYXNzTGlzdC5yZW1vdmUoYik6bmMoYSxiKSYmbWMoYSxBcnJheS5wcm90b3R5cGUuZmlsdGVyLmNhbGwoTChhKSxmdW5jdGlvbihjKXtyZXR1cm4gYyE9Yn0pLmpvaW4oIiAiKSl9LHJjPWZ1bmN0aW9uKGEsYil7YS5jbGFzc0xpc3Q/QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChiLGZ1bmN0aW9uKGMpe3FjKGEsYyl9KTptYyhhLEFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbChMKGEpLGZ1bmN0aW9uKGMpe3JldHVybiEodmEoYixjKT49MCl9KS5qb2luKCIgIikpfTt2YXIgdGM9ZnVuY3Rpb24oYSxiKXtpZighYSl0aHJvdyBFcnJvcigiSW52YWxpZCBjbGFzcyBuYW1lICIrYSk7aWYodHlwZW9mIGIhPT0iZnVuY3Rpb24iKXRocm93IEVycm9yKCJJbnZhbGlkIGRlY29yYXRvciBmdW5jdGlvbiAiK2IpO3NjW2FdPWJ9LHVjPXt9LHNjPXt9O3ZhciB2Yz1mdW5jdGlvbihhKXt0aGlzLkE9YX07aWEodmMpO3ZhciB3Yz1mdW5jdGlvbihhLGIpe2EmJihhLnRhYkluZGV4PWI/MDotMSl9LHljPWZ1bmN0aW9uKGEsYixjKXtjLmlkJiZQYihiLGMuaWQpO3ZhciBkPWEuZygpLGU9ITEsZj1MKGMpO2YmJkFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoZixmdW5jdGlvbihoKXtoPT1kP2U9ITA6aCYmdGhpcy51KGIsaCxkKX0sYSk7ZXx8b2MoYyxkKTt4YyhiLGMpO3JldHVybiBjfTt2Yy5wcm90b3R5cGUudT1mdW5jdGlvbihhLGIsYyl7Yj09YysiLWRpc2FibGVkIj9hLlgoITEpOmI9PWMrIi1ob3Jpem9udGFsIj96YyhhLCJob3Jpem9udGFsIik6Yj09YysiLXZlcnRpY2FsIiYmemMoYSwidmVydGljYWwiKX07CnZhciB4Yz1mdW5jdGlvbihhLGIpe2lmKGIpZm9yKHZhciBjPWIuZmlyc3RDaGlsZCxkO2MmJmMucGFyZW50Tm9kZT09Yjspe2Q9Yy5uZXh0U2libGluZztpZihjLm5vZGVUeXBlPT0xKXthOnt2YXIgZT1jO3AoZSk7ZT1MKGUpO2Zvcih2YXIgZj1lLmxlbmd0aCxoPTA7aDxmO2grKyl7dmFyIGs9ZVtoXTtpZihrPWsgaW4gc2M/c2Nba10oKTpudWxsKXtlPWs7YnJlYWsgYX19ZT1udWxsfWUmJihlLmc9YyxhLmlzRW5hYmxlZCgpfHxlLlgoITEpLGEuQmEoZSksU2IoZSxjKSl9ZWxzZSBjLm5vZGVWYWx1ZSYmSGEoYy5ub2RlVmFsdWUpIT0iInx8Yi5yZW1vdmVDaGlsZChjKTtjPWR9fSxBYz1mdW5jdGlvbihhLGIpe2I9Yi5pKCk7cChiLCJUaGUgY29udGFpbmVyIERPTSBlbGVtZW50IGNhbm5vdCBiZSBudWxsLiIpO0tiKGIsdCk7KGE9YS5BKSYmWmIoYixhKX07dmMucHJvdG90eXBlLmc9ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy1jb250YWluZXIifTsKdmMucHJvdG90eXBlLmo9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nKCksYz1bYixhLkw9PSJob3Jpem9udGFsIj9iKyItaG9yaXpvbnRhbCI6YisiLXZlcnRpY2FsIl07YS5pc0VuYWJsZWQoKXx8Yy5wdXNoKGIrIi1kaXNhYmxlZCIpO3JldHVybiBjfTt2YXIgQmM9ZnVuY3Rpb24oKXt9O3ZhciBNPWZ1bmN0aW9uKCl7fSxDYztpYShNKTt2YXIgRGM9e2J1dHRvbjoicHJlc3NlZCIsY2hlY2tib3g6ImNoZWNrZWQiLG1lbnVpdGVtOiJzZWxlY3RlZCIsbWVudWl0ZW1jaGVja2JveDoiY2hlY2tlZCIsbWVudWl0ZW1yYWRpbzoiY2hlY2tlZCIscmFkaW86ImNoZWNrZWQiLHRhYjoic2VsZWN0ZWQiLHRyZWVpdGVtOiJzZWxlY3RlZCJ9O00ucHJvdG90eXBlLk5hPWZ1bmN0aW9uKCl7fTtNLnByb3RvdHlwZS54YT1mdW5jdGlvbihhKXt2YXIgYj1hLkcsYz1iLmgsZD10aGlzLk4oKSxlPVtkXSxmPXRoaXMuTigpO2YhPWQmJmUucHVzaChmKTtkPWEubTtmb3IoZj1bXTtkOyl7dmFyIGg9ZCYtZDtmLnB1c2goRWModGhpcyxoKSk7ZCY9fmh9ZS5wdXNoLmFwcGx5KGUsZik7KGQ9YS5GYSkmJmUucHVzaC5hcHBseShlLGQpO3JldHVybiBjLmNhbGwoYiwiRElWIixlLmpvaW4oIiAiKSxhLmlhKX07Ck0ucHJvdG90eXBlLnlhPWZ1bmN0aW9uKGEsYil7Yi5pZCYmUGIoYSxiLmlkKTtiJiZiLmZpcnN0Q2hpbGQ/RmMoYSxiLmZpcnN0Q2hpbGQubmV4dFNpYmxpbmc/eWEoYi5jaGlsZE5vZGVzKTpiLmZpcnN0Q2hpbGQpOmEuaWE9bnVsbDt2YXIgYz0wLGQ9dGhpcy5OKCksZT10aGlzLk4oKSxmPSExLGg9ITEsaz15YShMKGIpKTtrLmZvckVhY2goZnVuY3Rpb24ocSl7Znx8cSE9ZD9ofHxxIT1lP2N8PUdjKHRoaXMscSk6aD0hMDooZj0hMCxlPT1kJiYoaD0hMCkpO0djKHRoaXMscSk9PTEmJihzYShiKSxkYihiKSYmZWIoYikmJmNiKGIsITEpKX0sdGhpcyk7YS5tPWM7Znx8KGsucHVzaChkKSxlPT1kJiYoaD0hMCkpO2h8fGsucHVzaChlKTsoYT1hLkZhKSYmay5wdXNoLmFwcGx5KGssYSk7ZiYmaCYmIWF8fG1jKGIsay5qb2luKCIgIikpO3JldHVybiBifTsKdmFyIEhjPWZ1bmN0aW9uKGEsYil7aWYoYT1hLk5hKCkpe3AoYiwiVGhlIGVsZW1lbnQgcGFzc2VkIGFzIGEgZmlyc3QgcGFyYW1ldGVyIGNhbm5vdCBiZSBudWxsLiIpO3ZhciBjPWIuZ2V0QXR0cmlidXRlKCJyb2xlIil8fG51bGw7YSE9YyYmWmIoYixhKX19LEljPWZ1bmN0aW9uKGEsYil7dmFyIGM7aWYoYS5EJjMyJiYoYz1hLmkoKSkpe2lmKCFiJiZhLm0mMzIpe3RyeXtjLmJsdXIoKX1jYXRjaChkKXt9YS5tJjMyJiZhLlFhKG51bGwpfShkYihjKSYmZWIoYykpIT1iJiZjYihjLGIpfX0sSmM9ZnVuY3Rpb24oYSxiLGMpe0NjfHwoQ2M9ezE6ImRpc2FibGVkIiw4OiJzZWxlY3RlZCIsMTY6ImNoZWNrZWQiLDY0OiJleHBhbmRlZCJ9KTtwKGEsIlRoZSBlbGVtZW50IHBhc3NlZCBhcyBhIGZpcnN0IHBhcmFtZXRlciBjYW5ub3QgYmUgbnVsbC4iKTtiPUNjW2JdO3ZhciBkPWEuZ2V0QXR0cmlidXRlKCJyb2xlIil8fG51bGw7ZCYmKGQ9RGNbZF18fGIsYj1iPT0iY2hlY2tlZCJ8fGI9PQoic2VsZWN0ZWQiP2Q6Yik7YiYmYWMoYSxiLGMpfTtNLnByb3RvdHlwZS5OPWZ1bmN0aW9uKCl7cmV0dXJuImdvb2ctY29udHJvbCJ9O3ZhciBFYz1mdW5jdGlvbihhLGIpe2EuZ3x8S2MoYSk7cmV0dXJuIGEuZ1tiXX0sR2M9ZnVuY3Rpb24oYSxiKXthLmh8fChhLmd8fEtjKGEpLGEuaD1FYShhLmcpKTthPXBhcnNlSW50KGEuaFtiXSwxMCk7cmV0dXJuIGlzTmFOKGEpPzA6YX0sS2M9ZnVuY3Rpb24oYSl7dmFyIGI9YS5OKCk7dmFyIGM9Yi5yZXBsYWNlKC9ceGEwfFxzL2csIiAiKS5pbmRleE9mKCIgIikhPS0xO3AoIWMsIkNvbnRyb2xSZW5kZXJlciBoYXMgYW4gaW52YWxpZCBjc3MgY2xhc3M6ICciK2IrIiciKTthLmc9ezE6YisiLWRpc2FibGVkIiwyOmIrIi1ob3ZlciIsNDpiKyItYWN0aXZlIiw4OmIrIi1zZWxlY3RlZCIsMTY6YisiLWNoZWNrZWQiLDMyOmIrIi1mb2N1c2VkIiw2NDpiKyItb3BlbiJ9fTt2YXIgTj1mdW5jdGlvbihhLGIsYyl7Ri5jYWxsKHRoaXMsYyk7aWYoIWIpe2ZvcihiPXRoaXMuY29uc3RydWN0b3I7Yjspe3ZhciBkPW5hKGIpO2lmKGQ9dWNbZF0pYnJlYWs7Yj0oYj1PYmplY3QuZ2V0UHJvdG90eXBlT2YoYi5wcm90b3R5cGUpKSYmYi5jb25zdHJ1Y3Rvcn1iPWQ/dHlwZW9mIGQuVj09PSJmdW5jdGlvbiI/ZC5WKCk6bmV3IGQ6bnVsbH10aGlzLnY9Yjt0aGlzLmlhPWEhPT12b2lkIDA/YTpudWxsfTtuKE4sRik7Zz1OLnByb3RvdHlwZTtnLmlhPW51bGw7Zy5tPTA7Zy5EPTM5O2cuUD0wO2cuT2E9ITA7Zy5GYT1udWxsO2cuSGE9ITA7Zy5tYT1mdW5jdGlvbigpe3ZhciBhPXRoaXMudi54YSh0aGlzKTt0aGlzLmc9YTtIYyh0aGlzLnYsYSk7S2IoYSwhMCk7dGhpcy5pc1Zpc2libGUoKXx8KGEuc3R5bGUuZGlzcGxheT0ibm9uZSIsYSYmYWMoYSwiaGlkZGVuIiwhMCkpfTtnLm5hPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaSgpfTtnLndhPWZ1bmN0aW9uKCl7cmV0dXJuITB9OwpnLkVhPWZ1bmN0aW9uKGEpe3RoaXMuZz1hPXRoaXMudi55YSh0aGlzLGEpO0hjKHRoaXMudixhKTtLYihhLCEwKTt0aGlzLk9hPWEuc3R5bGUuZGlzcGxheSE9Im5vbmUifTsKZy5JPWZ1bmN0aW9uKCl7Ti5sLkkuY2FsbCh0aGlzKTt2YXIgYT10aGlzLmc7cChhLCJDYW4gbm90IGNhbGwgZ2V0RWxlbWVudFN0cmljdCBiZWZvcmUgcmVuZGVyaW5nL2RlY29yYXRpbmcuIik7cCh0aGlzKTtwKGEpO3RoaXMuaXNWaXNpYmxlKCl8fGFjKGEsImhpZGRlbiIsIXRoaXMuaXNWaXNpYmxlKCkpO3RoaXMuaXNFbmFibGVkKCl8fEpjKGEsMSwhdGhpcy5pc0VuYWJsZWQoKSk7dGhpcy5EJjgmJkpjKGEsOCwhISh0aGlzLm0mOCkpO3RoaXMuRCYxNiYmSmMoYSwxNiwhISh0aGlzLm0mMTYpKTt0aGlzLkQmNjQmJkpjKGEsNjQsISEodGhpcy5tJjY0KSk7dmFyIGI9dGhpcy52O1ViKHRoaXMpJiYoYT10aGlzLmkoKSxiPWIuTigpKyItcnRsIiwoYT1hLmk/YS5pKCk6YSkmJnBjKGEsW2JdKSk7dGhpcy5pc0VuYWJsZWQoKSYmSWModGhpcyx0aGlzLmlzVmlzaWJsZSgpKTt0aGlzLkQmLTImJih0aGlzLkhhJiZMYyh0aGlzLCEwKSx0aGlzLkQmMzImJihhPXRoaXMuaSgpKSkmJihiPQp0aGlzLlp8fCh0aGlzLlo9bmV3IEopLGdjKGIsYSksQihCKEIoUWIodGhpcyksYiwia2V5Iix0aGlzLmFhKSxhLCJmb2N1cyIsdGhpcy5YYSksYSwiYmx1ciIsdGhpcy5RYSkpfTt2YXIgTGM9ZnVuY3Rpb24oYSxiKXt2YXIgYz1RYihhKSxkPWEuaSgpO2I/KEIoQihCKEIoYyxkLEsuZ2EsYS5zYSksZCxbSy5oYSxLLmZhXSxhLnZhKSxkLCJtb3VzZW92ZXIiLGEudWEpLGQsIm1vdXNlb3V0IixhLnRhKSxhLmNhIT1CYyYmQihjLGQsImNvbnRleHRtZW51IixhLmNhKSk6KEMoQyhDKEMoYyxkLEsuZ2EsYS5zYSksZCxbSy5oYSxLLmZhXSxhLnZhKSxkLCJtb3VzZW92ZXIiLGEudWEpLGQsIm1vdXNlb3V0IixhLnRhKSxhLmNhIT1CYyYmQyhjLGQsImNvbnRleHRtZW51IixhLmNhKSl9O04ucHJvdG90eXBlLlU9ZnVuY3Rpb24oKXtOLmwuVS5jYWxsKHRoaXMpO3RoaXMuWiYma2ModGhpcy5aKTt0aGlzLmlzVmlzaWJsZSgpJiZ0aGlzLmlzRW5hYmxlZCgpJiZJYyh0aGlzLCExKX07Ck4ucHJvdG90eXBlLkM9ZnVuY3Rpb24oKXtOLmwuQy5jYWxsKHRoaXMpO3RoaXMuWiYmKHRoaXMuWi5kaXNwb3NlKCksZGVsZXRlIHRoaXMuWik7ZGVsZXRlIHRoaXMudjt0aGlzLkZhPXRoaXMuaWE9bnVsbH07dmFyIEZjPWZ1bmN0aW9uKGEsYil7YS5pYT1ifTtOLnByb3RvdHlwZS5pc1Zpc2libGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5PYX07Ti5wcm90b3R5cGUuaXNFbmFibGVkPWZ1bmN0aW9uKCl7cmV0dXJuISh0aGlzLm0mMSl9O04ucHJvdG90eXBlLlg9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5oO2ImJnR5cGVvZiBiLmlzRW5hYmxlZD09ImZ1bmN0aW9uIiYmIWIuaXNFbmFibGVkKCl8fCFPKHRoaXMsMSwhYSl8fChhfHwoTWModGhpcywhMSksUCh0aGlzLCExKSksdGhpcy5pc1Zpc2libGUoKSYmSWModGhpcyxhKSxUKHRoaXMsMSwhYSwhMCkpfTt2YXIgUD1mdW5jdGlvbihhLGIpe08oYSwyLGIpJiZUKGEsMixiKX07Ck4ucHJvdG90eXBlLmlzQWN0aXZlPWZ1bmN0aW9uKCl7cmV0dXJuISEodGhpcy5tJjQpfTsKdmFyIE1jPWZ1bmN0aW9uKGEsYil7TyhhLDQsYikmJlQoYSw0LGIpfSxOYz1mdW5jdGlvbihhLGIpe08oYSw4LGIpJiZUKGEsOCxiKX0sT2M9ZnVuY3Rpb24oYSxiKXtPKGEsNjQsYikmJlQoYSw2NCxiKX0sVD1mdW5jdGlvbihhLGIsYyxkKXtpZighZCYmYj09MSlhLlgoIWMpO2Vsc2UgaWYoYS5EJmImJmMhPSEhKGEubSZiKSl7dmFyIGU9YS52O2lmKGQ9YS5pKCkpe2lmKGU9RWMoZSxiKSl7dmFyIGY9YS5pP2EuaSgpOmE7ZiYmKGM/cGM6cmMpKGYsW2VdKX1KYyhkLGIsYyl9YS5tPWM/YS5tfGI6YS5tJn5ifX0sUGM9ZnVuY3Rpb24oYSxiLGMpe2lmKGEucyYmYS5tJmImJiFjKXRocm93IEVycm9yKCJDb21wb25lbnQgYWxyZWFkeSByZW5kZXJlZCIpOyFjJiZhLm0mYiYmVChhLGIsITEpO2EuRD1jP2EuRHxiOmEuRCZ+Yn0sVT1mdW5jdGlvbihhLGIpe3JldHVybiEhKDI1NSZiKSYmISEoYS5EJmIpfSxPPWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4hIShhLkQmYikmJiEhKGEubSZiKSE9CmMmJighKGEuUCZiKXx8RShhLE5iKGIsYykpKSYmIWEuYmF9O04ucHJvdG90eXBlLnVhPWZ1bmN0aW9uKGEpeyFRYyhhLHRoaXMuaSgpKSYmRSh0aGlzLCJlbnRlciIpJiZ0aGlzLmlzRW5hYmxlZCgpJiZVKHRoaXMsMikmJlAodGhpcywhMCl9O04ucHJvdG90eXBlLnRhPWZ1bmN0aW9uKGEpeyFRYyhhLHRoaXMuaSgpKSYmRSh0aGlzLCJsZWF2ZSIpJiYoVSh0aGlzLDQpJiZNYyh0aGlzLCExKSxVKHRoaXMsMikmJlAodGhpcywhMSkpfTtOLnByb3RvdHlwZS5jYT1CYzt2YXIgUWM9ZnVuY3Rpb24oYSxiKXtyZXR1cm4hIWEucmVsYXRlZFRhcmdldCYmYWIoYixhLnJlbGF0ZWRUYXJnZXQpfTsKTi5wcm90b3R5cGUuc2E9ZnVuY3Rpb24oYSl7aWYodGhpcy5pc0VuYWJsZWQoKSYmKFUodGhpcywyKSYmUCh0aGlzLCEwKSwhKGEuaC5idXR0b24hPTB8fHYmJmEuY3RybEtleSkpKXtVKHRoaXMsNCkmJk1jKHRoaXMsITApO3ZhciBiO2lmKGI9dGhpcy52KXt2YXIgYztiPXRoaXMuRCYzMiYmKGM9dGhpcy5pKCkpP2RiKGMpJiZlYihjKTohMX1iJiZ0aGlzLmkoKS5mb2N1cygpfWEuaC5idXR0b24hPTB8fHYmJmEuY3RybEtleXx8YS5qKCl9O04ucHJvdG90eXBlLnZhPWZ1bmN0aW9uKGEpe3RoaXMuaXNFbmFibGVkKCkmJihVKHRoaXMsMikmJlAodGhpcywhMCksdGhpcy5pc0FjdGl2ZSgpJiZSYyh0aGlzLGEpJiZVKHRoaXMsNCkmJk1jKHRoaXMsITEpKX07CnZhciBSYz1mdW5jdGlvbihhLGIpe2lmKFUoYSwxNikpe3ZhciBjPSEoYS5tJjE2KTtPKGEsMTYsYykmJlQoYSwxNixjKX1VKGEsOCkmJk5jKGEsITApO1UoYSw2NCkmJk9jKGEsIShhLm0mNjQpKTtjPW5ldyB5KCJhY3Rpb24iLGEpO2ImJihjLmFsdEtleT1iLmFsdEtleSxjLmN0cmxLZXk9Yi5jdHJsS2V5LGMubWV0YUtleT1iLm1ldGFLZXksYy5zaGlmdEtleT1iLnNoaWZ0S2V5LGMuRz1iLkcsYy50aW1lU3RhbXA9Yi50aW1lU3RhbXApO3JldHVybiBFKGEsYyl9O04ucHJvdG90eXBlLlhhPWZ1bmN0aW9uKCl7VSh0aGlzLDMyKSYmTyh0aGlzLDMyLCEwKSYmVCh0aGlzLDMyLCEwKX07Ti5wcm90b3R5cGUuUWE9ZnVuY3Rpb24oKXtVKHRoaXMsNCkmJk1jKHRoaXMsITEpO1UodGhpcywzMikmJk8odGhpcywzMiwhMSkmJlQodGhpcywzMiwhMSl9OwpOLnByb3RvdHlwZS5hYT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5pc1Zpc2libGUoKSYmdGhpcy5pc0VuYWJsZWQoKSYmYS5nPT0xMyYmUmModGhpcyxhKT8oYS5qKCksYS52KCksITApOiExfTtpZih0eXBlb2YgTiE9PSJmdW5jdGlvbiIpdGhyb3cgRXJyb3IoIkludmFsaWQgY29tcG9uZW50IGNsYXNzICIrTik7aWYodHlwZW9mIE0hPT0iZnVuY3Rpb24iKXRocm93IEVycm9yKCJJbnZhbGlkIHJlbmRlcmVyIGNsYXNzICIrTSk7dmFyIFNjPW5hKE4pO3VjW1NjXT1NO3RjKCJnb29nLWNvbnRyb2wiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBOKG51bGwpfSk7dmFyIFY9ZnVuY3Rpb24oYSxiLGMpe0YuY2FsbCh0aGlzLGMpO3RoaXMuZWE9Ynx8dmMuVigpO3RoaXMuTD1hfHwidmVydGljYWwifTtuKFYsRik7Zz1WLnByb3RvdHlwZTtnLkthPW51bGw7Zy5kYT1udWxsO2cuZWE9bnVsbDtnLkw9bnVsbDtnLlM9ITA7Zy5UPSEwO2cubz0tMTtnLkI9bnVsbDtnLlc9ITE7Zy5PPW51bGw7dmFyIFRjPWZ1bmN0aW9uKGEpe3JldHVybiBhLkthfHxhLmkoKX07Zz1WLnByb3RvdHlwZTtnLm1hPWZ1bmN0aW9uKCl7dGhpcy5nPXRoaXMuRy5oKCJESVYiLHRoaXMuZWEuaih0aGlzKS5qb2luKCIgIikpfTtnLm5hPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaSgpfTtnLndhPWZ1bmN0aW9uKGEpe3JldHVybiBhLnRhZ05hbWU9PSJESVYifTtnLkVhPWZ1bmN0aW9uKGEpe3RoaXMuZz15Yyh0aGlzLmVhLHRoaXMsYSk7YS5zdHlsZS5kaXNwbGF5PT0ibm9uZSImJih0aGlzLlM9ITEpfTsKZy5JPWZ1bmN0aW9uKCl7Vi5sLkkuY2FsbCh0aGlzKTtUYih0aGlzLGZ1bmN0aW9uKGIpe2IucyYmVWModGhpcyxiKX0sdGhpcyk7dmFyIGE9dGhpcy5pKCk7QWModGhpcy5lYSx0aGlzKTtWYyh0aGlzLHRoaXMuUyk7QihCKEIoQihCKEIoQihCKFFiKHRoaXMpLHRoaXMsImVudGVyIix0aGlzLmViKSx0aGlzLCJoaWdobGlnaHQiLHRoaXMuZmIpLHRoaXMsInVuaGlnaGxpZ2h0Iix0aGlzLmxiKSx0aGlzLCJvcGVuIix0aGlzLmdiKSx0aGlzLCJjbG9zZSIsdGhpcy5iYiksYSxLLmdhLHRoaXMuV2EpLGJiKGEpLFtLLmhhLEsuZmFdLHRoaXMuY2IpLGEsW0suZ2EsSy5oYSxLLmZhLCJtb3VzZW92ZXIiLCJtb3VzZW91dCIsImNvbnRleHRtZW51Il0sdGhpcy5hYik7V2ModGhpcyl9O3ZhciBXYz1mdW5jdGlvbihhKXt2YXIgYj1RYihhKSxjPVRjKGEpO0IoQihCKGIsYywiZm9jdXMiLGEuUGEpLGMsImJsdXIiLGEuVWEpLGEuZGF8fChhLmRhPW5ldyBKKFRjKGEpKSksImtleSIsYS5WYSl9OwpnPVYucHJvdG90eXBlO2cuVT1mdW5jdGlvbigpe1hjKHRoaXMsLTEpO3RoaXMuQiYmT2ModGhpcy5CLCExKTt0aGlzLlc9ITE7Vi5sLlUuY2FsbCh0aGlzKX07Zy5DPWZ1bmN0aW9uKCl7Vi5sLkMuY2FsbCh0aGlzKTt0aGlzLmRhJiYodGhpcy5kYS5kaXNwb3NlKCksdGhpcy5kYT1udWxsKTt0aGlzLmVhPXRoaXMuQj10aGlzLk89dGhpcy5LYT1udWxsfTtnLmViPWZ1bmN0aW9uKCl7cmV0dXJuITB9OwpnLmZiPWZ1bmN0aW9uKGEpe3ZhciBiPVZiKHRoaXMsYS50YXJnZXQpO2lmKGI+LTEmJmIhPXRoaXMubyl7dmFyIGM9SSh0aGlzLHRoaXMubyk7YyYmUChjLCExKTt0aGlzLm89YjtjPUkodGhpcyx0aGlzLm8pO3RoaXMuVyYmTWMoYywhMCk7dGhpcy5CJiZjIT10aGlzLkImJihjLkQmNjQ/T2MoYywhMCk6T2ModGhpcy5CLCExKSl9Yj10aGlzLmkoKTtwKGIsIlRoZSBET00gZWxlbWVudCBmb3IgdGhlIGNvbnRhaW5lciBjYW5ub3QgYmUgbnVsbC4iKTthLnRhcmdldC5pKCkhPW51bGwmJmFjKGIsImFjdGl2ZWRlc2NlbmRhbnQiLGEudGFyZ2V0LmkoKS5pZCl9O2cubGI9ZnVuY3Rpb24oYSl7YS50YXJnZXQ9PUkodGhpcyx0aGlzLm8pJiYodGhpcy5vPS0xKTthPXRoaXMuaSgpO3AoYSwiVGhlIERPTSBlbGVtZW50IGZvciB0aGUgY29udGFpbmVyIGNhbm5vdCBiZSBudWxsLiIpO2EucmVtb3ZlQXR0cmlidXRlKCRiKCJhY3RpdmVkZXNjZW5kYW50IikpfTsKZy5nYj1mdW5jdGlvbihhKXsoYT1hLnRhcmdldCkmJmEhPXRoaXMuQiYmYS5oPT10aGlzJiYodGhpcy5CJiZPYyh0aGlzLkIsITEpLHRoaXMuQj1hKX07Zy5iYj1mdW5jdGlvbihhKXthLnRhcmdldD09dGhpcy5CJiYodGhpcy5CPW51bGwpO3ZhciBiPXRoaXMuaSgpLGM9YS50YXJnZXQuaSgpO2ImJmEudGFyZ2V0Lm0mMiYmYyYmKGE9IiIsYyYmKGE9Yy5pZCxwKGEsIlRoZSBhY3RpdmUgZWxlbWVudCBzaG91bGQgaGF2ZSBhbiBpZC4iKSksYWMoYiwiYWN0aXZlZGVzY2VuZGFudCIsYSkpfTtnLldhPWZ1bmN0aW9uKGEpe3RoaXMuVCYmKHRoaXMuVz0hMCk7dmFyIGI9VGModGhpcyk7YiYmZGIoYikmJmViKGIpP2IuZm9jdXMoKTphLmooKX07Zy5jYj1mdW5jdGlvbigpe3RoaXMuVz0hMX07CmcuYWI9ZnVuY3Rpb24oYSl7YTp7dmFyIGI9YS50YXJnZXQ7aWYodGhpcy5PKWZvcih2YXIgYz10aGlzLmkoKTtiJiZiIT09Yzspe3ZhciBkPWIuaWQ7aWYoZCBpbiB0aGlzLk8pe2I9dGhpcy5PW2RdO2JyZWFrIGF9Yj1iLnBhcmVudE5vZGV9Yj1udWxsfWlmKGIpc3dpdGNoKGEudHlwZSl7Y2FzZSBLLmdhOmIuc2EoYSk7YnJlYWs7Y2FzZSBLLmhhOmNhc2UgSy5mYTpiLnZhKGEpO2JyZWFrO2Nhc2UgIm1vdXNlb3ZlciI6Yi51YShhKTticmVhaztjYXNlICJtb3VzZW91dCI6Yi50YShhKTticmVhaztjYXNlICJjb250ZXh0bWVudSI6Yi5jYShhKX19O2cuUGE9ZnVuY3Rpb24oKXt9O2cuVWE9ZnVuY3Rpb24oKXtYYyh0aGlzLC0xKTt0aGlzLlc9ITE7dGhpcy5CJiZPYyh0aGlzLkIsITEpfTsKZy5WYT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5pc0VuYWJsZWQoKSYmdGhpcy5pc1Zpc2libGUoKSYmKEgodGhpcykhPTB8fHRoaXMuS2EpJiZZYyh0aGlzLGEpPyhhLmooKSxhLnYoKSwhMCk6ITF9Owp2YXIgWWM9ZnVuY3Rpb24oYSxiKXt2YXIgYz1JKGEsYS5vKTtpZihjJiZ0eXBlb2YgYy5hYT09ImZ1bmN0aW9uIiYmYy5hYShiKXx8YS5CJiZhLkIhPWMmJnR5cGVvZiBhLkIuYWE9PSJmdW5jdGlvbiImJmEuQi5hYShiKSlyZXR1cm4hMDtpZihiLnNoaWZ0S2V5fHxiLmN0cmxLZXl8fGIubWV0YUtleXx8Yi5hbHRLZXkpcmV0dXJuITE7c3dpdGNoKGIuZyl7Y2FzZSAyNzpUYyhhKS5ibHVyKCk7YnJlYWs7Y2FzZSAzNjpaYyhhKTticmVhaztjYXNlIDM1OiRjKGEpO2JyZWFrO2Nhc2UgMzg6aWYoYS5MPT0idmVydGljYWwiKWFkKGEpO2Vsc2UgcmV0dXJuITE7YnJlYWs7Y2FzZSAzNzppZihhLkw9PSJob3Jpem9udGFsIilVYihhKT9iZChhKTphZChhKTtlbHNlIHJldHVybiExO2JyZWFrO2Nhc2UgNDA6aWYoYS5MPT0idmVydGljYWwiKWJkKGEpO2Vsc2UgcmV0dXJuITE7YnJlYWs7Y2FzZSAzOTppZihhLkw9PSJob3Jpem9udGFsIilVYihhKT9hZChhKTpiZChhKTtlbHNlIHJldHVybiExOwpicmVhaztkZWZhdWx0OnJldHVybiExfXJldHVybiEwfSxVYz1mdW5jdGlvbihhLGIpe3ZhciBjPWIuaSgpO2M9Yy5pZHx8KGMuaWQ9T2IoYikpO2EuT3x8KGEuTz17fSk7YS5PW2NdPWJ9O1YucHJvdG90eXBlLkJhPWZ1bmN0aW9uKGEsYil7dWEoYSxOLCJUaGUgY2hpbGQgb2YgYSBjb250YWluZXIgbXVzdCBiZSBhIGNvbnRyb2wiKTtWLmwuQmEuY2FsbCh0aGlzLGEsYil9O1YucHJvdG90eXBlLkNhPWZ1bmN0aW9uKGEsYixjKXt1YShhLE4pO2EuUHw9MjthLlB8PTY0O1BjKGEsMzIsITEpO2EucyYmMCE9YS5IYSYmTGMoYSwhMSk7YS5IYT0hMTt2YXIgZD1hLmg9PXRoaXM/VmIodGhpcyxhKTotMTtWLmwuQ2EuY2FsbCh0aGlzLGEsYixjKTthLnMmJnRoaXMucyYmVWModGhpcyxhKTthPWQ7YT09LTEmJihhPUgodGhpcykpO2E9PXRoaXMubz90aGlzLm89TWF0aC5taW4oSCh0aGlzKS0xLGIpOmE+dGhpcy5vJiZiPD10aGlzLm8/dGhpcy5vKys6YTx0aGlzLm8mJmI+dGhpcy5vJiZ0aGlzLm8tLX07CnZhciB6Yz1mdW5jdGlvbihhLGIpe2lmKGEuaSgpKXRocm93IEVycm9yKCJDb21wb25lbnQgYWxyZWFkeSByZW5kZXJlZCIpO2EuTD1ifTtWLnByb3RvdHlwZS5pc1Zpc2libGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5TfTt2YXIgVmM9ZnVuY3Rpb24oYSxiKXthLlM9Yjt2YXIgYz1hLmkoKTtjJiYoYy5zdHlsZS5kaXNwbGF5PWI/IiI6Im5vbmUiLHdjKFRjKGEpLGEuVCYmYS5TKSl9O1YucHJvdG90eXBlLmlzRW5hYmxlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLlR9O1YucHJvdG90eXBlLlg9ZnVuY3Rpb24oYSl7dGhpcy5UIT1hJiZFKHRoaXMsYT8iZW5hYmxlIjoiZGlzYWJsZSIpJiYoYT8odGhpcy5UPSEwLFRiKHRoaXMsZnVuY3Rpb24oYil7Yi5UYT9kZWxldGUgYi5UYTpiLlgoITApfSkpOihUYih0aGlzLGZ1bmN0aW9uKGIpe2IuaXNFbmFibGVkKCk/Yi5YKCExKTpiLlRhPSEwfSksdGhpcy5XPXRoaXMuVD0hMSksd2MoVGModGhpcyksYSYmdGhpcy5TKSl9Owp2YXIgWGM9ZnVuY3Rpb24oYSxiKXsoYj1JKGEsYikpP1AoYiwhMCk6YS5vPi0xJiZQKEkoYSxhLm8pLCExKX0sWmM9ZnVuY3Rpb24oYSl7Y2QoYSxmdW5jdGlvbihiLGMpe3JldHVybihiKzEpJWN9LEgoYSktMSl9LCRjPWZ1bmN0aW9uKGEpe2NkKGEsZnVuY3Rpb24oYixjKXtiLS07cmV0dXJuIGI8MD9jLTE6Yn0sMCl9LGJkPWZ1bmN0aW9uKGEpe2NkKGEsZnVuY3Rpb24oYixjKXtyZXR1cm4oYisxKSVjfSxhLm8pfSxhZD1mdW5jdGlvbihhKXtjZChhLGZ1bmN0aW9uKGIsYyl7Yi0tO3JldHVybiBiPDA/Yy0xOmJ9LGEubyl9LGNkPWZ1bmN0aW9uKGEsYixjKXtjPWM8MD9WYihhLGEuQik6Yzt2YXIgZD1IKGEpO2M9Yi5jYWxsKGEsYyxkKTtmb3IodmFyIGU9MDtlPD1kOyl7dmFyIGY9SShhLGMpO2lmKGYmJmYuaXNWaXNpYmxlKCkmJmYuaXNFbmFibGVkKCkmJmYuRCYyKXthLkxhKGMpO2JyZWFrfWUrKztjPWIuY2FsbChhLGMsZCl9fTsKVi5wcm90b3R5cGUuTGE9ZnVuY3Rpb24oYSl7WGModGhpcyxhKX07dmFyIGRkPWZ1bmN0aW9uKCl7fTtuKGRkLE0pO2lhKGRkKTtnPWRkLnByb3RvdHlwZTtnLk49ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy10YWIifTtnLk5hPWZ1bmN0aW9uKCl7cmV0dXJuInRhYiJ9O2cueGE9ZnVuY3Rpb24oYSl7dmFyIGI9ZGQubC54YS5jYWxsKHRoaXMsYSk7KGE9YS5HYSgpKSYmdGhpcy5NYShiLGEpO3JldHVybiBifTtnLnlhPWZ1bmN0aW9uKGEsYil7Yj1kZC5sLnlhLmNhbGwodGhpcyxhLGIpO3ZhciBjPXRoaXMuR2EoYik7YyYmKGEuUmE9Yyk7YS5tJjgmJihjPWEuaCkmJnR5cGVvZiBjLko9PT0iZnVuY3Rpb24iJiYoVChhLDgsITEpLGMuSihhKSk7cmV0dXJuIGJ9O2cuR2E9ZnVuY3Rpb24oYSl7cmV0dXJuIGEudGl0bGV8fCIifTtnLk1hPWZ1bmN0aW9uKGEsYil7YSYmKGEudGl0bGU9Ynx8IiIpfTt2YXIgZWQ9ZnVuY3Rpb24oYSxiLGMpe04uY2FsbCh0aGlzLGEsYnx8ZGQuVigpLGMpO1BjKHRoaXMsOCwhMCk7dGhpcy5QfD05fTtuKGVkLE4pO2VkLnByb3RvdHlwZS5HYT1mdW5jdGlvbigpe3JldHVybiB0aGlzLlJhfTtlZC5wcm90b3R5cGUuTWE9ZnVuY3Rpb24oYSl7dGhpcy52Lk1hKHRoaXMuaSgpLGEpO3RoaXMuUmE9YX07dGMoImdvb2ctdGFiIixmdW5jdGlvbigpe3JldHVybiBuZXcgZWQobnVsbCl9KTt2YXIgVz1mdW5jdGlvbigpe3RoaXMuQT0idGFibGlzdCJ9O24oVyx2Yyk7aWEoVyk7Vy5wcm90b3R5cGUuZz1mdW5jdGlvbigpe3JldHVybiJnb29nLXRhYi1iYXIifTtXLnByb3RvdHlwZS51PWZ1bmN0aW9uKGEsYixjKXt0aGlzLnZ8fCh0aGlzLmh8fGZkKHRoaXMpLHRoaXMudj1FYSh0aGlzLmgpKTt2YXIgZD10aGlzLnZbYl07ZD8oemMoYSxnZChkKSksYS52PWQpOlcubC51LmNhbGwodGhpcyxhLGIsYyl9O1cucHJvdG90eXBlLmo9ZnVuY3Rpb24oYSl7dmFyIGI9Vy5sLmouY2FsbCh0aGlzLGEpO3RoaXMuaHx8ZmQodGhpcyk7Yi5wdXNoKHRoaXMuaFthLnZdKTtyZXR1cm4gYn07dmFyIGZkPWZ1bmN0aW9uKGEpe3ZhciBiPWEuZygpO2EuaD17dG9wOmIrIi10b3AiLGJvdHRvbTpiKyItYm90dG9tIixzdGFydDpiKyItc3RhcnQiLGVuZDpiKyItZW5kIn19O3ZhciBYPWZ1bmN0aW9uKGEsYixjKXthPWF8fCJ0b3AiO3pjKHRoaXMsZ2QoYSkpO3RoaXMudj1hO1YuY2FsbCh0aGlzLHRoaXMuTCxifHxXLlYoKSxjKTtoZCh0aGlzKX07bihYLFYpO2c9WC5wcm90b3R5cGU7Zy5IPW51bGw7Zy5JPWZ1bmN0aW9uKCl7WC5sLkkuY2FsbCh0aGlzKTtoZCh0aGlzKX07Zy5DPWZ1bmN0aW9uKCl7WC5sLkMuY2FsbCh0aGlzKTt0aGlzLkg9bnVsbH07Zy5MYT1mdW5jdGlvbihhKXtYLmwuTGEuY2FsbCh0aGlzLGEpO3RoaXMuSihJKHRoaXMsYSkpfTtnLko9ZnVuY3Rpb24oYSl7YT9OYyhhLCEwKTp0aGlzLkgmJk5jKHRoaXMuSCwhMSl9Owp2YXIgaWQ9ZnVuY3Rpb24oYSxiKXtpZihiJiZiPT1hLkgpe2Zvcih2YXIgYz1WYihhLGIpLGQ9Yy0xO2I9SShhLGQpO2QtLSl7dmFyIGU9YjtpZihlLmlzVmlzaWJsZSgpJiZlLmlzRW5hYmxlZCgpKXthLkooYik7cmV0dXJufX1mb3IoYys9MTtiPUkoYSxjKTtjKyspaWYoZD1iLGQuaXNWaXNpYmxlKCkmJmQuaXNFbmFibGVkKCkpe2EuSihiKTtyZXR1cm59YS5KKG51bGwpfX07Zz1YLnByb3RvdHlwZTtnLmpiPWZ1bmN0aW9uKGEpe3RoaXMuSCYmdGhpcy5IIT1hLnRhcmdldCYmTmModGhpcy5ILCExKTt0aGlzLkg9YS50YXJnZXR9O2cua2I9ZnVuY3Rpb24oYSl7YS50YXJnZXQ9PXRoaXMuSCYmKHRoaXMuSD1udWxsKX07Zy5oYj1mdW5jdGlvbihhKXtpZCh0aGlzLGEudGFyZ2V0KX07Zy5pYj1mdW5jdGlvbihhKXtpZCh0aGlzLGEudGFyZ2V0KX07Zy5QYT1mdW5jdGlvbigpe0kodGhpcyx0aGlzLm8pfHxYYyh0aGlzLFZiKHRoaXMsdGhpcy5IfHxJKHRoaXMsMCkpKX07CnZhciBoZD1mdW5jdGlvbihhKXtCKEIoQihCKFFiKGEpLGEsInNlbGVjdCIsYS5qYiksYSwidW5zZWxlY3QiLGEua2IpLGEsImRpc2FibGUiLGEuaGIpLGEsImhpZGUiLGEuaWIpfSxnZD1mdW5jdGlvbihhKXtyZXR1cm4gYT09InN0YXJ0Inx8YT09ImVuZCI/InZlcnRpY2FsIjoiaG9yaXpvbnRhbCJ9O3RjKCJnb29nLXRhYi1iYXIiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBYfSk7ZnVuY3Rpb24gamQoYSl7dmFyIGI9e3RvcDoiYm90dG9tIixib3R0b206InRvcCIsc3RhcnQ6InJpZ2h0IixlbmQ6ImxlZnQifVthLmxvY2F0aW9uXSxjPWEuZWxlbWVudElkLGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTtkLnRleHRDb250ZW50PSJcbiAgICBmaWVsZHNldCB7XG4gICAgICBwYWRkaW5nOiAxMHB4O1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgIzM2OTtcbiAgICB9XG5cbiAgICAjIitjKyIgLmdvb2ctdGFiLWNvbnRlbnQge1xuICAgICAgbWluLWhlaWdodDogM2VtO1xuICAgICAgbWFyZ2luOiAwO1xuICAgICAgYm9yZGVyOiAiK2EuYm9yZGVyKyIgc29saWQgIithLmJvcmRlckNvbG9yKyI7XG4gICAgICBib3JkZXItdG9wOiAwO1xuICAgICAgaGVpZ2h0OiAiK2EuY29udGVudEhlaWdodCsiO1xuICAgICAgcGFkZGluZzogNHB4IDhweDtcbiAgICAgIG1hcmdpbi1yaWdodDogNHB4O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgIG92ZXJmbG93OiBhdXRvO1xuICAgIH1cblxuICAgICMiKwpjKyIgLmdvb2ctdGFiLWJhci0iK2EubG9jYXRpb24rIiAuZ29vZy10YWItc2VsZWN0ZWQge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICIrYS5ib3JkZXJDb2xvcisiO1xuICAgICAgYm9yZGVyLSIrYisiOiAwcHg7XG4gICAgfVxuXG4gICAgIyIrYysiIC5nb29nLXRhYi1iYXItIithLmxvY2F0aW9uKyIge1xuICAgICAgcGFkZGluZy0iK2EubG9jYXRpb24rIjogNXB4ICFpbXBvcnRhbnQ7XG4gICAgICBib3JkZXItIitiKyI6IDFweCBzb2xpZCAiK2EuYm9yZGVyQ29sb3IrIiAhaW1wb3J0YW50O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICB9XG5cbiAgICAjIitjKyIgLmdvb2ctdGFiLWJhciB7XG4gICAgICAgbWFyZ2luOiAwO1xuICAgICAgIGJvcmRlcjogMDtcbiAgICAgICBwYWRkaW5nOiAwO1xuICAgICAgIGxpc3Qtc3R5bGU6IG5vbmU7XG4gICAgICAgY3Vyc29yOiBkZWZhdWx0O1xuICAgICAgIG91dGxpbmU6IG5vbmU7XG4gICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgICBtYXJnaW4tcmlnaHQ6IDRweDtcbiAgICAgIH1cblxuICAgICAjIisKYysiIC5nb29nLXRhYiB7XG4gICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgIHBhZGRpbmc6IDRweCA4cHg7XG4gICAgICAgY29sb3I6IHZhcigtLWNvbGFiLXByaW1hcnktdGV4dC1jb2xvcik7XG4gICAgICAgdGV4dC1kZWNvcmF0aW9uOiBpbml0aWFsO1xuICAgICAgIGN1cnNvcjogZGVmYXVsdDtcbiAgICAgIH1cblxuICAgICAgIyIrYysiIC5nb29nLXRhYi1ob3ZlciB7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWNvbGFiLWhpZ2hsaWdodGVkLXN1cmZhY2UtY29sb3IpO1xuICAgICAgfVxuICAgICAgIjtyZXR1cm4gZH0KdmFyIGtkPWZ1bmN0aW9uKGEpe3ZhciBiPWEuZWxlbWVudElkLGM9YS50YWJOYW1lcyxkPWEuc2VsZWN0ZWRJbmRleDsiY29udGVudEJvcmRlciJpbiBhfHwoYS5jb250ZW50Qm9yZGVyPSIwcHgiKTsiY29udGVudEhlaWdodCJpbiBhfHwoYS5jb250ZW50SGVpZ2h0PSJpbml0aWFsIik7ImJvcmRlckNvbG9yImluIGF8fChhLmJvcmRlckNvbG9yPSJ2YXIoLS1jb2xhYi1ib3JkZXItY29sb3IpIik7YS5sb2NhdGlvbnx8KGEubG9jYXRpb249InRvcCIpO3ZhciBlPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiMiK2IpLGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zi5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYi1iYXIiKTt2YXIgaD1hLmxvY2F0aW9uO2YuY2xhc3NMaXN0LmFkZCgiZ29vZy10YWItYmFyLSIraCk7Zm9yKHZhciBrPVtdLHE9ZmEoYyksRz1xLm5leHQoKTshRy5kb25lO0c9cS5uZXh0KCkpe0c9Ry52YWx1ZTt2YXIgeD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKeC5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYiIpO3gudGV4dENvbnRlbnQ9RztmLmFwcGVuZENoaWxkKHgpO2sucHVzaCh4KX1oIT0iYm90dG9tIiYmZS5hcHBlbmRDaGlsZChmKTtxPW51bGw7aWYoaD09InRvcCJ8fGg9PSJib3R0b20iKXE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikscS5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYi1iYXItY2xlYXIiKTtoPT0idG9wIiYmcSYmZS5hcHBlbmRDaGlsZChxKTtHPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO0cuY2xhc3NMaXN0LmFkZCgiZ29vZy10YWItY29udGVudCIpO3ZhciBoYT1bXTtjPWZhKGMpO2Zvcih4PWMubmV4dCgpOyF4LmRvbmU7eD1jLm5leHQoKSl4PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHguaWQ9ZS5pZCsiX2NvbnRlbnRfIitoYS5sZW5ndGgseC5zdHlsZS5kaXNwbGF5PSJub25lIixHLmFwcGVuZENoaWxkKHgpLGhhLnB1c2goeCk7ZS5hcHBlbmRDaGlsZChHKTtoPT0iYm90dG9tIiYmKHEmJgplLmFwcGVuZENoaWxkKHEpLGUuYXBwZW5kQ2hpbGQoZikpO3ZhciBRPW5ldyBYKGgpO1NiKFEsZik7dmFyIFI9LTE7d2IoUSwic2VsZWN0IixmdW5jdGlvbihTKXtTPWsuaW5kZXhPZihTLnRhcmdldC5pKCkpO1MhPVImJihSPj0wJiZSPGhhLmxlbmd0aCYmKGhhW1JdLnN0eWxlLmRpc3BsYXk9Im5vbmUiLFI9LTEpLFM+PTAmJlM8aGEubGVuZ3RoJiYoUj1TLGhhW1JdLnN0eWxlLmRpc3BsYXk9ImlubGluZSIsd2luZG93LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCJyZXNpemUiKSksZ29vZ2xlLmNvbGFiLm91dHB1dC5yZXNpemVJZnJhbWVUb0NvbnRlbnQoKSksUS5KKEkoUSxSKSkpfSk7US5KKEkoUSxkKSk7d2luZG93W2JdPXtzZXRTZWxlY3RlZFRhYkluZGV4OmZ1bmN0aW9uKFMpe1EuSihJKFEsUykpfX07ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChqZChhKSl9LGxkPVsiY29sYWJfbGliIiwiY3JlYXRlVGFiQmFyIl0sWT1sOwpsZFswXWluIFl8fHR5cGVvZiBZLmV4ZWNTY3JpcHQ9PSJ1bmRlZmluZWQifHxZLmV4ZWNTY3JpcHQoInZhciAiK2xkWzBdKTtmb3IodmFyIFo7bGQubGVuZ3RoJiYoWj1sZC5zaGlmdCgpKTspbGQubGVuZ3RofHxrZD09PXZvaWQgMD9ZW1pdJiZZW1pdIT09T2JqZWN0LnByb3RvdHlwZVtaXT9ZPVlbWl06WT1ZW1pdPXt9OllbWl09a2Q7fSkuY2FsbCh0aGlzKTsKLy8gY2xhbmctZm9ybWF0IG9uCg==", + "ok": true, + "headers": [ + [ + "content-length", + "41785" + ], + [ + "content-type", + "application/javascript" + ] + ], + "status": 200, + "status_text": "" + } + }, + "base_uri": "https://localhost:8080/", + "height": 306 + }, + "outputId": "52f81c29-1286-46fa-a984-4576a2d4c8ae" + }, + "source": [ + "%%logica BabyNamesSample,TopNameByYear,PlotNames,Graph,TotalBabies\n", + "\n", + "@Engine(\"bigquery\");\n", + "\n", + "# Main predicate: TopNameByYear\n", + "\n", + "# Connecting predicate to a table.\n", + "BabyNames(..r) :- `bigquery-public-data.usa_names.usa_1910_current`(..r);\n", + "\n", + "# Extracting an arbitrary sample from the table.\n", + "@Limit(BabyNamesSample, 10);\n", + "BabyNamesSample(..r) :- BabyNames(..r);\n", + "\n", + "NameCountByYear(name: , year:) += number :-\n", + " BabyNames(name:, year:, number:);\n", + "\n", + "# Finding most popular name for each year.\n", + "@OrderBy(TopNameByYear, \"col0\");\n", + "TopNameByYear(year) ArgMax= name -> NameCountByYear(name:, year:);\n", + "\n", + "# Names we would like to plot popularity for.\n", + "PlotNames(name: TopNameByYear()) distinct;\n", + "\n", + "# Get graph of popularity for top names.\n", + "@OrderBy(Graph, \"name\", \"year\");\n", + "Graph(name:, year:, count: NameCountByYear(name:, year:)) :-\n", + " PlotNames(name:);\n", + "\n", + "# Taking a look at total number of babies of time.\n", + "@OrderBy(TotalBabies, \"year\");\n", + "TotalBabies(year:) += number :- BabyNames(year:, number:);\n", + "\n" + ], + "execution_count": 48, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bc44c736-d22e-11ef-a7c0-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id109\", \"tabNames\": [\"BabyNamesSample\", \"TopNameByYear\", \"PlotNames\", \"Graph\", \"TotalBabies\", \"(Log)\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_6c790760d3" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bc454986-d22e-11ef-a7c0-0242ac1c0002\"] = window[\"id109\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_df4f8fd3a2" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bc476f18-d22e-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_29b3ff4a96" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bc488a06-d22e-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id109_content_5\");\n", + "//# sourceURL=js_a42c9133de" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bc4903a0-d22e-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"bc488a06-d22e-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_2feb4e65e4" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bc49ae5e-d22e-11ef-a7c0-0242ac1c0002\"] = window[\"id109\"].setSelectedTabIndex(5);\n", + "//# sourceURL=js_1d7493a70e" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bc4c6c02-d22e-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"bc476f18-d22e-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_14199f1fef" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bc4e900e-d22e-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_f16a0a916e" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bc4ed9ba-d22e-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id109_content_0\");\n", + "//# sourceURL=js_16b1a921e0" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bc4f406c-d22e-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"bc4ed9ba-d22e-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_c4020dbe00" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bc4fecb0-d22e-11ef-a7c0-0242ac1c0002\"] = window[\"id109\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_ce423d95cd" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bc53298e-d22e-11ef-a7c0-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id110\", \"tabNames\": [\"SQL\", \"Result\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_860860a95d" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bc537862-d22e-11ef-a7c0-0242ac1c0002\"] = window[\"id110\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_f99ad19882" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bc555b78-d22e-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_701eee49df" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bc55bdf2-d22e-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id110_content_0\");\n", + "//# sourceURL=js_e2219e51a1" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bc560d7a-d22e-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"bc55bdf2-d22e-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_368e8919c0" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bc566252-d22e-11ef-a7c0-0242ac1c0002\"] = window[\"id110\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_0cf6b3cf2e" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The following query is stored at \u001b[1mBabyNamesSample_sql\u001b[0m variable.\n", + "SELECT\n", + " bigquerypublicdata_usa_names_usa_1910_current.*\n", + "FROM\n", + " `bigquery-public-data.usa_names.usa_1910_current` AS bigquerypublicdata_usa_names_usa_1910_current LIMIT 10;\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bc584eb4-d22e-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"bc555b78-d22e-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_78e7266783" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bc5b05f0-d22e-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_1665c0d442" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bc5badfc-d22e-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id110_content_1\");\n", + "//# sourceURL=js_056790b599" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bc5c1b48-d22e-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"bc5badfc-d22e-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_86edf0171c" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bc5c692c-d22e-11ef-a7c0-0242ac1c0002\"] = window[\"id110\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_75c864dd2c" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The following table is stored at \u001b[1mBabyNamesSample\u001b[0m variable.\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
stategenderyearnamenumber
0AKF1910Mary14
1AKF1910Annie12
2AKF1910Anna10
3AKF1910Margaret8
4AKF1910Helen7
5AKF1910Elsie6
6AKF1910Lucy6
7AKF1910Dorothy5
8AKF1911Mary12
9AKF1911Margaret7
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bc5f063c-d22e-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"bc5b05f0-d22e-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_5fd590cfe1" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bc613b1e-d22e-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"bc4e900e-d22e-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_5679d71d59" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bc645b14-d22e-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_7385c1b1aa" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bc64e2dc-d22e-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id109_content_5\");\n", + "//# sourceURL=js_0e8840c77f" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bc654f10-d22e-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"bc64e2dc-d22e-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_fa0d9749b4" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bc65b11c-d22e-11ef-a7c0-0242ac1c0002\"] = window[\"id109\"].setSelectedTabIndex(5);\n", + "//# sourceURL=js_e5c1300784" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bc71879e-d22e-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"bc645b14-d22e-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_235fa83a12" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bc741932-d22e-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_53d9dd567b" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bc746d42-d22e-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id109_content_1\");\n", + "//# sourceURL=js_4d2278e655" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bc74e862-d22e-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"bc746d42-d22e-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_d503a20028" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bc759410-d22e-11ef-a7c0-0242ac1c0002\"] = window[\"id109\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_7c80bcf311" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bc78269e-d22e-11ef-a7c0-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id111\", \"tabNames\": [\"SQL\", \"Result\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_a50ae3692d" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bc78885a-d22e-11ef-a7c0-0242ac1c0002\"] = window[\"id111\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_a276d38781" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bc7ab594-d22e-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_16d51c8781" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bc7b5c38-d22e-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id111_content_0\");\n", + "//# sourceURL=js_ad9915f37f" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bc7c1092-d22e-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"bc7b5c38-d22e-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_e8de1441ec" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bc7c6056-d22e-11ef-a7c0-0242ac1c0002\"] = window[\"id111\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_10d365d46b" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The following query is stored at \u001b[1mTopNameByYear_sql\u001b[0m variable.\n", + "WITH t_1_NameCountByYear AS (SELECT\n", + " bigquerypublicdata_usa_names_usa_1910_current.name AS name,\n", + " bigquerypublicdata_usa_names_usa_1910_current.year AS year,\n", + " SUM(bigquerypublicdata_usa_names_usa_1910_current.number) AS logica_value\n", + "FROM\n", + " `bigquery-public-data.usa_names.usa_1910_current` AS bigquerypublicdata_usa_names_usa_1910_current\n", + "GROUP BY name, year)\n", + "SELECT\n", + " NameCountByYear.year AS col0,\n", + " ARRAY_AGG(NameCountByYear.name order by [NameCountByYear.logica_value][offset(0)] desc limit 1)[OFFSET(0)] AS logica_value\n", + "FROM\n", + " t_1_NameCountByYear AS NameCountByYear\n", + "GROUP BY col0 ORDER BY col0;\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bc7e053c-d22e-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"bc7ab594-d22e-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_a990b70976" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bc80f756-d22e-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_14cdf4b85b" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bc815e80-d22e-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id111_content_1\");\n", + "//# sourceURL=js_0c0ddce19a" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bc81be7a-d22e-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"bc815e80-d22e-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_f3e1ef1d98" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bc8216b8-d22e-11ef-a7c0-0242ac1c0002\"] = window[\"id111\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_6700ebf635" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The following table is stored at \u001b[1mTopNameByYear\u001b[0m variable.\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
col0logica_value
01910Mary
11911Mary
21912Mary
31913Mary
41914Mary
51915Mary
61916Mary
71917Mary
81918Mary
91919Mary
101920Mary
111921Mary
121922Mary
131923Mary
141924Mary
151925Mary
161926Mary
171927Mary
181928Mary
191929Mary
201930Mary
211931Robert
221932Mary
231933Mary
241934Mary
251935Robert
261936Robert
271937Robert
281938Robert
291939James
301940James
311941James
321942James
331943James
341944James
351945James
361946James
371947Linda
381948Linda
391949Linda
401950James
411951James
421952James
431953Robert
441954Michael
451955Michael
461956Michael
471957Michael
481958Michael
491959Michael
501960David
511961Michael
521962Michael
531963Michael
541964Michael
551965Michael
561966Michael
571967Michael
581968Michael
591969Michael
601970Michael
611971Michael
621972Michael
631973Michael
641974Michael
651975Michael
661976Michael
671977Michael
681978Michael
691979Michael
701980Michael
711981Michael
721982Michael
731983Michael
741984Michael
751985Michael
761986Michael
771987Michael
781988Michael
791989Michael
801990Michael
811991Michael
821992Michael
831993Michael
841994Michael
851995Michael
861996Michael
871997Michael
881998Michael
891999Jacob
902000Jacob
912001Jacob
922002Jacob
932003Jacob
942004Jacob
952005Jacob
962006Jacob
972007Jacob
982008Jacob
992009Isabella
1002010Isabella
1012011Sophia
1022012Sophia
1032013Sophia
1042014Emma
1052015Emma
1062016Emma
1072017Emma
1082018Liam
1092019Liam
1102020Liam
1112021Liam
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bc849546-d22e-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"bc80f756-d22e-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_489d4f8569" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bc874930-d22e-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"bc741932-d22e-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_aa2964efcf" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bc8a9220-d22e-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_c5ed400146" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bc8bc55a-d22e-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id109_content_5\");\n", + "//# sourceURL=js_3ff5b9e617" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bc8c60aa-d22e-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"bc8bc55a-d22e-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_473f3e5eb0" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bc8cfdda-d22e-11ef-a7c0-0242ac1c0002\"] = window[\"id109\"].setSelectedTabIndex(5);\n", + "//# sourceURL=js_7259902c1b" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bc991980-d22e-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"bc8a9220-d22e-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_fafeef3ecd" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bc9bd206-d22e-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_4305b9da99" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bc9c31f6-d22e-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id109_content_2\");\n", + "//# sourceURL=js_efb0d51e1e" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bc9cb342-d22e-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"bc9c31f6-d22e-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_d8fdb9d2b8" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bc9dbf80-d22e-11ef-a7c0-0242ac1c0002\"] = window[\"id109\"].setSelectedTabIndex(2);\n", + "//# sourceURL=js_2499cc3111" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bca16afe-d22e-11ef-a7c0-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id112\", \"tabNames\": [\"SQL\", \"Result\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_3247c266ef" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bca1f6c2-d22e-11ef-a7c0-0242ac1c0002\"] = window[\"id112\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_2b8cbbcaef" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bca4edbe-d22e-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_204fcac387" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bca572d4-d22e-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id112_content_0\");\n", + "//# sourceURL=js_912848658d" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bca65ad2-d22e-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"bca572d4-d22e-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_5c47def9c8" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bca75e78-d22e-11ef-a7c0-0242ac1c0002\"] = window[\"id112\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_abf742a1fb" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The following query is stored at \u001b[1mPlotNames_sql\u001b[0m variable.\n", + "WITH t_2_NameCountByYear AS (SELECT\n", + " bigquerypublicdata_usa_names_usa_1910_current.name AS name,\n", + " bigquerypublicdata_usa_names_usa_1910_current.year AS year,\n", + " SUM(bigquerypublicdata_usa_names_usa_1910_current.number) AS logica_value\n", + "FROM\n", + " `bigquery-public-data.usa_names.usa_1910_current` AS bigquerypublicdata_usa_names_usa_1910_current\n", + "GROUP BY name, year),\n", + "t_0_TopNameByYear AS (SELECT\n", + " NameCountByYear.year AS col0,\n", + " ARRAY_AGG(NameCountByYear.name order by [NameCountByYear.logica_value][offset(0)] desc limit 1)[OFFSET(0)] AS logica_value\n", + "FROM\n", + " t_2_NameCountByYear AS NameCountByYear\n", + "GROUP BY col0 ORDER BY col0)\n", + "SELECT\n", + " TopNameByYear.logica_value AS name\n", + "FROM\n", + " t_0_TopNameByYear AS TopNameByYear\n", + "GROUP BY name;\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bca94e2c-d22e-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"bca4edbe-d22e-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_7706c8c2f3" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bcacaf9a-d22e-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_5fe1b2e051" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bcad34d8-d22e-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id112_content_1\");\n", + "//# sourceURL=js_d118500299" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bcae8aae-d22e-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"bcad34d8-d22e-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_a31c81d7bd" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bcaee2f6-d22e-11ef-a7c0-0242ac1c0002\"] = window[\"id112\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_162f2c7108" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The following table is stored at \u001b[1mPlotNames\u001b[0m variable.\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
name
0Michael
1Jacob
2Isabella
3Sophia
4Emma
5Liam
6Mary
7Robert
8James
9Linda
10David
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bcb17764-d22e-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"bcacaf9a-d22e-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_c2aecd7731" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bcb4135c-d22e-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"bc9bd206-d22e-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_ae2b7d40c5" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bcb6f72a-d22e-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_44b73da4b6" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bcb7a3a0-d22e-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id109_content_5\");\n", + "//# sourceURL=js_757f44ec83" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bcb7f616-d22e-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"bcb7a3a0-d22e-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_d73dcc21cb" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bcb8fd18-d22e-11ef-a7c0-0242ac1c0002\"] = window[\"id109\"].setSelectedTabIndex(5);\n", + "//# sourceURL=js_63dd13db91" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bcc4d9f8-d22e-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"bcb6f72a-d22e-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_eaf98a51a1" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bcc7f8a4-d22e-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_b60531b71b" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bcc890d4-d22e-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id109_content_3\");\n", + "//# sourceURL=js_53c98c1bcd" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bcc94808-d22e-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"bcc890d4-d22e-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_2483f9e50d" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bcc9fbea-d22e-11ef-a7c0-0242ac1c0002\"] = window[\"id109\"].setSelectedTabIndex(3);\n", + "//# sourceURL=js_681e041d2c" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bccdc63a-d22e-11ef-a7c0-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id113\", \"tabNames\": [\"SQL\", \"Result\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_5cb672c9fb" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bcceb34c-d22e-11ef-a7c0-0242ac1c0002\"] = window[\"id113\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_0ff846a1b3" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bcd162f4-d22e-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_ea1160675d" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bcd1ffe8-d22e-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id113_content_0\");\n", + "//# sourceURL=js_5a6b108ab6" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bcd2d9ea-d22e-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"bcd1ffe8-d22e-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_ff0f4e336b" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bcd3d4b2-d22e-11ef-a7c0-0242ac1c0002\"] = window[\"id113\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_05f7dbd80f" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The following query is stored at \u001b[1mGraph_sql\u001b[0m variable.\n", + "WITH t_4_NameCountByYear AS (SELECT\n", + " bigquerypublicdata_usa_names_usa_1910_current.name AS name,\n", + " bigquerypublicdata_usa_names_usa_1910_current.year AS year,\n", + " SUM(bigquerypublicdata_usa_names_usa_1910_current.number) AS logica_value\n", + "FROM\n", + " `bigquery-public-data.usa_names.usa_1910_current` AS bigquerypublicdata_usa_names_usa_1910_current\n", + "GROUP BY name, year),\n", + "t_1_TopNameByYear AS (SELECT\n", + " t_2_NameCountByYear.year AS col0,\n", + " ARRAY_AGG(t_2_NameCountByYear.name order by [t_2_NameCountByYear.logica_value][offset(0)] desc limit 1)[OFFSET(0)] AS logica_value\n", + "FROM\n", + " t_4_NameCountByYear AS t_2_NameCountByYear\n", + "GROUP BY col0 ORDER BY col0),\n", + "t_0_PlotNames AS (SELECT\n", + " TopNameByYear.logica_value AS name\n", + "FROM\n", + " t_1_TopNameByYear AS TopNameByYear\n", + "GROUP BY name)\n", + "SELECT\n", + " PlotNames.name AS name,\n", + " NameCountByYear.year AS year,\n", + " NameCountByYear.logica_value AS count\n", + "FROM\n", + " t_0_PlotNames AS PlotNames, t_4_NameCountByYear AS NameCountByYear\n", + "WHERE\n", + " (NameCountByYear.name = PlotNames.name) ORDER BY name, year;\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bcd5dd98-d22e-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"bcd162f4-d22e-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_85765505bc" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bcd93cd6-d22e-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_506d0ea5a9" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bcd99334-d22e-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id113_content_1\");\n", + "//# sourceURL=js_2939fe2937" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bcda4a7c-d22e-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"bcd99334-d22e-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_78fd47c166" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bcdb517e-d22e-11ef-a7c0-0242ac1c0002\"] = window[\"id113\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_4f778a8f9a" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The following table is stored at \u001b[1mGraph\u001b[0m variable.\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
nameyearcount
0David19101243
1David19111535
2David19122851
3David19133278
4David19144251
5David19155393
6David19165808
7David19176100
8David19186631
9David19196719
10David19207450
11David19217776
12David19227868
13David19238237
14David19248761
15David19258923
16David19269047
17David19279437
18David19289996
19David192911331
20David193012311
21David193111789
22David193212143
23David193312043
24David193414018
25David193515671
26David193617485
27David193721001
28David193823000
29David193925399
30David194027724
31David194130576
32David194235952
33David194337301
34David194437436
35David194537137
36David194646499
37David194757856
38David194856683
39David194959677
40David195060804
41David195164853
42David195271834
43David195376215
44David195479668
45David195586399
46David195681752
47David195782472
48David195882744
49David195984106
50David196086082
51David196184935
52David196281557
53David196378629
54David196475246
55David196568011
56David196666606
57David196767056
58David196863916
59David196963930
60David197061992
61David197153322
62David197246536
63David197341275
64David197441983
65David197539361
66David197639449
67David197740740
68David197840875
69David197942302
70David198042169
71David198140849
72David198240660
73David198339476
74David198438670
75David198538765
76David198637381
77David198737008
78David198835510
79David198935310
80David199033822
81David199130469
82David199228489
83David199327080
84David199424905
85David199523075
86David199623048
87David199721899
88David199820904
89David199920354
90David200019806
91David200119369
92David200218705
93David200318638
94David200418428
95David200518136
96David200617649
97David200717560
98David200816336
99David200915449
100David201014212
101David201113238
102David201212550
103David201312374
104David201412234
105David201511820
106David201611134
107David201710217
108David20189785
109David20198950
110David20208227
111David20217843
112Emma19102591
113Emma19112599
114Emma19123350
115Emma19133472
116Emma19143960
117Emma19155044
118Emma19165212
119Emma19175117
120Emma19185320
121Emma19195080
122Emma19205232
123Emma19215070
124Emma19225013
125Emma19234967
126Emma19244894
127Emma19254703
128Emma19264476
129Emma19274327
130Emma19284006
131Emma19293800
132Emma19303550
133Emma19313300
134Emma19323310
135Emma19333149
136Emma19342929
137Emma19352782
138Emma19362815
139Emma19372731
140Emma19382639
141Emma19392662
142Emma19402585
143Emma19412518
144Emma19422570
145Emma19432391
146Emma19442219
147Emma19452019
148Emma19462039
149Emma19472119
150Emma19482073
151Emma19491960
152Emma19501858
153Emma19511706
154Emma19521669
155Emma19531563
156Emma19541490
157Emma19551426
158Emma19561295
159Emma19571169
160Emma19581043
161Emma19591029
162Emma1960936
163Emma1961853
164Emma1962757
165Emma1963683
166Emma1964737
167Emma1965595
168Emma1966576
169Emma1967525
170Emma1968449
171Emma1969474
172Emma1970487
173Emma1971424
174Emma1972422
175Emma1973373
176Emma1974452
177Emma1975426
178Emma1976377
179Emma1977424
180Emma1978404
181Emma1979445
182Emma1980479
183Emma1981505
184Emma1982519
185Emma1983513
186Emma1984645
187Emma1985918
188Emma19861247
189Emma19871582
190Emma19881776
191Emma19891941
192Emma19902409
193Emma19912588
194Emma19923213
195Emma19934106
196Emma19944765
197Emma19955048
198Emma19966145
199Emma19977748
200Emma199810448
201Emma199911743
202Emma200012559
203Emma200113322
204Emma200216550
205Emma200322718
206Emma200421693
207Emma200520355
208Emma200619124
209Emma200718377
210Emma200818821
211Emma200917906
212Emma201017359
213Emma201118811
214Emma201220960
215Emma201320959
216Emma201420949
217Emma201520468
218Emma201619531
219Emma201719847
220Emma201818786
221Emma201917176
222Emma202015661
223Emma202115433
224Isabella1910105
225Isabella191175
226Isabella1912111
227Isabella1913118
228Isabella1914116
229Isabella1915188
230Isabella1916184
231Isabella1917175
232Isabella1918194
233Isabella1919221
234Isabella1920194
235Isabella1921181
236Isabella1922197
237Isabella1923181
238Isabella1924178
239Isabella1925161
240Isabella1926143
241Isabella1927134
242Isabella1928127
243Isabella1929113
244Isabella193089
245Isabella1931102
246Isabella193291
247Isabella193364
248Isabella193452
249Isabella193539
250Isabella193641
251Isabella193756
252Isabella193859
253Isabella193939
254Isabella194043
255Isabella194158
256Isabella194233
257Isabella194349
258Isabella194448
259Isabella194527
260Isabella194643
261Isabella194750
262Isabella194847
263Isabella194932
264Isabella195020
265Isabella195122
266Isabella195227
267Isabella195322
268Isabella195420
269Isabella195525
270Isabella195629
271Isabella195733
272Isabella195820
273Isabella195917
274Isabella196025
275Isabella196122
276Isabella196219
277Isabella196321
278Isabella196417
279Isabella196511
280Isabella196621
281Isabella196713
282Isabella19688
283Isabella19695
284Isabella19707
285Isabella19718
286Isabella19726
287Isabella197311
288Isabella19747
289Isabella197510
290Isabella197612
291Isabella19776
292Isabella19786
293Isabella19795
294Isabella198023
295Isabella198113
296Isabella198221
297Isabella198313
298Isabella198420
299Isabella19857
300Isabella198631
301Isabella198748
302Isabella198848
303Isabella1989104
304Isabella1990165
305Isabella1991257
306Isabella1992473
307Isabella1993791
308Isabella19941239
309Isabella19951717
310Isabella19962095
311Isabella19972851
312Isabella19983837
313Isabella19995059
314Isabella20006242
315Isabella20018834
316Isabella200212170
317Isabella200313787
318Isabella200415053
319Isabella200515192
320Isabella200618227
321Isabella200719145
322Isabella200818629
323Isabella200922312
324Isabella201022925
325Isabella201119936
326Isabella201219119
327Isabella201317657
328Isabella201417115
329Isabella201515641
330Isabella201614837
331Isabella201715222
332Isabella201814538
333Isabella201913360
334Isabella202012158
335Isabella202111201
336Jacob1910225
337Jacob1911270
338Jacob1912655
339Jacob1913718
340Jacob1914970
341Jacob19151110
342Jacob19161112
343Jacob19171094
344Jacob19181173
345Jacob19191055
346Jacob19201026
347Jacob19211068
348Jacob19221003
349Jacob1923953
350Jacob1924953
351Jacob1925873
352Jacob1926783
353Jacob1927827
354Jacob1928692
355Jacob1929612
356Jacob1930587
357Jacob1931532
358Jacob1932527
359Jacob1933501
360Jacob1934520
361Jacob1935437
362Jacob1936478
363Jacob1937517
364Jacob1938453
365Jacob1939378
366Jacob1940490
367Jacob1941415
368Jacob1942502
369Jacob1943438
370Jacob1944393
371Jacob1945377
372Jacob1946416
373Jacob1947493
374Jacob1948510
375Jacob1949449
376Jacob1950407
377Jacob1951460
378Jacob1952525
379Jacob1953561
380Jacob1954517
381Jacob1955529
382Jacob1956501
383Jacob1957500
384Jacob1958476
385Jacob1959518
386Jacob1960456
387Jacob1961458
388Jacob1962419
389Jacob1963448
390Jacob1964497
391Jacob1965443
392Jacob1966399
393Jacob1967408
394Jacob1968511
395Jacob1969619
396Jacob1970892
397Jacob19711033
398Jacob19721671
399Jacob19732118
400Jacob19742962
401Jacob19753628
402Jacob19764513
403Jacob19775793
404Jacob19786174
405Jacob19797554
406Jacob19808536
407Jacob19819363
408Jacob198210072
409Jacob198311039
410Jacob198411362
411Jacob198512303
412Jacob198613675
413Jacob198714351
414Jacob198815923
415Jacob198917869
416Jacob199022033
417Jacob199125212
418Jacob199225686
419Jacob199327508
420Jacob199429433
421Jacob199531142
422Jacob199631945
423Jacob199734175
424Jacob199836036
425Jacob199935391
426Jacob200034505
427Jacob200132560
428Jacob200230586
429Jacob200329651
430Jacob200428026
431Jacob200525847
432Jacob200624852
433Jacob200724301
434Jacob200822607
435Jacob200921194
436Jacob201022144
437Jacob201120388
438Jacob201219091
439Jacob201318182
440Jacob201416894
441Jacob201515978
442Jacob201614536
443Jacob201713225
444Jacob201811862
445Jacob201910744
446Jacob20209239
447Jacob20218397
448James19109202
449James19119980
450James191217683
451James191320881
452James191426326
453James191533886
454James191635702
455James191737470
456James191842291
457James191942554
458James192048123
459James192149942
460James192250014
461James192350714
462James192453196
463James192553015
464James192653532
465James192754032
466James192853144
467James192952490
468James193054352
469James193151532
470James193252215
471James193351377
472James193454488
473James193555201
474James193654872
475James193756778
476James193859334
477James193959877
478James194062700
479James194166957
480James194277420
481James194380518
482James194477161
483James194574662
484James194687644
485James194794968
486James194888805
487James194987065
488James195086449
489James195187461
490James195287293
491James195386286
492James195486493
493James195584388
494James195685133
495James195784549
496James195878939
497James195978854
498James196077077
499James196176168
500James196272759
501James196371587
502James196473327
503James196567970
504James196665433
505James196761964
506James196860935
507James196960192
508James197062067
509James197154870
510James197247334
511James197343138
512James197441539
513James197539795
514James197638516
515James197740281
516James197840150
517James197939591
518James198039549
519James198138542
520James198239148
521James198336591
522James198436058
523James198536104
524James198634277
525James198732861
526James198832720
527James198932830
528James199032432
529James199130567
530James199228532
531James199326286
532James199424807
533James199522746
534James199621168
535James199720415
536James199819693
537James199918558
538James200017989
539James200117080
540James200216966
541James200316895
542James200416537
543James200516143
544James200616252
545James200715966
546James200815187
547James200914220
548James201013888
549James201113260
550James201213442
551James201313582
552James201414452
553James201514862
554James201614906
555James201714361
556James201813625
557James201913181
558James202012365
559James202112390
560Liam19545
561Liam19558
562Liam19565
563Liam19579
564Liam19586
565Liam195911
566Liam19605
567Liam196113
568Liam19626
569Liam196330
570Liam196421
571Liam196526
572Liam196632
573Liam196741
574Liam196832
575Liam196929
576Liam197016
577Liam197135
578Liam197237
579Liam197341
580Liam197436
581Liam197557
582Liam197641
583Liam197766
584Liam197872
585Liam197973
586Liam198071
587Liam198181
588Liam1982107
589Liam1983105
590Liam198494
591Liam198595
592Liam1986101
593Liam198797
594Liam1988124
595Liam1989174
596Liam1990220
597Liam1991219
598Liam1992246
599Liam1993357
600Liam1994625
601Liam19951179
602Liam19961730
603Liam19972094
604Liam19982195
605Liam19992699
606Liam20002776
607Liam20013023
608Liam20023375
609Liam20033569
610Liam20043825
611Liam20054149
612Liam20064514
613Liam20075139
614Liam20085979
615Liam20098570
616Liam201010928
617Liam201113445
618Liam201216812
619Liam201318145
620Liam201418477
621Liam201518397
622Liam201618242
623Liam201718838
624Liam201819940
625Liam201920578
626Liam202019777
627Liam202120272
628Linda191095
629Linda191179
630Linda1912145
631Linda1913187
632Linda1914153
633Linda1915246
634Linda1916241
635Linda1917237
636Linda1918269
637Linda1919216
638Linda1920304
639Linda1921327
640Linda1922336
641Linda1923384
642Linda1924418
643Linda1925402
644Linda1926448
645Linda1927481
646Linda1928521
647Linda1929468
648Linda1930449
649Linda1931487
650Linda1932747
651Linda1933752
652Linda1934977
653Linda19351178
654Linda19362432
655Linda19374373
656Linda19387040
657Linda193910713
658Linda194018391
659Linda194123742
660Linda194231678
661Linda194338538
662Linda194438472
663Linda194541512
664Linda194652770
665Linda194799849
666Linda194896355
667Linda194991123
668Linda195080496
669Linda195174059
670Linda195267157
671Linda195361346
672Linda195455440
673Linda195551355
674Linda195648141
675Linda195744572
676Linda195841935
677Linda195940483
678Linda196037375
679Linda196135616
680Linda196231494
681Linda196327764
682Linda196423684
683Linda196519354
684Linda196615582
685Linda196713196
686Linda196811375
687Linda196910251
688Linda19708734
689Linda19717374
690Linda19725745
691Linda19734731
692Linda19744071
693Linda19753521
694Linda19763135
695Linda19772905
696Linda19782924
697Linda19792728
698Linda19802802
699Linda19812714
700Linda19822788
701Linda19832478
702Linda19842317
703Linda19852102
704Linda19861953
705Linda19871903
706Linda19881822
707Linda19891824
708Linda19901634
709Linda19911583
710Linda19921567
711Linda19931459
712Linda19941262
713Linda19951208
714Linda1996943
715Linda19971072
716Linda1998941
717Linda1999861
718Linda2000819
719Linda2001811
720Linda2002749
721Linda2003718
722Linda2004698
723Linda2005722
724Linda2006666
725Linda2007633
726Linda2008585
727Linda2009513
728Linda2010439
729Linda2011441
730Linda2012382
731Linda2013397
732Linda2014422
733Linda2015379
734Linda2016386
735Linda2017357
736Linda2018360
737Linda2019295
738Linda2020279
739Linda2021268
740Mary191022907
741Mary191124450
742Mary191232377
743Mary191336727
744Mary191445431
745Mary191558293
746Mary191661553
747Mary191764392
748Mary191867486
749Mary191965946
750Mary192071142
751Mary192174135
752Mary192272318
753Mary192371803
754Mary192473715
755Mary192570801
756Mary192668069
757Mary192770876
758Mary192867147
759Mary192963805
760Mary193064444
761Mary193160588
762Mary193260167
763Mary193355798
764Mary193457192
765Mary193555318
766Mary193654639
767Mary193755886
768Mary193856456
769Mary193955143
770Mary194056468
771Mary194158311
772Mary194263488
773Mary194366399
774Mary194462674
775Mary194559427
776Mary194667607
777Mary194771825
778Mary194868705
779Mary194966992
780Mary195065547
781Mary195165817
782Mary195265725
783Mary195364494
784Mary195468122
785Mary195563268
786Mary195661837
787Mary195761228
788Mary195855948
789Mary195954607
790Mary196051578
791Mary196147790
792Mary196243598
793Mary196341634
794Mary196441072
795Mary196534354
796Mary196628931
797Mary196725380
798Mary196821765
799Mary196919910
800Mary197019244
801Mary197116729
802Mary197213775
803Mary197312322
804Mary197411749
805Mary197510989
806Mary197610326
807Mary197710666
808Mary197810060
809Mary197910582
810Mary198011486
811Mary198111057
812Mary198210870
813Mary19839908
814Mary19849301
815Mary19859265
816Mary19868521
817Mary19878424
818Mary19888523
819Mary19898692
820Mary19908684
821Mary19918770
822Mary19928461
823Mary19938123
824Mary19947748
825Mary19957457
826Mary19966964
827Mary19976645
828Mary19986468
829Mary19996386
830Mary20006212
831Mary20015747
832Mary20025469
833Mary20035020
834Mary20044832
835Mary20054461
836Mary20064088
837Mary20073680
838Mary20083496
839Mary20093161
840Mary20102869
841Mary20112690
842Mary20122569
843Mary20132648
844Mary20142632
845Mary20152625
846Mary20162503
847Mary20172406
848Mary20182336
849Mary20192215
850Mary20202196
851Mary20212070
852Michael1910795
853Michael19111114
854Michael19122068
855Michael19132566
856Michael19143314
857Michael19154044
858Michael19164181
859Michael19174256
860Michael19184259
861Michael19193896
862Michael19203982
863Michael19214178
864Michael19223994
865Michael19233902
866Michael19243868
867Michael19253759
868Michael19263471
869Michael19273590
870Michael19283585
871Michael19293446
872Michael19303524
873Michael19313475
874Michael19323592
875Michael19333534
876Michael19344098
877Michael19354898
878Michael19365797
879Michael19377110
880Michael19389105
881Michael193910863
882Michael194013269
883Michael194115975
884Michael194221807
885Michael194324878
886Michael194426831
887Michael194529987
888Michael194641295
889Michael194750607
890Michael194852672
891Michael194960178
892Michael195065249
893Michael195172905
894Michael195279166
895Michael195384370
896Michael195488714
897Michael195588554
898Michael195690896
899Michael195792909
900Michael195890819
901Michael195985476
902Michael196084443
903Michael196187184
904Michael196285344
905Michael196384108
906Michael196482887
907Michael196581310
908Michael196680284
909Michael196782749
910Michael196882418
911Michael196985607
912Michael197085701
913Michael197178023
914Michael197271807
915Michael197368247
916Michael197468065
917Michael197568968
918Michael197667424
919Michael197768123
920Michael197867669
921Michael197968273
922Michael198069202
923Michael198169233
924Michael198268776
925Michael198368557
926Michael198468206
927Michael198565413
928Michael198664779
929Michael198764153
930Michael198864585
931Michael198965709
932Michael199065524
933Michael199160991
934Michael199254604
935Michael199349716
936Michael199444596
937Michael199541504
938Michael199638456
939Michael199737630
940Michael199836695
941Michael199933987
942Michael200032096
943Michael200129719
944Michael200228300
945Michael200327172
946Michael200425576
947Michael200523831
948Michael200622671
949Michael200722015
950Michael200820647
951Michael200918957
952Michael201017366
953Michael201116808
954Michael201216193
955Michael201315523
956Michael201415481
957Michael201514471
958Michael201614117
959Michael201712680
960Michael201811710
961Michael201910574
962Michael20209763
963Michael20219041
964Robert19105609
965Robert19116524
966Robert191212851
967Robert191315708
968Robert191421208
969Robert191528800
970Robert191631804
971Robert191735338
972Robert191840751
973Robert191941157
974Robert192048839
975Robert192152982
976Robert192253987
977Robert192356313
978Robert192461050
979Robert192561210
980Robert192661458
981Robert192762059
982Robert192861096
983Robert192960219
984Robert193062537
985Robert193160807
986Robert193259555
987Robert193354443
988Robert193456041
989Robert193556714
990Robert193658683
991Robert193762015
992Robert193862435
993Robert193959815
994Robert194061347
995Robert194164384
996Robert194272017
997Robert194375071
998Robert194470994
999Robert194570085
1000Robert194684291
1001Robert194791836
1002Robert194885630
1003Robert194984024
1004Robert195083711
1005Robert195186514
1006Robert195286737
1007Robert195386444
1008Robert195486476
1009Robert195583923
1010Robert195684082
1011Robert195781948
1012Robert195877470
1013Robert195974706
1014Robert196072565
1015Robert196173160
1016Robert196270370
1017Robert196370231
1018Robert196470231
1019Robert196563322
1020Robert196659516
1021Robert196756576
1022Robert196858395
1023Robert196958589
1024Robert197057471
1025Robert197150895
1026Robert197243273
1027Robert197338878
1028Robert197437219
1029Robert197535514
1030Robert197633984
1031Robert197734407
1032Robert197833575
1033Robert197934230
1034Robert198034462
1035Robert198134578
1036Robert198234603
1037Robert198332971
1038Robert198431949
1039Robert198532285
1040Robert198631549
1041Robert198730401
1042Robert198830439
1043Robert198930155
1044Robert199028956
1045Robert199126866
1046Robert199224120
1047Robert199322484
1048Robert199420572
1049Robert199518594
1050Robert199617683
1051Robert199716315
1052Robert199815525
1053Robert199914539
1054Robert200013738
1055Robert200112666
1056Robert200212029
1057Robert200311395
1058Robert200410701
1059Robert200510166
1060Robert20069905
1061Robert20079382
1062Robert20088835
1063Robert20097838
1064Robert20107562
1065Robert20116977
1066Robert20126954
1067Robert20136717
1068Robert20146649
1069Robert20156125
1070Robert20165995
1071Robert20175555
1072Robert20185175
1073Robert20194825
1074Robert20204366
1075Robert20214402
1076Sophia1910235
1077Sophia1911226
1078Sophia1912355
1079Sophia1913392
1080Sophia1914507
1081Sophia1915653
1082Sophia1916654
1083Sophia1917670
1084Sophia1918592
1085Sophia1919558
1086Sophia1920495
1087Sophia1921441
1088Sophia1922352
1089Sophia1923315
1090Sophia1924313
1091Sophia1925240
1092Sophia1926173
1093Sophia1927196
1094Sophia1928152
1095Sophia1929129
1096Sophia193095
1097Sophia193185
1098Sophia193287
1099Sophia193350
1100Sophia193470
1101Sophia193551
1102Sophia193648
1103Sophia193750
1104Sophia193848
1105Sophia193947
1106Sophia194055
1107Sophia194156
1108Sophia194235
1109Sophia194354
1110Sophia194465
1111Sophia194558
1112Sophia194666
1113Sophia194749
1114Sophia194857
1115Sophia194977
1116Sophia195049
1117Sophia1951108
1118Sophia195264
1119Sophia195387
1120Sophia195478
1121Sophia1955112
1122Sophia195686
1123Sophia1957140
1124Sophia1958179
1125Sophia1959240
1126Sophia1960220
1127Sophia1961273
1128Sophia1962443
1129Sophia1963482
1130Sophia1964411
1131Sophia1965479
1132Sophia1966572
1133Sophia1967563
1134Sophia1968511
1135Sophia1969567
1136Sophia1970537
1137Sophia1971546
1138Sophia1972440
1139Sophia1973419
1140Sophia1974338
1141Sophia1975323
1142Sophia1976326
1143Sophia1977386
1144Sophia1978373
1145Sophia1979452
1146Sophia1980583
1147Sophia19811208
1148Sophia19821137
1149Sophia19831168
1150Sophia19841050
1151Sophia19851066
1152Sophia19861028
1153Sophia19871091
1154Sophia19881125
1155Sophia19891038
1156Sophia19901093
1157Sophia19911228
1158Sophia19921330
1159Sophia19931477
1160Sophia19941585
1161Sophia19951739
1162Sophia19962487
1163Sophia19973631
1164Sophia19984303
1165Sophia19995423
1166Sophia20006562
1167Sophia20017157
1168Sophia20028665
1169Sophia20039686
1170Sophia200410939
1171Sophia200512674
1172Sophia200613501
1173Sophia200717026
1174Sophia200816088
1175Sophia200916948
1176Sophia201020648
1177Sophia201121855
1178Sophia201222322
1179Sophia201321236
1180Sophia201418638
1181Sophia201517437
1182Sophia201616159
1183Sophia201714910
1184Sophia201813989
1185Sophia201913774
1186Sophia202013036
1187Sophia202112496
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bcde5cde-d22e-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"bcd93cd6-d22e-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_58ccb8484b" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bce0f4a8-d22e-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"bcc7f8a4-d22e-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_662f26c340" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bce4c07e-d22e-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_95ea3bf56e" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bce51aa6-d22e-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id109_content_5\");\n", + "//# sourceURL=js_692ca7ddcf" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bce56e70-d22e-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"bce51aa6-d22e-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_4da6f85a7a" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bce64ffc-d22e-11ef-a7c0-0242ac1c0002\"] = window[\"id109\"].setSelectedTabIndex(5);\n", + "//# sourceURL=js_0e3bb0206f" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bce9efd6-d22e-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"bce4c07e-d22e-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_cdc9738949" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bced0b6c-d22e-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_6ad969f6b2" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bced857e-d22e-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id109_content_4\");\n", + "//# sourceURL=js_49bb86f1d3" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bcedcf20-d22e-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"bced857e-d22e-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_4c75ac7fb7" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bcee963a-d22e-11ef-a7c0-0242ac1c0002\"] = window[\"id109\"].setSelectedTabIndex(4);\n", + "//# sourceURL=js_db221f0e45" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bcf1d156-d22e-11ef-a7c0-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id114\", \"tabNames\": [\"SQL\", \"Result\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_876e23ea95" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bcf2663e-d22e-11ef-a7c0-0242ac1c0002\"] = window[\"id114\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_604c491835" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bcf59a5c-d22e-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_59707ef812" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bcf6012c-d22e-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id114_content_0\");\n", + "//# sourceURL=js_e46555304b" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bcf6da16-d22e-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"bcf6012c-d22e-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_7e5c1a1175" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bcf7667a-d22e-11ef-a7c0-0242ac1c0002\"] = window[\"id114\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_7c1d85416f" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The following query is stored at \u001b[1mTotalBabies_sql\u001b[0m variable.\n", + "SELECT\n", + " bigquerypublicdata_usa_names_usa_1910_current.year AS year,\n", + " SUM(bigquerypublicdata_usa_names_usa_1910_current.number) AS logica_value\n", + "FROM\n", + " `bigquery-public-data.usa_names.usa_1910_current` AS bigquerypublicdata_usa_names_usa_1910_current\n", + "GROUP BY year ORDER BY year;\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bcf9ac82-d22e-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"bcf59a5c-d22e-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_f60da6bc18" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bcfd3bf4-d22e-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_5551f7d61c" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bcfda06c-d22e-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id114_content_1\");\n", + "//# sourceURL=js_b880213555" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bcfdf846-d22e-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"bcfda06c-d22e-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_f5e1a75fd6" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bcff0128-d22e-11ef-a7c0-0242ac1c0002\"] = window[\"id114\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_96880eff57" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The following table is stored at \u001b[1mTotalBabies\u001b[0m variable.\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
yearlogica_value
01910516312
11911565823
21912888003
319131028579
419141293348
519151689993
619161786510
719171855683
819182013320
919191954822
1019202101072
1119212170969
1219222127269
1319232141745
1419242218832
1519252172442
1619262137428
1719272160576
1819282105785
1919292041057
2019302071237
2119311959539
2219321964875
2319331858174
2419341933869
2519351947390
2619361936575
2719371987146
2819382068733
2919392060214
3019402157939
3119412288630
3219422577000
3319432665421
3419442537456
3519452502114
3619463032723
3719473427849
3819483280547
3919493312534
4019503330258
4119513507031
4219523616483
4319533669343
4419543792235
4519553824200
4619563928219
4719574003066
4819583934507
4919593955481
5019603947467
5119613930752
5219623825758
5319633747691
5419643674680
5519653419423
5619663267846
5719673184255
5819683159613
5919693244776
6019703359351
6119713177688
6219722890043
6319732759388
6419742774026
6519752744686
6619762753938
6719772882903
6819782877701
6919793019137
7019803131137
7119813146788
7219823193786
7319833154577
7419843177888
7519853247353
7619863229389
7719873267538
7819883342538
7919893476263
8019903567983
8119913503648
8219923443187
8319933364899
8419943308084
8519953250117
8619963225943
8719973194398
8819983230894
8919993234917
9020003299000
9120013253153
9220023240264
9320033291429
9420043296687
9520053308349
9620063391245
9720073416650
9820083345040
9920093237597
10020103122771
10120113086943
10220123083993
10320133080543
10420143142827
10520153135711
10620163101063
10720173011448
10820182953348
10920192905977
11020202781980
11120212812875
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bd021b1a-d22e-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"bcfd3bf4-d22e-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_b10db9d8cf" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bd04c2ac-d22e-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"bced0b6c-d22e-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_af7436b5ee" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bd07e194-d22e-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_b020d4daeb" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bd08ef4e-d22e-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id109_content_5\");\n", + "//# sourceURL=js_5873062677" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bd09a0d8-d22e-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"bd08ef4e-d22e-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_59631baf02" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"bd09fb14-d22e-11ef-a7c0-0242ac1c0002\"] = window[\"id109\"].setSelectedTabIndex(5);\n", + "//# sourceURL=js_e7f38aa82c" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "image/svg+xml": "\n\n\n\n\n\nConcertina\n\n\n\nTotalBabies\n\nTotalBabies\n\n\n\n`bigquery-public-data.usa_names.usa_1910_current`\n\n\n`bigquery-public-data.usa_names.usa_1910_current`\n\n\n\n`bigquery-public-data.usa_names.usa_1910_current`->TotalBabies\n\n\n\n\n\nTopNameByYear\n\nTopNameByYear\n\n\n\n`bigquery-public-data.usa_names.usa_1910_current`->TopNameByYear\n\n\n\n\n\nGraph\n\nGraph\n\n\n\n`bigquery-public-data.usa_names.usa_1910_current`->Graph\n\n\n\n\n\nBabyNamesSample\n\nBabyNamesSample\n\n\n\n`bigquery-public-data.usa_names.usa_1910_current`->BabyNamesSample\n\n\n\n\n\nPlotNames\n\nPlotNames\n\n\n\n`bigquery-public-data.usa_names.usa_1910_current`->PlotNames\n\n\n\n\n\n", + "text/plain": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Running predicate: TopNameByYear (2037 ms)\n", + "Running predicate: Graph (1713 ms)\n", + "Running predicate: BabyNamesSample (1884 ms)\n", + "Running predicate: PlotNames (1894 ms)\n", + "Running predicate: TotalBabies (1961 ms)\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"c30580ce-d22e-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"bd07e194-d22e-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_63c6a4d2ab" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"c307cb86-d22e-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_4c133d44d9" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"c3081b72-d22e-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id109_content_0\");\n", + "//# sourceURL=js_eb15a1fc98" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"c3088152-d22e-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"c3081b72-d22e-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_ef10484c7e" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"c308eaf2-d22e-11ef-a7c0-0242ac1c0002\"] = window[\"id109\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_8ab1c4ad18" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"c30aa7f2-d22e-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_500f05ab29" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"c30b6714-d22e-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id110_content_1\");\n", + "//# sourceURL=js_d0a755df0c" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"c30bba16-d22e-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"c30b6714-d22e-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_c89762e946" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"c30c09a8-d22e-11ef-a7c0-0242ac1c0002\"] = window[\"id110\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_e4d0b5d49a" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"c30f462c-d22e-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"c30aa7f2-d22e-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_d77cd3ab27" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + " \n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"c3127cd4-d22e-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"c307cb86-d22e-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_0f6ab65aa2" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"c31493ca-d22e-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_8a8a6feb20" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"c3158b68-d22e-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id109_content_1\");\n", + "//# sourceURL=js_dad76c90d2" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"c315de38-d22e-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"c3158b68-d22e-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_569dbdd862" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"c3162686-d22e-11ef-a7c0-0242ac1c0002\"] = window[\"id109\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_b94387a48b" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"c3179d5e-d22e-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_99e80eab06" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"c3181072-d22e-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id111_content_1\");\n", + "//# sourceURL=js_e20a7e1eeb" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"c3186478-d22e-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"c3181072-d22e-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_7cf489aa6c" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"c318b22a-d22e-11ef-a7c0-0242ac1c0002\"] = window[\"id111\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_6f602e97c1" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"c31cbeba-d22e-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"c3179d5e-d22e-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_964f6b3665" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + " \n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"c31e7a34-d22e-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"c31493ca-d22e-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_41b4b48b0f" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"c3201524-d22e-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_37740c045a" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"c3206bfa-d22e-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id109_content_2\");\n", + "//# sourceURL=js_a69e23ec58" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"c320c668-d22e-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"c3206bfa-d22e-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_e3b36a40dc" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"c3212176-d22e-11ef-a7c0-0242ac1c0002\"] = window[\"id109\"].setSelectedTabIndex(2);\n", + "//# sourceURL=js_32af55e732" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"c32264d2-d22e-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_6b27920866" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"c322dac0-d22e-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id112_content_1\");\n", + "//# sourceURL=js_b17d889550" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"c3232b2e-d22e-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"c322dac0-d22e-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_6837a77f52" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"c32383da-d22e-11ef-a7c0-0242ac1c0002\"] = window[\"id112\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_a2e9c5ca97" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"c324f008-d22e-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"c32264d2-d22e-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_9472e3d10f" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + " \n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"c3268972-d22e-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"c3201524-d22e-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_e45fafcbac" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"c32881c8-d22e-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_16a34a0f64" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"c328e1d6-d22e-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id109_content_3\");\n", + "//# sourceURL=js_f01549e090" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"c32944d2-d22e-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"c328e1d6-d22e-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_9eb3ac2357" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"c329973e-d22e-11ef-a7c0-0242ac1c0002\"] = window[\"id109\"].setSelectedTabIndex(3);\n", + "//# sourceURL=js_7d6cbc8b5d" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"c32af7d2-d22e-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_d141befdcc" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"c32b45e8-d22e-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id113_content_1\");\n", + "//# sourceURL=js_8cdba5364c" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"c32b941c-d22e-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"c32b45e8-d22e-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_2f69ed2d6e" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"c32bdcce-d22e-11ef-a7c0-0242ac1c0002\"] = window[\"id113\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_e6c27893b7" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"c347cd76-d22e-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"c32af7d2-d22e-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_1c86fc2143" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + " \n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"c34aba5e-d22e-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"c32881c8-d22e-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_3597657f7e" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"c34e504c-d22e-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_9a31dc498c" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"c34ebe7e-d22e-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id109_content_4\");\n", + "//# sourceURL=js_fa7c49f5f8" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"c34f2ce2-d22e-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"c34ebe7e-d22e-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_bc912503fa" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"c34f91a0-d22e-11ef-a7c0-0242ac1c0002\"] = window[\"id109\"].setSelectedTabIndex(4);\n", + "//# sourceURL=js_af7ce17ccc" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"c3522334-d22e-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_df72cdfbae" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"c35292ce-d22e-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id114_content_1\");\n", + "//# sourceURL=js_46e39ef51d" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"c35306c8-d22e-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"c35292ce-d22e-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_16c3708b6c" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"c35364ce-d22e-11ef-a7c0-0242ac1c0002\"] = window[\"id114\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_782cd8d4de" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"c356fa08-d22e-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"c3522334-d22e-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_2ad9093f32" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + " \n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"c358cafe-d22e-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"c34e504c-d22e-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_56c0874461" + ] + }, + "metadata": {} + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "mPAHeDfihehJ", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 888 + }, + "outputId": "f5057748-1ea1-426f-9e22-0efd7c83bc2d" + }, + "source": [ + "from matplotlib import pyplot\n", + "\n", + "pyplot.figure(figsize=(10,5))\n", + "for name in PlotNames['name']:\n", + " g = Graph[Graph['name'] == name]\n", + " pyplot.plot(g['year'], g['count'], label=name)\n", + "\n", + "_ = pyplot.legend(loc='best')\n", + "\n", + "pyplot.figure(figsize=(10,5))\n", + "_ = pyplot.plot(TotalBabies['year'],\n", + " TotalBabies['logica_value'],\n", + " label='Total babies')\n", + "_ = pyplot.legend(loc='best')" + ], + "execution_count": 49, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "
" + ], + "image/png": "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pdfr8fb2rvEhCILQHCanE4Aim4OPRDZLEARBuETdcsstbNmyhbS0NNLS0ti6dSu33HJLveNPnDjBt99+y2effcbVV19NXFwcEydO5IYbbqgx7oUXXmDs2LH07NmTv//972zbts1VtK5fv37ce++99O7dm/j4eJ5//nk6d+7Mzz//DEB6ejoLFy7ku+++Y/To0XTu3JlHH32UUaNGsXDhwrb7YtShVTNZsbGxhIaGsnbtWvr37w8o2aCEhATuv/9+AEaMGEFJSQmJiYkMGjQIgHXr1uF0Ohk2bJhrzD//+U9sNhtarRaA1atX061bN/z8/Fxj1q5dWyMFuXr1akaMGNHkuQiCILQ2k+PMsosP0vO4IyIQP61YNCAIgiDUz6BVc+S5KR1275YICgpi+vTpLFq0CFmWmT59OoGBgfWO37dvH2q1mrFjxzZ43b59+7r+PywsDIC8vDyioqIwGo08++yzrFixguzsbOx2OyaTifT0dAAOHjyIw+Gga9euNa5psVgICAho0fNsqWb/5TcajSQlJbk+T0lJYd++ffj7+xMVFcWDDz7If/7zH+Lj44mNjeXpp58mPDycWbNmAdCjRw+mTp3K3XffzYcffojNZmPBggXceOONhIeHA3DzzTfz73//m3nz5vHEE09w6NAh3nrrLd544w3Xff/2t78xduxYXnvtNaZPn87SpUvZvXu3q8y7JEmNzkUQBKG1VWey1BKUO5x8kJ7HPzqHd/CsBEEQhAuZJEktWrLX0e68804WLFgAUG97p2oGg6FJ16xOsIDydQFwVv1tffTRR1m9ejWvvvoqXbp0wWAwcN1112G1WgElTlGr1SQmJqJW1wwePT09m/akWkmzv5u7d+9m/Pjxrs+r9zDdfvvtLFq0iMcff5yKigruueceSkpKGDVqFKtWrcLNzc11zldffcWCBQuYOHEiKpWKa6+9lrffftt13MfHhz/++IMHHniAQYMGERgYyDPPPFOjl9bIkSNZsmQJTz31FP/4xz+Ij49n+fLl9O7d2zWmKXMRBEFoTWaH8ofglrAAPs8q5OPMAu6ODCJIp23kTEEQBEG4uEydOhWr1YokSUyZ0nAmrk+fPjidTjZu3FirQnhTbd26lblz53L11VcDSlCVmprqOj5gwAAcDgd5eXmMHj26RfdoLc0OssaNG9dgFRJJknjuued47rnn6h3j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Pvggd9555+w21tJSZiJ7pRQAH/vYx7jpppu4+OKL+cpXvsKqVav4xje+MZvNt5wAM33m//Vf/zXj4+P87Gc/48knn+SWW27hfe97H5s3b57F1ltmys0338yWLVv47ne/O9tNsZxiWiH7LVu28K53vYvbb7+d9evXt7B1pwarZFnmDJdeeilPP/004+PjDA0NsWHDBvbv389ZZ53VVK9QKHDNNdfQ3t7Ovffei+d59d8GBgYOiVBUWz6ci5llbnAs2T/44INs376drq4uXNetu4e+5z3vqbsNWdmfnhxL9gsWLADgggsuaNru/PPPZ9euXYCR7+joaNPvcRwzNjZmZT+HOZbst2/fzte+9jW+8Y1vcPXVV7N69Wpuv/12LrvssnowDSv7ucunPvUpfvSjH/HQQw+xePHi+vqBgQHCMGR8fLyp/sjISF1mM3meH6lOR0cH2Wy21adjOQ5ORPY1nnvuOa6++mo++tGPcttttzX9drrI3ipZljlHZ2cnvb29bNu2jSeffLLJPWxycpL169fj+z73339/kz8/wNq1a9m8eXPTS/eBBx6go6PjkI80y9zjSLL//Oc/z+9+9zuefvrpegL4yle+wje/+U3Ayv5050iyX758OQsXLjwkDPCLL77IsmXLACP78fFxnnrqqfrvDz74IEop1qxZc+pOwvKaOJLsS6USwCHeDI7j1C2cVvZzD601n/rUp7j33nt58MEHWbFiRdPvl156KZ7n8fOf/7y+buvWrezatYu1a9cCM3uer127tmkftTq1fVhOPa2QPcCzzz7LVVddxY033sjf/u3fHnKc00b2sx15w3LmUCgU9KZNm/SmTZs0oP/hH/5Bb9q0Sb/yyitaaxMp8KGHHtLbt2/X9913n162bJm+/vrr69tPTEzoNWvW6De+8Y36pZde0kNDQ/UUx7HWWus4jvWFF16o169fr59++mm9YcMG3dvbq2+99dZZOWeL4URlfzg4KFqZlf3cpBWy/8pXvqI7Ojr0Pffco7dt26Zvu+02nclk9EsvvVSvc8011+iLL75YP/744/rRRx/V55xzjr7hhhtO6blamjlR2YdhqFeuXKnf+ta36scff1y/9NJL+stf/rIWQuh///d/r9ezsp9bfOITn9CdnZ36F7/4RdN7ulQq1et8/OMf10uXLtUPPvigfvLJJ/XatWv12rVr67/P5Hm+Y8cOncvl9Oc+9zn9/PPP67vuuks7jqM3bNhwSs/XMk0rZL9582bd29urP/jBDzbtY3R0tF7ndJG9VbIsp4yHHnpIA4ekG2+8UWut9Ve/+lW9ePFi7XmeXrp0qb7tttuaQm8faXtA79y5s17v5Zdf1tdee63OZrO6p6dH/8Vf/EU9xLtldjhR2R+Og5Usra3s5yKtkv0dd9yhFy9erHO5nF67dq3+5S9/2fT7/v379Q033KDb2tp0R0eHvummm3ShUDgVp2g5Aq2Q/Ysvvqivv/563dfXp3O5nL7ooosOCeluZT+3ONJ7+pvf/Ga9Trlc1p/85Cf1vHnzdC6X03/4h3+oh4aGmvYzk+f5Qw89pN/0pjdp3/f1WWed1XQMy6mnFbK//fbbD7uPZcuWNR3rdJC90FrrlpvHLBaLxWKxWCwWi+UMxY7JslgsFovFYrFYLJYWYpUsi8VisVgsFovFYmkhVsmyWCwWi8VisVgslhZilSyLxWKxWCwWi8ViaSFWybJYLBaLxWKxWCyWFmKVLIvFYrFYLBaLxWJpIVbJslgsFovFYrFYLJYWYpUsi8VisVgsFovFYmkhVsmyWCwWi8VisVgslhZilSyLxWKxWCwWi8ViaSFWybJYLBaLxWKxWCyWFvJ/ABPPLk9B7tKsAAAAAElFTkSuQmCC\n" + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "
" + ], + "image/png": "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iIiI6JomB537778fV69exZtvvons7Gz06dMHO3fuNDQoSEtLg1T690BRYWEhnnjiCWRnZ8PJyQnh4eE4evQounXrZrx3QURERERE9A8SQRAEsYu4FY1GA7VajeLiYqhUKrHLISIiIiIikTQ2GzRpjQ4REREREZE5YNAhIiIiIiKLw6BDREREREQWh0GHiIiIiIgsDoMOERERERFZHAYdIiIiIiKyOAw6RERERERkcZq8YagY6rb60Wg0IldCRERERERiqssEt9oO1CyCTklJCQDAz89P5EqIiIiIiMgUlJSUQK1WN/i4RLhVFDIBer0emZmZcHBwgEQiEbucdkuj0cDPzw/p6ek33YWWLA+vffvFa99+8dq3X7z27Ze5XHtBEFBSUgJvb29IpQ2vxDGLER2pVApfX1+xy6BrVCqVSf/lp9bDa99+8dq3X7z27RevfftlDtf+ZiM5ddiMgIiIiIiILA6DDhERERERWRwGHWo0pVKJt956C0qlUuxSqI3x2rdfvPbtF699+8Vr335Z2rU3i2YERERERERETcERHSIiIiIisjgMOkREREREZHEYdIiIiIiIyOIw6BARERERkcVh0CEiIiIiIovDoNPOHDp0CJMmTYK3tzckEgk2b95c7/GcnBw8+uij8Pb2hq2tLcaNG4dLly4ZHi8oKMAzzzyDkJAQ2NjYwN/fH88++yyKi4vrvU5aWhomTpwIW1tbuLu746WXXkJNTU1bvEVqQEuv/T8JgoDx48ff8HV47U2Psa59ZGQkRo0aBTs7O6hUKgwbNgwVFRWGxwsKCvDQQw9BpVLB0dERM2fORGlpaWu/PboJY1z77OxsPPLII/D09ISdnR3CwsLw66+/1juG1970LFq0CP369YODgwPc3d0xefJkJCQk1DumsrISc+fOhYuLC+zt7XHvvfciJyen3jGN+Z1+4MABhIWFQalUIjg4GGvXrm3tt0c3YYxrf+bMGUybNg1+fn6wsbFB165dsXz58uvOZerXnkGnnSkrK0Pv3r2xYsWK6x4TBAGTJ0/G5cuXsWXLFkRHRyMgIACjR49GWVkZACAzMxOZmZlYvHgx4uLisHbtWuzcuRMzZ840vI5Op8PEiRNRVVWFo0eP4ttvv8XatWvx5ptvttn7pOu19Nr/07JlyyCRSK67n9feNBnj2kdGRmLcuHEYM2YMTpw4gZMnT2LevHmQSv/+Z+Shhx5CfHw8du/eje3bt+PQoUOYPXt2m7xHujFjXPvp06cjISEBW7duRWxsLO655x7cd999iI6ONhzDa296Dh48iLlz5+LYsWPYvXs3qqurMWbMmHrX9oUXXsC2bduwceNGHDx4EJmZmbjnnnsMjzfmd3pycjImTpyIkSNHIiYmBs8//zxmzZqFXbt2ten7pb8Z49qfOnUK7u7uWL9+PeLj4/F///d/WLBgAT777DPDMWZx7QVqtwAImzZtMvyckJAgABDi4uIM9+l0OsHNzU346quvGnydn3/+WVAoFEJ1dbUgCIKwY8cOQSqVCtnZ2YZjvvjiC0GlUglardb4b4SarCXXPjo6WvDx8RGysrKuex1ee9PX3Gs/YMAA4fXXX2/wdc+dOycAEE6ePGm4748//hAkEomQkZFh3DdBzdLca29nZyesW7eu3ms5OzsbjuG1Nw+5ubkCAOHgwYOCIAhCUVGRIJfLhY0bNxqOOX/+vABAiIyMFAShcb/TX375ZaF79+71znX//fcLY8eObe23RI3UnGt/I08//bQwcuRIw8/mcO05okMGWq0WAGBtbW24TyqVQqlU4vDhww0+r7i4GCqVClZWVgBqv/nt2bMnPDw8DMeMHTsWGo0G8fHxrVQ9tURjr315eTkefPBBrFixAp6ente9Dq+9+WnMtc/NzcXx48fh7u6OQYMGwcPDA8OHD6/3dyMyMhKOjo7o27ev4b7Ro0dDKpXi+PHjbfRuqCka+9/9oEGD8NNPP6GgoAB6vR4bNmxAZWUlRowYAYDX3lzUTTF3dnYGUPuNfXV1NUaPHm04pkuXLvD390dkZCSAxv1Oj4yMrPcadcfUvQaJrznXvqHXqXsNwDyuPYMOGdT9JV+wYAEKCwtRVVWFDz/8EFeuXEFWVtYNn5OXl4d333233hSF7Ozser8UARh+zs7Obr03QM3W2Gv/wgsvYNCgQbjrrrtu+Dq89uanMdf+8uXLAIC3334bTzzxBHbu3ImwsDDcdttthvUc2dnZcHd3r/faVlZWcHZ25rU3UY397/7nn39GdXU1XFxcoFQq8eSTT2LTpk0IDg4GwGtvDvR6PZ5//nkMHjwYPXr0AFB73RQKBRwdHesd6+HhYbhujfmd3tAxGo2m3ho+Ekdzr/2/HT16FD/99FOjPu+Z0rVn0CEDuVyO3377DRcvXoSzszNsbW2xf/9+jB8/vt48/DoajQYTJ05Et27d8Pbbb7d9wWQ0jbn2W7duxb59+7Bs2TJxiyWjasy11+v1AIAnn3wSjz32GEJDQ7F06VKEhIRg9erVYpZPLdDY3/lvvPEGioqKsGfPHkRFRWH+/Pm47777EBsbK2L11BRz585FXFwcNmzYIHYp1MaMce3j4uJw11134a233sKYMWOMWF3rY9ChesLDwxETE4OioiJkZWVh586dyM/PR4cOHeodV1JSgnHjxsHBwQGbNm2CXC43PObp6Xld15a6n2803YlMw62u/b59+5CUlARHR0dYWVkZpiree++9hiksvPbm6VbX3svLCwDQrVu3es/r2rUr0tLSANRe39zc3HqP19TUoKCggNfehN3q2iclJeGzzz7D6tWrcdttt6F3795466230LdvX0ODA1570zZv3jxs374d+/fvh6+vr+F+T09PVFVVoaioqN7xOTk5huvWmN/pDR2jUqlgY2Nj7LdDTdCSa1/n3LlzuO222zB79my8/vrr9R4zh2vPoEM3pFar4ebmhkuXLiEqKqreVCWNRoMxY8ZAoVBg69at9eZ3A0BERARiY2Pr/cO3e/duqFSq6z4okelp6Nq/+uqrOHv2LGJiYgw3AFi6dCnWrFkDgNfe3DV07QMDA+Ht7X1de9KLFy8iICAAQO21LyoqwqlTpwyP79u3D3q9HgMGDGi7N0HN0tC1Ly8vB4DrRvVlMplhpI/X3jQJgoB58+Zh06ZN2LdvH4KCguo9Hh4eDrlcjr179xruS0hIQFpaGiIiIgA07nd6REREvdeoO6buNajtGePaA0B8fDxGjhyJGTNm4P3337/uPGZx7cXuhkBtq6SkRIiOjhaio6MFAMLHH38sREdHC6mpqYIg1HZQ279/v5CUlCRs3rxZCAgIEO655x7D84uLi4UBAwYIPXv2FBITE4WsrCzDraamRhAEQaipqRF69OghjBkzRoiJiRF27twpuLm5CQsWLBDlPVOtll77G8G/ujjx2psmY1z7pUuXCiqVSti4caNw6dIl4fXXXxesra2FxMREwzHjxo0TQkNDhePHjwuHDx8WOnXqJEybNq1N3yvV19JrX1VVJQQHBwtDhw4Vjh8/LiQmJgqLFy8WJBKJ8PvvvxuO47U3PXPmzBHUarVw4MCBev9Wl5eXG4556qmnBH9/f2Hfvn1CVFSUEBERIURERBgeb8zv9MuXLwu2trbCSy+9JJw/f15YsWKFIJPJhJ07d7bp+6W/GePax8bGCm5ubsLDDz9c7zVyc3MNx5jDtWfQaWf2798vALjuNmPGDEEQBGH58uWCr6+vIJfLBX9/f+H111+v1xa4oecDEJKTkw3HpaSkCOPHjxdsbGwEV1dX4T//+Y+h/TSJo6XX/kb+HXQEgdfeFBnr2i9atEjw9fUVbG1thYiICOGvv/6q93h+fr4wbdo0wd7eXlCpVMJjjz0mlJSUtMVbpAYY49pfvHhRuOeeewR3d3fB1tZW6NWr13XtpnntTU9D/1avWbPGcExFRYXw9NNPC05OToKtra1w9913C1lZWfVepzG/0/fv3y/06dNHUCgUQocOHeqdg9qeMa79W2+9dcPXCAgIqHcuU7/2EkEQBKMPExEREREREYmIa3SIiIiIiMjiMOgQEREREZHFYdAhIiIiIiKLw6BDREREREQWh0GHiIiIiIgsDoMOERERERFZHAYdIiIiIiKyOAw6RERERERkcRh0iIiIiIjI4jDoEBERERGRxWHQISIiIiIii/P/TxCTChUSkOAAAAAASUVORK5CYII=\n" + }, + "metadata": {} + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "S7gEFDte_g-Y" + }, + "source": [ + "## APPENDIX" + ] + }, + { + "cell_type": "markdown", + "source": [ + "### Calling BigQuery functions\n", + "\n", + "Most of BigQuery built-in functions are available in Logica through their CamelCased representation.\n", + "\n", + "For instance `FORMAT_TIMESTAMP` SQL function is called as `FormatTimestamp` in Logica." + ], + "metadata": { + "id": "KH2pnP82ptNY" + } + }, + { + "cell_type": "code", + "source": [ + "%%logica QuarterWeight\n", + "\n", + "@Engine(\"bigquery\");\n", + "\n", + "TimestampWeight(\"2001-01-01 00:00:00+00:00\", 1);\n", + "TimestampWeight(\"2001-04-01 00:00:00+00:00\", 1);\n", + "TimestampWeight(\"2001-08-01 00:00:00+00:00\", 1);\n", + "TimestampWeight(\"2001-07-01 00:00:00+00:00\", 1);\n", + "\n", + "QuarterWeight(quarter:, weight? += weight) distinct :-\n", + " TimestampWeight(date, weight),\n", + " quarter = FormatTimestamp(\"%Y-%Q\", Timestamp(date));" + ], + "metadata": { + "id": "xl4Hu2pYpr-R", + "outputId": "42a4a606-d08c-44de-91db-d48ba5789dc8", + "colab": { + "resources": { + "http://localhost:8080/nbextensions/google.colab/tabbar.css": { + "data": "Lmdvb2ctdGFie3Bvc2l0aW9uOnJlbGF0aXZlO3BhZGRpbmc6NHB4IDhweDtjb2xvcjojMDBjO3RleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7Y3Vyc29yOmRlZmF1bHR9Lmdvb2ctdGFiLWJhci10b3AgLmdvb2ctdGFie21hcmdpbjoxcHggNHB4IDAgMDtib3JkZXItYm90dG9tOjA7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLXRvcDphZnRlciwuZ29vZy10YWItYmFyLWJvdHRvbTphZnRlcntjb250ZW50OiIgIjtkaXNwbGF5OmJsb2NrO2hlaWdodDowO2NsZWFyOmJvdGg7dmlzaWJpbGl0eTpoaWRkZW59Lmdvb2ctdGFiLWJhci1ib3R0b20gLmdvb2ctdGFie21hcmdpbjowIDRweCAxcHggMDtib3JkZXItdG9wOjA7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLXN0YXJ0IC5nb29nLXRhYnttYXJnaW46MCAwIDRweCAxcHg7Ym9yZGVyLXJpZ2h0OjB9Lmdvb2ctdGFiLWJhci1lbmQgLmdvb2ctdGFie21hcmdpbjowIDFweCA0cHggMDtib3JkZXItbGVmdDowfS5nb29nLXRhYi1ob3ZlcntiYWNrZ3JvdW5kOiNlZWV9Lmdvb2ctdGFiLWRpc2FibGVke2NvbG9yOiM2NjZ9Lmdvb2ctdGFiLXNlbGVjdGVke2NvbG9yOiMwMDA7YmFja2dyb3VuZDojZmZmO3RleHQtZGVjb3JhdGlvbjpub25lO2ZvbnQtd2VpZ2h0OmJvbGQ7Ym9yZGVyOjFweCBzb2xpZCAjNmI5MGRhfS5nb29nLXRhYi1iYXItdG9we3BhZGRpbmctdG9wOjVweCFpbXBvcnRhbnQ7cGFkZGluZy1sZWZ0OjVweCFpbXBvcnRhbnQ7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgIzZiOTBkYSFpbXBvcnRhbnR9Lmdvb2ctdGFiLWJhci10b3AgLmdvb2ctdGFiLXNlbGVjdGVke3RvcDoxcHg7bWFyZ2luLXRvcDowO3BhZGRpbmctYm90dG9tOjVweH0uZ29vZy10YWItYmFyLWJvdHRvbSAuZ29vZy10YWItc2VsZWN0ZWR7dG9wOi0xcHg7bWFyZ2luLWJvdHRvbTowO3BhZGRpbmctdG9wOjVweH0uZ29vZy10YWItYmFyLXN0YXJ0IC5nb29nLXRhYi1zZWxlY3RlZHtsZWZ0OjFweDttYXJnaW4tbGVmdDowO3BhZGRpbmctcmlnaHQ6OXB4fS5nb29nLXRhYi1iYXItZW5kIC5nb29nLXRhYi1zZWxlY3RlZHtsZWZ0Oi0xcHg7bWFyZ2luLXJpZ2h0OjA7cGFkZGluZy1sZWZ0OjlweH0uZ29vZy10YWItYmFye21hcmdpbjowO2JvcmRlcjowO3BhZGRpbmc6MDtsaXN0LXN0eWxlOm5vbmU7Y3Vyc29yOmRlZmF1bHQ7b3V0bGluZTpub25lO2JhY2tncm91bmQ6I2ViZWZmOX0uZ29vZy10YWItYmFyLWNsZWFye2NsZWFyOmJvdGg7aGVpZ2h0OjA7b3ZlcmZsb3c6aGlkZGVufS5nb29nLXRhYi1iYXItc3RhcnR7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLWVuZHtmbG9hdDpyaWdodH0qIGh0bWwgLmdvb2ctdGFiLWJhci1zdGFydHttYXJnaW4tcmlnaHQ6LTNweH0qIGh0bWwgLmdvb2ctdGFiLWJhci1lbmR7bWFyZ2luLWxlZnQ6LTNweH1zZW50aW5lbHt9", + "ok": true, + "headers": [ + [ + "content-length", + "1404" + ], + [ + "content-type", + "text/css" + ] + ], + "status": 200, + "status_text": "" + }, + "http://localhost:8080/nbextensions/google.colab/tabbar_main.min.js": { + "data": "Ly8gY2xhbmctZm9ybWF0IG9mZgooZnVuY3Rpb24oKXt2YXIgZyxhYT1mdW5jdGlvbihhKXt2YXIgYj0wO3JldHVybiBmdW5jdGlvbigpe3JldHVybiBiPGEubGVuZ3RoP3tkb25lOiExLHZhbHVlOmFbYisrXX06e2RvbmU6ITB9fX0sYmE9dHlwZW9mIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzPT0iZnVuY3Rpb24iP09iamVjdC5kZWZpbmVQcm9wZXJ0eTpmdW5jdGlvbihhLGIsYyl7aWYoYT09QXJyYXkucHJvdG90eXBlfHxhPT1PYmplY3QucHJvdG90eXBlKXJldHVybiBhO2FbYl09Yy52YWx1ZTtyZXR1cm4gYX0sY2E9ZnVuY3Rpb24oYSl7YT1bIm9iamVjdCI9PXR5cGVvZiBnbG9iYWxUaGlzJiZnbG9iYWxUaGlzLGEsIm9iamVjdCI9PXR5cGVvZiB3aW5kb3cmJndpbmRvdywib2JqZWN0Ij09dHlwZW9mIHNlbGYmJnNlbGYsIm9iamVjdCI9PXR5cGVvZiBnbG9iYWwmJmdsb2JhbF07Zm9yKHZhciBiPTA7YjxhLmxlbmd0aDsrK2Ipe3ZhciBjPWFbYl07aWYoYyYmYy5NYXRoPT1NYXRoKXJldHVybiBjfXRocm93IEVycm9yKCJDYW5ub3QgZmluZCBnbG9iYWwgb2JqZWN0Iik7Cn0sZGE9Y2EodGhpcyksZWE9ZnVuY3Rpb24oYSxiKXtpZihiKWE6e3ZhciBjPWRhO2E9YS5zcGxpdCgiLiIpO2Zvcih2YXIgZD0wO2Q8YS5sZW5ndGgtMTtkKyspe3ZhciBlPWFbZF07aWYoIShlIGluIGMpKWJyZWFrIGE7Yz1jW2VdfWE9YVthLmxlbmd0aC0xXTtkPWNbYV07Yj1iKGQpO2IhPWQmJmIhPW51bGwmJmJhKGMsYSx7Y29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOmJ9KX19OwplYSgiU3ltYm9sIixmdW5jdGlvbihhKXtpZihhKXJldHVybiBhO3ZhciBiPWZ1bmN0aW9uKGYsaCl7dGhpcy5nPWY7YmEodGhpcywiZGVzY3JpcHRpb24iLHtjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6aH0pfTtiLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmd9O3ZhciBjPSJqc2NvbXBfc3ltYm9sXyIrKE1hdGgucmFuZG9tKCkqMUU5Pj4+MCkrIl8iLGQ9MCxlPWZ1bmN0aW9uKGYpe2lmKHRoaXMgaW5zdGFuY2VvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoIlN5bWJvbCBpcyBub3QgYSBjb25zdHJ1Y3RvciIpO3JldHVybiBuZXcgYihjKyhmfHwiIikrIl8iK2QrKyxmKX07cmV0dXJuIGV9KTsKdmFyIGZhPWZ1bmN0aW9uKGEpe3ZhciBiPXR5cGVvZiBTeW1ib2whPSJ1bmRlZmluZWQiJiZTeW1ib2wuaXRlcmF0b3ImJmFbU3ltYm9sLml0ZXJhdG9yXTtpZihiKXJldHVybiBiLmNhbGwoYSk7aWYodHlwZW9mIGEubGVuZ3RoPT0ibnVtYmVyIilyZXR1cm57bmV4dDphYShhKX07dGhyb3cgRXJyb3IoU3RyaW5nKGEpKyIgaXMgbm90IGFuIGl0ZXJhYmxlIG9yIEFycmF5TGlrZSIpO307ZWEoIlN5bWJvbC5kaXNwb3NlIixmdW5jdGlvbihhKXtyZXR1cm4gYT9hOlN5bWJvbCgiU3ltYm9sLmRpc3Bvc2UiKX0pOy8qCgogQ29weXJpZ2h0IFRoZSBDbG9zdXJlIExpYnJhcnkgQXV0aG9ycy4KIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wCiovCnZhciBsPXRoaXN8fHNlbGYsaWE9ZnVuY3Rpb24oYSl7YS5JYT12b2lkIDA7YS5WPWZ1bmN0aW9uKCl7cmV0dXJuIGEuSWE/YS5JYTphLklhPW5ldyBhfX0samE9ZnVuY3Rpb24oYSl7dmFyIGI9dHlwZW9mIGE7cmV0dXJuIGIhPSJvYmplY3QiP2I6YT9BcnJheS5pc0FycmF5KGEpPyJhcnJheSI6YjoibnVsbCJ9LGthPWZ1bmN0aW9uKGEpe3ZhciBiPWphKGEpO3JldHVybiBiPT0iYXJyYXkifHxiPT0ib2JqZWN0IiYmdHlwZW9mIGEubGVuZ3RoPT0ibnVtYmVyIn0sbT1mdW5jdGlvbihhKXt2YXIgYj10eXBlb2YgYTtyZXR1cm4gYj09Im9iamVjdCImJmEhPW51bGx8fGI9PSJmdW5jdGlvbiJ9LG5hPWZ1bmN0aW9uKGEpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYSxsYSkmJmFbbGFdfHwoYVtsYV09KyttYSl9LGxhPSJjbG9zdXJlX3VpZF8iKyhNYXRoLnJhbmRvbSgpKjFFOT4+PjApLG1hPTAsbj1mdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoKXt9Yy5wcm90b3R5cGU9CmIucHJvdG90eXBlO2EubD1iLnByb3RvdHlwZTthLnByb3RvdHlwZT1uZXcgYzthLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1hO2EucWQ9ZnVuY3Rpb24oZCxlLGYpe2Zvcih2YXIgaD1BcnJheShhcmd1bWVudHMubGVuZ3RoLTIpLGs9MjtrPGFyZ3VtZW50cy5sZW5ndGg7aysrKWhbay0yXT1hcmd1bWVudHNba107cmV0dXJuIGIucHJvdG90eXBlW2VdLmFwcGx5KGQsaCl9fTtmdW5jdGlvbiBvYShhLGIpe2lmKEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKUVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsb2EpO2Vsc2V7dmFyIGM9RXJyb3IoKS5zdGFjaztjJiYodGhpcy5zdGFjaz1jKX1hJiYodGhpcy5tZXNzYWdlPVN0cmluZyhhKSk7YiE9PXZvaWQgMCYmKHRoaXMuY2F1c2U9Yil9bihvYSxFcnJvcik7b2EucHJvdG90eXBlLm5hbWU9IkN1c3RvbUVycm9yIjt2YXIgcGE7ZnVuY3Rpb24gcWEoYSxiKXthPWEuc3BsaXQoIiVzIik7Zm9yKHZhciBjPSIiLGQ9YS5sZW5ndGgtMSxlPTA7ZTxkO2UrKyljKz1hW2VdKyhlPGIubGVuZ3RoP2JbZV06IiVzIik7b2EuY2FsbCh0aGlzLGMrYVtkXSl9bihxYSxvYSk7cWEucHJvdG90eXBlLm5hbWU9IkFzc2VydGlvbkVycm9yIjtmdW5jdGlvbiByYShhLGIsYyxkKXt2YXIgZT0iQXNzZXJ0aW9uIGZhaWxlZCI7aWYoYyl7ZSs9IjogIitjO3ZhciBmPWR9ZWxzZSBhJiYoZSs9IjogIithLGY9Yik7dGhyb3cgbmV3IHFhKCIiK2UsZnx8W10pO30KdmFyIHA9ZnVuY3Rpb24oYSxiLGMpe2F8fHJhKCIiLG51bGwsYixBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMikpO3JldHVybiBhfSxzYT1mdW5jdGlvbihhLGIsYyl7bShhKSYmYS5ub2RlVHlwZT09MXx8cmEoIkV4cGVjdGVkIEVsZW1lbnQgYnV0IGdvdCAlczogJXMuIixbamEoYSksYV0sYixBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMikpfSx1YT1mdW5jdGlvbihhLGIsYyxkKXthIGluc3RhbmNlb2YgYnx8cmEoIkV4cGVjdGVkIGluc3RhbmNlb2YgJXMgYnV0IGdvdCAlcy4iLFt0YShiKSx0YShhKV0sYyxBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMykpfTsKZnVuY3Rpb24gdGEoYSl7cmV0dXJuIGEgaW5zdGFuY2VvZiBGdW5jdGlvbj9hLmRpc3BsYXlOYW1lfHxhLm5hbWV8fCJ1bmtub3duIHR5cGUgbmFtZSI6YSBpbnN0YW5jZW9mIE9iamVjdD9hLmNvbnN0cnVjdG9yLmRpc3BsYXlOYW1lfHxhLmNvbnN0cnVjdG9yLm5hbWV8fE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhKTphPT09bnVsbD8ibnVsbCI6dHlwZW9mIGF9O3ZhciB2YT1BcnJheS5wcm90b3R5cGUuaW5kZXhPZj9mdW5jdGlvbihhLGIpe3AoYS5sZW5ndGghPW51bGwpO3JldHVybiBBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKGEsYix2b2lkIDApfTpmdW5jdGlvbihhLGIpe2lmKHR5cGVvZiBhPT09InN0cmluZyIpcmV0dXJuIHR5cGVvZiBiIT09InN0cmluZyJ8fGIubGVuZ3RoIT0xPy0xOmEuaW5kZXhPZihiLDApO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWlmKGMgaW4gYSYmYVtjXT09PWIpcmV0dXJuIGM7cmV0dXJuLTF9LHdhPUFycmF5LnByb3RvdHlwZS5mb3JFYWNoP2Z1bmN0aW9uKGEsYil7cChhLmxlbmd0aCE9bnVsbCk7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChhLGIsdm9pZCAwKX06ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9YS5sZW5ndGgsZD10eXBlb2YgYT09PSJzdHJpbmciP2Euc3BsaXQoIiIpOmEsZT0wO2U8YztlKyspZSBpbiBkJiZiLmNhbGwodm9pZCAwLGRbZV0sZSxhKX07CmZ1bmN0aW9uIHhhKGEsYil7Yj12YShhLGIpO3ZhciBjO2lmKGM9Yj49MClwKGEubGVuZ3RoIT1udWxsKSxBcnJheS5wcm90b3R5cGUuc3BsaWNlLmNhbGwoYSxiLDEpO3JldHVybiBjfWZ1bmN0aW9uIHlhKGEpe3ZhciBiPWEubGVuZ3RoO2lmKGI+MCl7Zm9yKHZhciBjPUFycmF5KGIpLGQ9MDtkPGI7ZCsrKWNbZF09YVtkXTtyZXR1cm4gY31yZXR1cm5bXX1mdW5jdGlvbiB6YShhLGIsYyxkKXtwKGEubGVuZ3RoIT1udWxsKTtBcnJheS5wcm90b3R5cGUuc3BsaWNlLmFwcGx5KGEsQWEoYXJndW1lbnRzLDEpKX1mdW5jdGlvbiBBYShhLGIsYyl7cChhLmxlbmd0aCE9bnVsbCk7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg8PTI/QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYSxiKTpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhLGIsYyl9O2Z1bmN0aW9uIEJhKGEsYixjKXtmb3IodmFyIGQgaW4gYSliLmNhbGwoYyxhW2RdLGQsYSl9ZnVuY3Rpb24gQ2EoYSxiKXtmb3IodmFyIGMgaW4gYSlpZihhW2NdPT1iKXJldHVybiEwO3JldHVybiExfWZ1bmN0aW9uIERhKGEsYixjKXtpZihhIT09bnVsbCYmYiBpbiBhKXRocm93IEVycm9yKCdUaGUgb2JqZWN0IGFscmVhZHkgY29udGFpbnMgdGhlIGtleSAiJytiKyciJyk7YVtiXT1jfWZ1bmN0aW9uIEVhKGEpe3ZhciBiPXt9LGM7Zm9yKGMgaW4gYSliW2FbY11dPWM7cmV0dXJuIGJ9dmFyIEZhPSJjb25zdHJ1Y3RvciBoYXNPd25Qcm9wZXJ0eSBpc1Byb3RvdHlwZU9mIHByb3BlcnR5SXNFbnVtZXJhYmxlIHRvTG9jYWxlU3RyaW5nIHRvU3RyaW5nIHZhbHVlT2YiLnNwbGl0KCIgIik7CmZ1bmN0aW9uIEdhKGEsYil7Zm9yKHZhciBjLGQsZT0xO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspe2Q9YXJndW1lbnRzW2VdO2ZvcihjIGluIGQpYVtjXT1kW2NdO2Zvcih2YXIgZj0wO2Y8RmEubGVuZ3RoO2YrKyljPUZhW2ZdLE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChkLGMpJiYoYVtjXT1kW2NdKX19O3ZhciBIYT1TdHJpbmcucHJvdG90eXBlLnRyaW0/ZnVuY3Rpb24oYSl7cmV0dXJuIGEudHJpbSgpfTpmdW5jdGlvbihhKXtyZXR1cm4vXltcc1x4YTBdKihbXHNcU10qPylbXHNceGEwXSokLy5leGVjKGEpWzFdfTsvKgoKIENvcHlyaWdodCBHb29nbGUgTExDCiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMAoqLwp2YXIgSWE9e307dmFyIEphPWZ1bmN0aW9uKGEpe2lmKElhIT09SWEpdGhyb3cgRXJyb3IoIkJhZCBzZWNyZXQiKTt0aGlzLmc9YX07SmEucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ307bmV3IEphKCJhYm91dDpibGFuayIpO25ldyBKYSgiYWJvdXQ6aW52YWxpZCN6Q2xvc3VyZXoiKTt2YXIgS2E9W10sTGE9ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJBIFVSTCB3aXRoIGNvbnRlbnQgJyIrYSsiJyB3YXMgc2FuaXRpemVkIGF3YXkuIil9O0thLmluZGV4T2YoTGEpPT09LTEmJkthLnB1c2goTGEpO3ZhciBNYSxOYTthOntmb3IodmFyIE9hPVsiQ0xPU1VSRV9GTEFHUyJdLFBhPWwsUWE9MDtRYTxPYS5sZW5ndGg7UWErKylpZihQYT1QYVtPYVtRYV1dLFBhPT1udWxsKXtOYT1udWxsO2JyZWFrIGF9TmE9UGF9dmFyIFJhPU5hJiZOYVs2MTA0MDEzMDFdO01hPVJhIT1udWxsP1JhOiExO2Z1bmN0aW9uIFNhKCl7dmFyIGE9bC5uYXZpZ2F0b3I7cmV0dXJuIGEmJihhPWEudXNlckFnZW50KT9hOiIifXZhciBUYSxVYT1sLm5hdmlnYXRvcjtUYT1VYT9VYS51c2VyQWdlbnREYXRhfHxudWxsOm51bGw7ZnVuY3Rpb24gcihhKXtyZXR1cm4gU2EoKS5pbmRleE9mKGEpIT0tMX07dmFyIFZhPXIoIkVkZ2UiKSx0PXIoIkdlY2tvIikmJiEoU2EoKS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoIndlYmtpdCIpIT0tMSYmIXIoIkVkZ2UiKSkmJiEocigiVHJpZGVudCIpfHxyKCJNU0lFIikpJiYhcigiRWRnZSIpLHU9U2EoKS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoIndlYmtpdCIpIT0tMSYmIXIoIkVkZ2UiKSx2PU1hJiZUYSYmVGEucGxhdGZvcm0/VGEucGxhdGZvcm09PT0ibWFjT1MiOnIoIk1hY2ludG9zaCIpO3ZhciBYYT1mdW5jdGlvbihhLGIpe0JhKGIsZnVuY3Rpb24oYyxkKXtkPT0ic3R5bGUiP2Euc3R5bGUuY3NzVGV4dD1jOmQ9PSJjbGFzcyI/YS5jbGFzc05hbWU9YzpkPT0iZm9yIj9hLmh0bWxGb3I9YzpXYS5oYXNPd25Qcm9wZXJ0eShkKT9hLnNldEF0dHJpYnV0ZShXYVtkXSxjKTpkLmxhc3RJbmRleE9mKCJhcmlhLSIsMCk9PTB8fGQubGFzdEluZGV4T2YoImRhdGEtIiwwKT09MD9hLnNldEF0dHJpYnV0ZShkLGMpOmFbZF09Y30pfSxXYT17Y2VsbHBhZGRpbmc6ImNlbGxQYWRkaW5nIixjZWxsc3BhY2luZzoiY2VsbFNwYWNpbmciLGNvbHNwYW46ImNvbFNwYW4iLGZyYW1lYm9yZGVyOiJmcmFtZUJvcmRlciIsaGVpZ2h0OiJoZWlnaHQiLG1heGxlbmd0aDoibWF4TGVuZ3RoIixub25jZToibm9uY2UiLHJvbGU6InJvbGUiLHJvd3NwYW46InJvd1NwYW4iLHR5cGU6InR5cGUiLHVzZW1hcDoidXNlTWFwIix2YWxpZ246InZBbGlnbiIsd2lkdGg6IndpZHRoIn0sWWE9ZnVuY3Rpb24oYSwKYixjKXtmdW5jdGlvbiBkKGspe2smJmIuYXBwZW5kQ2hpbGQodHlwZW9mIGs9PT0ic3RyaW5nIj9hLmNyZWF0ZVRleHROb2RlKGspOmspfWZvcih2YXIgZT0yO2U8Yy5sZW5ndGg7ZSsrKXt2YXIgZj1jW2VdO2lmKCFrYShmKXx8bShmKSYmZi5ub2RlVHlwZT4wKWQoZik7ZWxzZXthOntpZihmJiZ0eXBlb2YgZi5sZW5ndGg9PSJudW1iZXIiKXtpZihtKGYpKXt2YXIgaD10eXBlb2YgZi5pdGVtPT0iZnVuY3Rpb24ifHx0eXBlb2YgZi5pdGVtPT0ic3RyaW5nIjticmVhayBhfWlmKHR5cGVvZiBmPT09ImZ1bmN0aW9uIil7aD10eXBlb2YgZi5pdGVtPT0iZnVuY3Rpb24iO2JyZWFrIGF9fWg9ITF9d2EoaD95YShmKTpmLGQpfX19LFphPWZ1bmN0aW9uKGEsYil7Yj1TdHJpbmcoYik7YS5jb250ZW50VHlwZT09PSJhcHBsaWNhdGlvbi94aHRtbCt4bWwiJiYoYj1iLnRvTG93ZXJDYXNlKCkpO3JldHVybiBhLmNyZWF0ZUVsZW1lbnQoYil9LCRhPWZ1bmN0aW9uKGEpe2EmJmEucGFyZW50Tm9kZSYmCmEucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhKX0sYWI9ZnVuY3Rpb24oYSxiKXtpZighYXx8IWIpcmV0dXJuITE7aWYoYS5jb250YWlucyYmYi5ub2RlVHlwZT09MSlyZXR1cm4gYT09Ynx8YS5jb250YWlucyhiKTtpZih0eXBlb2YgYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiE9InVuZGVmaW5lZCIpcmV0dXJuIGE9PWJ8fCEhKGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24oYikmMTYpO2Zvcig7YiYmYSE9YjspYj1iLnBhcmVudE5vZGU7cmV0dXJuIGI9PWF9LGJiPWZ1bmN0aW9uKGEpe3AoYSwiTm9kZSBjYW5ub3QgYmUgbnVsbCBvciB1bmRlZmluZWQuIik7cmV0dXJuIGEubm9kZVR5cGU9PTk/YTphLm93bmVyRG9jdW1lbnR8fGEuZG9jdW1lbnR9LGNiPWZ1bmN0aW9uKGEsYil7Yj9hLnRhYkluZGV4PTA6KGEudGFiSW5kZXg9LTEsYS5yZW1vdmVBdHRyaWJ1dGUoInRhYkluZGV4IikpfSxkYj1mdW5jdGlvbihhKXtyZXR1cm4gYS5oYXNBdHRyaWJ1dGUoInRhYmluZGV4Iil9LGViPQpmdW5jdGlvbihhKXthPWEudGFiSW5kZXg7cmV0dXJuIHR5cGVvZiBhPT09Im51bWJlciImJmE+PTAmJmE8MzI3Njh9LGZiPWZ1bmN0aW9uKGEpe3RoaXMuZz1hfHxsLmRvY3VtZW50fHxkb2N1bWVudH07ZmIucHJvdG90eXBlLmk9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nO3JldHVybiB0eXBlb2YgYT09PSJzdHJpbmciP2IuZ2V0RWxlbWVudEJ5SWQoYSk6YX07ZmIucHJvdG90eXBlLmg9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXMuZyxlPWFyZ3VtZW50cyxmPWVbMV0saD1aYShkLFN0cmluZyhlWzBdKSk7ZiYmKHR5cGVvZiBmPT09InN0cmluZyI/aC5jbGFzc05hbWU9ZjpBcnJheS5pc0FycmF5KGYpP2guY2xhc3NOYW1lPWYuam9pbigiICIpOlhhKGgsZikpO2UubGVuZ3RoPjImJllhKGQsaCxlKTtyZXR1cm4gaH07dmFyIHc9ZnVuY3Rpb24oKXt0aGlzLmJhPXRoaXMuYmE7dGhpcy5rYT10aGlzLmthfTt3LnByb3RvdHlwZS5iYT0hMTt3LnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7dGhpcy5iYXx8KHRoaXMuYmE9ITAsdGhpcy5DKCkpfTt3LnByb3RvdHlwZVtTeW1ib2wuZGlzcG9zZV09ZnVuY3Rpb24oKXt0aGlzLmRpc3Bvc2UoKX07dy5wcm90b3R5cGUuQz1mdW5jdGlvbigpe2lmKHRoaXMua2EpZm9yKDt0aGlzLmthLmxlbmd0aDspdGhpcy5rYS5zaGlmdCgpKCl9O3ZhciB5PWZ1bmN0aW9uKGEsYil7dGhpcy50eXBlPWE7dGhpcy51PXRoaXMudGFyZ2V0PWI7dGhpcy5kZWZhdWx0UHJldmVudGVkPXRoaXMuQT0hMX07eS5wcm90b3R5cGUudj1mdW5jdGlvbigpe3RoaXMuQT0hMH07eS5wcm90b3R5cGUuaj1mdW5jdGlvbigpe3RoaXMuZGVmYXVsdFByZXZlbnRlZD0hMH07dmFyIGdiPWZ1bmN0aW9uKCl7aWYoIWwuYWRkRXZlbnRMaXN0ZW5lcnx8IU9iamVjdC5kZWZpbmVQcm9wZXJ0eSlyZXR1cm4hMTt2YXIgYT0hMSxiPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwicGFzc2l2ZSIse2dldDpmdW5jdGlvbigpe2E9ITB9fSk7dHJ5e3ZhciBjPWZ1bmN0aW9uKCl7fTtsLmFkZEV2ZW50TGlzdGVuZXIoInRlc3QiLGMsYik7bC5yZW1vdmVFdmVudExpc3RlbmVyKCJ0ZXN0IixjLGIpfWNhdGNoKGQpe31yZXR1cm4gYX0oKTt2YXIgej1mdW5jdGlvbihhLGIpe3kuY2FsbCh0aGlzLGE/YS50eXBlOiIiKTt0aGlzLnJlbGF0ZWRUYXJnZXQ9dGhpcy51PXRoaXMudGFyZ2V0PW51bGw7dGhpcy5idXR0b249dGhpcy5zY3JlZW5ZPXRoaXMuc2NyZWVuWD10aGlzLmNsaWVudFk9dGhpcy5jbGllbnRYPTA7dGhpcy5rZXk9IiI7dGhpcy5nPTA7dGhpcy5tZXRhS2V5PXRoaXMuc2hpZnRLZXk9dGhpcy5hbHRLZXk9dGhpcy5jdHJsS2V5PSExO3RoaXMuc3RhdGU9bnVsbDt0aGlzLkc9ITE7dGhpcy5wb2ludGVySWQ9MDt0aGlzLnBvaW50ZXJUeXBlPSIiO3RoaXMudGltZVN0YW1wPTA7dGhpcy5oPW51bGw7aWYoYSl7dmFyIGM9dGhpcy50eXBlPWEudHlwZSxkPWEuY2hhbmdlZFRvdWNoZXMmJmEuY2hhbmdlZFRvdWNoZXMubGVuZ3RoP2EuY2hhbmdlZFRvdWNoZXNbMF06bnVsbDt0aGlzLnRhcmdldD1hLnRhcmdldHx8YS5zcmNFbGVtZW50O3RoaXMudT1iO2I9YS5yZWxhdGVkVGFyZ2V0O2J8fChjPT0ibW91c2VvdmVyIj8KYj1hLmZyb21FbGVtZW50OmM9PSJtb3VzZW91dCImJihiPWEudG9FbGVtZW50KSk7dGhpcy5yZWxhdGVkVGFyZ2V0PWI7ZD8odGhpcy5jbGllbnRYPWQuY2xpZW50WCE9PXZvaWQgMD9kLmNsaWVudFg6ZC5wYWdlWCx0aGlzLmNsaWVudFk9ZC5jbGllbnRZIT09dm9pZCAwP2QuY2xpZW50WTpkLnBhZ2VZLHRoaXMuc2NyZWVuWD1kLnNjcmVlblh8fDAsdGhpcy5zY3JlZW5ZPWQuc2NyZWVuWXx8MCk6KHRoaXMuY2xpZW50WD1hLmNsaWVudFghPT12b2lkIDA/YS5jbGllbnRYOmEucGFnZVgsdGhpcy5jbGllbnRZPWEuY2xpZW50WSE9PXZvaWQgMD9hLmNsaWVudFk6YS5wYWdlWSx0aGlzLnNjcmVlblg9YS5zY3JlZW5YfHwwLHRoaXMuc2NyZWVuWT1hLnNjcmVlbll8fDApO3RoaXMuYnV0dG9uPWEuYnV0dG9uO3RoaXMuZz1hLmtleUNvZGV8fDA7dGhpcy5rZXk9YS5rZXl8fCIiO3RoaXMuY3RybEtleT1hLmN0cmxLZXk7dGhpcy5hbHRLZXk9YS5hbHRLZXk7dGhpcy5zaGlmdEtleT1hLnNoaWZ0S2V5Owp0aGlzLm1ldGFLZXk9YS5tZXRhS2V5O3RoaXMuRz12P2EubWV0YUtleTphLmN0cmxLZXk7dGhpcy5wb2ludGVySWQ9YS5wb2ludGVySWR8fDA7dGhpcy5wb2ludGVyVHlwZT1hLnBvaW50ZXJUeXBlO3RoaXMuc3RhdGU9YS5zdGF0ZTt0aGlzLnRpbWVTdGFtcD1hLnRpbWVTdGFtcDt0aGlzLmg9YTthLmRlZmF1bHRQcmV2ZW50ZWQmJnoubC5qLmNhbGwodGhpcyl9fTtuKHoseSk7ei5wcm90b3R5cGUudj1mdW5jdGlvbigpe3oubC52LmNhbGwodGhpcyk7dGhpcy5oLnN0b3BQcm9wYWdhdGlvbj90aGlzLmguc3RvcFByb3BhZ2F0aW9uKCk6dGhpcy5oLmNhbmNlbEJ1YmJsZT0hMH07ei5wcm90b3R5cGUuaj1mdW5jdGlvbigpe3oubC5qLmNhbGwodGhpcyk7dmFyIGE9dGhpcy5oO2EucHJldmVudERlZmF1bHQ/YS5wcmV2ZW50RGVmYXVsdCgpOmEucmV0dXJuVmFsdWU9ITF9O3ZhciBoYj0iY2xvc3VyZV9saXN0ZW5hYmxlXyIrKE1hdGgucmFuZG9tKCkqMUU2fDApLGliPWZ1bmN0aW9uKGEpe3JldHVybiEoIWF8fCFhW2hiXSl9O3ZhciBqYj0wO3ZhciBrYj1mdW5jdGlvbihhLGIsYyxkLGUpe3RoaXMubGlzdGVuZXI9YTt0aGlzLnByb3h5PW51bGw7dGhpcy5zcmM9Yjt0aGlzLnR5cGU9Yzt0aGlzLmNhcHR1cmU9ISFkO3RoaXMucGE9ZTt0aGlzLmtleT0rK2piO3RoaXMuamE9dGhpcy5vYT0hMX0sbGI9ZnVuY3Rpb24oYSl7YS5qYT0hMDthLmxpc3RlbmVyPW51bGw7YS5wcm94eT1udWxsO2Euc3JjPW51bGw7YS5wYT1udWxsfTt2YXIgbWI9ZnVuY3Rpb24oYSl7dGhpcy5zcmM9YTt0aGlzLmc9e307dGhpcy5oPTB9O21iLnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZj1hLnRvU3RyaW5nKCk7YT10aGlzLmdbZl07YXx8KGE9dGhpcy5nW2ZdPVtdLHRoaXMuaCsrKTt2YXIgaD1uYihhLGIsZCxlKTtoPi0xPyhiPWFbaF0sY3x8KGIub2E9ITEpKTooYj1uZXcga2IoYix0aGlzLnNyYyxmLCEhZCxlKSxiLm9hPWMsYS5wdXNoKGIpKTtyZXR1cm4gYn07CnZhciBvYj1mdW5jdGlvbihhLGIpe3ZhciBjPWIudHlwZTtjIGluIGEuZyYmeGEoYS5nW2NdLGIpJiYobGIoYiksYS5nW2NdLmxlbmd0aD09MCYmKGRlbGV0ZSBhLmdbY10sYS5oLS0pKX0scGI9ZnVuY3Rpb24oYSxiLGMsZCxlKXthPWEuZ1tiLnRvU3RyaW5nKCldO2I9LTE7YSYmKGI9bmIoYSxjLGQsZSkpO3JldHVybiBiPi0xP2FbYl06bnVsbH0sbmI9ZnVuY3Rpb24oYSxiLGMsZCl7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDsrK2Upe3ZhciBmPWFbZV07aWYoIWYuamEmJmYubGlzdGVuZXI9PWImJmYuY2FwdHVyZT09ISFjJiZmLnBhPT1kKXJldHVybiBlfXJldHVybi0xfTt2YXIgcWI9ImNsb3N1cmVfbG1fIisoTWF0aC5yYW5kb20oKSoxRTZ8MCkscmI9e30sc2I9MCx1Yj1mdW5jdGlvbihhLGIsYyxkLGUpe2lmKGQmJmQub25jZSlyZXR1cm4gdGIoYSxiLGMsZCxlKTtpZihBcnJheS5pc0FycmF5KGIpKXtmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKyl1YihhLGJbZl0sYyxkLGUpO3JldHVybiBudWxsfWM9dmIoYyk7cmV0dXJuIGliKGEpP3diKGEsYixjLG0oZCk/ISFkLmNhcHR1cmU6ISFkLGUpOnhiKGEsYixjLCExLGQsZSl9LHhiPWZ1bmN0aW9uKGEsYixjLGQsZSxmKXtpZighYil0aHJvdyBFcnJvcigiSW52YWxpZCBldmVudCB0eXBlIik7dmFyIGg9bShlKT8hIWUuY2FwdHVyZTohIWUsaz15YihhKTtrfHwoYVtxYl09az1uZXcgbWIoYSkpO2M9ay5hZGQoYixjLGQsaCxmKTtpZihjLnByb3h5KXJldHVybiBjO2Q9emIoKTtjLnByb3h5PWQ7ZC5zcmM9YTtkLmxpc3RlbmVyPWM7aWYoYS5hZGRFdmVudExpc3RlbmVyKWdifHwoZT1oKSxlPT09dm9pZCAwJiYKKGU9ITEpLGEuYWRkRXZlbnRMaXN0ZW5lcihiLnRvU3RyaW5nKCksZCxlKTtlbHNlIGlmKGEuYXR0YWNoRXZlbnQpYS5hdHRhY2hFdmVudChBYihiLnRvU3RyaW5nKCkpLGQpO2Vsc2UgaWYoYS5hZGRMaXN0ZW5lciYmYS5yZW1vdmVMaXN0ZW5lcilwKGI9PT0iY2hhbmdlIiwiTWVkaWFRdWVyeUxpc3Qgb25seSBoYXMgYSBjaGFuZ2UgZXZlbnQiKSxhLmFkZExpc3RlbmVyKGQpO2Vsc2UgdGhyb3cgRXJyb3IoImFkZEV2ZW50TGlzdGVuZXIgYW5kIGF0dGFjaEV2ZW50IGFyZSB1bmF2YWlsYWJsZS4iKTtzYisrO3JldHVybiBjfSx6Yj1mdW5jdGlvbigpe3ZhciBhPUJiLGI9ZnVuY3Rpb24oYyl7cmV0dXJuIGEuY2FsbChiLnNyYyxiLmxpc3RlbmVyLGMpfTtyZXR1cm4gYn0sdGI9ZnVuY3Rpb24oYSxiLGMsZCxlKXtpZihBcnJheS5pc0FycmF5KGIpKXtmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKyl0YihhLGJbZl0sYyxkLGUpO3JldHVybiBudWxsfWM9dmIoYyk7cmV0dXJuIGliKGEpPwphLkEuYWRkKFN0cmluZyhiKSxjLCEwLG0oZCk/ISFkLmNhcHR1cmU6ISFkLGUpOnhiKGEsYixjLCEwLGQsZSl9LENiPWZ1bmN0aW9uKGEsYixjLGQsZSl7aWYoQXJyYXkuaXNBcnJheShiKSlmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKylDYihhLGJbZl0sYyxkLGUpO2Vsc2UgZD1tKGQpPyEhZC5jYXB0dXJlOiEhZCxjPXZiKGMpLGliKGEpPyhhPWEuQSxiPVN0cmluZyhiKS50b1N0cmluZygpLGIgaW4gYS5nJiYoZj1hLmdbYl0sYz1uYihmLGMsZCxlKSxjPi0xJiYobGIoZltjXSkscChmLmxlbmd0aCE9bnVsbCksQXJyYXkucHJvdG90eXBlLnNwbGljZS5jYWxsKGYsYywxKSxmLmxlbmd0aD09MCYmKGRlbGV0ZSBhLmdbYl0sYS5oLS0pKSkpOmEmJihhPXliKGEpKSYmKGM9cGIoYSxiLGMsZCxlKSkmJkEoYyl9LEE9ZnVuY3Rpb24oYSl7aWYodHlwZW9mIGEhPT0ibnVtYmVyIiYmYSYmIWEuamEpe3ZhciBiPWEuc3JjO2lmKGliKGIpKW9iKGIuQSxhKTtlbHNle3ZhciBjPWEudHlwZSwKZD1hLnByb3h5O2IucmVtb3ZlRXZlbnRMaXN0ZW5lcj9iLnJlbW92ZUV2ZW50TGlzdGVuZXIoYyxkLGEuY2FwdHVyZSk6Yi5kZXRhY2hFdmVudD9iLmRldGFjaEV2ZW50KEFiKGMpLGQpOmIuYWRkTGlzdGVuZXImJmIucmVtb3ZlTGlzdGVuZXImJmIucmVtb3ZlTGlzdGVuZXIoZCk7c2ItLTsoYz15YihiKSk/KG9iKGMsYSksYy5oPT0wJiYoYy5zcmM9bnVsbCxiW3FiXT1udWxsKSk6bGIoYSl9fX0sQWI9ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW4gcmI/cmJbYV06cmJbYV09Im9uIithfSxCYj1mdW5jdGlvbihhLGIpe2lmKGEuamEpYT0hMDtlbHNle2I9bmV3IHooYix0aGlzKTt2YXIgYz1hLmxpc3RlbmVyLGQ9YS5wYXx8YS5zcmM7YS5vYSYmQShhKTthPWMuY2FsbChkLGIpfXJldHVybiBhfSx5Yj1mdW5jdGlvbihhKXthPWFbcWJdO3JldHVybiBhIGluc3RhbmNlb2YgbWI/YTpudWxsfSxEYj0iX19jbG9zdXJlX2V2ZW50c19mbl8iKyhNYXRoLnJhbmRvbSgpKjFFOT4+PjApLHZiPWZ1bmN0aW9uKGEpe3AoYSwKIkxpc3RlbmVyIGNhbiBub3QgYmUgbnVsbC4iKTtpZih0eXBlb2YgYT09PSJmdW5jdGlvbiIpcmV0dXJuIGE7cChhLmhhbmRsZUV2ZW50LCJBbiBvYmplY3QgbGlzdGVuZXIgbXVzdCBoYXZlIGhhbmRsZUV2ZW50IG1ldGhvZC4iKTthW0RiXXx8KGFbRGJdPWZ1bmN0aW9uKGIpe3JldHVybiBhLmhhbmRsZUV2ZW50KGIpfSk7cmV0dXJuIGFbRGJdfTt2YXIgRWI9ZnVuY3Rpb24oYSl7dy5jYWxsKHRoaXMpO3RoaXMuaD1hO3RoaXMuZz17fX07bihFYix3KTsKdmFyIEZiPVtdLEI9ZnVuY3Rpb24oYSxiLGMsZCl7QXJyYXkuaXNBcnJheShjKXx8KGMmJihGYlswXT1jLnRvU3RyaW5nKCkpLGM9RmIpO2Zvcih2YXIgZT0wO2U8Yy5sZW5ndGg7ZSsrKXt2YXIgZj11YihiLGNbZV0sZHx8YS5oYW5kbGVFdmVudCwhMSxhLmh8fGEpO2lmKCFmKWJyZWFrO2EuZ1tmLmtleV09Zn1yZXR1cm4gYX0sQz1mdW5jdGlvbihhLGIsYyxkLGUsZil7aWYoQXJyYXkuaXNBcnJheShjKSlmb3IodmFyIGg9MDtoPGMubGVuZ3RoO2grKylDKGEsYixjW2hdLGQsZSxmKTtlbHNlIGQ9ZHx8YS5oYW5kbGVFdmVudCxlPW0oZSk/ISFlLmNhcHR1cmU6ISFlLGY9Znx8YS5ofHxhLGQ9dmIoZCksZT0hIWUsYz1pYihiKT9wYihiLkEsU3RyaW5nKGMpLGQsZSxmKTpiPyhiPXliKGIpKT9wYihiLGMsZCxlLGYpOm51bGw6bnVsbCxjJiYoQShjKSxkZWxldGUgYS5nW2Mua2V5XSk7cmV0dXJuIGF9LEdiPWZ1bmN0aW9uKGEpe0JhKGEuZyxmdW5jdGlvbihiLGMpe3RoaXMuZy5oYXNPd25Qcm9wZXJ0eShjKSYmCkEoYil9LGEpO2EuZz17fX07RWIucHJvdG90eXBlLkM9ZnVuY3Rpb24oKXtFYi5sLkMuY2FsbCh0aGlzKTtHYih0aGlzKX07RWIucHJvdG90eXBlLmhhbmRsZUV2ZW50PWZ1bmN0aW9uKCl7dGhyb3cgRXJyb3IoIkV2ZW50SGFuZGxlci5oYW5kbGVFdmVudCBub3QgaW1wbGVtZW50ZWQiKTt9O3ZhciBEPWZ1bmN0aW9uKCl7dy5jYWxsKHRoaXMpO3RoaXMuQT1uZXcgbWIodGhpcyk7dGhpcy5ZYT10aGlzO3RoaXMubGE9bnVsbH07bihELHcpO0QucHJvdG90eXBlW2hiXT0hMDtELnByb3RvdHlwZS5BYT1mdW5jdGlvbihhKXt0aGlzLmxhPWF9O0QucHJvdG90eXBlLnJlbW92ZUV2ZW50TGlzdGVuZXI9ZnVuY3Rpb24oYSxiLGMsZCl7Q2IodGhpcyxhLGIsYyxkKX07CnZhciBFPWZ1bmN0aW9uKGEsYil7SGIoYSk7dmFyIGM9YS5sYTtpZihjKXt2YXIgZD1bXTtmb3IodmFyIGU9MTtjO2M9Yy5sYSlkLnB1c2goYykscCgrK2U8MUUzLCJpbmZpbml0ZSBsb29wIil9YT1hLllhO2M9Yi50eXBlfHxiO3R5cGVvZiBiPT09InN0cmluZyI/Yj1uZXcgeShiLGEpOmIgaW5zdGFuY2VvZiB5P2IudGFyZ2V0PWIudGFyZ2V0fHxhOihlPWIsYj1uZXcgeShjLGEpLEdhKGIsZSkpO2U9ITA7dmFyIGY7aWYoZClmb3IoZj1kLmxlbmd0aC0xOyFiLkEmJmY+PTA7Zi0tKXt2YXIgaD1iLnU9ZFtmXTtlPUliKGgsYywhMCxiKSYmZX1iLkF8fChoPWIudT1hLGU9SWIoaCxjLCEwLGIpJiZlLGIuQXx8KGU9SWIoaCxjLCExLGIpJiZlKSk7aWYoZClmb3IoZj0wOyFiLkEmJmY8ZC5sZW5ndGg7ZisrKWg9Yi51PWRbZl0sZT1JYihoLGMsITEsYikmJmU7cmV0dXJuIGV9OwpELnByb3RvdHlwZS5DPWZ1bmN0aW9uKCl7RC5sLkMuY2FsbCh0aGlzKTtpZih0aGlzLkEpe3ZhciBhPXRoaXMuQSxiPTAsYztmb3IoYyBpbiBhLmcpe2Zvcih2YXIgZD1hLmdbY10sZT0wO2U8ZC5sZW5ndGg7ZSsrKSsrYixsYihkW2VdKTtkZWxldGUgYS5nW2NdO2EuaC0tfX10aGlzLmxhPW51bGx9O3ZhciB3Yj1mdW5jdGlvbihhLGIsYyxkLGUpe0hiKGEpO3JldHVybiBhLkEuYWRkKFN0cmluZyhiKSxjLCExLGQsZSl9LEliPWZ1bmN0aW9uKGEsYixjLGQpe2I9YS5BLmdbU3RyaW5nKGIpXTtpZighYilyZXR1cm4hMDtiPWIuY29uY2F0KCk7Zm9yKHZhciBlPSEwLGY9MDtmPGIubGVuZ3RoOysrZil7dmFyIGg9YltmXTtpZihoJiYhaC5qYSYmaC5jYXB0dXJlPT1jKXt2YXIgaz1oLmxpc3RlbmVyLHE9aC5wYXx8aC5zcmM7aC5vYSYmb2IoYS5BLGgpO2U9ay5jYWxsKHEsZCkhPT0hMSYmZX19cmV0dXJuIGUmJiFkLmRlZmF1bHRQcmV2ZW50ZWR9LEhiPWZ1bmN0aW9uKGEpe3AoYS5BLCJFdmVudCB0YXJnZXQgaXMgbm90IGluaXRpYWxpemVkLiBEaWQgeW91IGNhbGwgdGhlIHN1cGVyY2xhc3MgKGdvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0KSBjb25zdHJ1Y3Rvcj8iKX07dmFyIEpiPXQ/Ik1velVzZXJTZWxlY3QiOnV8fFZhPyJXZWJraXRVc2VyU2VsZWN0IjpudWxsLEtiPWZ1bmN0aW9uKGEsYil7Yj1iP251bGw6YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpO2lmKEpiJiYoYS5zdHlsZSYmKGEuc3R5bGVbSmJdPSJub25lIiksYikpZm9yKHZhciBjPTA7YT1iW2NdO2MrKylhLnN0eWxlJiYoYS5zdHlsZVtKYl09Im5vbmUiKX07dmFyIExiPWZ1bmN0aW9uKCl7fTtpYShMYik7TGIucHJvdG90eXBlLmc9MDt2YXIgRj1mdW5jdGlvbihhKXtELmNhbGwodGhpcyk7dGhpcy5HPWF8fHBhfHwocGE9bmV3IGZiKTt0aGlzLnphPU1iO3RoaXMuWT1udWxsO3RoaXMucz0hMTt0aGlzLmc9bnVsbDt0aGlzLk09dm9pZCAwO3RoaXMudT10aGlzLmo9dGhpcy5oPW51bGw7dGhpcy5TYT0hMX07bihGLEQpO0YucHJvdG90eXBlLlphPUxiLlYoKTsKdmFyIE1iPW51bGwsTmI9ZnVuY3Rpb24oYSxiKXtzd2l0Y2goYSl7Y2FzZSAxOnJldHVybiBiPyJkaXNhYmxlIjoiZW5hYmxlIjtjYXNlIDI6cmV0dXJuIGI/ImhpZ2hsaWdodCI6InVuaGlnaGxpZ2h0IjtjYXNlIDQ6cmV0dXJuIGI/ImFjdGl2YXRlIjoiZGVhY3RpdmF0ZSI7Y2FzZSA4OnJldHVybiBiPyJzZWxlY3QiOiJ1bnNlbGVjdCI7Y2FzZSAxNjpyZXR1cm4gYj8iY2hlY2siOiJ1bmNoZWNrIjtjYXNlIDMyOnJldHVybiBiPyJmb2N1cyI6ImJsdXIiO2Nhc2UgNjQ6cmV0dXJuIGI/Im9wZW4iOiJjbG9zZSJ9dGhyb3cgRXJyb3IoIkludmFsaWQgY29tcG9uZW50IHN0YXRlIik7fSxPYj1mdW5jdGlvbihhKXtyZXR1cm4gYS5ZfHwoYS5ZPSI6IisoYS5aYS5nKyspLnRvU3RyaW5nKDM2KSl9LFBiPWZ1bmN0aW9uKGEsYil7aWYoYS5oJiZhLmgudSl7dmFyIGM9YS5oLnUsZD1hLlk7ZCBpbiBjJiZkZWxldGUgY1tkXTtEYShhLmgudSxiLGEpfWEuWT1ifTtGLnByb3RvdHlwZS5pPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ307CnZhciBRYj1mdW5jdGlvbihhKXthLk18fChhLk09bmV3IEViKGEpKTtyZXR1cm4gcChhLk0pfTtGLnByb3RvdHlwZS5BYT1mdW5jdGlvbihhKXtpZih0aGlzLmgmJnRoaXMuaCE9YSl0aHJvdyBFcnJvcigiTWV0aG9kIG5vdCBzdXBwb3J0ZWQiKTtGLmwuQWEuY2FsbCh0aGlzLGEpfTtGLnByb3RvdHlwZS5tYT1mdW5jdGlvbigpe3RoaXMuZz1aYSh0aGlzLkcuZywiRElWIil9O0YucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbihhKXtSYih0aGlzLGEpfTsKdmFyIFJiPWZ1bmN0aW9uKGEsYixjKXtpZihhLnMpdGhyb3cgRXJyb3IoIkNvbXBvbmVudCBhbHJlYWR5IHJlbmRlcmVkIik7YS5nfHxhLm1hKCk7Yj9iLmluc2VydEJlZm9yZShhLmcsY3x8bnVsbCk6YS5HLmcuYm9keS5hcHBlbmRDaGlsZChhLmcpO2EuaCYmIWEuaC5zfHxhLkkoKX0sU2I9ZnVuY3Rpb24oYSxiKXtpZihhLnMpdGhyb3cgRXJyb3IoIkNvbXBvbmVudCBhbHJlYWR5IHJlbmRlcmVkIik7aWYoYiYmYS53YShiKSl7YS5TYT0hMDt2YXIgYz1iYihiKTthLkcmJmEuRy5nPT1jfHwoYS5HPWI/bmV3IGZiKGJiKGIpKTpwYXx8KHBhPW5ldyBmYikpO2EuRWEoYik7YS5JKCl9ZWxzZSB0aHJvdyBFcnJvcigiSW52YWxpZCBlbGVtZW50IHRvIGRlY29yYXRlIik7fTtnPUYucHJvdG90eXBlO2cud2E9ZnVuY3Rpb24oKXtyZXR1cm4hMH07Zy5FYT1mdW5jdGlvbihhKXt0aGlzLmc9YX07CmcuST1mdW5jdGlvbigpe3RoaXMucz0hMDtUYih0aGlzLGZ1bmN0aW9uKGEpeyFhLnMmJmEuaSgpJiZhLkkoKX0pfTtnLlU9ZnVuY3Rpb24oKXtUYih0aGlzLGZ1bmN0aW9uKGEpe2EucyYmYS5VKCl9KTt0aGlzLk0mJkdiKHRoaXMuTSk7dGhpcy5zPSExfTtnLkM9ZnVuY3Rpb24oKXt0aGlzLnMmJnRoaXMuVSgpO3RoaXMuTSYmKHRoaXMuTS5kaXNwb3NlKCksZGVsZXRlIHRoaXMuTSk7VGIodGhpcyxmdW5jdGlvbihhKXthLmRpc3Bvc2UoKX0pOyF0aGlzLlNhJiZ0aGlzLmcmJiRhKHRoaXMuZyk7dGhpcy5oPXRoaXMuZz10aGlzLnU9dGhpcy5qPW51bGw7Ri5sLkMuY2FsbCh0aGlzKX07Zy5CYT1mdW5jdGlvbihhLGIpe3RoaXMuQ2EoYSxIKHRoaXMpLGIpfTsKZy5DYT1mdW5jdGlvbihhLGIsYyl7cCghIWEsIlByb3ZpZGVkIGVsZW1lbnQgbXVzdCBub3QgYmUgbnVsbC4iKTtpZihhLnMmJihjfHwhdGhpcy5zKSl0aHJvdyBFcnJvcigiQ29tcG9uZW50IGFscmVhZHkgcmVuZGVyZWQiKTtpZihiPDB8fGI+SCh0aGlzKSl0aHJvdyBFcnJvcigiQ2hpbGQgY29tcG9uZW50IGluZGV4IG91dCBvZiBib3VuZHMiKTt0aGlzLnUmJnRoaXMuanx8KHRoaXMudT17fSx0aGlzLmo9W10pO2lmKGEuaD09dGhpcyl7dmFyIGQ9dGhpcy51LGU9T2IoYSk7ZFtlXT1hO3hhKHRoaXMuaixhKX1lbHNlIERhKHRoaXMudSxPYihhKSxhKTtpZihhPT10aGlzKXRocm93IEVycm9yKCJVbmFibGUgdG8gc2V0IHBhcmVudCBjb21wb25lbnQiKTtpZihkPXRoaXMmJmEuaCYmYS5ZKWU9YS5oLGQ9YS5ZLGUudSYmZD8oZT1lLnUsZD0oZSE9PW51bGwmJmQgaW4gZT9lW2RdOnZvaWQgMCl8fG51bGwpOmQ9bnVsbDtpZihkJiZhLmghPXRoaXMpdGhyb3cgRXJyb3IoIlVuYWJsZSB0byBzZXQgcGFyZW50IGNvbXBvbmVudCIpOwphLmg9dGhpcztGLmwuQWEuY2FsbChhLHRoaXMpO3phKHRoaXMuaixiLDAsYSk7YS5zJiZ0aGlzLnMmJmEuaD09dGhpcz8oYz10aGlzLm5hKCksKGMuY2hpbGROb2Rlc1tiXXx8bnVsbCkhPWEuaSgpJiYoYS5pKCkucGFyZW50RWxlbWVudD09YyYmYy5yZW1vdmVDaGlsZChhLmkoKSksYj1jLmNoaWxkTm9kZXNbYl18fG51bGwsYy5pbnNlcnRCZWZvcmUoYS5pKCksYikpKTpjPyh0aGlzLmd8fHRoaXMubWEoKSxiPUkodGhpcyxiKzEpLFJiKGEsdGhpcy5uYSgpLGI/Yi5nOm51bGwpKTp0aGlzLnMmJiFhLnMmJmEuZyYmYS5nLnBhcmVudE5vZGUmJmEuZy5wYXJlbnROb2RlLm5vZGVUeXBlPT0xJiZhLkkoKX07Zy5uYT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmd9Owp2YXIgVWI9ZnVuY3Rpb24oYSl7aWYoYS56YT09bnVsbCl7dmFyIGI9YS5zP2EuZzphLkcuZy5ib2R5O2E6e3ZhciBjPWJiKGIpO2lmKGMuZGVmYXVsdFZpZXcmJmMuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSYmKGM9Yy5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKGIsbnVsbCkpKXtjPWMuZGlyZWN0aW9ufHxjLmdldFByb3BlcnR5VmFsdWUoImRpcmVjdGlvbiIpfHwiIjticmVhayBhfWM9IiJ9YS56YT0icnRsIj09KGN8fChiLmN1cnJlbnRTdHlsZT9iLmN1cnJlbnRTdHlsZS5kaXJlY3Rpb246bnVsbCl8fGIuc3R5bGUmJmIuc3R5bGUuZGlyZWN0aW9uKX1yZXR1cm4gYS56YX0sSD1mdW5jdGlvbihhKXtyZXR1cm4gYS5qP2Euai5sZW5ndGg6MH0sST1mdW5jdGlvbihhLGIpe3JldHVybiBhLmo/YS5qW2JdfHxudWxsOm51bGx9LFRiPWZ1bmN0aW9uKGEsYixjKXthLmomJmEuai5mb3JFYWNoKGIsYyl9LFZiPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuaiYmYj9hLmouaW5kZXhPZihiKToKLTF9O3ZhciBXYj17bWI6ImFjdGl2ZWRlc2NlbmRhbnQiLHJiOiJhdG9taWMiLHNiOiJhdXRvY29tcGxldGUiLHViOiJidXN5Iix4YjoiY2hlY2tlZCIseWI6ImNvbGluZGV4IixEYjoiY29udHJvbHMiLEViOiJjdXJyZW50IixHYjoiZGVzY3JpYmVkYnkiLEpiOiJkaXNhYmxlZCIsTGI6ImRyb3BlZmZlY3QiLE1iOiJleHBhbmRlZCIsTmI6ImZsb3d0byIsUGI6ImdyYWJiZWQiLFRiOiJoYXNwb3B1cCIsVmI6ImhpZGRlbiIsWGI6ImludmFsaWQiLFliOiJsYWJlbCIsWmI6ImxhYmVsbGVkYnkiLGFjOiJsZXZlbCIsZmM6ImxpdmUiLHZjOiJtdWx0aWxpbmUiLHdjOiJtdWx0aXNlbGVjdGFibGUiLEFjOiJvcmllbnRhdGlvbiIsQmM6Im93bnMiLENjOiJwb3NpbnNldCIsRWM6InByZXNzZWQiLEljOiJyZWFkb25seSIsS2M6InJlbGV2YW50IixMYzoicmVxdWlyZWQiLFBjOiJyb3dpbmRleCIsU2M6InNlbGVjdGVkIixVYzoic2V0c2l6ZSIsV2M6InNvcnQiLG1kOiJ2YWx1ZW1heCIsbmQ6InZhbHVlbWluIiwKb2Q6InZhbHVlbm93IixwZDoidmFsdWV0ZXh0In07dmFyIFhiO3ZhciBZYj17bmI6ImFsZXJ0IixvYjoiYWxlcnRkaWFsb2ciLHBiOiJhcHBsaWNhdGlvbiIscWI6ImFydGljbGUiLHRiOiJiYW5uZXIiLHZiOiJidXR0b24iLHdiOiJjaGVja2JveCIsemI6ImNvbHVtbmhlYWRlciIsQWI6ImNvbWJvYm94IixCYjoiY29tcGxlbWVudGFyeSIsQ2I6ImNvbnRlbnRpbmZvIixGYjoiZGVmaW5pdGlvbiIsSGI6ImRpYWxvZyIsSWI6ImRpcmVjdG9yeSIsS2I6ImRvY3VtZW50IixPYjoiZm9ybSIsUWI6ImdyaWQiLFJiOiJncmlkY2VsbCIsU2I6Imdyb3VwIixVYjoiaGVhZGluZyIsV2I6ImltZyIsYmM6ImxpbmsiLGNjOiJsaXN0IixkYzoibGlzdGJveCIsZWM6Imxpc3RpdGVtIixoYzoibG9nIixpYzoibWFpbiIsamM6Im1hcnF1ZWUiLGtjOiJtYXRoIixsYzoibWVudSIsbWM6Im1lbnViYXIiLG5jOiJtZW51aXRlbSIsb2M6Im1lbnVpdGVtY2hlY2tib3giLHBjOiJtZW51aXRlbXJhZGlvIix4YzoibmF2aWdhdGlvbiIseWM6Im5vdGUiLHpjOiJvcHRpb24iLApEYzoicHJlc2VudGF0aW9uIixGYzoicHJvZ3Jlc3NiYXIiLEdjOiJyYWRpbyIsSGM6InJhZGlvZ3JvdXAiLEpjOiJyZWdpb24iLE1jOiJyb3ciLE5jOiJyb3dncm91cCIsT2M6InJvd2hlYWRlciIsUWM6InNjcm9sbGJhciIsUmM6InNlYXJjaCIsVGM6InNlcGFyYXRvciIsVmM6InNsaWRlciIsWGM6InNwaW5idXR0b24iLFljOiJzdGF0dXMiLFpjOiJzd2l0Y2giLGFkOiJ0YWIiLGJkOiJ0YWJsaXN0IixjZDoidGFicGFuZWwiLGRkOiJ0ZXh0Ym94IixlZDoidGV4dGluZm8iLGZkOiJ0aW1lciIsZ2Q6InRvb2xiYXIiLGhkOiJ0b29sdGlwIixqZDoidHJlZSIsa2Q6InRyZWVncmlkIixsZDoidHJlZWl0ZW0ifTt2YXIgWmI9ZnVuY3Rpb24oYSxiKXtiPyhwKENhKFliLGIpLCJObyBzdWNoIEFSSUEgcm9sZSAiK2IpLGEuc2V0QXR0cmlidXRlKCJyb2xlIixiKSk6YS5yZW1vdmVBdHRyaWJ1dGUoInJvbGUiKX0sYWM9ZnVuY3Rpb24oYSxiLGMpe0FycmF5LmlzQXJyYXkoYykmJihjPWMuam9pbigiICIpKTt2YXIgZD0kYihiKTtjPT09IiJ8fGM9PXZvaWQgMD8oWGJ8fChjPXt9LFhiPShjLmF0b21pYz0hMSxjLmF1dG9jb21wbGV0ZT0ibm9uZSIsYy5kcm9wZWZmZWN0PSJub25lIixjLmhhc3BvcHVwPSExLGMubGl2ZT0ib2ZmIixjLm11bHRpbGluZT0hMSxjLm11bHRpc2VsZWN0YWJsZT0hMSxjLm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIsYy5yZWFkb25seT0hMSxjLnJlbGV2YW50PSJhZGRpdGlvbnMgdGV4dCIsYy5yZXF1aXJlZD0hMSxjLnNvcnQ9Im5vbmUiLGMuYnVzeT0hMSxjLmRpc2FibGVkPSExLGMuaGlkZGVuPSExLGMuaW52YWxpZD0iZmFsc2UiLGMpKSxjPVhiLGIgaW4gYz9hLnNldEF0dHJpYnV0ZShkLApjW2JdKTphLnJlbW92ZUF0dHJpYnV0ZShkKSk6YS5zZXRBdHRyaWJ1dGUoZCxjKX0sJGI9ZnVuY3Rpb24oYSl7cChhLCJBUklBIGF0dHJpYnV0ZSBjYW5ub3QgYmUgZW1wdHkuIik7cChDYShXYixhKSwiTm8gc3VjaCBBUklBIGF0dHJpYnV0ZSAiK2EpO3JldHVybiJhcmlhLSIrYX07dmFyIGRjPWZ1bmN0aW9uKGEsYixjLGQsZSxmKXtpZih2JiZlKXJldHVybiBiYyhhKTtpZihlJiYhZClyZXR1cm4hMTtpZighdCl7dHlwZW9mIGI9PT0ibnVtYmVyIiYmKGI9Y2MoYikpO3ZhciBoPWI9PTE3fHxiPT0xOHx8diYmYj09OTE7aWYoKCFjfHx2KSYmaHx8diYmYj09MTYmJihkfHxmKSlyZXR1cm4hMX1pZih1JiZkJiZjKXN3aXRjaChhKXtjYXNlIDIyMDpjYXNlIDIxOTpjYXNlIDIyMTpjYXNlIDE5MjpjYXNlIDE4NjpjYXNlIDE4OTpjYXNlIDE4NzpjYXNlIDE4ODpjYXNlIDE5MDpjYXNlIDE5MTpjYXNlIDE5MjpjYXNlIDIyMjpyZXR1cm4hMX1zd2l0Y2goYSl7Y2FzZSAxMzpyZXR1cm4gdD9mfHxlPyExOiEoYyYmZCk6ITA7Y2FzZSAyNzpyZXR1cm4hdSYmIXR9cmV0dXJuIHQmJihkfHxlfHxmKT8hMTpiYyhhKX0sYmM9ZnVuY3Rpb24oYSl7aWYoYT49NDgmJmE8PTU3fHxhPj05NiYmYTw9MTA2fHxhPj02NSYmYTw9OTB8fHUmJmE9PTApcmV0dXJuITA7c3dpdGNoKGEpe2Nhc2UgMzI6Y2FzZSA0MzpjYXNlIDYzOmNhc2UgNjQ6Y2FzZSAxMDc6Y2FzZSAxMDk6Y2FzZSAxMTA6Y2FzZSAxMTE6Y2FzZSAxODY6Y2FzZSA1OTpjYXNlIDE4OTpjYXNlIDE4NzpjYXNlIDYxOmNhc2UgMTg4OmNhc2UgMTkwOmNhc2UgMTkxOmNhc2UgMTkyOmNhc2UgMjIyOmNhc2UgMjE5OmNhc2UgMjIwOmNhc2UgMjIxOmNhc2UgMTYzOmNhc2UgNTg6cmV0dXJuITA7CmNhc2UgMTczOmNhc2UgMTcxOnJldHVybiB0O2RlZmF1bHQ6cmV0dXJuITF9fSxjYz1mdW5jdGlvbihhKXtpZih0KWE9ZWMoYSk7ZWxzZSBpZih2JiZ1KXN3aXRjaChhKXtjYXNlIDkzOmE9OTF9cmV0dXJuIGF9LGVjPWZ1bmN0aW9uKGEpe3N3aXRjaChhKXtjYXNlIDYxOnJldHVybiAxODc7Y2FzZSA1OTpyZXR1cm4gMTg2O2Nhc2UgMTczOnJldHVybiAxODk7Y2FzZSAyMjQ6cmV0dXJuIDkxO2Nhc2UgMDpyZXR1cm4gMjI0O2RlZmF1bHQ6cmV0dXJuIGF9fTt2YXIgZmM9ZnVuY3Rpb24oYSxiLGMsZCl7ei5jYWxsKHRoaXMsZCk7dGhpcy50eXBlPSJrZXkiO3RoaXMuZz1hO3RoaXMucmVwZWF0PWN9O24oZmMseik7dmFyIEo9ZnVuY3Rpb24oYSxiKXtELmNhbGwodGhpcyk7YSYmZ2ModGhpcyxhLGIpfTtuKEosRCk7Zz1KLnByb3RvdHlwZTtnLlI9bnVsbDtnLnFhPW51bGw7Zy5KYT1udWxsO2cucmE9bnVsbDtnLkY9LTE7Zy5LPS0xO2cuRGE9ITE7CnZhciBoYz17MzoxMywxMjoxNDQsNjMyMzI6MzgsNjMyMzM6NDAsNjMyMzQ6MzcsNjMyMzU6MzksNjMyMzY6MTEyLDYzMjM3OjExMyw2MzIzODoxMTQsNjMyMzk6MTE1LDYzMjQwOjExNiw2MzI0MToxMTcsNjMyNDI6MTE4LDYzMjQzOjExOSw2MzI0NDoxMjAsNjMyNDU6MTIxLDYzMjQ2OjEyMiw2MzI0NzoxMjMsNjMyNDg6NDQsNjMyNzI6NDYsNjMyNzM6MzYsNjMyNzU6MzUsNjMyNzY6MzMsNjMyNzc6MzQsNjMyODk6MTQ0LDYzMzAyOjQ1fSxpYz17VXA6MzgsRG93bjo0MCxMZWZ0OjM3LFJpZ2h0OjM5LEVudGVyOjEzLEYxOjExMixGMjoxMTMsRjM6MTE0LEY0OjExNSxGNToxMTYsRjY6MTE3LEY3OjExOCxGODoxMTksRjk6MTIwLEYxMDoxMjEsRjExOjEyMixGMTI6MTIzLCJVKzAwN0YiOjQ2LEhvbWU6MzYsRW5kOjM1LFBhZ2VVcDozMyxQYWdlRG93bjozNCxJbnNlcnQ6NDV9LGpjPXYmJnQ7CkoucHJvdG90eXBlLmc9ZnVuY3Rpb24oYSl7dSYmKHRoaXMuRj09MTcmJiFhLmN0cmxLZXl8fHRoaXMuRj09MTgmJiFhLmFsdEtleXx8diYmdGhpcy5GPT05MSYmIWEubWV0YUtleSkmJih0aGlzLks9dGhpcy5GPS0xKTt0aGlzLkY9PS0xJiYoYS5jdHJsS2V5JiZhLmchPTE3P3RoaXMuRj0xNzphLmFsdEtleSYmYS5nIT0xOD90aGlzLkY9MTg6YS5tZXRhS2V5JiZhLmchPTkxJiYodGhpcy5GPTkxKSk7ZGMoYS5nLHRoaXMuRixhLnNoaWZ0S2V5LGEuY3RybEtleSxhLmFsdEtleSxhLm1ldGFLZXkpPyh0aGlzLks9Y2MoYS5nKSxqYyYmKHRoaXMuRGE9YS5hbHRLZXkpKTp0aGlzLmhhbmRsZUV2ZW50KGEpfTtKLnByb3RvdHlwZS5oPWZ1bmN0aW9uKGEpe3RoaXMuSz10aGlzLkY9LTE7dGhpcy5EYT1hLmFsdEtleX07CkoucHJvdG90eXBlLmhhbmRsZUV2ZW50PWZ1bmN0aW9uKGEpe3ZhciBiPWEuaCxjPWIuYWx0S2V5O2lmKHUmJmEudHlwZT09ImtleXByZXNzIil7dmFyIGQ9dGhpcy5LO3ZhciBlPWIuY2hhckNvZGU+PTAmJmIuY2hhckNvZGU8NjMyMzImJmJjKGQpP2IuY2hhckNvZGU6MH1lbHNlIGEudHlwZT09ImtleXByZXNzIj8oamMmJihjPXRoaXMuRGEpLGIua2V5Q29kZT09Yi5jaGFyQ29kZT9iLmtleUNvZGU8MzI/KGQ9Yi5rZXlDb2RlLGU9MCk6KGQ9dGhpcy5LLGU9Yi5jaGFyQ29kZSk6KGQ9Yi5rZXlDb2RlfHx0aGlzLkssZT1iLmNoYXJDb2RlfHwwKSk6KGQ9Yi5rZXlDb2RlfHx0aGlzLkssZT1iLmNoYXJDb2RlfHwwKSx2JiZlPT02MyYmZD09MjI0JiYoZD0xOTEpO3ZhciBmPWQ9Y2MoZCk7ZD9kPj02MzIzMiYmZCBpbiBoYz9mPWhjW2RdOmQ9PTI1JiZhLnNoaWZ0S2V5JiYoZj05KTpiLmtleUlkZW50aWZpZXImJmIua2V5SWRlbnRpZmllciBpbiBpYyYmKGY9aWNbYi5rZXlJZGVudGlmaWVyXSk7CmlmKCF0fHxhLnR5cGUhPSJrZXlwcmVzcyJ8fGRjKGYsdGhpcy5GLGEuc2hpZnRLZXksYS5jdHJsS2V5LGMsYS5tZXRhS2V5KSlhPWY9PXRoaXMuRix0aGlzLkY9ZixiPW5ldyBmYyhmLGUsYSxiKSxiLmFsdEtleT1jLEUodGhpcyxiKX07Si5wcm90b3R5cGUuaT1mdW5jdGlvbigpe3JldHVybiB0aGlzLlJ9O3ZhciBnYz1mdW5jdGlvbihhLGIsYyl7YS5yYSYma2MoYSk7YS5SPWI7YS5xYT11YihhLlIsImtleXByZXNzIixhLGMpO2EuSmE9dWIoYS5SLCJrZXlkb3duIixhLmcsYyxhKTthLnJhPXViKGEuUiwia2V5dXAiLGEuaCxjLGEpfSxrYz1mdW5jdGlvbihhKXthLnFhJiYoQShhLnFhKSxBKGEuSmEpLEEoYS5yYSksYS5xYT1udWxsLGEuSmE9bnVsbCxhLnJhPW51bGwpO2EuUj1udWxsO2EuRj0tMTthLks9LTF9O0oucHJvdG90eXBlLkM9ZnVuY3Rpb24oKXtKLmwuQy5jYWxsKHRoaXMpO2tjKHRoaXMpfTt2YXIgSz17Z2E6Im1vdXNlZG93biIsaGE6Im1vdXNldXAiLGZhOiJtb3VzZWNhbmNlbCIsc2M6Im1vdXNlbW92ZSIsdWM6Im1vdXNlb3ZlciIsdGM6Im1vdXNlb3V0IixxYzoibW91c2VlbnRlciIscmM6Im1vdXNlbGVhdmUifTt2YXIgbGM9ZnVuY3Rpb24oYSl7cmV0dXJuIHR5cGVvZiBhLmNsYXNzTmFtZT09InN0cmluZyI/YS5jbGFzc05hbWU6YS5nZXRBdHRyaWJ1dGUmJmEuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIn0sTD1mdW5jdGlvbihhKXtyZXR1cm4gYS5jbGFzc0xpc3Q/YS5jbGFzc0xpc3Q6bGMoYSkubWF0Y2goL1xTKy9nKXx8W119LG1jPWZ1bmN0aW9uKGEsYil7dHlwZW9mIGEuY2xhc3NOYW1lPT0ic3RyaW5nIj9hLmNsYXNzTmFtZT1iOmEuc2V0QXR0cmlidXRlJiZhLnNldEF0dHJpYnV0ZSgiY2xhc3MiLGIpfSxuYz1mdW5jdGlvbihhLGIpe2EuY2xhc3NMaXN0P2I9YS5jbGFzc0xpc3QuY29udGFpbnMoYik6KGE9TChhKSxiPXZhKGEsYik+PTApO3JldHVybiBifSxvYz1mdW5jdGlvbihhLGIpe2lmKGEuY2xhc3NMaXN0KWEuY2xhc3NMaXN0LmFkZChiKTtlbHNlIGlmKCFuYyhhLGIpKXt2YXIgYz1sYyhhKTttYyhhLGMrKGMubGVuZ3RoPjA/IiAiK2I6YikpfX0scGM9ZnVuY3Rpb24oYSxiKXtpZihhLmNsYXNzTGlzdClBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGIsCmZ1bmN0aW9uKGUpe29jKGEsZSl9KTtlbHNle3ZhciBjPXt9O0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoTChhKSxmdW5jdGlvbihlKXtjW2VdPSEwfSk7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChiLGZ1bmN0aW9uKGUpe2NbZV09ITB9KTtiPSIiO2Zvcih2YXIgZCBpbiBjKWIrPWIubGVuZ3RoPjA/IiAiK2Q6ZDttYyhhLGIpfX0scWM9ZnVuY3Rpb24oYSxiKXthLmNsYXNzTGlzdD9hLmNsYXNzTGlzdC5yZW1vdmUoYik6bmMoYSxiKSYmbWMoYSxBcnJheS5wcm90b3R5cGUuZmlsdGVyLmNhbGwoTChhKSxmdW5jdGlvbihjKXtyZXR1cm4gYyE9Yn0pLmpvaW4oIiAiKSl9LHJjPWZ1bmN0aW9uKGEsYil7YS5jbGFzc0xpc3Q/QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChiLGZ1bmN0aW9uKGMpe3FjKGEsYyl9KTptYyhhLEFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbChMKGEpLGZ1bmN0aW9uKGMpe3JldHVybiEodmEoYixjKT49MCl9KS5qb2luKCIgIikpfTt2YXIgdGM9ZnVuY3Rpb24oYSxiKXtpZighYSl0aHJvdyBFcnJvcigiSW52YWxpZCBjbGFzcyBuYW1lICIrYSk7aWYodHlwZW9mIGIhPT0iZnVuY3Rpb24iKXRocm93IEVycm9yKCJJbnZhbGlkIGRlY29yYXRvciBmdW5jdGlvbiAiK2IpO3NjW2FdPWJ9LHVjPXt9LHNjPXt9O3ZhciB2Yz1mdW5jdGlvbihhKXt0aGlzLkE9YX07aWEodmMpO3ZhciB3Yz1mdW5jdGlvbihhLGIpe2EmJihhLnRhYkluZGV4PWI/MDotMSl9LHljPWZ1bmN0aW9uKGEsYixjKXtjLmlkJiZQYihiLGMuaWQpO3ZhciBkPWEuZygpLGU9ITEsZj1MKGMpO2YmJkFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoZixmdW5jdGlvbihoKXtoPT1kP2U9ITA6aCYmdGhpcy51KGIsaCxkKX0sYSk7ZXx8b2MoYyxkKTt4YyhiLGMpO3JldHVybiBjfTt2Yy5wcm90b3R5cGUudT1mdW5jdGlvbihhLGIsYyl7Yj09YysiLWRpc2FibGVkIj9hLlgoITEpOmI9PWMrIi1ob3Jpem9udGFsIj96YyhhLCJob3Jpem9udGFsIik6Yj09YysiLXZlcnRpY2FsIiYmemMoYSwidmVydGljYWwiKX07CnZhciB4Yz1mdW5jdGlvbihhLGIpe2lmKGIpZm9yKHZhciBjPWIuZmlyc3RDaGlsZCxkO2MmJmMucGFyZW50Tm9kZT09Yjspe2Q9Yy5uZXh0U2libGluZztpZihjLm5vZGVUeXBlPT0xKXthOnt2YXIgZT1jO3AoZSk7ZT1MKGUpO2Zvcih2YXIgZj1lLmxlbmd0aCxoPTA7aDxmO2grKyl7dmFyIGs9ZVtoXTtpZihrPWsgaW4gc2M/c2Nba10oKTpudWxsKXtlPWs7YnJlYWsgYX19ZT1udWxsfWUmJihlLmc9YyxhLmlzRW5hYmxlZCgpfHxlLlgoITEpLGEuQmEoZSksU2IoZSxjKSl9ZWxzZSBjLm5vZGVWYWx1ZSYmSGEoYy5ub2RlVmFsdWUpIT0iInx8Yi5yZW1vdmVDaGlsZChjKTtjPWR9fSxBYz1mdW5jdGlvbihhLGIpe2I9Yi5pKCk7cChiLCJUaGUgY29udGFpbmVyIERPTSBlbGVtZW50IGNhbm5vdCBiZSBudWxsLiIpO0tiKGIsdCk7KGE9YS5BKSYmWmIoYixhKX07dmMucHJvdG90eXBlLmc9ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy1jb250YWluZXIifTsKdmMucHJvdG90eXBlLmo9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nKCksYz1bYixhLkw9PSJob3Jpem9udGFsIj9iKyItaG9yaXpvbnRhbCI6YisiLXZlcnRpY2FsIl07YS5pc0VuYWJsZWQoKXx8Yy5wdXNoKGIrIi1kaXNhYmxlZCIpO3JldHVybiBjfTt2YXIgQmM9ZnVuY3Rpb24oKXt9O3ZhciBNPWZ1bmN0aW9uKCl7fSxDYztpYShNKTt2YXIgRGM9e2J1dHRvbjoicHJlc3NlZCIsY2hlY2tib3g6ImNoZWNrZWQiLG1lbnVpdGVtOiJzZWxlY3RlZCIsbWVudWl0ZW1jaGVja2JveDoiY2hlY2tlZCIsbWVudWl0ZW1yYWRpbzoiY2hlY2tlZCIscmFkaW86ImNoZWNrZWQiLHRhYjoic2VsZWN0ZWQiLHRyZWVpdGVtOiJzZWxlY3RlZCJ9O00ucHJvdG90eXBlLk5hPWZ1bmN0aW9uKCl7fTtNLnByb3RvdHlwZS54YT1mdW5jdGlvbihhKXt2YXIgYj1hLkcsYz1iLmgsZD10aGlzLk4oKSxlPVtkXSxmPXRoaXMuTigpO2YhPWQmJmUucHVzaChmKTtkPWEubTtmb3IoZj1bXTtkOyl7dmFyIGg9ZCYtZDtmLnB1c2goRWModGhpcyxoKSk7ZCY9fmh9ZS5wdXNoLmFwcGx5KGUsZik7KGQ9YS5GYSkmJmUucHVzaC5hcHBseShlLGQpO3JldHVybiBjLmNhbGwoYiwiRElWIixlLmpvaW4oIiAiKSxhLmlhKX07Ck0ucHJvdG90eXBlLnlhPWZ1bmN0aW9uKGEsYil7Yi5pZCYmUGIoYSxiLmlkKTtiJiZiLmZpcnN0Q2hpbGQ/RmMoYSxiLmZpcnN0Q2hpbGQubmV4dFNpYmxpbmc/eWEoYi5jaGlsZE5vZGVzKTpiLmZpcnN0Q2hpbGQpOmEuaWE9bnVsbDt2YXIgYz0wLGQ9dGhpcy5OKCksZT10aGlzLk4oKSxmPSExLGg9ITEsaz15YShMKGIpKTtrLmZvckVhY2goZnVuY3Rpb24ocSl7Znx8cSE9ZD9ofHxxIT1lP2N8PUdjKHRoaXMscSk6aD0hMDooZj0hMCxlPT1kJiYoaD0hMCkpO0djKHRoaXMscSk9PTEmJihzYShiKSxkYihiKSYmZWIoYikmJmNiKGIsITEpKX0sdGhpcyk7YS5tPWM7Znx8KGsucHVzaChkKSxlPT1kJiYoaD0hMCkpO2h8fGsucHVzaChlKTsoYT1hLkZhKSYmay5wdXNoLmFwcGx5KGssYSk7ZiYmaCYmIWF8fG1jKGIsay5qb2luKCIgIikpO3JldHVybiBifTsKdmFyIEhjPWZ1bmN0aW9uKGEsYil7aWYoYT1hLk5hKCkpe3AoYiwiVGhlIGVsZW1lbnQgcGFzc2VkIGFzIGEgZmlyc3QgcGFyYW1ldGVyIGNhbm5vdCBiZSBudWxsLiIpO3ZhciBjPWIuZ2V0QXR0cmlidXRlKCJyb2xlIil8fG51bGw7YSE9YyYmWmIoYixhKX19LEljPWZ1bmN0aW9uKGEsYil7dmFyIGM7aWYoYS5EJjMyJiYoYz1hLmkoKSkpe2lmKCFiJiZhLm0mMzIpe3RyeXtjLmJsdXIoKX1jYXRjaChkKXt9YS5tJjMyJiZhLlFhKG51bGwpfShkYihjKSYmZWIoYykpIT1iJiZjYihjLGIpfX0sSmM9ZnVuY3Rpb24oYSxiLGMpe0NjfHwoQ2M9ezE6ImRpc2FibGVkIiw4OiJzZWxlY3RlZCIsMTY6ImNoZWNrZWQiLDY0OiJleHBhbmRlZCJ9KTtwKGEsIlRoZSBlbGVtZW50IHBhc3NlZCBhcyBhIGZpcnN0IHBhcmFtZXRlciBjYW5ub3QgYmUgbnVsbC4iKTtiPUNjW2JdO3ZhciBkPWEuZ2V0QXR0cmlidXRlKCJyb2xlIil8fG51bGw7ZCYmKGQ9RGNbZF18fGIsYj1iPT0iY2hlY2tlZCJ8fGI9PQoic2VsZWN0ZWQiP2Q6Yik7YiYmYWMoYSxiLGMpfTtNLnByb3RvdHlwZS5OPWZ1bmN0aW9uKCl7cmV0dXJuImdvb2ctY29udHJvbCJ9O3ZhciBFYz1mdW5jdGlvbihhLGIpe2EuZ3x8S2MoYSk7cmV0dXJuIGEuZ1tiXX0sR2M9ZnVuY3Rpb24oYSxiKXthLmh8fChhLmd8fEtjKGEpLGEuaD1FYShhLmcpKTthPXBhcnNlSW50KGEuaFtiXSwxMCk7cmV0dXJuIGlzTmFOKGEpPzA6YX0sS2M9ZnVuY3Rpb24oYSl7dmFyIGI9YS5OKCk7dmFyIGM9Yi5yZXBsYWNlKC9ceGEwfFxzL2csIiAiKS5pbmRleE9mKCIgIikhPS0xO3AoIWMsIkNvbnRyb2xSZW5kZXJlciBoYXMgYW4gaW52YWxpZCBjc3MgY2xhc3M6ICciK2IrIiciKTthLmc9ezE6YisiLWRpc2FibGVkIiwyOmIrIi1ob3ZlciIsNDpiKyItYWN0aXZlIiw4OmIrIi1zZWxlY3RlZCIsMTY6YisiLWNoZWNrZWQiLDMyOmIrIi1mb2N1c2VkIiw2NDpiKyItb3BlbiJ9fTt2YXIgTj1mdW5jdGlvbihhLGIsYyl7Ri5jYWxsKHRoaXMsYyk7aWYoIWIpe2ZvcihiPXRoaXMuY29uc3RydWN0b3I7Yjspe3ZhciBkPW5hKGIpO2lmKGQ9dWNbZF0pYnJlYWs7Yj0oYj1PYmplY3QuZ2V0UHJvdG90eXBlT2YoYi5wcm90b3R5cGUpKSYmYi5jb25zdHJ1Y3Rvcn1iPWQ/dHlwZW9mIGQuVj09PSJmdW5jdGlvbiI/ZC5WKCk6bmV3IGQ6bnVsbH10aGlzLnY9Yjt0aGlzLmlhPWEhPT12b2lkIDA/YTpudWxsfTtuKE4sRik7Zz1OLnByb3RvdHlwZTtnLmlhPW51bGw7Zy5tPTA7Zy5EPTM5O2cuUD0wO2cuT2E9ITA7Zy5GYT1udWxsO2cuSGE9ITA7Zy5tYT1mdW5jdGlvbigpe3ZhciBhPXRoaXMudi54YSh0aGlzKTt0aGlzLmc9YTtIYyh0aGlzLnYsYSk7S2IoYSwhMCk7dGhpcy5pc1Zpc2libGUoKXx8KGEuc3R5bGUuZGlzcGxheT0ibm9uZSIsYSYmYWMoYSwiaGlkZGVuIiwhMCkpfTtnLm5hPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaSgpfTtnLndhPWZ1bmN0aW9uKCl7cmV0dXJuITB9OwpnLkVhPWZ1bmN0aW9uKGEpe3RoaXMuZz1hPXRoaXMudi55YSh0aGlzLGEpO0hjKHRoaXMudixhKTtLYihhLCEwKTt0aGlzLk9hPWEuc3R5bGUuZGlzcGxheSE9Im5vbmUifTsKZy5JPWZ1bmN0aW9uKCl7Ti5sLkkuY2FsbCh0aGlzKTt2YXIgYT10aGlzLmc7cChhLCJDYW4gbm90IGNhbGwgZ2V0RWxlbWVudFN0cmljdCBiZWZvcmUgcmVuZGVyaW5nL2RlY29yYXRpbmcuIik7cCh0aGlzKTtwKGEpO3RoaXMuaXNWaXNpYmxlKCl8fGFjKGEsImhpZGRlbiIsIXRoaXMuaXNWaXNpYmxlKCkpO3RoaXMuaXNFbmFibGVkKCl8fEpjKGEsMSwhdGhpcy5pc0VuYWJsZWQoKSk7dGhpcy5EJjgmJkpjKGEsOCwhISh0aGlzLm0mOCkpO3RoaXMuRCYxNiYmSmMoYSwxNiwhISh0aGlzLm0mMTYpKTt0aGlzLkQmNjQmJkpjKGEsNjQsISEodGhpcy5tJjY0KSk7dmFyIGI9dGhpcy52O1ViKHRoaXMpJiYoYT10aGlzLmkoKSxiPWIuTigpKyItcnRsIiwoYT1hLmk/YS5pKCk6YSkmJnBjKGEsW2JdKSk7dGhpcy5pc0VuYWJsZWQoKSYmSWModGhpcyx0aGlzLmlzVmlzaWJsZSgpKTt0aGlzLkQmLTImJih0aGlzLkhhJiZMYyh0aGlzLCEwKSx0aGlzLkQmMzImJihhPXRoaXMuaSgpKSkmJihiPQp0aGlzLlp8fCh0aGlzLlo9bmV3IEopLGdjKGIsYSksQihCKEIoUWIodGhpcyksYiwia2V5Iix0aGlzLmFhKSxhLCJmb2N1cyIsdGhpcy5YYSksYSwiYmx1ciIsdGhpcy5RYSkpfTt2YXIgTGM9ZnVuY3Rpb24oYSxiKXt2YXIgYz1RYihhKSxkPWEuaSgpO2I/KEIoQihCKEIoYyxkLEsuZ2EsYS5zYSksZCxbSy5oYSxLLmZhXSxhLnZhKSxkLCJtb3VzZW92ZXIiLGEudWEpLGQsIm1vdXNlb3V0IixhLnRhKSxhLmNhIT1CYyYmQihjLGQsImNvbnRleHRtZW51IixhLmNhKSk6KEMoQyhDKEMoYyxkLEsuZ2EsYS5zYSksZCxbSy5oYSxLLmZhXSxhLnZhKSxkLCJtb3VzZW92ZXIiLGEudWEpLGQsIm1vdXNlb3V0IixhLnRhKSxhLmNhIT1CYyYmQyhjLGQsImNvbnRleHRtZW51IixhLmNhKSl9O04ucHJvdG90eXBlLlU9ZnVuY3Rpb24oKXtOLmwuVS5jYWxsKHRoaXMpO3RoaXMuWiYma2ModGhpcy5aKTt0aGlzLmlzVmlzaWJsZSgpJiZ0aGlzLmlzRW5hYmxlZCgpJiZJYyh0aGlzLCExKX07Ck4ucHJvdG90eXBlLkM9ZnVuY3Rpb24oKXtOLmwuQy5jYWxsKHRoaXMpO3RoaXMuWiYmKHRoaXMuWi5kaXNwb3NlKCksZGVsZXRlIHRoaXMuWik7ZGVsZXRlIHRoaXMudjt0aGlzLkZhPXRoaXMuaWE9bnVsbH07dmFyIEZjPWZ1bmN0aW9uKGEsYil7YS5pYT1ifTtOLnByb3RvdHlwZS5pc1Zpc2libGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5PYX07Ti5wcm90b3R5cGUuaXNFbmFibGVkPWZ1bmN0aW9uKCl7cmV0dXJuISh0aGlzLm0mMSl9O04ucHJvdG90eXBlLlg9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5oO2ImJnR5cGVvZiBiLmlzRW5hYmxlZD09ImZ1bmN0aW9uIiYmIWIuaXNFbmFibGVkKCl8fCFPKHRoaXMsMSwhYSl8fChhfHwoTWModGhpcywhMSksUCh0aGlzLCExKSksdGhpcy5pc1Zpc2libGUoKSYmSWModGhpcyxhKSxUKHRoaXMsMSwhYSwhMCkpfTt2YXIgUD1mdW5jdGlvbihhLGIpe08oYSwyLGIpJiZUKGEsMixiKX07Ck4ucHJvdG90eXBlLmlzQWN0aXZlPWZ1bmN0aW9uKCl7cmV0dXJuISEodGhpcy5tJjQpfTsKdmFyIE1jPWZ1bmN0aW9uKGEsYil7TyhhLDQsYikmJlQoYSw0LGIpfSxOYz1mdW5jdGlvbihhLGIpe08oYSw4LGIpJiZUKGEsOCxiKX0sT2M9ZnVuY3Rpb24oYSxiKXtPKGEsNjQsYikmJlQoYSw2NCxiKX0sVD1mdW5jdGlvbihhLGIsYyxkKXtpZighZCYmYj09MSlhLlgoIWMpO2Vsc2UgaWYoYS5EJmImJmMhPSEhKGEubSZiKSl7dmFyIGU9YS52O2lmKGQ9YS5pKCkpe2lmKGU9RWMoZSxiKSl7dmFyIGY9YS5pP2EuaSgpOmE7ZiYmKGM/cGM6cmMpKGYsW2VdKX1KYyhkLGIsYyl9YS5tPWM/YS5tfGI6YS5tJn5ifX0sUGM9ZnVuY3Rpb24oYSxiLGMpe2lmKGEucyYmYS5tJmImJiFjKXRocm93IEVycm9yKCJDb21wb25lbnQgYWxyZWFkeSByZW5kZXJlZCIpOyFjJiZhLm0mYiYmVChhLGIsITEpO2EuRD1jP2EuRHxiOmEuRCZ+Yn0sVT1mdW5jdGlvbihhLGIpe3JldHVybiEhKDI1NSZiKSYmISEoYS5EJmIpfSxPPWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4hIShhLkQmYikmJiEhKGEubSZiKSE9CmMmJighKGEuUCZiKXx8RShhLE5iKGIsYykpKSYmIWEuYmF9O04ucHJvdG90eXBlLnVhPWZ1bmN0aW9uKGEpeyFRYyhhLHRoaXMuaSgpKSYmRSh0aGlzLCJlbnRlciIpJiZ0aGlzLmlzRW5hYmxlZCgpJiZVKHRoaXMsMikmJlAodGhpcywhMCl9O04ucHJvdG90eXBlLnRhPWZ1bmN0aW9uKGEpeyFRYyhhLHRoaXMuaSgpKSYmRSh0aGlzLCJsZWF2ZSIpJiYoVSh0aGlzLDQpJiZNYyh0aGlzLCExKSxVKHRoaXMsMikmJlAodGhpcywhMSkpfTtOLnByb3RvdHlwZS5jYT1CYzt2YXIgUWM9ZnVuY3Rpb24oYSxiKXtyZXR1cm4hIWEucmVsYXRlZFRhcmdldCYmYWIoYixhLnJlbGF0ZWRUYXJnZXQpfTsKTi5wcm90b3R5cGUuc2E9ZnVuY3Rpb24oYSl7aWYodGhpcy5pc0VuYWJsZWQoKSYmKFUodGhpcywyKSYmUCh0aGlzLCEwKSwhKGEuaC5idXR0b24hPTB8fHYmJmEuY3RybEtleSkpKXtVKHRoaXMsNCkmJk1jKHRoaXMsITApO3ZhciBiO2lmKGI9dGhpcy52KXt2YXIgYztiPXRoaXMuRCYzMiYmKGM9dGhpcy5pKCkpP2RiKGMpJiZlYihjKTohMX1iJiZ0aGlzLmkoKS5mb2N1cygpfWEuaC5idXR0b24hPTB8fHYmJmEuY3RybEtleXx8YS5qKCl9O04ucHJvdG90eXBlLnZhPWZ1bmN0aW9uKGEpe3RoaXMuaXNFbmFibGVkKCkmJihVKHRoaXMsMikmJlAodGhpcywhMCksdGhpcy5pc0FjdGl2ZSgpJiZSYyh0aGlzLGEpJiZVKHRoaXMsNCkmJk1jKHRoaXMsITEpKX07CnZhciBSYz1mdW5jdGlvbihhLGIpe2lmKFUoYSwxNikpe3ZhciBjPSEoYS5tJjE2KTtPKGEsMTYsYykmJlQoYSwxNixjKX1VKGEsOCkmJk5jKGEsITApO1UoYSw2NCkmJk9jKGEsIShhLm0mNjQpKTtjPW5ldyB5KCJhY3Rpb24iLGEpO2ImJihjLmFsdEtleT1iLmFsdEtleSxjLmN0cmxLZXk9Yi5jdHJsS2V5LGMubWV0YUtleT1iLm1ldGFLZXksYy5zaGlmdEtleT1iLnNoaWZ0S2V5LGMuRz1iLkcsYy50aW1lU3RhbXA9Yi50aW1lU3RhbXApO3JldHVybiBFKGEsYyl9O04ucHJvdG90eXBlLlhhPWZ1bmN0aW9uKCl7VSh0aGlzLDMyKSYmTyh0aGlzLDMyLCEwKSYmVCh0aGlzLDMyLCEwKX07Ti5wcm90b3R5cGUuUWE9ZnVuY3Rpb24oKXtVKHRoaXMsNCkmJk1jKHRoaXMsITEpO1UodGhpcywzMikmJk8odGhpcywzMiwhMSkmJlQodGhpcywzMiwhMSl9OwpOLnByb3RvdHlwZS5hYT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5pc1Zpc2libGUoKSYmdGhpcy5pc0VuYWJsZWQoKSYmYS5nPT0xMyYmUmModGhpcyxhKT8oYS5qKCksYS52KCksITApOiExfTtpZih0eXBlb2YgTiE9PSJmdW5jdGlvbiIpdGhyb3cgRXJyb3IoIkludmFsaWQgY29tcG9uZW50IGNsYXNzICIrTik7aWYodHlwZW9mIE0hPT0iZnVuY3Rpb24iKXRocm93IEVycm9yKCJJbnZhbGlkIHJlbmRlcmVyIGNsYXNzICIrTSk7dmFyIFNjPW5hKE4pO3VjW1NjXT1NO3RjKCJnb29nLWNvbnRyb2wiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBOKG51bGwpfSk7dmFyIFY9ZnVuY3Rpb24oYSxiLGMpe0YuY2FsbCh0aGlzLGMpO3RoaXMuZWE9Ynx8dmMuVigpO3RoaXMuTD1hfHwidmVydGljYWwifTtuKFYsRik7Zz1WLnByb3RvdHlwZTtnLkthPW51bGw7Zy5kYT1udWxsO2cuZWE9bnVsbDtnLkw9bnVsbDtnLlM9ITA7Zy5UPSEwO2cubz0tMTtnLkI9bnVsbDtnLlc9ITE7Zy5PPW51bGw7dmFyIFRjPWZ1bmN0aW9uKGEpe3JldHVybiBhLkthfHxhLmkoKX07Zz1WLnByb3RvdHlwZTtnLm1hPWZ1bmN0aW9uKCl7dGhpcy5nPXRoaXMuRy5oKCJESVYiLHRoaXMuZWEuaih0aGlzKS5qb2luKCIgIikpfTtnLm5hPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaSgpfTtnLndhPWZ1bmN0aW9uKGEpe3JldHVybiBhLnRhZ05hbWU9PSJESVYifTtnLkVhPWZ1bmN0aW9uKGEpe3RoaXMuZz15Yyh0aGlzLmVhLHRoaXMsYSk7YS5zdHlsZS5kaXNwbGF5PT0ibm9uZSImJih0aGlzLlM9ITEpfTsKZy5JPWZ1bmN0aW9uKCl7Vi5sLkkuY2FsbCh0aGlzKTtUYih0aGlzLGZ1bmN0aW9uKGIpe2IucyYmVWModGhpcyxiKX0sdGhpcyk7dmFyIGE9dGhpcy5pKCk7QWModGhpcy5lYSx0aGlzKTtWYyh0aGlzLHRoaXMuUyk7QihCKEIoQihCKEIoQihCKFFiKHRoaXMpLHRoaXMsImVudGVyIix0aGlzLmViKSx0aGlzLCJoaWdobGlnaHQiLHRoaXMuZmIpLHRoaXMsInVuaGlnaGxpZ2h0Iix0aGlzLmxiKSx0aGlzLCJvcGVuIix0aGlzLmdiKSx0aGlzLCJjbG9zZSIsdGhpcy5iYiksYSxLLmdhLHRoaXMuV2EpLGJiKGEpLFtLLmhhLEsuZmFdLHRoaXMuY2IpLGEsW0suZ2EsSy5oYSxLLmZhLCJtb3VzZW92ZXIiLCJtb3VzZW91dCIsImNvbnRleHRtZW51Il0sdGhpcy5hYik7V2ModGhpcyl9O3ZhciBXYz1mdW5jdGlvbihhKXt2YXIgYj1RYihhKSxjPVRjKGEpO0IoQihCKGIsYywiZm9jdXMiLGEuUGEpLGMsImJsdXIiLGEuVWEpLGEuZGF8fChhLmRhPW5ldyBKKFRjKGEpKSksImtleSIsYS5WYSl9OwpnPVYucHJvdG90eXBlO2cuVT1mdW5jdGlvbigpe1hjKHRoaXMsLTEpO3RoaXMuQiYmT2ModGhpcy5CLCExKTt0aGlzLlc9ITE7Vi5sLlUuY2FsbCh0aGlzKX07Zy5DPWZ1bmN0aW9uKCl7Vi5sLkMuY2FsbCh0aGlzKTt0aGlzLmRhJiYodGhpcy5kYS5kaXNwb3NlKCksdGhpcy5kYT1udWxsKTt0aGlzLmVhPXRoaXMuQj10aGlzLk89dGhpcy5LYT1udWxsfTtnLmViPWZ1bmN0aW9uKCl7cmV0dXJuITB9OwpnLmZiPWZ1bmN0aW9uKGEpe3ZhciBiPVZiKHRoaXMsYS50YXJnZXQpO2lmKGI+LTEmJmIhPXRoaXMubyl7dmFyIGM9SSh0aGlzLHRoaXMubyk7YyYmUChjLCExKTt0aGlzLm89YjtjPUkodGhpcyx0aGlzLm8pO3RoaXMuVyYmTWMoYywhMCk7dGhpcy5CJiZjIT10aGlzLkImJihjLkQmNjQ/T2MoYywhMCk6T2ModGhpcy5CLCExKSl9Yj10aGlzLmkoKTtwKGIsIlRoZSBET00gZWxlbWVudCBmb3IgdGhlIGNvbnRhaW5lciBjYW5ub3QgYmUgbnVsbC4iKTthLnRhcmdldC5pKCkhPW51bGwmJmFjKGIsImFjdGl2ZWRlc2NlbmRhbnQiLGEudGFyZ2V0LmkoKS5pZCl9O2cubGI9ZnVuY3Rpb24oYSl7YS50YXJnZXQ9PUkodGhpcyx0aGlzLm8pJiYodGhpcy5vPS0xKTthPXRoaXMuaSgpO3AoYSwiVGhlIERPTSBlbGVtZW50IGZvciB0aGUgY29udGFpbmVyIGNhbm5vdCBiZSBudWxsLiIpO2EucmVtb3ZlQXR0cmlidXRlKCRiKCJhY3RpdmVkZXNjZW5kYW50IikpfTsKZy5nYj1mdW5jdGlvbihhKXsoYT1hLnRhcmdldCkmJmEhPXRoaXMuQiYmYS5oPT10aGlzJiYodGhpcy5CJiZPYyh0aGlzLkIsITEpLHRoaXMuQj1hKX07Zy5iYj1mdW5jdGlvbihhKXthLnRhcmdldD09dGhpcy5CJiYodGhpcy5CPW51bGwpO3ZhciBiPXRoaXMuaSgpLGM9YS50YXJnZXQuaSgpO2ImJmEudGFyZ2V0Lm0mMiYmYyYmKGE9IiIsYyYmKGE9Yy5pZCxwKGEsIlRoZSBhY3RpdmUgZWxlbWVudCBzaG91bGQgaGF2ZSBhbiBpZC4iKSksYWMoYiwiYWN0aXZlZGVzY2VuZGFudCIsYSkpfTtnLldhPWZ1bmN0aW9uKGEpe3RoaXMuVCYmKHRoaXMuVz0hMCk7dmFyIGI9VGModGhpcyk7YiYmZGIoYikmJmViKGIpP2IuZm9jdXMoKTphLmooKX07Zy5jYj1mdW5jdGlvbigpe3RoaXMuVz0hMX07CmcuYWI9ZnVuY3Rpb24oYSl7YTp7dmFyIGI9YS50YXJnZXQ7aWYodGhpcy5PKWZvcih2YXIgYz10aGlzLmkoKTtiJiZiIT09Yzspe3ZhciBkPWIuaWQ7aWYoZCBpbiB0aGlzLk8pe2I9dGhpcy5PW2RdO2JyZWFrIGF9Yj1iLnBhcmVudE5vZGV9Yj1udWxsfWlmKGIpc3dpdGNoKGEudHlwZSl7Y2FzZSBLLmdhOmIuc2EoYSk7YnJlYWs7Y2FzZSBLLmhhOmNhc2UgSy5mYTpiLnZhKGEpO2JyZWFrO2Nhc2UgIm1vdXNlb3ZlciI6Yi51YShhKTticmVhaztjYXNlICJtb3VzZW91dCI6Yi50YShhKTticmVhaztjYXNlICJjb250ZXh0bWVudSI6Yi5jYShhKX19O2cuUGE9ZnVuY3Rpb24oKXt9O2cuVWE9ZnVuY3Rpb24oKXtYYyh0aGlzLC0xKTt0aGlzLlc9ITE7dGhpcy5CJiZPYyh0aGlzLkIsITEpfTsKZy5WYT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5pc0VuYWJsZWQoKSYmdGhpcy5pc1Zpc2libGUoKSYmKEgodGhpcykhPTB8fHRoaXMuS2EpJiZZYyh0aGlzLGEpPyhhLmooKSxhLnYoKSwhMCk6ITF9Owp2YXIgWWM9ZnVuY3Rpb24oYSxiKXt2YXIgYz1JKGEsYS5vKTtpZihjJiZ0eXBlb2YgYy5hYT09ImZ1bmN0aW9uIiYmYy5hYShiKXx8YS5CJiZhLkIhPWMmJnR5cGVvZiBhLkIuYWE9PSJmdW5jdGlvbiImJmEuQi5hYShiKSlyZXR1cm4hMDtpZihiLnNoaWZ0S2V5fHxiLmN0cmxLZXl8fGIubWV0YUtleXx8Yi5hbHRLZXkpcmV0dXJuITE7c3dpdGNoKGIuZyl7Y2FzZSAyNzpUYyhhKS5ibHVyKCk7YnJlYWs7Y2FzZSAzNjpaYyhhKTticmVhaztjYXNlIDM1OiRjKGEpO2JyZWFrO2Nhc2UgMzg6aWYoYS5MPT0idmVydGljYWwiKWFkKGEpO2Vsc2UgcmV0dXJuITE7YnJlYWs7Y2FzZSAzNzppZihhLkw9PSJob3Jpem9udGFsIilVYihhKT9iZChhKTphZChhKTtlbHNlIHJldHVybiExO2JyZWFrO2Nhc2UgNDA6aWYoYS5MPT0idmVydGljYWwiKWJkKGEpO2Vsc2UgcmV0dXJuITE7YnJlYWs7Y2FzZSAzOTppZihhLkw9PSJob3Jpem9udGFsIilVYihhKT9hZChhKTpiZChhKTtlbHNlIHJldHVybiExOwpicmVhaztkZWZhdWx0OnJldHVybiExfXJldHVybiEwfSxVYz1mdW5jdGlvbihhLGIpe3ZhciBjPWIuaSgpO2M9Yy5pZHx8KGMuaWQ9T2IoYikpO2EuT3x8KGEuTz17fSk7YS5PW2NdPWJ9O1YucHJvdG90eXBlLkJhPWZ1bmN0aW9uKGEsYil7dWEoYSxOLCJUaGUgY2hpbGQgb2YgYSBjb250YWluZXIgbXVzdCBiZSBhIGNvbnRyb2wiKTtWLmwuQmEuY2FsbCh0aGlzLGEsYil9O1YucHJvdG90eXBlLkNhPWZ1bmN0aW9uKGEsYixjKXt1YShhLE4pO2EuUHw9MjthLlB8PTY0O1BjKGEsMzIsITEpO2EucyYmMCE9YS5IYSYmTGMoYSwhMSk7YS5IYT0hMTt2YXIgZD1hLmg9PXRoaXM/VmIodGhpcyxhKTotMTtWLmwuQ2EuY2FsbCh0aGlzLGEsYixjKTthLnMmJnRoaXMucyYmVWModGhpcyxhKTthPWQ7YT09LTEmJihhPUgodGhpcykpO2E9PXRoaXMubz90aGlzLm89TWF0aC5taW4oSCh0aGlzKS0xLGIpOmE+dGhpcy5vJiZiPD10aGlzLm8/dGhpcy5vKys6YTx0aGlzLm8mJmI+dGhpcy5vJiZ0aGlzLm8tLX07CnZhciB6Yz1mdW5jdGlvbihhLGIpe2lmKGEuaSgpKXRocm93IEVycm9yKCJDb21wb25lbnQgYWxyZWFkeSByZW5kZXJlZCIpO2EuTD1ifTtWLnByb3RvdHlwZS5pc1Zpc2libGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5TfTt2YXIgVmM9ZnVuY3Rpb24oYSxiKXthLlM9Yjt2YXIgYz1hLmkoKTtjJiYoYy5zdHlsZS5kaXNwbGF5PWI/IiI6Im5vbmUiLHdjKFRjKGEpLGEuVCYmYS5TKSl9O1YucHJvdG90eXBlLmlzRW5hYmxlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLlR9O1YucHJvdG90eXBlLlg9ZnVuY3Rpb24oYSl7dGhpcy5UIT1hJiZFKHRoaXMsYT8iZW5hYmxlIjoiZGlzYWJsZSIpJiYoYT8odGhpcy5UPSEwLFRiKHRoaXMsZnVuY3Rpb24oYil7Yi5UYT9kZWxldGUgYi5UYTpiLlgoITApfSkpOihUYih0aGlzLGZ1bmN0aW9uKGIpe2IuaXNFbmFibGVkKCk/Yi5YKCExKTpiLlRhPSEwfSksdGhpcy5XPXRoaXMuVD0hMSksd2MoVGModGhpcyksYSYmdGhpcy5TKSl9Owp2YXIgWGM9ZnVuY3Rpb24oYSxiKXsoYj1JKGEsYikpP1AoYiwhMCk6YS5vPi0xJiZQKEkoYSxhLm8pLCExKX0sWmM9ZnVuY3Rpb24oYSl7Y2QoYSxmdW5jdGlvbihiLGMpe3JldHVybihiKzEpJWN9LEgoYSktMSl9LCRjPWZ1bmN0aW9uKGEpe2NkKGEsZnVuY3Rpb24oYixjKXtiLS07cmV0dXJuIGI8MD9jLTE6Yn0sMCl9LGJkPWZ1bmN0aW9uKGEpe2NkKGEsZnVuY3Rpb24oYixjKXtyZXR1cm4oYisxKSVjfSxhLm8pfSxhZD1mdW5jdGlvbihhKXtjZChhLGZ1bmN0aW9uKGIsYyl7Yi0tO3JldHVybiBiPDA/Yy0xOmJ9LGEubyl9LGNkPWZ1bmN0aW9uKGEsYixjKXtjPWM8MD9WYihhLGEuQik6Yzt2YXIgZD1IKGEpO2M9Yi5jYWxsKGEsYyxkKTtmb3IodmFyIGU9MDtlPD1kOyl7dmFyIGY9SShhLGMpO2lmKGYmJmYuaXNWaXNpYmxlKCkmJmYuaXNFbmFibGVkKCkmJmYuRCYyKXthLkxhKGMpO2JyZWFrfWUrKztjPWIuY2FsbChhLGMsZCl9fTsKVi5wcm90b3R5cGUuTGE9ZnVuY3Rpb24oYSl7WGModGhpcyxhKX07dmFyIGRkPWZ1bmN0aW9uKCl7fTtuKGRkLE0pO2lhKGRkKTtnPWRkLnByb3RvdHlwZTtnLk49ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy10YWIifTtnLk5hPWZ1bmN0aW9uKCl7cmV0dXJuInRhYiJ9O2cueGE9ZnVuY3Rpb24oYSl7dmFyIGI9ZGQubC54YS5jYWxsKHRoaXMsYSk7KGE9YS5HYSgpKSYmdGhpcy5NYShiLGEpO3JldHVybiBifTtnLnlhPWZ1bmN0aW9uKGEsYil7Yj1kZC5sLnlhLmNhbGwodGhpcyxhLGIpO3ZhciBjPXRoaXMuR2EoYik7YyYmKGEuUmE9Yyk7YS5tJjgmJihjPWEuaCkmJnR5cGVvZiBjLko9PT0iZnVuY3Rpb24iJiYoVChhLDgsITEpLGMuSihhKSk7cmV0dXJuIGJ9O2cuR2E9ZnVuY3Rpb24oYSl7cmV0dXJuIGEudGl0bGV8fCIifTtnLk1hPWZ1bmN0aW9uKGEsYil7YSYmKGEudGl0bGU9Ynx8IiIpfTt2YXIgZWQ9ZnVuY3Rpb24oYSxiLGMpe04uY2FsbCh0aGlzLGEsYnx8ZGQuVigpLGMpO1BjKHRoaXMsOCwhMCk7dGhpcy5QfD05fTtuKGVkLE4pO2VkLnByb3RvdHlwZS5HYT1mdW5jdGlvbigpe3JldHVybiB0aGlzLlJhfTtlZC5wcm90b3R5cGUuTWE9ZnVuY3Rpb24oYSl7dGhpcy52Lk1hKHRoaXMuaSgpLGEpO3RoaXMuUmE9YX07dGMoImdvb2ctdGFiIixmdW5jdGlvbigpe3JldHVybiBuZXcgZWQobnVsbCl9KTt2YXIgVz1mdW5jdGlvbigpe3RoaXMuQT0idGFibGlzdCJ9O24oVyx2Yyk7aWEoVyk7Vy5wcm90b3R5cGUuZz1mdW5jdGlvbigpe3JldHVybiJnb29nLXRhYi1iYXIifTtXLnByb3RvdHlwZS51PWZ1bmN0aW9uKGEsYixjKXt0aGlzLnZ8fCh0aGlzLmh8fGZkKHRoaXMpLHRoaXMudj1FYSh0aGlzLmgpKTt2YXIgZD10aGlzLnZbYl07ZD8oemMoYSxnZChkKSksYS52PWQpOlcubC51LmNhbGwodGhpcyxhLGIsYyl9O1cucHJvdG90eXBlLmo9ZnVuY3Rpb24oYSl7dmFyIGI9Vy5sLmouY2FsbCh0aGlzLGEpO3RoaXMuaHx8ZmQodGhpcyk7Yi5wdXNoKHRoaXMuaFthLnZdKTtyZXR1cm4gYn07dmFyIGZkPWZ1bmN0aW9uKGEpe3ZhciBiPWEuZygpO2EuaD17dG9wOmIrIi10b3AiLGJvdHRvbTpiKyItYm90dG9tIixzdGFydDpiKyItc3RhcnQiLGVuZDpiKyItZW5kIn19O3ZhciBYPWZ1bmN0aW9uKGEsYixjKXthPWF8fCJ0b3AiO3pjKHRoaXMsZ2QoYSkpO3RoaXMudj1hO1YuY2FsbCh0aGlzLHRoaXMuTCxifHxXLlYoKSxjKTtoZCh0aGlzKX07bihYLFYpO2c9WC5wcm90b3R5cGU7Zy5IPW51bGw7Zy5JPWZ1bmN0aW9uKCl7WC5sLkkuY2FsbCh0aGlzKTtoZCh0aGlzKX07Zy5DPWZ1bmN0aW9uKCl7WC5sLkMuY2FsbCh0aGlzKTt0aGlzLkg9bnVsbH07Zy5MYT1mdW5jdGlvbihhKXtYLmwuTGEuY2FsbCh0aGlzLGEpO3RoaXMuSihJKHRoaXMsYSkpfTtnLko9ZnVuY3Rpb24oYSl7YT9OYyhhLCEwKTp0aGlzLkgmJk5jKHRoaXMuSCwhMSl9Owp2YXIgaWQ9ZnVuY3Rpb24oYSxiKXtpZihiJiZiPT1hLkgpe2Zvcih2YXIgYz1WYihhLGIpLGQ9Yy0xO2I9SShhLGQpO2QtLSl7dmFyIGU9YjtpZihlLmlzVmlzaWJsZSgpJiZlLmlzRW5hYmxlZCgpKXthLkooYik7cmV0dXJufX1mb3IoYys9MTtiPUkoYSxjKTtjKyspaWYoZD1iLGQuaXNWaXNpYmxlKCkmJmQuaXNFbmFibGVkKCkpe2EuSihiKTtyZXR1cm59YS5KKG51bGwpfX07Zz1YLnByb3RvdHlwZTtnLmpiPWZ1bmN0aW9uKGEpe3RoaXMuSCYmdGhpcy5IIT1hLnRhcmdldCYmTmModGhpcy5ILCExKTt0aGlzLkg9YS50YXJnZXR9O2cua2I9ZnVuY3Rpb24oYSl7YS50YXJnZXQ9PXRoaXMuSCYmKHRoaXMuSD1udWxsKX07Zy5oYj1mdW5jdGlvbihhKXtpZCh0aGlzLGEudGFyZ2V0KX07Zy5pYj1mdW5jdGlvbihhKXtpZCh0aGlzLGEudGFyZ2V0KX07Zy5QYT1mdW5jdGlvbigpe0kodGhpcyx0aGlzLm8pfHxYYyh0aGlzLFZiKHRoaXMsdGhpcy5IfHxJKHRoaXMsMCkpKX07CnZhciBoZD1mdW5jdGlvbihhKXtCKEIoQihCKFFiKGEpLGEsInNlbGVjdCIsYS5qYiksYSwidW5zZWxlY3QiLGEua2IpLGEsImRpc2FibGUiLGEuaGIpLGEsImhpZGUiLGEuaWIpfSxnZD1mdW5jdGlvbihhKXtyZXR1cm4gYT09InN0YXJ0Inx8YT09ImVuZCI/InZlcnRpY2FsIjoiaG9yaXpvbnRhbCJ9O3RjKCJnb29nLXRhYi1iYXIiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBYfSk7ZnVuY3Rpb24gamQoYSl7dmFyIGI9e3RvcDoiYm90dG9tIixib3R0b206InRvcCIsc3RhcnQ6InJpZ2h0IixlbmQ6ImxlZnQifVthLmxvY2F0aW9uXSxjPWEuZWxlbWVudElkLGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTtkLnRleHRDb250ZW50PSJcbiAgICBmaWVsZHNldCB7XG4gICAgICBwYWRkaW5nOiAxMHB4O1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgIzM2OTtcbiAgICB9XG5cbiAgICAjIitjKyIgLmdvb2ctdGFiLWNvbnRlbnQge1xuICAgICAgbWluLWhlaWdodDogM2VtO1xuICAgICAgbWFyZ2luOiAwO1xuICAgICAgYm9yZGVyOiAiK2EuYm9yZGVyKyIgc29saWQgIithLmJvcmRlckNvbG9yKyI7XG4gICAgICBib3JkZXItdG9wOiAwO1xuICAgICAgaGVpZ2h0OiAiK2EuY29udGVudEhlaWdodCsiO1xuICAgICAgcGFkZGluZzogNHB4IDhweDtcbiAgICAgIG1hcmdpbi1yaWdodDogNHB4O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgIG92ZXJmbG93OiBhdXRvO1xuICAgIH1cblxuICAgICMiKwpjKyIgLmdvb2ctdGFiLWJhci0iK2EubG9jYXRpb24rIiAuZ29vZy10YWItc2VsZWN0ZWQge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICIrYS5ib3JkZXJDb2xvcisiO1xuICAgICAgYm9yZGVyLSIrYisiOiAwcHg7XG4gICAgfVxuXG4gICAgIyIrYysiIC5nb29nLXRhYi1iYXItIithLmxvY2F0aW9uKyIge1xuICAgICAgcGFkZGluZy0iK2EubG9jYXRpb24rIjogNXB4ICFpbXBvcnRhbnQ7XG4gICAgICBib3JkZXItIitiKyI6IDFweCBzb2xpZCAiK2EuYm9yZGVyQ29sb3IrIiAhaW1wb3J0YW50O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICB9XG5cbiAgICAjIitjKyIgLmdvb2ctdGFiLWJhciB7XG4gICAgICAgbWFyZ2luOiAwO1xuICAgICAgIGJvcmRlcjogMDtcbiAgICAgICBwYWRkaW5nOiAwO1xuICAgICAgIGxpc3Qtc3R5bGU6IG5vbmU7XG4gICAgICAgY3Vyc29yOiBkZWZhdWx0O1xuICAgICAgIG91dGxpbmU6IG5vbmU7XG4gICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgICBtYXJnaW4tcmlnaHQ6IDRweDtcbiAgICAgIH1cblxuICAgICAjIisKYysiIC5nb29nLXRhYiB7XG4gICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgIHBhZGRpbmc6IDRweCA4cHg7XG4gICAgICAgY29sb3I6IHZhcigtLWNvbGFiLXByaW1hcnktdGV4dC1jb2xvcik7XG4gICAgICAgdGV4dC1kZWNvcmF0aW9uOiBpbml0aWFsO1xuICAgICAgIGN1cnNvcjogZGVmYXVsdDtcbiAgICAgIH1cblxuICAgICAgIyIrYysiIC5nb29nLXRhYi1ob3ZlciB7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWNvbGFiLWhpZ2hsaWdodGVkLXN1cmZhY2UtY29sb3IpO1xuICAgICAgfVxuICAgICAgIjtyZXR1cm4gZH0KdmFyIGtkPWZ1bmN0aW9uKGEpe3ZhciBiPWEuZWxlbWVudElkLGM9YS50YWJOYW1lcyxkPWEuc2VsZWN0ZWRJbmRleDsiY29udGVudEJvcmRlciJpbiBhfHwoYS5jb250ZW50Qm9yZGVyPSIwcHgiKTsiY29udGVudEhlaWdodCJpbiBhfHwoYS5jb250ZW50SGVpZ2h0PSJpbml0aWFsIik7ImJvcmRlckNvbG9yImluIGF8fChhLmJvcmRlckNvbG9yPSJ2YXIoLS1jb2xhYi1ib3JkZXItY29sb3IpIik7YS5sb2NhdGlvbnx8KGEubG9jYXRpb249InRvcCIpO3ZhciBlPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiMiK2IpLGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zi5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYi1iYXIiKTt2YXIgaD1hLmxvY2F0aW9uO2YuY2xhc3NMaXN0LmFkZCgiZ29vZy10YWItYmFyLSIraCk7Zm9yKHZhciBrPVtdLHE9ZmEoYyksRz1xLm5leHQoKTshRy5kb25lO0c9cS5uZXh0KCkpe0c9Ry52YWx1ZTt2YXIgeD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKeC5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYiIpO3gudGV4dENvbnRlbnQ9RztmLmFwcGVuZENoaWxkKHgpO2sucHVzaCh4KX1oIT0iYm90dG9tIiYmZS5hcHBlbmRDaGlsZChmKTtxPW51bGw7aWYoaD09InRvcCJ8fGg9PSJib3R0b20iKXE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikscS5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYi1iYXItY2xlYXIiKTtoPT0idG9wIiYmcSYmZS5hcHBlbmRDaGlsZChxKTtHPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO0cuY2xhc3NMaXN0LmFkZCgiZ29vZy10YWItY29udGVudCIpO3ZhciBoYT1bXTtjPWZhKGMpO2Zvcih4PWMubmV4dCgpOyF4LmRvbmU7eD1jLm5leHQoKSl4PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHguaWQ9ZS5pZCsiX2NvbnRlbnRfIitoYS5sZW5ndGgseC5zdHlsZS5kaXNwbGF5PSJub25lIixHLmFwcGVuZENoaWxkKHgpLGhhLnB1c2goeCk7ZS5hcHBlbmRDaGlsZChHKTtoPT0iYm90dG9tIiYmKHEmJgplLmFwcGVuZENoaWxkKHEpLGUuYXBwZW5kQ2hpbGQoZikpO3ZhciBRPW5ldyBYKGgpO1NiKFEsZik7dmFyIFI9LTE7d2IoUSwic2VsZWN0IixmdW5jdGlvbihTKXtTPWsuaW5kZXhPZihTLnRhcmdldC5pKCkpO1MhPVImJihSPj0wJiZSPGhhLmxlbmd0aCYmKGhhW1JdLnN0eWxlLmRpc3BsYXk9Im5vbmUiLFI9LTEpLFM+PTAmJlM8aGEubGVuZ3RoJiYoUj1TLGhhW1JdLnN0eWxlLmRpc3BsYXk9ImlubGluZSIsd2luZG93LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCJyZXNpemUiKSksZ29vZ2xlLmNvbGFiLm91dHB1dC5yZXNpemVJZnJhbWVUb0NvbnRlbnQoKSksUS5KKEkoUSxSKSkpfSk7US5KKEkoUSxkKSk7d2luZG93W2JdPXtzZXRTZWxlY3RlZFRhYkluZGV4OmZ1bmN0aW9uKFMpe1EuSihJKFEsUykpfX07ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChqZChhKSl9LGxkPVsiY29sYWJfbGliIiwiY3JlYXRlVGFiQmFyIl0sWT1sOwpsZFswXWluIFl8fHR5cGVvZiBZLmV4ZWNTY3JpcHQ9PSJ1bmRlZmluZWQifHxZLmV4ZWNTY3JpcHQoInZhciAiK2xkWzBdKTtmb3IodmFyIFo7bGQubGVuZ3RoJiYoWj1sZC5zaGlmdCgpKTspbGQubGVuZ3RofHxrZD09PXZvaWQgMD9ZW1pdJiZZW1pdIT09T2JqZWN0LnByb3RvdHlwZVtaXT9ZPVlbWl06WT1ZW1pdPXt9OllbWl09a2Q7fSkuY2FsbCh0aGlzKTsKLy8gY2xhbmctZm9ybWF0IG9uCg==", + "ok": true, + "headers": [ + [ + "content-length", + "41785" + ], + [ + "content-type", + "application/javascript" + ] + ], + "status": 200, + "status_text": "" + } + }, + "base_uri": "https://localhost:8080/", + "height": 260 + } + }, + "execution_count": 33, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"6acc691e-d22d-11ef-a7c0-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id74\", \"tabNames\": [\"QuarterWeight\", \"(Log)\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_92f997004b" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"6acce678-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id74\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_569aeb526e" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"6acf61e6-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_9d66ef9165" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"6acfe5a8-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id74_content_1\");\n", + "//# sourceURL=js_4b47d126ed" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"6ad04516-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"6acfe5a8-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_5dd9257ffd" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"6ad09ed0-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id74\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_38f53c830f" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"6ad36340-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"6acf61e6-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_0ee7a95542" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"6ad598f4-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_dec4e6b5b6" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"6ad5e2aa-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id74_content_0\");\n", + "//# sourceURL=js_db2527b337" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"6ad62e36-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"6ad5e2aa-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_3a3c329be2" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"6ad6e95c-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id74\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_479cd5ec92" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"6ad8a47c-d22d-11ef-a7c0-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id75\", \"tabNames\": [\"SQL\", \"Result\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_2c6712a456" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"6ad8eeb4-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id75\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_80d869647c" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"6ada4f66-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_a6989c234d" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"6ada9f66-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id75_content_0\");\n", + "//# sourceURL=js_b9b8bb6807" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"6adaed68-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"6ada9f66-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_7607b2c2d2" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"6adb3548-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id75\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_a90a9491d8" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The following query is stored at \u001b[1mQuarterWeight_sql\u001b[0m variable.\n", + "WITH t_1_TimestampWeight AS (SELECT * FROM (\n", + " \n", + " SELECT\n", + " \"2001-01-01 00:00:00+00:00\" AS col0,\n", + " 1 AS col1\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " \"2001-04-01 00:00:00+00:00\" AS col0,\n", + " 1 AS col1\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " \"2001-08-01 00:00:00+00:00\" AS col0,\n", + " 1 AS col1\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " \"2001-07-01 00:00:00+00:00\" AS col0,\n", + " 1 AS col1\n", + " \n", + ") AS UNUSED_TABLE_NAME )\n", + "SELECT\n", + " FORMAT_TIMESTAMP(\"%Y-%Q\", TIMESTAMP(TimestampWeight.col0)) AS quarter,\n", + " SUM(TimestampWeight.col1) AS weight\n", + "FROM\n", + " t_1_TimestampWeight AS TimestampWeight\n", + "GROUP BY quarter;\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"6add367c-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"6ada4f66-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_3750565839" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"6adf81a2-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_26711cded1" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"6ae0049c-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id75_content_1\");\n", + "//# sourceURL=js_b2dff95646" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"6ae461e0-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"6ae0049c-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_bec277c371" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"6ae4c824-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id75\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_8ca1026463" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The following table is stored at \u001b[1mQuarterWeight\u001b[0m variable.\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
quarterweight
02001-11
12001-21
22001-32
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"6ae6eb68-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"6adf81a2-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_05988820da" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"6ae8c258-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"6ad598f4-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_a54d840fcb" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"6aeacbd4-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_402bf4ed3b" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"6aeb20de-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id74_content_1\");\n", + "//# sourceURL=js_a6022acd98" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"6aeb65b2-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"6aeb20de-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_2cc9e35121" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"6aeba748-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id74\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_f2f34fb3c2" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "image/svg+xml": "\n\n\n\n\n\nConcertina\n\n\n\nQuarterWeight\n\nQuarterWeight\n\n\n\n", + "text/plain": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Running predicate: QuarterWeight (1754 ms)\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"6c08c7fa-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"6aeacbd4-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_f5189ba2f0" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"6c0aad0e-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_d6408a98bf" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"6c0aff02-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id74_content_0\");\n", + "//# sourceURL=js_84c9467a21" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"6c0b5d1c-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"6c0aff02-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_9c8adcaed3" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"6c0bc298-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id74\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_57ae61824e" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"6c0cf370-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_c33b31ff5a" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"6c0d408c-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id75_content_1\");\n", + "//# sourceURL=js_bddcd7295a" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"6c0d9212-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"6c0d408c-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_3405f1c7e0" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"6c0dddee-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id75\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_78465e63a5" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"6c11fabe-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"6c0cf370-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_92fa3e8f08" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + " \n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"6c1397c0-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"6c0aad0e-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_d3af82422f" + ] + }, + "metadata": {} + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "4Rl4rBws_jbC" + }, + "source": [ + "### Assignment and Equality\n", + "\n", + "It is unusual that we are using the same operator `==` for both assignment and comparison.\n", + "\n", + "This happens because in Logica what `==` stands for is determined from the context.\n", + "\n", + "Consider a simple toy table T and a defined predicate DoubleT." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "FWQ2VRPICTjC", + "colab": { + "resources": { + "http://localhost:8080/nbextensions/google.colab/tabbar.css": { + "data": "Lmdvb2ctdGFie3Bvc2l0aW9uOnJlbGF0aXZlO3BhZGRpbmc6NHB4IDhweDtjb2xvcjojMDBjO3RleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7Y3Vyc29yOmRlZmF1bHR9Lmdvb2ctdGFiLWJhci10b3AgLmdvb2ctdGFie21hcmdpbjoxcHggNHB4IDAgMDtib3JkZXItYm90dG9tOjA7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLXRvcDphZnRlciwuZ29vZy10YWItYmFyLWJvdHRvbTphZnRlcntjb250ZW50OiIgIjtkaXNwbGF5OmJsb2NrO2hlaWdodDowO2NsZWFyOmJvdGg7dmlzaWJpbGl0eTpoaWRkZW59Lmdvb2ctdGFiLWJhci1ib3R0b20gLmdvb2ctdGFie21hcmdpbjowIDRweCAxcHggMDtib3JkZXItdG9wOjA7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLXN0YXJ0IC5nb29nLXRhYnttYXJnaW46MCAwIDRweCAxcHg7Ym9yZGVyLXJpZ2h0OjB9Lmdvb2ctdGFiLWJhci1lbmQgLmdvb2ctdGFie21hcmdpbjowIDFweCA0cHggMDtib3JkZXItbGVmdDowfS5nb29nLXRhYi1ob3ZlcntiYWNrZ3JvdW5kOiNlZWV9Lmdvb2ctdGFiLWRpc2FibGVke2NvbG9yOiM2NjZ9Lmdvb2ctdGFiLXNlbGVjdGVke2NvbG9yOiMwMDA7YmFja2dyb3VuZDojZmZmO3RleHQtZGVjb3JhdGlvbjpub25lO2ZvbnQtd2VpZ2h0OmJvbGQ7Ym9yZGVyOjFweCBzb2xpZCAjNmI5MGRhfS5nb29nLXRhYi1iYXItdG9we3BhZGRpbmctdG9wOjVweCFpbXBvcnRhbnQ7cGFkZGluZy1sZWZ0OjVweCFpbXBvcnRhbnQ7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgIzZiOTBkYSFpbXBvcnRhbnR9Lmdvb2ctdGFiLWJhci10b3AgLmdvb2ctdGFiLXNlbGVjdGVke3RvcDoxcHg7bWFyZ2luLXRvcDowO3BhZGRpbmctYm90dG9tOjVweH0uZ29vZy10YWItYmFyLWJvdHRvbSAuZ29vZy10YWItc2VsZWN0ZWR7dG9wOi0xcHg7bWFyZ2luLWJvdHRvbTowO3BhZGRpbmctdG9wOjVweH0uZ29vZy10YWItYmFyLXN0YXJ0IC5nb29nLXRhYi1zZWxlY3RlZHtsZWZ0OjFweDttYXJnaW4tbGVmdDowO3BhZGRpbmctcmlnaHQ6OXB4fS5nb29nLXRhYi1iYXItZW5kIC5nb29nLXRhYi1zZWxlY3RlZHtsZWZ0Oi0xcHg7bWFyZ2luLXJpZ2h0OjA7cGFkZGluZy1sZWZ0OjlweH0uZ29vZy10YWItYmFye21hcmdpbjowO2JvcmRlcjowO3BhZGRpbmc6MDtsaXN0LXN0eWxlOm5vbmU7Y3Vyc29yOmRlZmF1bHQ7b3V0bGluZTpub25lO2JhY2tncm91bmQ6I2ViZWZmOX0uZ29vZy10YWItYmFyLWNsZWFye2NsZWFyOmJvdGg7aGVpZ2h0OjA7b3ZlcmZsb3c6aGlkZGVufS5nb29nLXRhYi1iYXItc3RhcnR7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLWVuZHtmbG9hdDpyaWdodH0qIGh0bWwgLmdvb2ctdGFiLWJhci1zdGFydHttYXJnaW4tcmlnaHQ6LTNweH0qIGh0bWwgLmdvb2ctdGFiLWJhci1lbmR7bWFyZ2luLWxlZnQ6LTNweH1zZW50aW5lbHt9", + "ok": true, + "headers": [ + [ + "content-length", + "1404" + ], + [ + "content-type", + "text/css" + ] + ], + "status": 200, + "status_text": "" + }, + "http://localhost:8080/nbextensions/google.colab/tabbar_main.min.js": { + "data": "Ly8gY2xhbmctZm9ybWF0IG9mZgooZnVuY3Rpb24oKXt2YXIgZyxhYT1mdW5jdGlvbihhKXt2YXIgYj0wO3JldHVybiBmdW5jdGlvbigpe3JldHVybiBiPGEubGVuZ3RoP3tkb25lOiExLHZhbHVlOmFbYisrXX06e2RvbmU6ITB9fX0sYmE9dHlwZW9mIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzPT0iZnVuY3Rpb24iP09iamVjdC5kZWZpbmVQcm9wZXJ0eTpmdW5jdGlvbihhLGIsYyl7aWYoYT09QXJyYXkucHJvdG90eXBlfHxhPT1PYmplY3QucHJvdG90eXBlKXJldHVybiBhO2FbYl09Yy52YWx1ZTtyZXR1cm4gYX0sY2E9ZnVuY3Rpb24oYSl7YT1bIm9iamVjdCI9PXR5cGVvZiBnbG9iYWxUaGlzJiZnbG9iYWxUaGlzLGEsIm9iamVjdCI9PXR5cGVvZiB3aW5kb3cmJndpbmRvdywib2JqZWN0Ij09dHlwZW9mIHNlbGYmJnNlbGYsIm9iamVjdCI9PXR5cGVvZiBnbG9iYWwmJmdsb2JhbF07Zm9yKHZhciBiPTA7YjxhLmxlbmd0aDsrK2Ipe3ZhciBjPWFbYl07aWYoYyYmYy5NYXRoPT1NYXRoKXJldHVybiBjfXRocm93IEVycm9yKCJDYW5ub3QgZmluZCBnbG9iYWwgb2JqZWN0Iik7Cn0sZGE9Y2EodGhpcyksZWE9ZnVuY3Rpb24oYSxiKXtpZihiKWE6e3ZhciBjPWRhO2E9YS5zcGxpdCgiLiIpO2Zvcih2YXIgZD0wO2Q8YS5sZW5ndGgtMTtkKyspe3ZhciBlPWFbZF07aWYoIShlIGluIGMpKWJyZWFrIGE7Yz1jW2VdfWE9YVthLmxlbmd0aC0xXTtkPWNbYV07Yj1iKGQpO2IhPWQmJmIhPW51bGwmJmJhKGMsYSx7Y29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOmJ9KX19OwplYSgiU3ltYm9sIixmdW5jdGlvbihhKXtpZihhKXJldHVybiBhO3ZhciBiPWZ1bmN0aW9uKGYsaCl7dGhpcy5nPWY7YmEodGhpcywiZGVzY3JpcHRpb24iLHtjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6aH0pfTtiLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmd9O3ZhciBjPSJqc2NvbXBfc3ltYm9sXyIrKE1hdGgucmFuZG9tKCkqMUU5Pj4+MCkrIl8iLGQ9MCxlPWZ1bmN0aW9uKGYpe2lmKHRoaXMgaW5zdGFuY2VvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoIlN5bWJvbCBpcyBub3QgYSBjb25zdHJ1Y3RvciIpO3JldHVybiBuZXcgYihjKyhmfHwiIikrIl8iK2QrKyxmKX07cmV0dXJuIGV9KTsKdmFyIGZhPWZ1bmN0aW9uKGEpe3ZhciBiPXR5cGVvZiBTeW1ib2whPSJ1bmRlZmluZWQiJiZTeW1ib2wuaXRlcmF0b3ImJmFbU3ltYm9sLml0ZXJhdG9yXTtpZihiKXJldHVybiBiLmNhbGwoYSk7aWYodHlwZW9mIGEubGVuZ3RoPT0ibnVtYmVyIilyZXR1cm57bmV4dDphYShhKX07dGhyb3cgRXJyb3IoU3RyaW5nKGEpKyIgaXMgbm90IGFuIGl0ZXJhYmxlIG9yIEFycmF5TGlrZSIpO307ZWEoIlN5bWJvbC5kaXNwb3NlIixmdW5jdGlvbihhKXtyZXR1cm4gYT9hOlN5bWJvbCgiU3ltYm9sLmRpc3Bvc2UiKX0pOy8qCgogQ29weXJpZ2h0IFRoZSBDbG9zdXJlIExpYnJhcnkgQXV0aG9ycy4KIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wCiovCnZhciBsPXRoaXN8fHNlbGYsaWE9ZnVuY3Rpb24oYSl7YS5JYT12b2lkIDA7YS5WPWZ1bmN0aW9uKCl7cmV0dXJuIGEuSWE/YS5JYTphLklhPW5ldyBhfX0samE9ZnVuY3Rpb24oYSl7dmFyIGI9dHlwZW9mIGE7cmV0dXJuIGIhPSJvYmplY3QiP2I6YT9BcnJheS5pc0FycmF5KGEpPyJhcnJheSI6YjoibnVsbCJ9LGthPWZ1bmN0aW9uKGEpe3ZhciBiPWphKGEpO3JldHVybiBiPT0iYXJyYXkifHxiPT0ib2JqZWN0IiYmdHlwZW9mIGEubGVuZ3RoPT0ibnVtYmVyIn0sbT1mdW5jdGlvbihhKXt2YXIgYj10eXBlb2YgYTtyZXR1cm4gYj09Im9iamVjdCImJmEhPW51bGx8fGI9PSJmdW5jdGlvbiJ9LG5hPWZ1bmN0aW9uKGEpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYSxsYSkmJmFbbGFdfHwoYVtsYV09KyttYSl9LGxhPSJjbG9zdXJlX3VpZF8iKyhNYXRoLnJhbmRvbSgpKjFFOT4+PjApLG1hPTAsbj1mdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoKXt9Yy5wcm90b3R5cGU9CmIucHJvdG90eXBlO2EubD1iLnByb3RvdHlwZTthLnByb3RvdHlwZT1uZXcgYzthLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1hO2EucWQ9ZnVuY3Rpb24oZCxlLGYpe2Zvcih2YXIgaD1BcnJheShhcmd1bWVudHMubGVuZ3RoLTIpLGs9MjtrPGFyZ3VtZW50cy5sZW5ndGg7aysrKWhbay0yXT1hcmd1bWVudHNba107cmV0dXJuIGIucHJvdG90eXBlW2VdLmFwcGx5KGQsaCl9fTtmdW5jdGlvbiBvYShhLGIpe2lmKEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKUVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsb2EpO2Vsc2V7dmFyIGM9RXJyb3IoKS5zdGFjaztjJiYodGhpcy5zdGFjaz1jKX1hJiYodGhpcy5tZXNzYWdlPVN0cmluZyhhKSk7YiE9PXZvaWQgMCYmKHRoaXMuY2F1c2U9Yil9bihvYSxFcnJvcik7b2EucHJvdG90eXBlLm5hbWU9IkN1c3RvbUVycm9yIjt2YXIgcGE7ZnVuY3Rpb24gcWEoYSxiKXthPWEuc3BsaXQoIiVzIik7Zm9yKHZhciBjPSIiLGQ9YS5sZW5ndGgtMSxlPTA7ZTxkO2UrKyljKz1hW2VdKyhlPGIubGVuZ3RoP2JbZV06IiVzIik7b2EuY2FsbCh0aGlzLGMrYVtkXSl9bihxYSxvYSk7cWEucHJvdG90eXBlLm5hbWU9IkFzc2VydGlvbkVycm9yIjtmdW5jdGlvbiByYShhLGIsYyxkKXt2YXIgZT0iQXNzZXJ0aW9uIGZhaWxlZCI7aWYoYyl7ZSs9IjogIitjO3ZhciBmPWR9ZWxzZSBhJiYoZSs9IjogIithLGY9Yik7dGhyb3cgbmV3IHFhKCIiK2UsZnx8W10pO30KdmFyIHA9ZnVuY3Rpb24oYSxiLGMpe2F8fHJhKCIiLG51bGwsYixBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMikpO3JldHVybiBhfSxzYT1mdW5jdGlvbihhLGIsYyl7bShhKSYmYS5ub2RlVHlwZT09MXx8cmEoIkV4cGVjdGVkIEVsZW1lbnQgYnV0IGdvdCAlczogJXMuIixbamEoYSksYV0sYixBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMikpfSx1YT1mdW5jdGlvbihhLGIsYyxkKXthIGluc3RhbmNlb2YgYnx8cmEoIkV4cGVjdGVkIGluc3RhbmNlb2YgJXMgYnV0IGdvdCAlcy4iLFt0YShiKSx0YShhKV0sYyxBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMykpfTsKZnVuY3Rpb24gdGEoYSl7cmV0dXJuIGEgaW5zdGFuY2VvZiBGdW5jdGlvbj9hLmRpc3BsYXlOYW1lfHxhLm5hbWV8fCJ1bmtub3duIHR5cGUgbmFtZSI6YSBpbnN0YW5jZW9mIE9iamVjdD9hLmNvbnN0cnVjdG9yLmRpc3BsYXlOYW1lfHxhLmNvbnN0cnVjdG9yLm5hbWV8fE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhKTphPT09bnVsbD8ibnVsbCI6dHlwZW9mIGF9O3ZhciB2YT1BcnJheS5wcm90b3R5cGUuaW5kZXhPZj9mdW5jdGlvbihhLGIpe3AoYS5sZW5ndGghPW51bGwpO3JldHVybiBBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKGEsYix2b2lkIDApfTpmdW5jdGlvbihhLGIpe2lmKHR5cGVvZiBhPT09InN0cmluZyIpcmV0dXJuIHR5cGVvZiBiIT09InN0cmluZyJ8fGIubGVuZ3RoIT0xPy0xOmEuaW5kZXhPZihiLDApO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWlmKGMgaW4gYSYmYVtjXT09PWIpcmV0dXJuIGM7cmV0dXJuLTF9LHdhPUFycmF5LnByb3RvdHlwZS5mb3JFYWNoP2Z1bmN0aW9uKGEsYil7cChhLmxlbmd0aCE9bnVsbCk7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChhLGIsdm9pZCAwKX06ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9YS5sZW5ndGgsZD10eXBlb2YgYT09PSJzdHJpbmciP2Euc3BsaXQoIiIpOmEsZT0wO2U8YztlKyspZSBpbiBkJiZiLmNhbGwodm9pZCAwLGRbZV0sZSxhKX07CmZ1bmN0aW9uIHhhKGEsYil7Yj12YShhLGIpO3ZhciBjO2lmKGM9Yj49MClwKGEubGVuZ3RoIT1udWxsKSxBcnJheS5wcm90b3R5cGUuc3BsaWNlLmNhbGwoYSxiLDEpO3JldHVybiBjfWZ1bmN0aW9uIHlhKGEpe3ZhciBiPWEubGVuZ3RoO2lmKGI+MCl7Zm9yKHZhciBjPUFycmF5KGIpLGQ9MDtkPGI7ZCsrKWNbZF09YVtkXTtyZXR1cm4gY31yZXR1cm5bXX1mdW5jdGlvbiB6YShhLGIsYyxkKXtwKGEubGVuZ3RoIT1udWxsKTtBcnJheS5wcm90b3R5cGUuc3BsaWNlLmFwcGx5KGEsQWEoYXJndW1lbnRzLDEpKX1mdW5jdGlvbiBBYShhLGIsYyl7cChhLmxlbmd0aCE9bnVsbCk7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg8PTI/QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYSxiKTpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhLGIsYyl9O2Z1bmN0aW9uIEJhKGEsYixjKXtmb3IodmFyIGQgaW4gYSliLmNhbGwoYyxhW2RdLGQsYSl9ZnVuY3Rpb24gQ2EoYSxiKXtmb3IodmFyIGMgaW4gYSlpZihhW2NdPT1iKXJldHVybiEwO3JldHVybiExfWZ1bmN0aW9uIERhKGEsYixjKXtpZihhIT09bnVsbCYmYiBpbiBhKXRocm93IEVycm9yKCdUaGUgb2JqZWN0IGFscmVhZHkgY29udGFpbnMgdGhlIGtleSAiJytiKyciJyk7YVtiXT1jfWZ1bmN0aW9uIEVhKGEpe3ZhciBiPXt9LGM7Zm9yKGMgaW4gYSliW2FbY11dPWM7cmV0dXJuIGJ9dmFyIEZhPSJjb25zdHJ1Y3RvciBoYXNPd25Qcm9wZXJ0eSBpc1Byb3RvdHlwZU9mIHByb3BlcnR5SXNFbnVtZXJhYmxlIHRvTG9jYWxlU3RyaW5nIHRvU3RyaW5nIHZhbHVlT2YiLnNwbGl0KCIgIik7CmZ1bmN0aW9uIEdhKGEsYil7Zm9yKHZhciBjLGQsZT0xO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspe2Q9YXJndW1lbnRzW2VdO2ZvcihjIGluIGQpYVtjXT1kW2NdO2Zvcih2YXIgZj0wO2Y8RmEubGVuZ3RoO2YrKyljPUZhW2ZdLE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChkLGMpJiYoYVtjXT1kW2NdKX19O3ZhciBIYT1TdHJpbmcucHJvdG90eXBlLnRyaW0/ZnVuY3Rpb24oYSl7cmV0dXJuIGEudHJpbSgpfTpmdW5jdGlvbihhKXtyZXR1cm4vXltcc1x4YTBdKihbXHNcU10qPylbXHNceGEwXSokLy5leGVjKGEpWzFdfTsvKgoKIENvcHlyaWdodCBHb29nbGUgTExDCiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMAoqLwp2YXIgSWE9e307dmFyIEphPWZ1bmN0aW9uKGEpe2lmKElhIT09SWEpdGhyb3cgRXJyb3IoIkJhZCBzZWNyZXQiKTt0aGlzLmc9YX07SmEucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ307bmV3IEphKCJhYm91dDpibGFuayIpO25ldyBKYSgiYWJvdXQ6aW52YWxpZCN6Q2xvc3VyZXoiKTt2YXIgS2E9W10sTGE9ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJBIFVSTCB3aXRoIGNvbnRlbnQgJyIrYSsiJyB3YXMgc2FuaXRpemVkIGF3YXkuIil9O0thLmluZGV4T2YoTGEpPT09LTEmJkthLnB1c2goTGEpO3ZhciBNYSxOYTthOntmb3IodmFyIE9hPVsiQ0xPU1VSRV9GTEFHUyJdLFBhPWwsUWE9MDtRYTxPYS5sZW5ndGg7UWErKylpZihQYT1QYVtPYVtRYV1dLFBhPT1udWxsKXtOYT1udWxsO2JyZWFrIGF9TmE9UGF9dmFyIFJhPU5hJiZOYVs2MTA0MDEzMDFdO01hPVJhIT1udWxsP1JhOiExO2Z1bmN0aW9uIFNhKCl7dmFyIGE9bC5uYXZpZ2F0b3I7cmV0dXJuIGEmJihhPWEudXNlckFnZW50KT9hOiIifXZhciBUYSxVYT1sLm5hdmlnYXRvcjtUYT1VYT9VYS51c2VyQWdlbnREYXRhfHxudWxsOm51bGw7ZnVuY3Rpb24gcihhKXtyZXR1cm4gU2EoKS5pbmRleE9mKGEpIT0tMX07dmFyIFZhPXIoIkVkZ2UiKSx0PXIoIkdlY2tvIikmJiEoU2EoKS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoIndlYmtpdCIpIT0tMSYmIXIoIkVkZ2UiKSkmJiEocigiVHJpZGVudCIpfHxyKCJNU0lFIikpJiYhcigiRWRnZSIpLHU9U2EoKS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoIndlYmtpdCIpIT0tMSYmIXIoIkVkZ2UiKSx2PU1hJiZUYSYmVGEucGxhdGZvcm0/VGEucGxhdGZvcm09PT0ibWFjT1MiOnIoIk1hY2ludG9zaCIpO3ZhciBYYT1mdW5jdGlvbihhLGIpe0JhKGIsZnVuY3Rpb24oYyxkKXtkPT0ic3R5bGUiP2Euc3R5bGUuY3NzVGV4dD1jOmQ9PSJjbGFzcyI/YS5jbGFzc05hbWU9YzpkPT0iZm9yIj9hLmh0bWxGb3I9YzpXYS5oYXNPd25Qcm9wZXJ0eShkKT9hLnNldEF0dHJpYnV0ZShXYVtkXSxjKTpkLmxhc3RJbmRleE9mKCJhcmlhLSIsMCk9PTB8fGQubGFzdEluZGV4T2YoImRhdGEtIiwwKT09MD9hLnNldEF0dHJpYnV0ZShkLGMpOmFbZF09Y30pfSxXYT17Y2VsbHBhZGRpbmc6ImNlbGxQYWRkaW5nIixjZWxsc3BhY2luZzoiY2VsbFNwYWNpbmciLGNvbHNwYW46ImNvbFNwYW4iLGZyYW1lYm9yZGVyOiJmcmFtZUJvcmRlciIsaGVpZ2h0OiJoZWlnaHQiLG1heGxlbmd0aDoibWF4TGVuZ3RoIixub25jZToibm9uY2UiLHJvbGU6InJvbGUiLHJvd3NwYW46InJvd1NwYW4iLHR5cGU6InR5cGUiLHVzZW1hcDoidXNlTWFwIix2YWxpZ246InZBbGlnbiIsd2lkdGg6IndpZHRoIn0sWWE9ZnVuY3Rpb24oYSwKYixjKXtmdW5jdGlvbiBkKGspe2smJmIuYXBwZW5kQ2hpbGQodHlwZW9mIGs9PT0ic3RyaW5nIj9hLmNyZWF0ZVRleHROb2RlKGspOmspfWZvcih2YXIgZT0yO2U8Yy5sZW5ndGg7ZSsrKXt2YXIgZj1jW2VdO2lmKCFrYShmKXx8bShmKSYmZi5ub2RlVHlwZT4wKWQoZik7ZWxzZXthOntpZihmJiZ0eXBlb2YgZi5sZW5ndGg9PSJudW1iZXIiKXtpZihtKGYpKXt2YXIgaD10eXBlb2YgZi5pdGVtPT0iZnVuY3Rpb24ifHx0eXBlb2YgZi5pdGVtPT0ic3RyaW5nIjticmVhayBhfWlmKHR5cGVvZiBmPT09ImZ1bmN0aW9uIil7aD10eXBlb2YgZi5pdGVtPT0iZnVuY3Rpb24iO2JyZWFrIGF9fWg9ITF9d2EoaD95YShmKTpmLGQpfX19LFphPWZ1bmN0aW9uKGEsYil7Yj1TdHJpbmcoYik7YS5jb250ZW50VHlwZT09PSJhcHBsaWNhdGlvbi94aHRtbCt4bWwiJiYoYj1iLnRvTG93ZXJDYXNlKCkpO3JldHVybiBhLmNyZWF0ZUVsZW1lbnQoYil9LCRhPWZ1bmN0aW9uKGEpe2EmJmEucGFyZW50Tm9kZSYmCmEucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhKX0sYWI9ZnVuY3Rpb24oYSxiKXtpZighYXx8IWIpcmV0dXJuITE7aWYoYS5jb250YWlucyYmYi5ub2RlVHlwZT09MSlyZXR1cm4gYT09Ynx8YS5jb250YWlucyhiKTtpZih0eXBlb2YgYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiE9InVuZGVmaW5lZCIpcmV0dXJuIGE9PWJ8fCEhKGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24oYikmMTYpO2Zvcig7YiYmYSE9YjspYj1iLnBhcmVudE5vZGU7cmV0dXJuIGI9PWF9LGJiPWZ1bmN0aW9uKGEpe3AoYSwiTm9kZSBjYW5ub3QgYmUgbnVsbCBvciB1bmRlZmluZWQuIik7cmV0dXJuIGEubm9kZVR5cGU9PTk/YTphLm93bmVyRG9jdW1lbnR8fGEuZG9jdW1lbnR9LGNiPWZ1bmN0aW9uKGEsYil7Yj9hLnRhYkluZGV4PTA6KGEudGFiSW5kZXg9LTEsYS5yZW1vdmVBdHRyaWJ1dGUoInRhYkluZGV4IikpfSxkYj1mdW5jdGlvbihhKXtyZXR1cm4gYS5oYXNBdHRyaWJ1dGUoInRhYmluZGV4Iil9LGViPQpmdW5jdGlvbihhKXthPWEudGFiSW5kZXg7cmV0dXJuIHR5cGVvZiBhPT09Im51bWJlciImJmE+PTAmJmE8MzI3Njh9LGZiPWZ1bmN0aW9uKGEpe3RoaXMuZz1hfHxsLmRvY3VtZW50fHxkb2N1bWVudH07ZmIucHJvdG90eXBlLmk9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nO3JldHVybiB0eXBlb2YgYT09PSJzdHJpbmciP2IuZ2V0RWxlbWVudEJ5SWQoYSk6YX07ZmIucHJvdG90eXBlLmg9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXMuZyxlPWFyZ3VtZW50cyxmPWVbMV0saD1aYShkLFN0cmluZyhlWzBdKSk7ZiYmKHR5cGVvZiBmPT09InN0cmluZyI/aC5jbGFzc05hbWU9ZjpBcnJheS5pc0FycmF5KGYpP2guY2xhc3NOYW1lPWYuam9pbigiICIpOlhhKGgsZikpO2UubGVuZ3RoPjImJllhKGQsaCxlKTtyZXR1cm4gaH07dmFyIHc9ZnVuY3Rpb24oKXt0aGlzLmJhPXRoaXMuYmE7dGhpcy5rYT10aGlzLmthfTt3LnByb3RvdHlwZS5iYT0hMTt3LnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7dGhpcy5iYXx8KHRoaXMuYmE9ITAsdGhpcy5DKCkpfTt3LnByb3RvdHlwZVtTeW1ib2wuZGlzcG9zZV09ZnVuY3Rpb24oKXt0aGlzLmRpc3Bvc2UoKX07dy5wcm90b3R5cGUuQz1mdW5jdGlvbigpe2lmKHRoaXMua2EpZm9yKDt0aGlzLmthLmxlbmd0aDspdGhpcy5rYS5zaGlmdCgpKCl9O3ZhciB5PWZ1bmN0aW9uKGEsYil7dGhpcy50eXBlPWE7dGhpcy51PXRoaXMudGFyZ2V0PWI7dGhpcy5kZWZhdWx0UHJldmVudGVkPXRoaXMuQT0hMX07eS5wcm90b3R5cGUudj1mdW5jdGlvbigpe3RoaXMuQT0hMH07eS5wcm90b3R5cGUuaj1mdW5jdGlvbigpe3RoaXMuZGVmYXVsdFByZXZlbnRlZD0hMH07dmFyIGdiPWZ1bmN0aW9uKCl7aWYoIWwuYWRkRXZlbnRMaXN0ZW5lcnx8IU9iamVjdC5kZWZpbmVQcm9wZXJ0eSlyZXR1cm4hMTt2YXIgYT0hMSxiPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwicGFzc2l2ZSIse2dldDpmdW5jdGlvbigpe2E9ITB9fSk7dHJ5e3ZhciBjPWZ1bmN0aW9uKCl7fTtsLmFkZEV2ZW50TGlzdGVuZXIoInRlc3QiLGMsYik7bC5yZW1vdmVFdmVudExpc3RlbmVyKCJ0ZXN0IixjLGIpfWNhdGNoKGQpe31yZXR1cm4gYX0oKTt2YXIgej1mdW5jdGlvbihhLGIpe3kuY2FsbCh0aGlzLGE/YS50eXBlOiIiKTt0aGlzLnJlbGF0ZWRUYXJnZXQ9dGhpcy51PXRoaXMudGFyZ2V0PW51bGw7dGhpcy5idXR0b249dGhpcy5zY3JlZW5ZPXRoaXMuc2NyZWVuWD10aGlzLmNsaWVudFk9dGhpcy5jbGllbnRYPTA7dGhpcy5rZXk9IiI7dGhpcy5nPTA7dGhpcy5tZXRhS2V5PXRoaXMuc2hpZnRLZXk9dGhpcy5hbHRLZXk9dGhpcy5jdHJsS2V5PSExO3RoaXMuc3RhdGU9bnVsbDt0aGlzLkc9ITE7dGhpcy5wb2ludGVySWQ9MDt0aGlzLnBvaW50ZXJUeXBlPSIiO3RoaXMudGltZVN0YW1wPTA7dGhpcy5oPW51bGw7aWYoYSl7dmFyIGM9dGhpcy50eXBlPWEudHlwZSxkPWEuY2hhbmdlZFRvdWNoZXMmJmEuY2hhbmdlZFRvdWNoZXMubGVuZ3RoP2EuY2hhbmdlZFRvdWNoZXNbMF06bnVsbDt0aGlzLnRhcmdldD1hLnRhcmdldHx8YS5zcmNFbGVtZW50O3RoaXMudT1iO2I9YS5yZWxhdGVkVGFyZ2V0O2J8fChjPT0ibW91c2VvdmVyIj8KYj1hLmZyb21FbGVtZW50OmM9PSJtb3VzZW91dCImJihiPWEudG9FbGVtZW50KSk7dGhpcy5yZWxhdGVkVGFyZ2V0PWI7ZD8odGhpcy5jbGllbnRYPWQuY2xpZW50WCE9PXZvaWQgMD9kLmNsaWVudFg6ZC5wYWdlWCx0aGlzLmNsaWVudFk9ZC5jbGllbnRZIT09dm9pZCAwP2QuY2xpZW50WTpkLnBhZ2VZLHRoaXMuc2NyZWVuWD1kLnNjcmVlblh8fDAsdGhpcy5zY3JlZW5ZPWQuc2NyZWVuWXx8MCk6KHRoaXMuY2xpZW50WD1hLmNsaWVudFghPT12b2lkIDA/YS5jbGllbnRYOmEucGFnZVgsdGhpcy5jbGllbnRZPWEuY2xpZW50WSE9PXZvaWQgMD9hLmNsaWVudFk6YS5wYWdlWSx0aGlzLnNjcmVlblg9YS5zY3JlZW5YfHwwLHRoaXMuc2NyZWVuWT1hLnNjcmVlbll8fDApO3RoaXMuYnV0dG9uPWEuYnV0dG9uO3RoaXMuZz1hLmtleUNvZGV8fDA7dGhpcy5rZXk9YS5rZXl8fCIiO3RoaXMuY3RybEtleT1hLmN0cmxLZXk7dGhpcy5hbHRLZXk9YS5hbHRLZXk7dGhpcy5zaGlmdEtleT1hLnNoaWZ0S2V5Owp0aGlzLm1ldGFLZXk9YS5tZXRhS2V5O3RoaXMuRz12P2EubWV0YUtleTphLmN0cmxLZXk7dGhpcy5wb2ludGVySWQ9YS5wb2ludGVySWR8fDA7dGhpcy5wb2ludGVyVHlwZT1hLnBvaW50ZXJUeXBlO3RoaXMuc3RhdGU9YS5zdGF0ZTt0aGlzLnRpbWVTdGFtcD1hLnRpbWVTdGFtcDt0aGlzLmg9YTthLmRlZmF1bHRQcmV2ZW50ZWQmJnoubC5qLmNhbGwodGhpcyl9fTtuKHoseSk7ei5wcm90b3R5cGUudj1mdW5jdGlvbigpe3oubC52LmNhbGwodGhpcyk7dGhpcy5oLnN0b3BQcm9wYWdhdGlvbj90aGlzLmguc3RvcFByb3BhZ2F0aW9uKCk6dGhpcy5oLmNhbmNlbEJ1YmJsZT0hMH07ei5wcm90b3R5cGUuaj1mdW5jdGlvbigpe3oubC5qLmNhbGwodGhpcyk7dmFyIGE9dGhpcy5oO2EucHJldmVudERlZmF1bHQ/YS5wcmV2ZW50RGVmYXVsdCgpOmEucmV0dXJuVmFsdWU9ITF9O3ZhciBoYj0iY2xvc3VyZV9saXN0ZW5hYmxlXyIrKE1hdGgucmFuZG9tKCkqMUU2fDApLGliPWZ1bmN0aW9uKGEpe3JldHVybiEoIWF8fCFhW2hiXSl9O3ZhciBqYj0wO3ZhciBrYj1mdW5jdGlvbihhLGIsYyxkLGUpe3RoaXMubGlzdGVuZXI9YTt0aGlzLnByb3h5PW51bGw7dGhpcy5zcmM9Yjt0aGlzLnR5cGU9Yzt0aGlzLmNhcHR1cmU9ISFkO3RoaXMucGE9ZTt0aGlzLmtleT0rK2piO3RoaXMuamE9dGhpcy5vYT0hMX0sbGI9ZnVuY3Rpb24oYSl7YS5qYT0hMDthLmxpc3RlbmVyPW51bGw7YS5wcm94eT1udWxsO2Euc3JjPW51bGw7YS5wYT1udWxsfTt2YXIgbWI9ZnVuY3Rpb24oYSl7dGhpcy5zcmM9YTt0aGlzLmc9e307dGhpcy5oPTB9O21iLnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZj1hLnRvU3RyaW5nKCk7YT10aGlzLmdbZl07YXx8KGE9dGhpcy5nW2ZdPVtdLHRoaXMuaCsrKTt2YXIgaD1uYihhLGIsZCxlKTtoPi0xPyhiPWFbaF0sY3x8KGIub2E9ITEpKTooYj1uZXcga2IoYix0aGlzLnNyYyxmLCEhZCxlKSxiLm9hPWMsYS5wdXNoKGIpKTtyZXR1cm4gYn07CnZhciBvYj1mdW5jdGlvbihhLGIpe3ZhciBjPWIudHlwZTtjIGluIGEuZyYmeGEoYS5nW2NdLGIpJiYobGIoYiksYS5nW2NdLmxlbmd0aD09MCYmKGRlbGV0ZSBhLmdbY10sYS5oLS0pKX0scGI9ZnVuY3Rpb24oYSxiLGMsZCxlKXthPWEuZ1tiLnRvU3RyaW5nKCldO2I9LTE7YSYmKGI9bmIoYSxjLGQsZSkpO3JldHVybiBiPi0xP2FbYl06bnVsbH0sbmI9ZnVuY3Rpb24oYSxiLGMsZCl7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDsrK2Upe3ZhciBmPWFbZV07aWYoIWYuamEmJmYubGlzdGVuZXI9PWImJmYuY2FwdHVyZT09ISFjJiZmLnBhPT1kKXJldHVybiBlfXJldHVybi0xfTt2YXIgcWI9ImNsb3N1cmVfbG1fIisoTWF0aC5yYW5kb20oKSoxRTZ8MCkscmI9e30sc2I9MCx1Yj1mdW5jdGlvbihhLGIsYyxkLGUpe2lmKGQmJmQub25jZSlyZXR1cm4gdGIoYSxiLGMsZCxlKTtpZihBcnJheS5pc0FycmF5KGIpKXtmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKyl1YihhLGJbZl0sYyxkLGUpO3JldHVybiBudWxsfWM9dmIoYyk7cmV0dXJuIGliKGEpP3diKGEsYixjLG0oZCk/ISFkLmNhcHR1cmU6ISFkLGUpOnhiKGEsYixjLCExLGQsZSl9LHhiPWZ1bmN0aW9uKGEsYixjLGQsZSxmKXtpZighYil0aHJvdyBFcnJvcigiSW52YWxpZCBldmVudCB0eXBlIik7dmFyIGg9bShlKT8hIWUuY2FwdHVyZTohIWUsaz15YihhKTtrfHwoYVtxYl09az1uZXcgbWIoYSkpO2M9ay5hZGQoYixjLGQsaCxmKTtpZihjLnByb3h5KXJldHVybiBjO2Q9emIoKTtjLnByb3h5PWQ7ZC5zcmM9YTtkLmxpc3RlbmVyPWM7aWYoYS5hZGRFdmVudExpc3RlbmVyKWdifHwoZT1oKSxlPT09dm9pZCAwJiYKKGU9ITEpLGEuYWRkRXZlbnRMaXN0ZW5lcihiLnRvU3RyaW5nKCksZCxlKTtlbHNlIGlmKGEuYXR0YWNoRXZlbnQpYS5hdHRhY2hFdmVudChBYihiLnRvU3RyaW5nKCkpLGQpO2Vsc2UgaWYoYS5hZGRMaXN0ZW5lciYmYS5yZW1vdmVMaXN0ZW5lcilwKGI9PT0iY2hhbmdlIiwiTWVkaWFRdWVyeUxpc3Qgb25seSBoYXMgYSBjaGFuZ2UgZXZlbnQiKSxhLmFkZExpc3RlbmVyKGQpO2Vsc2UgdGhyb3cgRXJyb3IoImFkZEV2ZW50TGlzdGVuZXIgYW5kIGF0dGFjaEV2ZW50IGFyZSB1bmF2YWlsYWJsZS4iKTtzYisrO3JldHVybiBjfSx6Yj1mdW5jdGlvbigpe3ZhciBhPUJiLGI9ZnVuY3Rpb24oYyl7cmV0dXJuIGEuY2FsbChiLnNyYyxiLmxpc3RlbmVyLGMpfTtyZXR1cm4gYn0sdGI9ZnVuY3Rpb24oYSxiLGMsZCxlKXtpZihBcnJheS5pc0FycmF5KGIpKXtmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKyl0YihhLGJbZl0sYyxkLGUpO3JldHVybiBudWxsfWM9dmIoYyk7cmV0dXJuIGliKGEpPwphLkEuYWRkKFN0cmluZyhiKSxjLCEwLG0oZCk/ISFkLmNhcHR1cmU6ISFkLGUpOnhiKGEsYixjLCEwLGQsZSl9LENiPWZ1bmN0aW9uKGEsYixjLGQsZSl7aWYoQXJyYXkuaXNBcnJheShiKSlmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKylDYihhLGJbZl0sYyxkLGUpO2Vsc2UgZD1tKGQpPyEhZC5jYXB0dXJlOiEhZCxjPXZiKGMpLGliKGEpPyhhPWEuQSxiPVN0cmluZyhiKS50b1N0cmluZygpLGIgaW4gYS5nJiYoZj1hLmdbYl0sYz1uYihmLGMsZCxlKSxjPi0xJiYobGIoZltjXSkscChmLmxlbmd0aCE9bnVsbCksQXJyYXkucHJvdG90eXBlLnNwbGljZS5jYWxsKGYsYywxKSxmLmxlbmd0aD09MCYmKGRlbGV0ZSBhLmdbYl0sYS5oLS0pKSkpOmEmJihhPXliKGEpKSYmKGM9cGIoYSxiLGMsZCxlKSkmJkEoYyl9LEE9ZnVuY3Rpb24oYSl7aWYodHlwZW9mIGEhPT0ibnVtYmVyIiYmYSYmIWEuamEpe3ZhciBiPWEuc3JjO2lmKGliKGIpKW9iKGIuQSxhKTtlbHNle3ZhciBjPWEudHlwZSwKZD1hLnByb3h5O2IucmVtb3ZlRXZlbnRMaXN0ZW5lcj9iLnJlbW92ZUV2ZW50TGlzdGVuZXIoYyxkLGEuY2FwdHVyZSk6Yi5kZXRhY2hFdmVudD9iLmRldGFjaEV2ZW50KEFiKGMpLGQpOmIuYWRkTGlzdGVuZXImJmIucmVtb3ZlTGlzdGVuZXImJmIucmVtb3ZlTGlzdGVuZXIoZCk7c2ItLTsoYz15YihiKSk/KG9iKGMsYSksYy5oPT0wJiYoYy5zcmM9bnVsbCxiW3FiXT1udWxsKSk6bGIoYSl9fX0sQWI9ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW4gcmI/cmJbYV06cmJbYV09Im9uIithfSxCYj1mdW5jdGlvbihhLGIpe2lmKGEuamEpYT0hMDtlbHNle2I9bmV3IHooYix0aGlzKTt2YXIgYz1hLmxpc3RlbmVyLGQ9YS5wYXx8YS5zcmM7YS5vYSYmQShhKTthPWMuY2FsbChkLGIpfXJldHVybiBhfSx5Yj1mdW5jdGlvbihhKXthPWFbcWJdO3JldHVybiBhIGluc3RhbmNlb2YgbWI/YTpudWxsfSxEYj0iX19jbG9zdXJlX2V2ZW50c19mbl8iKyhNYXRoLnJhbmRvbSgpKjFFOT4+PjApLHZiPWZ1bmN0aW9uKGEpe3AoYSwKIkxpc3RlbmVyIGNhbiBub3QgYmUgbnVsbC4iKTtpZih0eXBlb2YgYT09PSJmdW5jdGlvbiIpcmV0dXJuIGE7cChhLmhhbmRsZUV2ZW50LCJBbiBvYmplY3QgbGlzdGVuZXIgbXVzdCBoYXZlIGhhbmRsZUV2ZW50IG1ldGhvZC4iKTthW0RiXXx8KGFbRGJdPWZ1bmN0aW9uKGIpe3JldHVybiBhLmhhbmRsZUV2ZW50KGIpfSk7cmV0dXJuIGFbRGJdfTt2YXIgRWI9ZnVuY3Rpb24oYSl7dy5jYWxsKHRoaXMpO3RoaXMuaD1hO3RoaXMuZz17fX07bihFYix3KTsKdmFyIEZiPVtdLEI9ZnVuY3Rpb24oYSxiLGMsZCl7QXJyYXkuaXNBcnJheShjKXx8KGMmJihGYlswXT1jLnRvU3RyaW5nKCkpLGM9RmIpO2Zvcih2YXIgZT0wO2U8Yy5sZW5ndGg7ZSsrKXt2YXIgZj11YihiLGNbZV0sZHx8YS5oYW5kbGVFdmVudCwhMSxhLmh8fGEpO2lmKCFmKWJyZWFrO2EuZ1tmLmtleV09Zn1yZXR1cm4gYX0sQz1mdW5jdGlvbihhLGIsYyxkLGUsZil7aWYoQXJyYXkuaXNBcnJheShjKSlmb3IodmFyIGg9MDtoPGMubGVuZ3RoO2grKylDKGEsYixjW2hdLGQsZSxmKTtlbHNlIGQ9ZHx8YS5oYW5kbGVFdmVudCxlPW0oZSk/ISFlLmNhcHR1cmU6ISFlLGY9Znx8YS5ofHxhLGQ9dmIoZCksZT0hIWUsYz1pYihiKT9wYihiLkEsU3RyaW5nKGMpLGQsZSxmKTpiPyhiPXliKGIpKT9wYihiLGMsZCxlLGYpOm51bGw6bnVsbCxjJiYoQShjKSxkZWxldGUgYS5nW2Mua2V5XSk7cmV0dXJuIGF9LEdiPWZ1bmN0aW9uKGEpe0JhKGEuZyxmdW5jdGlvbihiLGMpe3RoaXMuZy5oYXNPd25Qcm9wZXJ0eShjKSYmCkEoYil9LGEpO2EuZz17fX07RWIucHJvdG90eXBlLkM9ZnVuY3Rpb24oKXtFYi5sLkMuY2FsbCh0aGlzKTtHYih0aGlzKX07RWIucHJvdG90eXBlLmhhbmRsZUV2ZW50PWZ1bmN0aW9uKCl7dGhyb3cgRXJyb3IoIkV2ZW50SGFuZGxlci5oYW5kbGVFdmVudCBub3QgaW1wbGVtZW50ZWQiKTt9O3ZhciBEPWZ1bmN0aW9uKCl7dy5jYWxsKHRoaXMpO3RoaXMuQT1uZXcgbWIodGhpcyk7dGhpcy5ZYT10aGlzO3RoaXMubGE9bnVsbH07bihELHcpO0QucHJvdG90eXBlW2hiXT0hMDtELnByb3RvdHlwZS5BYT1mdW5jdGlvbihhKXt0aGlzLmxhPWF9O0QucHJvdG90eXBlLnJlbW92ZUV2ZW50TGlzdGVuZXI9ZnVuY3Rpb24oYSxiLGMsZCl7Q2IodGhpcyxhLGIsYyxkKX07CnZhciBFPWZ1bmN0aW9uKGEsYil7SGIoYSk7dmFyIGM9YS5sYTtpZihjKXt2YXIgZD1bXTtmb3IodmFyIGU9MTtjO2M9Yy5sYSlkLnB1c2goYykscCgrK2U8MUUzLCJpbmZpbml0ZSBsb29wIil9YT1hLllhO2M9Yi50eXBlfHxiO3R5cGVvZiBiPT09InN0cmluZyI/Yj1uZXcgeShiLGEpOmIgaW5zdGFuY2VvZiB5P2IudGFyZ2V0PWIudGFyZ2V0fHxhOihlPWIsYj1uZXcgeShjLGEpLEdhKGIsZSkpO2U9ITA7dmFyIGY7aWYoZClmb3IoZj1kLmxlbmd0aC0xOyFiLkEmJmY+PTA7Zi0tKXt2YXIgaD1iLnU9ZFtmXTtlPUliKGgsYywhMCxiKSYmZX1iLkF8fChoPWIudT1hLGU9SWIoaCxjLCEwLGIpJiZlLGIuQXx8KGU9SWIoaCxjLCExLGIpJiZlKSk7aWYoZClmb3IoZj0wOyFiLkEmJmY8ZC5sZW5ndGg7ZisrKWg9Yi51PWRbZl0sZT1JYihoLGMsITEsYikmJmU7cmV0dXJuIGV9OwpELnByb3RvdHlwZS5DPWZ1bmN0aW9uKCl7RC5sLkMuY2FsbCh0aGlzKTtpZih0aGlzLkEpe3ZhciBhPXRoaXMuQSxiPTAsYztmb3IoYyBpbiBhLmcpe2Zvcih2YXIgZD1hLmdbY10sZT0wO2U8ZC5sZW5ndGg7ZSsrKSsrYixsYihkW2VdKTtkZWxldGUgYS5nW2NdO2EuaC0tfX10aGlzLmxhPW51bGx9O3ZhciB3Yj1mdW5jdGlvbihhLGIsYyxkLGUpe0hiKGEpO3JldHVybiBhLkEuYWRkKFN0cmluZyhiKSxjLCExLGQsZSl9LEliPWZ1bmN0aW9uKGEsYixjLGQpe2I9YS5BLmdbU3RyaW5nKGIpXTtpZighYilyZXR1cm4hMDtiPWIuY29uY2F0KCk7Zm9yKHZhciBlPSEwLGY9MDtmPGIubGVuZ3RoOysrZil7dmFyIGg9YltmXTtpZihoJiYhaC5qYSYmaC5jYXB0dXJlPT1jKXt2YXIgaz1oLmxpc3RlbmVyLHE9aC5wYXx8aC5zcmM7aC5vYSYmb2IoYS5BLGgpO2U9ay5jYWxsKHEsZCkhPT0hMSYmZX19cmV0dXJuIGUmJiFkLmRlZmF1bHRQcmV2ZW50ZWR9LEhiPWZ1bmN0aW9uKGEpe3AoYS5BLCJFdmVudCB0YXJnZXQgaXMgbm90IGluaXRpYWxpemVkLiBEaWQgeW91IGNhbGwgdGhlIHN1cGVyY2xhc3MgKGdvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0KSBjb25zdHJ1Y3Rvcj8iKX07dmFyIEpiPXQ/Ik1velVzZXJTZWxlY3QiOnV8fFZhPyJXZWJraXRVc2VyU2VsZWN0IjpudWxsLEtiPWZ1bmN0aW9uKGEsYil7Yj1iP251bGw6YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpO2lmKEpiJiYoYS5zdHlsZSYmKGEuc3R5bGVbSmJdPSJub25lIiksYikpZm9yKHZhciBjPTA7YT1iW2NdO2MrKylhLnN0eWxlJiYoYS5zdHlsZVtKYl09Im5vbmUiKX07dmFyIExiPWZ1bmN0aW9uKCl7fTtpYShMYik7TGIucHJvdG90eXBlLmc9MDt2YXIgRj1mdW5jdGlvbihhKXtELmNhbGwodGhpcyk7dGhpcy5HPWF8fHBhfHwocGE9bmV3IGZiKTt0aGlzLnphPU1iO3RoaXMuWT1udWxsO3RoaXMucz0hMTt0aGlzLmc9bnVsbDt0aGlzLk09dm9pZCAwO3RoaXMudT10aGlzLmo9dGhpcy5oPW51bGw7dGhpcy5TYT0hMX07bihGLEQpO0YucHJvdG90eXBlLlphPUxiLlYoKTsKdmFyIE1iPW51bGwsTmI9ZnVuY3Rpb24oYSxiKXtzd2l0Y2goYSl7Y2FzZSAxOnJldHVybiBiPyJkaXNhYmxlIjoiZW5hYmxlIjtjYXNlIDI6cmV0dXJuIGI/ImhpZ2hsaWdodCI6InVuaGlnaGxpZ2h0IjtjYXNlIDQ6cmV0dXJuIGI/ImFjdGl2YXRlIjoiZGVhY3RpdmF0ZSI7Y2FzZSA4OnJldHVybiBiPyJzZWxlY3QiOiJ1bnNlbGVjdCI7Y2FzZSAxNjpyZXR1cm4gYj8iY2hlY2siOiJ1bmNoZWNrIjtjYXNlIDMyOnJldHVybiBiPyJmb2N1cyI6ImJsdXIiO2Nhc2UgNjQ6cmV0dXJuIGI/Im9wZW4iOiJjbG9zZSJ9dGhyb3cgRXJyb3IoIkludmFsaWQgY29tcG9uZW50IHN0YXRlIik7fSxPYj1mdW5jdGlvbihhKXtyZXR1cm4gYS5ZfHwoYS5ZPSI6IisoYS5aYS5nKyspLnRvU3RyaW5nKDM2KSl9LFBiPWZ1bmN0aW9uKGEsYil7aWYoYS5oJiZhLmgudSl7dmFyIGM9YS5oLnUsZD1hLlk7ZCBpbiBjJiZkZWxldGUgY1tkXTtEYShhLmgudSxiLGEpfWEuWT1ifTtGLnByb3RvdHlwZS5pPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ307CnZhciBRYj1mdW5jdGlvbihhKXthLk18fChhLk09bmV3IEViKGEpKTtyZXR1cm4gcChhLk0pfTtGLnByb3RvdHlwZS5BYT1mdW5jdGlvbihhKXtpZih0aGlzLmgmJnRoaXMuaCE9YSl0aHJvdyBFcnJvcigiTWV0aG9kIG5vdCBzdXBwb3J0ZWQiKTtGLmwuQWEuY2FsbCh0aGlzLGEpfTtGLnByb3RvdHlwZS5tYT1mdW5jdGlvbigpe3RoaXMuZz1aYSh0aGlzLkcuZywiRElWIil9O0YucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbihhKXtSYih0aGlzLGEpfTsKdmFyIFJiPWZ1bmN0aW9uKGEsYixjKXtpZihhLnMpdGhyb3cgRXJyb3IoIkNvbXBvbmVudCBhbHJlYWR5IHJlbmRlcmVkIik7YS5nfHxhLm1hKCk7Yj9iLmluc2VydEJlZm9yZShhLmcsY3x8bnVsbCk6YS5HLmcuYm9keS5hcHBlbmRDaGlsZChhLmcpO2EuaCYmIWEuaC5zfHxhLkkoKX0sU2I9ZnVuY3Rpb24oYSxiKXtpZihhLnMpdGhyb3cgRXJyb3IoIkNvbXBvbmVudCBhbHJlYWR5IHJlbmRlcmVkIik7aWYoYiYmYS53YShiKSl7YS5TYT0hMDt2YXIgYz1iYihiKTthLkcmJmEuRy5nPT1jfHwoYS5HPWI/bmV3IGZiKGJiKGIpKTpwYXx8KHBhPW5ldyBmYikpO2EuRWEoYik7YS5JKCl9ZWxzZSB0aHJvdyBFcnJvcigiSW52YWxpZCBlbGVtZW50IHRvIGRlY29yYXRlIik7fTtnPUYucHJvdG90eXBlO2cud2E9ZnVuY3Rpb24oKXtyZXR1cm4hMH07Zy5FYT1mdW5jdGlvbihhKXt0aGlzLmc9YX07CmcuST1mdW5jdGlvbigpe3RoaXMucz0hMDtUYih0aGlzLGZ1bmN0aW9uKGEpeyFhLnMmJmEuaSgpJiZhLkkoKX0pfTtnLlU9ZnVuY3Rpb24oKXtUYih0aGlzLGZ1bmN0aW9uKGEpe2EucyYmYS5VKCl9KTt0aGlzLk0mJkdiKHRoaXMuTSk7dGhpcy5zPSExfTtnLkM9ZnVuY3Rpb24oKXt0aGlzLnMmJnRoaXMuVSgpO3RoaXMuTSYmKHRoaXMuTS5kaXNwb3NlKCksZGVsZXRlIHRoaXMuTSk7VGIodGhpcyxmdW5jdGlvbihhKXthLmRpc3Bvc2UoKX0pOyF0aGlzLlNhJiZ0aGlzLmcmJiRhKHRoaXMuZyk7dGhpcy5oPXRoaXMuZz10aGlzLnU9dGhpcy5qPW51bGw7Ri5sLkMuY2FsbCh0aGlzKX07Zy5CYT1mdW5jdGlvbihhLGIpe3RoaXMuQ2EoYSxIKHRoaXMpLGIpfTsKZy5DYT1mdW5jdGlvbihhLGIsYyl7cCghIWEsIlByb3ZpZGVkIGVsZW1lbnQgbXVzdCBub3QgYmUgbnVsbC4iKTtpZihhLnMmJihjfHwhdGhpcy5zKSl0aHJvdyBFcnJvcigiQ29tcG9uZW50IGFscmVhZHkgcmVuZGVyZWQiKTtpZihiPDB8fGI+SCh0aGlzKSl0aHJvdyBFcnJvcigiQ2hpbGQgY29tcG9uZW50IGluZGV4IG91dCBvZiBib3VuZHMiKTt0aGlzLnUmJnRoaXMuanx8KHRoaXMudT17fSx0aGlzLmo9W10pO2lmKGEuaD09dGhpcyl7dmFyIGQ9dGhpcy51LGU9T2IoYSk7ZFtlXT1hO3hhKHRoaXMuaixhKX1lbHNlIERhKHRoaXMudSxPYihhKSxhKTtpZihhPT10aGlzKXRocm93IEVycm9yKCJVbmFibGUgdG8gc2V0IHBhcmVudCBjb21wb25lbnQiKTtpZihkPXRoaXMmJmEuaCYmYS5ZKWU9YS5oLGQ9YS5ZLGUudSYmZD8oZT1lLnUsZD0oZSE9PW51bGwmJmQgaW4gZT9lW2RdOnZvaWQgMCl8fG51bGwpOmQ9bnVsbDtpZihkJiZhLmghPXRoaXMpdGhyb3cgRXJyb3IoIlVuYWJsZSB0byBzZXQgcGFyZW50IGNvbXBvbmVudCIpOwphLmg9dGhpcztGLmwuQWEuY2FsbChhLHRoaXMpO3phKHRoaXMuaixiLDAsYSk7YS5zJiZ0aGlzLnMmJmEuaD09dGhpcz8oYz10aGlzLm5hKCksKGMuY2hpbGROb2Rlc1tiXXx8bnVsbCkhPWEuaSgpJiYoYS5pKCkucGFyZW50RWxlbWVudD09YyYmYy5yZW1vdmVDaGlsZChhLmkoKSksYj1jLmNoaWxkTm9kZXNbYl18fG51bGwsYy5pbnNlcnRCZWZvcmUoYS5pKCksYikpKTpjPyh0aGlzLmd8fHRoaXMubWEoKSxiPUkodGhpcyxiKzEpLFJiKGEsdGhpcy5uYSgpLGI/Yi5nOm51bGwpKTp0aGlzLnMmJiFhLnMmJmEuZyYmYS5nLnBhcmVudE5vZGUmJmEuZy5wYXJlbnROb2RlLm5vZGVUeXBlPT0xJiZhLkkoKX07Zy5uYT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmd9Owp2YXIgVWI9ZnVuY3Rpb24oYSl7aWYoYS56YT09bnVsbCl7dmFyIGI9YS5zP2EuZzphLkcuZy5ib2R5O2E6e3ZhciBjPWJiKGIpO2lmKGMuZGVmYXVsdFZpZXcmJmMuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSYmKGM9Yy5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKGIsbnVsbCkpKXtjPWMuZGlyZWN0aW9ufHxjLmdldFByb3BlcnR5VmFsdWUoImRpcmVjdGlvbiIpfHwiIjticmVhayBhfWM9IiJ9YS56YT0icnRsIj09KGN8fChiLmN1cnJlbnRTdHlsZT9iLmN1cnJlbnRTdHlsZS5kaXJlY3Rpb246bnVsbCl8fGIuc3R5bGUmJmIuc3R5bGUuZGlyZWN0aW9uKX1yZXR1cm4gYS56YX0sSD1mdW5jdGlvbihhKXtyZXR1cm4gYS5qP2Euai5sZW5ndGg6MH0sST1mdW5jdGlvbihhLGIpe3JldHVybiBhLmo/YS5qW2JdfHxudWxsOm51bGx9LFRiPWZ1bmN0aW9uKGEsYixjKXthLmomJmEuai5mb3JFYWNoKGIsYyl9LFZiPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuaiYmYj9hLmouaW5kZXhPZihiKToKLTF9O3ZhciBXYj17bWI6ImFjdGl2ZWRlc2NlbmRhbnQiLHJiOiJhdG9taWMiLHNiOiJhdXRvY29tcGxldGUiLHViOiJidXN5Iix4YjoiY2hlY2tlZCIseWI6ImNvbGluZGV4IixEYjoiY29udHJvbHMiLEViOiJjdXJyZW50IixHYjoiZGVzY3JpYmVkYnkiLEpiOiJkaXNhYmxlZCIsTGI6ImRyb3BlZmZlY3QiLE1iOiJleHBhbmRlZCIsTmI6ImZsb3d0byIsUGI6ImdyYWJiZWQiLFRiOiJoYXNwb3B1cCIsVmI6ImhpZGRlbiIsWGI6ImludmFsaWQiLFliOiJsYWJlbCIsWmI6ImxhYmVsbGVkYnkiLGFjOiJsZXZlbCIsZmM6ImxpdmUiLHZjOiJtdWx0aWxpbmUiLHdjOiJtdWx0aXNlbGVjdGFibGUiLEFjOiJvcmllbnRhdGlvbiIsQmM6Im93bnMiLENjOiJwb3NpbnNldCIsRWM6InByZXNzZWQiLEljOiJyZWFkb25seSIsS2M6InJlbGV2YW50IixMYzoicmVxdWlyZWQiLFBjOiJyb3dpbmRleCIsU2M6InNlbGVjdGVkIixVYzoic2V0c2l6ZSIsV2M6InNvcnQiLG1kOiJ2YWx1ZW1heCIsbmQ6InZhbHVlbWluIiwKb2Q6InZhbHVlbm93IixwZDoidmFsdWV0ZXh0In07dmFyIFhiO3ZhciBZYj17bmI6ImFsZXJ0IixvYjoiYWxlcnRkaWFsb2ciLHBiOiJhcHBsaWNhdGlvbiIscWI6ImFydGljbGUiLHRiOiJiYW5uZXIiLHZiOiJidXR0b24iLHdiOiJjaGVja2JveCIsemI6ImNvbHVtbmhlYWRlciIsQWI6ImNvbWJvYm94IixCYjoiY29tcGxlbWVudGFyeSIsQ2I6ImNvbnRlbnRpbmZvIixGYjoiZGVmaW5pdGlvbiIsSGI6ImRpYWxvZyIsSWI6ImRpcmVjdG9yeSIsS2I6ImRvY3VtZW50IixPYjoiZm9ybSIsUWI6ImdyaWQiLFJiOiJncmlkY2VsbCIsU2I6Imdyb3VwIixVYjoiaGVhZGluZyIsV2I6ImltZyIsYmM6ImxpbmsiLGNjOiJsaXN0IixkYzoibGlzdGJveCIsZWM6Imxpc3RpdGVtIixoYzoibG9nIixpYzoibWFpbiIsamM6Im1hcnF1ZWUiLGtjOiJtYXRoIixsYzoibWVudSIsbWM6Im1lbnViYXIiLG5jOiJtZW51aXRlbSIsb2M6Im1lbnVpdGVtY2hlY2tib3giLHBjOiJtZW51aXRlbXJhZGlvIix4YzoibmF2aWdhdGlvbiIseWM6Im5vdGUiLHpjOiJvcHRpb24iLApEYzoicHJlc2VudGF0aW9uIixGYzoicHJvZ3Jlc3NiYXIiLEdjOiJyYWRpbyIsSGM6InJhZGlvZ3JvdXAiLEpjOiJyZWdpb24iLE1jOiJyb3ciLE5jOiJyb3dncm91cCIsT2M6InJvd2hlYWRlciIsUWM6InNjcm9sbGJhciIsUmM6InNlYXJjaCIsVGM6InNlcGFyYXRvciIsVmM6InNsaWRlciIsWGM6InNwaW5idXR0b24iLFljOiJzdGF0dXMiLFpjOiJzd2l0Y2giLGFkOiJ0YWIiLGJkOiJ0YWJsaXN0IixjZDoidGFicGFuZWwiLGRkOiJ0ZXh0Ym94IixlZDoidGV4dGluZm8iLGZkOiJ0aW1lciIsZ2Q6InRvb2xiYXIiLGhkOiJ0b29sdGlwIixqZDoidHJlZSIsa2Q6InRyZWVncmlkIixsZDoidHJlZWl0ZW0ifTt2YXIgWmI9ZnVuY3Rpb24oYSxiKXtiPyhwKENhKFliLGIpLCJObyBzdWNoIEFSSUEgcm9sZSAiK2IpLGEuc2V0QXR0cmlidXRlKCJyb2xlIixiKSk6YS5yZW1vdmVBdHRyaWJ1dGUoInJvbGUiKX0sYWM9ZnVuY3Rpb24oYSxiLGMpe0FycmF5LmlzQXJyYXkoYykmJihjPWMuam9pbigiICIpKTt2YXIgZD0kYihiKTtjPT09IiJ8fGM9PXZvaWQgMD8oWGJ8fChjPXt9LFhiPShjLmF0b21pYz0hMSxjLmF1dG9jb21wbGV0ZT0ibm9uZSIsYy5kcm9wZWZmZWN0PSJub25lIixjLmhhc3BvcHVwPSExLGMubGl2ZT0ib2ZmIixjLm11bHRpbGluZT0hMSxjLm11bHRpc2VsZWN0YWJsZT0hMSxjLm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIsYy5yZWFkb25seT0hMSxjLnJlbGV2YW50PSJhZGRpdGlvbnMgdGV4dCIsYy5yZXF1aXJlZD0hMSxjLnNvcnQ9Im5vbmUiLGMuYnVzeT0hMSxjLmRpc2FibGVkPSExLGMuaGlkZGVuPSExLGMuaW52YWxpZD0iZmFsc2UiLGMpKSxjPVhiLGIgaW4gYz9hLnNldEF0dHJpYnV0ZShkLApjW2JdKTphLnJlbW92ZUF0dHJpYnV0ZShkKSk6YS5zZXRBdHRyaWJ1dGUoZCxjKX0sJGI9ZnVuY3Rpb24oYSl7cChhLCJBUklBIGF0dHJpYnV0ZSBjYW5ub3QgYmUgZW1wdHkuIik7cChDYShXYixhKSwiTm8gc3VjaCBBUklBIGF0dHJpYnV0ZSAiK2EpO3JldHVybiJhcmlhLSIrYX07dmFyIGRjPWZ1bmN0aW9uKGEsYixjLGQsZSxmKXtpZih2JiZlKXJldHVybiBiYyhhKTtpZihlJiYhZClyZXR1cm4hMTtpZighdCl7dHlwZW9mIGI9PT0ibnVtYmVyIiYmKGI9Y2MoYikpO3ZhciBoPWI9PTE3fHxiPT0xOHx8diYmYj09OTE7aWYoKCFjfHx2KSYmaHx8diYmYj09MTYmJihkfHxmKSlyZXR1cm4hMX1pZih1JiZkJiZjKXN3aXRjaChhKXtjYXNlIDIyMDpjYXNlIDIxOTpjYXNlIDIyMTpjYXNlIDE5MjpjYXNlIDE4NjpjYXNlIDE4OTpjYXNlIDE4NzpjYXNlIDE4ODpjYXNlIDE5MDpjYXNlIDE5MTpjYXNlIDE5MjpjYXNlIDIyMjpyZXR1cm4hMX1zd2l0Y2goYSl7Y2FzZSAxMzpyZXR1cm4gdD9mfHxlPyExOiEoYyYmZCk6ITA7Y2FzZSAyNzpyZXR1cm4hdSYmIXR9cmV0dXJuIHQmJihkfHxlfHxmKT8hMTpiYyhhKX0sYmM9ZnVuY3Rpb24oYSl7aWYoYT49NDgmJmE8PTU3fHxhPj05NiYmYTw9MTA2fHxhPj02NSYmYTw9OTB8fHUmJmE9PTApcmV0dXJuITA7c3dpdGNoKGEpe2Nhc2UgMzI6Y2FzZSA0MzpjYXNlIDYzOmNhc2UgNjQ6Y2FzZSAxMDc6Y2FzZSAxMDk6Y2FzZSAxMTA6Y2FzZSAxMTE6Y2FzZSAxODY6Y2FzZSA1OTpjYXNlIDE4OTpjYXNlIDE4NzpjYXNlIDYxOmNhc2UgMTg4OmNhc2UgMTkwOmNhc2UgMTkxOmNhc2UgMTkyOmNhc2UgMjIyOmNhc2UgMjE5OmNhc2UgMjIwOmNhc2UgMjIxOmNhc2UgMTYzOmNhc2UgNTg6cmV0dXJuITA7CmNhc2UgMTczOmNhc2UgMTcxOnJldHVybiB0O2RlZmF1bHQ6cmV0dXJuITF9fSxjYz1mdW5jdGlvbihhKXtpZih0KWE9ZWMoYSk7ZWxzZSBpZih2JiZ1KXN3aXRjaChhKXtjYXNlIDkzOmE9OTF9cmV0dXJuIGF9LGVjPWZ1bmN0aW9uKGEpe3N3aXRjaChhKXtjYXNlIDYxOnJldHVybiAxODc7Y2FzZSA1OTpyZXR1cm4gMTg2O2Nhc2UgMTczOnJldHVybiAxODk7Y2FzZSAyMjQ6cmV0dXJuIDkxO2Nhc2UgMDpyZXR1cm4gMjI0O2RlZmF1bHQ6cmV0dXJuIGF9fTt2YXIgZmM9ZnVuY3Rpb24oYSxiLGMsZCl7ei5jYWxsKHRoaXMsZCk7dGhpcy50eXBlPSJrZXkiO3RoaXMuZz1hO3RoaXMucmVwZWF0PWN9O24oZmMseik7dmFyIEo9ZnVuY3Rpb24oYSxiKXtELmNhbGwodGhpcyk7YSYmZ2ModGhpcyxhLGIpfTtuKEosRCk7Zz1KLnByb3RvdHlwZTtnLlI9bnVsbDtnLnFhPW51bGw7Zy5KYT1udWxsO2cucmE9bnVsbDtnLkY9LTE7Zy5LPS0xO2cuRGE9ITE7CnZhciBoYz17MzoxMywxMjoxNDQsNjMyMzI6MzgsNjMyMzM6NDAsNjMyMzQ6MzcsNjMyMzU6MzksNjMyMzY6MTEyLDYzMjM3OjExMyw2MzIzODoxMTQsNjMyMzk6MTE1LDYzMjQwOjExNiw2MzI0MToxMTcsNjMyNDI6MTE4LDYzMjQzOjExOSw2MzI0NDoxMjAsNjMyNDU6MTIxLDYzMjQ2OjEyMiw2MzI0NzoxMjMsNjMyNDg6NDQsNjMyNzI6NDYsNjMyNzM6MzYsNjMyNzU6MzUsNjMyNzY6MzMsNjMyNzc6MzQsNjMyODk6MTQ0LDYzMzAyOjQ1fSxpYz17VXA6MzgsRG93bjo0MCxMZWZ0OjM3LFJpZ2h0OjM5LEVudGVyOjEzLEYxOjExMixGMjoxMTMsRjM6MTE0LEY0OjExNSxGNToxMTYsRjY6MTE3LEY3OjExOCxGODoxMTksRjk6MTIwLEYxMDoxMjEsRjExOjEyMixGMTI6MTIzLCJVKzAwN0YiOjQ2LEhvbWU6MzYsRW5kOjM1LFBhZ2VVcDozMyxQYWdlRG93bjozNCxJbnNlcnQ6NDV9LGpjPXYmJnQ7CkoucHJvdG90eXBlLmc9ZnVuY3Rpb24oYSl7dSYmKHRoaXMuRj09MTcmJiFhLmN0cmxLZXl8fHRoaXMuRj09MTgmJiFhLmFsdEtleXx8diYmdGhpcy5GPT05MSYmIWEubWV0YUtleSkmJih0aGlzLks9dGhpcy5GPS0xKTt0aGlzLkY9PS0xJiYoYS5jdHJsS2V5JiZhLmchPTE3P3RoaXMuRj0xNzphLmFsdEtleSYmYS5nIT0xOD90aGlzLkY9MTg6YS5tZXRhS2V5JiZhLmchPTkxJiYodGhpcy5GPTkxKSk7ZGMoYS5nLHRoaXMuRixhLnNoaWZ0S2V5LGEuY3RybEtleSxhLmFsdEtleSxhLm1ldGFLZXkpPyh0aGlzLks9Y2MoYS5nKSxqYyYmKHRoaXMuRGE9YS5hbHRLZXkpKTp0aGlzLmhhbmRsZUV2ZW50KGEpfTtKLnByb3RvdHlwZS5oPWZ1bmN0aW9uKGEpe3RoaXMuSz10aGlzLkY9LTE7dGhpcy5EYT1hLmFsdEtleX07CkoucHJvdG90eXBlLmhhbmRsZUV2ZW50PWZ1bmN0aW9uKGEpe3ZhciBiPWEuaCxjPWIuYWx0S2V5O2lmKHUmJmEudHlwZT09ImtleXByZXNzIil7dmFyIGQ9dGhpcy5LO3ZhciBlPWIuY2hhckNvZGU+PTAmJmIuY2hhckNvZGU8NjMyMzImJmJjKGQpP2IuY2hhckNvZGU6MH1lbHNlIGEudHlwZT09ImtleXByZXNzIj8oamMmJihjPXRoaXMuRGEpLGIua2V5Q29kZT09Yi5jaGFyQ29kZT9iLmtleUNvZGU8MzI/KGQ9Yi5rZXlDb2RlLGU9MCk6KGQ9dGhpcy5LLGU9Yi5jaGFyQ29kZSk6KGQ9Yi5rZXlDb2RlfHx0aGlzLkssZT1iLmNoYXJDb2RlfHwwKSk6KGQ9Yi5rZXlDb2RlfHx0aGlzLkssZT1iLmNoYXJDb2RlfHwwKSx2JiZlPT02MyYmZD09MjI0JiYoZD0xOTEpO3ZhciBmPWQ9Y2MoZCk7ZD9kPj02MzIzMiYmZCBpbiBoYz9mPWhjW2RdOmQ9PTI1JiZhLnNoaWZ0S2V5JiYoZj05KTpiLmtleUlkZW50aWZpZXImJmIua2V5SWRlbnRpZmllciBpbiBpYyYmKGY9aWNbYi5rZXlJZGVudGlmaWVyXSk7CmlmKCF0fHxhLnR5cGUhPSJrZXlwcmVzcyJ8fGRjKGYsdGhpcy5GLGEuc2hpZnRLZXksYS5jdHJsS2V5LGMsYS5tZXRhS2V5KSlhPWY9PXRoaXMuRix0aGlzLkY9ZixiPW5ldyBmYyhmLGUsYSxiKSxiLmFsdEtleT1jLEUodGhpcyxiKX07Si5wcm90b3R5cGUuaT1mdW5jdGlvbigpe3JldHVybiB0aGlzLlJ9O3ZhciBnYz1mdW5jdGlvbihhLGIsYyl7YS5yYSYma2MoYSk7YS5SPWI7YS5xYT11YihhLlIsImtleXByZXNzIixhLGMpO2EuSmE9dWIoYS5SLCJrZXlkb3duIixhLmcsYyxhKTthLnJhPXViKGEuUiwia2V5dXAiLGEuaCxjLGEpfSxrYz1mdW5jdGlvbihhKXthLnFhJiYoQShhLnFhKSxBKGEuSmEpLEEoYS5yYSksYS5xYT1udWxsLGEuSmE9bnVsbCxhLnJhPW51bGwpO2EuUj1udWxsO2EuRj0tMTthLks9LTF9O0oucHJvdG90eXBlLkM9ZnVuY3Rpb24oKXtKLmwuQy5jYWxsKHRoaXMpO2tjKHRoaXMpfTt2YXIgSz17Z2E6Im1vdXNlZG93biIsaGE6Im1vdXNldXAiLGZhOiJtb3VzZWNhbmNlbCIsc2M6Im1vdXNlbW92ZSIsdWM6Im1vdXNlb3ZlciIsdGM6Im1vdXNlb3V0IixxYzoibW91c2VlbnRlciIscmM6Im1vdXNlbGVhdmUifTt2YXIgbGM9ZnVuY3Rpb24oYSl7cmV0dXJuIHR5cGVvZiBhLmNsYXNzTmFtZT09InN0cmluZyI/YS5jbGFzc05hbWU6YS5nZXRBdHRyaWJ1dGUmJmEuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIn0sTD1mdW5jdGlvbihhKXtyZXR1cm4gYS5jbGFzc0xpc3Q/YS5jbGFzc0xpc3Q6bGMoYSkubWF0Y2goL1xTKy9nKXx8W119LG1jPWZ1bmN0aW9uKGEsYil7dHlwZW9mIGEuY2xhc3NOYW1lPT0ic3RyaW5nIj9hLmNsYXNzTmFtZT1iOmEuc2V0QXR0cmlidXRlJiZhLnNldEF0dHJpYnV0ZSgiY2xhc3MiLGIpfSxuYz1mdW5jdGlvbihhLGIpe2EuY2xhc3NMaXN0P2I9YS5jbGFzc0xpc3QuY29udGFpbnMoYik6KGE9TChhKSxiPXZhKGEsYik+PTApO3JldHVybiBifSxvYz1mdW5jdGlvbihhLGIpe2lmKGEuY2xhc3NMaXN0KWEuY2xhc3NMaXN0LmFkZChiKTtlbHNlIGlmKCFuYyhhLGIpKXt2YXIgYz1sYyhhKTttYyhhLGMrKGMubGVuZ3RoPjA/IiAiK2I6YikpfX0scGM9ZnVuY3Rpb24oYSxiKXtpZihhLmNsYXNzTGlzdClBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGIsCmZ1bmN0aW9uKGUpe29jKGEsZSl9KTtlbHNle3ZhciBjPXt9O0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoTChhKSxmdW5jdGlvbihlKXtjW2VdPSEwfSk7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChiLGZ1bmN0aW9uKGUpe2NbZV09ITB9KTtiPSIiO2Zvcih2YXIgZCBpbiBjKWIrPWIubGVuZ3RoPjA/IiAiK2Q6ZDttYyhhLGIpfX0scWM9ZnVuY3Rpb24oYSxiKXthLmNsYXNzTGlzdD9hLmNsYXNzTGlzdC5yZW1vdmUoYik6bmMoYSxiKSYmbWMoYSxBcnJheS5wcm90b3R5cGUuZmlsdGVyLmNhbGwoTChhKSxmdW5jdGlvbihjKXtyZXR1cm4gYyE9Yn0pLmpvaW4oIiAiKSl9LHJjPWZ1bmN0aW9uKGEsYil7YS5jbGFzc0xpc3Q/QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChiLGZ1bmN0aW9uKGMpe3FjKGEsYyl9KTptYyhhLEFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbChMKGEpLGZ1bmN0aW9uKGMpe3JldHVybiEodmEoYixjKT49MCl9KS5qb2luKCIgIikpfTt2YXIgdGM9ZnVuY3Rpb24oYSxiKXtpZighYSl0aHJvdyBFcnJvcigiSW52YWxpZCBjbGFzcyBuYW1lICIrYSk7aWYodHlwZW9mIGIhPT0iZnVuY3Rpb24iKXRocm93IEVycm9yKCJJbnZhbGlkIGRlY29yYXRvciBmdW5jdGlvbiAiK2IpO3NjW2FdPWJ9LHVjPXt9LHNjPXt9O3ZhciB2Yz1mdW5jdGlvbihhKXt0aGlzLkE9YX07aWEodmMpO3ZhciB3Yz1mdW5jdGlvbihhLGIpe2EmJihhLnRhYkluZGV4PWI/MDotMSl9LHljPWZ1bmN0aW9uKGEsYixjKXtjLmlkJiZQYihiLGMuaWQpO3ZhciBkPWEuZygpLGU9ITEsZj1MKGMpO2YmJkFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoZixmdW5jdGlvbihoKXtoPT1kP2U9ITA6aCYmdGhpcy51KGIsaCxkKX0sYSk7ZXx8b2MoYyxkKTt4YyhiLGMpO3JldHVybiBjfTt2Yy5wcm90b3R5cGUudT1mdW5jdGlvbihhLGIsYyl7Yj09YysiLWRpc2FibGVkIj9hLlgoITEpOmI9PWMrIi1ob3Jpem9udGFsIj96YyhhLCJob3Jpem9udGFsIik6Yj09YysiLXZlcnRpY2FsIiYmemMoYSwidmVydGljYWwiKX07CnZhciB4Yz1mdW5jdGlvbihhLGIpe2lmKGIpZm9yKHZhciBjPWIuZmlyc3RDaGlsZCxkO2MmJmMucGFyZW50Tm9kZT09Yjspe2Q9Yy5uZXh0U2libGluZztpZihjLm5vZGVUeXBlPT0xKXthOnt2YXIgZT1jO3AoZSk7ZT1MKGUpO2Zvcih2YXIgZj1lLmxlbmd0aCxoPTA7aDxmO2grKyl7dmFyIGs9ZVtoXTtpZihrPWsgaW4gc2M/c2Nba10oKTpudWxsKXtlPWs7YnJlYWsgYX19ZT1udWxsfWUmJihlLmc9YyxhLmlzRW5hYmxlZCgpfHxlLlgoITEpLGEuQmEoZSksU2IoZSxjKSl9ZWxzZSBjLm5vZGVWYWx1ZSYmSGEoYy5ub2RlVmFsdWUpIT0iInx8Yi5yZW1vdmVDaGlsZChjKTtjPWR9fSxBYz1mdW5jdGlvbihhLGIpe2I9Yi5pKCk7cChiLCJUaGUgY29udGFpbmVyIERPTSBlbGVtZW50IGNhbm5vdCBiZSBudWxsLiIpO0tiKGIsdCk7KGE9YS5BKSYmWmIoYixhKX07dmMucHJvdG90eXBlLmc9ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy1jb250YWluZXIifTsKdmMucHJvdG90eXBlLmo9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nKCksYz1bYixhLkw9PSJob3Jpem9udGFsIj9iKyItaG9yaXpvbnRhbCI6YisiLXZlcnRpY2FsIl07YS5pc0VuYWJsZWQoKXx8Yy5wdXNoKGIrIi1kaXNhYmxlZCIpO3JldHVybiBjfTt2YXIgQmM9ZnVuY3Rpb24oKXt9O3ZhciBNPWZ1bmN0aW9uKCl7fSxDYztpYShNKTt2YXIgRGM9e2J1dHRvbjoicHJlc3NlZCIsY2hlY2tib3g6ImNoZWNrZWQiLG1lbnVpdGVtOiJzZWxlY3RlZCIsbWVudWl0ZW1jaGVja2JveDoiY2hlY2tlZCIsbWVudWl0ZW1yYWRpbzoiY2hlY2tlZCIscmFkaW86ImNoZWNrZWQiLHRhYjoic2VsZWN0ZWQiLHRyZWVpdGVtOiJzZWxlY3RlZCJ9O00ucHJvdG90eXBlLk5hPWZ1bmN0aW9uKCl7fTtNLnByb3RvdHlwZS54YT1mdW5jdGlvbihhKXt2YXIgYj1hLkcsYz1iLmgsZD10aGlzLk4oKSxlPVtkXSxmPXRoaXMuTigpO2YhPWQmJmUucHVzaChmKTtkPWEubTtmb3IoZj1bXTtkOyl7dmFyIGg9ZCYtZDtmLnB1c2goRWModGhpcyxoKSk7ZCY9fmh9ZS5wdXNoLmFwcGx5KGUsZik7KGQ9YS5GYSkmJmUucHVzaC5hcHBseShlLGQpO3JldHVybiBjLmNhbGwoYiwiRElWIixlLmpvaW4oIiAiKSxhLmlhKX07Ck0ucHJvdG90eXBlLnlhPWZ1bmN0aW9uKGEsYil7Yi5pZCYmUGIoYSxiLmlkKTtiJiZiLmZpcnN0Q2hpbGQ/RmMoYSxiLmZpcnN0Q2hpbGQubmV4dFNpYmxpbmc/eWEoYi5jaGlsZE5vZGVzKTpiLmZpcnN0Q2hpbGQpOmEuaWE9bnVsbDt2YXIgYz0wLGQ9dGhpcy5OKCksZT10aGlzLk4oKSxmPSExLGg9ITEsaz15YShMKGIpKTtrLmZvckVhY2goZnVuY3Rpb24ocSl7Znx8cSE9ZD9ofHxxIT1lP2N8PUdjKHRoaXMscSk6aD0hMDooZj0hMCxlPT1kJiYoaD0hMCkpO0djKHRoaXMscSk9PTEmJihzYShiKSxkYihiKSYmZWIoYikmJmNiKGIsITEpKX0sdGhpcyk7YS5tPWM7Znx8KGsucHVzaChkKSxlPT1kJiYoaD0hMCkpO2h8fGsucHVzaChlKTsoYT1hLkZhKSYmay5wdXNoLmFwcGx5KGssYSk7ZiYmaCYmIWF8fG1jKGIsay5qb2luKCIgIikpO3JldHVybiBifTsKdmFyIEhjPWZ1bmN0aW9uKGEsYil7aWYoYT1hLk5hKCkpe3AoYiwiVGhlIGVsZW1lbnQgcGFzc2VkIGFzIGEgZmlyc3QgcGFyYW1ldGVyIGNhbm5vdCBiZSBudWxsLiIpO3ZhciBjPWIuZ2V0QXR0cmlidXRlKCJyb2xlIil8fG51bGw7YSE9YyYmWmIoYixhKX19LEljPWZ1bmN0aW9uKGEsYil7dmFyIGM7aWYoYS5EJjMyJiYoYz1hLmkoKSkpe2lmKCFiJiZhLm0mMzIpe3RyeXtjLmJsdXIoKX1jYXRjaChkKXt9YS5tJjMyJiZhLlFhKG51bGwpfShkYihjKSYmZWIoYykpIT1iJiZjYihjLGIpfX0sSmM9ZnVuY3Rpb24oYSxiLGMpe0NjfHwoQ2M9ezE6ImRpc2FibGVkIiw4OiJzZWxlY3RlZCIsMTY6ImNoZWNrZWQiLDY0OiJleHBhbmRlZCJ9KTtwKGEsIlRoZSBlbGVtZW50IHBhc3NlZCBhcyBhIGZpcnN0IHBhcmFtZXRlciBjYW5ub3QgYmUgbnVsbC4iKTtiPUNjW2JdO3ZhciBkPWEuZ2V0QXR0cmlidXRlKCJyb2xlIil8fG51bGw7ZCYmKGQ9RGNbZF18fGIsYj1iPT0iY2hlY2tlZCJ8fGI9PQoic2VsZWN0ZWQiP2Q6Yik7YiYmYWMoYSxiLGMpfTtNLnByb3RvdHlwZS5OPWZ1bmN0aW9uKCl7cmV0dXJuImdvb2ctY29udHJvbCJ9O3ZhciBFYz1mdW5jdGlvbihhLGIpe2EuZ3x8S2MoYSk7cmV0dXJuIGEuZ1tiXX0sR2M9ZnVuY3Rpb24oYSxiKXthLmh8fChhLmd8fEtjKGEpLGEuaD1FYShhLmcpKTthPXBhcnNlSW50KGEuaFtiXSwxMCk7cmV0dXJuIGlzTmFOKGEpPzA6YX0sS2M9ZnVuY3Rpb24oYSl7dmFyIGI9YS5OKCk7dmFyIGM9Yi5yZXBsYWNlKC9ceGEwfFxzL2csIiAiKS5pbmRleE9mKCIgIikhPS0xO3AoIWMsIkNvbnRyb2xSZW5kZXJlciBoYXMgYW4gaW52YWxpZCBjc3MgY2xhc3M6ICciK2IrIiciKTthLmc9ezE6YisiLWRpc2FibGVkIiwyOmIrIi1ob3ZlciIsNDpiKyItYWN0aXZlIiw4OmIrIi1zZWxlY3RlZCIsMTY6YisiLWNoZWNrZWQiLDMyOmIrIi1mb2N1c2VkIiw2NDpiKyItb3BlbiJ9fTt2YXIgTj1mdW5jdGlvbihhLGIsYyl7Ri5jYWxsKHRoaXMsYyk7aWYoIWIpe2ZvcihiPXRoaXMuY29uc3RydWN0b3I7Yjspe3ZhciBkPW5hKGIpO2lmKGQ9dWNbZF0pYnJlYWs7Yj0oYj1PYmplY3QuZ2V0UHJvdG90eXBlT2YoYi5wcm90b3R5cGUpKSYmYi5jb25zdHJ1Y3Rvcn1iPWQ/dHlwZW9mIGQuVj09PSJmdW5jdGlvbiI/ZC5WKCk6bmV3IGQ6bnVsbH10aGlzLnY9Yjt0aGlzLmlhPWEhPT12b2lkIDA/YTpudWxsfTtuKE4sRik7Zz1OLnByb3RvdHlwZTtnLmlhPW51bGw7Zy5tPTA7Zy5EPTM5O2cuUD0wO2cuT2E9ITA7Zy5GYT1udWxsO2cuSGE9ITA7Zy5tYT1mdW5jdGlvbigpe3ZhciBhPXRoaXMudi54YSh0aGlzKTt0aGlzLmc9YTtIYyh0aGlzLnYsYSk7S2IoYSwhMCk7dGhpcy5pc1Zpc2libGUoKXx8KGEuc3R5bGUuZGlzcGxheT0ibm9uZSIsYSYmYWMoYSwiaGlkZGVuIiwhMCkpfTtnLm5hPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaSgpfTtnLndhPWZ1bmN0aW9uKCl7cmV0dXJuITB9OwpnLkVhPWZ1bmN0aW9uKGEpe3RoaXMuZz1hPXRoaXMudi55YSh0aGlzLGEpO0hjKHRoaXMudixhKTtLYihhLCEwKTt0aGlzLk9hPWEuc3R5bGUuZGlzcGxheSE9Im5vbmUifTsKZy5JPWZ1bmN0aW9uKCl7Ti5sLkkuY2FsbCh0aGlzKTt2YXIgYT10aGlzLmc7cChhLCJDYW4gbm90IGNhbGwgZ2V0RWxlbWVudFN0cmljdCBiZWZvcmUgcmVuZGVyaW5nL2RlY29yYXRpbmcuIik7cCh0aGlzKTtwKGEpO3RoaXMuaXNWaXNpYmxlKCl8fGFjKGEsImhpZGRlbiIsIXRoaXMuaXNWaXNpYmxlKCkpO3RoaXMuaXNFbmFibGVkKCl8fEpjKGEsMSwhdGhpcy5pc0VuYWJsZWQoKSk7dGhpcy5EJjgmJkpjKGEsOCwhISh0aGlzLm0mOCkpO3RoaXMuRCYxNiYmSmMoYSwxNiwhISh0aGlzLm0mMTYpKTt0aGlzLkQmNjQmJkpjKGEsNjQsISEodGhpcy5tJjY0KSk7dmFyIGI9dGhpcy52O1ViKHRoaXMpJiYoYT10aGlzLmkoKSxiPWIuTigpKyItcnRsIiwoYT1hLmk/YS5pKCk6YSkmJnBjKGEsW2JdKSk7dGhpcy5pc0VuYWJsZWQoKSYmSWModGhpcyx0aGlzLmlzVmlzaWJsZSgpKTt0aGlzLkQmLTImJih0aGlzLkhhJiZMYyh0aGlzLCEwKSx0aGlzLkQmMzImJihhPXRoaXMuaSgpKSkmJihiPQp0aGlzLlp8fCh0aGlzLlo9bmV3IEopLGdjKGIsYSksQihCKEIoUWIodGhpcyksYiwia2V5Iix0aGlzLmFhKSxhLCJmb2N1cyIsdGhpcy5YYSksYSwiYmx1ciIsdGhpcy5RYSkpfTt2YXIgTGM9ZnVuY3Rpb24oYSxiKXt2YXIgYz1RYihhKSxkPWEuaSgpO2I/KEIoQihCKEIoYyxkLEsuZ2EsYS5zYSksZCxbSy5oYSxLLmZhXSxhLnZhKSxkLCJtb3VzZW92ZXIiLGEudWEpLGQsIm1vdXNlb3V0IixhLnRhKSxhLmNhIT1CYyYmQihjLGQsImNvbnRleHRtZW51IixhLmNhKSk6KEMoQyhDKEMoYyxkLEsuZ2EsYS5zYSksZCxbSy5oYSxLLmZhXSxhLnZhKSxkLCJtb3VzZW92ZXIiLGEudWEpLGQsIm1vdXNlb3V0IixhLnRhKSxhLmNhIT1CYyYmQyhjLGQsImNvbnRleHRtZW51IixhLmNhKSl9O04ucHJvdG90eXBlLlU9ZnVuY3Rpb24oKXtOLmwuVS5jYWxsKHRoaXMpO3RoaXMuWiYma2ModGhpcy5aKTt0aGlzLmlzVmlzaWJsZSgpJiZ0aGlzLmlzRW5hYmxlZCgpJiZJYyh0aGlzLCExKX07Ck4ucHJvdG90eXBlLkM9ZnVuY3Rpb24oKXtOLmwuQy5jYWxsKHRoaXMpO3RoaXMuWiYmKHRoaXMuWi5kaXNwb3NlKCksZGVsZXRlIHRoaXMuWik7ZGVsZXRlIHRoaXMudjt0aGlzLkZhPXRoaXMuaWE9bnVsbH07dmFyIEZjPWZ1bmN0aW9uKGEsYil7YS5pYT1ifTtOLnByb3RvdHlwZS5pc1Zpc2libGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5PYX07Ti5wcm90b3R5cGUuaXNFbmFibGVkPWZ1bmN0aW9uKCl7cmV0dXJuISh0aGlzLm0mMSl9O04ucHJvdG90eXBlLlg9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5oO2ImJnR5cGVvZiBiLmlzRW5hYmxlZD09ImZ1bmN0aW9uIiYmIWIuaXNFbmFibGVkKCl8fCFPKHRoaXMsMSwhYSl8fChhfHwoTWModGhpcywhMSksUCh0aGlzLCExKSksdGhpcy5pc1Zpc2libGUoKSYmSWModGhpcyxhKSxUKHRoaXMsMSwhYSwhMCkpfTt2YXIgUD1mdW5jdGlvbihhLGIpe08oYSwyLGIpJiZUKGEsMixiKX07Ck4ucHJvdG90eXBlLmlzQWN0aXZlPWZ1bmN0aW9uKCl7cmV0dXJuISEodGhpcy5tJjQpfTsKdmFyIE1jPWZ1bmN0aW9uKGEsYil7TyhhLDQsYikmJlQoYSw0LGIpfSxOYz1mdW5jdGlvbihhLGIpe08oYSw4LGIpJiZUKGEsOCxiKX0sT2M9ZnVuY3Rpb24oYSxiKXtPKGEsNjQsYikmJlQoYSw2NCxiKX0sVD1mdW5jdGlvbihhLGIsYyxkKXtpZighZCYmYj09MSlhLlgoIWMpO2Vsc2UgaWYoYS5EJmImJmMhPSEhKGEubSZiKSl7dmFyIGU9YS52O2lmKGQ9YS5pKCkpe2lmKGU9RWMoZSxiKSl7dmFyIGY9YS5pP2EuaSgpOmE7ZiYmKGM/cGM6cmMpKGYsW2VdKX1KYyhkLGIsYyl9YS5tPWM/YS5tfGI6YS5tJn5ifX0sUGM9ZnVuY3Rpb24oYSxiLGMpe2lmKGEucyYmYS5tJmImJiFjKXRocm93IEVycm9yKCJDb21wb25lbnQgYWxyZWFkeSByZW5kZXJlZCIpOyFjJiZhLm0mYiYmVChhLGIsITEpO2EuRD1jP2EuRHxiOmEuRCZ+Yn0sVT1mdW5jdGlvbihhLGIpe3JldHVybiEhKDI1NSZiKSYmISEoYS5EJmIpfSxPPWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4hIShhLkQmYikmJiEhKGEubSZiKSE9CmMmJighKGEuUCZiKXx8RShhLE5iKGIsYykpKSYmIWEuYmF9O04ucHJvdG90eXBlLnVhPWZ1bmN0aW9uKGEpeyFRYyhhLHRoaXMuaSgpKSYmRSh0aGlzLCJlbnRlciIpJiZ0aGlzLmlzRW5hYmxlZCgpJiZVKHRoaXMsMikmJlAodGhpcywhMCl9O04ucHJvdG90eXBlLnRhPWZ1bmN0aW9uKGEpeyFRYyhhLHRoaXMuaSgpKSYmRSh0aGlzLCJsZWF2ZSIpJiYoVSh0aGlzLDQpJiZNYyh0aGlzLCExKSxVKHRoaXMsMikmJlAodGhpcywhMSkpfTtOLnByb3RvdHlwZS5jYT1CYzt2YXIgUWM9ZnVuY3Rpb24oYSxiKXtyZXR1cm4hIWEucmVsYXRlZFRhcmdldCYmYWIoYixhLnJlbGF0ZWRUYXJnZXQpfTsKTi5wcm90b3R5cGUuc2E9ZnVuY3Rpb24oYSl7aWYodGhpcy5pc0VuYWJsZWQoKSYmKFUodGhpcywyKSYmUCh0aGlzLCEwKSwhKGEuaC5idXR0b24hPTB8fHYmJmEuY3RybEtleSkpKXtVKHRoaXMsNCkmJk1jKHRoaXMsITApO3ZhciBiO2lmKGI9dGhpcy52KXt2YXIgYztiPXRoaXMuRCYzMiYmKGM9dGhpcy5pKCkpP2RiKGMpJiZlYihjKTohMX1iJiZ0aGlzLmkoKS5mb2N1cygpfWEuaC5idXR0b24hPTB8fHYmJmEuY3RybEtleXx8YS5qKCl9O04ucHJvdG90eXBlLnZhPWZ1bmN0aW9uKGEpe3RoaXMuaXNFbmFibGVkKCkmJihVKHRoaXMsMikmJlAodGhpcywhMCksdGhpcy5pc0FjdGl2ZSgpJiZSYyh0aGlzLGEpJiZVKHRoaXMsNCkmJk1jKHRoaXMsITEpKX07CnZhciBSYz1mdW5jdGlvbihhLGIpe2lmKFUoYSwxNikpe3ZhciBjPSEoYS5tJjE2KTtPKGEsMTYsYykmJlQoYSwxNixjKX1VKGEsOCkmJk5jKGEsITApO1UoYSw2NCkmJk9jKGEsIShhLm0mNjQpKTtjPW5ldyB5KCJhY3Rpb24iLGEpO2ImJihjLmFsdEtleT1iLmFsdEtleSxjLmN0cmxLZXk9Yi5jdHJsS2V5LGMubWV0YUtleT1iLm1ldGFLZXksYy5zaGlmdEtleT1iLnNoaWZ0S2V5LGMuRz1iLkcsYy50aW1lU3RhbXA9Yi50aW1lU3RhbXApO3JldHVybiBFKGEsYyl9O04ucHJvdG90eXBlLlhhPWZ1bmN0aW9uKCl7VSh0aGlzLDMyKSYmTyh0aGlzLDMyLCEwKSYmVCh0aGlzLDMyLCEwKX07Ti5wcm90b3R5cGUuUWE9ZnVuY3Rpb24oKXtVKHRoaXMsNCkmJk1jKHRoaXMsITEpO1UodGhpcywzMikmJk8odGhpcywzMiwhMSkmJlQodGhpcywzMiwhMSl9OwpOLnByb3RvdHlwZS5hYT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5pc1Zpc2libGUoKSYmdGhpcy5pc0VuYWJsZWQoKSYmYS5nPT0xMyYmUmModGhpcyxhKT8oYS5qKCksYS52KCksITApOiExfTtpZih0eXBlb2YgTiE9PSJmdW5jdGlvbiIpdGhyb3cgRXJyb3IoIkludmFsaWQgY29tcG9uZW50IGNsYXNzICIrTik7aWYodHlwZW9mIE0hPT0iZnVuY3Rpb24iKXRocm93IEVycm9yKCJJbnZhbGlkIHJlbmRlcmVyIGNsYXNzICIrTSk7dmFyIFNjPW5hKE4pO3VjW1NjXT1NO3RjKCJnb29nLWNvbnRyb2wiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBOKG51bGwpfSk7dmFyIFY9ZnVuY3Rpb24oYSxiLGMpe0YuY2FsbCh0aGlzLGMpO3RoaXMuZWE9Ynx8dmMuVigpO3RoaXMuTD1hfHwidmVydGljYWwifTtuKFYsRik7Zz1WLnByb3RvdHlwZTtnLkthPW51bGw7Zy5kYT1udWxsO2cuZWE9bnVsbDtnLkw9bnVsbDtnLlM9ITA7Zy5UPSEwO2cubz0tMTtnLkI9bnVsbDtnLlc9ITE7Zy5PPW51bGw7dmFyIFRjPWZ1bmN0aW9uKGEpe3JldHVybiBhLkthfHxhLmkoKX07Zz1WLnByb3RvdHlwZTtnLm1hPWZ1bmN0aW9uKCl7dGhpcy5nPXRoaXMuRy5oKCJESVYiLHRoaXMuZWEuaih0aGlzKS5qb2luKCIgIikpfTtnLm5hPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaSgpfTtnLndhPWZ1bmN0aW9uKGEpe3JldHVybiBhLnRhZ05hbWU9PSJESVYifTtnLkVhPWZ1bmN0aW9uKGEpe3RoaXMuZz15Yyh0aGlzLmVhLHRoaXMsYSk7YS5zdHlsZS5kaXNwbGF5PT0ibm9uZSImJih0aGlzLlM9ITEpfTsKZy5JPWZ1bmN0aW9uKCl7Vi5sLkkuY2FsbCh0aGlzKTtUYih0aGlzLGZ1bmN0aW9uKGIpe2IucyYmVWModGhpcyxiKX0sdGhpcyk7dmFyIGE9dGhpcy5pKCk7QWModGhpcy5lYSx0aGlzKTtWYyh0aGlzLHRoaXMuUyk7QihCKEIoQihCKEIoQihCKFFiKHRoaXMpLHRoaXMsImVudGVyIix0aGlzLmViKSx0aGlzLCJoaWdobGlnaHQiLHRoaXMuZmIpLHRoaXMsInVuaGlnaGxpZ2h0Iix0aGlzLmxiKSx0aGlzLCJvcGVuIix0aGlzLmdiKSx0aGlzLCJjbG9zZSIsdGhpcy5iYiksYSxLLmdhLHRoaXMuV2EpLGJiKGEpLFtLLmhhLEsuZmFdLHRoaXMuY2IpLGEsW0suZ2EsSy5oYSxLLmZhLCJtb3VzZW92ZXIiLCJtb3VzZW91dCIsImNvbnRleHRtZW51Il0sdGhpcy5hYik7V2ModGhpcyl9O3ZhciBXYz1mdW5jdGlvbihhKXt2YXIgYj1RYihhKSxjPVRjKGEpO0IoQihCKGIsYywiZm9jdXMiLGEuUGEpLGMsImJsdXIiLGEuVWEpLGEuZGF8fChhLmRhPW5ldyBKKFRjKGEpKSksImtleSIsYS5WYSl9OwpnPVYucHJvdG90eXBlO2cuVT1mdW5jdGlvbigpe1hjKHRoaXMsLTEpO3RoaXMuQiYmT2ModGhpcy5CLCExKTt0aGlzLlc9ITE7Vi5sLlUuY2FsbCh0aGlzKX07Zy5DPWZ1bmN0aW9uKCl7Vi5sLkMuY2FsbCh0aGlzKTt0aGlzLmRhJiYodGhpcy5kYS5kaXNwb3NlKCksdGhpcy5kYT1udWxsKTt0aGlzLmVhPXRoaXMuQj10aGlzLk89dGhpcy5LYT1udWxsfTtnLmViPWZ1bmN0aW9uKCl7cmV0dXJuITB9OwpnLmZiPWZ1bmN0aW9uKGEpe3ZhciBiPVZiKHRoaXMsYS50YXJnZXQpO2lmKGI+LTEmJmIhPXRoaXMubyl7dmFyIGM9SSh0aGlzLHRoaXMubyk7YyYmUChjLCExKTt0aGlzLm89YjtjPUkodGhpcyx0aGlzLm8pO3RoaXMuVyYmTWMoYywhMCk7dGhpcy5CJiZjIT10aGlzLkImJihjLkQmNjQ/T2MoYywhMCk6T2ModGhpcy5CLCExKSl9Yj10aGlzLmkoKTtwKGIsIlRoZSBET00gZWxlbWVudCBmb3IgdGhlIGNvbnRhaW5lciBjYW5ub3QgYmUgbnVsbC4iKTthLnRhcmdldC5pKCkhPW51bGwmJmFjKGIsImFjdGl2ZWRlc2NlbmRhbnQiLGEudGFyZ2V0LmkoKS5pZCl9O2cubGI9ZnVuY3Rpb24oYSl7YS50YXJnZXQ9PUkodGhpcyx0aGlzLm8pJiYodGhpcy5vPS0xKTthPXRoaXMuaSgpO3AoYSwiVGhlIERPTSBlbGVtZW50IGZvciB0aGUgY29udGFpbmVyIGNhbm5vdCBiZSBudWxsLiIpO2EucmVtb3ZlQXR0cmlidXRlKCRiKCJhY3RpdmVkZXNjZW5kYW50IikpfTsKZy5nYj1mdW5jdGlvbihhKXsoYT1hLnRhcmdldCkmJmEhPXRoaXMuQiYmYS5oPT10aGlzJiYodGhpcy5CJiZPYyh0aGlzLkIsITEpLHRoaXMuQj1hKX07Zy5iYj1mdW5jdGlvbihhKXthLnRhcmdldD09dGhpcy5CJiYodGhpcy5CPW51bGwpO3ZhciBiPXRoaXMuaSgpLGM9YS50YXJnZXQuaSgpO2ImJmEudGFyZ2V0Lm0mMiYmYyYmKGE9IiIsYyYmKGE9Yy5pZCxwKGEsIlRoZSBhY3RpdmUgZWxlbWVudCBzaG91bGQgaGF2ZSBhbiBpZC4iKSksYWMoYiwiYWN0aXZlZGVzY2VuZGFudCIsYSkpfTtnLldhPWZ1bmN0aW9uKGEpe3RoaXMuVCYmKHRoaXMuVz0hMCk7dmFyIGI9VGModGhpcyk7YiYmZGIoYikmJmViKGIpP2IuZm9jdXMoKTphLmooKX07Zy5jYj1mdW5jdGlvbigpe3RoaXMuVz0hMX07CmcuYWI9ZnVuY3Rpb24oYSl7YTp7dmFyIGI9YS50YXJnZXQ7aWYodGhpcy5PKWZvcih2YXIgYz10aGlzLmkoKTtiJiZiIT09Yzspe3ZhciBkPWIuaWQ7aWYoZCBpbiB0aGlzLk8pe2I9dGhpcy5PW2RdO2JyZWFrIGF9Yj1iLnBhcmVudE5vZGV9Yj1udWxsfWlmKGIpc3dpdGNoKGEudHlwZSl7Y2FzZSBLLmdhOmIuc2EoYSk7YnJlYWs7Y2FzZSBLLmhhOmNhc2UgSy5mYTpiLnZhKGEpO2JyZWFrO2Nhc2UgIm1vdXNlb3ZlciI6Yi51YShhKTticmVhaztjYXNlICJtb3VzZW91dCI6Yi50YShhKTticmVhaztjYXNlICJjb250ZXh0bWVudSI6Yi5jYShhKX19O2cuUGE9ZnVuY3Rpb24oKXt9O2cuVWE9ZnVuY3Rpb24oKXtYYyh0aGlzLC0xKTt0aGlzLlc9ITE7dGhpcy5CJiZPYyh0aGlzLkIsITEpfTsKZy5WYT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5pc0VuYWJsZWQoKSYmdGhpcy5pc1Zpc2libGUoKSYmKEgodGhpcykhPTB8fHRoaXMuS2EpJiZZYyh0aGlzLGEpPyhhLmooKSxhLnYoKSwhMCk6ITF9Owp2YXIgWWM9ZnVuY3Rpb24oYSxiKXt2YXIgYz1JKGEsYS5vKTtpZihjJiZ0eXBlb2YgYy5hYT09ImZ1bmN0aW9uIiYmYy5hYShiKXx8YS5CJiZhLkIhPWMmJnR5cGVvZiBhLkIuYWE9PSJmdW5jdGlvbiImJmEuQi5hYShiKSlyZXR1cm4hMDtpZihiLnNoaWZ0S2V5fHxiLmN0cmxLZXl8fGIubWV0YUtleXx8Yi5hbHRLZXkpcmV0dXJuITE7c3dpdGNoKGIuZyl7Y2FzZSAyNzpUYyhhKS5ibHVyKCk7YnJlYWs7Y2FzZSAzNjpaYyhhKTticmVhaztjYXNlIDM1OiRjKGEpO2JyZWFrO2Nhc2UgMzg6aWYoYS5MPT0idmVydGljYWwiKWFkKGEpO2Vsc2UgcmV0dXJuITE7YnJlYWs7Y2FzZSAzNzppZihhLkw9PSJob3Jpem9udGFsIilVYihhKT9iZChhKTphZChhKTtlbHNlIHJldHVybiExO2JyZWFrO2Nhc2UgNDA6aWYoYS5MPT0idmVydGljYWwiKWJkKGEpO2Vsc2UgcmV0dXJuITE7YnJlYWs7Y2FzZSAzOTppZihhLkw9PSJob3Jpem9udGFsIilVYihhKT9hZChhKTpiZChhKTtlbHNlIHJldHVybiExOwpicmVhaztkZWZhdWx0OnJldHVybiExfXJldHVybiEwfSxVYz1mdW5jdGlvbihhLGIpe3ZhciBjPWIuaSgpO2M9Yy5pZHx8KGMuaWQ9T2IoYikpO2EuT3x8KGEuTz17fSk7YS5PW2NdPWJ9O1YucHJvdG90eXBlLkJhPWZ1bmN0aW9uKGEsYil7dWEoYSxOLCJUaGUgY2hpbGQgb2YgYSBjb250YWluZXIgbXVzdCBiZSBhIGNvbnRyb2wiKTtWLmwuQmEuY2FsbCh0aGlzLGEsYil9O1YucHJvdG90eXBlLkNhPWZ1bmN0aW9uKGEsYixjKXt1YShhLE4pO2EuUHw9MjthLlB8PTY0O1BjKGEsMzIsITEpO2EucyYmMCE9YS5IYSYmTGMoYSwhMSk7YS5IYT0hMTt2YXIgZD1hLmg9PXRoaXM/VmIodGhpcyxhKTotMTtWLmwuQ2EuY2FsbCh0aGlzLGEsYixjKTthLnMmJnRoaXMucyYmVWModGhpcyxhKTthPWQ7YT09LTEmJihhPUgodGhpcykpO2E9PXRoaXMubz90aGlzLm89TWF0aC5taW4oSCh0aGlzKS0xLGIpOmE+dGhpcy5vJiZiPD10aGlzLm8/dGhpcy5vKys6YTx0aGlzLm8mJmI+dGhpcy5vJiZ0aGlzLm8tLX07CnZhciB6Yz1mdW5jdGlvbihhLGIpe2lmKGEuaSgpKXRocm93IEVycm9yKCJDb21wb25lbnQgYWxyZWFkeSByZW5kZXJlZCIpO2EuTD1ifTtWLnByb3RvdHlwZS5pc1Zpc2libGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5TfTt2YXIgVmM9ZnVuY3Rpb24oYSxiKXthLlM9Yjt2YXIgYz1hLmkoKTtjJiYoYy5zdHlsZS5kaXNwbGF5PWI/IiI6Im5vbmUiLHdjKFRjKGEpLGEuVCYmYS5TKSl9O1YucHJvdG90eXBlLmlzRW5hYmxlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLlR9O1YucHJvdG90eXBlLlg9ZnVuY3Rpb24oYSl7dGhpcy5UIT1hJiZFKHRoaXMsYT8iZW5hYmxlIjoiZGlzYWJsZSIpJiYoYT8odGhpcy5UPSEwLFRiKHRoaXMsZnVuY3Rpb24oYil7Yi5UYT9kZWxldGUgYi5UYTpiLlgoITApfSkpOihUYih0aGlzLGZ1bmN0aW9uKGIpe2IuaXNFbmFibGVkKCk/Yi5YKCExKTpiLlRhPSEwfSksdGhpcy5XPXRoaXMuVD0hMSksd2MoVGModGhpcyksYSYmdGhpcy5TKSl9Owp2YXIgWGM9ZnVuY3Rpb24oYSxiKXsoYj1JKGEsYikpP1AoYiwhMCk6YS5vPi0xJiZQKEkoYSxhLm8pLCExKX0sWmM9ZnVuY3Rpb24oYSl7Y2QoYSxmdW5jdGlvbihiLGMpe3JldHVybihiKzEpJWN9LEgoYSktMSl9LCRjPWZ1bmN0aW9uKGEpe2NkKGEsZnVuY3Rpb24oYixjKXtiLS07cmV0dXJuIGI8MD9jLTE6Yn0sMCl9LGJkPWZ1bmN0aW9uKGEpe2NkKGEsZnVuY3Rpb24oYixjKXtyZXR1cm4oYisxKSVjfSxhLm8pfSxhZD1mdW5jdGlvbihhKXtjZChhLGZ1bmN0aW9uKGIsYyl7Yi0tO3JldHVybiBiPDA/Yy0xOmJ9LGEubyl9LGNkPWZ1bmN0aW9uKGEsYixjKXtjPWM8MD9WYihhLGEuQik6Yzt2YXIgZD1IKGEpO2M9Yi5jYWxsKGEsYyxkKTtmb3IodmFyIGU9MDtlPD1kOyl7dmFyIGY9SShhLGMpO2lmKGYmJmYuaXNWaXNpYmxlKCkmJmYuaXNFbmFibGVkKCkmJmYuRCYyKXthLkxhKGMpO2JyZWFrfWUrKztjPWIuY2FsbChhLGMsZCl9fTsKVi5wcm90b3R5cGUuTGE9ZnVuY3Rpb24oYSl7WGModGhpcyxhKX07dmFyIGRkPWZ1bmN0aW9uKCl7fTtuKGRkLE0pO2lhKGRkKTtnPWRkLnByb3RvdHlwZTtnLk49ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy10YWIifTtnLk5hPWZ1bmN0aW9uKCl7cmV0dXJuInRhYiJ9O2cueGE9ZnVuY3Rpb24oYSl7dmFyIGI9ZGQubC54YS5jYWxsKHRoaXMsYSk7KGE9YS5HYSgpKSYmdGhpcy5NYShiLGEpO3JldHVybiBifTtnLnlhPWZ1bmN0aW9uKGEsYil7Yj1kZC5sLnlhLmNhbGwodGhpcyxhLGIpO3ZhciBjPXRoaXMuR2EoYik7YyYmKGEuUmE9Yyk7YS5tJjgmJihjPWEuaCkmJnR5cGVvZiBjLko9PT0iZnVuY3Rpb24iJiYoVChhLDgsITEpLGMuSihhKSk7cmV0dXJuIGJ9O2cuR2E9ZnVuY3Rpb24oYSl7cmV0dXJuIGEudGl0bGV8fCIifTtnLk1hPWZ1bmN0aW9uKGEsYil7YSYmKGEudGl0bGU9Ynx8IiIpfTt2YXIgZWQ9ZnVuY3Rpb24oYSxiLGMpe04uY2FsbCh0aGlzLGEsYnx8ZGQuVigpLGMpO1BjKHRoaXMsOCwhMCk7dGhpcy5QfD05fTtuKGVkLE4pO2VkLnByb3RvdHlwZS5HYT1mdW5jdGlvbigpe3JldHVybiB0aGlzLlJhfTtlZC5wcm90b3R5cGUuTWE9ZnVuY3Rpb24oYSl7dGhpcy52Lk1hKHRoaXMuaSgpLGEpO3RoaXMuUmE9YX07dGMoImdvb2ctdGFiIixmdW5jdGlvbigpe3JldHVybiBuZXcgZWQobnVsbCl9KTt2YXIgVz1mdW5jdGlvbigpe3RoaXMuQT0idGFibGlzdCJ9O24oVyx2Yyk7aWEoVyk7Vy5wcm90b3R5cGUuZz1mdW5jdGlvbigpe3JldHVybiJnb29nLXRhYi1iYXIifTtXLnByb3RvdHlwZS51PWZ1bmN0aW9uKGEsYixjKXt0aGlzLnZ8fCh0aGlzLmh8fGZkKHRoaXMpLHRoaXMudj1FYSh0aGlzLmgpKTt2YXIgZD10aGlzLnZbYl07ZD8oemMoYSxnZChkKSksYS52PWQpOlcubC51LmNhbGwodGhpcyxhLGIsYyl9O1cucHJvdG90eXBlLmo9ZnVuY3Rpb24oYSl7dmFyIGI9Vy5sLmouY2FsbCh0aGlzLGEpO3RoaXMuaHx8ZmQodGhpcyk7Yi5wdXNoKHRoaXMuaFthLnZdKTtyZXR1cm4gYn07dmFyIGZkPWZ1bmN0aW9uKGEpe3ZhciBiPWEuZygpO2EuaD17dG9wOmIrIi10b3AiLGJvdHRvbTpiKyItYm90dG9tIixzdGFydDpiKyItc3RhcnQiLGVuZDpiKyItZW5kIn19O3ZhciBYPWZ1bmN0aW9uKGEsYixjKXthPWF8fCJ0b3AiO3pjKHRoaXMsZ2QoYSkpO3RoaXMudj1hO1YuY2FsbCh0aGlzLHRoaXMuTCxifHxXLlYoKSxjKTtoZCh0aGlzKX07bihYLFYpO2c9WC5wcm90b3R5cGU7Zy5IPW51bGw7Zy5JPWZ1bmN0aW9uKCl7WC5sLkkuY2FsbCh0aGlzKTtoZCh0aGlzKX07Zy5DPWZ1bmN0aW9uKCl7WC5sLkMuY2FsbCh0aGlzKTt0aGlzLkg9bnVsbH07Zy5MYT1mdW5jdGlvbihhKXtYLmwuTGEuY2FsbCh0aGlzLGEpO3RoaXMuSihJKHRoaXMsYSkpfTtnLko9ZnVuY3Rpb24oYSl7YT9OYyhhLCEwKTp0aGlzLkgmJk5jKHRoaXMuSCwhMSl9Owp2YXIgaWQ9ZnVuY3Rpb24oYSxiKXtpZihiJiZiPT1hLkgpe2Zvcih2YXIgYz1WYihhLGIpLGQ9Yy0xO2I9SShhLGQpO2QtLSl7dmFyIGU9YjtpZihlLmlzVmlzaWJsZSgpJiZlLmlzRW5hYmxlZCgpKXthLkooYik7cmV0dXJufX1mb3IoYys9MTtiPUkoYSxjKTtjKyspaWYoZD1iLGQuaXNWaXNpYmxlKCkmJmQuaXNFbmFibGVkKCkpe2EuSihiKTtyZXR1cm59YS5KKG51bGwpfX07Zz1YLnByb3RvdHlwZTtnLmpiPWZ1bmN0aW9uKGEpe3RoaXMuSCYmdGhpcy5IIT1hLnRhcmdldCYmTmModGhpcy5ILCExKTt0aGlzLkg9YS50YXJnZXR9O2cua2I9ZnVuY3Rpb24oYSl7YS50YXJnZXQ9PXRoaXMuSCYmKHRoaXMuSD1udWxsKX07Zy5oYj1mdW5jdGlvbihhKXtpZCh0aGlzLGEudGFyZ2V0KX07Zy5pYj1mdW5jdGlvbihhKXtpZCh0aGlzLGEudGFyZ2V0KX07Zy5QYT1mdW5jdGlvbigpe0kodGhpcyx0aGlzLm8pfHxYYyh0aGlzLFZiKHRoaXMsdGhpcy5IfHxJKHRoaXMsMCkpKX07CnZhciBoZD1mdW5jdGlvbihhKXtCKEIoQihCKFFiKGEpLGEsInNlbGVjdCIsYS5qYiksYSwidW5zZWxlY3QiLGEua2IpLGEsImRpc2FibGUiLGEuaGIpLGEsImhpZGUiLGEuaWIpfSxnZD1mdW5jdGlvbihhKXtyZXR1cm4gYT09InN0YXJ0Inx8YT09ImVuZCI/InZlcnRpY2FsIjoiaG9yaXpvbnRhbCJ9O3RjKCJnb29nLXRhYi1iYXIiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBYfSk7ZnVuY3Rpb24gamQoYSl7dmFyIGI9e3RvcDoiYm90dG9tIixib3R0b206InRvcCIsc3RhcnQ6InJpZ2h0IixlbmQ6ImxlZnQifVthLmxvY2F0aW9uXSxjPWEuZWxlbWVudElkLGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTtkLnRleHRDb250ZW50PSJcbiAgICBmaWVsZHNldCB7XG4gICAgICBwYWRkaW5nOiAxMHB4O1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgIzM2OTtcbiAgICB9XG5cbiAgICAjIitjKyIgLmdvb2ctdGFiLWNvbnRlbnQge1xuICAgICAgbWluLWhlaWdodDogM2VtO1xuICAgICAgbWFyZ2luOiAwO1xuICAgICAgYm9yZGVyOiAiK2EuYm9yZGVyKyIgc29saWQgIithLmJvcmRlckNvbG9yKyI7XG4gICAgICBib3JkZXItdG9wOiAwO1xuICAgICAgaGVpZ2h0OiAiK2EuY29udGVudEhlaWdodCsiO1xuICAgICAgcGFkZGluZzogNHB4IDhweDtcbiAgICAgIG1hcmdpbi1yaWdodDogNHB4O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgIG92ZXJmbG93OiBhdXRvO1xuICAgIH1cblxuICAgICMiKwpjKyIgLmdvb2ctdGFiLWJhci0iK2EubG9jYXRpb24rIiAuZ29vZy10YWItc2VsZWN0ZWQge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICIrYS5ib3JkZXJDb2xvcisiO1xuICAgICAgYm9yZGVyLSIrYisiOiAwcHg7XG4gICAgfVxuXG4gICAgIyIrYysiIC5nb29nLXRhYi1iYXItIithLmxvY2F0aW9uKyIge1xuICAgICAgcGFkZGluZy0iK2EubG9jYXRpb24rIjogNXB4ICFpbXBvcnRhbnQ7XG4gICAgICBib3JkZXItIitiKyI6IDFweCBzb2xpZCAiK2EuYm9yZGVyQ29sb3IrIiAhaW1wb3J0YW50O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICB9XG5cbiAgICAjIitjKyIgLmdvb2ctdGFiLWJhciB7XG4gICAgICAgbWFyZ2luOiAwO1xuICAgICAgIGJvcmRlcjogMDtcbiAgICAgICBwYWRkaW5nOiAwO1xuICAgICAgIGxpc3Qtc3R5bGU6IG5vbmU7XG4gICAgICAgY3Vyc29yOiBkZWZhdWx0O1xuICAgICAgIG91dGxpbmU6IG5vbmU7XG4gICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgICBtYXJnaW4tcmlnaHQ6IDRweDtcbiAgICAgIH1cblxuICAgICAjIisKYysiIC5nb29nLXRhYiB7XG4gICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgIHBhZGRpbmc6IDRweCA4cHg7XG4gICAgICAgY29sb3I6IHZhcigtLWNvbGFiLXByaW1hcnktdGV4dC1jb2xvcik7XG4gICAgICAgdGV4dC1kZWNvcmF0aW9uOiBpbml0aWFsO1xuICAgICAgIGN1cnNvcjogZGVmYXVsdDtcbiAgICAgIH1cblxuICAgICAgIyIrYysiIC5nb29nLXRhYi1ob3ZlciB7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWNvbGFiLWhpZ2hsaWdodGVkLXN1cmZhY2UtY29sb3IpO1xuICAgICAgfVxuICAgICAgIjtyZXR1cm4gZH0KdmFyIGtkPWZ1bmN0aW9uKGEpe3ZhciBiPWEuZWxlbWVudElkLGM9YS50YWJOYW1lcyxkPWEuc2VsZWN0ZWRJbmRleDsiY29udGVudEJvcmRlciJpbiBhfHwoYS5jb250ZW50Qm9yZGVyPSIwcHgiKTsiY29udGVudEhlaWdodCJpbiBhfHwoYS5jb250ZW50SGVpZ2h0PSJpbml0aWFsIik7ImJvcmRlckNvbG9yImluIGF8fChhLmJvcmRlckNvbG9yPSJ2YXIoLS1jb2xhYi1ib3JkZXItY29sb3IpIik7YS5sb2NhdGlvbnx8KGEubG9jYXRpb249InRvcCIpO3ZhciBlPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiMiK2IpLGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zi5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYi1iYXIiKTt2YXIgaD1hLmxvY2F0aW9uO2YuY2xhc3NMaXN0LmFkZCgiZ29vZy10YWItYmFyLSIraCk7Zm9yKHZhciBrPVtdLHE9ZmEoYyksRz1xLm5leHQoKTshRy5kb25lO0c9cS5uZXh0KCkpe0c9Ry52YWx1ZTt2YXIgeD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKeC5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYiIpO3gudGV4dENvbnRlbnQ9RztmLmFwcGVuZENoaWxkKHgpO2sucHVzaCh4KX1oIT0iYm90dG9tIiYmZS5hcHBlbmRDaGlsZChmKTtxPW51bGw7aWYoaD09InRvcCJ8fGg9PSJib3R0b20iKXE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikscS5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYi1iYXItY2xlYXIiKTtoPT0idG9wIiYmcSYmZS5hcHBlbmRDaGlsZChxKTtHPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO0cuY2xhc3NMaXN0LmFkZCgiZ29vZy10YWItY29udGVudCIpO3ZhciBoYT1bXTtjPWZhKGMpO2Zvcih4PWMubmV4dCgpOyF4LmRvbmU7eD1jLm5leHQoKSl4PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHguaWQ9ZS5pZCsiX2NvbnRlbnRfIitoYS5sZW5ndGgseC5zdHlsZS5kaXNwbGF5PSJub25lIixHLmFwcGVuZENoaWxkKHgpLGhhLnB1c2goeCk7ZS5hcHBlbmRDaGlsZChHKTtoPT0iYm90dG9tIiYmKHEmJgplLmFwcGVuZENoaWxkKHEpLGUuYXBwZW5kQ2hpbGQoZikpO3ZhciBRPW5ldyBYKGgpO1NiKFEsZik7dmFyIFI9LTE7d2IoUSwic2VsZWN0IixmdW5jdGlvbihTKXtTPWsuaW5kZXhPZihTLnRhcmdldC5pKCkpO1MhPVImJihSPj0wJiZSPGhhLmxlbmd0aCYmKGhhW1JdLnN0eWxlLmRpc3BsYXk9Im5vbmUiLFI9LTEpLFM+PTAmJlM8aGEubGVuZ3RoJiYoUj1TLGhhW1JdLnN0eWxlLmRpc3BsYXk9ImlubGluZSIsd2luZG93LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCJyZXNpemUiKSksZ29vZ2xlLmNvbGFiLm91dHB1dC5yZXNpemVJZnJhbWVUb0NvbnRlbnQoKSksUS5KKEkoUSxSKSkpfSk7US5KKEkoUSxkKSk7d2luZG93W2JdPXtzZXRTZWxlY3RlZFRhYkluZGV4OmZ1bmN0aW9uKFMpe1EuSihJKFEsUykpfX07ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChqZChhKSl9LGxkPVsiY29sYWJfbGliIiwiY3JlYXRlVGFiQmFyIl0sWT1sOwpsZFswXWluIFl8fHR5cGVvZiBZLmV4ZWNTY3JpcHQ9PSJ1bmRlZmluZWQifHxZLmV4ZWNTY3JpcHQoInZhciAiK2xkWzBdKTtmb3IodmFyIFo7bGQubGVuZ3RoJiYoWj1sZC5zaGlmdCgpKTspbGQubGVuZ3RofHxrZD09PXZvaWQgMD9ZW1pdJiZZW1pdIT09T2JqZWN0LnByb3RvdHlwZVtaXT9ZPVlbWl06WT1ZW1pdPXt9OllbWl09a2Q7fSkuY2FsbCh0aGlzKTsKLy8gY2xhbmctZm9ybWF0IG9uCg==", + "ok": true, + "headers": [ + [ + "content-length", + "41785" + ], + [ + "content-type", + "application/javascript" + ] + ], + "status": 200, + "status_text": "" + } + }, + "base_uri": "https://localhost:8080/", + "height": 260 + }, + "outputId": "19a31b7c-f162-4ad9-a552-ea69568acfbb" + }, + "source": [ + "%%logica T, DoubleT\n", + "\n", + "T(1, \"apple\");\n", + "T(2, \"banana\");\n", + "T(3, \"orange\");\n", + "\n", + "DoubleT(d, y) :- T(x, y), d == 2 * x;" + ], + "execution_count": 34, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"6e5c4dba-d22d-11ef-a7c0-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id76\", \"tabNames\": [\"T\", \"DoubleT\", \"(Log)\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_f6b90fff2a" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"6e5cbb06-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id76\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_de19ad41b5" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"6e5e8bde-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_aa19759314" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"6e5f10cc-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id76_content_2\");\n", + "//# sourceURL=js_2c81dec88b" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"6e5fdc28-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"6e5f10cc-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_3e71326bf0" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"6e605644-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id76\"].setSelectedTabIndex(2);\n", + "//# sourceURL=js_66994f5067" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"6e62791a-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"6e5e8bde-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_4a95e42c5c" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"6e6570f2-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_9b86bb87b0" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"6e65d9e8-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id76_content_0\");\n", + "//# sourceURL=js_6527419510" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"6e666412-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"6e65d9e8-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_170cd77117" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"6e66d096-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id76\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_158cbaef16" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"6e694ace-d22d-11ef-a7c0-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id77\", \"tabNames\": [\"SQL\", \"Result\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_bc1c49d977" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"6e69b55e-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id77\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_a6f7d5a993" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"6e6cee86-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_6c244b3d58" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"6e6d3b48-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id77_content_0\");\n", + "//# sourceURL=js_37ffd068f3" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"6e6dc7c0-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"6e6d3b48-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_62baf3c709" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"6e6e132e-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id77\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_681cec0d58" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The following query is stored at \u001b[1mT_sql\u001b[0m variable.\n", + "-- Initializing DuckDB environment.\n", + "create schema if not exists logica_home;\n", + "-- Empty record, has to have a field by DuckDB syntax.\n", + "drop type if exists logicarecord893574736 cascade; create type logicarecord893574736 as struct(nirvana numeric);\n", + "create sequence if not exists eternal_logical_sequence;\n", + "\n", + "\n", + "-- Logica type: logicarecord481217614\n", + "drop type if exists logicarecord481217614 cascade; create type logicarecord481217614 as struct(r logicarecord893574736);\n", + "\n", + "-- Logica type: logicarecord383307722\n", + "drop type if exists logicarecord383307722 cascade; create type logicarecord383307722 as struct(a timestamp);\n", + "SELECT * FROM (\n", + " \n", + " SELECT\n", + " 1 AS col0,\n", + " 'apple' AS col1\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " 2 AS col0,\n", + " 'banana' AS col1\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " 3 AS col0,\n", + " 'orange' AS col1\n", + " \n", + ") AS UNUSED_TABLE_NAME ;\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"6e6f18a0-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"6e6cee86-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_26f9388f20" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"6e70cf24-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_0ce2cf1b0b" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"6e712578-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id77_content_1\");\n", + "//# sourceURL=js_a5b48084cd" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"6e71a05c-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"6e712578-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_55715bfac5" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"6e71f570-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id77\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_ec121b179e" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The following table is stored at \u001b[1mT\u001b[0m variable.\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
col0col1
01apple
12banana
23orange
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"6e733e6c-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"6e70cf24-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_e33c34b34e" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"6e748222-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"6e6570f2-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_175d086ec7" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"6e76262c-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_74c6db805d" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"6e768e28-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id76_content_2\");\n", + "//# sourceURL=js_4de6f1026e" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"6e76ef80-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"6e768e28-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_eca394959f" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"6e775ae2-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id76\"].setSelectedTabIndex(2);\n", + "//# sourceURL=js_ce931e4e81" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"6e7b5002-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"6e76262c-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_162b7e9d0c" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"6e7ceb1a-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_00f1ddf5c9" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"6e7d3d36-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id76_content_1\");\n", + "//# sourceURL=js_a038f6b702" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"6e7da55a-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"6e7d3d36-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_4ce5640b1c" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"6e7e01b2-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id76\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_526cb747b1" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"6e80967a-d22d-11ef-a7c0-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id78\", \"tabNames\": [\"SQL\", \"Result\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_248096fd33" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"6e80e922-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id78\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_fc31d7e73d" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"6e8318e6-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_340b828bf9" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"6e837318-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id78_content_0\");\n", + "//# sourceURL=js_f7ce78cec6" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"6e83beea-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"6e837318-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_d730f644b3" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"6e840698-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id78\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_c8b9322990" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The following query is stored at \u001b[1mDoubleT_sql\u001b[0m variable.\n", + "-- Initializing DuckDB environment.\n", + "create schema if not exists logica_home;\n", + "-- Empty record, has to have a field by DuckDB syntax.\n", + "drop type if exists logicarecord893574736 cascade; create type logicarecord893574736 as struct(nirvana numeric);\n", + "create sequence if not exists eternal_logical_sequence;\n", + "\n", + "\n", + "-- Logica type: logicarecord481217614\n", + "drop type if exists logicarecord481217614 cascade; create type logicarecord481217614 as struct(r logicarecord893574736);\n", + "\n", + "-- Logica type: logicarecord383307722\n", + "drop type if exists logicarecord383307722 cascade; create type logicarecord383307722 as struct(a timestamp);\n", + "WITH t_0_T AS (SELECT * FROM (\n", + " \n", + " SELECT\n", + " 1 AS col0,\n", + " 'apple' AS col1\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " 2 AS col0,\n", + " 'banana' AS col1\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " 3 AS col0,\n", + " 'orange' AS col1\n", + " \n", + ") AS UNUSED_TABLE_NAME )\n", + "SELECT\n", + " ((2) * (T.col0)) AS col0,\n", + " T.col1 AS col1\n", + "FROM\n", + " t_0_T AS T;\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"6e85262c-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"6e8318e6-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_23724c9e6f" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"6e86be74-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_ffcdbdf581" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"6e870ea6-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id78_content_1\");\n", + "//# sourceURL=js_a9e2e59f98" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"6e875b0e-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"6e870ea6-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_bab08d18da" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"6e87a5f0-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id78\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_012315aac6" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The following table is stored at \u001b[1mDoubleT\u001b[0m variable.\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
col0col1
02apple
14banana
26orange
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"6e8926d2-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"6e86be74-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_eaa1cb9cca" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"6e8a6cfe-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"6e7ceb1a-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_b73981d6fa" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"6e8bf254-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_e1355845ea" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"6e8c3fe8-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id76_content_2\");\n", + "//# sourceURL=js_7445c6b153" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"6e8c8804-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"6e8c3fe8-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_7a34700265" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"6e8ccba2-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id76\"].setSelectedTabIndex(2);\n", + "//# sourceURL=js_d9da26aea9" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "image/svg+xml": "\n\n\n\n\n\nConcertina\n\n\n\nDoubleT\n\nDoubleT\n\n\n\nT\n\nT\n\n\n\n", + "text/plain": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Running predicate: DoubleT (4 ms)\n", + "Running predicate: T (4 ms)\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"6ead92d8-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"6e8bf254-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_5f87078a2b" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"6eafce04-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_a0f0314d5e" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"6eb0258e-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id76_content_0\");\n", + "//# sourceURL=js_d2fe41b0c8" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"6eb072a0-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"6eb0258e-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_87af701761" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"6eb0bad0-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id76\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_45d7dd200d" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"6eb24eea-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_6eb11a7a10" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"6eb29bac-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id77_content_1\");\n", + "//# sourceURL=js_fc6c9cc42d" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"6eb2e396-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"6eb29bac-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_6b35792ace" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"6eb32928-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id77\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_7030f8dbf4" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"6eb4f1e0-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"6eb24eea-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_6e0b27baca" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + " \n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"6eb64bee-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"6eafce04-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_99b98278c6" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"6eb7dedc-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_066eac0db2" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"6eb8277a-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id76_content_1\");\n", + "//# sourceURL=js_215fa04d73" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"6eb86a64-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"6eb8277a-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_07aa00070a" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"6eb8b410-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id76\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_4c676bfa24" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"6eb9ed94-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_0aabe9f6b8" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"6eba34d4-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id78_content_1\");\n", + "//# sourceURL=js_e78b376922" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"6eba7b4c-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"6eba34d4-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_ebdb022030" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"6ebabe54-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id78\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_8b3da1f9b1" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"6ebc1e34-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"6eb9ed94-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_618c6702b2" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + " \n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"6ebd700e-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"6eb7dedc-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_b6f2ec427c" + ] + }, + "metadata": {} + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "5ih459asCl1K" + }, + "source": [ + "Here it appears that we are **assigning** variable $d$ a value of $2 * x$.\n", + "\n", + "But now consider the following usage:" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "kJs7Wf9sC5bA", + "colab": { + "resources": { + "http://localhost:8080/nbextensions/google.colab/tabbar_main.min.js": { + "data": "Ly8gY2xhbmctZm9ybWF0IG9mZgooZnVuY3Rpb24oKXt2YXIgZyxhYT1mdW5jdGlvbihhKXt2YXIgYj0wO3JldHVybiBmdW5jdGlvbigpe3JldHVybiBiPGEubGVuZ3RoP3tkb25lOiExLHZhbHVlOmFbYisrXX06e2RvbmU6ITB9fX0sYmE9dHlwZW9mIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzPT0iZnVuY3Rpb24iP09iamVjdC5kZWZpbmVQcm9wZXJ0eTpmdW5jdGlvbihhLGIsYyl7aWYoYT09QXJyYXkucHJvdG90eXBlfHxhPT1PYmplY3QucHJvdG90eXBlKXJldHVybiBhO2FbYl09Yy52YWx1ZTtyZXR1cm4gYX0sY2E9ZnVuY3Rpb24oYSl7YT1bIm9iamVjdCI9PXR5cGVvZiBnbG9iYWxUaGlzJiZnbG9iYWxUaGlzLGEsIm9iamVjdCI9PXR5cGVvZiB3aW5kb3cmJndpbmRvdywib2JqZWN0Ij09dHlwZW9mIHNlbGYmJnNlbGYsIm9iamVjdCI9PXR5cGVvZiBnbG9iYWwmJmdsb2JhbF07Zm9yKHZhciBiPTA7YjxhLmxlbmd0aDsrK2Ipe3ZhciBjPWFbYl07aWYoYyYmYy5NYXRoPT1NYXRoKXJldHVybiBjfXRocm93IEVycm9yKCJDYW5ub3QgZmluZCBnbG9iYWwgb2JqZWN0Iik7Cn0sZGE9Y2EodGhpcyksZWE9ZnVuY3Rpb24oYSxiKXtpZihiKWE6e3ZhciBjPWRhO2E9YS5zcGxpdCgiLiIpO2Zvcih2YXIgZD0wO2Q8YS5sZW5ndGgtMTtkKyspe3ZhciBlPWFbZF07aWYoIShlIGluIGMpKWJyZWFrIGE7Yz1jW2VdfWE9YVthLmxlbmd0aC0xXTtkPWNbYV07Yj1iKGQpO2IhPWQmJmIhPW51bGwmJmJhKGMsYSx7Y29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOmJ9KX19OwplYSgiU3ltYm9sIixmdW5jdGlvbihhKXtpZihhKXJldHVybiBhO3ZhciBiPWZ1bmN0aW9uKGYsaCl7dGhpcy5nPWY7YmEodGhpcywiZGVzY3JpcHRpb24iLHtjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6aH0pfTtiLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmd9O3ZhciBjPSJqc2NvbXBfc3ltYm9sXyIrKE1hdGgucmFuZG9tKCkqMUU5Pj4+MCkrIl8iLGQ9MCxlPWZ1bmN0aW9uKGYpe2lmKHRoaXMgaW5zdGFuY2VvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoIlN5bWJvbCBpcyBub3QgYSBjb25zdHJ1Y3RvciIpO3JldHVybiBuZXcgYihjKyhmfHwiIikrIl8iK2QrKyxmKX07cmV0dXJuIGV9KTsKdmFyIGZhPWZ1bmN0aW9uKGEpe3ZhciBiPXR5cGVvZiBTeW1ib2whPSJ1bmRlZmluZWQiJiZTeW1ib2wuaXRlcmF0b3ImJmFbU3ltYm9sLml0ZXJhdG9yXTtpZihiKXJldHVybiBiLmNhbGwoYSk7aWYodHlwZW9mIGEubGVuZ3RoPT0ibnVtYmVyIilyZXR1cm57bmV4dDphYShhKX07dGhyb3cgRXJyb3IoU3RyaW5nKGEpKyIgaXMgbm90IGFuIGl0ZXJhYmxlIG9yIEFycmF5TGlrZSIpO307ZWEoIlN5bWJvbC5kaXNwb3NlIixmdW5jdGlvbihhKXtyZXR1cm4gYT9hOlN5bWJvbCgiU3ltYm9sLmRpc3Bvc2UiKX0pOy8qCgogQ29weXJpZ2h0IFRoZSBDbG9zdXJlIExpYnJhcnkgQXV0aG9ycy4KIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wCiovCnZhciBsPXRoaXN8fHNlbGYsaWE9ZnVuY3Rpb24oYSl7YS5JYT12b2lkIDA7YS5WPWZ1bmN0aW9uKCl7cmV0dXJuIGEuSWE/YS5JYTphLklhPW5ldyBhfX0samE9ZnVuY3Rpb24oYSl7dmFyIGI9dHlwZW9mIGE7cmV0dXJuIGIhPSJvYmplY3QiP2I6YT9BcnJheS5pc0FycmF5KGEpPyJhcnJheSI6YjoibnVsbCJ9LGthPWZ1bmN0aW9uKGEpe3ZhciBiPWphKGEpO3JldHVybiBiPT0iYXJyYXkifHxiPT0ib2JqZWN0IiYmdHlwZW9mIGEubGVuZ3RoPT0ibnVtYmVyIn0sbT1mdW5jdGlvbihhKXt2YXIgYj10eXBlb2YgYTtyZXR1cm4gYj09Im9iamVjdCImJmEhPW51bGx8fGI9PSJmdW5jdGlvbiJ9LG5hPWZ1bmN0aW9uKGEpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYSxsYSkmJmFbbGFdfHwoYVtsYV09KyttYSl9LGxhPSJjbG9zdXJlX3VpZF8iKyhNYXRoLnJhbmRvbSgpKjFFOT4+PjApLG1hPTAsbj1mdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoKXt9Yy5wcm90b3R5cGU9CmIucHJvdG90eXBlO2EubD1iLnByb3RvdHlwZTthLnByb3RvdHlwZT1uZXcgYzthLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1hO2EucWQ9ZnVuY3Rpb24oZCxlLGYpe2Zvcih2YXIgaD1BcnJheShhcmd1bWVudHMubGVuZ3RoLTIpLGs9MjtrPGFyZ3VtZW50cy5sZW5ndGg7aysrKWhbay0yXT1hcmd1bWVudHNba107cmV0dXJuIGIucHJvdG90eXBlW2VdLmFwcGx5KGQsaCl9fTtmdW5jdGlvbiBvYShhLGIpe2lmKEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKUVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsb2EpO2Vsc2V7dmFyIGM9RXJyb3IoKS5zdGFjaztjJiYodGhpcy5zdGFjaz1jKX1hJiYodGhpcy5tZXNzYWdlPVN0cmluZyhhKSk7YiE9PXZvaWQgMCYmKHRoaXMuY2F1c2U9Yil9bihvYSxFcnJvcik7b2EucHJvdG90eXBlLm5hbWU9IkN1c3RvbUVycm9yIjt2YXIgcGE7ZnVuY3Rpb24gcWEoYSxiKXthPWEuc3BsaXQoIiVzIik7Zm9yKHZhciBjPSIiLGQ9YS5sZW5ndGgtMSxlPTA7ZTxkO2UrKyljKz1hW2VdKyhlPGIubGVuZ3RoP2JbZV06IiVzIik7b2EuY2FsbCh0aGlzLGMrYVtkXSl9bihxYSxvYSk7cWEucHJvdG90eXBlLm5hbWU9IkFzc2VydGlvbkVycm9yIjtmdW5jdGlvbiByYShhLGIsYyxkKXt2YXIgZT0iQXNzZXJ0aW9uIGZhaWxlZCI7aWYoYyl7ZSs9IjogIitjO3ZhciBmPWR9ZWxzZSBhJiYoZSs9IjogIithLGY9Yik7dGhyb3cgbmV3IHFhKCIiK2UsZnx8W10pO30KdmFyIHA9ZnVuY3Rpb24oYSxiLGMpe2F8fHJhKCIiLG51bGwsYixBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMikpO3JldHVybiBhfSxzYT1mdW5jdGlvbihhLGIsYyl7bShhKSYmYS5ub2RlVHlwZT09MXx8cmEoIkV4cGVjdGVkIEVsZW1lbnQgYnV0IGdvdCAlczogJXMuIixbamEoYSksYV0sYixBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMikpfSx1YT1mdW5jdGlvbihhLGIsYyxkKXthIGluc3RhbmNlb2YgYnx8cmEoIkV4cGVjdGVkIGluc3RhbmNlb2YgJXMgYnV0IGdvdCAlcy4iLFt0YShiKSx0YShhKV0sYyxBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMykpfTsKZnVuY3Rpb24gdGEoYSl7cmV0dXJuIGEgaW5zdGFuY2VvZiBGdW5jdGlvbj9hLmRpc3BsYXlOYW1lfHxhLm5hbWV8fCJ1bmtub3duIHR5cGUgbmFtZSI6YSBpbnN0YW5jZW9mIE9iamVjdD9hLmNvbnN0cnVjdG9yLmRpc3BsYXlOYW1lfHxhLmNvbnN0cnVjdG9yLm5hbWV8fE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhKTphPT09bnVsbD8ibnVsbCI6dHlwZW9mIGF9O3ZhciB2YT1BcnJheS5wcm90b3R5cGUuaW5kZXhPZj9mdW5jdGlvbihhLGIpe3AoYS5sZW5ndGghPW51bGwpO3JldHVybiBBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKGEsYix2b2lkIDApfTpmdW5jdGlvbihhLGIpe2lmKHR5cGVvZiBhPT09InN0cmluZyIpcmV0dXJuIHR5cGVvZiBiIT09InN0cmluZyJ8fGIubGVuZ3RoIT0xPy0xOmEuaW5kZXhPZihiLDApO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWlmKGMgaW4gYSYmYVtjXT09PWIpcmV0dXJuIGM7cmV0dXJuLTF9LHdhPUFycmF5LnByb3RvdHlwZS5mb3JFYWNoP2Z1bmN0aW9uKGEsYil7cChhLmxlbmd0aCE9bnVsbCk7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChhLGIsdm9pZCAwKX06ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9YS5sZW5ndGgsZD10eXBlb2YgYT09PSJzdHJpbmciP2Euc3BsaXQoIiIpOmEsZT0wO2U8YztlKyspZSBpbiBkJiZiLmNhbGwodm9pZCAwLGRbZV0sZSxhKX07CmZ1bmN0aW9uIHhhKGEsYil7Yj12YShhLGIpO3ZhciBjO2lmKGM9Yj49MClwKGEubGVuZ3RoIT1udWxsKSxBcnJheS5wcm90b3R5cGUuc3BsaWNlLmNhbGwoYSxiLDEpO3JldHVybiBjfWZ1bmN0aW9uIHlhKGEpe3ZhciBiPWEubGVuZ3RoO2lmKGI+MCl7Zm9yKHZhciBjPUFycmF5KGIpLGQ9MDtkPGI7ZCsrKWNbZF09YVtkXTtyZXR1cm4gY31yZXR1cm5bXX1mdW5jdGlvbiB6YShhLGIsYyxkKXtwKGEubGVuZ3RoIT1udWxsKTtBcnJheS5wcm90b3R5cGUuc3BsaWNlLmFwcGx5KGEsQWEoYXJndW1lbnRzLDEpKX1mdW5jdGlvbiBBYShhLGIsYyl7cChhLmxlbmd0aCE9bnVsbCk7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg8PTI/QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYSxiKTpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhLGIsYyl9O2Z1bmN0aW9uIEJhKGEsYixjKXtmb3IodmFyIGQgaW4gYSliLmNhbGwoYyxhW2RdLGQsYSl9ZnVuY3Rpb24gQ2EoYSxiKXtmb3IodmFyIGMgaW4gYSlpZihhW2NdPT1iKXJldHVybiEwO3JldHVybiExfWZ1bmN0aW9uIERhKGEsYixjKXtpZihhIT09bnVsbCYmYiBpbiBhKXRocm93IEVycm9yKCdUaGUgb2JqZWN0IGFscmVhZHkgY29udGFpbnMgdGhlIGtleSAiJytiKyciJyk7YVtiXT1jfWZ1bmN0aW9uIEVhKGEpe3ZhciBiPXt9LGM7Zm9yKGMgaW4gYSliW2FbY11dPWM7cmV0dXJuIGJ9dmFyIEZhPSJjb25zdHJ1Y3RvciBoYXNPd25Qcm9wZXJ0eSBpc1Byb3RvdHlwZU9mIHByb3BlcnR5SXNFbnVtZXJhYmxlIHRvTG9jYWxlU3RyaW5nIHRvU3RyaW5nIHZhbHVlT2YiLnNwbGl0KCIgIik7CmZ1bmN0aW9uIEdhKGEsYil7Zm9yKHZhciBjLGQsZT0xO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspe2Q9YXJndW1lbnRzW2VdO2ZvcihjIGluIGQpYVtjXT1kW2NdO2Zvcih2YXIgZj0wO2Y8RmEubGVuZ3RoO2YrKyljPUZhW2ZdLE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChkLGMpJiYoYVtjXT1kW2NdKX19O3ZhciBIYT1TdHJpbmcucHJvdG90eXBlLnRyaW0/ZnVuY3Rpb24oYSl7cmV0dXJuIGEudHJpbSgpfTpmdW5jdGlvbihhKXtyZXR1cm4vXltcc1x4YTBdKihbXHNcU10qPylbXHNceGEwXSokLy5leGVjKGEpWzFdfTsvKgoKIENvcHlyaWdodCBHb29nbGUgTExDCiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMAoqLwp2YXIgSWE9e307dmFyIEphPWZ1bmN0aW9uKGEpe2lmKElhIT09SWEpdGhyb3cgRXJyb3IoIkJhZCBzZWNyZXQiKTt0aGlzLmc9YX07SmEucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ307bmV3IEphKCJhYm91dDpibGFuayIpO25ldyBKYSgiYWJvdXQ6aW52YWxpZCN6Q2xvc3VyZXoiKTt2YXIgS2E9W10sTGE9ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJBIFVSTCB3aXRoIGNvbnRlbnQgJyIrYSsiJyB3YXMgc2FuaXRpemVkIGF3YXkuIil9O0thLmluZGV4T2YoTGEpPT09LTEmJkthLnB1c2goTGEpO3ZhciBNYSxOYTthOntmb3IodmFyIE9hPVsiQ0xPU1VSRV9GTEFHUyJdLFBhPWwsUWE9MDtRYTxPYS5sZW5ndGg7UWErKylpZihQYT1QYVtPYVtRYV1dLFBhPT1udWxsKXtOYT1udWxsO2JyZWFrIGF9TmE9UGF9dmFyIFJhPU5hJiZOYVs2MTA0MDEzMDFdO01hPVJhIT1udWxsP1JhOiExO2Z1bmN0aW9uIFNhKCl7dmFyIGE9bC5uYXZpZ2F0b3I7cmV0dXJuIGEmJihhPWEudXNlckFnZW50KT9hOiIifXZhciBUYSxVYT1sLm5hdmlnYXRvcjtUYT1VYT9VYS51c2VyQWdlbnREYXRhfHxudWxsOm51bGw7ZnVuY3Rpb24gcihhKXtyZXR1cm4gU2EoKS5pbmRleE9mKGEpIT0tMX07dmFyIFZhPXIoIkVkZ2UiKSx0PXIoIkdlY2tvIikmJiEoU2EoKS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoIndlYmtpdCIpIT0tMSYmIXIoIkVkZ2UiKSkmJiEocigiVHJpZGVudCIpfHxyKCJNU0lFIikpJiYhcigiRWRnZSIpLHU9U2EoKS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoIndlYmtpdCIpIT0tMSYmIXIoIkVkZ2UiKSx2PU1hJiZUYSYmVGEucGxhdGZvcm0/VGEucGxhdGZvcm09PT0ibWFjT1MiOnIoIk1hY2ludG9zaCIpO3ZhciBYYT1mdW5jdGlvbihhLGIpe0JhKGIsZnVuY3Rpb24oYyxkKXtkPT0ic3R5bGUiP2Euc3R5bGUuY3NzVGV4dD1jOmQ9PSJjbGFzcyI/YS5jbGFzc05hbWU9YzpkPT0iZm9yIj9hLmh0bWxGb3I9YzpXYS5oYXNPd25Qcm9wZXJ0eShkKT9hLnNldEF0dHJpYnV0ZShXYVtkXSxjKTpkLmxhc3RJbmRleE9mKCJhcmlhLSIsMCk9PTB8fGQubGFzdEluZGV4T2YoImRhdGEtIiwwKT09MD9hLnNldEF0dHJpYnV0ZShkLGMpOmFbZF09Y30pfSxXYT17Y2VsbHBhZGRpbmc6ImNlbGxQYWRkaW5nIixjZWxsc3BhY2luZzoiY2VsbFNwYWNpbmciLGNvbHNwYW46ImNvbFNwYW4iLGZyYW1lYm9yZGVyOiJmcmFtZUJvcmRlciIsaGVpZ2h0OiJoZWlnaHQiLG1heGxlbmd0aDoibWF4TGVuZ3RoIixub25jZToibm9uY2UiLHJvbGU6InJvbGUiLHJvd3NwYW46InJvd1NwYW4iLHR5cGU6InR5cGUiLHVzZW1hcDoidXNlTWFwIix2YWxpZ246InZBbGlnbiIsd2lkdGg6IndpZHRoIn0sWWE9ZnVuY3Rpb24oYSwKYixjKXtmdW5jdGlvbiBkKGspe2smJmIuYXBwZW5kQ2hpbGQodHlwZW9mIGs9PT0ic3RyaW5nIj9hLmNyZWF0ZVRleHROb2RlKGspOmspfWZvcih2YXIgZT0yO2U8Yy5sZW5ndGg7ZSsrKXt2YXIgZj1jW2VdO2lmKCFrYShmKXx8bShmKSYmZi5ub2RlVHlwZT4wKWQoZik7ZWxzZXthOntpZihmJiZ0eXBlb2YgZi5sZW5ndGg9PSJudW1iZXIiKXtpZihtKGYpKXt2YXIgaD10eXBlb2YgZi5pdGVtPT0iZnVuY3Rpb24ifHx0eXBlb2YgZi5pdGVtPT0ic3RyaW5nIjticmVhayBhfWlmKHR5cGVvZiBmPT09ImZ1bmN0aW9uIil7aD10eXBlb2YgZi5pdGVtPT0iZnVuY3Rpb24iO2JyZWFrIGF9fWg9ITF9d2EoaD95YShmKTpmLGQpfX19LFphPWZ1bmN0aW9uKGEsYil7Yj1TdHJpbmcoYik7YS5jb250ZW50VHlwZT09PSJhcHBsaWNhdGlvbi94aHRtbCt4bWwiJiYoYj1iLnRvTG93ZXJDYXNlKCkpO3JldHVybiBhLmNyZWF0ZUVsZW1lbnQoYil9LCRhPWZ1bmN0aW9uKGEpe2EmJmEucGFyZW50Tm9kZSYmCmEucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhKX0sYWI9ZnVuY3Rpb24oYSxiKXtpZighYXx8IWIpcmV0dXJuITE7aWYoYS5jb250YWlucyYmYi5ub2RlVHlwZT09MSlyZXR1cm4gYT09Ynx8YS5jb250YWlucyhiKTtpZih0eXBlb2YgYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiE9InVuZGVmaW5lZCIpcmV0dXJuIGE9PWJ8fCEhKGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24oYikmMTYpO2Zvcig7YiYmYSE9YjspYj1iLnBhcmVudE5vZGU7cmV0dXJuIGI9PWF9LGJiPWZ1bmN0aW9uKGEpe3AoYSwiTm9kZSBjYW5ub3QgYmUgbnVsbCBvciB1bmRlZmluZWQuIik7cmV0dXJuIGEubm9kZVR5cGU9PTk/YTphLm93bmVyRG9jdW1lbnR8fGEuZG9jdW1lbnR9LGNiPWZ1bmN0aW9uKGEsYil7Yj9hLnRhYkluZGV4PTA6KGEudGFiSW5kZXg9LTEsYS5yZW1vdmVBdHRyaWJ1dGUoInRhYkluZGV4IikpfSxkYj1mdW5jdGlvbihhKXtyZXR1cm4gYS5oYXNBdHRyaWJ1dGUoInRhYmluZGV4Iil9LGViPQpmdW5jdGlvbihhKXthPWEudGFiSW5kZXg7cmV0dXJuIHR5cGVvZiBhPT09Im51bWJlciImJmE+PTAmJmE8MzI3Njh9LGZiPWZ1bmN0aW9uKGEpe3RoaXMuZz1hfHxsLmRvY3VtZW50fHxkb2N1bWVudH07ZmIucHJvdG90eXBlLmk9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nO3JldHVybiB0eXBlb2YgYT09PSJzdHJpbmciP2IuZ2V0RWxlbWVudEJ5SWQoYSk6YX07ZmIucHJvdG90eXBlLmg9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXMuZyxlPWFyZ3VtZW50cyxmPWVbMV0saD1aYShkLFN0cmluZyhlWzBdKSk7ZiYmKHR5cGVvZiBmPT09InN0cmluZyI/aC5jbGFzc05hbWU9ZjpBcnJheS5pc0FycmF5KGYpP2guY2xhc3NOYW1lPWYuam9pbigiICIpOlhhKGgsZikpO2UubGVuZ3RoPjImJllhKGQsaCxlKTtyZXR1cm4gaH07dmFyIHc9ZnVuY3Rpb24oKXt0aGlzLmJhPXRoaXMuYmE7dGhpcy5rYT10aGlzLmthfTt3LnByb3RvdHlwZS5iYT0hMTt3LnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7dGhpcy5iYXx8KHRoaXMuYmE9ITAsdGhpcy5DKCkpfTt3LnByb3RvdHlwZVtTeW1ib2wuZGlzcG9zZV09ZnVuY3Rpb24oKXt0aGlzLmRpc3Bvc2UoKX07dy5wcm90b3R5cGUuQz1mdW5jdGlvbigpe2lmKHRoaXMua2EpZm9yKDt0aGlzLmthLmxlbmd0aDspdGhpcy5rYS5zaGlmdCgpKCl9O3ZhciB5PWZ1bmN0aW9uKGEsYil7dGhpcy50eXBlPWE7dGhpcy51PXRoaXMudGFyZ2V0PWI7dGhpcy5kZWZhdWx0UHJldmVudGVkPXRoaXMuQT0hMX07eS5wcm90b3R5cGUudj1mdW5jdGlvbigpe3RoaXMuQT0hMH07eS5wcm90b3R5cGUuaj1mdW5jdGlvbigpe3RoaXMuZGVmYXVsdFByZXZlbnRlZD0hMH07dmFyIGdiPWZ1bmN0aW9uKCl7aWYoIWwuYWRkRXZlbnRMaXN0ZW5lcnx8IU9iamVjdC5kZWZpbmVQcm9wZXJ0eSlyZXR1cm4hMTt2YXIgYT0hMSxiPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwicGFzc2l2ZSIse2dldDpmdW5jdGlvbigpe2E9ITB9fSk7dHJ5e3ZhciBjPWZ1bmN0aW9uKCl7fTtsLmFkZEV2ZW50TGlzdGVuZXIoInRlc3QiLGMsYik7bC5yZW1vdmVFdmVudExpc3RlbmVyKCJ0ZXN0IixjLGIpfWNhdGNoKGQpe31yZXR1cm4gYX0oKTt2YXIgej1mdW5jdGlvbihhLGIpe3kuY2FsbCh0aGlzLGE/YS50eXBlOiIiKTt0aGlzLnJlbGF0ZWRUYXJnZXQ9dGhpcy51PXRoaXMudGFyZ2V0PW51bGw7dGhpcy5idXR0b249dGhpcy5zY3JlZW5ZPXRoaXMuc2NyZWVuWD10aGlzLmNsaWVudFk9dGhpcy5jbGllbnRYPTA7dGhpcy5rZXk9IiI7dGhpcy5nPTA7dGhpcy5tZXRhS2V5PXRoaXMuc2hpZnRLZXk9dGhpcy5hbHRLZXk9dGhpcy5jdHJsS2V5PSExO3RoaXMuc3RhdGU9bnVsbDt0aGlzLkc9ITE7dGhpcy5wb2ludGVySWQ9MDt0aGlzLnBvaW50ZXJUeXBlPSIiO3RoaXMudGltZVN0YW1wPTA7dGhpcy5oPW51bGw7aWYoYSl7dmFyIGM9dGhpcy50eXBlPWEudHlwZSxkPWEuY2hhbmdlZFRvdWNoZXMmJmEuY2hhbmdlZFRvdWNoZXMubGVuZ3RoP2EuY2hhbmdlZFRvdWNoZXNbMF06bnVsbDt0aGlzLnRhcmdldD1hLnRhcmdldHx8YS5zcmNFbGVtZW50O3RoaXMudT1iO2I9YS5yZWxhdGVkVGFyZ2V0O2J8fChjPT0ibW91c2VvdmVyIj8KYj1hLmZyb21FbGVtZW50OmM9PSJtb3VzZW91dCImJihiPWEudG9FbGVtZW50KSk7dGhpcy5yZWxhdGVkVGFyZ2V0PWI7ZD8odGhpcy5jbGllbnRYPWQuY2xpZW50WCE9PXZvaWQgMD9kLmNsaWVudFg6ZC5wYWdlWCx0aGlzLmNsaWVudFk9ZC5jbGllbnRZIT09dm9pZCAwP2QuY2xpZW50WTpkLnBhZ2VZLHRoaXMuc2NyZWVuWD1kLnNjcmVlblh8fDAsdGhpcy5zY3JlZW5ZPWQuc2NyZWVuWXx8MCk6KHRoaXMuY2xpZW50WD1hLmNsaWVudFghPT12b2lkIDA/YS5jbGllbnRYOmEucGFnZVgsdGhpcy5jbGllbnRZPWEuY2xpZW50WSE9PXZvaWQgMD9hLmNsaWVudFk6YS5wYWdlWSx0aGlzLnNjcmVlblg9YS5zY3JlZW5YfHwwLHRoaXMuc2NyZWVuWT1hLnNjcmVlbll8fDApO3RoaXMuYnV0dG9uPWEuYnV0dG9uO3RoaXMuZz1hLmtleUNvZGV8fDA7dGhpcy5rZXk9YS5rZXl8fCIiO3RoaXMuY3RybEtleT1hLmN0cmxLZXk7dGhpcy5hbHRLZXk9YS5hbHRLZXk7dGhpcy5zaGlmdEtleT1hLnNoaWZ0S2V5Owp0aGlzLm1ldGFLZXk9YS5tZXRhS2V5O3RoaXMuRz12P2EubWV0YUtleTphLmN0cmxLZXk7dGhpcy5wb2ludGVySWQ9YS5wb2ludGVySWR8fDA7dGhpcy5wb2ludGVyVHlwZT1hLnBvaW50ZXJUeXBlO3RoaXMuc3RhdGU9YS5zdGF0ZTt0aGlzLnRpbWVTdGFtcD1hLnRpbWVTdGFtcDt0aGlzLmg9YTthLmRlZmF1bHRQcmV2ZW50ZWQmJnoubC5qLmNhbGwodGhpcyl9fTtuKHoseSk7ei5wcm90b3R5cGUudj1mdW5jdGlvbigpe3oubC52LmNhbGwodGhpcyk7dGhpcy5oLnN0b3BQcm9wYWdhdGlvbj90aGlzLmguc3RvcFByb3BhZ2F0aW9uKCk6dGhpcy5oLmNhbmNlbEJ1YmJsZT0hMH07ei5wcm90b3R5cGUuaj1mdW5jdGlvbigpe3oubC5qLmNhbGwodGhpcyk7dmFyIGE9dGhpcy5oO2EucHJldmVudERlZmF1bHQ/YS5wcmV2ZW50RGVmYXVsdCgpOmEucmV0dXJuVmFsdWU9ITF9O3ZhciBoYj0iY2xvc3VyZV9saXN0ZW5hYmxlXyIrKE1hdGgucmFuZG9tKCkqMUU2fDApLGliPWZ1bmN0aW9uKGEpe3JldHVybiEoIWF8fCFhW2hiXSl9O3ZhciBqYj0wO3ZhciBrYj1mdW5jdGlvbihhLGIsYyxkLGUpe3RoaXMubGlzdGVuZXI9YTt0aGlzLnByb3h5PW51bGw7dGhpcy5zcmM9Yjt0aGlzLnR5cGU9Yzt0aGlzLmNhcHR1cmU9ISFkO3RoaXMucGE9ZTt0aGlzLmtleT0rK2piO3RoaXMuamE9dGhpcy5vYT0hMX0sbGI9ZnVuY3Rpb24oYSl7YS5qYT0hMDthLmxpc3RlbmVyPW51bGw7YS5wcm94eT1udWxsO2Euc3JjPW51bGw7YS5wYT1udWxsfTt2YXIgbWI9ZnVuY3Rpb24oYSl7dGhpcy5zcmM9YTt0aGlzLmc9e307dGhpcy5oPTB9O21iLnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZj1hLnRvU3RyaW5nKCk7YT10aGlzLmdbZl07YXx8KGE9dGhpcy5nW2ZdPVtdLHRoaXMuaCsrKTt2YXIgaD1uYihhLGIsZCxlKTtoPi0xPyhiPWFbaF0sY3x8KGIub2E9ITEpKTooYj1uZXcga2IoYix0aGlzLnNyYyxmLCEhZCxlKSxiLm9hPWMsYS5wdXNoKGIpKTtyZXR1cm4gYn07CnZhciBvYj1mdW5jdGlvbihhLGIpe3ZhciBjPWIudHlwZTtjIGluIGEuZyYmeGEoYS5nW2NdLGIpJiYobGIoYiksYS5nW2NdLmxlbmd0aD09MCYmKGRlbGV0ZSBhLmdbY10sYS5oLS0pKX0scGI9ZnVuY3Rpb24oYSxiLGMsZCxlKXthPWEuZ1tiLnRvU3RyaW5nKCldO2I9LTE7YSYmKGI9bmIoYSxjLGQsZSkpO3JldHVybiBiPi0xP2FbYl06bnVsbH0sbmI9ZnVuY3Rpb24oYSxiLGMsZCl7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDsrK2Upe3ZhciBmPWFbZV07aWYoIWYuamEmJmYubGlzdGVuZXI9PWImJmYuY2FwdHVyZT09ISFjJiZmLnBhPT1kKXJldHVybiBlfXJldHVybi0xfTt2YXIgcWI9ImNsb3N1cmVfbG1fIisoTWF0aC5yYW5kb20oKSoxRTZ8MCkscmI9e30sc2I9MCx1Yj1mdW5jdGlvbihhLGIsYyxkLGUpe2lmKGQmJmQub25jZSlyZXR1cm4gdGIoYSxiLGMsZCxlKTtpZihBcnJheS5pc0FycmF5KGIpKXtmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKyl1YihhLGJbZl0sYyxkLGUpO3JldHVybiBudWxsfWM9dmIoYyk7cmV0dXJuIGliKGEpP3diKGEsYixjLG0oZCk/ISFkLmNhcHR1cmU6ISFkLGUpOnhiKGEsYixjLCExLGQsZSl9LHhiPWZ1bmN0aW9uKGEsYixjLGQsZSxmKXtpZighYil0aHJvdyBFcnJvcigiSW52YWxpZCBldmVudCB0eXBlIik7dmFyIGg9bShlKT8hIWUuY2FwdHVyZTohIWUsaz15YihhKTtrfHwoYVtxYl09az1uZXcgbWIoYSkpO2M9ay5hZGQoYixjLGQsaCxmKTtpZihjLnByb3h5KXJldHVybiBjO2Q9emIoKTtjLnByb3h5PWQ7ZC5zcmM9YTtkLmxpc3RlbmVyPWM7aWYoYS5hZGRFdmVudExpc3RlbmVyKWdifHwoZT1oKSxlPT09dm9pZCAwJiYKKGU9ITEpLGEuYWRkRXZlbnRMaXN0ZW5lcihiLnRvU3RyaW5nKCksZCxlKTtlbHNlIGlmKGEuYXR0YWNoRXZlbnQpYS5hdHRhY2hFdmVudChBYihiLnRvU3RyaW5nKCkpLGQpO2Vsc2UgaWYoYS5hZGRMaXN0ZW5lciYmYS5yZW1vdmVMaXN0ZW5lcilwKGI9PT0iY2hhbmdlIiwiTWVkaWFRdWVyeUxpc3Qgb25seSBoYXMgYSBjaGFuZ2UgZXZlbnQiKSxhLmFkZExpc3RlbmVyKGQpO2Vsc2UgdGhyb3cgRXJyb3IoImFkZEV2ZW50TGlzdGVuZXIgYW5kIGF0dGFjaEV2ZW50IGFyZSB1bmF2YWlsYWJsZS4iKTtzYisrO3JldHVybiBjfSx6Yj1mdW5jdGlvbigpe3ZhciBhPUJiLGI9ZnVuY3Rpb24oYyl7cmV0dXJuIGEuY2FsbChiLnNyYyxiLmxpc3RlbmVyLGMpfTtyZXR1cm4gYn0sdGI9ZnVuY3Rpb24oYSxiLGMsZCxlKXtpZihBcnJheS5pc0FycmF5KGIpKXtmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKyl0YihhLGJbZl0sYyxkLGUpO3JldHVybiBudWxsfWM9dmIoYyk7cmV0dXJuIGliKGEpPwphLkEuYWRkKFN0cmluZyhiKSxjLCEwLG0oZCk/ISFkLmNhcHR1cmU6ISFkLGUpOnhiKGEsYixjLCEwLGQsZSl9LENiPWZ1bmN0aW9uKGEsYixjLGQsZSl7aWYoQXJyYXkuaXNBcnJheShiKSlmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKylDYihhLGJbZl0sYyxkLGUpO2Vsc2UgZD1tKGQpPyEhZC5jYXB0dXJlOiEhZCxjPXZiKGMpLGliKGEpPyhhPWEuQSxiPVN0cmluZyhiKS50b1N0cmluZygpLGIgaW4gYS5nJiYoZj1hLmdbYl0sYz1uYihmLGMsZCxlKSxjPi0xJiYobGIoZltjXSkscChmLmxlbmd0aCE9bnVsbCksQXJyYXkucHJvdG90eXBlLnNwbGljZS5jYWxsKGYsYywxKSxmLmxlbmd0aD09MCYmKGRlbGV0ZSBhLmdbYl0sYS5oLS0pKSkpOmEmJihhPXliKGEpKSYmKGM9cGIoYSxiLGMsZCxlKSkmJkEoYyl9LEE9ZnVuY3Rpb24oYSl7aWYodHlwZW9mIGEhPT0ibnVtYmVyIiYmYSYmIWEuamEpe3ZhciBiPWEuc3JjO2lmKGliKGIpKW9iKGIuQSxhKTtlbHNle3ZhciBjPWEudHlwZSwKZD1hLnByb3h5O2IucmVtb3ZlRXZlbnRMaXN0ZW5lcj9iLnJlbW92ZUV2ZW50TGlzdGVuZXIoYyxkLGEuY2FwdHVyZSk6Yi5kZXRhY2hFdmVudD9iLmRldGFjaEV2ZW50KEFiKGMpLGQpOmIuYWRkTGlzdGVuZXImJmIucmVtb3ZlTGlzdGVuZXImJmIucmVtb3ZlTGlzdGVuZXIoZCk7c2ItLTsoYz15YihiKSk/KG9iKGMsYSksYy5oPT0wJiYoYy5zcmM9bnVsbCxiW3FiXT1udWxsKSk6bGIoYSl9fX0sQWI9ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW4gcmI/cmJbYV06cmJbYV09Im9uIithfSxCYj1mdW5jdGlvbihhLGIpe2lmKGEuamEpYT0hMDtlbHNle2I9bmV3IHooYix0aGlzKTt2YXIgYz1hLmxpc3RlbmVyLGQ9YS5wYXx8YS5zcmM7YS5vYSYmQShhKTthPWMuY2FsbChkLGIpfXJldHVybiBhfSx5Yj1mdW5jdGlvbihhKXthPWFbcWJdO3JldHVybiBhIGluc3RhbmNlb2YgbWI/YTpudWxsfSxEYj0iX19jbG9zdXJlX2V2ZW50c19mbl8iKyhNYXRoLnJhbmRvbSgpKjFFOT4+PjApLHZiPWZ1bmN0aW9uKGEpe3AoYSwKIkxpc3RlbmVyIGNhbiBub3QgYmUgbnVsbC4iKTtpZih0eXBlb2YgYT09PSJmdW5jdGlvbiIpcmV0dXJuIGE7cChhLmhhbmRsZUV2ZW50LCJBbiBvYmplY3QgbGlzdGVuZXIgbXVzdCBoYXZlIGhhbmRsZUV2ZW50IG1ldGhvZC4iKTthW0RiXXx8KGFbRGJdPWZ1bmN0aW9uKGIpe3JldHVybiBhLmhhbmRsZUV2ZW50KGIpfSk7cmV0dXJuIGFbRGJdfTt2YXIgRWI9ZnVuY3Rpb24oYSl7dy5jYWxsKHRoaXMpO3RoaXMuaD1hO3RoaXMuZz17fX07bihFYix3KTsKdmFyIEZiPVtdLEI9ZnVuY3Rpb24oYSxiLGMsZCl7QXJyYXkuaXNBcnJheShjKXx8KGMmJihGYlswXT1jLnRvU3RyaW5nKCkpLGM9RmIpO2Zvcih2YXIgZT0wO2U8Yy5sZW5ndGg7ZSsrKXt2YXIgZj11YihiLGNbZV0sZHx8YS5oYW5kbGVFdmVudCwhMSxhLmh8fGEpO2lmKCFmKWJyZWFrO2EuZ1tmLmtleV09Zn1yZXR1cm4gYX0sQz1mdW5jdGlvbihhLGIsYyxkLGUsZil7aWYoQXJyYXkuaXNBcnJheShjKSlmb3IodmFyIGg9MDtoPGMubGVuZ3RoO2grKylDKGEsYixjW2hdLGQsZSxmKTtlbHNlIGQ9ZHx8YS5oYW5kbGVFdmVudCxlPW0oZSk/ISFlLmNhcHR1cmU6ISFlLGY9Znx8YS5ofHxhLGQ9dmIoZCksZT0hIWUsYz1pYihiKT9wYihiLkEsU3RyaW5nKGMpLGQsZSxmKTpiPyhiPXliKGIpKT9wYihiLGMsZCxlLGYpOm51bGw6bnVsbCxjJiYoQShjKSxkZWxldGUgYS5nW2Mua2V5XSk7cmV0dXJuIGF9LEdiPWZ1bmN0aW9uKGEpe0JhKGEuZyxmdW5jdGlvbihiLGMpe3RoaXMuZy5oYXNPd25Qcm9wZXJ0eShjKSYmCkEoYil9LGEpO2EuZz17fX07RWIucHJvdG90eXBlLkM9ZnVuY3Rpb24oKXtFYi5sLkMuY2FsbCh0aGlzKTtHYih0aGlzKX07RWIucHJvdG90eXBlLmhhbmRsZUV2ZW50PWZ1bmN0aW9uKCl7dGhyb3cgRXJyb3IoIkV2ZW50SGFuZGxlci5oYW5kbGVFdmVudCBub3QgaW1wbGVtZW50ZWQiKTt9O3ZhciBEPWZ1bmN0aW9uKCl7dy5jYWxsKHRoaXMpO3RoaXMuQT1uZXcgbWIodGhpcyk7dGhpcy5ZYT10aGlzO3RoaXMubGE9bnVsbH07bihELHcpO0QucHJvdG90eXBlW2hiXT0hMDtELnByb3RvdHlwZS5BYT1mdW5jdGlvbihhKXt0aGlzLmxhPWF9O0QucHJvdG90eXBlLnJlbW92ZUV2ZW50TGlzdGVuZXI9ZnVuY3Rpb24oYSxiLGMsZCl7Q2IodGhpcyxhLGIsYyxkKX07CnZhciBFPWZ1bmN0aW9uKGEsYil7SGIoYSk7dmFyIGM9YS5sYTtpZihjKXt2YXIgZD1bXTtmb3IodmFyIGU9MTtjO2M9Yy5sYSlkLnB1c2goYykscCgrK2U8MUUzLCJpbmZpbml0ZSBsb29wIil9YT1hLllhO2M9Yi50eXBlfHxiO3R5cGVvZiBiPT09InN0cmluZyI/Yj1uZXcgeShiLGEpOmIgaW5zdGFuY2VvZiB5P2IudGFyZ2V0PWIudGFyZ2V0fHxhOihlPWIsYj1uZXcgeShjLGEpLEdhKGIsZSkpO2U9ITA7dmFyIGY7aWYoZClmb3IoZj1kLmxlbmd0aC0xOyFiLkEmJmY+PTA7Zi0tKXt2YXIgaD1iLnU9ZFtmXTtlPUliKGgsYywhMCxiKSYmZX1iLkF8fChoPWIudT1hLGU9SWIoaCxjLCEwLGIpJiZlLGIuQXx8KGU9SWIoaCxjLCExLGIpJiZlKSk7aWYoZClmb3IoZj0wOyFiLkEmJmY8ZC5sZW5ndGg7ZisrKWg9Yi51PWRbZl0sZT1JYihoLGMsITEsYikmJmU7cmV0dXJuIGV9OwpELnByb3RvdHlwZS5DPWZ1bmN0aW9uKCl7RC5sLkMuY2FsbCh0aGlzKTtpZih0aGlzLkEpe3ZhciBhPXRoaXMuQSxiPTAsYztmb3IoYyBpbiBhLmcpe2Zvcih2YXIgZD1hLmdbY10sZT0wO2U8ZC5sZW5ndGg7ZSsrKSsrYixsYihkW2VdKTtkZWxldGUgYS5nW2NdO2EuaC0tfX10aGlzLmxhPW51bGx9O3ZhciB3Yj1mdW5jdGlvbihhLGIsYyxkLGUpe0hiKGEpO3JldHVybiBhLkEuYWRkKFN0cmluZyhiKSxjLCExLGQsZSl9LEliPWZ1bmN0aW9uKGEsYixjLGQpe2I9YS5BLmdbU3RyaW5nKGIpXTtpZighYilyZXR1cm4hMDtiPWIuY29uY2F0KCk7Zm9yKHZhciBlPSEwLGY9MDtmPGIubGVuZ3RoOysrZil7dmFyIGg9YltmXTtpZihoJiYhaC5qYSYmaC5jYXB0dXJlPT1jKXt2YXIgaz1oLmxpc3RlbmVyLHE9aC5wYXx8aC5zcmM7aC5vYSYmb2IoYS5BLGgpO2U9ay5jYWxsKHEsZCkhPT0hMSYmZX19cmV0dXJuIGUmJiFkLmRlZmF1bHRQcmV2ZW50ZWR9LEhiPWZ1bmN0aW9uKGEpe3AoYS5BLCJFdmVudCB0YXJnZXQgaXMgbm90IGluaXRpYWxpemVkLiBEaWQgeW91IGNhbGwgdGhlIHN1cGVyY2xhc3MgKGdvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0KSBjb25zdHJ1Y3Rvcj8iKX07dmFyIEpiPXQ/Ik1velVzZXJTZWxlY3QiOnV8fFZhPyJXZWJraXRVc2VyU2VsZWN0IjpudWxsLEtiPWZ1bmN0aW9uKGEsYil7Yj1iP251bGw6YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpO2lmKEpiJiYoYS5zdHlsZSYmKGEuc3R5bGVbSmJdPSJub25lIiksYikpZm9yKHZhciBjPTA7YT1iW2NdO2MrKylhLnN0eWxlJiYoYS5zdHlsZVtKYl09Im5vbmUiKX07dmFyIExiPWZ1bmN0aW9uKCl7fTtpYShMYik7TGIucHJvdG90eXBlLmc9MDt2YXIgRj1mdW5jdGlvbihhKXtELmNhbGwodGhpcyk7dGhpcy5HPWF8fHBhfHwocGE9bmV3IGZiKTt0aGlzLnphPU1iO3RoaXMuWT1udWxsO3RoaXMucz0hMTt0aGlzLmc9bnVsbDt0aGlzLk09dm9pZCAwO3RoaXMudT10aGlzLmo9dGhpcy5oPW51bGw7dGhpcy5TYT0hMX07bihGLEQpO0YucHJvdG90eXBlLlphPUxiLlYoKTsKdmFyIE1iPW51bGwsTmI9ZnVuY3Rpb24oYSxiKXtzd2l0Y2goYSl7Y2FzZSAxOnJldHVybiBiPyJkaXNhYmxlIjoiZW5hYmxlIjtjYXNlIDI6cmV0dXJuIGI/ImhpZ2hsaWdodCI6InVuaGlnaGxpZ2h0IjtjYXNlIDQ6cmV0dXJuIGI/ImFjdGl2YXRlIjoiZGVhY3RpdmF0ZSI7Y2FzZSA4OnJldHVybiBiPyJzZWxlY3QiOiJ1bnNlbGVjdCI7Y2FzZSAxNjpyZXR1cm4gYj8iY2hlY2siOiJ1bmNoZWNrIjtjYXNlIDMyOnJldHVybiBiPyJmb2N1cyI6ImJsdXIiO2Nhc2UgNjQ6cmV0dXJuIGI/Im9wZW4iOiJjbG9zZSJ9dGhyb3cgRXJyb3IoIkludmFsaWQgY29tcG9uZW50IHN0YXRlIik7fSxPYj1mdW5jdGlvbihhKXtyZXR1cm4gYS5ZfHwoYS5ZPSI6IisoYS5aYS5nKyspLnRvU3RyaW5nKDM2KSl9LFBiPWZ1bmN0aW9uKGEsYil7aWYoYS5oJiZhLmgudSl7dmFyIGM9YS5oLnUsZD1hLlk7ZCBpbiBjJiZkZWxldGUgY1tkXTtEYShhLmgudSxiLGEpfWEuWT1ifTtGLnByb3RvdHlwZS5pPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ307CnZhciBRYj1mdW5jdGlvbihhKXthLk18fChhLk09bmV3IEViKGEpKTtyZXR1cm4gcChhLk0pfTtGLnByb3RvdHlwZS5BYT1mdW5jdGlvbihhKXtpZih0aGlzLmgmJnRoaXMuaCE9YSl0aHJvdyBFcnJvcigiTWV0aG9kIG5vdCBzdXBwb3J0ZWQiKTtGLmwuQWEuY2FsbCh0aGlzLGEpfTtGLnByb3RvdHlwZS5tYT1mdW5jdGlvbigpe3RoaXMuZz1aYSh0aGlzLkcuZywiRElWIil9O0YucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbihhKXtSYih0aGlzLGEpfTsKdmFyIFJiPWZ1bmN0aW9uKGEsYixjKXtpZihhLnMpdGhyb3cgRXJyb3IoIkNvbXBvbmVudCBhbHJlYWR5IHJlbmRlcmVkIik7YS5nfHxhLm1hKCk7Yj9iLmluc2VydEJlZm9yZShhLmcsY3x8bnVsbCk6YS5HLmcuYm9keS5hcHBlbmRDaGlsZChhLmcpO2EuaCYmIWEuaC5zfHxhLkkoKX0sU2I9ZnVuY3Rpb24oYSxiKXtpZihhLnMpdGhyb3cgRXJyb3IoIkNvbXBvbmVudCBhbHJlYWR5IHJlbmRlcmVkIik7aWYoYiYmYS53YShiKSl7YS5TYT0hMDt2YXIgYz1iYihiKTthLkcmJmEuRy5nPT1jfHwoYS5HPWI/bmV3IGZiKGJiKGIpKTpwYXx8KHBhPW5ldyBmYikpO2EuRWEoYik7YS5JKCl9ZWxzZSB0aHJvdyBFcnJvcigiSW52YWxpZCBlbGVtZW50IHRvIGRlY29yYXRlIik7fTtnPUYucHJvdG90eXBlO2cud2E9ZnVuY3Rpb24oKXtyZXR1cm4hMH07Zy5FYT1mdW5jdGlvbihhKXt0aGlzLmc9YX07CmcuST1mdW5jdGlvbigpe3RoaXMucz0hMDtUYih0aGlzLGZ1bmN0aW9uKGEpeyFhLnMmJmEuaSgpJiZhLkkoKX0pfTtnLlU9ZnVuY3Rpb24oKXtUYih0aGlzLGZ1bmN0aW9uKGEpe2EucyYmYS5VKCl9KTt0aGlzLk0mJkdiKHRoaXMuTSk7dGhpcy5zPSExfTtnLkM9ZnVuY3Rpb24oKXt0aGlzLnMmJnRoaXMuVSgpO3RoaXMuTSYmKHRoaXMuTS5kaXNwb3NlKCksZGVsZXRlIHRoaXMuTSk7VGIodGhpcyxmdW5jdGlvbihhKXthLmRpc3Bvc2UoKX0pOyF0aGlzLlNhJiZ0aGlzLmcmJiRhKHRoaXMuZyk7dGhpcy5oPXRoaXMuZz10aGlzLnU9dGhpcy5qPW51bGw7Ri5sLkMuY2FsbCh0aGlzKX07Zy5CYT1mdW5jdGlvbihhLGIpe3RoaXMuQ2EoYSxIKHRoaXMpLGIpfTsKZy5DYT1mdW5jdGlvbihhLGIsYyl7cCghIWEsIlByb3ZpZGVkIGVsZW1lbnQgbXVzdCBub3QgYmUgbnVsbC4iKTtpZihhLnMmJihjfHwhdGhpcy5zKSl0aHJvdyBFcnJvcigiQ29tcG9uZW50IGFscmVhZHkgcmVuZGVyZWQiKTtpZihiPDB8fGI+SCh0aGlzKSl0aHJvdyBFcnJvcigiQ2hpbGQgY29tcG9uZW50IGluZGV4IG91dCBvZiBib3VuZHMiKTt0aGlzLnUmJnRoaXMuanx8KHRoaXMudT17fSx0aGlzLmo9W10pO2lmKGEuaD09dGhpcyl7dmFyIGQ9dGhpcy51LGU9T2IoYSk7ZFtlXT1hO3hhKHRoaXMuaixhKX1lbHNlIERhKHRoaXMudSxPYihhKSxhKTtpZihhPT10aGlzKXRocm93IEVycm9yKCJVbmFibGUgdG8gc2V0IHBhcmVudCBjb21wb25lbnQiKTtpZihkPXRoaXMmJmEuaCYmYS5ZKWU9YS5oLGQ9YS5ZLGUudSYmZD8oZT1lLnUsZD0oZSE9PW51bGwmJmQgaW4gZT9lW2RdOnZvaWQgMCl8fG51bGwpOmQ9bnVsbDtpZihkJiZhLmghPXRoaXMpdGhyb3cgRXJyb3IoIlVuYWJsZSB0byBzZXQgcGFyZW50IGNvbXBvbmVudCIpOwphLmg9dGhpcztGLmwuQWEuY2FsbChhLHRoaXMpO3phKHRoaXMuaixiLDAsYSk7YS5zJiZ0aGlzLnMmJmEuaD09dGhpcz8oYz10aGlzLm5hKCksKGMuY2hpbGROb2Rlc1tiXXx8bnVsbCkhPWEuaSgpJiYoYS5pKCkucGFyZW50RWxlbWVudD09YyYmYy5yZW1vdmVDaGlsZChhLmkoKSksYj1jLmNoaWxkTm9kZXNbYl18fG51bGwsYy5pbnNlcnRCZWZvcmUoYS5pKCksYikpKTpjPyh0aGlzLmd8fHRoaXMubWEoKSxiPUkodGhpcyxiKzEpLFJiKGEsdGhpcy5uYSgpLGI/Yi5nOm51bGwpKTp0aGlzLnMmJiFhLnMmJmEuZyYmYS5nLnBhcmVudE5vZGUmJmEuZy5wYXJlbnROb2RlLm5vZGVUeXBlPT0xJiZhLkkoKX07Zy5uYT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmd9Owp2YXIgVWI9ZnVuY3Rpb24oYSl7aWYoYS56YT09bnVsbCl7dmFyIGI9YS5zP2EuZzphLkcuZy5ib2R5O2E6e3ZhciBjPWJiKGIpO2lmKGMuZGVmYXVsdFZpZXcmJmMuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSYmKGM9Yy5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKGIsbnVsbCkpKXtjPWMuZGlyZWN0aW9ufHxjLmdldFByb3BlcnR5VmFsdWUoImRpcmVjdGlvbiIpfHwiIjticmVhayBhfWM9IiJ9YS56YT0icnRsIj09KGN8fChiLmN1cnJlbnRTdHlsZT9iLmN1cnJlbnRTdHlsZS5kaXJlY3Rpb246bnVsbCl8fGIuc3R5bGUmJmIuc3R5bGUuZGlyZWN0aW9uKX1yZXR1cm4gYS56YX0sSD1mdW5jdGlvbihhKXtyZXR1cm4gYS5qP2Euai5sZW5ndGg6MH0sST1mdW5jdGlvbihhLGIpe3JldHVybiBhLmo/YS5qW2JdfHxudWxsOm51bGx9LFRiPWZ1bmN0aW9uKGEsYixjKXthLmomJmEuai5mb3JFYWNoKGIsYyl9LFZiPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuaiYmYj9hLmouaW5kZXhPZihiKToKLTF9O3ZhciBXYj17bWI6ImFjdGl2ZWRlc2NlbmRhbnQiLHJiOiJhdG9taWMiLHNiOiJhdXRvY29tcGxldGUiLHViOiJidXN5Iix4YjoiY2hlY2tlZCIseWI6ImNvbGluZGV4IixEYjoiY29udHJvbHMiLEViOiJjdXJyZW50IixHYjoiZGVzY3JpYmVkYnkiLEpiOiJkaXNhYmxlZCIsTGI6ImRyb3BlZmZlY3QiLE1iOiJleHBhbmRlZCIsTmI6ImZsb3d0byIsUGI6ImdyYWJiZWQiLFRiOiJoYXNwb3B1cCIsVmI6ImhpZGRlbiIsWGI6ImludmFsaWQiLFliOiJsYWJlbCIsWmI6ImxhYmVsbGVkYnkiLGFjOiJsZXZlbCIsZmM6ImxpdmUiLHZjOiJtdWx0aWxpbmUiLHdjOiJtdWx0aXNlbGVjdGFibGUiLEFjOiJvcmllbnRhdGlvbiIsQmM6Im93bnMiLENjOiJwb3NpbnNldCIsRWM6InByZXNzZWQiLEljOiJyZWFkb25seSIsS2M6InJlbGV2YW50IixMYzoicmVxdWlyZWQiLFBjOiJyb3dpbmRleCIsU2M6InNlbGVjdGVkIixVYzoic2V0c2l6ZSIsV2M6InNvcnQiLG1kOiJ2YWx1ZW1heCIsbmQ6InZhbHVlbWluIiwKb2Q6InZhbHVlbm93IixwZDoidmFsdWV0ZXh0In07dmFyIFhiO3ZhciBZYj17bmI6ImFsZXJ0IixvYjoiYWxlcnRkaWFsb2ciLHBiOiJhcHBsaWNhdGlvbiIscWI6ImFydGljbGUiLHRiOiJiYW5uZXIiLHZiOiJidXR0b24iLHdiOiJjaGVja2JveCIsemI6ImNvbHVtbmhlYWRlciIsQWI6ImNvbWJvYm94IixCYjoiY29tcGxlbWVudGFyeSIsQ2I6ImNvbnRlbnRpbmZvIixGYjoiZGVmaW5pdGlvbiIsSGI6ImRpYWxvZyIsSWI6ImRpcmVjdG9yeSIsS2I6ImRvY3VtZW50IixPYjoiZm9ybSIsUWI6ImdyaWQiLFJiOiJncmlkY2VsbCIsU2I6Imdyb3VwIixVYjoiaGVhZGluZyIsV2I6ImltZyIsYmM6ImxpbmsiLGNjOiJsaXN0IixkYzoibGlzdGJveCIsZWM6Imxpc3RpdGVtIixoYzoibG9nIixpYzoibWFpbiIsamM6Im1hcnF1ZWUiLGtjOiJtYXRoIixsYzoibWVudSIsbWM6Im1lbnViYXIiLG5jOiJtZW51aXRlbSIsb2M6Im1lbnVpdGVtY2hlY2tib3giLHBjOiJtZW51aXRlbXJhZGlvIix4YzoibmF2aWdhdGlvbiIseWM6Im5vdGUiLHpjOiJvcHRpb24iLApEYzoicHJlc2VudGF0aW9uIixGYzoicHJvZ3Jlc3NiYXIiLEdjOiJyYWRpbyIsSGM6InJhZGlvZ3JvdXAiLEpjOiJyZWdpb24iLE1jOiJyb3ciLE5jOiJyb3dncm91cCIsT2M6InJvd2hlYWRlciIsUWM6InNjcm9sbGJhciIsUmM6InNlYXJjaCIsVGM6InNlcGFyYXRvciIsVmM6InNsaWRlciIsWGM6InNwaW5idXR0b24iLFljOiJzdGF0dXMiLFpjOiJzd2l0Y2giLGFkOiJ0YWIiLGJkOiJ0YWJsaXN0IixjZDoidGFicGFuZWwiLGRkOiJ0ZXh0Ym94IixlZDoidGV4dGluZm8iLGZkOiJ0aW1lciIsZ2Q6InRvb2xiYXIiLGhkOiJ0b29sdGlwIixqZDoidHJlZSIsa2Q6InRyZWVncmlkIixsZDoidHJlZWl0ZW0ifTt2YXIgWmI9ZnVuY3Rpb24oYSxiKXtiPyhwKENhKFliLGIpLCJObyBzdWNoIEFSSUEgcm9sZSAiK2IpLGEuc2V0QXR0cmlidXRlKCJyb2xlIixiKSk6YS5yZW1vdmVBdHRyaWJ1dGUoInJvbGUiKX0sYWM9ZnVuY3Rpb24oYSxiLGMpe0FycmF5LmlzQXJyYXkoYykmJihjPWMuam9pbigiICIpKTt2YXIgZD0kYihiKTtjPT09IiJ8fGM9PXZvaWQgMD8oWGJ8fChjPXt9LFhiPShjLmF0b21pYz0hMSxjLmF1dG9jb21wbGV0ZT0ibm9uZSIsYy5kcm9wZWZmZWN0PSJub25lIixjLmhhc3BvcHVwPSExLGMubGl2ZT0ib2ZmIixjLm11bHRpbGluZT0hMSxjLm11bHRpc2VsZWN0YWJsZT0hMSxjLm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIsYy5yZWFkb25seT0hMSxjLnJlbGV2YW50PSJhZGRpdGlvbnMgdGV4dCIsYy5yZXF1aXJlZD0hMSxjLnNvcnQ9Im5vbmUiLGMuYnVzeT0hMSxjLmRpc2FibGVkPSExLGMuaGlkZGVuPSExLGMuaW52YWxpZD0iZmFsc2UiLGMpKSxjPVhiLGIgaW4gYz9hLnNldEF0dHJpYnV0ZShkLApjW2JdKTphLnJlbW92ZUF0dHJpYnV0ZShkKSk6YS5zZXRBdHRyaWJ1dGUoZCxjKX0sJGI9ZnVuY3Rpb24oYSl7cChhLCJBUklBIGF0dHJpYnV0ZSBjYW5ub3QgYmUgZW1wdHkuIik7cChDYShXYixhKSwiTm8gc3VjaCBBUklBIGF0dHJpYnV0ZSAiK2EpO3JldHVybiJhcmlhLSIrYX07dmFyIGRjPWZ1bmN0aW9uKGEsYixjLGQsZSxmKXtpZih2JiZlKXJldHVybiBiYyhhKTtpZihlJiYhZClyZXR1cm4hMTtpZighdCl7dHlwZW9mIGI9PT0ibnVtYmVyIiYmKGI9Y2MoYikpO3ZhciBoPWI9PTE3fHxiPT0xOHx8diYmYj09OTE7aWYoKCFjfHx2KSYmaHx8diYmYj09MTYmJihkfHxmKSlyZXR1cm4hMX1pZih1JiZkJiZjKXN3aXRjaChhKXtjYXNlIDIyMDpjYXNlIDIxOTpjYXNlIDIyMTpjYXNlIDE5MjpjYXNlIDE4NjpjYXNlIDE4OTpjYXNlIDE4NzpjYXNlIDE4ODpjYXNlIDE5MDpjYXNlIDE5MTpjYXNlIDE5MjpjYXNlIDIyMjpyZXR1cm4hMX1zd2l0Y2goYSl7Y2FzZSAxMzpyZXR1cm4gdD9mfHxlPyExOiEoYyYmZCk6ITA7Y2FzZSAyNzpyZXR1cm4hdSYmIXR9cmV0dXJuIHQmJihkfHxlfHxmKT8hMTpiYyhhKX0sYmM9ZnVuY3Rpb24oYSl7aWYoYT49NDgmJmE8PTU3fHxhPj05NiYmYTw9MTA2fHxhPj02NSYmYTw9OTB8fHUmJmE9PTApcmV0dXJuITA7c3dpdGNoKGEpe2Nhc2UgMzI6Y2FzZSA0MzpjYXNlIDYzOmNhc2UgNjQ6Y2FzZSAxMDc6Y2FzZSAxMDk6Y2FzZSAxMTA6Y2FzZSAxMTE6Y2FzZSAxODY6Y2FzZSA1OTpjYXNlIDE4OTpjYXNlIDE4NzpjYXNlIDYxOmNhc2UgMTg4OmNhc2UgMTkwOmNhc2UgMTkxOmNhc2UgMTkyOmNhc2UgMjIyOmNhc2UgMjE5OmNhc2UgMjIwOmNhc2UgMjIxOmNhc2UgMTYzOmNhc2UgNTg6cmV0dXJuITA7CmNhc2UgMTczOmNhc2UgMTcxOnJldHVybiB0O2RlZmF1bHQ6cmV0dXJuITF9fSxjYz1mdW5jdGlvbihhKXtpZih0KWE9ZWMoYSk7ZWxzZSBpZih2JiZ1KXN3aXRjaChhKXtjYXNlIDkzOmE9OTF9cmV0dXJuIGF9LGVjPWZ1bmN0aW9uKGEpe3N3aXRjaChhKXtjYXNlIDYxOnJldHVybiAxODc7Y2FzZSA1OTpyZXR1cm4gMTg2O2Nhc2UgMTczOnJldHVybiAxODk7Y2FzZSAyMjQ6cmV0dXJuIDkxO2Nhc2UgMDpyZXR1cm4gMjI0O2RlZmF1bHQ6cmV0dXJuIGF9fTt2YXIgZmM9ZnVuY3Rpb24oYSxiLGMsZCl7ei5jYWxsKHRoaXMsZCk7dGhpcy50eXBlPSJrZXkiO3RoaXMuZz1hO3RoaXMucmVwZWF0PWN9O24oZmMseik7dmFyIEo9ZnVuY3Rpb24oYSxiKXtELmNhbGwodGhpcyk7YSYmZ2ModGhpcyxhLGIpfTtuKEosRCk7Zz1KLnByb3RvdHlwZTtnLlI9bnVsbDtnLnFhPW51bGw7Zy5KYT1udWxsO2cucmE9bnVsbDtnLkY9LTE7Zy5LPS0xO2cuRGE9ITE7CnZhciBoYz17MzoxMywxMjoxNDQsNjMyMzI6MzgsNjMyMzM6NDAsNjMyMzQ6MzcsNjMyMzU6MzksNjMyMzY6MTEyLDYzMjM3OjExMyw2MzIzODoxMTQsNjMyMzk6MTE1LDYzMjQwOjExNiw2MzI0MToxMTcsNjMyNDI6MTE4LDYzMjQzOjExOSw2MzI0NDoxMjAsNjMyNDU6MTIxLDYzMjQ2OjEyMiw2MzI0NzoxMjMsNjMyNDg6NDQsNjMyNzI6NDYsNjMyNzM6MzYsNjMyNzU6MzUsNjMyNzY6MzMsNjMyNzc6MzQsNjMyODk6MTQ0LDYzMzAyOjQ1fSxpYz17VXA6MzgsRG93bjo0MCxMZWZ0OjM3LFJpZ2h0OjM5LEVudGVyOjEzLEYxOjExMixGMjoxMTMsRjM6MTE0LEY0OjExNSxGNToxMTYsRjY6MTE3LEY3OjExOCxGODoxMTksRjk6MTIwLEYxMDoxMjEsRjExOjEyMixGMTI6MTIzLCJVKzAwN0YiOjQ2LEhvbWU6MzYsRW5kOjM1LFBhZ2VVcDozMyxQYWdlRG93bjozNCxJbnNlcnQ6NDV9LGpjPXYmJnQ7CkoucHJvdG90eXBlLmc9ZnVuY3Rpb24oYSl7dSYmKHRoaXMuRj09MTcmJiFhLmN0cmxLZXl8fHRoaXMuRj09MTgmJiFhLmFsdEtleXx8diYmdGhpcy5GPT05MSYmIWEubWV0YUtleSkmJih0aGlzLks9dGhpcy5GPS0xKTt0aGlzLkY9PS0xJiYoYS5jdHJsS2V5JiZhLmchPTE3P3RoaXMuRj0xNzphLmFsdEtleSYmYS5nIT0xOD90aGlzLkY9MTg6YS5tZXRhS2V5JiZhLmchPTkxJiYodGhpcy5GPTkxKSk7ZGMoYS5nLHRoaXMuRixhLnNoaWZ0S2V5LGEuY3RybEtleSxhLmFsdEtleSxhLm1ldGFLZXkpPyh0aGlzLks9Y2MoYS5nKSxqYyYmKHRoaXMuRGE9YS5hbHRLZXkpKTp0aGlzLmhhbmRsZUV2ZW50KGEpfTtKLnByb3RvdHlwZS5oPWZ1bmN0aW9uKGEpe3RoaXMuSz10aGlzLkY9LTE7dGhpcy5EYT1hLmFsdEtleX07CkoucHJvdG90eXBlLmhhbmRsZUV2ZW50PWZ1bmN0aW9uKGEpe3ZhciBiPWEuaCxjPWIuYWx0S2V5O2lmKHUmJmEudHlwZT09ImtleXByZXNzIil7dmFyIGQ9dGhpcy5LO3ZhciBlPWIuY2hhckNvZGU+PTAmJmIuY2hhckNvZGU8NjMyMzImJmJjKGQpP2IuY2hhckNvZGU6MH1lbHNlIGEudHlwZT09ImtleXByZXNzIj8oamMmJihjPXRoaXMuRGEpLGIua2V5Q29kZT09Yi5jaGFyQ29kZT9iLmtleUNvZGU8MzI/KGQ9Yi5rZXlDb2RlLGU9MCk6KGQ9dGhpcy5LLGU9Yi5jaGFyQ29kZSk6KGQ9Yi5rZXlDb2RlfHx0aGlzLkssZT1iLmNoYXJDb2RlfHwwKSk6KGQ9Yi5rZXlDb2RlfHx0aGlzLkssZT1iLmNoYXJDb2RlfHwwKSx2JiZlPT02MyYmZD09MjI0JiYoZD0xOTEpO3ZhciBmPWQ9Y2MoZCk7ZD9kPj02MzIzMiYmZCBpbiBoYz9mPWhjW2RdOmQ9PTI1JiZhLnNoaWZ0S2V5JiYoZj05KTpiLmtleUlkZW50aWZpZXImJmIua2V5SWRlbnRpZmllciBpbiBpYyYmKGY9aWNbYi5rZXlJZGVudGlmaWVyXSk7CmlmKCF0fHxhLnR5cGUhPSJrZXlwcmVzcyJ8fGRjKGYsdGhpcy5GLGEuc2hpZnRLZXksYS5jdHJsS2V5LGMsYS5tZXRhS2V5KSlhPWY9PXRoaXMuRix0aGlzLkY9ZixiPW5ldyBmYyhmLGUsYSxiKSxiLmFsdEtleT1jLEUodGhpcyxiKX07Si5wcm90b3R5cGUuaT1mdW5jdGlvbigpe3JldHVybiB0aGlzLlJ9O3ZhciBnYz1mdW5jdGlvbihhLGIsYyl7YS5yYSYma2MoYSk7YS5SPWI7YS5xYT11YihhLlIsImtleXByZXNzIixhLGMpO2EuSmE9dWIoYS5SLCJrZXlkb3duIixhLmcsYyxhKTthLnJhPXViKGEuUiwia2V5dXAiLGEuaCxjLGEpfSxrYz1mdW5jdGlvbihhKXthLnFhJiYoQShhLnFhKSxBKGEuSmEpLEEoYS5yYSksYS5xYT1udWxsLGEuSmE9bnVsbCxhLnJhPW51bGwpO2EuUj1udWxsO2EuRj0tMTthLks9LTF9O0oucHJvdG90eXBlLkM9ZnVuY3Rpb24oKXtKLmwuQy5jYWxsKHRoaXMpO2tjKHRoaXMpfTt2YXIgSz17Z2E6Im1vdXNlZG93biIsaGE6Im1vdXNldXAiLGZhOiJtb3VzZWNhbmNlbCIsc2M6Im1vdXNlbW92ZSIsdWM6Im1vdXNlb3ZlciIsdGM6Im1vdXNlb3V0IixxYzoibW91c2VlbnRlciIscmM6Im1vdXNlbGVhdmUifTt2YXIgbGM9ZnVuY3Rpb24oYSl7cmV0dXJuIHR5cGVvZiBhLmNsYXNzTmFtZT09InN0cmluZyI/YS5jbGFzc05hbWU6YS5nZXRBdHRyaWJ1dGUmJmEuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIn0sTD1mdW5jdGlvbihhKXtyZXR1cm4gYS5jbGFzc0xpc3Q/YS5jbGFzc0xpc3Q6bGMoYSkubWF0Y2goL1xTKy9nKXx8W119LG1jPWZ1bmN0aW9uKGEsYil7dHlwZW9mIGEuY2xhc3NOYW1lPT0ic3RyaW5nIj9hLmNsYXNzTmFtZT1iOmEuc2V0QXR0cmlidXRlJiZhLnNldEF0dHJpYnV0ZSgiY2xhc3MiLGIpfSxuYz1mdW5jdGlvbihhLGIpe2EuY2xhc3NMaXN0P2I9YS5jbGFzc0xpc3QuY29udGFpbnMoYik6KGE9TChhKSxiPXZhKGEsYik+PTApO3JldHVybiBifSxvYz1mdW5jdGlvbihhLGIpe2lmKGEuY2xhc3NMaXN0KWEuY2xhc3NMaXN0LmFkZChiKTtlbHNlIGlmKCFuYyhhLGIpKXt2YXIgYz1sYyhhKTttYyhhLGMrKGMubGVuZ3RoPjA/IiAiK2I6YikpfX0scGM9ZnVuY3Rpb24oYSxiKXtpZihhLmNsYXNzTGlzdClBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGIsCmZ1bmN0aW9uKGUpe29jKGEsZSl9KTtlbHNle3ZhciBjPXt9O0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoTChhKSxmdW5jdGlvbihlKXtjW2VdPSEwfSk7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChiLGZ1bmN0aW9uKGUpe2NbZV09ITB9KTtiPSIiO2Zvcih2YXIgZCBpbiBjKWIrPWIubGVuZ3RoPjA/IiAiK2Q6ZDttYyhhLGIpfX0scWM9ZnVuY3Rpb24oYSxiKXthLmNsYXNzTGlzdD9hLmNsYXNzTGlzdC5yZW1vdmUoYik6bmMoYSxiKSYmbWMoYSxBcnJheS5wcm90b3R5cGUuZmlsdGVyLmNhbGwoTChhKSxmdW5jdGlvbihjKXtyZXR1cm4gYyE9Yn0pLmpvaW4oIiAiKSl9LHJjPWZ1bmN0aW9uKGEsYil7YS5jbGFzc0xpc3Q/QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChiLGZ1bmN0aW9uKGMpe3FjKGEsYyl9KTptYyhhLEFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbChMKGEpLGZ1bmN0aW9uKGMpe3JldHVybiEodmEoYixjKT49MCl9KS5qb2luKCIgIikpfTt2YXIgdGM9ZnVuY3Rpb24oYSxiKXtpZighYSl0aHJvdyBFcnJvcigiSW52YWxpZCBjbGFzcyBuYW1lICIrYSk7aWYodHlwZW9mIGIhPT0iZnVuY3Rpb24iKXRocm93IEVycm9yKCJJbnZhbGlkIGRlY29yYXRvciBmdW5jdGlvbiAiK2IpO3NjW2FdPWJ9LHVjPXt9LHNjPXt9O3ZhciB2Yz1mdW5jdGlvbihhKXt0aGlzLkE9YX07aWEodmMpO3ZhciB3Yz1mdW5jdGlvbihhLGIpe2EmJihhLnRhYkluZGV4PWI/MDotMSl9LHljPWZ1bmN0aW9uKGEsYixjKXtjLmlkJiZQYihiLGMuaWQpO3ZhciBkPWEuZygpLGU9ITEsZj1MKGMpO2YmJkFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoZixmdW5jdGlvbihoKXtoPT1kP2U9ITA6aCYmdGhpcy51KGIsaCxkKX0sYSk7ZXx8b2MoYyxkKTt4YyhiLGMpO3JldHVybiBjfTt2Yy5wcm90b3R5cGUudT1mdW5jdGlvbihhLGIsYyl7Yj09YysiLWRpc2FibGVkIj9hLlgoITEpOmI9PWMrIi1ob3Jpem9udGFsIj96YyhhLCJob3Jpem9udGFsIik6Yj09YysiLXZlcnRpY2FsIiYmemMoYSwidmVydGljYWwiKX07CnZhciB4Yz1mdW5jdGlvbihhLGIpe2lmKGIpZm9yKHZhciBjPWIuZmlyc3RDaGlsZCxkO2MmJmMucGFyZW50Tm9kZT09Yjspe2Q9Yy5uZXh0U2libGluZztpZihjLm5vZGVUeXBlPT0xKXthOnt2YXIgZT1jO3AoZSk7ZT1MKGUpO2Zvcih2YXIgZj1lLmxlbmd0aCxoPTA7aDxmO2grKyl7dmFyIGs9ZVtoXTtpZihrPWsgaW4gc2M/c2Nba10oKTpudWxsKXtlPWs7YnJlYWsgYX19ZT1udWxsfWUmJihlLmc9YyxhLmlzRW5hYmxlZCgpfHxlLlgoITEpLGEuQmEoZSksU2IoZSxjKSl9ZWxzZSBjLm5vZGVWYWx1ZSYmSGEoYy5ub2RlVmFsdWUpIT0iInx8Yi5yZW1vdmVDaGlsZChjKTtjPWR9fSxBYz1mdW5jdGlvbihhLGIpe2I9Yi5pKCk7cChiLCJUaGUgY29udGFpbmVyIERPTSBlbGVtZW50IGNhbm5vdCBiZSBudWxsLiIpO0tiKGIsdCk7KGE9YS5BKSYmWmIoYixhKX07dmMucHJvdG90eXBlLmc9ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy1jb250YWluZXIifTsKdmMucHJvdG90eXBlLmo9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nKCksYz1bYixhLkw9PSJob3Jpem9udGFsIj9iKyItaG9yaXpvbnRhbCI6YisiLXZlcnRpY2FsIl07YS5pc0VuYWJsZWQoKXx8Yy5wdXNoKGIrIi1kaXNhYmxlZCIpO3JldHVybiBjfTt2YXIgQmM9ZnVuY3Rpb24oKXt9O3ZhciBNPWZ1bmN0aW9uKCl7fSxDYztpYShNKTt2YXIgRGM9e2J1dHRvbjoicHJlc3NlZCIsY2hlY2tib3g6ImNoZWNrZWQiLG1lbnVpdGVtOiJzZWxlY3RlZCIsbWVudWl0ZW1jaGVja2JveDoiY2hlY2tlZCIsbWVudWl0ZW1yYWRpbzoiY2hlY2tlZCIscmFkaW86ImNoZWNrZWQiLHRhYjoic2VsZWN0ZWQiLHRyZWVpdGVtOiJzZWxlY3RlZCJ9O00ucHJvdG90eXBlLk5hPWZ1bmN0aW9uKCl7fTtNLnByb3RvdHlwZS54YT1mdW5jdGlvbihhKXt2YXIgYj1hLkcsYz1iLmgsZD10aGlzLk4oKSxlPVtkXSxmPXRoaXMuTigpO2YhPWQmJmUucHVzaChmKTtkPWEubTtmb3IoZj1bXTtkOyl7dmFyIGg9ZCYtZDtmLnB1c2goRWModGhpcyxoKSk7ZCY9fmh9ZS5wdXNoLmFwcGx5KGUsZik7KGQ9YS5GYSkmJmUucHVzaC5hcHBseShlLGQpO3JldHVybiBjLmNhbGwoYiwiRElWIixlLmpvaW4oIiAiKSxhLmlhKX07Ck0ucHJvdG90eXBlLnlhPWZ1bmN0aW9uKGEsYil7Yi5pZCYmUGIoYSxiLmlkKTtiJiZiLmZpcnN0Q2hpbGQ/RmMoYSxiLmZpcnN0Q2hpbGQubmV4dFNpYmxpbmc/eWEoYi5jaGlsZE5vZGVzKTpiLmZpcnN0Q2hpbGQpOmEuaWE9bnVsbDt2YXIgYz0wLGQ9dGhpcy5OKCksZT10aGlzLk4oKSxmPSExLGg9ITEsaz15YShMKGIpKTtrLmZvckVhY2goZnVuY3Rpb24ocSl7Znx8cSE9ZD9ofHxxIT1lP2N8PUdjKHRoaXMscSk6aD0hMDooZj0hMCxlPT1kJiYoaD0hMCkpO0djKHRoaXMscSk9PTEmJihzYShiKSxkYihiKSYmZWIoYikmJmNiKGIsITEpKX0sdGhpcyk7YS5tPWM7Znx8KGsucHVzaChkKSxlPT1kJiYoaD0hMCkpO2h8fGsucHVzaChlKTsoYT1hLkZhKSYmay5wdXNoLmFwcGx5KGssYSk7ZiYmaCYmIWF8fG1jKGIsay5qb2luKCIgIikpO3JldHVybiBifTsKdmFyIEhjPWZ1bmN0aW9uKGEsYil7aWYoYT1hLk5hKCkpe3AoYiwiVGhlIGVsZW1lbnQgcGFzc2VkIGFzIGEgZmlyc3QgcGFyYW1ldGVyIGNhbm5vdCBiZSBudWxsLiIpO3ZhciBjPWIuZ2V0QXR0cmlidXRlKCJyb2xlIil8fG51bGw7YSE9YyYmWmIoYixhKX19LEljPWZ1bmN0aW9uKGEsYil7dmFyIGM7aWYoYS5EJjMyJiYoYz1hLmkoKSkpe2lmKCFiJiZhLm0mMzIpe3RyeXtjLmJsdXIoKX1jYXRjaChkKXt9YS5tJjMyJiZhLlFhKG51bGwpfShkYihjKSYmZWIoYykpIT1iJiZjYihjLGIpfX0sSmM9ZnVuY3Rpb24oYSxiLGMpe0NjfHwoQ2M9ezE6ImRpc2FibGVkIiw4OiJzZWxlY3RlZCIsMTY6ImNoZWNrZWQiLDY0OiJleHBhbmRlZCJ9KTtwKGEsIlRoZSBlbGVtZW50IHBhc3NlZCBhcyBhIGZpcnN0IHBhcmFtZXRlciBjYW5ub3QgYmUgbnVsbC4iKTtiPUNjW2JdO3ZhciBkPWEuZ2V0QXR0cmlidXRlKCJyb2xlIil8fG51bGw7ZCYmKGQ9RGNbZF18fGIsYj1iPT0iY2hlY2tlZCJ8fGI9PQoic2VsZWN0ZWQiP2Q6Yik7YiYmYWMoYSxiLGMpfTtNLnByb3RvdHlwZS5OPWZ1bmN0aW9uKCl7cmV0dXJuImdvb2ctY29udHJvbCJ9O3ZhciBFYz1mdW5jdGlvbihhLGIpe2EuZ3x8S2MoYSk7cmV0dXJuIGEuZ1tiXX0sR2M9ZnVuY3Rpb24oYSxiKXthLmh8fChhLmd8fEtjKGEpLGEuaD1FYShhLmcpKTthPXBhcnNlSW50KGEuaFtiXSwxMCk7cmV0dXJuIGlzTmFOKGEpPzA6YX0sS2M9ZnVuY3Rpb24oYSl7dmFyIGI9YS5OKCk7dmFyIGM9Yi5yZXBsYWNlKC9ceGEwfFxzL2csIiAiKS5pbmRleE9mKCIgIikhPS0xO3AoIWMsIkNvbnRyb2xSZW5kZXJlciBoYXMgYW4gaW52YWxpZCBjc3MgY2xhc3M6ICciK2IrIiciKTthLmc9ezE6YisiLWRpc2FibGVkIiwyOmIrIi1ob3ZlciIsNDpiKyItYWN0aXZlIiw4OmIrIi1zZWxlY3RlZCIsMTY6YisiLWNoZWNrZWQiLDMyOmIrIi1mb2N1c2VkIiw2NDpiKyItb3BlbiJ9fTt2YXIgTj1mdW5jdGlvbihhLGIsYyl7Ri5jYWxsKHRoaXMsYyk7aWYoIWIpe2ZvcihiPXRoaXMuY29uc3RydWN0b3I7Yjspe3ZhciBkPW5hKGIpO2lmKGQ9dWNbZF0pYnJlYWs7Yj0oYj1PYmplY3QuZ2V0UHJvdG90eXBlT2YoYi5wcm90b3R5cGUpKSYmYi5jb25zdHJ1Y3Rvcn1iPWQ/dHlwZW9mIGQuVj09PSJmdW5jdGlvbiI/ZC5WKCk6bmV3IGQ6bnVsbH10aGlzLnY9Yjt0aGlzLmlhPWEhPT12b2lkIDA/YTpudWxsfTtuKE4sRik7Zz1OLnByb3RvdHlwZTtnLmlhPW51bGw7Zy5tPTA7Zy5EPTM5O2cuUD0wO2cuT2E9ITA7Zy5GYT1udWxsO2cuSGE9ITA7Zy5tYT1mdW5jdGlvbigpe3ZhciBhPXRoaXMudi54YSh0aGlzKTt0aGlzLmc9YTtIYyh0aGlzLnYsYSk7S2IoYSwhMCk7dGhpcy5pc1Zpc2libGUoKXx8KGEuc3R5bGUuZGlzcGxheT0ibm9uZSIsYSYmYWMoYSwiaGlkZGVuIiwhMCkpfTtnLm5hPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaSgpfTtnLndhPWZ1bmN0aW9uKCl7cmV0dXJuITB9OwpnLkVhPWZ1bmN0aW9uKGEpe3RoaXMuZz1hPXRoaXMudi55YSh0aGlzLGEpO0hjKHRoaXMudixhKTtLYihhLCEwKTt0aGlzLk9hPWEuc3R5bGUuZGlzcGxheSE9Im5vbmUifTsKZy5JPWZ1bmN0aW9uKCl7Ti5sLkkuY2FsbCh0aGlzKTt2YXIgYT10aGlzLmc7cChhLCJDYW4gbm90IGNhbGwgZ2V0RWxlbWVudFN0cmljdCBiZWZvcmUgcmVuZGVyaW5nL2RlY29yYXRpbmcuIik7cCh0aGlzKTtwKGEpO3RoaXMuaXNWaXNpYmxlKCl8fGFjKGEsImhpZGRlbiIsIXRoaXMuaXNWaXNpYmxlKCkpO3RoaXMuaXNFbmFibGVkKCl8fEpjKGEsMSwhdGhpcy5pc0VuYWJsZWQoKSk7dGhpcy5EJjgmJkpjKGEsOCwhISh0aGlzLm0mOCkpO3RoaXMuRCYxNiYmSmMoYSwxNiwhISh0aGlzLm0mMTYpKTt0aGlzLkQmNjQmJkpjKGEsNjQsISEodGhpcy5tJjY0KSk7dmFyIGI9dGhpcy52O1ViKHRoaXMpJiYoYT10aGlzLmkoKSxiPWIuTigpKyItcnRsIiwoYT1hLmk/YS5pKCk6YSkmJnBjKGEsW2JdKSk7dGhpcy5pc0VuYWJsZWQoKSYmSWModGhpcyx0aGlzLmlzVmlzaWJsZSgpKTt0aGlzLkQmLTImJih0aGlzLkhhJiZMYyh0aGlzLCEwKSx0aGlzLkQmMzImJihhPXRoaXMuaSgpKSkmJihiPQp0aGlzLlp8fCh0aGlzLlo9bmV3IEopLGdjKGIsYSksQihCKEIoUWIodGhpcyksYiwia2V5Iix0aGlzLmFhKSxhLCJmb2N1cyIsdGhpcy5YYSksYSwiYmx1ciIsdGhpcy5RYSkpfTt2YXIgTGM9ZnVuY3Rpb24oYSxiKXt2YXIgYz1RYihhKSxkPWEuaSgpO2I/KEIoQihCKEIoYyxkLEsuZ2EsYS5zYSksZCxbSy5oYSxLLmZhXSxhLnZhKSxkLCJtb3VzZW92ZXIiLGEudWEpLGQsIm1vdXNlb3V0IixhLnRhKSxhLmNhIT1CYyYmQihjLGQsImNvbnRleHRtZW51IixhLmNhKSk6KEMoQyhDKEMoYyxkLEsuZ2EsYS5zYSksZCxbSy5oYSxLLmZhXSxhLnZhKSxkLCJtb3VzZW92ZXIiLGEudWEpLGQsIm1vdXNlb3V0IixhLnRhKSxhLmNhIT1CYyYmQyhjLGQsImNvbnRleHRtZW51IixhLmNhKSl9O04ucHJvdG90eXBlLlU9ZnVuY3Rpb24oKXtOLmwuVS5jYWxsKHRoaXMpO3RoaXMuWiYma2ModGhpcy5aKTt0aGlzLmlzVmlzaWJsZSgpJiZ0aGlzLmlzRW5hYmxlZCgpJiZJYyh0aGlzLCExKX07Ck4ucHJvdG90eXBlLkM9ZnVuY3Rpb24oKXtOLmwuQy5jYWxsKHRoaXMpO3RoaXMuWiYmKHRoaXMuWi5kaXNwb3NlKCksZGVsZXRlIHRoaXMuWik7ZGVsZXRlIHRoaXMudjt0aGlzLkZhPXRoaXMuaWE9bnVsbH07dmFyIEZjPWZ1bmN0aW9uKGEsYil7YS5pYT1ifTtOLnByb3RvdHlwZS5pc1Zpc2libGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5PYX07Ti5wcm90b3R5cGUuaXNFbmFibGVkPWZ1bmN0aW9uKCl7cmV0dXJuISh0aGlzLm0mMSl9O04ucHJvdG90eXBlLlg9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5oO2ImJnR5cGVvZiBiLmlzRW5hYmxlZD09ImZ1bmN0aW9uIiYmIWIuaXNFbmFibGVkKCl8fCFPKHRoaXMsMSwhYSl8fChhfHwoTWModGhpcywhMSksUCh0aGlzLCExKSksdGhpcy5pc1Zpc2libGUoKSYmSWModGhpcyxhKSxUKHRoaXMsMSwhYSwhMCkpfTt2YXIgUD1mdW5jdGlvbihhLGIpe08oYSwyLGIpJiZUKGEsMixiKX07Ck4ucHJvdG90eXBlLmlzQWN0aXZlPWZ1bmN0aW9uKCl7cmV0dXJuISEodGhpcy5tJjQpfTsKdmFyIE1jPWZ1bmN0aW9uKGEsYil7TyhhLDQsYikmJlQoYSw0LGIpfSxOYz1mdW5jdGlvbihhLGIpe08oYSw4LGIpJiZUKGEsOCxiKX0sT2M9ZnVuY3Rpb24oYSxiKXtPKGEsNjQsYikmJlQoYSw2NCxiKX0sVD1mdW5jdGlvbihhLGIsYyxkKXtpZighZCYmYj09MSlhLlgoIWMpO2Vsc2UgaWYoYS5EJmImJmMhPSEhKGEubSZiKSl7dmFyIGU9YS52O2lmKGQ9YS5pKCkpe2lmKGU9RWMoZSxiKSl7dmFyIGY9YS5pP2EuaSgpOmE7ZiYmKGM/cGM6cmMpKGYsW2VdKX1KYyhkLGIsYyl9YS5tPWM/YS5tfGI6YS5tJn5ifX0sUGM9ZnVuY3Rpb24oYSxiLGMpe2lmKGEucyYmYS5tJmImJiFjKXRocm93IEVycm9yKCJDb21wb25lbnQgYWxyZWFkeSByZW5kZXJlZCIpOyFjJiZhLm0mYiYmVChhLGIsITEpO2EuRD1jP2EuRHxiOmEuRCZ+Yn0sVT1mdW5jdGlvbihhLGIpe3JldHVybiEhKDI1NSZiKSYmISEoYS5EJmIpfSxPPWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4hIShhLkQmYikmJiEhKGEubSZiKSE9CmMmJighKGEuUCZiKXx8RShhLE5iKGIsYykpKSYmIWEuYmF9O04ucHJvdG90eXBlLnVhPWZ1bmN0aW9uKGEpeyFRYyhhLHRoaXMuaSgpKSYmRSh0aGlzLCJlbnRlciIpJiZ0aGlzLmlzRW5hYmxlZCgpJiZVKHRoaXMsMikmJlAodGhpcywhMCl9O04ucHJvdG90eXBlLnRhPWZ1bmN0aW9uKGEpeyFRYyhhLHRoaXMuaSgpKSYmRSh0aGlzLCJsZWF2ZSIpJiYoVSh0aGlzLDQpJiZNYyh0aGlzLCExKSxVKHRoaXMsMikmJlAodGhpcywhMSkpfTtOLnByb3RvdHlwZS5jYT1CYzt2YXIgUWM9ZnVuY3Rpb24oYSxiKXtyZXR1cm4hIWEucmVsYXRlZFRhcmdldCYmYWIoYixhLnJlbGF0ZWRUYXJnZXQpfTsKTi5wcm90b3R5cGUuc2E9ZnVuY3Rpb24oYSl7aWYodGhpcy5pc0VuYWJsZWQoKSYmKFUodGhpcywyKSYmUCh0aGlzLCEwKSwhKGEuaC5idXR0b24hPTB8fHYmJmEuY3RybEtleSkpKXtVKHRoaXMsNCkmJk1jKHRoaXMsITApO3ZhciBiO2lmKGI9dGhpcy52KXt2YXIgYztiPXRoaXMuRCYzMiYmKGM9dGhpcy5pKCkpP2RiKGMpJiZlYihjKTohMX1iJiZ0aGlzLmkoKS5mb2N1cygpfWEuaC5idXR0b24hPTB8fHYmJmEuY3RybEtleXx8YS5qKCl9O04ucHJvdG90eXBlLnZhPWZ1bmN0aW9uKGEpe3RoaXMuaXNFbmFibGVkKCkmJihVKHRoaXMsMikmJlAodGhpcywhMCksdGhpcy5pc0FjdGl2ZSgpJiZSYyh0aGlzLGEpJiZVKHRoaXMsNCkmJk1jKHRoaXMsITEpKX07CnZhciBSYz1mdW5jdGlvbihhLGIpe2lmKFUoYSwxNikpe3ZhciBjPSEoYS5tJjE2KTtPKGEsMTYsYykmJlQoYSwxNixjKX1VKGEsOCkmJk5jKGEsITApO1UoYSw2NCkmJk9jKGEsIShhLm0mNjQpKTtjPW5ldyB5KCJhY3Rpb24iLGEpO2ImJihjLmFsdEtleT1iLmFsdEtleSxjLmN0cmxLZXk9Yi5jdHJsS2V5LGMubWV0YUtleT1iLm1ldGFLZXksYy5zaGlmdEtleT1iLnNoaWZ0S2V5LGMuRz1iLkcsYy50aW1lU3RhbXA9Yi50aW1lU3RhbXApO3JldHVybiBFKGEsYyl9O04ucHJvdG90eXBlLlhhPWZ1bmN0aW9uKCl7VSh0aGlzLDMyKSYmTyh0aGlzLDMyLCEwKSYmVCh0aGlzLDMyLCEwKX07Ti5wcm90b3R5cGUuUWE9ZnVuY3Rpb24oKXtVKHRoaXMsNCkmJk1jKHRoaXMsITEpO1UodGhpcywzMikmJk8odGhpcywzMiwhMSkmJlQodGhpcywzMiwhMSl9OwpOLnByb3RvdHlwZS5hYT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5pc1Zpc2libGUoKSYmdGhpcy5pc0VuYWJsZWQoKSYmYS5nPT0xMyYmUmModGhpcyxhKT8oYS5qKCksYS52KCksITApOiExfTtpZih0eXBlb2YgTiE9PSJmdW5jdGlvbiIpdGhyb3cgRXJyb3IoIkludmFsaWQgY29tcG9uZW50IGNsYXNzICIrTik7aWYodHlwZW9mIE0hPT0iZnVuY3Rpb24iKXRocm93IEVycm9yKCJJbnZhbGlkIHJlbmRlcmVyIGNsYXNzICIrTSk7dmFyIFNjPW5hKE4pO3VjW1NjXT1NO3RjKCJnb29nLWNvbnRyb2wiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBOKG51bGwpfSk7dmFyIFY9ZnVuY3Rpb24oYSxiLGMpe0YuY2FsbCh0aGlzLGMpO3RoaXMuZWE9Ynx8dmMuVigpO3RoaXMuTD1hfHwidmVydGljYWwifTtuKFYsRik7Zz1WLnByb3RvdHlwZTtnLkthPW51bGw7Zy5kYT1udWxsO2cuZWE9bnVsbDtnLkw9bnVsbDtnLlM9ITA7Zy5UPSEwO2cubz0tMTtnLkI9bnVsbDtnLlc9ITE7Zy5PPW51bGw7dmFyIFRjPWZ1bmN0aW9uKGEpe3JldHVybiBhLkthfHxhLmkoKX07Zz1WLnByb3RvdHlwZTtnLm1hPWZ1bmN0aW9uKCl7dGhpcy5nPXRoaXMuRy5oKCJESVYiLHRoaXMuZWEuaih0aGlzKS5qb2luKCIgIikpfTtnLm5hPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaSgpfTtnLndhPWZ1bmN0aW9uKGEpe3JldHVybiBhLnRhZ05hbWU9PSJESVYifTtnLkVhPWZ1bmN0aW9uKGEpe3RoaXMuZz15Yyh0aGlzLmVhLHRoaXMsYSk7YS5zdHlsZS5kaXNwbGF5PT0ibm9uZSImJih0aGlzLlM9ITEpfTsKZy5JPWZ1bmN0aW9uKCl7Vi5sLkkuY2FsbCh0aGlzKTtUYih0aGlzLGZ1bmN0aW9uKGIpe2IucyYmVWModGhpcyxiKX0sdGhpcyk7dmFyIGE9dGhpcy5pKCk7QWModGhpcy5lYSx0aGlzKTtWYyh0aGlzLHRoaXMuUyk7QihCKEIoQihCKEIoQihCKFFiKHRoaXMpLHRoaXMsImVudGVyIix0aGlzLmViKSx0aGlzLCJoaWdobGlnaHQiLHRoaXMuZmIpLHRoaXMsInVuaGlnaGxpZ2h0Iix0aGlzLmxiKSx0aGlzLCJvcGVuIix0aGlzLmdiKSx0aGlzLCJjbG9zZSIsdGhpcy5iYiksYSxLLmdhLHRoaXMuV2EpLGJiKGEpLFtLLmhhLEsuZmFdLHRoaXMuY2IpLGEsW0suZ2EsSy5oYSxLLmZhLCJtb3VzZW92ZXIiLCJtb3VzZW91dCIsImNvbnRleHRtZW51Il0sdGhpcy5hYik7V2ModGhpcyl9O3ZhciBXYz1mdW5jdGlvbihhKXt2YXIgYj1RYihhKSxjPVRjKGEpO0IoQihCKGIsYywiZm9jdXMiLGEuUGEpLGMsImJsdXIiLGEuVWEpLGEuZGF8fChhLmRhPW5ldyBKKFRjKGEpKSksImtleSIsYS5WYSl9OwpnPVYucHJvdG90eXBlO2cuVT1mdW5jdGlvbigpe1hjKHRoaXMsLTEpO3RoaXMuQiYmT2ModGhpcy5CLCExKTt0aGlzLlc9ITE7Vi5sLlUuY2FsbCh0aGlzKX07Zy5DPWZ1bmN0aW9uKCl7Vi5sLkMuY2FsbCh0aGlzKTt0aGlzLmRhJiYodGhpcy5kYS5kaXNwb3NlKCksdGhpcy5kYT1udWxsKTt0aGlzLmVhPXRoaXMuQj10aGlzLk89dGhpcy5LYT1udWxsfTtnLmViPWZ1bmN0aW9uKCl7cmV0dXJuITB9OwpnLmZiPWZ1bmN0aW9uKGEpe3ZhciBiPVZiKHRoaXMsYS50YXJnZXQpO2lmKGI+LTEmJmIhPXRoaXMubyl7dmFyIGM9SSh0aGlzLHRoaXMubyk7YyYmUChjLCExKTt0aGlzLm89YjtjPUkodGhpcyx0aGlzLm8pO3RoaXMuVyYmTWMoYywhMCk7dGhpcy5CJiZjIT10aGlzLkImJihjLkQmNjQ/T2MoYywhMCk6T2ModGhpcy5CLCExKSl9Yj10aGlzLmkoKTtwKGIsIlRoZSBET00gZWxlbWVudCBmb3IgdGhlIGNvbnRhaW5lciBjYW5ub3QgYmUgbnVsbC4iKTthLnRhcmdldC5pKCkhPW51bGwmJmFjKGIsImFjdGl2ZWRlc2NlbmRhbnQiLGEudGFyZ2V0LmkoKS5pZCl9O2cubGI9ZnVuY3Rpb24oYSl7YS50YXJnZXQ9PUkodGhpcyx0aGlzLm8pJiYodGhpcy5vPS0xKTthPXRoaXMuaSgpO3AoYSwiVGhlIERPTSBlbGVtZW50IGZvciB0aGUgY29udGFpbmVyIGNhbm5vdCBiZSBudWxsLiIpO2EucmVtb3ZlQXR0cmlidXRlKCRiKCJhY3RpdmVkZXNjZW5kYW50IikpfTsKZy5nYj1mdW5jdGlvbihhKXsoYT1hLnRhcmdldCkmJmEhPXRoaXMuQiYmYS5oPT10aGlzJiYodGhpcy5CJiZPYyh0aGlzLkIsITEpLHRoaXMuQj1hKX07Zy5iYj1mdW5jdGlvbihhKXthLnRhcmdldD09dGhpcy5CJiYodGhpcy5CPW51bGwpO3ZhciBiPXRoaXMuaSgpLGM9YS50YXJnZXQuaSgpO2ImJmEudGFyZ2V0Lm0mMiYmYyYmKGE9IiIsYyYmKGE9Yy5pZCxwKGEsIlRoZSBhY3RpdmUgZWxlbWVudCBzaG91bGQgaGF2ZSBhbiBpZC4iKSksYWMoYiwiYWN0aXZlZGVzY2VuZGFudCIsYSkpfTtnLldhPWZ1bmN0aW9uKGEpe3RoaXMuVCYmKHRoaXMuVz0hMCk7dmFyIGI9VGModGhpcyk7YiYmZGIoYikmJmViKGIpP2IuZm9jdXMoKTphLmooKX07Zy5jYj1mdW5jdGlvbigpe3RoaXMuVz0hMX07CmcuYWI9ZnVuY3Rpb24oYSl7YTp7dmFyIGI9YS50YXJnZXQ7aWYodGhpcy5PKWZvcih2YXIgYz10aGlzLmkoKTtiJiZiIT09Yzspe3ZhciBkPWIuaWQ7aWYoZCBpbiB0aGlzLk8pe2I9dGhpcy5PW2RdO2JyZWFrIGF9Yj1iLnBhcmVudE5vZGV9Yj1udWxsfWlmKGIpc3dpdGNoKGEudHlwZSl7Y2FzZSBLLmdhOmIuc2EoYSk7YnJlYWs7Y2FzZSBLLmhhOmNhc2UgSy5mYTpiLnZhKGEpO2JyZWFrO2Nhc2UgIm1vdXNlb3ZlciI6Yi51YShhKTticmVhaztjYXNlICJtb3VzZW91dCI6Yi50YShhKTticmVhaztjYXNlICJjb250ZXh0bWVudSI6Yi5jYShhKX19O2cuUGE9ZnVuY3Rpb24oKXt9O2cuVWE9ZnVuY3Rpb24oKXtYYyh0aGlzLC0xKTt0aGlzLlc9ITE7dGhpcy5CJiZPYyh0aGlzLkIsITEpfTsKZy5WYT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5pc0VuYWJsZWQoKSYmdGhpcy5pc1Zpc2libGUoKSYmKEgodGhpcykhPTB8fHRoaXMuS2EpJiZZYyh0aGlzLGEpPyhhLmooKSxhLnYoKSwhMCk6ITF9Owp2YXIgWWM9ZnVuY3Rpb24oYSxiKXt2YXIgYz1JKGEsYS5vKTtpZihjJiZ0eXBlb2YgYy5hYT09ImZ1bmN0aW9uIiYmYy5hYShiKXx8YS5CJiZhLkIhPWMmJnR5cGVvZiBhLkIuYWE9PSJmdW5jdGlvbiImJmEuQi5hYShiKSlyZXR1cm4hMDtpZihiLnNoaWZ0S2V5fHxiLmN0cmxLZXl8fGIubWV0YUtleXx8Yi5hbHRLZXkpcmV0dXJuITE7c3dpdGNoKGIuZyl7Y2FzZSAyNzpUYyhhKS5ibHVyKCk7YnJlYWs7Y2FzZSAzNjpaYyhhKTticmVhaztjYXNlIDM1OiRjKGEpO2JyZWFrO2Nhc2UgMzg6aWYoYS5MPT0idmVydGljYWwiKWFkKGEpO2Vsc2UgcmV0dXJuITE7YnJlYWs7Y2FzZSAzNzppZihhLkw9PSJob3Jpem9udGFsIilVYihhKT9iZChhKTphZChhKTtlbHNlIHJldHVybiExO2JyZWFrO2Nhc2UgNDA6aWYoYS5MPT0idmVydGljYWwiKWJkKGEpO2Vsc2UgcmV0dXJuITE7YnJlYWs7Y2FzZSAzOTppZihhLkw9PSJob3Jpem9udGFsIilVYihhKT9hZChhKTpiZChhKTtlbHNlIHJldHVybiExOwpicmVhaztkZWZhdWx0OnJldHVybiExfXJldHVybiEwfSxVYz1mdW5jdGlvbihhLGIpe3ZhciBjPWIuaSgpO2M9Yy5pZHx8KGMuaWQ9T2IoYikpO2EuT3x8KGEuTz17fSk7YS5PW2NdPWJ9O1YucHJvdG90eXBlLkJhPWZ1bmN0aW9uKGEsYil7dWEoYSxOLCJUaGUgY2hpbGQgb2YgYSBjb250YWluZXIgbXVzdCBiZSBhIGNvbnRyb2wiKTtWLmwuQmEuY2FsbCh0aGlzLGEsYil9O1YucHJvdG90eXBlLkNhPWZ1bmN0aW9uKGEsYixjKXt1YShhLE4pO2EuUHw9MjthLlB8PTY0O1BjKGEsMzIsITEpO2EucyYmMCE9YS5IYSYmTGMoYSwhMSk7YS5IYT0hMTt2YXIgZD1hLmg9PXRoaXM/VmIodGhpcyxhKTotMTtWLmwuQ2EuY2FsbCh0aGlzLGEsYixjKTthLnMmJnRoaXMucyYmVWModGhpcyxhKTthPWQ7YT09LTEmJihhPUgodGhpcykpO2E9PXRoaXMubz90aGlzLm89TWF0aC5taW4oSCh0aGlzKS0xLGIpOmE+dGhpcy5vJiZiPD10aGlzLm8/dGhpcy5vKys6YTx0aGlzLm8mJmI+dGhpcy5vJiZ0aGlzLm8tLX07CnZhciB6Yz1mdW5jdGlvbihhLGIpe2lmKGEuaSgpKXRocm93IEVycm9yKCJDb21wb25lbnQgYWxyZWFkeSByZW5kZXJlZCIpO2EuTD1ifTtWLnByb3RvdHlwZS5pc1Zpc2libGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5TfTt2YXIgVmM9ZnVuY3Rpb24oYSxiKXthLlM9Yjt2YXIgYz1hLmkoKTtjJiYoYy5zdHlsZS5kaXNwbGF5PWI/IiI6Im5vbmUiLHdjKFRjKGEpLGEuVCYmYS5TKSl9O1YucHJvdG90eXBlLmlzRW5hYmxlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLlR9O1YucHJvdG90eXBlLlg9ZnVuY3Rpb24oYSl7dGhpcy5UIT1hJiZFKHRoaXMsYT8iZW5hYmxlIjoiZGlzYWJsZSIpJiYoYT8odGhpcy5UPSEwLFRiKHRoaXMsZnVuY3Rpb24oYil7Yi5UYT9kZWxldGUgYi5UYTpiLlgoITApfSkpOihUYih0aGlzLGZ1bmN0aW9uKGIpe2IuaXNFbmFibGVkKCk/Yi5YKCExKTpiLlRhPSEwfSksdGhpcy5XPXRoaXMuVD0hMSksd2MoVGModGhpcyksYSYmdGhpcy5TKSl9Owp2YXIgWGM9ZnVuY3Rpb24oYSxiKXsoYj1JKGEsYikpP1AoYiwhMCk6YS5vPi0xJiZQKEkoYSxhLm8pLCExKX0sWmM9ZnVuY3Rpb24oYSl7Y2QoYSxmdW5jdGlvbihiLGMpe3JldHVybihiKzEpJWN9LEgoYSktMSl9LCRjPWZ1bmN0aW9uKGEpe2NkKGEsZnVuY3Rpb24oYixjKXtiLS07cmV0dXJuIGI8MD9jLTE6Yn0sMCl9LGJkPWZ1bmN0aW9uKGEpe2NkKGEsZnVuY3Rpb24oYixjKXtyZXR1cm4oYisxKSVjfSxhLm8pfSxhZD1mdW5jdGlvbihhKXtjZChhLGZ1bmN0aW9uKGIsYyl7Yi0tO3JldHVybiBiPDA/Yy0xOmJ9LGEubyl9LGNkPWZ1bmN0aW9uKGEsYixjKXtjPWM8MD9WYihhLGEuQik6Yzt2YXIgZD1IKGEpO2M9Yi5jYWxsKGEsYyxkKTtmb3IodmFyIGU9MDtlPD1kOyl7dmFyIGY9SShhLGMpO2lmKGYmJmYuaXNWaXNpYmxlKCkmJmYuaXNFbmFibGVkKCkmJmYuRCYyKXthLkxhKGMpO2JyZWFrfWUrKztjPWIuY2FsbChhLGMsZCl9fTsKVi5wcm90b3R5cGUuTGE9ZnVuY3Rpb24oYSl7WGModGhpcyxhKX07dmFyIGRkPWZ1bmN0aW9uKCl7fTtuKGRkLE0pO2lhKGRkKTtnPWRkLnByb3RvdHlwZTtnLk49ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy10YWIifTtnLk5hPWZ1bmN0aW9uKCl7cmV0dXJuInRhYiJ9O2cueGE9ZnVuY3Rpb24oYSl7dmFyIGI9ZGQubC54YS5jYWxsKHRoaXMsYSk7KGE9YS5HYSgpKSYmdGhpcy5NYShiLGEpO3JldHVybiBifTtnLnlhPWZ1bmN0aW9uKGEsYil7Yj1kZC5sLnlhLmNhbGwodGhpcyxhLGIpO3ZhciBjPXRoaXMuR2EoYik7YyYmKGEuUmE9Yyk7YS5tJjgmJihjPWEuaCkmJnR5cGVvZiBjLko9PT0iZnVuY3Rpb24iJiYoVChhLDgsITEpLGMuSihhKSk7cmV0dXJuIGJ9O2cuR2E9ZnVuY3Rpb24oYSl7cmV0dXJuIGEudGl0bGV8fCIifTtnLk1hPWZ1bmN0aW9uKGEsYil7YSYmKGEudGl0bGU9Ynx8IiIpfTt2YXIgZWQ9ZnVuY3Rpb24oYSxiLGMpe04uY2FsbCh0aGlzLGEsYnx8ZGQuVigpLGMpO1BjKHRoaXMsOCwhMCk7dGhpcy5QfD05fTtuKGVkLE4pO2VkLnByb3RvdHlwZS5HYT1mdW5jdGlvbigpe3JldHVybiB0aGlzLlJhfTtlZC5wcm90b3R5cGUuTWE9ZnVuY3Rpb24oYSl7dGhpcy52Lk1hKHRoaXMuaSgpLGEpO3RoaXMuUmE9YX07dGMoImdvb2ctdGFiIixmdW5jdGlvbigpe3JldHVybiBuZXcgZWQobnVsbCl9KTt2YXIgVz1mdW5jdGlvbigpe3RoaXMuQT0idGFibGlzdCJ9O24oVyx2Yyk7aWEoVyk7Vy5wcm90b3R5cGUuZz1mdW5jdGlvbigpe3JldHVybiJnb29nLXRhYi1iYXIifTtXLnByb3RvdHlwZS51PWZ1bmN0aW9uKGEsYixjKXt0aGlzLnZ8fCh0aGlzLmh8fGZkKHRoaXMpLHRoaXMudj1FYSh0aGlzLmgpKTt2YXIgZD10aGlzLnZbYl07ZD8oemMoYSxnZChkKSksYS52PWQpOlcubC51LmNhbGwodGhpcyxhLGIsYyl9O1cucHJvdG90eXBlLmo9ZnVuY3Rpb24oYSl7dmFyIGI9Vy5sLmouY2FsbCh0aGlzLGEpO3RoaXMuaHx8ZmQodGhpcyk7Yi5wdXNoKHRoaXMuaFthLnZdKTtyZXR1cm4gYn07dmFyIGZkPWZ1bmN0aW9uKGEpe3ZhciBiPWEuZygpO2EuaD17dG9wOmIrIi10b3AiLGJvdHRvbTpiKyItYm90dG9tIixzdGFydDpiKyItc3RhcnQiLGVuZDpiKyItZW5kIn19O3ZhciBYPWZ1bmN0aW9uKGEsYixjKXthPWF8fCJ0b3AiO3pjKHRoaXMsZ2QoYSkpO3RoaXMudj1hO1YuY2FsbCh0aGlzLHRoaXMuTCxifHxXLlYoKSxjKTtoZCh0aGlzKX07bihYLFYpO2c9WC5wcm90b3R5cGU7Zy5IPW51bGw7Zy5JPWZ1bmN0aW9uKCl7WC5sLkkuY2FsbCh0aGlzKTtoZCh0aGlzKX07Zy5DPWZ1bmN0aW9uKCl7WC5sLkMuY2FsbCh0aGlzKTt0aGlzLkg9bnVsbH07Zy5MYT1mdW5jdGlvbihhKXtYLmwuTGEuY2FsbCh0aGlzLGEpO3RoaXMuSihJKHRoaXMsYSkpfTtnLko9ZnVuY3Rpb24oYSl7YT9OYyhhLCEwKTp0aGlzLkgmJk5jKHRoaXMuSCwhMSl9Owp2YXIgaWQ9ZnVuY3Rpb24oYSxiKXtpZihiJiZiPT1hLkgpe2Zvcih2YXIgYz1WYihhLGIpLGQ9Yy0xO2I9SShhLGQpO2QtLSl7dmFyIGU9YjtpZihlLmlzVmlzaWJsZSgpJiZlLmlzRW5hYmxlZCgpKXthLkooYik7cmV0dXJufX1mb3IoYys9MTtiPUkoYSxjKTtjKyspaWYoZD1iLGQuaXNWaXNpYmxlKCkmJmQuaXNFbmFibGVkKCkpe2EuSihiKTtyZXR1cm59YS5KKG51bGwpfX07Zz1YLnByb3RvdHlwZTtnLmpiPWZ1bmN0aW9uKGEpe3RoaXMuSCYmdGhpcy5IIT1hLnRhcmdldCYmTmModGhpcy5ILCExKTt0aGlzLkg9YS50YXJnZXR9O2cua2I9ZnVuY3Rpb24oYSl7YS50YXJnZXQ9PXRoaXMuSCYmKHRoaXMuSD1udWxsKX07Zy5oYj1mdW5jdGlvbihhKXtpZCh0aGlzLGEudGFyZ2V0KX07Zy5pYj1mdW5jdGlvbihhKXtpZCh0aGlzLGEudGFyZ2V0KX07Zy5QYT1mdW5jdGlvbigpe0kodGhpcyx0aGlzLm8pfHxYYyh0aGlzLFZiKHRoaXMsdGhpcy5IfHxJKHRoaXMsMCkpKX07CnZhciBoZD1mdW5jdGlvbihhKXtCKEIoQihCKFFiKGEpLGEsInNlbGVjdCIsYS5qYiksYSwidW5zZWxlY3QiLGEua2IpLGEsImRpc2FibGUiLGEuaGIpLGEsImhpZGUiLGEuaWIpfSxnZD1mdW5jdGlvbihhKXtyZXR1cm4gYT09InN0YXJ0Inx8YT09ImVuZCI/InZlcnRpY2FsIjoiaG9yaXpvbnRhbCJ9O3RjKCJnb29nLXRhYi1iYXIiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBYfSk7ZnVuY3Rpb24gamQoYSl7dmFyIGI9e3RvcDoiYm90dG9tIixib3R0b206InRvcCIsc3RhcnQ6InJpZ2h0IixlbmQ6ImxlZnQifVthLmxvY2F0aW9uXSxjPWEuZWxlbWVudElkLGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTtkLnRleHRDb250ZW50PSJcbiAgICBmaWVsZHNldCB7XG4gICAgICBwYWRkaW5nOiAxMHB4O1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgIzM2OTtcbiAgICB9XG5cbiAgICAjIitjKyIgLmdvb2ctdGFiLWNvbnRlbnQge1xuICAgICAgbWluLWhlaWdodDogM2VtO1xuICAgICAgbWFyZ2luOiAwO1xuICAgICAgYm9yZGVyOiAiK2EuYm9yZGVyKyIgc29saWQgIithLmJvcmRlckNvbG9yKyI7XG4gICAgICBib3JkZXItdG9wOiAwO1xuICAgICAgaGVpZ2h0OiAiK2EuY29udGVudEhlaWdodCsiO1xuICAgICAgcGFkZGluZzogNHB4IDhweDtcbiAgICAgIG1hcmdpbi1yaWdodDogNHB4O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgIG92ZXJmbG93OiBhdXRvO1xuICAgIH1cblxuICAgICMiKwpjKyIgLmdvb2ctdGFiLWJhci0iK2EubG9jYXRpb24rIiAuZ29vZy10YWItc2VsZWN0ZWQge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICIrYS5ib3JkZXJDb2xvcisiO1xuICAgICAgYm9yZGVyLSIrYisiOiAwcHg7XG4gICAgfVxuXG4gICAgIyIrYysiIC5nb29nLXRhYi1iYXItIithLmxvY2F0aW9uKyIge1xuICAgICAgcGFkZGluZy0iK2EubG9jYXRpb24rIjogNXB4ICFpbXBvcnRhbnQ7XG4gICAgICBib3JkZXItIitiKyI6IDFweCBzb2xpZCAiK2EuYm9yZGVyQ29sb3IrIiAhaW1wb3J0YW50O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICB9XG5cbiAgICAjIitjKyIgLmdvb2ctdGFiLWJhciB7XG4gICAgICAgbWFyZ2luOiAwO1xuICAgICAgIGJvcmRlcjogMDtcbiAgICAgICBwYWRkaW5nOiAwO1xuICAgICAgIGxpc3Qtc3R5bGU6IG5vbmU7XG4gICAgICAgY3Vyc29yOiBkZWZhdWx0O1xuICAgICAgIG91dGxpbmU6IG5vbmU7XG4gICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgICBtYXJnaW4tcmlnaHQ6IDRweDtcbiAgICAgIH1cblxuICAgICAjIisKYysiIC5nb29nLXRhYiB7XG4gICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgIHBhZGRpbmc6IDRweCA4cHg7XG4gICAgICAgY29sb3I6IHZhcigtLWNvbGFiLXByaW1hcnktdGV4dC1jb2xvcik7XG4gICAgICAgdGV4dC1kZWNvcmF0aW9uOiBpbml0aWFsO1xuICAgICAgIGN1cnNvcjogZGVmYXVsdDtcbiAgICAgIH1cblxuICAgICAgIyIrYysiIC5nb29nLXRhYi1ob3ZlciB7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWNvbGFiLWhpZ2hsaWdodGVkLXN1cmZhY2UtY29sb3IpO1xuICAgICAgfVxuICAgICAgIjtyZXR1cm4gZH0KdmFyIGtkPWZ1bmN0aW9uKGEpe3ZhciBiPWEuZWxlbWVudElkLGM9YS50YWJOYW1lcyxkPWEuc2VsZWN0ZWRJbmRleDsiY29udGVudEJvcmRlciJpbiBhfHwoYS5jb250ZW50Qm9yZGVyPSIwcHgiKTsiY29udGVudEhlaWdodCJpbiBhfHwoYS5jb250ZW50SGVpZ2h0PSJpbml0aWFsIik7ImJvcmRlckNvbG9yImluIGF8fChhLmJvcmRlckNvbG9yPSJ2YXIoLS1jb2xhYi1ib3JkZXItY29sb3IpIik7YS5sb2NhdGlvbnx8KGEubG9jYXRpb249InRvcCIpO3ZhciBlPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiMiK2IpLGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zi5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYi1iYXIiKTt2YXIgaD1hLmxvY2F0aW9uO2YuY2xhc3NMaXN0LmFkZCgiZ29vZy10YWItYmFyLSIraCk7Zm9yKHZhciBrPVtdLHE9ZmEoYyksRz1xLm5leHQoKTshRy5kb25lO0c9cS5uZXh0KCkpe0c9Ry52YWx1ZTt2YXIgeD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKeC5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYiIpO3gudGV4dENvbnRlbnQ9RztmLmFwcGVuZENoaWxkKHgpO2sucHVzaCh4KX1oIT0iYm90dG9tIiYmZS5hcHBlbmRDaGlsZChmKTtxPW51bGw7aWYoaD09InRvcCJ8fGg9PSJib3R0b20iKXE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikscS5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYi1iYXItY2xlYXIiKTtoPT0idG9wIiYmcSYmZS5hcHBlbmRDaGlsZChxKTtHPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO0cuY2xhc3NMaXN0LmFkZCgiZ29vZy10YWItY29udGVudCIpO3ZhciBoYT1bXTtjPWZhKGMpO2Zvcih4PWMubmV4dCgpOyF4LmRvbmU7eD1jLm5leHQoKSl4PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHguaWQ9ZS5pZCsiX2NvbnRlbnRfIitoYS5sZW5ndGgseC5zdHlsZS5kaXNwbGF5PSJub25lIixHLmFwcGVuZENoaWxkKHgpLGhhLnB1c2goeCk7ZS5hcHBlbmRDaGlsZChHKTtoPT0iYm90dG9tIiYmKHEmJgplLmFwcGVuZENoaWxkKHEpLGUuYXBwZW5kQ2hpbGQoZikpO3ZhciBRPW5ldyBYKGgpO1NiKFEsZik7dmFyIFI9LTE7d2IoUSwic2VsZWN0IixmdW5jdGlvbihTKXtTPWsuaW5kZXhPZihTLnRhcmdldC5pKCkpO1MhPVImJihSPj0wJiZSPGhhLmxlbmd0aCYmKGhhW1JdLnN0eWxlLmRpc3BsYXk9Im5vbmUiLFI9LTEpLFM+PTAmJlM8aGEubGVuZ3RoJiYoUj1TLGhhW1JdLnN0eWxlLmRpc3BsYXk9ImlubGluZSIsd2luZG93LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCJyZXNpemUiKSksZ29vZ2xlLmNvbGFiLm91dHB1dC5yZXNpemVJZnJhbWVUb0NvbnRlbnQoKSksUS5KKEkoUSxSKSkpfSk7US5KKEkoUSxkKSk7d2luZG93W2JdPXtzZXRTZWxlY3RlZFRhYkluZGV4OmZ1bmN0aW9uKFMpe1EuSihJKFEsUykpfX07ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChqZChhKSl9LGxkPVsiY29sYWJfbGliIiwiY3JlYXRlVGFiQmFyIl0sWT1sOwpsZFswXWluIFl8fHR5cGVvZiBZLmV4ZWNTY3JpcHQ9PSJ1bmRlZmluZWQifHxZLmV4ZWNTY3JpcHQoInZhciAiK2xkWzBdKTtmb3IodmFyIFo7bGQubGVuZ3RoJiYoWj1sZC5zaGlmdCgpKTspbGQubGVuZ3RofHxrZD09PXZvaWQgMD9ZW1pdJiZZW1pdIT09T2JqZWN0LnByb3RvdHlwZVtaXT9ZPVlbWl06WT1ZW1pdPXt9OllbWl09a2Q7fSkuY2FsbCh0aGlzKTsKLy8gY2xhbmctZm9ybWF0IG9uCg==", + "ok": true, + "headers": [ + [ + "content-length", + "41785" + ], + [ + "content-type", + "application/javascript" + ] + ], + "status": 200, + "status_text": "" + }, + "http://localhost:8080/nbextensions/google.colab/tabbar.css": { + "data": "Lmdvb2ctdGFie3Bvc2l0aW9uOnJlbGF0aXZlO3BhZGRpbmc6NHB4IDhweDtjb2xvcjojMDBjO3RleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7Y3Vyc29yOmRlZmF1bHR9Lmdvb2ctdGFiLWJhci10b3AgLmdvb2ctdGFie21hcmdpbjoxcHggNHB4IDAgMDtib3JkZXItYm90dG9tOjA7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLXRvcDphZnRlciwuZ29vZy10YWItYmFyLWJvdHRvbTphZnRlcntjb250ZW50OiIgIjtkaXNwbGF5OmJsb2NrO2hlaWdodDowO2NsZWFyOmJvdGg7dmlzaWJpbGl0eTpoaWRkZW59Lmdvb2ctdGFiLWJhci1ib3R0b20gLmdvb2ctdGFie21hcmdpbjowIDRweCAxcHggMDtib3JkZXItdG9wOjA7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLXN0YXJ0IC5nb29nLXRhYnttYXJnaW46MCAwIDRweCAxcHg7Ym9yZGVyLXJpZ2h0OjB9Lmdvb2ctdGFiLWJhci1lbmQgLmdvb2ctdGFie21hcmdpbjowIDFweCA0cHggMDtib3JkZXItbGVmdDowfS5nb29nLXRhYi1ob3ZlcntiYWNrZ3JvdW5kOiNlZWV9Lmdvb2ctdGFiLWRpc2FibGVke2NvbG9yOiM2NjZ9Lmdvb2ctdGFiLXNlbGVjdGVke2NvbG9yOiMwMDA7YmFja2dyb3VuZDojZmZmO3RleHQtZGVjb3JhdGlvbjpub25lO2ZvbnQtd2VpZ2h0OmJvbGQ7Ym9yZGVyOjFweCBzb2xpZCAjNmI5MGRhfS5nb29nLXRhYi1iYXItdG9we3BhZGRpbmctdG9wOjVweCFpbXBvcnRhbnQ7cGFkZGluZy1sZWZ0OjVweCFpbXBvcnRhbnQ7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgIzZiOTBkYSFpbXBvcnRhbnR9Lmdvb2ctdGFiLWJhci10b3AgLmdvb2ctdGFiLXNlbGVjdGVke3RvcDoxcHg7bWFyZ2luLXRvcDowO3BhZGRpbmctYm90dG9tOjVweH0uZ29vZy10YWItYmFyLWJvdHRvbSAuZ29vZy10YWItc2VsZWN0ZWR7dG9wOi0xcHg7bWFyZ2luLWJvdHRvbTowO3BhZGRpbmctdG9wOjVweH0uZ29vZy10YWItYmFyLXN0YXJ0IC5nb29nLXRhYi1zZWxlY3RlZHtsZWZ0OjFweDttYXJnaW4tbGVmdDowO3BhZGRpbmctcmlnaHQ6OXB4fS5nb29nLXRhYi1iYXItZW5kIC5nb29nLXRhYi1zZWxlY3RlZHtsZWZ0Oi0xcHg7bWFyZ2luLXJpZ2h0OjA7cGFkZGluZy1sZWZ0OjlweH0uZ29vZy10YWItYmFye21hcmdpbjowO2JvcmRlcjowO3BhZGRpbmc6MDtsaXN0LXN0eWxlOm5vbmU7Y3Vyc29yOmRlZmF1bHQ7b3V0bGluZTpub25lO2JhY2tncm91bmQ6I2ViZWZmOX0uZ29vZy10YWItYmFyLWNsZWFye2NsZWFyOmJvdGg7aGVpZ2h0OjA7b3ZlcmZsb3c6aGlkZGVufS5nb29nLXRhYi1iYXItc3RhcnR7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLWVuZHtmbG9hdDpyaWdodH0qIGh0bWwgLmdvb2ctdGFiLWJhci1zdGFydHttYXJnaW4tcmlnaHQ6LTNweH0qIGh0bWwgLmdvb2ctdGFiLWJhci1lbmR7bWFyZ2luLWxlZnQ6LTNweH1zZW50aW5lbHt9", + "ok": true, + "headers": [ + [ + "content-length", + "1404" + ], + [ + "content-type", + "text/css" + ] + ], + "status": 200, + "status_text": "" + } + }, + "base_uri": "https://localhost:8080/", + "height": 197 + }, + "outputId": "fff5e774-b57c-41db-98c1-cb6c9d6a3b5c" + }, + "source": [ + "%%logica MyFruit\n", + "\n", + "T(1, \"apple\");\n", + "T(2, \"banana\");\n", + "T(3, \"orange\");\n", + "\n", + "DoubleT(d, y) :- T(x, y), d == 2 * x;\n", + "\n", + "MyFruit(f) :- DoubleT(6, f);" + ], + "execution_count": 35, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"703e2162-d22d-11ef-a7c0-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id79\", \"tabNames\": [\"MyFruit\", \"(Log)\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_2a7e55903f" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"703e8c60-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id79\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_d447f65284" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"70404c3a-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_95b4a1b0b8" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7040a004-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id79_content_1\");\n", + "//# sourceURL=js_7b5803975c" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7040f4fa-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"7040a004-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_2b865b506b" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7041d0fa-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id79\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_a433517bf1" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"70456530-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"70404c3a-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_b45dfdeefd" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"704746de-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_f550740bd3" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7047c488-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id79_content_0\");\n", + "//# sourceURL=js_a464f04f62" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"70486956-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"7047c488-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_9ebb2840c0" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7048d418-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id79\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_bbe4d4b004" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"704ac84a-d22d-11ef-a7c0-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id80\", \"tabNames\": [\"SQL\", \"Result\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_f2855797a3" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"704b61f6-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id80\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_c97020b63b" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"704d5fd8-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_5fbadd5a59" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"704dae7a-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id80_content_0\");\n", + "//# sourceURL=js_c8c5a50761" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"704df9e8-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"704dae7a-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_31455ae7ac" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"704e418c-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id80\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_eb6fc9b531" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The following query is stored at \u001b[1mMyFruit_sql\u001b[0m variable.\n", + "-- Initializing DuckDB environment.\n", + "create schema if not exists logica_home;\n", + "-- Empty record, has to have a field by DuckDB syntax.\n", + "drop type if exists logicarecord893574736 cascade; create type logicarecord893574736 as struct(nirvana numeric);\n", + "create sequence if not exists eternal_logical_sequence;\n", + "\n", + "\n", + "-- Logica type: logicarecord481217614\n", + "drop type if exists logicarecord481217614 cascade; create type logicarecord481217614 as struct(r logicarecord893574736);\n", + "\n", + "-- Logica type: logicarecord383307722\n", + "drop type if exists logicarecord383307722 cascade; create type logicarecord383307722 as struct(a timestamp);\n", + "WITH t_0_T AS (SELECT * FROM (\n", + " \n", + " SELECT\n", + " 1 AS col0,\n", + " 'apple' AS col1\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " 2 AS col0,\n", + " 'banana' AS col1\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " 3 AS col0,\n", + " 'orange' AS col1\n", + " \n", + ") AS UNUSED_TABLE_NAME )\n", + "SELECT\n", + " T.col1 AS col0\n", + "FROM\n", + " t_0_T AS T\n", + "WHERE\n", + " (6 = ((2) * (T.col0)));\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"704fa7fc-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"704d5fd8-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_13fca005ec" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7051b11e-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_7d66430294" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"70521df2-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id80_content_1\");\n", + "//# sourceURL=js_63e5a67184" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"70526ad2-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"70521df2-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_5288c0ac9c" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7052caf4-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id80\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_e0f5e6ea18" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The following table is stored at \u001b[1mMyFruit\u001b[0m variable.\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
col0
0orange
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7054d9de-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"7051b11e-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_8d4ba22b5a" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7056c38e-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"704746de-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_16f760d913" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7058fa82-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_1ad2cffbf1" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"70597700-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id79_content_1\");\n", + "//# sourceURL=js_e2a4da5824" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"705a3ec4-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"70597700-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_08dfbc8362" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"705aa080-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id79\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_68b06e3d73" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "image/svg+xml": "\n\n\n\n\n\nConcertina\n\n\n\nMyFruit\n\nMyFruit\n\n\n\n", + "text/plain": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Running predicate: MyFruit (4 ms)\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"706c717a-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"7058fa82-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_e9c860c870" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"706ee45a-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_f1dc26d18f" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"706f49e0-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id79_content_0\");\n", + "//# sourceURL=js_069f1b4818" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"706f9ec2-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"706f49e0-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_d6d64f894e" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"706fee72-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id79\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_a1ae975eba" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7071236e-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_2bb2da654c" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7071c846-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id80_content_1\");\n", + "//# sourceURL=js_fb61dba8d8" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"707219b8-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"7071c846-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_e46b351fe5" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"70726a3a-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id80\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_d41d646038" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"70743388-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"7071236e-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_97faa14068" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + " \n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7075a628-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"706ee45a-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_c198c4cdb2" + ] + }, + "metadata": {} + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "LteIm06wDNng" + }, + "source": [ + "Here when `MyFruit` is querried the expression `d == 2 * x` appears to be a condition for filtering rows of T.\n", + "\n", + "Thusly there is not a clear difference between equality and assignment and they are not differentiated in the syntax." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "QBxal9qmKodo" + }, + "source": [ + "### Using SQLite\n", + "\n", + "SQLite is a great backend to learn Logica if you do not have Google Cloud project id yet." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "7dSMpuU9K1AI" + }, + "source": [ + "from logica import colab_logica" + ], + "execution_count": 36, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "qylsTIWtK2nX", + "colab": { + "resources": { + "http://localhost:8080/nbextensions/google.colab/tabbar.css": { + "data": "Lmdvb2ctdGFie3Bvc2l0aW9uOnJlbGF0aXZlO3BhZGRpbmc6NHB4IDhweDtjb2xvcjojMDBjO3RleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7Y3Vyc29yOmRlZmF1bHR9Lmdvb2ctdGFiLWJhci10b3AgLmdvb2ctdGFie21hcmdpbjoxcHggNHB4IDAgMDtib3JkZXItYm90dG9tOjA7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLXRvcDphZnRlciwuZ29vZy10YWItYmFyLWJvdHRvbTphZnRlcntjb250ZW50OiIgIjtkaXNwbGF5OmJsb2NrO2hlaWdodDowO2NsZWFyOmJvdGg7dmlzaWJpbGl0eTpoaWRkZW59Lmdvb2ctdGFiLWJhci1ib3R0b20gLmdvb2ctdGFie21hcmdpbjowIDRweCAxcHggMDtib3JkZXItdG9wOjA7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLXN0YXJ0IC5nb29nLXRhYnttYXJnaW46MCAwIDRweCAxcHg7Ym9yZGVyLXJpZ2h0OjB9Lmdvb2ctdGFiLWJhci1lbmQgLmdvb2ctdGFie21hcmdpbjowIDFweCA0cHggMDtib3JkZXItbGVmdDowfS5nb29nLXRhYi1ob3ZlcntiYWNrZ3JvdW5kOiNlZWV9Lmdvb2ctdGFiLWRpc2FibGVke2NvbG9yOiM2NjZ9Lmdvb2ctdGFiLXNlbGVjdGVke2NvbG9yOiMwMDA7YmFja2dyb3VuZDojZmZmO3RleHQtZGVjb3JhdGlvbjpub25lO2ZvbnQtd2VpZ2h0OmJvbGQ7Ym9yZGVyOjFweCBzb2xpZCAjNmI5MGRhfS5nb29nLXRhYi1iYXItdG9we3BhZGRpbmctdG9wOjVweCFpbXBvcnRhbnQ7cGFkZGluZy1sZWZ0OjVweCFpbXBvcnRhbnQ7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgIzZiOTBkYSFpbXBvcnRhbnR9Lmdvb2ctdGFiLWJhci10b3AgLmdvb2ctdGFiLXNlbGVjdGVke3RvcDoxcHg7bWFyZ2luLXRvcDowO3BhZGRpbmctYm90dG9tOjVweH0uZ29vZy10YWItYmFyLWJvdHRvbSAuZ29vZy10YWItc2VsZWN0ZWR7dG9wOi0xcHg7bWFyZ2luLWJvdHRvbTowO3BhZGRpbmctdG9wOjVweH0uZ29vZy10YWItYmFyLXN0YXJ0IC5nb29nLXRhYi1zZWxlY3RlZHtsZWZ0OjFweDttYXJnaW4tbGVmdDowO3BhZGRpbmctcmlnaHQ6OXB4fS5nb29nLXRhYi1iYXItZW5kIC5nb29nLXRhYi1zZWxlY3RlZHtsZWZ0Oi0xcHg7bWFyZ2luLXJpZ2h0OjA7cGFkZGluZy1sZWZ0OjlweH0uZ29vZy10YWItYmFye21hcmdpbjowO2JvcmRlcjowO3BhZGRpbmc6MDtsaXN0LXN0eWxlOm5vbmU7Y3Vyc29yOmRlZmF1bHQ7b3V0bGluZTpub25lO2JhY2tncm91bmQ6I2ViZWZmOX0uZ29vZy10YWItYmFyLWNsZWFye2NsZWFyOmJvdGg7aGVpZ2h0OjA7b3ZlcmZsb3c6aGlkZGVufS5nb29nLXRhYi1iYXItc3RhcnR7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLWVuZHtmbG9hdDpyaWdodH0qIGh0bWwgLmdvb2ctdGFiLWJhci1zdGFydHttYXJnaW4tcmlnaHQ6LTNweH0qIGh0bWwgLmdvb2ctdGFiLWJhci1lbmR7bWFyZ2luLWxlZnQ6LTNweH1zZW50aW5lbHt9", + "ok": true, + "headers": [ + [ + "content-length", + "1404" + ], + [ + "content-type", + "text/css" + ] + ], + "status": 200, + "status_text": "" + }, + "http://localhost:8080/nbextensions/google.colab/tabbar_main.min.js": { + "data": "Ly8gY2xhbmctZm9ybWF0IG9mZgooZnVuY3Rpb24oKXt2YXIgZyxhYT1mdW5jdGlvbihhKXt2YXIgYj0wO3JldHVybiBmdW5jdGlvbigpe3JldHVybiBiPGEubGVuZ3RoP3tkb25lOiExLHZhbHVlOmFbYisrXX06e2RvbmU6ITB9fX0sYmE9dHlwZW9mIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzPT0iZnVuY3Rpb24iP09iamVjdC5kZWZpbmVQcm9wZXJ0eTpmdW5jdGlvbihhLGIsYyl7aWYoYT09QXJyYXkucHJvdG90eXBlfHxhPT1PYmplY3QucHJvdG90eXBlKXJldHVybiBhO2FbYl09Yy52YWx1ZTtyZXR1cm4gYX0sY2E9ZnVuY3Rpb24oYSl7YT1bIm9iamVjdCI9PXR5cGVvZiBnbG9iYWxUaGlzJiZnbG9iYWxUaGlzLGEsIm9iamVjdCI9PXR5cGVvZiB3aW5kb3cmJndpbmRvdywib2JqZWN0Ij09dHlwZW9mIHNlbGYmJnNlbGYsIm9iamVjdCI9PXR5cGVvZiBnbG9iYWwmJmdsb2JhbF07Zm9yKHZhciBiPTA7YjxhLmxlbmd0aDsrK2Ipe3ZhciBjPWFbYl07aWYoYyYmYy5NYXRoPT1NYXRoKXJldHVybiBjfXRocm93IEVycm9yKCJDYW5ub3QgZmluZCBnbG9iYWwgb2JqZWN0Iik7Cn0sZGE9Y2EodGhpcyksZWE9ZnVuY3Rpb24oYSxiKXtpZihiKWE6e3ZhciBjPWRhO2E9YS5zcGxpdCgiLiIpO2Zvcih2YXIgZD0wO2Q8YS5sZW5ndGgtMTtkKyspe3ZhciBlPWFbZF07aWYoIShlIGluIGMpKWJyZWFrIGE7Yz1jW2VdfWE9YVthLmxlbmd0aC0xXTtkPWNbYV07Yj1iKGQpO2IhPWQmJmIhPW51bGwmJmJhKGMsYSx7Y29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOmJ9KX19OwplYSgiU3ltYm9sIixmdW5jdGlvbihhKXtpZihhKXJldHVybiBhO3ZhciBiPWZ1bmN0aW9uKGYsaCl7dGhpcy5nPWY7YmEodGhpcywiZGVzY3JpcHRpb24iLHtjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6aH0pfTtiLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmd9O3ZhciBjPSJqc2NvbXBfc3ltYm9sXyIrKE1hdGgucmFuZG9tKCkqMUU5Pj4+MCkrIl8iLGQ9MCxlPWZ1bmN0aW9uKGYpe2lmKHRoaXMgaW5zdGFuY2VvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoIlN5bWJvbCBpcyBub3QgYSBjb25zdHJ1Y3RvciIpO3JldHVybiBuZXcgYihjKyhmfHwiIikrIl8iK2QrKyxmKX07cmV0dXJuIGV9KTsKdmFyIGZhPWZ1bmN0aW9uKGEpe3ZhciBiPXR5cGVvZiBTeW1ib2whPSJ1bmRlZmluZWQiJiZTeW1ib2wuaXRlcmF0b3ImJmFbU3ltYm9sLml0ZXJhdG9yXTtpZihiKXJldHVybiBiLmNhbGwoYSk7aWYodHlwZW9mIGEubGVuZ3RoPT0ibnVtYmVyIilyZXR1cm57bmV4dDphYShhKX07dGhyb3cgRXJyb3IoU3RyaW5nKGEpKyIgaXMgbm90IGFuIGl0ZXJhYmxlIG9yIEFycmF5TGlrZSIpO307ZWEoIlN5bWJvbC5kaXNwb3NlIixmdW5jdGlvbihhKXtyZXR1cm4gYT9hOlN5bWJvbCgiU3ltYm9sLmRpc3Bvc2UiKX0pOy8qCgogQ29weXJpZ2h0IFRoZSBDbG9zdXJlIExpYnJhcnkgQXV0aG9ycy4KIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wCiovCnZhciBsPXRoaXN8fHNlbGYsaWE9ZnVuY3Rpb24oYSl7YS5JYT12b2lkIDA7YS5WPWZ1bmN0aW9uKCl7cmV0dXJuIGEuSWE/YS5JYTphLklhPW5ldyBhfX0samE9ZnVuY3Rpb24oYSl7dmFyIGI9dHlwZW9mIGE7cmV0dXJuIGIhPSJvYmplY3QiP2I6YT9BcnJheS5pc0FycmF5KGEpPyJhcnJheSI6YjoibnVsbCJ9LGthPWZ1bmN0aW9uKGEpe3ZhciBiPWphKGEpO3JldHVybiBiPT0iYXJyYXkifHxiPT0ib2JqZWN0IiYmdHlwZW9mIGEubGVuZ3RoPT0ibnVtYmVyIn0sbT1mdW5jdGlvbihhKXt2YXIgYj10eXBlb2YgYTtyZXR1cm4gYj09Im9iamVjdCImJmEhPW51bGx8fGI9PSJmdW5jdGlvbiJ9LG5hPWZ1bmN0aW9uKGEpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYSxsYSkmJmFbbGFdfHwoYVtsYV09KyttYSl9LGxhPSJjbG9zdXJlX3VpZF8iKyhNYXRoLnJhbmRvbSgpKjFFOT4+PjApLG1hPTAsbj1mdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoKXt9Yy5wcm90b3R5cGU9CmIucHJvdG90eXBlO2EubD1iLnByb3RvdHlwZTthLnByb3RvdHlwZT1uZXcgYzthLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1hO2EucWQ9ZnVuY3Rpb24oZCxlLGYpe2Zvcih2YXIgaD1BcnJheShhcmd1bWVudHMubGVuZ3RoLTIpLGs9MjtrPGFyZ3VtZW50cy5sZW5ndGg7aysrKWhbay0yXT1hcmd1bWVudHNba107cmV0dXJuIGIucHJvdG90eXBlW2VdLmFwcGx5KGQsaCl9fTtmdW5jdGlvbiBvYShhLGIpe2lmKEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKUVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsb2EpO2Vsc2V7dmFyIGM9RXJyb3IoKS5zdGFjaztjJiYodGhpcy5zdGFjaz1jKX1hJiYodGhpcy5tZXNzYWdlPVN0cmluZyhhKSk7YiE9PXZvaWQgMCYmKHRoaXMuY2F1c2U9Yil9bihvYSxFcnJvcik7b2EucHJvdG90eXBlLm5hbWU9IkN1c3RvbUVycm9yIjt2YXIgcGE7ZnVuY3Rpb24gcWEoYSxiKXthPWEuc3BsaXQoIiVzIik7Zm9yKHZhciBjPSIiLGQ9YS5sZW5ndGgtMSxlPTA7ZTxkO2UrKyljKz1hW2VdKyhlPGIubGVuZ3RoP2JbZV06IiVzIik7b2EuY2FsbCh0aGlzLGMrYVtkXSl9bihxYSxvYSk7cWEucHJvdG90eXBlLm5hbWU9IkFzc2VydGlvbkVycm9yIjtmdW5jdGlvbiByYShhLGIsYyxkKXt2YXIgZT0iQXNzZXJ0aW9uIGZhaWxlZCI7aWYoYyl7ZSs9IjogIitjO3ZhciBmPWR9ZWxzZSBhJiYoZSs9IjogIithLGY9Yik7dGhyb3cgbmV3IHFhKCIiK2UsZnx8W10pO30KdmFyIHA9ZnVuY3Rpb24oYSxiLGMpe2F8fHJhKCIiLG51bGwsYixBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMikpO3JldHVybiBhfSxzYT1mdW5jdGlvbihhLGIsYyl7bShhKSYmYS5ub2RlVHlwZT09MXx8cmEoIkV4cGVjdGVkIEVsZW1lbnQgYnV0IGdvdCAlczogJXMuIixbamEoYSksYV0sYixBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMikpfSx1YT1mdW5jdGlvbihhLGIsYyxkKXthIGluc3RhbmNlb2YgYnx8cmEoIkV4cGVjdGVkIGluc3RhbmNlb2YgJXMgYnV0IGdvdCAlcy4iLFt0YShiKSx0YShhKV0sYyxBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMykpfTsKZnVuY3Rpb24gdGEoYSl7cmV0dXJuIGEgaW5zdGFuY2VvZiBGdW5jdGlvbj9hLmRpc3BsYXlOYW1lfHxhLm5hbWV8fCJ1bmtub3duIHR5cGUgbmFtZSI6YSBpbnN0YW5jZW9mIE9iamVjdD9hLmNvbnN0cnVjdG9yLmRpc3BsYXlOYW1lfHxhLmNvbnN0cnVjdG9yLm5hbWV8fE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhKTphPT09bnVsbD8ibnVsbCI6dHlwZW9mIGF9O3ZhciB2YT1BcnJheS5wcm90b3R5cGUuaW5kZXhPZj9mdW5jdGlvbihhLGIpe3AoYS5sZW5ndGghPW51bGwpO3JldHVybiBBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKGEsYix2b2lkIDApfTpmdW5jdGlvbihhLGIpe2lmKHR5cGVvZiBhPT09InN0cmluZyIpcmV0dXJuIHR5cGVvZiBiIT09InN0cmluZyJ8fGIubGVuZ3RoIT0xPy0xOmEuaW5kZXhPZihiLDApO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWlmKGMgaW4gYSYmYVtjXT09PWIpcmV0dXJuIGM7cmV0dXJuLTF9LHdhPUFycmF5LnByb3RvdHlwZS5mb3JFYWNoP2Z1bmN0aW9uKGEsYil7cChhLmxlbmd0aCE9bnVsbCk7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChhLGIsdm9pZCAwKX06ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9YS5sZW5ndGgsZD10eXBlb2YgYT09PSJzdHJpbmciP2Euc3BsaXQoIiIpOmEsZT0wO2U8YztlKyspZSBpbiBkJiZiLmNhbGwodm9pZCAwLGRbZV0sZSxhKX07CmZ1bmN0aW9uIHhhKGEsYil7Yj12YShhLGIpO3ZhciBjO2lmKGM9Yj49MClwKGEubGVuZ3RoIT1udWxsKSxBcnJheS5wcm90b3R5cGUuc3BsaWNlLmNhbGwoYSxiLDEpO3JldHVybiBjfWZ1bmN0aW9uIHlhKGEpe3ZhciBiPWEubGVuZ3RoO2lmKGI+MCl7Zm9yKHZhciBjPUFycmF5KGIpLGQ9MDtkPGI7ZCsrKWNbZF09YVtkXTtyZXR1cm4gY31yZXR1cm5bXX1mdW5jdGlvbiB6YShhLGIsYyxkKXtwKGEubGVuZ3RoIT1udWxsKTtBcnJheS5wcm90b3R5cGUuc3BsaWNlLmFwcGx5KGEsQWEoYXJndW1lbnRzLDEpKX1mdW5jdGlvbiBBYShhLGIsYyl7cChhLmxlbmd0aCE9bnVsbCk7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg8PTI/QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYSxiKTpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhLGIsYyl9O2Z1bmN0aW9uIEJhKGEsYixjKXtmb3IodmFyIGQgaW4gYSliLmNhbGwoYyxhW2RdLGQsYSl9ZnVuY3Rpb24gQ2EoYSxiKXtmb3IodmFyIGMgaW4gYSlpZihhW2NdPT1iKXJldHVybiEwO3JldHVybiExfWZ1bmN0aW9uIERhKGEsYixjKXtpZihhIT09bnVsbCYmYiBpbiBhKXRocm93IEVycm9yKCdUaGUgb2JqZWN0IGFscmVhZHkgY29udGFpbnMgdGhlIGtleSAiJytiKyciJyk7YVtiXT1jfWZ1bmN0aW9uIEVhKGEpe3ZhciBiPXt9LGM7Zm9yKGMgaW4gYSliW2FbY11dPWM7cmV0dXJuIGJ9dmFyIEZhPSJjb25zdHJ1Y3RvciBoYXNPd25Qcm9wZXJ0eSBpc1Byb3RvdHlwZU9mIHByb3BlcnR5SXNFbnVtZXJhYmxlIHRvTG9jYWxlU3RyaW5nIHRvU3RyaW5nIHZhbHVlT2YiLnNwbGl0KCIgIik7CmZ1bmN0aW9uIEdhKGEsYil7Zm9yKHZhciBjLGQsZT0xO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspe2Q9YXJndW1lbnRzW2VdO2ZvcihjIGluIGQpYVtjXT1kW2NdO2Zvcih2YXIgZj0wO2Y8RmEubGVuZ3RoO2YrKyljPUZhW2ZdLE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChkLGMpJiYoYVtjXT1kW2NdKX19O3ZhciBIYT1TdHJpbmcucHJvdG90eXBlLnRyaW0/ZnVuY3Rpb24oYSl7cmV0dXJuIGEudHJpbSgpfTpmdW5jdGlvbihhKXtyZXR1cm4vXltcc1x4YTBdKihbXHNcU10qPylbXHNceGEwXSokLy5leGVjKGEpWzFdfTsvKgoKIENvcHlyaWdodCBHb29nbGUgTExDCiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMAoqLwp2YXIgSWE9e307dmFyIEphPWZ1bmN0aW9uKGEpe2lmKElhIT09SWEpdGhyb3cgRXJyb3IoIkJhZCBzZWNyZXQiKTt0aGlzLmc9YX07SmEucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ307bmV3IEphKCJhYm91dDpibGFuayIpO25ldyBKYSgiYWJvdXQ6aW52YWxpZCN6Q2xvc3VyZXoiKTt2YXIgS2E9W10sTGE9ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJBIFVSTCB3aXRoIGNvbnRlbnQgJyIrYSsiJyB3YXMgc2FuaXRpemVkIGF3YXkuIil9O0thLmluZGV4T2YoTGEpPT09LTEmJkthLnB1c2goTGEpO3ZhciBNYSxOYTthOntmb3IodmFyIE9hPVsiQ0xPU1VSRV9GTEFHUyJdLFBhPWwsUWE9MDtRYTxPYS5sZW5ndGg7UWErKylpZihQYT1QYVtPYVtRYV1dLFBhPT1udWxsKXtOYT1udWxsO2JyZWFrIGF9TmE9UGF9dmFyIFJhPU5hJiZOYVs2MTA0MDEzMDFdO01hPVJhIT1udWxsP1JhOiExO2Z1bmN0aW9uIFNhKCl7dmFyIGE9bC5uYXZpZ2F0b3I7cmV0dXJuIGEmJihhPWEudXNlckFnZW50KT9hOiIifXZhciBUYSxVYT1sLm5hdmlnYXRvcjtUYT1VYT9VYS51c2VyQWdlbnREYXRhfHxudWxsOm51bGw7ZnVuY3Rpb24gcihhKXtyZXR1cm4gU2EoKS5pbmRleE9mKGEpIT0tMX07dmFyIFZhPXIoIkVkZ2UiKSx0PXIoIkdlY2tvIikmJiEoU2EoKS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoIndlYmtpdCIpIT0tMSYmIXIoIkVkZ2UiKSkmJiEocigiVHJpZGVudCIpfHxyKCJNU0lFIikpJiYhcigiRWRnZSIpLHU9U2EoKS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoIndlYmtpdCIpIT0tMSYmIXIoIkVkZ2UiKSx2PU1hJiZUYSYmVGEucGxhdGZvcm0/VGEucGxhdGZvcm09PT0ibWFjT1MiOnIoIk1hY2ludG9zaCIpO3ZhciBYYT1mdW5jdGlvbihhLGIpe0JhKGIsZnVuY3Rpb24oYyxkKXtkPT0ic3R5bGUiP2Euc3R5bGUuY3NzVGV4dD1jOmQ9PSJjbGFzcyI/YS5jbGFzc05hbWU9YzpkPT0iZm9yIj9hLmh0bWxGb3I9YzpXYS5oYXNPd25Qcm9wZXJ0eShkKT9hLnNldEF0dHJpYnV0ZShXYVtkXSxjKTpkLmxhc3RJbmRleE9mKCJhcmlhLSIsMCk9PTB8fGQubGFzdEluZGV4T2YoImRhdGEtIiwwKT09MD9hLnNldEF0dHJpYnV0ZShkLGMpOmFbZF09Y30pfSxXYT17Y2VsbHBhZGRpbmc6ImNlbGxQYWRkaW5nIixjZWxsc3BhY2luZzoiY2VsbFNwYWNpbmciLGNvbHNwYW46ImNvbFNwYW4iLGZyYW1lYm9yZGVyOiJmcmFtZUJvcmRlciIsaGVpZ2h0OiJoZWlnaHQiLG1heGxlbmd0aDoibWF4TGVuZ3RoIixub25jZToibm9uY2UiLHJvbGU6InJvbGUiLHJvd3NwYW46InJvd1NwYW4iLHR5cGU6InR5cGUiLHVzZW1hcDoidXNlTWFwIix2YWxpZ246InZBbGlnbiIsd2lkdGg6IndpZHRoIn0sWWE9ZnVuY3Rpb24oYSwKYixjKXtmdW5jdGlvbiBkKGspe2smJmIuYXBwZW5kQ2hpbGQodHlwZW9mIGs9PT0ic3RyaW5nIj9hLmNyZWF0ZVRleHROb2RlKGspOmspfWZvcih2YXIgZT0yO2U8Yy5sZW5ndGg7ZSsrKXt2YXIgZj1jW2VdO2lmKCFrYShmKXx8bShmKSYmZi5ub2RlVHlwZT4wKWQoZik7ZWxzZXthOntpZihmJiZ0eXBlb2YgZi5sZW5ndGg9PSJudW1iZXIiKXtpZihtKGYpKXt2YXIgaD10eXBlb2YgZi5pdGVtPT0iZnVuY3Rpb24ifHx0eXBlb2YgZi5pdGVtPT0ic3RyaW5nIjticmVhayBhfWlmKHR5cGVvZiBmPT09ImZ1bmN0aW9uIil7aD10eXBlb2YgZi5pdGVtPT0iZnVuY3Rpb24iO2JyZWFrIGF9fWg9ITF9d2EoaD95YShmKTpmLGQpfX19LFphPWZ1bmN0aW9uKGEsYil7Yj1TdHJpbmcoYik7YS5jb250ZW50VHlwZT09PSJhcHBsaWNhdGlvbi94aHRtbCt4bWwiJiYoYj1iLnRvTG93ZXJDYXNlKCkpO3JldHVybiBhLmNyZWF0ZUVsZW1lbnQoYil9LCRhPWZ1bmN0aW9uKGEpe2EmJmEucGFyZW50Tm9kZSYmCmEucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhKX0sYWI9ZnVuY3Rpb24oYSxiKXtpZighYXx8IWIpcmV0dXJuITE7aWYoYS5jb250YWlucyYmYi5ub2RlVHlwZT09MSlyZXR1cm4gYT09Ynx8YS5jb250YWlucyhiKTtpZih0eXBlb2YgYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiE9InVuZGVmaW5lZCIpcmV0dXJuIGE9PWJ8fCEhKGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24oYikmMTYpO2Zvcig7YiYmYSE9YjspYj1iLnBhcmVudE5vZGU7cmV0dXJuIGI9PWF9LGJiPWZ1bmN0aW9uKGEpe3AoYSwiTm9kZSBjYW5ub3QgYmUgbnVsbCBvciB1bmRlZmluZWQuIik7cmV0dXJuIGEubm9kZVR5cGU9PTk/YTphLm93bmVyRG9jdW1lbnR8fGEuZG9jdW1lbnR9LGNiPWZ1bmN0aW9uKGEsYil7Yj9hLnRhYkluZGV4PTA6KGEudGFiSW5kZXg9LTEsYS5yZW1vdmVBdHRyaWJ1dGUoInRhYkluZGV4IikpfSxkYj1mdW5jdGlvbihhKXtyZXR1cm4gYS5oYXNBdHRyaWJ1dGUoInRhYmluZGV4Iil9LGViPQpmdW5jdGlvbihhKXthPWEudGFiSW5kZXg7cmV0dXJuIHR5cGVvZiBhPT09Im51bWJlciImJmE+PTAmJmE8MzI3Njh9LGZiPWZ1bmN0aW9uKGEpe3RoaXMuZz1hfHxsLmRvY3VtZW50fHxkb2N1bWVudH07ZmIucHJvdG90eXBlLmk9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nO3JldHVybiB0eXBlb2YgYT09PSJzdHJpbmciP2IuZ2V0RWxlbWVudEJ5SWQoYSk6YX07ZmIucHJvdG90eXBlLmg9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXMuZyxlPWFyZ3VtZW50cyxmPWVbMV0saD1aYShkLFN0cmluZyhlWzBdKSk7ZiYmKHR5cGVvZiBmPT09InN0cmluZyI/aC5jbGFzc05hbWU9ZjpBcnJheS5pc0FycmF5KGYpP2guY2xhc3NOYW1lPWYuam9pbigiICIpOlhhKGgsZikpO2UubGVuZ3RoPjImJllhKGQsaCxlKTtyZXR1cm4gaH07dmFyIHc9ZnVuY3Rpb24oKXt0aGlzLmJhPXRoaXMuYmE7dGhpcy5rYT10aGlzLmthfTt3LnByb3RvdHlwZS5iYT0hMTt3LnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7dGhpcy5iYXx8KHRoaXMuYmE9ITAsdGhpcy5DKCkpfTt3LnByb3RvdHlwZVtTeW1ib2wuZGlzcG9zZV09ZnVuY3Rpb24oKXt0aGlzLmRpc3Bvc2UoKX07dy5wcm90b3R5cGUuQz1mdW5jdGlvbigpe2lmKHRoaXMua2EpZm9yKDt0aGlzLmthLmxlbmd0aDspdGhpcy5rYS5zaGlmdCgpKCl9O3ZhciB5PWZ1bmN0aW9uKGEsYil7dGhpcy50eXBlPWE7dGhpcy51PXRoaXMudGFyZ2V0PWI7dGhpcy5kZWZhdWx0UHJldmVudGVkPXRoaXMuQT0hMX07eS5wcm90b3R5cGUudj1mdW5jdGlvbigpe3RoaXMuQT0hMH07eS5wcm90b3R5cGUuaj1mdW5jdGlvbigpe3RoaXMuZGVmYXVsdFByZXZlbnRlZD0hMH07dmFyIGdiPWZ1bmN0aW9uKCl7aWYoIWwuYWRkRXZlbnRMaXN0ZW5lcnx8IU9iamVjdC5kZWZpbmVQcm9wZXJ0eSlyZXR1cm4hMTt2YXIgYT0hMSxiPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwicGFzc2l2ZSIse2dldDpmdW5jdGlvbigpe2E9ITB9fSk7dHJ5e3ZhciBjPWZ1bmN0aW9uKCl7fTtsLmFkZEV2ZW50TGlzdGVuZXIoInRlc3QiLGMsYik7bC5yZW1vdmVFdmVudExpc3RlbmVyKCJ0ZXN0IixjLGIpfWNhdGNoKGQpe31yZXR1cm4gYX0oKTt2YXIgej1mdW5jdGlvbihhLGIpe3kuY2FsbCh0aGlzLGE/YS50eXBlOiIiKTt0aGlzLnJlbGF0ZWRUYXJnZXQ9dGhpcy51PXRoaXMudGFyZ2V0PW51bGw7dGhpcy5idXR0b249dGhpcy5zY3JlZW5ZPXRoaXMuc2NyZWVuWD10aGlzLmNsaWVudFk9dGhpcy5jbGllbnRYPTA7dGhpcy5rZXk9IiI7dGhpcy5nPTA7dGhpcy5tZXRhS2V5PXRoaXMuc2hpZnRLZXk9dGhpcy5hbHRLZXk9dGhpcy5jdHJsS2V5PSExO3RoaXMuc3RhdGU9bnVsbDt0aGlzLkc9ITE7dGhpcy5wb2ludGVySWQ9MDt0aGlzLnBvaW50ZXJUeXBlPSIiO3RoaXMudGltZVN0YW1wPTA7dGhpcy5oPW51bGw7aWYoYSl7dmFyIGM9dGhpcy50eXBlPWEudHlwZSxkPWEuY2hhbmdlZFRvdWNoZXMmJmEuY2hhbmdlZFRvdWNoZXMubGVuZ3RoP2EuY2hhbmdlZFRvdWNoZXNbMF06bnVsbDt0aGlzLnRhcmdldD1hLnRhcmdldHx8YS5zcmNFbGVtZW50O3RoaXMudT1iO2I9YS5yZWxhdGVkVGFyZ2V0O2J8fChjPT0ibW91c2VvdmVyIj8KYj1hLmZyb21FbGVtZW50OmM9PSJtb3VzZW91dCImJihiPWEudG9FbGVtZW50KSk7dGhpcy5yZWxhdGVkVGFyZ2V0PWI7ZD8odGhpcy5jbGllbnRYPWQuY2xpZW50WCE9PXZvaWQgMD9kLmNsaWVudFg6ZC5wYWdlWCx0aGlzLmNsaWVudFk9ZC5jbGllbnRZIT09dm9pZCAwP2QuY2xpZW50WTpkLnBhZ2VZLHRoaXMuc2NyZWVuWD1kLnNjcmVlblh8fDAsdGhpcy5zY3JlZW5ZPWQuc2NyZWVuWXx8MCk6KHRoaXMuY2xpZW50WD1hLmNsaWVudFghPT12b2lkIDA/YS5jbGllbnRYOmEucGFnZVgsdGhpcy5jbGllbnRZPWEuY2xpZW50WSE9PXZvaWQgMD9hLmNsaWVudFk6YS5wYWdlWSx0aGlzLnNjcmVlblg9YS5zY3JlZW5YfHwwLHRoaXMuc2NyZWVuWT1hLnNjcmVlbll8fDApO3RoaXMuYnV0dG9uPWEuYnV0dG9uO3RoaXMuZz1hLmtleUNvZGV8fDA7dGhpcy5rZXk9YS5rZXl8fCIiO3RoaXMuY3RybEtleT1hLmN0cmxLZXk7dGhpcy5hbHRLZXk9YS5hbHRLZXk7dGhpcy5zaGlmdEtleT1hLnNoaWZ0S2V5Owp0aGlzLm1ldGFLZXk9YS5tZXRhS2V5O3RoaXMuRz12P2EubWV0YUtleTphLmN0cmxLZXk7dGhpcy5wb2ludGVySWQ9YS5wb2ludGVySWR8fDA7dGhpcy5wb2ludGVyVHlwZT1hLnBvaW50ZXJUeXBlO3RoaXMuc3RhdGU9YS5zdGF0ZTt0aGlzLnRpbWVTdGFtcD1hLnRpbWVTdGFtcDt0aGlzLmg9YTthLmRlZmF1bHRQcmV2ZW50ZWQmJnoubC5qLmNhbGwodGhpcyl9fTtuKHoseSk7ei5wcm90b3R5cGUudj1mdW5jdGlvbigpe3oubC52LmNhbGwodGhpcyk7dGhpcy5oLnN0b3BQcm9wYWdhdGlvbj90aGlzLmguc3RvcFByb3BhZ2F0aW9uKCk6dGhpcy5oLmNhbmNlbEJ1YmJsZT0hMH07ei5wcm90b3R5cGUuaj1mdW5jdGlvbigpe3oubC5qLmNhbGwodGhpcyk7dmFyIGE9dGhpcy5oO2EucHJldmVudERlZmF1bHQ/YS5wcmV2ZW50RGVmYXVsdCgpOmEucmV0dXJuVmFsdWU9ITF9O3ZhciBoYj0iY2xvc3VyZV9saXN0ZW5hYmxlXyIrKE1hdGgucmFuZG9tKCkqMUU2fDApLGliPWZ1bmN0aW9uKGEpe3JldHVybiEoIWF8fCFhW2hiXSl9O3ZhciBqYj0wO3ZhciBrYj1mdW5jdGlvbihhLGIsYyxkLGUpe3RoaXMubGlzdGVuZXI9YTt0aGlzLnByb3h5PW51bGw7dGhpcy5zcmM9Yjt0aGlzLnR5cGU9Yzt0aGlzLmNhcHR1cmU9ISFkO3RoaXMucGE9ZTt0aGlzLmtleT0rK2piO3RoaXMuamE9dGhpcy5vYT0hMX0sbGI9ZnVuY3Rpb24oYSl7YS5qYT0hMDthLmxpc3RlbmVyPW51bGw7YS5wcm94eT1udWxsO2Euc3JjPW51bGw7YS5wYT1udWxsfTt2YXIgbWI9ZnVuY3Rpb24oYSl7dGhpcy5zcmM9YTt0aGlzLmc9e307dGhpcy5oPTB9O21iLnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZj1hLnRvU3RyaW5nKCk7YT10aGlzLmdbZl07YXx8KGE9dGhpcy5nW2ZdPVtdLHRoaXMuaCsrKTt2YXIgaD1uYihhLGIsZCxlKTtoPi0xPyhiPWFbaF0sY3x8KGIub2E9ITEpKTooYj1uZXcga2IoYix0aGlzLnNyYyxmLCEhZCxlKSxiLm9hPWMsYS5wdXNoKGIpKTtyZXR1cm4gYn07CnZhciBvYj1mdW5jdGlvbihhLGIpe3ZhciBjPWIudHlwZTtjIGluIGEuZyYmeGEoYS5nW2NdLGIpJiYobGIoYiksYS5nW2NdLmxlbmd0aD09MCYmKGRlbGV0ZSBhLmdbY10sYS5oLS0pKX0scGI9ZnVuY3Rpb24oYSxiLGMsZCxlKXthPWEuZ1tiLnRvU3RyaW5nKCldO2I9LTE7YSYmKGI9bmIoYSxjLGQsZSkpO3JldHVybiBiPi0xP2FbYl06bnVsbH0sbmI9ZnVuY3Rpb24oYSxiLGMsZCl7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDsrK2Upe3ZhciBmPWFbZV07aWYoIWYuamEmJmYubGlzdGVuZXI9PWImJmYuY2FwdHVyZT09ISFjJiZmLnBhPT1kKXJldHVybiBlfXJldHVybi0xfTt2YXIgcWI9ImNsb3N1cmVfbG1fIisoTWF0aC5yYW5kb20oKSoxRTZ8MCkscmI9e30sc2I9MCx1Yj1mdW5jdGlvbihhLGIsYyxkLGUpe2lmKGQmJmQub25jZSlyZXR1cm4gdGIoYSxiLGMsZCxlKTtpZihBcnJheS5pc0FycmF5KGIpKXtmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKyl1YihhLGJbZl0sYyxkLGUpO3JldHVybiBudWxsfWM9dmIoYyk7cmV0dXJuIGliKGEpP3diKGEsYixjLG0oZCk/ISFkLmNhcHR1cmU6ISFkLGUpOnhiKGEsYixjLCExLGQsZSl9LHhiPWZ1bmN0aW9uKGEsYixjLGQsZSxmKXtpZighYil0aHJvdyBFcnJvcigiSW52YWxpZCBldmVudCB0eXBlIik7dmFyIGg9bShlKT8hIWUuY2FwdHVyZTohIWUsaz15YihhKTtrfHwoYVtxYl09az1uZXcgbWIoYSkpO2M9ay5hZGQoYixjLGQsaCxmKTtpZihjLnByb3h5KXJldHVybiBjO2Q9emIoKTtjLnByb3h5PWQ7ZC5zcmM9YTtkLmxpc3RlbmVyPWM7aWYoYS5hZGRFdmVudExpc3RlbmVyKWdifHwoZT1oKSxlPT09dm9pZCAwJiYKKGU9ITEpLGEuYWRkRXZlbnRMaXN0ZW5lcihiLnRvU3RyaW5nKCksZCxlKTtlbHNlIGlmKGEuYXR0YWNoRXZlbnQpYS5hdHRhY2hFdmVudChBYihiLnRvU3RyaW5nKCkpLGQpO2Vsc2UgaWYoYS5hZGRMaXN0ZW5lciYmYS5yZW1vdmVMaXN0ZW5lcilwKGI9PT0iY2hhbmdlIiwiTWVkaWFRdWVyeUxpc3Qgb25seSBoYXMgYSBjaGFuZ2UgZXZlbnQiKSxhLmFkZExpc3RlbmVyKGQpO2Vsc2UgdGhyb3cgRXJyb3IoImFkZEV2ZW50TGlzdGVuZXIgYW5kIGF0dGFjaEV2ZW50IGFyZSB1bmF2YWlsYWJsZS4iKTtzYisrO3JldHVybiBjfSx6Yj1mdW5jdGlvbigpe3ZhciBhPUJiLGI9ZnVuY3Rpb24oYyl7cmV0dXJuIGEuY2FsbChiLnNyYyxiLmxpc3RlbmVyLGMpfTtyZXR1cm4gYn0sdGI9ZnVuY3Rpb24oYSxiLGMsZCxlKXtpZihBcnJheS5pc0FycmF5KGIpKXtmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKyl0YihhLGJbZl0sYyxkLGUpO3JldHVybiBudWxsfWM9dmIoYyk7cmV0dXJuIGliKGEpPwphLkEuYWRkKFN0cmluZyhiKSxjLCEwLG0oZCk/ISFkLmNhcHR1cmU6ISFkLGUpOnhiKGEsYixjLCEwLGQsZSl9LENiPWZ1bmN0aW9uKGEsYixjLGQsZSl7aWYoQXJyYXkuaXNBcnJheShiKSlmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKylDYihhLGJbZl0sYyxkLGUpO2Vsc2UgZD1tKGQpPyEhZC5jYXB0dXJlOiEhZCxjPXZiKGMpLGliKGEpPyhhPWEuQSxiPVN0cmluZyhiKS50b1N0cmluZygpLGIgaW4gYS5nJiYoZj1hLmdbYl0sYz1uYihmLGMsZCxlKSxjPi0xJiYobGIoZltjXSkscChmLmxlbmd0aCE9bnVsbCksQXJyYXkucHJvdG90eXBlLnNwbGljZS5jYWxsKGYsYywxKSxmLmxlbmd0aD09MCYmKGRlbGV0ZSBhLmdbYl0sYS5oLS0pKSkpOmEmJihhPXliKGEpKSYmKGM9cGIoYSxiLGMsZCxlKSkmJkEoYyl9LEE9ZnVuY3Rpb24oYSl7aWYodHlwZW9mIGEhPT0ibnVtYmVyIiYmYSYmIWEuamEpe3ZhciBiPWEuc3JjO2lmKGliKGIpKW9iKGIuQSxhKTtlbHNle3ZhciBjPWEudHlwZSwKZD1hLnByb3h5O2IucmVtb3ZlRXZlbnRMaXN0ZW5lcj9iLnJlbW92ZUV2ZW50TGlzdGVuZXIoYyxkLGEuY2FwdHVyZSk6Yi5kZXRhY2hFdmVudD9iLmRldGFjaEV2ZW50KEFiKGMpLGQpOmIuYWRkTGlzdGVuZXImJmIucmVtb3ZlTGlzdGVuZXImJmIucmVtb3ZlTGlzdGVuZXIoZCk7c2ItLTsoYz15YihiKSk/KG9iKGMsYSksYy5oPT0wJiYoYy5zcmM9bnVsbCxiW3FiXT1udWxsKSk6bGIoYSl9fX0sQWI9ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW4gcmI/cmJbYV06cmJbYV09Im9uIithfSxCYj1mdW5jdGlvbihhLGIpe2lmKGEuamEpYT0hMDtlbHNle2I9bmV3IHooYix0aGlzKTt2YXIgYz1hLmxpc3RlbmVyLGQ9YS5wYXx8YS5zcmM7YS5vYSYmQShhKTthPWMuY2FsbChkLGIpfXJldHVybiBhfSx5Yj1mdW5jdGlvbihhKXthPWFbcWJdO3JldHVybiBhIGluc3RhbmNlb2YgbWI/YTpudWxsfSxEYj0iX19jbG9zdXJlX2V2ZW50c19mbl8iKyhNYXRoLnJhbmRvbSgpKjFFOT4+PjApLHZiPWZ1bmN0aW9uKGEpe3AoYSwKIkxpc3RlbmVyIGNhbiBub3QgYmUgbnVsbC4iKTtpZih0eXBlb2YgYT09PSJmdW5jdGlvbiIpcmV0dXJuIGE7cChhLmhhbmRsZUV2ZW50LCJBbiBvYmplY3QgbGlzdGVuZXIgbXVzdCBoYXZlIGhhbmRsZUV2ZW50IG1ldGhvZC4iKTthW0RiXXx8KGFbRGJdPWZ1bmN0aW9uKGIpe3JldHVybiBhLmhhbmRsZUV2ZW50KGIpfSk7cmV0dXJuIGFbRGJdfTt2YXIgRWI9ZnVuY3Rpb24oYSl7dy5jYWxsKHRoaXMpO3RoaXMuaD1hO3RoaXMuZz17fX07bihFYix3KTsKdmFyIEZiPVtdLEI9ZnVuY3Rpb24oYSxiLGMsZCl7QXJyYXkuaXNBcnJheShjKXx8KGMmJihGYlswXT1jLnRvU3RyaW5nKCkpLGM9RmIpO2Zvcih2YXIgZT0wO2U8Yy5sZW5ndGg7ZSsrKXt2YXIgZj11YihiLGNbZV0sZHx8YS5oYW5kbGVFdmVudCwhMSxhLmh8fGEpO2lmKCFmKWJyZWFrO2EuZ1tmLmtleV09Zn1yZXR1cm4gYX0sQz1mdW5jdGlvbihhLGIsYyxkLGUsZil7aWYoQXJyYXkuaXNBcnJheShjKSlmb3IodmFyIGg9MDtoPGMubGVuZ3RoO2grKylDKGEsYixjW2hdLGQsZSxmKTtlbHNlIGQ9ZHx8YS5oYW5kbGVFdmVudCxlPW0oZSk/ISFlLmNhcHR1cmU6ISFlLGY9Znx8YS5ofHxhLGQ9dmIoZCksZT0hIWUsYz1pYihiKT9wYihiLkEsU3RyaW5nKGMpLGQsZSxmKTpiPyhiPXliKGIpKT9wYihiLGMsZCxlLGYpOm51bGw6bnVsbCxjJiYoQShjKSxkZWxldGUgYS5nW2Mua2V5XSk7cmV0dXJuIGF9LEdiPWZ1bmN0aW9uKGEpe0JhKGEuZyxmdW5jdGlvbihiLGMpe3RoaXMuZy5oYXNPd25Qcm9wZXJ0eShjKSYmCkEoYil9LGEpO2EuZz17fX07RWIucHJvdG90eXBlLkM9ZnVuY3Rpb24oKXtFYi5sLkMuY2FsbCh0aGlzKTtHYih0aGlzKX07RWIucHJvdG90eXBlLmhhbmRsZUV2ZW50PWZ1bmN0aW9uKCl7dGhyb3cgRXJyb3IoIkV2ZW50SGFuZGxlci5oYW5kbGVFdmVudCBub3QgaW1wbGVtZW50ZWQiKTt9O3ZhciBEPWZ1bmN0aW9uKCl7dy5jYWxsKHRoaXMpO3RoaXMuQT1uZXcgbWIodGhpcyk7dGhpcy5ZYT10aGlzO3RoaXMubGE9bnVsbH07bihELHcpO0QucHJvdG90eXBlW2hiXT0hMDtELnByb3RvdHlwZS5BYT1mdW5jdGlvbihhKXt0aGlzLmxhPWF9O0QucHJvdG90eXBlLnJlbW92ZUV2ZW50TGlzdGVuZXI9ZnVuY3Rpb24oYSxiLGMsZCl7Q2IodGhpcyxhLGIsYyxkKX07CnZhciBFPWZ1bmN0aW9uKGEsYil7SGIoYSk7dmFyIGM9YS5sYTtpZihjKXt2YXIgZD1bXTtmb3IodmFyIGU9MTtjO2M9Yy5sYSlkLnB1c2goYykscCgrK2U8MUUzLCJpbmZpbml0ZSBsb29wIil9YT1hLllhO2M9Yi50eXBlfHxiO3R5cGVvZiBiPT09InN0cmluZyI/Yj1uZXcgeShiLGEpOmIgaW5zdGFuY2VvZiB5P2IudGFyZ2V0PWIudGFyZ2V0fHxhOihlPWIsYj1uZXcgeShjLGEpLEdhKGIsZSkpO2U9ITA7dmFyIGY7aWYoZClmb3IoZj1kLmxlbmd0aC0xOyFiLkEmJmY+PTA7Zi0tKXt2YXIgaD1iLnU9ZFtmXTtlPUliKGgsYywhMCxiKSYmZX1iLkF8fChoPWIudT1hLGU9SWIoaCxjLCEwLGIpJiZlLGIuQXx8KGU9SWIoaCxjLCExLGIpJiZlKSk7aWYoZClmb3IoZj0wOyFiLkEmJmY8ZC5sZW5ndGg7ZisrKWg9Yi51PWRbZl0sZT1JYihoLGMsITEsYikmJmU7cmV0dXJuIGV9OwpELnByb3RvdHlwZS5DPWZ1bmN0aW9uKCl7RC5sLkMuY2FsbCh0aGlzKTtpZih0aGlzLkEpe3ZhciBhPXRoaXMuQSxiPTAsYztmb3IoYyBpbiBhLmcpe2Zvcih2YXIgZD1hLmdbY10sZT0wO2U8ZC5sZW5ndGg7ZSsrKSsrYixsYihkW2VdKTtkZWxldGUgYS5nW2NdO2EuaC0tfX10aGlzLmxhPW51bGx9O3ZhciB3Yj1mdW5jdGlvbihhLGIsYyxkLGUpe0hiKGEpO3JldHVybiBhLkEuYWRkKFN0cmluZyhiKSxjLCExLGQsZSl9LEliPWZ1bmN0aW9uKGEsYixjLGQpe2I9YS5BLmdbU3RyaW5nKGIpXTtpZighYilyZXR1cm4hMDtiPWIuY29uY2F0KCk7Zm9yKHZhciBlPSEwLGY9MDtmPGIubGVuZ3RoOysrZil7dmFyIGg9YltmXTtpZihoJiYhaC5qYSYmaC5jYXB0dXJlPT1jKXt2YXIgaz1oLmxpc3RlbmVyLHE9aC5wYXx8aC5zcmM7aC5vYSYmb2IoYS5BLGgpO2U9ay5jYWxsKHEsZCkhPT0hMSYmZX19cmV0dXJuIGUmJiFkLmRlZmF1bHRQcmV2ZW50ZWR9LEhiPWZ1bmN0aW9uKGEpe3AoYS5BLCJFdmVudCB0YXJnZXQgaXMgbm90IGluaXRpYWxpemVkLiBEaWQgeW91IGNhbGwgdGhlIHN1cGVyY2xhc3MgKGdvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0KSBjb25zdHJ1Y3Rvcj8iKX07dmFyIEpiPXQ/Ik1velVzZXJTZWxlY3QiOnV8fFZhPyJXZWJraXRVc2VyU2VsZWN0IjpudWxsLEtiPWZ1bmN0aW9uKGEsYil7Yj1iP251bGw6YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpO2lmKEpiJiYoYS5zdHlsZSYmKGEuc3R5bGVbSmJdPSJub25lIiksYikpZm9yKHZhciBjPTA7YT1iW2NdO2MrKylhLnN0eWxlJiYoYS5zdHlsZVtKYl09Im5vbmUiKX07dmFyIExiPWZ1bmN0aW9uKCl7fTtpYShMYik7TGIucHJvdG90eXBlLmc9MDt2YXIgRj1mdW5jdGlvbihhKXtELmNhbGwodGhpcyk7dGhpcy5HPWF8fHBhfHwocGE9bmV3IGZiKTt0aGlzLnphPU1iO3RoaXMuWT1udWxsO3RoaXMucz0hMTt0aGlzLmc9bnVsbDt0aGlzLk09dm9pZCAwO3RoaXMudT10aGlzLmo9dGhpcy5oPW51bGw7dGhpcy5TYT0hMX07bihGLEQpO0YucHJvdG90eXBlLlphPUxiLlYoKTsKdmFyIE1iPW51bGwsTmI9ZnVuY3Rpb24oYSxiKXtzd2l0Y2goYSl7Y2FzZSAxOnJldHVybiBiPyJkaXNhYmxlIjoiZW5hYmxlIjtjYXNlIDI6cmV0dXJuIGI/ImhpZ2hsaWdodCI6InVuaGlnaGxpZ2h0IjtjYXNlIDQ6cmV0dXJuIGI/ImFjdGl2YXRlIjoiZGVhY3RpdmF0ZSI7Y2FzZSA4OnJldHVybiBiPyJzZWxlY3QiOiJ1bnNlbGVjdCI7Y2FzZSAxNjpyZXR1cm4gYj8iY2hlY2siOiJ1bmNoZWNrIjtjYXNlIDMyOnJldHVybiBiPyJmb2N1cyI6ImJsdXIiO2Nhc2UgNjQ6cmV0dXJuIGI/Im9wZW4iOiJjbG9zZSJ9dGhyb3cgRXJyb3IoIkludmFsaWQgY29tcG9uZW50IHN0YXRlIik7fSxPYj1mdW5jdGlvbihhKXtyZXR1cm4gYS5ZfHwoYS5ZPSI6IisoYS5aYS5nKyspLnRvU3RyaW5nKDM2KSl9LFBiPWZ1bmN0aW9uKGEsYil7aWYoYS5oJiZhLmgudSl7dmFyIGM9YS5oLnUsZD1hLlk7ZCBpbiBjJiZkZWxldGUgY1tkXTtEYShhLmgudSxiLGEpfWEuWT1ifTtGLnByb3RvdHlwZS5pPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ307CnZhciBRYj1mdW5jdGlvbihhKXthLk18fChhLk09bmV3IEViKGEpKTtyZXR1cm4gcChhLk0pfTtGLnByb3RvdHlwZS5BYT1mdW5jdGlvbihhKXtpZih0aGlzLmgmJnRoaXMuaCE9YSl0aHJvdyBFcnJvcigiTWV0aG9kIG5vdCBzdXBwb3J0ZWQiKTtGLmwuQWEuY2FsbCh0aGlzLGEpfTtGLnByb3RvdHlwZS5tYT1mdW5jdGlvbigpe3RoaXMuZz1aYSh0aGlzLkcuZywiRElWIil9O0YucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbihhKXtSYih0aGlzLGEpfTsKdmFyIFJiPWZ1bmN0aW9uKGEsYixjKXtpZihhLnMpdGhyb3cgRXJyb3IoIkNvbXBvbmVudCBhbHJlYWR5IHJlbmRlcmVkIik7YS5nfHxhLm1hKCk7Yj9iLmluc2VydEJlZm9yZShhLmcsY3x8bnVsbCk6YS5HLmcuYm9keS5hcHBlbmRDaGlsZChhLmcpO2EuaCYmIWEuaC5zfHxhLkkoKX0sU2I9ZnVuY3Rpb24oYSxiKXtpZihhLnMpdGhyb3cgRXJyb3IoIkNvbXBvbmVudCBhbHJlYWR5IHJlbmRlcmVkIik7aWYoYiYmYS53YShiKSl7YS5TYT0hMDt2YXIgYz1iYihiKTthLkcmJmEuRy5nPT1jfHwoYS5HPWI/bmV3IGZiKGJiKGIpKTpwYXx8KHBhPW5ldyBmYikpO2EuRWEoYik7YS5JKCl9ZWxzZSB0aHJvdyBFcnJvcigiSW52YWxpZCBlbGVtZW50IHRvIGRlY29yYXRlIik7fTtnPUYucHJvdG90eXBlO2cud2E9ZnVuY3Rpb24oKXtyZXR1cm4hMH07Zy5FYT1mdW5jdGlvbihhKXt0aGlzLmc9YX07CmcuST1mdW5jdGlvbigpe3RoaXMucz0hMDtUYih0aGlzLGZ1bmN0aW9uKGEpeyFhLnMmJmEuaSgpJiZhLkkoKX0pfTtnLlU9ZnVuY3Rpb24oKXtUYih0aGlzLGZ1bmN0aW9uKGEpe2EucyYmYS5VKCl9KTt0aGlzLk0mJkdiKHRoaXMuTSk7dGhpcy5zPSExfTtnLkM9ZnVuY3Rpb24oKXt0aGlzLnMmJnRoaXMuVSgpO3RoaXMuTSYmKHRoaXMuTS5kaXNwb3NlKCksZGVsZXRlIHRoaXMuTSk7VGIodGhpcyxmdW5jdGlvbihhKXthLmRpc3Bvc2UoKX0pOyF0aGlzLlNhJiZ0aGlzLmcmJiRhKHRoaXMuZyk7dGhpcy5oPXRoaXMuZz10aGlzLnU9dGhpcy5qPW51bGw7Ri5sLkMuY2FsbCh0aGlzKX07Zy5CYT1mdW5jdGlvbihhLGIpe3RoaXMuQ2EoYSxIKHRoaXMpLGIpfTsKZy5DYT1mdW5jdGlvbihhLGIsYyl7cCghIWEsIlByb3ZpZGVkIGVsZW1lbnQgbXVzdCBub3QgYmUgbnVsbC4iKTtpZihhLnMmJihjfHwhdGhpcy5zKSl0aHJvdyBFcnJvcigiQ29tcG9uZW50IGFscmVhZHkgcmVuZGVyZWQiKTtpZihiPDB8fGI+SCh0aGlzKSl0aHJvdyBFcnJvcigiQ2hpbGQgY29tcG9uZW50IGluZGV4IG91dCBvZiBib3VuZHMiKTt0aGlzLnUmJnRoaXMuanx8KHRoaXMudT17fSx0aGlzLmo9W10pO2lmKGEuaD09dGhpcyl7dmFyIGQ9dGhpcy51LGU9T2IoYSk7ZFtlXT1hO3hhKHRoaXMuaixhKX1lbHNlIERhKHRoaXMudSxPYihhKSxhKTtpZihhPT10aGlzKXRocm93IEVycm9yKCJVbmFibGUgdG8gc2V0IHBhcmVudCBjb21wb25lbnQiKTtpZihkPXRoaXMmJmEuaCYmYS5ZKWU9YS5oLGQ9YS5ZLGUudSYmZD8oZT1lLnUsZD0oZSE9PW51bGwmJmQgaW4gZT9lW2RdOnZvaWQgMCl8fG51bGwpOmQ9bnVsbDtpZihkJiZhLmghPXRoaXMpdGhyb3cgRXJyb3IoIlVuYWJsZSB0byBzZXQgcGFyZW50IGNvbXBvbmVudCIpOwphLmg9dGhpcztGLmwuQWEuY2FsbChhLHRoaXMpO3phKHRoaXMuaixiLDAsYSk7YS5zJiZ0aGlzLnMmJmEuaD09dGhpcz8oYz10aGlzLm5hKCksKGMuY2hpbGROb2Rlc1tiXXx8bnVsbCkhPWEuaSgpJiYoYS5pKCkucGFyZW50RWxlbWVudD09YyYmYy5yZW1vdmVDaGlsZChhLmkoKSksYj1jLmNoaWxkTm9kZXNbYl18fG51bGwsYy5pbnNlcnRCZWZvcmUoYS5pKCksYikpKTpjPyh0aGlzLmd8fHRoaXMubWEoKSxiPUkodGhpcyxiKzEpLFJiKGEsdGhpcy5uYSgpLGI/Yi5nOm51bGwpKTp0aGlzLnMmJiFhLnMmJmEuZyYmYS5nLnBhcmVudE5vZGUmJmEuZy5wYXJlbnROb2RlLm5vZGVUeXBlPT0xJiZhLkkoKX07Zy5uYT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmd9Owp2YXIgVWI9ZnVuY3Rpb24oYSl7aWYoYS56YT09bnVsbCl7dmFyIGI9YS5zP2EuZzphLkcuZy5ib2R5O2E6e3ZhciBjPWJiKGIpO2lmKGMuZGVmYXVsdFZpZXcmJmMuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSYmKGM9Yy5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKGIsbnVsbCkpKXtjPWMuZGlyZWN0aW9ufHxjLmdldFByb3BlcnR5VmFsdWUoImRpcmVjdGlvbiIpfHwiIjticmVhayBhfWM9IiJ9YS56YT0icnRsIj09KGN8fChiLmN1cnJlbnRTdHlsZT9iLmN1cnJlbnRTdHlsZS5kaXJlY3Rpb246bnVsbCl8fGIuc3R5bGUmJmIuc3R5bGUuZGlyZWN0aW9uKX1yZXR1cm4gYS56YX0sSD1mdW5jdGlvbihhKXtyZXR1cm4gYS5qP2Euai5sZW5ndGg6MH0sST1mdW5jdGlvbihhLGIpe3JldHVybiBhLmo/YS5qW2JdfHxudWxsOm51bGx9LFRiPWZ1bmN0aW9uKGEsYixjKXthLmomJmEuai5mb3JFYWNoKGIsYyl9LFZiPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuaiYmYj9hLmouaW5kZXhPZihiKToKLTF9O3ZhciBXYj17bWI6ImFjdGl2ZWRlc2NlbmRhbnQiLHJiOiJhdG9taWMiLHNiOiJhdXRvY29tcGxldGUiLHViOiJidXN5Iix4YjoiY2hlY2tlZCIseWI6ImNvbGluZGV4IixEYjoiY29udHJvbHMiLEViOiJjdXJyZW50IixHYjoiZGVzY3JpYmVkYnkiLEpiOiJkaXNhYmxlZCIsTGI6ImRyb3BlZmZlY3QiLE1iOiJleHBhbmRlZCIsTmI6ImZsb3d0byIsUGI6ImdyYWJiZWQiLFRiOiJoYXNwb3B1cCIsVmI6ImhpZGRlbiIsWGI6ImludmFsaWQiLFliOiJsYWJlbCIsWmI6ImxhYmVsbGVkYnkiLGFjOiJsZXZlbCIsZmM6ImxpdmUiLHZjOiJtdWx0aWxpbmUiLHdjOiJtdWx0aXNlbGVjdGFibGUiLEFjOiJvcmllbnRhdGlvbiIsQmM6Im93bnMiLENjOiJwb3NpbnNldCIsRWM6InByZXNzZWQiLEljOiJyZWFkb25seSIsS2M6InJlbGV2YW50IixMYzoicmVxdWlyZWQiLFBjOiJyb3dpbmRleCIsU2M6InNlbGVjdGVkIixVYzoic2V0c2l6ZSIsV2M6InNvcnQiLG1kOiJ2YWx1ZW1heCIsbmQ6InZhbHVlbWluIiwKb2Q6InZhbHVlbm93IixwZDoidmFsdWV0ZXh0In07dmFyIFhiO3ZhciBZYj17bmI6ImFsZXJ0IixvYjoiYWxlcnRkaWFsb2ciLHBiOiJhcHBsaWNhdGlvbiIscWI6ImFydGljbGUiLHRiOiJiYW5uZXIiLHZiOiJidXR0b24iLHdiOiJjaGVja2JveCIsemI6ImNvbHVtbmhlYWRlciIsQWI6ImNvbWJvYm94IixCYjoiY29tcGxlbWVudGFyeSIsQ2I6ImNvbnRlbnRpbmZvIixGYjoiZGVmaW5pdGlvbiIsSGI6ImRpYWxvZyIsSWI6ImRpcmVjdG9yeSIsS2I6ImRvY3VtZW50IixPYjoiZm9ybSIsUWI6ImdyaWQiLFJiOiJncmlkY2VsbCIsU2I6Imdyb3VwIixVYjoiaGVhZGluZyIsV2I6ImltZyIsYmM6ImxpbmsiLGNjOiJsaXN0IixkYzoibGlzdGJveCIsZWM6Imxpc3RpdGVtIixoYzoibG9nIixpYzoibWFpbiIsamM6Im1hcnF1ZWUiLGtjOiJtYXRoIixsYzoibWVudSIsbWM6Im1lbnViYXIiLG5jOiJtZW51aXRlbSIsb2M6Im1lbnVpdGVtY2hlY2tib3giLHBjOiJtZW51aXRlbXJhZGlvIix4YzoibmF2aWdhdGlvbiIseWM6Im5vdGUiLHpjOiJvcHRpb24iLApEYzoicHJlc2VudGF0aW9uIixGYzoicHJvZ3Jlc3NiYXIiLEdjOiJyYWRpbyIsSGM6InJhZGlvZ3JvdXAiLEpjOiJyZWdpb24iLE1jOiJyb3ciLE5jOiJyb3dncm91cCIsT2M6InJvd2hlYWRlciIsUWM6InNjcm9sbGJhciIsUmM6InNlYXJjaCIsVGM6InNlcGFyYXRvciIsVmM6InNsaWRlciIsWGM6InNwaW5idXR0b24iLFljOiJzdGF0dXMiLFpjOiJzd2l0Y2giLGFkOiJ0YWIiLGJkOiJ0YWJsaXN0IixjZDoidGFicGFuZWwiLGRkOiJ0ZXh0Ym94IixlZDoidGV4dGluZm8iLGZkOiJ0aW1lciIsZ2Q6InRvb2xiYXIiLGhkOiJ0b29sdGlwIixqZDoidHJlZSIsa2Q6InRyZWVncmlkIixsZDoidHJlZWl0ZW0ifTt2YXIgWmI9ZnVuY3Rpb24oYSxiKXtiPyhwKENhKFliLGIpLCJObyBzdWNoIEFSSUEgcm9sZSAiK2IpLGEuc2V0QXR0cmlidXRlKCJyb2xlIixiKSk6YS5yZW1vdmVBdHRyaWJ1dGUoInJvbGUiKX0sYWM9ZnVuY3Rpb24oYSxiLGMpe0FycmF5LmlzQXJyYXkoYykmJihjPWMuam9pbigiICIpKTt2YXIgZD0kYihiKTtjPT09IiJ8fGM9PXZvaWQgMD8oWGJ8fChjPXt9LFhiPShjLmF0b21pYz0hMSxjLmF1dG9jb21wbGV0ZT0ibm9uZSIsYy5kcm9wZWZmZWN0PSJub25lIixjLmhhc3BvcHVwPSExLGMubGl2ZT0ib2ZmIixjLm11bHRpbGluZT0hMSxjLm11bHRpc2VsZWN0YWJsZT0hMSxjLm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIsYy5yZWFkb25seT0hMSxjLnJlbGV2YW50PSJhZGRpdGlvbnMgdGV4dCIsYy5yZXF1aXJlZD0hMSxjLnNvcnQ9Im5vbmUiLGMuYnVzeT0hMSxjLmRpc2FibGVkPSExLGMuaGlkZGVuPSExLGMuaW52YWxpZD0iZmFsc2UiLGMpKSxjPVhiLGIgaW4gYz9hLnNldEF0dHJpYnV0ZShkLApjW2JdKTphLnJlbW92ZUF0dHJpYnV0ZShkKSk6YS5zZXRBdHRyaWJ1dGUoZCxjKX0sJGI9ZnVuY3Rpb24oYSl7cChhLCJBUklBIGF0dHJpYnV0ZSBjYW5ub3QgYmUgZW1wdHkuIik7cChDYShXYixhKSwiTm8gc3VjaCBBUklBIGF0dHJpYnV0ZSAiK2EpO3JldHVybiJhcmlhLSIrYX07dmFyIGRjPWZ1bmN0aW9uKGEsYixjLGQsZSxmKXtpZih2JiZlKXJldHVybiBiYyhhKTtpZihlJiYhZClyZXR1cm4hMTtpZighdCl7dHlwZW9mIGI9PT0ibnVtYmVyIiYmKGI9Y2MoYikpO3ZhciBoPWI9PTE3fHxiPT0xOHx8diYmYj09OTE7aWYoKCFjfHx2KSYmaHx8diYmYj09MTYmJihkfHxmKSlyZXR1cm4hMX1pZih1JiZkJiZjKXN3aXRjaChhKXtjYXNlIDIyMDpjYXNlIDIxOTpjYXNlIDIyMTpjYXNlIDE5MjpjYXNlIDE4NjpjYXNlIDE4OTpjYXNlIDE4NzpjYXNlIDE4ODpjYXNlIDE5MDpjYXNlIDE5MTpjYXNlIDE5MjpjYXNlIDIyMjpyZXR1cm4hMX1zd2l0Y2goYSl7Y2FzZSAxMzpyZXR1cm4gdD9mfHxlPyExOiEoYyYmZCk6ITA7Y2FzZSAyNzpyZXR1cm4hdSYmIXR9cmV0dXJuIHQmJihkfHxlfHxmKT8hMTpiYyhhKX0sYmM9ZnVuY3Rpb24oYSl7aWYoYT49NDgmJmE8PTU3fHxhPj05NiYmYTw9MTA2fHxhPj02NSYmYTw9OTB8fHUmJmE9PTApcmV0dXJuITA7c3dpdGNoKGEpe2Nhc2UgMzI6Y2FzZSA0MzpjYXNlIDYzOmNhc2UgNjQ6Y2FzZSAxMDc6Y2FzZSAxMDk6Y2FzZSAxMTA6Y2FzZSAxMTE6Y2FzZSAxODY6Y2FzZSA1OTpjYXNlIDE4OTpjYXNlIDE4NzpjYXNlIDYxOmNhc2UgMTg4OmNhc2UgMTkwOmNhc2UgMTkxOmNhc2UgMTkyOmNhc2UgMjIyOmNhc2UgMjE5OmNhc2UgMjIwOmNhc2UgMjIxOmNhc2UgMTYzOmNhc2UgNTg6cmV0dXJuITA7CmNhc2UgMTczOmNhc2UgMTcxOnJldHVybiB0O2RlZmF1bHQ6cmV0dXJuITF9fSxjYz1mdW5jdGlvbihhKXtpZih0KWE9ZWMoYSk7ZWxzZSBpZih2JiZ1KXN3aXRjaChhKXtjYXNlIDkzOmE9OTF9cmV0dXJuIGF9LGVjPWZ1bmN0aW9uKGEpe3N3aXRjaChhKXtjYXNlIDYxOnJldHVybiAxODc7Y2FzZSA1OTpyZXR1cm4gMTg2O2Nhc2UgMTczOnJldHVybiAxODk7Y2FzZSAyMjQ6cmV0dXJuIDkxO2Nhc2UgMDpyZXR1cm4gMjI0O2RlZmF1bHQ6cmV0dXJuIGF9fTt2YXIgZmM9ZnVuY3Rpb24oYSxiLGMsZCl7ei5jYWxsKHRoaXMsZCk7dGhpcy50eXBlPSJrZXkiO3RoaXMuZz1hO3RoaXMucmVwZWF0PWN9O24oZmMseik7dmFyIEo9ZnVuY3Rpb24oYSxiKXtELmNhbGwodGhpcyk7YSYmZ2ModGhpcyxhLGIpfTtuKEosRCk7Zz1KLnByb3RvdHlwZTtnLlI9bnVsbDtnLnFhPW51bGw7Zy5KYT1udWxsO2cucmE9bnVsbDtnLkY9LTE7Zy5LPS0xO2cuRGE9ITE7CnZhciBoYz17MzoxMywxMjoxNDQsNjMyMzI6MzgsNjMyMzM6NDAsNjMyMzQ6MzcsNjMyMzU6MzksNjMyMzY6MTEyLDYzMjM3OjExMyw2MzIzODoxMTQsNjMyMzk6MTE1LDYzMjQwOjExNiw2MzI0MToxMTcsNjMyNDI6MTE4LDYzMjQzOjExOSw2MzI0NDoxMjAsNjMyNDU6MTIxLDYzMjQ2OjEyMiw2MzI0NzoxMjMsNjMyNDg6NDQsNjMyNzI6NDYsNjMyNzM6MzYsNjMyNzU6MzUsNjMyNzY6MzMsNjMyNzc6MzQsNjMyODk6MTQ0LDYzMzAyOjQ1fSxpYz17VXA6MzgsRG93bjo0MCxMZWZ0OjM3LFJpZ2h0OjM5LEVudGVyOjEzLEYxOjExMixGMjoxMTMsRjM6MTE0LEY0OjExNSxGNToxMTYsRjY6MTE3LEY3OjExOCxGODoxMTksRjk6MTIwLEYxMDoxMjEsRjExOjEyMixGMTI6MTIzLCJVKzAwN0YiOjQ2LEhvbWU6MzYsRW5kOjM1LFBhZ2VVcDozMyxQYWdlRG93bjozNCxJbnNlcnQ6NDV9LGpjPXYmJnQ7CkoucHJvdG90eXBlLmc9ZnVuY3Rpb24oYSl7dSYmKHRoaXMuRj09MTcmJiFhLmN0cmxLZXl8fHRoaXMuRj09MTgmJiFhLmFsdEtleXx8diYmdGhpcy5GPT05MSYmIWEubWV0YUtleSkmJih0aGlzLks9dGhpcy5GPS0xKTt0aGlzLkY9PS0xJiYoYS5jdHJsS2V5JiZhLmchPTE3P3RoaXMuRj0xNzphLmFsdEtleSYmYS5nIT0xOD90aGlzLkY9MTg6YS5tZXRhS2V5JiZhLmchPTkxJiYodGhpcy5GPTkxKSk7ZGMoYS5nLHRoaXMuRixhLnNoaWZ0S2V5LGEuY3RybEtleSxhLmFsdEtleSxhLm1ldGFLZXkpPyh0aGlzLks9Y2MoYS5nKSxqYyYmKHRoaXMuRGE9YS5hbHRLZXkpKTp0aGlzLmhhbmRsZUV2ZW50KGEpfTtKLnByb3RvdHlwZS5oPWZ1bmN0aW9uKGEpe3RoaXMuSz10aGlzLkY9LTE7dGhpcy5EYT1hLmFsdEtleX07CkoucHJvdG90eXBlLmhhbmRsZUV2ZW50PWZ1bmN0aW9uKGEpe3ZhciBiPWEuaCxjPWIuYWx0S2V5O2lmKHUmJmEudHlwZT09ImtleXByZXNzIil7dmFyIGQ9dGhpcy5LO3ZhciBlPWIuY2hhckNvZGU+PTAmJmIuY2hhckNvZGU8NjMyMzImJmJjKGQpP2IuY2hhckNvZGU6MH1lbHNlIGEudHlwZT09ImtleXByZXNzIj8oamMmJihjPXRoaXMuRGEpLGIua2V5Q29kZT09Yi5jaGFyQ29kZT9iLmtleUNvZGU8MzI/KGQ9Yi5rZXlDb2RlLGU9MCk6KGQ9dGhpcy5LLGU9Yi5jaGFyQ29kZSk6KGQ9Yi5rZXlDb2RlfHx0aGlzLkssZT1iLmNoYXJDb2RlfHwwKSk6KGQ9Yi5rZXlDb2RlfHx0aGlzLkssZT1iLmNoYXJDb2RlfHwwKSx2JiZlPT02MyYmZD09MjI0JiYoZD0xOTEpO3ZhciBmPWQ9Y2MoZCk7ZD9kPj02MzIzMiYmZCBpbiBoYz9mPWhjW2RdOmQ9PTI1JiZhLnNoaWZ0S2V5JiYoZj05KTpiLmtleUlkZW50aWZpZXImJmIua2V5SWRlbnRpZmllciBpbiBpYyYmKGY9aWNbYi5rZXlJZGVudGlmaWVyXSk7CmlmKCF0fHxhLnR5cGUhPSJrZXlwcmVzcyJ8fGRjKGYsdGhpcy5GLGEuc2hpZnRLZXksYS5jdHJsS2V5LGMsYS5tZXRhS2V5KSlhPWY9PXRoaXMuRix0aGlzLkY9ZixiPW5ldyBmYyhmLGUsYSxiKSxiLmFsdEtleT1jLEUodGhpcyxiKX07Si5wcm90b3R5cGUuaT1mdW5jdGlvbigpe3JldHVybiB0aGlzLlJ9O3ZhciBnYz1mdW5jdGlvbihhLGIsYyl7YS5yYSYma2MoYSk7YS5SPWI7YS5xYT11YihhLlIsImtleXByZXNzIixhLGMpO2EuSmE9dWIoYS5SLCJrZXlkb3duIixhLmcsYyxhKTthLnJhPXViKGEuUiwia2V5dXAiLGEuaCxjLGEpfSxrYz1mdW5jdGlvbihhKXthLnFhJiYoQShhLnFhKSxBKGEuSmEpLEEoYS5yYSksYS5xYT1udWxsLGEuSmE9bnVsbCxhLnJhPW51bGwpO2EuUj1udWxsO2EuRj0tMTthLks9LTF9O0oucHJvdG90eXBlLkM9ZnVuY3Rpb24oKXtKLmwuQy5jYWxsKHRoaXMpO2tjKHRoaXMpfTt2YXIgSz17Z2E6Im1vdXNlZG93biIsaGE6Im1vdXNldXAiLGZhOiJtb3VzZWNhbmNlbCIsc2M6Im1vdXNlbW92ZSIsdWM6Im1vdXNlb3ZlciIsdGM6Im1vdXNlb3V0IixxYzoibW91c2VlbnRlciIscmM6Im1vdXNlbGVhdmUifTt2YXIgbGM9ZnVuY3Rpb24oYSl7cmV0dXJuIHR5cGVvZiBhLmNsYXNzTmFtZT09InN0cmluZyI/YS5jbGFzc05hbWU6YS5nZXRBdHRyaWJ1dGUmJmEuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIn0sTD1mdW5jdGlvbihhKXtyZXR1cm4gYS5jbGFzc0xpc3Q/YS5jbGFzc0xpc3Q6bGMoYSkubWF0Y2goL1xTKy9nKXx8W119LG1jPWZ1bmN0aW9uKGEsYil7dHlwZW9mIGEuY2xhc3NOYW1lPT0ic3RyaW5nIj9hLmNsYXNzTmFtZT1iOmEuc2V0QXR0cmlidXRlJiZhLnNldEF0dHJpYnV0ZSgiY2xhc3MiLGIpfSxuYz1mdW5jdGlvbihhLGIpe2EuY2xhc3NMaXN0P2I9YS5jbGFzc0xpc3QuY29udGFpbnMoYik6KGE9TChhKSxiPXZhKGEsYik+PTApO3JldHVybiBifSxvYz1mdW5jdGlvbihhLGIpe2lmKGEuY2xhc3NMaXN0KWEuY2xhc3NMaXN0LmFkZChiKTtlbHNlIGlmKCFuYyhhLGIpKXt2YXIgYz1sYyhhKTttYyhhLGMrKGMubGVuZ3RoPjA/IiAiK2I6YikpfX0scGM9ZnVuY3Rpb24oYSxiKXtpZihhLmNsYXNzTGlzdClBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGIsCmZ1bmN0aW9uKGUpe29jKGEsZSl9KTtlbHNle3ZhciBjPXt9O0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoTChhKSxmdW5jdGlvbihlKXtjW2VdPSEwfSk7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChiLGZ1bmN0aW9uKGUpe2NbZV09ITB9KTtiPSIiO2Zvcih2YXIgZCBpbiBjKWIrPWIubGVuZ3RoPjA/IiAiK2Q6ZDttYyhhLGIpfX0scWM9ZnVuY3Rpb24oYSxiKXthLmNsYXNzTGlzdD9hLmNsYXNzTGlzdC5yZW1vdmUoYik6bmMoYSxiKSYmbWMoYSxBcnJheS5wcm90b3R5cGUuZmlsdGVyLmNhbGwoTChhKSxmdW5jdGlvbihjKXtyZXR1cm4gYyE9Yn0pLmpvaW4oIiAiKSl9LHJjPWZ1bmN0aW9uKGEsYil7YS5jbGFzc0xpc3Q/QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChiLGZ1bmN0aW9uKGMpe3FjKGEsYyl9KTptYyhhLEFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbChMKGEpLGZ1bmN0aW9uKGMpe3JldHVybiEodmEoYixjKT49MCl9KS5qb2luKCIgIikpfTt2YXIgdGM9ZnVuY3Rpb24oYSxiKXtpZighYSl0aHJvdyBFcnJvcigiSW52YWxpZCBjbGFzcyBuYW1lICIrYSk7aWYodHlwZW9mIGIhPT0iZnVuY3Rpb24iKXRocm93IEVycm9yKCJJbnZhbGlkIGRlY29yYXRvciBmdW5jdGlvbiAiK2IpO3NjW2FdPWJ9LHVjPXt9LHNjPXt9O3ZhciB2Yz1mdW5jdGlvbihhKXt0aGlzLkE9YX07aWEodmMpO3ZhciB3Yz1mdW5jdGlvbihhLGIpe2EmJihhLnRhYkluZGV4PWI/MDotMSl9LHljPWZ1bmN0aW9uKGEsYixjKXtjLmlkJiZQYihiLGMuaWQpO3ZhciBkPWEuZygpLGU9ITEsZj1MKGMpO2YmJkFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoZixmdW5jdGlvbihoKXtoPT1kP2U9ITA6aCYmdGhpcy51KGIsaCxkKX0sYSk7ZXx8b2MoYyxkKTt4YyhiLGMpO3JldHVybiBjfTt2Yy5wcm90b3R5cGUudT1mdW5jdGlvbihhLGIsYyl7Yj09YysiLWRpc2FibGVkIj9hLlgoITEpOmI9PWMrIi1ob3Jpem9udGFsIj96YyhhLCJob3Jpem9udGFsIik6Yj09YysiLXZlcnRpY2FsIiYmemMoYSwidmVydGljYWwiKX07CnZhciB4Yz1mdW5jdGlvbihhLGIpe2lmKGIpZm9yKHZhciBjPWIuZmlyc3RDaGlsZCxkO2MmJmMucGFyZW50Tm9kZT09Yjspe2Q9Yy5uZXh0U2libGluZztpZihjLm5vZGVUeXBlPT0xKXthOnt2YXIgZT1jO3AoZSk7ZT1MKGUpO2Zvcih2YXIgZj1lLmxlbmd0aCxoPTA7aDxmO2grKyl7dmFyIGs9ZVtoXTtpZihrPWsgaW4gc2M/c2Nba10oKTpudWxsKXtlPWs7YnJlYWsgYX19ZT1udWxsfWUmJihlLmc9YyxhLmlzRW5hYmxlZCgpfHxlLlgoITEpLGEuQmEoZSksU2IoZSxjKSl9ZWxzZSBjLm5vZGVWYWx1ZSYmSGEoYy5ub2RlVmFsdWUpIT0iInx8Yi5yZW1vdmVDaGlsZChjKTtjPWR9fSxBYz1mdW5jdGlvbihhLGIpe2I9Yi5pKCk7cChiLCJUaGUgY29udGFpbmVyIERPTSBlbGVtZW50IGNhbm5vdCBiZSBudWxsLiIpO0tiKGIsdCk7KGE9YS5BKSYmWmIoYixhKX07dmMucHJvdG90eXBlLmc9ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy1jb250YWluZXIifTsKdmMucHJvdG90eXBlLmo9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nKCksYz1bYixhLkw9PSJob3Jpem9udGFsIj9iKyItaG9yaXpvbnRhbCI6YisiLXZlcnRpY2FsIl07YS5pc0VuYWJsZWQoKXx8Yy5wdXNoKGIrIi1kaXNhYmxlZCIpO3JldHVybiBjfTt2YXIgQmM9ZnVuY3Rpb24oKXt9O3ZhciBNPWZ1bmN0aW9uKCl7fSxDYztpYShNKTt2YXIgRGM9e2J1dHRvbjoicHJlc3NlZCIsY2hlY2tib3g6ImNoZWNrZWQiLG1lbnVpdGVtOiJzZWxlY3RlZCIsbWVudWl0ZW1jaGVja2JveDoiY2hlY2tlZCIsbWVudWl0ZW1yYWRpbzoiY2hlY2tlZCIscmFkaW86ImNoZWNrZWQiLHRhYjoic2VsZWN0ZWQiLHRyZWVpdGVtOiJzZWxlY3RlZCJ9O00ucHJvdG90eXBlLk5hPWZ1bmN0aW9uKCl7fTtNLnByb3RvdHlwZS54YT1mdW5jdGlvbihhKXt2YXIgYj1hLkcsYz1iLmgsZD10aGlzLk4oKSxlPVtkXSxmPXRoaXMuTigpO2YhPWQmJmUucHVzaChmKTtkPWEubTtmb3IoZj1bXTtkOyl7dmFyIGg9ZCYtZDtmLnB1c2goRWModGhpcyxoKSk7ZCY9fmh9ZS5wdXNoLmFwcGx5KGUsZik7KGQ9YS5GYSkmJmUucHVzaC5hcHBseShlLGQpO3JldHVybiBjLmNhbGwoYiwiRElWIixlLmpvaW4oIiAiKSxhLmlhKX07Ck0ucHJvdG90eXBlLnlhPWZ1bmN0aW9uKGEsYil7Yi5pZCYmUGIoYSxiLmlkKTtiJiZiLmZpcnN0Q2hpbGQ/RmMoYSxiLmZpcnN0Q2hpbGQubmV4dFNpYmxpbmc/eWEoYi5jaGlsZE5vZGVzKTpiLmZpcnN0Q2hpbGQpOmEuaWE9bnVsbDt2YXIgYz0wLGQ9dGhpcy5OKCksZT10aGlzLk4oKSxmPSExLGg9ITEsaz15YShMKGIpKTtrLmZvckVhY2goZnVuY3Rpb24ocSl7Znx8cSE9ZD9ofHxxIT1lP2N8PUdjKHRoaXMscSk6aD0hMDooZj0hMCxlPT1kJiYoaD0hMCkpO0djKHRoaXMscSk9PTEmJihzYShiKSxkYihiKSYmZWIoYikmJmNiKGIsITEpKX0sdGhpcyk7YS5tPWM7Znx8KGsucHVzaChkKSxlPT1kJiYoaD0hMCkpO2h8fGsucHVzaChlKTsoYT1hLkZhKSYmay5wdXNoLmFwcGx5KGssYSk7ZiYmaCYmIWF8fG1jKGIsay5qb2luKCIgIikpO3JldHVybiBifTsKdmFyIEhjPWZ1bmN0aW9uKGEsYil7aWYoYT1hLk5hKCkpe3AoYiwiVGhlIGVsZW1lbnQgcGFzc2VkIGFzIGEgZmlyc3QgcGFyYW1ldGVyIGNhbm5vdCBiZSBudWxsLiIpO3ZhciBjPWIuZ2V0QXR0cmlidXRlKCJyb2xlIil8fG51bGw7YSE9YyYmWmIoYixhKX19LEljPWZ1bmN0aW9uKGEsYil7dmFyIGM7aWYoYS5EJjMyJiYoYz1hLmkoKSkpe2lmKCFiJiZhLm0mMzIpe3RyeXtjLmJsdXIoKX1jYXRjaChkKXt9YS5tJjMyJiZhLlFhKG51bGwpfShkYihjKSYmZWIoYykpIT1iJiZjYihjLGIpfX0sSmM9ZnVuY3Rpb24oYSxiLGMpe0NjfHwoQ2M9ezE6ImRpc2FibGVkIiw4OiJzZWxlY3RlZCIsMTY6ImNoZWNrZWQiLDY0OiJleHBhbmRlZCJ9KTtwKGEsIlRoZSBlbGVtZW50IHBhc3NlZCBhcyBhIGZpcnN0IHBhcmFtZXRlciBjYW5ub3QgYmUgbnVsbC4iKTtiPUNjW2JdO3ZhciBkPWEuZ2V0QXR0cmlidXRlKCJyb2xlIil8fG51bGw7ZCYmKGQ9RGNbZF18fGIsYj1iPT0iY2hlY2tlZCJ8fGI9PQoic2VsZWN0ZWQiP2Q6Yik7YiYmYWMoYSxiLGMpfTtNLnByb3RvdHlwZS5OPWZ1bmN0aW9uKCl7cmV0dXJuImdvb2ctY29udHJvbCJ9O3ZhciBFYz1mdW5jdGlvbihhLGIpe2EuZ3x8S2MoYSk7cmV0dXJuIGEuZ1tiXX0sR2M9ZnVuY3Rpb24oYSxiKXthLmh8fChhLmd8fEtjKGEpLGEuaD1FYShhLmcpKTthPXBhcnNlSW50KGEuaFtiXSwxMCk7cmV0dXJuIGlzTmFOKGEpPzA6YX0sS2M9ZnVuY3Rpb24oYSl7dmFyIGI9YS5OKCk7dmFyIGM9Yi5yZXBsYWNlKC9ceGEwfFxzL2csIiAiKS5pbmRleE9mKCIgIikhPS0xO3AoIWMsIkNvbnRyb2xSZW5kZXJlciBoYXMgYW4gaW52YWxpZCBjc3MgY2xhc3M6ICciK2IrIiciKTthLmc9ezE6YisiLWRpc2FibGVkIiwyOmIrIi1ob3ZlciIsNDpiKyItYWN0aXZlIiw4OmIrIi1zZWxlY3RlZCIsMTY6YisiLWNoZWNrZWQiLDMyOmIrIi1mb2N1c2VkIiw2NDpiKyItb3BlbiJ9fTt2YXIgTj1mdW5jdGlvbihhLGIsYyl7Ri5jYWxsKHRoaXMsYyk7aWYoIWIpe2ZvcihiPXRoaXMuY29uc3RydWN0b3I7Yjspe3ZhciBkPW5hKGIpO2lmKGQ9dWNbZF0pYnJlYWs7Yj0oYj1PYmplY3QuZ2V0UHJvdG90eXBlT2YoYi5wcm90b3R5cGUpKSYmYi5jb25zdHJ1Y3Rvcn1iPWQ/dHlwZW9mIGQuVj09PSJmdW5jdGlvbiI/ZC5WKCk6bmV3IGQ6bnVsbH10aGlzLnY9Yjt0aGlzLmlhPWEhPT12b2lkIDA/YTpudWxsfTtuKE4sRik7Zz1OLnByb3RvdHlwZTtnLmlhPW51bGw7Zy5tPTA7Zy5EPTM5O2cuUD0wO2cuT2E9ITA7Zy5GYT1udWxsO2cuSGE9ITA7Zy5tYT1mdW5jdGlvbigpe3ZhciBhPXRoaXMudi54YSh0aGlzKTt0aGlzLmc9YTtIYyh0aGlzLnYsYSk7S2IoYSwhMCk7dGhpcy5pc1Zpc2libGUoKXx8KGEuc3R5bGUuZGlzcGxheT0ibm9uZSIsYSYmYWMoYSwiaGlkZGVuIiwhMCkpfTtnLm5hPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaSgpfTtnLndhPWZ1bmN0aW9uKCl7cmV0dXJuITB9OwpnLkVhPWZ1bmN0aW9uKGEpe3RoaXMuZz1hPXRoaXMudi55YSh0aGlzLGEpO0hjKHRoaXMudixhKTtLYihhLCEwKTt0aGlzLk9hPWEuc3R5bGUuZGlzcGxheSE9Im5vbmUifTsKZy5JPWZ1bmN0aW9uKCl7Ti5sLkkuY2FsbCh0aGlzKTt2YXIgYT10aGlzLmc7cChhLCJDYW4gbm90IGNhbGwgZ2V0RWxlbWVudFN0cmljdCBiZWZvcmUgcmVuZGVyaW5nL2RlY29yYXRpbmcuIik7cCh0aGlzKTtwKGEpO3RoaXMuaXNWaXNpYmxlKCl8fGFjKGEsImhpZGRlbiIsIXRoaXMuaXNWaXNpYmxlKCkpO3RoaXMuaXNFbmFibGVkKCl8fEpjKGEsMSwhdGhpcy5pc0VuYWJsZWQoKSk7dGhpcy5EJjgmJkpjKGEsOCwhISh0aGlzLm0mOCkpO3RoaXMuRCYxNiYmSmMoYSwxNiwhISh0aGlzLm0mMTYpKTt0aGlzLkQmNjQmJkpjKGEsNjQsISEodGhpcy5tJjY0KSk7dmFyIGI9dGhpcy52O1ViKHRoaXMpJiYoYT10aGlzLmkoKSxiPWIuTigpKyItcnRsIiwoYT1hLmk/YS5pKCk6YSkmJnBjKGEsW2JdKSk7dGhpcy5pc0VuYWJsZWQoKSYmSWModGhpcyx0aGlzLmlzVmlzaWJsZSgpKTt0aGlzLkQmLTImJih0aGlzLkhhJiZMYyh0aGlzLCEwKSx0aGlzLkQmMzImJihhPXRoaXMuaSgpKSkmJihiPQp0aGlzLlp8fCh0aGlzLlo9bmV3IEopLGdjKGIsYSksQihCKEIoUWIodGhpcyksYiwia2V5Iix0aGlzLmFhKSxhLCJmb2N1cyIsdGhpcy5YYSksYSwiYmx1ciIsdGhpcy5RYSkpfTt2YXIgTGM9ZnVuY3Rpb24oYSxiKXt2YXIgYz1RYihhKSxkPWEuaSgpO2I/KEIoQihCKEIoYyxkLEsuZ2EsYS5zYSksZCxbSy5oYSxLLmZhXSxhLnZhKSxkLCJtb3VzZW92ZXIiLGEudWEpLGQsIm1vdXNlb3V0IixhLnRhKSxhLmNhIT1CYyYmQihjLGQsImNvbnRleHRtZW51IixhLmNhKSk6KEMoQyhDKEMoYyxkLEsuZ2EsYS5zYSksZCxbSy5oYSxLLmZhXSxhLnZhKSxkLCJtb3VzZW92ZXIiLGEudWEpLGQsIm1vdXNlb3V0IixhLnRhKSxhLmNhIT1CYyYmQyhjLGQsImNvbnRleHRtZW51IixhLmNhKSl9O04ucHJvdG90eXBlLlU9ZnVuY3Rpb24oKXtOLmwuVS5jYWxsKHRoaXMpO3RoaXMuWiYma2ModGhpcy5aKTt0aGlzLmlzVmlzaWJsZSgpJiZ0aGlzLmlzRW5hYmxlZCgpJiZJYyh0aGlzLCExKX07Ck4ucHJvdG90eXBlLkM9ZnVuY3Rpb24oKXtOLmwuQy5jYWxsKHRoaXMpO3RoaXMuWiYmKHRoaXMuWi5kaXNwb3NlKCksZGVsZXRlIHRoaXMuWik7ZGVsZXRlIHRoaXMudjt0aGlzLkZhPXRoaXMuaWE9bnVsbH07dmFyIEZjPWZ1bmN0aW9uKGEsYil7YS5pYT1ifTtOLnByb3RvdHlwZS5pc1Zpc2libGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5PYX07Ti5wcm90b3R5cGUuaXNFbmFibGVkPWZ1bmN0aW9uKCl7cmV0dXJuISh0aGlzLm0mMSl9O04ucHJvdG90eXBlLlg9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5oO2ImJnR5cGVvZiBiLmlzRW5hYmxlZD09ImZ1bmN0aW9uIiYmIWIuaXNFbmFibGVkKCl8fCFPKHRoaXMsMSwhYSl8fChhfHwoTWModGhpcywhMSksUCh0aGlzLCExKSksdGhpcy5pc1Zpc2libGUoKSYmSWModGhpcyxhKSxUKHRoaXMsMSwhYSwhMCkpfTt2YXIgUD1mdW5jdGlvbihhLGIpe08oYSwyLGIpJiZUKGEsMixiKX07Ck4ucHJvdG90eXBlLmlzQWN0aXZlPWZ1bmN0aW9uKCl7cmV0dXJuISEodGhpcy5tJjQpfTsKdmFyIE1jPWZ1bmN0aW9uKGEsYil7TyhhLDQsYikmJlQoYSw0LGIpfSxOYz1mdW5jdGlvbihhLGIpe08oYSw4LGIpJiZUKGEsOCxiKX0sT2M9ZnVuY3Rpb24oYSxiKXtPKGEsNjQsYikmJlQoYSw2NCxiKX0sVD1mdW5jdGlvbihhLGIsYyxkKXtpZighZCYmYj09MSlhLlgoIWMpO2Vsc2UgaWYoYS5EJmImJmMhPSEhKGEubSZiKSl7dmFyIGU9YS52O2lmKGQ9YS5pKCkpe2lmKGU9RWMoZSxiKSl7dmFyIGY9YS5pP2EuaSgpOmE7ZiYmKGM/cGM6cmMpKGYsW2VdKX1KYyhkLGIsYyl9YS5tPWM/YS5tfGI6YS5tJn5ifX0sUGM9ZnVuY3Rpb24oYSxiLGMpe2lmKGEucyYmYS5tJmImJiFjKXRocm93IEVycm9yKCJDb21wb25lbnQgYWxyZWFkeSByZW5kZXJlZCIpOyFjJiZhLm0mYiYmVChhLGIsITEpO2EuRD1jP2EuRHxiOmEuRCZ+Yn0sVT1mdW5jdGlvbihhLGIpe3JldHVybiEhKDI1NSZiKSYmISEoYS5EJmIpfSxPPWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4hIShhLkQmYikmJiEhKGEubSZiKSE9CmMmJighKGEuUCZiKXx8RShhLE5iKGIsYykpKSYmIWEuYmF9O04ucHJvdG90eXBlLnVhPWZ1bmN0aW9uKGEpeyFRYyhhLHRoaXMuaSgpKSYmRSh0aGlzLCJlbnRlciIpJiZ0aGlzLmlzRW5hYmxlZCgpJiZVKHRoaXMsMikmJlAodGhpcywhMCl9O04ucHJvdG90eXBlLnRhPWZ1bmN0aW9uKGEpeyFRYyhhLHRoaXMuaSgpKSYmRSh0aGlzLCJsZWF2ZSIpJiYoVSh0aGlzLDQpJiZNYyh0aGlzLCExKSxVKHRoaXMsMikmJlAodGhpcywhMSkpfTtOLnByb3RvdHlwZS5jYT1CYzt2YXIgUWM9ZnVuY3Rpb24oYSxiKXtyZXR1cm4hIWEucmVsYXRlZFRhcmdldCYmYWIoYixhLnJlbGF0ZWRUYXJnZXQpfTsKTi5wcm90b3R5cGUuc2E9ZnVuY3Rpb24oYSl7aWYodGhpcy5pc0VuYWJsZWQoKSYmKFUodGhpcywyKSYmUCh0aGlzLCEwKSwhKGEuaC5idXR0b24hPTB8fHYmJmEuY3RybEtleSkpKXtVKHRoaXMsNCkmJk1jKHRoaXMsITApO3ZhciBiO2lmKGI9dGhpcy52KXt2YXIgYztiPXRoaXMuRCYzMiYmKGM9dGhpcy5pKCkpP2RiKGMpJiZlYihjKTohMX1iJiZ0aGlzLmkoKS5mb2N1cygpfWEuaC5idXR0b24hPTB8fHYmJmEuY3RybEtleXx8YS5qKCl9O04ucHJvdG90eXBlLnZhPWZ1bmN0aW9uKGEpe3RoaXMuaXNFbmFibGVkKCkmJihVKHRoaXMsMikmJlAodGhpcywhMCksdGhpcy5pc0FjdGl2ZSgpJiZSYyh0aGlzLGEpJiZVKHRoaXMsNCkmJk1jKHRoaXMsITEpKX07CnZhciBSYz1mdW5jdGlvbihhLGIpe2lmKFUoYSwxNikpe3ZhciBjPSEoYS5tJjE2KTtPKGEsMTYsYykmJlQoYSwxNixjKX1VKGEsOCkmJk5jKGEsITApO1UoYSw2NCkmJk9jKGEsIShhLm0mNjQpKTtjPW5ldyB5KCJhY3Rpb24iLGEpO2ImJihjLmFsdEtleT1iLmFsdEtleSxjLmN0cmxLZXk9Yi5jdHJsS2V5LGMubWV0YUtleT1iLm1ldGFLZXksYy5zaGlmdEtleT1iLnNoaWZ0S2V5LGMuRz1iLkcsYy50aW1lU3RhbXA9Yi50aW1lU3RhbXApO3JldHVybiBFKGEsYyl9O04ucHJvdG90eXBlLlhhPWZ1bmN0aW9uKCl7VSh0aGlzLDMyKSYmTyh0aGlzLDMyLCEwKSYmVCh0aGlzLDMyLCEwKX07Ti5wcm90b3R5cGUuUWE9ZnVuY3Rpb24oKXtVKHRoaXMsNCkmJk1jKHRoaXMsITEpO1UodGhpcywzMikmJk8odGhpcywzMiwhMSkmJlQodGhpcywzMiwhMSl9OwpOLnByb3RvdHlwZS5hYT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5pc1Zpc2libGUoKSYmdGhpcy5pc0VuYWJsZWQoKSYmYS5nPT0xMyYmUmModGhpcyxhKT8oYS5qKCksYS52KCksITApOiExfTtpZih0eXBlb2YgTiE9PSJmdW5jdGlvbiIpdGhyb3cgRXJyb3IoIkludmFsaWQgY29tcG9uZW50IGNsYXNzICIrTik7aWYodHlwZW9mIE0hPT0iZnVuY3Rpb24iKXRocm93IEVycm9yKCJJbnZhbGlkIHJlbmRlcmVyIGNsYXNzICIrTSk7dmFyIFNjPW5hKE4pO3VjW1NjXT1NO3RjKCJnb29nLWNvbnRyb2wiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBOKG51bGwpfSk7dmFyIFY9ZnVuY3Rpb24oYSxiLGMpe0YuY2FsbCh0aGlzLGMpO3RoaXMuZWE9Ynx8dmMuVigpO3RoaXMuTD1hfHwidmVydGljYWwifTtuKFYsRik7Zz1WLnByb3RvdHlwZTtnLkthPW51bGw7Zy5kYT1udWxsO2cuZWE9bnVsbDtnLkw9bnVsbDtnLlM9ITA7Zy5UPSEwO2cubz0tMTtnLkI9bnVsbDtnLlc9ITE7Zy5PPW51bGw7dmFyIFRjPWZ1bmN0aW9uKGEpe3JldHVybiBhLkthfHxhLmkoKX07Zz1WLnByb3RvdHlwZTtnLm1hPWZ1bmN0aW9uKCl7dGhpcy5nPXRoaXMuRy5oKCJESVYiLHRoaXMuZWEuaih0aGlzKS5qb2luKCIgIikpfTtnLm5hPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaSgpfTtnLndhPWZ1bmN0aW9uKGEpe3JldHVybiBhLnRhZ05hbWU9PSJESVYifTtnLkVhPWZ1bmN0aW9uKGEpe3RoaXMuZz15Yyh0aGlzLmVhLHRoaXMsYSk7YS5zdHlsZS5kaXNwbGF5PT0ibm9uZSImJih0aGlzLlM9ITEpfTsKZy5JPWZ1bmN0aW9uKCl7Vi5sLkkuY2FsbCh0aGlzKTtUYih0aGlzLGZ1bmN0aW9uKGIpe2IucyYmVWModGhpcyxiKX0sdGhpcyk7dmFyIGE9dGhpcy5pKCk7QWModGhpcy5lYSx0aGlzKTtWYyh0aGlzLHRoaXMuUyk7QihCKEIoQihCKEIoQihCKFFiKHRoaXMpLHRoaXMsImVudGVyIix0aGlzLmViKSx0aGlzLCJoaWdobGlnaHQiLHRoaXMuZmIpLHRoaXMsInVuaGlnaGxpZ2h0Iix0aGlzLmxiKSx0aGlzLCJvcGVuIix0aGlzLmdiKSx0aGlzLCJjbG9zZSIsdGhpcy5iYiksYSxLLmdhLHRoaXMuV2EpLGJiKGEpLFtLLmhhLEsuZmFdLHRoaXMuY2IpLGEsW0suZ2EsSy5oYSxLLmZhLCJtb3VzZW92ZXIiLCJtb3VzZW91dCIsImNvbnRleHRtZW51Il0sdGhpcy5hYik7V2ModGhpcyl9O3ZhciBXYz1mdW5jdGlvbihhKXt2YXIgYj1RYihhKSxjPVRjKGEpO0IoQihCKGIsYywiZm9jdXMiLGEuUGEpLGMsImJsdXIiLGEuVWEpLGEuZGF8fChhLmRhPW5ldyBKKFRjKGEpKSksImtleSIsYS5WYSl9OwpnPVYucHJvdG90eXBlO2cuVT1mdW5jdGlvbigpe1hjKHRoaXMsLTEpO3RoaXMuQiYmT2ModGhpcy5CLCExKTt0aGlzLlc9ITE7Vi5sLlUuY2FsbCh0aGlzKX07Zy5DPWZ1bmN0aW9uKCl7Vi5sLkMuY2FsbCh0aGlzKTt0aGlzLmRhJiYodGhpcy5kYS5kaXNwb3NlKCksdGhpcy5kYT1udWxsKTt0aGlzLmVhPXRoaXMuQj10aGlzLk89dGhpcy5LYT1udWxsfTtnLmViPWZ1bmN0aW9uKCl7cmV0dXJuITB9OwpnLmZiPWZ1bmN0aW9uKGEpe3ZhciBiPVZiKHRoaXMsYS50YXJnZXQpO2lmKGI+LTEmJmIhPXRoaXMubyl7dmFyIGM9SSh0aGlzLHRoaXMubyk7YyYmUChjLCExKTt0aGlzLm89YjtjPUkodGhpcyx0aGlzLm8pO3RoaXMuVyYmTWMoYywhMCk7dGhpcy5CJiZjIT10aGlzLkImJihjLkQmNjQ/T2MoYywhMCk6T2ModGhpcy5CLCExKSl9Yj10aGlzLmkoKTtwKGIsIlRoZSBET00gZWxlbWVudCBmb3IgdGhlIGNvbnRhaW5lciBjYW5ub3QgYmUgbnVsbC4iKTthLnRhcmdldC5pKCkhPW51bGwmJmFjKGIsImFjdGl2ZWRlc2NlbmRhbnQiLGEudGFyZ2V0LmkoKS5pZCl9O2cubGI9ZnVuY3Rpb24oYSl7YS50YXJnZXQ9PUkodGhpcyx0aGlzLm8pJiYodGhpcy5vPS0xKTthPXRoaXMuaSgpO3AoYSwiVGhlIERPTSBlbGVtZW50IGZvciB0aGUgY29udGFpbmVyIGNhbm5vdCBiZSBudWxsLiIpO2EucmVtb3ZlQXR0cmlidXRlKCRiKCJhY3RpdmVkZXNjZW5kYW50IikpfTsKZy5nYj1mdW5jdGlvbihhKXsoYT1hLnRhcmdldCkmJmEhPXRoaXMuQiYmYS5oPT10aGlzJiYodGhpcy5CJiZPYyh0aGlzLkIsITEpLHRoaXMuQj1hKX07Zy5iYj1mdW5jdGlvbihhKXthLnRhcmdldD09dGhpcy5CJiYodGhpcy5CPW51bGwpO3ZhciBiPXRoaXMuaSgpLGM9YS50YXJnZXQuaSgpO2ImJmEudGFyZ2V0Lm0mMiYmYyYmKGE9IiIsYyYmKGE9Yy5pZCxwKGEsIlRoZSBhY3RpdmUgZWxlbWVudCBzaG91bGQgaGF2ZSBhbiBpZC4iKSksYWMoYiwiYWN0aXZlZGVzY2VuZGFudCIsYSkpfTtnLldhPWZ1bmN0aW9uKGEpe3RoaXMuVCYmKHRoaXMuVz0hMCk7dmFyIGI9VGModGhpcyk7YiYmZGIoYikmJmViKGIpP2IuZm9jdXMoKTphLmooKX07Zy5jYj1mdW5jdGlvbigpe3RoaXMuVz0hMX07CmcuYWI9ZnVuY3Rpb24oYSl7YTp7dmFyIGI9YS50YXJnZXQ7aWYodGhpcy5PKWZvcih2YXIgYz10aGlzLmkoKTtiJiZiIT09Yzspe3ZhciBkPWIuaWQ7aWYoZCBpbiB0aGlzLk8pe2I9dGhpcy5PW2RdO2JyZWFrIGF9Yj1iLnBhcmVudE5vZGV9Yj1udWxsfWlmKGIpc3dpdGNoKGEudHlwZSl7Y2FzZSBLLmdhOmIuc2EoYSk7YnJlYWs7Y2FzZSBLLmhhOmNhc2UgSy5mYTpiLnZhKGEpO2JyZWFrO2Nhc2UgIm1vdXNlb3ZlciI6Yi51YShhKTticmVhaztjYXNlICJtb3VzZW91dCI6Yi50YShhKTticmVhaztjYXNlICJjb250ZXh0bWVudSI6Yi5jYShhKX19O2cuUGE9ZnVuY3Rpb24oKXt9O2cuVWE9ZnVuY3Rpb24oKXtYYyh0aGlzLC0xKTt0aGlzLlc9ITE7dGhpcy5CJiZPYyh0aGlzLkIsITEpfTsKZy5WYT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5pc0VuYWJsZWQoKSYmdGhpcy5pc1Zpc2libGUoKSYmKEgodGhpcykhPTB8fHRoaXMuS2EpJiZZYyh0aGlzLGEpPyhhLmooKSxhLnYoKSwhMCk6ITF9Owp2YXIgWWM9ZnVuY3Rpb24oYSxiKXt2YXIgYz1JKGEsYS5vKTtpZihjJiZ0eXBlb2YgYy5hYT09ImZ1bmN0aW9uIiYmYy5hYShiKXx8YS5CJiZhLkIhPWMmJnR5cGVvZiBhLkIuYWE9PSJmdW5jdGlvbiImJmEuQi5hYShiKSlyZXR1cm4hMDtpZihiLnNoaWZ0S2V5fHxiLmN0cmxLZXl8fGIubWV0YUtleXx8Yi5hbHRLZXkpcmV0dXJuITE7c3dpdGNoKGIuZyl7Y2FzZSAyNzpUYyhhKS5ibHVyKCk7YnJlYWs7Y2FzZSAzNjpaYyhhKTticmVhaztjYXNlIDM1OiRjKGEpO2JyZWFrO2Nhc2UgMzg6aWYoYS5MPT0idmVydGljYWwiKWFkKGEpO2Vsc2UgcmV0dXJuITE7YnJlYWs7Y2FzZSAzNzppZihhLkw9PSJob3Jpem9udGFsIilVYihhKT9iZChhKTphZChhKTtlbHNlIHJldHVybiExO2JyZWFrO2Nhc2UgNDA6aWYoYS5MPT0idmVydGljYWwiKWJkKGEpO2Vsc2UgcmV0dXJuITE7YnJlYWs7Y2FzZSAzOTppZihhLkw9PSJob3Jpem9udGFsIilVYihhKT9hZChhKTpiZChhKTtlbHNlIHJldHVybiExOwpicmVhaztkZWZhdWx0OnJldHVybiExfXJldHVybiEwfSxVYz1mdW5jdGlvbihhLGIpe3ZhciBjPWIuaSgpO2M9Yy5pZHx8KGMuaWQ9T2IoYikpO2EuT3x8KGEuTz17fSk7YS5PW2NdPWJ9O1YucHJvdG90eXBlLkJhPWZ1bmN0aW9uKGEsYil7dWEoYSxOLCJUaGUgY2hpbGQgb2YgYSBjb250YWluZXIgbXVzdCBiZSBhIGNvbnRyb2wiKTtWLmwuQmEuY2FsbCh0aGlzLGEsYil9O1YucHJvdG90eXBlLkNhPWZ1bmN0aW9uKGEsYixjKXt1YShhLE4pO2EuUHw9MjthLlB8PTY0O1BjKGEsMzIsITEpO2EucyYmMCE9YS5IYSYmTGMoYSwhMSk7YS5IYT0hMTt2YXIgZD1hLmg9PXRoaXM/VmIodGhpcyxhKTotMTtWLmwuQ2EuY2FsbCh0aGlzLGEsYixjKTthLnMmJnRoaXMucyYmVWModGhpcyxhKTthPWQ7YT09LTEmJihhPUgodGhpcykpO2E9PXRoaXMubz90aGlzLm89TWF0aC5taW4oSCh0aGlzKS0xLGIpOmE+dGhpcy5vJiZiPD10aGlzLm8/dGhpcy5vKys6YTx0aGlzLm8mJmI+dGhpcy5vJiZ0aGlzLm8tLX07CnZhciB6Yz1mdW5jdGlvbihhLGIpe2lmKGEuaSgpKXRocm93IEVycm9yKCJDb21wb25lbnQgYWxyZWFkeSByZW5kZXJlZCIpO2EuTD1ifTtWLnByb3RvdHlwZS5pc1Zpc2libGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5TfTt2YXIgVmM9ZnVuY3Rpb24oYSxiKXthLlM9Yjt2YXIgYz1hLmkoKTtjJiYoYy5zdHlsZS5kaXNwbGF5PWI/IiI6Im5vbmUiLHdjKFRjKGEpLGEuVCYmYS5TKSl9O1YucHJvdG90eXBlLmlzRW5hYmxlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLlR9O1YucHJvdG90eXBlLlg9ZnVuY3Rpb24oYSl7dGhpcy5UIT1hJiZFKHRoaXMsYT8iZW5hYmxlIjoiZGlzYWJsZSIpJiYoYT8odGhpcy5UPSEwLFRiKHRoaXMsZnVuY3Rpb24oYil7Yi5UYT9kZWxldGUgYi5UYTpiLlgoITApfSkpOihUYih0aGlzLGZ1bmN0aW9uKGIpe2IuaXNFbmFibGVkKCk/Yi5YKCExKTpiLlRhPSEwfSksdGhpcy5XPXRoaXMuVD0hMSksd2MoVGModGhpcyksYSYmdGhpcy5TKSl9Owp2YXIgWGM9ZnVuY3Rpb24oYSxiKXsoYj1JKGEsYikpP1AoYiwhMCk6YS5vPi0xJiZQKEkoYSxhLm8pLCExKX0sWmM9ZnVuY3Rpb24oYSl7Y2QoYSxmdW5jdGlvbihiLGMpe3JldHVybihiKzEpJWN9LEgoYSktMSl9LCRjPWZ1bmN0aW9uKGEpe2NkKGEsZnVuY3Rpb24oYixjKXtiLS07cmV0dXJuIGI8MD9jLTE6Yn0sMCl9LGJkPWZ1bmN0aW9uKGEpe2NkKGEsZnVuY3Rpb24oYixjKXtyZXR1cm4oYisxKSVjfSxhLm8pfSxhZD1mdW5jdGlvbihhKXtjZChhLGZ1bmN0aW9uKGIsYyl7Yi0tO3JldHVybiBiPDA/Yy0xOmJ9LGEubyl9LGNkPWZ1bmN0aW9uKGEsYixjKXtjPWM8MD9WYihhLGEuQik6Yzt2YXIgZD1IKGEpO2M9Yi5jYWxsKGEsYyxkKTtmb3IodmFyIGU9MDtlPD1kOyl7dmFyIGY9SShhLGMpO2lmKGYmJmYuaXNWaXNpYmxlKCkmJmYuaXNFbmFibGVkKCkmJmYuRCYyKXthLkxhKGMpO2JyZWFrfWUrKztjPWIuY2FsbChhLGMsZCl9fTsKVi5wcm90b3R5cGUuTGE9ZnVuY3Rpb24oYSl7WGModGhpcyxhKX07dmFyIGRkPWZ1bmN0aW9uKCl7fTtuKGRkLE0pO2lhKGRkKTtnPWRkLnByb3RvdHlwZTtnLk49ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy10YWIifTtnLk5hPWZ1bmN0aW9uKCl7cmV0dXJuInRhYiJ9O2cueGE9ZnVuY3Rpb24oYSl7dmFyIGI9ZGQubC54YS5jYWxsKHRoaXMsYSk7KGE9YS5HYSgpKSYmdGhpcy5NYShiLGEpO3JldHVybiBifTtnLnlhPWZ1bmN0aW9uKGEsYil7Yj1kZC5sLnlhLmNhbGwodGhpcyxhLGIpO3ZhciBjPXRoaXMuR2EoYik7YyYmKGEuUmE9Yyk7YS5tJjgmJihjPWEuaCkmJnR5cGVvZiBjLko9PT0iZnVuY3Rpb24iJiYoVChhLDgsITEpLGMuSihhKSk7cmV0dXJuIGJ9O2cuR2E9ZnVuY3Rpb24oYSl7cmV0dXJuIGEudGl0bGV8fCIifTtnLk1hPWZ1bmN0aW9uKGEsYil7YSYmKGEudGl0bGU9Ynx8IiIpfTt2YXIgZWQ9ZnVuY3Rpb24oYSxiLGMpe04uY2FsbCh0aGlzLGEsYnx8ZGQuVigpLGMpO1BjKHRoaXMsOCwhMCk7dGhpcy5QfD05fTtuKGVkLE4pO2VkLnByb3RvdHlwZS5HYT1mdW5jdGlvbigpe3JldHVybiB0aGlzLlJhfTtlZC5wcm90b3R5cGUuTWE9ZnVuY3Rpb24oYSl7dGhpcy52Lk1hKHRoaXMuaSgpLGEpO3RoaXMuUmE9YX07dGMoImdvb2ctdGFiIixmdW5jdGlvbigpe3JldHVybiBuZXcgZWQobnVsbCl9KTt2YXIgVz1mdW5jdGlvbigpe3RoaXMuQT0idGFibGlzdCJ9O24oVyx2Yyk7aWEoVyk7Vy5wcm90b3R5cGUuZz1mdW5jdGlvbigpe3JldHVybiJnb29nLXRhYi1iYXIifTtXLnByb3RvdHlwZS51PWZ1bmN0aW9uKGEsYixjKXt0aGlzLnZ8fCh0aGlzLmh8fGZkKHRoaXMpLHRoaXMudj1FYSh0aGlzLmgpKTt2YXIgZD10aGlzLnZbYl07ZD8oemMoYSxnZChkKSksYS52PWQpOlcubC51LmNhbGwodGhpcyxhLGIsYyl9O1cucHJvdG90eXBlLmo9ZnVuY3Rpb24oYSl7dmFyIGI9Vy5sLmouY2FsbCh0aGlzLGEpO3RoaXMuaHx8ZmQodGhpcyk7Yi5wdXNoKHRoaXMuaFthLnZdKTtyZXR1cm4gYn07dmFyIGZkPWZ1bmN0aW9uKGEpe3ZhciBiPWEuZygpO2EuaD17dG9wOmIrIi10b3AiLGJvdHRvbTpiKyItYm90dG9tIixzdGFydDpiKyItc3RhcnQiLGVuZDpiKyItZW5kIn19O3ZhciBYPWZ1bmN0aW9uKGEsYixjKXthPWF8fCJ0b3AiO3pjKHRoaXMsZ2QoYSkpO3RoaXMudj1hO1YuY2FsbCh0aGlzLHRoaXMuTCxifHxXLlYoKSxjKTtoZCh0aGlzKX07bihYLFYpO2c9WC5wcm90b3R5cGU7Zy5IPW51bGw7Zy5JPWZ1bmN0aW9uKCl7WC5sLkkuY2FsbCh0aGlzKTtoZCh0aGlzKX07Zy5DPWZ1bmN0aW9uKCl7WC5sLkMuY2FsbCh0aGlzKTt0aGlzLkg9bnVsbH07Zy5MYT1mdW5jdGlvbihhKXtYLmwuTGEuY2FsbCh0aGlzLGEpO3RoaXMuSihJKHRoaXMsYSkpfTtnLko9ZnVuY3Rpb24oYSl7YT9OYyhhLCEwKTp0aGlzLkgmJk5jKHRoaXMuSCwhMSl9Owp2YXIgaWQ9ZnVuY3Rpb24oYSxiKXtpZihiJiZiPT1hLkgpe2Zvcih2YXIgYz1WYihhLGIpLGQ9Yy0xO2I9SShhLGQpO2QtLSl7dmFyIGU9YjtpZihlLmlzVmlzaWJsZSgpJiZlLmlzRW5hYmxlZCgpKXthLkooYik7cmV0dXJufX1mb3IoYys9MTtiPUkoYSxjKTtjKyspaWYoZD1iLGQuaXNWaXNpYmxlKCkmJmQuaXNFbmFibGVkKCkpe2EuSihiKTtyZXR1cm59YS5KKG51bGwpfX07Zz1YLnByb3RvdHlwZTtnLmpiPWZ1bmN0aW9uKGEpe3RoaXMuSCYmdGhpcy5IIT1hLnRhcmdldCYmTmModGhpcy5ILCExKTt0aGlzLkg9YS50YXJnZXR9O2cua2I9ZnVuY3Rpb24oYSl7YS50YXJnZXQ9PXRoaXMuSCYmKHRoaXMuSD1udWxsKX07Zy5oYj1mdW5jdGlvbihhKXtpZCh0aGlzLGEudGFyZ2V0KX07Zy5pYj1mdW5jdGlvbihhKXtpZCh0aGlzLGEudGFyZ2V0KX07Zy5QYT1mdW5jdGlvbigpe0kodGhpcyx0aGlzLm8pfHxYYyh0aGlzLFZiKHRoaXMsdGhpcy5IfHxJKHRoaXMsMCkpKX07CnZhciBoZD1mdW5jdGlvbihhKXtCKEIoQihCKFFiKGEpLGEsInNlbGVjdCIsYS5qYiksYSwidW5zZWxlY3QiLGEua2IpLGEsImRpc2FibGUiLGEuaGIpLGEsImhpZGUiLGEuaWIpfSxnZD1mdW5jdGlvbihhKXtyZXR1cm4gYT09InN0YXJ0Inx8YT09ImVuZCI/InZlcnRpY2FsIjoiaG9yaXpvbnRhbCJ9O3RjKCJnb29nLXRhYi1iYXIiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBYfSk7ZnVuY3Rpb24gamQoYSl7dmFyIGI9e3RvcDoiYm90dG9tIixib3R0b206InRvcCIsc3RhcnQ6InJpZ2h0IixlbmQ6ImxlZnQifVthLmxvY2F0aW9uXSxjPWEuZWxlbWVudElkLGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTtkLnRleHRDb250ZW50PSJcbiAgICBmaWVsZHNldCB7XG4gICAgICBwYWRkaW5nOiAxMHB4O1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgIzM2OTtcbiAgICB9XG5cbiAgICAjIitjKyIgLmdvb2ctdGFiLWNvbnRlbnQge1xuICAgICAgbWluLWhlaWdodDogM2VtO1xuICAgICAgbWFyZ2luOiAwO1xuICAgICAgYm9yZGVyOiAiK2EuYm9yZGVyKyIgc29saWQgIithLmJvcmRlckNvbG9yKyI7XG4gICAgICBib3JkZXItdG9wOiAwO1xuICAgICAgaGVpZ2h0OiAiK2EuY29udGVudEhlaWdodCsiO1xuICAgICAgcGFkZGluZzogNHB4IDhweDtcbiAgICAgIG1hcmdpbi1yaWdodDogNHB4O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgIG92ZXJmbG93OiBhdXRvO1xuICAgIH1cblxuICAgICMiKwpjKyIgLmdvb2ctdGFiLWJhci0iK2EubG9jYXRpb24rIiAuZ29vZy10YWItc2VsZWN0ZWQge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICIrYS5ib3JkZXJDb2xvcisiO1xuICAgICAgYm9yZGVyLSIrYisiOiAwcHg7XG4gICAgfVxuXG4gICAgIyIrYysiIC5nb29nLXRhYi1iYXItIithLmxvY2F0aW9uKyIge1xuICAgICAgcGFkZGluZy0iK2EubG9jYXRpb24rIjogNXB4ICFpbXBvcnRhbnQ7XG4gICAgICBib3JkZXItIitiKyI6IDFweCBzb2xpZCAiK2EuYm9yZGVyQ29sb3IrIiAhaW1wb3J0YW50O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICB9XG5cbiAgICAjIitjKyIgLmdvb2ctdGFiLWJhciB7XG4gICAgICAgbWFyZ2luOiAwO1xuICAgICAgIGJvcmRlcjogMDtcbiAgICAgICBwYWRkaW5nOiAwO1xuICAgICAgIGxpc3Qtc3R5bGU6IG5vbmU7XG4gICAgICAgY3Vyc29yOiBkZWZhdWx0O1xuICAgICAgIG91dGxpbmU6IG5vbmU7XG4gICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgICBtYXJnaW4tcmlnaHQ6IDRweDtcbiAgICAgIH1cblxuICAgICAjIisKYysiIC5nb29nLXRhYiB7XG4gICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgIHBhZGRpbmc6IDRweCA4cHg7XG4gICAgICAgY29sb3I6IHZhcigtLWNvbGFiLXByaW1hcnktdGV4dC1jb2xvcik7XG4gICAgICAgdGV4dC1kZWNvcmF0aW9uOiBpbml0aWFsO1xuICAgICAgIGN1cnNvcjogZGVmYXVsdDtcbiAgICAgIH1cblxuICAgICAgIyIrYysiIC5nb29nLXRhYi1ob3ZlciB7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWNvbGFiLWhpZ2hsaWdodGVkLXN1cmZhY2UtY29sb3IpO1xuICAgICAgfVxuICAgICAgIjtyZXR1cm4gZH0KdmFyIGtkPWZ1bmN0aW9uKGEpe3ZhciBiPWEuZWxlbWVudElkLGM9YS50YWJOYW1lcyxkPWEuc2VsZWN0ZWRJbmRleDsiY29udGVudEJvcmRlciJpbiBhfHwoYS5jb250ZW50Qm9yZGVyPSIwcHgiKTsiY29udGVudEhlaWdodCJpbiBhfHwoYS5jb250ZW50SGVpZ2h0PSJpbml0aWFsIik7ImJvcmRlckNvbG9yImluIGF8fChhLmJvcmRlckNvbG9yPSJ2YXIoLS1jb2xhYi1ib3JkZXItY29sb3IpIik7YS5sb2NhdGlvbnx8KGEubG9jYXRpb249InRvcCIpO3ZhciBlPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiMiK2IpLGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zi5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYi1iYXIiKTt2YXIgaD1hLmxvY2F0aW9uO2YuY2xhc3NMaXN0LmFkZCgiZ29vZy10YWItYmFyLSIraCk7Zm9yKHZhciBrPVtdLHE9ZmEoYyksRz1xLm5leHQoKTshRy5kb25lO0c9cS5uZXh0KCkpe0c9Ry52YWx1ZTt2YXIgeD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKeC5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYiIpO3gudGV4dENvbnRlbnQ9RztmLmFwcGVuZENoaWxkKHgpO2sucHVzaCh4KX1oIT0iYm90dG9tIiYmZS5hcHBlbmRDaGlsZChmKTtxPW51bGw7aWYoaD09InRvcCJ8fGg9PSJib3R0b20iKXE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikscS5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYi1iYXItY2xlYXIiKTtoPT0idG9wIiYmcSYmZS5hcHBlbmRDaGlsZChxKTtHPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO0cuY2xhc3NMaXN0LmFkZCgiZ29vZy10YWItY29udGVudCIpO3ZhciBoYT1bXTtjPWZhKGMpO2Zvcih4PWMubmV4dCgpOyF4LmRvbmU7eD1jLm5leHQoKSl4PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHguaWQ9ZS5pZCsiX2NvbnRlbnRfIitoYS5sZW5ndGgseC5zdHlsZS5kaXNwbGF5PSJub25lIixHLmFwcGVuZENoaWxkKHgpLGhhLnB1c2goeCk7ZS5hcHBlbmRDaGlsZChHKTtoPT0iYm90dG9tIiYmKHEmJgplLmFwcGVuZENoaWxkKHEpLGUuYXBwZW5kQ2hpbGQoZikpO3ZhciBRPW5ldyBYKGgpO1NiKFEsZik7dmFyIFI9LTE7d2IoUSwic2VsZWN0IixmdW5jdGlvbihTKXtTPWsuaW5kZXhPZihTLnRhcmdldC5pKCkpO1MhPVImJihSPj0wJiZSPGhhLmxlbmd0aCYmKGhhW1JdLnN0eWxlLmRpc3BsYXk9Im5vbmUiLFI9LTEpLFM+PTAmJlM8aGEubGVuZ3RoJiYoUj1TLGhhW1JdLnN0eWxlLmRpc3BsYXk9ImlubGluZSIsd2luZG93LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCJyZXNpemUiKSksZ29vZ2xlLmNvbGFiLm91dHB1dC5yZXNpemVJZnJhbWVUb0NvbnRlbnQoKSksUS5KKEkoUSxSKSkpfSk7US5KKEkoUSxkKSk7d2luZG93W2JdPXtzZXRTZWxlY3RlZFRhYkluZGV4OmZ1bmN0aW9uKFMpe1EuSihJKFEsUykpfX07ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChqZChhKSl9LGxkPVsiY29sYWJfbGliIiwiY3JlYXRlVGFiQmFyIl0sWT1sOwpsZFswXWluIFl8fHR5cGVvZiBZLmV4ZWNTY3JpcHQ9PSJ1bmRlZmluZWQifHxZLmV4ZWNTY3JpcHQoInZhciAiK2xkWzBdKTtmb3IodmFyIFo7bGQubGVuZ3RoJiYoWj1sZC5zaGlmdCgpKTspbGQubGVuZ3RofHxrZD09PXZvaWQgMD9ZW1pdJiZZW1pdIT09T2JqZWN0LnByb3RvdHlwZVtaXT9ZPVlbWl06WT1ZW1pdPXt9OllbWl09a2Q7fSkuY2FsbCh0aGlzKTsKLy8gY2xhbmctZm9ybWF0IG9uCg==", + "ok": true, + "headers": [ + [ + "content-length", + "41785" + ], + [ + "content-type", + "application/javascript" + ] + ], + "status": 200, + "status_text": "" + } + }, + "base_uri": "https://localhost:8080/", + "height": 197 + }, + "outputId": "a1418676-f327-46a9-989f-771ff9119182" + }, + "source": [ + "%%logica MyFirstPredicate\n", + "\n", + "@Engine(\"sqlite\");\n", + "\n", + "MyFirstPredicate(\"Hello world!\")" + ], + "execution_count": 37, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7601ee80-d22d-11ef-a7c0-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id81\", \"tabNames\": [\"MyFirstPredicate\", \"(Log)\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_d366870a3b" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"76024c5e-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id81\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_44703b5d4c" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7603bbc0-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_9323ffd4ae" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"760404c2-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id81_content_1\");\n", + "//# sourceURL=js_8e10ea6231" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"76044c16-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"760404c2-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_7aeb75e741" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7604925c-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id81\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_b855c4585c" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7605b0f6-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"7603bbc0-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_4dbf3d72dd" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"76074cfe-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_f4c590f541" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"760796be-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id81_content_0\");\n", + "//# sourceURL=js_26f1f1f25a" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7607df7a-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"760796be-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_ae155f439c" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7608266a-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id81\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_aea80cc1da" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7609db22-d22d-11ef-a7c0-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id82\", \"tabNames\": [\"SQL\", \"Result\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_b4b19c0c26" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"760a25c8-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id82\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_fb6d7c0353" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"760b7c02-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_03d3844a91" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"760bc9fa-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id82_content_0\");\n", + "//# sourceURL=js_31f372c20b" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"760c1374-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"760bc9fa-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_666182a4b3" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"760c62e8-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id82\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_27b85ed1ef" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The following query is stored at \u001b[1mMyFirstPredicate_sql\u001b[0m variable.\n", + "SELECT\n", + " 'Hello world!' AS col0;\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"760d8da8-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"760b7c02-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_16c1fdd5ec" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7614e2ce-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_f2bf90a273" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"76152d6a-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id82_content_1\");\n", + "//# sourceURL=js_378a2afcc2" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"761572ac-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"76152d6a-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_4e91f5576c" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7615b582-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id82\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_b8c210d722" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The following table is stored at \u001b[1mMyFirstPredicate\u001b[0m variable.\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
col0
0Hello world!
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7617da56-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"7614e2ce-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_7448d90e34" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"761945da-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"76074cfe-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_621f677c5c" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"761ad332-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_4187431682" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"761b1982-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id81_content_1\");\n", + "//# sourceURL=js_0d49dac7cd" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"761b5f32-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"761b1982-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_b720cd7c1a" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"761ba29e-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id81\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_a2c02ea3b9" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "image/svg+xml": "\n\n\n\n\n\nConcertina\n\n\n\nMyFirstPredicate\n\nMyFirstPredicate\n\n\n\n", + "text/plain": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Running predicate: MyFirstPredicate (1 ms)\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"76326a10-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"761ad332-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_4e992d0b86" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7634512c-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_8c4b737a7d" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7634df20-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id81_content_0\");\n", + "//# sourceURL=js_5d50e51dd0" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"76353966-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"7634df20-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_32f5ad6dd7" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7636edce-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id81\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_e069f910b4" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"763a10da-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_0c1e65d0c3" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"763ab15c-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id82_content_1\");\n", + "//# sourceURL=js_ab899d4eb8" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"763b15f2-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"763ab15c-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_bd4d2b830e" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"763b7a4c-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id82\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_7b6ad441ca" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"763df0a6-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"763a10da-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_8c461c2b49" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + " \n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"763fb74c-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"7634512c-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_5d28ca13e1" + ] + }, + "metadata": {} + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "vP3y1KI_Jdhh" + }, + "source": [ + "### Working with Booleans\n", + "\n", + "You can turn a boolean value to a constraint by comparing it with `true` or with `Constraint` predicate.\n" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "rJIYyDInJSFk", + "colab": { + "resources": { + "http://localhost:8080/nbextensions/google.colab/tabbar.css": { + "data": "Lmdvb2ctdGFie3Bvc2l0aW9uOnJlbGF0aXZlO3BhZGRpbmc6NHB4IDhweDtjb2xvcjojMDBjO3RleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7Y3Vyc29yOmRlZmF1bHR9Lmdvb2ctdGFiLWJhci10b3AgLmdvb2ctdGFie21hcmdpbjoxcHggNHB4IDAgMDtib3JkZXItYm90dG9tOjA7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLXRvcDphZnRlciwuZ29vZy10YWItYmFyLWJvdHRvbTphZnRlcntjb250ZW50OiIgIjtkaXNwbGF5OmJsb2NrO2hlaWdodDowO2NsZWFyOmJvdGg7dmlzaWJpbGl0eTpoaWRkZW59Lmdvb2ctdGFiLWJhci1ib3R0b20gLmdvb2ctdGFie21hcmdpbjowIDRweCAxcHggMDtib3JkZXItdG9wOjA7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLXN0YXJ0IC5nb29nLXRhYnttYXJnaW46MCAwIDRweCAxcHg7Ym9yZGVyLXJpZ2h0OjB9Lmdvb2ctdGFiLWJhci1lbmQgLmdvb2ctdGFie21hcmdpbjowIDFweCA0cHggMDtib3JkZXItbGVmdDowfS5nb29nLXRhYi1ob3ZlcntiYWNrZ3JvdW5kOiNlZWV9Lmdvb2ctdGFiLWRpc2FibGVke2NvbG9yOiM2NjZ9Lmdvb2ctdGFiLXNlbGVjdGVke2NvbG9yOiMwMDA7YmFja2dyb3VuZDojZmZmO3RleHQtZGVjb3JhdGlvbjpub25lO2ZvbnQtd2VpZ2h0OmJvbGQ7Ym9yZGVyOjFweCBzb2xpZCAjNmI5MGRhfS5nb29nLXRhYi1iYXItdG9we3BhZGRpbmctdG9wOjVweCFpbXBvcnRhbnQ7cGFkZGluZy1sZWZ0OjVweCFpbXBvcnRhbnQ7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgIzZiOTBkYSFpbXBvcnRhbnR9Lmdvb2ctdGFiLWJhci10b3AgLmdvb2ctdGFiLXNlbGVjdGVke3RvcDoxcHg7bWFyZ2luLXRvcDowO3BhZGRpbmctYm90dG9tOjVweH0uZ29vZy10YWItYmFyLWJvdHRvbSAuZ29vZy10YWItc2VsZWN0ZWR7dG9wOi0xcHg7bWFyZ2luLWJvdHRvbTowO3BhZGRpbmctdG9wOjVweH0uZ29vZy10YWItYmFyLXN0YXJ0IC5nb29nLXRhYi1zZWxlY3RlZHtsZWZ0OjFweDttYXJnaW4tbGVmdDowO3BhZGRpbmctcmlnaHQ6OXB4fS5nb29nLXRhYi1iYXItZW5kIC5nb29nLXRhYi1zZWxlY3RlZHtsZWZ0Oi0xcHg7bWFyZ2luLXJpZ2h0OjA7cGFkZGluZy1sZWZ0OjlweH0uZ29vZy10YWItYmFye21hcmdpbjowO2JvcmRlcjowO3BhZGRpbmc6MDtsaXN0LXN0eWxlOm5vbmU7Y3Vyc29yOmRlZmF1bHQ7b3V0bGluZTpub25lO2JhY2tncm91bmQ6I2ViZWZmOX0uZ29vZy10YWItYmFyLWNsZWFye2NsZWFyOmJvdGg7aGVpZ2h0OjA7b3ZlcmZsb3c6aGlkZGVufS5nb29nLXRhYi1iYXItc3RhcnR7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLWVuZHtmbG9hdDpyaWdodH0qIGh0bWwgLmdvb2ctdGFiLWJhci1zdGFydHttYXJnaW4tcmlnaHQ6LTNweH0qIGh0bWwgLmdvb2ctdGFiLWJhci1lbmR7bWFyZ2luLWxlZnQ6LTNweH1zZW50aW5lbHt9", + "ok": true, + "headers": [ + [ + "content-length", + "1404" + ], + [ + "content-type", + "text/css" + ] + ], + "status": 200, + "status_text": "" + }, + "http://localhost:8080/nbextensions/google.colab/tabbar_main.min.js": { + "data": "Ly8gY2xhbmctZm9ybWF0IG9mZgooZnVuY3Rpb24oKXt2YXIgZyxhYT1mdW5jdGlvbihhKXt2YXIgYj0wO3JldHVybiBmdW5jdGlvbigpe3JldHVybiBiPGEubGVuZ3RoP3tkb25lOiExLHZhbHVlOmFbYisrXX06e2RvbmU6ITB9fX0sYmE9dHlwZW9mIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzPT0iZnVuY3Rpb24iP09iamVjdC5kZWZpbmVQcm9wZXJ0eTpmdW5jdGlvbihhLGIsYyl7aWYoYT09QXJyYXkucHJvdG90eXBlfHxhPT1PYmplY3QucHJvdG90eXBlKXJldHVybiBhO2FbYl09Yy52YWx1ZTtyZXR1cm4gYX0sY2E9ZnVuY3Rpb24oYSl7YT1bIm9iamVjdCI9PXR5cGVvZiBnbG9iYWxUaGlzJiZnbG9iYWxUaGlzLGEsIm9iamVjdCI9PXR5cGVvZiB3aW5kb3cmJndpbmRvdywib2JqZWN0Ij09dHlwZW9mIHNlbGYmJnNlbGYsIm9iamVjdCI9PXR5cGVvZiBnbG9iYWwmJmdsb2JhbF07Zm9yKHZhciBiPTA7YjxhLmxlbmd0aDsrK2Ipe3ZhciBjPWFbYl07aWYoYyYmYy5NYXRoPT1NYXRoKXJldHVybiBjfXRocm93IEVycm9yKCJDYW5ub3QgZmluZCBnbG9iYWwgb2JqZWN0Iik7Cn0sZGE9Y2EodGhpcyksZWE9ZnVuY3Rpb24oYSxiKXtpZihiKWE6e3ZhciBjPWRhO2E9YS5zcGxpdCgiLiIpO2Zvcih2YXIgZD0wO2Q8YS5sZW5ndGgtMTtkKyspe3ZhciBlPWFbZF07aWYoIShlIGluIGMpKWJyZWFrIGE7Yz1jW2VdfWE9YVthLmxlbmd0aC0xXTtkPWNbYV07Yj1iKGQpO2IhPWQmJmIhPW51bGwmJmJhKGMsYSx7Y29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOmJ9KX19OwplYSgiU3ltYm9sIixmdW5jdGlvbihhKXtpZihhKXJldHVybiBhO3ZhciBiPWZ1bmN0aW9uKGYsaCl7dGhpcy5nPWY7YmEodGhpcywiZGVzY3JpcHRpb24iLHtjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6aH0pfTtiLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmd9O3ZhciBjPSJqc2NvbXBfc3ltYm9sXyIrKE1hdGgucmFuZG9tKCkqMUU5Pj4+MCkrIl8iLGQ9MCxlPWZ1bmN0aW9uKGYpe2lmKHRoaXMgaW5zdGFuY2VvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoIlN5bWJvbCBpcyBub3QgYSBjb25zdHJ1Y3RvciIpO3JldHVybiBuZXcgYihjKyhmfHwiIikrIl8iK2QrKyxmKX07cmV0dXJuIGV9KTsKdmFyIGZhPWZ1bmN0aW9uKGEpe3ZhciBiPXR5cGVvZiBTeW1ib2whPSJ1bmRlZmluZWQiJiZTeW1ib2wuaXRlcmF0b3ImJmFbU3ltYm9sLml0ZXJhdG9yXTtpZihiKXJldHVybiBiLmNhbGwoYSk7aWYodHlwZW9mIGEubGVuZ3RoPT0ibnVtYmVyIilyZXR1cm57bmV4dDphYShhKX07dGhyb3cgRXJyb3IoU3RyaW5nKGEpKyIgaXMgbm90IGFuIGl0ZXJhYmxlIG9yIEFycmF5TGlrZSIpO307ZWEoIlN5bWJvbC5kaXNwb3NlIixmdW5jdGlvbihhKXtyZXR1cm4gYT9hOlN5bWJvbCgiU3ltYm9sLmRpc3Bvc2UiKX0pOy8qCgogQ29weXJpZ2h0IFRoZSBDbG9zdXJlIExpYnJhcnkgQXV0aG9ycy4KIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wCiovCnZhciBsPXRoaXN8fHNlbGYsaWE9ZnVuY3Rpb24oYSl7YS5JYT12b2lkIDA7YS5WPWZ1bmN0aW9uKCl7cmV0dXJuIGEuSWE/YS5JYTphLklhPW5ldyBhfX0samE9ZnVuY3Rpb24oYSl7dmFyIGI9dHlwZW9mIGE7cmV0dXJuIGIhPSJvYmplY3QiP2I6YT9BcnJheS5pc0FycmF5KGEpPyJhcnJheSI6YjoibnVsbCJ9LGthPWZ1bmN0aW9uKGEpe3ZhciBiPWphKGEpO3JldHVybiBiPT0iYXJyYXkifHxiPT0ib2JqZWN0IiYmdHlwZW9mIGEubGVuZ3RoPT0ibnVtYmVyIn0sbT1mdW5jdGlvbihhKXt2YXIgYj10eXBlb2YgYTtyZXR1cm4gYj09Im9iamVjdCImJmEhPW51bGx8fGI9PSJmdW5jdGlvbiJ9LG5hPWZ1bmN0aW9uKGEpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYSxsYSkmJmFbbGFdfHwoYVtsYV09KyttYSl9LGxhPSJjbG9zdXJlX3VpZF8iKyhNYXRoLnJhbmRvbSgpKjFFOT4+PjApLG1hPTAsbj1mdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoKXt9Yy5wcm90b3R5cGU9CmIucHJvdG90eXBlO2EubD1iLnByb3RvdHlwZTthLnByb3RvdHlwZT1uZXcgYzthLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1hO2EucWQ9ZnVuY3Rpb24oZCxlLGYpe2Zvcih2YXIgaD1BcnJheShhcmd1bWVudHMubGVuZ3RoLTIpLGs9MjtrPGFyZ3VtZW50cy5sZW5ndGg7aysrKWhbay0yXT1hcmd1bWVudHNba107cmV0dXJuIGIucHJvdG90eXBlW2VdLmFwcGx5KGQsaCl9fTtmdW5jdGlvbiBvYShhLGIpe2lmKEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKUVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsb2EpO2Vsc2V7dmFyIGM9RXJyb3IoKS5zdGFjaztjJiYodGhpcy5zdGFjaz1jKX1hJiYodGhpcy5tZXNzYWdlPVN0cmluZyhhKSk7YiE9PXZvaWQgMCYmKHRoaXMuY2F1c2U9Yil9bihvYSxFcnJvcik7b2EucHJvdG90eXBlLm5hbWU9IkN1c3RvbUVycm9yIjt2YXIgcGE7ZnVuY3Rpb24gcWEoYSxiKXthPWEuc3BsaXQoIiVzIik7Zm9yKHZhciBjPSIiLGQ9YS5sZW5ndGgtMSxlPTA7ZTxkO2UrKyljKz1hW2VdKyhlPGIubGVuZ3RoP2JbZV06IiVzIik7b2EuY2FsbCh0aGlzLGMrYVtkXSl9bihxYSxvYSk7cWEucHJvdG90eXBlLm5hbWU9IkFzc2VydGlvbkVycm9yIjtmdW5jdGlvbiByYShhLGIsYyxkKXt2YXIgZT0iQXNzZXJ0aW9uIGZhaWxlZCI7aWYoYyl7ZSs9IjogIitjO3ZhciBmPWR9ZWxzZSBhJiYoZSs9IjogIithLGY9Yik7dGhyb3cgbmV3IHFhKCIiK2UsZnx8W10pO30KdmFyIHA9ZnVuY3Rpb24oYSxiLGMpe2F8fHJhKCIiLG51bGwsYixBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMikpO3JldHVybiBhfSxzYT1mdW5jdGlvbihhLGIsYyl7bShhKSYmYS5ub2RlVHlwZT09MXx8cmEoIkV4cGVjdGVkIEVsZW1lbnQgYnV0IGdvdCAlczogJXMuIixbamEoYSksYV0sYixBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMikpfSx1YT1mdW5jdGlvbihhLGIsYyxkKXthIGluc3RhbmNlb2YgYnx8cmEoIkV4cGVjdGVkIGluc3RhbmNlb2YgJXMgYnV0IGdvdCAlcy4iLFt0YShiKSx0YShhKV0sYyxBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMykpfTsKZnVuY3Rpb24gdGEoYSl7cmV0dXJuIGEgaW5zdGFuY2VvZiBGdW5jdGlvbj9hLmRpc3BsYXlOYW1lfHxhLm5hbWV8fCJ1bmtub3duIHR5cGUgbmFtZSI6YSBpbnN0YW5jZW9mIE9iamVjdD9hLmNvbnN0cnVjdG9yLmRpc3BsYXlOYW1lfHxhLmNvbnN0cnVjdG9yLm5hbWV8fE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhKTphPT09bnVsbD8ibnVsbCI6dHlwZW9mIGF9O3ZhciB2YT1BcnJheS5wcm90b3R5cGUuaW5kZXhPZj9mdW5jdGlvbihhLGIpe3AoYS5sZW5ndGghPW51bGwpO3JldHVybiBBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKGEsYix2b2lkIDApfTpmdW5jdGlvbihhLGIpe2lmKHR5cGVvZiBhPT09InN0cmluZyIpcmV0dXJuIHR5cGVvZiBiIT09InN0cmluZyJ8fGIubGVuZ3RoIT0xPy0xOmEuaW5kZXhPZihiLDApO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWlmKGMgaW4gYSYmYVtjXT09PWIpcmV0dXJuIGM7cmV0dXJuLTF9LHdhPUFycmF5LnByb3RvdHlwZS5mb3JFYWNoP2Z1bmN0aW9uKGEsYil7cChhLmxlbmd0aCE9bnVsbCk7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChhLGIsdm9pZCAwKX06ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9YS5sZW5ndGgsZD10eXBlb2YgYT09PSJzdHJpbmciP2Euc3BsaXQoIiIpOmEsZT0wO2U8YztlKyspZSBpbiBkJiZiLmNhbGwodm9pZCAwLGRbZV0sZSxhKX07CmZ1bmN0aW9uIHhhKGEsYil7Yj12YShhLGIpO3ZhciBjO2lmKGM9Yj49MClwKGEubGVuZ3RoIT1udWxsKSxBcnJheS5wcm90b3R5cGUuc3BsaWNlLmNhbGwoYSxiLDEpO3JldHVybiBjfWZ1bmN0aW9uIHlhKGEpe3ZhciBiPWEubGVuZ3RoO2lmKGI+MCl7Zm9yKHZhciBjPUFycmF5KGIpLGQ9MDtkPGI7ZCsrKWNbZF09YVtkXTtyZXR1cm4gY31yZXR1cm5bXX1mdW5jdGlvbiB6YShhLGIsYyxkKXtwKGEubGVuZ3RoIT1udWxsKTtBcnJheS5wcm90b3R5cGUuc3BsaWNlLmFwcGx5KGEsQWEoYXJndW1lbnRzLDEpKX1mdW5jdGlvbiBBYShhLGIsYyl7cChhLmxlbmd0aCE9bnVsbCk7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg8PTI/QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYSxiKTpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhLGIsYyl9O2Z1bmN0aW9uIEJhKGEsYixjKXtmb3IodmFyIGQgaW4gYSliLmNhbGwoYyxhW2RdLGQsYSl9ZnVuY3Rpb24gQ2EoYSxiKXtmb3IodmFyIGMgaW4gYSlpZihhW2NdPT1iKXJldHVybiEwO3JldHVybiExfWZ1bmN0aW9uIERhKGEsYixjKXtpZihhIT09bnVsbCYmYiBpbiBhKXRocm93IEVycm9yKCdUaGUgb2JqZWN0IGFscmVhZHkgY29udGFpbnMgdGhlIGtleSAiJytiKyciJyk7YVtiXT1jfWZ1bmN0aW9uIEVhKGEpe3ZhciBiPXt9LGM7Zm9yKGMgaW4gYSliW2FbY11dPWM7cmV0dXJuIGJ9dmFyIEZhPSJjb25zdHJ1Y3RvciBoYXNPd25Qcm9wZXJ0eSBpc1Byb3RvdHlwZU9mIHByb3BlcnR5SXNFbnVtZXJhYmxlIHRvTG9jYWxlU3RyaW5nIHRvU3RyaW5nIHZhbHVlT2YiLnNwbGl0KCIgIik7CmZ1bmN0aW9uIEdhKGEsYil7Zm9yKHZhciBjLGQsZT0xO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspe2Q9YXJndW1lbnRzW2VdO2ZvcihjIGluIGQpYVtjXT1kW2NdO2Zvcih2YXIgZj0wO2Y8RmEubGVuZ3RoO2YrKyljPUZhW2ZdLE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChkLGMpJiYoYVtjXT1kW2NdKX19O3ZhciBIYT1TdHJpbmcucHJvdG90eXBlLnRyaW0/ZnVuY3Rpb24oYSl7cmV0dXJuIGEudHJpbSgpfTpmdW5jdGlvbihhKXtyZXR1cm4vXltcc1x4YTBdKihbXHNcU10qPylbXHNceGEwXSokLy5leGVjKGEpWzFdfTsvKgoKIENvcHlyaWdodCBHb29nbGUgTExDCiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMAoqLwp2YXIgSWE9e307dmFyIEphPWZ1bmN0aW9uKGEpe2lmKElhIT09SWEpdGhyb3cgRXJyb3IoIkJhZCBzZWNyZXQiKTt0aGlzLmc9YX07SmEucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ307bmV3IEphKCJhYm91dDpibGFuayIpO25ldyBKYSgiYWJvdXQ6aW52YWxpZCN6Q2xvc3VyZXoiKTt2YXIgS2E9W10sTGE9ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJBIFVSTCB3aXRoIGNvbnRlbnQgJyIrYSsiJyB3YXMgc2FuaXRpemVkIGF3YXkuIil9O0thLmluZGV4T2YoTGEpPT09LTEmJkthLnB1c2goTGEpO3ZhciBNYSxOYTthOntmb3IodmFyIE9hPVsiQ0xPU1VSRV9GTEFHUyJdLFBhPWwsUWE9MDtRYTxPYS5sZW5ndGg7UWErKylpZihQYT1QYVtPYVtRYV1dLFBhPT1udWxsKXtOYT1udWxsO2JyZWFrIGF9TmE9UGF9dmFyIFJhPU5hJiZOYVs2MTA0MDEzMDFdO01hPVJhIT1udWxsP1JhOiExO2Z1bmN0aW9uIFNhKCl7dmFyIGE9bC5uYXZpZ2F0b3I7cmV0dXJuIGEmJihhPWEudXNlckFnZW50KT9hOiIifXZhciBUYSxVYT1sLm5hdmlnYXRvcjtUYT1VYT9VYS51c2VyQWdlbnREYXRhfHxudWxsOm51bGw7ZnVuY3Rpb24gcihhKXtyZXR1cm4gU2EoKS5pbmRleE9mKGEpIT0tMX07dmFyIFZhPXIoIkVkZ2UiKSx0PXIoIkdlY2tvIikmJiEoU2EoKS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoIndlYmtpdCIpIT0tMSYmIXIoIkVkZ2UiKSkmJiEocigiVHJpZGVudCIpfHxyKCJNU0lFIikpJiYhcigiRWRnZSIpLHU9U2EoKS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoIndlYmtpdCIpIT0tMSYmIXIoIkVkZ2UiKSx2PU1hJiZUYSYmVGEucGxhdGZvcm0/VGEucGxhdGZvcm09PT0ibWFjT1MiOnIoIk1hY2ludG9zaCIpO3ZhciBYYT1mdW5jdGlvbihhLGIpe0JhKGIsZnVuY3Rpb24oYyxkKXtkPT0ic3R5bGUiP2Euc3R5bGUuY3NzVGV4dD1jOmQ9PSJjbGFzcyI/YS5jbGFzc05hbWU9YzpkPT0iZm9yIj9hLmh0bWxGb3I9YzpXYS5oYXNPd25Qcm9wZXJ0eShkKT9hLnNldEF0dHJpYnV0ZShXYVtkXSxjKTpkLmxhc3RJbmRleE9mKCJhcmlhLSIsMCk9PTB8fGQubGFzdEluZGV4T2YoImRhdGEtIiwwKT09MD9hLnNldEF0dHJpYnV0ZShkLGMpOmFbZF09Y30pfSxXYT17Y2VsbHBhZGRpbmc6ImNlbGxQYWRkaW5nIixjZWxsc3BhY2luZzoiY2VsbFNwYWNpbmciLGNvbHNwYW46ImNvbFNwYW4iLGZyYW1lYm9yZGVyOiJmcmFtZUJvcmRlciIsaGVpZ2h0OiJoZWlnaHQiLG1heGxlbmd0aDoibWF4TGVuZ3RoIixub25jZToibm9uY2UiLHJvbGU6InJvbGUiLHJvd3NwYW46InJvd1NwYW4iLHR5cGU6InR5cGUiLHVzZW1hcDoidXNlTWFwIix2YWxpZ246InZBbGlnbiIsd2lkdGg6IndpZHRoIn0sWWE9ZnVuY3Rpb24oYSwKYixjKXtmdW5jdGlvbiBkKGspe2smJmIuYXBwZW5kQ2hpbGQodHlwZW9mIGs9PT0ic3RyaW5nIj9hLmNyZWF0ZVRleHROb2RlKGspOmspfWZvcih2YXIgZT0yO2U8Yy5sZW5ndGg7ZSsrKXt2YXIgZj1jW2VdO2lmKCFrYShmKXx8bShmKSYmZi5ub2RlVHlwZT4wKWQoZik7ZWxzZXthOntpZihmJiZ0eXBlb2YgZi5sZW5ndGg9PSJudW1iZXIiKXtpZihtKGYpKXt2YXIgaD10eXBlb2YgZi5pdGVtPT0iZnVuY3Rpb24ifHx0eXBlb2YgZi5pdGVtPT0ic3RyaW5nIjticmVhayBhfWlmKHR5cGVvZiBmPT09ImZ1bmN0aW9uIil7aD10eXBlb2YgZi5pdGVtPT0iZnVuY3Rpb24iO2JyZWFrIGF9fWg9ITF9d2EoaD95YShmKTpmLGQpfX19LFphPWZ1bmN0aW9uKGEsYil7Yj1TdHJpbmcoYik7YS5jb250ZW50VHlwZT09PSJhcHBsaWNhdGlvbi94aHRtbCt4bWwiJiYoYj1iLnRvTG93ZXJDYXNlKCkpO3JldHVybiBhLmNyZWF0ZUVsZW1lbnQoYil9LCRhPWZ1bmN0aW9uKGEpe2EmJmEucGFyZW50Tm9kZSYmCmEucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhKX0sYWI9ZnVuY3Rpb24oYSxiKXtpZighYXx8IWIpcmV0dXJuITE7aWYoYS5jb250YWlucyYmYi5ub2RlVHlwZT09MSlyZXR1cm4gYT09Ynx8YS5jb250YWlucyhiKTtpZih0eXBlb2YgYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiE9InVuZGVmaW5lZCIpcmV0dXJuIGE9PWJ8fCEhKGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24oYikmMTYpO2Zvcig7YiYmYSE9YjspYj1iLnBhcmVudE5vZGU7cmV0dXJuIGI9PWF9LGJiPWZ1bmN0aW9uKGEpe3AoYSwiTm9kZSBjYW5ub3QgYmUgbnVsbCBvciB1bmRlZmluZWQuIik7cmV0dXJuIGEubm9kZVR5cGU9PTk/YTphLm93bmVyRG9jdW1lbnR8fGEuZG9jdW1lbnR9LGNiPWZ1bmN0aW9uKGEsYil7Yj9hLnRhYkluZGV4PTA6KGEudGFiSW5kZXg9LTEsYS5yZW1vdmVBdHRyaWJ1dGUoInRhYkluZGV4IikpfSxkYj1mdW5jdGlvbihhKXtyZXR1cm4gYS5oYXNBdHRyaWJ1dGUoInRhYmluZGV4Iil9LGViPQpmdW5jdGlvbihhKXthPWEudGFiSW5kZXg7cmV0dXJuIHR5cGVvZiBhPT09Im51bWJlciImJmE+PTAmJmE8MzI3Njh9LGZiPWZ1bmN0aW9uKGEpe3RoaXMuZz1hfHxsLmRvY3VtZW50fHxkb2N1bWVudH07ZmIucHJvdG90eXBlLmk9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nO3JldHVybiB0eXBlb2YgYT09PSJzdHJpbmciP2IuZ2V0RWxlbWVudEJ5SWQoYSk6YX07ZmIucHJvdG90eXBlLmg9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXMuZyxlPWFyZ3VtZW50cyxmPWVbMV0saD1aYShkLFN0cmluZyhlWzBdKSk7ZiYmKHR5cGVvZiBmPT09InN0cmluZyI/aC5jbGFzc05hbWU9ZjpBcnJheS5pc0FycmF5KGYpP2guY2xhc3NOYW1lPWYuam9pbigiICIpOlhhKGgsZikpO2UubGVuZ3RoPjImJllhKGQsaCxlKTtyZXR1cm4gaH07dmFyIHc9ZnVuY3Rpb24oKXt0aGlzLmJhPXRoaXMuYmE7dGhpcy5rYT10aGlzLmthfTt3LnByb3RvdHlwZS5iYT0hMTt3LnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7dGhpcy5iYXx8KHRoaXMuYmE9ITAsdGhpcy5DKCkpfTt3LnByb3RvdHlwZVtTeW1ib2wuZGlzcG9zZV09ZnVuY3Rpb24oKXt0aGlzLmRpc3Bvc2UoKX07dy5wcm90b3R5cGUuQz1mdW5jdGlvbigpe2lmKHRoaXMua2EpZm9yKDt0aGlzLmthLmxlbmd0aDspdGhpcy5rYS5zaGlmdCgpKCl9O3ZhciB5PWZ1bmN0aW9uKGEsYil7dGhpcy50eXBlPWE7dGhpcy51PXRoaXMudGFyZ2V0PWI7dGhpcy5kZWZhdWx0UHJldmVudGVkPXRoaXMuQT0hMX07eS5wcm90b3R5cGUudj1mdW5jdGlvbigpe3RoaXMuQT0hMH07eS5wcm90b3R5cGUuaj1mdW5jdGlvbigpe3RoaXMuZGVmYXVsdFByZXZlbnRlZD0hMH07dmFyIGdiPWZ1bmN0aW9uKCl7aWYoIWwuYWRkRXZlbnRMaXN0ZW5lcnx8IU9iamVjdC5kZWZpbmVQcm9wZXJ0eSlyZXR1cm4hMTt2YXIgYT0hMSxiPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwicGFzc2l2ZSIse2dldDpmdW5jdGlvbigpe2E9ITB9fSk7dHJ5e3ZhciBjPWZ1bmN0aW9uKCl7fTtsLmFkZEV2ZW50TGlzdGVuZXIoInRlc3QiLGMsYik7bC5yZW1vdmVFdmVudExpc3RlbmVyKCJ0ZXN0IixjLGIpfWNhdGNoKGQpe31yZXR1cm4gYX0oKTt2YXIgej1mdW5jdGlvbihhLGIpe3kuY2FsbCh0aGlzLGE/YS50eXBlOiIiKTt0aGlzLnJlbGF0ZWRUYXJnZXQ9dGhpcy51PXRoaXMudGFyZ2V0PW51bGw7dGhpcy5idXR0b249dGhpcy5zY3JlZW5ZPXRoaXMuc2NyZWVuWD10aGlzLmNsaWVudFk9dGhpcy5jbGllbnRYPTA7dGhpcy5rZXk9IiI7dGhpcy5nPTA7dGhpcy5tZXRhS2V5PXRoaXMuc2hpZnRLZXk9dGhpcy5hbHRLZXk9dGhpcy5jdHJsS2V5PSExO3RoaXMuc3RhdGU9bnVsbDt0aGlzLkc9ITE7dGhpcy5wb2ludGVySWQ9MDt0aGlzLnBvaW50ZXJUeXBlPSIiO3RoaXMudGltZVN0YW1wPTA7dGhpcy5oPW51bGw7aWYoYSl7dmFyIGM9dGhpcy50eXBlPWEudHlwZSxkPWEuY2hhbmdlZFRvdWNoZXMmJmEuY2hhbmdlZFRvdWNoZXMubGVuZ3RoP2EuY2hhbmdlZFRvdWNoZXNbMF06bnVsbDt0aGlzLnRhcmdldD1hLnRhcmdldHx8YS5zcmNFbGVtZW50O3RoaXMudT1iO2I9YS5yZWxhdGVkVGFyZ2V0O2J8fChjPT0ibW91c2VvdmVyIj8KYj1hLmZyb21FbGVtZW50OmM9PSJtb3VzZW91dCImJihiPWEudG9FbGVtZW50KSk7dGhpcy5yZWxhdGVkVGFyZ2V0PWI7ZD8odGhpcy5jbGllbnRYPWQuY2xpZW50WCE9PXZvaWQgMD9kLmNsaWVudFg6ZC5wYWdlWCx0aGlzLmNsaWVudFk9ZC5jbGllbnRZIT09dm9pZCAwP2QuY2xpZW50WTpkLnBhZ2VZLHRoaXMuc2NyZWVuWD1kLnNjcmVlblh8fDAsdGhpcy5zY3JlZW5ZPWQuc2NyZWVuWXx8MCk6KHRoaXMuY2xpZW50WD1hLmNsaWVudFghPT12b2lkIDA/YS5jbGllbnRYOmEucGFnZVgsdGhpcy5jbGllbnRZPWEuY2xpZW50WSE9PXZvaWQgMD9hLmNsaWVudFk6YS5wYWdlWSx0aGlzLnNjcmVlblg9YS5zY3JlZW5YfHwwLHRoaXMuc2NyZWVuWT1hLnNjcmVlbll8fDApO3RoaXMuYnV0dG9uPWEuYnV0dG9uO3RoaXMuZz1hLmtleUNvZGV8fDA7dGhpcy5rZXk9YS5rZXl8fCIiO3RoaXMuY3RybEtleT1hLmN0cmxLZXk7dGhpcy5hbHRLZXk9YS5hbHRLZXk7dGhpcy5zaGlmdEtleT1hLnNoaWZ0S2V5Owp0aGlzLm1ldGFLZXk9YS5tZXRhS2V5O3RoaXMuRz12P2EubWV0YUtleTphLmN0cmxLZXk7dGhpcy5wb2ludGVySWQ9YS5wb2ludGVySWR8fDA7dGhpcy5wb2ludGVyVHlwZT1hLnBvaW50ZXJUeXBlO3RoaXMuc3RhdGU9YS5zdGF0ZTt0aGlzLnRpbWVTdGFtcD1hLnRpbWVTdGFtcDt0aGlzLmg9YTthLmRlZmF1bHRQcmV2ZW50ZWQmJnoubC5qLmNhbGwodGhpcyl9fTtuKHoseSk7ei5wcm90b3R5cGUudj1mdW5jdGlvbigpe3oubC52LmNhbGwodGhpcyk7dGhpcy5oLnN0b3BQcm9wYWdhdGlvbj90aGlzLmguc3RvcFByb3BhZ2F0aW9uKCk6dGhpcy5oLmNhbmNlbEJ1YmJsZT0hMH07ei5wcm90b3R5cGUuaj1mdW5jdGlvbigpe3oubC5qLmNhbGwodGhpcyk7dmFyIGE9dGhpcy5oO2EucHJldmVudERlZmF1bHQ/YS5wcmV2ZW50RGVmYXVsdCgpOmEucmV0dXJuVmFsdWU9ITF9O3ZhciBoYj0iY2xvc3VyZV9saXN0ZW5hYmxlXyIrKE1hdGgucmFuZG9tKCkqMUU2fDApLGliPWZ1bmN0aW9uKGEpe3JldHVybiEoIWF8fCFhW2hiXSl9O3ZhciBqYj0wO3ZhciBrYj1mdW5jdGlvbihhLGIsYyxkLGUpe3RoaXMubGlzdGVuZXI9YTt0aGlzLnByb3h5PW51bGw7dGhpcy5zcmM9Yjt0aGlzLnR5cGU9Yzt0aGlzLmNhcHR1cmU9ISFkO3RoaXMucGE9ZTt0aGlzLmtleT0rK2piO3RoaXMuamE9dGhpcy5vYT0hMX0sbGI9ZnVuY3Rpb24oYSl7YS5qYT0hMDthLmxpc3RlbmVyPW51bGw7YS5wcm94eT1udWxsO2Euc3JjPW51bGw7YS5wYT1udWxsfTt2YXIgbWI9ZnVuY3Rpb24oYSl7dGhpcy5zcmM9YTt0aGlzLmc9e307dGhpcy5oPTB9O21iLnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZj1hLnRvU3RyaW5nKCk7YT10aGlzLmdbZl07YXx8KGE9dGhpcy5nW2ZdPVtdLHRoaXMuaCsrKTt2YXIgaD1uYihhLGIsZCxlKTtoPi0xPyhiPWFbaF0sY3x8KGIub2E9ITEpKTooYj1uZXcga2IoYix0aGlzLnNyYyxmLCEhZCxlKSxiLm9hPWMsYS5wdXNoKGIpKTtyZXR1cm4gYn07CnZhciBvYj1mdW5jdGlvbihhLGIpe3ZhciBjPWIudHlwZTtjIGluIGEuZyYmeGEoYS5nW2NdLGIpJiYobGIoYiksYS5nW2NdLmxlbmd0aD09MCYmKGRlbGV0ZSBhLmdbY10sYS5oLS0pKX0scGI9ZnVuY3Rpb24oYSxiLGMsZCxlKXthPWEuZ1tiLnRvU3RyaW5nKCldO2I9LTE7YSYmKGI9bmIoYSxjLGQsZSkpO3JldHVybiBiPi0xP2FbYl06bnVsbH0sbmI9ZnVuY3Rpb24oYSxiLGMsZCl7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDsrK2Upe3ZhciBmPWFbZV07aWYoIWYuamEmJmYubGlzdGVuZXI9PWImJmYuY2FwdHVyZT09ISFjJiZmLnBhPT1kKXJldHVybiBlfXJldHVybi0xfTt2YXIgcWI9ImNsb3N1cmVfbG1fIisoTWF0aC5yYW5kb20oKSoxRTZ8MCkscmI9e30sc2I9MCx1Yj1mdW5jdGlvbihhLGIsYyxkLGUpe2lmKGQmJmQub25jZSlyZXR1cm4gdGIoYSxiLGMsZCxlKTtpZihBcnJheS5pc0FycmF5KGIpKXtmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKyl1YihhLGJbZl0sYyxkLGUpO3JldHVybiBudWxsfWM9dmIoYyk7cmV0dXJuIGliKGEpP3diKGEsYixjLG0oZCk/ISFkLmNhcHR1cmU6ISFkLGUpOnhiKGEsYixjLCExLGQsZSl9LHhiPWZ1bmN0aW9uKGEsYixjLGQsZSxmKXtpZighYil0aHJvdyBFcnJvcigiSW52YWxpZCBldmVudCB0eXBlIik7dmFyIGg9bShlKT8hIWUuY2FwdHVyZTohIWUsaz15YihhKTtrfHwoYVtxYl09az1uZXcgbWIoYSkpO2M9ay5hZGQoYixjLGQsaCxmKTtpZihjLnByb3h5KXJldHVybiBjO2Q9emIoKTtjLnByb3h5PWQ7ZC5zcmM9YTtkLmxpc3RlbmVyPWM7aWYoYS5hZGRFdmVudExpc3RlbmVyKWdifHwoZT1oKSxlPT09dm9pZCAwJiYKKGU9ITEpLGEuYWRkRXZlbnRMaXN0ZW5lcihiLnRvU3RyaW5nKCksZCxlKTtlbHNlIGlmKGEuYXR0YWNoRXZlbnQpYS5hdHRhY2hFdmVudChBYihiLnRvU3RyaW5nKCkpLGQpO2Vsc2UgaWYoYS5hZGRMaXN0ZW5lciYmYS5yZW1vdmVMaXN0ZW5lcilwKGI9PT0iY2hhbmdlIiwiTWVkaWFRdWVyeUxpc3Qgb25seSBoYXMgYSBjaGFuZ2UgZXZlbnQiKSxhLmFkZExpc3RlbmVyKGQpO2Vsc2UgdGhyb3cgRXJyb3IoImFkZEV2ZW50TGlzdGVuZXIgYW5kIGF0dGFjaEV2ZW50IGFyZSB1bmF2YWlsYWJsZS4iKTtzYisrO3JldHVybiBjfSx6Yj1mdW5jdGlvbigpe3ZhciBhPUJiLGI9ZnVuY3Rpb24oYyl7cmV0dXJuIGEuY2FsbChiLnNyYyxiLmxpc3RlbmVyLGMpfTtyZXR1cm4gYn0sdGI9ZnVuY3Rpb24oYSxiLGMsZCxlKXtpZihBcnJheS5pc0FycmF5KGIpKXtmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKyl0YihhLGJbZl0sYyxkLGUpO3JldHVybiBudWxsfWM9dmIoYyk7cmV0dXJuIGliKGEpPwphLkEuYWRkKFN0cmluZyhiKSxjLCEwLG0oZCk/ISFkLmNhcHR1cmU6ISFkLGUpOnhiKGEsYixjLCEwLGQsZSl9LENiPWZ1bmN0aW9uKGEsYixjLGQsZSl7aWYoQXJyYXkuaXNBcnJheShiKSlmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKylDYihhLGJbZl0sYyxkLGUpO2Vsc2UgZD1tKGQpPyEhZC5jYXB0dXJlOiEhZCxjPXZiKGMpLGliKGEpPyhhPWEuQSxiPVN0cmluZyhiKS50b1N0cmluZygpLGIgaW4gYS5nJiYoZj1hLmdbYl0sYz1uYihmLGMsZCxlKSxjPi0xJiYobGIoZltjXSkscChmLmxlbmd0aCE9bnVsbCksQXJyYXkucHJvdG90eXBlLnNwbGljZS5jYWxsKGYsYywxKSxmLmxlbmd0aD09MCYmKGRlbGV0ZSBhLmdbYl0sYS5oLS0pKSkpOmEmJihhPXliKGEpKSYmKGM9cGIoYSxiLGMsZCxlKSkmJkEoYyl9LEE9ZnVuY3Rpb24oYSl7aWYodHlwZW9mIGEhPT0ibnVtYmVyIiYmYSYmIWEuamEpe3ZhciBiPWEuc3JjO2lmKGliKGIpKW9iKGIuQSxhKTtlbHNle3ZhciBjPWEudHlwZSwKZD1hLnByb3h5O2IucmVtb3ZlRXZlbnRMaXN0ZW5lcj9iLnJlbW92ZUV2ZW50TGlzdGVuZXIoYyxkLGEuY2FwdHVyZSk6Yi5kZXRhY2hFdmVudD9iLmRldGFjaEV2ZW50KEFiKGMpLGQpOmIuYWRkTGlzdGVuZXImJmIucmVtb3ZlTGlzdGVuZXImJmIucmVtb3ZlTGlzdGVuZXIoZCk7c2ItLTsoYz15YihiKSk/KG9iKGMsYSksYy5oPT0wJiYoYy5zcmM9bnVsbCxiW3FiXT1udWxsKSk6bGIoYSl9fX0sQWI9ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW4gcmI/cmJbYV06cmJbYV09Im9uIithfSxCYj1mdW5jdGlvbihhLGIpe2lmKGEuamEpYT0hMDtlbHNle2I9bmV3IHooYix0aGlzKTt2YXIgYz1hLmxpc3RlbmVyLGQ9YS5wYXx8YS5zcmM7YS5vYSYmQShhKTthPWMuY2FsbChkLGIpfXJldHVybiBhfSx5Yj1mdW5jdGlvbihhKXthPWFbcWJdO3JldHVybiBhIGluc3RhbmNlb2YgbWI/YTpudWxsfSxEYj0iX19jbG9zdXJlX2V2ZW50c19mbl8iKyhNYXRoLnJhbmRvbSgpKjFFOT4+PjApLHZiPWZ1bmN0aW9uKGEpe3AoYSwKIkxpc3RlbmVyIGNhbiBub3QgYmUgbnVsbC4iKTtpZih0eXBlb2YgYT09PSJmdW5jdGlvbiIpcmV0dXJuIGE7cChhLmhhbmRsZUV2ZW50LCJBbiBvYmplY3QgbGlzdGVuZXIgbXVzdCBoYXZlIGhhbmRsZUV2ZW50IG1ldGhvZC4iKTthW0RiXXx8KGFbRGJdPWZ1bmN0aW9uKGIpe3JldHVybiBhLmhhbmRsZUV2ZW50KGIpfSk7cmV0dXJuIGFbRGJdfTt2YXIgRWI9ZnVuY3Rpb24oYSl7dy5jYWxsKHRoaXMpO3RoaXMuaD1hO3RoaXMuZz17fX07bihFYix3KTsKdmFyIEZiPVtdLEI9ZnVuY3Rpb24oYSxiLGMsZCl7QXJyYXkuaXNBcnJheShjKXx8KGMmJihGYlswXT1jLnRvU3RyaW5nKCkpLGM9RmIpO2Zvcih2YXIgZT0wO2U8Yy5sZW5ndGg7ZSsrKXt2YXIgZj11YihiLGNbZV0sZHx8YS5oYW5kbGVFdmVudCwhMSxhLmh8fGEpO2lmKCFmKWJyZWFrO2EuZ1tmLmtleV09Zn1yZXR1cm4gYX0sQz1mdW5jdGlvbihhLGIsYyxkLGUsZil7aWYoQXJyYXkuaXNBcnJheShjKSlmb3IodmFyIGg9MDtoPGMubGVuZ3RoO2grKylDKGEsYixjW2hdLGQsZSxmKTtlbHNlIGQ9ZHx8YS5oYW5kbGVFdmVudCxlPW0oZSk/ISFlLmNhcHR1cmU6ISFlLGY9Znx8YS5ofHxhLGQ9dmIoZCksZT0hIWUsYz1pYihiKT9wYihiLkEsU3RyaW5nKGMpLGQsZSxmKTpiPyhiPXliKGIpKT9wYihiLGMsZCxlLGYpOm51bGw6bnVsbCxjJiYoQShjKSxkZWxldGUgYS5nW2Mua2V5XSk7cmV0dXJuIGF9LEdiPWZ1bmN0aW9uKGEpe0JhKGEuZyxmdW5jdGlvbihiLGMpe3RoaXMuZy5oYXNPd25Qcm9wZXJ0eShjKSYmCkEoYil9LGEpO2EuZz17fX07RWIucHJvdG90eXBlLkM9ZnVuY3Rpb24oKXtFYi5sLkMuY2FsbCh0aGlzKTtHYih0aGlzKX07RWIucHJvdG90eXBlLmhhbmRsZUV2ZW50PWZ1bmN0aW9uKCl7dGhyb3cgRXJyb3IoIkV2ZW50SGFuZGxlci5oYW5kbGVFdmVudCBub3QgaW1wbGVtZW50ZWQiKTt9O3ZhciBEPWZ1bmN0aW9uKCl7dy5jYWxsKHRoaXMpO3RoaXMuQT1uZXcgbWIodGhpcyk7dGhpcy5ZYT10aGlzO3RoaXMubGE9bnVsbH07bihELHcpO0QucHJvdG90eXBlW2hiXT0hMDtELnByb3RvdHlwZS5BYT1mdW5jdGlvbihhKXt0aGlzLmxhPWF9O0QucHJvdG90eXBlLnJlbW92ZUV2ZW50TGlzdGVuZXI9ZnVuY3Rpb24oYSxiLGMsZCl7Q2IodGhpcyxhLGIsYyxkKX07CnZhciBFPWZ1bmN0aW9uKGEsYil7SGIoYSk7dmFyIGM9YS5sYTtpZihjKXt2YXIgZD1bXTtmb3IodmFyIGU9MTtjO2M9Yy5sYSlkLnB1c2goYykscCgrK2U8MUUzLCJpbmZpbml0ZSBsb29wIil9YT1hLllhO2M9Yi50eXBlfHxiO3R5cGVvZiBiPT09InN0cmluZyI/Yj1uZXcgeShiLGEpOmIgaW5zdGFuY2VvZiB5P2IudGFyZ2V0PWIudGFyZ2V0fHxhOihlPWIsYj1uZXcgeShjLGEpLEdhKGIsZSkpO2U9ITA7dmFyIGY7aWYoZClmb3IoZj1kLmxlbmd0aC0xOyFiLkEmJmY+PTA7Zi0tKXt2YXIgaD1iLnU9ZFtmXTtlPUliKGgsYywhMCxiKSYmZX1iLkF8fChoPWIudT1hLGU9SWIoaCxjLCEwLGIpJiZlLGIuQXx8KGU9SWIoaCxjLCExLGIpJiZlKSk7aWYoZClmb3IoZj0wOyFiLkEmJmY8ZC5sZW5ndGg7ZisrKWg9Yi51PWRbZl0sZT1JYihoLGMsITEsYikmJmU7cmV0dXJuIGV9OwpELnByb3RvdHlwZS5DPWZ1bmN0aW9uKCl7RC5sLkMuY2FsbCh0aGlzKTtpZih0aGlzLkEpe3ZhciBhPXRoaXMuQSxiPTAsYztmb3IoYyBpbiBhLmcpe2Zvcih2YXIgZD1hLmdbY10sZT0wO2U8ZC5sZW5ndGg7ZSsrKSsrYixsYihkW2VdKTtkZWxldGUgYS5nW2NdO2EuaC0tfX10aGlzLmxhPW51bGx9O3ZhciB3Yj1mdW5jdGlvbihhLGIsYyxkLGUpe0hiKGEpO3JldHVybiBhLkEuYWRkKFN0cmluZyhiKSxjLCExLGQsZSl9LEliPWZ1bmN0aW9uKGEsYixjLGQpe2I9YS5BLmdbU3RyaW5nKGIpXTtpZighYilyZXR1cm4hMDtiPWIuY29uY2F0KCk7Zm9yKHZhciBlPSEwLGY9MDtmPGIubGVuZ3RoOysrZil7dmFyIGg9YltmXTtpZihoJiYhaC5qYSYmaC5jYXB0dXJlPT1jKXt2YXIgaz1oLmxpc3RlbmVyLHE9aC5wYXx8aC5zcmM7aC5vYSYmb2IoYS5BLGgpO2U9ay5jYWxsKHEsZCkhPT0hMSYmZX19cmV0dXJuIGUmJiFkLmRlZmF1bHRQcmV2ZW50ZWR9LEhiPWZ1bmN0aW9uKGEpe3AoYS5BLCJFdmVudCB0YXJnZXQgaXMgbm90IGluaXRpYWxpemVkLiBEaWQgeW91IGNhbGwgdGhlIHN1cGVyY2xhc3MgKGdvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0KSBjb25zdHJ1Y3Rvcj8iKX07dmFyIEpiPXQ/Ik1velVzZXJTZWxlY3QiOnV8fFZhPyJXZWJraXRVc2VyU2VsZWN0IjpudWxsLEtiPWZ1bmN0aW9uKGEsYil7Yj1iP251bGw6YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpO2lmKEpiJiYoYS5zdHlsZSYmKGEuc3R5bGVbSmJdPSJub25lIiksYikpZm9yKHZhciBjPTA7YT1iW2NdO2MrKylhLnN0eWxlJiYoYS5zdHlsZVtKYl09Im5vbmUiKX07dmFyIExiPWZ1bmN0aW9uKCl7fTtpYShMYik7TGIucHJvdG90eXBlLmc9MDt2YXIgRj1mdW5jdGlvbihhKXtELmNhbGwodGhpcyk7dGhpcy5HPWF8fHBhfHwocGE9bmV3IGZiKTt0aGlzLnphPU1iO3RoaXMuWT1udWxsO3RoaXMucz0hMTt0aGlzLmc9bnVsbDt0aGlzLk09dm9pZCAwO3RoaXMudT10aGlzLmo9dGhpcy5oPW51bGw7dGhpcy5TYT0hMX07bihGLEQpO0YucHJvdG90eXBlLlphPUxiLlYoKTsKdmFyIE1iPW51bGwsTmI9ZnVuY3Rpb24oYSxiKXtzd2l0Y2goYSl7Y2FzZSAxOnJldHVybiBiPyJkaXNhYmxlIjoiZW5hYmxlIjtjYXNlIDI6cmV0dXJuIGI/ImhpZ2hsaWdodCI6InVuaGlnaGxpZ2h0IjtjYXNlIDQ6cmV0dXJuIGI/ImFjdGl2YXRlIjoiZGVhY3RpdmF0ZSI7Y2FzZSA4OnJldHVybiBiPyJzZWxlY3QiOiJ1bnNlbGVjdCI7Y2FzZSAxNjpyZXR1cm4gYj8iY2hlY2siOiJ1bmNoZWNrIjtjYXNlIDMyOnJldHVybiBiPyJmb2N1cyI6ImJsdXIiO2Nhc2UgNjQ6cmV0dXJuIGI/Im9wZW4iOiJjbG9zZSJ9dGhyb3cgRXJyb3IoIkludmFsaWQgY29tcG9uZW50IHN0YXRlIik7fSxPYj1mdW5jdGlvbihhKXtyZXR1cm4gYS5ZfHwoYS5ZPSI6IisoYS5aYS5nKyspLnRvU3RyaW5nKDM2KSl9LFBiPWZ1bmN0aW9uKGEsYil7aWYoYS5oJiZhLmgudSl7dmFyIGM9YS5oLnUsZD1hLlk7ZCBpbiBjJiZkZWxldGUgY1tkXTtEYShhLmgudSxiLGEpfWEuWT1ifTtGLnByb3RvdHlwZS5pPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ307CnZhciBRYj1mdW5jdGlvbihhKXthLk18fChhLk09bmV3IEViKGEpKTtyZXR1cm4gcChhLk0pfTtGLnByb3RvdHlwZS5BYT1mdW5jdGlvbihhKXtpZih0aGlzLmgmJnRoaXMuaCE9YSl0aHJvdyBFcnJvcigiTWV0aG9kIG5vdCBzdXBwb3J0ZWQiKTtGLmwuQWEuY2FsbCh0aGlzLGEpfTtGLnByb3RvdHlwZS5tYT1mdW5jdGlvbigpe3RoaXMuZz1aYSh0aGlzLkcuZywiRElWIil9O0YucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbihhKXtSYih0aGlzLGEpfTsKdmFyIFJiPWZ1bmN0aW9uKGEsYixjKXtpZihhLnMpdGhyb3cgRXJyb3IoIkNvbXBvbmVudCBhbHJlYWR5IHJlbmRlcmVkIik7YS5nfHxhLm1hKCk7Yj9iLmluc2VydEJlZm9yZShhLmcsY3x8bnVsbCk6YS5HLmcuYm9keS5hcHBlbmRDaGlsZChhLmcpO2EuaCYmIWEuaC5zfHxhLkkoKX0sU2I9ZnVuY3Rpb24oYSxiKXtpZihhLnMpdGhyb3cgRXJyb3IoIkNvbXBvbmVudCBhbHJlYWR5IHJlbmRlcmVkIik7aWYoYiYmYS53YShiKSl7YS5TYT0hMDt2YXIgYz1iYihiKTthLkcmJmEuRy5nPT1jfHwoYS5HPWI/bmV3IGZiKGJiKGIpKTpwYXx8KHBhPW5ldyBmYikpO2EuRWEoYik7YS5JKCl9ZWxzZSB0aHJvdyBFcnJvcigiSW52YWxpZCBlbGVtZW50IHRvIGRlY29yYXRlIik7fTtnPUYucHJvdG90eXBlO2cud2E9ZnVuY3Rpb24oKXtyZXR1cm4hMH07Zy5FYT1mdW5jdGlvbihhKXt0aGlzLmc9YX07CmcuST1mdW5jdGlvbigpe3RoaXMucz0hMDtUYih0aGlzLGZ1bmN0aW9uKGEpeyFhLnMmJmEuaSgpJiZhLkkoKX0pfTtnLlU9ZnVuY3Rpb24oKXtUYih0aGlzLGZ1bmN0aW9uKGEpe2EucyYmYS5VKCl9KTt0aGlzLk0mJkdiKHRoaXMuTSk7dGhpcy5zPSExfTtnLkM9ZnVuY3Rpb24oKXt0aGlzLnMmJnRoaXMuVSgpO3RoaXMuTSYmKHRoaXMuTS5kaXNwb3NlKCksZGVsZXRlIHRoaXMuTSk7VGIodGhpcyxmdW5jdGlvbihhKXthLmRpc3Bvc2UoKX0pOyF0aGlzLlNhJiZ0aGlzLmcmJiRhKHRoaXMuZyk7dGhpcy5oPXRoaXMuZz10aGlzLnU9dGhpcy5qPW51bGw7Ri5sLkMuY2FsbCh0aGlzKX07Zy5CYT1mdW5jdGlvbihhLGIpe3RoaXMuQ2EoYSxIKHRoaXMpLGIpfTsKZy5DYT1mdW5jdGlvbihhLGIsYyl7cCghIWEsIlByb3ZpZGVkIGVsZW1lbnQgbXVzdCBub3QgYmUgbnVsbC4iKTtpZihhLnMmJihjfHwhdGhpcy5zKSl0aHJvdyBFcnJvcigiQ29tcG9uZW50IGFscmVhZHkgcmVuZGVyZWQiKTtpZihiPDB8fGI+SCh0aGlzKSl0aHJvdyBFcnJvcigiQ2hpbGQgY29tcG9uZW50IGluZGV4IG91dCBvZiBib3VuZHMiKTt0aGlzLnUmJnRoaXMuanx8KHRoaXMudT17fSx0aGlzLmo9W10pO2lmKGEuaD09dGhpcyl7dmFyIGQ9dGhpcy51LGU9T2IoYSk7ZFtlXT1hO3hhKHRoaXMuaixhKX1lbHNlIERhKHRoaXMudSxPYihhKSxhKTtpZihhPT10aGlzKXRocm93IEVycm9yKCJVbmFibGUgdG8gc2V0IHBhcmVudCBjb21wb25lbnQiKTtpZihkPXRoaXMmJmEuaCYmYS5ZKWU9YS5oLGQ9YS5ZLGUudSYmZD8oZT1lLnUsZD0oZSE9PW51bGwmJmQgaW4gZT9lW2RdOnZvaWQgMCl8fG51bGwpOmQ9bnVsbDtpZihkJiZhLmghPXRoaXMpdGhyb3cgRXJyb3IoIlVuYWJsZSB0byBzZXQgcGFyZW50IGNvbXBvbmVudCIpOwphLmg9dGhpcztGLmwuQWEuY2FsbChhLHRoaXMpO3phKHRoaXMuaixiLDAsYSk7YS5zJiZ0aGlzLnMmJmEuaD09dGhpcz8oYz10aGlzLm5hKCksKGMuY2hpbGROb2Rlc1tiXXx8bnVsbCkhPWEuaSgpJiYoYS5pKCkucGFyZW50RWxlbWVudD09YyYmYy5yZW1vdmVDaGlsZChhLmkoKSksYj1jLmNoaWxkTm9kZXNbYl18fG51bGwsYy5pbnNlcnRCZWZvcmUoYS5pKCksYikpKTpjPyh0aGlzLmd8fHRoaXMubWEoKSxiPUkodGhpcyxiKzEpLFJiKGEsdGhpcy5uYSgpLGI/Yi5nOm51bGwpKTp0aGlzLnMmJiFhLnMmJmEuZyYmYS5nLnBhcmVudE5vZGUmJmEuZy5wYXJlbnROb2RlLm5vZGVUeXBlPT0xJiZhLkkoKX07Zy5uYT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmd9Owp2YXIgVWI9ZnVuY3Rpb24oYSl7aWYoYS56YT09bnVsbCl7dmFyIGI9YS5zP2EuZzphLkcuZy5ib2R5O2E6e3ZhciBjPWJiKGIpO2lmKGMuZGVmYXVsdFZpZXcmJmMuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSYmKGM9Yy5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKGIsbnVsbCkpKXtjPWMuZGlyZWN0aW9ufHxjLmdldFByb3BlcnR5VmFsdWUoImRpcmVjdGlvbiIpfHwiIjticmVhayBhfWM9IiJ9YS56YT0icnRsIj09KGN8fChiLmN1cnJlbnRTdHlsZT9iLmN1cnJlbnRTdHlsZS5kaXJlY3Rpb246bnVsbCl8fGIuc3R5bGUmJmIuc3R5bGUuZGlyZWN0aW9uKX1yZXR1cm4gYS56YX0sSD1mdW5jdGlvbihhKXtyZXR1cm4gYS5qP2Euai5sZW5ndGg6MH0sST1mdW5jdGlvbihhLGIpe3JldHVybiBhLmo/YS5qW2JdfHxudWxsOm51bGx9LFRiPWZ1bmN0aW9uKGEsYixjKXthLmomJmEuai5mb3JFYWNoKGIsYyl9LFZiPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuaiYmYj9hLmouaW5kZXhPZihiKToKLTF9O3ZhciBXYj17bWI6ImFjdGl2ZWRlc2NlbmRhbnQiLHJiOiJhdG9taWMiLHNiOiJhdXRvY29tcGxldGUiLHViOiJidXN5Iix4YjoiY2hlY2tlZCIseWI6ImNvbGluZGV4IixEYjoiY29udHJvbHMiLEViOiJjdXJyZW50IixHYjoiZGVzY3JpYmVkYnkiLEpiOiJkaXNhYmxlZCIsTGI6ImRyb3BlZmZlY3QiLE1iOiJleHBhbmRlZCIsTmI6ImZsb3d0byIsUGI6ImdyYWJiZWQiLFRiOiJoYXNwb3B1cCIsVmI6ImhpZGRlbiIsWGI6ImludmFsaWQiLFliOiJsYWJlbCIsWmI6ImxhYmVsbGVkYnkiLGFjOiJsZXZlbCIsZmM6ImxpdmUiLHZjOiJtdWx0aWxpbmUiLHdjOiJtdWx0aXNlbGVjdGFibGUiLEFjOiJvcmllbnRhdGlvbiIsQmM6Im93bnMiLENjOiJwb3NpbnNldCIsRWM6InByZXNzZWQiLEljOiJyZWFkb25seSIsS2M6InJlbGV2YW50IixMYzoicmVxdWlyZWQiLFBjOiJyb3dpbmRleCIsU2M6InNlbGVjdGVkIixVYzoic2V0c2l6ZSIsV2M6InNvcnQiLG1kOiJ2YWx1ZW1heCIsbmQ6InZhbHVlbWluIiwKb2Q6InZhbHVlbm93IixwZDoidmFsdWV0ZXh0In07dmFyIFhiO3ZhciBZYj17bmI6ImFsZXJ0IixvYjoiYWxlcnRkaWFsb2ciLHBiOiJhcHBsaWNhdGlvbiIscWI6ImFydGljbGUiLHRiOiJiYW5uZXIiLHZiOiJidXR0b24iLHdiOiJjaGVja2JveCIsemI6ImNvbHVtbmhlYWRlciIsQWI6ImNvbWJvYm94IixCYjoiY29tcGxlbWVudGFyeSIsQ2I6ImNvbnRlbnRpbmZvIixGYjoiZGVmaW5pdGlvbiIsSGI6ImRpYWxvZyIsSWI6ImRpcmVjdG9yeSIsS2I6ImRvY3VtZW50IixPYjoiZm9ybSIsUWI6ImdyaWQiLFJiOiJncmlkY2VsbCIsU2I6Imdyb3VwIixVYjoiaGVhZGluZyIsV2I6ImltZyIsYmM6ImxpbmsiLGNjOiJsaXN0IixkYzoibGlzdGJveCIsZWM6Imxpc3RpdGVtIixoYzoibG9nIixpYzoibWFpbiIsamM6Im1hcnF1ZWUiLGtjOiJtYXRoIixsYzoibWVudSIsbWM6Im1lbnViYXIiLG5jOiJtZW51aXRlbSIsb2M6Im1lbnVpdGVtY2hlY2tib3giLHBjOiJtZW51aXRlbXJhZGlvIix4YzoibmF2aWdhdGlvbiIseWM6Im5vdGUiLHpjOiJvcHRpb24iLApEYzoicHJlc2VudGF0aW9uIixGYzoicHJvZ3Jlc3NiYXIiLEdjOiJyYWRpbyIsSGM6InJhZGlvZ3JvdXAiLEpjOiJyZWdpb24iLE1jOiJyb3ciLE5jOiJyb3dncm91cCIsT2M6InJvd2hlYWRlciIsUWM6InNjcm9sbGJhciIsUmM6InNlYXJjaCIsVGM6InNlcGFyYXRvciIsVmM6InNsaWRlciIsWGM6InNwaW5idXR0b24iLFljOiJzdGF0dXMiLFpjOiJzd2l0Y2giLGFkOiJ0YWIiLGJkOiJ0YWJsaXN0IixjZDoidGFicGFuZWwiLGRkOiJ0ZXh0Ym94IixlZDoidGV4dGluZm8iLGZkOiJ0aW1lciIsZ2Q6InRvb2xiYXIiLGhkOiJ0b29sdGlwIixqZDoidHJlZSIsa2Q6InRyZWVncmlkIixsZDoidHJlZWl0ZW0ifTt2YXIgWmI9ZnVuY3Rpb24oYSxiKXtiPyhwKENhKFliLGIpLCJObyBzdWNoIEFSSUEgcm9sZSAiK2IpLGEuc2V0QXR0cmlidXRlKCJyb2xlIixiKSk6YS5yZW1vdmVBdHRyaWJ1dGUoInJvbGUiKX0sYWM9ZnVuY3Rpb24oYSxiLGMpe0FycmF5LmlzQXJyYXkoYykmJihjPWMuam9pbigiICIpKTt2YXIgZD0kYihiKTtjPT09IiJ8fGM9PXZvaWQgMD8oWGJ8fChjPXt9LFhiPShjLmF0b21pYz0hMSxjLmF1dG9jb21wbGV0ZT0ibm9uZSIsYy5kcm9wZWZmZWN0PSJub25lIixjLmhhc3BvcHVwPSExLGMubGl2ZT0ib2ZmIixjLm11bHRpbGluZT0hMSxjLm11bHRpc2VsZWN0YWJsZT0hMSxjLm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIsYy5yZWFkb25seT0hMSxjLnJlbGV2YW50PSJhZGRpdGlvbnMgdGV4dCIsYy5yZXF1aXJlZD0hMSxjLnNvcnQ9Im5vbmUiLGMuYnVzeT0hMSxjLmRpc2FibGVkPSExLGMuaGlkZGVuPSExLGMuaW52YWxpZD0iZmFsc2UiLGMpKSxjPVhiLGIgaW4gYz9hLnNldEF0dHJpYnV0ZShkLApjW2JdKTphLnJlbW92ZUF0dHJpYnV0ZShkKSk6YS5zZXRBdHRyaWJ1dGUoZCxjKX0sJGI9ZnVuY3Rpb24oYSl7cChhLCJBUklBIGF0dHJpYnV0ZSBjYW5ub3QgYmUgZW1wdHkuIik7cChDYShXYixhKSwiTm8gc3VjaCBBUklBIGF0dHJpYnV0ZSAiK2EpO3JldHVybiJhcmlhLSIrYX07dmFyIGRjPWZ1bmN0aW9uKGEsYixjLGQsZSxmKXtpZih2JiZlKXJldHVybiBiYyhhKTtpZihlJiYhZClyZXR1cm4hMTtpZighdCl7dHlwZW9mIGI9PT0ibnVtYmVyIiYmKGI9Y2MoYikpO3ZhciBoPWI9PTE3fHxiPT0xOHx8diYmYj09OTE7aWYoKCFjfHx2KSYmaHx8diYmYj09MTYmJihkfHxmKSlyZXR1cm4hMX1pZih1JiZkJiZjKXN3aXRjaChhKXtjYXNlIDIyMDpjYXNlIDIxOTpjYXNlIDIyMTpjYXNlIDE5MjpjYXNlIDE4NjpjYXNlIDE4OTpjYXNlIDE4NzpjYXNlIDE4ODpjYXNlIDE5MDpjYXNlIDE5MTpjYXNlIDE5MjpjYXNlIDIyMjpyZXR1cm4hMX1zd2l0Y2goYSl7Y2FzZSAxMzpyZXR1cm4gdD9mfHxlPyExOiEoYyYmZCk6ITA7Y2FzZSAyNzpyZXR1cm4hdSYmIXR9cmV0dXJuIHQmJihkfHxlfHxmKT8hMTpiYyhhKX0sYmM9ZnVuY3Rpb24oYSl7aWYoYT49NDgmJmE8PTU3fHxhPj05NiYmYTw9MTA2fHxhPj02NSYmYTw9OTB8fHUmJmE9PTApcmV0dXJuITA7c3dpdGNoKGEpe2Nhc2UgMzI6Y2FzZSA0MzpjYXNlIDYzOmNhc2UgNjQ6Y2FzZSAxMDc6Y2FzZSAxMDk6Y2FzZSAxMTA6Y2FzZSAxMTE6Y2FzZSAxODY6Y2FzZSA1OTpjYXNlIDE4OTpjYXNlIDE4NzpjYXNlIDYxOmNhc2UgMTg4OmNhc2UgMTkwOmNhc2UgMTkxOmNhc2UgMTkyOmNhc2UgMjIyOmNhc2UgMjE5OmNhc2UgMjIwOmNhc2UgMjIxOmNhc2UgMTYzOmNhc2UgNTg6cmV0dXJuITA7CmNhc2UgMTczOmNhc2UgMTcxOnJldHVybiB0O2RlZmF1bHQ6cmV0dXJuITF9fSxjYz1mdW5jdGlvbihhKXtpZih0KWE9ZWMoYSk7ZWxzZSBpZih2JiZ1KXN3aXRjaChhKXtjYXNlIDkzOmE9OTF9cmV0dXJuIGF9LGVjPWZ1bmN0aW9uKGEpe3N3aXRjaChhKXtjYXNlIDYxOnJldHVybiAxODc7Y2FzZSA1OTpyZXR1cm4gMTg2O2Nhc2UgMTczOnJldHVybiAxODk7Y2FzZSAyMjQ6cmV0dXJuIDkxO2Nhc2UgMDpyZXR1cm4gMjI0O2RlZmF1bHQ6cmV0dXJuIGF9fTt2YXIgZmM9ZnVuY3Rpb24oYSxiLGMsZCl7ei5jYWxsKHRoaXMsZCk7dGhpcy50eXBlPSJrZXkiO3RoaXMuZz1hO3RoaXMucmVwZWF0PWN9O24oZmMseik7dmFyIEo9ZnVuY3Rpb24oYSxiKXtELmNhbGwodGhpcyk7YSYmZ2ModGhpcyxhLGIpfTtuKEosRCk7Zz1KLnByb3RvdHlwZTtnLlI9bnVsbDtnLnFhPW51bGw7Zy5KYT1udWxsO2cucmE9bnVsbDtnLkY9LTE7Zy5LPS0xO2cuRGE9ITE7CnZhciBoYz17MzoxMywxMjoxNDQsNjMyMzI6MzgsNjMyMzM6NDAsNjMyMzQ6MzcsNjMyMzU6MzksNjMyMzY6MTEyLDYzMjM3OjExMyw2MzIzODoxMTQsNjMyMzk6MTE1LDYzMjQwOjExNiw2MzI0MToxMTcsNjMyNDI6MTE4LDYzMjQzOjExOSw2MzI0NDoxMjAsNjMyNDU6MTIxLDYzMjQ2OjEyMiw2MzI0NzoxMjMsNjMyNDg6NDQsNjMyNzI6NDYsNjMyNzM6MzYsNjMyNzU6MzUsNjMyNzY6MzMsNjMyNzc6MzQsNjMyODk6MTQ0LDYzMzAyOjQ1fSxpYz17VXA6MzgsRG93bjo0MCxMZWZ0OjM3LFJpZ2h0OjM5LEVudGVyOjEzLEYxOjExMixGMjoxMTMsRjM6MTE0LEY0OjExNSxGNToxMTYsRjY6MTE3LEY3OjExOCxGODoxMTksRjk6MTIwLEYxMDoxMjEsRjExOjEyMixGMTI6MTIzLCJVKzAwN0YiOjQ2LEhvbWU6MzYsRW5kOjM1LFBhZ2VVcDozMyxQYWdlRG93bjozNCxJbnNlcnQ6NDV9LGpjPXYmJnQ7CkoucHJvdG90eXBlLmc9ZnVuY3Rpb24oYSl7dSYmKHRoaXMuRj09MTcmJiFhLmN0cmxLZXl8fHRoaXMuRj09MTgmJiFhLmFsdEtleXx8diYmdGhpcy5GPT05MSYmIWEubWV0YUtleSkmJih0aGlzLks9dGhpcy5GPS0xKTt0aGlzLkY9PS0xJiYoYS5jdHJsS2V5JiZhLmchPTE3P3RoaXMuRj0xNzphLmFsdEtleSYmYS5nIT0xOD90aGlzLkY9MTg6YS5tZXRhS2V5JiZhLmchPTkxJiYodGhpcy5GPTkxKSk7ZGMoYS5nLHRoaXMuRixhLnNoaWZ0S2V5LGEuY3RybEtleSxhLmFsdEtleSxhLm1ldGFLZXkpPyh0aGlzLks9Y2MoYS5nKSxqYyYmKHRoaXMuRGE9YS5hbHRLZXkpKTp0aGlzLmhhbmRsZUV2ZW50KGEpfTtKLnByb3RvdHlwZS5oPWZ1bmN0aW9uKGEpe3RoaXMuSz10aGlzLkY9LTE7dGhpcy5EYT1hLmFsdEtleX07CkoucHJvdG90eXBlLmhhbmRsZUV2ZW50PWZ1bmN0aW9uKGEpe3ZhciBiPWEuaCxjPWIuYWx0S2V5O2lmKHUmJmEudHlwZT09ImtleXByZXNzIil7dmFyIGQ9dGhpcy5LO3ZhciBlPWIuY2hhckNvZGU+PTAmJmIuY2hhckNvZGU8NjMyMzImJmJjKGQpP2IuY2hhckNvZGU6MH1lbHNlIGEudHlwZT09ImtleXByZXNzIj8oamMmJihjPXRoaXMuRGEpLGIua2V5Q29kZT09Yi5jaGFyQ29kZT9iLmtleUNvZGU8MzI/KGQ9Yi5rZXlDb2RlLGU9MCk6KGQ9dGhpcy5LLGU9Yi5jaGFyQ29kZSk6KGQ9Yi5rZXlDb2RlfHx0aGlzLkssZT1iLmNoYXJDb2RlfHwwKSk6KGQ9Yi5rZXlDb2RlfHx0aGlzLkssZT1iLmNoYXJDb2RlfHwwKSx2JiZlPT02MyYmZD09MjI0JiYoZD0xOTEpO3ZhciBmPWQ9Y2MoZCk7ZD9kPj02MzIzMiYmZCBpbiBoYz9mPWhjW2RdOmQ9PTI1JiZhLnNoaWZ0S2V5JiYoZj05KTpiLmtleUlkZW50aWZpZXImJmIua2V5SWRlbnRpZmllciBpbiBpYyYmKGY9aWNbYi5rZXlJZGVudGlmaWVyXSk7CmlmKCF0fHxhLnR5cGUhPSJrZXlwcmVzcyJ8fGRjKGYsdGhpcy5GLGEuc2hpZnRLZXksYS5jdHJsS2V5LGMsYS5tZXRhS2V5KSlhPWY9PXRoaXMuRix0aGlzLkY9ZixiPW5ldyBmYyhmLGUsYSxiKSxiLmFsdEtleT1jLEUodGhpcyxiKX07Si5wcm90b3R5cGUuaT1mdW5jdGlvbigpe3JldHVybiB0aGlzLlJ9O3ZhciBnYz1mdW5jdGlvbihhLGIsYyl7YS5yYSYma2MoYSk7YS5SPWI7YS5xYT11YihhLlIsImtleXByZXNzIixhLGMpO2EuSmE9dWIoYS5SLCJrZXlkb3duIixhLmcsYyxhKTthLnJhPXViKGEuUiwia2V5dXAiLGEuaCxjLGEpfSxrYz1mdW5jdGlvbihhKXthLnFhJiYoQShhLnFhKSxBKGEuSmEpLEEoYS5yYSksYS5xYT1udWxsLGEuSmE9bnVsbCxhLnJhPW51bGwpO2EuUj1udWxsO2EuRj0tMTthLks9LTF9O0oucHJvdG90eXBlLkM9ZnVuY3Rpb24oKXtKLmwuQy5jYWxsKHRoaXMpO2tjKHRoaXMpfTt2YXIgSz17Z2E6Im1vdXNlZG93biIsaGE6Im1vdXNldXAiLGZhOiJtb3VzZWNhbmNlbCIsc2M6Im1vdXNlbW92ZSIsdWM6Im1vdXNlb3ZlciIsdGM6Im1vdXNlb3V0IixxYzoibW91c2VlbnRlciIscmM6Im1vdXNlbGVhdmUifTt2YXIgbGM9ZnVuY3Rpb24oYSl7cmV0dXJuIHR5cGVvZiBhLmNsYXNzTmFtZT09InN0cmluZyI/YS5jbGFzc05hbWU6YS5nZXRBdHRyaWJ1dGUmJmEuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIn0sTD1mdW5jdGlvbihhKXtyZXR1cm4gYS5jbGFzc0xpc3Q/YS5jbGFzc0xpc3Q6bGMoYSkubWF0Y2goL1xTKy9nKXx8W119LG1jPWZ1bmN0aW9uKGEsYil7dHlwZW9mIGEuY2xhc3NOYW1lPT0ic3RyaW5nIj9hLmNsYXNzTmFtZT1iOmEuc2V0QXR0cmlidXRlJiZhLnNldEF0dHJpYnV0ZSgiY2xhc3MiLGIpfSxuYz1mdW5jdGlvbihhLGIpe2EuY2xhc3NMaXN0P2I9YS5jbGFzc0xpc3QuY29udGFpbnMoYik6KGE9TChhKSxiPXZhKGEsYik+PTApO3JldHVybiBifSxvYz1mdW5jdGlvbihhLGIpe2lmKGEuY2xhc3NMaXN0KWEuY2xhc3NMaXN0LmFkZChiKTtlbHNlIGlmKCFuYyhhLGIpKXt2YXIgYz1sYyhhKTttYyhhLGMrKGMubGVuZ3RoPjA/IiAiK2I6YikpfX0scGM9ZnVuY3Rpb24oYSxiKXtpZihhLmNsYXNzTGlzdClBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGIsCmZ1bmN0aW9uKGUpe29jKGEsZSl9KTtlbHNle3ZhciBjPXt9O0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoTChhKSxmdW5jdGlvbihlKXtjW2VdPSEwfSk7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChiLGZ1bmN0aW9uKGUpe2NbZV09ITB9KTtiPSIiO2Zvcih2YXIgZCBpbiBjKWIrPWIubGVuZ3RoPjA/IiAiK2Q6ZDttYyhhLGIpfX0scWM9ZnVuY3Rpb24oYSxiKXthLmNsYXNzTGlzdD9hLmNsYXNzTGlzdC5yZW1vdmUoYik6bmMoYSxiKSYmbWMoYSxBcnJheS5wcm90b3R5cGUuZmlsdGVyLmNhbGwoTChhKSxmdW5jdGlvbihjKXtyZXR1cm4gYyE9Yn0pLmpvaW4oIiAiKSl9LHJjPWZ1bmN0aW9uKGEsYil7YS5jbGFzc0xpc3Q/QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChiLGZ1bmN0aW9uKGMpe3FjKGEsYyl9KTptYyhhLEFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbChMKGEpLGZ1bmN0aW9uKGMpe3JldHVybiEodmEoYixjKT49MCl9KS5qb2luKCIgIikpfTt2YXIgdGM9ZnVuY3Rpb24oYSxiKXtpZighYSl0aHJvdyBFcnJvcigiSW52YWxpZCBjbGFzcyBuYW1lICIrYSk7aWYodHlwZW9mIGIhPT0iZnVuY3Rpb24iKXRocm93IEVycm9yKCJJbnZhbGlkIGRlY29yYXRvciBmdW5jdGlvbiAiK2IpO3NjW2FdPWJ9LHVjPXt9LHNjPXt9O3ZhciB2Yz1mdW5jdGlvbihhKXt0aGlzLkE9YX07aWEodmMpO3ZhciB3Yz1mdW5jdGlvbihhLGIpe2EmJihhLnRhYkluZGV4PWI/MDotMSl9LHljPWZ1bmN0aW9uKGEsYixjKXtjLmlkJiZQYihiLGMuaWQpO3ZhciBkPWEuZygpLGU9ITEsZj1MKGMpO2YmJkFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoZixmdW5jdGlvbihoKXtoPT1kP2U9ITA6aCYmdGhpcy51KGIsaCxkKX0sYSk7ZXx8b2MoYyxkKTt4YyhiLGMpO3JldHVybiBjfTt2Yy5wcm90b3R5cGUudT1mdW5jdGlvbihhLGIsYyl7Yj09YysiLWRpc2FibGVkIj9hLlgoITEpOmI9PWMrIi1ob3Jpem9udGFsIj96YyhhLCJob3Jpem9udGFsIik6Yj09YysiLXZlcnRpY2FsIiYmemMoYSwidmVydGljYWwiKX07CnZhciB4Yz1mdW5jdGlvbihhLGIpe2lmKGIpZm9yKHZhciBjPWIuZmlyc3RDaGlsZCxkO2MmJmMucGFyZW50Tm9kZT09Yjspe2Q9Yy5uZXh0U2libGluZztpZihjLm5vZGVUeXBlPT0xKXthOnt2YXIgZT1jO3AoZSk7ZT1MKGUpO2Zvcih2YXIgZj1lLmxlbmd0aCxoPTA7aDxmO2grKyl7dmFyIGs9ZVtoXTtpZihrPWsgaW4gc2M/c2Nba10oKTpudWxsKXtlPWs7YnJlYWsgYX19ZT1udWxsfWUmJihlLmc9YyxhLmlzRW5hYmxlZCgpfHxlLlgoITEpLGEuQmEoZSksU2IoZSxjKSl9ZWxzZSBjLm5vZGVWYWx1ZSYmSGEoYy5ub2RlVmFsdWUpIT0iInx8Yi5yZW1vdmVDaGlsZChjKTtjPWR9fSxBYz1mdW5jdGlvbihhLGIpe2I9Yi5pKCk7cChiLCJUaGUgY29udGFpbmVyIERPTSBlbGVtZW50IGNhbm5vdCBiZSBudWxsLiIpO0tiKGIsdCk7KGE9YS5BKSYmWmIoYixhKX07dmMucHJvdG90eXBlLmc9ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy1jb250YWluZXIifTsKdmMucHJvdG90eXBlLmo9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nKCksYz1bYixhLkw9PSJob3Jpem9udGFsIj9iKyItaG9yaXpvbnRhbCI6YisiLXZlcnRpY2FsIl07YS5pc0VuYWJsZWQoKXx8Yy5wdXNoKGIrIi1kaXNhYmxlZCIpO3JldHVybiBjfTt2YXIgQmM9ZnVuY3Rpb24oKXt9O3ZhciBNPWZ1bmN0aW9uKCl7fSxDYztpYShNKTt2YXIgRGM9e2J1dHRvbjoicHJlc3NlZCIsY2hlY2tib3g6ImNoZWNrZWQiLG1lbnVpdGVtOiJzZWxlY3RlZCIsbWVudWl0ZW1jaGVja2JveDoiY2hlY2tlZCIsbWVudWl0ZW1yYWRpbzoiY2hlY2tlZCIscmFkaW86ImNoZWNrZWQiLHRhYjoic2VsZWN0ZWQiLHRyZWVpdGVtOiJzZWxlY3RlZCJ9O00ucHJvdG90eXBlLk5hPWZ1bmN0aW9uKCl7fTtNLnByb3RvdHlwZS54YT1mdW5jdGlvbihhKXt2YXIgYj1hLkcsYz1iLmgsZD10aGlzLk4oKSxlPVtkXSxmPXRoaXMuTigpO2YhPWQmJmUucHVzaChmKTtkPWEubTtmb3IoZj1bXTtkOyl7dmFyIGg9ZCYtZDtmLnB1c2goRWModGhpcyxoKSk7ZCY9fmh9ZS5wdXNoLmFwcGx5KGUsZik7KGQ9YS5GYSkmJmUucHVzaC5hcHBseShlLGQpO3JldHVybiBjLmNhbGwoYiwiRElWIixlLmpvaW4oIiAiKSxhLmlhKX07Ck0ucHJvdG90eXBlLnlhPWZ1bmN0aW9uKGEsYil7Yi5pZCYmUGIoYSxiLmlkKTtiJiZiLmZpcnN0Q2hpbGQ/RmMoYSxiLmZpcnN0Q2hpbGQubmV4dFNpYmxpbmc/eWEoYi5jaGlsZE5vZGVzKTpiLmZpcnN0Q2hpbGQpOmEuaWE9bnVsbDt2YXIgYz0wLGQ9dGhpcy5OKCksZT10aGlzLk4oKSxmPSExLGg9ITEsaz15YShMKGIpKTtrLmZvckVhY2goZnVuY3Rpb24ocSl7Znx8cSE9ZD9ofHxxIT1lP2N8PUdjKHRoaXMscSk6aD0hMDooZj0hMCxlPT1kJiYoaD0hMCkpO0djKHRoaXMscSk9PTEmJihzYShiKSxkYihiKSYmZWIoYikmJmNiKGIsITEpKX0sdGhpcyk7YS5tPWM7Znx8KGsucHVzaChkKSxlPT1kJiYoaD0hMCkpO2h8fGsucHVzaChlKTsoYT1hLkZhKSYmay5wdXNoLmFwcGx5KGssYSk7ZiYmaCYmIWF8fG1jKGIsay5qb2luKCIgIikpO3JldHVybiBifTsKdmFyIEhjPWZ1bmN0aW9uKGEsYil7aWYoYT1hLk5hKCkpe3AoYiwiVGhlIGVsZW1lbnQgcGFzc2VkIGFzIGEgZmlyc3QgcGFyYW1ldGVyIGNhbm5vdCBiZSBudWxsLiIpO3ZhciBjPWIuZ2V0QXR0cmlidXRlKCJyb2xlIil8fG51bGw7YSE9YyYmWmIoYixhKX19LEljPWZ1bmN0aW9uKGEsYil7dmFyIGM7aWYoYS5EJjMyJiYoYz1hLmkoKSkpe2lmKCFiJiZhLm0mMzIpe3RyeXtjLmJsdXIoKX1jYXRjaChkKXt9YS5tJjMyJiZhLlFhKG51bGwpfShkYihjKSYmZWIoYykpIT1iJiZjYihjLGIpfX0sSmM9ZnVuY3Rpb24oYSxiLGMpe0NjfHwoQ2M9ezE6ImRpc2FibGVkIiw4OiJzZWxlY3RlZCIsMTY6ImNoZWNrZWQiLDY0OiJleHBhbmRlZCJ9KTtwKGEsIlRoZSBlbGVtZW50IHBhc3NlZCBhcyBhIGZpcnN0IHBhcmFtZXRlciBjYW5ub3QgYmUgbnVsbC4iKTtiPUNjW2JdO3ZhciBkPWEuZ2V0QXR0cmlidXRlKCJyb2xlIil8fG51bGw7ZCYmKGQ9RGNbZF18fGIsYj1iPT0iY2hlY2tlZCJ8fGI9PQoic2VsZWN0ZWQiP2Q6Yik7YiYmYWMoYSxiLGMpfTtNLnByb3RvdHlwZS5OPWZ1bmN0aW9uKCl7cmV0dXJuImdvb2ctY29udHJvbCJ9O3ZhciBFYz1mdW5jdGlvbihhLGIpe2EuZ3x8S2MoYSk7cmV0dXJuIGEuZ1tiXX0sR2M9ZnVuY3Rpb24oYSxiKXthLmh8fChhLmd8fEtjKGEpLGEuaD1FYShhLmcpKTthPXBhcnNlSW50KGEuaFtiXSwxMCk7cmV0dXJuIGlzTmFOKGEpPzA6YX0sS2M9ZnVuY3Rpb24oYSl7dmFyIGI9YS5OKCk7dmFyIGM9Yi5yZXBsYWNlKC9ceGEwfFxzL2csIiAiKS5pbmRleE9mKCIgIikhPS0xO3AoIWMsIkNvbnRyb2xSZW5kZXJlciBoYXMgYW4gaW52YWxpZCBjc3MgY2xhc3M6ICciK2IrIiciKTthLmc9ezE6YisiLWRpc2FibGVkIiwyOmIrIi1ob3ZlciIsNDpiKyItYWN0aXZlIiw4OmIrIi1zZWxlY3RlZCIsMTY6YisiLWNoZWNrZWQiLDMyOmIrIi1mb2N1c2VkIiw2NDpiKyItb3BlbiJ9fTt2YXIgTj1mdW5jdGlvbihhLGIsYyl7Ri5jYWxsKHRoaXMsYyk7aWYoIWIpe2ZvcihiPXRoaXMuY29uc3RydWN0b3I7Yjspe3ZhciBkPW5hKGIpO2lmKGQ9dWNbZF0pYnJlYWs7Yj0oYj1PYmplY3QuZ2V0UHJvdG90eXBlT2YoYi5wcm90b3R5cGUpKSYmYi5jb25zdHJ1Y3Rvcn1iPWQ/dHlwZW9mIGQuVj09PSJmdW5jdGlvbiI/ZC5WKCk6bmV3IGQ6bnVsbH10aGlzLnY9Yjt0aGlzLmlhPWEhPT12b2lkIDA/YTpudWxsfTtuKE4sRik7Zz1OLnByb3RvdHlwZTtnLmlhPW51bGw7Zy5tPTA7Zy5EPTM5O2cuUD0wO2cuT2E9ITA7Zy5GYT1udWxsO2cuSGE9ITA7Zy5tYT1mdW5jdGlvbigpe3ZhciBhPXRoaXMudi54YSh0aGlzKTt0aGlzLmc9YTtIYyh0aGlzLnYsYSk7S2IoYSwhMCk7dGhpcy5pc1Zpc2libGUoKXx8KGEuc3R5bGUuZGlzcGxheT0ibm9uZSIsYSYmYWMoYSwiaGlkZGVuIiwhMCkpfTtnLm5hPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaSgpfTtnLndhPWZ1bmN0aW9uKCl7cmV0dXJuITB9OwpnLkVhPWZ1bmN0aW9uKGEpe3RoaXMuZz1hPXRoaXMudi55YSh0aGlzLGEpO0hjKHRoaXMudixhKTtLYihhLCEwKTt0aGlzLk9hPWEuc3R5bGUuZGlzcGxheSE9Im5vbmUifTsKZy5JPWZ1bmN0aW9uKCl7Ti5sLkkuY2FsbCh0aGlzKTt2YXIgYT10aGlzLmc7cChhLCJDYW4gbm90IGNhbGwgZ2V0RWxlbWVudFN0cmljdCBiZWZvcmUgcmVuZGVyaW5nL2RlY29yYXRpbmcuIik7cCh0aGlzKTtwKGEpO3RoaXMuaXNWaXNpYmxlKCl8fGFjKGEsImhpZGRlbiIsIXRoaXMuaXNWaXNpYmxlKCkpO3RoaXMuaXNFbmFibGVkKCl8fEpjKGEsMSwhdGhpcy5pc0VuYWJsZWQoKSk7dGhpcy5EJjgmJkpjKGEsOCwhISh0aGlzLm0mOCkpO3RoaXMuRCYxNiYmSmMoYSwxNiwhISh0aGlzLm0mMTYpKTt0aGlzLkQmNjQmJkpjKGEsNjQsISEodGhpcy5tJjY0KSk7dmFyIGI9dGhpcy52O1ViKHRoaXMpJiYoYT10aGlzLmkoKSxiPWIuTigpKyItcnRsIiwoYT1hLmk/YS5pKCk6YSkmJnBjKGEsW2JdKSk7dGhpcy5pc0VuYWJsZWQoKSYmSWModGhpcyx0aGlzLmlzVmlzaWJsZSgpKTt0aGlzLkQmLTImJih0aGlzLkhhJiZMYyh0aGlzLCEwKSx0aGlzLkQmMzImJihhPXRoaXMuaSgpKSkmJihiPQp0aGlzLlp8fCh0aGlzLlo9bmV3IEopLGdjKGIsYSksQihCKEIoUWIodGhpcyksYiwia2V5Iix0aGlzLmFhKSxhLCJmb2N1cyIsdGhpcy5YYSksYSwiYmx1ciIsdGhpcy5RYSkpfTt2YXIgTGM9ZnVuY3Rpb24oYSxiKXt2YXIgYz1RYihhKSxkPWEuaSgpO2I/KEIoQihCKEIoYyxkLEsuZ2EsYS5zYSksZCxbSy5oYSxLLmZhXSxhLnZhKSxkLCJtb3VzZW92ZXIiLGEudWEpLGQsIm1vdXNlb3V0IixhLnRhKSxhLmNhIT1CYyYmQihjLGQsImNvbnRleHRtZW51IixhLmNhKSk6KEMoQyhDKEMoYyxkLEsuZ2EsYS5zYSksZCxbSy5oYSxLLmZhXSxhLnZhKSxkLCJtb3VzZW92ZXIiLGEudWEpLGQsIm1vdXNlb3V0IixhLnRhKSxhLmNhIT1CYyYmQyhjLGQsImNvbnRleHRtZW51IixhLmNhKSl9O04ucHJvdG90eXBlLlU9ZnVuY3Rpb24oKXtOLmwuVS5jYWxsKHRoaXMpO3RoaXMuWiYma2ModGhpcy5aKTt0aGlzLmlzVmlzaWJsZSgpJiZ0aGlzLmlzRW5hYmxlZCgpJiZJYyh0aGlzLCExKX07Ck4ucHJvdG90eXBlLkM9ZnVuY3Rpb24oKXtOLmwuQy5jYWxsKHRoaXMpO3RoaXMuWiYmKHRoaXMuWi5kaXNwb3NlKCksZGVsZXRlIHRoaXMuWik7ZGVsZXRlIHRoaXMudjt0aGlzLkZhPXRoaXMuaWE9bnVsbH07dmFyIEZjPWZ1bmN0aW9uKGEsYil7YS5pYT1ifTtOLnByb3RvdHlwZS5pc1Zpc2libGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5PYX07Ti5wcm90b3R5cGUuaXNFbmFibGVkPWZ1bmN0aW9uKCl7cmV0dXJuISh0aGlzLm0mMSl9O04ucHJvdG90eXBlLlg9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5oO2ImJnR5cGVvZiBiLmlzRW5hYmxlZD09ImZ1bmN0aW9uIiYmIWIuaXNFbmFibGVkKCl8fCFPKHRoaXMsMSwhYSl8fChhfHwoTWModGhpcywhMSksUCh0aGlzLCExKSksdGhpcy5pc1Zpc2libGUoKSYmSWModGhpcyxhKSxUKHRoaXMsMSwhYSwhMCkpfTt2YXIgUD1mdW5jdGlvbihhLGIpe08oYSwyLGIpJiZUKGEsMixiKX07Ck4ucHJvdG90eXBlLmlzQWN0aXZlPWZ1bmN0aW9uKCl7cmV0dXJuISEodGhpcy5tJjQpfTsKdmFyIE1jPWZ1bmN0aW9uKGEsYil7TyhhLDQsYikmJlQoYSw0LGIpfSxOYz1mdW5jdGlvbihhLGIpe08oYSw4LGIpJiZUKGEsOCxiKX0sT2M9ZnVuY3Rpb24oYSxiKXtPKGEsNjQsYikmJlQoYSw2NCxiKX0sVD1mdW5jdGlvbihhLGIsYyxkKXtpZighZCYmYj09MSlhLlgoIWMpO2Vsc2UgaWYoYS5EJmImJmMhPSEhKGEubSZiKSl7dmFyIGU9YS52O2lmKGQ9YS5pKCkpe2lmKGU9RWMoZSxiKSl7dmFyIGY9YS5pP2EuaSgpOmE7ZiYmKGM/cGM6cmMpKGYsW2VdKX1KYyhkLGIsYyl9YS5tPWM/YS5tfGI6YS5tJn5ifX0sUGM9ZnVuY3Rpb24oYSxiLGMpe2lmKGEucyYmYS5tJmImJiFjKXRocm93IEVycm9yKCJDb21wb25lbnQgYWxyZWFkeSByZW5kZXJlZCIpOyFjJiZhLm0mYiYmVChhLGIsITEpO2EuRD1jP2EuRHxiOmEuRCZ+Yn0sVT1mdW5jdGlvbihhLGIpe3JldHVybiEhKDI1NSZiKSYmISEoYS5EJmIpfSxPPWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4hIShhLkQmYikmJiEhKGEubSZiKSE9CmMmJighKGEuUCZiKXx8RShhLE5iKGIsYykpKSYmIWEuYmF9O04ucHJvdG90eXBlLnVhPWZ1bmN0aW9uKGEpeyFRYyhhLHRoaXMuaSgpKSYmRSh0aGlzLCJlbnRlciIpJiZ0aGlzLmlzRW5hYmxlZCgpJiZVKHRoaXMsMikmJlAodGhpcywhMCl9O04ucHJvdG90eXBlLnRhPWZ1bmN0aW9uKGEpeyFRYyhhLHRoaXMuaSgpKSYmRSh0aGlzLCJsZWF2ZSIpJiYoVSh0aGlzLDQpJiZNYyh0aGlzLCExKSxVKHRoaXMsMikmJlAodGhpcywhMSkpfTtOLnByb3RvdHlwZS5jYT1CYzt2YXIgUWM9ZnVuY3Rpb24oYSxiKXtyZXR1cm4hIWEucmVsYXRlZFRhcmdldCYmYWIoYixhLnJlbGF0ZWRUYXJnZXQpfTsKTi5wcm90b3R5cGUuc2E9ZnVuY3Rpb24oYSl7aWYodGhpcy5pc0VuYWJsZWQoKSYmKFUodGhpcywyKSYmUCh0aGlzLCEwKSwhKGEuaC5idXR0b24hPTB8fHYmJmEuY3RybEtleSkpKXtVKHRoaXMsNCkmJk1jKHRoaXMsITApO3ZhciBiO2lmKGI9dGhpcy52KXt2YXIgYztiPXRoaXMuRCYzMiYmKGM9dGhpcy5pKCkpP2RiKGMpJiZlYihjKTohMX1iJiZ0aGlzLmkoKS5mb2N1cygpfWEuaC5idXR0b24hPTB8fHYmJmEuY3RybEtleXx8YS5qKCl9O04ucHJvdG90eXBlLnZhPWZ1bmN0aW9uKGEpe3RoaXMuaXNFbmFibGVkKCkmJihVKHRoaXMsMikmJlAodGhpcywhMCksdGhpcy5pc0FjdGl2ZSgpJiZSYyh0aGlzLGEpJiZVKHRoaXMsNCkmJk1jKHRoaXMsITEpKX07CnZhciBSYz1mdW5jdGlvbihhLGIpe2lmKFUoYSwxNikpe3ZhciBjPSEoYS5tJjE2KTtPKGEsMTYsYykmJlQoYSwxNixjKX1VKGEsOCkmJk5jKGEsITApO1UoYSw2NCkmJk9jKGEsIShhLm0mNjQpKTtjPW5ldyB5KCJhY3Rpb24iLGEpO2ImJihjLmFsdEtleT1iLmFsdEtleSxjLmN0cmxLZXk9Yi5jdHJsS2V5LGMubWV0YUtleT1iLm1ldGFLZXksYy5zaGlmdEtleT1iLnNoaWZ0S2V5LGMuRz1iLkcsYy50aW1lU3RhbXA9Yi50aW1lU3RhbXApO3JldHVybiBFKGEsYyl9O04ucHJvdG90eXBlLlhhPWZ1bmN0aW9uKCl7VSh0aGlzLDMyKSYmTyh0aGlzLDMyLCEwKSYmVCh0aGlzLDMyLCEwKX07Ti5wcm90b3R5cGUuUWE9ZnVuY3Rpb24oKXtVKHRoaXMsNCkmJk1jKHRoaXMsITEpO1UodGhpcywzMikmJk8odGhpcywzMiwhMSkmJlQodGhpcywzMiwhMSl9OwpOLnByb3RvdHlwZS5hYT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5pc1Zpc2libGUoKSYmdGhpcy5pc0VuYWJsZWQoKSYmYS5nPT0xMyYmUmModGhpcyxhKT8oYS5qKCksYS52KCksITApOiExfTtpZih0eXBlb2YgTiE9PSJmdW5jdGlvbiIpdGhyb3cgRXJyb3IoIkludmFsaWQgY29tcG9uZW50IGNsYXNzICIrTik7aWYodHlwZW9mIE0hPT0iZnVuY3Rpb24iKXRocm93IEVycm9yKCJJbnZhbGlkIHJlbmRlcmVyIGNsYXNzICIrTSk7dmFyIFNjPW5hKE4pO3VjW1NjXT1NO3RjKCJnb29nLWNvbnRyb2wiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBOKG51bGwpfSk7dmFyIFY9ZnVuY3Rpb24oYSxiLGMpe0YuY2FsbCh0aGlzLGMpO3RoaXMuZWE9Ynx8dmMuVigpO3RoaXMuTD1hfHwidmVydGljYWwifTtuKFYsRik7Zz1WLnByb3RvdHlwZTtnLkthPW51bGw7Zy5kYT1udWxsO2cuZWE9bnVsbDtnLkw9bnVsbDtnLlM9ITA7Zy5UPSEwO2cubz0tMTtnLkI9bnVsbDtnLlc9ITE7Zy5PPW51bGw7dmFyIFRjPWZ1bmN0aW9uKGEpe3JldHVybiBhLkthfHxhLmkoKX07Zz1WLnByb3RvdHlwZTtnLm1hPWZ1bmN0aW9uKCl7dGhpcy5nPXRoaXMuRy5oKCJESVYiLHRoaXMuZWEuaih0aGlzKS5qb2luKCIgIikpfTtnLm5hPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaSgpfTtnLndhPWZ1bmN0aW9uKGEpe3JldHVybiBhLnRhZ05hbWU9PSJESVYifTtnLkVhPWZ1bmN0aW9uKGEpe3RoaXMuZz15Yyh0aGlzLmVhLHRoaXMsYSk7YS5zdHlsZS5kaXNwbGF5PT0ibm9uZSImJih0aGlzLlM9ITEpfTsKZy5JPWZ1bmN0aW9uKCl7Vi5sLkkuY2FsbCh0aGlzKTtUYih0aGlzLGZ1bmN0aW9uKGIpe2IucyYmVWModGhpcyxiKX0sdGhpcyk7dmFyIGE9dGhpcy5pKCk7QWModGhpcy5lYSx0aGlzKTtWYyh0aGlzLHRoaXMuUyk7QihCKEIoQihCKEIoQihCKFFiKHRoaXMpLHRoaXMsImVudGVyIix0aGlzLmViKSx0aGlzLCJoaWdobGlnaHQiLHRoaXMuZmIpLHRoaXMsInVuaGlnaGxpZ2h0Iix0aGlzLmxiKSx0aGlzLCJvcGVuIix0aGlzLmdiKSx0aGlzLCJjbG9zZSIsdGhpcy5iYiksYSxLLmdhLHRoaXMuV2EpLGJiKGEpLFtLLmhhLEsuZmFdLHRoaXMuY2IpLGEsW0suZ2EsSy5oYSxLLmZhLCJtb3VzZW92ZXIiLCJtb3VzZW91dCIsImNvbnRleHRtZW51Il0sdGhpcy5hYik7V2ModGhpcyl9O3ZhciBXYz1mdW5jdGlvbihhKXt2YXIgYj1RYihhKSxjPVRjKGEpO0IoQihCKGIsYywiZm9jdXMiLGEuUGEpLGMsImJsdXIiLGEuVWEpLGEuZGF8fChhLmRhPW5ldyBKKFRjKGEpKSksImtleSIsYS5WYSl9OwpnPVYucHJvdG90eXBlO2cuVT1mdW5jdGlvbigpe1hjKHRoaXMsLTEpO3RoaXMuQiYmT2ModGhpcy5CLCExKTt0aGlzLlc9ITE7Vi5sLlUuY2FsbCh0aGlzKX07Zy5DPWZ1bmN0aW9uKCl7Vi5sLkMuY2FsbCh0aGlzKTt0aGlzLmRhJiYodGhpcy5kYS5kaXNwb3NlKCksdGhpcy5kYT1udWxsKTt0aGlzLmVhPXRoaXMuQj10aGlzLk89dGhpcy5LYT1udWxsfTtnLmViPWZ1bmN0aW9uKCl7cmV0dXJuITB9OwpnLmZiPWZ1bmN0aW9uKGEpe3ZhciBiPVZiKHRoaXMsYS50YXJnZXQpO2lmKGI+LTEmJmIhPXRoaXMubyl7dmFyIGM9SSh0aGlzLHRoaXMubyk7YyYmUChjLCExKTt0aGlzLm89YjtjPUkodGhpcyx0aGlzLm8pO3RoaXMuVyYmTWMoYywhMCk7dGhpcy5CJiZjIT10aGlzLkImJihjLkQmNjQ/T2MoYywhMCk6T2ModGhpcy5CLCExKSl9Yj10aGlzLmkoKTtwKGIsIlRoZSBET00gZWxlbWVudCBmb3IgdGhlIGNvbnRhaW5lciBjYW5ub3QgYmUgbnVsbC4iKTthLnRhcmdldC5pKCkhPW51bGwmJmFjKGIsImFjdGl2ZWRlc2NlbmRhbnQiLGEudGFyZ2V0LmkoKS5pZCl9O2cubGI9ZnVuY3Rpb24oYSl7YS50YXJnZXQ9PUkodGhpcyx0aGlzLm8pJiYodGhpcy5vPS0xKTthPXRoaXMuaSgpO3AoYSwiVGhlIERPTSBlbGVtZW50IGZvciB0aGUgY29udGFpbmVyIGNhbm5vdCBiZSBudWxsLiIpO2EucmVtb3ZlQXR0cmlidXRlKCRiKCJhY3RpdmVkZXNjZW5kYW50IikpfTsKZy5nYj1mdW5jdGlvbihhKXsoYT1hLnRhcmdldCkmJmEhPXRoaXMuQiYmYS5oPT10aGlzJiYodGhpcy5CJiZPYyh0aGlzLkIsITEpLHRoaXMuQj1hKX07Zy5iYj1mdW5jdGlvbihhKXthLnRhcmdldD09dGhpcy5CJiYodGhpcy5CPW51bGwpO3ZhciBiPXRoaXMuaSgpLGM9YS50YXJnZXQuaSgpO2ImJmEudGFyZ2V0Lm0mMiYmYyYmKGE9IiIsYyYmKGE9Yy5pZCxwKGEsIlRoZSBhY3RpdmUgZWxlbWVudCBzaG91bGQgaGF2ZSBhbiBpZC4iKSksYWMoYiwiYWN0aXZlZGVzY2VuZGFudCIsYSkpfTtnLldhPWZ1bmN0aW9uKGEpe3RoaXMuVCYmKHRoaXMuVz0hMCk7dmFyIGI9VGModGhpcyk7YiYmZGIoYikmJmViKGIpP2IuZm9jdXMoKTphLmooKX07Zy5jYj1mdW5jdGlvbigpe3RoaXMuVz0hMX07CmcuYWI9ZnVuY3Rpb24oYSl7YTp7dmFyIGI9YS50YXJnZXQ7aWYodGhpcy5PKWZvcih2YXIgYz10aGlzLmkoKTtiJiZiIT09Yzspe3ZhciBkPWIuaWQ7aWYoZCBpbiB0aGlzLk8pe2I9dGhpcy5PW2RdO2JyZWFrIGF9Yj1iLnBhcmVudE5vZGV9Yj1udWxsfWlmKGIpc3dpdGNoKGEudHlwZSl7Y2FzZSBLLmdhOmIuc2EoYSk7YnJlYWs7Y2FzZSBLLmhhOmNhc2UgSy5mYTpiLnZhKGEpO2JyZWFrO2Nhc2UgIm1vdXNlb3ZlciI6Yi51YShhKTticmVhaztjYXNlICJtb3VzZW91dCI6Yi50YShhKTticmVhaztjYXNlICJjb250ZXh0bWVudSI6Yi5jYShhKX19O2cuUGE9ZnVuY3Rpb24oKXt9O2cuVWE9ZnVuY3Rpb24oKXtYYyh0aGlzLC0xKTt0aGlzLlc9ITE7dGhpcy5CJiZPYyh0aGlzLkIsITEpfTsKZy5WYT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5pc0VuYWJsZWQoKSYmdGhpcy5pc1Zpc2libGUoKSYmKEgodGhpcykhPTB8fHRoaXMuS2EpJiZZYyh0aGlzLGEpPyhhLmooKSxhLnYoKSwhMCk6ITF9Owp2YXIgWWM9ZnVuY3Rpb24oYSxiKXt2YXIgYz1JKGEsYS5vKTtpZihjJiZ0eXBlb2YgYy5hYT09ImZ1bmN0aW9uIiYmYy5hYShiKXx8YS5CJiZhLkIhPWMmJnR5cGVvZiBhLkIuYWE9PSJmdW5jdGlvbiImJmEuQi5hYShiKSlyZXR1cm4hMDtpZihiLnNoaWZ0S2V5fHxiLmN0cmxLZXl8fGIubWV0YUtleXx8Yi5hbHRLZXkpcmV0dXJuITE7c3dpdGNoKGIuZyl7Y2FzZSAyNzpUYyhhKS5ibHVyKCk7YnJlYWs7Y2FzZSAzNjpaYyhhKTticmVhaztjYXNlIDM1OiRjKGEpO2JyZWFrO2Nhc2UgMzg6aWYoYS5MPT0idmVydGljYWwiKWFkKGEpO2Vsc2UgcmV0dXJuITE7YnJlYWs7Y2FzZSAzNzppZihhLkw9PSJob3Jpem9udGFsIilVYihhKT9iZChhKTphZChhKTtlbHNlIHJldHVybiExO2JyZWFrO2Nhc2UgNDA6aWYoYS5MPT0idmVydGljYWwiKWJkKGEpO2Vsc2UgcmV0dXJuITE7YnJlYWs7Y2FzZSAzOTppZihhLkw9PSJob3Jpem9udGFsIilVYihhKT9hZChhKTpiZChhKTtlbHNlIHJldHVybiExOwpicmVhaztkZWZhdWx0OnJldHVybiExfXJldHVybiEwfSxVYz1mdW5jdGlvbihhLGIpe3ZhciBjPWIuaSgpO2M9Yy5pZHx8KGMuaWQ9T2IoYikpO2EuT3x8KGEuTz17fSk7YS5PW2NdPWJ9O1YucHJvdG90eXBlLkJhPWZ1bmN0aW9uKGEsYil7dWEoYSxOLCJUaGUgY2hpbGQgb2YgYSBjb250YWluZXIgbXVzdCBiZSBhIGNvbnRyb2wiKTtWLmwuQmEuY2FsbCh0aGlzLGEsYil9O1YucHJvdG90eXBlLkNhPWZ1bmN0aW9uKGEsYixjKXt1YShhLE4pO2EuUHw9MjthLlB8PTY0O1BjKGEsMzIsITEpO2EucyYmMCE9YS5IYSYmTGMoYSwhMSk7YS5IYT0hMTt2YXIgZD1hLmg9PXRoaXM/VmIodGhpcyxhKTotMTtWLmwuQ2EuY2FsbCh0aGlzLGEsYixjKTthLnMmJnRoaXMucyYmVWModGhpcyxhKTthPWQ7YT09LTEmJihhPUgodGhpcykpO2E9PXRoaXMubz90aGlzLm89TWF0aC5taW4oSCh0aGlzKS0xLGIpOmE+dGhpcy5vJiZiPD10aGlzLm8/dGhpcy5vKys6YTx0aGlzLm8mJmI+dGhpcy5vJiZ0aGlzLm8tLX07CnZhciB6Yz1mdW5jdGlvbihhLGIpe2lmKGEuaSgpKXRocm93IEVycm9yKCJDb21wb25lbnQgYWxyZWFkeSByZW5kZXJlZCIpO2EuTD1ifTtWLnByb3RvdHlwZS5pc1Zpc2libGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5TfTt2YXIgVmM9ZnVuY3Rpb24oYSxiKXthLlM9Yjt2YXIgYz1hLmkoKTtjJiYoYy5zdHlsZS5kaXNwbGF5PWI/IiI6Im5vbmUiLHdjKFRjKGEpLGEuVCYmYS5TKSl9O1YucHJvdG90eXBlLmlzRW5hYmxlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLlR9O1YucHJvdG90eXBlLlg9ZnVuY3Rpb24oYSl7dGhpcy5UIT1hJiZFKHRoaXMsYT8iZW5hYmxlIjoiZGlzYWJsZSIpJiYoYT8odGhpcy5UPSEwLFRiKHRoaXMsZnVuY3Rpb24oYil7Yi5UYT9kZWxldGUgYi5UYTpiLlgoITApfSkpOihUYih0aGlzLGZ1bmN0aW9uKGIpe2IuaXNFbmFibGVkKCk/Yi5YKCExKTpiLlRhPSEwfSksdGhpcy5XPXRoaXMuVD0hMSksd2MoVGModGhpcyksYSYmdGhpcy5TKSl9Owp2YXIgWGM9ZnVuY3Rpb24oYSxiKXsoYj1JKGEsYikpP1AoYiwhMCk6YS5vPi0xJiZQKEkoYSxhLm8pLCExKX0sWmM9ZnVuY3Rpb24oYSl7Y2QoYSxmdW5jdGlvbihiLGMpe3JldHVybihiKzEpJWN9LEgoYSktMSl9LCRjPWZ1bmN0aW9uKGEpe2NkKGEsZnVuY3Rpb24oYixjKXtiLS07cmV0dXJuIGI8MD9jLTE6Yn0sMCl9LGJkPWZ1bmN0aW9uKGEpe2NkKGEsZnVuY3Rpb24oYixjKXtyZXR1cm4oYisxKSVjfSxhLm8pfSxhZD1mdW5jdGlvbihhKXtjZChhLGZ1bmN0aW9uKGIsYyl7Yi0tO3JldHVybiBiPDA/Yy0xOmJ9LGEubyl9LGNkPWZ1bmN0aW9uKGEsYixjKXtjPWM8MD9WYihhLGEuQik6Yzt2YXIgZD1IKGEpO2M9Yi5jYWxsKGEsYyxkKTtmb3IodmFyIGU9MDtlPD1kOyl7dmFyIGY9SShhLGMpO2lmKGYmJmYuaXNWaXNpYmxlKCkmJmYuaXNFbmFibGVkKCkmJmYuRCYyKXthLkxhKGMpO2JyZWFrfWUrKztjPWIuY2FsbChhLGMsZCl9fTsKVi5wcm90b3R5cGUuTGE9ZnVuY3Rpb24oYSl7WGModGhpcyxhKX07dmFyIGRkPWZ1bmN0aW9uKCl7fTtuKGRkLE0pO2lhKGRkKTtnPWRkLnByb3RvdHlwZTtnLk49ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy10YWIifTtnLk5hPWZ1bmN0aW9uKCl7cmV0dXJuInRhYiJ9O2cueGE9ZnVuY3Rpb24oYSl7dmFyIGI9ZGQubC54YS5jYWxsKHRoaXMsYSk7KGE9YS5HYSgpKSYmdGhpcy5NYShiLGEpO3JldHVybiBifTtnLnlhPWZ1bmN0aW9uKGEsYil7Yj1kZC5sLnlhLmNhbGwodGhpcyxhLGIpO3ZhciBjPXRoaXMuR2EoYik7YyYmKGEuUmE9Yyk7YS5tJjgmJihjPWEuaCkmJnR5cGVvZiBjLko9PT0iZnVuY3Rpb24iJiYoVChhLDgsITEpLGMuSihhKSk7cmV0dXJuIGJ9O2cuR2E9ZnVuY3Rpb24oYSl7cmV0dXJuIGEudGl0bGV8fCIifTtnLk1hPWZ1bmN0aW9uKGEsYil7YSYmKGEudGl0bGU9Ynx8IiIpfTt2YXIgZWQ9ZnVuY3Rpb24oYSxiLGMpe04uY2FsbCh0aGlzLGEsYnx8ZGQuVigpLGMpO1BjKHRoaXMsOCwhMCk7dGhpcy5QfD05fTtuKGVkLE4pO2VkLnByb3RvdHlwZS5HYT1mdW5jdGlvbigpe3JldHVybiB0aGlzLlJhfTtlZC5wcm90b3R5cGUuTWE9ZnVuY3Rpb24oYSl7dGhpcy52Lk1hKHRoaXMuaSgpLGEpO3RoaXMuUmE9YX07dGMoImdvb2ctdGFiIixmdW5jdGlvbigpe3JldHVybiBuZXcgZWQobnVsbCl9KTt2YXIgVz1mdW5jdGlvbigpe3RoaXMuQT0idGFibGlzdCJ9O24oVyx2Yyk7aWEoVyk7Vy5wcm90b3R5cGUuZz1mdW5jdGlvbigpe3JldHVybiJnb29nLXRhYi1iYXIifTtXLnByb3RvdHlwZS51PWZ1bmN0aW9uKGEsYixjKXt0aGlzLnZ8fCh0aGlzLmh8fGZkKHRoaXMpLHRoaXMudj1FYSh0aGlzLmgpKTt2YXIgZD10aGlzLnZbYl07ZD8oemMoYSxnZChkKSksYS52PWQpOlcubC51LmNhbGwodGhpcyxhLGIsYyl9O1cucHJvdG90eXBlLmo9ZnVuY3Rpb24oYSl7dmFyIGI9Vy5sLmouY2FsbCh0aGlzLGEpO3RoaXMuaHx8ZmQodGhpcyk7Yi5wdXNoKHRoaXMuaFthLnZdKTtyZXR1cm4gYn07dmFyIGZkPWZ1bmN0aW9uKGEpe3ZhciBiPWEuZygpO2EuaD17dG9wOmIrIi10b3AiLGJvdHRvbTpiKyItYm90dG9tIixzdGFydDpiKyItc3RhcnQiLGVuZDpiKyItZW5kIn19O3ZhciBYPWZ1bmN0aW9uKGEsYixjKXthPWF8fCJ0b3AiO3pjKHRoaXMsZ2QoYSkpO3RoaXMudj1hO1YuY2FsbCh0aGlzLHRoaXMuTCxifHxXLlYoKSxjKTtoZCh0aGlzKX07bihYLFYpO2c9WC5wcm90b3R5cGU7Zy5IPW51bGw7Zy5JPWZ1bmN0aW9uKCl7WC5sLkkuY2FsbCh0aGlzKTtoZCh0aGlzKX07Zy5DPWZ1bmN0aW9uKCl7WC5sLkMuY2FsbCh0aGlzKTt0aGlzLkg9bnVsbH07Zy5MYT1mdW5jdGlvbihhKXtYLmwuTGEuY2FsbCh0aGlzLGEpO3RoaXMuSihJKHRoaXMsYSkpfTtnLko9ZnVuY3Rpb24oYSl7YT9OYyhhLCEwKTp0aGlzLkgmJk5jKHRoaXMuSCwhMSl9Owp2YXIgaWQ9ZnVuY3Rpb24oYSxiKXtpZihiJiZiPT1hLkgpe2Zvcih2YXIgYz1WYihhLGIpLGQ9Yy0xO2I9SShhLGQpO2QtLSl7dmFyIGU9YjtpZihlLmlzVmlzaWJsZSgpJiZlLmlzRW5hYmxlZCgpKXthLkooYik7cmV0dXJufX1mb3IoYys9MTtiPUkoYSxjKTtjKyspaWYoZD1iLGQuaXNWaXNpYmxlKCkmJmQuaXNFbmFibGVkKCkpe2EuSihiKTtyZXR1cm59YS5KKG51bGwpfX07Zz1YLnByb3RvdHlwZTtnLmpiPWZ1bmN0aW9uKGEpe3RoaXMuSCYmdGhpcy5IIT1hLnRhcmdldCYmTmModGhpcy5ILCExKTt0aGlzLkg9YS50YXJnZXR9O2cua2I9ZnVuY3Rpb24oYSl7YS50YXJnZXQ9PXRoaXMuSCYmKHRoaXMuSD1udWxsKX07Zy5oYj1mdW5jdGlvbihhKXtpZCh0aGlzLGEudGFyZ2V0KX07Zy5pYj1mdW5jdGlvbihhKXtpZCh0aGlzLGEudGFyZ2V0KX07Zy5QYT1mdW5jdGlvbigpe0kodGhpcyx0aGlzLm8pfHxYYyh0aGlzLFZiKHRoaXMsdGhpcy5IfHxJKHRoaXMsMCkpKX07CnZhciBoZD1mdW5jdGlvbihhKXtCKEIoQihCKFFiKGEpLGEsInNlbGVjdCIsYS5qYiksYSwidW5zZWxlY3QiLGEua2IpLGEsImRpc2FibGUiLGEuaGIpLGEsImhpZGUiLGEuaWIpfSxnZD1mdW5jdGlvbihhKXtyZXR1cm4gYT09InN0YXJ0Inx8YT09ImVuZCI/InZlcnRpY2FsIjoiaG9yaXpvbnRhbCJ9O3RjKCJnb29nLXRhYi1iYXIiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBYfSk7ZnVuY3Rpb24gamQoYSl7dmFyIGI9e3RvcDoiYm90dG9tIixib3R0b206InRvcCIsc3RhcnQ6InJpZ2h0IixlbmQ6ImxlZnQifVthLmxvY2F0aW9uXSxjPWEuZWxlbWVudElkLGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTtkLnRleHRDb250ZW50PSJcbiAgICBmaWVsZHNldCB7XG4gICAgICBwYWRkaW5nOiAxMHB4O1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgIzM2OTtcbiAgICB9XG5cbiAgICAjIitjKyIgLmdvb2ctdGFiLWNvbnRlbnQge1xuICAgICAgbWluLWhlaWdodDogM2VtO1xuICAgICAgbWFyZ2luOiAwO1xuICAgICAgYm9yZGVyOiAiK2EuYm9yZGVyKyIgc29saWQgIithLmJvcmRlckNvbG9yKyI7XG4gICAgICBib3JkZXItdG9wOiAwO1xuICAgICAgaGVpZ2h0OiAiK2EuY29udGVudEhlaWdodCsiO1xuICAgICAgcGFkZGluZzogNHB4IDhweDtcbiAgICAgIG1hcmdpbi1yaWdodDogNHB4O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgIG92ZXJmbG93OiBhdXRvO1xuICAgIH1cblxuICAgICMiKwpjKyIgLmdvb2ctdGFiLWJhci0iK2EubG9jYXRpb24rIiAuZ29vZy10YWItc2VsZWN0ZWQge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICIrYS5ib3JkZXJDb2xvcisiO1xuICAgICAgYm9yZGVyLSIrYisiOiAwcHg7XG4gICAgfVxuXG4gICAgIyIrYysiIC5nb29nLXRhYi1iYXItIithLmxvY2F0aW9uKyIge1xuICAgICAgcGFkZGluZy0iK2EubG9jYXRpb24rIjogNXB4ICFpbXBvcnRhbnQ7XG4gICAgICBib3JkZXItIitiKyI6IDFweCBzb2xpZCAiK2EuYm9yZGVyQ29sb3IrIiAhaW1wb3J0YW50O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICB9XG5cbiAgICAjIitjKyIgLmdvb2ctdGFiLWJhciB7XG4gICAgICAgbWFyZ2luOiAwO1xuICAgICAgIGJvcmRlcjogMDtcbiAgICAgICBwYWRkaW5nOiAwO1xuICAgICAgIGxpc3Qtc3R5bGU6IG5vbmU7XG4gICAgICAgY3Vyc29yOiBkZWZhdWx0O1xuICAgICAgIG91dGxpbmU6IG5vbmU7XG4gICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgICBtYXJnaW4tcmlnaHQ6IDRweDtcbiAgICAgIH1cblxuICAgICAjIisKYysiIC5nb29nLXRhYiB7XG4gICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgIHBhZGRpbmc6IDRweCA4cHg7XG4gICAgICAgY29sb3I6IHZhcigtLWNvbGFiLXByaW1hcnktdGV4dC1jb2xvcik7XG4gICAgICAgdGV4dC1kZWNvcmF0aW9uOiBpbml0aWFsO1xuICAgICAgIGN1cnNvcjogZGVmYXVsdDtcbiAgICAgIH1cblxuICAgICAgIyIrYysiIC5nb29nLXRhYi1ob3ZlciB7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWNvbGFiLWhpZ2hsaWdodGVkLXN1cmZhY2UtY29sb3IpO1xuICAgICAgfVxuICAgICAgIjtyZXR1cm4gZH0KdmFyIGtkPWZ1bmN0aW9uKGEpe3ZhciBiPWEuZWxlbWVudElkLGM9YS50YWJOYW1lcyxkPWEuc2VsZWN0ZWRJbmRleDsiY29udGVudEJvcmRlciJpbiBhfHwoYS5jb250ZW50Qm9yZGVyPSIwcHgiKTsiY29udGVudEhlaWdodCJpbiBhfHwoYS5jb250ZW50SGVpZ2h0PSJpbml0aWFsIik7ImJvcmRlckNvbG9yImluIGF8fChhLmJvcmRlckNvbG9yPSJ2YXIoLS1jb2xhYi1ib3JkZXItY29sb3IpIik7YS5sb2NhdGlvbnx8KGEubG9jYXRpb249InRvcCIpO3ZhciBlPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiMiK2IpLGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zi5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYi1iYXIiKTt2YXIgaD1hLmxvY2F0aW9uO2YuY2xhc3NMaXN0LmFkZCgiZ29vZy10YWItYmFyLSIraCk7Zm9yKHZhciBrPVtdLHE9ZmEoYyksRz1xLm5leHQoKTshRy5kb25lO0c9cS5uZXh0KCkpe0c9Ry52YWx1ZTt2YXIgeD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKeC5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYiIpO3gudGV4dENvbnRlbnQ9RztmLmFwcGVuZENoaWxkKHgpO2sucHVzaCh4KX1oIT0iYm90dG9tIiYmZS5hcHBlbmRDaGlsZChmKTtxPW51bGw7aWYoaD09InRvcCJ8fGg9PSJib3R0b20iKXE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikscS5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYi1iYXItY2xlYXIiKTtoPT0idG9wIiYmcSYmZS5hcHBlbmRDaGlsZChxKTtHPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO0cuY2xhc3NMaXN0LmFkZCgiZ29vZy10YWItY29udGVudCIpO3ZhciBoYT1bXTtjPWZhKGMpO2Zvcih4PWMubmV4dCgpOyF4LmRvbmU7eD1jLm5leHQoKSl4PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHguaWQ9ZS5pZCsiX2NvbnRlbnRfIitoYS5sZW5ndGgseC5zdHlsZS5kaXNwbGF5PSJub25lIixHLmFwcGVuZENoaWxkKHgpLGhhLnB1c2goeCk7ZS5hcHBlbmRDaGlsZChHKTtoPT0iYm90dG9tIiYmKHEmJgplLmFwcGVuZENoaWxkKHEpLGUuYXBwZW5kQ2hpbGQoZikpO3ZhciBRPW5ldyBYKGgpO1NiKFEsZik7dmFyIFI9LTE7d2IoUSwic2VsZWN0IixmdW5jdGlvbihTKXtTPWsuaW5kZXhPZihTLnRhcmdldC5pKCkpO1MhPVImJihSPj0wJiZSPGhhLmxlbmd0aCYmKGhhW1JdLnN0eWxlLmRpc3BsYXk9Im5vbmUiLFI9LTEpLFM+PTAmJlM8aGEubGVuZ3RoJiYoUj1TLGhhW1JdLnN0eWxlLmRpc3BsYXk9ImlubGluZSIsd2luZG93LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCJyZXNpemUiKSksZ29vZ2xlLmNvbGFiLm91dHB1dC5yZXNpemVJZnJhbWVUb0NvbnRlbnQoKSksUS5KKEkoUSxSKSkpfSk7US5KKEkoUSxkKSk7d2luZG93W2JdPXtzZXRTZWxlY3RlZFRhYkluZGV4OmZ1bmN0aW9uKFMpe1EuSihJKFEsUykpfX07ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChqZChhKSl9LGxkPVsiY29sYWJfbGliIiwiY3JlYXRlVGFiQmFyIl0sWT1sOwpsZFswXWluIFl8fHR5cGVvZiBZLmV4ZWNTY3JpcHQ9PSJ1bmRlZmluZWQifHxZLmV4ZWNTY3JpcHQoInZhciAiK2xkWzBdKTtmb3IodmFyIFo7bGQubGVuZ3RoJiYoWj1sZC5zaGlmdCgpKTspbGQubGVuZ3RofHxrZD09PXZvaWQgMD9ZW1pdJiZZW1pdIT09T2JqZWN0LnByb3RvdHlwZVtaXT9ZPVlbWl06WT1ZW1pdPXt9OllbWl09a2Q7fSkuY2FsbCh0aGlzKTsKLy8gY2xhbmctZm9ybWF0IG9uCg==", + "ok": true, + "headers": [ + [ + "content-length", + "41785" + ], + [ + "content-type", + "application/javascript" + ] + ], + "status": 200, + "status_text": "" + } + }, + "base_uri": "https://localhost:8080/", + "height": 229 + }, + "outputId": "239c4a10-55d8-482a-87ed-e64f2b19d105" + }, + "source": [ + "%%logica Graduate_v1, Graduate_v2, NotGraduate\n", + "\n", + "Person(name: \"John\", has_graduate_degree: true);\n", + "Person(name: \"Jane\", has_graduate_degree: false);\n", + "Person(name: \"Maria\", has_graduate_degree: true);\n", + "Person(name: \"Dorian\", has_graduate_degree: false);\n", + "\n", + "Graduate_v1(name:) :-\n", + " Person(name:, has_graduate_degree:),\n", + " Constraint(has_graduate_degree);\n", + "\n", + "Graduate_v2(name:) :-\n", + " Person(name:, has_graduate_degree:),\n", + " has_graduate_degree == true;\n", + "\n", + "NotGraduate(name:) :-\n", + " Person(name:, has_graduate_degree:),\n", + " Constraint(!has_graduate_degree);" + ], + "execution_count": 38, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"78761632-d22d-11ef-a7c0-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id83\", \"tabNames\": [\"Graduate_v1\", \"Graduate_v2\", \"NotGraduate\", \"(Log)\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_33c978c768" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"78768dc4-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id83\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_fd7af92bf7" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"78783f48-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_3e38490aec" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7878cdb4-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id83_content_3\");\n", + "//# sourceURL=js_6b47d7a6dd" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7879deac-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"7878cdb4-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_c8a8cec9bf" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"787a6bce-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id83\"].setSelectedTabIndex(3);\n", + "//# sourceURL=js_92457cc26d" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"787edf7e-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"78783f48-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_4e0bd803d4" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7880c0c8-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_8d80137572" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"78810d62-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id83_content_0\");\n", + "//# sourceURL=js_374bab59b0" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"78815aba-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"78810d62-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_2309c800c6" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7881a592-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id83\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_4ec663bd8f" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"788357ca-d22d-11ef-a7c0-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id84\", \"tabNames\": [\"SQL\", \"Result\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_a543aecc3d" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"78839fe6-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id84\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_0744acdc87" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7884e5c2-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_7cf1e0e8ee" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"788531b2-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id84_content_0\");\n", + "//# sourceURL=js_85108ed4ea" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"78857a6e-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"788531b2-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_64c17e7099" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7885bfa6-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id84\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_714a56bed0" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The following query is stored at \u001b[1mGraduate_v1_sql\u001b[0m variable.\n", + "-- Initializing DuckDB environment.\n", + "create schema if not exists logica_home;\n", + "-- Empty record, has to have a field by DuckDB syntax.\n", + "drop type if exists logicarecord893574736 cascade; create type logicarecord893574736 as struct(nirvana numeric);\n", + "create sequence if not exists eternal_logical_sequence;\n", + "\n", + "\n", + "-- Logica type: logicarecord481217614\n", + "drop type if exists logicarecord481217614 cascade; create type logicarecord481217614 as struct(r logicarecord893574736);\n", + "\n", + "-- Logica type: logicarecord383307722\n", + "drop type if exists logicarecord383307722 cascade; create type logicarecord383307722 as struct(a timestamp);\n", + "WITH t_0_Person AS (SELECT * FROM (\n", + " \n", + " SELECT\n", + " 'John' AS name,\n", + " true AS has_graduate_degree\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " 'Jane' AS name,\n", + " false AS has_graduate_degree\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " 'Maria' AS name,\n", + " true AS has_graduate_degree\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " 'Dorian' AS name,\n", + " false AS has_graduate_degree\n", + " \n", + ") AS UNUSED_TABLE_NAME )\n", + "SELECT\n", + " Person.name AS name\n", + "FROM\n", + " t_0_Person AS Person\n", + "WHERE\n", + " Person.has_graduate_degree;\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7886c5a4-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"7884e5c2-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_640256701e" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7888e082-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_008ba39a0e" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"78893e4c-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id84_content_1\");\n", + "//# sourceURL=js_00bee81a8d" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7889bd5e-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"78893e4c-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_57da378611" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"788a4404-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id84\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_08f297ad3e" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The following table is stored at \u001b[1mGraduate_v1\u001b[0m variable.\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
name
0John
1Maria
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"788c5302-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"7888e082-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_29cb8e907c" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"788db332-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"7880c0c8-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_5f663ac3ea" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"788f5f2a-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_a2ff74f22b" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"788fcafa-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id83_content_3\");\n", + "//# sourceURL=js_fcaf56c279" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"78901758-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"788fcafa-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_d88fd2aa2a" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"78905e48-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id83\"].setSelectedTabIndex(3);\n", + "//# sourceURL=js_f5840ddee8" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"78946bfa-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"788f5f2a-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_c646ca7e09" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"78963516-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_301b7088b9" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"789686d8-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id83_content_1\");\n", + "//# sourceURL=js_394d8f39ea" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7896d30e-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"789686d8-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_22bd3748c6" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"78971904-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id83\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_7c8a9d4f77" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7898d1cc-d22d-11ef-a7c0-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id85\", \"tabNames\": [\"SQL\", \"Result\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_258c34525d" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"78992ac8-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id85\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_66cb527fd3" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"789ae9a8-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_4175d9614e" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"789b3d2c-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id85_content_0\");\n", + "//# sourceURL=js_c322af42e4" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"789b8b60-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"789b3d2c-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_4eb43971cd" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"789bd566-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id85\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_a152a96deb" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The following query is stored at \u001b[1mGraduate_v2_sql\u001b[0m variable.\n", + "-- Initializing DuckDB environment.\n", + "create schema if not exists logica_home;\n", + "-- Empty record, has to have a field by DuckDB syntax.\n", + "drop type if exists logicarecord893574736 cascade; create type logicarecord893574736 as struct(nirvana numeric);\n", + "create sequence if not exists eternal_logical_sequence;\n", + "\n", + "\n", + "-- Logica type: logicarecord481217614\n", + "drop type if exists logicarecord481217614 cascade; create type logicarecord481217614 as struct(r logicarecord893574736);\n", + "\n", + "-- Logica type: logicarecord383307722\n", + "drop type if exists logicarecord383307722 cascade; create type logicarecord383307722 as struct(a timestamp);\n", + "WITH t_0_Person AS (SELECT * FROM (\n", + " \n", + " SELECT\n", + " 'John' AS name,\n", + " true AS has_graduate_degree\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " 'Jane' AS name,\n", + " false AS has_graduate_degree\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " 'Maria' AS name,\n", + " true AS has_graduate_degree\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " 'Dorian' AS name,\n", + " false AS has_graduate_degree\n", + " \n", + ") AS UNUSED_TABLE_NAME )\n", + "SELECT\n", + " Person.name AS name\n", + "FROM\n", + " t_0_Person AS Person\n", + "WHERE\n", + " (Person.has_graduate_degree = true);\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"789cdd26-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"789ae9a8-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_fba8168338" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"789e7d70-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_125f94d67f" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"789ecc44-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id85_content_1\");\n", + "//# sourceURL=js_5afc8bef34" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"789f1b40-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"789ecc44-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_6d8998fa70" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"789f632a-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id85\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_147a38b28e" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The following table is stored at \u001b[1mGraduate_v2\u001b[0m variable.\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
name
0John
1Maria
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"78a15c84-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"789e7d70-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_b994caca3e" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"78a314b6-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"78963516-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_2a7dd43f13" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"78a4e0ac-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_bdd763e744" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"78a5373c-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id83_content_3\");\n", + "//# sourceURL=js_7adeb52e3e" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"78a585e8-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"78a5373c-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_505041d7c8" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"78a5d070-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id83\"].setSelectedTabIndex(3);\n", + "//# sourceURL=js_e563ba3f0c" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"78aa33d6-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"78a4e0ac-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_21451ca765" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"78ad429c-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_6e455684c6" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"78ad9364-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id83_content_2\");\n", + "//# sourceURL=js_a7c54f31dc" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"78ade01c-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"78ad9364-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_349613566c" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"78ae7e46-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id83\"].setSelectedTabIndex(2);\n", + "//# sourceURL=js_c1af3c509a" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"78b02520-d22d-11ef-a7c0-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id86\", \"tabNames\": [\"SQL\", \"Result\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_6b1a7f83fd" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"78b069ea-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id86\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_f7ae72161f" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"78b1a562-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_7a6854198a" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"78b1f0a8-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id86_content_0\");\n", + "//# sourceURL=js_c1b698a97d" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"78b23932-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"78b1f0a8-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_a62468f51f" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"78b27f1e-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id86\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_50a1b8917a" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The following query is stored at \u001b[1mNotGraduate_sql\u001b[0m variable.\n", + "-- Initializing DuckDB environment.\n", + "create schema if not exists logica_home;\n", + "-- Empty record, has to have a field by DuckDB syntax.\n", + "drop type if exists logicarecord893574736 cascade; create type logicarecord893574736 as struct(nirvana numeric);\n", + "create sequence if not exists eternal_logical_sequence;\n", + "\n", + "\n", + "-- Logica type: logicarecord481217614\n", + "drop type if exists logicarecord481217614 cascade; create type logicarecord481217614 as struct(r logicarecord893574736);\n", + "\n", + "-- Logica type: logicarecord383307722\n", + "drop type if exists logicarecord383307722 cascade; create type logicarecord383307722 as struct(a timestamp);\n", + "WITH t_0_Person AS (SELECT * FROM (\n", + " \n", + " SELECT\n", + " 'John' AS name,\n", + " true AS has_graduate_degree\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " 'Jane' AS name,\n", + " false AS has_graduate_degree\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " 'Maria' AS name,\n", + " true AS has_graduate_degree\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " 'Dorian' AS name,\n", + " false AS has_graduate_degree\n", + " \n", + ") AS UNUSED_TABLE_NAME )\n", + "SELECT\n", + " Person.name AS name\n", + "FROM\n", + " t_0_Person AS Person\n", + "WHERE\n", + " NOT Person.has_graduate_degree;\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"78b46018-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"78b1a562-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_f07537145f" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"78b5eb90-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_4bfcff77a1" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"78b63834-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id86_content_1\");\n", + "//# sourceURL=js_73effd7857" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"78b68140-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"78b63834-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_ea8e83c7b9" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"78b6c60a-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id86\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_f9685da738" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The following table is stored at \u001b[1mNotGraduate\u001b[0m variable.\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
name
0Jane
1Dorian
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"78b8047a-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"78b5eb90-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_794805037f" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"78b945c4-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"78ad429c-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_ab8740b766" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"78bb05ee-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_860084dc04" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"78bb5260-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id83_content_3\");\n", + "//# sourceURL=js_2ff82d9303" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"78bb9aae-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"78bb5260-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_22908ef27c" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"78bbdee2-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id83\"].setSelectedTabIndex(3);\n", + "//# sourceURL=js_79919eb145" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "image/svg+xml": "\n\n\n\n\n\nConcertina\n\n\n\nGraduate_v2\n\nGraduate_v2\n\n\n\nNotGraduate\n\nNotGraduate\n\n\n\nGraduate_v1\n\nGraduate_v1\n\n\n\n", + "text/plain": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Running predicate: Graduate_v2 (24 ms)\n", + "Running predicate: NotGraduate (4 ms)\n", + "Running predicate: Graduate_v1 (6 ms)\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"78f2a274-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"78bb05ee-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_201e195774" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"78f47612-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_27fcaa35bf" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"78f4ed54-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id83_content_0\");\n", + "//# sourceURL=js_030d42e739" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"78f5bb80-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"78f4ed54-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_492f7f3f23" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"78f6078e-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id83\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_64e32c60ff" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"78f7b6e2-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_de251aafae" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"78f80444-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id84_content_1\");\n", + "//# sourceURL=js_79df643392" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"78f84b02-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"78f80444-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_5f3f280c51" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"78f89260-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id84\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_148c9a63ba" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"78faac1c-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"78f7b6e2-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_a436ad9576" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + " \n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"78fc12d2-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"78f47612-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_5ebd6ddf18" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"78fdb614-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_efa13879a7" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"78fe0272-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id83_content_1\");\n", + "//# sourceURL=js_be8f1f196f" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"78fe4b88-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"78fe0272-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_f5a5711638" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"78fe8f12-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id83\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_0fa2443f1d" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"78ffb18a-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_d53aee801a" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"78fffc26-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id85_content_1\");\n", + "//# sourceURL=js_374e29dee5" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"79004168-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"78fffc26-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_1d0a70c734" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"79008948-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id85\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_925c15a532" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"79024332-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"78ffb18a-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_3f7d7ed3d2" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + " \n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7903a7ea-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"78fdb614-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_3b66f28135" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"79052dea-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_bb5438d988" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"790575ca-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id83_content_2\");\n", + "//# sourceURL=js_5c9ce2f9ab" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7905bce2-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"790575ca-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_e19761f961" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"79060594-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id83\"].setSelectedTabIndex(2);\n", + "//# sourceURL=js_167167ebc4" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"79072d2a-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_a286d13f12" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"79077aa0-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id86_content_1\");\n", + "//# sourceURL=js_176e1393d7" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7907c258-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"79077aa0-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_95776f3ac8" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"79080790-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id86\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_009ad8fe54" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"79193a42-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"79072d2a-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_e22a107c42" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + " \n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"791c6280-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"79052dea-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_a4511bded0" + ] + }, + "metadata": {} + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "d-N6DwwJrGr4" + }, + "source": [ + "Conjunction, disjunction and negation of boolean values is done with `&&`, `||` and `!` operators respectively. These operators correspond to `,`, `|` and `~` discussed above.\n", + "\n", + "Basis relations `==`, `>`, `>=`, etc can act as propositions and boolean functions, so both boolean and propositional and boolean operations could be applied to them.\n", + "\n", + "For conjuncts of the predicate you are encouraged to use `,` but for negation and disjuctions of the boolean `!` and `||` should be preferred, as that results in simpler SQL code." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "nvDm194jrFyc", + "colab": { + "resources": { + "http://localhost:8080/nbextensions/google.colab/tabbar.css": { + "data": "Lmdvb2ctdGFie3Bvc2l0aW9uOnJlbGF0aXZlO3BhZGRpbmc6NHB4IDhweDtjb2xvcjojMDBjO3RleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7Y3Vyc29yOmRlZmF1bHR9Lmdvb2ctdGFiLWJhci10b3AgLmdvb2ctdGFie21hcmdpbjoxcHggNHB4IDAgMDtib3JkZXItYm90dG9tOjA7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLXRvcDphZnRlciwuZ29vZy10YWItYmFyLWJvdHRvbTphZnRlcntjb250ZW50OiIgIjtkaXNwbGF5OmJsb2NrO2hlaWdodDowO2NsZWFyOmJvdGg7dmlzaWJpbGl0eTpoaWRkZW59Lmdvb2ctdGFiLWJhci1ib3R0b20gLmdvb2ctdGFie21hcmdpbjowIDRweCAxcHggMDtib3JkZXItdG9wOjA7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLXN0YXJ0IC5nb29nLXRhYnttYXJnaW46MCAwIDRweCAxcHg7Ym9yZGVyLXJpZ2h0OjB9Lmdvb2ctdGFiLWJhci1lbmQgLmdvb2ctdGFie21hcmdpbjowIDFweCA0cHggMDtib3JkZXItbGVmdDowfS5nb29nLXRhYi1ob3ZlcntiYWNrZ3JvdW5kOiNlZWV9Lmdvb2ctdGFiLWRpc2FibGVke2NvbG9yOiM2NjZ9Lmdvb2ctdGFiLXNlbGVjdGVke2NvbG9yOiMwMDA7YmFja2dyb3VuZDojZmZmO3RleHQtZGVjb3JhdGlvbjpub25lO2ZvbnQtd2VpZ2h0OmJvbGQ7Ym9yZGVyOjFweCBzb2xpZCAjNmI5MGRhfS5nb29nLXRhYi1iYXItdG9we3BhZGRpbmctdG9wOjVweCFpbXBvcnRhbnQ7cGFkZGluZy1sZWZ0OjVweCFpbXBvcnRhbnQ7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgIzZiOTBkYSFpbXBvcnRhbnR9Lmdvb2ctdGFiLWJhci10b3AgLmdvb2ctdGFiLXNlbGVjdGVke3RvcDoxcHg7bWFyZ2luLXRvcDowO3BhZGRpbmctYm90dG9tOjVweH0uZ29vZy10YWItYmFyLWJvdHRvbSAuZ29vZy10YWItc2VsZWN0ZWR7dG9wOi0xcHg7bWFyZ2luLWJvdHRvbTowO3BhZGRpbmctdG9wOjVweH0uZ29vZy10YWItYmFyLXN0YXJ0IC5nb29nLXRhYi1zZWxlY3RlZHtsZWZ0OjFweDttYXJnaW4tbGVmdDowO3BhZGRpbmctcmlnaHQ6OXB4fS5nb29nLXRhYi1iYXItZW5kIC5nb29nLXRhYi1zZWxlY3RlZHtsZWZ0Oi0xcHg7bWFyZ2luLXJpZ2h0OjA7cGFkZGluZy1sZWZ0OjlweH0uZ29vZy10YWItYmFye21hcmdpbjowO2JvcmRlcjowO3BhZGRpbmc6MDtsaXN0LXN0eWxlOm5vbmU7Y3Vyc29yOmRlZmF1bHQ7b3V0bGluZTpub25lO2JhY2tncm91bmQ6I2ViZWZmOX0uZ29vZy10YWItYmFyLWNsZWFye2NsZWFyOmJvdGg7aGVpZ2h0OjA7b3ZlcmZsb3c6aGlkZGVufS5nb29nLXRhYi1iYXItc3RhcnR7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLWVuZHtmbG9hdDpyaWdodH0qIGh0bWwgLmdvb2ctdGFiLWJhci1zdGFydHttYXJnaW4tcmlnaHQ6LTNweH0qIGh0bWwgLmdvb2ctdGFiLWJhci1lbmR7bWFyZ2luLWxlZnQ6LTNweH1zZW50aW5lbHt9", + "ok": true, + "headers": [ + [ + "content-length", + "1404" + ], + [ + "content-type", + "text/css" + ] + ], + "status": 200, + "status_text": "" + }, + "http://localhost:8080/nbextensions/google.colab/tabbar_main.min.js": { + "data": "Ly8gY2xhbmctZm9ybWF0IG9mZgooZnVuY3Rpb24oKXt2YXIgZyxhYT1mdW5jdGlvbihhKXt2YXIgYj0wO3JldHVybiBmdW5jdGlvbigpe3JldHVybiBiPGEubGVuZ3RoP3tkb25lOiExLHZhbHVlOmFbYisrXX06e2RvbmU6ITB9fX0sYmE9dHlwZW9mIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzPT0iZnVuY3Rpb24iP09iamVjdC5kZWZpbmVQcm9wZXJ0eTpmdW5jdGlvbihhLGIsYyl7aWYoYT09QXJyYXkucHJvdG90eXBlfHxhPT1PYmplY3QucHJvdG90eXBlKXJldHVybiBhO2FbYl09Yy52YWx1ZTtyZXR1cm4gYX0sY2E9ZnVuY3Rpb24oYSl7YT1bIm9iamVjdCI9PXR5cGVvZiBnbG9iYWxUaGlzJiZnbG9iYWxUaGlzLGEsIm9iamVjdCI9PXR5cGVvZiB3aW5kb3cmJndpbmRvdywib2JqZWN0Ij09dHlwZW9mIHNlbGYmJnNlbGYsIm9iamVjdCI9PXR5cGVvZiBnbG9iYWwmJmdsb2JhbF07Zm9yKHZhciBiPTA7YjxhLmxlbmd0aDsrK2Ipe3ZhciBjPWFbYl07aWYoYyYmYy5NYXRoPT1NYXRoKXJldHVybiBjfXRocm93IEVycm9yKCJDYW5ub3QgZmluZCBnbG9iYWwgb2JqZWN0Iik7Cn0sZGE9Y2EodGhpcyksZWE9ZnVuY3Rpb24oYSxiKXtpZihiKWE6e3ZhciBjPWRhO2E9YS5zcGxpdCgiLiIpO2Zvcih2YXIgZD0wO2Q8YS5sZW5ndGgtMTtkKyspe3ZhciBlPWFbZF07aWYoIShlIGluIGMpKWJyZWFrIGE7Yz1jW2VdfWE9YVthLmxlbmd0aC0xXTtkPWNbYV07Yj1iKGQpO2IhPWQmJmIhPW51bGwmJmJhKGMsYSx7Y29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOmJ9KX19OwplYSgiU3ltYm9sIixmdW5jdGlvbihhKXtpZihhKXJldHVybiBhO3ZhciBiPWZ1bmN0aW9uKGYsaCl7dGhpcy5nPWY7YmEodGhpcywiZGVzY3JpcHRpb24iLHtjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6aH0pfTtiLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmd9O3ZhciBjPSJqc2NvbXBfc3ltYm9sXyIrKE1hdGgucmFuZG9tKCkqMUU5Pj4+MCkrIl8iLGQ9MCxlPWZ1bmN0aW9uKGYpe2lmKHRoaXMgaW5zdGFuY2VvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoIlN5bWJvbCBpcyBub3QgYSBjb25zdHJ1Y3RvciIpO3JldHVybiBuZXcgYihjKyhmfHwiIikrIl8iK2QrKyxmKX07cmV0dXJuIGV9KTsKdmFyIGZhPWZ1bmN0aW9uKGEpe3ZhciBiPXR5cGVvZiBTeW1ib2whPSJ1bmRlZmluZWQiJiZTeW1ib2wuaXRlcmF0b3ImJmFbU3ltYm9sLml0ZXJhdG9yXTtpZihiKXJldHVybiBiLmNhbGwoYSk7aWYodHlwZW9mIGEubGVuZ3RoPT0ibnVtYmVyIilyZXR1cm57bmV4dDphYShhKX07dGhyb3cgRXJyb3IoU3RyaW5nKGEpKyIgaXMgbm90IGFuIGl0ZXJhYmxlIG9yIEFycmF5TGlrZSIpO307ZWEoIlN5bWJvbC5kaXNwb3NlIixmdW5jdGlvbihhKXtyZXR1cm4gYT9hOlN5bWJvbCgiU3ltYm9sLmRpc3Bvc2UiKX0pOy8qCgogQ29weXJpZ2h0IFRoZSBDbG9zdXJlIExpYnJhcnkgQXV0aG9ycy4KIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wCiovCnZhciBsPXRoaXN8fHNlbGYsaWE9ZnVuY3Rpb24oYSl7YS5JYT12b2lkIDA7YS5WPWZ1bmN0aW9uKCl7cmV0dXJuIGEuSWE/YS5JYTphLklhPW5ldyBhfX0samE9ZnVuY3Rpb24oYSl7dmFyIGI9dHlwZW9mIGE7cmV0dXJuIGIhPSJvYmplY3QiP2I6YT9BcnJheS5pc0FycmF5KGEpPyJhcnJheSI6YjoibnVsbCJ9LGthPWZ1bmN0aW9uKGEpe3ZhciBiPWphKGEpO3JldHVybiBiPT0iYXJyYXkifHxiPT0ib2JqZWN0IiYmdHlwZW9mIGEubGVuZ3RoPT0ibnVtYmVyIn0sbT1mdW5jdGlvbihhKXt2YXIgYj10eXBlb2YgYTtyZXR1cm4gYj09Im9iamVjdCImJmEhPW51bGx8fGI9PSJmdW5jdGlvbiJ9LG5hPWZ1bmN0aW9uKGEpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYSxsYSkmJmFbbGFdfHwoYVtsYV09KyttYSl9LGxhPSJjbG9zdXJlX3VpZF8iKyhNYXRoLnJhbmRvbSgpKjFFOT4+PjApLG1hPTAsbj1mdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoKXt9Yy5wcm90b3R5cGU9CmIucHJvdG90eXBlO2EubD1iLnByb3RvdHlwZTthLnByb3RvdHlwZT1uZXcgYzthLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1hO2EucWQ9ZnVuY3Rpb24oZCxlLGYpe2Zvcih2YXIgaD1BcnJheShhcmd1bWVudHMubGVuZ3RoLTIpLGs9MjtrPGFyZ3VtZW50cy5sZW5ndGg7aysrKWhbay0yXT1hcmd1bWVudHNba107cmV0dXJuIGIucHJvdG90eXBlW2VdLmFwcGx5KGQsaCl9fTtmdW5jdGlvbiBvYShhLGIpe2lmKEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKUVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsb2EpO2Vsc2V7dmFyIGM9RXJyb3IoKS5zdGFjaztjJiYodGhpcy5zdGFjaz1jKX1hJiYodGhpcy5tZXNzYWdlPVN0cmluZyhhKSk7YiE9PXZvaWQgMCYmKHRoaXMuY2F1c2U9Yil9bihvYSxFcnJvcik7b2EucHJvdG90eXBlLm5hbWU9IkN1c3RvbUVycm9yIjt2YXIgcGE7ZnVuY3Rpb24gcWEoYSxiKXthPWEuc3BsaXQoIiVzIik7Zm9yKHZhciBjPSIiLGQ9YS5sZW5ndGgtMSxlPTA7ZTxkO2UrKyljKz1hW2VdKyhlPGIubGVuZ3RoP2JbZV06IiVzIik7b2EuY2FsbCh0aGlzLGMrYVtkXSl9bihxYSxvYSk7cWEucHJvdG90eXBlLm5hbWU9IkFzc2VydGlvbkVycm9yIjtmdW5jdGlvbiByYShhLGIsYyxkKXt2YXIgZT0iQXNzZXJ0aW9uIGZhaWxlZCI7aWYoYyl7ZSs9IjogIitjO3ZhciBmPWR9ZWxzZSBhJiYoZSs9IjogIithLGY9Yik7dGhyb3cgbmV3IHFhKCIiK2UsZnx8W10pO30KdmFyIHA9ZnVuY3Rpb24oYSxiLGMpe2F8fHJhKCIiLG51bGwsYixBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMikpO3JldHVybiBhfSxzYT1mdW5jdGlvbihhLGIsYyl7bShhKSYmYS5ub2RlVHlwZT09MXx8cmEoIkV4cGVjdGVkIEVsZW1lbnQgYnV0IGdvdCAlczogJXMuIixbamEoYSksYV0sYixBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMikpfSx1YT1mdW5jdGlvbihhLGIsYyxkKXthIGluc3RhbmNlb2YgYnx8cmEoIkV4cGVjdGVkIGluc3RhbmNlb2YgJXMgYnV0IGdvdCAlcy4iLFt0YShiKSx0YShhKV0sYyxBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMykpfTsKZnVuY3Rpb24gdGEoYSl7cmV0dXJuIGEgaW5zdGFuY2VvZiBGdW5jdGlvbj9hLmRpc3BsYXlOYW1lfHxhLm5hbWV8fCJ1bmtub3duIHR5cGUgbmFtZSI6YSBpbnN0YW5jZW9mIE9iamVjdD9hLmNvbnN0cnVjdG9yLmRpc3BsYXlOYW1lfHxhLmNvbnN0cnVjdG9yLm5hbWV8fE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhKTphPT09bnVsbD8ibnVsbCI6dHlwZW9mIGF9O3ZhciB2YT1BcnJheS5wcm90b3R5cGUuaW5kZXhPZj9mdW5jdGlvbihhLGIpe3AoYS5sZW5ndGghPW51bGwpO3JldHVybiBBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKGEsYix2b2lkIDApfTpmdW5jdGlvbihhLGIpe2lmKHR5cGVvZiBhPT09InN0cmluZyIpcmV0dXJuIHR5cGVvZiBiIT09InN0cmluZyJ8fGIubGVuZ3RoIT0xPy0xOmEuaW5kZXhPZihiLDApO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWlmKGMgaW4gYSYmYVtjXT09PWIpcmV0dXJuIGM7cmV0dXJuLTF9LHdhPUFycmF5LnByb3RvdHlwZS5mb3JFYWNoP2Z1bmN0aW9uKGEsYil7cChhLmxlbmd0aCE9bnVsbCk7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChhLGIsdm9pZCAwKX06ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9YS5sZW5ndGgsZD10eXBlb2YgYT09PSJzdHJpbmciP2Euc3BsaXQoIiIpOmEsZT0wO2U8YztlKyspZSBpbiBkJiZiLmNhbGwodm9pZCAwLGRbZV0sZSxhKX07CmZ1bmN0aW9uIHhhKGEsYil7Yj12YShhLGIpO3ZhciBjO2lmKGM9Yj49MClwKGEubGVuZ3RoIT1udWxsKSxBcnJheS5wcm90b3R5cGUuc3BsaWNlLmNhbGwoYSxiLDEpO3JldHVybiBjfWZ1bmN0aW9uIHlhKGEpe3ZhciBiPWEubGVuZ3RoO2lmKGI+MCl7Zm9yKHZhciBjPUFycmF5KGIpLGQ9MDtkPGI7ZCsrKWNbZF09YVtkXTtyZXR1cm4gY31yZXR1cm5bXX1mdW5jdGlvbiB6YShhLGIsYyxkKXtwKGEubGVuZ3RoIT1udWxsKTtBcnJheS5wcm90b3R5cGUuc3BsaWNlLmFwcGx5KGEsQWEoYXJndW1lbnRzLDEpKX1mdW5jdGlvbiBBYShhLGIsYyl7cChhLmxlbmd0aCE9bnVsbCk7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg8PTI/QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYSxiKTpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhLGIsYyl9O2Z1bmN0aW9uIEJhKGEsYixjKXtmb3IodmFyIGQgaW4gYSliLmNhbGwoYyxhW2RdLGQsYSl9ZnVuY3Rpb24gQ2EoYSxiKXtmb3IodmFyIGMgaW4gYSlpZihhW2NdPT1iKXJldHVybiEwO3JldHVybiExfWZ1bmN0aW9uIERhKGEsYixjKXtpZihhIT09bnVsbCYmYiBpbiBhKXRocm93IEVycm9yKCdUaGUgb2JqZWN0IGFscmVhZHkgY29udGFpbnMgdGhlIGtleSAiJytiKyciJyk7YVtiXT1jfWZ1bmN0aW9uIEVhKGEpe3ZhciBiPXt9LGM7Zm9yKGMgaW4gYSliW2FbY11dPWM7cmV0dXJuIGJ9dmFyIEZhPSJjb25zdHJ1Y3RvciBoYXNPd25Qcm9wZXJ0eSBpc1Byb3RvdHlwZU9mIHByb3BlcnR5SXNFbnVtZXJhYmxlIHRvTG9jYWxlU3RyaW5nIHRvU3RyaW5nIHZhbHVlT2YiLnNwbGl0KCIgIik7CmZ1bmN0aW9uIEdhKGEsYil7Zm9yKHZhciBjLGQsZT0xO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspe2Q9YXJndW1lbnRzW2VdO2ZvcihjIGluIGQpYVtjXT1kW2NdO2Zvcih2YXIgZj0wO2Y8RmEubGVuZ3RoO2YrKyljPUZhW2ZdLE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChkLGMpJiYoYVtjXT1kW2NdKX19O3ZhciBIYT1TdHJpbmcucHJvdG90eXBlLnRyaW0/ZnVuY3Rpb24oYSl7cmV0dXJuIGEudHJpbSgpfTpmdW5jdGlvbihhKXtyZXR1cm4vXltcc1x4YTBdKihbXHNcU10qPylbXHNceGEwXSokLy5leGVjKGEpWzFdfTsvKgoKIENvcHlyaWdodCBHb29nbGUgTExDCiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMAoqLwp2YXIgSWE9e307dmFyIEphPWZ1bmN0aW9uKGEpe2lmKElhIT09SWEpdGhyb3cgRXJyb3IoIkJhZCBzZWNyZXQiKTt0aGlzLmc9YX07SmEucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ307bmV3IEphKCJhYm91dDpibGFuayIpO25ldyBKYSgiYWJvdXQ6aW52YWxpZCN6Q2xvc3VyZXoiKTt2YXIgS2E9W10sTGE9ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJBIFVSTCB3aXRoIGNvbnRlbnQgJyIrYSsiJyB3YXMgc2FuaXRpemVkIGF3YXkuIil9O0thLmluZGV4T2YoTGEpPT09LTEmJkthLnB1c2goTGEpO3ZhciBNYSxOYTthOntmb3IodmFyIE9hPVsiQ0xPU1VSRV9GTEFHUyJdLFBhPWwsUWE9MDtRYTxPYS5sZW5ndGg7UWErKylpZihQYT1QYVtPYVtRYV1dLFBhPT1udWxsKXtOYT1udWxsO2JyZWFrIGF9TmE9UGF9dmFyIFJhPU5hJiZOYVs2MTA0MDEzMDFdO01hPVJhIT1udWxsP1JhOiExO2Z1bmN0aW9uIFNhKCl7dmFyIGE9bC5uYXZpZ2F0b3I7cmV0dXJuIGEmJihhPWEudXNlckFnZW50KT9hOiIifXZhciBUYSxVYT1sLm5hdmlnYXRvcjtUYT1VYT9VYS51c2VyQWdlbnREYXRhfHxudWxsOm51bGw7ZnVuY3Rpb24gcihhKXtyZXR1cm4gU2EoKS5pbmRleE9mKGEpIT0tMX07dmFyIFZhPXIoIkVkZ2UiKSx0PXIoIkdlY2tvIikmJiEoU2EoKS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoIndlYmtpdCIpIT0tMSYmIXIoIkVkZ2UiKSkmJiEocigiVHJpZGVudCIpfHxyKCJNU0lFIikpJiYhcigiRWRnZSIpLHU9U2EoKS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoIndlYmtpdCIpIT0tMSYmIXIoIkVkZ2UiKSx2PU1hJiZUYSYmVGEucGxhdGZvcm0/VGEucGxhdGZvcm09PT0ibWFjT1MiOnIoIk1hY2ludG9zaCIpO3ZhciBYYT1mdW5jdGlvbihhLGIpe0JhKGIsZnVuY3Rpb24oYyxkKXtkPT0ic3R5bGUiP2Euc3R5bGUuY3NzVGV4dD1jOmQ9PSJjbGFzcyI/YS5jbGFzc05hbWU9YzpkPT0iZm9yIj9hLmh0bWxGb3I9YzpXYS5oYXNPd25Qcm9wZXJ0eShkKT9hLnNldEF0dHJpYnV0ZShXYVtkXSxjKTpkLmxhc3RJbmRleE9mKCJhcmlhLSIsMCk9PTB8fGQubGFzdEluZGV4T2YoImRhdGEtIiwwKT09MD9hLnNldEF0dHJpYnV0ZShkLGMpOmFbZF09Y30pfSxXYT17Y2VsbHBhZGRpbmc6ImNlbGxQYWRkaW5nIixjZWxsc3BhY2luZzoiY2VsbFNwYWNpbmciLGNvbHNwYW46ImNvbFNwYW4iLGZyYW1lYm9yZGVyOiJmcmFtZUJvcmRlciIsaGVpZ2h0OiJoZWlnaHQiLG1heGxlbmd0aDoibWF4TGVuZ3RoIixub25jZToibm9uY2UiLHJvbGU6InJvbGUiLHJvd3NwYW46InJvd1NwYW4iLHR5cGU6InR5cGUiLHVzZW1hcDoidXNlTWFwIix2YWxpZ246InZBbGlnbiIsd2lkdGg6IndpZHRoIn0sWWE9ZnVuY3Rpb24oYSwKYixjKXtmdW5jdGlvbiBkKGspe2smJmIuYXBwZW5kQ2hpbGQodHlwZW9mIGs9PT0ic3RyaW5nIj9hLmNyZWF0ZVRleHROb2RlKGspOmspfWZvcih2YXIgZT0yO2U8Yy5sZW5ndGg7ZSsrKXt2YXIgZj1jW2VdO2lmKCFrYShmKXx8bShmKSYmZi5ub2RlVHlwZT4wKWQoZik7ZWxzZXthOntpZihmJiZ0eXBlb2YgZi5sZW5ndGg9PSJudW1iZXIiKXtpZihtKGYpKXt2YXIgaD10eXBlb2YgZi5pdGVtPT0iZnVuY3Rpb24ifHx0eXBlb2YgZi5pdGVtPT0ic3RyaW5nIjticmVhayBhfWlmKHR5cGVvZiBmPT09ImZ1bmN0aW9uIil7aD10eXBlb2YgZi5pdGVtPT0iZnVuY3Rpb24iO2JyZWFrIGF9fWg9ITF9d2EoaD95YShmKTpmLGQpfX19LFphPWZ1bmN0aW9uKGEsYil7Yj1TdHJpbmcoYik7YS5jb250ZW50VHlwZT09PSJhcHBsaWNhdGlvbi94aHRtbCt4bWwiJiYoYj1iLnRvTG93ZXJDYXNlKCkpO3JldHVybiBhLmNyZWF0ZUVsZW1lbnQoYil9LCRhPWZ1bmN0aW9uKGEpe2EmJmEucGFyZW50Tm9kZSYmCmEucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhKX0sYWI9ZnVuY3Rpb24oYSxiKXtpZighYXx8IWIpcmV0dXJuITE7aWYoYS5jb250YWlucyYmYi5ub2RlVHlwZT09MSlyZXR1cm4gYT09Ynx8YS5jb250YWlucyhiKTtpZih0eXBlb2YgYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiE9InVuZGVmaW5lZCIpcmV0dXJuIGE9PWJ8fCEhKGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24oYikmMTYpO2Zvcig7YiYmYSE9YjspYj1iLnBhcmVudE5vZGU7cmV0dXJuIGI9PWF9LGJiPWZ1bmN0aW9uKGEpe3AoYSwiTm9kZSBjYW5ub3QgYmUgbnVsbCBvciB1bmRlZmluZWQuIik7cmV0dXJuIGEubm9kZVR5cGU9PTk/YTphLm93bmVyRG9jdW1lbnR8fGEuZG9jdW1lbnR9LGNiPWZ1bmN0aW9uKGEsYil7Yj9hLnRhYkluZGV4PTA6KGEudGFiSW5kZXg9LTEsYS5yZW1vdmVBdHRyaWJ1dGUoInRhYkluZGV4IikpfSxkYj1mdW5jdGlvbihhKXtyZXR1cm4gYS5oYXNBdHRyaWJ1dGUoInRhYmluZGV4Iil9LGViPQpmdW5jdGlvbihhKXthPWEudGFiSW5kZXg7cmV0dXJuIHR5cGVvZiBhPT09Im51bWJlciImJmE+PTAmJmE8MzI3Njh9LGZiPWZ1bmN0aW9uKGEpe3RoaXMuZz1hfHxsLmRvY3VtZW50fHxkb2N1bWVudH07ZmIucHJvdG90eXBlLmk9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nO3JldHVybiB0eXBlb2YgYT09PSJzdHJpbmciP2IuZ2V0RWxlbWVudEJ5SWQoYSk6YX07ZmIucHJvdG90eXBlLmg9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXMuZyxlPWFyZ3VtZW50cyxmPWVbMV0saD1aYShkLFN0cmluZyhlWzBdKSk7ZiYmKHR5cGVvZiBmPT09InN0cmluZyI/aC5jbGFzc05hbWU9ZjpBcnJheS5pc0FycmF5KGYpP2guY2xhc3NOYW1lPWYuam9pbigiICIpOlhhKGgsZikpO2UubGVuZ3RoPjImJllhKGQsaCxlKTtyZXR1cm4gaH07dmFyIHc9ZnVuY3Rpb24oKXt0aGlzLmJhPXRoaXMuYmE7dGhpcy5rYT10aGlzLmthfTt3LnByb3RvdHlwZS5iYT0hMTt3LnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7dGhpcy5iYXx8KHRoaXMuYmE9ITAsdGhpcy5DKCkpfTt3LnByb3RvdHlwZVtTeW1ib2wuZGlzcG9zZV09ZnVuY3Rpb24oKXt0aGlzLmRpc3Bvc2UoKX07dy5wcm90b3R5cGUuQz1mdW5jdGlvbigpe2lmKHRoaXMua2EpZm9yKDt0aGlzLmthLmxlbmd0aDspdGhpcy5rYS5zaGlmdCgpKCl9O3ZhciB5PWZ1bmN0aW9uKGEsYil7dGhpcy50eXBlPWE7dGhpcy51PXRoaXMudGFyZ2V0PWI7dGhpcy5kZWZhdWx0UHJldmVudGVkPXRoaXMuQT0hMX07eS5wcm90b3R5cGUudj1mdW5jdGlvbigpe3RoaXMuQT0hMH07eS5wcm90b3R5cGUuaj1mdW5jdGlvbigpe3RoaXMuZGVmYXVsdFByZXZlbnRlZD0hMH07dmFyIGdiPWZ1bmN0aW9uKCl7aWYoIWwuYWRkRXZlbnRMaXN0ZW5lcnx8IU9iamVjdC5kZWZpbmVQcm9wZXJ0eSlyZXR1cm4hMTt2YXIgYT0hMSxiPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwicGFzc2l2ZSIse2dldDpmdW5jdGlvbigpe2E9ITB9fSk7dHJ5e3ZhciBjPWZ1bmN0aW9uKCl7fTtsLmFkZEV2ZW50TGlzdGVuZXIoInRlc3QiLGMsYik7bC5yZW1vdmVFdmVudExpc3RlbmVyKCJ0ZXN0IixjLGIpfWNhdGNoKGQpe31yZXR1cm4gYX0oKTt2YXIgej1mdW5jdGlvbihhLGIpe3kuY2FsbCh0aGlzLGE/YS50eXBlOiIiKTt0aGlzLnJlbGF0ZWRUYXJnZXQ9dGhpcy51PXRoaXMudGFyZ2V0PW51bGw7dGhpcy5idXR0b249dGhpcy5zY3JlZW5ZPXRoaXMuc2NyZWVuWD10aGlzLmNsaWVudFk9dGhpcy5jbGllbnRYPTA7dGhpcy5rZXk9IiI7dGhpcy5nPTA7dGhpcy5tZXRhS2V5PXRoaXMuc2hpZnRLZXk9dGhpcy5hbHRLZXk9dGhpcy5jdHJsS2V5PSExO3RoaXMuc3RhdGU9bnVsbDt0aGlzLkc9ITE7dGhpcy5wb2ludGVySWQ9MDt0aGlzLnBvaW50ZXJUeXBlPSIiO3RoaXMudGltZVN0YW1wPTA7dGhpcy5oPW51bGw7aWYoYSl7dmFyIGM9dGhpcy50eXBlPWEudHlwZSxkPWEuY2hhbmdlZFRvdWNoZXMmJmEuY2hhbmdlZFRvdWNoZXMubGVuZ3RoP2EuY2hhbmdlZFRvdWNoZXNbMF06bnVsbDt0aGlzLnRhcmdldD1hLnRhcmdldHx8YS5zcmNFbGVtZW50O3RoaXMudT1iO2I9YS5yZWxhdGVkVGFyZ2V0O2J8fChjPT0ibW91c2VvdmVyIj8KYj1hLmZyb21FbGVtZW50OmM9PSJtb3VzZW91dCImJihiPWEudG9FbGVtZW50KSk7dGhpcy5yZWxhdGVkVGFyZ2V0PWI7ZD8odGhpcy5jbGllbnRYPWQuY2xpZW50WCE9PXZvaWQgMD9kLmNsaWVudFg6ZC5wYWdlWCx0aGlzLmNsaWVudFk9ZC5jbGllbnRZIT09dm9pZCAwP2QuY2xpZW50WTpkLnBhZ2VZLHRoaXMuc2NyZWVuWD1kLnNjcmVlblh8fDAsdGhpcy5zY3JlZW5ZPWQuc2NyZWVuWXx8MCk6KHRoaXMuY2xpZW50WD1hLmNsaWVudFghPT12b2lkIDA/YS5jbGllbnRYOmEucGFnZVgsdGhpcy5jbGllbnRZPWEuY2xpZW50WSE9PXZvaWQgMD9hLmNsaWVudFk6YS5wYWdlWSx0aGlzLnNjcmVlblg9YS5zY3JlZW5YfHwwLHRoaXMuc2NyZWVuWT1hLnNjcmVlbll8fDApO3RoaXMuYnV0dG9uPWEuYnV0dG9uO3RoaXMuZz1hLmtleUNvZGV8fDA7dGhpcy5rZXk9YS5rZXl8fCIiO3RoaXMuY3RybEtleT1hLmN0cmxLZXk7dGhpcy5hbHRLZXk9YS5hbHRLZXk7dGhpcy5zaGlmdEtleT1hLnNoaWZ0S2V5Owp0aGlzLm1ldGFLZXk9YS5tZXRhS2V5O3RoaXMuRz12P2EubWV0YUtleTphLmN0cmxLZXk7dGhpcy5wb2ludGVySWQ9YS5wb2ludGVySWR8fDA7dGhpcy5wb2ludGVyVHlwZT1hLnBvaW50ZXJUeXBlO3RoaXMuc3RhdGU9YS5zdGF0ZTt0aGlzLnRpbWVTdGFtcD1hLnRpbWVTdGFtcDt0aGlzLmg9YTthLmRlZmF1bHRQcmV2ZW50ZWQmJnoubC5qLmNhbGwodGhpcyl9fTtuKHoseSk7ei5wcm90b3R5cGUudj1mdW5jdGlvbigpe3oubC52LmNhbGwodGhpcyk7dGhpcy5oLnN0b3BQcm9wYWdhdGlvbj90aGlzLmguc3RvcFByb3BhZ2F0aW9uKCk6dGhpcy5oLmNhbmNlbEJ1YmJsZT0hMH07ei5wcm90b3R5cGUuaj1mdW5jdGlvbigpe3oubC5qLmNhbGwodGhpcyk7dmFyIGE9dGhpcy5oO2EucHJldmVudERlZmF1bHQ/YS5wcmV2ZW50RGVmYXVsdCgpOmEucmV0dXJuVmFsdWU9ITF9O3ZhciBoYj0iY2xvc3VyZV9saXN0ZW5hYmxlXyIrKE1hdGgucmFuZG9tKCkqMUU2fDApLGliPWZ1bmN0aW9uKGEpe3JldHVybiEoIWF8fCFhW2hiXSl9O3ZhciBqYj0wO3ZhciBrYj1mdW5jdGlvbihhLGIsYyxkLGUpe3RoaXMubGlzdGVuZXI9YTt0aGlzLnByb3h5PW51bGw7dGhpcy5zcmM9Yjt0aGlzLnR5cGU9Yzt0aGlzLmNhcHR1cmU9ISFkO3RoaXMucGE9ZTt0aGlzLmtleT0rK2piO3RoaXMuamE9dGhpcy5vYT0hMX0sbGI9ZnVuY3Rpb24oYSl7YS5qYT0hMDthLmxpc3RlbmVyPW51bGw7YS5wcm94eT1udWxsO2Euc3JjPW51bGw7YS5wYT1udWxsfTt2YXIgbWI9ZnVuY3Rpb24oYSl7dGhpcy5zcmM9YTt0aGlzLmc9e307dGhpcy5oPTB9O21iLnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZj1hLnRvU3RyaW5nKCk7YT10aGlzLmdbZl07YXx8KGE9dGhpcy5nW2ZdPVtdLHRoaXMuaCsrKTt2YXIgaD1uYihhLGIsZCxlKTtoPi0xPyhiPWFbaF0sY3x8KGIub2E9ITEpKTooYj1uZXcga2IoYix0aGlzLnNyYyxmLCEhZCxlKSxiLm9hPWMsYS5wdXNoKGIpKTtyZXR1cm4gYn07CnZhciBvYj1mdW5jdGlvbihhLGIpe3ZhciBjPWIudHlwZTtjIGluIGEuZyYmeGEoYS5nW2NdLGIpJiYobGIoYiksYS5nW2NdLmxlbmd0aD09MCYmKGRlbGV0ZSBhLmdbY10sYS5oLS0pKX0scGI9ZnVuY3Rpb24oYSxiLGMsZCxlKXthPWEuZ1tiLnRvU3RyaW5nKCldO2I9LTE7YSYmKGI9bmIoYSxjLGQsZSkpO3JldHVybiBiPi0xP2FbYl06bnVsbH0sbmI9ZnVuY3Rpb24oYSxiLGMsZCl7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDsrK2Upe3ZhciBmPWFbZV07aWYoIWYuamEmJmYubGlzdGVuZXI9PWImJmYuY2FwdHVyZT09ISFjJiZmLnBhPT1kKXJldHVybiBlfXJldHVybi0xfTt2YXIgcWI9ImNsb3N1cmVfbG1fIisoTWF0aC5yYW5kb20oKSoxRTZ8MCkscmI9e30sc2I9MCx1Yj1mdW5jdGlvbihhLGIsYyxkLGUpe2lmKGQmJmQub25jZSlyZXR1cm4gdGIoYSxiLGMsZCxlKTtpZihBcnJheS5pc0FycmF5KGIpKXtmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKyl1YihhLGJbZl0sYyxkLGUpO3JldHVybiBudWxsfWM9dmIoYyk7cmV0dXJuIGliKGEpP3diKGEsYixjLG0oZCk/ISFkLmNhcHR1cmU6ISFkLGUpOnhiKGEsYixjLCExLGQsZSl9LHhiPWZ1bmN0aW9uKGEsYixjLGQsZSxmKXtpZighYil0aHJvdyBFcnJvcigiSW52YWxpZCBldmVudCB0eXBlIik7dmFyIGg9bShlKT8hIWUuY2FwdHVyZTohIWUsaz15YihhKTtrfHwoYVtxYl09az1uZXcgbWIoYSkpO2M9ay5hZGQoYixjLGQsaCxmKTtpZihjLnByb3h5KXJldHVybiBjO2Q9emIoKTtjLnByb3h5PWQ7ZC5zcmM9YTtkLmxpc3RlbmVyPWM7aWYoYS5hZGRFdmVudExpc3RlbmVyKWdifHwoZT1oKSxlPT09dm9pZCAwJiYKKGU9ITEpLGEuYWRkRXZlbnRMaXN0ZW5lcihiLnRvU3RyaW5nKCksZCxlKTtlbHNlIGlmKGEuYXR0YWNoRXZlbnQpYS5hdHRhY2hFdmVudChBYihiLnRvU3RyaW5nKCkpLGQpO2Vsc2UgaWYoYS5hZGRMaXN0ZW5lciYmYS5yZW1vdmVMaXN0ZW5lcilwKGI9PT0iY2hhbmdlIiwiTWVkaWFRdWVyeUxpc3Qgb25seSBoYXMgYSBjaGFuZ2UgZXZlbnQiKSxhLmFkZExpc3RlbmVyKGQpO2Vsc2UgdGhyb3cgRXJyb3IoImFkZEV2ZW50TGlzdGVuZXIgYW5kIGF0dGFjaEV2ZW50IGFyZSB1bmF2YWlsYWJsZS4iKTtzYisrO3JldHVybiBjfSx6Yj1mdW5jdGlvbigpe3ZhciBhPUJiLGI9ZnVuY3Rpb24oYyl7cmV0dXJuIGEuY2FsbChiLnNyYyxiLmxpc3RlbmVyLGMpfTtyZXR1cm4gYn0sdGI9ZnVuY3Rpb24oYSxiLGMsZCxlKXtpZihBcnJheS5pc0FycmF5KGIpKXtmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKyl0YihhLGJbZl0sYyxkLGUpO3JldHVybiBudWxsfWM9dmIoYyk7cmV0dXJuIGliKGEpPwphLkEuYWRkKFN0cmluZyhiKSxjLCEwLG0oZCk/ISFkLmNhcHR1cmU6ISFkLGUpOnhiKGEsYixjLCEwLGQsZSl9LENiPWZ1bmN0aW9uKGEsYixjLGQsZSl7aWYoQXJyYXkuaXNBcnJheShiKSlmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKylDYihhLGJbZl0sYyxkLGUpO2Vsc2UgZD1tKGQpPyEhZC5jYXB0dXJlOiEhZCxjPXZiKGMpLGliKGEpPyhhPWEuQSxiPVN0cmluZyhiKS50b1N0cmluZygpLGIgaW4gYS5nJiYoZj1hLmdbYl0sYz1uYihmLGMsZCxlKSxjPi0xJiYobGIoZltjXSkscChmLmxlbmd0aCE9bnVsbCksQXJyYXkucHJvdG90eXBlLnNwbGljZS5jYWxsKGYsYywxKSxmLmxlbmd0aD09MCYmKGRlbGV0ZSBhLmdbYl0sYS5oLS0pKSkpOmEmJihhPXliKGEpKSYmKGM9cGIoYSxiLGMsZCxlKSkmJkEoYyl9LEE9ZnVuY3Rpb24oYSl7aWYodHlwZW9mIGEhPT0ibnVtYmVyIiYmYSYmIWEuamEpe3ZhciBiPWEuc3JjO2lmKGliKGIpKW9iKGIuQSxhKTtlbHNle3ZhciBjPWEudHlwZSwKZD1hLnByb3h5O2IucmVtb3ZlRXZlbnRMaXN0ZW5lcj9iLnJlbW92ZUV2ZW50TGlzdGVuZXIoYyxkLGEuY2FwdHVyZSk6Yi5kZXRhY2hFdmVudD9iLmRldGFjaEV2ZW50KEFiKGMpLGQpOmIuYWRkTGlzdGVuZXImJmIucmVtb3ZlTGlzdGVuZXImJmIucmVtb3ZlTGlzdGVuZXIoZCk7c2ItLTsoYz15YihiKSk/KG9iKGMsYSksYy5oPT0wJiYoYy5zcmM9bnVsbCxiW3FiXT1udWxsKSk6bGIoYSl9fX0sQWI9ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW4gcmI/cmJbYV06cmJbYV09Im9uIithfSxCYj1mdW5jdGlvbihhLGIpe2lmKGEuamEpYT0hMDtlbHNle2I9bmV3IHooYix0aGlzKTt2YXIgYz1hLmxpc3RlbmVyLGQ9YS5wYXx8YS5zcmM7YS5vYSYmQShhKTthPWMuY2FsbChkLGIpfXJldHVybiBhfSx5Yj1mdW5jdGlvbihhKXthPWFbcWJdO3JldHVybiBhIGluc3RhbmNlb2YgbWI/YTpudWxsfSxEYj0iX19jbG9zdXJlX2V2ZW50c19mbl8iKyhNYXRoLnJhbmRvbSgpKjFFOT4+PjApLHZiPWZ1bmN0aW9uKGEpe3AoYSwKIkxpc3RlbmVyIGNhbiBub3QgYmUgbnVsbC4iKTtpZih0eXBlb2YgYT09PSJmdW5jdGlvbiIpcmV0dXJuIGE7cChhLmhhbmRsZUV2ZW50LCJBbiBvYmplY3QgbGlzdGVuZXIgbXVzdCBoYXZlIGhhbmRsZUV2ZW50IG1ldGhvZC4iKTthW0RiXXx8KGFbRGJdPWZ1bmN0aW9uKGIpe3JldHVybiBhLmhhbmRsZUV2ZW50KGIpfSk7cmV0dXJuIGFbRGJdfTt2YXIgRWI9ZnVuY3Rpb24oYSl7dy5jYWxsKHRoaXMpO3RoaXMuaD1hO3RoaXMuZz17fX07bihFYix3KTsKdmFyIEZiPVtdLEI9ZnVuY3Rpb24oYSxiLGMsZCl7QXJyYXkuaXNBcnJheShjKXx8KGMmJihGYlswXT1jLnRvU3RyaW5nKCkpLGM9RmIpO2Zvcih2YXIgZT0wO2U8Yy5sZW5ndGg7ZSsrKXt2YXIgZj11YihiLGNbZV0sZHx8YS5oYW5kbGVFdmVudCwhMSxhLmh8fGEpO2lmKCFmKWJyZWFrO2EuZ1tmLmtleV09Zn1yZXR1cm4gYX0sQz1mdW5jdGlvbihhLGIsYyxkLGUsZil7aWYoQXJyYXkuaXNBcnJheShjKSlmb3IodmFyIGg9MDtoPGMubGVuZ3RoO2grKylDKGEsYixjW2hdLGQsZSxmKTtlbHNlIGQ9ZHx8YS5oYW5kbGVFdmVudCxlPW0oZSk/ISFlLmNhcHR1cmU6ISFlLGY9Znx8YS5ofHxhLGQ9dmIoZCksZT0hIWUsYz1pYihiKT9wYihiLkEsU3RyaW5nKGMpLGQsZSxmKTpiPyhiPXliKGIpKT9wYihiLGMsZCxlLGYpOm51bGw6bnVsbCxjJiYoQShjKSxkZWxldGUgYS5nW2Mua2V5XSk7cmV0dXJuIGF9LEdiPWZ1bmN0aW9uKGEpe0JhKGEuZyxmdW5jdGlvbihiLGMpe3RoaXMuZy5oYXNPd25Qcm9wZXJ0eShjKSYmCkEoYil9LGEpO2EuZz17fX07RWIucHJvdG90eXBlLkM9ZnVuY3Rpb24oKXtFYi5sLkMuY2FsbCh0aGlzKTtHYih0aGlzKX07RWIucHJvdG90eXBlLmhhbmRsZUV2ZW50PWZ1bmN0aW9uKCl7dGhyb3cgRXJyb3IoIkV2ZW50SGFuZGxlci5oYW5kbGVFdmVudCBub3QgaW1wbGVtZW50ZWQiKTt9O3ZhciBEPWZ1bmN0aW9uKCl7dy5jYWxsKHRoaXMpO3RoaXMuQT1uZXcgbWIodGhpcyk7dGhpcy5ZYT10aGlzO3RoaXMubGE9bnVsbH07bihELHcpO0QucHJvdG90eXBlW2hiXT0hMDtELnByb3RvdHlwZS5BYT1mdW5jdGlvbihhKXt0aGlzLmxhPWF9O0QucHJvdG90eXBlLnJlbW92ZUV2ZW50TGlzdGVuZXI9ZnVuY3Rpb24oYSxiLGMsZCl7Q2IodGhpcyxhLGIsYyxkKX07CnZhciBFPWZ1bmN0aW9uKGEsYil7SGIoYSk7dmFyIGM9YS5sYTtpZihjKXt2YXIgZD1bXTtmb3IodmFyIGU9MTtjO2M9Yy5sYSlkLnB1c2goYykscCgrK2U8MUUzLCJpbmZpbml0ZSBsb29wIil9YT1hLllhO2M9Yi50eXBlfHxiO3R5cGVvZiBiPT09InN0cmluZyI/Yj1uZXcgeShiLGEpOmIgaW5zdGFuY2VvZiB5P2IudGFyZ2V0PWIudGFyZ2V0fHxhOihlPWIsYj1uZXcgeShjLGEpLEdhKGIsZSkpO2U9ITA7dmFyIGY7aWYoZClmb3IoZj1kLmxlbmd0aC0xOyFiLkEmJmY+PTA7Zi0tKXt2YXIgaD1iLnU9ZFtmXTtlPUliKGgsYywhMCxiKSYmZX1iLkF8fChoPWIudT1hLGU9SWIoaCxjLCEwLGIpJiZlLGIuQXx8KGU9SWIoaCxjLCExLGIpJiZlKSk7aWYoZClmb3IoZj0wOyFiLkEmJmY8ZC5sZW5ndGg7ZisrKWg9Yi51PWRbZl0sZT1JYihoLGMsITEsYikmJmU7cmV0dXJuIGV9OwpELnByb3RvdHlwZS5DPWZ1bmN0aW9uKCl7RC5sLkMuY2FsbCh0aGlzKTtpZih0aGlzLkEpe3ZhciBhPXRoaXMuQSxiPTAsYztmb3IoYyBpbiBhLmcpe2Zvcih2YXIgZD1hLmdbY10sZT0wO2U8ZC5sZW5ndGg7ZSsrKSsrYixsYihkW2VdKTtkZWxldGUgYS5nW2NdO2EuaC0tfX10aGlzLmxhPW51bGx9O3ZhciB3Yj1mdW5jdGlvbihhLGIsYyxkLGUpe0hiKGEpO3JldHVybiBhLkEuYWRkKFN0cmluZyhiKSxjLCExLGQsZSl9LEliPWZ1bmN0aW9uKGEsYixjLGQpe2I9YS5BLmdbU3RyaW5nKGIpXTtpZighYilyZXR1cm4hMDtiPWIuY29uY2F0KCk7Zm9yKHZhciBlPSEwLGY9MDtmPGIubGVuZ3RoOysrZil7dmFyIGg9YltmXTtpZihoJiYhaC5qYSYmaC5jYXB0dXJlPT1jKXt2YXIgaz1oLmxpc3RlbmVyLHE9aC5wYXx8aC5zcmM7aC5vYSYmb2IoYS5BLGgpO2U9ay5jYWxsKHEsZCkhPT0hMSYmZX19cmV0dXJuIGUmJiFkLmRlZmF1bHRQcmV2ZW50ZWR9LEhiPWZ1bmN0aW9uKGEpe3AoYS5BLCJFdmVudCB0YXJnZXQgaXMgbm90IGluaXRpYWxpemVkLiBEaWQgeW91IGNhbGwgdGhlIHN1cGVyY2xhc3MgKGdvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0KSBjb25zdHJ1Y3Rvcj8iKX07dmFyIEpiPXQ/Ik1velVzZXJTZWxlY3QiOnV8fFZhPyJXZWJraXRVc2VyU2VsZWN0IjpudWxsLEtiPWZ1bmN0aW9uKGEsYil7Yj1iP251bGw6YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpO2lmKEpiJiYoYS5zdHlsZSYmKGEuc3R5bGVbSmJdPSJub25lIiksYikpZm9yKHZhciBjPTA7YT1iW2NdO2MrKylhLnN0eWxlJiYoYS5zdHlsZVtKYl09Im5vbmUiKX07dmFyIExiPWZ1bmN0aW9uKCl7fTtpYShMYik7TGIucHJvdG90eXBlLmc9MDt2YXIgRj1mdW5jdGlvbihhKXtELmNhbGwodGhpcyk7dGhpcy5HPWF8fHBhfHwocGE9bmV3IGZiKTt0aGlzLnphPU1iO3RoaXMuWT1udWxsO3RoaXMucz0hMTt0aGlzLmc9bnVsbDt0aGlzLk09dm9pZCAwO3RoaXMudT10aGlzLmo9dGhpcy5oPW51bGw7dGhpcy5TYT0hMX07bihGLEQpO0YucHJvdG90eXBlLlphPUxiLlYoKTsKdmFyIE1iPW51bGwsTmI9ZnVuY3Rpb24oYSxiKXtzd2l0Y2goYSl7Y2FzZSAxOnJldHVybiBiPyJkaXNhYmxlIjoiZW5hYmxlIjtjYXNlIDI6cmV0dXJuIGI/ImhpZ2hsaWdodCI6InVuaGlnaGxpZ2h0IjtjYXNlIDQ6cmV0dXJuIGI/ImFjdGl2YXRlIjoiZGVhY3RpdmF0ZSI7Y2FzZSA4OnJldHVybiBiPyJzZWxlY3QiOiJ1bnNlbGVjdCI7Y2FzZSAxNjpyZXR1cm4gYj8iY2hlY2siOiJ1bmNoZWNrIjtjYXNlIDMyOnJldHVybiBiPyJmb2N1cyI6ImJsdXIiO2Nhc2UgNjQ6cmV0dXJuIGI/Im9wZW4iOiJjbG9zZSJ9dGhyb3cgRXJyb3IoIkludmFsaWQgY29tcG9uZW50IHN0YXRlIik7fSxPYj1mdW5jdGlvbihhKXtyZXR1cm4gYS5ZfHwoYS5ZPSI6IisoYS5aYS5nKyspLnRvU3RyaW5nKDM2KSl9LFBiPWZ1bmN0aW9uKGEsYil7aWYoYS5oJiZhLmgudSl7dmFyIGM9YS5oLnUsZD1hLlk7ZCBpbiBjJiZkZWxldGUgY1tkXTtEYShhLmgudSxiLGEpfWEuWT1ifTtGLnByb3RvdHlwZS5pPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ307CnZhciBRYj1mdW5jdGlvbihhKXthLk18fChhLk09bmV3IEViKGEpKTtyZXR1cm4gcChhLk0pfTtGLnByb3RvdHlwZS5BYT1mdW5jdGlvbihhKXtpZih0aGlzLmgmJnRoaXMuaCE9YSl0aHJvdyBFcnJvcigiTWV0aG9kIG5vdCBzdXBwb3J0ZWQiKTtGLmwuQWEuY2FsbCh0aGlzLGEpfTtGLnByb3RvdHlwZS5tYT1mdW5jdGlvbigpe3RoaXMuZz1aYSh0aGlzLkcuZywiRElWIil9O0YucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbihhKXtSYih0aGlzLGEpfTsKdmFyIFJiPWZ1bmN0aW9uKGEsYixjKXtpZihhLnMpdGhyb3cgRXJyb3IoIkNvbXBvbmVudCBhbHJlYWR5IHJlbmRlcmVkIik7YS5nfHxhLm1hKCk7Yj9iLmluc2VydEJlZm9yZShhLmcsY3x8bnVsbCk6YS5HLmcuYm9keS5hcHBlbmRDaGlsZChhLmcpO2EuaCYmIWEuaC5zfHxhLkkoKX0sU2I9ZnVuY3Rpb24oYSxiKXtpZihhLnMpdGhyb3cgRXJyb3IoIkNvbXBvbmVudCBhbHJlYWR5IHJlbmRlcmVkIik7aWYoYiYmYS53YShiKSl7YS5TYT0hMDt2YXIgYz1iYihiKTthLkcmJmEuRy5nPT1jfHwoYS5HPWI/bmV3IGZiKGJiKGIpKTpwYXx8KHBhPW5ldyBmYikpO2EuRWEoYik7YS5JKCl9ZWxzZSB0aHJvdyBFcnJvcigiSW52YWxpZCBlbGVtZW50IHRvIGRlY29yYXRlIik7fTtnPUYucHJvdG90eXBlO2cud2E9ZnVuY3Rpb24oKXtyZXR1cm4hMH07Zy5FYT1mdW5jdGlvbihhKXt0aGlzLmc9YX07CmcuST1mdW5jdGlvbigpe3RoaXMucz0hMDtUYih0aGlzLGZ1bmN0aW9uKGEpeyFhLnMmJmEuaSgpJiZhLkkoKX0pfTtnLlU9ZnVuY3Rpb24oKXtUYih0aGlzLGZ1bmN0aW9uKGEpe2EucyYmYS5VKCl9KTt0aGlzLk0mJkdiKHRoaXMuTSk7dGhpcy5zPSExfTtnLkM9ZnVuY3Rpb24oKXt0aGlzLnMmJnRoaXMuVSgpO3RoaXMuTSYmKHRoaXMuTS5kaXNwb3NlKCksZGVsZXRlIHRoaXMuTSk7VGIodGhpcyxmdW5jdGlvbihhKXthLmRpc3Bvc2UoKX0pOyF0aGlzLlNhJiZ0aGlzLmcmJiRhKHRoaXMuZyk7dGhpcy5oPXRoaXMuZz10aGlzLnU9dGhpcy5qPW51bGw7Ri5sLkMuY2FsbCh0aGlzKX07Zy5CYT1mdW5jdGlvbihhLGIpe3RoaXMuQ2EoYSxIKHRoaXMpLGIpfTsKZy5DYT1mdW5jdGlvbihhLGIsYyl7cCghIWEsIlByb3ZpZGVkIGVsZW1lbnQgbXVzdCBub3QgYmUgbnVsbC4iKTtpZihhLnMmJihjfHwhdGhpcy5zKSl0aHJvdyBFcnJvcigiQ29tcG9uZW50IGFscmVhZHkgcmVuZGVyZWQiKTtpZihiPDB8fGI+SCh0aGlzKSl0aHJvdyBFcnJvcigiQ2hpbGQgY29tcG9uZW50IGluZGV4IG91dCBvZiBib3VuZHMiKTt0aGlzLnUmJnRoaXMuanx8KHRoaXMudT17fSx0aGlzLmo9W10pO2lmKGEuaD09dGhpcyl7dmFyIGQ9dGhpcy51LGU9T2IoYSk7ZFtlXT1hO3hhKHRoaXMuaixhKX1lbHNlIERhKHRoaXMudSxPYihhKSxhKTtpZihhPT10aGlzKXRocm93IEVycm9yKCJVbmFibGUgdG8gc2V0IHBhcmVudCBjb21wb25lbnQiKTtpZihkPXRoaXMmJmEuaCYmYS5ZKWU9YS5oLGQ9YS5ZLGUudSYmZD8oZT1lLnUsZD0oZSE9PW51bGwmJmQgaW4gZT9lW2RdOnZvaWQgMCl8fG51bGwpOmQ9bnVsbDtpZihkJiZhLmghPXRoaXMpdGhyb3cgRXJyb3IoIlVuYWJsZSB0byBzZXQgcGFyZW50IGNvbXBvbmVudCIpOwphLmg9dGhpcztGLmwuQWEuY2FsbChhLHRoaXMpO3phKHRoaXMuaixiLDAsYSk7YS5zJiZ0aGlzLnMmJmEuaD09dGhpcz8oYz10aGlzLm5hKCksKGMuY2hpbGROb2Rlc1tiXXx8bnVsbCkhPWEuaSgpJiYoYS5pKCkucGFyZW50RWxlbWVudD09YyYmYy5yZW1vdmVDaGlsZChhLmkoKSksYj1jLmNoaWxkTm9kZXNbYl18fG51bGwsYy5pbnNlcnRCZWZvcmUoYS5pKCksYikpKTpjPyh0aGlzLmd8fHRoaXMubWEoKSxiPUkodGhpcyxiKzEpLFJiKGEsdGhpcy5uYSgpLGI/Yi5nOm51bGwpKTp0aGlzLnMmJiFhLnMmJmEuZyYmYS5nLnBhcmVudE5vZGUmJmEuZy5wYXJlbnROb2RlLm5vZGVUeXBlPT0xJiZhLkkoKX07Zy5uYT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmd9Owp2YXIgVWI9ZnVuY3Rpb24oYSl7aWYoYS56YT09bnVsbCl7dmFyIGI9YS5zP2EuZzphLkcuZy5ib2R5O2E6e3ZhciBjPWJiKGIpO2lmKGMuZGVmYXVsdFZpZXcmJmMuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSYmKGM9Yy5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKGIsbnVsbCkpKXtjPWMuZGlyZWN0aW9ufHxjLmdldFByb3BlcnR5VmFsdWUoImRpcmVjdGlvbiIpfHwiIjticmVhayBhfWM9IiJ9YS56YT0icnRsIj09KGN8fChiLmN1cnJlbnRTdHlsZT9iLmN1cnJlbnRTdHlsZS5kaXJlY3Rpb246bnVsbCl8fGIuc3R5bGUmJmIuc3R5bGUuZGlyZWN0aW9uKX1yZXR1cm4gYS56YX0sSD1mdW5jdGlvbihhKXtyZXR1cm4gYS5qP2Euai5sZW5ndGg6MH0sST1mdW5jdGlvbihhLGIpe3JldHVybiBhLmo/YS5qW2JdfHxudWxsOm51bGx9LFRiPWZ1bmN0aW9uKGEsYixjKXthLmomJmEuai5mb3JFYWNoKGIsYyl9LFZiPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuaiYmYj9hLmouaW5kZXhPZihiKToKLTF9O3ZhciBXYj17bWI6ImFjdGl2ZWRlc2NlbmRhbnQiLHJiOiJhdG9taWMiLHNiOiJhdXRvY29tcGxldGUiLHViOiJidXN5Iix4YjoiY2hlY2tlZCIseWI6ImNvbGluZGV4IixEYjoiY29udHJvbHMiLEViOiJjdXJyZW50IixHYjoiZGVzY3JpYmVkYnkiLEpiOiJkaXNhYmxlZCIsTGI6ImRyb3BlZmZlY3QiLE1iOiJleHBhbmRlZCIsTmI6ImZsb3d0byIsUGI6ImdyYWJiZWQiLFRiOiJoYXNwb3B1cCIsVmI6ImhpZGRlbiIsWGI6ImludmFsaWQiLFliOiJsYWJlbCIsWmI6ImxhYmVsbGVkYnkiLGFjOiJsZXZlbCIsZmM6ImxpdmUiLHZjOiJtdWx0aWxpbmUiLHdjOiJtdWx0aXNlbGVjdGFibGUiLEFjOiJvcmllbnRhdGlvbiIsQmM6Im93bnMiLENjOiJwb3NpbnNldCIsRWM6InByZXNzZWQiLEljOiJyZWFkb25seSIsS2M6InJlbGV2YW50IixMYzoicmVxdWlyZWQiLFBjOiJyb3dpbmRleCIsU2M6InNlbGVjdGVkIixVYzoic2V0c2l6ZSIsV2M6InNvcnQiLG1kOiJ2YWx1ZW1heCIsbmQ6InZhbHVlbWluIiwKb2Q6InZhbHVlbm93IixwZDoidmFsdWV0ZXh0In07dmFyIFhiO3ZhciBZYj17bmI6ImFsZXJ0IixvYjoiYWxlcnRkaWFsb2ciLHBiOiJhcHBsaWNhdGlvbiIscWI6ImFydGljbGUiLHRiOiJiYW5uZXIiLHZiOiJidXR0b24iLHdiOiJjaGVja2JveCIsemI6ImNvbHVtbmhlYWRlciIsQWI6ImNvbWJvYm94IixCYjoiY29tcGxlbWVudGFyeSIsQ2I6ImNvbnRlbnRpbmZvIixGYjoiZGVmaW5pdGlvbiIsSGI6ImRpYWxvZyIsSWI6ImRpcmVjdG9yeSIsS2I6ImRvY3VtZW50IixPYjoiZm9ybSIsUWI6ImdyaWQiLFJiOiJncmlkY2VsbCIsU2I6Imdyb3VwIixVYjoiaGVhZGluZyIsV2I6ImltZyIsYmM6ImxpbmsiLGNjOiJsaXN0IixkYzoibGlzdGJveCIsZWM6Imxpc3RpdGVtIixoYzoibG9nIixpYzoibWFpbiIsamM6Im1hcnF1ZWUiLGtjOiJtYXRoIixsYzoibWVudSIsbWM6Im1lbnViYXIiLG5jOiJtZW51aXRlbSIsb2M6Im1lbnVpdGVtY2hlY2tib3giLHBjOiJtZW51aXRlbXJhZGlvIix4YzoibmF2aWdhdGlvbiIseWM6Im5vdGUiLHpjOiJvcHRpb24iLApEYzoicHJlc2VudGF0aW9uIixGYzoicHJvZ3Jlc3NiYXIiLEdjOiJyYWRpbyIsSGM6InJhZGlvZ3JvdXAiLEpjOiJyZWdpb24iLE1jOiJyb3ciLE5jOiJyb3dncm91cCIsT2M6InJvd2hlYWRlciIsUWM6InNjcm9sbGJhciIsUmM6InNlYXJjaCIsVGM6InNlcGFyYXRvciIsVmM6InNsaWRlciIsWGM6InNwaW5idXR0b24iLFljOiJzdGF0dXMiLFpjOiJzd2l0Y2giLGFkOiJ0YWIiLGJkOiJ0YWJsaXN0IixjZDoidGFicGFuZWwiLGRkOiJ0ZXh0Ym94IixlZDoidGV4dGluZm8iLGZkOiJ0aW1lciIsZ2Q6InRvb2xiYXIiLGhkOiJ0b29sdGlwIixqZDoidHJlZSIsa2Q6InRyZWVncmlkIixsZDoidHJlZWl0ZW0ifTt2YXIgWmI9ZnVuY3Rpb24oYSxiKXtiPyhwKENhKFliLGIpLCJObyBzdWNoIEFSSUEgcm9sZSAiK2IpLGEuc2V0QXR0cmlidXRlKCJyb2xlIixiKSk6YS5yZW1vdmVBdHRyaWJ1dGUoInJvbGUiKX0sYWM9ZnVuY3Rpb24oYSxiLGMpe0FycmF5LmlzQXJyYXkoYykmJihjPWMuam9pbigiICIpKTt2YXIgZD0kYihiKTtjPT09IiJ8fGM9PXZvaWQgMD8oWGJ8fChjPXt9LFhiPShjLmF0b21pYz0hMSxjLmF1dG9jb21wbGV0ZT0ibm9uZSIsYy5kcm9wZWZmZWN0PSJub25lIixjLmhhc3BvcHVwPSExLGMubGl2ZT0ib2ZmIixjLm11bHRpbGluZT0hMSxjLm11bHRpc2VsZWN0YWJsZT0hMSxjLm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIsYy5yZWFkb25seT0hMSxjLnJlbGV2YW50PSJhZGRpdGlvbnMgdGV4dCIsYy5yZXF1aXJlZD0hMSxjLnNvcnQ9Im5vbmUiLGMuYnVzeT0hMSxjLmRpc2FibGVkPSExLGMuaGlkZGVuPSExLGMuaW52YWxpZD0iZmFsc2UiLGMpKSxjPVhiLGIgaW4gYz9hLnNldEF0dHJpYnV0ZShkLApjW2JdKTphLnJlbW92ZUF0dHJpYnV0ZShkKSk6YS5zZXRBdHRyaWJ1dGUoZCxjKX0sJGI9ZnVuY3Rpb24oYSl7cChhLCJBUklBIGF0dHJpYnV0ZSBjYW5ub3QgYmUgZW1wdHkuIik7cChDYShXYixhKSwiTm8gc3VjaCBBUklBIGF0dHJpYnV0ZSAiK2EpO3JldHVybiJhcmlhLSIrYX07dmFyIGRjPWZ1bmN0aW9uKGEsYixjLGQsZSxmKXtpZih2JiZlKXJldHVybiBiYyhhKTtpZihlJiYhZClyZXR1cm4hMTtpZighdCl7dHlwZW9mIGI9PT0ibnVtYmVyIiYmKGI9Y2MoYikpO3ZhciBoPWI9PTE3fHxiPT0xOHx8diYmYj09OTE7aWYoKCFjfHx2KSYmaHx8diYmYj09MTYmJihkfHxmKSlyZXR1cm4hMX1pZih1JiZkJiZjKXN3aXRjaChhKXtjYXNlIDIyMDpjYXNlIDIxOTpjYXNlIDIyMTpjYXNlIDE5MjpjYXNlIDE4NjpjYXNlIDE4OTpjYXNlIDE4NzpjYXNlIDE4ODpjYXNlIDE5MDpjYXNlIDE5MTpjYXNlIDE5MjpjYXNlIDIyMjpyZXR1cm4hMX1zd2l0Y2goYSl7Y2FzZSAxMzpyZXR1cm4gdD9mfHxlPyExOiEoYyYmZCk6ITA7Y2FzZSAyNzpyZXR1cm4hdSYmIXR9cmV0dXJuIHQmJihkfHxlfHxmKT8hMTpiYyhhKX0sYmM9ZnVuY3Rpb24oYSl7aWYoYT49NDgmJmE8PTU3fHxhPj05NiYmYTw9MTA2fHxhPj02NSYmYTw9OTB8fHUmJmE9PTApcmV0dXJuITA7c3dpdGNoKGEpe2Nhc2UgMzI6Y2FzZSA0MzpjYXNlIDYzOmNhc2UgNjQ6Y2FzZSAxMDc6Y2FzZSAxMDk6Y2FzZSAxMTA6Y2FzZSAxMTE6Y2FzZSAxODY6Y2FzZSA1OTpjYXNlIDE4OTpjYXNlIDE4NzpjYXNlIDYxOmNhc2UgMTg4OmNhc2UgMTkwOmNhc2UgMTkxOmNhc2UgMTkyOmNhc2UgMjIyOmNhc2UgMjE5OmNhc2UgMjIwOmNhc2UgMjIxOmNhc2UgMTYzOmNhc2UgNTg6cmV0dXJuITA7CmNhc2UgMTczOmNhc2UgMTcxOnJldHVybiB0O2RlZmF1bHQ6cmV0dXJuITF9fSxjYz1mdW5jdGlvbihhKXtpZih0KWE9ZWMoYSk7ZWxzZSBpZih2JiZ1KXN3aXRjaChhKXtjYXNlIDkzOmE9OTF9cmV0dXJuIGF9LGVjPWZ1bmN0aW9uKGEpe3N3aXRjaChhKXtjYXNlIDYxOnJldHVybiAxODc7Y2FzZSA1OTpyZXR1cm4gMTg2O2Nhc2UgMTczOnJldHVybiAxODk7Y2FzZSAyMjQ6cmV0dXJuIDkxO2Nhc2UgMDpyZXR1cm4gMjI0O2RlZmF1bHQ6cmV0dXJuIGF9fTt2YXIgZmM9ZnVuY3Rpb24oYSxiLGMsZCl7ei5jYWxsKHRoaXMsZCk7dGhpcy50eXBlPSJrZXkiO3RoaXMuZz1hO3RoaXMucmVwZWF0PWN9O24oZmMseik7dmFyIEo9ZnVuY3Rpb24oYSxiKXtELmNhbGwodGhpcyk7YSYmZ2ModGhpcyxhLGIpfTtuKEosRCk7Zz1KLnByb3RvdHlwZTtnLlI9bnVsbDtnLnFhPW51bGw7Zy5KYT1udWxsO2cucmE9bnVsbDtnLkY9LTE7Zy5LPS0xO2cuRGE9ITE7CnZhciBoYz17MzoxMywxMjoxNDQsNjMyMzI6MzgsNjMyMzM6NDAsNjMyMzQ6MzcsNjMyMzU6MzksNjMyMzY6MTEyLDYzMjM3OjExMyw2MzIzODoxMTQsNjMyMzk6MTE1LDYzMjQwOjExNiw2MzI0MToxMTcsNjMyNDI6MTE4LDYzMjQzOjExOSw2MzI0NDoxMjAsNjMyNDU6MTIxLDYzMjQ2OjEyMiw2MzI0NzoxMjMsNjMyNDg6NDQsNjMyNzI6NDYsNjMyNzM6MzYsNjMyNzU6MzUsNjMyNzY6MzMsNjMyNzc6MzQsNjMyODk6MTQ0LDYzMzAyOjQ1fSxpYz17VXA6MzgsRG93bjo0MCxMZWZ0OjM3LFJpZ2h0OjM5LEVudGVyOjEzLEYxOjExMixGMjoxMTMsRjM6MTE0LEY0OjExNSxGNToxMTYsRjY6MTE3LEY3OjExOCxGODoxMTksRjk6MTIwLEYxMDoxMjEsRjExOjEyMixGMTI6MTIzLCJVKzAwN0YiOjQ2LEhvbWU6MzYsRW5kOjM1LFBhZ2VVcDozMyxQYWdlRG93bjozNCxJbnNlcnQ6NDV9LGpjPXYmJnQ7CkoucHJvdG90eXBlLmc9ZnVuY3Rpb24oYSl7dSYmKHRoaXMuRj09MTcmJiFhLmN0cmxLZXl8fHRoaXMuRj09MTgmJiFhLmFsdEtleXx8diYmdGhpcy5GPT05MSYmIWEubWV0YUtleSkmJih0aGlzLks9dGhpcy5GPS0xKTt0aGlzLkY9PS0xJiYoYS5jdHJsS2V5JiZhLmchPTE3P3RoaXMuRj0xNzphLmFsdEtleSYmYS5nIT0xOD90aGlzLkY9MTg6YS5tZXRhS2V5JiZhLmchPTkxJiYodGhpcy5GPTkxKSk7ZGMoYS5nLHRoaXMuRixhLnNoaWZ0S2V5LGEuY3RybEtleSxhLmFsdEtleSxhLm1ldGFLZXkpPyh0aGlzLks9Y2MoYS5nKSxqYyYmKHRoaXMuRGE9YS5hbHRLZXkpKTp0aGlzLmhhbmRsZUV2ZW50KGEpfTtKLnByb3RvdHlwZS5oPWZ1bmN0aW9uKGEpe3RoaXMuSz10aGlzLkY9LTE7dGhpcy5EYT1hLmFsdEtleX07CkoucHJvdG90eXBlLmhhbmRsZUV2ZW50PWZ1bmN0aW9uKGEpe3ZhciBiPWEuaCxjPWIuYWx0S2V5O2lmKHUmJmEudHlwZT09ImtleXByZXNzIil7dmFyIGQ9dGhpcy5LO3ZhciBlPWIuY2hhckNvZGU+PTAmJmIuY2hhckNvZGU8NjMyMzImJmJjKGQpP2IuY2hhckNvZGU6MH1lbHNlIGEudHlwZT09ImtleXByZXNzIj8oamMmJihjPXRoaXMuRGEpLGIua2V5Q29kZT09Yi5jaGFyQ29kZT9iLmtleUNvZGU8MzI/KGQ9Yi5rZXlDb2RlLGU9MCk6KGQ9dGhpcy5LLGU9Yi5jaGFyQ29kZSk6KGQ9Yi5rZXlDb2RlfHx0aGlzLkssZT1iLmNoYXJDb2RlfHwwKSk6KGQ9Yi5rZXlDb2RlfHx0aGlzLkssZT1iLmNoYXJDb2RlfHwwKSx2JiZlPT02MyYmZD09MjI0JiYoZD0xOTEpO3ZhciBmPWQ9Y2MoZCk7ZD9kPj02MzIzMiYmZCBpbiBoYz9mPWhjW2RdOmQ9PTI1JiZhLnNoaWZ0S2V5JiYoZj05KTpiLmtleUlkZW50aWZpZXImJmIua2V5SWRlbnRpZmllciBpbiBpYyYmKGY9aWNbYi5rZXlJZGVudGlmaWVyXSk7CmlmKCF0fHxhLnR5cGUhPSJrZXlwcmVzcyJ8fGRjKGYsdGhpcy5GLGEuc2hpZnRLZXksYS5jdHJsS2V5LGMsYS5tZXRhS2V5KSlhPWY9PXRoaXMuRix0aGlzLkY9ZixiPW5ldyBmYyhmLGUsYSxiKSxiLmFsdEtleT1jLEUodGhpcyxiKX07Si5wcm90b3R5cGUuaT1mdW5jdGlvbigpe3JldHVybiB0aGlzLlJ9O3ZhciBnYz1mdW5jdGlvbihhLGIsYyl7YS5yYSYma2MoYSk7YS5SPWI7YS5xYT11YihhLlIsImtleXByZXNzIixhLGMpO2EuSmE9dWIoYS5SLCJrZXlkb3duIixhLmcsYyxhKTthLnJhPXViKGEuUiwia2V5dXAiLGEuaCxjLGEpfSxrYz1mdW5jdGlvbihhKXthLnFhJiYoQShhLnFhKSxBKGEuSmEpLEEoYS5yYSksYS5xYT1udWxsLGEuSmE9bnVsbCxhLnJhPW51bGwpO2EuUj1udWxsO2EuRj0tMTthLks9LTF9O0oucHJvdG90eXBlLkM9ZnVuY3Rpb24oKXtKLmwuQy5jYWxsKHRoaXMpO2tjKHRoaXMpfTt2YXIgSz17Z2E6Im1vdXNlZG93biIsaGE6Im1vdXNldXAiLGZhOiJtb3VzZWNhbmNlbCIsc2M6Im1vdXNlbW92ZSIsdWM6Im1vdXNlb3ZlciIsdGM6Im1vdXNlb3V0IixxYzoibW91c2VlbnRlciIscmM6Im1vdXNlbGVhdmUifTt2YXIgbGM9ZnVuY3Rpb24oYSl7cmV0dXJuIHR5cGVvZiBhLmNsYXNzTmFtZT09InN0cmluZyI/YS5jbGFzc05hbWU6YS5nZXRBdHRyaWJ1dGUmJmEuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIn0sTD1mdW5jdGlvbihhKXtyZXR1cm4gYS5jbGFzc0xpc3Q/YS5jbGFzc0xpc3Q6bGMoYSkubWF0Y2goL1xTKy9nKXx8W119LG1jPWZ1bmN0aW9uKGEsYil7dHlwZW9mIGEuY2xhc3NOYW1lPT0ic3RyaW5nIj9hLmNsYXNzTmFtZT1iOmEuc2V0QXR0cmlidXRlJiZhLnNldEF0dHJpYnV0ZSgiY2xhc3MiLGIpfSxuYz1mdW5jdGlvbihhLGIpe2EuY2xhc3NMaXN0P2I9YS5jbGFzc0xpc3QuY29udGFpbnMoYik6KGE9TChhKSxiPXZhKGEsYik+PTApO3JldHVybiBifSxvYz1mdW5jdGlvbihhLGIpe2lmKGEuY2xhc3NMaXN0KWEuY2xhc3NMaXN0LmFkZChiKTtlbHNlIGlmKCFuYyhhLGIpKXt2YXIgYz1sYyhhKTttYyhhLGMrKGMubGVuZ3RoPjA/IiAiK2I6YikpfX0scGM9ZnVuY3Rpb24oYSxiKXtpZihhLmNsYXNzTGlzdClBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGIsCmZ1bmN0aW9uKGUpe29jKGEsZSl9KTtlbHNle3ZhciBjPXt9O0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoTChhKSxmdW5jdGlvbihlKXtjW2VdPSEwfSk7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChiLGZ1bmN0aW9uKGUpe2NbZV09ITB9KTtiPSIiO2Zvcih2YXIgZCBpbiBjKWIrPWIubGVuZ3RoPjA/IiAiK2Q6ZDttYyhhLGIpfX0scWM9ZnVuY3Rpb24oYSxiKXthLmNsYXNzTGlzdD9hLmNsYXNzTGlzdC5yZW1vdmUoYik6bmMoYSxiKSYmbWMoYSxBcnJheS5wcm90b3R5cGUuZmlsdGVyLmNhbGwoTChhKSxmdW5jdGlvbihjKXtyZXR1cm4gYyE9Yn0pLmpvaW4oIiAiKSl9LHJjPWZ1bmN0aW9uKGEsYil7YS5jbGFzc0xpc3Q/QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChiLGZ1bmN0aW9uKGMpe3FjKGEsYyl9KTptYyhhLEFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbChMKGEpLGZ1bmN0aW9uKGMpe3JldHVybiEodmEoYixjKT49MCl9KS5qb2luKCIgIikpfTt2YXIgdGM9ZnVuY3Rpb24oYSxiKXtpZighYSl0aHJvdyBFcnJvcigiSW52YWxpZCBjbGFzcyBuYW1lICIrYSk7aWYodHlwZW9mIGIhPT0iZnVuY3Rpb24iKXRocm93IEVycm9yKCJJbnZhbGlkIGRlY29yYXRvciBmdW5jdGlvbiAiK2IpO3NjW2FdPWJ9LHVjPXt9LHNjPXt9O3ZhciB2Yz1mdW5jdGlvbihhKXt0aGlzLkE9YX07aWEodmMpO3ZhciB3Yz1mdW5jdGlvbihhLGIpe2EmJihhLnRhYkluZGV4PWI/MDotMSl9LHljPWZ1bmN0aW9uKGEsYixjKXtjLmlkJiZQYihiLGMuaWQpO3ZhciBkPWEuZygpLGU9ITEsZj1MKGMpO2YmJkFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoZixmdW5jdGlvbihoKXtoPT1kP2U9ITA6aCYmdGhpcy51KGIsaCxkKX0sYSk7ZXx8b2MoYyxkKTt4YyhiLGMpO3JldHVybiBjfTt2Yy5wcm90b3R5cGUudT1mdW5jdGlvbihhLGIsYyl7Yj09YysiLWRpc2FibGVkIj9hLlgoITEpOmI9PWMrIi1ob3Jpem9udGFsIj96YyhhLCJob3Jpem9udGFsIik6Yj09YysiLXZlcnRpY2FsIiYmemMoYSwidmVydGljYWwiKX07CnZhciB4Yz1mdW5jdGlvbihhLGIpe2lmKGIpZm9yKHZhciBjPWIuZmlyc3RDaGlsZCxkO2MmJmMucGFyZW50Tm9kZT09Yjspe2Q9Yy5uZXh0U2libGluZztpZihjLm5vZGVUeXBlPT0xKXthOnt2YXIgZT1jO3AoZSk7ZT1MKGUpO2Zvcih2YXIgZj1lLmxlbmd0aCxoPTA7aDxmO2grKyl7dmFyIGs9ZVtoXTtpZihrPWsgaW4gc2M/c2Nba10oKTpudWxsKXtlPWs7YnJlYWsgYX19ZT1udWxsfWUmJihlLmc9YyxhLmlzRW5hYmxlZCgpfHxlLlgoITEpLGEuQmEoZSksU2IoZSxjKSl9ZWxzZSBjLm5vZGVWYWx1ZSYmSGEoYy5ub2RlVmFsdWUpIT0iInx8Yi5yZW1vdmVDaGlsZChjKTtjPWR9fSxBYz1mdW5jdGlvbihhLGIpe2I9Yi5pKCk7cChiLCJUaGUgY29udGFpbmVyIERPTSBlbGVtZW50IGNhbm5vdCBiZSBudWxsLiIpO0tiKGIsdCk7KGE9YS5BKSYmWmIoYixhKX07dmMucHJvdG90eXBlLmc9ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy1jb250YWluZXIifTsKdmMucHJvdG90eXBlLmo9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nKCksYz1bYixhLkw9PSJob3Jpem9udGFsIj9iKyItaG9yaXpvbnRhbCI6YisiLXZlcnRpY2FsIl07YS5pc0VuYWJsZWQoKXx8Yy5wdXNoKGIrIi1kaXNhYmxlZCIpO3JldHVybiBjfTt2YXIgQmM9ZnVuY3Rpb24oKXt9O3ZhciBNPWZ1bmN0aW9uKCl7fSxDYztpYShNKTt2YXIgRGM9e2J1dHRvbjoicHJlc3NlZCIsY2hlY2tib3g6ImNoZWNrZWQiLG1lbnVpdGVtOiJzZWxlY3RlZCIsbWVudWl0ZW1jaGVja2JveDoiY2hlY2tlZCIsbWVudWl0ZW1yYWRpbzoiY2hlY2tlZCIscmFkaW86ImNoZWNrZWQiLHRhYjoic2VsZWN0ZWQiLHRyZWVpdGVtOiJzZWxlY3RlZCJ9O00ucHJvdG90eXBlLk5hPWZ1bmN0aW9uKCl7fTtNLnByb3RvdHlwZS54YT1mdW5jdGlvbihhKXt2YXIgYj1hLkcsYz1iLmgsZD10aGlzLk4oKSxlPVtkXSxmPXRoaXMuTigpO2YhPWQmJmUucHVzaChmKTtkPWEubTtmb3IoZj1bXTtkOyl7dmFyIGg9ZCYtZDtmLnB1c2goRWModGhpcyxoKSk7ZCY9fmh9ZS5wdXNoLmFwcGx5KGUsZik7KGQ9YS5GYSkmJmUucHVzaC5hcHBseShlLGQpO3JldHVybiBjLmNhbGwoYiwiRElWIixlLmpvaW4oIiAiKSxhLmlhKX07Ck0ucHJvdG90eXBlLnlhPWZ1bmN0aW9uKGEsYil7Yi5pZCYmUGIoYSxiLmlkKTtiJiZiLmZpcnN0Q2hpbGQ/RmMoYSxiLmZpcnN0Q2hpbGQubmV4dFNpYmxpbmc/eWEoYi5jaGlsZE5vZGVzKTpiLmZpcnN0Q2hpbGQpOmEuaWE9bnVsbDt2YXIgYz0wLGQ9dGhpcy5OKCksZT10aGlzLk4oKSxmPSExLGg9ITEsaz15YShMKGIpKTtrLmZvckVhY2goZnVuY3Rpb24ocSl7Znx8cSE9ZD9ofHxxIT1lP2N8PUdjKHRoaXMscSk6aD0hMDooZj0hMCxlPT1kJiYoaD0hMCkpO0djKHRoaXMscSk9PTEmJihzYShiKSxkYihiKSYmZWIoYikmJmNiKGIsITEpKX0sdGhpcyk7YS5tPWM7Znx8KGsucHVzaChkKSxlPT1kJiYoaD0hMCkpO2h8fGsucHVzaChlKTsoYT1hLkZhKSYmay5wdXNoLmFwcGx5KGssYSk7ZiYmaCYmIWF8fG1jKGIsay5qb2luKCIgIikpO3JldHVybiBifTsKdmFyIEhjPWZ1bmN0aW9uKGEsYil7aWYoYT1hLk5hKCkpe3AoYiwiVGhlIGVsZW1lbnQgcGFzc2VkIGFzIGEgZmlyc3QgcGFyYW1ldGVyIGNhbm5vdCBiZSBudWxsLiIpO3ZhciBjPWIuZ2V0QXR0cmlidXRlKCJyb2xlIil8fG51bGw7YSE9YyYmWmIoYixhKX19LEljPWZ1bmN0aW9uKGEsYil7dmFyIGM7aWYoYS5EJjMyJiYoYz1hLmkoKSkpe2lmKCFiJiZhLm0mMzIpe3RyeXtjLmJsdXIoKX1jYXRjaChkKXt9YS5tJjMyJiZhLlFhKG51bGwpfShkYihjKSYmZWIoYykpIT1iJiZjYihjLGIpfX0sSmM9ZnVuY3Rpb24oYSxiLGMpe0NjfHwoQ2M9ezE6ImRpc2FibGVkIiw4OiJzZWxlY3RlZCIsMTY6ImNoZWNrZWQiLDY0OiJleHBhbmRlZCJ9KTtwKGEsIlRoZSBlbGVtZW50IHBhc3NlZCBhcyBhIGZpcnN0IHBhcmFtZXRlciBjYW5ub3QgYmUgbnVsbC4iKTtiPUNjW2JdO3ZhciBkPWEuZ2V0QXR0cmlidXRlKCJyb2xlIil8fG51bGw7ZCYmKGQ9RGNbZF18fGIsYj1iPT0iY2hlY2tlZCJ8fGI9PQoic2VsZWN0ZWQiP2Q6Yik7YiYmYWMoYSxiLGMpfTtNLnByb3RvdHlwZS5OPWZ1bmN0aW9uKCl7cmV0dXJuImdvb2ctY29udHJvbCJ9O3ZhciBFYz1mdW5jdGlvbihhLGIpe2EuZ3x8S2MoYSk7cmV0dXJuIGEuZ1tiXX0sR2M9ZnVuY3Rpb24oYSxiKXthLmh8fChhLmd8fEtjKGEpLGEuaD1FYShhLmcpKTthPXBhcnNlSW50KGEuaFtiXSwxMCk7cmV0dXJuIGlzTmFOKGEpPzA6YX0sS2M9ZnVuY3Rpb24oYSl7dmFyIGI9YS5OKCk7dmFyIGM9Yi5yZXBsYWNlKC9ceGEwfFxzL2csIiAiKS5pbmRleE9mKCIgIikhPS0xO3AoIWMsIkNvbnRyb2xSZW5kZXJlciBoYXMgYW4gaW52YWxpZCBjc3MgY2xhc3M6ICciK2IrIiciKTthLmc9ezE6YisiLWRpc2FibGVkIiwyOmIrIi1ob3ZlciIsNDpiKyItYWN0aXZlIiw4OmIrIi1zZWxlY3RlZCIsMTY6YisiLWNoZWNrZWQiLDMyOmIrIi1mb2N1c2VkIiw2NDpiKyItb3BlbiJ9fTt2YXIgTj1mdW5jdGlvbihhLGIsYyl7Ri5jYWxsKHRoaXMsYyk7aWYoIWIpe2ZvcihiPXRoaXMuY29uc3RydWN0b3I7Yjspe3ZhciBkPW5hKGIpO2lmKGQ9dWNbZF0pYnJlYWs7Yj0oYj1PYmplY3QuZ2V0UHJvdG90eXBlT2YoYi5wcm90b3R5cGUpKSYmYi5jb25zdHJ1Y3Rvcn1iPWQ/dHlwZW9mIGQuVj09PSJmdW5jdGlvbiI/ZC5WKCk6bmV3IGQ6bnVsbH10aGlzLnY9Yjt0aGlzLmlhPWEhPT12b2lkIDA/YTpudWxsfTtuKE4sRik7Zz1OLnByb3RvdHlwZTtnLmlhPW51bGw7Zy5tPTA7Zy5EPTM5O2cuUD0wO2cuT2E9ITA7Zy5GYT1udWxsO2cuSGE9ITA7Zy5tYT1mdW5jdGlvbigpe3ZhciBhPXRoaXMudi54YSh0aGlzKTt0aGlzLmc9YTtIYyh0aGlzLnYsYSk7S2IoYSwhMCk7dGhpcy5pc1Zpc2libGUoKXx8KGEuc3R5bGUuZGlzcGxheT0ibm9uZSIsYSYmYWMoYSwiaGlkZGVuIiwhMCkpfTtnLm5hPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaSgpfTtnLndhPWZ1bmN0aW9uKCl7cmV0dXJuITB9OwpnLkVhPWZ1bmN0aW9uKGEpe3RoaXMuZz1hPXRoaXMudi55YSh0aGlzLGEpO0hjKHRoaXMudixhKTtLYihhLCEwKTt0aGlzLk9hPWEuc3R5bGUuZGlzcGxheSE9Im5vbmUifTsKZy5JPWZ1bmN0aW9uKCl7Ti5sLkkuY2FsbCh0aGlzKTt2YXIgYT10aGlzLmc7cChhLCJDYW4gbm90IGNhbGwgZ2V0RWxlbWVudFN0cmljdCBiZWZvcmUgcmVuZGVyaW5nL2RlY29yYXRpbmcuIik7cCh0aGlzKTtwKGEpO3RoaXMuaXNWaXNpYmxlKCl8fGFjKGEsImhpZGRlbiIsIXRoaXMuaXNWaXNpYmxlKCkpO3RoaXMuaXNFbmFibGVkKCl8fEpjKGEsMSwhdGhpcy5pc0VuYWJsZWQoKSk7dGhpcy5EJjgmJkpjKGEsOCwhISh0aGlzLm0mOCkpO3RoaXMuRCYxNiYmSmMoYSwxNiwhISh0aGlzLm0mMTYpKTt0aGlzLkQmNjQmJkpjKGEsNjQsISEodGhpcy5tJjY0KSk7dmFyIGI9dGhpcy52O1ViKHRoaXMpJiYoYT10aGlzLmkoKSxiPWIuTigpKyItcnRsIiwoYT1hLmk/YS5pKCk6YSkmJnBjKGEsW2JdKSk7dGhpcy5pc0VuYWJsZWQoKSYmSWModGhpcyx0aGlzLmlzVmlzaWJsZSgpKTt0aGlzLkQmLTImJih0aGlzLkhhJiZMYyh0aGlzLCEwKSx0aGlzLkQmMzImJihhPXRoaXMuaSgpKSkmJihiPQp0aGlzLlp8fCh0aGlzLlo9bmV3IEopLGdjKGIsYSksQihCKEIoUWIodGhpcyksYiwia2V5Iix0aGlzLmFhKSxhLCJmb2N1cyIsdGhpcy5YYSksYSwiYmx1ciIsdGhpcy5RYSkpfTt2YXIgTGM9ZnVuY3Rpb24oYSxiKXt2YXIgYz1RYihhKSxkPWEuaSgpO2I/KEIoQihCKEIoYyxkLEsuZ2EsYS5zYSksZCxbSy5oYSxLLmZhXSxhLnZhKSxkLCJtb3VzZW92ZXIiLGEudWEpLGQsIm1vdXNlb3V0IixhLnRhKSxhLmNhIT1CYyYmQihjLGQsImNvbnRleHRtZW51IixhLmNhKSk6KEMoQyhDKEMoYyxkLEsuZ2EsYS5zYSksZCxbSy5oYSxLLmZhXSxhLnZhKSxkLCJtb3VzZW92ZXIiLGEudWEpLGQsIm1vdXNlb3V0IixhLnRhKSxhLmNhIT1CYyYmQyhjLGQsImNvbnRleHRtZW51IixhLmNhKSl9O04ucHJvdG90eXBlLlU9ZnVuY3Rpb24oKXtOLmwuVS5jYWxsKHRoaXMpO3RoaXMuWiYma2ModGhpcy5aKTt0aGlzLmlzVmlzaWJsZSgpJiZ0aGlzLmlzRW5hYmxlZCgpJiZJYyh0aGlzLCExKX07Ck4ucHJvdG90eXBlLkM9ZnVuY3Rpb24oKXtOLmwuQy5jYWxsKHRoaXMpO3RoaXMuWiYmKHRoaXMuWi5kaXNwb3NlKCksZGVsZXRlIHRoaXMuWik7ZGVsZXRlIHRoaXMudjt0aGlzLkZhPXRoaXMuaWE9bnVsbH07dmFyIEZjPWZ1bmN0aW9uKGEsYil7YS5pYT1ifTtOLnByb3RvdHlwZS5pc1Zpc2libGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5PYX07Ti5wcm90b3R5cGUuaXNFbmFibGVkPWZ1bmN0aW9uKCl7cmV0dXJuISh0aGlzLm0mMSl9O04ucHJvdG90eXBlLlg9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5oO2ImJnR5cGVvZiBiLmlzRW5hYmxlZD09ImZ1bmN0aW9uIiYmIWIuaXNFbmFibGVkKCl8fCFPKHRoaXMsMSwhYSl8fChhfHwoTWModGhpcywhMSksUCh0aGlzLCExKSksdGhpcy5pc1Zpc2libGUoKSYmSWModGhpcyxhKSxUKHRoaXMsMSwhYSwhMCkpfTt2YXIgUD1mdW5jdGlvbihhLGIpe08oYSwyLGIpJiZUKGEsMixiKX07Ck4ucHJvdG90eXBlLmlzQWN0aXZlPWZ1bmN0aW9uKCl7cmV0dXJuISEodGhpcy5tJjQpfTsKdmFyIE1jPWZ1bmN0aW9uKGEsYil7TyhhLDQsYikmJlQoYSw0LGIpfSxOYz1mdW5jdGlvbihhLGIpe08oYSw4LGIpJiZUKGEsOCxiKX0sT2M9ZnVuY3Rpb24oYSxiKXtPKGEsNjQsYikmJlQoYSw2NCxiKX0sVD1mdW5jdGlvbihhLGIsYyxkKXtpZighZCYmYj09MSlhLlgoIWMpO2Vsc2UgaWYoYS5EJmImJmMhPSEhKGEubSZiKSl7dmFyIGU9YS52O2lmKGQ9YS5pKCkpe2lmKGU9RWMoZSxiKSl7dmFyIGY9YS5pP2EuaSgpOmE7ZiYmKGM/cGM6cmMpKGYsW2VdKX1KYyhkLGIsYyl9YS5tPWM/YS5tfGI6YS5tJn5ifX0sUGM9ZnVuY3Rpb24oYSxiLGMpe2lmKGEucyYmYS5tJmImJiFjKXRocm93IEVycm9yKCJDb21wb25lbnQgYWxyZWFkeSByZW5kZXJlZCIpOyFjJiZhLm0mYiYmVChhLGIsITEpO2EuRD1jP2EuRHxiOmEuRCZ+Yn0sVT1mdW5jdGlvbihhLGIpe3JldHVybiEhKDI1NSZiKSYmISEoYS5EJmIpfSxPPWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4hIShhLkQmYikmJiEhKGEubSZiKSE9CmMmJighKGEuUCZiKXx8RShhLE5iKGIsYykpKSYmIWEuYmF9O04ucHJvdG90eXBlLnVhPWZ1bmN0aW9uKGEpeyFRYyhhLHRoaXMuaSgpKSYmRSh0aGlzLCJlbnRlciIpJiZ0aGlzLmlzRW5hYmxlZCgpJiZVKHRoaXMsMikmJlAodGhpcywhMCl9O04ucHJvdG90eXBlLnRhPWZ1bmN0aW9uKGEpeyFRYyhhLHRoaXMuaSgpKSYmRSh0aGlzLCJsZWF2ZSIpJiYoVSh0aGlzLDQpJiZNYyh0aGlzLCExKSxVKHRoaXMsMikmJlAodGhpcywhMSkpfTtOLnByb3RvdHlwZS5jYT1CYzt2YXIgUWM9ZnVuY3Rpb24oYSxiKXtyZXR1cm4hIWEucmVsYXRlZFRhcmdldCYmYWIoYixhLnJlbGF0ZWRUYXJnZXQpfTsKTi5wcm90b3R5cGUuc2E9ZnVuY3Rpb24oYSl7aWYodGhpcy5pc0VuYWJsZWQoKSYmKFUodGhpcywyKSYmUCh0aGlzLCEwKSwhKGEuaC5idXR0b24hPTB8fHYmJmEuY3RybEtleSkpKXtVKHRoaXMsNCkmJk1jKHRoaXMsITApO3ZhciBiO2lmKGI9dGhpcy52KXt2YXIgYztiPXRoaXMuRCYzMiYmKGM9dGhpcy5pKCkpP2RiKGMpJiZlYihjKTohMX1iJiZ0aGlzLmkoKS5mb2N1cygpfWEuaC5idXR0b24hPTB8fHYmJmEuY3RybEtleXx8YS5qKCl9O04ucHJvdG90eXBlLnZhPWZ1bmN0aW9uKGEpe3RoaXMuaXNFbmFibGVkKCkmJihVKHRoaXMsMikmJlAodGhpcywhMCksdGhpcy5pc0FjdGl2ZSgpJiZSYyh0aGlzLGEpJiZVKHRoaXMsNCkmJk1jKHRoaXMsITEpKX07CnZhciBSYz1mdW5jdGlvbihhLGIpe2lmKFUoYSwxNikpe3ZhciBjPSEoYS5tJjE2KTtPKGEsMTYsYykmJlQoYSwxNixjKX1VKGEsOCkmJk5jKGEsITApO1UoYSw2NCkmJk9jKGEsIShhLm0mNjQpKTtjPW5ldyB5KCJhY3Rpb24iLGEpO2ImJihjLmFsdEtleT1iLmFsdEtleSxjLmN0cmxLZXk9Yi5jdHJsS2V5LGMubWV0YUtleT1iLm1ldGFLZXksYy5zaGlmdEtleT1iLnNoaWZ0S2V5LGMuRz1iLkcsYy50aW1lU3RhbXA9Yi50aW1lU3RhbXApO3JldHVybiBFKGEsYyl9O04ucHJvdG90eXBlLlhhPWZ1bmN0aW9uKCl7VSh0aGlzLDMyKSYmTyh0aGlzLDMyLCEwKSYmVCh0aGlzLDMyLCEwKX07Ti5wcm90b3R5cGUuUWE9ZnVuY3Rpb24oKXtVKHRoaXMsNCkmJk1jKHRoaXMsITEpO1UodGhpcywzMikmJk8odGhpcywzMiwhMSkmJlQodGhpcywzMiwhMSl9OwpOLnByb3RvdHlwZS5hYT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5pc1Zpc2libGUoKSYmdGhpcy5pc0VuYWJsZWQoKSYmYS5nPT0xMyYmUmModGhpcyxhKT8oYS5qKCksYS52KCksITApOiExfTtpZih0eXBlb2YgTiE9PSJmdW5jdGlvbiIpdGhyb3cgRXJyb3IoIkludmFsaWQgY29tcG9uZW50IGNsYXNzICIrTik7aWYodHlwZW9mIE0hPT0iZnVuY3Rpb24iKXRocm93IEVycm9yKCJJbnZhbGlkIHJlbmRlcmVyIGNsYXNzICIrTSk7dmFyIFNjPW5hKE4pO3VjW1NjXT1NO3RjKCJnb29nLWNvbnRyb2wiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBOKG51bGwpfSk7dmFyIFY9ZnVuY3Rpb24oYSxiLGMpe0YuY2FsbCh0aGlzLGMpO3RoaXMuZWE9Ynx8dmMuVigpO3RoaXMuTD1hfHwidmVydGljYWwifTtuKFYsRik7Zz1WLnByb3RvdHlwZTtnLkthPW51bGw7Zy5kYT1udWxsO2cuZWE9bnVsbDtnLkw9bnVsbDtnLlM9ITA7Zy5UPSEwO2cubz0tMTtnLkI9bnVsbDtnLlc9ITE7Zy5PPW51bGw7dmFyIFRjPWZ1bmN0aW9uKGEpe3JldHVybiBhLkthfHxhLmkoKX07Zz1WLnByb3RvdHlwZTtnLm1hPWZ1bmN0aW9uKCl7dGhpcy5nPXRoaXMuRy5oKCJESVYiLHRoaXMuZWEuaih0aGlzKS5qb2luKCIgIikpfTtnLm5hPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaSgpfTtnLndhPWZ1bmN0aW9uKGEpe3JldHVybiBhLnRhZ05hbWU9PSJESVYifTtnLkVhPWZ1bmN0aW9uKGEpe3RoaXMuZz15Yyh0aGlzLmVhLHRoaXMsYSk7YS5zdHlsZS5kaXNwbGF5PT0ibm9uZSImJih0aGlzLlM9ITEpfTsKZy5JPWZ1bmN0aW9uKCl7Vi5sLkkuY2FsbCh0aGlzKTtUYih0aGlzLGZ1bmN0aW9uKGIpe2IucyYmVWModGhpcyxiKX0sdGhpcyk7dmFyIGE9dGhpcy5pKCk7QWModGhpcy5lYSx0aGlzKTtWYyh0aGlzLHRoaXMuUyk7QihCKEIoQihCKEIoQihCKFFiKHRoaXMpLHRoaXMsImVudGVyIix0aGlzLmViKSx0aGlzLCJoaWdobGlnaHQiLHRoaXMuZmIpLHRoaXMsInVuaGlnaGxpZ2h0Iix0aGlzLmxiKSx0aGlzLCJvcGVuIix0aGlzLmdiKSx0aGlzLCJjbG9zZSIsdGhpcy5iYiksYSxLLmdhLHRoaXMuV2EpLGJiKGEpLFtLLmhhLEsuZmFdLHRoaXMuY2IpLGEsW0suZ2EsSy5oYSxLLmZhLCJtb3VzZW92ZXIiLCJtb3VzZW91dCIsImNvbnRleHRtZW51Il0sdGhpcy5hYik7V2ModGhpcyl9O3ZhciBXYz1mdW5jdGlvbihhKXt2YXIgYj1RYihhKSxjPVRjKGEpO0IoQihCKGIsYywiZm9jdXMiLGEuUGEpLGMsImJsdXIiLGEuVWEpLGEuZGF8fChhLmRhPW5ldyBKKFRjKGEpKSksImtleSIsYS5WYSl9OwpnPVYucHJvdG90eXBlO2cuVT1mdW5jdGlvbigpe1hjKHRoaXMsLTEpO3RoaXMuQiYmT2ModGhpcy5CLCExKTt0aGlzLlc9ITE7Vi5sLlUuY2FsbCh0aGlzKX07Zy5DPWZ1bmN0aW9uKCl7Vi5sLkMuY2FsbCh0aGlzKTt0aGlzLmRhJiYodGhpcy5kYS5kaXNwb3NlKCksdGhpcy5kYT1udWxsKTt0aGlzLmVhPXRoaXMuQj10aGlzLk89dGhpcy5LYT1udWxsfTtnLmViPWZ1bmN0aW9uKCl7cmV0dXJuITB9OwpnLmZiPWZ1bmN0aW9uKGEpe3ZhciBiPVZiKHRoaXMsYS50YXJnZXQpO2lmKGI+LTEmJmIhPXRoaXMubyl7dmFyIGM9SSh0aGlzLHRoaXMubyk7YyYmUChjLCExKTt0aGlzLm89YjtjPUkodGhpcyx0aGlzLm8pO3RoaXMuVyYmTWMoYywhMCk7dGhpcy5CJiZjIT10aGlzLkImJihjLkQmNjQ/T2MoYywhMCk6T2ModGhpcy5CLCExKSl9Yj10aGlzLmkoKTtwKGIsIlRoZSBET00gZWxlbWVudCBmb3IgdGhlIGNvbnRhaW5lciBjYW5ub3QgYmUgbnVsbC4iKTthLnRhcmdldC5pKCkhPW51bGwmJmFjKGIsImFjdGl2ZWRlc2NlbmRhbnQiLGEudGFyZ2V0LmkoKS5pZCl9O2cubGI9ZnVuY3Rpb24oYSl7YS50YXJnZXQ9PUkodGhpcyx0aGlzLm8pJiYodGhpcy5vPS0xKTthPXRoaXMuaSgpO3AoYSwiVGhlIERPTSBlbGVtZW50IGZvciB0aGUgY29udGFpbmVyIGNhbm5vdCBiZSBudWxsLiIpO2EucmVtb3ZlQXR0cmlidXRlKCRiKCJhY3RpdmVkZXNjZW5kYW50IikpfTsKZy5nYj1mdW5jdGlvbihhKXsoYT1hLnRhcmdldCkmJmEhPXRoaXMuQiYmYS5oPT10aGlzJiYodGhpcy5CJiZPYyh0aGlzLkIsITEpLHRoaXMuQj1hKX07Zy5iYj1mdW5jdGlvbihhKXthLnRhcmdldD09dGhpcy5CJiYodGhpcy5CPW51bGwpO3ZhciBiPXRoaXMuaSgpLGM9YS50YXJnZXQuaSgpO2ImJmEudGFyZ2V0Lm0mMiYmYyYmKGE9IiIsYyYmKGE9Yy5pZCxwKGEsIlRoZSBhY3RpdmUgZWxlbWVudCBzaG91bGQgaGF2ZSBhbiBpZC4iKSksYWMoYiwiYWN0aXZlZGVzY2VuZGFudCIsYSkpfTtnLldhPWZ1bmN0aW9uKGEpe3RoaXMuVCYmKHRoaXMuVz0hMCk7dmFyIGI9VGModGhpcyk7YiYmZGIoYikmJmViKGIpP2IuZm9jdXMoKTphLmooKX07Zy5jYj1mdW5jdGlvbigpe3RoaXMuVz0hMX07CmcuYWI9ZnVuY3Rpb24oYSl7YTp7dmFyIGI9YS50YXJnZXQ7aWYodGhpcy5PKWZvcih2YXIgYz10aGlzLmkoKTtiJiZiIT09Yzspe3ZhciBkPWIuaWQ7aWYoZCBpbiB0aGlzLk8pe2I9dGhpcy5PW2RdO2JyZWFrIGF9Yj1iLnBhcmVudE5vZGV9Yj1udWxsfWlmKGIpc3dpdGNoKGEudHlwZSl7Y2FzZSBLLmdhOmIuc2EoYSk7YnJlYWs7Y2FzZSBLLmhhOmNhc2UgSy5mYTpiLnZhKGEpO2JyZWFrO2Nhc2UgIm1vdXNlb3ZlciI6Yi51YShhKTticmVhaztjYXNlICJtb3VzZW91dCI6Yi50YShhKTticmVhaztjYXNlICJjb250ZXh0bWVudSI6Yi5jYShhKX19O2cuUGE9ZnVuY3Rpb24oKXt9O2cuVWE9ZnVuY3Rpb24oKXtYYyh0aGlzLC0xKTt0aGlzLlc9ITE7dGhpcy5CJiZPYyh0aGlzLkIsITEpfTsKZy5WYT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5pc0VuYWJsZWQoKSYmdGhpcy5pc1Zpc2libGUoKSYmKEgodGhpcykhPTB8fHRoaXMuS2EpJiZZYyh0aGlzLGEpPyhhLmooKSxhLnYoKSwhMCk6ITF9Owp2YXIgWWM9ZnVuY3Rpb24oYSxiKXt2YXIgYz1JKGEsYS5vKTtpZihjJiZ0eXBlb2YgYy5hYT09ImZ1bmN0aW9uIiYmYy5hYShiKXx8YS5CJiZhLkIhPWMmJnR5cGVvZiBhLkIuYWE9PSJmdW5jdGlvbiImJmEuQi5hYShiKSlyZXR1cm4hMDtpZihiLnNoaWZ0S2V5fHxiLmN0cmxLZXl8fGIubWV0YUtleXx8Yi5hbHRLZXkpcmV0dXJuITE7c3dpdGNoKGIuZyl7Y2FzZSAyNzpUYyhhKS5ibHVyKCk7YnJlYWs7Y2FzZSAzNjpaYyhhKTticmVhaztjYXNlIDM1OiRjKGEpO2JyZWFrO2Nhc2UgMzg6aWYoYS5MPT0idmVydGljYWwiKWFkKGEpO2Vsc2UgcmV0dXJuITE7YnJlYWs7Y2FzZSAzNzppZihhLkw9PSJob3Jpem9udGFsIilVYihhKT9iZChhKTphZChhKTtlbHNlIHJldHVybiExO2JyZWFrO2Nhc2UgNDA6aWYoYS5MPT0idmVydGljYWwiKWJkKGEpO2Vsc2UgcmV0dXJuITE7YnJlYWs7Y2FzZSAzOTppZihhLkw9PSJob3Jpem9udGFsIilVYihhKT9hZChhKTpiZChhKTtlbHNlIHJldHVybiExOwpicmVhaztkZWZhdWx0OnJldHVybiExfXJldHVybiEwfSxVYz1mdW5jdGlvbihhLGIpe3ZhciBjPWIuaSgpO2M9Yy5pZHx8KGMuaWQ9T2IoYikpO2EuT3x8KGEuTz17fSk7YS5PW2NdPWJ9O1YucHJvdG90eXBlLkJhPWZ1bmN0aW9uKGEsYil7dWEoYSxOLCJUaGUgY2hpbGQgb2YgYSBjb250YWluZXIgbXVzdCBiZSBhIGNvbnRyb2wiKTtWLmwuQmEuY2FsbCh0aGlzLGEsYil9O1YucHJvdG90eXBlLkNhPWZ1bmN0aW9uKGEsYixjKXt1YShhLE4pO2EuUHw9MjthLlB8PTY0O1BjKGEsMzIsITEpO2EucyYmMCE9YS5IYSYmTGMoYSwhMSk7YS5IYT0hMTt2YXIgZD1hLmg9PXRoaXM/VmIodGhpcyxhKTotMTtWLmwuQ2EuY2FsbCh0aGlzLGEsYixjKTthLnMmJnRoaXMucyYmVWModGhpcyxhKTthPWQ7YT09LTEmJihhPUgodGhpcykpO2E9PXRoaXMubz90aGlzLm89TWF0aC5taW4oSCh0aGlzKS0xLGIpOmE+dGhpcy5vJiZiPD10aGlzLm8/dGhpcy5vKys6YTx0aGlzLm8mJmI+dGhpcy5vJiZ0aGlzLm8tLX07CnZhciB6Yz1mdW5jdGlvbihhLGIpe2lmKGEuaSgpKXRocm93IEVycm9yKCJDb21wb25lbnQgYWxyZWFkeSByZW5kZXJlZCIpO2EuTD1ifTtWLnByb3RvdHlwZS5pc1Zpc2libGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5TfTt2YXIgVmM9ZnVuY3Rpb24oYSxiKXthLlM9Yjt2YXIgYz1hLmkoKTtjJiYoYy5zdHlsZS5kaXNwbGF5PWI/IiI6Im5vbmUiLHdjKFRjKGEpLGEuVCYmYS5TKSl9O1YucHJvdG90eXBlLmlzRW5hYmxlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLlR9O1YucHJvdG90eXBlLlg9ZnVuY3Rpb24oYSl7dGhpcy5UIT1hJiZFKHRoaXMsYT8iZW5hYmxlIjoiZGlzYWJsZSIpJiYoYT8odGhpcy5UPSEwLFRiKHRoaXMsZnVuY3Rpb24oYil7Yi5UYT9kZWxldGUgYi5UYTpiLlgoITApfSkpOihUYih0aGlzLGZ1bmN0aW9uKGIpe2IuaXNFbmFibGVkKCk/Yi5YKCExKTpiLlRhPSEwfSksdGhpcy5XPXRoaXMuVD0hMSksd2MoVGModGhpcyksYSYmdGhpcy5TKSl9Owp2YXIgWGM9ZnVuY3Rpb24oYSxiKXsoYj1JKGEsYikpP1AoYiwhMCk6YS5vPi0xJiZQKEkoYSxhLm8pLCExKX0sWmM9ZnVuY3Rpb24oYSl7Y2QoYSxmdW5jdGlvbihiLGMpe3JldHVybihiKzEpJWN9LEgoYSktMSl9LCRjPWZ1bmN0aW9uKGEpe2NkKGEsZnVuY3Rpb24oYixjKXtiLS07cmV0dXJuIGI8MD9jLTE6Yn0sMCl9LGJkPWZ1bmN0aW9uKGEpe2NkKGEsZnVuY3Rpb24oYixjKXtyZXR1cm4oYisxKSVjfSxhLm8pfSxhZD1mdW5jdGlvbihhKXtjZChhLGZ1bmN0aW9uKGIsYyl7Yi0tO3JldHVybiBiPDA/Yy0xOmJ9LGEubyl9LGNkPWZ1bmN0aW9uKGEsYixjKXtjPWM8MD9WYihhLGEuQik6Yzt2YXIgZD1IKGEpO2M9Yi5jYWxsKGEsYyxkKTtmb3IodmFyIGU9MDtlPD1kOyl7dmFyIGY9SShhLGMpO2lmKGYmJmYuaXNWaXNpYmxlKCkmJmYuaXNFbmFibGVkKCkmJmYuRCYyKXthLkxhKGMpO2JyZWFrfWUrKztjPWIuY2FsbChhLGMsZCl9fTsKVi5wcm90b3R5cGUuTGE9ZnVuY3Rpb24oYSl7WGModGhpcyxhKX07dmFyIGRkPWZ1bmN0aW9uKCl7fTtuKGRkLE0pO2lhKGRkKTtnPWRkLnByb3RvdHlwZTtnLk49ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy10YWIifTtnLk5hPWZ1bmN0aW9uKCl7cmV0dXJuInRhYiJ9O2cueGE9ZnVuY3Rpb24oYSl7dmFyIGI9ZGQubC54YS5jYWxsKHRoaXMsYSk7KGE9YS5HYSgpKSYmdGhpcy5NYShiLGEpO3JldHVybiBifTtnLnlhPWZ1bmN0aW9uKGEsYil7Yj1kZC5sLnlhLmNhbGwodGhpcyxhLGIpO3ZhciBjPXRoaXMuR2EoYik7YyYmKGEuUmE9Yyk7YS5tJjgmJihjPWEuaCkmJnR5cGVvZiBjLko9PT0iZnVuY3Rpb24iJiYoVChhLDgsITEpLGMuSihhKSk7cmV0dXJuIGJ9O2cuR2E9ZnVuY3Rpb24oYSl7cmV0dXJuIGEudGl0bGV8fCIifTtnLk1hPWZ1bmN0aW9uKGEsYil7YSYmKGEudGl0bGU9Ynx8IiIpfTt2YXIgZWQ9ZnVuY3Rpb24oYSxiLGMpe04uY2FsbCh0aGlzLGEsYnx8ZGQuVigpLGMpO1BjKHRoaXMsOCwhMCk7dGhpcy5QfD05fTtuKGVkLE4pO2VkLnByb3RvdHlwZS5HYT1mdW5jdGlvbigpe3JldHVybiB0aGlzLlJhfTtlZC5wcm90b3R5cGUuTWE9ZnVuY3Rpb24oYSl7dGhpcy52Lk1hKHRoaXMuaSgpLGEpO3RoaXMuUmE9YX07dGMoImdvb2ctdGFiIixmdW5jdGlvbigpe3JldHVybiBuZXcgZWQobnVsbCl9KTt2YXIgVz1mdW5jdGlvbigpe3RoaXMuQT0idGFibGlzdCJ9O24oVyx2Yyk7aWEoVyk7Vy5wcm90b3R5cGUuZz1mdW5jdGlvbigpe3JldHVybiJnb29nLXRhYi1iYXIifTtXLnByb3RvdHlwZS51PWZ1bmN0aW9uKGEsYixjKXt0aGlzLnZ8fCh0aGlzLmh8fGZkKHRoaXMpLHRoaXMudj1FYSh0aGlzLmgpKTt2YXIgZD10aGlzLnZbYl07ZD8oemMoYSxnZChkKSksYS52PWQpOlcubC51LmNhbGwodGhpcyxhLGIsYyl9O1cucHJvdG90eXBlLmo9ZnVuY3Rpb24oYSl7dmFyIGI9Vy5sLmouY2FsbCh0aGlzLGEpO3RoaXMuaHx8ZmQodGhpcyk7Yi5wdXNoKHRoaXMuaFthLnZdKTtyZXR1cm4gYn07dmFyIGZkPWZ1bmN0aW9uKGEpe3ZhciBiPWEuZygpO2EuaD17dG9wOmIrIi10b3AiLGJvdHRvbTpiKyItYm90dG9tIixzdGFydDpiKyItc3RhcnQiLGVuZDpiKyItZW5kIn19O3ZhciBYPWZ1bmN0aW9uKGEsYixjKXthPWF8fCJ0b3AiO3pjKHRoaXMsZ2QoYSkpO3RoaXMudj1hO1YuY2FsbCh0aGlzLHRoaXMuTCxifHxXLlYoKSxjKTtoZCh0aGlzKX07bihYLFYpO2c9WC5wcm90b3R5cGU7Zy5IPW51bGw7Zy5JPWZ1bmN0aW9uKCl7WC5sLkkuY2FsbCh0aGlzKTtoZCh0aGlzKX07Zy5DPWZ1bmN0aW9uKCl7WC5sLkMuY2FsbCh0aGlzKTt0aGlzLkg9bnVsbH07Zy5MYT1mdW5jdGlvbihhKXtYLmwuTGEuY2FsbCh0aGlzLGEpO3RoaXMuSihJKHRoaXMsYSkpfTtnLko9ZnVuY3Rpb24oYSl7YT9OYyhhLCEwKTp0aGlzLkgmJk5jKHRoaXMuSCwhMSl9Owp2YXIgaWQ9ZnVuY3Rpb24oYSxiKXtpZihiJiZiPT1hLkgpe2Zvcih2YXIgYz1WYihhLGIpLGQ9Yy0xO2I9SShhLGQpO2QtLSl7dmFyIGU9YjtpZihlLmlzVmlzaWJsZSgpJiZlLmlzRW5hYmxlZCgpKXthLkooYik7cmV0dXJufX1mb3IoYys9MTtiPUkoYSxjKTtjKyspaWYoZD1iLGQuaXNWaXNpYmxlKCkmJmQuaXNFbmFibGVkKCkpe2EuSihiKTtyZXR1cm59YS5KKG51bGwpfX07Zz1YLnByb3RvdHlwZTtnLmpiPWZ1bmN0aW9uKGEpe3RoaXMuSCYmdGhpcy5IIT1hLnRhcmdldCYmTmModGhpcy5ILCExKTt0aGlzLkg9YS50YXJnZXR9O2cua2I9ZnVuY3Rpb24oYSl7YS50YXJnZXQ9PXRoaXMuSCYmKHRoaXMuSD1udWxsKX07Zy5oYj1mdW5jdGlvbihhKXtpZCh0aGlzLGEudGFyZ2V0KX07Zy5pYj1mdW5jdGlvbihhKXtpZCh0aGlzLGEudGFyZ2V0KX07Zy5QYT1mdW5jdGlvbigpe0kodGhpcyx0aGlzLm8pfHxYYyh0aGlzLFZiKHRoaXMsdGhpcy5IfHxJKHRoaXMsMCkpKX07CnZhciBoZD1mdW5jdGlvbihhKXtCKEIoQihCKFFiKGEpLGEsInNlbGVjdCIsYS5qYiksYSwidW5zZWxlY3QiLGEua2IpLGEsImRpc2FibGUiLGEuaGIpLGEsImhpZGUiLGEuaWIpfSxnZD1mdW5jdGlvbihhKXtyZXR1cm4gYT09InN0YXJ0Inx8YT09ImVuZCI/InZlcnRpY2FsIjoiaG9yaXpvbnRhbCJ9O3RjKCJnb29nLXRhYi1iYXIiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBYfSk7ZnVuY3Rpb24gamQoYSl7dmFyIGI9e3RvcDoiYm90dG9tIixib3R0b206InRvcCIsc3RhcnQ6InJpZ2h0IixlbmQ6ImxlZnQifVthLmxvY2F0aW9uXSxjPWEuZWxlbWVudElkLGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTtkLnRleHRDb250ZW50PSJcbiAgICBmaWVsZHNldCB7XG4gICAgICBwYWRkaW5nOiAxMHB4O1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgIzM2OTtcbiAgICB9XG5cbiAgICAjIitjKyIgLmdvb2ctdGFiLWNvbnRlbnQge1xuICAgICAgbWluLWhlaWdodDogM2VtO1xuICAgICAgbWFyZ2luOiAwO1xuICAgICAgYm9yZGVyOiAiK2EuYm9yZGVyKyIgc29saWQgIithLmJvcmRlckNvbG9yKyI7XG4gICAgICBib3JkZXItdG9wOiAwO1xuICAgICAgaGVpZ2h0OiAiK2EuY29udGVudEhlaWdodCsiO1xuICAgICAgcGFkZGluZzogNHB4IDhweDtcbiAgICAgIG1hcmdpbi1yaWdodDogNHB4O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgIG92ZXJmbG93OiBhdXRvO1xuICAgIH1cblxuICAgICMiKwpjKyIgLmdvb2ctdGFiLWJhci0iK2EubG9jYXRpb24rIiAuZ29vZy10YWItc2VsZWN0ZWQge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICIrYS5ib3JkZXJDb2xvcisiO1xuICAgICAgYm9yZGVyLSIrYisiOiAwcHg7XG4gICAgfVxuXG4gICAgIyIrYysiIC5nb29nLXRhYi1iYXItIithLmxvY2F0aW9uKyIge1xuICAgICAgcGFkZGluZy0iK2EubG9jYXRpb24rIjogNXB4ICFpbXBvcnRhbnQ7XG4gICAgICBib3JkZXItIitiKyI6IDFweCBzb2xpZCAiK2EuYm9yZGVyQ29sb3IrIiAhaW1wb3J0YW50O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICB9XG5cbiAgICAjIitjKyIgLmdvb2ctdGFiLWJhciB7XG4gICAgICAgbWFyZ2luOiAwO1xuICAgICAgIGJvcmRlcjogMDtcbiAgICAgICBwYWRkaW5nOiAwO1xuICAgICAgIGxpc3Qtc3R5bGU6IG5vbmU7XG4gICAgICAgY3Vyc29yOiBkZWZhdWx0O1xuICAgICAgIG91dGxpbmU6IG5vbmU7XG4gICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgICBtYXJnaW4tcmlnaHQ6IDRweDtcbiAgICAgIH1cblxuICAgICAjIisKYysiIC5nb29nLXRhYiB7XG4gICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgIHBhZGRpbmc6IDRweCA4cHg7XG4gICAgICAgY29sb3I6IHZhcigtLWNvbGFiLXByaW1hcnktdGV4dC1jb2xvcik7XG4gICAgICAgdGV4dC1kZWNvcmF0aW9uOiBpbml0aWFsO1xuICAgICAgIGN1cnNvcjogZGVmYXVsdDtcbiAgICAgIH1cblxuICAgICAgIyIrYysiIC5nb29nLXRhYi1ob3ZlciB7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWNvbGFiLWhpZ2hsaWdodGVkLXN1cmZhY2UtY29sb3IpO1xuICAgICAgfVxuICAgICAgIjtyZXR1cm4gZH0KdmFyIGtkPWZ1bmN0aW9uKGEpe3ZhciBiPWEuZWxlbWVudElkLGM9YS50YWJOYW1lcyxkPWEuc2VsZWN0ZWRJbmRleDsiY29udGVudEJvcmRlciJpbiBhfHwoYS5jb250ZW50Qm9yZGVyPSIwcHgiKTsiY29udGVudEhlaWdodCJpbiBhfHwoYS5jb250ZW50SGVpZ2h0PSJpbml0aWFsIik7ImJvcmRlckNvbG9yImluIGF8fChhLmJvcmRlckNvbG9yPSJ2YXIoLS1jb2xhYi1ib3JkZXItY29sb3IpIik7YS5sb2NhdGlvbnx8KGEubG9jYXRpb249InRvcCIpO3ZhciBlPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiMiK2IpLGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zi5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYi1iYXIiKTt2YXIgaD1hLmxvY2F0aW9uO2YuY2xhc3NMaXN0LmFkZCgiZ29vZy10YWItYmFyLSIraCk7Zm9yKHZhciBrPVtdLHE9ZmEoYyksRz1xLm5leHQoKTshRy5kb25lO0c9cS5uZXh0KCkpe0c9Ry52YWx1ZTt2YXIgeD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKeC5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYiIpO3gudGV4dENvbnRlbnQ9RztmLmFwcGVuZENoaWxkKHgpO2sucHVzaCh4KX1oIT0iYm90dG9tIiYmZS5hcHBlbmRDaGlsZChmKTtxPW51bGw7aWYoaD09InRvcCJ8fGg9PSJib3R0b20iKXE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikscS5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYi1iYXItY2xlYXIiKTtoPT0idG9wIiYmcSYmZS5hcHBlbmRDaGlsZChxKTtHPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO0cuY2xhc3NMaXN0LmFkZCgiZ29vZy10YWItY29udGVudCIpO3ZhciBoYT1bXTtjPWZhKGMpO2Zvcih4PWMubmV4dCgpOyF4LmRvbmU7eD1jLm5leHQoKSl4PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHguaWQ9ZS5pZCsiX2NvbnRlbnRfIitoYS5sZW5ndGgseC5zdHlsZS5kaXNwbGF5PSJub25lIixHLmFwcGVuZENoaWxkKHgpLGhhLnB1c2goeCk7ZS5hcHBlbmRDaGlsZChHKTtoPT0iYm90dG9tIiYmKHEmJgplLmFwcGVuZENoaWxkKHEpLGUuYXBwZW5kQ2hpbGQoZikpO3ZhciBRPW5ldyBYKGgpO1NiKFEsZik7dmFyIFI9LTE7d2IoUSwic2VsZWN0IixmdW5jdGlvbihTKXtTPWsuaW5kZXhPZihTLnRhcmdldC5pKCkpO1MhPVImJihSPj0wJiZSPGhhLmxlbmd0aCYmKGhhW1JdLnN0eWxlLmRpc3BsYXk9Im5vbmUiLFI9LTEpLFM+PTAmJlM8aGEubGVuZ3RoJiYoUj1TLGhhW1JdLnN0eWxlLmRpc3BsYXk9ImlubGluZSIsd2luZG93LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCJyZXNpemUiKSksZ29vZ2xlLmNvbGFiLm91dHB1dC5yZXNpemVJZnJhbWVUb0NvbnRlbnQoKSksUS5KKEkoUSxSKSkpfSk7US5KKEkoUSxkKSk7d2luZG93W2JdPXtzZXRTZWxlY3RlZFRhYkluZGV4OmZ1bmN0aW9uKFMpe1EuSihJKFEsUykpfX07ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChqZChhKSl9LGxkPVsiY29sYWJfbGliIiwiY3JlYXRlVGFiQmFyIl0sWT1sOwpsZFswXWluIFl8fHR5cGVvZiBZLmV4ZWNTY3JpcHQ9PSJ1bmRlZmluZWQifHxZLmV4ZWNTY3JpcHQoInZhciAiK2xkWzBdKTtmb3IodmFyIFo7bGQubGVuZ3RoJiYoWj1sZC5zaGlmdCgpKTspbGQubGVuZ3RofHxrZD09PXZvaWQgMD9ZW1pdJiZZW1pdIT09T2JqZWN0LnByb3RvdHlwZVtaXT9ZPVlbWl06WT1ZW1pdPXt9OllbWl09a2Q7fSkuY2FsbCh0aGlzKTsKLy8gY2xhbmctZm9ybWF0IG9uCg==", + "ok": true, + "headers": [ + [ + "content-length", + "41785" + ], + [ + "content-type", + "application/javascript" + ] + ], + "status": 200, + "status_text": "" + } + }, + "base_uri": "https://localhost:8080/", + "height": 197 + }, + "outputId": "5b6fe1a0-89c6-4fac-9d4d-f5c521068b3f" + }, + "source": [ + "%%logica WritesCode,WritesNoCode\n", + "\n", + "@Engine(\"sqlite\");\n", + "\n", + "Employee(name: \"Alice\", role: \"Product Manager\", office: \"SEA\");\n", + "Employee(name: \"Bob\", role: \"Engineer\", office: \"SEA\");\n", + "Employee(name: \"Caroline\", role: \"Engineer\", office: \"LAX\");\n", + "Employee(name: \"David\", role: \"Data Scientist\", office: \"LAX\");\n", + "Employee(name: \"Eve\", role: \"Data Scientist\", office: \"SEA\");\n", + "\n", + "# Example of extracting engineers and data scientists with\n", + "# boolean disjunction.\n", + "WritesCode(name:) :-\n", + " Employee(name:, role:),\n", + " (role == \"Engineer\" || role == \"Data Scientist\");\n", + "\n", + "# Extracting of everyone except for engineers and data scientists\n", + "# with boolean disjunction and negation.\n", + "WritesNoCode(name:) :-\n", + " Employee(name:, role:),\n", + " !(role == \"Engineer\" || role == \"Data Scientist\");\n" + ], + "execution_count": 39, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7b344e34-d22d-11ef-a7c0-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id87\", \"tabNames\": [\"WritesCode\", \"WritesNoCode\", \"(Log)\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_dc6db2362b" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7b34c364-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id87\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_4f54475846" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7b36d6b8-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_9f1a676bd6" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7b372b22-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id87_content_2\");\n", + "//# sourceURL=js_e636938e7b" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7b37b5ba-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"7b372b22-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_ee277351dd" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7b3812f8-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id87\"].setSelectedTabIndex(2);\n", + "//# sourceURL=js_6a71d2e239" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7b3b3eb0-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"7b36d6b8-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_79917acb09" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7b3d8ec2-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_99d1890b62" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7b3e2b52-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id87_content_0\");\n", + "//# sourceURL=js_d6cd3cc699" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7b3e9088-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"7b3e2b52-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_6384f79f9c" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7b3f0cd4-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id87\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_5d4936bd1a" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7b420d80-d22d-11ef-a7c0-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id88\", \"tabNames\": [\"SQL\", \"Result\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_79f7c8ed39" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7b42be7e-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id88\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_7e6ba3133c" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7b4431f0-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_f607f74225" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7b44866e-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id88_content_0\");\n", + "//# sourceURL=js_d5cb532122" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7b44d24a-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"7b44866e-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_74796fbd6c" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7b451eda-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id88\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_e921aa206c" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The following query is stored at \u001b[1mWritesCode_sql\u001b[0m variable.\n", + "WITH t_0_Employee AS (SELECT * FROM (\n", + " \n", + " SELECT\n", + " 'Alice' AS name,\n", + " 'Product Manager' AS role,\n", + " 'SEA' AS office\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " 'Bob' AS name,\n", + " 'Engineer' AS role,\n", + " 'SEA' AS office\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " 'Caroline' AS name,\n", + " 'Engineer' AS role,\n", + " 'LAX' AS office\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " 'David' AS name,\n", + " 'Data Scientist' AS role,\n", + " 'LAX' AS office\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " 'Eve' AS name,\n", + " 'Data Scientist' AS role,\n", + " 'SEA' AS office\n", + " \n", + ") AS UNUSED_TABLE_NAME )\n", + "SELECT\n", + " Employee.name AS name\n", + "FROM\n", + " t_0_Employee AS Employee\n", + "WHERE\n", + " ((Employee.role = 'Engineer') OR (Employee.role = 'Data Scientist'));\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7b46dcd4-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"7b4431f0-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_cb08c15871" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7b486ca2-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_b8d471951b" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7b48ba4a-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id88_content_1\");\n", + "//# sourceURL=js_e4130a6552" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7b49043c-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"7b48ba4a-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_7f10ff75fb" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7b494ef6-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id88\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_9ce31c983f" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The following table is stored at \u001b[1mWritesCode\u001b[0m variable.\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
name
0Bob
1Caroline
2David
3Eve
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7b4a9284-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"7b486ca2-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_15f4e09b5d" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7b4be0f8-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"7b3d8ec2-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_05ac0f7429" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7b4d729c-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_6f484e229c" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7b4dbc8e-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id87_content_2\");\n", + "//# sourceURL=js_8b1e3ce4b4" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7b4e0770-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"7b4dbc8e-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_484980bacd" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7b4e4d8e-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id87\"].setSelectedTabIndex(2);\n", + "//# sourceURL=js_3af8fac354" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7b57a5a0-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"7b4d729c-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_2913f9bacc" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7b5a9026-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_52236aed32" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7b5afb10-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id87_content_1\");\n", + "//# sourceURL=js_e40bc30213" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7b5baccc-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"7b5afb10-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_05c64104cd" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7b5c3192-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id87\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_99e0f4c265" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7b5f139e-d22d-11ef-a7c0-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id89\", \"tabNames\": [\"SQL\", \"Result\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_5b44977f6c" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7b5f8bee-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id89\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_12defc5675" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7b6237e0-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_7434b14d4e" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7b62a0d6-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id89_content_0\");\n", + "//# sourceURL=js_2cacb38678" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7b6309cc-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"7b62a0d6-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_7493a968ee" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7b63850a-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id89\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_965aac3d06" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The following query is stored at \u001b[1mWritesNoCode_sql\u001b[0m variable.\n", + "WITH t_0_Employee AS (SELECT * FROM (\n", + " \n", + " SELECT\n", + " 'Alice' AS name,\n", + " 'Product Manager' AS role,\n", + " 'SEA' AS office\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " 'Bob' AS name,\n", + " 'Engineer' AS role,\n", + " 'SEA' AS office\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " 'Caroline' AS name,\n", + " 'Engineer' AS role,\n", + " 'LAX' AS office\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " 'David' AS name,\n", + " 'Data Scientist' AS role,\n", + " 'LAX' AS office\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " 'Eve' AS name,\n", + " 'Data Scientist' AS role,\n", + " 'SEA' AS office\n", + " \n", + ") AS UNUSED_TABLE_NAME )\n", + "SELECT\n", + " Employee.name AS name\n", + "FROM\n", + " t_0_Employee AS Employee\n", + "WHERE\n", + " NOT ((Employee.role = 'Engineer') OR (Employee.role = 'Data Scientist'));\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7b65ba96-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"7b6237e0-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_27b0f3a57b" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7b686b2e-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_f4d4b63633" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7b68d816-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id89_content_1\");\n", + "//# sourceURL=js_fa472cda4b" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7b6992ba-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"7b68d816-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_9bc9f2ec40" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7b69f318-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id89\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_a87dd5775b" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The following table is stored at \u001b[1mWritesNoCode\u001b[0m variable.\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
name
0Alice
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7b6c4bea-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"7b686b2e-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_5223df167d" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7b6ea9c6-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"7b5a9026-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_30e6a9f4a2" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7b719eba-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_709f5b5d48" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7b721098-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id87_content_2\");\n", + "//# sourceURL=js_061704f12b" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7b729964-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"7b721098-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_63b6501306" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7b7305d4-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id87\"].setSelectedTabIndex(2);\n", + "//# sourceURL=js_373fcc0f13" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "image/svg+xml": "\n\n\n\n\n\nConcertina\n\n\n\nWritesNoCode\n\nWritesNoCode\n\n\n\nWritesCode\n\nWritesCode\n\n\n\n", + "text/plain": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Running predicate: WritesNoCode (3 ms)\n", + "Running predicate: WritesCode (3 ms)\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7b8ef6c2-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"7b719eba-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_eef1db0ee0" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7b90dd16-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_b0e33412e1" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7b9126e0-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id87_content_0\");\n", + "//# sourceURL=js_1ddc27906f" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7b917708-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"7b9126e0-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_f9ad417705" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7b91c096-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id87\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_b0badc8859" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7b935000-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_8c1fff7774" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7b939e66-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id88_content_1\");\n", + "//# sourceURL=js_f2c9098878" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7b940d2e-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"7b939e66-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_a747d9e214" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7b94757a-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id88\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_6ec701a961" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7b96e512-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"7b935000-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_c9fa088ea6" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + " \n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7b98e470-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"7b90dd16-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_1204756c9a" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7b9aaecc-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_13cae064d5" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7b9afce2-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id87_content_1\");\n", + "//# sourceURL=js_ac96157a61" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7b9b4a08-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"7b9afce2-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_aa31ae2b7d" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7b9ba2f0-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id87\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_a1cfdca910" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7b9ce368-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_0b95f2bbb7" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7b9d3a2a-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id89_content_1\");\n", + "//# sourceURL=js_17c025d10c" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7b9d8e26-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"7b9d3a2a-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_68cb7821e4" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7b9ddc82-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id89\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_0fb708043d" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7b9f8cbc-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"7b9ce368-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_e9ee19e807" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + " \n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7ba0fea8-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"7b9aaecc-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_e4de583423" + ] + }, + "metadata": {} + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "fat6MuElMw0E" + }, + "source": [ + "### `LIKE` operator\n", + "\n", + "SQL's `LIKE` string matching operator is accessible via `Like` function." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "fw8A4MsIMv3Y", + "colab": { + "resources": { + "http://localhost:8080/nbextensions/google.colab/tabbar.css": { + "data": "Lmdvb2ctdGFie3Bvc2l0aW9uOnJlbGF0aXZlO3BhZGRpbmc6NHB4IDhweDtjb2xvcjojMDBjO3RleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7Y3Vyc29yOmRlZmF1bHR9Lmdvb2ctdGFiLWJhci10b3AgLmdvb2ctdGFie21hcmdpbjoxcHggNHB4IDAgMDtib3JkZXItYm90dG9tOjA7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLXRvcDphZnRlciwuZ29vZy10YWItYmFyLWJvdHRvbTphZnRlcntjb250ZW50OiIgIjtkaXNwbGF5OmJsb2NrO2hlaWdodDowO2NsZWFyOmJvdGg7dmlzaWJpbGl0eTpoaWRkZW59Lmdvb2ctdGFiLWJhci1ib3R0b20gLmdvb2ctdGFie21hcmdpbjowIDRweCAxcHggMDtib3JkZXItdG9wOjA7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLXN0YXJ0IC5nb29nLXRhYnttYXJnaW46MCAwIDRweCAxcHg7Ym9yZGVyLXJpZ2h0OjB9Lmdvb2ctdGFiLWJhci1lbmQgLmdvb2ctdGFie21hcmdpbjowIDFweCA0cHggMDtib3JkZXItbGVmdDowfS5nb29nLXRhYi1ob3ZlcntiYWNrZ3JvdW5kOiNlZWV9Lmdvb2ctdGFiLWRpc2FibGVke2NvbG9yOiM2NjZ9Lmdvb2ctdGFiLXNlbGVjdGVke2NvbG9yOiMwMDA7YmFja2dyb3VuZDojZmZmO3RleHQtZGVjb3JhdGlvbjpub25lO2ZvbnQtd2VpZ2h0OmJvbGQ7Ym9yZGVyOjFweCBzb2xpZCAjNmI5MGRhfS5nb29nLXRhYi1iYXItdG9we3BhZGRpbmctdG9wOjVweCFpbXBvcnRhbnQ7cGFkZGluZy1sZWZ0OjVweCFpbXBvcnRhbnQ7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgIzZiOTBkYSFpbXBvcnRhbnR9Lmdvb2ctdGFiLWJhci10b3AgLmdvb2ctdGFiLXNlbGVjdGVke3RvcDoxcHg7bWFyZ2luLXRvcDowO3BhZGRpbmctYm90dG9tOjVweH0uZ29vZy10YWItYmFyLWJvdHRvbSAuZ29vZy10YWItc2VsZWN0ZWR7dG9wOi0xcHg7bWFyZ2luLWJvdHRvbTowO3BhZGRpbmctdG9wOjVweH0uZ29vZy10YWItYmFyLXN0YXJ0IC5nb29nLXRhYi1zZWxlY3RlZHtsZWZ0OjFweDttYXJnaW4tbGVmdDowO3BhZGRpbmctcmlnaHQ6OXB4fS5nb29nLXRhYi1iYXItZW5kIC5nb29nLXRhYi1zZWxlY3RlZHtsZWZ0Oi0xcHg7bWFyZ2luLXJpZ2h0OjA7cGFkZGluZy1sZWZ0OjlweH0uZ29vZy10YWItYmFye21hcmdpbjowO2JvcmRlcjowO3BhZGRpbmc6MDtsaXN0LXN0eWxlOm5vbmU7Y3Vyc29yOmRlZmF1bHQ7b3V0bGluZTpub25lO2JhY2tncm91bmQ6I2ViZWZmOX0uZ29vZy10YWItYmFyLWNsZWFye2NsZWFyOmJvdGg7aGVpZ2h0OjA7b3ZlcmZsb3c6aGlkZGVufS5nb29nLXRhYi1iYXItc3RhcnR7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLWVuZHtmbG9hdDpyaWdodH0qIGh0bWwgLmdvb2ctdGFiLWJhci1zdGFydHttYXJnaW4tcmlnaHQ6LTNweH0qIGh0bWwgLmdvb2ctdGFiLWJhci1lbmR7bWFyZ2luLWxlZnQ6LTNweH1zZW50aW5lbHt9", + "ok": true, + "headers": [ + [ + "content-length", + "1404" + ], + [ + "content-type", + "text/css" + ] + ], + "status": 200, + "status_text": "" + }, + "http://localhost:8080/nbextensions/google.colab/tabbar_main.min.js": { + "data": "Ly8gY2xhbmctZm9ybWF0IG9mZgooZnVuY3Rpb24oKXt2YXIgZyxhYT1mdW5jdGlvbihhKXt2YXIgYj0wO3JldHVybiBmdW5jdGlvbigpe3JldHVybiBiPGEubGVuZ3RoP3tkb25lOiExLHZhbHVlOmFbYisrXX06e2RvbmU6ITB9fX0sYmE9dHlwZW9mIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzPT0iZnVuY3Rpb24iP09iamVjdC5kZWZpbmVQcm9wZXJ0eTpmdW5jdGlvbihhLGIsYyl7aWYoYT09QXJyYXkucHJvdG90eXBlfHxhPT1PYmplY3QucHJvdG90eXBlKXJldHVybiBhO2FbYl09Yy52YWx1ZTtyZXR1cm4gYX0sY2E9ZnVuY3Rpb24oYSl7YT1bIm9iamVjdCI9PXR5cGVvZiBnbG9iYWxUaGlzJiZnbG9iYWxUaGlzLGEsIm9iamVjdCI9PXR5cGVvZiB3aW5kb3cmJndpbmRvdywib2JqZWN0Ij09dHlwZW9mIHNlbGYmJnNlbGYsIm9iamVjdCI9PXR5cGVvZiBnbG9iYWwmJmdsb2JhbF07Zm9yKHZhciBiPTA7YjxhLmxlbmd0aDsrK2Ipe3ZhciBjPWFbYl07aWYoYyYmYy5NYXRoPT1NYXRoKXJldHVybiBjfXRocm93IEVycm9yKCJDYW5ub3QgZmluZCBnbG9iYWwgb2JqZWN0Iik7Cn0sZGE9Y2EodGhpcyksZWE9ZnVuY3Rpb24oYSxiKXtpZihiKWE6e3ZhciBjPWRhO2E9YS5zcGxpdCgiLiIpO2Zvcih2YXIgZD0wO2Q8YS5sZW5ndGgtMTtkKyspe3ZhciBlPWFbZF07aWYoIShlIGluIGMpKWJyZWFrIGE7Yz1jW2VdfWE9YVthLmxlbmd0aC0xXTtkPWNbYV07Yj1iKGQpO2IhPWQmJmIhPW51bGwmJmJhKGMsYSx7Y29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOmJ9KX19OwplYSgiU3ltYm9sIixmdW5jdGlvbihhKXtpZihhKXJldHVybiBhO3ZhciBiPWZ1bmN0aW9uKGYsaCl7dGhpcy5nPWY7YmEodGhpcywiZGVzY3JpcHRpb24iLHtjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6aH0pfTtiLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmd9O3ZhciBjPSJqc2NvbXBfc3ltYm9sXyIrKE1hdGgucmFuZG9tKCkqMUU5Pj4+MCkrIl8iLGQ9MCxlPWZ1bmN0aW9uKGYpe2lmKHRoaXMgaW5zdGFuY2VvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoIlN5bWJvbCBpcyBub3QgYSBjb25zdHJ1Y3RvciIpO3JldHVybiBuZXcgYihjKyhmfHwiIikrIl8iK2QrKyxmKX07cmV0dXJuIGV9KTsKdmFyIGZhPWZ1bmN0aW9uKGEpe3ZhciBiPXR5cGVvZiBTeW1ib2whPSJ1bmRlZmluZWQiJiZTeW1ib2wuaXRlcmF0b3ImJmFbU3ltYm9sLml0ZXJhdG9yXTtpZihiKXJldHVybiBiLmNhbGwoYSk7aWYodHlwZW9mIGEubGVuZ3RoPT0ibnVtYmVyIilyZXR1cm57bmV4dDphYShhKX07dGhyb3cgRXJyb3IoU3RyaW5nKGEpKyIgaXMgbm90IGFuIGl0ZXJhYmxlIG9yIEFycmF5TGlrZSIpO307ZWEoIlN5bWJvbC5kaXNwb3NlIixmdW5jdGlvbihhKXtyZXR1cm4gYT9hOlN5bWJvbCgiU3ltYm9sLmRpc3Bvc2UiKX0pOy8qCgogQ29weXJpZ2h0IFRoZSBDbG9zdXJlIExpYnJhcnkgQXV0aG9ycy4KIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wCiovCnZhciBsPXRoaXN8fHNlbGYsaWE9ZnVuY3Rpb24oYSl7YS5JYT12b2lkIDA7YS5WPWZ1bmN0aW9uKCl7cmV0dXJuIGEuSWE/YS5JYTphLklhPW5ldyBhfX0samE9ZnVuY3Rpb24oYSl7dmFyIGI9dHlwZW9mIGE7cmV0dXJuIGIhPSJvYmplY3QiP2I6YT9BcnJheS5pc0FycmF5KGEpPyJhcnJheSI6YjoibnVsbCJ9LGthPWZ1bmN0aW9uKGEpe3ZhciBiPWphKGEpO3JldHVybiBiPT0iYXJyYXkifHxiPT0ib2JqZWN0IiYmdHlwZW9mIGEubGVuZ3RoPT0ibnVtYmVyIn0sbT1mdW5jdGlvbihhKXt2YXIgYj10eXBlb2YgYTtyZXR1cm4gYj09Im9iamVjdCImJmEhPW51bGx8fGI9PSJmdW5jdGlvbiJ9LG5hPWZ1bmN0aW9uKGEpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYSxsYSkmJmFbbGFdfHwoYVtsYV09KyttYSl9LGxhPSJjbG9zdXJlX3VpZF8iKyhNYXRoLnJhbmRvbSgpKjFFOT4+PjApLG1hPTAsbj1mdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoKXt9Yy5wcm90b3R5cGU9CmIucHJvdG90eXBlO2EubD1iLnByb3RvdHlwZTthLnByb3RvdHlwZT1uZXcgYzthLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1hO2EucWQ9ZnVuY3Rpb24oZCxlLGYpe2Zvcih2YXIgaD1BcnJheShhcmd1bWVudHMubGVuZ3RoLTIpLGs9MjtrPGFyZ3VtZW50cy5sZW5ndGg7aysrKWhbay0yXT1hcmd1bWVudHNba107cmV0dXJuIGIucHJvdG90eXBlW2VdLmFwcGx5KGQsaCl9fTtmdW5jdGlvbiBvYShhLGIpe2lmKEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKUVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsb2EpO2Vsc2V7dmFyIGM9RXJyb3IoKS5zdGFjaztjJiYodGhpcy5zdGFjaz1jKX1hJiYodGhpcy5tZXNzYWdlPVN0cmluZyhhKSk7YiE9PXZvaWQgMCYmKHRoaXMuY2F1c2U9Yil9bihvYSxFcnJvcik7b2EucHJvdG90eXBlLm5hbWU9IkN1c3RvbUVycm9yIjt2YXIgcGE7ZnVuY3Rpb24gcWEoYSxiKXthPWEuc3BsaXQoIiVzIik7Zm9yKHZhciBjPSIiLGQ9YS5sZW5ndGgtMSxlPTA7ZTxkO2UrKyljKz1hW2VdKyhlPGIubGVuZ3RoP2JbZV06IiVzIik7b2EuY2FsbCh0aGlzLGMrYVtkXSl9bihxYSxvYSk7cWEucHJvdG90eXBlLm5hbWU9IkFzc2VydGlvbkVycm9yIjtmdW5jdGlvbiByYShhLGIsYyxkKXt2YXIgZT0iQXNzZXJ0aW9uIGZhaWxlZCI7aWYoYyl7ZSs9IjogIitjO3ZhciBmPWR9ZWxzZSBhJiYoZSs9IjogIithLGY9Yik7dGhyb3cgbmV3IHFhKCIiK2UsZnx8W10pO30KdmFyIHA9ZnVuY3Rpb24oYSxiLGMpe2F8fHJhKCIiLG51bGwsYixBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMikpO3JldHVybiBhfSxzYT1mdW5jdGlvbihhLGIsYyl7bShhKSYmYS5ub2RlVHlwZT09MXx8cmEoIkV4cGVjdGVkIEVsZW1lbnQgYnV0IGdvdCAlczogJXMuIixbamEoYSksYV0sYixBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMikpfSx1YT1mdW5jdGlvbihhLGIsYyxkKXthIGluc3RhbmNlb2YgYnx8cmEoIkV4cGVjdGVkIGluc3RhbmNlb2YgJXMgYnV0IGdvdCAlcy4iLFt0YShiKSx0YShhKV0sYyxBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMykpfTsKZnVuY3Rpb24gdGEoYSl7cmV0dXJuIGEgaW5zdGFuY2VvZiBGdW5jdGlvbj9hLmRpc3BsYXlOYW1lfHxhLm5hbWV8fCJ1bmtub3duIHR5cGUgbmFtZSI6YSBpbnN0YW5jZW9mIE9iamVjdD9hLmNvbnN0cnVjdG9yLmRpc3BsYXlOYW1lfHxhLmNvbnN0cnVjdG9yLm5hbWV8fE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhKTphPT09bnVsbD8ibnVsbCI6dHlwZW9mIGF9O3ZhciB2YT1BcnJheS5wcm90b3R5cGUuaW5kZXhPZj9mdW5jdGlvbihhLGIpe3AoYS5sZW5ndGghPW51bGwpO3JldHVybiBBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKGEsYix2b2lkIDApfTpmdW5jdGlvbihhLGIpe2lmKHR5cGVvZiBhPT09InN0cmluZyIpcmV0dXJuIHR5cGVvZiBiIT09InN0cmluZyJ8fGIubGVuZ3RoIT0xPy0xOmEuaW5kZXhPZihiLDApO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWlmKGMgaW4gYSYmYVtjXT09PWIpcmV0dXJuIGM7cmV0dXJuLTF9LHdhPUFycmF5LnByb3RvdHlwZS5mb3JFYWNoP2Z1bmN0aW9uKGEsYil7cChhLmxlbmd0aCE9bnVsbCk7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChhLGIsdm9pZCAwKX06ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9YS5sZW5ndGgsZD10eXBlb2YgYT09PSJzdHJpbmciP2Euc3BsaXQoIiIpOmEsZT0wO2U8YztlKyspZSBpbiBkJiZiLmNhbGwodm9pZCAwLGRbZV0sZSxhKX07CmZ1bmN0aW9uIHhhKGEsYil7Yj12YShhLGIpO3ZhciBjO2lmKGM9Yj49MClwKGEubGVuZ3RoIT1udWxsKSxBcnJheS5wcm90b3R5cGUuc3BsaWNlLmNhbGwoYSxiLDEpO3JldHVybiBjfWZ1bmN0aW9uIHlhKGEpe3ZhciBiPWEubGVuZ3RoO2lmKGI+MCl7Zm9yKHZhciBjPUFycmF5KGIpLGQ9MDtkPGI7ZCsrKWNbZF09YVtkXTtyZXR1cm4gY31yZXR1cm5bXX1mdW5jdGlvbiB6YShhLGIsYyxkKXtwKGEubGVuZ3RoIT1udWxsKTtBcnJheS5wcm90b3R5cGUuc3BsaWNlLmFwcGx5KGEsQWEoYXJndW1lbnRzLDEpKX1mdW5jdGlvbiBBYShhLGIsYyl7cChhLmxlbmd0aCE9bnVsbCk7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg8PTI/QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYSxiKTpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhLGIsYyl9O2Z1bmN0aW9uIEJhKGEsYixjKXtmb3IodmFyIGQgaW4gYSliLmNhbGwoYyxhW2RdLGQsYSl9ZnVuY3Rpb24gQ2EoYSxiKXtmb3IodmFyIGMgaW4gYSlpZihhW2NdPT1iKXJldHVybiEwO3JldHVybiExfWZ1bmN0aW9uIERhKGEsYixjKXtpZihhIT09bnVsbCYmYiBpbiBhKXRocm93IEVycm9yKCdUaGUgb2JqZWN0IGFscmVhZHkgY29udGFpbnMgdGhlIGtleSAiJytiKyciJyk7YVtiXT1jfWZ1bmN0aW9uIEVhKGEpe3ZhciBiPXt9LGM7Zm9yKGMgaW4gYSliW2FbY11dPWM7cmV0dXJuIGJ9dmFyIEZhPSJjb25zdHJ1Y3RvciBoYXNPd25Qcm9wZXJ0eSBpc1Byb3RvdHlwZU9mIHByb3BlcnR5SXNFbnVtZXJhYmxlIHRvTG9jYWxlU3RyaW5nIHRvU3RyaW5nIHZhbHVlT2YiLnNwbGl0KCIgIik7CmZ1bmN0aW9uIEdhKGEsYil7Zm9yKHZhciBjLGQsZT0xO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspe2Q9YXJndW1lbnRzW2VdO2ZvcihjIGluIGQpYVtjXT1kW2NdO2Zvcih2YXIgZj0wO2Y8RmEubGVuZ3RoO2YrKyljPUZhW2ZdLE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChkLGMpJiYoYVtjXT1kW2NdKX19O3ZhciBIYT1TdHJpbmcucHJvdG90eXBlLnRyaW0/ZnVuY3Rpb24oYSl7cmV0dXJuIGEudHJpbSgpfTpmdW5jdGlvbihhKXtyZXR1cm4vXltcc1x4YTBdKihbXHNcU10qPylbXHNceGEwXSokLy5leGVjKGEpWzFdfTsvKgoKIENvcHlyaWdodCBHb29nbGUgTExDCiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMAoqLwp2YXIgSWE9e307dmFyIEphPWZ1bmN0aW9uKGEpe2lmKElhIT09SWEpdGhyb3cgRXJyb3IoIkJhZCBzZWNyZXQiKTt0aGlzLmc9YX07SmEucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ307bmV3IEphKCJhYm91dDpibGFuayIpO25ldyBKYSgiYWJvdXQ6aW52YWxpZCN6Q2xvc3VyZXoiKTt2YXIgS2E9W10sTGE9ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJBIFVSTCB3aXRoIGNvbnRlbnQgJyIrYSsiJyB3YXMgc2FuaXRpemVkIGF3YXkuIil9O0thLmluZGV4T2YoTGEpPT09LTEmJkthLnB1c2goTGEpO3ZhciBNYSxOYTthOntmb3IodmFyIE9hPVsiQ0xPU1VSRV9GTEFHUyJdLFBhPWwsUWE9MDtRYTxPYS5sZW5ndGg7UWErKylpZihQYT1QYVtPYVtRYV1dLFBhPT1udWxsKXtOYT1udWxsO2JyZWFrIGF9TmE9UGF9dmFyIFJhPU5hJiZOYVs2MTA0MDEzMDFdO01hPVJhIT1udWxsP1JhOiExO2Z1bmN0aW9uIFNhKCl7dmFyIGE9bC5uYXZpZ2F0b3I7cmV0dXJuIGEmJihhPWEudXNlckFnZW50KT9hOiIifXZhciBUYSxVYT1sLm5hdmlnYXRvcjtUYT1VYT9VYS51c2VyQWdlbnREYXRhfHxudWxsOm51bGw7ZnVuY3Rpb24gcihhKXtyZXR1cm4gU2EoKS5pbmRleE9mKGEpIT0tMX07dmFyIFZhPXIoIkVkZ2UiKSx0PXIoIkdlY2tvIikmJiEoU2EoKS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoIndlYmtpdCIpIT0tMSYmIXIoIkVkZ2UiKSkmJiEocigiVHJpZGVudCIpfHxyKCJNU0lFIikpJiYhcigiRWRnZSIpLHU9U2EoKS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoIndlYmtpdCIpIT0tMSYmIXIoIkVkZ2UiKSx2PU1hJiZUYSYmVGEucGxhdGZvcm0/VGEucGxhdGZvcm09PT0ibWFjT1MiOnIoIk1hY2ludG9zaCIpO3ZhciBYYT1mdW5jdGlvbihhLGIpe0JhKGIsZnVuY3Rpb24oYyxkKXtkPT0ic3R5bGUiP2Euc3R5bGUuY3NzVGV4dD1jOmQ9PSJjbGFzcyI/YS5jbGFzc05hbWU9YzpkPT0iZm9yIj9hLmh0bWxGb3I9YzpXYS5oYXNPd25Qcm9wZXJ0eShkKT9hLnNldEF0dHJpYnV0ZShXYVtkXSxjKTpkLmxhc3RJbmRleE9mKCJhcmlhLSIsMCk9PTB8fGQubGFzdEluZGV4T2YoImRhdGEtIiwwKT09MD9hLnNldEF0dHJpYnV0ZShkLGMpOmFbZF09Y30pfSxXYT17Y2VsbHBhZGRpbmc6ImNlbGxQYWRkaW5nIixjZWxsc3BhY2luZzoiY2VsbFNwYWNpbmciLGNvbHNwYW46ImNvbFNwYW4iLGZyYW1lYm9yZGVyOiJmcmFtZUJvcmRlciIsaGVpZ2h0OiJoZWlnaHQiLG1heGxlbmd0aDoibWF4TGVuZ3RoIixub25jZToibm9uY2UiLHJvbGU6InJvbGUiLHJvd3NwYW46InJvd1NwYW4iLHR5cGU6InR5cGUiLHVzZW1hcDoidXNlTWFwIix2YWxpZ246InZBbGlnbiIsd2lkdGg6IndpZHRoIn0sWWE9ZnVuY3Rpb24oYSwKYixjKXtmdW5jdGlvbiBkKGspe2smJmIuYXBwZW5kQ2hpbGQodHlwZW9mIGs9PT0ic3RyaW5nIj9hLmNyZWF0ZVRleHROb2RlKGspOmspfWZvcih2YXIgZT0yO2U8Yy5sZW5ndGg7ZSsrKXt2YXIgZj1jW2VdO2lmKCFrYShmKXx8bShmKSYmZi5ub2RlVHlwZT4wKWQoZik7ZWxzZXthOntpZihmJiZ0eXBlb2YgZi5sZW5ndGg9PSJudW1iZXIiKXtpZihtKGYpKXt2YXIgaD10eXBlb2YgZi5pdGVtPT0iZnVuY3Rpb24ifHx0eXBlb2YgZi5pdGVtPT0ic3RyaW5nIjticmVhayBhfWlmKHR5cGVvZiBmPT09ImZ1bmN0aW9uIil7aD10eXBlb2YgZi5pdGVtPT0iZnVuY3Rpb24iO2JyZWFrIGF9fWg9ITF9d2EoaD95YShmKTpmLGQpfX19LFphPWZ1bmN0aW9uKGEsYil7Yj1TdHJpbmcoYik7YS5jb250ZW50VHlwZT09PSJhcHBsaWNhdGlvbi94aHRtbCt4bWwiJiYoYj1iLnRvTG93ZXJDYXNlKCkpO3JldHVybiBhLmNyZWF0ZUVsZW1lbnQoYil9LCRhPWZ1bmN0aW9uKGEpe2EmJmEucGFyZW50Tm9kZSYmCmEucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhKX0sYWI9ZnVuY3Rpb24oYSxiKXtpZighYXx8IWIpcmV0dXJuITE7aWYoYS5jb250YWlucyYmYi5ub2RlVHlwZT09MSlyZXR1cm4gYT09Ynx8YS5jb250YWlucyhiKTtpZih0eXBlb2YgYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiE9InVuZGVmaW5lZCIpcmV0dXJuIGE9PWJ8fCEhKGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24oYikmMTYpO2Zvcig7YiYmYSE9YjspYj1iLnBhcmVudE5vZGU7cmV0dXJuIGI9PWF9LGJiPWZ1bmN0aW9uKGEpe3AoYSwiTm9kZSBjYW5ub3QgYmUgbnVsbCBvciB1bmRlZmluZWQuIik7cmV0dXJuIGEubm9kZVR5cGU9PTk/YTphLm93bmVyRG9jdW1lbnR8fGEuZG9jdW1lbnR9LGNiPWZ1bmN0aW9uKGEsYil7Yj9hLnRhYkluZGV4PTA6KGEudGFiSW5kZXg9LTEsYS5yZW1vdmVBdHRyaWJ1dGUoInRhYkluZGV4IikpfSxkYj1mdW5jdGlvbihhKXtyZXR1cm4gYS5oYXNBdHRyaWJ1dGUoInRhYmluZGV4Iil9LGViPQpmdW5jdGlvbihhKXthPWEudGFiSW5kZXg7cmV0dXJuIHR5cGVvZiBhPT09Im51bWJlciImJmE+PTAmJmE8MzI3Njh9LGZiPWZ1bmN0aW9uKGEpe3RoaXMuZz1hfHxsLmRvY3VtZW50fHxkb2N1bWVudH07ZmIucHJvdG90eXBlLmk9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nO3JldHVybiB0eXBlb2YgYT09PSJzdHJpbmciP2IuZ2V0RWxlbWVudEJ5SWQoYSk6YX07ZmIucHJvdG90eXBlLmg9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXMuZyxlPWFyZ3VtZW50cyxmPWVbMV0saD1aYShkLFN0cmluZyhlWzBdKSk7ZiYmKHR5cGVvZiBmPT09InN0cmluZyI/aC5jbGFzc05hbWU9ZjpBcnJheS5pc0FycmF5KGYpP2guY2xhc3NOYW1lPWYuam9pbigiICIpOlhhKGgsZikpO2UubGVuZ3RoPjImJllhKGQsaCxlKTtyZXR1cm4gaH07dmFyIHc9ZnVuY3Rpb24oKXt0aGlzLmJhPXRoaXMuYmE7dGhpcy5rYT10aGlzLmthfTt3LnByb3RvdHlwZS5iYT0hMTt3LnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7dGhpcy5iYXx8KHRoaXMuYmE9ITAsdGhpcy5DKCkpfTt3LnByb3RvdHlwZVtTeW1ib2wuZGlzcG9zZV09ZnVuY3Rpb24oKXt0aGlzLmRpc3Bvc2UoKX07dy5wcm90b3R5cGUuQz1mdW5jdGlvbigpe2lmKHRoaXMua2EpZm9yKDt0aGlzLmthLmxlbmd0aDspdGhpcy5rYS5zaGlmdCgpKCl9O3ZhciB5PWZ1bmN0aW9uKGEsYil7dGhpcy50eXBlPWE7dGhpcy51PXRoaXMudGFyZ2V0PWI7dGhpcy5kZWZhdWx0UHJldmVudGVkPXRoaXMuQT0hMX07eS5wcm90b3R5cGUudj1mdW5jdGlvbigpe3RoaXMuQT0hMH07eS5wcm90b3R5cGUuaj1mdW5jdGlvbigpe3RoaXMuZGVmYXVsdFByZXZlbnRlZD0hMH07dmFyIGdiPWZ1bmN0aW9uKCl7aWYoIWwuYWRkRXZlbnRMaXN0ZW5lcnx8IU9iamVjdC5kZWZpbmVQcm9wZXJ0eSlyZXR1cm4hMTt2YXIgYT0hMSxiPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwicGFzc2l2ZSIse2dldDpmdW5jdGlvbigpe2E9ITB9fSk7dHJ5e3ZhciBjPWZ1bmN0aW9uKCl7fTtsLmFkZEV2ZW50TGlzdGVuZXIoInRlc3QiLGMsYik7bC5yZW1vdmVFdmVudExpc3RlbmVyKCJ0ZXN0IixjLGIpfWNhdGNoKGQpe31yZXR1cm4gYX0oKTt2YXIgej1mdW5jdGlvbihhLGIpe3kuY2FsbCh0aGlzLGE/YS50eXBlOiIiKTt0aGlzLnJlbGF0ZWRUYXJnZXQ9dGhpcy51PXRoaXMudGFyZ2V0PW51bGw7dGhpcy5idXR0b249dGhpcy5zY3JlZW5ZPXRoaXMuc2NyZWVuWD10aGlzLmNsaWVudFk9dGhpcy5jbGllbnRYPTA7dGhpcy5rZXk9IiI7dGhpcy5nPTA7dGhpcy5tZXRhS2V5PXRoaXMuc2hpZnRLZXk9dGhpcy5hbHRLZXk9dGhpcy5jdHJsS2V5PSExO3RoaXMuc3RhdGU9bnVsbDt0aGlzLkc9ITE7dGhpcy5wb2ludGVySWQ9MDt0aGlzLnBvaW50ZXJUeXBlPSIiO3RoaXMudGltZVN0YW1wPTA7dGhpcy5oPW51bGw7aWYoYSl7dmFyIGM9dGhpcy50eXBlPWEudHlwZSxkPWEuY2hhbmdlZFRvdWNoZXMmJmEuY2hhbmdlZFRvdWNoZXMubGVuZ3RoP2EuY2hhbmdlZFRvdWNoZXNbMF06bnVsbDt0aGlzLnRhcmdldD1hLnRhcmdldHx8YS5zcmNFbGVtZW50O3RoaXMudT1iO2I9YS5yZWxhdGVkVGFyZ2V0O2J8fChjPT0ibW91c2VvdmVyIj8KYj1hLmZyb21FbGVtZW50OmM9PSJtb3VzZW91dCImJihiPWEudG9FbGVtZW50KSk7dGhpcy5yZWxhdGVkVGFyZ2V0PWI7ZD8odGhpcy5jbGllbnRYPWQuY2xpZW50WCE9PXZvaWQgMD9kLmNsaWVudFg6ZC5wYWdlWCx0aGlzLmNsaWVudFk9ZC5jbGllbnRZIT09dm9pZCAwP2QuY2xpZW50WTpkLnBhZ2VZLHRoaXMuc2NyZWVuWD1kLnNjcmVlblh8fDAsdGhpcy5zY3JlZW5ZPWQuc2NyZWVuWXx8MCk6KHRoaXMuY2xpZW50WD1hLmNsaWVudFghPT12b2lkIDA/YS5jbGllbnRYOmEucGFnZVgsdGhpcy5jbGllbnRZPWEuY2xpZW50WSE9PXZvaWQgMD9hLmNsaWVudFk6YS5wYWdlWSx0aGlzLnNjcmVlblg9YS5zY3JlZW5YfHwwLHRoaXMuc2NyZWVuWT1hLnNjcmVlbll8fDApO3RoaXMuYnV0dG9uPWEuYnV0dG9uO3RoaXMuZz1hLmtleUNvZGV8fDA7dGhpcy5rZXk9YS5rZXl8fCIiO3RoaXMuY3RybEtleT1hLmN0cmxLZXk7dGhpcy5hbHRLZXk9YS5hbHRLZXk7dGhpcy5zaGlmdEtleT1hLnNoaWZ0S2V5Owp0aGlzLm1ldGFLZXk9YS5tZXRhS2V5O3RoaXMuRz12P2EubWV0YUtleTphLmN0cmxLZXk7dGhpcy5wb2ludGVySWQ9YS5wb2ludGVySWR8fDA7dGhpcy5wb2ludGVyVHlwZT1hLnBvaW50ZXJUeXBlO3RoaXMuc3RhdGU9YS5zdGF0ZTt0aGlzLnRpbWVTdGFtcD1hLnRpbWVTdGFtcDt0aGlzLmg9YTthLmRlZmF1bHRQcmV2ZW50ZWQmJnoubC5qLmNhbGwodGhpcyl9fTtuKHoseSk7ei5wcm90b3R5cGUudj1mdW5jdGlvbigpe3oubC52LmNhbGwodGhpcyk7dGhpcy5oLnN0b3BQcm9wYWdhdGlvbj90aGlzLmguc3RvcFByb3BhZ2F0aW9uKCk6dGhpcy5oLmNhbmNlbEJ1YmJsZT0hMH07ei5wcm90b3R5cGUuaj1mdW5jdGlvbigpe3oubC5qLmNhbGwodGhpcyk7dmFyIGE9dGhpcy5oO2EucHJldmVudERlZmF1bHQ/YS5wcmV2ZW50RGVmYXVsdCgpOmEucmV0dXJuVmFsdWU9ITF9O3ZhciBoYj0iY2xvc3VyZV9saXN0ZW5hYmxlXyIrKE1hdGgucmFuZG9tKCkqMUU2fDApLGliPWZ1bmN0aW9uKGEpe3JldHVybiEoIWF8fCFhW2hiXSl9O3ZhciBqYj0wO3ZhciBrYj1mdW5jdGlvbihhLGIsYyxkLGUpe3RoaXMubGlzdGVuZXI9YTt0aGlzLnByb3h5PW51bGw7dGhpcy5zcmM9Yjt0aGlzLnR5cGU9Yzt0aGlzLmNhcHR1cmU9ISFkO3RoaXMucGE9ZTt0aGlzLmtleT0rK2piO3RoaXMuamE9dGhpcy5vYT0hMX0sbGI9ZnVuY3Rpb24oYSl7YS5qYT0hMDthLmxpc3RlbmVyPW51bGw7YS5wcm94eT1udWxsO2Euc3JjPW51bGw7YS5wYT1udWxsfTt2YXIgbWI9ZnVuY3Rpb24oYSl7dGhpcy5zcmM9YTt0aGlzLmc9e307dGhpcy5oPTB9O21iLnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZj1hLnRvU3RyaW5nKCk7YT10aGlzLmdbZl07YXx8KGE9dGhpcy5nW2ZdPVtdLHRoaXMuaCsrKTt2YXIgaD1uYihhLGIsZCxlKTtoPi0xPyhiPWFbaF0sY3x8KGIub2E9ITEpKTooYj1uZXcga2IoYix0aGlzLnNyYyxmLCEhZCxlKSxiLm9hPWMsYS5wdXNoKGIpKTtyZXR1cm4gYn07CnZhciBvYj1mdW5jdGlvbihhLGIpe3ZhciBjPWIudHlwZTtjIGluIGEuZyYmeGEoYS5nW2NdLGIpJiYobGIoYiksYS5nW2NdLmxlbmd0aD09MCYmKGRlbGV0ZSBhLmdbY10sYS5oLS0pKX0scGI9ZnVuY3Rpb24oYSxiLGMsZCxlKXthPWEuZ1tiLnRvU3RyaW5nKCldO2I9LTE7YSYmKGI9bmIoYSxjLGQsZSkpO3JldHVybiBiPi0xP2FbYl06bnVsbH0sbmI9ZnVuY3Rpb24oYSxiLGMsZCl7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDsrK2Upe3ZhciBmPWFbZV07aWYoIWYuamEmJmYubGlzdGVuZXI9PWImJmYuY2FwdHVyZT09ISFjJiZmLnBhPT1kKXJldHVybiBlfXJldHVybi0xfTt2YXIgcWI9ImNsb3N1cmVfbG1fIisoTWF0aC5yYW5kb20oKSoxRTZ8MCkscmI9e30sc2I9MCx1Yj1mdW5jdGlvbihhLGIsYyxkLGUpe2lmKGQmJmQub25jZSlyZXR1cm4gdGIoYSxiLGMsZCxlKTtpZihBcnJheS5pc0FycmF5KGIpKXtmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKyl1YihhLGJbZl0sYyxkLGUpO3JldHVybiBudWxsfWM9dmIoYyk7cmV0dXJuIGliKGEpP3diKGEsYixjLG0oZCk/ISFkLmNhcHR1cmU6ISFkLGUpOnhiKGEsYixjLCExLGQsZSl9LHhiPWZ1bmN0aW9uKGEsYixjLGQsZSxmKXtpZighYil0aHJvdyBFcnJvcigiSW52YWxpZCBldmVudCB0eXBlIik7dmFyIGg9bShlKT8hIWUuY2FwdHVyZTohIWUsaz15YihhKTtrfHwoYVtxYl09az1uZXcgbWIoYSkpO2M9ay5hZGQoYixjLGQsaCxmKTtpZihjLnByb3h5KXJldHVybiBjO2Q9emIoKTtjLnByb3h5PWQ7ZC5zcmM9YTtkLmxpc3RlbmVyPWM7aWYoYS5hZGRFdmVudExpc3RlbmVyKWdifHwoZT1oKSxlPT09dm9pZCAwJiYKKGU9ITEpLGEuYWRkRXZlbnRMaXN0ZW5lcihiLnRvU3RyaW5nKCksZCxlKTtlbHNlIGlmKGEuYXR0YWNoRXZlbnQpYS5hdHRhY2hFdmVudChBYihiLnRvU3RyaW5nKCkpLGQpO2Vsc2UgaWYoYS5hZGRMaXN0ZW5lciYmYS5yZW1vdmVMaXN0ZW5lcilwKGI9PT0iY2hhbmdlIiwiTWVkaWFRdWVyeUxpc3Qgb25seSBoYXMgYSBjaGFuZ2UgZXZlbnQiKSxhLmFkZExpc3RlbmVyKGQpO2Vsc2UgdGhyb3cgRXJyb3IoImFkZEV2ZW50TGlzdGVuZXIgYW5kIGF0dGFjaEV2ZW50IGFyZSB1bmF2YWlsYWJsZS4iKTtzYisrO3JldHVybiBjfSx6Yj1mdW5jdGlvbigpe3ZhciBhPUJiLGI9ZnVuY3Rpb24oYyl7cmV0dXJuIGEuY2FsbChiLnNyYyxiLmxpc3RlbmVyLGMpfTtyZXR1cm4gYn0sdGI9ZnVuY3Rpb24oYSxiLGMsZCxlKXtpZihBcnJheS5pc0FycmF5KGIpKXtmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKyl0YihhLGJbZl0sYyxkLGUpO3JldHVybiBudWxsfWM9dmIoYyk7cmV0dXJuIGliKGEpPwphLkEuYWRkKFN0cmluZyhiKSxjLCEwLG0oZCk/ISFkLmNhcHR1cmU6ISFkLGUpOnhiKGEsYixjLCEwLGQsZSl9LENiPWZ1bmN0aW9uKGEsYixjLGQsZSl7aWYoQXJyYXkuaXNBcnJheShiKSlmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKylDYihhLGJbZl0sYyxkLGUpO2Vsc2UgZD1tKGQpPyEhZC5jYXB0dXJlOiEhZCxjPXZiKGMpLGliKGEpPyhhPWEuQSxiPVN0cmluZyhiKS50b1N0cmluZygpLGIgaW4gYS5nJiYoZj1hLmdbYl0sYz1uYihmLGMsZCxlKSxjPi0xJiYobGIoZltjXSkscChmLmxlbmd0aCE9bnVsbCksQXJyYXkucHJvdG90eXBlLnNwbGljZS5jYWxsKGYsYywxKSxmLmxlbmd0aD09MCYmKGRlbGV0ZSBhLmdbYl0sYS5oLS0pKSkpOmEmJihhPXliKGEpKSYmKGM9cGIoYSxiLGMsZCxlKSkmJkEoYyl9LEE9ZnVuY3Rpb24oYSl7aWYodHlwZW9mIGEhPT0ibnVtYmVyIiYmYSYmIWEuamEpe3ZhciBiPWEuc3JjO2lmKGliKGIpKW9iKGIuQSxhKTtlbHNle3ZhciBjPWEudHlwZSwKZD1hLnByb3h5O2IucmVtb3ZlRXZlbnRMaXN0ZW5lcj9iLnJlbW92ZUV2ZW50TGlzdGVuZXIoYyxkLGEuY2FwdHVyZSk6Yi5kZXRhY2hFdmVudD9iLmRldGFjaEV2ZW50KEFiKGMpLGQpOmIuYWRkTGlzdGVuZXImJmIucmVtb3ZlTGlzdGVuZXImJmIucmVtb3ZlTGlzdGVuZXIoZCk7c2ItLTsoYz15YihiKSk/KG9iKGMsYSksYy5oPT0wJiYoYy5zcmM9bnVsbCxiW3FiXT1udWxsKSk6bGIoYSl9fX0sQWI9ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW4gcmI/cmJbYV06cmJbYV09Im9uIithfSxCYj1mdW5jdGlvbihhLGIpe2lmKGEuamEpYT0hMDtlbHNle2I9bmV3IHooYix0aGlzKTt2YXIgYz1hLmxpc3RlbmVyLGQ9YS5wYXx8YS5zcmM7YS5vYSYmQShhKTthPWMuY2FsbChkLGIpfXJldHVybiBhfSx5Yj1mdW5jdGlvbihhKXthPWFbcWJdO3JldHVybiBhIGluc3RhbmNlb2YgbWI/YTpudWxsfSxEYj0iX19jbG9zdXJlX2V2ZW50c19mbl8iKyhNYXRoLnJhbmRvbSgpKjFFOT4+PjApLHZiPWZ1bmN0aW9uKGEpe3AoYSwKIkxpc3RlbmVyIGNhbiBub3QgYmUgbnVsbC4iKTtpZih0eXBlb2YgYT09PSJmdW5jdGlvbiIpcmV0dXJuIGE7cChhLmhhbmRsZUV2ZW50LCJBbiBvYmplY3QgbGlzdGVuZXIgbXVzdCBoYXZlIGhhbmRsZUV2ZW50IG1ldGhvZC4iKTthW0RiXXx8KGFbRGJdPWZ1bmN0aW9uKGIpe3JldHVybiBhLmhhbmRsZUV2ZW50KGIpfSk7cmV0dXJuIGFbRGJdfTt2YXIgRWI9ZnVuY3Rpb24oYSl7dy5jYWxsKHRoaXMpO3RoaXMuaD1hO3RoaXMuZz17fX07bihFYix3KTsKdmFyIEZiPVtdLEI9ZnVuY3Rpb24oYSxiLGMsZCl7QXJyYXkuaXNBcnJheShjKXx8KGMmJihGYlswXT1jLnRvU3RyaW5nKCkpLGM9RmIpO2Zvcih2YXIgZT0wO2U8Yy5sZW5ndGg7ZSsrKXt2YXIgZj11YihiLGNbZV0sZHx8YS5oYW5kbGVFdmVudCwhMSxhLmh8fGEpO2lmKCFmKWJyZWFrO2EuZ1tmLmtleV09Zn1yZXR1cm4gYX0sQz1mdW5jdGlvbihhLGIsYyxkLGUsZil7aWYoQXJyYXkuaXNBcnJheShjKSlmb3IodmFyIGg9MDtoPGMubGVuZ3RoO2grKylDKGEsYixjW2hdLGQsZSxmKTtlbHNlIGQ9ZHx8YS5oYW5kbGVFdmVudCxlPW0oZSk/ISFlLmNhcHR1cmU6ISFlLGY9Znx8YS5ofHxhLGQ9dmIoZCksZT0hIWUsYz1pYihiKT9wYihiLkEsU3RyaW5nKGMpLGQsZSxmKTpiPyhiPXliKGIpKT9wYihiLGMsZCxlLGYpOm51bGw6bnVsbCxjJiYoQShjKSxkZWxldGUgYS5nW2Mua2V5XSk7cmV0dXJuIGF9LEdiPWZ1bmN0aW9uKGEpe0JhKGEuZyxmdW5jdGlvbihiLGMpe3RoaXMuZy5oYXNPd25Qcm9wZXJ0eShjKSYmCkEoYil9LGEpO2EuZz17fX07RWIucHJvdG90eXBlLkM9ZnVuY3Rpb24oKXtFYi5sLkMuY2FsbCh0aGlzKTtHYih0aGlzKX07RWIucHJvdG90eXBlLmhhbmRsZUV2ZW50PWZ1bmN0aW9uKCl7dGhyb3cgRXJyb3IoIkV2ZW50SGFuZGxlci5oYW5kbGVFdmVudCBub3QgaW1wbGVtZW50ZWQiKTt9O3ZhciBEPWZ1bmN0aW9uKCl7dy5jYWxsKHRoaXMpO3RoaXMuQT1uZXcgbWIodGhpcyk7dGhpcy5ZYT10aGlzO3RoaXMubGE9bnVsbH07bihELHcpO0QucHJvdG90eXBlW2hiXT0hMDtELnByb3RvdHlwZS5BYT1mdW5jdGlvbihhKXt0aGlzLmxhPWF9O0QucHJvdG90eXBlLnJlbW92ZUV2ZW50TGlzdGVuZXI9ZnVuY3Rpb24oYSxiLGMsZCl7Q2IodGhpcyxhLGIsYyxkKX07CnZhciBFPWZ1bmN0aW9uKGEsYil7SGIoYSk7dmFyIGM9YS5sYTtpZihjKXt2YXIgZD1bXTtmb3IodmFyIGU9MTtjO2M9Yy5sYSlkLnB1c2goYykscCgrK2U8MUUzLCJpbmZpbml0ZSBsb29wIil9YT1hLllhO2M9Yi50eXBlfHxiO3R5cGVvZiBiPT09InN0cmluZyI/Yj1uZXcgeShiLGEpOmIgaW5zdGFuY2VvZiB5P2IudGFyZ2V0PWIudGFyZ2V0fHxhOihlPWIsYj1uZXcgeShjLGEpLEdhKGIsZSkpO2U9ITA7dmFyIGY7aWYoZClmb3IoZj1kLmxlbmd0aC0xOyFiLkEmJmY+PTA7Zi0tKXt2YXIgaD1iLnU9ZFtmXTtlPUliKGgsYywhMCxiKSYmZX1iLkF8fChoPWIudT1hLGU9SWIoaCxjLCEwLGIpJiZlLGIuQXx8KGU9SWIoaCxjLCExLGIpJiZlKSk7aWYoZClmb3IoZj0wOyFiLkEmJmY8ZC5sZW5ndGg7ZisrKWg9Yi51PWRbZl0sZT1JYihoLGMsITEsYikmJmU7cmV0dXJuIGV9OwpELnByb3RvdHlwZS5DPWZ1bmN0aW9uKCl7RC5sLkMuY2FsbCh0aGlzKTtpZih0aGlzLkEpe3ZhciBhPXRoaXMuQSxiPTAsYztmb3IoYyBpbiBhLmcpe2Zvcih2YXIgZD1hLmdbY10sZT0wO2U8ZC5sZW5ndGg7ZSsrKSsrYixsYihkW2VdKTtkZWxldGUgYS5nW2NdO2EuaC0tfX10aGlzLmxhPW51bGx9O3ZhciB3Yj1mdW5jdGlvbihhLGIsYyxkLGUpe0hiKGEpO3JldHVybiBhLkEuYWRkKFN0cmluZyhiKSxjLCExLGQsZSl9LEliPWZ1bmN0aW9uKGEsYixjLGQpe2I9YS5BLmdbU3RyaW5nKGIpXTtpZighYilyZXR1cm4hMDtiPWIuY29uY2F0KCk7Zm9yKHZhciBlPSEwLGY9MDtmPGIubGVuZ3RoOysrZil7dmFyIGg9YltmXTtpZihoJiYhaC5qYSYmaC5jYXB0dXJlPT1jKXt2YXIgaz1oLmxpc3RlbmVyLHE9aC5wYXx8aC5zcmM7aC5vYSYmb2IoYS5BLGgpO2U9ay5jYWxsKHEsZCkhPT0hMSYmZX19cmV0dXJuIGUmJiFkLmRlZmF1bHRQcmV2ZW50ZWR9LEhiPWZ1bmN0aW9uKGEpe3AoYS5BLCJFdmVudCB0YXJnZXQgaXMgbm90IGluaXRpYWxpemVkLiBEaWQgeW91IGNhbGwgdGhlIHN1cGVyY2xhc3MgKGdvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0KSBjb25zdHJ1Y3Rvcj8iKX07dmFyIEpiPXQ/Ik1velVzZXJTZWxlY3QiOnV8fFZhPyJXZWJraXRVc2VyU2VsZWN0IjpudWxsLEtiPWZ1bmN0aW9uKGEsYil7Yj1iP251bGw6YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpO2lmKEpiJiYoYS5zdHlsZSYmKGEuc3R5bGVbSmJdPSJub25lIiksYikpZm9yKHZhciBjPTA7YT1iW2NdO2MrKylhLnN0eWxlJiYoYS5zdHlsZVtKYl09Im5vbmUiKX07dmFyIExiPWZ1bmN0aW9uKCl7fTtpYShMYik7TGIucHJvdG90eXBlLmc9MDt2YXIgRj1mdW5jdGlvbihhKXtELmNhbGwodGhpcyk7dGhpcy5HPWF8fHBhfHwocGE9bmV3IGZiKTt0aGlzLnphPU1iO3RoaXMuWT1udWxsO3RoaXMucz0hMTt0aGlzLmc9bnVsbDt0aGlzLk09dm9pZCAwO3RoaXMudT10aGlzLmo9dGhpcy5oPW51bGw7dGhpcy5TYT0hMX07bihGLEQpO0YucHJvdG90eXBlLlphPUxiLlYoKTsKdmFyIE1iPW51bGwsTmI9ZnVuY3Rpb24oYSxiKXtzd2l0Y2goYSl7Y2FzZSAxOnJldHVybiBiPyJkaXNhYmxlIjoiZW5hYmxlIjtjYXNlIDI6cmV0dXJuIGI/ImhpZ2hsaWdodCI6InVuaGlnaGxpZ2h0IjtjYXNlIDQ6cmV0dXJuIGI/ImFjdGl2YXRlIjoiZGVhY3RpdmF0ZSI7Y2FzZSA4OnJldHVybiBiPyJzZWxlY3QiOiJ1bnNlbGVjdCI7Y2FzZSAxNjpyZXR1cm4gYj8iY2hlY2siOiJ1bmNoZWNrIjtjYXNlIDMyOnJldHVybiBiPyJmb2N1cyI6ImJsdXIiO2Nhc2UgNjQ6cmV0dXJuIGI/Im9wZW4iOiJjbG9zZSJ9dGhyb3cgRXJyb3IoIkludmFsaWQgY29tcG9uZW50IHN0YXRlIik7fSxPYj1mdW5jdGlvbihhKXtyZXR1cm4gYS5ZfHwoYS5ZPSI6IisoYS5aYS5nKyspLnRvU3RyaW5nKDM2KSl9LFBiPWZ1bmN0aW9uKGEsYil7aWYoYS5oJiZhLmgudSl7dmFyIGM9YS5oLnUsZD1hLlk7ZCBpbiBjJiZkZWxldGUgY1tkXTtEYShhLmgudSxiLGEpfWEuWT1ifTtGLnByb3RvdHlwZS5pPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ307CnZhciBRYj1mdW5jdGlvbihhKXthLk18fChhLk09bmV3IEViKGEpKTtyZXR1cm4gcChhLk0pfTtGLnByb3RvdHlwZS5BYT1mdW5jdGlvbihhKXtpZih0aGlzLmgmJnRoaXMuaCE9YSl0aHJvdyBFcnJvcigiTWV0aG9kIG5vdCBzdXBwb3J0ZWQiKTtGLmwuQWEuY2FsbCh0aGlzLGEpfTtGLnByb3RvdHlwZS5tYT1mdW5jdGlvbigpe3RoaXMuZz1aYSh0aGlzLkcuZywiRElWIil9O0YucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbihhKXtSYih0aGlzLGEpfTsKdmFyIFJiPWZ1bmN0aW9uKGEsYixjKXtpZihhLnMpdGhyb3cgRXJyb3IoIkNvbXBvbmVudCBhbHJlYWR5IHJlbmRlcmVkIik7YS5nfHxhLm1hKCk7Yj9iLmluc2VydEJlZm9yZShhLmcsY3x8bnVsbCk6YS5HLmcuYm9keS5hcHBlbmRDaGlsZChhLmcpO2EuaCYmIWEuaC5zfHxhLkkoKX0sU2I9ZnVuY3Rpb24oYSxiKXtpZihhLnMpdGhyb3cgRXJyb3IoIkNvbXBvbmVudCBhbHJlYWR5IHJlbmRlcmVkIik7aWYoYiYmYS53YShiKSl7YS5TYT0hMDt2YXIgYz1iYihiKTthLkcmJmEuRy5nPT1jfHwoYS5HPWI/bmV3IGZiKGJiKGIpKTpwYXx8KHBhPW5ldyBmYikpO2EuRWEoYik7YS5JKCl9ZWxzZSB0aHJvdyBFcnJvcigiSW52YWxpZCBlbGVtZW50IHRvIGRlY29yYXRlIik7fTtnPUYucHJvdG90eXBlO2cud2E9ZnVuY3Rpb24oKXtyZXR1cm4hMH07Zy5FYT1mdW5jdGlvbihhKXt0aGlzLmc9YX07CmcuST1mdW5jdGlvbigpe3RoaXMucz0hMDtUYih0aGlzLGZ1bmN0aW9uKGEpeyFhLnMmJmEuaSgpJiZhLkkoKX0pfTtnLlU9ZnVuY3Rpb24oKXtUYih0aGlzLGZ1bmN0aW9uKGEpe2EucyYmYS5VKCl9KTt0aGlzLk0mJkdiKHRoaXMuTSk7dGhpcy5zPSExfTtnLkM9ZnVuY3Rpb24oKXt0aGlzLnMmJnRoaXMuVSgpO3RoaXMuTSYmKHRoaXMuTS5kaXNwb3NlKCksZGVsZXRlIHRoaXMuTSk7VGIodGhpcyxmdW5jdGlvbihhKXthLmRpc3Bvc2UoKX0pOyF0aGlzLlNhJiZ0aGlzLmcmJiRhKHRoaXMuZyk7dGhpcy5oPXRoaXMuZz10aGlzLnU9dGhpcy5qPW51bGw7Ri5sLkMuY2FsbCh0aGlzKX07Zy5CYT1mdW5jdGlvbihhLGIpe3RoaXMuQ2EoYSxIKHRoaXMpLGIpfTsKZy5DYT1mdW5jdGlvbihhLGIsYyl7cCghIWEsIlByb3ZpZGVkIGVsZW1lbnQgbXVzdCBub3QgYmUgbnVsbC4iKTtpZihhLnMmJihjfHwhdGhpcy5zKSl0aHJvdyBFcnJvcigiQ29tcG9uZW50IGFscmVhZHkgcmVuZGVyZWQiKTtpZihiPDB8fGI+SCh0aGlzKSl0aHJvdyBFcnJvcigiQ2hpbGQgY29tcG9uZW50IGluZGV4IG91dCBvZiBib3VuZHMiKTt0aGlzLnUmJnRoaXMuanx8KHRoaXMudT17fSx0aGlzLmo9W10pO2lmKGEuaD09dGhpcyl7dmFyIGQ9dGhpcy51LGU9T2IoYSk7ZFtlXT1hO3hhKHRoaXMuaixhKX1lbHNlIERhKHRoaXMudSxPYihhKSxhKTtpZihhPT10aGlzKXRocm93IEVycm9yKCJVbmFibGUgdG8gc2V0IHBhcmVudCBjb21wb25lbnQiKTtpZihkPXRoaXMmJmEuaCYmYS5ZKWU9YS5oLGQ9YS5ZLGUudSYmZD8oZT1lLnUsZD0oZSE9PW51bGwmJmQgaW4gZT9lW2RdOnZvaWQgMCl8fG51bGwpOmQ9bnVsbDtpZihkJiZhLmghPXRoaXMpdGhyb3cgRXJyb3IoIlVuYWJsZSB0byBzZXQgcGFyZW50IGNvbXBvbmVudCIpOwphLmg9dGhpcztGLmwuQWEuY2FsbChhLHRoaXMpO3phKHRoaXMuaixiLDAsYSk7YS5zJiZ0aGlzLnMmJmEuaD09dGhpcz8oYz10aGlzLm5hKCksKGMuY2hpbGROb2Rlc1tiXXx8bnVsbCkhPWEuaSgpJiYoYS5pKCkucGFyZW50RWxlbWVudD09YyYmYy5yZW1vdmVDaGlsZChhLmkoKSksYj1jLmNoaWxkTm9kZXNbYl18fG51bGwsYy5pbnNlcnRCZWZvcmUoYS5pKCksYikpKTpjPyh0aGlzLmd8fHRoaXMubWEoKSxiPUkodGhpcyxiKzEpLFJiKGEsdGhpcy5uYSgpLGI/Yi5nOm51bGwpKTp0aGlzLnMmJiFhLnMmJmEuZyYmYS5nLnBhcmVudE5vZGUmJmEuZy5wYXJlbnROb2RlLm5vZGVUeXBlPT0xJiZhLkkoKX07Zy5uYT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmd9Owp2YXIgVWI9ZnVuY3Rpb24oYSl7aWYoYS56YT09bnVsbCl7dmFyIGI9YS5zP2EuZzphLkcuZy5ib2R5O2E6e3ZhciBjPWJiKGIpO2lmKGMuZGVmYXVsdFZpZXcmJmMuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSYmKGM9Yy5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKGIsbnVsbCkpKXtjPWMuZGlyZWN0aW9ufHxjLmdldFByb3BlcnR5VmFsdWUoImRpcmVjdGlvbiIpfHwiIjticmVhayBhfWM9IiJ9YS56YT0icnRsIj09KGN8fChiLmN1cnJlbnRTdHlsZT9iLmN1cnJlbnRTdHlsZS5kaXJlY3Rpb246bnVsbCl8fGIuc3R5bGUmJmIuc3R5bGUuZGlyZWN0aW9uKX1yZXR1cm4gYS56YX0sSD1mdW5jdGlvbihhKXtyZXR1cm4gYS5qP2Euai5sZW5ndGg6MH0sST1mdW5jdGlvbihhLGIpe3JldHVybiBhLmo/YS5qW2JdfHxudWxsOm51bGx9LFRiPWZ1bmN0aW9uKGEsYixjKXthLmomJmEuai5mb3JFYWNoKGIsYyl9LFZiPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuaiYmYj9hLmouaW5kZXhPZihiKToKLTF9O3ZhciBXYj17bWI6ImFjdGl2ZWRlc2NlbmRhbnQiLHJiOiJhdG9taWMiLHNiOiJhdXRvY29tcGxldGUiLHViOiJidXN5Iix4YjoiY2hlY2tlZCIseWI6ImNvbGluZGV4IixEYjoiY29udHJvbHMiLEViOiJjdXJyZW50IixHYjoiZGVzY3JpYmVkYnkiLEpiOiJkaXNhYmxlZCIsTGI6ImRyb3BlZmZlY3QiLE1iOiJleHBhbmRlZCIsTmI6ImZsb3d0byIsUGI6ImdyYWJiZWQiLFRiOiJoYXNwb3B1cCIsVmI6ImhpZGRlbiIsWGI6ImludmFsaWQiLFliOiJsYWJlbCIsWmI6ImxhYmVsbGVkYnkiLGFjOiJsZXZlbCIsZmM6ImxpdmUiLHZjOiJtdWx0aWxpbmUiLHdjOiJtdWx0aXNlbGVjdGFibGUiLEFjOiJvcmllbnRhdGlvbiIsQmM6Im93bnMiLENjOiJwb3NpbnNldCIsRWM6InByZXNzZWQiLEljOiJyZWFkb25seSIsS2M6InJlbGV2YW50IixMYzoicmVxdWlyZWQiLFBjOiJyb3dpbmRleCIsU2M6InNlbGVjdGVkIixVYzoic2V0c2l6ZSIsV2M6InNvcnQiLG1kOiJ2YWx1ZW1heCIsbmQ6InZhbHVlbWluIiwKb2Q6InZhbHVlbm93IixwZDoidmFsdWV0ZXh0In07dmFyIFhiO3ZhciBZYj17bmI6ImFsZXJ0IixvYjoiYWxlcnRkaWFsb2ciLHBiOiJhcHBsaWNhdGlvbiIscWI6ImFydGljbGUiLHRiOiJiYW5uZXIiLHZiOiJidXR0b24iLHdiOiJjaGVja2JveCIsemI6ImNvbHVtbmhlYWRlciIsQWI6ImNvbWJvYm94IixCYjoiY29tcGxlbWVudGFyeSIsQ2I6ImNvbnRlbnRpbmZvIixGYjoiZGVmaW5pdGlvbiIsSGI6ImRpYWxvZyIsSWI6ImRpcmVjdG9yeSIsS2I6ImRvY3VtZW50IixPYjoiZm9ybSIsUWI6ImdyaWQiLFJiOiJncmlkY2VsbCIsU2I6Imdyb3VwIixVYjoiaGVhZGluZyIsV2I6ImltZyIsYmM6ImxpbmsiLGNjOiJsaXN0IixkYzoibGlzdGJveCIsZWM6Imxpc3RpdGVtIixoYzoibG9nIixpYzoibWFpbiIsamM6Im1hcnF1ZWUiLGtjOiJtYXRoIixsYzoibWVudSIsbWM6Im1lbnViYXIiLG5jOiJtZW51aXRlbSIsb2M6Im1lbnVpdGVtY2hlY2tib3giLHBjOiJtZW51aXRlbXJhZGlvIix4YzoibmF2aWdhdGlvbiIseWM6Im5vdGUiLHpjOiJvcHRpb24iLApEYzoicHJlc2VudGF0aW9uIixGYzoicHJvZ3Jlc3NiYXIiLEdjOiJyYWRpbyIsSGM6InJhZGlvZ3JvdXAiLEpjOiJyZWdpb24iLE1jOiJyb3ciLE5jOiJyb3dncm91cCIsT2M6InJvd2hlYWRlciIsUWM6InNjcm9sbGJhciIsUmM6InNlYXJjaCIsVGM6InNlcGFyYXRvciIsVmM6InNsaWRlciIsWGM6InNwaW5idXR0b24iLFljOiJzdGF0dXMiLFpjOiJzd2l0Y2giLGFkOiJ0YWIiLGJkOiJ0YWJsaXN0IixjZDoidGFicGFuZWwiLGRkOiJ0ZXh0Ym94IixlZDoidGV4dGluZm8iLGZkOiJ0aW1lciIsZ2Q6InRvb2xiYXIiLGhkOiJ0b29sdGlwIixqZDoidHJlZSIsa2Q6InRyZWVncmlkIixsZDoidHJlZWl0ZW0ifTt2YXIgWmI9ZnVuY3Rpb24oYSxiKXtiPyhwKENhKFliLGIpLCJObyBzdWNoIEFSSUEgcm9sZSAiK2IpLGEuc2V0QXR0cmlidXRlKCJyb2xlIixiKSk6YS5yZW1vdmVBdHRyaWJ1dGUoInJvbGUiKX0sYWM9ZnVuY3Rpb24oYSxiLGMpe0FycmF5LmlzQXJyYXkoYykmJihjPWMuam9pbigiICIpKTt2YXIgZD0kYihiKTtjPT09IiJ8fGM9PXZvaWQgMD8oWGJ8fChjPXt9LFhiPShjLmF0b21pYz0hMSxjLmF1dG9jb21wbGV0ZT0ibm9uZSIsYy5kcm9wZWZmZWN0PSJub25lIixjLmhhc3BvcHVwPSExLGMubGl2ZT0ib2ZmIixjLm11bHRpbGluZT0hMSxjLm11bHRpc2VsZWN0YWJsZT0hMSxjLm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIsYy5yZWFkb25seT0hMSxjLnJlbGV2YW50PSJhZGRpdGlvbnMgdGV4dCIsYy5yZXF1aXJlZD0hMSxjLnNvcnQ9Im5vbmUiLGMuYnVzeT0hMSxjLmRpc2FibGVkPSExLGMuaGlkZGVuPSExLGMuaW52YWxpZD0iZmFsc2UiLGMpKSxjPVhiLGIgaW4gYz9hLnNldEF0dHJpYnV0ZShkLApjW2JdKTphLnJlbW92ZUF0dHJpYnV0ZShkKSk6YS5zZXRBdHRyaWJ1dGUoZCxjKX0sJGI9ZnVuY3Rpb24oYSl7cChhLCJBUklBIGF0dHJpYnV0ZSBjYW5ub3QgYmUgZW1wdHkuIik7cChDYShXYixhKSwiTm8gc3VjaCBBUklBIGF0dHJpYnV0ZSAiK2EpO3JldHVybiJhcmlhLSIrYX07dmFyIGRjPWZ1bmN0aW9uKGEsYixjLGQsZSxmKXtpZih2JiZlKXJldHVybiBiYyhhKTtpZihlJiYhZClyZXR1cm4hMTtpZighdCl7dHlwZW9mIGI9PT0ibnVtYmVyIiYmKGI9Y2MoYikpO3ZhciBoPWI9PTE3fHxiPT0xOHx8diYmYj09OTE7aWYoKCFjfHx2KSYmaHx8diYmYj09MTYmJihkfHxmKSlyZXR1cm4hMX1pZih1JiZkJiZjKXN3aXRjaChhKXtjYXNlIDIyMDpjYXNlIDIxOTpjYXNlIDIyMTpjYXNlIDE5MjpjYXNlIDE4NjpjYXNlIDE4OTpjYXNlIDE4NzpjYXNlIDE4ODpjYXNlIDE5MDpjYXNlIDE5MTpjYXNlIDE5MjpjYXNlIDIyMjpyZXR1cm4hMX1zd2l0Y2goYSl7Y2FzZSAxMzpyZXR1cm4gdD9mfHxlPyExOiEoYyYmZCk6ITA7Y2FzZSAyNzpyZXR1cm4hdSYmIXR9cmV0dXJuIHQmJihkfHxlfHxmKT8hMTpiYyhhKX0sYmM9ZnVuY3Rpb24oYSl7aWYoYT49NDgmJmE8PTU3fHxhPj05NiYmYTw9MTA2fHxhPj02NSYmYTw9OTB8fHUmJmE9PTApcmV0dXJuITA7c3dpdGNoKGEpe2Nhc2UgMzI6Y2FzZSA0MzpjYXNlIDYzOmNhc2UgNjQ6Y2FzZSAxMDc6Y2FzZSAxMDk6Y2FzZSAxMTA6Y2FzZSAxMTE6Y2FzZSAxODY6Y2FzZSA1OTpjYXNlIDE4OTpjYXNlIDE4NzpjYXNlIDYxOmNhc2UgMTg4OmNhc2UgMTkwOmNhc2UgMTkxOmNhc2UgMTkyOmNhc2UgMjIyOmNhc2UgMjE5OmNhc2UgMjIwOmNhc2UgMjIxOmNhc2UgMTYzOmNhc2UgNTg6cmV0dXJuITA7CmNhc2UgMTczOmNhc2UgMTcxOnJldHVybiB0O2RlZmF1bHQ6cmV0dXJuITF9fSxjYz1mdW5jdGlvbihhKXtpZih0KWE9ZWMoYSk7ZWxzZSBpZih2JiZ1KXN3aXRjaChhKXtjYXNlIDkzOmE9OTF9cmV0dXJuIGF9LGVjPWZ1bmN0aW9uKGEpe3N3aXRjaChhKXtjYXNlIDYxOnJldHVybiAxODc7Y2FzZSA1OTpyZXR1cm4gMTg2O2Nhc2UgMTczOnJldHVybiAxODk7Y2FzZSAyMjQ6cmV0dXJuIDkxO2Nhc2UgMDpyZXR1cm4gMjI0O2RlZmF1bHQ6cmV0dXJuIGF9fTt2YXIgZmM9ZnVuY3Rpb24oYSxiLGMsZCl7ei5jYWxsKHRoaXMsZCk7dGhpcy50eXBlPSJrZXkiO3RoaXMuZz1hO3RoaXMucmVwZWF0PWN9O24oZmMseik7dmFyIEo9ZnVuY3Rpb24oYSxiKXtELmNhbGwodGhpcyk7YSYmZ2ModGhpcyxhLGIpfTtuKEosRCk7Zz1KLnByb3RvdHlwZTtnLlI9bnVsbDtnLnFhPW51bGw7Zy5KYT1udWxsO2cucmE9bnVsbDtnLkY9LTE7Zy5LPS0xO2cuRGE9ITE7CnZhciBoYz17MzoxMywxMjoxNDQsNjMyMzI6MzgsNjMyMzM6NDAsNjMyMzQ6MzcsNjMyMzU6MzksNjMyMzY6MTEyLDYzMjM3OjExMyw2MzIzODoxMTQsNjMyMzk6MTE1LDYzMjQwOjExNiw2MzI0MToxMTcsNjMyNDI6MTE4LDYzMjQzOjExOSw2MzI0NDoxMjAsNjMyNDU6MTIxLDYzMjQ2OjEyMiw2MzI0NzoxMjMsNjMyNDg6NDQsNjMyNzI6NDYsNjMyNzM6MzYsNjMyNzU6MzUsNjMyNzY6MzMsNjMyNzc6MzQsNjMyODk6MTQ0LDYzMzAyOjQ1fSxpYz17VXA6MzgsRG93bjo0MCxMZWZ0OjM3LFJpZ2h0OjM5LEVudGVyOjEzLEYxOjExMixGMjoxMTMsRjM6MTE0LEY0OjExNSxGNToxMTYsRjY6MTE3LEY3OjExOCxGODoxMTksRjk6MTIwLEYxMDoxMjEsRjExOjEyMixGMTI6MTIzLCJVKzAwN0YiOjQ2LEhvbWU6MzYsRW5kOjM1LFBhZ2VVcDozMyxQYWdlRG93bjozNCxJbnNlcnQ6NDV9LGpjPXYmJnQ7CkoucHJvdG90eXBlLmc9ZnVuY3Rpb24oYSl7dSYmKHRoaXMuRj09MTcmJiFhLmN0cmxLZXl8fHRoaXMuRj09MTgmJiFhLmFsdEtleXx8diYmdGhpcy5GPT05MSYmIWEubWV0YUtleSkmJih0aGlzLks9dGhpcy5GPS0xKTt0aGlzLkY9PS0xJiYoYS5jdHJsS2V5JiZhLmchPTE3P3RoaXMuRj0xNzphLmFsdEtleSYmYS5nIT0xOD90aGlzLkY9MTg6YS5tZXRhS2V5JiZhLmchPTkxJiYodGhpcy5GPTkxKSk7ZGMoYS5nLHRoaXMuRixhLnNoaWZ0S2V5LGEuY3RybEtleSxhLmFsdEtleSxhLm1ldGFLZXkpPyh0aGlzLks9Y2MoYS5nKSxqYyYmKHRoaXMuRGE9YS5hbHRLZXkpKTp0aGlzLmhhbmRsZUV2ZW50KGEpfTtKLnByb3RvdHlwZS5oPWZ1bmN0aW9uKGEpe3RoaXMuSz10aGlzLkY9LTE7dGhpcy5EYT1hLmFsdEtleX07CkoucHJvdG90eXBlLmhhbmRsZUV2ZW50PWZ1bmN0aW9uKGEpe3ZhciBiPWEuaCxjPWIuYWx0S2V5O2lmKHUmJmEudHlwZT09ImtleXByZXNzIil7dmFyIGQ9dGhpcy5LO3ZhciBlPWIuY2hhckNvZGU+PTAmJmIuY2hhckNvZGU8NjMyMzImJmJjKGQpP2IuY2hhckNvZGU6MH1lbHNlIGEudHlwZT09ImtleXByZXNzIj8oamMmJihjPXRoaXMuRGEpLGIua2V5Q29kZT09Yi5jaGFyQ29kZT9iLmtleUNvZGU8MzI/KGQ9Yi5rZXlDb2RlLGU9MCk6KGQ9dGhpcy5LLGU9Yi5jaGFyQ29kZSk6KGQ9Yi5rZXlDb2RlfHx0aGlzLkssZT1iLmNoYXJDb2RlfHwwKSk6KGQ9Yi5rZXlDb2RlfHx0aGlzLkssZT1iLmNoYXJDb2RlfHwwKSx2JiZlPT02MyYmZD09MjI0JiYoZD0xOTEpO3ZhciBmPWQ9Y2MoZCk7ZD9kPj02MzIzMiYmZCBpbiBoYz9mPWhjW2RdOmQ9PTI1JiZhLnNoaWZ0S2V5JiYoZj05KTpiLmtleUlkZW50aWZpZXImJmIua2V5SWRlbnRpZmllciBpbiBpYyYmKGY9aWNbYi5rZXlJZGVudGlmaWVyXSk7CmlmKCF0fHxhLnR5cGUhPSJrZXlwcmVzcyJ8fGRjKGYsdGhpcy5GLGEuc2hpZnRLZXksYS5jdHJsS2V5LGMsYS5tZXRhS2V5KSlhPWY9PXRoaXMuRix0aGlzLkY9ZixiPW5ldyBmYyhmLGUsYSxiKSxiLmFsdEtleT1jLEUodGhpcyxiKX07Si5wcm90b3R5cGUuaT1mdW5jdGlvbigpe3JldHVybiB0aGlzLlJ9O3ZhciBnYz1mdW5jdGlvbihhLGIsYyl7YS5yYSYma2MoYSk7YS5SPWI7YS5xYT11YihhLlIsImtleXByZXNzIixhLGMpO2EuSmE9dWIoYS5SLCJrZXlkb3duIixhLmcsYyxhKTthLnJhPXViKGEuUiwia2V5dXAiLGEuaCxjLGEpfSxrYz1mdW5jdGlvbihhKXthLnFhJiYoQShhLnFhKSxBKGEuSmEpLEEoYS5yYSksYS5xYT1udWxsLGEuSmE9bnVsbCxhLnJhPW51bGwpO2EuUj1udWxsO2EuRj0tMTthLks9LTF9O0oucHJvdG90eXBlLkM9ZnVuY3Rpb24oKXtKLmwuQy5jYWxsKHRoaXMpO2tjKHRoaXMpfTt2YXIgSz17Z2E6Im1vdXNlZG93biIsaGE6Im1vdXNldXAiLGZhOiJtb3VzZWNhbmNlbCIsc2M6Im1vdXNlbW92ZSIsdWM6Im1vdXNlb3ZlciIsdGM6Im1vdXNlb3V0IixxYzoibW91c2VlbnRlciIscmM6Im1vdXNlbGVhdmUifTt2YXIgbGM9ZnVuY3Rpb24oYSl7cmV0dXJuIHR5cGVvZiBhLmNsYXNzTmFtZT09InN0cmluZyI/YS5jbGFzc05hbWU6YS5nZXRBdHRyaWJ1dGUmJmEuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIn0sTD1mdW5jdGlvbihhKXtyZXR1cm4gYS5jbGFzc0xpc3Q/YS5jbGFzc0xpc3Q6bGMoYSkubWF0Y2goL1xTKy9nKXx8W119LG1jPWZ1bmN0aW9uKGEsYil7dHlwZW9mIGEuY2xhc3NOYW1lPT0ic3RyaW5nIj9hLmNsYXNzTmFtZT1iOmEuc2V0QXR0cmlidXRlJiZhLnNldEF0dHJpYnV0ZSgiY2xhc3MiLGIpfSxuYz1mdW5jdGlvbihhLGIpe2EuY2xhc3NMaXN0P2I9YS5jbGFzc0xpc3QuY29udGFpbnMoYik6KGE9TChhKSxiPXZhKGEsYik+PTApO3JldHVybiBifSxvYz1mdW5jdGlvbihhLGIpe2lmKGEuY2xhc3NMaXN0KWEuY2xhc3NMaXN0LmFkZChiKTtlbHNlIGlmKCFuYyhhLGIpKXt2YXIgYz1sYyhhKTttYyhhLGMrKGMubGVuZ3RoPjA/IiAiK2I6YikpfX0scGM9ZnVuY3Rpb24oYSxiKXtpZihhLmNsYXNzTGlzdClBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGIsCmZ1bmN0aW9uKGUpe29jKGEsZSl9KTtlbHNle3ZhciBjPXt9O0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoTChhKSxmdW5jdGlvbihlKXtjW2VdPSEwfSk7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChiLGZ1bmN0aW9uKGUpe2NbZV09ITB9KTtiPSIiO2Zvcih2YXIgZCBpbiBjKWIrPWIubGVuZ3RoPjA/IiAiK2Q6ZDttYyhhLGIpfX0scWM9ZnVuY3Rpb24oYSxiKXthLmNsYXNzTGlzdD9hLmNsYXNzTGlzdC5yZW1vdmUoYik6bmMoYSxiKSYmbWMoYSxBcnJheS5wcm90b3R5cGUuZmlsdGVyLmNhbGwoTChhKSxmdW5jdGlvbihjKXtyZXR1cm4gYyE9Yn0pLmpvaW4oIiAiKSl9LHJjPWZ1bmN0aW9uKGEsYil7YS5jbGFzc0xpc3Q/QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChiLGZ1bmN0aW9uKGMpe3FjKGEsYyl9KTptYyhhLEFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbChMKGEpLGZ1bmN0aW9uKGMpe3JldHVybiEodmEoYixjKT49MCl9KS5qb2luKCIgIikpfTt2YXIgdGM9ZnVuY3Rpb24oYSxiKXtpZighYSl0aHJvdyBFcnJvcigiSW52YWxpZCBjbGFzcyBuYW1lICIrYSk7aWYodHlwZW9mIGIhPT0iZnVuY3Rpb24iKXRocm93IEVycm9yKCJJbnZhbGlkIGRlY29yYXRvciBmdW5jdGlvbiAiK2IpO3NjW2FdPWJ9LHVjPXt9LHNjPXt9O3ZhciB2Yz1mdW5jdGlvbihhKXt0aGlzLkE9YX07aWEodmMpO3ZhciB3Yz1mdW5jdGlvbihhLGIpe2EmJihhLnRhYkluZGV4PWI/MDotMSl9LHljPWZ1bmN0aW9uKGEsYixjKXtjLmlkJiZQYihiLGMuaWQpO3ZhciBkPWEuZygpLGU9ITEsZj1MKGMpO2YmJkFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoZixmdW5jdGlvbihoKXtoPT1kP2U9ITA6aCYmdGhpcy51KGIsaCxkKX0sYSk7ZXx8b2MoYyxkKTt4YyhiLGMpO3JldHVybiBjfTt2Yy5wcm90b3R5cGUudT1mdW5jdGlvbihhLGIsYyl7Yj09YysiLWRpc2FibGVkIj9hLlgoITEpOmI9PWMrIi1ob3Jpem9udGFsIj96YyhhLCJob3Jpem9udGFsIik6Yj09YysiLXZlcnRpY2FsIiYmemMoYSwidmVydGljYWwiKX07CnZhciB4Yz1mdW5jdGlvbihhLGIpe2lmKGIpZm9yKHZhciBjPWIuZmlyc3RDaGlsZCxkO2MmJmMucGFyZW50Tm9kZT09Yjspe2Q9Yy5uZXh0U2libGluZztpZihjLm5vZGVUeXBlPT0xKXthOnt2YXIgZT1jO3AoZSk7ZT1MKGUpO2Zvcih2YXIgZj1lLmxlbmd0aCxoPTA7aDxmO2grKyl7dmFyIGs9ZVtoXTtpZihrPWsgaW4gc2M/c2Nba10oKTpudWxsKXtlPWs7YnJlYWsgYX19ZT1udWxsfWUmJihlLmc9YyxhLmlzRW5hYmxlZCgpfHxlLlgoITEpLGEuQmEoZSksU2IoZSxjKSl9ZWxzZSBjLm5vZGVWYWx1ZSYmSGEoYy5ub2RlVmFsdWUpIT0iInx8Yi5yZW1vdmVDaGlsZChjKTtjPWR9fSxBYz1mdW5jdGlvbihhLGIpe2I9Yi5pKCk7cChiLCJUaGUgY29udGFpbmVyIERPTSBlbGVtZW50IGNhbm5vdCBiZSBudWxsLiIpO0tiKGIsdCk7KGE9YS5BKSYmWmIoYixhKX07dmMucHJvdG90eXBlLmc9ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy1jb250YWluZXIifTsKdmMucHJvdG90eXBlLmo9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nKCksYz1bYixhLkw9PSJob3Jpem9udGFsIj9iKyItaG9yaXpvbnRhbCI6YisiLXZlcnRpY2FsIl07YS5pc0VuYWJsZWQoKXx8Yy5wdXNoKGIrIi1kaXNhYmxlZCIpO3JldHVybiBjfTt2YXIgQmM9ZnVuY3Rpb24oKXt9O3ZhciBNPWZ1bmN0aW9uKCl7fSxDYztpYShNKTt2YXIgRGM9e2J1dHRvbjoicHJlc3NlZCIsY2hlY2tib3g6ImNoZWNrZWQiLG1lbnVpdGVtOiJzZWxlY3RlZCIsbWVudWl0ZW1jaGVja2JveDoiY2hlY2tlZCIsbWVudWl0ZW1yYWRpbzoiY2hlY2tlZCIscmFkaW86ImNoZWNrZWQiLHRhYjoic2VsZWN0ZWQiLHRyZWVpdGVtOiJzZWxlY3RlZCJ9O00ucHJvdG90eXBlLk5hPWZ1bmN0aW9uKCl7fTtNLnByb3RvdHlwZS54YT1mdW5jdGlvbihhKXt2YXIgYj1hLkcsYz1iLmgsZD10aGlzLk4oKSxlPVtkXSxmPXRoaXMuTigpO2YhPWQmJmUucHVzaChmKTtkPWEubTtmb3IoZj1bXTtkOyl7dmFyIGg9ZCYtZDtmLnB1c2goRWModGhpcyxoKSk7ZCY9fmh9ZS5wdXNoLmFwcGx5KGUsZik7KGQ9YS5GYSkmJmUucHVzaC5hcHBseShlLGQpO3JldHVybiBjLmNhbGwoYiwiRElWIixlLmpvaW4oIiAiKSxhLmlhKX07Ck0ucHJvdG90eXBlLnlhPWZ1bmN0aW9uKGEsYil7Yi5pZCYmUGIoYSxiLmlkKTtiJiZiLmZpcnN0Q2hpbGQ/RmMoYSxiLmZpcnN0Q2hpbGQubmV4dFNpYmxpbmc/eWEoYi5jaGlsZE5vZGVzKTpiLmZpcnN0Q2hpbGQpOmEuaWE9bnVsbDt2YXIgYz0wLGQ9dGhpcy5OKCksZT10aGlzLk4oKSxmPSExLGg9ITEsaz15YShMKGIpKTtrLmZvckVhY2goZnVuY3Rpb24ocSl7Znx8cSE9ZD9ofHxxIT1lP2N8PUdjKHRoaXMscSk6aD0hMDooZj0hMCxlPT1kJiYoaD0hMCkpO0djKHRoaXMscSk9PTEmJihzYShiKSxkYihiKSYmZWIoYikmJmNiKGIsITEpKX0sdGhpcyk7YS5tPWM7Znx8KGsucHVzaChkKSxlPT1kJiYoaD0hMCkpO2h8fGsucHVzaChlKTsoYT1hLkZhKSYmay5wdXNoLmFwcGx5KGssYSk7ZiYmaCYmIWF8fG1jKGIsay5qb2luKCIgIikpO3JldHVybiBifTsKdmFyIEhjPWZ1bmN0aW9uKGEsYil7aWYoYT1hLk5hKCkpe3AoYiwiVGhlIGVsZW1lbnQgcGFzc2VkIGFzIGEgZmlyc3QgcGFyYW1ldGVyIGNhbm5vdCBiZSBudWxsLiIpO3ZhciBjPWIuZ2V0QXR0cmlidXRlKCJyb2xlIil8fG51bGw7YSE9YyYmWmIoYixhKX19LEljPWZ1bmN0aW9uKGEsYil7dmFyIGM7aWYoYS5EJjMyJiYoYz1hLmkoKSkpe2lmKCFiJiZhLm0mMzIpe3RyeXtjLmJsdXIoKX1jYXRjaChkKXt9YS5tJjMyJiZhLlFhKG51bGwpfShkYihjKSYmZWIoYykpIT1iJiZjYihjLGIpfX0sSmM9ZnVuY3Rpb24oYSxiLGMpe0NjfHwoQ2M9ezE6ImRpc2FibGVkIiw4OiJzZWxlY3RlZCIsMTY6ImNoZWNrZWQiLDY0OiJleHBhbmRlZCJ9KTtwKGEsIlRoZSBlbGVtZW50IHBhc3NlZCBhcyBhIGZpcnN0IHBhcmFtZXRlciBjYW5ub3QgYmUgbnVsbC4iKTtiPUNjW2JdO3ZhciBkPWEuZ2V0QXR0cmlidXRlKCJyb2xlIil8fG51bGw7ZCYmKGQ9RGNbZF18fGIsYj1iPT0iY2hlY2tlZCJ8fGI9PQoic2VsZWN0ZWQiP2Q6Yik7YiYmYWMoYSxiLGMpfTtNLnByb3RvdHlwZS5OPWZ1bmN0aW9uKCl7cmV0dXJuImdvb2ctY29udHJvbCJ9O3ZhciBFYz1mdW5jdGlvbihhLGIpe2EuZ3x8S2MoYSk7cmV0dXJuIGEuZ1tiXX0sR2M9ZnVuY3Rpb24oYSxiKXthLmh8fChhLmd8fEtjKGEpLGEuaD1FYShhLmcpKTthPXBhcnNlSW50KGEuaFtiXSwxMCk7cmV0dXJuIGlzTmFOKGEpPzA6YX0sS2M9ZnVuY3Rpb24oYSl7dmFyIGI9YS5OKCk7dmFyIGM9Yi5yZXBsYWNlKC9ceGEwfFxzL2csIiAiKS5pbmRleE9mKCIgIikhPS0xO3AoIWMsIkNvbnRyb2xSZW5kZXJlciBoYXMgYW4gaW52YWxpZCBjc3MgY2xhc3M6ICciK2IrIiciKTthLmc9ezE6YisiLWRpc2FibGVkIiwyOmIrIi1ob3ZlciIsNDpiKyItYWN0aXZlIiw4OmIrIi1zZWxlY3RlZCIsMTY6YisiLWNoZWNrZWQiLDMyOmIrIi1mb2N1c2VkIiw2NDpiKyItb3BlbiJ9fTt2YXIgTj1mdW5jdGlvbihhLGIsYyl7Ri5jYWxsKHRoaXMsYyk7aWYoIWIpe2ZvcihiPXRoaXMuY29uc3RydWN0b3I7Yjspe3ZhciBkPW5hKGIpO2lmKGQ9dWNbZF0pYnJlYWs7Yj0oYj1PYmplY3QuZ2V0UHJvdG90eXBlT2YoYi5wcm90b3R5cGUpKSYmYi5jb25zdHJ1Y3Rvcn1iPWQ/dHlwZW9mIGQuVj09PSJmdW5jdGlvbiI/ZC5WKCk6bmV3IGQ6bnVsbH10aGlzLnY9Yjt0aGlzLmlhPWEhPT12b2lkIDA/YTpudWxsfTtuKE4sRik7Zz1OLnByb3RvdHlwZTtnLmlhPW51bGw7Zy5tPTA7Zy5EPTM5O2cuUD0wO2cuT2E9ITA7Zy5GYT1udWxsO2cuSGE9ITA7Zy5tYT1mdW5jdGlvbigpe3ZhciBhPXRoaXMudi54YSh0aGlzKTt0aGlzLmc9YTtIYyh0aGlzLnYsYSk7S2IoYSwhMCk7dGhpcy5pc1Zpc2libGUoKXx8KGEuc3R5bGUuZGlzcGxheT0ibm9uZSIsYSYmYWMoYSwiaGlkZGVuIiwhMCkpfTtnLm5hPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaSgpfTtnLndhPWZ1bmN0aW9uKCl7cmV0dXJuITB9OwpnLkVhPWZ1bmN0aW9uKGEpe3RoaXMuZz1hPXRoaXMudi55YSh0aGlzLGEpO0hjKHRoaXMudixhKTtLYihhLCEwKTt0aGlzLk9hPWEuc3R5bGUuZGlzcGxheSE9Im5vbmUifTsKZy5JPWZ1bmN0aW9uKCl7Ti5sLkkuY2FsbCh0aGlzKTt2YXIgYT10aGlzLmc7cChhLCJDYW4gbm90IGNhbGwgZ2V0RWxlbWVudFN0cmljdCBiZWZvcmUgcmVuZGVyaW5nL2RlY29yYXRpbmcuIik7cCh0aGlzKTtwKGEpO3RoaXMuaXNWaXNpYmxlKCl8fGFjKGEsImhpZGRlbiIsIXRoaXMuaXNWaXNpYmxlKCkpO3RoaXMuaXNFbmFibGVkKCl8fEpjKGEsMSwhdGhpcy5pc0VuYWJsZWQoKSk7dGhpcy5EJjgmJkpjKGEsOCwhISh0aGlzLm0mOCkpO3RoaXMuRCYxNiYmSmMoYSwxNiwhISh0aGlzLm0mMTYpKTt0aGlzLkQmNjQmJkpjKGEsNjQsISEodGhpcy5tJjY0KSk7dmFyIGI9dGhpcy52O1ViKHRoaXMpJiYoYT10aGlzLmkoKSxiPWIuTigpKyItcnRsIiwoYT1hLmk/YS5pKCk6YSkmJnBjKGEsW2JdKSk7dGhpcy5pc0VuYWJsZWQoKSYmSWModGhpcyx0aGlzLmlzVmlzaWJsZSgpKTt0aGlzLkQmLTImJih0aGlzLkhhJiZMYyh0aGlzLCEwKSx0aGlzLkQmMzImJihhPXRoaXMuaSgpKSkmJihiPQp0aGlzLlp8fCh0aGlzLlo9bmV3IEopLGdjKGIsYSksQihCKEIoUWIodGhpcyksYiwia2V5Iix0aGlzLmFhKSxhLCJmb2N1cyIsdGhpcy5YYSksYSwiYmx1ciIsdGhpcy5RYSkpfTt2YXIgTGM9ZnVuY3Rpb24oYSxiKXt2YXIgYz1RYihhKSxkPWEuaSgpO2I/KEIoQihCKEIoYyxkLEsuZ2EsYS5zYSksZCxbSy5oYSxLLmZhXSxhLnZhKSxkLCJtb3VzZW92ZXIiLGEudWEpLGQsIm1vdXNlb3V0IixhLnRhKSxhLmNhIT1CYyYmQihjLGQsImNvbnRleHRtZW51IixhLmNhKSk6KEMoQyhDKEMoYyxkLEsuZ2EsYS5zYSksZCxbSy5oYSxLLmZhXSxhLnZhKSxkLCJtb3VzZW92ZXIiLGEudWEpLGQsIm1vdXNlb3V0IixhLnRhKSxhLmNhIT1CYyYmQyhjLGQsImNvbnRleHRtZW51IixhLmNhKSl9O04ucHJvdG90eXBlLlU9ZnVuY3Rpb24oKXtOLmwuVS5jYWxsKHRoaXMpO3RoaXMuWiYma2ModGhpcy5aKTt0aGlzLmlzVmlzaWJsZSgpJiZ0aGlzLmlzRW5hYmxlZCgpJiZJYyh0aGlzLCExKX07Ck4ucHJvdG90eXBlLkM9ZnVuY3Rpb24oKXtOLmwuQy5jYWxsKHRoaXMpO3RoaXMuWiYmKHRoaXMuWi5kaXNwb3NlKCksZGVsZXRlIHRoaXMuWik7ZGVsZXRlIHRoaXMudjt0aGlzLkZhPXRoaXMuaWE9bnVsbH07dmFyIEZjPWZ1bmN0aW9uKGEsYil7YS5pYT1ifTtOLnByb3RvdHlwZS5pc1Zpc2libGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5PYX07Ti5wcm90b3R5cGUuaXNFbmFibGVkPWZ1bmN0aW9uKCl7cmV0dXJuISh0aGlzLm0mMSl9O04ucHJvdG90eXBlLlg9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5oO2ImJnR5cGVvZiBiLmlzRW5hYmxlZD09ImZ1bmN0aW9uIiYmIWIuaXNFbmFibGVkKCl8fCFPKHRoaXMsMSwhYSl8fChhfHwoTWModGhpcywhMSksUCh0aGlzLCExKSksdGhpcy5pc1Zpc2libGUoKSYmSWModGhpcyxhKSxUKHRoaXMsMSwhYSwhMCkpfTt2YXIgUD1mdW5jdGlvbihhLGIpe08oYSwyLGIpJiZUKGEsMixiKX07Ck4ucHJvdG90eXBlLmlzQWN0aXZlPWZ1bmN0aW9uKCl7cmV0dXJuISEodGhpcy5tJjQpfTsKdmFyIE1jPWZ1bmN0aW9uKGEsYil7TyhhLDQsYikmJlQoYSw0LGIpfSxOYz1mdW5jdGlvbihhLGIpe08oYSw4LGIpJiZUKGEsOCxiKX0sT2M9ZnVuY3Rpb24oYSxiKXtPKGEsNjQsYikmJlQoYSw2NCxiKX0sVD1mdW5jdGlvbihhLGIsYyxkKXtpZighZCYmYj09MSlhLlgoIWMpO2Vsc2UgaWYoYS5EJmImJmMhPSEhKGEubSZiKSl7dmFyIGU9YS52O2lmKGQ9YS5pKCkpe2lmKGU9RWMoZSxiKSl7dmFyIGY9YS5pP2EuaSgpOmE7ZiYmKGM/cGM6cmMpKGYsW2VdKX1KYyhkLGIsYyl9YS5tPWM/YS5tfGI6YS5tJn5ifX0sUGM9ZnVuY3Rpb24oYSxiLGMpe2lmKGEucyYmYS5tJmImJiFjKXRocm93IEVycm9yKCJDb21wb25lbnQgYWxyZWFkeSByZW5kZXJlZCIpOyFjJiZhLm0mYiYmVChhLGIsITEpO2EuRD1jP2EuRHxiOmEuRCZ+Yn0sVT1mdW5jdGlvbihhLGIpe3JldHVybiEhKDI1NSZiKSYmISEoYS5EJmIpfSxPPWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4hIShhLkQmYikmJiEhKGEubSZiKSE9CmMmJighKGEuUCZiKXx8RShhLE5iKGIsYykpKSYmIWEuYmF9O04ucHJvdG90eXBlLnVhPWZ1bmN0aW9uKGEpeyFRYyhhLHRoaXMuaSgpKSYmRSh0aGlzLCJlbnRlciIpJiZ0aGlzLmlzRW5hYmxlZCgpJiZVKHRoaXMsMikmJlAodGhpcywhMCl9O04ucHJvdG90eXBlLnRhPWZ1bmN0aW9uKGEpeyFRYyhhLHRoaXMuaSgpKSYmRSh0aGlzLCJsZWF2ZSIpJiYoVSh0aGlzLDQpJiZNYyh0aGlzLCExKSxVKHRoaXMsMikmJlAodGhpcywhMSkpfTtOLnByb3RvdHlwZS5jYT1CYzt2YXIgUWM9ZnVuY3Rpb24oYSxiKXtyZXR1cm4hIWEucmVsYXRlZFRhcmdldCYmYWIoYixhLnJlbGF0ZWRUYXJnZXQpfTsKTi5wcm90b3R5cGUuc2E9ZnVuY3Rpb24oYSl7aWYodGhpcy5pc0VuYWJsZWQoKSYmKFUodGhpcywyKSYmUCh0aGlzLCEwKSwhKGEuaC5idXR0b24hPTB8fHYmJmEuY3RybEtleSkpKXtVKHRoaXMsNCkmJk1jKHRoaXMsITApO3ZhciBiO2lmKGI9dGhpcy52KXt2YXIgYztiPXRoaXMuRCYzMiYmKGM9dGhpcy5pKCkpP2RiKGMpJiZlYihjKTohMX1iJiZ0aGlzLmkoKS5mb2N1cygpfWEuaC5idXR0b24hPTB8fHYmJmEuY3RybEtleXx8YS5qKCl9O04ucHJvdG90eXBlLnZhPWZ1bmN0aW9uKGEpe3RoaXMuaXNFbmFibGVkKCkmJihVKHRoaXMsMikmJlAodGhpcywhMCksdGhpcy5pc0FjdGl2ZSgpJiZSYyh0aGlzLGEpJiZVKHRoaXMsNCkmJk1jKHRoaXMsITEpKX07CnZhciBSYz1mdW5jdGlvbihhLGIpe2lmKFUoYSwxNikpe3ZhciBjPSEoYS5tJjE2KTtPKGEsMTYsYykmJlQoYSwxNixjKX1VKGEsOCkmJk5jKGEsITApO1UoYSw2NCkmJk9jKGEsIShhLm0mNjQpKTtjPW5ldyB5KCJhY3Rpb24iLGEpO2ImJihjLmFsdEtleT1iLmFsdEtleSxjLmN0cmxLZXk9Yi5jdHJsS2V5LGMubWV0YUtleT1iLm1ldGFLZXksYy5zaGlmdEtleT1iLnNoaWZ0S2V5LGMuRz1iLkcsYy50aW1lU3RhbXA9Yi50aW1lU3RhbXApO3JldHVybiBFKGEsYyl9O04ucHJvdG90eXBlLlhhPWZ1bmN0aW9uKCl7VSh0aGlzLDMyKSYmTyh0aGlzLDMyLCEwKSYmVCh0aGlzLDMyLCEwKX07Ti5wcm90b3R5cGUuUWE9ZnVuY3Rpb24oKXtVKHRoaXMsNCkmJk1jKHRoaXMsITEpO1UodGhpcywzMikmJk8odGhpcywzMiwhMSkmJlQodGhpcywzMiwhMSl9OwpOLnByb3RvdHlwZS5hYT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5pc1Zpc2libGUoKSYmdGhpcy5pc0VuYWJsZWQoKSYmYS5nPT0xMyYmUmModGhpcyxhKT8oYS5qKCksYS52KCksITApOiExfTtpZih0eXBlb2YgTiE9PSJmdW5jdGlvbiIpdGhyb3cgRXJyb3IoIkludmFsaWQgY29tcG9uZW50IGNsYXNzICIrTik7aWYodHlwZW9mIE0hPT0iZnVuY3Rpb24iKXRocm93IEVycm9yKCJJbnZhbGlkIHJlbmRlcmVyIGNsYXNzICIrTSk7dmFyIFNjPW5hKE4pO3VjW1NjXT1NO3RjKCJnb29nLWNvbnRyb2wiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBOKG51bGwpfSk7dmFyIFY9ZnVuY3Rpb24oYSxiLGMpe0YuY2FsbCh0aGlzLGMpO3RoaXMuZWE9Ynx8dmMuVigpO3RoaXMuTD1hfHwidmVydGljYWwifTtuKFYsRik7Zz1WLnByb3RvdHlwZTtnLkthPW51bGw7Zy5kYT1udWxsO2cuZWE9bnVsbDtnLkw9bnVsbDtnLlM9ITA7Zy5UPSEwO2cubz0tMTtnLkI9bnVsbDtnLlc9ITE7Zy5PPW51bGw7dmFyIFRjPWZ1bmN0aW9uKGEpe3JldHVybiBhLkthfHxhLmkoKX07Zz1WLnByb3RvdHlwZTtnLm1hPWZ1bmN0aW9uKCl7dGhpcy5nPXRoaXMuRy5oKCJESVYiLHRoaXMuZWEuaih0aGlzKS5qb2luKCIgIikpfTtnLm5hPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaSgpfTtnLndhPWZ1bmN0aW9uKGEpe3JldHVybiBhLnRhZ05hbWU9PSJESVYifTtnLkVhPWZ1bmN0aW9uKGEpe3RoaXMuZz15Yyh0aGlzLmVhLHRoaXMsYSk7YS5zdHlsZS5kaXNwbGF5PT0ibm9uZSImJih0aGlzLlM9ITEpfTsKZy5JPWZ1bmN0aW9uKCl7Vi5sLkkuY2FsbCh0aGlzKTtUYih0aGlzLGZ1bmN0aW9uKGIpe2IucyYmVWModGhpcyxiKX0sdGhpcyk7dmFyIGE9dGhpcy5pKCk7QWModGhpcy5lYSx0aGlzKTtWYyh0aGlzLHRoaXMuUyk7QihCKEIoQihCKEIoQihCKFFiKHRoaXMpLHRoaXMsImVudGVyIix0aGlzLmViKSx0aGlzLCJoaWdobGlnaHQiLHRoaXMuZmIpLHRoaXMsInVuaGlnaGxpZ2h0Iix0aGlzLmxiKSx0aGlzLCJvcGVuIix0aGlzLmdiKSx0aGlzLCJjbG9zZSIsdGhpcy5iYiksYSxLLmdhLHRoaXMuV2EpLGJiKGEpLFtLLmhhLEsuZmFdLHRoaXMuY2IpLGEsW0suZ2EsSy5oYSxLLmZhLCJtb3VzZW92ZXIiLCJtb3VzZW91dCIsImNvbnRleHRtZW51Il0sdGhpcy5hYik7V2ModGhpcyl9O3ZhciBXYz1mdW5jdGlvbihhKXt2YXIgYj1RYihhKSxjPVRjKGEpO0IoQihCKGIsYywiZm9jdXMiLGEuUGEpLGMsImJsdXIiLGEuVWEpLGEuZGF8fChhLmRhPW5ldyBKKFRjKGEpKSksImtleSIsYS5WYSl9OwpnPVYucHJvdG90eXBlO2cuVT1mdW5jdGlvbigpe1hjKHRoaXMsLTEpO3RoaXMuQiYmT2ModGhpcy5CLCExKTt0aGlzLlc9ITE7Vi5sLlUuY2FsbCh0aGlzKX07Zy5DPWZ1bmN0aW9uKCl7Vi5sLkMuY2FsbCh0aGlzKTt0aGlzLmRhJiYodGhpcy5kYS5kaXNwb3NlKCksdGhpcy5kYT1udWxsKTt0aGlzLmVhPXRoaXMuQj10aGlzLk89dGhpcy5LYT1udWxsfTtnLmViPWZ1bmN0aW9uKCl7cmV0dXJuITB9OwpnLmZiPWZ1bmN0aW9uKGEpe3ZhciBiPVZiKHRoaXMsYS50YXJnZXQpO2lmKGI+LTEmJmIhPXRoaXMubyl7dmFyIGM9SSh0aGlzLHRoaXMubyk7YyYmUChjLCExKTt0aGlzLm89YjtjPUkodGhpcyx0aGlzLm8pO3RoaXMuVyYmTWMoYywhMCk7dGhpcy5CJiZjIT10aGlzLkImJihjLkQmNjQ/T2MoYywhMCk6T2ModGhpcy5CLCExKSl9Yj10aGlzLmkoKTtwKGIsIlRoZSBET00gZWxlbWVudCBmb3IgdGhlIGNvbnRhaW5lciBjYW5ub3QgYmUgbnVsbC4iKTthLnRhcmdldC5pKCkhPW51bGwmJmFjKGIsImFjdGl2ZWRlc2NlbmRhbnQiLGEudGFyZ2V0LmkoKS5pZCl9O2cubGI9ZnVuY3Rpb24oYSl7YS50YXJnZXQ9PUkodGhpcyx0aGlzLm8pJiYodGhpcy5vPS0xKTthPXRoaXMuaSgpO3AoYSwiVGhlIERPTSBlbGVtZW50IGZvciB0aGUgY29udGFpbmVyIGNhbm5vdCBiZSBudWxsLiIpO2EucmVtb3ZlQXR0cmlidXRlKCRiKCJhY3RpdmVkZXNjZW5kYW50IikpfTsKZy5nYj1mdW5jdGlvbihhKXsoYT1hLnRhcmdldCkmJmEhPXRoaXMuQiYmYS5oPT10aGlzJiYodGhpcy5CJiZPYyh0aGlzLkIsITEpLHRoaXMuQj1hKX07Zy5iYj1mdW5jdGlvbihhKXthLnRhcmdldD09dGhpcy5CJiYodGhpcy5CPW51bGwpO3ZhciBiPXRoaXMuaSgpLGM9YS50YXJnZXQuaSgpO2ImJmEudGFyZ2V0Lm0mMiYmYyYmKGE9IiIsYyYmKGE9Yy5pZCxwKGEsIlRoZSBhY3RpdmUgZWxlbWVudCBzaG91bGQgaGF2ZSBhbiBpZC4iKSksYWMoYiwiYWN0aXZlZGVzY2VuZGFudCIsYSkpfTtnLldhPWZ1bmN0aW9uKGEpe3RoaXMuVCYmKHRoaXMuVz0hMCk7dmFyIGI9VGModGhpcyk7YiYmZGIoYikmJmViKGIpP2IuZm9jdXMoKTphLmooKX07Zy5jYj1mdW5jdGlvbigpe3RoaXMuVz0hMX07CmcuYWI9ZnVuY3Rpb24oYSl7YTp7dmFyIGI9YS50YXJnZXQ7aWYodGhpcy5PKWZvcih2YXIgYz10aGlzLmkoKTtiJiZiIT09Yzspe3ZhciBkPWIuaWQ7aWYoZCBpbiB0aGlzLk8pe2I9dGhpcy5PW2RdO2JyZWFrIGF9Yj1iLnBhcmVudE5vZGV9Yj1udWxsfWlmKGIpc3dpdGNoKGEudHlwZSl7Y2FzZSBLLmdhOmIuc2EoYSk7YnJlYWs7Y2FzZSBLLmhhOmNhc2UgSy5mYTpiLnZhKGEpO2JyZWFrO2Nhc2UgIm1vdXNlb3ZlciI6Yi51YShhKTticmVhaztjYXNlICJtb3VzZW91dCI6Yi50YShhKTticmVhaztjYXNlICJjb250ZXh0bWVudSI6Yi5jYShhKX19O2cuUGE9ZnVuY3Rpb24oKXt9O2cuVWE9ZnVuY3Rpb24oKXtYYyh0aGlzLC0xKTt0aGlzLlc9ITE7dGhpcy5CJiZPYyh0aGlzLkIsITEpfTsKZy5WYT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5pc0VuYWJsZWQoKSYmdGhpcy5pc1Zpc2libGUoKSYmKEgodGhpcykhPTB8fHRoaXMuS2EpJiZZYyh0aGlzLGEpPyhhLmooKSxhLnYoKSwhMCk6ITF9Owp2YXIgWWM9ZnVuY3Rpb24oYSxiKXt2YXIgYz1JKGEsYS5vKTtpZihjJiZ0eXBlb2YgYy5hYT09ImZ1bmN0aW9uIiYmYy5hYShiKXx8YS5CJiZhLkIhPWMmJnR5cGVvZiBhLkIuYWE9PSJmdW5jdGlvbiImJmEuQi5hYShiKSlyZXR1cm4hMDtpZihiLnNoaWZ0S2V5fHxiLmN0cmxLZXl8fGIubWV0YUtleXx8Yi5hbHRLZXkpcmV0dXJuITE7c3dpdGNoKGIuZyl7Y2FzZSAyNzpUYyhhKS5ibHVyKCk7YnJlYWs7Y2FzZSAzNjpaYyhhKTticmVhaztjYXNlIDM1OiRjKGEpO2JyZWFrO2Nhc2UgMzg6aWYoYS5MPT0idmVydGljYWwiKWFkKGEpO2Vsc2UgcmV0dXJuITE7YnJlYWs7Y2FzZSAzNzppZihhLkw9PSJob3Jpem9udGFsIilVYihhKT9iZChhKTphZChhKTtlbHNlIHJldHVybiExO2JyZWFrO2Nhc2UgNDA6aWYoYS5MPT0idmVydGljYWwiKWJkKGEpO2Vsc2UgcmV0dXJuITE7YnJlYWs7Y2FzZSAzOTppZihhLkw9PSJob3Jpem9udGFsIilVYihhKT9hZChhKTpiZChhKTtlbHNlIHJldHVybiExOwpicmVhaztkZWZhdWx0OnJldHVybiExfXJldHVybiEwfSxVYz1mdW5jdGlvbihhLGIpe3ZhciBjPWIuaSgpO2M9Yy5pZHx8KGMuaWQ9T2IoYikpO2EuT3x8KGEuTz17fSk7YS5PW2NdPWJ9O1YucHJvdG90eXBlLkJhPWZ1bmN0aW9uKGEsYil7dWEoYSxOLCJUaGUgY2hpbGQgb2YgYSBjb250YWluZXIgbXVzdCBiZSBhIGNvbnRyb2wiKTtWLmwuQmEuY2FsbCh0aGlzLGEsYil9O1YucHJvdG90eXBlLkNhPWZ1bmN0aW9uKGEsYixjKXt1YShhLE4pO2EuUHw9MjthLlB8PTY0O1BjKGEsMzIsITEpO2EucyYmMCE9YS5IYSYmTGMoYSwhMSk7YS5IYT0hMTt2YXIgZD1hLmg9PXRoaXM/VmIodGhpcyxhKTotMTtWLmwuQ2EuY2FsbCh0aGlzLGEsYixjKTthLnMmJnRoaXMucyYmVWModGhpcyxhKTthPWQ7YT09LTEmJihhPUgodGhpcykpO2E9PXRoaXMubz90aGlzLm89TWF0aC5taW4oSCh0aGlzKS0xLGIpOmE+dGhpcy5vJiZiPD10aGlzLm8/dGhpcy5vKys6YTx0aGlzLm8mJmI+dGhpcy5vJiZ0aGlzLm8tLX07CnZhciB6Yz1mdW5jdGlvbihhLGIpe2lmKGEuaSgpKXRocm93IEVycm9yKCJDb21wb25lbnQgYWxyZWFkeSByZW5kZXJlZCIpO2EuTD1ifTtWLnByb3RvdHlwZS5pc1Zpc2libGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5TfTt2YXIgVmM9ZnVuY3Rpb24oYSxiKXthLlM9Yjt2YXIgYz1hLmkoKTtjJiYoYy5zdHlsZS5kaXNwbGF5PWI/IiI6Im5vbmUiLHdjKFRjKGEpLGEuVCYmYS5TKSl9O1YucHJvdG90eXBlLmlzRW5hYmxlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLlR9O1YucHJvdG90eXBlLlg9ZnVuY3Rpb24oYSl7dGhpcy5UIT1hJiZFKHRoaXMsYT8iZW5hYmxlIjoiZGlzYWJsZSIpJiYoYT8odGhpcy5UPSEwLFRiKHRoaXMsZnVuY3Rpb24oYil7Yi5UYT9kZWxldGUgYi5UYTpiLlgoITApfSkpOihUYih0aGlzLGZ1bmN0aW9uKGIpe2IuaXNFbmFibGVkKCk/Yi5YKCExKTpiLlRhPSEwfSksdGhpcy5XPXRoaXMuVD0hMSksd2MoVGModGhpcyksYSYmdGhpcy5TKSl9Owp2YXIgWGM9ZnVuY3Rpb24oYSxiKXsoYj1JKGEsYikpP1AoYiwhMCk6YS5vPi0xJiZQKEkoYSxhLm8pLCExKX0sWmM9ZnVuY3Rpb24oYSl7Y2QoYSxmdW5jdGlvbihiLGMpe3JldHVybihiKzEpJWN9LEgoYSktMSl9LCRjPWZ1bmN0aW9uKGEpe2NkKGEsZnVuY3Rpb24oYixjKXtiLS07cmV0dXJuIGI8MD9jLTE6Yn0sMCl9LGJkPWZ1bmN0aW9uKGEpe2NkKGEsZnVuY3Rpb24oYixjKXtyZXR1cm4oYisxKSVjfSxhLm8pfSxhZD1mdW5jdGlvbihhKXtjZChhLGZ1bmN0aW9uKGIsYyl7Yi0tO3JldHVybiBiPDA/Yy0xOmJ9LGEubyl9LGNkPWZ1bmN0aW9uKGEsYixjKXtjPWM8MD9WYihhLGEuQik6Yzt2YXIgZD1IKGEpO2M9Yi5jYWxsKGEsYyxkKTtmb3IodmFyIGU9MDtlPD1kOyl7dmFyIGY9SShhLGMpO2lmKGYmJmYuaXNWaXNpYmxlKCkmJmYuaXNFbmFibGVkKCkmJmYuRCYyKXthLkxhKGMpO2JyZWFrfWUrKztjPWIuY2FsbChhLGMsZCl9fTsKVi5wcm90b3R5cGUuTGE9ZnVuY3Rpb24oYSl7WGModGhpcyxhKX07dmFyIGRkPWZ1bmN0aW9uKCl7fTtuKGRkLE0pO2lhKGRkKTtnPWRkLnByb3RvdHlwZTtnLk49ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy10YWIifTtnLk5hPWZ1bmN0aW9uKCl7cmV0dXJuInRhYiJ9O2cueGE9ZnVuY3Rpb24oYSl7dmFyIGI9ZGQubC54YS5jYWxsKHRoaXMsYSk7KGE9YS5HYSgpKSYmdGhpcy5NYShiLGEpO3JldHVybiBifTtnLnlhPWZ1bmN0aW9uKGEsYil7Yj1kZC5sLnlhLmNhbGwodGhpcyxhLGIpO3ZhciBjPXRoaXMuR2EoYik7YyYmKGEuUmE9Yyk7YS5tJjgmJihjPWEuaCkmJnR5cGVvZiBjLko9PT0iZnVuY3Rpb24iJiYoVChhLDgsITEpLGMuSihhKSk7cmV0dXJuIGJ9O2cuR2E9ZnVuY3Rpb24oYSl7cmV0dXJuIGEudGl0bGV8fCIifTtnLk1hPWZ1bmN0aW9uKGEsYil7YSYmKGEudGl0bGU9Ynx8IiIpfTt2YXIgZWQ9ZnVuY3Rpb24oYSxiLGMpe04uY2FsbCh0aGlzLGEsYnx8ZGQuVigpLGMpO1BjKHRoaXMsOCwhMCk7dGhpcy5QfD05fTtuKGVkLE4pO2VkLnByb3RvdHlwZS5HYT1mdW5jdGlvbigpe3JldHVybiB0aGlzLlJhfTtlZC5wcm90b3R5cGUuTWE9ZnVuY3Rpb24oYSl7dGhpcy52Lk1hKHRoaXMuaSgpLGEpO3RoaXMuUmE9YX07dGMoImdvb2ctdGFiIixmdW5jdGlvbigpe3JldHVybiBuZXcgZWQobnVsbCl9KTt2YXIgVz1mdW5jdGlvbigpe3RoaXMuQT0idGFibGlzdCJ9O24oVyx2Yyk7aWEoVyk7Vy5wcm90b3R5cGUuZz1mdW5jdGlvbigpe3JldHVybiJnb29nLXRhYi1iYXIifTtXLnByb3RvdHlwZS51PWZ1bmN0aW9uKGEsYixjKXt0aGlzLnZ8fCh0aGlzLmh8fGZkKHRoaXMpLHRoaXMudj1FYSh0aGlzLmgpKTt2YXIgZD10aGlzLnZbYl07ZD8oemMoYSxnZChkKSksYS52PWQpOlcubC51LmNhbGwodGhpcyxhLGIsYyl9O1cucHJvdG90eXBlLmo9ZnVuY3Rpb24oYSl7dmFyIGI9Vy5sLmouY2FsbCh0aGlzLGEpO3RoaXMuaHx8ZmQodGhpcyk7Yi5wdXNoKHRoaXMuaFthLnZdKTtyZXR1cm4gYn07dmFyIGZkPWZ1bmN0aW9uKGEpe3ZhciBiPWEuZygpO2EuaD17dG9wOmIrIi10b3AiLGJvdHRvbTpiKyItYm90dG9tIixzdGFydDpiKyItc3RhcnQiLGVuZDpiKyItZW5kIn19O3ZhciBYPWZ1bmN0aW9uKGEsYixjKXthPWF8fCJ0b3AiO3pjKHRoaXMsZ2QoYSkpO3RoaXMudj1hO1YuY2FsbCh0aGlzLHRoaXMuTCxifHxXLlYoKSxjKTtoZCh0aGlzKX07bihYLFYpO2c9WC5wcm90b3R5cGU7Zy5IPW51bGw7Zy5JPWZ1bmN0aW9uKCl7WC5sLkkuY2FsbCh0aGlzKTtoZCh0aGlzKX07Zy5DPWZ1bmN0aW9uKCl7WC5sLkMuY2FsbCh0aGlzKTt0aGlzLkg9bnVsbH07Zy5MYT1mdW5jdGlvbihhKXtYLmwuTGEuY2FsbCh0aGlzLGEpO3RoaXMuSihJKHRoaXMsYSkpfTtnLko9ZnVuY3Rpb24oYSl7YT9OYyhhLCEwKTp0aGlzLkgmJk5jKHRoaXMuSCwhMSl9Owp2YXIgaWQ9ZnVuY3Rpb24oYSxiKXtpZihiJiZiPT1hLkgpe2Zvcih2YXIgYz1WYihhLGIpLGQ9Yy0xO2I9SShhLGQpO2QtLSl7dmFyIGU9YjtpZihlLmlzVmlzaWJsZSgpJiZlLmlzRW5hYmxlZCgpKXthLkooYik7cmV0dXJufX1mb3IoYys9MTtiPUkoYSxjKTtjKyspaWYoZD1iLGQuaXNWaXNpYmxlKCkmJmQuaXNFbmFibGVkKCkpe2EuSihiKTtyZXR1cm59YS5KKG51bGwpfX07Zz1YLnByb3RvdHlwZTtnLmpiPWZ1bmN0aW9uKGEpe3RoaXMuSCYmdGhpcy5IIT1hLnRhcmdldCYmTmModGhpcy5ILCExKTt0aGlzLkg9YS50YXJnZXR9O2cua2I9ZnVuY3Rpb24oYSl7YS50YXJnZXQ9PXRoaXMuSCYmKHRoaXMuSD1udWxsKX07Zy5oYj1mdW5jdGlvbihhKXtpZCh0aGlzLGEudGFyZ2V0KX07Zy5pYj1mdW5jdGlvbihhKXtpZCh0aGlzLGEudGFyZ2V0KX07Zy5QYT1mdW5jdGlvbigpe0kodGhpcyx0aGlzLm8pfHxYYyh0aGlzLFZiKHRoaXMsdGhpcy5IfHxJKHRoaXMsMCkpKX07CnZhciBoZD1mdW5jdGlvbihhKXtCKEIoQihCKFFiKGEpLGEsInNlbGVjdCIsYS5qYiksYSwidW5zZWxlY3QiLGEua2IpLGEsImRpc2FibGUiLGEuaGIpLGEsImhpZGUiLGEuaWIpfSxnZD1mdW5jdGlvbihhKXtyZXR1cm4gYT09InN0YXJ0Inx8YT09ImVuZCI/InZlcnRpY2FsIjoiaG9yaXpvbnRhbCJ9O3RjKCJnb29nLXRhYi1iYXIiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBYfSk7ZnVuY3Rpb24gamQoYSl7dmFyIGI9e3RvcDoiYm90dG9tIixib3R0b206InRvcCIsc3RhcnQ6InJpZ2h0IixlbmQ6ImxlZnQifVthLmxvY2F0aW9uXSxjPWEuZWxlbWVudElkLGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTtkLnRleHRDb250ZW50PSJcbiAgICBmaWVsZHNldCB7XG4gICAgICBwYWRkaW5nOiAxMHB4O1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgIzM2OTtcbiAgICB9XG5cbiAgICAjIitjKyIgLmdvb2ctdGFiLWNvbnRlbnQge1xuICAgICAgbWluLWhlaWdodDogM2VtO1xuICAgICAgbWFyZ2luOiAwO1xuICAgICAgYm9yZGVyOiAiK2EuYm9yZGVyKyIgc29saWQgIithLmJvcmRlckNvbG9yKyI7XG4gICAgICBib3JkZXItdG9wOiAwO1xuICAgICAgaGVpZ2h0OiAiK2EuY29udGVudEhlaWdodCsiO1xuICAgICAgcGFkZGluZzogNHB4IDhweDtcbiAgICAgIG1hcmdpbi1yaWdodDogNHB4O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgIG92ZXJmbG93OiBhdXRvO1xuICAgIH1cblxuICAgICMiKwpjKyIgLmdvb2ctdGFiLWJhci0iK2EubG9jYXRpb24rIiAuZ29vZy10YWItc2VsZWN0ZWQge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICIrYS5ib3JkZXJDb2xvcisiO1xuICAgICAgYm9yZGVyLSIrYisiOiAwcHg7XG4gICAgfVxuXG4gICAgIyIrYysiIC5nb29nLXRhYi1iYXItIithLmxvY2F0aW9uKyIge1xuICAgICAgcGFkZGluZy0iK2EubG9jYXRpb24rIjogNXB4ICFpbXBvcnRhbnQ7XG4gICAgICBib3JkZXItIitiKyI6IDFweCBzb2xpZCAiK2EuYm9yZGVyQ29sb3IrIiAhaW1wb3J0YW50O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICB9XG5cbiAgICAjIitjKyIgLmdvb2ctdGFiLWJhciB7XG4gICAgICAgbWFyZ2luOiAwO1xuICAgICAgIGJvcmRlcjogMDtcbiAgICAgICBwYWRkaW5nOiAwO1xuICAgICAgIGxpc3Qtc3R5bGU6IG5vbmU7XG4gICAgICAgY3Vyc29yOiBkZWZhdWx0O1xuICAgICAgIG91dGxpbmU6IG5vbmU7XG4gICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgICBtYXJnaW4tcmlnaHQ6IDRweDtcbiAgICAgIH1cblxuICAgICAjIisKYysiIC5nb29nLXRhYiB7XG4gICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgIHBhZGRpbmc6IDRweCA4cHg7XG4gICAgICAgY29sb3I6IHZhcigtLWNvbGFiLXByaW1hcnktdGV4dC1jb2xvcik7XG4gICAgICAgdGV4dC1kZWNvcmF0aW9uOiBpbml0aWFsO1xuICAgICAgIGN1cnNvcjogZGVmYXVsdDtcbiAgICAgIH1cblxuICAgICAgIyIrYysiIC5nb29nLXRhYi1ob3ZlciB7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWNvbGFiLWhpZ2hsaWdodGVkLXN1cmZhY2UtY29sb3IpO1xuICAgICAgfVxuICAgICAgIjtyZXR1cm4gZH0KdmFyIGtkPWZ1bmN0aW9uKGEpe3ZhciBiPWEuZWxlbWVudElkLGM9YS50YWJOYW1lcyxkPWEuc2VsZWN0ZWRJbmRleDsiY29udGVudEJvcmRlciJpbiBhfHwoYS5jb250ZW50Qm9yZGVyPSIwcHgiKTsiY29udGVudEhlaWdodCJpbiBhfHwoYS5jb250ZW50SGVpZ2h0PSJpbml0aWFsIik7ImJvcmRlckNvbG9yImluIGF8fChhLmJvcmRlckNvbG9yPSJ2YXIoLS1jb2xhYi1ib3JkZXItY29sb3IpIik7YS5sb2NhdGlvbnx8KGEubG9jYXRpb249InRvcCIpO3ZhciBlPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiMiK2IpLGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zi5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYi1iYXIiKTt2YXIgaD1hLmxvY2F0aW9uO2YuY2xhc3NMaXN0LmFkZCgiZ29vZy10YWItYmFyLSIraCk7Zm9yKHZhciBrPVtdLHE9ZmEoYyksRz1xLm5leHQoKTshRy5kb25lO0c9cS5uZXh0KCkpe0c9Ry52YWx1ZTt2YXIgeD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKeC5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYiIpO3gudGV4dENvbnRlbnQ9RztmLmFwcGVuZENoaWxkKHgpO2sucHVzaCh4KX1oIT0iYm90dG9tIiYmZS5hcHBlbmRDaGlsZChmKTtxPW51bGw7aWYoaD09InRvcCJ8fGg9PSJib3R0b20iKXE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikscS5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYi1iYXItY2xlYXIiKTtoPT0idG9wIiYmcSYmZS5hcHBlbmRDaGlsZChxKTtHPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO0cuY2xhc3NMaXN0LmFkZCgiZ29vZy10YWItY29udGVudCIpO3ZhciBoYT1bXTtjPWZhKGMpO2Zvcih4PWMubmV4dCgpOyF4LmRvbmU7eD1jLm5leHQoKSl4PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHguaWQ9ZS5pZCsiX2NvbnRlbnRfIitoYS5sZW5ndGgseC5zdHlsZS5kaXNwbGF5PSJub25lIixHLmFwcGVuZENoaWxkKHgpLGhhLnB1c2goeCk7ZS5hcHBlbmRDaGlsZChHKTtoPT0iYm90dG9tIiYmKHEmJgplLmFwcGVuZENoaWxkKHEpLGUuYXBwZW5kQ2hpbGQoZikpO3ZhciBRPW5ldyBYKGgpO1NiKFEsZik7dmFyIFI9LTE7d2IoUSwic2VsZWN0IixmdW5jdGlvbihTKXtTPWsuaW5kZXhPZihTLnRhcmdldC5pKCkpO1MhPVImJihSPj0wJiZSPGhhLmxlbmd0aCYmKGhhW1JdLnN0eWxlLmRpc3BsYXk9Im5vbmUiLFI9LTEpLFM+PTAmJlM8aGEubGVuZ3RoJiYoUj1TLGhhW1JdLnN0eWxlLmRpc3BsYXk9ImlubGluZSIsd2luZG93LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCJyZXNpemUiKSksZ29vZ2xlLmNvbGFiLm91dHB1dC5yZXNpemVJZnJhbWVUb0NvbnRlbnQoKSksUS5KKEkoUSxSKSkpfSk7US5KKEkoUSxkKSk7d2luZG93W2JdPXtzZXRTZWxlY3RlZFRhYkluZGV4OmZ1bmN0aW9uKFMpe1EuSihJKFEsUykpfX07ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChqZChhKSl9LGxkPVsiY29sYWJfbGliIiwiY3JlYXRlVGFiQmFyIl0sWT1sOwpsZFswXWluIFl8fHR5cGVvZiBZLmV4ZWNTY3JpcHQ9PSJ1bmRlZmluZWQifHxZLmV4ZWNTY3JpcHQoInZhciAiK2xkWzBdKTtmb3IodmFyIFo7bGQubGVuZ3RoJiYoWj1sZC5zaGlmdCgpKTspbGQubGVuZ3RofHxrZD09PXZvaWQgMD9ZW1pdJiZZW1pdIT09T2JqZWN0LnByb3RvdHlwZVtaXT9ZPVlbWl06WT1ZW1pdPXt9OllbWl09a2Q7fSkuY2FsbCh0aGlzKTsKLy8gY2xhbmctZm9ybWF0IG9uCg==", + "ok": true, + "headers": [ + [ + "content-length", + "41785" + ], + [ + "content-type", + "application/javascript" + ] + ], + "status": 200, + "status_text": "" + } + }, + "base_uri": "https://localhost:8080/", + "height": 229 + }, + "outputId": "068c3c0a-f1d0-4b69-e8ac-fa3769e2c423" + }, + "source": [ + "%%logica Jane, Smith\n", + "\n", + "@Engine(\"sqlite\");\n", + "\n", + "Person(name: \"John Smith\");\n", + "Person(name: \"Jane Smith\");\n", + "Person(name: \"Jane Johnson\");\n", + "\n", + "Jane(name:) :- Person(name:), Like(name, \"Jane %\");\n", + "Smith(name:) :- Person(name:), Like(name, \"% Smith\");" + ], + "execution_count": 40, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7d50e0ce-d22d-11ef-a7c0-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id90\", \"tabNames\": [\"Jane\", \"Smith\", \"(Log)\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_e7b667a54d" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7d51450a-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id90\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_33e1c56608" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7d52f7c4-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_6b623c77f9" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7d534e68-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id90_content_2\");\n", + "//# sourceURL=js_28f780f514" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7d53a98a-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"7d534e68-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_1464701639" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7d54a362-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id90\"].setSelectedTabIndex(2);\n", + "//# sourceURL=js_f50c0af579" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7d57cbe6-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"7d52f7c4-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_e27146794c" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7d5a57a8-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_971d549f8f" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7d5ae948-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id90_content_0\");\n", + "//# sourceURL=js_7d1e078171" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7d5b63f0-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"7d5ae948-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_f770ad947e" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7d5bd754-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id90\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_0904503aac" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7d5f00c8-d22d-11ef-a7c0-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id91\", \"tabNames\": [\"SQL\", \"Result\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_9996d343a1" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7d5fe146-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id91\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_f92ea76829" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7d62ddd8-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_3bc9fdcdce" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7d6323f6-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id91_content_0\");\n", + "//# sourceURL=js_4f564c2c95" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7d636a3c-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"7d6323f6-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_5f02cbab09" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7d63b280-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id91\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_2f19d61374" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The following query is stored at \u001b[1mJane_sql\u001b[0m variable.\n", + "WITH t_0_Person AS (SELECT * FROM (\n", + " \n", + " SELECT\n", + " 'John Smith' AS name\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " 'Jane Smith' AS name\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " 'Jane Johnson' AS name\n", + " \n", + ") AS UNUSED_TABLE_NAME )\n", + "SELECT\n", + " Person.name AS name\n", + "FROM\n", + " t_0_Person AS Person\n", + "WHERE\n", + " (Person.name LIKE 'Jane %');\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7d64b6da-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"7d62ddd8-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_6502031648" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7d6860dc-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_4464bffb41" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7d68a95c-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id91_content_1\");\n", + "//# sourceURL=js_a1703ccc99" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7d690302-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"7d68a95c-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_71b7a0a90e" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7d694f42-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id91\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_62a58294e0" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The following table is stored at \u001b[1mJane\u001b[0m variable.\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
name
0Jane Smith
1Jane Johnson
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7d6acd36-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"7d6860dc-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_0cb3a1e56d" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7d6c273a-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"7d5a57a8-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_c3e057834f" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7d6dcd6a-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_43cf699a88" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7d6e17c0-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id90_content_2\");\n", + "//# sourceURL=js_c54235ef82" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7d6e6054-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"7d6e17c0-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_f00c9070df" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7d6ea942-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id90\"].setSelectedTabIndex(2);\n", + "//# sourceURL=js_5f7aea5135" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7d70a3aa-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"7d6dcd6a-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_27a4ae7379" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7d723bf2-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_d0aba608fe" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7d728576-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id90_content_1\");\n", + "//# sourceURL=js_e38c1475e4" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7d72ccfc-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"7d728576-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_49a29a514e" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7d731554-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id90\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_2349a1e29d" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7d74d524-d22d-11ef-a7c0-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id92\", \"tabNames\": [\"SQL\", \"Result\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_3ebe7a9f17" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7d751a16-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id92\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_f0ba35f249" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7d766ace-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_b7ac7f43cc" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7d76be52-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id92_content_0\");\n", + "//# sourceURL=js_dde568ffea" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7d7729aa-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"7d76be52-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_b768949b4f" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7d7771ee-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id92\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_362208a2f3" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The following query is stored at \u001b[1mSmith_sql\u001b[0m variable.\n", + "WITH t_0_Person AS (SELECT * FROM (\n", + " \n", + " SELECT\n", + " 'John Smith' AS name\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " 'Jane Smith' AS name\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " 'Jane Johnson' AS name\n", + " \n", + ") AS UNUSED_TABLE_NAME )\n", + "SELECT\n", + " Person.name AS name\n", + "FROM\n", + " t_0_Person AS Person\n", + "WHERE\n", + " (Person.name LIKE '% Smith');\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7d788412-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"7d766ace-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_418fdb6fb1" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7d7a4374-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_7d27de5cd0" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7d7a9464-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id92_content_1\");\n", + "//# sourceURL=js_2cb9224425" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7d7addc0-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"7d7a9464-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_ca99e8c092" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7d7b2604-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id92\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_90db0d99f3" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The following table is stored at \u001b[1mSmith\u001b[0m variable.\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
name
0John Smith
1Jane Smith
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7d7c7658-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"7d7a4374-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_c16698ad75" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7d7dbeb4-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"7d723bf2-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_589a3ffc09" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7d7f6098-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_752ce90616" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7d7fa9a4-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id90_content_2\");\n", + "//# sourceURL=js_d2f1f447ff" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7d7ff544-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"7d7fa9a4-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_5da6b97286" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7d803edc-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id90\"].setSelectedTabIndex(2);\n", + "//# sourceURL=js_5109a26741" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "image/svg+xml": "\n\n\n\n\n\nConcertina\n\n\n\nJane\n\nJane\n\n\n\nSmith\n\nSmith\n\n\n\n", + "text/plain": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Running predicate: Jane (1 ms)\n", + "Running predicate: Smith (3 ms)\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7d9fbb4a-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"7d7f6098-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_1f5429689f" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7da2119c-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_4f2917414e" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7da262e6-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id90_content_0\");\n", + "//# sourceURL=js_f173b187ab" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7da2b480-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"7da262e6-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_422683d8cf" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7da30160-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id90\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_88a0a72155" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7da484c2-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_8cce610921" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7da4d166-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id91_content_1\");\n", + "//# sourceURL=js_500434ab1b" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7da52076-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"7da4d166-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_01989d49a5" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7da56a86-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id91\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_c6de093dbe" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7da6ec94-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"7da484c2-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_c4afad48db" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + " \n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7da8875c-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"7da2119c-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_391493c8ae" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7daa5852-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_069a7f73e6" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7daaa898-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id90_content_1\");\n", + "//# sourceURL=js_f69769db64" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7daaf898-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"7daaa898-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_74fe005722" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7dab5090-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id90\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_60e837fa4d" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7dacc5a6-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_e3e2f4144d" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7dad160a-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id92_content_1\");\n", + "//# sourceURL=js_576e03727b" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7dad629a-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"7dad160a-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_1a936d5250" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7dadb470-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id92\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_d6f397ebd7" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7daf321e-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"7dacc5a6-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_2bff537f60" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + " \n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7db0c5b6-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"7daa5852-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_1ba700038c" + ] + }, + "metadata": {} + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "wEwUjRpkAEoK" + }, + "source": [ + "### Positional and named arguments\n", + "\n", + "Arguments of a predicate can be _positional_ or _named_.\n", + "In the call to the predicate positional arguments are listed separated by coma while named arguments are provide by specifying names.\n", + "\n", + "In the output tables columns for positional arguments are given names `col0`, `col1`, `col2` etc.\n", + "\n", + "Most examples above use named arguments.\n", + "\n", + "See examples of positional and named arguments below." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "5-CmchTfAEAI", + "colab": { + "resources": { + "http://localhost:8080/nbextensions/google.colab/tabbar.css": { + "data": "Lmdvb2ctdGFie3Bvc2l0aW9uOnJlbGF0aXZlO3BhZGRpbmc6NHB4IDhweDtjb2xvcjojMDBjO3RleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7Y3Vyc29yOmRlZmF1bHR9Lmdvb2ctdGFiLWJhci10b3AgLmdvb2ctdGFie21hcmdpbjoxcHggNHB4IDAgMDtib3JkZXItYm90dG9tOjA7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLXRvcDphZnRlciwuZ29vZy10YWItYmFyLWJvdHRvbTphZnRlcntjb250ZW50OiIgIjtkaXNwbGF5OmJsb2NrO2hlaWdodDowO2NsZWFyOmJvdGg7dmlzaWJpbGl0eTpoaWRkZW59Lmdvb2ctdGFiLWJhci1ib3R0b20gLmdvb2ctdGFie21hcmdpbjowIDRweCAxcHggMDtib3JkZXItdG9wOjA7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLXN0YXJ0IC5nb29nLXRhYnttYXJnaW46MCAwIDRweCAxcHg7Ym9yZGVyLXJpZ2h0OjB9Lmdvb2ctdGFiLWJhci1lbmQgLmdvb2ctdGFie21hcmdpbjowIDFweCA0cHggMDtib3JkZXItbGVmdDowfS5nb29nLXRhYi1ob3ZlcntiYWNrZ3JvdW5kOiNlZWV9Lmdvb2ctdGFiLWRpc2FibGVke2NvbG9yOiM2NjZ9Lmdvb2ctdGFiLXNlbGVjdGVke2NvbG9yOiMwMDA7YmFja2dyb3VuZDojZmZmO3RleHQtZGVjb3JhdGlvbjpub25lO2ZvbnQtd2VpZ2h0OmJvbGQ7Ym9yZGVyOjFweCBzb2xpZCAjNmI5MGRhfS5nb29nLXRhYi1iYXItdG9we3BhZGRpbmctdG9wOjVweCFpbXBvcnRhbnQ7cGFkZGluZy1sZWZ0OjVweCFpbXBvcnRhbnQ7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgIzZiOTBkYSFpbXBvcnRhbnR9Lmdvb2ctdGFiLWJhci10b3AgLmdvb2ctdGFiLXNlbGVjdGVke3RvcDoxcHg7bWFyZ2luLXRvcDowO3BhZGRpbmctYm90dG9tOjVweH0uZ29vZy10YWItYmFyLWJvdHRvbSAuZ29vZy10YWItc2VsZWN0ZWR7dG9wOi0xcHg7bWFyZ2luLWJvdHRvbTowO3BhZGRpbmctdG9wOjVweH0uZ29vZy10YWItYmFyLXN0YXJ0IC5nb29nLXRhYi1zZWxlY3RlZHtsZWZ0OjFweDttYXJnaW4tbGVmdDowO3BhZGRpbmctcmlnaHQ6OXB4fS5nb29nLXRhYi1iYXItZW5kIC5nb29nLXRhYi1zZWxlY3RlZHtsZWZ0Oi0xcHg7bWFyZ2luLXJpZ2h0OjA7cGFkZGluZy1sZWZ0OjlweH0uZ29vZy10YWItYmFye21hcmdpbjowO2JvcmRlcjowO3BhZGRpbmc6MDtsaXN0LXN0eWxlOm5vbmU7Y3Vyc29yOmRlZmF1bHQ7b3V0bGluZTpub25lO2JhY2tncm91bmQ6I2ViZWZmOX0uZ29vZy10YWItYmFyLWNsZWFye2NsZWFyOmJvdGg7aGVpZ2h0OjA7b3ZlcmZsb3c6aGlkZGVufS5nb29nLXRhYi1iYXItc3RhcnR7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLWVuZHtmbG9hdDpyaWdodH0qIGh0bWwgLmdvb2ctdGFiLWJhci1zdGFydHttYXJnaW4tcmlnaHQ6LTNweH0qIGh0bWwgLmdvb2ctdGFiLWJhci1lbmR7bWFyZ2luLWxlZnQ6LTNweH1zZW50aW5lbHt9", + "ok": true, + "headers": [ + [ + "content-length", + "1404" + ], + [ + "content-type", + "text/css" + ] + ], + "status": 200, + "status_text": "" + }, + "http://localhost:8080/nbextensions/google.colab/tabbar_main.min.js": { + "data": "Ly8gY2xhbmctZm9ybWF0IG9mZgooZnVuY3Rpb24oKXt2YXIgZyxhYT1mdW5jdGlvbihhKXt2YXIgYj0wO3JldHVybiBmdW5jdGlvbigpe3JldHVybiBiPGEubGVuZ3RoP3tkb25lOiExLHZhbHVlOmFbYisrXX06e2RvbmU6ITB9fX0sYmE9dHlwZW9mIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzPT0iZnVuY3Rpb24iP09iamVjdC5kZWZpbmVQcm9wZXJ0eTpmdW5jdGlvbihhLGIsYyl7aWYoYT09QXJyYXkucHJvdG90eXBlfHxhPT1PYmplY3QucHJvdG90eXBlKXJldHVybiBhO2FbYl09Yy52YWx1ZTtyZXR1cm4gYX0sY2E9ZnVuY3Rpb24oYSl7YT1bIm9iamVjdCI9PXR5cGVvZiBnbG9iYWxUaGlzJiZnbG9iYWxUaGlzLGEsIm9iamVjdCI9PXR5cGVvZiB3aW5kb3cmJndpbmRvdywib2JqZWN0Ij09dHlwZW9mIHNlbGYmJnNlbGYsIm9iamVjdCI9PXR5cGVvZiBnbG9iYWwmJmdsb2JhbF07Zm9yKHZhciBiPTA7YjxhLmxlbmd0aDsrK2Ipe3ZhciBjPWFbYl07aWYoYyYmYy5NYXRoPT1NYXRoKXJldHVybiBjfXRocm93IEVycm9yKCJDYW5ub3QgZmluZCBnbG9iYWwgb2JqZWN0Iik7Cn0sZGE9Y2EodGhpcyksZWE9ZnVuY3Rpb24oYSxiKXtpZihiKWE6e3ZhciBjPWRhO2E9YS5zcGxpdCgiLiIpO2Zvcih2YXIgZD0wO2Q8YS5sZW5ndGgtMTtkKyspe3ZhciBlPWFbZF07aWYoIShlIGluIGMpKWJyZWFrIGE7Yz1jW2VdfWE9YVthLmxlbmd0aC0xXTtkPWNbYV07Yj1iKGQpO2IhPWQmJmIhPW51bGwmJmJhKGMsYSx7Y29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOmJ9KX19OwplYSgiU3ltYm9sIixmdW5jdGlvbihhKXtpZihhKXJldHVybiBhO3ZhciBiPWZ1bmN0aW9uKGYsaCl7dGhpcy5nPWY7YmEodGhpcywiZGVzY3JpcHRpb24iLHtjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6aH0pfTtiLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmd9O3ZhciBjPSJqc2NvbXBfc3ltYm9sXyIrKE1hdGgucmFuZG9tKCkqMUU5Pj4+MCkrIl8iLGQ9MCxlPWZ1bmN0aW9uKGYpe2lmKHRoaXMgaW5zdGFuY2VvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoIlN5bWJvbCBpcyBub3QgYSBjb25zdHJ1Y3RvciIpO3JldHVybiBuZXcgYihjKyhmfHwiIikrIl8iK2QrKyxmKX07cmV0dXJuIGV9KTsKdmFyIGZhPWZ1bmN0aW9uKGEpe3ZhciBiPXR5cGVvZiBTeW1ib2whPSJ1bmRlZmluZWQiJiZTeW1ib2wuaXRlcmF0b3ImJmFbU3ltYm9sLml0ZXJhdG9yXTtpZihiKXJldHVybiBiLmNhbGwoYSk7aWYodHlwZW9mIGEubGVuZ3RoPT0ibnVtYmVyIilyZXR1cm57bmV4dDphYShhKX07dGhyb3cgRXJyb3IoU3RyaW5nKGEpKyIgaXMgbm90IGFuIGl0ZXJhYmxlIG9yIEFycmF5TGlrZSIpO307ZWEoIlN5bWJvbC5kaXNwb3NlIixmdW5jdGlvbihhKXtyZXR1cm4gYT9hOlN5bWJvbCgiU3ltYm9sLmRpc3Bvc2UiKX0pOy8qCgogQ29weXJpZ2h0IFRoZSBDbG9zdXJlIExpYnJhcnkgQXV0aG9ycy4KIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wCiovCnZhciBsPXRoaXN8fHNlbGYsaWE9ZnVuY3Rpb24oYSl7YS5JYT12b2lkIDA7YS5WPWZ1bmN0aW9uKCl7cmV0dXJuIGEuSWE/YS5JYTphLklhPW5ldyBhfX0samE9ZnVuY3Rpb24oYSl7dmFyIGI9dHlwZW9mIGE7cmV0dXJuIGIhPSJvYmplY3QiP2I6YT9BcnJheS5pc0FycmF5KGEpPyJhcnJheSI6YjoibnVsbCJ9LGthPWZ1bmN0aW9uKGEpe3ZhciBiPWphKGEpO3JldHVybiBiPT0iYXJyYXkifHxiPT0ib2JqZWN0IiYmdHlwZW9mIGEubGVuZ3RoPT0ibnVtYmVyIn0sbT1mdW5jdGlvbihhKXt2YXIgYj10eXBlb2YgYTtyZXR1cm4gYj09Im9iamVjdCImJmEhPW51bGx8fGI9PSJmdW5jdGlvbiJ9LG5hPWZ1bmN0aW9uKGEpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYSxsYSkmJmFbbGFdfHwoYVtsYV09KyttYSl9LGxhPSJjbG9zdXJlX3VpZF8iKyhNYXRoLnJhbmRvbSgpKjFFOT4+PjApLG1hPTAsbj1mdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoKXt9Yy5wcm90b3R5cGU9CmIucHJvdG90eXBlO2EubD1iLnByb3RvdHlwZTthLnByb3RvdHlwZT1uZXcgYzthLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1hO2EucWQ9ZnVuY3Rpb24oZCxlLGYpe2Zvcih2YXIgaD1BcnJheShhcmd1bWVudHMubGVuZ3RoLTIpLGs9MjtrPGFyZ3VtZW50cy5sZW5ndGg7aysrKWhbay0yXT1hcmd1bWVudHNba107cmV0dXJuIGIucHJvdG90eXBlW2VdLmFwcGx5KGQsaCl9fTtmdW5jdGlvbiBvYShhLGIpe2lmKEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKUVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsb2EpO2Vsc2V7dmFyIGM9RXJyb3IoKS5zdGFjaztjJiYodGhpcy5zdGFjaz1jKX1hJiYodGhpcy5tZXNzYWdlPVN0cmluZyhhKSk7YiE9PXZvaWQgMCYmKHRoaXMuY2F1c2U9Yil9bihvYSxFcnJvcik7b2EucHJvdG90eXBlLm5hbWU9IkN1c3RvbUVycm9yIjt2YXIgcGE7ZnVuY3Rpb24gcWEoYSxiKXthPWEuc3BsaXQoIiVzIik7Zm9yKHZhciBjPSIiLGQ9YS5sZW5ndGgtMSxlPTA7ZTxkO2UrKyljKz1hW2VdKyhlPGIubGVuZ3RoP2JbZV06IiVzIik7b2EuY2FsbCh0aGlzLGMrYVtkXSl9bihxYSxvYSk7cWEucHJvdG90eXBlLm5hbWU9IkFzc2VydGlvbkVycm9yIjtmdW5jdGlvbiByYShhLGIsYyxkKXt2YXIgZT0iQXNzZXJ0aW9uIGZhaWxlZCI7aWYoYyl7ZSs9IjogIitjO3ZhciBmPWR9ZWxzZSBhJiYoZSs9IjogIithLGY9Yik7dGhyb3cgbmV3IHFhKCIiK2UsZnx8W10pO30KdmFyIHA9ZnVuY3Rpb24oYSxiLGMpe2F8fHJhKCIiLG51bGwsYixBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMikpO3JldHVybiBhfSxzYT1mdW5jdGlvbihhLGIsYyl7bShhKSYmYS5ub2RlVHlwZT09MXx8cmEoIkV4cGVjdGVkIEVsZW1lbnQgYnV0IGdvdCAlczogJXMuIixbamEoYSksYV0sYixBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMikpfSx1YT1mdW5jdGlvbihhLGIsYyxkKXthIGluc3RhbmNlb2YgYnx8cmEoIkV4cGVjdGVkIGluc3RhbmNlb2YgJXMgYnV0IGdvdCAlcy4iLFt0YShiKSx0YShhKV0sYyxBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMykpfTsKZnVuY3Rpb24gdGEoYSl7cmV0dXJuIGEgaW5zdGFuY2VvZiBGdW5jdGlvbj9hLmRpc3BsYXlOYW1lfHxhLm5hbWV8fCJ1bmtub3duIHR5cGUgbmFtZSI6YSBpbnN0YW5jZW9mIE9iamVjdD9hLmNvbnN0cnVjdG9yLmRpc3BsYXlOYW1lfHxhLmNvbnN0cnVjdG9yLm5hbWV8fE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhKTphPT09bnVsbD8ibnVsbCI6dHlwZW9mIGF9O3ZhciB2YT1BcnJheS5wcm90b3R5cGUuaW5kZXhPZj9mdW5jdGlvbihhLGIpe3AoYS5sZW5ndGghPW51bGwpO3JldHVybiBBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKGEsYix2b2lkIDApfTpmdW5jdGlvbihhLGIpe2lmKHR5cGVvZiBhPT09InN0cmluZyIpcmV0dXJuIHR5cGVvZiBiIT09InN0cmluZyJ8fGIubGVuZ3RoIT0xPy0xOmEuaW5kZXhPZihiLDApO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWlmKGMgaW4gYSYmYVtjXT09PWIpcmV0dXJuIGM7cmV0dXJuLTF9LHdhPUFycmF5LnByb3RvdHlwZS5mb3JFYWNoP2Z1bmN0aW9uKGEsYil7cChhLmxlbmd0aCE9bnVsbCk7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChhLGIsdm9pZCAwKX06ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9YS5sZW5ndGgsZD10eXBlb2YgYT09PSJzdHJpbmciP2Euc3BsaXQoIiIpOmEsZT0wO2U8YztlKyspZSBpbiBkJiZiLmNhbGwodm9pZCAwLGRbZV0sZSxhKX07CmZ1bmN0aW9uIHhhKGEsYil7Yj12YShhLGIpO3ZhciBjO2lmKGM9Yj49MClwKGEubGVuZ3RoIT1udWxsKSxBcnJheS5wcm90b3R5cGUuc3BsaWNlLmNhbGwoYSxiLDEpO3JldHVybiBjfWZ1bmN0aW9uIHlhKGEpe3ZhciBiPWEubGVuZ3RoO2lmKGI+MCl7Zm9yKHZhciBjPUFycmF5KGIpLGQ9MDtkPGI7ZCsrKWNbZF09YVtkXTtyZXR1cm4gY31yZXR1cm5bXX1mdW5jdGlvbiB6YShhLGIsYyxkKXtwKGEubGVuZ3RoIT1udWxsKTtBcnJheS5wcm90b3R5cGUuc3BsaWNlLmFwcGx5KGEsQWEoYXJndW1lbnRzLDEpKX1mdW5jdGlvbiBBYShhLGIsYyl7cChhLmxlbmd0aCE9bnVsbCk7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg8PTI/QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYSxiKTpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhLGIsYyl9O2Z1bmN0aW9uIEJhKGEsYixjKXtmb3IodmFyIGQgaW4gYSliLmNhbGwoYyxhW2RdLGQsYSl9ZnVuY3Rpb24gQ2EoYSxiKXtmb3IodmFyIGMgaW4gYSlpZihhW2NdPT1iKXJldHVybiEwO3JldHVybiExfWZ1bmN0aW9uIERhKGEsYixjKXtpZihhIT09bnVsbCYmYiBpbiBhKXRocm93IEVycm9yKCdUaGUgb2JqZWN0IGFscmVhZHkgY29udGFpbnMgdGhlIGtleSAiJytiKyciJyk7YVtiXT1jfWZ1bmN0aW9uIEVhKGEpe3ZhciBiPXt9LGM7Zm9yKGMgaW4gYSliW2FbY11dPWM7cmV0dXJuIGJ9dmFyIEZhPSJjb25zdHJ1Y3RvciBoYXNPd25Qcm9wZXJ0eSBpc1Byb3RvdHlwZU9mIHByb3BlcnR5SXNFbnVtZXJhYmxlIHRvTG9jYWxlU3RyaW5nIHRvU3RyaW5nIHZhbHVlT2YiLnNwbGl0KCIgIik7CmZ1bmN0aW9uIEdhKGEsYil7Zm9yKHZhciBjLGQsZT0xO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspe2Q9YXJndW1lbnRzW2VdO2ZvcihjIGluIGQpYVtjXT1kW2NdO2Zvcih2YXIgZj0wO2Y8RmEubGVuZ3RoO2YrKyljPUZhW2ZdLE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChkLGMpJiYoYVtjXT1kW2NdKX19O3ZhciBIYT1TdHJpbmcucHJvdG90eXBlLnRyaW0/ZnVuY3Rpb24oYSl7cmV0dXJuIGEudHJpbSgpfTpmdW5jdGlvbihhKXtyZXR1cm4vXltcc1x4YTBdKihbXHNcU10qPylbXHNceGEwXSokLy5leGVjKGEpWzFdfTsvKgoKIENvcHlyaWdodCBHb29nbGUgTExDCiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMAoqLwp2YXIgSWE9e307dmFyIEphPWZ1bmN0aW9uKGEpe2lmKElhIT09SWEpdGhyb3cgRXJyb3IoIkJhZCBzZWNyZXQiKTt0aGlzLmc9YX07SmEucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ307bmV3IEphKCJhYm91dDpibGFuayIpO25ldyBKYSgiYWJvdXQ6aW52YWxpZCN6Q2xvc3VyZXoiKTt2YXIgS2E9W10sTGE9ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJBIFVSTCB3aXRoIGNvbnRlbnQgJyIrYSsiJyB3YXMgc2FuaXRpemVkIGF3YXkuIil9O0thLmluZGV4T2YoTGEpPT09LTEmJkthLnB1c2goTGEpO3ZhciBNYSxOYTthOntmb3IodmFyIE9hPVsiQ0xPU1VSRV9GTEFHUyJdLFBhPWwsUWE9MDtRYTxPYS5sZW5ndGg7UWErKylpZihQYT1QYVtPYVtRYV1dLFBhPT1udWxsKXtOYT1udWxsO2JyZWFrIGF9TmE9UGF9dmFyIFJhPU5hJiZOYVs2MTA0MDEzMDFdO01hPVJhIT1udWxsP1JhOiExO2Z1bmN0aW9uIFNhKCl7dmFyIGE9bC5uYXZpZ2F0b3I7cmV0dXJuIGEmJihhPWEudXNlckFnZW50KT9hOiIifXZhciBUYSxVYT1sLm5hdmlnYXRvcjtUYT1VYT9VYS51c2VyQWdlbnREYXRhfHxudWxsOm51bGw7ZnVuY3Rpb24gcihhKXtyZXR1cm4gU2EoKS5pbmRleE9mKGEpIT0tMX07dmFyIFZhPXIoIkVkZ2UiKSx0PXIoIkdlY2tvIikmJiEoU2EoKS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoIndlYmtpdCIpIT0tMSYmIXIoIkVkZ2UiKSkmJiEocigiVHJpZGVudCIpfHxyKCJNU0lFIikpJiYhcigiRWRnZSIpLHU9U2EoKS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoIndlYmtpdCIpIT0tMSYmIXIoIkVkZ2UiKSx2PU1hJiZUYSYmVGEucGxhdGZvcm0/VGEucGxhdGZvcm09PT0ibWFjT1MiOnIoIk1hY2ludG9zaCIpO3ZhciBYYT1mdW5jdGlvbihhLGIpe0JhKGIsZnVuY3Rpb24oYyxkKXtkPT0ic3R5bGUiP2Euc3R5bGUuY3NzVGV4dD1jOmQ9PSJjbGFzcyI/YS5jbGFzc05hbWU9YzpkPT0iZm9yIj9hLmh0bWxGb3I9YzpXYS5oYXNPd25Qcm9wZXJ0eShkKT9hLnNldEF0dHJpYnV0ZShXYVtkXSxjKTpkLmxhc3RJbmRleE9mKCJhcmlhLSIsMCk9PTB8fGQubGFzdEluZGV4T2YoImRhdGEtIiwwKT09MD9hLnNldEF0dHJpYnV0ZShkLGMpOmFbZF09Y30pfSxXYT17Y2VsbHBhZGRpbmc6ImNlbGxQYWRkaW5nIixjZWxsc3BhY2luZzoiY2VsbFNwYWNpbmciLGNvbHNwYW46ImNvbFNwYW4iLGZyYW1lYm9yZGVyOiJmcmFtZUJvcmRlciIsaGVpZ2h0OiJoZWlnaHQiLG1heGxlbmd0aDoibWF4TGVuZ3RoIixub25jZToibm9uY2UiLHJvbGU6InJvbGUiLHJvd3NwYW46InJvd1NwYW4iLHR5cGU6InR5cGUiLHVzZW1hcDoidXNlTWFwIix2YWxpZ246InZBbGlnbiIsd2lkdGg6IndpZHRoIn0sWWE9ZnVuY3Rpb24oYSwKYixjKXtmdW5jdGlvbiBkKGspe2smJmIuYXBwZW5kQ2hpbGQodHlwZW9mIGs9PT0ic3RyaW5nIj9hLmNyZWF0ZVRleHROb2RlKGspOmspfWZvcih2YXIgZT0yO2U8Yy5sZW5ndGg7ZSsrKXt2YXIgZj1jW2VdO2lmKCFrYShmKXx8bShmKSYmZi5ub2RlVHlwZT4wKWQoZik7ZWxzZXthOntpZihmJiZ0eXBlb2YgZi5sZW5ndGg9PSJudW1iZXIiKXtpZihtKGYpKXt2YXIgaD10eXBlb2YgZi5pdGVtPT0iZnVuY3Rpb24ifHx0eXBlb2YgZi5pdGVtPT0ic3RyaW5nIjticmVhayBhfWlmKHR5cGVvZiBmPT09ImZ1bmN0aW9uIil7aD10eXBlb2YgZi5pdGVtPT0iZnVuY3Rpb24iO2JyZWFrIGF9fWg9ITF9d2EoaD95YShmKTpmLGQpfX19LFphPWZ1bmN0aW9uKGEsYil7Yj1TdHJpbmcoYik7YS5jb250ZW50VHlwZT09PSJhcHBsaWNhdGlvbi94aHRtbCt4bWwiJiYoYj1iLnRvTG93ZXJDYXNlKCkpO3JldHVybiBhLmNyZWF0ZUVsZW1lbnQoYil9LCRhPWZ1bmN0aW9uKGEpe2EmJmEucGFyZW50Tm9kZSYmCmEucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhKX0sYWI9ZnVuY3Rpb24oYSxiKXtpZighYXx8IWIpcmV0dXJuITE7aWYoYS5jb250YWlucyYmYi5ub2RlVHlwZT09MSlyZXR1cm4gYT09Ynx8YS5jb250YWlucyhiKTtpZih0eXBlb2YgYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiE9InVuZGVmaW5lZCIpcmV0dXJuIGE9PWJ8fCEhKGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24oYikmMTYpO2Zvcig7YiYmYSE9YjspYj1iLnBhcmVudE5vZGU7cmV0dXJuIGI9PWF9LGJiPWZ1bmN0aW9uKGEpe3AoYSwiTm9kZSBjYW5ub3QgYmUgbnVsbCBvciB1bmRlZmluZWQuIik7cmV0dXJuIGEubm9kZVR5cGU9PTk/YTphLm93bmVyRG9jdW1lbnR8fGEuZG9jdW1lbnR9LGNiPWZ1bmN0aW9uKGEsYil7Yj9hLnRhYkluZGV4PTA6KGEudGFiSW5kZXg9LTEsYS5yZW1vdmVBdHRyaWJ1dGUoInRhYkluZGV4IikpfSxkYj1mdW5jdGlvbihhKXtyZXR1cm4gYS5oYXNBdHRyaWJ1dGUoInRhYmluZGV4Iil9LGViPQpmdW5jdGlvbihhKXthPWEudGFiSW5kZXg7cmV0dXJuIHR5cGVvZiBhPT09Im51bWJlciImJmE+PTAmJmE8MzI3Njh9LGZiPWZ1bmN0aW9uKGEpe3RoaXMuZz1hfHxsLmRvY3VtZW50fHxkb2N1bWVudH07ZmIucHJvdG90eXBlLmk9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nO3JldHVybiB0eXBlb2YgYT09PSJzdHJpbmciP2IuZ2V0RWxlbWVudEJ5SWQoYSk6YX07ZmIucHJvdG90eXBlLmg9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXMuZyxlPWFyZ3VtZW50cyxmPWVbMV0saD1aYShkLFN0cmluZyhlWzBdKSk7ZiYmKHR5cGVvZiBmPT09InN0cmluZyI/aC5jbGFzc05hbWU9ZjpBcnJheS5pc0FycmF5KGYpP2guY2xhc3NOYW1lPWYuam9pbigiICIpOlhhKGgsZikpO2UubGVuZ3RoPjImJllhKGQsaCxlKTtyZXR1cm4gaH07dmFyIHc9ZnVuY3Rpb24oKXt0aGlzLmJhPXRoaXMuYmE7dGhpcy5rYT10aGlzLmthfTt3LnByb3RvdHlwZS5iYT0hMTt3LnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7dGhpcy5iYXx8KHRoaXMuYmE9ITAsdGhpcy5DKCkpfTt3LnByb3RvdHlwZVtTeW1ib2wuZGlzcG9zZV09ZnVuY3Rpb24oKXt0aGlzLmRpc3Bvc2UoKX07dy5wcm90b3R5cGUuQz1mdW5jdGlvbigpe2lmKHRoaXMua2EpZm9yKDt0aGlzLmthLmxlbmd0aDspdGhpcy5rYS5zaGlmdCgpKCl9O3ZhciB5PWZ1bmN0aW9uKGEsYil7dGhpcy50eXBlPWE7dGhpcy51PXRoaXMudGFyZ2V0PWI7dGhpcy5kZWZhdWx0UHJldmVudGVkPXRoaXMuQT0hMX07eS5wcm90b3R5cGUudj1mdW5jdGlvbigpe3RoaXMuQT0hMH07eS5wcm90b3R5cGUuaj1mdW5jdGlvbigpe3RoaXMuZGVmYXVsdFByZXZlbnRlZD0hMH07dmFyIGdiPWZ1bmN0aW9uKCl7aWYoIWwuYWRkRXZlbnRMaXN0ZW5lcnx8IU9iamVjdC5kZWZpbmVQcm9wZXJ0eSlyZXR1cm4hMTt2YXIgYT0hMSxiPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwicGFzc2l2ZSIse2dldDpmdW5jdGlvbigpe2E9ITB9fSk7dHJ5e3ZhciBjPWZ1bmN0aW9uKCl7fTtsLmFkZEV2ZW50TGlzdGVuZXIoInRlc3QiLGMsYik7bC5yZW1vdmVFdmVudExpc3RlbmVyKCJ0ZXN0IixjLGIpfWNhdGNoKGQpe31yZXR1cm4gYX0oKTt2YXIgej1mdW5jdGlvbihhLGIpe3kuY2FsbCh0aGlzLGE/YS50eXBlOiIiKTt0aGlzLnJlbGF0ZWRUYXJnZXQ9dGhpcy51PXRoaXMudGFyZ2V0PW51bGw7dGhpcy5idXR0b249dGhpcy5zY3JlZW5ZPXRoaXMuc2NyZWVuWD10aGlzLmNsaWVudFk9dGhpcy5jbGllbnRYPTA7dGhpcy5rZXk9IiI7dGhpcy5nPTA7dGhpcy5tZXRhS2V5PXRoaXMuc2hpZnRLZXk9dGhpcy5hbHRLZXk9dGhpcy5jdHJsS2V5PSExO3RoaXMuc3RhdGU9bnVsbDt0aGlzLkc9ITE7dGhpcy5wb2ludGVySWQ9MDt0aGlzLnBvaW50ZXJUeXBlPSIiO3RoaXMudGltZVN0YW1wPTA7dGhpcy5oPW51bGw7aWYoYSl7dmFyIGM9dGhpcy50eXBlPWEudHlwZSxkPWEuY2hhbmdlZFRvdWNoZXMmJmEuY2hhbmdlZFRvdWNoZXMubGVuZ3RoP2EuY2hhbmdlZFRvdWNoZXNbMF06bnVsbDt0aGlzLnRhcmdldD1hLnRhcmdldHx8YS5zcmNFbGVtZW50O3RoaXMudT1iO2I9YS5yZWxhdGVkVGFyZ2V0O2J8fChjPT0ibW91c2VvdmVyIj8KYj1hLmZyb21FbGVtZW50OmM9PSJtb3VzZW91dCImJihiPWEudG9FbGVtZW50KSk7dGhpcy5yZWxhdGVkVGFyZ2V0PWI7ZD8odGhpcy5jbGllbnRYPWQuY2xpZW50WCE9PXZvaWQgMD9kLmNsaWVudFg6ZC5wYWdlWCx0aGlzLmNsaWVudFk9ZC5jbGllbnRZIT09dm9pZCAwP2QuY2xpZW50WTpkLnBhZ2VZLHRoaXMuc2NyZWVuWD1kLnNjcmVlblh8fDAsdGhpcy5zY3JlZW5ZPWQuc2NyZWVuWXx8MCk6KHRoaXMuY2xpZW50WD1hLmNsaWVudFghPT12b2lkIDA/YS5jbGllbnRYOmEucGFnZVgsdGhpcy5jbGllbnRZPWEuY2xpZW50WSE9PXZvaWQgMD9hLmNsaWVudFk6YS5wYWdlWSx0aGlzLnNjcmVlblg9YS5zY3JlZW5YfHwwLHRoaXMuc2NyZWVuWT1hLnNjcmVlbll8fDApO3RoaXMuYnV0dG9uPWEuYnV0dG9uO3RoaXMuZz1hLmtleUNvZGV8fDA7dGhpcy5rZXk9YS5rZXl8fCIiO3RoaXMuY3RybEtleT1hLmN0cmxLZXk7dGhpcy5hbHRLZXk9YS5hbHRLZXk7dGhpcy5zaGlmdEtleT1hLnNoaWZ0S2V5Owp0aGlzLm1ldGFLZXk9YS5tZXRhS2V5O3RoaXMuRz12P2EubWV0YUtleTphLmN0cmxLZXk7dGhpcy5wb2ludGVySWQ9YS5wb2ludGVySWR8fDA7dGhpcy5wb2ludGVyVHlwZT1hLnBvaW50ZXJUeXBlO3RoaXMuc3RhdGU9YS5zdGF0ZTt0aGlzLnRpbWVTdGFtcD1hLnRpbWVTdGFtcDt0aGlzLmg9YTthLmRlZmF1bHRQcmV2ZW50ZWQmJnoubC5qLmNhbGwodGhpcyl9fTtuKHoseSk7ei5wcm90b3R5cGUudj1mdW5jdGlvbigpe3oubC52LmNhbGwodGhpcyk7dGhpcy5oLnN0b3BQcm9wYWdhdGlvbj90aGlzLmguc3RvcFByb3BhZ2F0aW9uKCk6dGhpcy5oLmNhbmNlbEJ1YmJsZT0hMH07ei5wcm90b3R5cGUuaj1mdW5jdGlvbigpe3oubC5qLmNhbGwodGhpcyk7dmFyIGE9dGhpcy5oO2EucHJldmVudERlZmF1bHQ/YS5wcmV2ZW50RGVmYXVsdCgpOmEucmV0dXJuVmFsdWU9ITF9O3ZhciBoYj0iY2xvc3VyZV9saXN0ZW5hYmxlXyIrKE1hdGgucmFuZG9tKCkqMUU2fDApLGliPWZ1bmN0aW9uKGEpe3JldHVybiEoIWF8fCFhW2hiXSl9O3ZhciBqYj0wO3ZhciBrYj1mdW5jdGlvbihhLGIsYyxkLGUpe3RoaXMubGlzdGVuZXI9YTt0aGlzLnByb3h5PW51bGw7dGhpcy5zcmM9Yjt0aGlzLnR5cGU9Yzt0aGlzLmNhcHR1cmU9ISFkO3RoaXMucGE9ZTt0aGlzLmtleT0rK2piO3RoaXMuamE9dGhpcy5vYT0hMX0sbGI9ZnVuY3Rpb24oYSl7YS5qYT0hMDthLmxpc3RlbmVyPW51bGw7YS5wcm94eT1udWxsO2Euc3JjPW51bGw7YS5wYT1udWxsfTt2YXIgbWI9ZnVuY3Rpb24oYSl7dGhpcy5zcmM9YTt0aGlzLmc9e307dGhpcy5oPTB9O21iLnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZj1hLnRvU3RyaW5nKCk7YT10aGlzLmdbZl07YXx8KGE9dGhpcy5nW2ZdPVtdLHRoaXMuaCsrKTt2YXIgaD1uYihhLGIsZCxlKTtoPi0xPyhiPWFbaF0sY3x8KGIub2E9ITEpKTooYj1uZXcga2IoYix0aGlzLnNyYyxmLCEhZCxlKSxiLm9hPWMsYS5wdXNoKGIpKTtyZXR1cm4gYn07CnZhciBvYj1mdW5jdGlvbihhLGIpe3ZhciBjPWIudHlwZTtjIGluIGEuZyYmeGEoYS5nW2NdLGIpJiYobGIoYiksYS5nW2NdLmxlbmd0aD09MCYmKGRlbGV0ZSBhLmdbY10sYS5oLS0pKX0scGI9ZnVuY3Rpb24oYSxiLGMsZCxlKXthPWEuZ1tiLnRvU3RyaW5nKCldO2I9LTE7YSYmKGI9bmIoYSxjLGQsZSkpO3JldHVybiBiPi0xP2FbYl06bnVsbH0sbmI9ZnVuY3Rpb24oYSxiLGMsZCl7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDsrK2Upe3ZhciBmPWFbZV07aWYoIWYuamEmJmYubGlzdGVuZXI9PWImJmYuY2FwdHVyZT09ISFjJiZmLnBhPT1kKXJldHVybiBlfXJldHVybi0xfTt2YXIgcWI9ImNsb3N1cmVfbG1fIisoTWF0aC5yYW5kb20oKSoxRTZ8MCkscmI9e30sc2I9MCx1Yj1mdW5jdGlvbihhLGIsYyxkLGUpe2lmKGQmJmQub25jZSlyZXR1cm4gdGIoYSxiLGMsZCxlKTtpZihBcnJheS5pc0FycmF5KGIpKXtmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKyl1YihhLGJbZl0sYyxkLGUpO3JldHVybiBudWxsfWM9dmIoYyk7cmV0dXJuIGliKGEpP3diKGEsYixjLG0oZCk/ISFkLmNhcHR1cmU6ISFkLGUpOnhiKGEsYixjLCExLGQsZSl9LHhiPWZ1bmN0aW9uKGEsYixjLGQsZSxmKXtpZighYil0aHJvdyBFcnJvcigiSW52YWxpZCBldmVudCB0eXBlIik7dmFyIGg9bShlKT8hIWUuY2FwdHVyZTohIWUsaz15YihhKTtrfHwoYVtxYl09az1uZXcgbWIoYSkpO2M9ay5hZGQoYixjLGQsaCxmKTtpZihjLnByb3h5KXJldHVybiBjO2Q9emIoKTtjLnByb3h5PWQ7ZC5zcmM9YTtkLmxpc3RlbmVyPWM7aWYoYS5hZGRFdmVudExpc3RlbmVyKWdifHwoZT1oKSxlPT09dm9pZCAwJiYKKGU9ITEpLGEuYWRkRXZlbnRMaXN0ZW5lcihiLnRvU3RyaW5nKCksZCxlKTtlbHNlIGlmKGEuYXR0YWNoRXZlbnQpYS5hdHRhY2hFdmVudChBYihiLnRvU3RyaW5nKCkpLGQpO2Vsc2UgaWYoYS5hZGRMaXN0ZW5lciYmYS5yZW1vdmVMaXN0ZW5lcilwKGI9PT0iY2hhbmdlIiwiTWVkaWFRdWVyeUxpc3Qgb25seSBoYXMgYSBjaGFuZ2UgZXZlbnQiKSxhLmFkZExpc3RlbmVyKGQpO2Vsc2UgdGhyb3cgRXJyb3IoImFkZEV2ZW50TGlzdGVuZXIgYW5kIGF0dGFjaEV2ZW50IGFyZSB1bmF2YWlsYWJsZS4iKTtzYisrO3JldHVybiBjfSx6Yj1mdW5jdGlvbigpe3ZhciBhPUJiLGI9ZnVuY3Rpb24oYyl7cmV0dXJuIGEuY2FsbChiLnNyYyxiLmxpc3RlbmVyLGMpfTtyZXR1cm4gYn0sdGI9ZnVuY3Rpb24oYSxiLGMsZCxlKXtpZihBcnJheS5pc0FycmF5KGIpKXtmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKyl0YihhLGJbZl0sYyxkLGUpO3JldHVybiBudWxsfWM9dmIoYyk7cmV0dXJuIGliKGEpPwphLkEuYWRkKFN0cmluZyhiKSxjLCEwLG0oZCk/ISFkLmNhcHR1cmU6ISFkLGUpOnhiKGEsYixjLCEwLGQsZSl9LENiPWZ1bmN0aW9uKGEsYixjLGQsZSl7aWYoQXJyYXkuaXNBcnJheShiKSlmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKylDYihhLGJbZl0sYyxkLGUpO2Vsc2UgZD1tKGQpPyEhZC5jYXB0dXJlOiEhZCxjPXZiKGMpLGliKGEpPyhhPWEuQSxiPVN0cmluZyhiKS50b1N0cmluZygpLGIgaW4gYS5nJiYoZj1hLmdbYl0sYz1uYihmLGMsZCxlKSxjPi0xJiYobGIoZltjXSkscChmLmxlbmd0aCE9bnVsbCksQXJyYXkucHJvdG90eXBlLnNwbGljZS5jYWxsKGYsYywxKSxmLmxlbmd0aD09MCYmKGRlbGV0ZSBhLmdbYl0sYS5oLS0pKSkpOmEmJihhPXliKGEpKSYmKGM9cGIoYSxiLGMsZCxlKSkmJkEoYyl9LEE9ZnVuY3Rpb24oYSl7aWYodHlwZW9mIGEhPT0ibnVtYmVyIiYmYSYmIWEuamEpe3ZhciBiPWEuc3JjO2lmKGliKGIpKW9iKGIuQSxhKTtlbHNle3ZhciBjPWEudHlwZSwKZD1hLnByb3h5O2IucmVtb3ZlRXZlbnRMaXN0ZW5lcj9iLnJlbW92ZUV2ZW50TGlzdGVuZXIoYyxkLGEuY2FwdHVyZSk6Yi5kZXRhY2hFdmVudD9iLmRldGFjaEV2ZW50KEFiKGMpLGQpOmIuYWRkTGlzdGVuZXImJmIucmVtb3ZlTGlzdGVuZXImJmIucmVtb3ZlTGlzdGVuZXIoZCk7c2ItLTsoYz15YihiKSk/KG9iKGMsYSksYy5oPT0wJiYoYy5zcmM9bnVsbCxiW3FiXT1udWxsKSk6bGIoYSl9fX0sQWI9ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW4gcmI/cmJbYV06cmJbYV09Im9uIithfSxCYj1mdW5jdGlvbihhLGIpe2lmKGEuamEpYT0hMDtlbHNle2I9bmV3IHooYix0aGlzKTt2YXIgYz1hLmxpc3RlbmVyLGQ9YS5wYXx8YS5zcmM7YS5vYSYmQShhKTthPWMuY2FsbChkLGIpfXJldHVybiBhfSx5Yj1mdW5jdGlvbihhKXthPWFbcWJdO3JldHVybiBhIGluc3RhbmNlb2YgbWI/YTpudWxsfSxEYj0iX19jbG9zdXJlX2V2ZW50c19mbl8iKyhNYXRoLnJhbmRvbSgpKjFFOT4+PjApLHZiPWZ1bmN0aW9uKGEpe3AoYSwKIkxpc3RlbmVyIGNhbiBub3QgYmUgbnVsbC4iKTtpZih0eXBlb2YgYT09PSJmdW5jdGlvbiIpcmV0dXJuIGE7cChhLmhhbmRsZUV2ZW50LCJBbiBvYmplY3QgbGlzdGVuZXIgbXVzdCBoYXZlIGhhbmRsZUV2ZW50IG1ldGhvZC4iKTthW0RiXXx8KGFbRGJdPWZ1bmN0aW9uKGIpe3JldHVybiBhLmhhbmRsZUV2ZW50KGIpfSk7cmV0dXJuIGFbRGJdfTt2YXIgRWI9ZnVuY3Rpb24oYSl7dy5jYWxsKHRoaXMpO3RoaXMuaD1hO3RoaXMuZz17fX07bihFYix3KTsKdmFyIEZiPVtdLEI9ZnVuY3Rpb24oYSxiLGMsZCl7QXJyYXkuaXNBcnJheShjKXx8KGMmJihGYlswXT1jLnRvU3RyaW5nKCkpLGM9RmIpO2Zvcih2YXIgZT0wO2U8Yy5sZW5ndGg7ZSsrKXt2YXIgZj11YihiLGNbZV0sZHx8YS5oYW5kbGVFdmVudCwhMSxhLmh8fGEpO2lmKCFmKWJyZWFrO2EuZ1tmLmtleV09Zn1yZXR1cm4gYX0sQz1mdW5jdGlvbihhLGIsYyxkLGUsZil7aWYoQXJyYXkuaXNBcnJheShjKSlmb3IodmFyIGg9MDtoPGMubGVuZ3RoO2grKylDKGEsYixjW2hdLGQsZSxmKTtlbHNlIGQ9ZHx8YS5oYW5kbGVFdmVudCxlPW0oZSk/ISFlLmNhcHR1cmU6ISFlLGY9Znx8YS5ofHxhLGQ9dmIoZCksZT0hIWUsYz1pYihiKT9wYihiLkEsU3RyaW5nKGMpLGQsZSxmKTpiPyhiPXliKGIpKT9wYihiLGMsZCxlLGYpOm51bGw6bnVsbCxjJiYoQShjKSxkZWxldGUgYS5nW2Mua2V5XSk7cmV0dXJuIGF9LEdiPWZ1bmN0aW9uKGEpe0JhKGEuZyxmdW5jdGlvbihiLGMpe3RoaXMuZy5oYXNPd25Qcm9wZXJ0eShjKSYmCkEoYil9LGEpO2EuZz17fX07RWIucHJvdG90eXBlLkM9ZnVuY3Rpb24oKXtFYi5sLkMuY2FsbCh0aGlzKTtHYih0aGlzKX07RWIucHJvdG90eXBlLmhhbmRsZUV2ZW50PWZ1bmN0aW9uKCl7dGhyb3cgRXJyb3IoIkV2ZW50SGFuZGxlci5oYW5kbGVFdmVudCBub3QgaW1wbGVtZW50ZWQiKTt9O3ZhciBEPWZ1bmN0aW9uKCl7dy5jYWxsKHRoaXMpO3RoaXMuQT1uZXcgbWIodGhpcyk7dGhpcy5ZYT10aGlzO3RoaXMubGE9bnVsbH07bihELHcpO0QucHJvdG90eXBlW2hiXT0hMDtELnByb3RvdHlwZS5BYT1mdW5jdGlvbihhKXt0aGlzLmxhPWF9O0QucHJvdG90eXBlLnJlbW92ZUV2ZW50TGlzdGVuZXI9ZnVuY3Rpb24oYSxiLGMsZCl7Q2IodGhpcyxhLGIsYyxkKX07CnZhciBFPWZ1bmN0aW9uKGEsYil7SGIoYSk7dmFyIGM9YS5sYTtpZihjKXt2YXIgZD1bXTtmb3IodmFyIGU9MTtjO2M9Yy5sYSlkLnB1c2goYykscCgrK2U8MUUzLCJpbmZpbml0ZSBsb29wIil9YT1hLllhO2M9Yi50eXBlfHxiO3R5cGVvZiBiPT09InN0cmluZyI/Yj1uZXcgeShiLGEpOmIgaW5zdGFuY2VvZiB5P2IudGFyZ2V0PWIudGFyZ2V0fHxhOihlPWIsYj1uZXcgeShjLGEpLEdhKGIsZSkpO2U9ITA7dmFyIGY7aWYoZClmb3IoZj1kLmxlbmd0aC0xOyFiLkEmJmY+PTA7Zi0tKXt2YXIgaD1iLnU9ZFtmXTtlPUliKGgsYywhMCxiKSYmZX1iLkF8fChoPWIudT1hLGU9SWIoaCxjLCEwLGIpJiZlLGIuQXx8KGU9SWIoaCxjLCExLGIpJiZlKSk7aWYoZClmb3IoZj0wOyFiLkEmJmY8ZC5sZW5ndGg7ZisrKWg9Yi51PWRbZl0sZT1JYihoLGMsITEsYikmJmU7cmV0dXJuIGV9OwpELnByb3RvdHlwZS5DPWZ1bmN0aW9uKCl7RC5sLkMuY2FsbCh0aGlzKTtpZih0aGlzLkEpe3ZhciBhPXRoaXMuQSxiPTAsYztmb3IoYyBpbiBhLmcpe2Zvcih2YXIgZD1hLmdbY10sZT0wO2U8ZC5sZW5ndGg7ZSsrKSsrYixsYihkW2VdKTtkZWxldGUgYS5nW2NdO2EuaC0tfX10aGlzLmxhPW51bGx9O3ZhciB3Yj1mdW5jdGlvbihhLGIsYyxkLGUpe0hiKGEpO3JldHVybiBhLkEuYWRkKFN0cmluZyhiKSxjLCExLGQsZSl9LEliPWZ1bmN0aW9uKGEsYixjLGQpe2I9YS5BLmdbU3RyaW5nKGIpXTtpZighYilyZXR1cm4hMDtiPWIuY29uY2F0KCk7Zm9yKHZhciBlPSEwLGY9MDtmPGIubGVuZ3RoOysrZil7dmFyIGg9YltmXTtpZihoJiYhaC5qYSYmaC5jYXB0dXJlPT1jKXt2YXIgaz1oLmxpc3RlbmVyLHE9aC5wYXx8aC5zcmM7aC5vYSYmb2IoYS5BLGgpO2U9ay5jYWxsKHEsZCkhPT0hMSYmZX19cmV0dXJuIGUmJiFkLmRlZmF1bHRQcmV2ZW50ZWR9LEhiPWZ1bmN0aW9uKGEpe3AoYS5BLCJFdmVudCB0YXJnZXQgaXMgbm90IGluaXRpYWxpemVkLiBEaWQgeW91IGNhbGwgdGhlIHN1cGVyY2xhc3MgKGdvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0KSBjb25zdHJ1Y3Rvcj8iKX07dmFyIEpiPXQ/Ik1velVzZXJTZWxlY3QiOnV8fFZhPyJXZWJraXRVc2VyU2VsZWN0IjpudWxsLEtiPWZ1bmN0aW9uKGEsYil7Yj1iP251bGw6YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpO2lmKEpiJiYoYS5zdHlsZSYmKGEuc3R5bGVbSmJdPSJub25lIiksYikpZm9yKHZhciBjPTA7YT1iW2NdO2MrKylhLnN0eWxlJiYoYS5zdHlsZVtKYl09Im5vbmUiKX07dmFyIExiPWZ1bmN0aW9uKCl7fTtpYShMYik7TGIucHJvdG90eXBlLmc9MDt2YXIgRj1mdW5jdGlvbihhKXtELmNhbGwodGhpcyk7dGhpcy5HPWF8fHBhfHwocGE9bmV3IGZiKTt0aGlzLnphPU1iO3RoaXMuWT1udWxsO3RoaXMucz0hMTt0aGlzLmc9bnVsbDt0aGlzLk09dm9pZCAwO3RoaXMudT10aGlzLmo9dGhpcy5oPW51bGw7dGhpcy5TYT0hMX07bihGLEQpO0YucHJvdG90eXBlLlphPUxiLlYoKTsKdmFyIE1iPW51bGwsTmI9ZnVuY3Rpb24oYSxiKXtzd2l0Y2goYSl7Y2FzZSAxOnJldHVybiBiPyJkaXNhYmxlIjoiZW5hYmxlIjtjYXNlIDI6cmV0dXJuIGI/ImhpZ2hsaWdodCI6InVuaGlnaGxpZ2h0IjtjYXNlIDQ6cmV0dXJuIGI/ImFjdGl2YXRlIjoiZGVhY3RpdmF0ZSI7Y2FzZSA4OnJldHVybiBiPyJzZWxlY3QiOiJ1bnNlbGVjdCI7Y2FzZSAxNjpyZXR1cm4gYj8iY2hlY2siOiJ1bmNoZWNrIjtjYXNlIDMyOnJldHVybiBiPyJmb2N1cyI6ImJsdXIiO2Nhc2UgNjQ6cmV0dXJuIGI/Im9wZW4iOiJjbG9zZSJ9dGhyb3cgRXJyb3IoIkludmFsaWQgY29tcG9uZW50IHN0YXRlIik7fSxPYj1mdW5jdGlvbihhKXtyZXR1cm4gYS5ZfHwoYS5ZPSI6IisoYS5aYS5nKyspLnRvU3RyaW5nKDM2KSl9LFBiPWZ1bmN0aW9uKGEsYil7aWYoYS5oJiZhLmgudSl7dmFyIGM9YS5oLnUsZD1hLlk7ZCBpbiBjJiZkZWxldGUgY1tkXTtEYShhLmgudSxiLGEpfWEuWT1ifTtGLnByb3RvdHlwZS5pPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ307CnZhciBRYj1mdW5jdGlvbihhKXthLk18fChhLk09bmV3IEViKGEpKTtyZXR1cm4gcChhLk0pfTtGLnByb3RvdHlwZS5BYT1mdW5jdGlvbihhKXtpZih0aGlzLmgmJnRoaXMuaCE9YSl0aHJvdyBFcnJvcigiTWV0aG9kIG5vdCBzdXBwb3J0ZWQiKTtGLmwuQWEuY2FsbCh0aGlzLGEpfTtGLnByb3RvdHlwZS5tYT1mdW5jdGlvbigpe3RoaXMuZz1aYSh0aGlzLkcuZywiRElWIil9O0YucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbihhKXtSYih0aGlzLGEpfTsKdmFyIFJiPWZ1bmN0aW9uKGEsYixjKXtpZihhLnMpdGhyb3cgRXJyb3IoIkNvbXBvbmVudCBhbHJlYWR5IHJlbmRlcmVkIik7YS5nfHxhLm1hKCk7Yj9iLmluc2VydEJlZm9yZShhLmcsY3x8bnVsbCk6YS5HLmcuYm9keS5hcHBlbmRDaGlsZChhLmcpO2EuaCYmIWEuaC5zfHxhLkkoKX0sU2I9ZnVuY3Rpb24oYSxiKXtpZihhLnMpdGhyb3cgRXJyb3IoIkNvbXBvbmVudCBhbHJlYWR5IHJlbmRlcmVkIik7aWYoYiYmYS53YShiKSl7YS5TYT0hMDt2YXIgYz1iYihiKTthLkcmJmEuRy5nPT1jfHwoYS5HPWI/bmV3IGZiKGJiKGIpKTpwYXx8KHBhPW5ldyBmYikpO2EuRWEoYik7YS5JKCl9ZWxzZSB0aHJvdyBFcnJvcigiSW52YWxpZCBlbGVtZW50IHRvIGRlY29yYXRlIik7fTtnPUYucHJvdG90eXBlO2cud2E9ZnVuY3Rpb24oKXtyZXR1cm4hMH07Zy5FYT1mdW5jdGlvbihhKXt0aGlzLmc9YX07CmcuST1mdW5jdGlvbigpe3RoaXMucz0hMDtUYih0aGlzLGZ1bmN0aW9uKGEpeyFhLnMmJmEuaSgpJiZhLkkoKX0pfTtnLlU9ZnVuY3Rpb24oKXtUYih0aGlzLGZ1bmN0aW9uKGEpe2EucyYmYS5VKCl9KTt0aGlzLk0mJkdiKHRoaXMuTSk7dGhpcy5zPSExfTtnLkM9ZnVuY3Rpb24oKXt0aGlzLnMmJnRoaXMuVSgpO3RoaXMuTSYmKHRoaXMuTS5kaXNwb3NlKCksZGVsZXRlIHRoaXMuTSk7VGIodGhpcyxmdW5jdGlvbihhKXthLmRpc3Bvc2UoKX0pOyF0aGlzLlNhJiZ0aGlzLmcmJiRhKHRoaXMuZyk7dGhpcy5oPXRoaXMuZz10aGlzLnU9dGhpcy5qPW51bGw7Ri5sLkMuY2FsbCh0aGlzKX07Zy5CYT1mdW5jdGlvbihhLGIpe3RoaXMuQ2EoYSxIKHRoaXMpLGIpfTsKZy5DYT1mdW5jdGlvbihhLGIsYyl7cCghIWEsIlByb3ZpZGVkIGVsZW1lbnQgbXVzdCBub3QgYmUgbnVsbC4iKTtpZihhLnMmJihjfHwhdGhpcy5zKSl0aHJvdyBFcnJvcigiQ29tcG9uZW50IGFscmVhZHkgcmVuZGVyZWQiKTtpZihiPDB8fGI+SCh0aGlzKSl0aHJvdyBFcnJvcigiQ2hpbGQgY29tcG9uZW50IGluZGV4IG91dCBvZiBib3VuZHMiKTt0aGlzLnUmJnRoaXMuanx8KHRoaXMudT17fSx0aGlzLmo9W10pO2lmKGEuaD09dGhpcyl7dmFyIGQ9dGhpcy51LGU9T2IoYSk7ZFtlXT1hO3hhKHRoaXMuaixhKX1lbHNlIERhKHRoaXMudSxPYihhKSxhKTtpZihhPT10aGlzKXRocm93IEVycm9yKCJVbmFibGUgdG8gc2V0IHBhcmVudCBjb21wb25lbnQiKTtpZihkPXRoaXMmJmEuaCYmYS5ZKWU9YS5oLGQ9YS5ZLGUudSYmZD8oZT1lLnUsZD0oZSE9PW51bGwmJmQgaW4gZT9lW2RdOnZvaWQgMCl8fG51bGwpOmQ9bnVsbDtpZihkJiZhLmghPXRoaXMpdGhyb3cgRXJyb3IoIlVuYWJsZSB0byBzZXQgcGFyZW50IGNvbXBvbmVudCIpOwphLmg9dGhpcztGLmwuQWEuY2FsbChhLHRoaXMpO3phKHRoaXMuaixiLDAsYSk7YS5zJiZ0aGlzLnMmJmEuaD09dGhpcz8oYz10aGlzLm5hKCksKGMuY2hpbGROb2Rlc1tiXXx8bnVsbCkhPWEuaSgpJiYoYS5pKCkucGFyZW50RWxlbWVudD09YyYmYy5yZW1vdmVDaGlsZChhLmkoKSksYj1jLmNoaWxkTm9kZXNbYl18fG51bGwsYy5pbnNlcnRCZWZvcmUoYS5pKCksYikpKTpjPyh0aGlzLmd8fHRoaXMubWEoKSxiPUkodGhpcyxiKzEpLFJiKGEsdGhpcy5uYSgpLGI/Yi5nOm51bGwpKTp0aGlzLnMmJiFhLnMmJmEuZyYmYS5nLnBhcmVudE5vZGUmJmEuZy5wYXJlbnROb2RlLm5vZGVUeXBlPT0xJiZhLkkoKX07Zy5uYT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmd9Owp2YXIgVWI9ZnVuY3Rpb24oYSl7aWYoYS56YT09bnVsbCl7dmFyIGI9YS5zP2EuZzphLkcuZy5ib2R5O2E6e3ZhciBjPWJiKGIpO2lmKGMuZGVmYXVsdFZpZXcmJmMuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSYmKGM9Yy5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKGIsbnVsbCkpKXtjPWMuZGlyZWN0aW9ufHxjLmdldFByb3BlcnR5VmFsdWUoImRpcmVjdGlvbiIpfHwiIjticmVhayBhfWM9IiJ9YS56YT0icnRsIj09KGN8fChiLmN1cnJlbnRTdHlsZT9iLmN1cnJlbnRTdHlsZS5kaXJlY3Rpb246bnVsbCl8fGIuc3R5bGUmJmIuc3R5bGUuZGlyZWN0aW9uKX1yZXR1cm4gYS56YX0sSD1mdW5jdGlvbihhKXtyZXR1cm4gYS5qP2Euai5sZW5ndGg6MH0sST1mdW5jdGlvbihhLGIpe3JldHVybiBhLmo/YS5qW2JdfHxudWxsOm51bGx9LFRiPWZ1bmN0aW9uKGEsYixjKXthLmomJmEuai5mb3JFYWNoKGIsYyl9LFZiPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuaiYmYj9hLmouaW5kZXhPZihiKToKLTF9O3ZhciBXYj17bWI6ImFjdGl2ZWRlc2NlbmRhbnQiLHJiOiJhdG9taWMiLHNiOiJhdXRvY29tcGxldGUiLHViOiJidXN5Iix4YjoiY2hlY2tlZCIseWI6ImNvbGluZGV4IixEYjoiY29udHJvbHMiLEViOiJjdXJyZW50IixHYjoiZGVzY3JpYmVkYnkiLEpiOiJkaXNhYmxlZCIsTGI6ImRyb3BlZmZlY3QiLE1iOiJleHBhbmRlZCIsTmI6ImZsb3d0byIsUGI6ImdyYWJiZWQiLFRiOiJoYXNwb3B1cCIsVmI6ImhpZGRlbiIsWGI6ImludmFsaWQiLFliOiJsYWJlbCIsWmI6ImxhYmVsbGVkYnkiLGFjOiJsZXZlbCIsZmM6ImxpdmUiLHZjOiJtdWx0aWxpbmUiLHdjOiJtdWx0aXNlbGVjdGFibGUiLEFjOiJvcmllbnRhdGlvbiIsQmM6Im93bnMiLENjOiJwb3NpbnNldCIsRWM6InByZXNzZWQiLEljOiJyZWFkb25seSIsS2M6InJlbGV2YW50IixMYzoicmVxdWlyZWQiLFBjOiJyb3dpbmRleCIsU2M6InNlbGVjdGVkIixVYzoic2V0c2l6ZSIsV2M6InNvcnQiLG1kOiJ2YWx1ZW1heCIsbmQ6InZhbHVlbWluIiwKb2Q6InZhbHVlbm93IixwZDoidmFsdWV0ZXh0In07dmFyIFhiO3ZhciBZYj17bmI6ImFsZXJ0IixvYjoiYWxlcnRkaWFsb2ciLHBiOiJhcHBsaWNhdGlvbiIscWI6ImFydGljbGUiLHRiOiJiYW5uZXIiLHZiOiJidXR0b24iLHdiOiJjaGVja2JveCIsemI6ImNvbHVtbmhlYWRlciIsQWI6ImNvbWJvYm94IixCYjoiY29tcGxlbWVudGFyeSIsQ2I6ImNvbnRlbnRpbmZvIixGYjoiZGVmaW5pdGlvbiIsSGI6ImRpYWxvZyIsSWI6ImRpcmVjdG9yeSIsS2I6ImRvY3VtZW50IixPYjoiZm9ybSIsUWI6ImdyaWQiLFJiOiJncmlkY2VsbCIsU2I6Imdyb3VwIixVYjoiaGVhZGluZyIsV2I6ImltZyIsYmM6ImxpbmsiLGNjOiJsaXN0IixkYzoibGlzdGJveCIsZWM6Imxpc3RpdGVtIixoYzoibG9nIixpYzoibWFpbiIsamM6Im1hcnF1ZWUiLGtjOiJtYXRoIixsYzoibWVudSIsbWM6Im1lbnViYXIiLG5jOiJtZW51aXRlbSIsb2M6Im1lbnVpdGVtY2hlY2tib3giLHBjOiJtZW51aXRlbXJhZGlvIix4YzoibmF2aWdhdGlvbiIseWM6Im5vdGUiLHpjOiJvcHRpb24iLApEYzoicHJlc2VudGF0aW9uIixGYzoicHJvZ3Jlc3NiYXIiLEdjOiJyYWRpbyIsSGM6InJhZGlvZ3JvdXAiLEpjOiJyZWdpb24iLE1jOiJyb3ciLE5jOiJyb3dncm91cCIsT2M6InJvd2hlYWRlciIsUWM6InNjcm9sbGJhciIsUmM6InNlYXJjaCIsVGM6InNlcGFyYXRvciIsVmM6InNsaWRlciIsWGM6InNwaW5idXR0b24iLFljOiJzdGF0dXMiLFpjOiJzd2l0Y2giLGFkOiJ0YWIiLGJkOiJ0YWJsaXN0IixjZDoidGFicGFuZWwiLGRkOiJ0ZXh0Ym94IixlZDoidGV4dGluZm8iLGZkOiJ0aW1lciIsZ2Q6InRvb2xiYXIiLGhkOiJ0b29sdGlwIixqZDoidHJlZSIsa2Q6InRyZWVncmlkIixsZDoidHJlZWl0ZW0ifTt2YXIgWmI9ZnVuY3Rpb24oYSxiKXtiPyhwKENhKFliLGIpLCJObyBzdWNoIEFSSUEgcm9sZSAiK2IpLGEuc2V0QXR0cmlidXRlKCJyb2xlIixiKSk6YS5yZW1vdmVBdHRyaWJ1dGUoInJvbGUiKX0sYWM9ZnVuY3Rpb24oYSxiLGMpe0FycmF5LmlzQXJyYXkoYykmJihjPWMuam9pbigiICIpKTt2YXIgZD0kYihiKTtjPT09IiJ8fGM9PXZvaWQgMD8oWGJ8fChjPXt9LFhiPShjLmF0b21pYz0hMSxjLmF1dG9jb21wbGV0ZT0ibm9uZSIsYy5kcm9wZWZmZWN0PSJub25lIixjLmhhc3BvcHVwPSExLGMubGl2ZT0ib2ZmIixjLm11bHRpbGluZT0hMSxjLm11bHRpc2VsZWN0YWJsZT0hMSxjLm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIsYy5yZWFkb25seT0hMSxjLnJlbGV2YW50PSJhZGRpdGlvbnMgdGV4dCIsYy5yZXF1aXJlZD0hMSxjLnNvcnQ9Im5vbmUiLGMuYnVzeT0hMSxjLmRpc2FibGVkPSExLGMuaGlkZGVuPSExLGMuaW52YWxpZD0iZmFsc2UiLGMpKSxjPVhiLGIgaW4gYz9hLnNldEF0dHJpYnV0ZShkLApjW2JdKTphLnJlbW92ZUF0dHJpYnV0ZShkKSk6YS5zZXRBdHRyaWJ1dGUoZCxjKX0sJGI9ZnVuY3Rpb24oYSl7cChhLCJBUklBIGF0dHJpYnV0ZSBjYW5ub3QgYmUgZW1wdHkuIik7cChDYShXYixhKSwiTm8gc3VjaCBBUklBIGF0dHJpYnV0ZSAiK2EpO3JldHVybiJhcmlhLSIrYX07dmFyIGRjPWZ1bmN0aW9uKGEsYixjLGQsZSxmKXtpZih2JiZlKXJldHVybiBiYyhhKTtpZihlJiYhZClyZXR1cm4hMTtpZighdCl7dHlwZW9mIGI9PT0ibnVtYmVyIiYmKGI9Y2MoYikpO3ZhciBoPWI9PTE3fHxiPT0xOHx8diYmYj09OTE7aWYoKCFjfHx2KSYmaHx8diYmYj09MTYmJihkfHxmKSlyZXR1cm4hMX1pZih1JiZkJiZjKXN3aXRjaChhKXtjYXNlIDIyMDpjYXNlIDIxOTpjYXNlIDIyMTpjYXNlIDE5MjpjYXNlIDE4NjpjYXNlIDE4OTpjYXNlIDE4NzpjYXNlIDE4ODpjYXNlIDE5MDpjYXNlIDE5MTpjYXNlIDE5MjpjYXNlIDIyMjpyZXR1cm4hMX1zd2l0Y2goYSl7Y2FzZSAxMzpyZXR1cm4gdD9mfHxlPyExOiEoYyYmZCk6ITA7Y2FzZSAyNzpyZXR1cm4hdSYmIXR9cmV0dXJuIHQmJihkfHxlfHxmKT8hMTpiYyhhKX0sYmM9ZnVuY3Rpb24oYSl7aWYoYT49NDgmJmE8PTU3fHxhPj05NiYmYTw9MTA2fHxhPj02NSYmYTw9OTB8fHUmJmE9PTApcmV0dXJuITA7c3dpdGNoKGEpe2Nhc2UgMzI6Y2FzZSA0MzpjYXNlIDYzOmNhc2UgNjQ6Y2FzZSAxMDc6Y2FzZSAxMDk6Y2FzZSAxMTA6Y2FzZSAxMTE6Y2FzZSAxODY6Y2FzZSA1OTpjYXNlIDE4OTpjYXNlIDE4NzpjYXNlIDYxOmNhc2UgMTg4OmNhc2UgMTkwOmNhc2UgMTkxOmNhc2UgMTkyOmNhc2UgMjIyOmNhc2UgMjE5OmNhc2UgMjIwOmNhc2UgMjIxOmNhc2UgMTYzOmNhc2UgNTg6cmV0dXJuITA7CmNhc2UgMTczOmNhc2UgMTcxOnJldHVybiB0O2RlZmF1bHQ6cmV0dXJuITF9fSxjYz1mdW5jdGlvbihhKXtpZih0KWE9ZWMoYSk7ZWxzZSBpZih2JiZ1KXN3aXRjaChhKXtjYXNlIDkzOmE9OTF9cmV0dXJuIGF9LGVjPWZ1bmN0aW9uKGEpe3N3aXRjaChhKXtjYXNlIDYxOnJldHVybiAxODc7Y2FzZSA1OTpyZXR1cm4gMTg2O2Nhc2UgMTczOnJldHVybiAxODk7Y2FzZSAyMjQ6cmV0dXJuIDkxO2Nhc2UgMDpyZXR1cm4gMjI0O2RlZmF1bHQ6cmV0dXJuIGF9fTt2YXIgZmM9ZnVuY3Rpb24oYSxiLGMsZCl7ei5jYWxsKHRoaXMsZCk7dGhpcy50eXBlPSJrZXkiO3RoaXMuZz1hO3RoaXMucmVwZWF0PWN9O24oZmMseik7dmFyIEo9ZnVuY3Rpb24oYSxiKXtELmNhbGwodGhpcyk7YSYmZ2ModGhpcyxhLGIpfTtuKEosRCk7Zz1KLnByb3RvdHlwZTtnLlI9bnVsbDtnLnFhPW51bGw7Zy5KYT1udWxsO2cucmE9bnVsbDtnLkY9LTE7Zy5LPS0xO2cuRGE9ITE7CnZhciBoYz17MzoxMywxMjoxNDQsNjMyMzI6MzgsNjMyMzM6NDAsNjMyMzQ6MzcsNjMyMzU6MzksNjMyMzY6MTEyLDYzMjM3OjExMyw2MzIzODoxMTQsNjMyMzk6MTE1LDYzMjQwOjExNiw2MzI0MToxMTcsNjMyNDI6MTE4LDYzMjQzOjExOSw2MzI0NDoxMjAsNjMyNDU6MTIxLDYzMjQ2OjEyMiw2MzI0NzoxMjMsNjMyNDg6NDQsNjMyNzI6NDYsNjMyNzM6MzYsNjMyNzU6MzUsNjMyNzY6MzMsNjMyNzc6MzQsNjMyODk6MTQ0LDYzMzAyOjQ1fSxpYz17VXA6MzgsRG93bjo0MCxMZWZ0OjM3LFJpZ2h0OjM5LEVudGVyOjEzLEYxOjExMixGMjoxMTMsRjM6MTE0LEY0OjExNSxGNToxMTYsRjY6MTE3LEY3OjExOCxGODoxMTksRjk6MTIwLEYxMDoxMjEsRjExOjEyMixGMTI6MTIzLCJVKzAwN0YiOjQ2LEhvbWU6MzYsRW5kOjM1LFBhZ2VVcDozMyxQYWdlRG93bjozNCxJbnNlcnQ6NDV9LGpjPXYmJnQ7CkoucHJvdG90eXBlLmc9ZnVuY3Rpb24oYSl7dSYmKHRoaXMuRj09MTcmJiFhLmN0cmxLZXl8fHRoaXMuRj09MTgmJiFhLmFsdEtleXx8diYmdGhpcy5GPT05MSYmIWEubWV0YUtleSkmJih0aGlzLks9dGhpcy5GPS0xKTt0aGlzLkY9PS0xJiYoYS5jdHJsS2V5JiZhLmchPTE3P3RoaXMuRj0xNzphLmFsdEtleSYmYS5nIT0xOD90aGlzLkY9MTg6YS5tZXRhS2V5JiZhLmchPTkxJiYodGhpcy5GPTkxKSk7ZGMoYS5nLHRoaXMuRixhLnNoaWZ0S2V5LGEuY3RybEtleSxhLmFsdEtleSxhLm1ldGFLZXkpPyh0aGlzLks9Y2MoYS5nKSxqYyYmKHRoaXMuRGE9YS5hbHRLZXkpKTp0aGlzLmhhbmRsZUV2ZW50KGEpfTtKLnByb3RvdHlwZS5oPWZ1bmN0aW9uKGEpe3RoaXMuSz10aGlzLkY9LTE7dGhpcy5EYT1hLmFsdEtleX07CkoucHJvdG90eXBlLmhhbmRsZUV2ZW50PWZ1bmN0aW9uKGEpe3ZhciBiPWEuaCxjPWIuYWx0S2V5O2lmKHUmJmEudHlwZT09ImtleXByZXNzIil7dmFyIGQ9dGhpcy5LO3ZhciBlPWIuY2hhckNvZGU+PTAmJmIuY2hhckNvZGU8NjMyMzImJmJjKGQpP2IuY2hhckNvZGU6MH1lbHNlIGEudHlwZT09ImtleXByZXNzIj8oamMmJihjPXRoaXMuRGEpLGIua2V5Q29kZT09Yi5jaGFyQ29kZT9iLmtleUNvZGU8MzI/KGQ9Yi5rZXlDb2RlLGU9MCk6KGQ9dGhpcy5LLGU9Yi5jaGFyQ29kZSk6KGQ9Yi5rZXlDb2RlfHx0aGlzLkssZT1iLmNoYXJDb2RlfHwwKSk6KGQ9Yi5rZXlDb2RlfHx0aGlzLkssZT1iLmNoYXJDb2RlfHwwKSx2JiZlPT02MyYmZD09MjI0JiYoZD0xOTEpO3ZhciBmPWQ9Y2MoZCk7ZD9kPj02MzIzMiYmZCBpbiBoYz9mPWhjW2RdOmQ9PTI1JiZhLnNoaWZ0S2V5JiYoZj05KTpiLmtleUlkZW50aWZpZXImJmIua2V5SWRlbnRpZmllciBpbiBpYyYmKGY9aWNbYi5rZXlJZGVudGlmaWVyXSk7CmlmKCF0fHxhLnR5cGUhPSJrZXlwcmVzcyJ8fGRjKGYsdGhpcy5GLGEuc2hpZnRLZXksYS5jdHJsS2V5LGMsYS5tZXRhS2V5KSlhPWY9PXRoaXMuRix0aGlzLkY9ZixiPW5ldyBmYyhmLGUsYSxiKSxiLmFsdEtleT1jLEUodGhpcyxiKX07Si5wcm90b3R5cGUuaT1mdW5jdGlvbigpe3JldHVybiB0aGlzLlJ9O3ZhciBnYz1mdW5jdGlvbihhLGIsYyl7YS5yYSYma2MoYSk7YS5SPWI7YS5xYT11YihhLlIsImtleXByZXNzIixhLGMpO2EuSmE9dWIoYS5SLCJrZXlkb3duIixhLmcsYyxhKTthLnJhPXViKGEuUiwia2V5dXAiLGEuaCxjLGEpfSxrYz1mdW5jdGlvbihhKXthLnFhJiYoQShhLnFhKSxBKGEuSmEpLEEoYS5yYSksYS5xYT1udWxsLGEuSmE9bnVsbCxhLnJhPW51bGwpO2EuUj1udWxsO2EuRj0tMTthLks9LTF9O0oucHJvdG90eXBlLkM9ZnVuY3Rpb24oKXtKLmwuQy5jYWxsKHRoaXMpO2tjKHRoaXMpfTt2YXIgSz17Z2E6Im1vdXNlZG93biIsaGE6Im1vdXNldXAiLGZhOiJtb3VzZWNhbmNlbCIsc2M6Im1vdXNlbW92ZSIsdWM6Im1vdXNlb3ZlciIsdGM6Im1vdXNlb3V0IixxYzoibW91c2VlbnRlciIscmM6Im1vdXNlbGVhdmUifTt2YXIgbGM9ZnVuY3Rpb24oYSl7cmV0dXJuIHR5cGVvZiBhLmNsYXNzTmFtZT09InN0cmluZyI/YS5jbGFzc05hbWU6YS5nZXRBdHRyaWJ1dGUmJmEuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIn0sTD1mdW5jdGlvbihhKXtyZXR1cm4gYS5jbGFzc0xpc3Q/YS5jbGFzc0xpc3Q6bGMoYSkubWF0Y2goL1xTKy9nKXx8W119LG1jPWZ1bmN0aW9uKGEsYil7dHlwZW9mIGEuY2xhc3NOYW1lPT0ic3RyaW5nIj9hLmNsYXNzTmFtZT1iOmEuc2V0QXR0cmlidXRlJiZhLnNldEF0dHJpYnV0ZSgiY2xhc3MiLGIpfSxuYz1mdW5jdGlvbihhLGIpe2EuY2xhc3NMaXN0P2I9YS5jbGFzc0xpc3QuY29udGFpbnMoYik6KGE9TChhKSxiPXZhKGEsYik+PTApO3JldHVybiBifSxvYz1mdW5jdGlvbihhLGIpe2lmKGEuY2xhc3NMaXN0KWEuY2xhc3NMaXN0LmFkZChiKTtlbHNlIGlmKCFuYyhhLGIpKXt2YXIgYz1sYyhhKTttYyhhLGMrKGMubGVuZ3RoPjA/IiAiK2I6YikpfX0scGM9ZnVuY3Rpb24oYSxiKXtpZihhLmNsYXNzTGlzdClBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGIsCmZ1bmN0aW9uKGUpe29jKGEsZSl9KTtlbHNle3ZhciBjPXt9O0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoTChhKSxmdW5jdGlvbihlKXtjW2VdPSEwfSk7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChiLGZ1bmN0aW9uKGUpe2NbZV09ITB9KTtiPSIiO2Zvcih2YXIgZCBpbiBjKWIrPWIubGVuZ3RoPjA/IiAiK2Q6ZDttYyhhLGIpfX0scWM9ZnVuY3Rpb24oYSxiKXthLmNsYXNzTGlzdD9hLmNsYXNzTGlzdC5yZW1vdmUoYik6bmMoYSxiKSYmbWMoYSxBcnJheS5wcm90b3R5cGUuZmlsdGVyLmNhbGwoTChhKSxmdW5jdGlvbihjKXtyZXR1cm4gYyE9Yn0pLmpvaW4oIiAiKSl9LHJjPWZ1bmN0aW9uKGEsYil7YS5jbGFzc0xpc3Q/QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChiLGZ1bmN0aW9uKGMpe3FjKGEsYyl9KTptYyhhLEFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbChMKGEpLGZ1bmN0aW9uKGMpe3JldHVybiEodmEoYixjKT49MCl9KS5qb2luKCIgIikpfTt2YXIgdGM9ZnVuY3Rpb24oYSxiKXtpZighYSl0aHJvdyBFcnJvcigiSW52YWxpZCBjbGFzcyBuYW1lICIrYSk7aWYodHlwZW9mIGIhPT0iZnVuY3Rpb24iKXRocm93IEVycm9yKCJJbnZhbGlkIGRlY29yYXRvciBmdW5jdGlvbiAiK2IpO3NjW2FdPWJ9LHVjPXt9LHNjPXt9O3ZhciB2Yz1mdW5jdGlvbihhKXt0aGlzLkE9YX07aWEodmMpO3ZhciB3Yz1mdW5jdGlvbihhLGIpe2EmJihhLnRhYkluZGV4PWI/MDotMSl9LHljPWZ1bmN0aW9uKGEsYixjKXtjLmlkJiZQYihiLGMuaWQpO3ZhciBkPWEuZygpLGU9ITEsZj1MKGMpO2YmJkFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoZixmdW5jdGlvbihoKXtoPT1kP2U9ITA6aCYmdGhpcy51KGIsaCxkKX0sYSk7ZXx8b2MoYyxkKTt4YyhiLGMpO3JldHVybiBjfTt2Yy5wcm90b3R5cGUudT1mdW5jdGlvbihhLGIsYyl7Yj09YysiLWRpc2FibGVkIj9hLlgoITEpOmI9PWMrIi1ob3Jpem9udGFsIj96YyhhLCJob3Jpem9udGFsIik6Yj09YysiLXZlcnRpY2FsIiYmemMoYSwidmVydGljYWwiKX07CnZhciB4Yz1mdW5jdGlvbihhLGIpe2lmKGIpZm9yKHZhciBjPWIuZmlyc3RDaGlsZCxkO2MmJmMucGFyZW50Tm9kZT09Yjspe2Q9Yy5uZXh0U2libGluZztpZihjLm5vZGVUeXBlPT0xKXthOnt2YXIgZT1jO3AoZSk7ZT1MKGUpO2Zvcih2YXIgZj1lLmxlbmd0aCxoPTA7aDxmO2grKyl7dmFyIGs9ZVtoXTtpZihrPWsgaW4gc2M/c2Nba10oKTpudWxsKXtlPWs7YnJlYWsgYX19ZT1udWxsfWUmJihlLmc9YyxhLmlzRW5hYmxlZCgpfHxlLlgoITEpLGEuQmEoZSksU2IoZSxjKSl9ZWxzZSBjLm5vZGVWYWx1ZSYmSGEoYy5ub2RlVmFsdWUpIT0iInx8Yi5yZW1vdmVDaGlsZChjKTtjPWR9fSxBYz1mdW5jdGlvbihhLGIpe2I9Yi5pKCk7cChiLCJUaGUgY29udGFpbmVyIERPTSBlbGVtZW50IGNhbm5vdCBiZSBudWxsLiIpO0tiKGIsdCk7KGE9YS5BKSYmWmIoYixhKX07dmMucHJvdG90eXBlLmc9ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy1jb250YWluZXIifTsKdmMucHJvdG90eXBlLmo9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nKCksYz1bYixhLkw9PSJob3Jpem9udGFsIj9iKyItaG9yaXpvbnRhbCI6YisiLXZlcnRpY2FsIl07YS5pc0VuYWJsZWQoKXx8Yy5wdXNoKGIrIi1kaXNhYmxlZCIpO3JldHVybiBjfTt2YXIgQmM9ZnVuY3Rpb24oKXt9O3ZhciBNPWZ1bmN0aW9uKCl7fSxDYztpYShNKTt2YXIgRGM9e2J1dHRvbjoicHJlc3NlZCIsY2hlY2tib3g6ImNoZWNrZWQiLG1lbnVpdGVtOiJzZWxlY3RlZCIsbWVudWl0ZW1jaGVja2JveDoiY2hlY2tlZCIsbWVudWl0ZW1yYWRpbzoiY2hlY2tlZCIscmFkaW86ImNoZWNrZWQiLHRhYjoic2VsZWN0ZWQiLHRyZWVpdGVtOiJzZWxlY3RlZCJ9O00ucHJvdG90eXBlLk5hPWZ1bmN0aW9uKCl7fTtNLnByb3RvdHlwZS54YT1mdW5jdGlvbihhKXt2YXIgYj1hLkcsYz1iLmgsZD10aGlzLk4oKSxlPVtkXSxmPXRoaXMuTigpO2YhPWQmJmUucHVzaChmKTtkPWEubTtmb3IoZj1bXTtkOyl7dmFyIGg9ZCYtZDtmLnB1c2goRWModGhpcyxoKSk7ZCY9fmh9ZS5wdXNoLmFwcGx5KGUsZik7KGQ9YS5GYSkmJmUucHVzaC5hcHBseShlLGQpO3JldHVybiBjLmNhbGwoYiwiRElWIixlLmpvaW4oIiAiKSxhLmlhKX07Ck0ucHJvdG90eXBlLnlhPWZ1bmN0aW9uKGEsYil7Yi5pZCYmUGIoYSxiLmlkKTtiJiZiLmZpcnN0Q2hpbGQ/RmMoYSxiLmZpcnN0Q2hpbGQubmV4dFNpYmxpbmc/eWEoYi5jaGlsZE5vZGVzKTpiLmZpcnN0Q2hpbGQpOmEuaWE9bnVsbDt2YXIgYz0wLGQ9dGhpcy5OKCksZT10aGlzLk4oKSxmPSExLGg9ITEsaz15YShMKGIpKTtrLmZvckVhY2goZnVuY3Rpb24ocSl7Znx8cSE9ZD9ofHxxIT1lP2N8PUdjKHRoaXMscSk6aD0hMDooZj0hMCxlPT1kJiYoaD0hMCkpO0djKHRoaXMscSk9PTEmJihzYShiKSxkYihiKSYmZWIoYikmJmNiKGIsITEpKX0sdGhpcyk7YS5tPWM7Znx8KGsucHVzaChkKSxlPT1kJiYoaD0hMCkpO2h8fGsucHVzaChlKTsoYT1hLkZhKSYmay5wdXNoLmFwcGx5KGssYSk7ZiYmaCYmIWF8fG1jKGIsay5qb2luKCIgIikpO3JldHVybiBifTsKdmFyIEhjPWZ1bmN0aW9uKGEsYil7aWYoYT1hLk5hKCkpe3AoYiwiVGhlIGVsZW1lbnQgcGFzc2VkIGFzIGEgZmlyc3QgcGFyYW1ldGVyIGNhbm5vdCBiZSBudWxsLiIpO3ZhciBjPWIuZ2V0QXR0cmlidXRlKCJyb2xlIil8fG51bGw7YSE9YyYmWmIoYixhKX19LEljPWZ1bmN0aW9uKGEsYil7dmFyIGM7aWYoYS5EJjMyJiYoYz1hLmkoKSkpe2lmKCFiJiZhLm0mMzIpe3RyeXtjLmJsdXIoKX1jYXRjaChkKXt9YS5tJjMyJiZhLlFhKG51bGwpfShkYihjKSYmZWIoYykpIT1iJiZjYihjLGIpfX0sSmM9ZnVuY3Rpb24oYSxiLGMpe0NjfHwoQ2M9ezE6ImRpc2FibGVkIiw4OiJzZWxlY3RlZCIsMTY6ImNoZWNrZWQiLDY0OiJleHBhbmRlZCJ9KTtwKGEsIlRoZSBlbGVtZW50IHBhc3NlZCBhcyBhIGZpcnN0IHBhcmFtZXRlciBjYW5ub3QgYmUgbnVsbC4iKTtiPUNjW2JdO3ZhciBkPWEuZ2V0QXR0cmlidXRlKCJyb2xlIil8fG51bGw7ZCYmKGQ9RGNbZF18fGIsYj1iPT0iY2hlY2tlZCJ8fGI9PQoic2VsZWN0ZWQiP2Q6Yik7YiYmYWMoYSxiLGMpfTtNLnByb3RvdHlwZS5OPWZ1bmN0aW9uKCl7cmV0dXJuImdvb2ctY29udHJvbCJ9O3ZhciBFYz1mdW5jdGlvbihhLGIpe2EuZ3x8S2MoYSk7cmV0dXJuIGEuZ1tiXX0sR2M9ZnVuY3Rpb24oYSxiKXthLmh8fChhLmd8fEtjKGEpLGEuaD1FYShhLmcpKTthPXBhcnNlSW50KGEuaFtiXSwxMCk7cmV0dXJuIGlzTmFOKGEpPzA6YX0sS2M9ZnVuY3Rpb24oYSl7dmFyIGI9YS5OKCk7dmFyIGM9Yi5yZXBsYWNlKC9ceGEwfFxzL2csIiAiKS5pbmRleE9mKCIgIikhPS0xO3AoIWMsIkNvbnRyb2xSZW5kZXJlciBoYXMgYW4gaW52YWxpZCBjc3MgY2xhc3M6ICciK2IrIiciKTthLmc9ezE6YisiLWRpc2FibGVkIiwyOmIrIi1ob3ZlciIsNDpiKyItYWN0aXZlIiw4OmIrIi1zZWxlY3RlZCIsMTY6YisiLWNoZWNrZWQiLDMyOmIrIi1mb2N1c2VkIiw2NDpiKyItb3BlbiJ9fTt2YXIgTj1mdW5jdGlvbihhLGIsYyl7Ri5jYWxsKHRoaXMsYyk7aWYoIWIpe2ZvcihiPXRoaXMuY29uc3RydWN0b3I7Yjspe3ZhciBkPW5hKGIpO2lmKGQ9dWNbZF0pYnJlYWs7Yj0oYj1PYmplY3QuZ2V0UHJvdG90eXBlT2YoYi5wcm90b3R5cGUpKSYmYi5jb25zdHJ1Y3Rvcn1iPWQ/dHlwZW9mIGQuVj09PSJmdW5jdGlvbiI/ZC5WKCk6bmV3IGQ6bnVsbH10aGlzLnY9Yjt0aGlzLmlhPWEhPT12b2lkIDA/YTpudWxsfTtuKE4sRik7Zz1OLnByb3RvdHlwZTtnLmlhPW51bGw7Zy5tPTA7Zy5EPTM5O2cuUD0wO2cuT2E9ITA7Zy5GYT1udWxsO2cuSGE9ITA7Zy5tYT1mdW5jdGlvbigpe3ZhciBhPXRoaXMudi54YSh0aGlzKTt0aGlzLmc9YTtIYyh0aGlzLnYsYSk7S2IoYSwhMCk7dGhpcy5pc1Zpc2libGUoKXx8KGEuc3R5bGUuZGlzcGxheT0ibm9uZSIsYSYmYWMoYSwiaGlkZGVuIiwhMCkpfTtnLm5hPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaSgpfTtnLndhPWZ1bmN0aW9uKCl7cmV0dXJuITB9OwpnLkVhPWZ1bmN0aW9uKGEpe3RoaXMuZz1hPXRoaXMudi55YSh0aGlzLGEpO0hjKHRoaXMudixhKTtLYihhLCEwKTt0aGlzLk9hPWEuc3R5bGUuZGlzcGxheSE9Im5vbmUifTsKZy5JPWZ1bmN0aW9uKCl7Ti5sLkkuY2FsbCh0aGlzKTt2YXIgYT10aGlzLmc7cChhLCJDYW4gbm90IGNhbGwgZ2V0RWxlbWVudFN0cmljdCBiZWZvcmUgcmVuZGVyaW5nL2RlY29yYXRpbmcuIik7cCh0aGlzKTtwKGEpO3RoaXMuaXNWaXNpYmxlKCl8fGFjKGEsImhpZGRlbiIsIXRoaXMuaXNWaXNpYmxlKCkpO3RoaXMuaXNFbmFibGVkKCl8fEpjKGEsMSwhdGhpcy5pc0VuYWJsZWQoKSk7dGhpcy5EJjgmJkpjKGEsOCwhISh0aGlzLm0mOCkpO3RoaXMuRCYxNiYmSmMoYSwxNiwhISh0aGlzLm0mMTYpKTt0aGlzLkQmNjQmJkpjKGEsNjQsISEodGhpcy5tJjY0KSk7dmFyIGI9dGhpcy52O1ViKHRoaXMpJiYoYT10aGlzLmkoKSxiPWIuTigpKyItcnRsIiwoYT1hLmk/YS5pKCk6YSkmJnBjKGEsW2JdKSk7dGhpcy5pc0VuYWJsZWQoKSYmSWModGhpcyx0aGlzLmlzVmlzaWJsZSgpKTt0aGlzLkQmLTImJih0aGlzLkhhJiZMYyh0aGlzLCEwKSx0aGlzLkQmMzImJihhPXRoaXMuaSgpKSkmJihiPQp0aGlzLlp8fCh0aGlzLlo9bmV3IEopLGdjKGIsYSksQihCKEIoUWIodGhpcyksYiwia2V5Iix0aGlzLmFhKSxhLCJmb2N1cyIsdGhpcy5YYSksYSwiYmx1ciIsdGhpcy5RYSkpfTt2YXIgTGM9ZnVuY3Rpb24oYSxiKXt2YXIgYz1RYihhKSxkPWEuaSgpO2I/KEIoQihCKEIoYyxkLEsuZ2EsYS5zYSksZCxbSy5oYSxLLmZhXSxhLnZhKSxkLCJtb3VzZW92ZXIiLGEudWEpLGQsIm1vdXNlb3V0IixhLnRhKSxhLmNhIT1CYyYmQihjLGQsImNvbnRleHRtZW51IixhLmNhKSk6KEMoQyhDKEMoYyxkLEsuZ2EsYS5zYSksZCxbSy5oYSxLLmZhXSxhLnZhKSxkLCJtb3VzZW92ZXIiLGEudWEpLGQsIm1vdXNlb3V0IixhLnRhKSxhLmNhIT1CYyYmQyhjLGQsImNvbnRleHRtZW51IixhLmNhKSl9O04ucHJvdG90eXBlLlU9ZnVuY3Rpb24oKXtOLmwuVS5jYWxsKHRoaXMpO3RoaXMuWiYma2ModGhpcy5aKTt0aGlzLmlzVmlzaWJsZSgpJiZ0aGlzLmlzRW5hYmxlZCgpJiZJYyh0aGlzLCExKX07Ck4ucHJvdG90eXBlLkM9ZnVuY3Rpb24oKXtOLmwuQy5jYWxsKHRoaXMpO3RoaXMuWiYmKHRoaXMuWi5kaXNwb3NlKCksZGVsZXRlIHRoaXMuWik7ZGVsZXRlIHRoaXMudjt0aGlzLkZhPXRoaXMuaWE9bnVsbH07dmFyIEZjPWZ1bmN0aW9uKGEsYil7YS5pYT1ifTtOLnByb3RvdHlwZS5pc1Zpc2libGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5PYX07Ti5wcm90b3R5cGUuaXNFbmFibGVkPWZ1bmN0aW9uKCl7cmV0dXJuISh0aGlzLm0mMSl9O04ucHJvdG90eXBlLlg9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5oO2ImJnR5cGVvZiBiLmlzRW5hYmxlZD09ImZ1bmN0aW9uIiYmIWIuaXNFbmFibGVkKCl8fCFPKHRoaXMsMSwhYSl8fChhfHwoTWModGhpcywhMSksUCh0aGlzLCExKSksdGhpcy5pc1Zpc2libGUoKSYmSWModGhpcyxhKSxUKHRoaXMsMSwhYSwhMCkpfTt2YXIgUD1mdW5jdGlvbihhLGIpe08oYSwyLGIpJiZUKGEsMixiKX07Ck4ucHJvdG90eXBlLmlzQWN0aXZlPWZ1bmN0aW9uKCl7cmV0dXJuISEodGhpcy5tJjQpfTsKdmFyIE1jPWZ1bmN0aW9uKGEsYil7TyhhLDQsYikmJlQoYSw0LGIpfSxOYz1mdW5jdGlvbihhLGIpe08oYSw4LGIpJiZUKGEsOCxiKX0sT2M9ZnVuY3Rpb24oYSxiKXtPKGEsNjQsYikmJlQoYSw2NCxiKX0sVD1mdW5jdGlvbihhLGIsYyxkKXtpZighZCYmYj09MSlhLlgoIWMpO2Vsc2UgaWYoYS5EJmImJmMhPSEhKGEubSZiKSl7dmFyIGU9YS52O2lmKGQ9YS5pKCkpe2lmKGU9RWMoZSxiKSl7dmFyIGY9YS5pP2EuaSgpOmE7ZiYmKGM/cGM6cmMpKGYsW2VdKX1KYyhkLGIsYyl9YS5tPWM/YS5tfGI6YS5tJn5ifX0sUGM9ZnVuY3Rpb24oYSxiLGMpe2lmKGEucyYmYS5tJmImJiFjKXRocm93IEVycm9yKCJDb21wb25lbnQgYWxyZWFkeSByZW5kZXJlZCIpOyFjJiZhLm0mYiYmVChhLGIsITEpO2EuRD1jP2EuRHxiOmEuRCZ+Yn0sVT1mdW5jdGlvbihhLGIpe3JldHVybiEhKDI1NSZiKSYmISEoYS5EJmIpfSxPPWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4hIShhLkQmYikmJiEhKGEubSZiKSE9CmMmJighKGEuUCZiKXx8RShhLE5iKGIsYykpKSYmIWEuYmF9O04ucHJvdG90eXBlLnVhPWZ1bmN0aW9uKGEpeyFRYyhhLHRoaXMuaSgpKSYmRSh0aGlzLCJlbnRlciIpJiZ0aGlzLmlzRW5hYmxlZCgpJiZVKHRoaXMsMikmJlAodGhpcywhMCl9O04ucHJvdG90eXBlLnRhPWZ1bmN0aW9uKGEpeyFRYyhhLHRoaXMuaSgpKSYmRSh0aGlzLCJsZWF2ZSIpJiYoVSh0aGlzLDQpJiZNYyh0aGlzLCExKSxVKHRoaXMsMikmJlAodGhpcywhMSkpfTtOLnByb3RvdHlwZS5jYT1CYzt2YXIgUWM9ZnVuY3Rpb24oYSxiKXtyZXR1cm4hIWEucmVsYXRlZFRhcmdldCYmYWIoYixhLnJlbGF0ZWRUYXJnZXQpfTsKTi5wcm90b3R5cGUuc2E9ZnVuY3Rpb24oYSl7aWYodGhpcy5pc0VuYWJsZWQoKSYmKFUodGhpcywyKSYmUCh0aGlzLCEwKSwhKGEuaC5idXR0b24hPTB8fHYmJmEuY3RybEtleSkpKXtVKHRoaXMsNCkmJk1jKHRoaXMsITApO3ZhciBiO2lmKGI9dGhpcy52KXt2YXIgYztiPXRoaXMuRCYzMiYmKGM9dGhpcy5pKCkpP2RiKGMpJiZlYihjKTohMX1iJiZ0aGlzLmkoKS5mb2N1cygpfWEuaC5idXR0b24hPTB8fHYmJmEuY3RybEtleXx8YS5qKCl9O04ucHJvdG90eXBlLnZhPWZ1bmN0aW9uKGEpe3RoaXMuaXNFbmFibGVkKCkmJihVKHRoaXMsMikmJlAodGhpcywhMCksdGhpcy5pc0FjdGl2ZSgpJiZSYyh0aGlzLGEpJiZVKHRoaXMsNCkmJk1jKHRoaXMsITEpKX07CnZhciBSYz1mdW5jdGlvbihhLGIpe2lmKFUoYSwxNikpe3ZhciBjPSEoYS5tJjE2KTtPKGEsMTYsYykmJlQoYSwxNixjKX1VKGEsOCkmJk5jKGEsITApO1UoYSw2NCkmJk9jKGEsIShhLm0mNjQpKTtjPW5ldyB5KCJhY3Rpb24iLGEpO2ImJihjLmFsdEtleT1iLmFsdEtleSxjLmN0cmxLZXk9Yi5jdHJsS2V5LGMubWV0YUtleT1iLm1ldGFLZXksYy5zaGlmdEtleT1iLnNoaWZ0S2V5LGMuRz1iLkcsYy50aW1lU3RhbXA9Yi50aW1lU3RhbXApO3JldHVybiBFKGEsYyl9O04ucHJvdG90eXBlLlhhPWZ1bmN0aW9uKCl7VSh0aGlzLDMyKSYmTyh0aGlzLDMyLCEwKSYmVCh0aGlzLDMyLCEwKX07Ti5wcm90b3R5cGUuUWE9ZnVuY3Rpb24oKXtVKHRoaXMsNCkmJk1jKHRoaXMsITEpO1UodGhpcywzMikmJk8odGhpcywzMiwhMSkmJlQodGhpcywzMiwhMSl9OwpOLnByb3RvdHlwZS5hYT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5pc1Zpc2libGUoKSYmdGhpcy5pc0VuYWJsZWQoKSYmYS5nPT0xMyYmUmModGhpcyxhKT8oYS5qKCksYS52KCksITApOiExfTtpZih0eXBlb2YgTiE9PSJmdW5jdGlvbiIpdGhyb3cgRXJyb3IoIkludmFsaWQgY29tcG9uZW50IGNsYXNzICIrTik7aWYodHlwZW9mIE0hPT0iZnVuY3Rpb24iKXRocm93IEVycm9yKCJJbnZhbGlkIHJlbmRlcmVyIGNsYXNzICIrTSk7dmFyIFNjPW5hKE4pO3VjW1NjXT1NO3RjKCJnb29nLWNvbnRyb2wiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBOKG51bGwpfSk7dmFyIFY9ZnVuY3Rpb24oYSxiLGMpe0YuY2FsbCh0aGlzLGMpO3RoaXMuZWE9Ynx8dmMuVigpO3RoaXMuTD1hfHwidmVydGljYWwifTtuKFYsRik7Zz1WLnByb3RvdHlwZTtnLkthPW51bGw7Zy5kYT1udWxsO2cuZWE9bnVsbDtnLkw9bnVsbDtnLlM9ITA7Zy5UPSEwO2cubz0tMTtnLkI9bnVsbDtnLlc9ITE7Zy5PPW51bGw7dmFyIFRjPWZ1bmN0aW9uKGEpe3JldHVybiBhLkthfHxhLmkoKX07Zz1WLnByb3RvdHlwZTtnLm1hPWZ1bmN0aW9uKCl7dGhpcy5nPXRoaXMuRy5oKCJESVYiLHRoaXMuZWEuaih0aGlzKS5qb2luKCIgIikpfTtnLm5hPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaSgpfTtnLndhPWZ1bmN0aW9uKGEpe3JldHVybiBhLnRhZ05hbWU9PSJESVYifTtnLkVhPWZ1bmN0aW9uKGEpe3RoaXMuZz15Yyh0aGlzLmVhLHRoaXMsYSk7YS5zdHlsZS5kaXNwbGF5PT0ibm9uZSImJih0aGlzLlM9ITEpfTsKZy5JPWZ1bmN0aW9uKCl7Vi5sLkkuY2FsbCh0aGlzKTtUYih0aGlzLGZ1bmN0aW9uKGIpe2IucyYmVWModGhpcyxiKX0sdGhpcyk7dmFyIGE9dGhpcy5pKCk7QWModGhpcy5lYSx0aGlzKTtWYyh0aGlzLHRoaXMuUyk7QihCKEIoQihCKEIoQihCKFFiKHRoaXMpLHRoaXMsImVudGVyIix0aGlzLmViKSx0aGlzLCJoaWdobGlnaHQiLHRoaXMuZmIpLHRoaXMsInVuaGlnaGxpZ2h0Iix0aGlzLmxiKSx0aGlzLCJvcGVuIix0aGlzLmdiKSx0aGlzLCJjbG9zZSIsdGhpcy5iYiksYSxLLmdhLHRoaXMuV2EpLGJiKGEpLFtLLmhhLEsuZmFdLHRoaXMuY2IpLGEsW0suZ2EsSy5oYSxLLmZhLCJtb3VzZW92ZXIiLCJtb3VzZW91dCIsImNvbnRleHRtZW51Il0sdGhpcy5hYik7V2ModGhpcyl9O3ZhciBXYz1mdW5jdGlvbihhKXt2YXIgYj1RYihhKSxjPVRjKGEpO0IoQihCKGIsYywiZm9jdXMiLGEuUGEpLGMsImJsdXIiLGEuVWEpLGEuZGF8fChhLmRhPW5ldyBKKFRjKGEpKSksImtleSIsYS5WYSl9OwpnPVYucHJvdG90eXBlO2cuVT1mdW5jdGlvbigpe1hjKHRoaXMsLTEpO3RoaXMuQiYmT2ModGhpcy5CLCExKTt0aGlzLlc9ITE7Vi5sLlUuY2FsbCh0aGlzKX07Zy5DPWZ1bmN0aW9uKCl7Vi5sLkMuY2FsbCh0aGlzKTt0aGlzLmRhJiYodGhpcy5kYS5kaXNwb3NlKCksdGhpcy5kYT1udWxsKTt0aGlzLmVhPXRoaXMuQj10aGlzLk89dGhpcy5LYT1udWxsfTtnLmViPWZ1bmN0aW9uKCl7cmV0dXJuITB9OwpnLmZiPWZ1bmN0aW9uKGEpe3ZhciBiPVZiKHRoaXMsYS50YXJnZXQpO2lmKGI+LTEmJmIhPXRoaXMubyl7dmFyIGM9SSh0aGlzLHRoaXMubyk7YyYmUChjLCExKTt0aGlzLm89YjtjPUkodGhpcyx0aGlzLm8pO3RoaXMuVyYmTWMoYywhMCk7dGhpcy5CJiZjIT10aGlzLkImJihjLkQmNjQ/T2MoYywhMCk6T2ModGhpcy5CLCExKSl9Yj10aGlzLmkoKTtwKGIsIlRoZSBET00gZWxlbWVudCBmb3IgdGhlIGNvbnRhaW5lciBjYW5ub3QgYmUgbnVsbC4iKTthLnRhcmdldC5pKCkhPW51bGwmJmFjKGIsImFjdGl2ZWRlc2NlbmRhbnQiLGEudGFyZ2V0LmkoKS5pZCl9O2cubGI9ZnVuY3Rpb24oYSl7YS50YXJnZXQ9PUkodGhpcyx0aGlzLm8pJiYodGhpcy5vPS0xKTthPXRoaXMuaSgpO3AoYSwiVGhlIERPTSBlbGVtZW50IGZvciB0aGUgY29udGFpbmVyIGNhbm5vdCBiZSBudWxsLiIpO2EucmVtb3ZlQXR0cmlidXRlKCRiKCJhY3RpdmVkZXNjZW5kYW50IikpfTsKZy5nYj1mdW5jdGlvbihhKXsoYT1hLnRhcmdldCkmJmEhPXRoaXMuQiYmYS5oPT10aGlzJiYodGhpcy5CJiZPYyh0aGlzLkIsITEpLHRoaXMuQj1hKX07Zy5iYj1mdW5jdGlvbihhKXthLnRhcmdldD09dGhpcy5CJiYodGhpcy5CPW51bGwpO3ZhciBiPXRoaXMuaSgpLGM9YS50YXJnZXQuaSgpO2ImJmEudGFyZ2V0Lm0mMiYmYyYmKGE9IiIsYyYmKGE9Yy5pZCxwKGEsIlRoZSBhY3RpdmUgZWxlbWVudCBzaG91bGQgaGF2ZSBhbiBpZC4iKSksYWMoYiwiYWN0aXZlZGVzY2VuZGFudCIsYSkpfTtnLldhPWZ1bmN0aW9uKGEpe3RoaXMuVCYmKHRoaXMuVz0hMCk7dmFyIGI9VGModGhpcyk7YiYmZGIoYikmJmViKGIpP2IuZm9jdXMoKTphLmooKX07Zy5jYj1mdW5jdGlvbigpe3RoaXMuVz0hMX07CmcuYWI9ZnVuY3Rpb24oYSl7YTp7dmFyIGI9YS50YXJnZXQ7aWYodGhpcy5PKWZvcih2YXIgYz10aGlzLmkoKTtiJiZiIT09Yzspe3ZhciBkPWIuaWQ7aWYoZCBpbiB0aGlzLk8pe2I9dGhpcy5PW2RdO2JyZWFrIGF9Yj1iLnBhcmVudE5vZGV9Yj1udWxsfWlmKGIpc3dpdGNoKGEudHlwZSl7Y2FzZSBLLmdhOmIuc2EoYSk7YnJlYWs7Y2FzZSBLLmhhOmNhc2UgSy5mYTpiLnZhKGEpO2JyZWFrO2Nhc2UgIm1vdXNlb3ZlciI6Yi51YShhKTticmVhaztjYXNlICJtb3VzZW91dCI6Yi50YShhKTticmVhaztjYXNlICJjb250ZXh0bWVudSI6Yi5jYShhKX19O2cuUGE9ZnVuY3Rpb24oKXt9O2cuVWE9ZnVuY3Rpb24oKXtYYyh0aGlzLC0xKTt0aGlzLlc9ITE7dGhpcy5CJiZPYyh0aGlzLkIsITEpfTsKZy5WYT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5pc0VuYWJsZWQoKSYmdGhpcy5pc1Zpc2libGUoKSYmKEgodGhpcykhPTB8fHRoaXMuS2EpJiZZYyh0aGlzLGEpPyhhLmooKSxhLnYoKSwhMCk6ITF9Owp2YXIgWWM9ZnVuY3Rpb24oYSxiKXt2YXIgYz1JKGEsYS5vKTtpZihjJiZ0eXBlb2YgYy5hYT09ImZ1bmN0aW9uIiYmYy5hYShiKXx8YS5CJiZhLkIhPWMmJnR5cGVvZiBhLkIuYWE9PSJmdW5jdGlvbiImJmEuQi5hYShiKSlyZXR1cm4hMDtpZihiLnNoaWZ0S2V5fHxiLmN0cmxLZXl8fGIubWV0YUtleXx8Yi5hbHRLZXkpcmV0dXJuITE7c3dpdGNoKGIuZyl7Y2FzZSAyNzpUYyhhKS5ibHVyKCk7YnJlYWs7Y2FzZSAzNjpaYyhhKTticmVhaztjYXNlIDM1OiRjKGEpO2JyZWFrO2Nhc2UgMzg6aWYoYS5MPT0idmVydGljYWwiKWFkKGEpO2Vsc2UgcmV0dXJuITE7YnJlYWs7Y2FzZSAzNzppZihhLkw9PSJob3Jpem9udGFsIilVYihhKT9iZChhKTphZChhKTtlbHNlIHJldHVybiExO2JyZWFrO2Nhc2UgNDA6aWYoYS5MPT0idmVydGljYWwiKWJkKGEpO2Vsc2UgcmV0dXJuITE7YnJlYWs7Y2FzZSAzOTppZihhLkw9PSJob3Jpem9udGFsIilVYihhKT9hZChhKTpiZChhKTtlbHNlIHJldHVybiExOwpicmVhaztkZWZhdWx0OnJldHVybiExfXJldHVybiEwfSxVYz1mdW5jdGlvbihhLGIpe3ZhciBjPWIuaSgpO2M9Yy5pZHx8KGMuaWQ9T2IoYikpO2EuT3x8KGEuTz17fSk7YS5PW2NdPWJ9O1YucHJvdG90eXBlLkJhPWZ1bmN0aW9uKGEsYil7dWEoYSxOLCJUaGUgY2hpbGQgb2YgYSBjb250YWluZXIgbXVzdCBiZSBhIGNvbnRyb2wiKTtWLmwuQmEuY2FsbCh0aGlzLGEsYil9O1YucHJvdG90eXBlLkNhPWZ1bmN0aW9uKGEsYixjKXt1YShhLE4pO2EuUHw9MjthLlB8PTY0O1BjKGEsMzIsITEpO2EucyYmMCE9YS5IYSYmTGMoYSwhMSk7YS5IYT0hMTt2YXIgZD1hLmg9PXRoaXM/VmIodGhpcyxhKTotMTtWLmwuQ2EuY2FsbCh0aGlzLGEsYixjKTthLnMmJnRoaXMucyYmVWModGhpcyxhKTthPWQ7YT09LTEmJihhPUgodGhpcykpO2E9PXRoaXMubz90aGlzLm89TWF0aC5taW4oSCh0aGlzKS0xLGIpOmE+dGhpcy5vJiZiPD10aGlzLm8/dGhpcy5vKys6YTx0aGlzLm8mJmI+dGhpcy5vJiZ0aGlzLm8tLX07CnZhciB6Yz1mdW5jdGlvbihhLGIpe2lmKGEuaSgpKXRocm93IEVycm9yKCJDb21wb25lbnQgYWxyZWFkeSByZW5kZXJlZCIpO2EuTD1ifTtWLnByb3RvdHlwZS5pc1Zpc2libGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5TfTt2YXIgVmM9ZnVuY3Rpb24oYSxiKXthLlM9Yjt2YXIgYz1hLmkoKTtjJiYoYy5zdHlsZS5kaXNwbGF5PWI/IiI6Im5vbmUiLHdjKFRjKGEpLGEuVCYmYS5TKSl9O1YucHJvdG90eXBlLmlzRW5hYmxlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLlR9O1YucHJvdG90eXBlLlg9ZnVuY3Rpb24oYSl7dGhpcy5UIT1hJiZFKHRoaXMsYT8iZW5hYmxlIjoiZGlzYWJsZSIpJiYoYT8odGhpcy5UPSEwLFRiKHRoaXMsZnVuY3Rpb24oYil7Yi5UYT9kZWxldGUgYi5UYTpiLlgoITApfSkpOihUYih0aGlzLGZ1bmN0aW9uKGIpe2IuaXNFbmFibGVkKCk/Yi5YKCExKTpiLlRhPSEwfSksdGhpcy5XPXRoaXMuVD0hMSksd2MoVGModGhpcyksYSYmdGhpcy5TKSl9Owp2YXIgWGM9ZnVuY3Rpb24oYSxiKXsoYj1JKGEsYikpP1AoYiwhMCk6YS5vPi0xJiZQKEkoYSxhLm8pLCExKX0sWmM9ZnVuY3Rpb24oYSl7Y2QoYSxmdW5jdGlvbihiLGMpe3JldHVybihiKzEpJWN9LEgoYSktMSl9LCRjPWZ1bmN0aW9uKGEpe2NkKGEsZnVuY3Rpb24oYixjKXtiLS07cmV0dXJuIGI8MD9jLTE6Yn0sMCl9LGJkPWZ1bmN0aW9uKGEpe2NkKGEsZnVuY3Rpb24oYixjKXtyZXR1cm4oYisxKSVjfSxhLm8pfSxhZD1mdW5jdGlvbihhKXtjZChhLGZ1bmN0aW9uKGIsYyl7Yi0tO3JldHVybiBiPDA/Yy0xOmJ9LGEubyl9LGNkPWZ1bmN0aW9uKGEsYixjKXtjPWM8MD9WYihhLGEuQik6Yzt2YXIgZD1IKGEpO2M9Yi5jYWxsKGEsYyxkKTtmb3IodmFyIGU9MDtlPD1kOyl7dmFyIGY9SShhLGMpO2lmKGYmJmYuaXNWaXNpYmxlKCkmJmYuaXNFbmFibGVkKCkmJmYuRCYyKXthLkxhKGMpO2JyZWFrfWUrKztjPWIuY2FsbChhLGMsZCl9fTsKVi5wcm90b3R5cGUuTGE9ZnVuY3Rpb24oYSl7WGModGhpcyxhKX07dmFyIGRkPWZ1bmN0aW9uKCl7fTtuKGRkLE0pO2lhKGRkKTtnPWRkLnByb3RvdHlwZTtnLk49ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy10YWIifTtnLk5hPWZ1bmN0aW9uKCl7cmV0dXJuInRhYiJ9O2cueGE9ZnVuY3Rpb24oYSl7dmFyIGI9ZGQubC54YS5jYWxsKHRoaXMsYSk7KGE9YS5HYSgpKSYmdGhpcy5NYShiLGEpO3JldHVybiBifTtnLnlhPWZ1bmN0aW9uKGEsYil7Yj1kZC5sLnlhLmNhbGwodGhpcyxhLGIpO3ZhciBjPXRoaXMuR2EoYik7YyYmKGEuUmE9Yyk7YS5tJjgmJihjPWEuaCkmJnR5cGVvZiBjLko9PT0iZnVuY3Rpb24iJiYoVChhLDgsITEpLGMuSihhKSk7cmV0dXJuIGJ9O2cuR2E9ZnVuY3Rpb24oYSl7cmV0dXJuIGEudGl0bGV8fCIifTtnLk1hPWZ1bmN0aW9uKGEsYil7YSYmKGEudGl0bGU9Ynx8IiIpfTt2YXIgZWQ9ZnVuY3Rpb24oYSxiLGMpe04uY2FsbCh0aGlzLGEsYnx8ZGQuVigpLGMpO1BjKHRoaXMsOCwhMCk7dGhpcy5QfD05fTtuKGVkLE4pO2VkLnByb3RvdHlwZS5HYT1mdW5jdGlvbigpe3JldHVybiB0aGlzLlJhfTtlZC5wcm90b3R5cGUuTWE9ZnVuY3Rpb24oYSl7dGhpcy52Lk1hKHRoaXMuaSgpLGEpO3RoaXMuUmE9YX07dGMoImdvb2ctdGFiIixmdW5jdGlvbigpe3JldHVybiBuZXcgZWQobnVsbCl9KTt2YXIgVz1mdW5jdGlvbigpe3RoaXMuQT0idGFibGlzdCJ9O24oVyx2Yyk7aWEoVyk7Vy5wcm90b3R5cGUuZz1mdW5jdGlvbigpe3JldHVybiJnb29nLXRhYi1iYXIifTtXLnByb3RvdHlwZS51PWZ1bmN0aW9uKGEsYixjKXt0aGlzLnZ8fCh0aGlzLmh8fGZkKHRoaXMpLHRoaXMudj1FYSh0aGlzLmgpKTt2YXIgZD10aGlzLnZbYl07ZD8oemMoYSxnZChkKSksYS52PWQpOlcubC51LmNhbGwodGhpcyxhLGIsYyl9O1cucHJvdG90eXBlLmo9ZnVuY3Rpb24oYSl7dmFyIGI9Vy5sLmouY2FsbCh0aGlzLGEpO3RoaXMuaHx8ZmQodGhpcyk7Yi5wdXNoKHRoaXMuaFthLnZdKTtyZXR1cm4gYn07dmFyIGZkPWZ1bmN0aW9uKGEpe3ZhciBiPWEuZygpO2EuaD17dG9wOmIrIi10b3AiLGJvdHRvbTpiKyItYm90dG9tIixzdGFydDpiKyItc3RhcnQiLGVuZDpiKyItZW5kIn19O3ZhciBYPWZ1bmN0aW9uKGEsYixjKXthPWF8fCJ0b3AiO3pjKHRoaXMsZ2QoYSkpO3RoaXMudj1hO1YuY2FsbCh0aGlzLHRoaXMuTCxifHxXLlYoKSxjKTtoZCh0aGlzKX07bihYLFYpO2c9WC5wcm90b3R5cGU7Zy5IPW51bGw7Zy5JPWZ1bmN0aW9uKCl7WC5sLkkuY2FsbCh0aGlzKTtoZCh0aGlzKX07Zy5DPWZ1bmN0aW9uKCl7WC5sLkMuY2FsbCh0aGlzKTt0aGlzLkg9bnVsbH07Zy5MYT1mdW5jdGlvbihhKXtYLmwuTGEuY2FsbCh0aGlzLGEpO3RoaXMuSihJKHRoaXMsYSkpfTtnLko9ZnVuY3Rpb24oYSl7YT9OYyhhLCEwKTp0aGlzLkgmJk5jKHRoaXMuSCwhMSl9Owp2YXIgaWQ9ZnVuY3Rpb24oYSxiKXtpZihiJiZiPT1hLkgpe2Zvcih2YXIgYz1WYihhLGIpLGQ9Yy0xO2I9SShhLGQpO2QtLSl7dmFyIGU9YjtpZihlLmlzVmlzaWJsZSgpJiZlLmlzRW5hYmxlZCgpKXthLkooYik7cmV0dXJufX1mb3IoYys9MTtiPUkoYSxjKTtjKyspaWYoZD1iLGQuaXNWaXNpYmxlKCkmJmQuaXNFbmFibGVkKCkpe2EuSihiKTtyZXR1cm59YS5KKG51bGwpfX07Zz1YLnByb3RvdHlwZTtnLmpiPWZ1bmN0aW9uKGEpe3RoaXMuSCYmdGhpcy5IIT1hLnRhcmdldCYmTmModGhpcy5ILCExKTt0aGlzLkg9YS50YXJnZXR9O2cua2I9ZnVuY3Rpb24oYSl7YS50YXJnZXQ9PXRoaXMuSCYmKHRoaXMuSD1udWxsKX07Zy5oYj1mdW5jdGlvbihhKXtpZCh0aGlzLGEudGFyZ2V0KX07Zy5pYj1mdW5jdGlvbihhKXtpZCh0aGlzLGEudGFyZ2V0KX07Zy5QYT1mdW5jdGlvbigpe0kodGhpcyx0aGlzLm8pfHxYYyh0aGlzLFZiKHRoaXMsdGhpcy5IfHxJKHRoaXMsMCkpKX07CnZhciBoZD1mdW5jdGlvbihhKXtCKEIoQihCKFFiKGEpLGEsInNlbGVjdCIsYS5qYiksYSwidW5zZWxlY3QiLGEua2IpLGEsImRpc2FibGUiLGEuaGIpLGEsImhpZGUiLGEuaWIpfSxnZD1mdW5jdGlvbihhKXtyZXR1cm4gYT09InN0YXJ0Inx8YT09ImVuZCI/InZlcnRpY2FsIjoiaG9yaXpvbnRhbCJ9O3RjKCJnb29nLXRhYi1iYXIiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBYfSk7ZnVuY3Rpb24gamQoYSl7dmFyIGI9e3RvcDoiYm90dG9tIixib3R0b206InRvcCIsc3RhcnQ6InJpZ2h0IixlbmQ6ImxlZnQifVthLmxvY2F0aW9uXSxjPWEuZWxlbWVudElkLGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTtkLnRleHRDb250ZW50PSJcbiAgICBmaWVsZHNldCB7XG4gICAgICBwYWRkaW5nOiAxMHB4O1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgIzM2OTtcbiAgICB9XG5cbiAgICAjIitjKyIgLmdvb2ctdGFiLWNvbnRlbnQge1xuICAgICAgbWluLWhlaWdodDogM2VtO1xuICAgICAgbWFyZ2luOiAwO1xuICAgICAgYm9yZGVyOiAiK2EuYm9yZGVyKyIgc29saWQgIithLmJvcmRlckNvbG9yKyI7XG4gICAgICBib3JkZXItdG9wOiAwO1xuICAgICAgaGVpZ2h0OiAiK2EuY29udGVudEhlaWdodCsiO1xuICAgICAgcGFkZGluZzogNHB4IDhweDtcbiAgICAgIG1hcmdpbi1yaWdodDogNHB4O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgIG92ZXJmbG93OiBhdXRvO1xuICAgIH1cblxuICAgICMiKwpjKyIgLmdvb2ctdGFiLWJhci0iK2EubG9jYXRpb24rIiAuZ29vZy10YWItc2VsZWN0ZWQge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICIrYS5ib3JkZXJDb2xvcisiO1xuICAgICAgYm9yZGVyLSIrYisiOiAwcHg7XG4gICAgfVxuXG4gICAgIyIrYysiIC5nb29nLXRhYi1iYXItIithLmxvY2F0aW9uKyIge1xuICAgICAgcGFkZGluZy0iK2EubG9jYXRpb24rIjogNXB4ICFpbXBvcnRhbnQ7XG4gICAgICBib3JkZXItIitiKyI6IDFweCBzb2xpZCAiK2EuYm9yZGVyQ29sb3IrIiAhaW1wb3J0YW50O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICB9XG5cbiAgICAjIitjKyIgLmdvb2ctdGFiLWJhciB7XG4gICAgICAgbWFyZ2luOiAwO1xuICAgICAgIGJvcmRlcjogMDtcbiAgICAgICBwYWRkaW5nOiAwO1xuICAgICAgIGxpc3Qtc3R5bGU6IG5vbmU7XG4gICAgICAgY3Vyc29yOiBkZWZhdWx0O1xuICAgICAgIG91dGxpbmU6IG5vbmU7XG4gICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgICBtYXJnaW4tcmlnaHQ6IDRweDtcbiAgICAgIH1cblxuICAgICAjIisKYysiIC5nb29nLXRhYiB7XG4gICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgIHBhZGRpbmc6IDRweCA4cHg7XG4gICAgICAgY29sb3I6IHZhcigtLWNvbGFiLXByaW1hcnktdGV4dC1jb2xvcik7XG4gICAgICAgdGV4dC1kZWNvcmF0aW9uOiBpbml0aWFsO1xuICAgICAgIGN1cnNvcjogZGVmYXVsdDtcbiAgICAgIH1cblxuICAgICAgIyIrYysiIC5nb29nLXRhYi1ob3ZlciB7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWNvbGFiLWhpZ2hsaWdodGVkLXN1cmZhY2UtY29sb3IpO1xuICAgICAgfVxuICAgICAgIjtyZXR1cm4gZH0KdmFyIGtkPWZ1bmN0aW9uKGEpe3ZhciBiPWEuZWxlbWVudElkLGM9YS50YWJOYW1lcyxkPWEuc2VsZWN0ZWRJbmRleDsiY29udGVudEJvcmRlciJpbiBhfHwoYS5jb250ZW50Qm9yZGVyPSIwcHgiKTsiY29udGVudEhlaWdodCJpbiBhfHwoYS5jb250ZW50SGVpZ2h0PSJpbml0aWFsIik7ImJvcmRlckNvbG9yImluIGF8fChhLmJvcmRlckNvbG9yPSJ2YXIoLS1jb2xhYi1ib3JkZXItY29sb3IpIik7YS5sb2NhdGlvbnx8KGEubG9jYXRpb249InRvcCIpO3ZhciBlPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiMiK2IpLGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zi5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYi1iYXIiKTt2YXIgaD1hLmxvY2F0aW9uO2YuY2xhc3NMaXN0LmFkZCgiZ29vZy10YWItYmFyLSIraCk7Zm9yKHZhciBrPVtdLHE9ZmEoYyksRz1xLm5leHQoKTshRy5kb25lO0c9cS5uZXh0KCkpe0c9Ry52YWx1ZTt2YXIgeD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKeC5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYiIpO3gudGV4dENvbnRlbnQ9RztmLmFwcGVuZENoaWxkKHgpO2sucHVzaCh4KX1oIT0iYm90dG9tIiYmZS5hcHBlbmRDaGlsZChmKTtxPW51bGw7aWYoaD09InRvcCJ8fGg9PSJib3R0b20iKXE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikscS5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYi1iYXItY2xlYXIiKTtoPT0idG9wIiYmcSYmZS5hcHBlbmRDaGlsZChxKTtHPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO0cuY2xhc3NMaXN0LmFkZCgiZ29vZy10YWItY29udGVudCIpO3ZhciBoYT1bXTtjPWZhKGMpO2Zvcih4PWMubmV4dCgpOyF4LmRvbmU7eD1jLm5leHQoKSl4PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHguaWQ9ZS5pZCsiX2NvbnRlbnRfIitoYS5sZW5ndGgseC5zdHlsZS5kaXNwbGF5PSJub25lIixHLmFwcGVuZENoaWxkKHgpLGhhLnB1c2goeCk7ZS5hcHBlbmRDaGlsZChHKTtoPT0iYm90dG9tIiYmKHEmJgplLmFwcGVuZENoaWxkKHEpLGUuYXBwZW5kQ2hpbGQoZikpO3ZhciBRPW5ldyBYKGgpO1NiKFEsZik7dmFyIFI9LTE7d2IoUSwic2VsZWN0IixmdW5jdGlvbihTKXtTPWsuaW5kZXhPZihTLnRhcmdldC5pKCkpO1MhPVImJihSPj0wJiZSPGhhLmxlbmd0aCYmKGhhW1JdLnN0eWxlLmRpc3BsYXk9Im5vbmUiLFI9LTEpLFM+PTAmJlM8aGEubGVuZ3RoJiYoUj1TLGhhW1JdLnN0eWxlLmRpc3BsYXk9ImlubGluZSIsd2luZG93LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCJyZXNpemUiKSksZ29vZ2xlLmNvbGFiLm91dHB1dC5yZXNpemVJZnJhbWVUb0NvbnRlbnQoKSksUS5KKEkoUSxSKSkpfSk7US5KKEkoUSxkKSk7d2luZG93W2JdPXtzZXRTZWxlY3RlZFRhYkluZGV4OmZ1bmN0aW9uKFMpe1EuSihJKFEsUykpfX07ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChqZChhKSl9LGxkPVsiY29sYWJfbGliIiwiY3JlYXRlVGFiQmFyIl0sWT1sOwpsZFswXWluIFl8fHR5cGVvZiBZLmV4ZWNTY3JpcHQ9PSJ1bmRlZmluZWQifHxZLmV4ZWNTY3JpcHQoInZhciAiK2xkWzBdKTtmb3IodmFyIFo7bGQubGVuZ3RoJiYoWj1sZC5zaGlmdCgpKTspbGQubGVuZ3RofHxrZD09PXZvaWQgMD9ZW1pdJiZZW1pdIT09T2JqZWN0LnByb3RvdHlwZVtaXT9ZPVlbWl06WT1ZW1pdPXt9OllbWl09a2Q7fSkuY2FsbCh0aGlzKTsKLy8gY2xhbmctZm9ybWF0IG9uCg==", + "ok": true, + "headers": [ + [ + "content-length", + "41785" + ], + [ + "content-type", + "application/javascript" + ] + ], + "status": 200, + "status_text": "" + } + }, + "base_uri": "https://localhost:8080/", + "height": 1000 + }, + "outputId": "a2244512-ac73-4b11-ec50-ebf6d28b13cd" + }, + "source": [ + "%%logica T1, T2, T3\n", + "\n", + "@Engine(\"sqlite\");\n", + "# Predicate using named arguments.\n", + "T1(a: x, b: y, s: x + y) :- x in Range(3), y in Range(3);\n", + "# Predicate using positional arguments.\n", + "T2(x, y, x + y) :- x in Range(3), y in Range(3);\n", + "\n", + "# It is allowed to have positional arguments followed by named arguments.\n", + "# When variable is missing in named argument, it is implied that\n", + "# the variable name is the same as the field name.\n", + "T3(x, y, z, a:, b:, s:) :- T1(a:, b:, s:), T2(x, y, z);\n" + ], + "execution_count": 41, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7f1e6c8c-d22d-11ef-a7c0-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id93\", \"tabNames\": [\"T1\", \"T2\", \"T3\", \"(Log)\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_ddd5675168" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7f1ece52-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id93\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_6bb5aca916" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7f20ac36-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_f2e2c2b232" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7f210c80-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id93_content_3\");\n", + "//# sourceURL=js_b06f63833f" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7f21abc2-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"7f210c80-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_1c5f6e9891" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7f2202f2-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id93\"].setSelectedTabIndex(3);\n", + "//# sourceURL=js_a0f80933e9" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7f24120e-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"7f20ac36-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_c188e37a80" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7f268336-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_7797b6c69d" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7f26da52-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id93_content_0\");\n", + "//# sourceURL=js_b62d73f8bf" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7f27302e-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"7f26da52-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_a0c270d495" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7f284810-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id93\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_2ff6a72263" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7f2b50aa-d22d-11ef-a7c0-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id94\", \"tabNames\": [\"SQL\", \"Result\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_c094b734fc" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7f2bb568-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id94\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_6feffe60e5" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7f2f88be-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_51414ff65d" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7f2ff182-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id94_content_0\");\n", + "//# sourceURL=js_221fb33d6a" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7f305532-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"7f2ff182-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_6ea4fd5ac7" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7f30afd2-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id94\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_3c86ac4d18" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The following query is stored at \u001b[1mT1_sql\u001b[0m variable.\n", + "SELECT\n", + " x_2.value AS a,\n", + " x_3.value AS b,\n", + " ((x_2.value) + (x_3.value)) AS s\n", + "FROM\n", + " JSON_EACH((select json_group_array(n) from (with recursive t as(select 0 as n union all select n + 1 as n from t where n + 1 < 3) select n from t) where n < 3)) as x_2, JSON_EACH((select json_group_array(n) from (with recursive t as(select 0 as n union all select n + 1 as n from t where n + 1 < 3) select n from t) where n < 3)) as x_3;\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7f327f88-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"7f2f88be-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_474979d532" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7f34fde4-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_2c4aff99d6" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7f356108-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id94_content_1\");\n", + "//# sourceURL=js_d837577eea" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7f35f3d4-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"7f356108-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_92883b2947" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7f3651ee-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id94\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_c27863a6b2" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The following table is stored at \u001b[1mT1\u001b[0m variable.\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
abs
0000
1011
2022
3101
4112
5123
6202
7213
8224
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7f386948-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"7f34fde4-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_e7e8211e96" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7f39fd6c-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"7f268336-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_a29f575838" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7f3bef82-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_e90a0d3e0a" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7f3c4f90-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id93_content_3\");\n", + "//# sourceURL=js_35bbd36745" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7f3cac06-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"7f3c4f90-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_f2daac8623" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7f3d03e0-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id93\"].setSelectedTabIndex(3);\n", + "//# sourceURL=js_941393f463" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7f3eda3a-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"7f3bef82-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_46a0524529" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7f4097a8-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_53985aaafc" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7f40f810-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id93_content_1\");\n", + "//# sourceURL=js_a5baa30e7c" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7f4156f2-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"7f40f810-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_5fda22717c" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7f41b4ee-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id93\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_29e2ec6847" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7f44a42e-d22d-11ef-a7c0-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id95\", \"tabNames\": [\"SQL\", \"Result\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_335a4ac596" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7f453aba-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id95\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_4655b2e44b" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7f475750-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_f58f5eae04" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7f47bdc6-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id95_content_0\");\n", + "//# sourceURL=js_5b61583f6b" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7f480ac4-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"7f47bdc6-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_0018c96345" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7f487da6-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id95\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_de85be413f" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The following query is stored at \u001b[1mT2_sql\u001b[0m variable.\n", + "SELECT\n", + " x_2.value AS col0,\n", + " x_3.value AS col1,\n", + " ((x_2.value) + (x_3.value)) AS col2\n", + "FROM\n", + " JSON_EACH((select json_group_array(n) from (with recursive t as(select 0 as n union all select n + 1 as n from t where n + 1 < 3) select n from t) where n < 3)) as x_2, JSON_EACH((select json_group_array(n) from (with recursive t as(select 0 as n union all select n + 1 as n from t where n + 1 < 3) select n from t) where n < 3)) as x_3;\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7f49ad0c-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"7f475750-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_167f572691" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7f4bb778-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_b83583b087" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7f4c0174-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id95_content_1\");\n", + "//# sourceURL=js_dc47a626fc" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7f4c6312-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"7f4c0174-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_7651320554" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7f4cadf4-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id95\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_b4d599461d" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The following table is stored at \u001b[1mT2\u001b[0m variable.\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
col0col1col2
0000
1011
2022
3101
4112
5123
6202
7213
8224
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7f4e508c-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"7f4bb778-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_8a5bc454ee" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7f4ff3ce-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"7f4097a8-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_fcfcab27fd" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7f520812-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_44be382160" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7f526370-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id93_content_3\");\n", + "//# sourceURL=js_281eb08365" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7f52bdf2-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"7f526370-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_81d6d5e2f2" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7f531a22-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id93\"].setSelectedTabIndex(3);\n", + "//# sourceURL=js_169552db5a" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7f5c5d08-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"7f520812-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_4c90e5b274" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7f5e6832-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_c673836325" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7f5eb1ca-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id93_content_2\");\n", + "//# sourceURL=js_e5c8f899be" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7f5ef590-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"7f5eb1ca-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_0d4238982b" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7f5f35fa-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id93\"].setSelectedTabIndex(2);\n", + "//# sourceURL=js_d44c5ce21a" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7f6150ba-d22d-11ef-a7c0-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id96\", \"tabNames\": [\"SQL\", \"Result\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_bdc9fe43e5" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7f61935e-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id96\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_88f8039725" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7f632872-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_197b09bbfb" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7f637ad4-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id96_content_0\");\n", + "//# sourceURL=js_416379a213" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7f63c048-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"7f637ad4-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_27c7185935" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7f640044-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id96\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_0b509675df" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The following query is stored at \u001b[1mT3_sql\u001b[0m variable.\n", + "SELECT\n", + " x_18.value AS col0,\n", + " x_19.value AS col1,\n", + " ((x_18.value) + (x_19.value)) AS col2,\n", + " x_14.value AS a,\n", + " x_15.value AS b,\n", + " ((x_14.value) + (x_15.value)) AS s\n", + "FROM\n", + " JSON_EACH((select json_group_array(n) from (with recursive t as(select 0 as n union all select n + 1 as n from t where n + 1 < 3) select n from t) where n < 3)) as x_14, JSON_EACH((select json_group_array(n) from (with recursive t as(select 0 as n union all select n + 1 as n from t where n + 1 < 3) select n from t) where n < 3)) as x_15, JSON_EACH((select json_group_array(n) from (with recursive t as(select 0 as n union all select n + 1 as n from t where n + 1 < 3) select n from t) where n < 3)) as x_18, JSON_EACH((select json_group_array(n) from (with recursive t as(select 0 as n union all select n + 1 as n from t where n + 1 < 3) select n from t) where n < 3)) as x_19;\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7f6531b2-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"7f632872-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_b2450aeaa0" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7f66e07a-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_aa18a65dd0" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7f672c92-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id96_content_1\");\n", + "//# sourceURL=js_d146484d7d" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7f67a7da-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"7f672c92-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_a83f49530e" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7f67ff32-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id96\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_dc1e283852" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The following table is stored at \u001b[1mT3\u001b[0m variable.\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
col0col1col2abs
0000000
1011000
2022000
3101000
4112000
5123000
6202000
7213000
8224000
9000011
10011011
11022011
12101011
13112011
14123011
15202011
16213011
17224011
18000022
19011022
20022022
21101022
22112022
23123022
24202022
25213022
26224022
27000101
28011101
29022101
30101101
31112101
32123101
33202101
34213101
35224101
36000112
37011112
38022112
39101112
40112112
41123112
42202112
43213112
44224112
45000123
46011123
47022123
48101123
49112123
50123123
51202123
52213123
53224123
54000202
55011202
56022202
57101202
58112202
59123202
60202202
61213202
62224202
63000213
64011213
65022213
66101213
67112213
68123213
69202213
70213213
71224213
72000224
73011224
74022224
75101224
76112224
77123224
78202224
79213224
80224224
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7f695a94-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"7f66e07a-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_8161593bf2" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7f6ae5b2-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"7f5e6832-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_c867332fd4" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7f6ca1cc-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_de8041df55" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7f6cf6c2-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id93_content_3\");\n", + "//# sourceURL=js_fee12c1bfd" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7f6d4802-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"7f6cf6c2-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_d41110ad69" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7f6da090-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id93\"].setSelectedTabIndex(3);\n", + "//# sourceURL=js_4a43015305" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "image/svg+xml": "\n\n\n\n\n\nConcertina\n\n\n\nT3\n\nT3\n\n\n\nT1\n\nT1\n\n\n\nT2\n\nT2\n\n\n\n", + "text/plain": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Running predicate: T3 (4 ms)\n", + "Running predicate: T1 (5 ms)\n", + "Running predicate: T2 (2 ms)\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7f99193c-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"7f6ca1cc-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_3bbc257a01" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7f9abfa8-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_20c6a59c22" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7f9b062a-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id93_content_0\");\n", + "//# sourceURL=js_bef2ab9836" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7f9b4b44-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"7f9b062a-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_bd9fcb467c" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7f9b89d8-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id93\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_6d34693eeb" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7f9c9cc4-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_76e911393d" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7f9ce2c4-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id94_content_1\");\n", + "//# sourceURL=js_3af1d3cd92" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7f9d2478-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"7f9ce2c4-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_9068568fe6" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7f9d6ee2-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id94\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_f195a0e89b" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7f9fb81e-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"7f9c9cc4-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_ada48e46ac" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + " \n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7fa20af6-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"7f9abfa8-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_db2371d432" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7fa44212-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_bdc8f98ff4" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7fa4c200-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id93_content_1\");\n", + "//# sourceURL=js_5b6727c9a7" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7fa50db4-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"7fa4c200-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_20208c4ed0" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7fa5828a-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id93\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_574fe98e7b" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7fadf4c4-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_f72c3e7d13" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7fae71e2-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id95_content_1\");\n", + "//# sourceURL=js_2ab9b413f6" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7faf058a-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"7fae71e2-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_18cea3e41d" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7fafb336-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id95\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_46672ef11f" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7fb3ccbe-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"7fadf4c4-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_fc1020f145" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + " \n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7fb74a88-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"7fa44212-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_e9cbc78b41" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7fbad702-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_f38f5ee6bf" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7fbb4a98-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id93_content_2\");\n", + "//# sourceURL=js_1eb51810a2" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7fbc128e-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"7fbb4a98-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_c627c6761f" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7fbc78b4-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id93\"].setSelectedTabIndex(2);\n", + "//# sourceURL=js_b686af50b5" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7fbefe7c-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_c2475742b3" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7fbf6f24-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id96_content_1\");\n", + "//# sourceURL=js_7d7a6afdd3" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7fbfe1fc-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"7fbf6f24-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_6a45c8d54b" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7fc06bb8-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id96\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_e1678568e2" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7fc5b9b0-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"7fbefe7c-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_45bebb04c5" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + " \n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"7fc94b48-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"7fbad702-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_03955da3aa" + ] + }, + "metadata": {} + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "ZvDxW-sSZE6Q" + }, + "source": [ + "### Writing database tables\n", + "\n", + "`@Ground` annotation associates Logica predicate with a database table. It has form\n", + "\n", + "```\n", + "@Ground(Table, \"dataset_name.tablename\");\n", + "```\n", + "\n", + "Or simply\n", + "\n", + "```\n", + "@Ground(Table)\n", + "```\n", + "\n", + "and then the table name is assumed to be `logica_test.Table`.\n", + "\n", + "When predicate associated with a table is used in another predicate then the table is written into the database and read.\n", + "\n", + "\n" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "G9juWkrvbaAe", + "colab": { + "resources": { + "http://localhost:8080/nbextensions/google.colab/tabbar_main.min.js": { + "data": "Ly8gY2xhbmctZm9ybWF0IG9mZgooZnVuY3Rpb24oKXt2YXIgZyxhYT1mdW5jdGlvbihhKXt2YXIgYj0wO3JldHVybiBmdW5jdGlvbigpe3JldHVybiBiPGEubGVuZ3RoP3tkb25lOiExLHZhbHVlOmFbYisrXX06e2RvbmU6ITB9fX0sYmE9dHlwZW9mIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzPT0iZnVuY3Rpb24iP09iamVjdC5kZWZpbmVQcm9wZXJ0eTpmdW5jdGlvbihhLGIsYyl7aWYoYT09QXJyYXkucHJvdG90eXBlfHxhPT1PYmplY3QucHJvdG90eXBlKXJldHVybiBhO2FbYl09Yy52YWx1ZTtyZXR1cm4gYX0sY2E9ZnVuY3Rpb24oYSl7YT1bIm9iamVjdCI9PXR5cGVvZiBnbG9iYWxUaGlzJiZnbG9iYWxUaGlzLGEsIm9iamVjdCI9PXR5cGVvZiB3aW5kb3cmJndpbmRvdywib2JqZWN0Ij09dHlwZW9mIHNlbGYmJnNlbGYsIm9iamVjdCI9PXR5cGVvZiBnbG9iYWwmJmdsb2JhbF07Zm9yKHZhciBiPTA7YjxhLmxlbmd0aDsrK2Ipe3ZhciBjPWFbYl07aWYoYyYmYy5NYXRoPT1NYXRoKXJldHVybiBjfXRocm93IEVycm9yKCJDYW5ub3QgZmluZCBnbG9iYWwgb2JqZWN0Iik7Cn0sZGE9Y2EodGhpcyksZWE9ZnVuY3Rpb24oYSxiKXtpZihiKWE6e3ZhciBjPWRhO2E9YS5zcGxpdCgiLiIpO2Zvcih2YXIgZD0wO2Q8YS5sZW5ndGgtMTtkKyspe3ZhciBlPWFbZF07aWYoIShlIGluIGMpKWJyZWFrIGE7Yz1jW2VdfWE9YVthLmxlbmd0aC0xXTtkPWNbYV07Yj1iKGQpO2IhPWQmJmIhPW51bGwmJmJhKGMsYSx7Y29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOmJ9KX19OwplYSgiU3ltYm9sIixmdW5jdGlvbihhKXtpZihhKXJldHVybiBhO3ZhciBiPWZ1bmN0aW9uKGYsaCl7dGhpcy5nPWY7YmEodGhpcywiZGVzY3JpcHRpb24iLHtjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6aH0pfTtiLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmd9O3ZhciBjPSJqc2NvbXBfc3ltYm9sXyIrKE1hdGgucmFuZG9tKCkqMUU5Pj4+MCkrIl8iLGQ9MCxlPWZ1bmN0aW9uKGYpe2lmKHRoaXMgaW5zdGFuY2VvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoIlN5bWJvbCBpcyBub3QgYSBjb25zdHJ1Y3RvciIpO3JldHVybiBuZXcgYihjKyhmfHwiIikrIl8iK2QrKyxmKX07cmV0dXJuIGV9KTsKdmFyIGZhPWZ1bmN0aW9uKGEpe3ZhciBiPXR5cGVvZiBTeW1ib2whPSJ1bmRlZmluZWQiJiZTeW1ib2wuaXRlcmF0b3ImJmFbU3ltYm9sLml0ZXJhdG9yXTtpZihiKXJldHVybiBiLmNhbGwoYSk7aWYodHlwZW9mIGEubGVuZ3RoPT0ibnVtYmVyIilyZXR1cm57bmV4dDphYShhKX07dGhyb3cgRXJyb3IoU3RyaW5nKGEpKyIgaXMgbm90IGFuIGl0ZXJhYmxlIG9yIEFycmF5TGlrZSIpO307ZWEoIlN5bWJvbC5kaXNwb3NlIixmdW5jdGlvbihhKXtyZXR1cm4gYT9hOlN5bWJvbCgiU3ltYm9sLmRpc3Bvc2UiKX0pOy8qCgogQ29weXJpZ2h0IFRoZSBDbG9zdXJlIExpYnJhcnkgQXV0aG9ycy4KIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wCiovCnZhciBsPXRoaXN8fHNlbGYsaWE9ZnVuY3Rpb24oYSl7YS5JYT12b2lkIDA7YS5WPWZ1bmN0aW9uKCl7cmV0dXJuIGEuSWE/YS5JYTphLklhPW5ldyBhfX0samE9ZnVuY3Rpb24oYSl7dmFyIGI9dHlwZW9mIGE7cmV0dXJuIGIhPSJvYmplY3QiP2I6YT9BcnJheS5pc0FycmF5KGEpPyJhcnJheSI6YjoibnVsbCJ9LGthPWZ1bmN0aW9uKGEpe3ZhciBiPWphKGEpO3JldHVybiBiPT0iYXJyYXkifHxiPT0ib2JqZWN0IiYmdHlwZW9mIGEubGVuZ3RoPT0ibnVtYmVyIn0sbT1mdW5jdGlvbihhKXt2YXIgYj10eXBlb2YgYTtyZXR1cm4gYj09Im9iamVjdCImJmEhPW51bGx8fGI9PSJmdW5jdGlvbiJ9LG5hPWZ1bmN0aW9uKGEpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYSxsYSkmJmFbbGFdfHwoYVtsYV09KyttYSl9LGxhPSJjbG9zdXJlX3VpZF8iKyhNYXRoLnJhbmRvbSgpKjFFOT4+PjApLG1hPTAsbj1mdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoKXt9Yy5wcm90b3R5cGU9CmIucHJvdG90eXBlO2EubD1iLnByb3RvdHlwZTthLnByb3RvdHlwZT1uZXcgYzthLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1hO2EucWQ9ZnVuY3Rpb24oZCxlLGYpe2Zvcih2YXIgaD1BcnJheShhcmd1bWVudHMubGVuZ3RoLTIpLGs9MjtrPGFyZ3VtZW50cy5sZW5ndGg7aysrKWhbay0yXT1hcmd1bWVudHNba107cmV0dXJuIGIucHJvdG90eXBlW2VdLmFwcGx5KGQsaCl9fTtmdW5jdGlvbiBvYShhLGIpe2lmKEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKUVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsb2EpO2Vsc2V7dmFyIGM9RXJyb3IoKS5zdGFjaztjJiYodGhpcy5zdGFjaz1jKX1hJiYodGhpcy5tZXNzYWdlPVN0cmluZyhhKSk7YiE9PXZvaWQgMCYmKHRoaXMuY2F1c2U9Yil9bihvYSxFcnJvcik7b2EucHJvdG90eXBlLm5hbWU9IkN1c3RvbUVycm9yIjt2YXIgcGE7ZnVuY3Rpb24gcWEoYSxiKXthPWEuc3BsaXQoIiVzIik7Zm9yKHZhciBjPSIiLGQ9YS5sZW5ndGgtMSxlPTA7ZTxkO2UrKyljKz1hW2VdKyhlPGIubGVuZ3RoP2JbZV06IiVzIik7b2EuY2FsbCh0aGlzLGMrYVtkXSl9bihxYSxvYSk7cWEucHJvdG90eXBlLm5hbWU9IkFzc2VydGlvbkVycm9yIjtmdW5jdGlvbiByYShhLGIsYyxkKXt2YXIgZT0iQXNzZXJ0aW9uIGZhaWxlZCI7aWYoYyl7ZSs9IjogIitjO3ZhciBmPWR9ZWxzZSBhJiYoZSs9IjogIithLGY9Yik7dGhyb3cgbmV3IHFhKCIiK2UsZnx8W10pO30KdmFyIHA9ZnVuY3Rpb24oYSxiLGMpe2F8fHJhKCIiLG51bGwsYixBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMikpO3JldHVybiBhfSxzYT1mdW5jdGlvbihhLGIsYyl7bShhKSYmYS5ub2RlVHlwZT09MXx8cmEoIkV4cGVjdGVkIEVsZW1lbnQgYnV0IGdvdCAlczogJXMuIixbamEoYSksYV0sYixBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMikpfSx1YT1mdW5jdGlvbihhLGIsYyxkKXthIGluc3RhbmNlb2YgYnx8cmEoIkV4cGVjdGVkIGluc3RhbmNlb2YgJXMgYnV0IGdvdCAlcy4iLFt0YShiKSx0YShhKV0sYyxBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMykpfTsKZnVuY3Rpb24gdGEoYSl7cmV0dXJuIGEgaW5zdGFuY2VvZiBGdW5jdGlvbj9hLmRpc3BsYXlOYW1lfHxhLm5hbWV8fCJ1bmtub3duIHR5cGUgbmFtZSI6YSBpbnN0YW5jZW9mIE9iamVjdD9hLmNvbnN0cnVjdG9yLmRpc3BsYXlOYW1lfHxhLmNvbnN0cnVjdG9yLm5hbWV8fE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhKTphPT09bnVsbD8ibnVsbCI6dHlwZW9mIGF9O3ZhciB2YT1BcnJheS5wcm90b3R5cGUuaW5kZXhPZj9mdW5jdGlvbihhLGIpe3AoYS5sZW5ndGghPW51bGwpO3JldHVybiBBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKGEsYix2b2lkIDApfTpmdW5jdGlvbihhLGIpe2lmKHR5cGVvZiBhPT09InN0cmluZyIpcmV0dXJuIHR5cGVvZiBiIT09InN0cmluZyJ8fGIubGVuZ3RoIT0xPy0xOmEuaW5kZXhPZihiLDApO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWlmKGMgaW4gYSYmYVtjXT09PWIpcmV0dXJuIGM7cmV0dXJuLTF9LHdhPUFycmF5LnByb3RvdHlwZS5mb3JFYWNoP2Z1bmN0aW9uKGEsYil7cChhLmxlbmd0aCE9bnVsbCk7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChhLGIsdm9pZCAwKX06ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9YS5sZW5ndGgsZD10eXBlb2YgYT09PSJzdHJpbmciP2Euc3BsaXQoIiIpOmEsZT0wO2U8YztlKyspZSBpbiBkJiZiLmNhbGwodm9pZCAwLGRbZV0sZSxhKX07CmZ1bmN0aW9uIHhhKGEsYil7Yj12YShhLGIpO3ZhciBjO2lmKGM9Yj49MClwKGEubGVuZ3RoIT1udWxsKSxBcnJheS5wcm90b3R5cGUuc3BsaWNlLmNhbGwoYSxiLDEpO3JldHVybiBjfWZ1bmN0aW9uIHlhKGEpe3ZhciBiPWEubGVuZ3RoO2lmKGI+MCl7Zm9yKHZhciBjPUFycmF5KGIpLGQ9MDtkPGI7ZCsrKWNbZF09YVtkXTtyZXR1cm4gY31yZXR1cm5bXX1mdW5jdGlvbiB6YShhLGIsYyxkKXtwKGEubGVuZ3RoIT1udWxsKTtBcnJheS5wcm90b3R5cGUuc3BsaWNlLmFwcGx5KGEsQWEoYXJndW1lbnRzLDEpKX1mdW5jdGlvbiBBYShhLGIsYyl7cChhLmxlbmd0aCE9bnVsbCk7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg8PTI/QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYSxiKTpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhLGIsYyl9O2Z1bmN0aW9uIEJhKGEsYixjKXtmb3IodmFyIGQgaW4gYSliLmNhbGwoYyxhW2RdLGQsYSl9ZnVuY3Rpb24gQ2EoYSxiKXtmb3IodmFyIGMgaW4gYSlpZihhW2NdPT1iKXJldHVybiEwO3JldHVybiExfWZ1bmN0aW9uIERhKGEsYixjKXtpZihhIT09bnVsbCYmYiBpbiBhKXRocm93IEVycm9yKCdUaGUgb2JqZWN0IGFscmVhZHkgY29udGFpbnMgdGhlIGtleSAiJytiKyciJyk7YVtiXT1jfWZ1bmN0aW9uIEVhKGEpe3ZhciBiPXt9LGM7Zm9yKGMgaW4gYSliW2FbY11dPWM7cmV0dXJuIGJ9dmFyIEZhPSJjb25zdHJ1Y3RvciBoYXNPd25Qcm9wZXJ0eSBpc1Byb3RvdHlwZU9mIHByb3BlcnR5SXNFbnVtZXJhYmxlIHRvTG9jYWxlU3RyaW5nIHRvU3RyaW5nIHZhbHVlT2YiLnNwbGl0KCIgIik7CmZ1bmN0aW9uIEdhKGEsYil7Zm9yKHZhciBjLGQsZT0xO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspe2Q9YXJndW1lbnRzW2VdO2ZvcihjIGluIGQpYVtjXT1kW2NdO2Zvcih2YXIgZj0wO2Y8RmEubGVuZ3RoO2YrKyljPUZhW2ZdLE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChkLGMpJiYoYVtjXT1kW2NdKX19O3ZhciBIYT1TdHJpbmcucHJvdG90eXBlLnRyaW0/ZnVuY3Rpb24oYSl7cmV0dXJuIGEudHJpbSgpfTpmdW5jdGlvbihhKXtyZXR1cm4vXltcc1x4YTBdKihbXHNcU10qPylbXHNceGEwXSokLy5leGVjKGEpWzFdfTsvKgoKIENvcHlyaWdodCBHb29nbGUgTExDCiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMAoqLwp2YXIgSWE9e307dmFyIEphPWZ1bmN0aW9uKGEpe2lmKElhIT09SWEpdGhyb3cgRXJyb3IoIkJhZCBzZWNyZXQiKTt0aGlzLmc9YX07SmEucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ307bmV3IEphKCJhYm91dDpibGFuayIpO25ldyBKYSgiYWJvdXQ6aW52YWxpZCN6Q2xvc3VyZXoiKTt2YXIgS2E9W10sTGE9ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJBIFVSTCB3aXRoIGNvbnRlbnQgJyIrYSsiJyB3YXMgc2FuaXRpemVkIGF3YXkuIil9O0thLmluZGV4T2YoTGEpPT09LTEmJkthLnB1c2goTGEpO3ZhciBNYSxOYTthOntmb3IodmFyIE9hPVsiQ0xPU1VSRV9GTEFHUyJdLFBhPWwsUWE9MDtRYTxPYS5sZW5ndGg7UWErKylpZihQYT1QYVtPYVtRYV1dLFBhPT1udWxsKXtOYT1udWxsO2JyZWFrIGF9TmE9UGF9dmFyIFJhPU5hJiZOYVs2MTA0MDEzMDFdO01hPVJhIT1udWxsP1JhOiExO2Z1bmN0aW9uIFNhKCl7dmFyIGE9bC5uYXZpZ2F0b3I7cmV0dXJuIGEmJihhPWEudXNlckFnZW50KT9hOiIifXZhciBUYSxVYT1sLm5hdmlnYXRvcjtUYT1VYT9VYS51c2VyQWdlbnREYXRhfHxudWxsOm51bGw7ZnVuY3Rpb24gcihhKXtyZXR1cm4gU2EoKS5pbmRleE9mKGEpIT0tMX07dmFyIFZhPXIoIkVkZ2UiKSx0PXIoIkdlY2tvIikmJiEoU2EoKS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoIndlYmtpdCIpIT0tMSYmIXIoIkVkZ2UiKSkmJiEocigiVHJpZGVudCIpfHxyKCJNU0lFIikpJiYhcigiRWRnZSIpLHU9U2EoKS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoIndlYmtpdCIpIT0tMSYmIXIoIkVkZ2UiKSx2PU1hJiZUYSYmVGEucGxhdGZvcm0/VGEucGxhdGZvcm09PT0ibWFjT1MiOnIoIk1hY2ludG9zaCIpO3ZhciBYYT1mdW5jdGlvbihhLGIpe0JhKGIsZnVuY3Rpb24oYyxkKXtkPT0ic3R5bGUiP2Euc3R5bGUuY3NzVGV4dD1jOmQ9PSJjbGFzcyI/YS5jbGFzc05hbWU9YzpkPT0iZm9yIj9hLmh0bWxGb3I9YzpXYS5oYXNPd25Qcm9wZXJ0eShkKT9hLnNldEF0dHJpYnV0ZShXYVtkXSxjKTpkLmxhc3RJbmRleE9mKCJhcmlhLSIsMCk9PTB8fGQubGFzdEluZGV4T2YoImRhdGEtIiwwKT09MD9hLnNldEF0dHJpYnV0ZShkLGMpOmFbZF09Y30pfSxXYT17Y2VsbHBhZGRpbmc6ImNlbGxQYWRkaW5nIixjZWxsc3BhY2luZzoiY2VsbFNwYWNpbmciLGNvbHNwYW46ImNvbFNwYW4iLGZyYW1lYm9yZGVyOiJmcmFtZUJvcmRlciIsaGVpZ2h0OiJoZWlnaHQiLG1heGxlbmd0aDoibWF4TGVuZ3RoIixub25jZToibm9uY2UiLHJvbGU6InJvbGUiLHJvd3NwYW46InJvd1NwYW4iLHR5cGU6InR5cGUiLHVzZW1hcDoidXNlTWFwIix2YWxpZ246InZBbGlnbiIsd2lkdGg6IndpZHRoIn0sWWE9ZnVuY3Rpb24oYSwKYixjKXtmdW5jdGlvbiBkKGspe2smJmIuYXBwZW5kQ2hpbGQodHlwZW9mIGs9PT0ic3RyaW5nIj9hLmNyZWF0ZVRleHROb2RlKGspOmspfWZvcih2YXIgZT0yO2U8Yy5sZW5ndGg7ZSsrKXt2YXIgZj1jW2VdO2lmKCFrYShmKXx8bShmKSYmZi5ub2RlVHlwZT4wKWQoZik7ZWxzZXthOntpZihmJiZ0eXBlb2YgZi5sZW5ndGg9PSJudW1iZXIiKXtpZihtKGYpKXt2YXIgaD10eXBlb2YgZi5pdGVtPT0iZnVuY3Rpb24ifHx0eXBlb2YgZi5pdGVtPT0ic3RyaW5nIjticmVhayBhfWlmKHR5cGVvZiBmPT09ImZ1bmN0aW9uIil7aD10eXBlb2YgZi5pdGVtPT0iZnVuY3Rpb24iO2JyZWFrIGF9fWg9ITF9d2EoaD95YShmKTpmLGQpfX19LFphPWZ1bmN0aW9uKGEsYil7Yj1TdHJpbmcoYik7YS5jb250ZW50VHlwZT09PSJhcHBsaWNhdGlvbi94aHRtbCt4bWwiJiYoYj1iLnRvTG93ZXJDYXNlKCkpO3JldHVybiBhLmNyZWF0ZUVsZW1lbnQoYil9LCRhPWZ1bmN0aW9uKGEpe2EmJmEucGFyZW50Tm9kZSYmCmEucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhKX0sYWI9ZnVuY3Rpb24oYSxiKXtpZighYXx8IWIpcmV0dXJuITE7aWYoYS5jb250YWlucyYmYi5ub2RlVHlwZT09MSlyZXR1cm4gYT09Ynx8YS5jb250YWlucyhiKTtpZih0eXBlb2YgYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiE9InVuZGVmaW5lZCIpcmV0dXJuIGE9PWJ8fCEhKGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24oYikmMTYpO2Zvcig7YiYmYSE9YjspYj1iLnBhcmVudE5vZGU7cmV0dXJuIGI9PWF9LGJiPWZ1bmN0aW9uKGEpe3AoYSwiTm9kZSBjYW5ub3QgYmUgbnVsbCBvciB1bmRlZmluZWQuIik7cmV0dXJuIGEubm9kZVR5cGU9PTk/YTphLm93bmVyRG9jdW1lbnR8fGEuZG9jdW1lbnR9LGNiPWZ1bmN0aW9uKGEsYil7Yj9hLnRhYkluZGV4PTA6KGEudGFiSW5kZXg9LTEsYS5yZW1vdmVBdHRyaWJ1dGUoInRhYkluZGV4IikpfSxkYj1mdW5jdGlvbihhKXtyZXR1cm4gYS5oYXNBdHRyaWJ1dGUoInRhYmluZGV4Iil9LGViPQpmdW5jdGlvbihhKXthPWEudGFiSW5kZXg7cmV0dXJuIHR5cGVvZiBhPT09Im51bWJlciImJmE+PTAmJmE8MzI3Njh9LGZiPWZ1bmN0aW9uKGEpe3RoaXMuZz1hfHxsLmRvY3VtZW50fHxkb2N1bWVudH07ZmIucHJvdG90eXBlLmk9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nO3JldHVybiB0eXBlb2YgYT09PSJzdHJpbmciP2IuZ2V0RWxlbWVudEJ5SWQoYSk6YX07ZmIucHJvdG90eXBlLmg9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXMuZyxlPWFyZ3VtZW50cyxmPWVbMV0saD1aYShkLFN0cmluZyhlWzBdKSk7ZiYmKHR5cGVvZiBmPT09InN0cmluZyI/aC5jbGFzc05hbWU9ZjpBcnJheS5pc0FycmF5KGYpP2guY2xhc3NOYW1lPWYuam9pbigiICIpOlhhKGgsZikpO2UubGVuZ3RoPjImJllhKGQsaCxlKTtyZXR1cm4gaH07dmFyIHc9ZnVuY3Rpb24oKXt0aGlzLmJhPXRoaXMuYmE7dGhpcy5rYT10aGlzLmthfTt3LnByb3RvdHlwZS5iYT0hMTt3LnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7dGhpcy5iYXx8KHRoaXMuYmE9ITAsdGhpcy5DKCkpfTt3LnByb3RvdHlwZVtTeW1ib2wuZGlzcG9zZV09ZnVuY3Rpb24oKXt0aGlzLmRpc3Bvc2UoKX07dy5wcm90b3R5cGUuQz1mdW5jdGlvbigpe2lmKHRoaXMua2EpZm9yKDt0aGlzLmthLmxlbmd0aDspdGhpcy5rYS5zaGlmdCgpKCl9O3ZhciB5PWZ1bmN0aW9uKGEsYil7dGhpcy50eXBlPWE7dGhpcy51PXRoaXMudGFyZ2V0PWI7dGhpcy5kZWZhdWx0UHJldmVudGVkPXRoaXMuQT0hMX07eS5wcm90b3R5cGUudj1mdW5jdGlvbigpe3RoaXMuQT0hMH07eS5wcm90b3R5cGUuaj1mdW5jdGlvbigpe3RoaXMuZGVmYXVsdFByZXZlbnRlZD0hMH07dmFyIGdiPWZ1bmN0aW9uKCl7aWYoIWwuYWRkRXZlbnRMaXN0ZW5lcnx8IU9iamVjdC5kZWZpbmVQcm9wZXJ0eSlyZXR1cm4hMTt2YXIgYT0hMSxiPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwicGFzc2l2ZSIse2dldDpmdW5jdGlvbigpe2E9ITB9fSk7dHJ5e3ZhciBjPWZ1bmN0aW9uKCl7fTtsLmFkZEV2ZW50TGlzdGVuZXIoInRlc3QiLGMsYik7bC5yZW1vdmVFdmVudExpc3RlbmVyKCJ0ZXN0IixjLGIpfWNhdGNoKGQpe31yZXR1cm4gYX0oKTt2YXIgej1mdW5jdGlvbihhLGIpe3kuY2FsbCh0aGlzLGE/YS50eXBlOiIiKTt0aGlzLnJlbGF0ZWRUYXJnZXQ9dGhpcy51PXRoaXMudGFyZ2V0PW51bGw7dGhpcy5idXR0b249dGhpcy5zY3JlZW5ZPXRoaXMuc2NyZWVuWD10aGlzLmNsaWVudFk9dGhpcy5jbGllbnRYPTA7dGhpcy5rZXk9IiI7dGhpcy5nPTA7dGhpcy5tZXRhS2V5PXRoaXMuc2hpZnRLZXk9dGhpcy5hbHRLZXk9dGhpcy5jdHJsS2V5PSExO3RoaXMuc3RhdGU9bnVsbDt0aGlzLkc9ITE7dGhpcy5wb2ludGVySWQ9MDt0aGlzLnBvaW50ZXJUeXBlPSIiO3RoaXMudGltZVN0YW1wPTA7dGhpcy5oPW51bGw7aWYoYSl7dmFyIGM9dGhpcy50eXBlPWEudHlwZSxkPWEuY2hhbmdlZFRvdWNoZXMmJmEuY2hhbmdlZFRvdWNoZXMubGVuZ3RoP2EuY2hhbmdlZFRvdWNoZXNbMF06bnVsbDt0aGlzLnRhcmdldD1hLnRhcmdldHx8YS5zcmNFbGVtZW50O3RoaXMudT1iO2I9YS5yZWxhdGVkVGFyZ2V0O2J8fChjPT0ibW91c2VvdmVyIj8KYj1hLmZyb21FbGVtZW50OmM9PSJtb3VzZW91dCImJihiPWEudG9FbGVtZW50KSk7dGhpcy5yZWxhdGVkVGFyZ2V0PWI7ZD8odGhpcy5jbGllbnRYPWQuY2xpZW50WCE9PXZvaWQgMD9kLmNsaWVudFg6ZC5wYWdlWCx0aGlzLmNsaWVudFk9ZC5jbGllbnRZIT09dm9pZCAwP2QuY2xpZW50WTpkLnBhZ2VZLHRoaXMuc2NyZWVuWD1kLnNjcmVlblh8fDAsdGhpcy5zY3JlZW5ZPWQuc2NyZWVuWXx8MCk6KHRoaXMuY2xpZW50WD1hLmNsaWVudFghPT12b2lkIDA/YS5jbGllbnRYOmEucGFnZVgsdGhpcy5jbGllbnRZPWEuY2xpZW50WSE9PXZvaWQgMD9hLmNsaWVudFk6YS5wYWdlWSx0aGlzLnNjcmVlblg9YS5zY3JlZW5YfHwwLHRoaXMuc2NyZWVuWT1hLnNjcmVlbll8fDApO3RoaXMuYnV0dG9uPWEuYnV0dG9uO3RoaXMuZz1hLmtleUNvZGV8fDA7dGhpcy5rZXk9YS5rZXl8fCIiO3RoaXMuY3RybEtleT1hLmN0cmxLZXk7dGhpcy5hbHRLZXk9YS5hbHRLZXk7dGhpcy5zaGlmdEtleT1hLnNoaWZ0S2V5Owp0aGlzLm1ldGFLZXk9YS5tZXRhS2V5O3RoaXMuRz12P2EubWV0YUtleTphLmN0cmxLZXk7dGhpcy5wb2ludGVySWQ9YS5wb2ludGVySWR8fDA7dGhpcy5wb2ludGVyVHlwZT1hLnBvaW50ZXJUeXBlO3RoaXMuc3RhdGU9YS5zdGF0ZTt0aGlzLnRpbWVTdGFtcD1hLnRpbWVTdGFtcDt0aGlzLmg9YTthLmRlZmF1bHRQcmV2ZW50ZWQmJnoubC5qLmNhbGwodGhpcyl9fTtuKHoseSk7ei5wcm90b3R5cGUudj1mdW5jdGlvbigpe3oubC52LmNhbGwodGhpcyk7dGhpcy5oLnN0b3BQcm9wYWdhdGlvbj90aGlzLmguc3RvcFByb3BhZ2F0aW9uKCk6dGhpcy5oLmNhbmNlbEJ1YmJsZT0hMH07ei5wcm90b3R5cGUuaj1mdW5jdGlvbigpe3oubC5qLmNhbGwodGhpcyk7dmFyIGE9dGhpcy5oO2EucHJldmVudERlZmF1bHQ/YS5wcmV2ZW50RGVmYXVsdCgpOmEucmV0dXJuVmFsdWU9ITF9O3ZhciBoYj0iY2xvc3VyZV9saXN0ZW5hYmxlXyIrKE1hdGgucmFuZG9tKCkqMUU2fDApLGliPWZ1bmN0aW9uKGEpe3JldHVybiEoIWF8fCFhW2hiXSl9O3ZhciBqYj0wO3ZhciBrYj1mdW5jdGlvbihhLGIsYyxkLGUpe3RoaXMubGlzdGVuZXI9YTt0aGlzLnByb3h5PW51bGw7dGhpcy5zcmM9Yjt0aGlzLnR5cGU9Yzt0aGlzLmNhcHR1cmU9ISFkO3RoaXMucGE9ZTt0aGlzLmtleT0rK2piO3RoaXMuamE9dGhpcy5vYT0hMX0sbGI9ZnVuY3Rpb24oYSl7YS5qYT0hMDthLmxpc3RlbmVyPW51bGw7YS5wcm94eT1udWxsO2Euc3JjPW51bGw7YS5wYT1udWxsfTt2YXIgbWI9ZnVuY3Rpb24oYSl7dGhpcy5zcmM9YTt0aGlzLmc9e307dGhpcy5oPTB9O21iLnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZj1hLnRvU3RyaW5nKCk7YT10aGlzLmdbZl07YXx8KGE9dGhpcy5nW2ZdPVtdLHRoaXMuaCsrKTt2YXIgaD1uYihhLGIsZCxlKTtoPi0xPyhiPWFbaF0sY3x8KGIub2E9ITEpKTooYj1uZXcga2IoYix0aGlzLnNyYyxmLCEhZCxlKSxiLm9hPWMsYS5wdXNoKGIpKTtyZXR1cm4gYn07CnZhciBvYj1mdW5jdGlvbihhLGIpe3ZhciBjPWIudHlwZTtjIGluIGEuZyYmeGEoYS5nW2NdLGIpJiYobGIoYiksYS5nW2NdLmxlbmd0aD09MCYmKGRlbGV0ZSBhLmdbY10sYS5oLS0pKX0scGI9ZnVuY3Rpb24oYSxiLGMsZCxlKXthPWEuZ1tiLnRvU3RyaW5nKCldO2I9LTE7YSYmKGI9bmIoYSxjLGQsZSkpO3JldHVybiBiPi0xP2FbYl06bnVsbH0sbmI9ZnVuY3Rpb24oYSxiLGMsZCl7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDsrK2Upe3ZhciBmPWFbZV07aWYoIWYuamEmJmYubGlzdGVuZXI9PWImJmYuY2FwdHVyZT09ISFjJiZmLnBhPT1kKXJldHVybiBlfXJldHVybi0xfTt2YXIgcWI9ImNsb3N1cmVfbG1fIisoTWF0aC5yYW5kb20oKSoxRTZ8MCkscmI9e30sc2I9MCx1Yj1mdW5jdGlvbihhLGIsYyxkLGUpe2lmKGQmJmQub25jZSlyZXR1cm4gdGIoYSxiLGMsZCxlKTtpZihBcnJheS5pc0FycmF5KGIpKXtmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKyl1YihhLGJbZl0sYyxkLGUpO3JldHVybiBudWxsfWM9dmIoYyk7cmV0dXJuIGliKGEpP3diKGEsYixjLG0oZCk/ISFkLmNhcHR1cmU6ISFkLGUpOnhiKGEsYixjLCExLGQsZSl9LHhiPWZ1bmN0aW9uKGEsYixjLGQsZSxmKXtpZighYil0aHJvdyBFcnJvcigiSW52YWxpZCBldmVudCB0eXBlIik7dmFyIGg9bShlKT8hIWUuY2FwdHVyZTohIWUsaz15YihhKTtrfHwoYVtxYl09az1uZXcgbWIoYSkpO2M9ay5hZGQoYixjLGQsaCxmKTtpZihjLnByb3h5KXJldHVybiBjO2Q9emIoKTtjLnByb3h5PWQ7ZC5zcmM9YTtkLmxpc3RlbmVyPWM7aWYoYS5hZGRFdmVudExpc3RlbmVyKWdifHwoZT1oKSxlPT09dm9pZCAwJiYKKGU9ITEpLGEuYWRkRXZlbnRMaXN0ZW5lcihiLnRvU3RyaW5nKCksZCxlKTtlbHNlIGlmKGEuYXR0YWNoRXZlbnQpYS5hdHRhY2hFdmVudChBYihiLnRvU3RyaW5nKCkpLGQpO2Vsc2UgaWYoYS5hZGRMaXN0ZW5lciYmYS5yZW1vdmVMaXN0ZW5lcilwKGI9PT0iY2hhbmdlIiwiTWVkaWFRdWVyeUxpc3Qgb25seSBoYXMgYSBjaGFuZ2UgZXZlbnQiKSxhLmFkZExpc3RlbmVyKGQpO2Vsc2UgdGhyb3cgRXJyb3IoImFkZEV2ZW50TGlzdGVuZXIgYW5kIGF0dGFjaEV2ZW50IGFyZSB1bmF2YWlsYWJsZS4iKTtzYisrO3JldHVybiBjfSx6Yj1mdW5jdGlvbigpe3ZhciBhPUJiLGI9ZnVuY3Rpb24oYyl7cmV0dXJuIGEuY2FsbChiLnNyYyxiLmxpc3RlbmVyLGMpfTtyZXR1cm4gYn0sdGI9ZnVuY3Rpb24oYSxiLGMsZCxlKXtpZihBcnJheS5pc0FycmF5KGIpKXtmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKyl0YihhLGJbZl0sYyxkLGUpO3JldHVybiBudWxsfWM9dmIoYyk7cmV0dXJuIGliKGEpPwphLkEuYWRkKFN0cmluZyhiKSxjLCEwLG0oZCk/ISFkLmNhcHR1cmU6ISFkLGUpOnhiKGEsYixjLCEwLGQsZSl9LENiPWZ1bmN0aW9uKGEsYixjLGQsZSl7aWYoQXJyYXkuaXNBcnJheShiKSlmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKylDYihhLGJbZl0sYyxkLGUpO2Vsc2UgZD1tKGQpPyEhZC5jYXB0dXJlOiEhZCxjPXZiKGMpLGliKGEpPyhhPWEuQSxiPVN0cmluZyhiKS50b1N0cmluZygpLGIgaW4gYS5nJiYoZj1hLmdbYl0sYz1uYihmLGMsZCxlKSxjPi0xJiYobGIoZltjXSkscChmLmxlbmd0aCE9bnVsbCksQXJyYXkucHJvdG90eXBlLnNwbGljZS5jYWxsKGYsYywxKSxmLmxlbmd0aD09MCYmKGRlbGV0ZSBhLmdbYl0sYS5oLS0pKSkpOmEmJihhPXliKGEpKSYmKGM9cGIoYSxiLGMsZCxlKSkmJkEoYyl9LEE9ZnVuY3Rpb24oYSl7aWYodHlwZW9mIGEhPT0ibnVtYmVyIiYmYSYmIWEuamEpe3ZhciBiPWEuc3JjO2lmKGliKGIpKW9iKGIuQSxhKTtlbHNle3ZhciBjPWEudHlwZSwKZD1hLnByb3h5O2IucmVtb3ZlRXZlbnRMaXN0ZW5lcj9iLnJlbW92ZUV2ZW50TGlzdGVuZXIoYyxkLGEuY2FwdHVyZSk6Yi5kZXRhY2hFdmVudD9iLmRldGFjaEV2ZW50KEFiKGMpLGQpOmIuYWRkTGlzdGVuZXImJmIucmVtb3ZlTGlzdGVuZXImJmIucmVtb3ZlTGlzdGVuZXIoZCk7c2ItLTsoYz15YihiKSk/KG9iKGMsYSksYy5oPT0wJiYoYy5zcmM9bnVsbCxiW3FiXT1udWxsKSk6bGIoYSl9fX0sQWI9ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW4gcmI/cmJbYV06cmJbYV09Im9uIithfSxCYj1mdW5jdGlvbihhLGIpe2lmKGEuamEpYT0hMDtlbHNle2I9bmV3IHooYix0aGlzKTt2YXIgYz1hLmxpc3RlbmVyLGQ9YS5wYXx8YS5zcmM7YS5vYSYmQShhKTthPWMuY2FsbChkLGIpfXJldHVybiBhfSx5Yj1mdW5jdGlvbihhKXthPWFbcWJdO3JldHVybiBhIGluc3RhbmNlb2YgbWI/YTpudWxsfSxEYj0iX19jbG9zdXJlX2V2ZW50c19mbl8iKyhNYXRoLnJhbmRvbSgpKjFFOT4+PjApLHZiPWZ1bmN0aW9uKGEpe3AoYSwKIkxpc3RlbmVyIGNhbiBub3QgYmUgbnVsbC4iKTtpZih0eXBlb2YgYT09PSJmdW5jdGlvbiIpcmV0dXJuIGE7cChhLmhhbmRsZUV2ZW50LCJBbiBvYmplY3QgbGlzdGVuZXIgbXVzdCBoYXZlIGhhbmRsZUV2ZW50IG1ldGhvZC4iKTthW0RiXXx8KGFbRGJdPWZ1bmN0aW9uKGIpe3JldHVybiBhLmhhbmRsZUV2ZW50KGIpfSk7cmV0dXJuIGFbRGJdfTt2YXIgRWI9ZnVuY3Rpb24oYSl7dy5jYWxsKHRoaXMpO3RoaXMuaD1hO3RoaXMuZz17fX07bihFYix3KTsKdmFyIEZiPVtdLEI9ZnVuY3Rpb24oYSxiLGMsZCl7QXJyYXkuaXNBcnJheShjKXx8KGMmJihGYlswXT1jLnRvU3RyaW5nKCkpLGM9RmIpO2Zvcih2YXIgZT0wO2U8Yy5sZW5ndGg7ZSsrKXt2YXIgZj11YihiLGNbZV0sZHx8YS5oYW5kbGVFdmVudCwhMSxhLmh8fGEpO2lmKCFmKWJyZWFrO2EuZ1tmLmtleV09Zn1yZXR1cm4gYX0sQz1mdW5jdGlvbihhLGIsYyxkLGUsZil7aWYoQXJyYXkuaXNBcnJheShjKSlmb3IodmFyIGg9MDtoPGMubGVuZ3RoO2grKylDKGEsYixjW2hdLGQsZSxmKTtlbHNlIGQ9ZHx8YS5oYW5kbGVFdmVudCxlPW0oZSk/ISFlLmNhcHR1cmU6ISFlLGY9Znx8YS5ofHxhLGQ9dmIoZCksZT0hIWUsYz1pYihiKT9wYihiLkEsU3RyaW5nKGMpLGQsZSxmKTpiPyhiPXliKGIpKT9wYihiLGMsZCxlLGYpOm51bGw6bnVsbCxjJiYoQShjKSxkZWxldGUgYS5nW2Mua2V5XSk7cmV0dXJuIGF9LEdiPWZ1bmN0aW9uKGEpe0JhKGEuZyxmdW5jdGlvbihiLGMpe3RoaXMuZy5oYXNPd25Qcm9wZXJ0eShjKSYmCkEoYil9LGEpO2EuZz17fX07RWIucHJvdG90eXBlLkM9ZnVuY3Rpb24oKXtFYi5sLkMuY2FsbCh0aGlzKTtHYih0aGlzKX07RWIucHJvdG90eXBlLmhhbmRsZUV2ZW50PWZ1bmN0aW9uKCl7dGhyb3cgRXJyb3IoIkV2ZW50SGFuZGxlci5oYW5kbGVFdmVudCBub3QgaW1wbGVtZW50ZWQiKTt9O3ZhciBEPWZ1bmN0aW9uKCl7dy5jYWxsKHRoaXMpO3RoaXMuQT1uZXcgbWIodGhpcyk7dGhpcy5ZYT10aGlzO3RoaXMubGE9bnVsbH07bihELHcpO0QucHJvdG90eXBlW2hiXT0hMDtELnByb3RvdHlwZS5BYT1mdW5jdGlvbihhKXt0aGlzLmxhPWF9O0QucHJvdG90eXBlLnJlbW92ZUV2ZW50TGlzdGVuZXI9ZnVuY3Rpb24oYSxiLGMsZCl7Q2IodGhpcyxhLGIsYyxkKX07CnZhciBFPWZ1bmN0aW9uKGEsYil7SGIoYSk7dmFyIGM9YS5sYTtpZihjKXt2YXIgZD1bXTtmb3IodmFyIGU9MTtjO2M9Yy5sYSlkLnB1c2goYykscCgrK2U8MUUzLCJpbmZpbml0ZSBsb29wIil9YT1hLllhO2M9Yi50eXBlfHxiO3R5cGVvZiBiPT09InN0cmluZyI/Yj1uZXcgeShiLGEpOmIgaW5zdGFuY2VvZiB5P2IudGFyZ2V0PWIudGFyZ2V0fHxhOihlPWIsYj1uZXcgeShjLGEpLEdhKGIsZSkpO2U9ITA7dmFyIGY7aWYoZClmb3IoZj1kLmxlbmd0aC0xOyFiLkEmJmY+PTA7Zi0tKXt2YXIgaD1iLnU9ZFtmXTtlPUliKGgsYywhMCxiKSYmZX1iLkF8fChoPWIudT1hLGU9SWIoaCxjLCEwLGIpJiZlLGIuQXx8KGU9SWIoaCxjLCExLGIpJiZlKSk7aWYoZClmb3IoZj0wOyFiLkEmJmY8ZC5sZW5ndGg7ZisrKWg9Yi51PWRbZl0sZT1JYihoLGMsITEsYikmJmU7cmV0dXJuIGV9OwpELnByb3RvdHlwZS5DPWZ1bmN0aW9uKCl7RC5sLkMuY2FsbCh0aGlzKTtpZih0aGlzLkEpe3ZhciBhPXRoaXMuQSxiPTAsYztmb3IoYyBpbiBhLmcpe2Zvcih2YXIgZD1hLmdbY10sZT0wO2U8ZC5sZW5ndGg7ZSsrKSsrYixsYihkW2VdKTtkZWxldGUgYS5nW2NdO2EuaC0tfX10aGlzLmxhPW51bGx9O3ZhciB3Yj1mdW5jdGlvbihhLGIsYyxkLGUpe0hiKGEpO3JldHVybiBhLkEuYWRkKFN0cmluZyhiKSxjLCExLGQsZSl9LEliPWZ1bmN0aW9uKGEsYixjLGQpe2I9YS5BLmdbU3RyaW5nKGIpXTtpZighYilyZXR1cm4hMDtiPWIuY29uY2F0KCk7Zm9yKHZhciBlPSEwLGY9MDtmPGIubGVuZ3RoOysrZil7dmFyIGg9YltmXTtpZihoJiYhaC5qYSYmaC5jYXB0dXJlPT1jKXt2YXIgaz1oLmxpc3RlbmVyLHE9aC5wYXx8aC5zcmM7aC5vYSYmb2IoYS5BLGgpO2U9ay5jYWxsKHEsZCkhPT0hMSYmZX19cmV0dXJuIGUmJiFkLmRlZmF1bHRQcmV2ZW50ZWR9LEhiPWZ1bmN0aW9uKGEpe3AoYS5BLCJFdmVudCB0YXJnZXQgaXMgbm90IGluaXRpYWxpemVkLiBEaWQgeW91IGNhbGwgdGhlIHN1cGVyY2xhc3MgKGdvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0KSBjb25zdHJ1Y3Rvcj8iKX07dmFyIEpiPXQ/Ik1velVzZXJTZWxlY3QiOnV8fFZhPyJXZWJraXRVc2VyU2VsZWN0IjpudWxsLEtiPWZ1bmN0aW9uKGEsYil7Yj1iP251bGw6YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpO2lmKEpiJiYoYS5zdHlsZSYmKGEuc3R5bGVbSmJdPSJub25lIiksYikpZm9yKHZhciBjPTA7YT1iW2NdO2MrKylhLnN0eWxlJiYoYS5zdHlsZVtKYl09Im5vbmUiKX07dmFyIExiPWZ1bmN0aW9uKCl7fTtpYShMYik7TGIucHJvdG90eXBlLmc9MDt2YXIgRj1mdW5jdGlvbihhKXtELmNhbGwodGhpcyk7dGhpcy5HPWF8fHBhfHwocGE9bmV3IGZiKTt0aGlzLnphPU1iO3RoaXMuWT1udWxsO3RoaXMucz0hMTt0aGlzLmc9bnVsbDt0aGlzLk09dm9pZCAwO3RoaXMudT10aGlzLmo9dGhpcy5oPW51bGw7dGhpcy5TYT0hMX07bihGLEQpO0YucHJvdG90eXBlLlphPUxiLlYoKTsKdmFyIE1iPW51bGwsTmI9ZnVuY3Rpb24oYSxiKXtzd2l0Y2goYSl7Y2FzZSAxOnJldHVybiBiPyJkaXNhYmxlIjoiZW5hYmxlIjtjYXNlIDI6cmV0dXJuIGI/ImhpZ2hsaWdodCI6InVuaGlnaGxpZ2h0IjtjYXNlIDQ6cmV0dXJuIGI/ImFjdGl2YXRlIjoiZGVhY3RpdmF0ZSI7Y2FzZSA4OnJldHVybiBiPyJzZWxlY3QiOiJ1bnNlbGVjdCI7Y2FzZSAxNjpyZXR1cm4gYj8iY2hlY2siOiJ1bmNoZWNrIjtjYXNlIDMyOnJldHVybiBiPyJmb2N1cyI6ImJsdXIiO2Nhc2UgNjQ6cmV0dXJuIGI/Im9wZW4iOiJjbG9zZSJ9dGhyb3cgRXJyb3IoIkludmFsaWQgY29tcG9uZW50IHN0YXRlIik7fSxPYj1mdW5jdGlvbihhKXtyZXR1cm4gYS5ZfHwoYS5ZPSI6IisoYS5aYS5nKyspLnRvU3RyaW5nKDM2KSl9LFBiPWZ1bmN0aW9uKGEsYil7aWYoYS5oJiZhLmgudSl7dmFyIGM9YS5oLnUsZD1hLlk7ZCBpbiBjJiZkZWxldGUgY1tkXTtEYShhLmgudSxiLGEpfWEuWT1ifTtGLnByb3RvdHlwZS5pPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ307CnZhciBRYj1mdW5jdGlvbihhKXthLk18fChhLk09bmV3IEViKGEpKTtyZXR1cm4gcChhLk0pfTtGLnByb3RvdHlwZS5BYT1mdW5jdGlvbihhKXtpZih0aGlzLmgmJnRoaXMuaCE9YSl0aHJvdyBFcnJvcigiTWV0aG9kIG5vdCBzdXBwb3J0ZWQiKTtGLmwuQWEuY2FsbCh0aGlzLGEpfTtGLnByb3RvdHlwZS5tYT1mdW5jdGlvbigpe3RoaXMuZz1aYSh0aGlzLkcuZywiRElWIil9O0YucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbihhKXtSYih0aGlzLGEpfTsKdmFyIFJiPWZ1bmN0aW9uKGEsYixjKXtpZihhLnMpdGhyb3cgRXJyb3IoIkNvbXBvbmVudCBhbHJlYWR5IHJlbmRlcmVkIik7YS5nfHxhLm1hKCk7Yj9iLmluc2VydEJlZm9yZShhLmcsY3x8bnVsbCk6YS5HLmcuYm9keS5hcHBlbmRDaGlsZChhLmcpO2EuaCYmIWEuaC5zfHxhLkkoKX0sU2I9ZnVuY3Rpb24oYSxiKXtpZihhLnMpdGhyb3cgRXJyb3IoIkNvbXBvbmVudCBhbHJlYWR5IHJlbmRlcmVkIik7aWYoYiYmYS53YShiKSl7YS5TYT0hMDt2YXIgYz1iYihiKTthLkcmJmEuRy5nPT1jfHwoYS5HPWI/bmV3IGZiKGJiKGIpKTpwYXx8KHBhPW5ldyBmYikpO2EuRWEoYik7YS5JKCl9ZWxzZSB0aHJvdyBFcnJvcigiSW52YWxpZCBlbGVtZW50IHRvIGRlY29yYXRlIik7fTtnPUYucHJvdG90eXBlO2cud2E9ZnVuY3Rpb24oKXtyZXR1cm4hMH07Zy5FYT1mdW5jdGlvbihhKXt0aGlzLmc9YX07CmcuST1mdW5jdGlvbigpe3RoaXMucz0hMDtUYih0aGlzLGZ1bmN0aW9uKGEpeyFhLnMmJmEuaSgpJiZhLkkoKX0pfTtnLlU9ZnVuY3Rpb24oKXtUYih0aGlzLGZ1bmN0aW9uKGEpe2EucyYmYS5VKCl9KTt0aGlzLk0mJkdiKHRoaXMuTSk7dGhpcy5zPSExfTtnLkM9ZnVuY3Rpb24oKXt0aGlzLnMmJnRoaXMuVSgpO3RoaXMuTSYmKHRoaXMuTS5kaXNwb3NlKCksZGVsZXRlIHRoaXMuTSk7VGIodGhpcyxmdW5jdGlvbihhKXthLmRpc3Bvc2UoKX0pOyF0aGlzLlNhJiZ0aGlzLmcmJiRhKHRoaXMuZyk7dGhpcy5oPXRoaXMuZz10aGlzLnU9dGhpcy5qPW51bGw7Ri5sLkMuY2FsbCh0aGlzKX07Zy5CYT1mdW5jdGlvbihhLGIpe3RoaXMuQ2EoYSxIKHRoaXMpLGIpfTsKZy5DYT1mdW5jdGlvbihhLGIsYyl7cCghIWEsIlByb3ZpZGVkIGVsZW1lbnQgbXVzdCBub3QgYmUgbnVsbC4iKTtpZihhLnMmJihjfHwhdGhpcy5zKSl0aHJvdyBFcnJvcigiQ29tcG9uZW50IGFscmVhZHkgcmVuZGVyZWQiKTtpZihiPDB8fGI+SCh0aGlzKSl0aHJvdyBFcnJvcigiQ2hpbGQgY29tcG9uZW50IGluZGV4IG91dCBvZiBib3VuZHMiKTt0aGlzLnUmJnRoaXMuanx8KHRoaXMudT17fSx0aGlzLmo9W10pO2lmKGEuaD09dGhpcyl7dmFyIGQ9dGhpcy51LGU9T2IoYSk7ZFtlXT1hO3hhKHRoaXMuaixhKX1lbHNlIERhKHRoaXMudSxPYihhKSxhKTtpZihhPT10aGlzKXRocm93IEVycm9yKCJVbmFibGUgdG8gc2V0IHBhcmVudCBjb21wb25lbnQiKTtpZihkPXRoaXMmJmEuaCYmYS5ZKWU9YS5oLGQ9YS5ZLGUudSYmZD8oZT1lLnUsZD0oZSE9PW51bGwmJmQgaW4gZT9lW2RdOnZvaWQgMCl8fG51bGwpOmQ9bnVsbDtpZihkJiZhLmghPXRoaXMpdGhyb3cgRXJyb3IoIlVuYWJsZSB0byBzZXQgcGFyZW50IGNvbXBvbmVudCIpOwphLmg9dGhpcztGLmwuQWEuY2FsbChhLHRoaXMpO3phKHRoaXMuaixiLDAsYSk7YS5zJiZ0aGlzLnMmJmEuaD09dGhpcz8oYz10aGlzLm5hKCksKGMuY2hpbGROb2Rlc1tiXXx8bnVsbCkhPWEuaSgpJiYoYS5pKCkucGFyZW50RWxlbWVudD09YyYmYy5yZW1vdmVDaGlsZChhLmkoKSksYj1jLmNoaWxkTm9kZXNbYl18fG51bGwsYy5pbnNlcnRCZWZvcmUoYS5pKCksYikpKTpjPyh0aGlzLmd8fHRoaXMubWEoKSxiPUkodGhpcyxiKzEpLFJiKGEsdGhpcy5uYSgpLGI/Yi5nOm51bGwpKTp0aGlzLnMmJiFhLnMmJmEuZyYmYS5nLnBhcmVudE5vZGUmJmEuZy5wYXJlbnROb2RlLm5vZGVUeXBlPT0xJiZhLkkoKX07Zy5uYT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmd9Owp2YXIgVWI9ZnVuY3Rpb24oYSl7aWYoYS56YT09bnVsbCl7dmFyIGI9YS5zP2EuZzphLkcuZy5ib2R5O2E6e3ZhciBjPWJiKGIpO2lmKGMuZGVmYXVsdFZpZXcmJmMuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSYmKGM9Yy5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKGIsbnVsbCkpKXtjPWMuZGlyZWN0aW9ufHxjLmdldFByb3BlcnR5VmFsdWUoImRpcmVjdGlvbiIpfHwiIjticmVhayBhfWM9IiJ9YS56YT0icnRsIj09KGN8fChiLmN1cnJlbnRTdHlsZT9iLmN1cnJlbnRTdHlsZS5kaXJlY3Rpb246bnVsbCl8fGIuc3R5bGUmJmIuc3R5bGUuZGlyZWN0aW9uKX1yZXR1cm4gYS56YX0sSD1mdW5jdGlvbihhKXtyZXR1cm4gYS5qP2Euai5sZW5ndGg6MH0sST1mdW5jdGlvbihhLGIpe3JldHVybiBhLmo/YS5qW2JdfHxudWxsOm51bGx9LFRiPWZ1bmN0aW9uKGEsYixjKXthLmomJmEuai5mb3JFYWNoKGIsYyl9LFZiPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuaiYmYj9hLmouaW5kZXhPZihiKToKLTF9O3ZhciBXYj17bWI6ImFjdGl2ZWRlc2NlbmRhbnQiLHJiOiJhdG9taWMiLHNiOiJhdXRvY29tcGxldGUiLHViOiJidXN5Iix4YjoiY2hlY2tlZCIseWI6ImNvbGluZGV4IixEYjoiY29udHJvbHMiLEViOiJjdXJyZW50IixHYjoiZGVzY3JpYmVkYnkiLEpiOiJkaXNhYmxlZCIsTGI6ImRyb3BlZmZlY3QiLE1iOiJleHBhbmRlZCIsTmI6ImZsb3d0byIsUGI6ImdyYWJiZWQiLFRiOiJoYXNwb3B1cCIsVmI6ImhpZGRlbiIsWGI6ImludmFsaWQiLFliOiJsYWJlbCIsWmI6ImxhYmVsbGVkYnkiLGFjOiJsZXZlbCIsZmM6ImxpdmUiLHZjOiJtdWx0aWxpbmUiLHdjOiJtdWx0aXNlbGVjdGFibGUiLEFjOiJvcmllbnRhdGlvbiIsQmM6Im93bnMiLENjOiJwb3NpbnNldCIsRWM6InByZXNzZWQiLEljOiJyZWFkb25seSIsS2M6InJlbGV2YW50IixMYzoicmVxdWlyZWQiLFBjOiJyb3dpbmRleCIsU2M6InNlbGVjdGVkIixVYzoic2V0c2l6ZSIsV2M6InNvcnQiLG1kOiJ2YWx1ZW1heCIsbmQ6InZhbHVlbWluIiwKb2Q6InZhbHVlbm93IixwZDoidmFsdWV0ZXh0In07dmFyIFhiO3ZhciBZYj17bmI6ImFsZXJ0IixvYjoiYWxlcnRkaWFsb2ciLHBiOiJhcHBsaWNhdGlvbiIscWI6ImFydGljbGUiLHRiOiJiYW5uZXIiLHZiOiJidXR0b24iLHdiOiJjaGVja2JveCIsemI6ImNvbHVtbmhlYWRlciIsQWI6ImNvbWJvYm94IixCYjoiY29tcGxlbWVudGFyeSIsQ2I6ImNvbnRlbnRpbmZvIixGYjoiZGVmaW5pdGlvbiIsSGI6ImRpYWxvZyIsSWI6ImRpcmVjdG9yeSIsS2I6ImRvY3VtZW50IixPYjoiZm9ybSIsUWI6ImdyaWQiLFJiOiJncmlkY2VsbCIsU2I6Imdyb3VwIixVYjoiaGVhZGluZyIsV2I6ImltZyIsYmM6ImxpbmsiLGNjOiJsaXN0IixkYzoibGlzdGJveCIsZWM6Imxpc3RpdGVtIixoYzoibG9nIixpYzoibWFpbiIsamM6Im1hcnF1ZWUiLGtjOiJtYXRoIixsYzoibWVudSIsbWM6Im1lbnViYXIiLG5jOiJtZW51aXRlbSIsb2M6Im1lbnVpdGVtY2hlY2tib3giLHBjOiJtZW51aXRlbXJhZGlvIix4YzoibmF2aWdhdGlvbiIseWM6Im5vdGUiLHpjOiJvcHRpb24iLApEYzoicHJlc2VudGF0aW9uIixGYzoicHJvZ3Jlc3NiYXIiLEdjOiJyYWRpbyIsSGM6InJhZGlvZ3JvdXAiLEpjOiJyZWdpb24iLE1jOiJyb3ciLE5jOiJyb3dncm91cCIsT2M6InJvd2hlYWRlciIsUWM6InNjcm9sbGJhciIsUmM6InNlYXJjaCIsVGM6InNlcGFyYXRvciIsVmM6InNsaWRlciIsWGM6InNwaW5idXR0b24iLFljOiJzdGF0dXMiLFpjOiJzd2l0Y2giLGFkOiJ0YWIiLGJkOiJ0YWJsaXN0IixjZDoidGFicGFuZWwiLGRkOiJ0ZXh0Ym94IixlZDoidGV4dGluZm8iLGZkOiJ0aW1lciIsZ2Q6InRvb2xiYXIiLGhkOiJ0b29sdGlwIixqZDoidHJlZSIsa2Q6InRyZWVncmlkIixsZDoidHJlZWl0ZW0ifTt2YXIgWmI9ZnVuY3Rpb24oYSxiKXtiPyhwKENhKFliLGIpLCJObyBzdWNoIEFSSUEgcm9sZSAiK2IpLGEuc2V0QXR0cmlidXRlKCJyb2xlIixiKSk6YS5yZW1vdmVBdHRyaWJ1dGUoInJvbGUiKX0sYWM9ZnVuY3Rpb24oYSxiLGMpe0FycmF5LmlzQXJyYXkoYykmJihjPWMuam9pbigiICIpKTt2YXIgZD0kYihiKTtjPT09IiJ8fGM9PXZvaWQgMD8oWGJ8fChjPXt9LFhiPShjLmF0b21pYz0hMSxjLmF1dG9jb21wbGV0ZT0ibm9uZSIsYy5kcm9wZWZmZWN0PSJub25lIixjLmhhc3BvcHVwPSExLGMubGl2ZT0ib2ZmIixjLm11bHRpbGluZT0hMSxjLm11bHRpc2VsZWN0YWJsZT0hMSxjLm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIsYy5yZWFkb25seT0hMSxjLnJlbGV2YW50PSJhZGRpdGlvbnMgdGV4dCIsYy5yZXF1aXJlZD0hMSxjLnNvcnQ9Im5vbmUiLGMuYnVzeT0hMSxjLmRpc2FibGVkPSExLGMuaGlkZGVuPSExLGMuaW52YWxpZD0iZmFsc2UiLGMpKSxjPVhiLGIgaW4gYz9hLnNldEF0dHJpYnV0ZShkLApjW2JdKTphLnJlbW92ZUF0dHJpYnV0ZShkKSk6YS5zZXRBdHRyaWJ1dGUoZCxjKX0sJGI9ZnVuY3Rpb24oYSl7cChhLCJBUklBIGF0dHJpYnV0ZSBjYW5ub3QgYmUgZW1wdHkuIik7cChDYShXYixhKSwiTm8gc3VjaCBBUklBIGF0dHJpYnV0ZSAiK2EpO3JldHVybiJhcmlhLSIrYX07dmFyIGRjPWZ1bmN0aW9uKGEsYixjLGQsZSxmKXtpZih2JiZlKXJldHVybiBiYyhhKTtpZihlJiYhZClyZXR1cm4hMTtpZighdCl7dHlwZW9mIGI9PT0ibnVtYmVyIiYmKGI9Y2MoYikpO3ZhciBoPWI9PTE3fHxiPT0xOHx8diYmYj09OTE7aWYoKCFjfHx2KSYmaHx8diYmYj09MTYmJihkfHxmKSlyZXR1cm4hMX1pZih1JiZkJiZjKXN3aXRjaChhKXtjYXNlIDIyMDpjYXNlIDIxOTpjYXNlIDIyMTpjYXNlIDE5MjpjYXNlIDE4NjpjYXNlIDE4OTpjYXNlIDE4NzpjYXNlIDE4ODpjYXNlIDE5MDpjYXNlIDE5MTpjYXNlIDE5MjpjYXNlIDIyMjpyZXR1cm4hMX1zd2l0Y2goYSl7Y2FzZSAxMzpyZXR1cm4gdD9mfHxlPyExOiEoYyYmZCk6ITA7Y2FzZSAyNzpyZXR1cm4hdSYmIXR9cmV0dXJuIHQmJihkfHxlfHxmKT8hMTpiYyhhKX0sYmM9ZnVuY3Rpb24oYSl7aWYoYT49NDgmJmE8PTU3fHxhPj05NiYmYTw9MTA2fHxhPj02NSYmYTw9OTB8fHUmJmE9PTApcmV0dXJuITA7c3dpdGNoKGEpe2Nhc2UgMzI6Y2FzZSA0MzpjYXNlIDYzOmNhc2UgNjQ6Y2FzZSAxMDc6Y2FzZSAxMDk6Y2FzZSAxMTA6Y2FzZSAxMTE6Y2FzZSAxODY6Y2FzZSA1OTpjYXNlIDE4OTpjYXNlIDE4NzpjYXNlIDYxOmNhc2UgMTg4OmNhc2UgMTkwOmNhc2UgMTkxOmNhc2UgMTkyOmNhc2UgMjIyOmNhc2UgMjE5OmNhc2UgMjIwOmNhc2UgMjIxOmNhc2UgMTYzOmNhc2UgNTg6cmV0dXJuITA7CmNhc2UgMTczOmNhc2UgMTcxOnJldHVybiB0O2RlZmF1bHQ6cmV0dXJuITF9fSxjYz1mdW5jdGlvbihhKXtpZih0KWE9ZWMoYSk7ZWxzZSBpZih2JiZ1KXN3aXRjaChhKXtjYXNlIDkzOmE9OTF9cmV0dXJuIGF9LGVjPWZ1bmN0aW9uKGEpe3N3aXRjaChhKXtjYXNlIDYxOnJldHVybiAxODc7Y2FzZSA1OTpyZXR1cm4gMTg2O2Nhc2UgMTczOnJldHVybiAxODk7Y2FzZSAyMjQ6cmV0dXJuIDkxO2Nhc2UgMDpyZXR1cm4gMjI0O2RlZmF1bHQ6cmV0dXJuIGF9fTt2YXIgZmM9ZnVuY3Rpb24oYSxiLGMsZCl7ei5jYWxsKHRoaXMsZCk7dGhpcy50eXBlPSJrZXkiO3RoaXMuZz1hO3RoaXMucmVwZWF0PWN9O24oZmMseik7dmFyIEo9ZnVuY3Rpb24oYSxiKXtELmNhbGwodGhpcyk7YSYmZ2ModGhpcyxhLGIpfTtuKEosRCk7Zz1KLnByb3RvdHlwZTtnLlI9bnVsbDtnLnFhPW51bGw7Zy5KYT1udWxsO2cucmE9bnVsbDtnLkY9LTE7Zy5LPS0xO2cuRGE9ITE7CnZhciBoYz17MzoxMywxMjoxNDQsNjMyMzI6MzgsNjMyMzM6NDAsNjMyMzQ6MzcsNjMyMzU6MzksNjMyMzY6MTEyLDYzMjM3OjExMyw2MzIzODoxMTQsNjMyMzk6MTE1LDYzMjQwOjExNiw2MzI0MToxMTcsNjMyNDI6MTE4LDYzMjQzOjExOSw2MzI0NDoxMjAsNjMyNDU6MTIxLDYzMjQ2OjEyMiw2MzI0NzoxMjMsNjMyNDg6NDQsNjMyNzI6NDYsNjMyNzM6MzYsNjMyNzU6MzUsNjMyNzY6MzMsNjMyNzc6MzQsNjMyODk6MTQ0LDYzMzAyOjQ1fSxpYz17VXA6MzgsRG93bjo0MCxMZWZ0OjM3LFJpZ2h0OjM5LEVudGVyOjEzLEYxOjExMixGMjoxMTMsRjM6MTE0LEY0OjExNSxGNToxMTYsRjY6MTE3LEY3OjExOCxGODoxMTksRjk6MTIwLEYxMDoxMjEsRjExOjEyMixGMTI6MTIzLCJVKzAwN0YiOjQ2LEhvbWU6MzYsRW5kOjM1LFBhZ2VVcDozMyxQYWdlRG93bjozNCxJbnNlcnQ6NDV9LGpjPXYmJnQ7CkoucHJvdG90eXBlLmc9ZnVuY3Rpb24oYSl7dSYmKHRoaXMuRj09MTcmJiFhLmN0cmxLZXl8fHRoaXMuRj09MTgmJiFhLmFsdEtleXx8diYmdGhpcy5GPT05MSYmIWEubWV0YUtleSkmJih0aGlzLks9dGhpcy5GPS0xKTt0aGlzLkY9PS0xJiYoYS5jdHJsS2V5JiZhLmchPTE3P3RoaXMuRj0xNzphLmFsdEtleSYmYS5nIT0xOD90aGlzLkY9MTg6YS5tZXRhS2V5JiZhLmchPTkxJiYodGhpcy5GPTkxKSk7ZGMoYS5nLHRoaXMuRixhLnNoaWZ0S2V5LGEuY3RybEtleSxhLmFsdEtleSxhLm1ldGFLZXkpPyh0aGlzLks9Y2MoYS5nKSxqYyYmKHRoaXMuRGE9YS5hbHRLZXkpKTp0aGlzLmhhbmRsZUV2ZW50KGEpfTtKLnByb3RvdHlwZS5oPWZ1bmN0aW9uKGEpe3RoaXMuSz10aGlzLkY9LTE7dGhpcy5EYT1hLmFsdEtleX07CkoucHJvdG90eXBlLmhhbmRsZUV2ZW50PWZ1bmN0aW9uKGEpe3ZhciBiPWEuaCxjPWIuYWx0S2V5O2lmKHUmJmEudHlwZT09ImtleXByZXNzIil7dmFyIGQ9dGhpcy5LO3ZhciBlPWIuY2hhckNvZGU+PTAmJmIuY2hhckNvZGU8NjMyMzImJmJjKGQpP2IuY2hhckNvZGU6MH1lbHNlIGEudHlwZT09ImtleXByZXNzIj8oamMmJihjPXRoaXMuRGEpLGIua2V5Q29kZT09Yi5jaGFyQ29kZT9iLmtleUNvZGU8MzI/KGQ9Yi5rZXlDb2RlLGU9MCk6KGQ9dGhpcy5LLGU9Yi5jaGFyQ29kZSk6KGQ9Yi5rZXlDb2RlfHx0aGlzLkssZT1iLmNoYXJDb2RlfHwwKSk6KGQ9Yi5rZXlDb2RlfHx0aGlzLkssZT1iLmNoYXJDb2RlfHwwKSx2JiZlPT02MyYmZD09MjI0JiYoZD0xOTEpO3ZhciBmPWQ9Y2MoZCk7ZD9kPj02MzIzMiYmZCBpbiBoYz9mPWhjW2RdOmQ9PTI1JiZhLnNoaWZ0S2V5JiYoZj05KTpiLmtleUlkZW50aWZpZXImJmIua2V5SWRlbnRpZmllciBpbiBpYyYmKGY9aWNbYi5rZXlJZGVudGlmaWVyXSk7CmlmKCF0fHxhLnR5cGUhPSJrZXlwcmVzcyJ8fGRjKGYsdGhpcy5GLGEuc2hpZnRLZXksYS5jdHJsS2V5LGMsYS5tZXRhS2V5KSlhPWY9PXRoaXMuRix0aGlzLkY9ZixiPW5ldyBmYyhmLGUsYSxiKSxiLmFsdEtleT1jLEUodGhpcyxiKX07Si5wcm90b3R5cGUuaT1mdW5jdGlvbigpe3JldHVybiB0aGlzLlJ9O3ZhciBnYz1mdW5jdGlvbihhLGIsYyl7YS5yYSYma2MoYSk7YS5SPWI7YS5xYT11YihhLlIsImtleXByZXNzIixhLGMpO2EuSmE9dWIoYS5SLCJrZXlkb3duIixhLmcsYyxhKTthLnJhPXViKGEuUiwia2V5dXAiLGEuaCxjLGEpfSxrYz1mdW5jdGlvbihhKXthLnFhJiYoQShhLnFhKSxBKGEuSmEpLEEoYS5yYSksYS5xYT1udWxsLGEuSmE9bnVsbCxhLnJhPW51bGwpO2EuUj1udWxsO2EuRj0tMTthLks9LTF9O0oucHJvdG90eXBlLkM9ZnVuY3Rpb24oKXtKLmwuQy5jYWxsKHRoaXMpO2tjKHRoaXMpfTt2YXIgSz17Z2E6Im1vdXNlZG93biIsaGE6Im1vdXNldXAiLGZhOiJtb3VzZWNhbmNlbCIsc2M6Im1vdXNlbW92ZSIsdWM6Im1vdXNlb3ZlciIsdGM6Im1vdXNlb3V0IixxYzoibW91c2VlbnRlciIscmM6Im1vdXNlbGVhdmUifTt2YXIgbGM9ZnVuY3Rpb24oYSl7cmV0dXJuIHR5cGVvZiBhLmNsYXNzTmFtZT09InN0cmluZyI/YS5jbGFzc05hbWU6YS5nZXRBdHRyaWJ1dGUmJmEuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIn0sTD1mdW5jdGlvbihhKXtyZXR1cm4gYS5jbGFzc0xpc3Q/YS5jbGFzc0xpc3Q6bGMoYSkubWF0Y2goL1xTKy9nKXx8W119LG1jPWZ1bmN0aW9uKGEsYil7dHlwZW9mIGEuY2xhc3NOYW1lPT0ic3RyaW5nIj9hLmNsYXNzTmFtZT1iOmEuc2V0QXR0cmlidXRlJiZhLnNldEF0dHJpYnV0ZSgiY2xhc3MiLGIpfSxuYz1mdW5jdGlvbihhLGIpe2EuY2xhc3NMaXN0P2I9YS5jbGFzc0xpc3QuY29udGFpbnMoYik6KGE9TChhKSxiPXZhKGEsYik+PTApO3JldHVybiBifSxvYz1mdW5jdGlvbihhLGIpe2lmKGEuY2xhc3NMaXN0KWEuY2xhc3NMaXN0LmFkZChiKTtlbHNlIGlmKCFuYyhhLGIpKXt2YXIgYz1sYyhhKTttYyhhLGMrKGMubGVuZ3RoPjA/IiAiK2I6YikpfX0scGM9ZnVuY3Rpb24oYSxiKXtpZihhLmNsYXNzTGlzdClBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGIsCmZ1bmN0aW9uKGUpe29jKGEsZSl9KTtlbHNle3ZhciBjPXt9O0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoTChhKSxmdW5jdGlvbihlKXtjW2VdPSEwfSk7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChiLGZ1bmN0aW9uKGUpe2NbZV09ITB9KTtiPSIiO2Zvcih2YXIgZCBpbiBjKWIrPWIubGVuZ3RoPjA/IiAiK2Q6ZDttYyhhLGIpfX0scWM9ZnVuY3Rpb24oYSxiKXthLmNsYXNzTGlzdD9hLmNsYXNzTGlzdC5yZW1vdmUoYik6bmMoYSxiKSYmbWMoYSxBcnJheS5wcm90b3R5cGUuZmlsdGVyLmNhbGwoTChhKSxmdW5jdGlvbihjKXtyZXR1cm4gYyE9Yn0pLmpvaW4oIiAiKSl9LHJjPWZ1bmN0aW9uKGEsYil7YS5jbGFzc0xpc3Q/QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChiLGZ1bmN0aW9uKGMpe3FjKGEsYyl9KTptYyhhLEFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbChMKGEpLGZ1bmN0aW9uKGMpe3JldHVybiEodmEoYixjKT49MCl9KS5qb2luKCIgIikpfTt2YXIgdGM9ZnVuY3Rpb24oYSxiKXtpZighYSl0aHJvdyBFcnJvcigiSW52YWxpZCBjbGFzcyBuYW1lICIrYSk7aWYodHlwZW9mIGIhPT0iZnVuY3Rpb24iKXRocm93IEVycm9yKCJJbnZhbGlkIGRlY29yYXRvciBmdW5jdGlvbiAiK2IpO3NjW2FdPWJ9LHVjPXt9LHNjPXt9O3ZhciB2Yz1mdW5jdGlvbihhKXt0aGlzLkE9YX07aWEodmMpO3ZhciB3Yz1mdW5jdGlvbihhLGIpe2EmJihhLnRhYkluZGV4PWI/MDotMSl9LHljPWZ1bmN0aW9uKGEsYixjKXtjLmlkJiZQYihiLGMuaWQpO3ZhciBkPWEuZygpLGU9ITEsZj1MKGMpO2YmJkFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoZixmdW5jdGlvbihoKXtoPT1kP2U9ITA6aCYmdGhpcy51KGIsaCxkKX0sYSk7ZXx8b2MoYyxkKTt4YyhiLGMpO3JldHVybiBjfTt2Yy5wcm90b3R5cGUudT1mdW5jdGlvbihhLGIsYyl7Yj09YysiLWRpc2FibGVkIj9hLlgoITEpOmI9PWMrIi1ob3Jpem9udGFsIj96YyhhLCJob3Jpem9udGFsIik6Yj09YysiLXZlcnRpY2FsIiYmemMoYSwidmVydGljYWwiKX07CnZhciB4Yz1mdW5jdGlvbihhLGIpe2lmKGIpZm9yKHZhciBjPWIuZmlyc3RDaGlsZCxkO2MmJmMucGFyZW50Tm9kZT09Yjspe2Q9Yy5uZXh0U2libGluZztpZihjLm5vZGVUeXBlPT0xKXthOnt2YXIgZT1jO3AoZSk7ZT1MKGUpO2Zvcih2YXIgZj1lLmxlbmd0aCxoPTA7aDxmO2grKyl7dmFyIGs9ZVtoXTtpZihrPWsgaW4gc2M/c2Nba10oKTpudWxsKXtlPWs7YnJlYWsgYX19ZT1udWxsfWUmJihlLmc9YyxhLmlzRW5hYmxlZCgpfHxlLlgoITEpLGEuQmEoZSksU2IoZSxjKSl9ZWxzZSBjLm5vZGVWYWx1ZSYmSGEoYy5ub2RlVmFsdWUpIT0iInx8Yi5yZW1vdmVDaGlsZChjKTtjPWR9fSxBYz1mdW5jdGlvbihhLGIpe2I9Yi5pKCk7cChiLCJUaGUgY29udGFpbmVyIERPTSBlbGVtZW50IGNhbm5vdCBiZSBudWxsLiIpO0tiKGIsdCk7KGE9YS5BKSYmWmIoYixhKX07dmMucHJvdG90eXBlLmc9ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy1jb250YWluZXIifTsKdmMucHJvdG90eXBlLmo9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nKCksYz1bYixhLkw9PSJob3Jpem9udGFsIj9iKyItaG9yaXpvbnRhbCI6YisiLXZlcnRpY2FsIl07YS5pc0VuYWJsZWQoKXx8Yy5wdXNoKGIrIi1kaXNhYmxlZCIpO3JldHVybiBjfTt2YXIgQmM9ZnVuY3Rpb24oKXt9O3ZhciBNPWZ1bmN0aW9uKCl7fSxDYztpYShNKTt2YXIgRGM9e2J1dHRvbjoicHJlc3NlZCIsY2hlY2tib3g6ImNoZWNrZWQiLG1lbnVpdGVtOiJzZWxlY3RlZCIsbWVudWl0ZW1jaGVja2JveDoiY2hlY2tlZCIsbWVudWl0ZW1yYWRpbzoiY2hlY2tlZCIscmFkaW86ImNoZWNrZWQiLHRhYjoic2VsZWN0ZWQiLHRyZWVpdGVtOiJzZWxlY3RlZCJ9O00ucHJvdG90eXBlLk5hPWZ1bmN0aW9uKCl7fTtNLnByb3RvdHlwZS54YT1mdW5jdGlvbihhKXt2YXIgYj1hLkcsYz1iLmgsZD10aGlzLk4oKSxlPVtkXSxmPXRoaXMuTigpO2YhPWQmJmUucHVzaChmKTtkPWEubTtmb3IoZj1bXTtkOyl7dmFyIGg9ZCYtZDtmLnB1c2goRWModGhpcyxoKSk7ZCY9fmh9ZS5wdXNoLmFwcGx5KGUsZik7KGQ9YS5GYSkmJmUucHVzaC5hcHBseShlLGQpO3JldHVybiBjLmNhbGwoYiwiRElWIixlLmpvaW4oIiAiKSxhLmlhKX07Ck0ucHJvdG90eXBlLnlhPWZ1bmN0aW9uKGEsYil7Yi5pZCYmUGIoYSxiLmlkKTtiJiZiLmZpcnN0Q2hpbGQ/RmMoYSxiLmZpcnN0Q2hpbGQubmV4dFNpYmxpbmc/eWEoYi5jaGlsZE5vZGVzKTpiLmZpcnN0Q2hpbGQpOmEuaWE9bnVsbDt2YXIgYz0wLGQ9dGhpcy5OKCksZT10aGlzLk4oKSxmPSExLGg9ITEsaz15YShMKGIpKTtrLmZvckVhY2goZnVuY3Rpb24ocSl7Znx8cSE9ZD9ofHxxIT1lP2N8PUdjKHRoaXMscSk6aD0hMDooZj0hMCxlPT1kJiYoaD0hMCkpO0djKHRoaXMscSk9PTEmJihzYShiKSxkYihiKSYmZWIoYikmJmNiKGIsITEpKX0sdGhpcyk7YS5tPWM7Znx8KGsucHVzaChkKSxlPT1kJiYoaD0hMCkpO2h8fGsucHVzaChlKTsoYT1hLkZhKSYmay5wdXNoLmFwcGx5KGssYSk7ZiYmaCYmIWF8fG1jKGIsay5qb2luKCIgIikpO3JldHVybiBifTsKdmFyIEhjPWZ1bmN0aW9uKGEsYil7aWYoYT1hLk5hKCkpe3AoYiwiVGhlIGVsZW1lbnQgcGFzc2VkIGFzIGEgZmlyc3QgcGFyYW1ldGVyIGNhbm5vdCBiZSBudWxsLiIpO3ZhciBjPWIuZ2V0QXR0cmlidXRlKCJyb2xlIil8fG51bGw7YSE9YyYmWmIoYixhKX19LEljPWZ1bmN0aW9uKGEsYil7dmFyIGM7aWYoYS5EJjMyJiYoYz1hLmkoKSkpe2lmKCFiJiZhLm0mMzIpe3RyeXtjLmJsdXIoKX1jYXRjaChkKXt9YS5tJjMyJiZhLlFhKG51bGwpfShkYihjKSYmZWIoYykpIT1iJiZjYihjLGIpfX0sSmM9ZnVuY3Rpb24oYSxiLGMpe0NjfHwoQ2M9ezE6ImRpc2FibGVkIiw4OiJzZWxlY3RlZCIsMTY6ImNoZWNrZWQiLDY0OiJleHBhbmRlZCJ9KTtwKGEsIlRoZSBlbGVtZW50IHBhc3NlZCBhcyBhIGZpcnN0IHBhcmFtZXRlciBjYW5ub3QgYmUgbnVsbC4iKTtiPUNjW2JdO3ZhciBkPWEuZ2V0QXR0cmlidXRlKCJyb2xlIil8fG51bGw7ZCYmKGQ9RGNbZF18fGIsYj1iPT0iY2hlY2tlZCJ8fGI9PQoic2VsZWN0ZWQiP2Q6Yik7YiYmYWMoYSxiLGMpfTtNLnByb3RvdHlwZS5OPWZ1bmN0aW9uKCl7cmV0dXJuImdvb2ctY29udHJvbCJ9O3ZhciBFYz1mdW5jdGlvbihhLGIpe2EuZ3x8S2MoYSk7cmV0dXJuIGEuZ1tiXX0sR2M9ZnVuY3Rpb24oYSxiKXthLmh8fChhLmd8fEtjKGEpLGEuaD1FYShhLmcpKTthPXBhcnNlSW50KGEuaFtiXSwxMCk7cmV0dXJuIGlzTmFOKGEpPzA6YX0sS2M9ZnVuY3Rpb24oYSl7dmFyIGI9YS5OKCk7dmFyIGM9Yi5yZXBsYWNlKC9ceGEwfFxzL2csIiAiKS5pbmRleE9mKCIgIikhPS0xO3AoIWMsIkNvbnRyb2xSZW5kZXJlciBoYXMgYW4gaW52YWxpZCBjc3MgY2xhc3M6ICciK2IrIiciKTthLmc9ezE6YisiLWRpc2FibGVkIiwyOmIrIi1ob3ZlciIsNDpiKyItYWN0aXZlIiw4OmIrIi1zZWxlY3RlZCIsMTY6YisiLWNoZWNrZWQiLDMyOmIrIi1mb2N1c2VkIiw2NDpiKyItb3BlbiJ9fTt2YXIgTj1mdW5jdGlvbihhLGIsYyl7Ri5jYWxsKHRoaXMsYyk7aWYoIWIpe2ZvcihiPXRoaXMuY29uc3RydWN0b3I7Yjspe3ZhciBkPW5hKGIpO2lmKGQ9dWNbZF0pYnJlYWs7Yj0oYj1PYmplY3QuZ2V0UHJvdG90eXBlT2YoYi5wcm90b3R5cGUpKSYmYi5jb25zdHJ1Y3Rvcn1iPWQ/dHlwZW9mIGQuVj09PSJmdW5jdGlvbiI/ZC5WKCk6bmV3IGQ6bnVsbH10aGlzLnY9Yjt0aGlzLmlhPWEhPT12b2lkIDA/YTpudWxsfTtuKE4sRik7Zz1OLnByb3RvdHlwZTtnLmlhPW51bGw7Zy5tPTA7Zy5EPTM5O2cuUD0wO2cuT2E9ITA7Zy5GYT1udWxsO2cuSGE9ITA7Zy5tYT1mdW5jdGlvbigpe3ZhciBhPXRoaXMudi54YSh0aGlzKTt0aGlzLmc9YTtIYyh0aGlzLnYsYSk7S2IoYSwhMCk7dGhpcy5pc1Zpc2libGUoKXx8KGEuc3R5bGUuZGlzcGxheT0ibm9uZSIsYSYmYWMoYSwiaGlkZGVuIiwhMCkpfTtnLm5hPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaSgpfTtnLndhPWZ1bmN0aW9uKCl7cmV0dXJuITB9OwpnLkVhPWZ1bmN0aW9uKGEpe3RoaXMuZz1hPXRoaXMudi55YSh0aGlzLGEpO0hjKHRoaXMudixhKTtLYihhLCEwKTt0aGlzLk9hPWEuc3R5bGUuZGlzcGxheSE9Im5vbmUifTsKZy5JPWZ1bmN0aW9uKCl7Ti5sLkkuY2FsbCh0aGlzKTt2YXIgYT10aGlzLmc7cChhLCJDYW4gbm90IGNhbGwgZ2V0RWxlbWVudFN0cmljdCBiZWZvcmUgcmVuZGVyaW5nL2RlY29yYXRpbmcuIik7cCh0aGlzKTtwKGEpO3RoaXMuaXNWaXNpYmxlKCl8fGFjKGEsImhpZGRlbiIsIXRoaXMuaXNWaXNpYmxlKCkpO3RoaXMuaXNFbmFibGVkKCl8fEpjKGEsMSwhdGhpcy5pc0VuYWJsZWQoKSk7dGhpcy5EJjgmJkpjKGEsOCwhISh0aGlzLm0mOCkpO3RoaXMuRCYxNiYmSmMoYSwxNiwhISh0aGlzLm0mMTYpKTt0aGlzLkQmNjQmJkpjKGEsNjQsISEodGhpcy5tJjY0KSk7dmFyIGI9dGhpcy52O1ViKHRoaXMpJiYoYT10aGlzLmkoKSxiPWIuTigpKyItcnRsIiwoYT1hLmk/YS5pKCk6YSkmJnBjKGEsW2JdKSk7dGhpcy5pc0VuYWJsZWQoKSYmSWModGhpcyx0aGlzLmlzVmlzaWJsZSgpKTt0aGlzLkQmLTImJih0aGlzLkhhJiZMYyh0aGlzLCEwKSx0aGlzLkQmMzImJihhPXRoaXMuaSgpKSkmJihiPQp0aGlzLlp8fCh0aGlzLlo9bmV3IEopLGdjKGIsYSksQihCKEIoUWIodGhpcyksYiwia2V5Iix0aGlzLmFhKSxhLCJmb2N1cyIsdGhpcy5YYSksYSwiYmx1ciIsdGhpcy5RYSkpfTt2YXIgTGM9ZnVuY3Rpb24oYSxiKXt2YXIgYz1RYihhKSxkPWEuaSgpO2I/KEIoQihCKEIoYyxkLEsuZ2EsYS5zYSksZCxbSy5oYSxLLmZhXSxhLnZhKSxkLCJtb3VzZW92ZXIiLGEudWEpLGQsIm1vdXNlb3V0IixhLnRhKSxhLmNhIT1CYyYmQihjLGQsImNvbnRleHRtZW51IixhLmNhKSk6KEMoQyhDKEMoYyxkLEsuZ2EsYS5zYSksZCxbSy5oYSxLLmZhXSxhLnZhKSxkLCJtb3VzZW92ZXIiLGEudWEpLGQsIm1vdXNlb3V0IixhLnRhKSxhLmNhIT1CYyYmQyhjLGQsImNvbnRleHRtZW51IixhLmNhKSl9O04ucHJvdG90eXBlLlU9ZnVuY3Rpb24oKXtOLmwuVS5jYWxsKHRoaXMpO3RoaXMuWiYma2ModGhpcy5aKTt0aGlzLmlzVmlzaWJsZSgpJiZ0aGlzLmlzRW5hYmxlZCgpJiZJYyh0aGlzLCExKX07Ck4ucHJvdG90eXBlLkM9ZnVuY3Rpb24oKXtOLmwuQy5jYWxsKHRoaXMpO3RoaXMuWiYmKHRoaXMuWi5kaXNwb3NlKCksZGVsZXRlIHRoaXMuWik7ZGVsZXRlIHRoaXMudjt0aGlzLkZhPXRoaXMuaWE9bnVsbH07dmFyIEZjPWZ1bmN0aW9uKGEsYil7YS5pYT1ifTtOLnByb3RvdHlwZS5pc1Zpc2libGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5PYX07Ti5wcm90b3R5cGUuaXNFbmFibGVkPWZ1bmN0aW9uKCl7cmV0dXJuISh0aGlzLm0mMSl9O04ucHJvdG90eXBlLlg9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5oO2ImJnR5cGVvZiBiLmlzRW5hYmxlZD09ImZ1bmN0aW9uIiYmIWIuaXNFbmFibGVkKCl8fCFPKHRoaXMsMSwhYSl8fChhfHwoTWModGhpcywhMSksUCh0aGlzLCExKSksdGhpcy5pc1Zpc2libGUoKSYmSWModGhpcyxhKSxUKHRoaXMsMSwhYSwhMCkpfTt2YXIgUD1mdW5jdGlvbihhLGIpe08oYSwyLGIpJiZUKGEsMixiKX07Ck4ucHJvdG90eXBlLmlzQWN0aXZlPWZ1bmN0aW9uKCl7cmV0dXJuISEodGhpcy5tJjQpfTsKdmFyIE1jPWZ1bmN0aW9uKGEsYil7TyhhLDQsYikmJlQoYSw0LGIpfSxOYz1mdW5jdGlvbihhLGIpe08oYSw4LGIpJiZUKGEsOCxiKX0sT2M9ZnVuY3Rpb24oYSxiKXtPKGEsNjQsYikmJlQoYSw2NCxiKX0sVD1mdW5jdGlvbihhLGIsYyxkKXtpZighZCYmYj09MSlhLlgoIWMpO2Vsc2UgaWYoYS5EJmImJmMhPSEhKGEubSZiKSl7dmFyIGU9YS52O2lmKGQ9YS5pKCkpe2lmKGU9RWMoZSxiKSl7dmFyIGY9YS5pP2EuaSgpOmE7ZiYmKGM/cGM6cmMpKGYsW2VdKX1KYyhkLGIsYyl9YS5tPWM/YS5tfGI6YS5tJn5ifX0sUGM9ZnVuY3Rpb24oYSxiLGMpe2lmKGEucyYmYS5tJmImJiFjKXRocm93IEVycm9yKCJDb21wb25lbnQgYWxyZWFkeSByZW5kZXJlZCIpOyFjJiZhLm0mYiYmVChhLGIsITEpO2EuRD1jP2EuRHxiOmEuRCZ+Yn0sVT1mdW5jdGlvbihhLGIpe3JldHVybiEhKDI1NSZiKSYmISEoYS5EJmIpfSxPPWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4hIShhLkQmYikmJiEhKGEubSZiKSE9CmMmJighKGEuUCZiKXx8RShhLE5iKGIsYykpKSYmIWEuYmF9O04ucHJvdG90eXBlLnVhPWZ1bmN0aW9uKGEpeyFRYyhhLHRoaXMuaSgpKSYmRSh0aGlzLCJlbnRlciIpJiZ0aGlzLmlzRW5hYmxlZCgpJiZVKHRoaXMsMikmJlAodGhpcywhMCl9O04ucHJvdG90eXBlLnRhPWZ1bmN0aW9uKGEpeyFRYyhhLHRoaXMuaSgpKSYmRSh0aGlzLCJsZWF2ZSIpJiYoVSh0aGlzLDQpJiZNYyh0aGlzLCExKSxVKHRoaXMsMikmJlAodGhpcywhMSkpfTtOLnByb3RvdHlwZS5jYT1CYzt2YXIgUWM9ZnVuY3Rpb24oYSxiKXtyZXR1cm4hIWEucmVsYXRlZFRhcmdldCYmYWIoYixhLnJlbGF0ZWRUYXJnZXQpfTsKTi5wcm90b3R5cGUuc2E9ZnVuY3Rpb24oYSl7aWYodGhpcy5pc0VuYWJsZWQoKSYmKFUodGhpcywyKSYmUCh0aGlzLCEwKSwhKGEuaC5idXR0b24hPTB8fHYmJmEuY3RybEtleSkpKXtVKHRoaXMsNCkmJk1jKHRoaXMsITApO3ZhciBiO2lmKGI9dGhpcy52KXt2YXIgYztiPXRoaXMuRCYzMiYmKGM9dGhpcy5pKCkpP2RiKGMpJiZlYihjKTohMX1iJiZ0aGlzLmkoKS5mb2N1cygpfWEuaC5idXR0b24hPTB8fHYmJmEuY3RybEtleXx8YS5qKCl9O04ucHJvdG90eXBlLnZhPWZ1bmN0aW9uKGEpe3RoaXMuaXNFbmFibGVkKCkmJihVKHRoaXMsMikmJlAodGhpcywhMCksdGhpcy5pc0FjdGl2ZSgpJiZSYyh0aGlzLGEpJiZVKHRoaXMsNCkmJk1jKHRoaXMsITEpKX07CnZhciBSYz1mdW5jdGlvbihhLGIpe2lmKFUoYSwxNikpe3ZhciBjPSEoYS5tJjE2KTtPKGEsMTYsYykmJlQoYSwxNixjKX1VKGEsOCkmJk5jKGEsITApO1UoYSw2NCkmJk9jKGEsIShhLm0mNjQpKTtjPW5ldyB5KCJhY3Rpb24iLGEpO2ImJihjLmFsdEtleT1iLmFsdEtleSxjLmN0cmxLZXk9Yi5jdHJsS2V5LGMubWV0YUtleT1iLm1ldGFLZXksYy5zaGlmdEtleT1iLnNoaWZ0S2V5LGMuRz1iLkcsYy50aW1lU3RhbXA9Yi50aW1lU3RhbXApO3JldHVybiBFKGEsYyl9O04ucHJvdG90eXBlLlhhPWZ1bmN0aW9uKCl7VSh0aGlzLDMyKSYmTyh0aGlzLDMyLCEwKSYmVCh0aGlzLDMyLCEwKX07Ti5wcm90b3R5cGUuUWE9ZnVuY3Rpb24oKXtVKHRoaXMsNCkmJk1jKHRoaXMsITEpO1UodGhpcywzMikmJk8odGhpcywzMiwhMSkmJlQodGhpcywzMiwhMSl9OwpOLnByb3RvdHlwZS5hYT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5pc1Zpc2libGUoKSYmdGhpcy5pc0VuYWJsZWQoKSYmYS5nPT0xMyYmUmModGhpcyxhKT8oYS5qKCksYS52KCksITApOiExfTtpZih0eXBlb2YgTiE9PSJmdW5jdGlvbiIpdGhyb3cgRXJyb3IoIkludmFsaWQgY29tcG9uZW50IGNsYXNzICIrTik7aWYodHlwZW9mIE0hPT0iZnVuY3Rpb24iKXRocm93IEVycm9yKCJJbnZhbGlkIHJlbmRlcmVyIGNsYXNzICIrTSk7dmFyIFNjPW5hKE4pO3VjW1NjXT1NO3RjKCJnb29nLWNvbnRyb2wiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBOKG51bGwpfSk7dmFyIFY9ZnVuY3Rpb24oYSxiLGMpe0YuY2FsbCh0aGlzLGMpO3RoaXMuZWE9Ynx8dmMuVigpO3RoaXMuTD1hfHwidmVydGljYWwifTtuKFYsRik7Zz1WLnByb3RvdHlwZTtnLkthPW51bGw7Zy5kYT1udWxsO2cuZWE9bnVsbDtnLkw9bnVsbDtnLlM9ITA7Zy5UPSEwO2cubz0tMTtnLkI9bnVsbDtnLlc9ITE7Zy5PPW51bGw7dmFyIFRjPWZ1bmN0aW9uKGEpe3JldHVybiBhLkthfHxhLmkoKX07Zz1WLnByb3RvdHlwZTtnLm1hPWZ1bmN0aW9uKCl7dGhpcy5nPXRoaXMuRy5oKCJESVYiLHRoaXMuZWEuaih0aGlzKS5qb2luKCIgIikpfTtnLm5hPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaSgpfTtnLndhPWZ1bmN0aW9uKGEpe3JldHVybiBhLnRhZ05hbWU9PSJESVYifTtnLkVhPWZ1bmN0aW9uKGEpe3RoaXMuZz15Yyh0aGlzLmVhLHRoaXMsYSk7YS5zdHlsZS5kaXNwbGF5PT0ibm9uZSImJih0aGlzLlM9ITEpfTsKZy5JPWZ1bmN0aW9uKCl7Vi5sLkkuY2FsbCh0aGlzKTtUYih0aGlzLGZ1bmN0aW9uKGIpe2IucyYmVWModGhpcyxiKX0sdGhpcyk7dmFyIGE9dGhpcy5pKCk7QWModGhpcy5lYSx0aGlzKTtWYyh0aGlzLHRoaXMuUyk7QihCKEIoQihCKEIoQihCKFFiKHRoaXMpLHRoaXMsImVudGVyIix0aGlzLmViKSx0aGlzLCJoaWdobGlnaHQiLHRoaXMuZmIpLHRoaXMsInVuaGlnaGxpZ2h0Iix0aGlzLmxiKSx0aGlzLCJvcGVuIix0aGlzLmdiKSx0aGlzLCJjbG9zZSIsdGhpcy5iYiksYSxLLmdhLHRoaXMuV2EpLGJiKGEpLFtLLmhhLEsuZmFdLHRoaXMuY2IpLGEsW0suZ2EsSy5oYSxLLmZhLCJtb3VzZW92ZXIiLCJtb3VzZW91dCIsImNvbnRleHRtZW51Il0sdGhpcy5hYik7V2ModGhpcyl9O3ZhciBXYz1mdW5jdGlvbihhKXt2YXIgYj1RYihhKSxjPVRjKGEpO0IoQihCKGIsYywiZm9jdXMiLGEuUGEpLGMsImJsdXIiLGEuVWEpLGEuZGF8fChhLmRhPW5ldyBKKFRjKGEpKSksImtleSIsYS5WYSl9OwpnPVYucHJvdG90eXBlO2cuVT1mdW5jdGlvbigpe1hjKHRoaXMsLTEpO3RoaXMuQiYmT2ModGhpcy5CLCExKTt0aGlzLlc9ITE7Vi5sLlUuY2FsbCh0aGlzKX07Zy5DPWZ1bmN0aW9uKCl7Vi5sLkMuY2FsbCh0aGlzKTt0aGlzLmRhJiYodGhpcy5kYS5kaXNwb3NlKCksdGhpcy5kYT1udWxsKTt0aGlzLmVhPXRoaXMuQj10aGlzLk89dGhpcy5LYT1udWxsfTtnLmViPWZ1bmN0aW9uKCl7cmV0dXJuITB9OwpnLmZiPWZ1bmN0aW9uKGEpe3ZhciBiPVZiKHRoaXMsYS50YXJnZXQpO2lmKGI+LTEmJmIhPXRoaXMubyl7dmFyIGM9SSh0aGlzLHRoaXMubyk7YyYmUChjLCExKTt0aGlzLm89YjtjPUkodGhpcyx0aGlzLm8pO3RoaXMuVyYmTWMoYywhMCk7dGhpcy5CJiZjIT10aGlzLkImJihjLkQmNjQ/T2MoYywhMCk6T2ModGhpcy5CLCExKSl9Yj10aGlzLmkoKTtwKGIsIlRoZSBET00gZWxlbWVudCBmb3IgdGhlIGNvbnRhaW5lciBjYW5ub3QgYmUgbnVsbC4iKTthLnRhcmdldC5pKCkhPW51bGwmJmFjKGIsImFjdGl2ZWRlc2NlbmRhbnQiLGEudGFyZ2V0LmkoKS5pZCl9O2cubGI9ZnVuY3Rpb24oYSl7YS50YXJnZXQ9PUkodGhpcyx0aGlzLm8pJiYodGhpcy5vPS0xKTthPXRoaXMuaSgpO3AoYSwiVGhlIERPTSBlbGVtZW50IGZvciB0aGUgY29udGFpbmVyIGNhbm5vdCBiZSBudWxsLiIpO2EucmVtb3ZlQXR0cmlidXRlKCRiKCJhY3RpdmVkZXNjZW5kYW50IikpfTsKZy5nYj1mdW5jdGlvbihhKXsoYT1hLnRhcmdldCkmJmEhPXRoaXMuQiYmYS5oPT10aGlzJiYodGhpcy5CJiZPYyh0aGlzLkIsITEpLHRoaXMuQj1hKX07Zy5iYj1mdW5jdGlvbihhKXthLnRhcmdldD09dGhpcy5CJiYodGhpcy5CPW51bGwpO3ZhciBiPXRoaXMuaSgpLGM9YS50YXJnZXQuaSgpO2ImJmEudGFyZ2V0Lm0mMiYmYyYmKGE9IiIsYyYmKGE9Yy5pZCxwKGEsIlRoZSBhY3RpdmUgZWxlbWVudCBzaG91bGQgaGF2ZSBhbiBpZC4iKSksYWMoYiwiYWN0aXZlZGVzY2VuZGFudCIsYSkpfTtnLldhPWZ1bmN0aW9uKGEpe3RoaXMuVCYmKHRoaXMuVz0hMCk7dmFyIGI9VGModGhpcyk7YiYmZGIoYikmJmViKGIpP2IuZm9jdXMoKTphLmooKX07Zy5jYj1mdW5jdGlvbigpe3RoaXMuVz0hMX07CmcuYWI9ZnVuY3Rpb24oYSl7YTp7dmFyIGI9YS50YXJnZXQ7aWYodGhpcy5PKWZvcih2YXIgYz10aGlzLmkoKTtiJiZiIT09Yzspe3ZhciBkPWIuaWQ7aWYoZCBpbiB0aGlzLk8pe2I9dGhpcy5PW2RdO2JyZWFrIGF9Yj1iLnBhcmVudE5vZGV9Yj1udWxsfWlmKGIpc3dpdGNoKGEudHlwZSl7Y2FzZSBLLmdhOmIuc2EoYSk7YnJlYWs7Y2FzZSBLLmhhOmNhc2UgSy5mYTpiLnZhKGEpO2JyZWFrO2Nhc2UgIm1vdXNlb3ZlciI6Yi51YShhKTticmVhaztjYXNlICJtb3VzZW91dCI6Yi50YShhKTticmVhaztjYXNlICJjb250ZXh0bWVudSI6Yi5jYShhKX19O2cuUGE9ZnVuY3Rpb24oKXt9O2cuVWE9ZnVuY3Rpb24oKXtYYyh0aGlzLC0xKTt0aGlzLlc9ITE7dGhpcy5CJiZPYyh0aGlzLkIsITEpfTsKZy5WYT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5pc0VuYWJsZWQoKSYmdGhpcy5pc1Zpc2libGUoKSYmKEgodGhpcykhPTB8fHRoaXMuS2EpJiZZYyh0aGlzLGEpPyhhLmooKSxhLnYoKSwhMCk6ITF9Owp2YXIgWWM9ZnVuY3Rpb24oYSxiKXt2YXIgYz1JKGEsYS5vKTtpZihjJiZ0eXBlb2YgYy5hYT09ImZ1bmN0aW9uIiYmYy5hYShiKXx8YS5CJiZhLkIhPWMmJnR5cGVvZiBhLkIuYWE9PSJmdW5jdGlvbiImJmEuQi5hYShiKSlyZXR1cm4hMDtpZihiLnNoaWZ0S2V5fHxiLmN0cmxLZXl8fGIubWV0YUtleXx8Yi5hbHRLZXkpcmV0dXJuITE7c3dpdGNoKGIuZyl7Y2FzZSAyNzpUYyhhKS5ibHVyKCk7YnJlYWs7Y2FzZSAzNjpaYyhhKTticmVhaztjYXNlIDM1OiRjKGEpO2JyZWFrO2Nhc2UgMzg6aWYoYS5MPT0idmVydGljYWwiKWFkKGEpO2Vsc2UgcmV0dXJuITE7YnJlYWs7Y2FzZSAzNzppZihhLkw9PSJob3Jpem9udGFsIilVYihhKT9iZChhKTphZChhKTtlbHNlIHJldHVybiExO2JyZWFrO2Nhc2UgNDA6aWYoYS5MPT0idmVydGljYWwiKWJkKGEpO2Vsc2UgcmV0dXJuITE7YnJlYWs7Y2FzZSAzOTppZihhLkw9PSJob3Jpem9udGFsIilVYihhKT9hZChhKTpiZChhKTtlbHNlIHJldHVybiExOwpicmVhaztkZWZhdWx0OnJldHVybiExfXJldHVybiEwfSxVYz1mdW5jdGlvbihhLGIpe3ZhciBjPWIuaSgpO2M9Yy5pZHx8KGMuaWQ9T2IoYikpO2EuT3x8KGEuTz17fSk7YS5PW2NdPWJ9O1YucHJvdG90eXBlLkJhPWZ1bmN0aW9uKGEsYil7dWEoYSxOLCJUaGUgY2hpbGQgb2YgYSBjb250YWluZXIgbXVzdCBiZSBhIGNvbnRyb2wiKTtWLmwuQmEuY2FsbCh0aGlzLGEsYil9O1YucHJvdG90eXBlLkNhPWZ1bmN0aW9uKGEsYixjKXt1YShhLE4pO2EuUHw9MjthLlB8PTY0O1BjKGEsMzIsITEpO2EucyYmMCE9YS5IYSYmTGMoYSwhMSk7YS5IYT0hMTt2YXIgZD1hLmg9PXRoaXM/VmIodGhpcyxhKTotMTtWLmwuQ2EuY2FsbCh0aGlzLGEsYixjKTthLnMmJnRoaXMucyYmVWModGhpcyxhKTthPWQ7YT09LTEmJihhPUgodGhpcykpO2E9PXRoaXMubz90aGlzLm89TWF0aC5taW4oSCh0aGlzKS0xLGIpOmE+dGhpcy5vJiZiPD10aGlzLm8/dGhpcy5vKys6YTx0aGlzLm8mJmI+dGhpcy5vJiZ0aGlzLm8tLX07CnZhciB6Yz1mdW5jdGlvbihhLGIpe2lmKGEuaSgpKXRocm93IEVycm9yKCJDb21wb25lbnQgYWxyZWFkeSByZW5kZXJlZCIpO2EuTD1ifTtWLnByb3RvdHlwZS5pc1Zpc2libGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5TfTt2YXIgVmM9ZnVuY3Rpb24oYSxiKXthLlM9Yjt2YXIgYz1hLmkoKTtjJiYoYy5zdHlsZS5kaXNwbGF5PWI/IiI6Im5vbmUiLHdjKFRjKGEpLGEuVCYmYS5TKSl9O1YucHJvdG90eXBlLmlzRW5hYmxlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLlR9O1YucHJvdG90eXBlLlg9ZnVuY3Rpb24oYSl7dGhpcy5UIT1hJiZFKHRoaXMsYT8iZW5hYmxlIjoiZGlzYWJsZSIpJiYoYT8odGhpcy5UPSEwLFRiKHRoaXMsZnVuY3Rpb24oYil7Yi5UYT9kZWxldGUgYi5UYTpiLlgoITApfSkpOihUYih0aGlzLGZ1bmN0aW9uKGIpe2IuaXNFbmFibGVkKCk/Yi5YKCExKTpiLlRhPSEwfSksdGhpcy5XPXRoaXMuVD0hMSksd2MoVGModGhpcyksYSYmdGhpcy5TKSl9Owp2YXIgWGM9ZnVuY3Rpb24oYSxiKXsoYj1JKGEsYikpP1AoYiwhMCk6YS5vPi0xJiZQKEkoYSxhLm8pLCExKX0sWmM9ZnVuY3Rpb24oYSl7Y2QoYSxmdW5jdGlvbihiLGMpe3JldHVybihiKzEpJWN9LEgoYSktMSl9LCRjPWZ1bmN0aW9uKGEpe2NkKGEsZnVuY3Rpb24oYixjKXtiLS07cmV0dXJuIGI8MD9jLTE6Yn0sMCl9LGJkPWZ1bmN0aW9uKGEpe2NkKGEsZnVuY3Rpb24oYixjKXtyZXR1cm4oYisxKSVjfSxhLm8pfSxhZD1mdW5jdGlvbihhKXtjZChhLGZ1bmN0aW9uKGIsYyl7Yi0tO3JldHVybiBiPDA/Yy0xOmJ9LGEubyl9LGNkPWZ1bmN0aW9uKGEsYixjKXtjPWM8MD9WYihhLGEuQik6Yzt2YXIgZD1IKGEpO2M9Yi5jYWxsKGEsYyxkKTtmb3IodmFyIGU9MDtlPD1kOyl7dmFyIGY9SShhLGMpO2lmKGYmJmYuaXNWaXNpYmxlKCkmJmYuaXNFbmFibGVkKCkmJmYuRCYyKXthLkxhKGMpO2JyZWFrfWUrKztjPWIuY2FsbChhLGMsZCl9fTsKVi5wcm90b3R5cGUuTGE9ZnVuY3Rpb24oYSl7WGModGhpcyxhKX07dmFyIGRkPWZ1bmN0aW9uKCl7fTtuKGRkLE0pO2lhKGRkKTtnPWRkLnByb3RvdHlwZTtnLk49ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy10YWIifTtnLk5hPWZ1bmN0aW9uKCl7cmV0dXJuInRhYiJ9O2cueGE9ZnVuY3Rpb24oYSl7dmFyIGI9ZGQubC54YS5jYWxsKHRoaXMsYSk7KGE9YS5HYSgpKSYmdGhpcy5NYShiLGEpO3JldHVybiBifTtnLnlhPWZ1bmN0aW9uKGEsYil7Yj1kZC5sLnlhLmNhbGwodGhpcyxhLGIpO3ZhciBjPXRoaXMuR2EoYik7YyYmKGEuUmE9Yyk7YS5tJjgmJihjPWEuaCkmJnR5cGVvZiBjLko9PT0iZnVuY3Rpb24iJiYoVChhLDgsITEpLGMuSihhKSk7cmV0dXJuIGJ9O2cuR2E9ZnVuY3Rpb24oYSl7cmV0dXJuIGEudGl0bGV8fCIifTtnLk1hPWZ1bmN0aW9uKGEsYil7YSYmKGEudGl0bGU9Ynx8IiIpfTt2YXIgZWQ9ZnVuY3Rpb24oYSxiLGMpe04uY2FsbCh0aGlzLGEsYnx8ZGQuVigpLGMpO1BjKHRoaXMsOCwhMCk7dGhpcy5QfD05fTtuKGVkLE4pO2VkLnByb3RvdHlwZS5HYT1mdW5jdGlvbigpe3JldHVybiB0aGlzLlJhfTtlZC5wcm90b3R5cGUuTWE9ZnVuY3Rpb24oYSl7dGhpcy52Lk1hKHRoaXMuaSgpLGEpO3RoaXMuUmE9YX07dGMoImdvb2ctdGFiIixmdW5jdGlvbigpe3JldHVybiBuZXcgZWQobnVsbCl9KTt2YXIgVz1mdW5jdGlvbigpe3RoaXMuQT0idGFibGlzdCJ9O24oVyx2Yyk7aWEoVyk7Vy5wcm90b3R5cGUuZz1mdW5jdGlvbigpe3JldHVybiJnb29nLXRhYi1iYXIifTtXLnByb3RvdHlwZS51PWZ1bmN0aW9uKGEsYixjKXt0aGlzLnZ8fCh0aGlzLmh8fGZkKHRoaXMpLHRoaXMudj1FYSh0aGlzLmgpKTt2YXIgZD10aGlzLnZbYl07ZD8oemMoYSxnZChkKSksYS52PWQpOlcubC51LmNhbGwodGhpcyxhLGIsYyl9O1cucHJvdG90eXBlLmo9ZnVuY3Rpb24oYSl7dmFyIGI9Vy5sLmouY2FsbCh0aGlzLGEpO3RoaXMuaHx8ZmQodGhpcyk7Yi5wdXNoKHRoaXMuaFthLnZdKTtyZXR1cm4gYn07dmFyIGZkPWZ1bmN0aW9uKGEpe3ZhciBiPWEuZygpO2EuaD17dG9wOmIrIi10b3AiLGJvdHRvbTpiKyItYm90dG9tIixzdGFydDpiKyItc3RhcnQiLGVuZDpiKyItZW5kIn19O3ZhciBYPWZ1bmN0aW9uKGEsYixjKXthPWF8fCJ0b3AiO3pjKHRoaXMsZ2QoYSkpO3RoaXMudj1hO1YuY2FsbCh0aGlzLHRoaXMuTCxifHxXLlYoKSxjKTtoZCh0aGlzKX07bihYLFYpO2c9WC5wcm90b3R5cGU7Zy5IPW51bGw7Zy5JPWZ1bmN0aW9uKCl7WC5sLkkuY2FsbCh0aGlzKTtoZCh0aGlzKX07Zy5DPWZ1bmN0aW9uKCl7WC5sLkMuY2FsbCh0aGlzKTt0aGlzLkg9bnVsbH07Zy5MYT1mdW5jdGlvbihhKXtYLmwuTGEuY2FsbCh0aGlzLGEpO3RoaXMuSihJKHRoaXMsYSkpfTtnLko9ZnVuY3Rpb24oYSl7YT9OYyhhLCEwKTp0aGlzLkgmJk5jKHRoaXMuSCwhMSl9Owp2YXIgaWQ9ZnVuY3Rpb24oYSxiKXtpZihiJiZiPT1hLkgpe2Zvcih2YXIgYz1WYihhLGIpLGQ9Yy0xO2I9SShhLGQpO2QtLSl7dmFyIGU9YjtpZihlLmlzVmlzaWJsZSgpJiZlLmlzRW5hYmxlZCgpKXthLkooYik7cmV0dXJufX1mb3IoYys9MTtiPUkoYSxjKTtjKyspaWYoZD1iLGQuaXNWaXNpYmxlKCkmJmQuaXNFbmFibGVkKCkpe2EuSihiKTtyZXR1cm59YS5KKG51bGwpfX07Zz1YLnByb3RvdHlwZTtnLmpiPWZ1bmN0aW9uKGEpe3RoaXMuSCYmdGhpcy5IIT1hLnRhcmdldCYmTmModGhpcy5ILCExKTt0aGlzLkg9YS50YXJnZXR9O2cua2I9ZnVuY3Rpb24oYSl7YS50YXJnZXQ9PXRoaXMuSCYmKHRoaXMuSD1udWxsKX07Zy5oYj1mdW5jdGlvbihhKXtpZCh0aGlzLGEudGFyZ2V0KX07Zy5pYj1mdW5jdGlvbihhKXtpZCh0aGlzLGEudGFyZ2V0KX07Zy5QYT1mdW5jdGlvbigpe0kodGhpcyx0aGlzLm8pfHxYYyh0aGlzLFZiKHRoaXMsdGhpcy5IfHxJKHRoaXMsMCkpKX07CnZhciBoZD1mdW5jdGlvbihhKXtCKEIoQihCKFFiKGEpLGEsInNlbGVjdCIsYS5qYiksYSwidW5zZWxlY3QiLGEua2IpLGEsImRpc2FibGUiLGEuaGIpLGEsImhpZGUiLGEuaWIpfSxnZD1mdW5jdGlvbihhKXtyZXR1cm4gYT09InN0YXJ0Inx8YT09ImVuZCI/InZlcnRpY2FsIjoiaG9yaXpvbnRhbCJ9O3RjKCJnb29nLXRhYi1iYXIiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBYfSk7ZnVuY3Rpb24gamQoYSl7dmFyIGI9e3RvcDoiYm90dG9tIixib3R0b206InRvcCIsc3RhcnQ6InJpZ2h0IixlbmQ6ImxlZnQifVthLmxvY2F0aW9uXSxjPWEuZWxlbWVudElkLGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTtkLnRleHRDb250ZW50PSJcbiAgICBmaWVsZHNldCB7XG4gICAgICBwYWRkaW5nOiAxMHB4O1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgIzM2OTtcbiAgICB9XG5cbiAgICAjIitjKyIgLmdvb2ctdGFiLWNvbnRlbnQge1xuICAgICAgbWluLWhlaWdodDogM2VtO1xuICAgICAgbWFyZ2luOiAwO1xuICAgICAgYm9yZGVyOiAiK2EuYm9yZGVyKyIgc29saWQgIithLmJvcmRlckNvbG9yKyI7XG4gICAgICBib3JkZXItdG9wOiAwO1xuICAgICAgaGVpZ2h0OiAiK2EuY29udGVudEhlaWdodCsiO1xuICAgICAgcGFkZGluZzogNHB4IDhweDtcbiAgICAgIG1hcmdpbi1yaWdodDogNHB4O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgIG92ZXJmbG93OiBhdXRvO1xuICAgIH1cblxuICAgICMiKwpjKyIgLmdvb2ctdGFiLWJhci0iK2EubG9jYXRpb24rIiAuZ29vZy10YWItc2VsZWN0ZWQge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICIrYS5ib3JkZXJDb2xvcisiO1xuICAgICAgYm9yZGVyLSIrYisiOiAwcHg7XG4gICAgfVxuXG4gICAgIyIrYysiIC5nb29nLXRhYi1iYXItIithLmxvY2F0aW9uKyIge1xuICAgICAgcGFkZGluZy0iK2EubG9jYXRpb24rIjogNXB4ICFpbXBvcnRhbnQ7XG4gICAgICBib3JkZXItIitiKyI6IDFweCBzb2xpZCAiK2EuYm9yZGVyQ29sb3IrIiAhaW1wb3J0YW50O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICB9XG5cbiAgICAjIitjKyIgLmdvb2ctdGFiLWJhciB7XG4gICAgICAgbWFyZ2luOiAwO1xuICAgICAgIGJvcmRlcjogMDtcbiAgICAgICBwYWRkaW5nOiAwO1xuICAgICAgIGxpc3Qtc3R5bGU6IG5vbmU7XG4gICAgICAgY3Vyc29yOiBkZWZhdWx0O1xuICAgICAgIG91dGxpbmU6IG5vbmU7XG4gICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgICBtYXJnaW4tcmlnaHQ6IDRweDtcbiAgICAgIH1cblxuICAgICAjIisKYysiIC5nb29nLXRhYiB7XG4gICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgIHBhZGRpbmc6IDRweCA4cHg7XG4gICAgICAgY29sb3I6IHZhcigtLWNvbGFiLXByaW1hcnktdGV4dC1jb2xvcik7XG4gICAgICAgdGV4dC1kZWNvcmF0aW9uOiBpbml0aWFsO1xuICAgICAgIGN1cnNvcjogZGVmYXVsdDtcbiAgICAgIH1cblxuICAgICAgIyIrYysiIC5nb29nLXRhYi1ob3ZlciB7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWNvbGFiLWhpZ2hsaWdodGVkLXN1cmZhY2UtY29sb3IpO1xuICAgICAgfVxuICAgICAgIjtyZXR1cm4gZH0KdmFyIGtkPWZ1bmN0aW9uKGEpe3ZhciBiPWEuZWxlbWVudElkLGM9YS50YWJOYW1lcyxkPWEuc2VsZWN0ZWRJbmRleDsiY29udGVudEJvcmRlciJpbiBhfHwoYS5jb250ZW50Qm9yZGVyPSIwcHgiKTsiY29udGVudEhlaWdodCJpbiBhfHwoYS5jb250ZW50SGVpZ2h0PSJpbml0aWFsIik7ImJvcmRlckNvbG9yImluIGF8fChhLmJvcmRlckNvbG9yPSJ2YXIoLS1jb2xhYi1ib3JkZXItY29sb3IpIik7YS5sb2NhdGlvbnx8KGEubG9jYXRpb249InRvcCIpO3ZhciBlPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiMiK2IpLGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zi5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYi1iYXIiKTt2YXIgaD1hLmxvY2F0aW9uO2YuY2xhc3NMaXN0LmFkZCgiZ29vZy10YWItYmFyLSIraCk7Zm9yKHZhciBrPVtdLHE9ZmEoYyksRz1xLm5leHQoKTshRy5kb25lO0c9cS5uZXh0KCkpe0c9Ry52YWx1ZTt2YXIgeD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKeC5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYiIpO3gudGV4dENvbnRlbnQ9RztmLmFwcGVuZENoaWxkKHgpO2sucHVzaCh4KX1oIT0iYm90dG9tIiYmZS5hcHBlbmRDaGlsZChmKTtxPW51bGw7aWYoaD09InRvcCJ8fGg9PSJib3R0b20iKXE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikscS5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYi1iYXItY2xlYXIiKTtoPT0idG9wIiYmcSYmZS5hcHBlbmRDaGlsZChxKTtHPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO0cuY2xhc3NMaXN0LmFkZCgiZ29vZy10YWItY29udGVudCIpO3ZhciBoYT1bXTtjPWZhKGMpO2Zvcih4PWMubmV4dCgpOyF4LmRvbmU7eD1jLm5leHQoKSl4PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHguaWQ9ZS5pZCsiX2NvbnRlbnRfIitoYS5sZW5ndGgseC5zdHlsZS5kaXNwbGF5PSJub25lIixHLmFwcGVuZENoaWxkKHgpLGhhLnB1c2goeCk7ZS5hcHBlbmRDaGlsZChHKTtoPT0iYm90dG9tIiYmKHEmJgplLmFwcGVuZENoaWxkKHEpLGUuYXBwZW5kQ2hpbGQoZikpO3ZhciBRPW5ldyBYKGgpO1NiKFEsZik7dmFyIFI9LTE7d2IoUSwic2VsZWN0IixmdW5jdGlvbihTKXtTPWsuaW5kZXhPZihTLnRhcmdldC5pKCkpO1MhPVImJihSPj0wJiZSPGhhLmxlbmd0aCYmKGhhW1JdLnN0eWxlLmRpc3BsYXk9Im5vbmUiLFI9LTEpLFM+PTAmJlM8aGEubGVuZ3RoJiYoUj1TLGhhW1JdLnN0eWxlLmRpc3BsYXk9ImlubGluZSIsd2luZG93LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCJyZXNpemUiKSksZ29vZ2xlLmNvbGFiLm91dHB1dC5yZXNpemVJZnJhbWVUb0NvbnRlbnQoKSksUS5KKEkoUSxSKSkpfSk7US5KKEkoUSxkKSk7d2luZG93W2JdPXtzZXRTZWxlY3RlZFRhYkluZGV4OmZ1bmN0aW9uKFMpe1EuSihJKFEsUykpfX07ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChqZChhKSl9LGxkPVsiY29sYWJfbGliIiwiY3JlYXRlVGFiQmFyIl0sWT1sOwpsZFswXWluIFl8fHR5cGVvZiBZLmV4ZWNTY3JpcHQ9PSJ1bmRlZmluZWQifHxZLmV4ZWNTY3JpcHQoInZhciAiK2xkWzBdKTtmb3IodmFyIFo7bGQubGVuZ3RoJiYoWj1sZC5zaGlmdCgpKTspbGQubGVuZ3RofHxrZD09PXZvaWQgMD9ZW1pdJiZZW1pdIT09T2JqZWN0LnByb3RvdHlwZVtaXT9ZPVlbWl06WT1ZW1pdPXt9OllbWl09a2Q7fSkuY2FsbCh0aGlzKTsKLy8gY2xhbmctZm9ybWF0IG9uCg==", + "ok": true, + "headers": [ + [ + "content-length", + "41785" + ], + [ + "content-type", + "application/javascript" + ] + ], + "status": 200, + "status_text": "" + }, + "http://localhost:8080/nbextensions/google.colab/tabbar.css": { + "data": "Lmdvb2ctdGFie3Bvc2l0aW9uOnJlbGF0aXZlO3BhZGRpbmc6NHB4IDhweDtjb2xvcjojMDBjO3RleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7Y3Vyc29yOmRlZmF1bHR9Lmdvb2ctdGFiLWJhci10b3AgLmdvb2ctdGFie21hcmdpbjoxcHggNHB4IDAgMDtib3JkZXItYm90dG9tOjA7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLXRvcDphZnRlciwuZ29vZy10YWItYmFyLWJvdHRvbTphZnRlcntjb250ZW50OiIgIjtkaXNwbGF5OmJsb2NrO2hlaWdodDowO2NsZWFyOmJvdGg7dmlzaWJpbGl0eTpoaWRkZW59Lmdvb2ctdGFiLWJhci1ib3R0b20gLmdvb2ctdGFie21hcmdpbjowIDRweCAxcHggMDtib3JkZXItdG9wOjA7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLXN0YXJ0IC5nb29nLXRhYnttYXJnaW46MCAwIDRweCAxcHg7Ym9yZGVyLXJpZ2h0OjB9Lmdvb2ctdGFiLWJhci1lbmQgLmdvb2ctdGFie21hcmdpbjowIDFweCA0cHggMDtib3JkZXItbGVmdDowfS5nb29nLXRhYi1ob3ZlcntiYWNrZ3JvdW5kOiNlZWV9Lmdvb2ctdGFiLWRpc2FibGVke2NvbG9yOiM2NjZ9Lmdvb2ctdGFiLXNlbGVjdGVke2NvbG9yOiMwMDA7YmFja2dyb3VuZDojZmZmO3RleHQtZGVjb3JhdGlvbjpub25lO2ZvbnQtd2VpZ2h0OmJvbGQ7Ym9yZGVyOjFweCBzb2xpZCAjNmI5MGRhfS5nb29nLXRhYi1iYXItdG9we3BhZGRpbmctdG9wOjVweCFpbXBvcnRhbnQ7cGFkZGluZy1sZWZ0OjVweCFpbXBvcnRhbnQ7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgIzZiOTBkYSFpbXBvcnRhbnR9Lmdvb2ctdGFiLWJhci10b3AgLmdvb2ctdGFiLXNlbGVjdGVke3RvcDoxcHg7bWFyZ2luLXRvcDowO3BhZGRpbmctYm90dG9tOjVweH0uZ29vZy10YWItYmFyLWJvdHRvbSAuZ29vZy10YWItc2VsZWN0ZWR7dG9wOi0xcHg7bWFyZ2luLWJvdHRvbTowO3BhZGRpbmctdG9wOjVweH0uZ29vZy10YWItYmFyLXN0YXJ0IC5nb29nLXRhYi1zZWxlY3RlZHtsZWZ0OjFweDttYXJnaW4tbGVmdDowO3BhZGRpbmctcmlnaHQ6OXB4fS5nb29nLXRhYi1iYXItZW5kIC5nb29nLXRhYi1zZWxlY3RlZHtsZWZ0Oi0xcHg7bWFyZ2luLXJpZ2h0OjA7cGFkZGluZy1sZWZ0OjlweH0uZ29vZy10YWItYmFye21hcmdpbjowO2JvcmRlcjowO3BhZGRpbmc6MDtsaXN0LXN0eWxlOm5vbmU7Y3Vyc29yOmRlZmF1bHQ7b3V0bGluZTpub25lO2JhY2tncm91bmQ6I2ViZWZmOX0uZ29vZy10YWItYmFyLWNsZWFye2NsZWFyOmJvdGg7aGVpZ2h0OjA7b3ZlcmZsb3c6aGlkZGVufS5nb29nLXRhYi1iYXItc3RhcnR7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLWVuZHtmbG9hdDpyaWdodH0qIGh0bWwgLmdvb2ctdGFiLWJhci1zdGFydHttYXJnaW4tcmlnaHQ6LTNweH0qIGh0bWwgLmdvb2ctdGFiLWJhci1lbmR7bWFyZ2luLWxlZnQ6LTNweH1zZW50aW5lbHt9", + "ok": true, + "headers": [ + [ + "content-length", + "1404" + ], + [ + "content-type", + "text/css" + ] + ], + "status": 200, + "status_text": "" + } + }, + "base_uri": "https://localhost:8080/", + "height": 197 + }, + "outputId": "0b02755e-431a-419b-fdbc-436de566fa46" + }, + "source": [ + "%%logica SaveOdd\n", + "\n", + "@Ground(Odd);\n", + "\n", + "Odd(2 * x + 1) :- x in Range(10);\n", + "\n", + "SaveOdd() += 1 :- Odd();" + ], + "execution_count": 42, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"9192ed7a-d22d-11ef-a7c0-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id97\", \"tabNames\": [\"SaveOdd\", \"(Log)\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_a867bc49c0" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"91934dc4-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id97\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_7293ebad95" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"9194f3c2-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_7339222b94" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"919545f2-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id97_content_1\");\n", + "//# sourceURL=js_5e85283b67" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"9195d6f2-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"919545f2-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_de2490f6c3" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"9196466e-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id97\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_d9d0bb42d0" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"919987de-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"9194f3c2-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_d112ca83f5" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"919ba58c-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_8ac599f6ab" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"919c3790-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id97_content_0\");\n", + "//# sourceURL=js_d227d72342" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"919cac7a-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"919c3790-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_64b468890c" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"919d027e-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id97\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_684dded496" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"91a07d32-d22d-11ef-a7c0-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id98\", \"tabNames\": [\"SQL\", \"Result\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_d54d4fcf00" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"91a104be-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id98\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_82dab40d09" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"91a2d76c-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_deb4d4237c" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"91a333f6-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id98_content_0\");\n", + "//# sourceURL=js_e9c5534311" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"91a38dec-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"91a333f6-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_d54f8b6bf9" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"91a435f8-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id98\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_6182258bc5" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The following query is stored at \u001b[1mSaveOdd_sql\u001b[0m variable.\n", + "-- Initializing DuckDB environment.\n", + "create schema if not exists logica_home;\n", + "-- Empty record, has to have a field by DuckDB syntax.\n", + "drop type if exists logicarecord893574736 cascade; create type logicarecord893574736 as struct(nirvana numeric);\n", + "create sequence if not exists eternal_logical_sequence;\n", + "\n", + "\n", + "-- Logica type: logicarecord481217614\n", + "drop type if exists logicarecord481217614 cascade; create type logicarecord481217614 as struct(r logicarecord893574736);\n", + "\n", + "-- Logica type: logicarecord383307722\n", + "drop type if exists logicarecord383307722 cascade; create type logicarecord383307722 as struct(a timestamp);\n", + "DROP TABLE IF EXISTS logica_home.Odd;\n", + "CREATE TABLE logica_home.Odd AS SELECT\n", + " ((((2) * (x_0.unnested_pod))) + (1)) AS col0\n", + "FROM\n", + " (select unnest(Range(10)) as unnested_pod) as x_0;\n", + "\n", + "-- Interacting with table logica_home.Odd\n", + "\n", + "SELECT\n", + " SUM(1) AS logica_value\n", + "FROM\n", + " logica_home.Odd AS Odd;\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"91a5d3ae-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"91a2d76c-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_06eb3347f2" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"91a7c952-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_4b3fad769f" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"91a81c7c-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id98_content_1\");\n", + "//# sourceURL=js_9d45cb17d2" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"91a86cea-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"91a81c7c-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_0cfa62b0f8" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"91a8e8b4-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id98\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_c9c1bc6b55" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The following table is stored at \u001b[1mSaveOdd\u001b[0m variable.\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
logica_value
010
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"91aa4dda-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"91a7c952-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_4687927cdb" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"91abceb2-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"919ba58c-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_c90e010097" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"91adbd1c-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_242ee16afb" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"91ae15e6-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id97_content_1\");\n", + "//# sourceURL=js_d0f9199dc6" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"91ae72e8-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"91ae15e6-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_ea7cb4711f" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"91aeca54-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id97\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_2c0a950207" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "image/svg+xml": "\n\n\n\n\n\nConcertina\n\n\n\nSaveOdd\n\nSaveOdd\n\n\n\nOdd\n\nOdd\n\n\n\nOdd->SaveOdd\n\n\n\n\n\n", + "text/plain": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Running predicate: Odd (10 ms)\n", + "Running predicate: SaveOdd (5 ms)\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"91cdbb62-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"91adbd1c-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_2381eb4b3f" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"91cfd622-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_03ec0f909b" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"91d0591c-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id97_content_0\");\n", + "//# sourceURL=js_3965db3956" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"91d134e0-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"91d0591c-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_81885ebaf5" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"91d188fa-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id97\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_ba8658548b" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"91d37fde-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_738a8340ed" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"91d3d97a-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id98_content_1\");\n", + "//# sourceURL=js_0946d2a585" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"91d42718-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"91d3d97a-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_5e4b273a5c" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"91d4c1fa-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id98\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_b1cc885a35" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"91d6a952-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"91d37fde-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_59c9a8b843" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + " \n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"91d82fac-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"91cfd622-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_daba63585f" + ] + }, + "metadata": {} + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "KrIFpwficJe8", + "colab": { + "resources": { + "http://localhost:8080/nbextensions/google.colab/tabbar_main.min.js": { + "data": "Ly8gY2xhbmctZm9ybWF0IG9mZgooZnVuY3Rpb24oKXt2YXIgZyxhYT1mdW5jdGlvbihhKXt2YXIgYj0wO3JldHVybiBmdW5jdGlvbigpe3JldHVybiBiPGEubGVuZ3RoP3tkb25lOiExLHZhbHVlOmFbYisrXX06e2RvbmU6ITB9fX0sYmE9dHlwZW9mIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzPT0iZnVuY3Rpb24iP09iamVjdC5kZWZpbmVQcm9wZXJ0eTpmdW5jdGlvbihhLGIsYyl7aWYoYT09QXJyYXkucHJvdG90eXBlfHxhPT1PYmplY3QucHJvdG90eXBlKXJldHVybiBhO2FbYl09Yy52YWx1ZTtyZXR1cm4gYX0sY2E9ZnVuY3Rpb24oYSl7YT1bIm9iamVjdCI9PXR5cGVvZiBnbG9iYWxUaGlzJiZnbG9iYWxUaGlzLGEsIm9iamVjdCI9PXR5cGVvZiB3aW5kb3cmJndpbmRvdywib2JqZWN0Ij09dHlwZW9mIHNlbGYmJnNlbGYsIm9iamVjdCI9PXR5cGVvZiBnbG9iYWwmJmdsb2JhbF07Zm9yKHZhciBiPTA7YjxhLmxlbmd0aDsrK2Ipe3ZhciBjPWFbYl07aWYoYyYmYy5NYXRoPT1NYXRoKXJldHVybiBjfXRocm93IEVycm9yKCJDYW5ub3QgZmluZCBnbG9iYWwgb2JqZWN0Iik7Cn0sZGE9Y2EodGhpcyksZWE9ZnVuY3Rpb24oYSxiKXtpZihiKWE6e3ZhciBjPWRhO2E9YS5zcGxpdCgiLiIpO2Zvcih2YXIgZD0wO2Q8YS5sZW5ndGgtMTtkKyspe3ZhciBlPWFbZF07aWYoIShlIGluIGMpKWJyZWFrIGE7Yz1jW2VdfWE9YVthLmxlbmd0aC0xXTtkPWNbYV07Yj1iKGQpO2IhPWQmJmIhPW51bGwmJmJhKGMsYSx7Y29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOmJ9KX19OwplYSgiU3ltYm9sIixmdW5jdGlvbihhKXtpZihhKXJldHVybiBhO3ZhciBiPWZ1bmN0aW9uKGYsaCl7dGhpcy5nPWY7YmEodGhpcywiZGVzY3JpcHRpb24iLHtjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6aH0pfTtiLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmd9O3ZhciBjPSJqc2NvbXBfc3ltYm9sXyIrKE1hdGgucmFuZG9tKCkqMUU5Pj4+MCkrIl8iLGQ9MCxlPWZ1bmN0aW9uKGYpe2lmKHRoaXMgaW5zdGFuY2VvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoIlN5bWJvbCBpcyBub3QgYSBjb25zdHJ1Y3RvciIpO3JldHVybiBuZXcgYihjKyhmfHwiIikrIl8iK2QrKyxmKX07cmV0dXJuIGV9KTsKdmFyIGZhPWZ1bmN0aW9uKGEpe3ZhciBiPXR5cGVvZiBTeW1ib2whPSJ1bmRlZmluZWQiJiZTeW1ib2wuaXRlcmF0b3ImJmFbU3ltYm9sLml0ZXJhdG9yXTtpZihiKXJldHVybiBiLmNhbGwoYSk7aWYodHlwZW9mIGEubGVuZ3RoPT0ibnVtYmVyIilyZXR1cm57bmV4dDphYShhKX07dGhyb3cgRXJyb3IoU3RyaW5nKGEpKyIgaXMgbm90IGFuIGl0ZXJhYmxlIG9yIEFycmF5TGlrZSIpO307ZWEoIlN5bWJvbC5kaXNwb3NlIixmdW5jdGlvbihhKXtyZXR1cm4gYT9hOlN5bWJvbCgiU3ltYm9sLmRpc3Bvc2UiKX0pOy8qCgogQ29weXJpZ2h0IFRoZSBDbG9zdXJlIExpYnJhcnkgQXV0aG9ycy4KIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wCiovCnZhciBsPXRoaXN8fHNlbGYsaWE9ZnVuY3Rpb24oYSl7YS5JYT12b2lkIDA7YS5WPWZ1bmN0aW9uKCl7cmV0dXJuIGEuSWE/YS5JYTphLklhPW5ldyBhfX0samE9ZnVuY3Rpb24oYSl7dmFyIGI9dHlwZW9mIGE7cmV0dXJuIGIhPSJvYmplY3QiP2I6YT9BcnJheS5pc0FycmF5KGEpPyJhcnJheSI6YjoibnVsbCJ9LGthPWZ1bmN0aW9uKGEpe3ZhciBiPWphKGEpO3JldHVybiBiPT0iYXJyYXkifHxiPT0ib2JqZWN0IiYmdHlwZW9mIGEubGVuZ3RoPT0ibnVtYmVyIn0sbT1mdW5jdGlvbihhKXt2YXIgYj10eXBlb2YgYTtyZXR1cm4gYj09Im9iamVjdCImJmEhPW51bGx8fGI9PSJmdW5jdGlvbiJ9LG5hPWZ1bmN0aW9uKGEpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYSxsYSkmJmFbbGFdfHwoYVtsYV09KyttYSl9LGxhPSJjbG9zdXJlX3VpZF8iKyhNYXRoLnJhbmRvbSgpKjFFOT4+PjApLG1hPTAsbj1mdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoKXt9Yy5wcm90b3R5cGU9CmIucHJvdG90eXBlO2EubD1iLnByb3RvdHlwZTthLnByb3RvdHlwZT1uZXcgYzthLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1hO2EucWQ9ZnVuY3Rpb24oZCxlLGYpe2Zvcih2YXIgaD1BcnJheShhcmd1bWVudHMubGVuZ3RoLTIpLGs9MjtrPGFyZ3VtZW50cy5sZW5ndGg7aysrKWhbay0yXT1hcmd1bWVudHNba107cmV0dXJuIGIucHJvdG90eXBlW2VdLmFwcGx5KGQsaCl9fTtmdW5jdGlvbiBvYShhLGIpe2lmKEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKUVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsb2EpO2Vsc2V7dmFyIGM9RXJyb3IoKS5zdGFjaztjJiYodGhpcy5zdGFjaz1jKX1hJiYodGhpcy5tZXNzYWdlPVN0cmluZyhhKSk7YiE9PXZvaWQgMCYmKHRoaXMuY2F1c2U9Yil9bihvYSxFcnJvcik7b2EucHJvdG90eXBlLm5hbWU9IkN1c3RvbUVycm9yIjt2YXIgcGE7ZnVuY3Rpb24gcWEoYSxiKXthPWEuc3BsaXQoIiVzIik7Zm9yKHZhciBjPSIiLGQ9YS5sZW5ndGgtMSxlPTA7ZTxkO2UrKyljKz1hW2VdKyhlPGIubGVuZ3RoP2JbZV06IiVzIik7b2EuY2FsbCh0aGlzLGMrYVtkXSl9bihxYSxvYSk7cWEucHJvdG90eXBlLm5hbWU9IkFzc2VydGlvbkVycm9yIjtmdW5jdGlvbiByYShhLGIsYyxkKXt2YXIgZT0iQXNzZXJ0aW9uIGZhaWxlZCI7aWYoYyl7ZSs9IjogIitjO3ZhciBmPWR9ZWxzZSBhJiYoZSs9IjogIithLGY9Yik7dGhyb3cgbmV3IHFhKCIiK2UsZnx8W10pO30KdmFyIHA9ZnVuY3Rpb24oYSxiLGMpe2F8fHJhKCIiLG51bGwsYixBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMikpO3JldHVybiBhfSxzYT1mdW5jdGlvbihhLGIsYyl7bShhKSYmYS5ub2RlVHlwZT09MXx8cmEoIkV4cGVjdGVkIEVsZW1lbnQgYnV0IGdvdCAlczogJXMuIixbamEoYSksYV0sYixBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMikpfSx1YT1mdW5jdGlvbihhLGIsYyxkKXthIGluc3RhbmNlb2YgYnx8cmEoIkV4cGVjdGVkIGluc3RhbmNlb2YgJXMgYnV0IGdvdCAlcy4iLFt0YShiKSx0YShhKV0sYyxBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMykpfTsKZnVuY3Rpb24gdGEoYSl7cmV0dXJuIGEgaW5zdGFuY2VvZiBGdW5jdGlvbj9hLmRpc3BsYXlOYW1lfHxhLm5hbWV8fCJ1bmtub3duIHR5cGUgbmFtZSI6YSBpbnN0YW5jZW9mIE9iamVjdD9hLmNvbnN0cnVjdG9yLmRpc3BsYXlOYW1lfHxhLmNvbnN0cnVjdG9yLm5hbWV8fE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhKTphPT09bnVsbD8ibnVsbCI6dHlwZW9mIGF9O3ZhciB2YT1BcnJheS5wcm90b3R5cGUuaW5kZXhPZj9mdW5jdGlvbihhLGIpe3AoYS5sZW5ndGghPW51bGwpO3JldHVybiBBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKGEsYix2b2lkIDApfTpmdW5jdGlvbihhLGIpe2lmKHR5cGVvZiBhPT09InN0cmluZyIpcmV0dXJuIHR5cGVvZiBiIT09InN0cmluZyJ8fGIubGVuZ3RoIT0xPy0xOmEuaW5kZXhPZihiLDApO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWlmKGMgaW4gYSYmYVtjXT09PWIpcmV0dXJuIGM7cmV0dXJuLTF9LHdhPUFycmF5LnByb3RvdHlwZS5mb3JFYWNoP2Z1bmN0aW9uKGEsYil7cChhLmxlbmd0aCE9bnVsbCk7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChhLGIsdm9pZCAwKX06ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9YS5sZW5ndGgsZD10eXBlb2YgYT09PSJzdHJpbmciP2Euc3BsaXQoIiIpOmEsZT0wO2U8YztlKyspZSBpbiBkJiZiLmNhbGwodm9pZCAwLGRbZV0sZSxhKX07CmZ1bmN0aW9uIHhhKGEsYil7Yj12YShhLGIpO3ZhciBjO2lmKGM9Yj49MClwKGEubGVuZ3RoIT1udWxsKSxBcnJheS5wcm90b3R5cGUuc3BsaWNlLmNhbGwoYSxiLDEpO3JldHVybiBjfWZ1bmN0aW9uIHlhKGEpe3ZhciBiPWEubGVuZ3RoO2lmKGI+MCl7Zm9yKHZhciBjPUFycmF5KGIpLGQ9MDtkPGI7ZCsrKWNbZF09YVtkXTtyZXR1cm4gY31yZXR1cm5bXX1mdW5jdGlvbiB6YShhLGIsYyxkKXtwKGEubGVuZ3RoIT1udWxsKTtBcnJheS5wcm90b3R5cGUuc3BsaWNlLmFwcGx5KGEsQWEoYXJndW1lbnRzLDEpKX1mdW5jdGlvbiBBYShhLGIsYyl7cChhLmxlbmd0aCE9bnVsbCk7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg8PTI/QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYSxiKTpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhLGIsYyl9O2Z1bmN0aW9uIEJhKGEsYixjKXtmb3IodmFyIGQgaW4gYSliLmNhbGwoYyxhW2RdLGQsYSl9ZnVuY3Rpb24gQ2EoYSxiKXtmb3IodmFyIGMgaW4gYSlpZihhW2NdPT1iKXJldHVybiEwO3JldHVybiExfWZ1bmN0aW9uIERhKGEsYixjKXtpZihhIT09bnVsbCYmYiBpbiBhKXRocm93IEVycm9yKCdUaGUgb2JqZWN0IGFscmVhZHkgY29udGFpbnMgdGhlIGtleSAiJytiKyciJyk7YVtiXT1jfWZ1bmN0aW9uIEVhKGEpe3ZhciBiPXt9LGM7Zm9yKGMgaW4gYSliW2FbY11dPWM7cmV0dXJuIGJ9dmFyIEZhPSJjb25zdHJ1Y3RvciBoYXNPd25Qcm9wZXJ0eSBpc1Byb3RvdHlwZU9mIHByb3BlcnR5SXNFbnVtZXJhYmxlIHRvTG9jYWxlU3RyaW5nIHRvU3RyaW5nIHZhbHVlT2YiLnNwbGl0KCIgIik7CmZ1bmN0aW9uIEdhKGEsYil7Zm9yKHZhciBjLGQsZT0xO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspe2Q9YXJndW1lbnRzW2VdO2ZvcihjIGluIGQpYVtjXT1kW2NdO2Zvcih2YXIgZj0wO2Y8RmEubGVuZ3RoO2YrKyljPUZhW2ZdLE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChkLGMpJiYoYVtjXT1kW2NdKX19O3ZhciBIYT1TdHJpbmcucHJvdG90eXBlLnRyaW0/ZnVuY3Rpb24oYSl7cmV0dXJuIGEudHJpbSgpfTpmdW5jdGlvbihhKXtyZXR1cm4vXltcc1x4YTBdKihbXHNcU10qPylbXHNceGEwXSokLy5leGVjKGEpWzFdfTsvKgoKIENvcHlyaWdodCBHb29nbGUgTExDCiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMAoqLwp2YXIgSWE9e307dmFyIEphPWZ1bmN0aW9uKGEpe2lmKElhIT09SWEpdGhyb3cgRXJyb3IoIkJhZCBzZWNyZXQiKTt0aGlzLmc9YX07SmEucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ307bmV3IEphKCJhYm91dDpibGFuayIpO25ldyBKYSgiYWJvdXQ6aW52YWxpZCN6Q2xvc3VyZXoiKTt2YXIgS2E9W10sTGE9ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJBIFVSTCB3aXRoIGNvbnRlbnQgJyIrYSsiJyB3YXMgc2FuaXRpemVkIGF3YXkuIil9O0thLmluZGV4T2YoTGEpPT09LTEmJkthLnB1c2goTGEpO3ZhciBNYSxOYTthOntmb3IodmFyIE9hPVsiQ0xPU1VSRV9GTEFHUyJdLFBhPWwsUWE9MDtRYTxPYS5sZW5ndGg7UWErKylpZihQYT1QYVtPYVtRYV1dLFBhPT1udWxsKXtOYT1udWxsO2JyZWFrIGF9TmE9UGF9dmFyIFJhPU5hJiZOYVs2MTA0MDEzMDFdO01hPVJhIT1udWxsP1JhOiExO2Z1bmN0aW9uIFNhKCl7dmFyIGE9bC5uYXZpZ2F0b3I7cmV0dXJuIGEmJihhPWEudXNlckFnZW50KT9hOiIifXZhciBUYSxVYT1sLm5hdmlnYXRvcjtUYT1VYT9VYS51c2VyQWdlbnREYXRhfHxudWxsOm51bGw7ZnVuY3Rpb24gcihhKXtyZXR1cm4gU2EoKS5pbmRleE9mKGEpIT0tMX07dmFyIFZhPXIoIkVkZ2UiKSx0PXIoIkdlY2tvIikmJiEoU2EoKS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoIndlYmtpdCIpIT0tMSYmIXIoIkVkZ2UiKSkmJiEocigiVHJpZGVudCIpfHxyKCJNU0lFIikpJiYhcigiRWRnZSIpLHU9U2EoKS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoIndlYmtpdCIpIT0tMSYmIXIoIkVkZ2UiKSx2PU1hJiZUYSYmVGEucGxhdGZvcm0/VGEucGxhdGZvcm09PT0ibWFjT1MiOnIoIk1hY2ludG9zaCIpO3ZhciBYYT1mdW5jdGlvbihhLGIpe0JhKGIsZnVuY3Rpb24oYyxkKXtkPT0ic3R5bGUiP2Euc3R5bGUuY3NzVGV4dD1jOmQ9PSJjbGFzcyI/YS5jbGFzc05hbWU9YzpkPT0iZm9yIj9hLmh0bWxGb3I9YzpXYS5oYXNPd25Qcm9wZXJ0eShkKT9hLnNldEF0dHJpYnV0ZShXYVtkXSxjKTpkLmxhc3RJbmRleE9mKCJhcmlhLSIsMCk9PTB8fGQubGFzdEluZGV4T2YoImRhdGEtIiwwKT09MD9hLnNldEF0dHJpYnV0ZShkLGMpOmFbZF09Y30pfSxXYT17Y2VsbHBhZGRpbmc6ImNlbGxQYWRkaW5nIixjZWxsc3BhY2luZzoiY2VsbFNwYWNpbmciLGNvbHNwYW46ImNvbFNwYW4iLGZyYW1lYm9yZGVyOiJmcmFtZUJvcmRlciIsaGVpZ2h0OiJoZWlnaHQiLG1heGxlbmd0aDoibWF4TGVuZ3RoIixub25jZToibm9uY2UiLHJvbGU6InJvbGUiLHJvd3NwYW46InJvd1NwYW4iLHR5cGU6InR5cGUiLHVzZW1hcDoidXNlTWFwIix2YWxpZ246InZBbGlnbiIsd2lkdGg6IndpZHRoIn0sWWE9ZnVuY3Rpb24oYSwKYixjKXtmdW5jdGlvbiBkKGspe2smJmIuYXBwZW5kQ2hpbGQodHlwZW9mIGs9PT0ic3RyaW5nIj9hLmNyZWF0ZVRleHROb2RlKGspOmspfWZvcih2YXIgZT0yO2U8Yy5sZW5ndGg7ZSsrKXt2YXIgZj1jW2VdO2lmKCFrYShmKXx8bShmKSYmZi5ub2RlVHlwZT4wKWQoZik7ZWxzZXthOntpZihmJiZ0eXBlb2YgZi5sZW5ndGg9PSJudW1iZXIiKXtpZihtKGYpKXt2YXIgaD10eXBlb2YgZi5pdGVtPT0iZnVuY3Rpb24ifHx0eXBlb2YgZi5pdGVtPT0ic3RyaW5nIjticmVhayBhfWlmKHR5cGVvZiBmPT09ImZ1bmN0aW9uIil7aD10eXBlb2YgZi5pdGVtPT0iZnVuY3Rpb24iO2JyZWFrIGF9fWg9ITF9d2EoaD95YShmKTpmLGQpfX19LFphPWZ1bmN0aW9uKGEsYil7Yj1TdHJpbmcoYik7YS5jb250ZW50VHlwZT09PSJhcHBsaWNhdGlvbi94aHRtbCt4bWwiJiYoYj1iLnRvTG93ZXJDYXNlKCkpO3JldHVybiBhLmNyZWF0ZUVsZW1lbnQoYil9LCRhPWZ1bmN0aW9uKGEpe2EmJmEucGFyZW50Tm9kZSYmCmEucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhKX0sYWI9ZnVuY3Rpb24oYSxiKXtpZighYXx8IWIpcmV0dXJuITE7aWYoYS5jb250YWlucyYmYi5ub2RlVHlwZT09MSlyZXR1cm4gYT09Ynx8YS5jb250YWlucyhiKTtpZih0eXBlb2YgYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiE9InVuZGVmaW5lZCIpcmV0dXJuIGE9PWJ8fCEhKGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24oYikmMTYpO2Zvcig7YiYmYSE9YjspYj1iLnBhcmVudE5vZGU7cmV0dXJuIGI9PWF9LGJiPWZ1bmN0aW9uKGEpe3AoYSwiTm9kZSBjYW5ub3QgYmUgbnVsbCBvciB1bmRlZmluZWQuIik7cmV0dXJuIGEubm9kZVR5cGU9PTk/YTphLm93bmVyRG9jdW1lbnR8fGEuZG9jdW1lbnR9LGNiPWZ1bmN0aW9uKGEsYil7Yj9hLnRhYkluZGV4PTA6KGEudGFiSW5kZXg9LTEsYS5yZW1vdmVBdHRyaWJ1dGUoInRhYkluZGV4IikpfSxkYj1mdW5jdGlvbihhKXtyZXR1cm4gYS5oYXNBdHRyaWJ1dGUoInRhYmluZGV4Iil9LGViPQpmdW5jdGlvbihhKXthPWEudGFiSW5kZXg7cmV0dXJuIHR5cGVvZiBhPT09Im51bWJlciImJmE+PTAmJmE8MzI3Njh9LGZiPWZ1bmN0aW9uKGEpe3RoaXMuZz1hfHxsLmRvY3VtZW50fHxkb2N1bWVudH07ZmIucHJvdG90eXBlLmk9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nO3JldHVybiB0eXBlb2YgYT09PSJzdHJpbmciP2IuZ2V0RWxlbWVudEJ5SWQoYSk6YX07ZmIucHJvdG90eXBlLmg9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXMuZyxlPWFyZ3VtZW50cyxmPWVbMV0saD1aYShkLFN0cmluZyhlWzBdKSk7ZiYmKHR5cGVvZiBmPT09InN0cmluZyI/aC5jbGFzc05hbWU9ZjpBcnJheS5pc0FycmF5KGYpP2guY2xhc3NOYW1lPWYuam9pbigiICIpOlhhKGgsZikpO2UubGVuZ3RoPjImJllhKGQsaCxlKTtyZXR1cm4gaH07dmFyIHc9ZnVuY3Rpb24oKXt0aGlzLmJhPXRoaXMuYmE7dGhpcy5rYT10aGlzLmthfTt3LnByb3RvdHlwZS5iYT0hMTt3LnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7dGhpcy5iYXx8KHRoaXMuYmE9ITAsdGhpcy5DKCkpfTt3LnByb3RvdHlwZVtTeW1ib2wuZGlzcG9zZV09ZnVuY3Rpb24oKXt0aGlzLmRpc3Bvc2UoKX07dy5wcm90b3R5cGUuQz1mdW5jdGlvbigpe2lmKHRoaXMua2EpZm9yKDt0aGlzLmthLmxlbmd0aDspdGhpcy5rYS5zaGlmdCgpKCl9O3ZhciB5PWZ1bmN0aW9uKGEsYil7dGhpcy50eXBlPWE7dGhpcy51PXRoaXMudGFyZ2V0PWI7dGhpcy5kZWZhdWx0UHJldmVudGVkPXRoaXMuQT0hMX07eS5wcm90b3R5cGUudj1mdW5jdGlvbigpe3RoaXMuQT0hMH07eS5wcm90b3R5cGUuaj1mdW5jdGlvbigpe3RoaXMuZGVmYXVsdFByZXZlbnRlZD0hMH07dmFyIGdiPWZ1bmN0aW9uKCl7aWYoIWwuYWRkRXZlbnRMaXN0ZW5lcnx8IU9iamVjdC5kZWZpbmVQcm9wZXJ0eSlyZXR1cm4hMTt2YXIgYT0hMSxiPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwicGFzc2l2ZSIse2dldDpmdW5jdGlvbigpe2E9ITB9fSk7dHJ5e3ZhciBjPWZ1bmN0aW9uKCl7fTtsLmFkZEV2ZW50TGlzdGVuZXIoInRlc3QiLGMsYik7bC5yZW1vdmVFdmVudExpc3RlbmVyKCJ0ZXN0IixjLGIpfWNhdGNoKGQpe31yZXR1cm4gYX0oKTt2YXIgej1mdW5jdGlvbihhLGIpe3kuY2FsbCh0aGlzLGE/YS50eXBlOiIiKTt0aGlzLnJlbGF0ZWRUYXJnZXQ9dGhpcy51PXRoaXMudGFyZ2V0PW51bGw7dGhpcy5idXR0b249dGhpcy5zY3JlZW5ZPXRoaXMuc2NyZWVuWD10aGlzLmNsaWVudFk9dGhpcy5jbGllbnRYPTA7dGhpcy5rZXk9IiI7dGhpcy5nPTA7dGhpcy5tZXRhS2V5PXRoaXMuc2hpZnRLZXk9dGhpcy5hbHRLZXk9dGhpcy5jdHJsS2V5PSExO3RoaXMuc3RhdGU9bnVsbDt0aGlzLkc9ITE7dGhpcy5wb2ludGVySWQ9MDt0aGlzLnBvaW50ZXJUeXBlPSIiO3RoaXMudGltZVN0YW1wPTA7dGhpcy5oPW51bGw7aWYoYSl7dmFyIGM9dGhpcy50eXBlPWEudHlwZSxkPWEuY2hhbmdlZFRvdWNoZXMmJmEuY2hhbmdlZFRvdWNoZXMubGVuZ3RoP2EuY2hhbmdlZFRvdWNoZXNbMF06bnVsbDt0aGlzLnRhcmdldD1hLnRhcmdldHx8YS5zcmNFbGVtZW50O3RoaXMudT1iO2I9YS5yZWxhdGVkVGFyZ2V0O2J8fChjPT0ibW91c2VvdmVyIj8KYj1hLmZyb21FbGVtZW50OmM9PSJtb3VzZW91dCImJihiPWEudG9FbGVtZW50KSk7dGhpcy5yZWxhdGVkVGFyZ2V0PWI7ZD8odGhpcy5jbGllbnRYPWQuY2xpZW50WCE9PXZvaWQgMD9kLmNsaWVudFg6ZC5wYWdlWCx0aGlzLmNsaWVudFk9ZC5jbGllbnRZIT09dm9pZCAwP2QuY2xpZW50WTpkLnBhZ2VZLHRoaXMuc2NyZWVuWD1kLnNjcmVlblh8fDAsdGhpcy5zY3JlZW5ZPWQuc2NyZWVuWXx8MCk6KHRoaXMuY2xpZW50WD1hLmNsaWVudFghPT12b2lkIDA/YS5jbGllbnRYOmEucGFnZVgsdGhpcy5jbGllbnRZPWEuY2xpZW50WSE9PXZvaWQgMD9hLmNsaWVudFk6YS5wYWdlWSx0aGlzLnNjcmVlblg9YS5zY3JlZW5YfHwwLHRoaXMuc2NyZWVuWT1hLnNjcmVlbll8fDApO3RoaXMuYnV0dG9uPWEuYnV0dG9uO3RoaXMuZz1hLmtleUNvZGV8fDA7dGhpcy5rZXk9YS5rZXl8fCIiO3RoaXMuY3RybEtleT1hLmN0cmxLZXk7dGhpcy5hbHRLZXk9YS5hbHRLZXk7dGhpcy5zaGlmdEtleT1hLnNoaWZ0S2V5Owp0aGlzLm1ldGFLZXk9YS5tZXRhS2V5O3RoaXMuRz12P2EubWV0YUtleTphLmN0cmxLZXk7dGhpcy5wb2ludGVySWQ9YS5wb2ludGVySWR8fDA7dGhpcy5wb2ludGVyVHlwZT1hLnBvaW50ZXJUeXBlO3RoaXMuc3RhdGU9YS5zdGF0ZTt0aGlzLnRpbWVTdGFtcD1hLnRpbWVTdGFtcDt0aGlzLmg9YTthLmRlZmF1bHRQcmV2ZW50ZWQmJnoubC5qLmNhbGwodGhpcyl9fTtuKHoseSk7ei5wcm90b3R5cGUudj1mdW5jdGlvbigpe3oubC52LmNhbGwodGhpcyk7dGhpcy5oLnN0b3BQcm9wYWdhdGlvbj90aGlzLmguc3RvcFByb3BhZ2F0aW9uKCk6dGhpcy5oLmNhbmNlbEJ1YmJsZT0hMH07ei5wcm90b3R5cGUuaj1mdW5jdGlvbigpe3oubC5qLmNhbGwodGhpcyk7dmFyIGE9dGhpcy5oO2EucHJldmVudERlZmF1bHQ/YS5wcmV2ZW50RGVmYXVsdCgpOmEucmV0dXJuVmFsdWU9ITF9O3ZhciBoYj0iY2xvc3VyZV9saXN0ZW5hYmxlXyIrKE1hdGgucmFuZG9tKCkqMUU2fDApLGliPWZ1bmN0aW9uKGEpe3JldHVybiEoIWF8fCFhW2hiXSl9O3ZhciBqYj0wO3ZhciBrYj1mdW5jdGlvbihhLGIsYyxkLGUpe3RoaXMubGlzdGVuZXI9YTt0aGlzLnByb3h5PW51bGw7dGhpcy5zcmM9Yjt0aGlzLnR5cGU9Yzt0aGlzLmNhcHR1cmU9ISFkO3RoaXMucGE9ZTt0aGlzLmtleT0rK2piO3RoaXMuamE9dGhpcy5vYT0hMX0sbGI9ZnVuY3Rpb24oYSl7YS5qYT0hMDthLmxpc3RlbmVyPW51bGw7YS5wcm94eT1udWxsO2Euc3JjPW51bGw7YS5wYT1udWxsfTt2YXIgbWI9ZnVuY3Rpb24oYSl7dGhpcy5zcmM9YTt0aGlzLmc9e307dGhpcy5oPTB9O21iLnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZj1hLnRvU3RyaW5nKCk7YT10aGlzLmdbZl07YXx8KGE9dGhpcy5nW2ZdPVtdLHRoaXMuaCsrKTt2YXIgaD1uYihhLGIsZCxlKTtoPi0xPyhiPWFbaF0sY3x8KGIub2E9ITEpKTooYj1uZXcga2IoYix0aGlzLnNyYyxmLCEhZCxlKSxiLm9hPWMsYS5wdXNoKGIpKTtyZXR1cm4gYn07CnZhciBvYj1mdW5jdGlvbihhLGIpe3ZhciBjPWIudHlwZTtjIGluIGEuZyYmeGEoYS5nW2NdLGIpJiYobGIoYiksYS5nW2NdLmxlbmd0aD09MCYmKGRlbGV0ZSBhLmdbY10sYS5oLS0pKX0scGI9ZnVuY3Rpb24oYSxiLGMsZCxlKXthPWEuZ1tiLnRvU3RyaW5nKCldO2I9LTE7YSYmKGI9bmIoYSxjLGQsZSkpO3JldHVybiBiPi0xP2FbYl06bnVsbH0sbmI9ZnVuY3Rpb24oYSxiLGMsZCl7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDsrK2Upe3ZhciBmPWFbZV07aWYoIWYuamEmJmYubGlzdGVuZXI9PWImJmYuY2FwdHVyZT09ISFjJiZmLnBhPT1kKXJldHVybiBlfXJldHVybi0xfTt2YXIgcWI9ImNsb3N1cmVfbG1fIisoTWF0aC5yYW5kb20oKSoxRTZ8MCkscmI9e30sc2I9MCx1Yj1mdW5jdGlvbihhLGIsYyxkLGUpe2lmKGQmJmQub25jZSlyZXR1cm4gdGIoYSxiLGMsZCxlKTtpZihBcnJheS5pc0FycmF5KGIpKXtmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKyl1YihhLGJbZl0sYyxkLGUpO3JldHVybiBudWxsfWM9dmIoYyk7cmV0dXJuIGliKGEpP3diKGEsYixjLG0oZCk/ISFkLmNhcHR1cmU6ISFkLGUpOnhiKGEsYixjLCExLGQsZSl9LHhiPWZ1bmN0aW9uKGEsYixjLGQsZSxmKXtpZighYil0aHJvdyBFcnJvcigiSW52YWxpZCBldmVudCB0eXBlIik7dmFyIGg9bShlKT8hIWUuY2FwdHVyZTohIWUsaz15YihhKTtrfHwoYVtxYl09az1uZXcgbWIoYSkpO2M9ay5hZGQoYixjLGQsaCxmKTtpZihjLnByb3h5KXJldHVybiBjO2Q9emIoKTtjLnByb3h5PWQ7ZC5zcmM9YTtkLmxpc3RlbmVyPWM7aWYoYS5hZGRFdmVudExpc3RlbmVyKWdifHwoZT1oKSxlPT09dm9pZCAwJiYKKGU9ITEpLGEuYWRkRXZlbnRMaXN0ZW5lcihiLnRvU3RyaW5nKCksZCxlKTtlbHNlIGlmKGEuYXR0YWNoRXZlbnQpYS5hdHRhY2hFdmVudChBYihiLnRvU3RyaW5nKCkpLGQpO2Vsc2UgaWYoYS5hZGRMaXN0ZW5lciYmYS5yZW1vdmVMaXN0ZW5lcilwKGI9PT0iY2hhbmdlIiwiTWVkaWFRdWVyeUxpc3Qgb25seSBoYXMgYSBjaGFuZ2UgZXZlbnQiKSxhLmFkZExpc3RlbmVyKGQpO2Vsc2UgdGhyb3cgRXJyb3IoImFkZEV2ZW50TGlzdGVuZXIgYW5kIGF0dGFjaEV2ZW50IGFyZSB1bmF2YWlsYWJsZS4iKTtzYisrO3JldHVybiBjfSx6Yj1mdW5jdGlvbigpe3ZhciBhPUJiLGI9ZnVuY3Rpb24oYyl7cmV0dXJuIGEuY2FsbChiLnNyYyxiLmxpc3RlbmVyLGMpfTtyZXR1cm4gYn0sdGI9ZnVuY3Rpb24oYSxiLGMsZCxlKXtpZihBcnJheS5pc0FycmF5KGIpKXtmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKyl0YihhLGJbZl0sYyxkLGUpO3JldHVybiBudWxsfWM9dmIoYyk7cmV0dXJuIGliKGEpPwphLkEuYWRkKFN0cmluZyhiKSxjLCEwLG0oZCk/ISFkLmNhcHR1cmU6ISFkLGUpOnhiKGEsYixjLCEwLGQsZSl9LENiPWZ1bmN0aW9uKGEsYixjLGQsZSl7aWYoQXJyYXkuaXNBcnJheShiKSlmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKylDYihhLGJbZl0sYyxkLGUpO2Vsc2UgZD1tKGQpPyEhZC5jYXB0dXJlOiEhZCxjPXZiKGMpLGliKGEpPyhhPWEuQSxiPVN0cmluZyhiKS50b1N0cmluZygpLGIgaW4gYS5nJiYoZj1hLmdbYl0sYz1uYihmLGMsZCxlKSxjPi0xJiYobGIoZltjXSkscChmLmxlbmd0aCE9bnVsbCksQXJyYXkucHJvdG90eXBlLnNwbGljZS5jYWxsKGYsYywxKSxmLmxlbmd0aD09MCYmKGRlbGV0ZSBhLmdbYl0sYS5oLS0pKSkpOmEmJihhPXliKGEpKSYmKGM9cGIoYSxiLGMsZCxlKSkmJkEoYyl9LEE9ZnVuY3Rpb24oYSl7aWYodHlwZW9mIGEhPT0ibnVtYmVyIiYmYSYmIWEuamEpe3ZhciBiPWEuc3JjO2lmKGliKGIpKW9iKGIuQSxhKTtlbHNle3ZhciBjPWEudHlwZSwKZD1hLnByb3h5O2IucmVtb3ZlRXZlbnRMaXN0ZW5lcj9iLnJlbW92ZUV2ZW50TGlzdGVuZXIoYyxkLGEuY2FwdHVyZSk6Yi5kZXRhY2hFdmVudD9iLmRldGFjaEV2ZW50KEFiKGMpLGQpOmIuYWRkTGlzdGVuZXImJmIucmVtb3ZlTGlzdGVuZXImJmIucmVtb3ZlTGlzdGVuZXIoZCk7c2ItLTsoYz15YihiKSk/KG9iKGMsYSksYy5oPT0wJiYoYy5zcmM9bnVsbCxiW3FiXT1udWxsKSk6bGIoYSl9fX0sQWI9ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW4gcmI/cmJbYV06cmJbYV09Im9uIithfSxCYj1mdW5jdGlvbihhLGIpe2lmKGEuamEpYT0hMDtlbHNle2I9bmV3IHooYix0aGlzKTt2YXIgYz1hLmxpc3RlbmVyLGQ9YS5wYXx8YS5zcmM7YS5vYSYmQShhKTthPWMuY2FsbChkLGIpfXJldHVybiBhfSx5Yj1mdW5jdGlvbihhKXthPWFbcWJdO3JldHVybiBhIGluc3RhbmNlb2YgbWI/YTpudWxsfSxEYj0iX19jbG9zdXJlX2V2ZW50c19mbl8iKyhNYXRoLnJhbmRvbSgpKjFFOT4+PjApLHZiPWZ1bmN0aW9uKGEpe3AoYSwKIkxpc3RlbmVyIGNhbiBub3QgYmUgbnVsbC4iKTtpZih0eXBlb2YgYT09PSJmdW5jdGlvbiIpcmV0dXJuIGE7cChhLmhhbmRsZUV2ZW50LCJBbiBvYmplY3QgbGlzdGVuZXIgbXVzdCBoYXZlIGhhbmRsZUV2ZW50IG1ldGhvZC4iKTthW0RiXXx8KGFbRGJdPWZ1bmN0aW9uKGIpe3JldHVybiBhLmhhbmRsZUV2ZW50KGIpfSk7cmV0dXJuIGFbRGJdfTt2YXIgRWI9ZnVuY3Rpb24oYSl7dy5jYWxsKHRoaXMpO3RoaXMuaD1hO3RoaXMuZz17fX07bihFYix3KTsKdmFyIEZiPVtdLEI9ZnVuY3Rpb24oYSxiLGMsZCl7QXJyYXkuaXNBcnJheShjKXx8KGMmJihGYlswXT1jLnRvU3RyaW5nKCkpLGM9RmIpO2Zvcih2YXIgZT0wO2U8Yy5sZW5ndGg7ZSsrKXt2YXIgZj11YihiLGNbZV0sZHx8YS5oYW5kbGVFdmVudCwhMSxhLmh8fGEpO2lmKCFmKWJyZWFrO2EuZ1tmLmtleV09Zn1yZXR1cm4gYX0sQz1mdW5jdGlvbihhLGIsYyxkLGUsZil7aWYoQXJyYXkuaXNBcnJheShjKSlmb3IodmFyIGg9MDtoPGMubGVuZ3RoO2grKylDKGEsYixjW2hdLGQsZSxmKTtlbHNlIGQ9ZHx8YS5oYW5kbGVFdmVudCxlPW0oZSk/ISFlLmNhcHR1cmU6ISFlLGY9Znx8YS5ofHxhLGQ9dmIoZCksZT0hIWUsYz1pYihiKT9wYihiLkEsU3RyaW5nKGMpLGQsZSxmKTpiPyhiPXliKGIpKT9wYihiLGMsZCxlLGYpOm51bGw6bnVsbCxjJiYoQShjKSxkZWxldGUgYS5nW2Mua2V5XSk7cmV0dXJuIGF9LEdiPWZ1bmN0aW9uKGEpe0JhKGEuZyxmdW5jdGlvbihiLGMpe3RoaXMuZy5oYXNPd25Qcm9wZXJ0eShjKSYmCkEoYil9LGEpO2EuZz17fX07RWIucHJvdG90eXBlLkM9ZnVuY3Rpb24oKXtFYi5sLkMuY2FsbCh0aGlzKTtHYih0aGlzKX07RWIucHJvdG90eXBlLmhhbmRsZUV2ZW50PWZ1bmN0aW9uKCl7dGhyb3cgRXJyb3IoIkV2ZW50SGFuZGxlci5oYW5kbGVFdmVudCBub3QgaW1wbGVtZW50ZWQiKTt9O3ZhciBEPWZ1bmN0aW9uKCl7dy5jYWxsKHRoaXMpO3RoaXMuQT1uZXcgbWIodGhpcyk7dGhpcy5ZYT10aGlzO3RoaXMubGE9bnVsbH07bihELHcpO0QucHJvdG90eXBlW2hiXT0hMDtELnByb3RvdHlwZS5BYT1mdW5jdGlvbihhKXt0aGlzLmxhPWF9O0QucHJvdG90eXBlLnJlbW92ZUV2ZW50TGlzdGVuZXI9ZnVuY3Rpb24oYSxiLGMsZCl7Q2IodGhpcyxhLGIsYyxkKX07CnZhciBFPWZ1bmN0aW9uKGEsYil7SGIoYSk7dmFyIGM9YS5sYTtpZihjKXt2YXIgZD1bXTtmb3IodmFyIGU9MTtjO2M9Yy5sYSlkLnB1c2goYykscCgrK2U8MUUzLCJpbmZpbml0ZSBsb29wIil9YT1hLllhO2M9Yi50eXBlfHxiO3R5cGVvZiBiPT09InN0cmluZyI/Yj1uZXcgeShiLGEpOmIgaW5zdGFuY2VvZiB5P2IudGFyZ2V0PWIudGFyZ2V0fHxhOihlPWIsYj1uZXcgeShjLGEpLEdhKGIsZSkpO2U9ITA7dmFyIGY7aWYoZClmb3IoZj1kLmxlbmd0aC0xOyFiLkEmJmY+PTA7Zi0tKXt2YXIgaD1iLnU9ZFtmXTtlPUliKGgsYywhMCxiKSYmZX1iLkF8fChoPWIudT1hLGU9SWIoaCxjLCEwLGIpJiZlLGIuQXx8KGU9SWIoaCxjLCExLGIpJiZlKSk7aWYoZClmb3IoZj0wOyFiLkEmJmY8ZC5sZW5ndGg7ZisrKWg9Yi51PWRbZl0sZT1JYihoLGMsITEsYikmJmU7cmV0dXJuIGV9OwpELnByb3RvdHlwZS5DPWZ1bmN0aW9uKCl7RC5sLkMuY2FsbCh0aGlzKTtpZih0aGlzLkEpe3ZhciBhPXRoaXMuQSxiPTAsYztmb3IoYyBpbiBhLmcpe2Zvcih2YXIgZD1hLmdbY10sZT0wO2U8ZC5sZW5ndGg7ZSsrKSsrYixsYihkW2VdKTtkZWxldGUgYS5nW2NdO2EuaC0tfX10aGlzLmxhPW51bGx9O3ZhciB3Yj1mdW5jdGlvbihhLGIsYyxkLGUpe0hiKGEpO3JldHVybiBhLkEuYWRkKFN0cmluZyhiKSxjLCExLGQsZSl9LEliPWZ1bmN0aW9uKGEsYixjLGQpe2I9YS5BLmdbU3RyaW5nKGIpXTtpZighYilyZXR1cm4hMDtiPWIuY29uY2F0KCk7Zm9yKHZhciBlPSEwLGY9MDtmPGIubGVuZ3RoOysrZil7dmFyIGg9YltmXTtpZihoJiYhaC5qYSYmaC5jYXB0dXJlPT1jKXt2YXIgaz1oLmxpc3RlbmVyLHE9aC5wYXx8aC5zcmM7aC5vYSYmb2IoYS5BLGgpO2U9ay5jYWxsKHEsZCkhPT0hMSYmZX19cmV0dXJuIGUmJiFkLmRlZmF1bHRQcmV2ZW50ZWR9LEhiPWZ1bmN0aW9uKGEpe3AoYS5BLCJFdmVudCB0YXJnZXQgaXMgbm90IGluaXRpYWxpemVkLiBEaWQgeW91IGNhbGwgdGhlIHN1cGVyY2xhc3MgKGdvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0KSBjb25zdHJ1Y3Rvcj8iKX07dmFyIEpiPXQ/Ik1velVzZXJTZWxlY3QiOnV8fFZhPyJXZWJraXRVc2VyU2VsZWN0IjpudWxsLEtiPWZ1bmN0aW9uKGEsYil7Yj1iP251bGw6YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpO2lmKEpiJiYoYS5zdHlsZSYmKGEuc3R5bGVbSmJdPSJub25lIiksYikpZm9yKHZhciBjPTA7YT1iW2NdO2MrKylhLnN0eWxlJiYoYS5zdHlsZVtKYl09Im5vbmUiKX07dmFyIExiPWZ1bmN0aW9uKCl7fTtpYShMYik7TGIucHJvdG90eXBlLmc9MDt2YXIgRj1mdW5jdGlvbihhKXtELmNhbGwodGhpcyk7dGhpcy5HPWF8fHBhfHwocGE9bmV3IGZiKTt0aGlzLnphPU1iO3RoaXMuWT1udWxsO3RoaXMucz0hMTt0aGlzLmc9bnVsbDt0aGlzLk09dm9pZCAwO3RoaXMudT10aGlzLmo9dGhpcy5oPW51bGw7dGhpcy5TYT0hMX07bihGLEQpO0YucHJvdG90eXBlLlphPUxiLlYoKTsKdmFyIE1iPW51bGwsTmI9ZnVuY3Rpb24oYSxiKXtzd2l0Y2goYSl7Y2FzZSAxOnJldHVybiBiPyJkaXNhYmxlIjoiZW5hYmxlIjtjYXNlIDI6cmV0dXJuIGI/ImhpZ2hsaWdodCI6InVuaGlnaGxpZ2h0IjtjYXNlIDQ6cmV0dXJuIGI/ImFjdGl2YXRlIjoiZGVhY3RpdmF0ZSI7Y2FzZSA4OnJldHVybiBiPyJzZWxlY3QiOiJ1bnNlbGVjdCI7Y2FzZSAxNjpyZXR1cm4gYj8iY2hlY2siOiJ1bmNoZWNrIjtjYXNlIDMyOnJldHVybiBiPyJmb2N1cyI6ImJsdXIiO2Nhc2UgNjQ6cmV0dXJuIGI/Im9wZW4iOiJjbG9zZSJ9dGhyb3cgRXJyb3IoIkludmFsaWQgY29tcG9uZW50IHN0YXRlIik7fSxPYj1mdW5jdGlvbihhKXtyZXR1cm4gYS5ZfHwoYS5ZPSI6IisoYS5aYS5nKyspLnRvU3RyaW5nKDM2KSl9LFBiPWZ1bmN0aW9uKGEsYil7aWYoYS5oJiZhLmgudSl7dmFyIGM9YS5oLnUsZD1hLlk7ZCBpbiBjJiZkZWxldGUgY1tkXTtEYShhLmgudSxiLGEpfWEuWT1ifTtGLnByb3RvdHlwZS5pPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ307CnZhciBRYj1mdW5jdGlvbihhKXthLk18fChhLk09bmV3IEViKGEpKTtyZXR1cm4gcChhLk0pfTtGLnByb3RvdHlwZS5BYT1mdW5jdGlvbihhKXtpZih0aGlzLmgmJnRoaXMuaCE9YSl0aHJvdyBFcnJvcigiTWV0aG9kIG5vdCBzdXBwb3J0ZWQiKTtGLmwuQWEuY2FsbCh0aGlzLGEpfTtGLnByb3RvdHlwZS5tYT1mdW5jdGlvbigpe3RoaXMuZz1aYSh0aGlzLkcuZywiRElWIil9O0YucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbihhKXtSYih0aGlzLGEpfTsKdmFyIFJiPWZ1bmN0aW9uKGEsYixjKXtpZihhLnMpdGhyb3cgRXJyb3IoIkNvbXBvbmVudCBhbHJlYWR5IHJlbmRlcmVkIik7YS5nfHxhLm1hKCk7Yj9iLmluc2VydEJlZm9yZShhLmcsY3x8bnVsbCk6YS5HLmcuYm9keS5hcHBlbmRDaGlsZChhLmcpO2EuaCYmIWEuaC5zfHxhLkkoKX0sU2I9ZnVuY3Rpb24oYSxiKXtpZihhLnMpdGhyb3cgRXJyb3IoIkNvbXBvbmVudCBhbHJlYWR5IHJlbmRlcmVkIik7aWYoYiYmYS53YShiKSl7YS5TYT0hMDt2YXIgYz1iYihiKTthLkcmJmEuRy5nPT1jfHwoYS5HPWI/bmV3IGZiKGJiKGIpKTpwYXx8KHBhPW5ldyBmYikpO2EuRWEoYik7YS5JKCl9ZWxzZSB0aHJvdyBFcnJvcigiSW52YWxpZCBlbGVtZW50IHRvIGRlY29yYXRlIik7fTtnPUYucHJvdG90eXBlO2cud2E9ZnVuY3Rpb24oKXtyZXR1cm4hMH07Zy5FYT1mdW5jdGlvbihhKXt0aGlzLmc9YX07CmcuST1mdW5jdGlvbigpe3RoaXMucz0hMDtUYih0aGlzLGZ1bmN0aW9uKGEpeyFhLnMmJmEuaSgpJiZhLkkoKX0pfTtnLlU9ZnVuY3Rpb24oKXtUYih0aGlzLGZ1bmN0aW9uKGEpe2EucyYmYS5VKCl9KTt0aGlzLk0mJkdiKHRoaXMuTSk7dGhpcy5zPSExfTtnLkM9ZnVuY3Rpb24oKXt0aGlzLnMmJnRoaXMuVSgpO3RoaXMuTSYmKHRoaXMuTS5kaXNwb3NlKCksZGVsZXRlIHRoaXMuTSk7VGIodGhpcyxmdW5jdGlvbihhKXthLmRpc3Bvc2UoKX0pOyF0aGlzLlNhJiZ0aGlzLmcmJiRhKHRoaXMuZyk7dGhpcy5oPXRoaXMuZz10aGlzLnU9dGhpcy5qPW51bGw7Ri5sLkMuY2FsbCh0aGlzKX07Zy5CYT1mdW5jdGlvbihhLGIpe3RoaXMuQ2EoYSxIKHRoaXMpLGIpfTsKZy5DYT1mdW5jdGlvbihhLGIsYyl7cCghIWEsIlByb3ZpZGVkIGVsZW1lbnQgbXVzdCBub3QgYmUgbnVsbC4iKTtpZihhLnMmJihjfHwhdGhpcy5zKSl0aHJvdyBFcnJvcigiQ29tcG9uZW50IGFscmVhZHkgcmVuZGVyZWQiKTtpZihiPDB8fGI+SCh0aGlzKSl0aHJvdyBFcnJvcigiQ2hpbGQgY29tcG9uZW50IGluZGV4IG91dCBvZiBib3VuZHMiKTt0aGlzLnUmJnRoaXMuanx8KHRoaXMudT17fSx0aGlzLmo9W10pO2lmKGEuaD09dGhpcyl7dmFyIGQ9dGhpcy51LGU9T2IoYSk7ZFtlXT1hO3hhKHRoaXMuaixhKX1lbHNlIERhKHRoaXMudSxPYihhKSxhKTtpZihhPT10aGlzKXRocm93IEVycm9yKCJVbmFibGUgdG8gc2V0IHBhcmVudCBjb21wb25lbnQiKTtpZihkPXRoaXMmJmEuaCYmYS5ZKWU9YS5oLGQ9YS5ZLGUudSYmZD8oZT1lLnUsZD0oZSE9PW51bGwmJmQgaW4gZT9lW2RdOnZvaWQgMCl8fG51bGwpOmQ9bnVsbDtpZihkJiZhLmghPXRoaXMpdGhyb3cgRXJyb3IoIlVuYWJsZSB0byBzZXQgcGFyZW50IGNvbXBvbmVudCIpOwphLmg9dGhpcztGLmwuQWEuY2FsbChhLHRoaXMpO3phKHRoaXMuaixiLDAsYSk7YS5zJiZ0aGlzLnMmJmEuaD09dGhpcz8oYz10aGlzLm5hKCksKGMuY2hpbGROb2Rlc1tiXXx8bnVsbCkhPWEuaSgpJiYoYS5pKCkucGFyZW50RWxlbWVudD09YyYmYy5yZW1vdmVDaGlsZChhLmkoKSksYj1jLmNoaWxkTm9kZXNbYl18fG51bGwsYy5pbnNlcnRCZWZvcmUoYS5pKCksYikpKTpjPyh0aGlzLmd8fHRoaXMubWEoKSxiPUkodGhpcyxiKzEpLFJiKGEsdGhpcy5uYSgpLGI/Yi5nOm51bGwpKTp0aGlzLnMmJiFhLnMmJmEuZyYmYS5nLnBhcmVudE5vZGUmJmEuZy5wYXJlbnROb2RlLm5vZGVUeXBlPT0xJiZhLkkoKX07Zy5uYT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmd9Owp2YXIgVWI9ZnVuY3Rpb24oYSl7aWYoYS56YT09bnVsbCl7dmFyIGI9YS5zP2EuZzphLkcuZy5ib2R5O2E6e3ZhciBjPWJiKGIpO2lmKGMuZGVmYXVsdFZpZXcmJmMuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSYmKGM9Yy5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKGIsbnVsbCkpKXtjPWMuZGlyZWN0aW9ufHxjLmdldFByb3BlcnR5VmFsdWUoImRpcmVjdGlvbiIpfHwiIjticmVhayBhfWM9IiJ9YS56YT0icnRsIj09KGN8fChiLmN1cnJlbnRTdHlsZT9iLmN1cnJlbnRTdHlsZS5kaXJlY3Rpb246bnVsbCl8fGIuc3R5bGUmJmIuc3R5bGUuZGlyZWN0aW9uKX1yZXR1cm4gYS56YX0sSD1mdW5jdGlvbihhKXtyZXR1cm4gYS5qP2Euai5sZW5ndGg6MH0sST1mdW5jdGlvbihhLGIpe3JldHVybiBhLmo/YS5qW2JdfHxudWxsOm51bGx9LFRiPWZ1bmN0aW9uKGEsYixjKXthLmomJmEuai5mb3JFYWNoKGIsYyl9LFZiPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuaiYmYj9hLmouaW5kZXhPZihiKToKLTF9O3ZhciBXYj17bWI6ImFjdGl2ZWRlc2NlbmRhbnQiLHJiOiJhdG9taWMiLHNiOiJhdXRvY29tcGxldGUiLHViOiJidXN5Iix4YjoiY2hlY2tlZCIseWI6ImNvbGluZGV4IixEYjoiY29udHJvbHMiLEViOiJjdXJyZW50IixHYjoiZGVzY3JpYmVkYnkiLEpiOiJkaXNhYmxlZCIsTGI6ImRyb3BlZmZlY3QiLE1iOiJleHBhbmRlZCIsTmI6ImZsb3d0byIsUGI6ImdyYWJiZWQiLFRiOiJoYXNwb3B1cCIsVmI6ImhpZGRlbiIsWGI6ImludmFsaWQiLFliOiJsYWJlbCIsWmI6ImxhYmVsbGVkYnkiLGFjOiJsZXZlbCIsZmM6ImxpdmUiLHZjOiJtdWx0aWxpbmUiLHdjOiJtdWx0aXNlbGVjdGFibGUiLEFjOiJvcmllbnRhdGlvbiIsQmM6Im93bnMiLENjOiJwb3NpbnNldCIsRWM6InByZXNzZWQiLEljOiJyZWFkb25seSIsS2M6InJlbGV2YW50IixMYzoicmVxdWlyZWQiLFBjOiJyb3dpbmRleCIsU2M6InNlbGVjdGVkIixVYzoic2V0c2l6ZSIsV2M6InNvcnQiLG1kOiJ2YWx1ZW1heCIsbmQ6InZhbHVlbWluIiwKb2Q6InZhbHVlbm93IixwZDoidmFsdWV0ZXh0In07dmFyIFhiO3ZhciBZYj17bmI6ImFsZXJ0IixvYjoiYWxlcnRkaWFsb2ciLHBiOiJhcHBsaWNhdGlvbiIscWI6ImFydGljbGUiLHRiOiJiYW5uZXIiLHZiOiJidXR0b24iLHdiOiJjaGVja2JveCIsemI6ImNvbHVtbmhlYWRlciIsQWI6ImNvbWJvYm94IixCYjoiY29tcGxlbWVudGFyeSIsQ2I6ImNvbnRlbnRpbmZvIixGYjoiZGVmaW5pdGlvbiIsSGI6ImRpYWxvZyIsSWI6ImRpcmVjdG9yeSIsS2I6ImRvY3VtZW50IixPYjoiZm9ybSIsUWI6ImdyaWQiLFJiOiJncmlkY2VsbCIsU2I6Imdyb3VwIixVYjoiaGVhZGluZyIsV2I6ImltZyIsYmM6ImxpbmsiLGNjOiJsaXN0IixkYzoibGlzdGJveCIsZWM6Imxpc3RpdGVtIixoYzoibG9nIixpYzoibWFpbiIsamM6Im1hcnF1ZWUiLGtjOiJtYXRoIixsYzoibWVudSIsbWM6Im1lbnViYXIiLG5jOiJtZW51aXRlbSIsb2M6Im1lbnVpdGVtY2hlY2tib3giLHBjOiJtZW51aXRlbXJhZGlvIix4YzoibmF2aWdhdGlvbiIseWM6Im5vdGUiLHpjOiJvcHRpb24iLApEYzoicHJlc2VudGF0aW9uIixGYzoicHJvZ3Jlc3NiYXIiLEdjOiJyYWRpbyIsSGM6InJhZGlvZ3JvdXAiLEpjOiJyZWdpb24iLE1jOiJyb3ciLE5jOiJyb3dncm91cCIsT2M6InJvd2hlYWRlciIsUWM6InNjcm9sbGJhciIsUmM6InNlYXJjaCIsVGM6InNlcGFyYXRvciIsVmM6InNsaWRlciIsWGM6InNwaW5idXR0b24iLFljOiJzdGF0dXMiLFpjOiJzd2l0Y2giLGFkOiJ0YWIiLGJkOiJ0YWJsaXN0IixjZDoidGFicGFuZWwiLGRkOiJ0ZXh0Ym94IixlZDoidGV4dGluZm8iLGZkOiJ0aW1lciIsZ2Q6InRvb2xiYXIiLGhkOiJ0b29sdGlwIixqZDoidHJlZSIsa2Q6InRyZWVncmlkIixsZDoidHJlZWl0ZW0ifTt2YXIgWmI9ZnVuY3Rpb24oYSxiKXtiPyhwKENhKFliLGIpLCJObyBzdWNoIEFSSUEgcm9sZSAiK2IpLGEuc2V0QXR0cmlidXRlKCJyb2xlIixiKSk6YS5yZW1vdmVBdHRyaWJ1dGUoInJvbGUiKX0sYWM9ZnVuY3Rpb24oYSxiLGMpe0FycmF5LmlzQXJyYXkoYykmJihjPWMuam9pbigiICIpKTt2YXIgZD0kYihiKTtjPT09IiJ8fGM9PXZvaWQgMD8oWGJ8fChjPXt9LFhiPShjLmF0b21pYz0hMSxjLmF1dG9jb21wbGV0ZT0ibm9uZSIsYy5kcm9wZWZmZWN0PSJub25lIixjLmhhc3BvcHVwPSExLGMubGl2ZT0ib2ZmIixjLm11bHRpbGluZT0hMSxjLm11bHRpc2VsZWN0YWJsZT0hMSxjLm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIsYy5yZWFkb25seT0hMSxjLnJlbGV2YW50PSJhZGRpdGlvbnMgdGV4dCIsYy5yZXF1aXJlZD0hMSxjLnNvcnQ9Im5vbmUiLGMuYnVzeT0hMSxjLmRpc2FibGVkPSExLGMuaGlkZGVuPSExLGMuaW52YWxpZD0iZmFsc2UiLGMpKSxjPVhiLGIgaW4gYz9hLnNldEF0dHJpYnV0ZShkLApjW2JdKTphLnJlbW92ZUF0dHJpYnV0ZShkKSk6YS5zZXRBdHRyaWJ1dGUoZCxjKX0sJGI9ZnVuY3Rpb24oYSl7cChhLCJBUklBIGF0dHJpYnV0ZSBjYW5ub3QgYmUgZW1wdHkuIik7cChDYShXYixhKSwiTm8gc3VjaCBBUklBIGF0dHJpYnV0ZSAiK2EpO3JldHVybiJhcmlhLSIrYX07dmFyIGRjPWZ1bmN0aW9uKGEsYixjLGQsZSxmKXtpZih2JiZlKXJldHVybiBiYyhhKTtpZihlJiYhZClyZXR1cm4hMTtpZighdCl7dHlwZW9mIGI9PT0ibnVtYmVyIiYmKGI9Y2MoYikpO3ZhciBoPWI9PTE3fHxiPT0xOHx8diYmYj09OTE7aWYoKCFjfHx2KSYmaHx8diYmYj09MTYmJihkfHxmKSlyZXR1cm4hMX1pZih1JiZkJiZjKXN3aXRjaChhKXtjYXNlIDIyMDpjYXNlIDIxOTpjYXNlIDIyMTpjYXNlIDE5MjpjYXNlIDE4NjpjYXNlIDE4OTpjYXNlIDE4NzpjYXNlIDE4ODpjYXNlIDE5MDpjYXNlIDE5MTpjYXNlIDE5MjpjYXNlIDIyMjpyZXR1cm4hMX1zd2l0Y2goYSl7Y2FzZSAxMzpyZXR1cm4gdD9mfHxlPyExOiEoYyYmZCk6ITA7Y2FzZSAyNzpyZXR1cm4hdSYmIXR9cmV0dXJuIHQmJihkfHxlfHxmKT8hMTpiYyhhKX0sYmM9ZnVuY3Rpb24oYSl7aWYoYT49NDgmJmE8PTU3fHxhPj05NiYmYTw9MTA2fHxhPj02NSYmYTw9OTB8fHUmJmE9PTApcmV0dXJuITA7c3dpdGNoKGEpe2Nhc2UgMzI6Y2FzZSA0MzpjYXNlIDYzOmNhc2UgNjQ6Y2FzZSAxMDc6Y2FzZSAxMDk6Y2FzZSAxMTA6Y2FzZSAxMTE6Y2FzZSAxODY6Y2FzZSA1OTpjYXNlIDE4OTpjYXNlIDE4NzpjYXNlIDYxOmNhc2UgMTg4OmNhc2UgMTkwOmNhc2UgMTkxOmNhc2UgMTkyOmNhc2UgMjIyOmNhc2UgMjE5OmNhc2UgMjIwOmNhc2UgMjIxOmNhc2UgMTYzOmNhc2UgNTg6cmV0dXJuITA7CmNhc2UgMTczOmNhc2UgMTcxOnJldHVybiB0O2RlZmF1bHQ6cmV0dXJuITF9fSxjYz1mdW5jdGlvbihhKXtpZih0KWE9ZWMoYSk7ZWxzZSBpZih2JiZ1KXN3aXRjaChhKXtjYXNlIDkzOmE9OTF9cmV0dXJuIGF9LGVjPWZ1bmN0aW9uKGEpe3N3aXRjaChhKXtjYXNlIDYxOnJldHVybiAxODc7Y2FzZSA1OTpyZXR1cm4gMTg2O2Nhc2UgMTczOnJldHVybiAxODk7Y2FzZSAyMjQ6cmV0dXJuIDkxO2Nhc2UgMDpyZXR1cm4gMjI0O2RlZmF1bHQ6cmV0dXJuIGF9fTt2YXIgZmM9ZnVuY3Rpb24oYSxiLGMsZCl7ei5jYWxsKHRoaXMsZCk7dGhpcy50eXBlPSJrZXkiO3RoaXMuZz1hO3RoaXMucmVwZWF0PWN9O24oZmMseik7dmFyIEo9ZnVuY3Rpb24oYSxiKXtELmNhbGwodGhpcyk7YSYmZ2ModGhpcyxhLGIpfTtuKEosRCk7Zz1KLnByb3RvdHlwZTtnLlI9bnVsbDtnLnFhPW51bGw7Zy5KYT1udWxsO2cucmE9bnVsbDtnLkY9LTE7Zy5LPS0xO2cuRGE9ITE7CnZhciBoYz17MzoxMywxMjoxNDQsNjMyMzI6MzgsNjMyMzM6NDAsNjMyMzQ6MzcsNjMyMzU6MzksNjMyMzY6MTEyLDYzMjM3OjExMyw2MzIzODoxMTQsNjMyMzk6MTE1LDYzMjQwOjExNiw2MzI0MToxMTcsNjMyNDI6MTE4LDYzMjQzOjExOSw2MzI0NDoxMjAsNjMyNDU6MTIxLDYzMjQ2OjEyMiw2MzI0NzoxMjMsNjMyNDg6NDQsNjMyNzI6NDYsNjMyNzM6MzYsNjMyNzU6MzUsNjMyNzY6MzMsNjMyNzc6MzQsNjMyODk6MTQ0LDYzMzAyOjQ1fSxpYz17VXA6MzgsRG93bjo0MCxMZWZ0OjM3LFJpZ2h0OjM5LEVudGVyOjEzLEYxOjExMixGMjoxMTMsRjM6MTE0LEY0OjExNSxGNToxMTYsRjY6MTE3LEY3OjExOCxGODoxMTksRjk6MTIwLEYxMDoxMjEsRjExOjEyMixGMTI6MTIzLCJVKzAwN0YiOjQ2LEhvbWU6MzYsRW5kOjM1LFBhZ2VVcDozMyxQYWdlRG93bjozNCxJbnNlcnQ6NDV9LGpjPXYmJnQ7CkoucHJvdG90eXBlLmc9ZnVuY3Rpb24oYSl7dSYmKHRoaXMuRj09MTcmJiFhLmN0cmxLZXl8fHRoaXMuRj09MTgmJiFhLmFsdEtleXx8diYmdGhpcy5GPT05MSYmIWEubWV0YUtleSkmJih0aGlzLks9dGhpcy5GPS0xKTt0aGlzLkY9PS0xJiYoYS5jdHJsS2V5JiZhLmchPTE3P3RoaXMuRj0xNzphLmFsdEtleSYmYS5nIT0xOD90aGlzLkY9MTg6YS5tZXRhS2V5JiZhLmchPTkxJiYodGhpcy5GPTkxKSk7ZGMoYS5nLHRoaXMuRixhLnNoaWZ0S2V5LGEuY3RybEtleSxhLmFsdEtleSxhLm1ldGFLZXkpPyh0aGlzLks9Y2MoYS5nKSxqYyYmKHRoaXMuRGE9YS5hbHRLZXkpKTp0aGlzLmhhbmRsZUV2ZW50KGEpfTtKLnByb3RvdHlwZS5oPWZ1bmN0aW9uKGEpe3RoaXMuSz10aGlzLkY9LTE7dGhpcy5EYT1hLmFsdEtleX07CkoucHJvdG90eXBlLmhhbmRsZUV2ZW50PWZ1bmN0aW9uKGEpe3ZhciBiPWEuaCxjPWIuYWx0S2V5O2lmKHUmJmEudHlwZT09ImtleXByZXNzIil7dmFyIGQ9dGhpcy5LO3ZhciBlPWIuY2hhckNvZGU+PTAmJmIuY2hhckNvZGU8NjMyMzImJmJjKGQpP2IuY2hhckNvZGU6MH1lbHNlIGEudHlwZT09ImtleXByZXNzIj8oamMmJihjPXRoaXMuRGEpLGIua2V5Q29kZT09Yi5jaGFyQ29kZT9iLmtleUNvZGU8MzI/KGQ9Yi5rZXlDb2RlLGU9MCk6KGQ9dGhpcy5LLGU9Yi5jaGFyQ29kZSk6KGQ9Yi5rZXlDb2RlfHx0aGlzLkssZT1iLmNoYXJDb2RlfHwwKSk6KGQ9Yi5rZXlDb2RlfHx0aGlzLkssZT1iLmNoYXJDb2RlfHwwKSx2JiZlPT02MyYmZD09MjI0JiYoZD0xOTEpO3ZhciBmPWQ9Y2MoZCk7ZD9kPj02MzIzMiYmZCBpbiBoYz9mPWhjW2RdOmQ9PTI1JiZhLnNoaWZ0S2V5JiYoZj05KTpiLmtleUlkZW50aWZpZXImJmIua2V5SWRlbnRpZmllciBpbiBpYyYmKGY9aWNbYi5rZXlJZGVudGlmaWVyXSk7CmlmKCF0fHxhLnR5cGUhPSJrZXlwcmVzcyJ8fGRjKGYsdGhpcy5GLGEuc2hpZnRLZXksYS5jdHJsS2V5LGMsYS5tZXRhS2V5KSlhPWY9PXRoaXMuRix0aGlzLkY9ZixiPW5ldyBmYyhmLGUsYSxiKSxiLmFsdEtleT1jLEUodGhpcyxiKX07Si5wcm90b3R5cGUuaT1mdW5jdGlvbigpe3JldHVybiB0aGlzLlJ9O3ZhciBnYz1mdW5jdGlvbihhLGIsYyl7YS5yYSYma2MoYSk7YS5SPWI7YS5xYT11YihhLlIsImtleXByZXNzIixhLGMpO2EuSmE9dWIoYS5SLCJrZXlkb3duIixhLmcsYyxhKTthLnJhPXViKGEuUiwia2V5dXAiLGEuaCxjLGEpfSxrYz1mdW5jdGlvbihhKXthLnFhJiYoQShhLnFhKSxBKGEuSmEpLEEoYS5yYSksYS5xYT1udWxsLGEuSmE9bnVsbCxhLnJhPW51bGwpO2EuUj1udWxsO2EuRj0tMTthLks9LTF9O0oucHJvdG90eXBlLkM9ZnVuY3Rpb24oKXtKLmwuQy5jYWxsKHRoaXMpO2tjKHRoaXMpfTt2YXIgSz17Z2E6Im1vdXNlZG93biIsaGE6Im1vdXNldXAiLGZhOiJtb3VzZWNhbmNlbCIsc2M6Im1vdXNlbW92ZSIsdWM6Im1vdXNlb3ZlciIsdGM6Im1vdXNlb3V0IixxYzoibW91c2VlbnRlciIscmM6Im1vdXNlbGVhdmUifTt2YXIgbGM9ZnVuY3Rpb24oYSl7cmV0dXJuIHR5cGVvZiBhLmNsYXNzTmFtZT09InN0cmluZyI/YS5jbGFzc05hbWU6YS5nZXRBdHRyaWJ1dGUmJmEuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIn0sTD1mdW5jdGlvbihhKXtyZXR1cm4gYS5jbGFzc0xpc3Q/YS5jbGFzc0xpc3Q6bGMoYSkubWF0Y2goL1xTKy9nKXx8W119LG1jPWZ1bmN0aW9uKGEsYil7dHlwZW9mIGEuY2xhc3NOYW1lPT0ic3RyaW5nIj9hLmNsYXNzTmFtZT1iOmEuc2V0QXR0cmlidXRlJiZhLnNldEF0dHJpYnV0ZSgiY2xhc3MiLGIpfSxuYz1mdW5jdGlvbihhLGIpe2EuY2xhc3NMaXN0P2I9YS5jbGFzc0xpc3QuY29udGFpbnMoYik6KGE9TChhKSxiPXZhKGEsYik+PTApO3JldHVybiBifSxvYz1mdW5jdGlvbihhLGIpe2lmKGEuY2xhc3NMaXN0KWEuY2xhc3NMaXN0LmFkZChiKTtlbHNlIGlmKCFuYyhhLGIpKXt2YXIgYz1sYyhhKTttYyhhLGMrKGMubGVuZ3RoPjA/IiAiK2I6YikpfX0scGM9ZnVuY3Rpb24oYSxiKXtpZihhLmNsYXNzTGlzdClBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGIsCmZ1bmN0aW9uKGUpe29jKGEsZSl9KTtlbHNle3ZhciBjPXt9O0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoTChhKSxmdW5jdGlvbihlKXtjW2VdPSEwfSk7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChiLGZ1bmN0aW9uKGUpe2NbZV09ITB9KTtiPSIiO2Zvcih2YXIgZCBpbiBjKWIrPWIubGVuZ3RoPjA/IiAiK2Q6ZDttYyhhLGIpfX0scWM9ZnVuY3Rpb24oYSxiKXthLmNsYXNzTGlzdD9hLmNsYXNzTGlzdC5yZW1vdmUoYik6bmMoYSxiKSYmbWMoYSxBcnJheS5wcm90b3R5cGUuZmlsdGVyLmNhbGwoTChhKSxmdW5jdGlvbihjKXtyZXR1cm4gYyE9Yn0pLmpvaW4oIiAiKSl9LHJjPWZ1bmN0aW9uKGEsYil7YS5jbGFzc0xpc3Q/QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChiLGZ1bmN0aW9uKGMpe3FjKGEsYyl9KTptYyhhLEFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbChMKGEpLGZ1bmN0aW9uKGMpe3JldHVybiEodmEoYixjKT49MCl9KS5qb2luKCIgIikpfTt2YXIgdGM9ZnVuY3Rpb24oYSxiKXtpZighYSl0aHJvdyBFcnJvcigiSW52YWxpZCBjbGFzcyBuYW1lICIrYSk7aWYodHlwZW9mIGIhPT0iZnVuY3Rpb24iKXRocm93IEVycm9yKCJJbnZhbGlkIGRlY29yYXRvciBmdW5jdGlvbiAiK2IpO3NjW2FdPWJ9LHVjPXt9LHNjPXt9O3ZhciB2Yz1mdW5jdGlvbihhKXt0aGlzLkE9YX07aWEodmMpO3ZhciB3Yz1mdW5jdGlvbihhLGIpe2EmJihhLnRhYkluZGV4PWI/MDotMSl9LHljPWZ1bmN0aW9uKGEsYixjKXtjLmlkJiZQYihiLGMuaWQpO3ZhciBkPWEuZygpLGU9ITEsZj1MKGMpO2YmJkFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoZixmdW5jdGlvbihoKXtoPT1kP2U9ITA6aCYmdGhpcy51KGIsaCxkKX0sYSk7ZXx8b2MoYyxkKTt4YyhiLGMpO3JldHVybiBjfTt2Yy5wcm90b3R5cGUudT1mdW5jdGlvbihhLGIsYyl7Yj09YysiLWRpc2FibGVkIj9hLlgoITEpOmI9PWMrIi1ob3Jpem9udGFsIj96YyhhLCJob3Jpem9udGFsIik6Yj09YysiLXZlcnRpY2FsIiYmemMoYSwidmVydGljYWwiKX07CnZhciB4Yz1mdW5jdGlvbihhLGIpe2lmKGIpZm9yKHZhciBjPWIuZmlyc3RDaGlsZCxkO2MmJmMucGFyZW50Tm9kZT09Yjspe2Q9Yy5uZXh0U2libGluZztpZihjLm5vZGVUeXBlPT0xKXthOnt2YXIgZT1jO3AoZSk7ZT1MKGUpO2Zvcih2YXIgZj1lLmxlbmd0aCxoPTA7aDxmO2grKyl7dmFyIGs9ZVtoXTtpZihrPWsgaW4gc2M/c2Nba10oKTpudWxsKXtlPWs7YnJlYWsgYX19ZT1udWxsfWUmJihlLmc9YyxhLmlzRW5hYmxlZCgpfHxlLlgoITEpLGEuQmEoZSksU2IoZSxjKSl9ZWxzZSBjLm5vZGVWYWx1ZSYmSGEoYy5ub2RlVmFsdWUpIT0iInx8Yi5yZW1vdmVDaGlsZChjKTtjPWR9fSxBYz1mdW5jdGlvbihhLGIpe2I9Yi5pKCk7cChiLCJUaGUgY29udGFpbmVyIERPTSBlbGVtZW50IGNhbm5vdCBiZSBudWxsLiIpO0tiKGIsdCk7KGE9YS5BKSYmWmIoYixhKX07dmMucHJvdG90eXBlLmc9ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy1jb250YWluZXIifTsKdmMucHJvdG90eXBlLmo9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nKCksYz1bYixhLkw9PSJob3Jpem9udGFsIj9iKyItaG9yaXpvbnRhbCI6YisiLXZlcnRpY2FsIl07YS5pc0VuYWJsZWQoKXx8Yy5wdXNoKGIrIi1kaXNhYmxlZCIpO3JldHVybiBjfTt2YXIgQmM9ZnVuY3Rpb24oKXt9O3ZhciBNPWZ1bmN0aW9uKCl7fSxDYztpYShNKTt2YXIgRGM9e2J1dHRvbjoicHJlc3NlZCIsY2hlY2tib3g6ImNoZWNrZWQiLG1lbnVpdGVtOiJzZWxlY3RlZCIsbWVudWl0ZW1jaGVja2JveDoiY2hlY2tlZCIsbWVudWl0ZW1yYWRpbzoiY2hlY2tlZCIscmFkaW86ImNoZWNrZWQiLHRhYjoic2VsZWN0ZWQiLHRyZWVpdGVtOiJzZWxlY3RlZCJ9O00ucHJvdG90eXBlLk5hPWZ1bmN0aW9uKCl7fTtNLnByb3RvdHlwZS54YT1mdW5jdGlvbihhKXt2YXIgYj1hLkcsYz1iLmgsZD10aGlzLk4oKSxlPVtkXSxmPXRoaXMuTigpO2YhPWQmJmUucHVzaChmKTtkPWEubTtmb3IoZj1bXTtkOyl7dmFyIGg9ZCYtZDtmLnB1c2goRWModGhpcyxoKSk7ZCY9fmh9ZS5wdXNoLmFwcGx5KGUsZik7KGQ9YS5GYSkmJmUucHVzaC5hcHBseShlLGQpO3JldHVybiBjLmNhbGwoYiwiRElWIixlLmpvaW4oIiAiKSxhLmlhKX07Ck0ucHJvdG90eXBlLnlhPWZ1bmN0aW9uKGEsYil7Yi5pZCYmUGIoYSxiLmlkKTtiJiZiLmZpcnN0Q2hpbGQ/RmMoYSxiLmZpcnN0Q2hpbGQubmV4dFNpYmxpbmc/eWEoYi5jaGlsZE5vZGVzKTpiLmZpcnN0Q2hpbGQpOmEuaWE9bnVsbDt2YXIgYz0wLGQ9dGhpcy5OKCksZT10aGlzLk4oKSxmPSExLGg9ITEsaz15YShMKGIpKTtrLmZvckVhY2goZnVuY3Rpb24ocSl7Znx8cSE9ZD9ofHxxIT1lP2N8PUdjKHRoaXMscSk6aD0hMDooZj0hMCxlPT1kJiYoaD0hMCkpO0djKHRoaXMscSk9PTEmJihzYShiKSxkYihiKSYmZWIoYikmJmNiKGIsITEpKX0sdGhpcyk7YS5tPWM7Znx8KGsucHVzaChkKSxlPT1kJiYoaD0hMCkpO2h8fGsucHVzaChlKTsoYT1hLkZhKSYmay5wdXNoLmFwcGx5KGssYSk7ZiYmaCYmIWF8fG1jKGIsay5qb2luKCIgIikpO3JldHVybiBifTsKdmFyIEhjPWZ1bmN0aW9uKGEsYil7aWYoYT1hLk5hKCkpe3AoYiwiVGhlIGVsZW1lbnQgcGFzc2VkIGFzIGEgZmlyc3QgcGFyYW1ldGVyIGNhbm5vdCBiZSBudWxsLiIpO3ZhciBjPWIuZ2V0QXR0cmlidXRlKCJyb2xlIil8fG51bGw7YSE9YyYmWmIoYixhKX19LEljPWZ1bmN0aW9uKGEsYil7dmFyIGM7aWYoYS5EJjMyJiYoYz1hLmkoKSkpe2lmKCFiJiZhLm0mMzIpe3RyeXtjLmJsdXIoKX1jYXRjaChkKXt9YS5tJjMyJiZhLlFhKG51bGwpfShkYihjKSYmZWIoYykpIT1iJiZjYihjLGIpfX0sSmM9ZnVuY3Rpb24oYSxiLGMpe0NjfHwoQ2M9ezE6ImRpc2FibGVkIiw4OiJzZWxlY3RlZCIsMTY6ImNoZWNrZWQiLDY0OiJleHBhbmRlZCJ9KTtwKGEsIlRoZSBlbGVtZW50IHBhc3NlZCBhcyBhIGZpcnN0IHBhcmFtZXRlciBjYW5ub3QgYmUgbnVsbC4iKTtiPUNjW2JdO3ZhciBkPWEuZ2V0QXR0cmlidXRlKCJyb2xlIil8fG51bGw7ZCYmKGQ9RGNbZF18fGIsYj1iPT0iY2hlY2tlZCJ8fGI9PQoic2VsZWN0ZWQiP2Q6Yik7YiYmYWMoYSxiLGMpfTtNLnByb3RvdHlwZS5OPWZ1bmN0aW9uKCl7cmV0dXJuImdvb2ctY29udHJvbCJ9O3ZhciBFYz1mdW5jdGlvbihhLGIpe2EuZ3x8S2MoYSk7cmV0dXJuIGEuZ1tiXX0sR2M9ZnVuY3Rpb24oYSxiKXthLmh8fChhLmd8fEtjKGEpLGEuaD1FYShhLmcpKTthPXBhcnNlSW50KGEuaFtiXSwxMCk7cmV0dXJuIGlzTmFOKGEpPzA6YX0sS2M9ZnVuY3Rpb24oYSl7dmFyIGI9YS5OKCk7dmFyIGM9Yi5yZXBsYWNlKC9ceGEwfFxzL2csIiAiKS5pbmRleE9mKCIgIikhPS0xO3AoIWMsIkNvbnRyb2xSZW5kZXJlciBoYXMgYW4gaW52YWxpZCBjc3MgY2xhc3M6ICciK2IrIiciKTthLmc9ezE6YisiLWRpc2FibGVkIiwyOmIrIi1ob3ZlciIsNDpiKyItYWN0aXZlIiw4OmIrIi1zZWxlY3RlZCIsMTY6YisiLWNoZWNrZWQiLDMyOmIrIi1mb2N1c2VkIiw2NDpiKyItb3BlbiJ9fTt2YXIgTj1mdW5jdGlvbihhLGIsYyl7Ri5jYWxsKHRoaXMsYyk7aWYoIWIpe2ZvcihiPXRoaXMuY29uc3RydWN0b3I7Yjspe3ZhciBkPW5hKGIpO2lmKGQ9dWNbZF0pYnJlYWs7Yj0oYj1PYmplY3QuZ2V0UHJvdG90eXBlT2YoYi5wcm90b3R5cGUpKSYmYi5jb25zdHJ1Y3Rvcn1iPWQ/dHlwZW9mIGQuVj09PSJmdW5jdGlvbiI/ZC5WKCk6bmV3IGQ6bnVsbH10aGlzLnY9Yjt0aGlzLmlhPWEhPT12b2lkIDA/YTpudWxsfTtuKE4sRik7Zz1OLnByb3RvdHlwZTtnLmlhPW51bGw7Zy5tPTA7Zy5EPTM5O2cuUD0wO2cuT2E9ITA7Zy5GYT1udWxsO2cuSGE9ITA7Zy5tYT1mdW5jdGlvbigpe3ZhciBhPXRoaXMudi54YSh0aGlzKTt0aGlzLmc9YTtIYyh0aGlzLnYsYSk7S2IoYSwhMCk7dGhpcy5pc1Zpc2libGUoKXx8KGEuc3R5bGUuZGlzcGxheT0ibm9uZSIsYSYmYWMoYSwiaGlkZGVuIiwhMCkpfTtnLm5hPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaSgpfTtnLndhPWZ1bmN0aW9uKCl7cmV0dXJuITB9OwpnLkVhPWZ1bmN0aW9uKGEpe3RoaXMuZz1hPXRoaXMudi55YSh0aGlzLGEpO0hjKHRoaXMudixhKTtLYihhLCEwKTt0aGlzLk9hPWEuc3R5bGUuZGlzcGxheSE9Im5vbmUifTsKZy5JPWZ1bmN0aW9uKCl7Ti5sLkkuY2FsbCh0aGlzKTt2YXIgYT10aGlzLmc7cChhLCJDYW4gbm90IGNhbGwgZ2V0RWxlbWVudFN0cmljdCBiZWZvcmUgcmVuZGVyaW5nL2RlY29yYXRpbmcuIik7cCh0aGlzKTtwKGEpO3RoaXMuaXNWaXNpYmxlKCl8fGFjKGEsImhpZGRlbiIsIXRoaXMuaXNWaXNpYmxlKCkpO3RoaXMuaXNFbmFibGVkKCl8fEpjKGEsMSwhdGhpcy5pc0VuYWJsZWQoKSk7dGhpcy5EJjgmJkpjKGEsOCwhISh0aGlzLm0mOCkpO3RoaXMuRCYxNiYmSmMoYSwxNiwhISh0aGlzLm0mMTYpKTt0aGlzLkQmNjQmJkpjKGEsNjQsISEodGhpcy5tJjY0KSk7dmFyIGI9dGhpcy52O1ViKHRoaXMpJiYoYT10aGlzLmkoKSxiPWIuTigpKyItcnRsIiwoYT1hLmk/YS5pKCk6YSkmJnBjKGEsW2JdKSk7dGhpcy5pc0VuYWJsZWQoKSYmSWModGhpcyx0aGlzLmlzVmlzaWJsZSgpKTt0aGlzLkQmLTImJih0aGlzLkhhJiZMYyh0aGlzLCEwKSx0aGlzLkQmMzImJihhPXRoaXMuaSgpKSkmJihiPQp0aGlzLlp8fCh0aGlzLlo9bmV3IEopLGdjKGIsYSksQihCKEIoUWIodGhpcyksYiwia2V5Iix0aGlzLmFhKSxhLCJmb2N1cyIsdGhpcy5YYSksYSwiYmx1ciIsdGhpcy5RYSkpfTt2YXIgTGM9ZnVuY3Rpb24oYSxiKXt2YXIgYz1RYihhKSxkPWEuaSgpO2I/KEIoQihCKEIoYyxkLEsuZ2EsYS5zYSksZCxbSy5oYSxLLmZhXSxhLnZhKSxkLCJtb3VzZW92ZXIiLGEudWEpLGQsIm1vdXNlb3V0IixhLnRhKSxhLmNhIT1CYyYmQihjLGQsImNvbnRleHRtZW51IixhLmNhKSk6KEMoQyhDKEMoYyxkLEsuZ2EsYS5zYSksZCxbSy5oYSxLLmZhXSxhLnZhKSxkLCJtb3VzZW92ZXIiLGEudWEpLGQsIm1vdXNlb3V0IixhLnRhKSxhLmNhIT1CYyYmQyhjLGQsImNvbnRleHRtZW51IixhLmNhKSl9O04ucHJvdG90eXBlLlU9ZnVuY3Rpb24oKXtOLmwuVS5jYWxsKHRoaXMpO3RoaXMuWiYma2ModGhpcy5aKTt0aGlzLmlzVmlzaWJsZSgpJiZ0aGlzLmlzRW5hYmxlZCgpJiZJYyh0aGlzLCExKX07Ck4ucHJvdG90eXBlLkM9ZnVuY3Rpb24oKXtOLmwuQy5jYWxsKHRoaXMpO3RoaXMuWiYmKHRoaXMuWi5kaXNwb3NlKCksZGVsZXRlIHRoaXMuWik7ZGVsZXRlIHRoaXMudjt0aGlzLkZhPXRoaXMuaWE9bnVsbH07dmFyIEZjPWZ1bmN0aW9uKGEsYil7YS5pYT1ifTtOLnByb3RvdHlwZS5pc1Zpc2libGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5PYX07Ti5wcm90b3R5cGUuaXNFbmFibGVkPWZ1bmN0aW9uKCl7cmV0dXJuISh0aGlzLm0mMSl9O04ucHJvdG90eXBlLlg9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5oO2ImJnR5cGVvZiBiLmlzRW5hYmxlZD09ImZ1bmN0aW9uIiYmIWIuaXNFbmFibGVkKCl8fCFPKHRoaXMsMSwhYSl8fChhfHwoTWModGhpcywhMSksUCh0aGlzLCExKSksdGhpcy5pc1Zpc2libGUoKSYmSWModGhpcyxhKSxUKHRoaXMsMSwhYSwhMCkpfTt2YXIgUD1mdW5jdGlvbihhLGIpe08oYSwyLGIpJiZUKGEsMixiKX07Ck4ucHJvdG90eXBlLmlzQWN0aXZlPWZ1bmN0aW9uKCl7cmV0dXJuISEodGhpcy5tJjQpfTsKdmFyIE1jPWZ1bmN0aW9uKGEsYil7TyhhLDQsYikmJlQoYSw0LGIpfSxOYz1mdW5jdGlvbihhLGIpe08oYSw4LGIpJiZUKGEsOCxiKX0sT2M9ZnVuY3Rpb24oYSxiKXtPKGEsNjQsYikmJlQoYSw2NCxiKX0sVD1mdW5jdGlvbihhLGIsYyxkKXtpZighZCYmYj09MSlhLlgoIWMpO2Vsc2UgaWYoYS5EJmImJmMhPSEhKGEubSZiKSl7dmFyIGU9YS52O2lmKGQ9YS5pKCkpe2lmKGU9RWMoZSxiKSl7dmFyIGY9YS5pP2EuaSgpOmE7ZiYmKGM/cGM6cmMpKGYsW2VdKX1KYyhkLGIsYyl9YS5tPWM/YS5tfGI6YS5tJn5ifX0sUGM9ZnVuY3Rpb24oYSxiLGMpe2lmKGEucyYmYS5tJmImJiFjKXRocm93IEVycm9yKCJDb21wb25lbnQgYWxyZWFkeSByZW5kZXJlZCIpOyFjJiZhLm0mYiYmVChhLGIsITEpO2EuRD1jP2EuRHxiOmEuRCZ+Yn0sVT1mdW5jdGlvbihhLGIpe3JldHVybiEhKDI1NSZiKSYmISEoYS5EJmIpfSxPPWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4hIShhLkQmYikmJiEhKGEubSZiKSE9CmMmJighKGEuUCZiKXx8RShhLE5iKGIsYykpKSYmIWEuYmF9O04ucHJvdG90eXBlLnVhPWZ1bmN0aW9uKGEpeyFRYyhhLHRoaXMuaSgpKSYmRSh0aGlzLCJlbnRlciIpJiZ0aGlzLmlzRW5hYmxlZCgpJiZVKHRoaXMsMikmJlAodGhpcywhMCl9O04ucHJvdG90eXBlLnRhPWZ1bmN0aW9uKGEpeyFRYyhhLHRoaXMuaSgpKSYmRSh0aGlzLCJsZWF2ZSIpJiYoVSh0aGlzLDQpJiZNYyh0aGlzLCExKSxVKHRoaXMsMikmJlAodGhpcywhMSkpfTtOLnByb3RvdHlwZS5jYT1CYzt2YXIgUWM9ZnVuY3Rpb24oYSxiKXtyZXR1cm4hIWEucmVsYXRlZFRhcmdldCYmYWIoYixhLnJlbGF0ZWRUYXJnZXQpfTsKTi5wcm90b3R5cGUuc2E9ZnVuY3Rpb24oYSl7aWYodGhpcy5pc0VuYWJsZWQoKSYmKFUodGhpcywyKSYmUCh0aGlzLCEwKSwhKGEuaC5idXR0b24hPTB8fHYmJmEuY3RybEtleSkpKXtVKHRoaXMsNCkmJk1jKHRoaXMsITApO3ZhciBiO2lmKGI9dGhpcy52KXt2YXIgYztiPXRoaXMuRCYzMiYmKGM9dGhpcy5pKCkpP2RiKGMpJiZlYihjKTohMX1iJiZ0aGlzLmkoKS5mb2N1cygpfWEuaC5idXR0b24hPTB8fHYmJmEuY3RybEtleXx8YS5qKCl9O04ucHJvdG90eXBlLnZhPWZ1bmN0aW9uKGEpe3RoaXMuaXNFbmFibGVkKCkmJihVKHRoaXMsMikmJlAodGhpcywhMCksdGhpcy5pc0FjdGl2ZSgpJiZSYyh0aGlzLGEpJiZVKHRoaXMsNCkmJk1jKHRoaXMsITEpKX07CnZhciBSYz1mdW5jdGlvbihhLGIpe2lmKFUoYSwxNikpe3ZhciBjPSEoYS5tJjE2KTtPKGEsMTYsYykmJlQoYSwxNixjKX1VKGEsOCkmJk5jKGEsITApO1UoYSw2NCkmJk9jKGEsIShhLm0mNjQpKTtjPW5ldyB5KCJhY3Rpb24iLGEpO2ImJihjLmFsdEtleT1iLmFsdEtleSxjLmN0cmxLZXk9Yi5jdHJsS2V5LGMubWV0YUtleT1iLm1ldGFLZXksYy5zaGlmdEtleT1iLnNoaWZ0S2V5LGMuRz1iLkcsYy50aW1lU3RhbXA9Yi50aW1lU3RhbXApO3JldHVybiBFKGEsYyl9O04ucHJvdG90eXBlLlhhPWZ1bmN0aW9uKCl7VSh0aGlzLDMyKSYmTyh0aGlzLDMyLCEwKSYmVCh0aGlzLDMyLCEwKX07Ti5wcm90b3R5cGUuUWE9ZnVuY3Rpb24oKXtVKHRoaXMsNCkmJk1jKHRoaXMsITEpO1UodGhpcywzMikmJk8odGhpcywzMiwhMSkmJlQodGhpcywzMiwhMSl9OwpOLnByb3RvdHlwZS5hYT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5pc1Zpc2libGUoKSYmdGhpcy5pc0VuYWJsZWQoKSYmYS5nPT0xMyYmUmModGhpcyxhKT8oYS5qKCksYS52KCksITApOiExfTtpZih0eXBlb2YgTiE9PSJmdW5jdGlvbiIpdGhyb3cgRXJyb3IoIkludmFsaWQgY29tcG9uZW50IGNsYXNzICIrTik7aWYodHlwZW9mIE0hPT0iZnVuY3Rpb24iKXRocm93IEVycm9yKCJJbnZhbGlkIHJlbmRlcmVyIGNsYXNzICIrTSk7dmFyIFNjPW5hKE4pO3VjW1NjXT1NO3RjKCJnb29nLWNvbnRyb2wiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBOKG51bGwpfSk7dmFyIFY9ZnVuY3Rpb24oYSxiLGMpe0YuY2FsbCh0aGlzLGMpO3RoaXMuZWE9Ynx8dmMuVigpO3RoaXMuTD1hfHwidmVydGljYWwifTtuKFYsRik7Zz1WLnByb3RvdHlwZTtnLkthPW51bGw7Zy5kYT1udWxsO2cuZWE9bnVsbDtnLkw9bnVsbDtnLlM9ITA7Zy5UPSEwO2cubz0tMTtnLkI9bnVsbDtnLlc9ITE7Zy5PPW51bGw7dmFyIFRjPWZ1bmN0aW9uKGEpe3JldHVybiBhLkthfHxhLmkoKX07Zz1WLnByb3RvdHlwZTtnLm1hPWZ1bmN0aW9uKCl7dGhpcy5nPXRoaXMuRy5oKCJESVYiLHRoaXMuZWEuaih0aGlzKS5qb2luKCIgIikpfTtnLm5hPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaSgpfTtnLndhPWZ1bmN0aW9uKGEpe3JldHVybiBhLnRhZ05hbWU9PSJESVYifTtnLkVhPWZ1bmN0aW9uKGEpe3RoaXMuZz15Yyh0aGlzLmVhLHRoaXMsYSk7YS5zdHlsZS5kaXNwbGF5PT0ibm9uZSImJih0aGlzLlM9ITEpfTsKZy5JPWZ1bmN0aW9uKCl7Vi5sLkkuY2FsbCh0aGlzKTtUYih0aGlzLGZ1bmN0aW9uKGIpe2IucyYmVWModGhpcyxiKX0sdGhpcyk7dmFyIGE9dGhpcy5pKCk7QWModGhpcy5lYSx0aGlzKTtWYyh0aGlzLHRoaXMuUyk7QihCKEIoQihCKEIoQihCKFFiKHRoaXMpLHRoaXMsImVudGVyIix0aGlzLmViKSx0aGlzLCJoaWdobGlnaHQiLHRoaXMuZmIpLHRoaXMsInVuaGlnaGxpZ2h0Iix0aGlzLmxiKSx0aGlzLCJvcGVuIix0aGlzLmdiKSx0aGlzLCJjbG9zZSIsdGhpcy5iYiksYSxLLmdhLHRoaXMuV2EpLGJiKGEpLFtLLmhhLEsuZmFdLHRoaXMuY2IpLGEsW0suZ2EsSy5oYSxLLmZhLCJtb3VzZW92ZXIiLCJtb3VzZW91dCIsImNvbnRleHRtZW51Il0sdGhpcy5hYik7V2ModGhpcyl9O3ZhciBXYz1mdW5jdGlvbihhKXt2YXIgYj1RYihhKSxjPVRjKGEpO0IoQihCKGIsYywiZm9jdXMiLGEuUGEpLGMsImJsdXIiLGEuVWEpLGEuZGF8fChhLmRhPW5ldyBKKFRjKGEpKSksImtleSIsYS5WYSl9OwpnPVYucHJvdG90eXBlO2cuVT1mdW5jdGlvbigpe1hjKHRoaXMsLTEpO3RoaXMuQiYmT2ModGhpcy5CLCExKTt0aGlzLlc9ITE7Vi5sLlUuY2FsbCh0aGlzKX07Zy5DPWZ1bmN0aW9uKCl7Vi5sLkMuY2FsbCh0aGlzKTt0aGlzLmRhJiYodGhpcy5kYS5kaXNwb3NlKCksdGhpcy5kYT1udWxsKTt0aGlzLmVhPXRoaXMuQj10aGlzLk89dGhpcy5LYT1udWxsfTtnLmViPWZ1bmN0aW9uKCl7cmV0dXJuITB9OwpnLmZiPWZ1bmN0aW9uKGEpe3ZhciBiPVZiKHRoaXMsYS50YXJnZXQpO2lmKGI+LTEmJmIhPXRoaXMubyl7dmFyIGM9SSh0aGlzLHRoaXMubyk7YyYmUChjLCExKTt0aGlzLm89YjtjPUkodGhpcyx0aGlzLm8pO3RoaXMuVyYmTWMoYywhMCk7dGhpcy5CJiZjIT10aGlzLkImJihjLkQmNjQ/T2MoYywhMCk6T2ModGhpcy5CLCExKSl9Yj10aGlzLmkoKTtwKGIsIlRoZSBET00gZWxlbWVudCBmb3IgdGhlIGNvbnRhaW5lciBjYW5ub3QgYmUgbnVsbC4iKTthLnRhcmdldC5pKCkhPW51bGwmJmFjKGIsImFjdGl2ZWRlc2NlbmRhbnQiLGEudGFyZ2V0LmkoKS5pZCl9O2cubGI9ZnVuY3Rpb24oYSl7YS50YXJnZXQ9PUkodGhpcyx0aGlzLm8pJiYodGhpcy5vPS0xKTthPXRoaXMuaSgpO3AoYSwiVGhlIERPTSBlbGVtZW50IGZvciB0aGUgY29udGFpbmVyIGNhbm5vdCBiZSBudWxsLiIpO2EucmVtb3ZlQXR0cmlidXRlKCRiKCJhY3RpdmVkZXNjZW5kYW50IikpfTsKZy5nYj1mdW5jdGlvbihhKXsoYT1hLnRhcmdldCkmJmEhPXRoaXMuQiYmYS5oPT10aGlzJiYodGhpcy5CJiZPYyh0aGlzLkIsITEpLHRoaXMuQj1hKX07Zy5iYj1mdW5jdGlvbihhKXthLnRhcmdldD09dGhpcy5CJiYodGhpcy5CPW51bGwpO3ZhciBiPXRoaXMuaSgpLGM9YS50YXJnZXQuaSgpO2ImJmEudGFyZ2V0Lm0mMiYmYyYmKGE9IiIsYyYmKGE9Yy5pZCxwKGEsIlRoZSBhY3RpdmUgZWxlbWVudCBzaG91bGQgaGF2ZSBhbiBpZC4iKSksYWMoYiwiYWN0aXZlZGVzY2VuZGFudCIsYSkpfTtnLldhPWZ1bmN0aW9uKGEpe3RoaXMuVCYmKHRoaXMuVz0hMCk7dmFyIGI9VGModGhpcyk7YiYmZGIoYikmJmViKGIpP2IuZm9jdXMoKTphLmooKX07Zy5jYj1mdW5jdGlvbigpe3RoaXMuVz0hMX07CmcuYWI9ZnVuY3Rpb24oYSl7YTp7dmFyIGI9YS50YXJnZXQ7aWYodGhpcy5PKWZvcih2YXIgYz10aGlzLmkoKTtiJiZiIT09Yzspe3ZhciBkPWIuaWQ7aWYoZCBpbiB0aGlzLk8pe2I9dGhpcy5PW2RdO2JyZWFrIGF9Yj1iLnBhcmVudE5vZGV9Yj1udWxsfWlmKGIpc3dpdGNoKGEudHlwZSl7Y2FzZSBLLmdhOmIuc2EoYSk7YnJlYWs7Y2FzZSBLLmhhOmNhc2UgSy5mYTpiLnZhKGEpO2JyZWFrO2Nhc2UgIm1vdXNlb3ZlciI6Yi51YShhKTticmVhaztjYXNlICJtb3VzZW91dCI6Yi50YShhKTticmVhaztjYXNlICJjb250ZXh0bWVudSI6Yi5jYShhKX19O2cuUGE9ZnVuY3Rpb24oKXt9O2cuVWE9ZnVuY3Rpb24oKXtYYyh0aGlzLC0xKTt0aGlzLlc9ITE7dGhpcy5CJiZPYyh0aGlzLkIsITEpfTsKZy5WYT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5pc0VuYWJsZWQoKSYmdGhpcy5pc1Zpc2libGUoKSYmKEgodGhpcykhPTB8fHRoaXMuS2EpJiZZYyh0aGlzLGEpPyhhLmooKSxhLnYoKSwhMCk6ITF9Owp2YXIgWWM9ZnVuY3Rpb24oYSxiKXt2YXIgYz1JKGEsYS5vKTtpZihjJiZ0eXBlb2YgYy5hYT09ImZ1bmN0aW9uIiYmYy5hYShiKXx8YS5CJiZhLkIhPWMmJnR5cGVvZiBhLkIuYWE9PSJmdW5jdGlvbiImJmEuQi5hYShiKSlyZXR1cm4hMDtpZihiLnNoaWZ0S2V5fHxiLmN0cmxLZXl8fGIubWV0YUtleXx8Yi5hbHRLZXkpcmV0dXJuITE7c3dpdGNoKGIuZyl7Y2FzZSAyNzpUYyhhKS5ibHVyKCk7YnJlYWs7Y2FzZSAzNjpaYyhhKTticmVhaztjYXNlIDM1OiRjKGEpO2JyZWFrO2Nhc2UgMzg6aWYoYS5MPT0idmVydGljYWwiKWFkKGEpO2Vsc2UgcmV0dXJuITE7YnJlYWs7Y2FzZSAzNzppZihhLkw9PSJob3Jpem9udGFsIilVYihhKT9iZChhKTphZChhKTtlbHNlIHJldHVybiExO2JyZWFrO2Nhc2UgNDA6aWYoYS5MPT0idmVydGljYWwiKWJkKGEpO2Vsc2UgcmV0dXJuITE7YnJlYWs7Y2FzZSAzOTppZihhLkw9PSJob3Jpem9udGFsIilVYihhKT9hZChhKTpiZChhKTtlbHNlIHJldHVybiExOwpicmVhaztkZWZhdWx0OnJldHVybiExfXJldHVybiEwfSxVYz1mdW5jdGlvbihhLGIpe3ZhciBjPWIuaSgpO2M9Yy5pZHx8KGMuaWQ9T2IoYikpO2EuT3x8KGEuTz17fSk7YS5PW2NdPWJ9O1YucHJvdG90eXBlLkJhPWZ1bmN0aW9uKGEsYil7dWEoYSxOLCJUaGUgY2hpbGQgb2YgYSBjb250YWluZXIgbXVzdCBiZSBhIGNvbnRyb2wiKTtWLmwuQmEuY2FsbCh0aGlzLGEsYil9O1YucHJvdG90eXBlLkNhPWZ1bmN0aW9uKGEsYixjKXt1YShhLE4pO2EuUHw9MjthLlB8PTY0O1BjKGEsMzIsITEpO2EucyYmMCE9YS5IYSYmTGMoYSwhMSk7YS5IYT0hMTt2YXIgZD1hLmg9PXRoaXM/VmIodGhpcyxhKTotMTtWLmwuQ2EuY2FsbCh0aGlzLGEsYixjKTthLnMmJnRoaXMucyYmVWModGhpcyxhKTthPWQ7YT09LTEmJihhPUgodGhpcykpO2E9PXRoaXMubz90aGlzLm89TWF0aC5taW4oSCh0aGlzKS0xLGIpOmE+dGhpcy5vJiZiPD10aGlzLm8/dGhpcy5vKys6YTx0aGlzLm8mJmI+dGhpcy5vJiZ0aGlzLm8tLX07CnZhciB6Yz1mdW5jdGlvbihhLGIpe2lmKGEuaSgpKXRocm93IEVycm9yKCJDb21wb25lbnQgYWxyZWFkeSByZW5kZXJlZCIpO2EuTD1ifTtWLnByb3RvdHlwZS5pc1Zpc2libGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5TfTt2YXIgVmM9ZnVuY3Rpb24oYSxiKXthLlM9Yjt2YXIgYz1hLmkoKTtjJiYoYy5zdHlsZS5kaXNwbGF5PWI/IiI6Im5vbmUiLHdjKFRjKGEpLGEuVCYmYS5TKSl9O1YucHJvdG90eXBlLmlzRW5hYmxlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLlR9O1YucHJvdG90eXBlLlg9ZnVuY3Rpb24oYSl7dGhpcy5UIT1hJiZFKHRoaXMsYT8iZW5hYmxlIjoiZGlzYWJsZSIpJiYoYT8odGhpcy5UPSEwLFRiKHRoaXMsZnVuY3Rpb24oYil7Yi5UYT9kZWxldGUgYi5UYTpiLlgoITApfSkpOihUYih0aGlzLGZ1bmN0aW9uKGIpe2IuaXNFbmFibGVkKCk/Yi5YKCExKTpiLlRhPSEwfSksdGhpcy5XPXRoaXMuVD0hMSksd2MoVGModGhpcyksYSYmdGhpcy5TKSl9Owp2YXIgWGM9ZnVuY3Rpb24oYSxiKXsoYj1JKGEsYikpP1AoYiwhMCk6YS5vPi0xJiZQKEkoYSxhLm8pLCExKX0sWmM9ZnVuY3Rpb24oYSl7Y2QoYSxmdW5jdGlvbihiLGMpe3JldHVybihiKzEpJWN9LEgoYSktMSl9LCRjPWZ1bmN0aW9uKGEpe2NkKGEsZnVuY3Rpb24oYixjKXtiLS07cmV0dXJuIGI8MD9jLTE6Yn0sMCl9LGJkPWZ1bmN0aW9uKGEpe2NkKGEsZnVuY3Rpb24oYixjKXtyZXR1cm4oYisxKSVjfSxhLm8pfSxhZD1mdW5jdGlvbihhKXtjZChhLGZ1bmN0aW9uKGIsYyl7Yi0tO3JldHVybiBiPDA/Yy0xOmJ9LGEubyl9LGNkPWZ1bmN0aW9uKGEsYixjKXtjPWM8MD9WYihhLGEuQik6Yzt2YXIgZD1IKGEpO2M9Yi5jYWxsKGEsYyxkKTtmb3IodmFyIGU9MDtlPD1kOyl7dmFyIGY9SShhLGMpO2lmKGYmJmYuaXNWaXNpYmxlKCkmJmYuaXNFbmFibGVkKCkmJmYuRCYyKXthLkxhKGMpO2JyZWFrfWUrKztjPWIuY2FsbChhLGMsZCl9fTsKVi5wcm90b3R5cGUuTGE9ZnVuY3Rpb24oYSl7WGModGhpcyxhKX07dmFyIGRkPWZ1bmN0aW9uKCl7fTtuKGRkLE0pO2lhKGRkKTtnPWRkLnByb3RvdHlwZTtnLk49ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy10YWIifTtnLk5hPWZ1bmN0aW9uKCl7cmV0dXJuInRhYiJ9O2cueGE9ZnVuY3Rpb24oYSl7dmFyIGI9ZGQubC54YS5jYWxsKHRoaXMsYSk7KGE9YS5HYSgpKSYmdGhpcy5NYShiLGEpO3JldHVybiBifTtnLnlhPWZ1bmN0aW9uKGEsYil7Yj1kZC5sLnlhLmNhbGwodGhpcyxhLGIpO3ZhciBjPXRoaXMuR2EoYik7YyYmKGEuUmE9Yyk7YS5tJjgmJihjPWEuaCkmJnR5cGVvZiBjLko9PT0iZnVuY3Rpb24iJiYoVChhLDgsITEpLGMuSihhKSk7cmV0dXJuIGJ9O2cuR2E9ZnVuY3Rpb24oYSl7cmV0dXJuIGEudGl0bGV8fCIifTtnLk1hPWZ1bmN0aW9uKGEsYil7YSYmKGEudGl0bGU9Ynx8IiIpfTt2YXIgZWQ9ZnVuY3Rpb24oYSxiLGMpe04uY2FsbCh0aGlzLGEsYnx8ZGQuVigpLGMpO1BjKHRoaXMsOCwhMCk7dGhpcy5QfD05fTtuKGVkLE4pO2VkLnByb3RvdHlwZS5HYT1mdW5jdGlvbigpe3JldHVybiB0aGlzLlJhfTtlZC5wcm90b3R5cGUuTWE9ZnVuY3Rpb24oYSl7dGhpcy52Lk1hKHRoaXMuaSgpLGEpO3RoaXMuUmE9YX07dGMoImdvb2ctdGFiIixmdW5jdGlvbigpe3JldHVybiBuZXcgZWQobnVsbCl9KTt2YXIgVz1mdW5jdGlvbigpe3RoaXMuQT0idGFibGlzdCJ9O24oVyx2Yyk7aWEoVyk7Vy5wcm90b3R5cGUuZz1mdW5jdGlvbigpe3JldHVybiJnb29nLXRhYi1iYXIifTtXLnByb3RvdHlwZS51PWZ1bmN0aW9uKGEsYixjKXt0aGlzLnZ8fCh0aGlzLmh8fGZkKHRoaXMpLHRoaXMudj1FYSh0aGlzLmgpKTt2YXIgZD10aGlzLnZbYl07ZD8oemMoYSxnZChkKSksYS52PWQpOlcubC51LmNhbGwodGhpcyxhLGIsYyl9O1cucHJvdG90eXBlLmo9ZnVuY3Rpb24oYSl7dmFyIGI9Vy5sLmouY2FsbCh0aGlzLGEpO3RoaXMuaHx8ZmQodGhpcyk7Yi5wdXNoKHRoaXMuaFthLnZdKTtyZXR1cm4gYn07dmFyIGZkPWZ1bmN0aW9uKGEpe3ZhciBiPWEuZygpO2EuaD17dG9wOmIrIi10b3AiLGJvdHRvbTpiKyItYm90dG9tIixzdGFydDpiKyItc3RhcnQiLGVuZDpiKyItZW5kIn19O3ZhciBYPWZ1bmN0aW9uKGEsYixjKXthPWF8fCJ0b3AiO3pjKHRoaXMsZ2QoYSkpO3RoaXMudj1hO1YuY2FsbCh0aGlzLHRoaXMuTCxifHxXLlYoKSxjKTtoZCh0aGlzKX07bihYLFYpO2c9WC5wcm90b3R5cGU7Zy5IPW51bGw7Zy5JPWZ1bmN0aW9uKCl7WC5sLkkuY2FsbCh0aGlzKTtoZCh0aGlzKX07Zy5DPWZ1bmN0aW9uKCl7WC5sLkMuY2FsbCh0aGlzKTt0aGlzLkg9bnVsbH07Zy5MYT1mdW5jdGlvbihhKXtYLmwuTGEuY2FsbCh0aGlzLGEpO3RoaXMuSihJKHRoaXMsYSkpfTtnLko9ZnVuY3Rpb24oYSl7YT9OYyhhLCEwKTp0aGlzLkgmJk5jKHRoaXMuSCwhMSl9Owp2YXIgaWQ9ZnVuY3Rpb24oYSxiKXtpZihiJiZiPT1hLkgpe2Zvcih2YXIgYz1WYihhLGIpLGQ9Yy0xO2I9SShhLGQpO2QtLSl7dmFyIGU9YjtpZihlLmlzVmlzaWJsZSgpJiZlLmlzRW5hYmxlZCgpKXthLkooYik7cmV0dXJufX1mb3IoYys9MTtiPUkoYSxjKTtjKyspaWYoZD1iLGQuaXNWaXNpYmxlKCkmJmQuaXNFbmFibGVkKCkpe2EuSihiKTtyZXR1cm59YS5KKG51bGwpfX07Zz1YLnByb3RvdHlwZTtnLmpiPWZ1bmN0aW9uKGEpe3RoaXMuSCYmdGhpcy5IIT1hLnRhcmdldCYmTmModGhpcy5ILCExKTt0aGlzLkg9YS50YXJnZXR9O2cua2I9ZnVuY3Rpb24oYSl7YS50YXJnZXQ9PXRoaXMuSCYmKHRoaXMuSD1udWxsKX07Zy5oYj1mdW5jdGlvbihhKXtpZCh0aGlzLGEudGFyZ2V0KX07Zy5pYj1mdW5jdGlvbihhKXtpZCh0aGlzLGEudGFyZ2V0KX07Zy5QYT1mdW5jdGlvbigpe0kodGhpcyx0aGlzLm8pfHxYYyh0aGlzLFZiKHRoaXMsdGhpcy5IfHxJKHRoaXMsMCkpKX07CnZhciBoZD1mdW5jdGlvbihhKXtCKEIoQihCKFFiKGEpLGEsInNlbGVjdCIsYS5qYiksYSwidW5zZWxlY3QiLGEua2IpLGEsImRpc2FibGUiLGEuaGIpLGEsImhpZGUiLGEuaWIpfSxnZD1mdW5jdGlvbihhKXtyZXR1cm4gYT09InN0YXJ0Inx8YT09ImVuZCI/InZlcnRpY2FsIjoiaG9yaXpvbnRhbCJ9O3RjKCJnb29nLXRhYi1iYXIiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBYfSk7ZnVuY3Rpb24gamQoYSl7dmFyIGI9e3RvcDoiYm90dG9tIixib3R0b206InRvcCIsc3RhcnQ6InJpZ2h0IixlbmQ6ImxlZnQifVthLmxvY2F0aW9uXSxjPWEuZWxlbWVudElkLGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTtkLnRleHRDb250ZW50PSJcbiAgICBmaWVsZHNldCB7XG4gICAgICBwYWRkaW5nOiAxMHB4O1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgIzM2OTtcbiAgICB9XG5cbiAgICAjIitjKyIgLmdvb2ctdGFiLWNvbnRlbnQge1xuICAgICAgbWluLWhlaWdodDogM2VtO1xuICAgICAgbWFyZ2luOiAwO1xuICAgICAgYm9yZGVyOiAiK2EuYm9yZGVyKyIgc29saWQgIithLmJvcmRlckNvbG9yKyI7XG4gICAgICBib3JkZXItdG9wOiAwO1xuICAgICAgaGVpZ2h0OiAiK2EuY29udGVudEhlaWdodCsiO1xuICAgICAgcGFkZGluZzogNHB4IDhweDtcbiAgICAgIG1hcmdpbi1yaWdodDogNHB4O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgIG92ZXJmbG93OiBhdXRvO1xuICAgIH1cblxuICAgICMiKwpjKyIgLmdvb2ctdGFiLWJhci0iK2EubG9jYXRpb24rIiAuZ29vZy10YWItc2VsZWN0ZWQge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICIrYS5ib3JkZXJDb2xvcisiO1xuICAgICAgYm9yZGVyLSIrYisiOiAwcHg7XG4gICAgfVxuXG4gICAgIyIrYysiIC5nb29nLXRhYi1iYXItIithLmxvY2F0aW9uKyIge1xuICAgICAgcGFkZGluZy0iK2EubG9jYXRpb24rIjogNXB4ICFpbXBvcnRhbnQ7XG4gICAgICBib3JkZXItIitiKyI6IDFweCBzb2xpZCAiK2EuYm9yZGVyQ29sb3IrIiAhaW1wb3J0YW50O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICB9XG5cbiAgICAjIitjKyIgLmdvb2ctdGFiLWJhciB7XG4gICAgICAgbWFyZ2luOiAwO1xuICAgICAgIGJvcmRlcjogMDtcbiAgICAgICBwYWRkaW5nOiAwO1xuICAgICAgIGxpc3Qtc3R5bGU6IG5vbmU7XG4gICAgICAgY3Vyc29yOiBkZWZhdWx0O1xuICAgICAgIG91dGxpbmU6IG5vbmU7XG4gICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgICBtYXJnaW4tcmlnaHQ6IDRweDtcbiAgICAgIH1cblxuICAgICAjIisKYysiIC5nb29nLXRhYiB7XG4gICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgIHBhZGRpbmc6IDRweCA4cHg7XG4gICAgICAgY29sb3I6IHZhcigtLWNvbGFiLXByaW1hcnktdGV4dC1jb2xvcik7XG4gICAgICAgdGV4dC1kZWNvcmF0aW9uOiBpbml0aWFsO1xuICAgICAgIGN1cnNvcjogZGVmYXVsdDtcbiAgICAgIH1cblxuICAgICAgIyIrYysiIC5nb29nLXRhYi1ob3ZlciB7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWNvbGFiLWhpZ2hsaWdodGVkLXN1cmZhY2UtY29sb3IpO1xuICAgICAgfVxuICAgICAgIjtyZXR1cm4gZH0KdmFyIGtkPWZ1bmN0aW9uKGEpe3ZhciBiPWEuZWxlbWVudElkLGM9YS50YWJOYW1lcyxkPWEuc2VsZWN0ZWRJbmRleDsiY29udGVudEJvcmRlciJpbiBhfHwoYS5jb250ZW50Qm9yZGVyPSIwcHgiKTsiY29udGVudEhlaWdodCJpbiBhfHwoYS5jb250ZW50SGVpZ2h0PSJpbml0aWFsIik7ImJvcmRlckNvbG9yImluIGF8fChhLmJvcmRlckNvbG9yPSJ2YXIoLS1jb2xhYi1ib3JkZXItY29sb3IpIik7YS5sb2NhdGlvbnx8KGEubG9jYXRpb249InRvcCIpO3ZhciBlPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiMiK2IpLGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zi5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYi1iYXIiKTt2YXIgaD1hLmxvY2F0aW9uO2YuY2xhc3NMaXN0LmFkZCgiZ29vZy10YWItYmFyLSIraCk7Zm9yKHZhciBrPVtdLHE9ZmEoYyksRz1xLm5leHQoKTshRy5kb25lO0c9cS5uZXh0KCkpe0c9Ry52YWx1ZTt2YXIgeD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKeC5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYiIpO3gudGV4dENvbnRlbnQ9RztmLmFwcGVuZENoaWxkKHgpO2sucHVzaCh4KX1oIT0iYm90dG9tIiYmZS5hcHBlbmRDaGlsZChmKTtxPW51bGw7aWYoaD09InRvcCJ8fGg9PSJib3R0b20iKXE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikscS5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYi1iYXItY2xlYXIiKTtoPT0idG9wIiYmcSYmZS5hcHBlbmRDaGlsZChxKTtHPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO0cuY2xhc3NMaXN0LmFkZCgiZ29vZy10YWItY29udGVudCIpO3ZhciBoYT1bXTtjPWZhKGMpO2Zvcih4PWMubmV4dCgpOyF4LmRvbmU7eD1jLm5leHQoKSl4PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHguaWQ9ZS5pZCsiX2NvbnRlbnRfIitoYS5sZW5ndGgseC5zdHlsZS5kaXNwbGF5PSJub25lIixHLmFwcGVuZENoaWxkKHgpLGhhLnB1c2goeCk7ZS5hcHBlbmRDaGlsZChHKTtoPT0iYm90dG9tIiYmKHEmJgplLmFwcGVuZENoaWxkKHEpLGUuYXBwZW5kQ2hpbGQoZikpO3ZhciBRPW5ldyBYKGgpO1NiKFEsZik7dmFyIFI9LTE7d2IoUSwic2VsZWN0IixmdW5jdGlvbihTKXtTPWsuaW5kZXhPZihTLnRhcmdldC5pKCkpO1MhPVImJihSPj0wJiZSPGhhLmxlbmd0aCYmKGhhW1JdLnN0eWxlLmRpc3BsYXk9Im5vbmUiLFI9LTEpLFM+PTAmJlM8aGEubGVuZ3RoJiYoUj1TLGhhW1JdLnN0eWxlLmRpc3BsYXk9ImlubGluZSIsd2luZG93LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCJyZXNpemUiKSksZ29vZ2xlLmNvbGFiLm91dHB1dC5yZXNpemVJZnJhbWVUb0NvbnRlbnQoKSksUS5KKEkoUSxSKSkpfSk7US5KKEkoUSxkKSk7d2luZG93W2JdPXtzZXRTZWxlY3RlZFRhYkluZGV4OmZ1bmN0aW9uKFMpe1EuSihJKFEsUykpfX07ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChqZChhKSl9LGxkPVsiY29sYWJfbGliIiwiY3JlYXRlVGFiQmFyIl0sWT1sOwpsZFswXWluIFl8fHR5cGVvZiBZLmV4ZWNTY3JpcHQ9PSJ1bmRlZmluZWQifHxZLmV4ZWNTY3JpcHQoInZhciAiK2xkWzBdKTtmb3IodmFyIFo7bGQubGVuZ3RoJiYoWj1sZC5zaGlmdCgpKTspbGQubGVuZ3RofHxrZD09PXZvaWQgMD9ZW1pdJiZZW1pdIT09T2JqZWN0LnByb3RvdHlwZVtaXT9ZPVlbWl06WT1ZW1pdPXt9OllbWl09a2Q7fSkuY2FsbCh0aGlzKTsKLy8gY2xhbmctZm9ybWF0IG9uCg==", + "ok": true, + "headers": [ + [ + "content-length", + "41785" + ], + [ + "content-type", + "application/javascript" + ] + ], + "status": 200, + "status_text": "" + }, + "http://localhost:8080/nbextensions/google.colab/tabbar.css": { + "data": "Lmdvb2ctdGFie3Bvc2l0aW9uOnJlbGF0aXZlO3BhZGRpbmc6NHB4IDhweDtjb2xvcjojMDBjO3RleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7Y3Vyc29yOmRlZmF1bHR9Lmdvb2ctdGFiLWJhci10b3AgLmdvb2ctdGFie21hcmdpbjoxcHggNHB4IDAgMDtib3JkZXItYm90dG9tOjA7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLXRvcDphZnRlciwuZ29vZy10YWItYmFyLWJvdHRvbTphZnRlcntjb250ZW50OiIgIjtkaXNwbGF5OmJsb2NrO2hlaWdodDowO2NsZWFyOmJvdGg7dmlzaWJpbGl0eTpoaWRkZW59Lmdvb2ctdGFiLWJhci1ib3R0b20gLmdvb2ctdGFie21hcmdpbjowIDRweCAxcHggMDtib3JkZXItdG9wOjA7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLXN0YXJ0IC5nb29nLXRhYnttYXJnaW46MCAwIDRweCAxcHg7Ym9yZGVyLXJpZ2h0OjB9Lmdvb2ctdGFiLWJhci1lbmQgLmdvb2ctdGFie21hcmdpbjowIDFweCA0cHggMDtib3JkZXItbGVmdDowfS5nb29nLXRhYi1ob3ZlcntiYWNrZ3JvdW5kOiNlZWV9Lmdvb2ctdGFiLWRpc2FibGVke2NvbG9yOiM2NjZ9Lmdvb2ctdGFiLXNlbGVjdGVke2NvbG9yOiMwMDA7YmFja2dyb3VuZDojZmZmO3RleHQtZGVjb3JhdGlvbjpub25lO2ZvbnQtd2VpZ2h0OmJvbGQ7Ym9yZGVyOjFweCBzb2xpZCAjNmI5MGRhfS5nb29nLXRhYi1iYXItdG9we3BhZGRpbmctdG9wOjVweCFpbXBvcnRhbnQ7cGFkZGluZy1sZWZ0OjVweCFpbXBvcnRhbnQ7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgIzZiOTBkYSFpbXBvcnRhbnR9Lmdvb2ctdGFiLWJhci10b3AgLmdvb2ctdGFiLXNlbGVjdGVke3RvcDoxcHg7bWFyZ2luLXRvcDowO3BhZGRpbmctYm90dG9tOjVweH0uZ29vZy10YWItYmFyLWJvdHRvbSAuZ29vZy10YWItc2VsZWN0ZWR7dG9wOi0xcHg7bWFyZ2luLWJvdHRvbTowO3BhZGRpbmctdG9wOjVweH0uZ29vZy10YWItYmFyLXN0YXJ0IC5nb29nLXRhYi1zZWxlY3RlZHtsZWZ0OjFweDttYXJnaW4tbGVmdDowO3BhZGRpbmctcmlnaHQ6OXB4fS5nb29nLXRhYi1iYXItZW5kIC5nb29nLXRhYi1zZWxlY3RlZHtsZWZ0Oi0xcHg7bWFyZ2luLXJpZ2h0OjA7cGFkZGluZy1sZWZ0OjlweH0uZ29vZy10YWItYmFye21hcmdpbjowO2JvcmRlcjowO3BhZGRpbmc6MDtsaXN0LXN0eWxlOm5vbmU7Y3Vyc29yOmRlZmF1bHQ7b3V0bGluZTpub25lO2JhY2tncm91bmQ6I2ViZWZmOX0uZ29vZy10YWItYmFyLWNsZWFye2NsZWFyOmJvdGg7aGVpZ2h0OjA7b3ZlcmZsb3c6aGlkZGVufS5nb29nLXRhYi1iYXItc3RhcnR7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLWVuZHtmbG9hdDpyaWdodH0qIGh0bWwgLmdvb2ctdGFiLWJhci1zdGFydHttYXJnaW4tcmlnaHQ6LTNweH0qIGh0bWwgLmdvb2ctdGFiLWJhci1lbmR7bWFyZ2luLWxlZnQ6LTNweH1zZW50aW5lbHt9", + "ok": true, + "headers": [ + [ + "content-length", + "1404" + ], + [ + "content-type", + "text/css" + ] + ], + "status": 200, + "status_text": "" + } + }, + "base_uri": "https://localhost:8080/", + "height": 479 + }, + "outputId": "5af7f6a6-bb5b-4413-97b7-98c99c2cb564" + }, + "source": [ + "%%logica QueryOdd\n", + "\n", + "QueryOdd(x) :- logica_home.Odd(x);" + ], + "execution_count": 44, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"9538caa8-d22d-11ef-a7c0-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id101\", \"tabNames\": [\"QueryOdd\", \"(Log)\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_923ea75e37" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"9539430c-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id101\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_62b5926831" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"953b6128-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_50515a6217" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"953bd1bc-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id101_content_1\");\n", + "//# sourceURL=js_6c3160ddcc" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"953c30a8-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"953bd1bc-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_4c26b7afb7" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"953c8d1e-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id101\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_900df2e9b1" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"953efe50-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"953b6128-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_c710f1cfde" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"954094ea-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_f63b83f3cf" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"9540e166-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id101_content_0\");\n", + "//# sourceURL=js_856ab89653" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"95412ed2-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"9540e166-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_f1b99654be" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"9541908e-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id101\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_e3db244fbb" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"954362ba-d22d-11ef-a7c0-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id102\", \"tabNames\": [\"SQL\", \"Result\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_6f522665e3" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"9543a78e-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id102\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_0fc70db066" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"954536f8-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_bffa7f4e08" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"9545cb04-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id102_content_0\");\n", + "//# sourceURL=js_30b9683cee" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"95461320-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"9545cb04-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_1d27f26374" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"95465646-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id102\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_ad18f5c04d" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The following query is stored at \u001b[1mQueryOdd_sql\u001b[0m variable.\n", + "-- Initializing DuckDB environment.\n", + "create schema if not exists logica_home;\n", + "-- Empty record, has to have a field by DuckDB syntax.\n", + "drop type if exists logicarecord893574736 cascade; create type logicarecord893574736 as struct(nirvana numeric);\n", + "create sequence if not exists eternal_logical_sequence;\n", + "\n", + "\n", + "-- Logica type: logicarecord481217614\n", + "drop type if exists logicarecord481217614 cascade; create type logicarecord481217614 as struct(r logicarecord893574736);\n", + "\n", + "-- Logica type: logicarecord383307722\n", + "drop type if exists logicarecord383307722 cascade; create type logicarecord383307722 as struct(a timestamp);\n", + "SELECT\n", + " logica_home_Odd.col0 AS col0\n", + "FROM\n", + " logica_home.Odd AS logica_home_Odd;\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"954797ae-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"954536f8-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_6d60792247" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"95496714-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_299f88ee00" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"9549b3d6-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id102_content_1\");\n", + "//# sourceURL=js_8502f46b7c" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"9549fd14-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"9549b3d6-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_a815bf6718" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"954a4562-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id102\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_0c8293b16c" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The following table is stored at \u001b[1mQueryOdd\u001b[0m variable.\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
col0
01
13
25
37
49
511
613
715
817
919
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"954b9ea8-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"95496714-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_5bc7bf4e7c" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"954d0932-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"954094ea-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_9e64e55a42" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"954ec394-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_e097a76fac" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"954f2262-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id101_content_1\");\n", + "//# sourceURL=js_3cb2bd7a56" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"954f6c7c-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"954f2262-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_16b691ce86" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"954fb5f6-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id101\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_5a9f017863" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "image/svg+xml": "\n\n\n\n\n\nConcertina\n\n\n\nQueryOdd\n\nQueryOdd\n\n\n\nlogica_home.Odd\n\n\nlogica_home.Odd\n\n\n\nlogica_home.Odd->QueryOdd\n\n\n\n\n\n", + "text/plain": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Running predicate: QueryOdd (3 ms)\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"956a927c-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"954ec394-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_0d98f19245" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"956c3cf8-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_17c1756541" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"956cc4fc-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id101_content_0\");\n", + "//# sourceURL=js_6a95cf18a7" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"956d1ede-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"956cc4fc-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_accfbb6e31" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"956d8338-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id101\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_0515ae0598" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"956fceea-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_c35141067a" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"95701706-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id102_content_1\");\n", + "//# sourceURL=js_1ff15bf0e3" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"95705b30-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"95701706-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_6eab2580e2" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"9570fb44-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id102\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_9777e6c444" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"9572df40-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"956fceea-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_f260da1777" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + " \n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"9577b0c4-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"956c3cf8-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_7f1841ff9d" + ] + }, + "metadata": {} + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "i0HckP3ldLqE" + }, + "source": [ + "### Conditional operator\n", + "\n", + "`if then else` operator can be used to assign a value to a variable based on a boolean condition.\n", + "[We already used](https://colab.research.google.com/github/EvgSkv/logica/blob/main/tutorial/Logica_tutorial.ipynb#scrollTo=Cqv6UMREL7ev) this operator to compute size of the CL." + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "resources": { + "http://localhost:8080/nbextensions/google.colab/tabbar.css": { + "data": "Lmdvb2ctdGFie3Bvc2l0aW9uOnJlbGF0aXZlO3BhZGRpbmc6NHB4IDhweDtjb2xvcjojMDBjO3RleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7Y3Vyc29yOmRlZmF1bHR9Lmdvb2ctdGFiLWJhci10b3AgLmdvb2ctdGFie21hcmdpbjoxcHggNHB4IDAgMDtib3JkZXItYm90dG9tOjA7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLXRvcDphZnRlciwuZ29vZy10YWItYmFyLWJvdHRvbTphZnRlcntjb250ZW50OiIgIjtkaXNwbGF5OmJsb2NrO2hlaWdodDowO2NsZWFyOmJvdGg7dmlzaWJpbGl0eTpoaWRkZW59Lmdvb2ctdGFiLWJhci1ib3R0b20gLmdvb2ctdGFie21hcmdpbjowIDRweCAxcHggMDtib3JkZXItdG9wOjA7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLXN0YXJ0IC5nb29nLXRhYnttYXJnaW46MCAwIDRweCAxcHg7Ym9yZGVyLXJpZ2h0OjB9Lmdvb2ctdGFiLWJhci1lbmQgLmdvb2ctdGFie21hcmdpbjowIDFweCA0cHggMDtib3JkZXItbGVmdDowfS5nb29nLXRhYi1ob3ZlcntiYWNrZ3JvdW5kOiNlZWV9Lmdvb2ctdGFiLWRpc2FibGVke2NvbG9yOiM2NjZ9Lmdvb2ctdGFiLXNlbGVjdGVke2NvbG9yOiMwMDA7YmFja2dyb3VuZDojZmZmO3RleHQtZGVjb3JhdGlvbjpub25lO2ZvbnQtd2VpZ2h0OmJvbGQ7Ym9yZGVyOjFweCBzb2xpZCAjNmI5MGRhfS5nb29nLXRhYi1iYXItdG9we3BhZGRpbmctdG9wOjVweCFpbXBvcnRhbnQ7cGFkZGluZy1sZWZ0OjVweCFpbXBvcnRhbnQ7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgIzZiOTBkYSFpbXBvcnRhbnR9Lmdvb2ctdGFiLWJhci10b3AgLmdvb2ctdGFiLXNlbGVjdGVke3RvcDoxcHg7bWFyZ2luLXRvcDowO3BhZGRpbmctYm90dG9tOjVweH0uZ29vZy10YWItYmFyLWJvdHRvbSAuZ29vZy10YWItc2VsZWN0ZWR7dG9wOi0xcHg7bWFyZ2luLWJvdHRvbTowO3BhZGRpbmctdG9wOjVweH0uZ29vZy10YWItYmFyLXN0YXJ0IC5nb29nLXRhYi1zZWxlY3RlZHtsZWZ0OjFweDttYXJnaW4tbGVmdDowO3BhZGRpbmctcmlnaHQ6OXB4fS5nb29nLXRhYi1iYXItZW5kIC5nb29nLXRhYi1zZWxlY3RlZHtsZWZ0Oi0xcHg7bWFyZ2luLXJpZ2h0OjA7cGFkZGluZy1sZWZ0OjlweH0uZ29vZy10YWItYmFye21hcmdpbjowO2JvcmRlcjowO3BhZGRpbmc6MDtsaXN0LXN0eWxlOm5vbmU7Y3Vyc29yOmRlZmF1bHQ7b3V0bGluZTpub25lO2JhY2tncm91bmQ6I2ViZWZmOX0uZ29vZy10YWItYmFyLWNsZWFye2NsZWFyOmJvdGg7aGVpZ2h0OjA7b3ZlcmZsb3c6aGlkZGVufS5nb29nLXRhYi1iYXItc3RhcnR7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLWVuZHtmbG9hdDpyaWdodH0qIGh0bWwgLmdvb2ctdGFiLWJhci1zdGFydHttYXJnaW4tcmlnaHQ6LTNweH0qIGh0bWwgLmdvb2ctdGFiLWJhci1lbmR7bWFyZ2luLWxlZnQ6LTNweH1zZW50aW5lbHt9", + "ok": true, + "headers": [ + [ + "content-length", + "1404" + ], + [ + "content-type", + "text/css" + ] + ], + "status": 200, + "status_text": "" + }, + "http://localhost:8080/nbextensions/google.colab/tabbar_main.min.js": { + "data": "Ly8gY2xhbmctZm9ybWF0IG9mZgooZnVuY3Rpb24oKXt2YXIgZyxhYT1mdW5jdGlvbihhKXt2YXIgYj0wO3JldHVybiBmdW5jdGlvbigpe3JldHVybiBiPGEubGVuZ3RoP3tkb25lOiExLHZhbHVlOmFbYisrXX06e2RvbmU6ITB9fX0sYmE9dHlwZW9mIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzPT0iZnVuY3Rpb24iP09iamVjdC5kZWZpbmVQcm9wZXJ0eTpmdW5jdGlvbihhLGIsYyl7aWYoYT09QXJyYXkucHJvdG90eXBlfHxhPT1PYmplY3QucHJvdG90eXBlKXJldHVybiBhO2FbYl09Yy52YWx1ZTtyZXR1cm4gYX0sY2E9ZnVuY3Rpb24oYSl7YT1bIm9iamVjdCI9PXR5cGVvZiBnbG9iYWxUaGlzJiZnbG9iYWxUaGlzLGEsIm9iamVjdCI9PXR5cGVvZiB3aW5kb3cmJndpbmRvdywib2JqZWN0Ij09dHlwZW9mIHNlbGYmJnNlbGYsIm9iamVjdCI9PXR5cGVvZiBnbG9iYWwmJmdsb2JhbF07Zm9yKHZhciBiPTA7YjxhLmxlbmd0aDsrK2Ipe3ZhciBjPWFbYl07aWYoYyYmYy5NYXRoPT1NYXRoKXJldHVybiBjfXRocm93IEVycm9yKCJDYW5ub3QgZmluZCBnbG9iYWwgb2JqZWN0Iik7Cn0sZGE9Y2EodGhpcyksZWE9ZnVuY3Rpb24oYSxiKXtpZihiKWE6e3ZhciBjPWRhO2E9YS5zcGxpdCgiLiIpO2Zvcih2YXIgZD0wO2Q8YS5sZW5ndGgtMTtkKyspe3ZhciBlPWFbZF07aWYoIShlIGluIGMpKWJyZWFrIGE7Yz1jW2VdfWE9YVthLmxlbmd0aC0xXTtkPWNbYV07Yj1iKGQpO2IhPWQmJmIhPW51bGwmJmJhKGMsYSx7Y29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOmJ9KX19OwplYSgiU3ltYm9sIixmdW5jdGlvbihhKXtpZihhKXJldHVybiBhO3ZhciBiPWZ1bmN0aW9uKGYsaCl7dGhpcy5nPWY7YmEodGhpcywiZGVzY3JpcHRpb24iLHtjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6aH0pfTtiLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmd9O3ZhciBjPSJqc2NvbXBfc3ltYm9sXyIrKE1hdGgucmFuZG9tKCkqMUU5Pj4+MCkrIl8iLGQ9MCxlPWZ1bmN0aW9uKGYpe2lmKHRoaXMgaW5zdGFuY2VvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoIlN5bWJvbCBpcyBub3QgYSBjb25zdHJ1Y3RvciIpO3JldHVybiBuZXcgYihjKyhmfHwiIikrIl8iK2QrKyxmKX07cmV0dXJuIGV9KTsKdmFyIGZhPWZ1bmN0aW9uKGEpe3ZhciBiPXR5cGVvZiBTeW1ib2whPSJ1bmRlZmluZWQiJiZTeW1ib2wuaXRlcmF0b3ImJmFbU3ltYm9sLml0ZXJhdG9yXTtpZihiKXJldHVybiBiLmNhbGwoYSk7aWYodHlwZW9mIGEubGVuZ3RoPT0ibnVtYmVyIilyZXR1cm57bmV4dDphYShhKX07dGhyb3cgRXJyb3IoU3RyaW5nKGEpKyIgaXMgbm90IGFuIGl0ZXJhYmxlIG9yIEFycmF5TGlrZSIpO307ZWEoIlN5bWJvbC5kaXNwb3NlIixmdW5jdGlvbihhKXtyZXR1cm4gYT9hOlN5bWJvbCgiU3ltYm9sLmRpc3Bvc2UiKX0pOy8qCgogQ29weXJpZ2h0IFRoZSBDbG9zdXJlIExpYnJhcnkgQXV0aG9ycy4KIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wCiovCnZhciBsPXRoaXN8fHNlbGYsaWE9ZnVuY3Rpb24oYSl7YS5JYT12b2lkIDA7YS5WPWZ1bmN0aW9uKCl7cmV0dXJuIGEuSWE/YS5JYTphLklhPW5ldyBhfX0samE9ZnVuY3Rpb24oYSl7dmFyIGI9dHlwZW9mIGE7cmV0dXJuIGIhPSJvYmplY3QiP2I6YT9BcnJheS5pc0FycmF5KGEpPyJhcnJheSI6YjoibnVsbCJ9LGthPWZ1bmN0aW9uKGEpe3ZhciBiPWphKGEpO3JldHVybiBiPT0iYXJyYXkifHxiPT0ib2JqZWN0IiYmdHlwZW9mIGEubGVuZ3RoPT0ibnVtYmVyIn0sbT1mdW5jdGlvbihhKXt2YXIgYj10eXBlb2YgYTtyZXR1cm4gYj09Im9iamVjdCImJmEhPW51bGx8fGI9PSJmdW5jdGlvbiJ9LG5hPWZ1bmN0aW9uKGEpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYSxsYSkmJmFbbGFdfHwoYVtsYV09KyttYSl9LGxhPSJjbG9zdXJlX3VpZF8iKyhNYXRoLnJhbmRvbSgpKjFFOT4+PjApLG1hPTAsbj1mdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoKXt9Yy5wcm90b3R5cGU9CmIucHJvdG90eXBlO2EubD1iLnByb3RvdHlwZTthLnByb3RvdHlwZT1uZXcgYzthLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1hO2EucWQ9ZnVuY3Rpb24oZCxlLGYpe2Zvcih2YXIgaD1BcnJheShhcmd1bWVudHMubGVuZ3RoLTIpLGs9MjtrPGFyZ3VtZW50cy5sZW5ndGg7aysrKWhbay0yXT1hcmd1bWVudHNba107cmV0dXJuIGIucHJvdG90eXBlW2VdLmFwcGx5KGQsaCl9fTtmdW5jdGlvbiBvYShhLGIpe2lmKEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKUVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsb2EpO2Vsc2V7dmFyIGM9RXJyb3IoKS5zdGFjaztjJiYodGhpcy5zdGFjaz1jKX1hJiYodGhpcy5tZXNzYWdlPVN0cmluZyhhKSk7YiE9PXZvaWQgMCYmKHRoaXMuY2F1c2U9Yil9bihvYSxFcnJvcik7b2EucHJvdG90eXBlLm5hbWU9IkN1c3RvbUVycm9yIjt2YXIgcGE7ZnVuY3Rpb24gcWEoYSxiKXthPWEuc3BsaXQoIiVzIik7Zm9yKHZhciBjPSIiLGQ9YS5sZW5ndGgtMSxlPTA7ZTxkO2UrKyljKz1hW2VdKyhlPGIubGVuZ3RoP2JbZV06IiVzIik7b2EuY2FsbCh0aGlzLGMrYVtkXSl9bihxYSxvYSk7cWEucHJvdG90eXBlLm5hbWU9IkFzc2VydGlvbkVycm9yIjtmdW5jdGlvbiByYShhLGIsYyxkKXt2YXIgZT0iQXNzZXJ0aW9uIGZhaWxlZCI7aWYoYyl7ZSs9IjogIitjO3ZhciBmPWR9ZWxzZSBhJiYoZSs9IjogIithLGY9Yik7dGhyb3cgbmV3IHFhKCIiK2UsZnx8W10pO30KdmFyIHA9ZnVuY3Rpb24oYSxiLGMpe2F8fHJhKCIiLG51bGwsYixBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMikpO3JldHVybiBhfSxzYT1mdW5jdGlvbihhLGIsYyl7bShhKSYmYS5ub2RlVHlwZT09MXx8cmEoIkV4cGVjdGVkIEVsZW1lbnQgYnV0IGdvdCAlczogJXMuIixbamEoYSksYV0sYixBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMikpfSx1YT1mdW5jdGlvbihhLGIsYyxkKXthIGluc3RhbmNlb2YgYnx8cmEoIkV4cGVjdGVkIGluc3RhbmNlb2YgJXMgYnV0IGdvdCAlcy4iLFt0YShiKSx0YShhKV0sYyxBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMykpfTsKZnVuY3Rpb24gdGEoYSl7cmV0dXJuIGEgaW5zdGFuY2VvZiBGdW5jdGlvbj9hLmRpc3BsYXlOYW1lfHxhLm5hbWV8fCJ1bmtub3duIHR5cGUgbmFtZSI6YSBpbnN0YW5jZW9mIE9iamVjdD9hLmNvbnN0cnVjdG9yLmRpc3BsYXlOYW1lfHxhLmNvbnN0cnVjdG9yLm5hbWV8fE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhKTphPT09bnVsbD8ibnVsbCI6dHlwZW9mIGF9O3ZhciB2YT1BcnJheS5wcm90b3R5cGUuaW5kZXhPZj9mdW5jdGlvbihhLGIpe3AoYS5sZW5ndGghPW51bGwpO3JldHVybiBBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKGEsYix2b2lkIDApfTpmdW5jdGlvbihhLGIpe2lmKHR5cGVvZiBhPT09InN0cmluZyIpcmV0dXJuIHR5cGVvZiBiIT09InN0cmluZyJ8fGIubGVuZ3RoIT0xPy0xOmEuaW5kZXhPZihiLDApO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWlmKGMgaW4gYSYmYVtjXT09PWIpcmV0dXJuIGM7cmV0dXJuLTF9LHdhPUFycmF5LnByb3RvdHlwZS5mb3JFYWNoP2Z1bmN0aW9uKGEsYil7cChhLmxlbmd0aCE9bnVsbCk7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChhLGIsdm9pZCAwKX06ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9YS5sZW5ndGgsZD10eXBlb2YgYT09PSJzdHJpbmciP2Euc3BsaXQoIiIpOmEsZT0wO2U8YztlKyspZSBpbiBkJiZiLmNhbGwodm9pZCAwLGRbZV0sZSxhKX07CmZ1bmN0aW9uIHhhKGEsYil7Yj12YShhLGIpO3ZhciBjO2lmKGM9Yj49MClwKGEubGVuZ3RoIT1udWxsKSxBcnJheS5wcm90b3R5cGUuc3BsaWNlLmNhbGwoYSxiLDEpO3JldHVybiBjfWZ1bmN0aW9uIHlhKGEpe3ZhciBiPWEubGVuZ3RoO2lmKGI+MCl7Zm9yKHZhciBjPUFycmF5KGIpLGQ9MDtkPGI7ZCsrKWNbZF09YVtkXTtyZXR1cm4gY31yZXR1cm5bXX1mdW5jdGlvbiB6YShhLGIsYyxkKXtwKGEubGVuZ3RoIT1udWxsKTtBcnJheS5wcm90b3R5cGUuc3BsaWNlLmFwcGx5KGEsQWEoYXJndW1lbnRzLDEpKX1mdW5jdGlvbiBBYShhLGIsYyl7cChhLmxlbmd0aCE9bnVsbCk7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg8PTI/QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYSxiKTpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhLGIsYyl9O2Z1bmN0aW9uIEJhKGEsYixjKXtmb3IodmFyIGQgaW4gYSliLmNhbGwoYyxhW2RdLGQsYSl9ZnVuY3Rpb24gQ2EoYSxiKXtmb3IodmFyIGMgaW4gYSlpZihhW2NdPT1iKXJldHVybiEwO3JldHVybiExfWZ1bmN0aW9uIERhKGEsYixjKXtpZihhIT09bnVsbCYmYiBpbiBhKXRocm93IEVycm9yKCdUaGUgb2JqZWN0IGFscmVhZHkgY29udGFpbnMgdGhlIGtleSAiJytiKyciJyk7YVtiXT1jfWZ1bmN0aW9uIEVhKGEpe3ZhciBiPXt9LGM7Zm9yKGMgaW4gYSliW2FbY11dPWM7cmV0dXJuIGJ9dmFyIEZhPSJjb25zdHJ1Y3RvciBoYXNPd25Qcm9wZXJ0eSBpc1Byb3RvdHlwZU9mIHByb3BlcnR5SXNFbnVtZXJhYmxlIHRvTG9jYWxlU3RyaW5nIHRvU3RyaW5nIHZhbHVlT2YiLnNwbGl0KCIgIik7CmZ1bmN0aW9uIEdhKGEsYil7Zm9yKHZhciBjLGQsZT0xO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspe2Q9YXJndW1lbnRzW2VdO2ZvcihjIGluIGQpYVtjXT1kW2NdO2Zvcih2YXIgZj0wO2Y8RmEubGVuZ3RoO2YrKyljPUZhW2ZdLE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChkLGMpJiYoYVtjXT1kW2NdKX19O3ZhciBIYT1TdHJpbmcucHJvdG90eXBlLnRyaW0/ZnVuY3Rpb24oYSl7cmV0dXJuIGEudHJpbSgpfTpmdW5jdGlvbihhKXtyZXR1cm4vXltcc1x4YTBdKihbXHNcU10qPylbXHNceGEwXSokLy5leGVjKGEpWzFdfTsvKgoKIENvcHlyaWdodCBHb29nbGUgTExDCiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMAoqLwp2YXIgSWE9e307dmFyIEphPWZ1bmN0aW9uKGEpe2lmKElhIT09SWEpdGhyb3cgRXJyb3IoIkJhZCBzZWNyZXQiKTt0aGlzLmc9YX07SmEucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ307bmV3IEphKCJhYm91dDpibGFuayIpO25ldyBKYSgiYWJvdXQ6aW52YWxpZCN6Q2xvc3VyZXoiKTt2YXIgS2E9W10sTGE9ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJBIFVSTCB3aXRoIGNvbnRlbnQgJyIrYSsiJyB3YXMgc2FuaXRpemVkIGF3YXkuIil9O0thLmluZGV4T2YoTGEpPT09LTEmJkthLnB1c2goTGEpO3ZhciBNYSxOYTthOntmb3IodmFyIE9hPVsiQ0xPU1VSRV9GTEFHUyJdLFBhPWwsUWE9MDtRYTxPYS5sZW5ndGg7UWErKylpZihQYT1QYVtPYVtRYV1dLFBhPT1udWxsKXtOYT1udWxsO2JyZWFrIGF9TmE9UGF9dmFyIFJhPU5hJiZOYVs2MTA0MDEzMDFdO01hPVJhIT1udWxsP1JhOiExO2Z1bmN0aW9uIFNhKCl7dmFyIGE9bC5uYXZpZ2F0b3I7cmV0dXJuIGEmJihhPWEudXNlckFnZW50KT9hOiIifXZhciBUYSxVYT1sLm5hdmlnYXRvcjtUYT1VYT9VYS51c2VyQWdlbnREYXRhfHxudWxsOm51bGw7ZnVuY3Rpb24gcihhKXtyZXR1cm4gU2EoKS5pbmRleE9mKGEpIT0tMX07dmFyIFZhPXIoIkVkZ2UiKSx0PXIoIkdlY2tvIikmJiEoU2EoKS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoIndlYmtpdCIpIT0tMSYmIXIoIkVkZ2UiKSkmJiEocigiVHJpZGVudCIpfHxyKCJNU0lFIikpJiYhcigiRWRnZSIpLHU9U2EoKS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoIndlYmtpdCIpIT0tMSYmIXIoIkVkZ2UiKSx2PU1hJiZUYSYmVGEucGxhdGZvcm0/VGEucGxhdGZvcm09PT0ibWFjT1MiOnIoIk1hY2ludG9zaCIpO3ZhciBYYT1mdW5jdGlvbihhLGIpe0JhKGIsZnVuY3Rpb24oYyxkKXtkPT0ic3R5bGUiP2Euc3R5bGUuY3NzVGV4dD1jOmQ9PSJjbGFzcyI/YS5jbGFzc05hbWU9YzpkPT0iZm9yIj9hLmh0bWxGb3I9YzpXYS5oYXNPd25Qcm9wZXJ0eShkKT9hLnNldEF0dHJpYnV0ZShXYVtkXSxjKTpkLmxhc3RJbmRleE9mKCJhcmlhLSIsMCk9PTB8fGQubGFzdEluZGV4T2YoImRhdGEtIiwwKT09MD9hLnNldEF0dHJpYnV0ZShkLGMpOmFbZF09Y30pfSxXYT17Y2VsbHBhZGRpbmc6ImNlbGxQYWRkaW5nIixjZWxsc3BhY2luZzoiY2VsbFNwYWNpbmciLGNvbHNwYW46ImNvbFNwYW4iLGZyYW1lYm9yZGVyOiJmcmFtZUJvcmRlciIsaGVpZ2h0OiJoZWlnaHQiLG1heGxlbmd0aDoibWF4TGVuZ3RoIixub25jZToibm9uY2UiLHJvbGU6InJvbGUiLHJvd3NwYW46InJvd1NwYW4iLHR5cGU6InR5cGUiLHVzZW1hcDoidXNlTWFwIix2YWxpZ246InZBbGlnbiIsd2lkdGg6IndpZHRoIn0sWWE9ZnVuY3Rpb24oYSwKYixjKXtmdW5jdGlvbiBkKGspe2smJmIuYXBwZW5kQ2hpbGQodHlwZW9mIGs9PT0ic3RyaW5nIj9hLmNyZWF0ZVRleHROb2RlKGspOmspfWZvcih2YXIgZT0yO2U8Yy5sZW5ndGg7ZSsrKXt2YXIgZj1jW2VdO2lmKCFrYShmKXx8bShmKSYmZi5ub2RlVHlwZT4wKWQoZik7ZWxzZXthOntpZihmJiZ0eXBlb2YgZi5sZW5ndGg9PSJudW1iZXIiKXtpZihtKGYpKXt2YXIgaD10eXBlb2YgZi5pdGVtPT0iZnVuY3Rpb24ifHx0eXBlb2YgZi5pdGVtPT0ic3RyaW5nIjticmVhayBhfWlmKHR5cGVvZiBmPT09ImZ1bmN0aW9uIil7aD10eXBlb2YgZi5pdGVtPT0iZnVuY3Rpb24iO2JyZWFrIGF9fWg9ITF9d2EoaD95YShmKTpmLGQpfX19LFphPWZ1bmN0aW9uKGEsYil7Yj1TdHJpbmcoYik7YS5jb250ZW50VHlwZT09PSJhcHBsaWNhdGlvbi94aHRtbCt4bWwiJiYoYj1iLnRvTG93ZXJDYXNlKCkpO3JldHVybiBhLmNyZWF0ZUVsZW1lbnQoYil9LCRhPWZ1bmN0aW9uKGEpe2EmJmEucGFyZW50Tm9kZSYmCmEucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhKX0sYWI9ZnVuY3Rpb24oYSxiKXtpZighYXx8IWIpcmV0dXJuITE7aWYoYS5jb250YWlucyYmYi5ub2RlVHlwZT09MSlyZXR1cm4gYT09Ynx8YS5jb250YWlucyhiKTtpZih0eXBlb2YgYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiE9InVuZGVmaW5lZCIpcmV0dXJuIGE9PWJ8fCEhKGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24oYikmMTYpO2Zvcig7YiYmYSE9YjspYj1iLnBhcmVudE5vZGU7cmV0dXJuIGI9PWF9LGJiPWZ1bmN0aW9uKGEpe3AoYSwiTm9kZSBjYW5ub3QgYmUgbnVsbCBvciB1bmRlZmluZWQuIik7cmV0dXJuIGEubm9kZVR5cGU9PTk/YTphLm93bmVyRG9jdW1lbnR8fGEuZG9jdW1lbnR9LGNiPWZ1bmN0aW9uKGEsYil7Yj9hLnRhYkluZGV4PTA6KGEudGFiSW5kZXg9LTEsYS5yZW1vdmVBdHRyaWJ1dGUoInRhYkluZGV4IikpfSxkYj1mdW5jdGlvbihhKXtyZXR1cm4gYS5oYXNBdHRyaWJ1dGUoInRhYmluZGV4Iil9LGViPQpmdW5jdGlvbihhKXthPWEudGFiSW5kZXg7cmV0dXJuIHR5cGVvZiBhPT09Im51bWJlciImJmE+PTAmJmE8MzI3Njh9LGZiPWZ1bmN0aW9uKGEpe3RoaXMuZz1hfHxsLmRvY3VtZW50fHxkb2N1bWVudH07ZmIucHJvdG90eXBlLmk9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nO3JldHVybiB0eXBlb2YgYT09PSJzdHJpbmciP2IuZ2V0RWxlbWVudEJ5SWQoYSk6YX07ZmIucHJvdG90eXBlLmg9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXMuZyxlPWFyZ3VtZW50cyxmPWVbMV0saD1aYShkLFN0cmluZyhlWzBdKSk7ZiYmKHR5cGVvZiBmPT09InN0cmluZyI/aC5jbGFzc05hbWU9ZjpBcnJheS5pc0FycmF5KGYpP2guY2xhc3NOYW1lPWYuam9pbigiICIpOlhhKGgsZikpO2UubGVuZ3RoPjImJllhKGQsaCxlKTtyZXR1cm4gaH07dmFyIHc9ZnVuY3Rpb24oKXt0aGlzLmJhPXRoaXMuYmE7dGhpcy5rYT10aGlzLmthfTt3LnByb3RvdHlwZS5iYT0hMTt3LnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7dGhpcy5iYXx8KHRoaXMuYmE9ITAsdGhpcy5DKCkpfTt3LnByb3RvdHlwZVtTeW1ib2wuZGlzcG9zZV09ZnVuY3Rpb24oKXt0aGlzLmRpc3Bvc2UoKX07dy5wcm90b3R5cGUuQz1mdW5jdGlvbigpe2lmKHRoaXMua2EpZm9yKDt0aGlzLmthLmxlbmd0aDspdGhpcy5rYS5zaGlmdCgpKCl9O3ZhciB5PWZ1bmN0aW9uKGEsYil7dGhpcy50eXBlPWE7dGhpcy51PXRoaXMudGFyZ2V0PWI7dGhpcy5kZWZhdWx0UHJldmVudGVkPXRoaXMuQT0hMX07eS5wcm90b3R5cGUudj1mdW5jdGlvbigpe3RoaXMuQT0hMH07eS5wcm90b3R5cGUuaj1mdW5jdGlvbigpe3RoaXMuZGVmYXVsdFByZXZlbnRlZD0hMH07dmFyIGdiPWZ1bmN0aW9uKCl7aWYoIWwuYWRkRXZlbnRMaXN0ZW5lcnx8IU9iamVjdC5kZWZpbmVQcm9wZXJ0eSlyZXR1cm4hMTt2YXIgYT0hMSxiPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwicGFzc2l2ZSIse2dldDpmdW5jdGlvbigpe2E9ITB9fSk7dHJ5e3ZhciBjPWZ1bmN0aW9uKCl7fTtsLmFkZEV2ZW50TGlzdGVuZXIoInRlc3QiLGMsYik7bC5yZW1vdmVFdmVudExpc3RlbmVyKCJ0ZXN0IixjLGIpfWNhdGNoKGQpe31yZXR1cm4gYX0oKTt2YXIgej1mdW5jdGlvbihhLGIpe3kuY2FsbCh0aGlzLGE/YS50eXBlOiIiKTt0aGlzLnJlbGF0ZWRUYXJnZXQ9dGhpcy51PXRoaXMudGFyZ2V0PW51bGw7dGhpcy5idXR0b249dGhpcy5zY3JlZW5ZPXRoaXMuc2NyZWVuWD10aGlzLmNsaWVudFk9dGhpcy5jbGllbnRYPTA7dGhpcy5rZXk9IiI7dGhpcy5nPTA7dGhpcy5tZXRhS2V5PXRoaXMuc2hpZnRLZXk9dGhpcy5hbHRLZXk9dGhpcy5jdHJsS2V5PSExO3RoaXMuc3RhdGU9bnVsbDt0aGlzLkc9ITE7dGhpcy5wb2ludGVySWQ9MDt0aGlzLnBvaW50ZXJUeXBlPSIiO3RoaXMudGltZVN0YW1wPTA7dGhpcy5oPW51bGw7aWYoYSl7dmFyIGM9dGhpcy50eXBlPWEudHlwZSxkPWEuY2hhbmdlZFRvdWNoZXMmJmEuY2hhbmdlZFRvdWNoZXMubGVuZ3RoP2EuY2hhbmdlZFRvdWNoZXNbMF06bnVsbDt0aGlzLnRhcmdldD1hLnRhcmdldHx8YS5zcmNFbGVtZW50O3RoaXMudT1iO2I9YS5yZWxhdGVkVGFyZ2V0O2J8fChjPT0ibW91c2VvdmVyIj8KYj1hLmZyb21FbGVtZW50OmM9PSJtb3VzZW91dCImJihiPWEudG9FbGVtZW50KSk7dGhpcy5yZWxhdGVkVGFyZ2V0PWI7ZD8odGhpcy5jbGllbnRYPWQuY2xpZW50WCE9PXZvaWQgMD9kLmNsaWVudFg6ZC5wYWdlWCx0aGlzLmNsaWVudFk9ZC5jbGllbnRZIT09dm9pZCAwP2QuY2xpZW50WTpkLnBhZ2VZLHRoaXMuc2NyZWVuWD1kLnNjcmVlblh8fDAsdGhpcy5zY3JlZW5ZPWQuc2NyZWVuWXx8MCk6KHRoaXMuY2xpZW50WD1hLmNsaWVudFghPT12b2lkIDA/YS5jbGllbnRYOmEucGFnZVgsdGhpcy5jbGllbnRZPWEuY2xpZW50WSE9PXZvaWQgMD9hLmNsaWVudFk6YS5wYWdlWSx0aGlzLnNjcmVlblg9YS5zY3JlZW5YfHwwLHRoaXMuc2NyZWVuWT1hLnNjcmVlbll8fDApO3RoaXMuYnV0dG9uPWEuYnV0dG9uO3RoaXMuZz1hLmtleUNvZGV8fDA7dGhpcy5rZXk9YS5rZXl8fCIiO3RoaXMuY3RybEtleT1hLmN0cmxLZXk7dGhpcy5hbHRLZXk9YS5hbHRLZXk7dGhpcy5zaGlmdEtleT1hLnNoaWZ0S2V5Owp0aGlzLm1ldGFLZXk9YS5tZXRhS2V5O3RoaXMuRz12P2EubWV0YUtleTphLmN0cmxLZXk7dGhpcy5wb2ludGVySWQ9YS5wb2ludGVySWR8fDA7dGhpcy5wb2ludGVyVHlwZT1hLnBvaW50ZXJUeXBlO3RoaXMuc3RhdGU9YS5zdGF0ZTt0aGlzLnRpbWVTdGFtcD1hLnRpbWVTdGFtcDt0aGlzLmg9YTthLmRlZmF1bHRQcmV2ZW50ZWQmJnoubC5qLmNhbGwodGhpcyl9fTtuKHoseSk7ei5wcm90b3R5cGUudj1mdW5jdGlvbigpe3oubC52LmNhbGwodGhpcyk7dGhpcy5oLnN0b3BQcm9wYWdhdGlvbj90aGlzLmguc3RvcFByb3BhZ2F0aW9uKCk6dGhpcy5oLmNhbmNlbEJ1YmJsZT0hMH07ei5wcm90b3R5cGUuaj1mdW5jdGlvbigpe3oubC5qLmNhbGwodGhpcyk7dmFyIGE9dGhpcy5oO2EucHJldmVudERlZmF1bHQ/YS5wcmV2ZW50RGVmYXVsdCgpOmEucmV0dXJuVmFsdWU9ITF9O3ZhciBoYj0iY2xvc3VyZV9saXN0ZW5hYmxlXyIrKE1hdGgucmFuZG9tKCkqMUU2fDApLGliPWZ1bmN0aW9uKGEpe3JldHVybiEoIWF8fCFhW2hiXSl9O3ZhciBqYj0wO3ZhciBrYj1mdW5jdGlvbihhLGIsYyxkLGUpe3RoaXMubGlzdGVuZXI9YTt0aGlzLnByb3h5PW51bGw7dGhpcy5zcmM9Yjt0aGlzLnR5cGU9Yzt0aGlzLmNhcHR1cmU9ISFkO3RoaXMucGE9ZTt0aGlzLmtleT0rK2piO3RoaXMuamE9dGhpcy5vYT0hMX0sbGI9ZnVuY3Rpb24oYSl7YS5qYT0hMDthLmxpc3RlbmVyPW51bGw7YS5wcm94eT1udWxsO2Euc3JjPW51bGw7YS5wYT1udWxsfTt2YXIgbWI9ZnVuY3Rpb24oYSl7dGhpcy5zcmM9YTt0aGlzLmc9e307dGhpcy5oPTB9O21iLnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZj1hLnRvU3RyaW5nKCk7YT10aGlzLmdbZl07YXx8KGE9dGhpcy5nW2ZdPVtdLHRoaXMuaCsrKTt2YXIgaD1uYihhLGIsZCxlKTtoPi0xPyhiPWFbaF0sY3x8KGIub2E9ITEpKTooYj1uZXcga2IoYix0aGlzLnNyYyxmLCEhZCxlKSxiLm9hPWMsYS5wdXNoKGIpKTtyZXR1cm4gYn07CnZhciBvYj1mdW5jdGlvbihhLGIpe3ZhciBjPWIudHlwZTtjIGluIGEuZyYmeGEoYS5nW2NdLGIpJiYobGIoYiksYS5nW2NdLmxlbmd0aD09MCYmKGRlbGV0ZSBhLmdbY10sYS5oLS0pKX0scGI9ZnVuY3Rpb24oYSxiLGMsZCxlKXthPWEuZ1tiLnRvU3RyaW5nKCldO2I9LTE7YSYmKGI9bmIoYSxjLGQsZSkpO3JldHVybiBiPi0xP2FbYl06bnVsbH0sbmI9ZnVuY3Rpb24oYSxiLGMsZCl7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDsrK2Upe3ZhciBmPWFbZV07aWYoIWYuamEmJmYubGlzdGVuZXI9PWImJmYuY2FwdHVyZT09ISFjJiZmLnBhPT1kKXJldHVybiBlfXJldHVybi0xfTt2YXIgcWI9ImNsb3N1cmVfbG1fIisoTWF0aC5yYW5kb20oKSoxRTZ8MCkscmI9e30sc2I9MCx1Yj1mdW5jdGlvbihhLGIsYyxkLGUpe2lmKGQmJmQub25jZSlyZXR1cm4gdGIoYSxiLGMsZCxlKTtpZihBcnJheS5pc0FycmF5KGIpKXtmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKyl1YihhLGJbZl0sYyxkLGUpO3JldHVybiBudWxsfWM9dmIoYyk7cmV0dXJuIGliKGEpP3diKGEsYixjLG0oZCk/ISFkLmNhcHR1cmU6ISFkLGUpOnhiKGEsYixjLCExLGQsZSl9LHhiPWZ1bmN0aW9uKGEsYixjLGQsZSxmKXtpZighYil0aHJvdyBFcnJvcigiSW52YWxpZCBldmVudCB0eXBlIik7dmFyIGg9bShlKT8hIWUuY2FwdHVyZTohIWUsaz15YihhKTtrfHwoYVtxYl09az1uZXcgbWIoYSkpO2M9ay5hZGQoYixjLGQsaCxmKTtpZihjLnByb3h5KXJldHVybiBjO2Q9emIoKTtjLnByb3h5PWQ7ZC5zcmM9YTtkLmxpc3RlbmVyPWM7aWYoYS5hZGRFdmVudExpc3RlbmVyKWdifHwoZT1oKSxlPT09dm9pZCAwJiYKKGU9ITEpLGEuYWRkRXZlbnRMaXN0ZW5lcihiLnRvU3RyaW5nKCksZCxlKTtlbHNlIGlmKGEuYXR0YWNoRXZlbnQpYS5hdHRhY2hFdmVudChBYihiLnRvU3RyaW5nKCkpLGQpO2Vsc2UgaWYoYS5hZGRMaXN0ZW5lciYmYS5yZW1vdmVMaXN0ZW5lcilwKGI9PT0iY2hhbmdlIiwiTWVkaWFRdWVyeUxpc3Qgb25seSBoYXMgYSBjaGFuZ2UgZXZlbnQiKSxhLmFkZExpc3RlbmVyKGQpO2Vsc2UgdGhyb3cgRXJyb3IoImFkZEV2ZW50TGlzdGVuZXIgYW5kIGF0dGFjaEV2ZW50IGFyZSB1bmF2YWlsYWJsZS4iKTtzYisrO3JldHVybiBjfSx6Yj1mdW5jdGlvbigpe3ZhciBhPUJiLGI9ZnVuY3Rpb24oYyl7cmV0dXJuIGEuY2FsbChiLnNyYyxiLmxpc3RlbmVyLGMpfTtyZXR1cm4gYn0sdGI9ZnVuY3Rpb24oYSxiLGMsZCxlKXtpZihBcnJheS5pc0FycmF5KGIpKXtmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKyl0YihhLGJbZl0sYyxkLGUpO3JldHVybiBudWxsfWM9dmIoYyk7cmV0dXJuIGliKGEpPwphLkEuYWRkKFN0cmluZyhiKSxjLCEwLG0oZCk/ISFkLmNhcHR1cmU6ISFkLGUpOnhiKGEsYixjLCEwLGQsZSl9LENiPWZ1bmN0aW9uKGEsYixjLGQsZSl7aWYoQXJyYXkuaXNBcnJheShiKSlmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKylDYihhLGJbZl0sYyxkLGUpO2Vsc2UgZD1tKGQpPyEhZC5jYXB0dXJlOiEhZCxjPXZiKGMpLGliKGEpPyhhPWEuQSxiPVN0cmluZyhiKS50b1N0cmluZygpLGIgaW4gYS5nJiYoZj1hLmdbYl0sYz1uYihmLGMsZCxlKSxjPi0xJiYobGIoZltjXSkscChmLmxlbmd0aCE9bnVsbCksQXJyYXkucHJvdG90eXBlLnNwbGljZS5jYWxsKGYsYywxKSxmLmxlbmd0aD09MCYmKGRlbGV0ZSBhLmdbYl0sYS5oLS0pKSkpOmEmJihhPXliKGEpKSYmKGM9cGIoYSxiLGMsZCxlKSkmJkEoYyl9LEE9ZnVuY3Rpb24oYSl7aWYodHlwZW9mIGEhPT0ibnVtYmVyIiYmYSYmIWEuamEpe3ZhciBiPWEuc3JjO2lmKGliKGIpKW9iKGIuQSxhKTtlbHNle3ZhciBjPWEudHlwZSwKZD1hLnByb3h5O2IucmVtb3ZlRXZlbnRMaXN0ZW5lcj9iLnJlbW92ZUV2ZW50TGlzdGVuZXIoYyxkLGEuY2FwdHVyZSk6Yi5kZXRhY2hFdmVudD9iLmRldGFjaEV2ZW50KEFiKGMpLGQpOmIuYWRkTGlzdGVuZXImJmIucmVtb3ZlTGlzdGVuZXImJmIucmVtb3ZlTGlzdGVuZXIoZCk7c2ItLTsoYz15YihiKSk/KG9iKGMsYSksYy5oPT0wJiYoYy5zcmM9bnVsbCxiW3FiXT1udWxsKSk6bGIoYSl9fX0sQWI9ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW4gcmI/cmJbYV06cmJbYV09Im9uIithfSxCYj1mdW5jdGlvbihhLGIpe2lmKGEuamEpYT0hMDtlbHNle2I9bmV3IHooYix0aGlzKTt2YXIgYz1hLmxpc3RlbmVyLGQ9YS5wYXx8YS5zcmM7YS5vYSYmQShhKTthPWMuY2FsbChkLGIpfXJldHVybiBhfSx5Yj1mdW5jdGlvbihhKXthPWFbcWJdO3JldHVybiBhIGluc3RhbmNlb2YgbWI/YTpudWxsfSxEYj0iX19jbG9zdXJlX2V2ZW50c19mbl8iKyhNYXRoLnJhbmRvbSgpKjFFOT4+PjApLHZiPWZ1bmN0aW9uKGEpe3AoYSwKIkxpc3RlbmVyIGNhbiBub3QgYmUgbnVsbC4iKTtpZih0eXBlb2YgYT09PSJmdW5jdGlvbiIpcmV0dXJuIGE7cChhLmhhbmRsZUV2ZW50LCJBbiBvYmplY3QgbGlzdGVuZXIgbXVzdCBoYXZlIGhhbmRsZUV2ZW50IG1ldGhvZC4iKTthW0RiXXx8KGFbRGJdPWZ1bmN0aW9uKGIpe3JldHVybiBhLmhhbmRsZUV2ZW50KGIpfSk7cmV0dXJuIGFbRGJdfTt2YXIgRWI9ZnVuY3Rpb24oYSl7dy5jYWxsKHRoaXMpO3RoaXMuaD1hO3RoaXMuZz17fX07bihFYix3KTsKdmFyIEZiPVtdLEI9ZnVuY3Rpb24oYSxiLGMsZCl7QXJyYXkuaXNBcnJheShjKXx8KGMmJihGYlswXT1jLnRvU3RyaW5nKCkpLGM9RmIpO2Zvcih2YXIgZT0wO2U8Yy5sZW5ndGg7ZSsrKXt2YXIgZj11YihiLGNbZV0sZHx8YS5oYW5kbGVFdmVudCwhMSxhLmh8fGEpO2lmKCFmKWJyZWFrO2EuZ1tmLmtleV09Zn1yZXR1cm4gYX0sQz1mdW5jdGlvbihhLGIsYyxkLGUsZil7aWYoQXJyYXkuaXNBcnJheShjKSlmb3IodmFyIGg9MDtoPGMubGVuZ3RoO2grKylDKGEsYixjW2hdLGQsZSxmKTtlbHNlIGQ9ZHx8YS5oYW5kbGVFdmVudCxlPW0oZSk/ISFlLmNhcHR1cmU6ISFlLGY9Znx8YS5ofHxhLGQ9dmIoZCksZT0hIWUsYz1pYihiKT9wYihiLkEsU3RyaW5nKGMpLGQsZSxmKTpiPyhiPXliKGIpKT9wYihiLGMsZCxlLGYpOm51bGw6bnVsbCxjJiYoQShjKSxkZWxldGUgYS5nW2Mua2V5XSk7cmV0dXJuIGF9LEdiPWZ1bmN0aW9uKGEpe0JhKGEuZyxmdW5jdGlvbihiLGMpe3RoaXMuZy5oYXNPd25Qcm9wZXJ0eShjKSYmCkEoYil9LGEpO2EuZz17fX07RWIucHJvdG90eXBlLkM9ZnVuY3Rpb24oKXtFYi5sLkMuY2FsbCh0aGlzKTtHYih0aGlzKX07RWIucHJvdG90eXBlLmhhbmRsZUV2ZW50PWZ1bmN0aW9uKCl7dGhyb3cgRXJyb3IoIkV2ZW50SGFuZGxlci5oYW5kbGVFdmVudCBub3QgaW1wbGVtZW50ZWQiKTt9O3ZhciBEPWZ1bmN0aW9uKCl7dy5jYWxsKHRoaXMpO3RoaXMuQT1uZXcgbWIodGhpcyk7dGhpcy5ZYT10aGlzO3RoaXMubGE9bnVsbH07bihELHcpO0QucHJvdG90eXBlW2hiXT0hMDtELnByb3RvdHlwZS5BYT1mdW5jdGlvbihhKXt0aGlzLmxhPWF9O0QucHJvdG90eXBlLnJlbW92ZUV2ZW50TGlzdGVuZXI9ZnVuY3Rpb24oYSxiLGMsZCl7Q2IodGhpcyxhLGIsYyxkKX07CnZhciBFPWZ1bmN0aW9uKGEsYil7SGIoYSk7dmFyIGM9YS5sYTtpZihjKXt2YXIgZD1bXTtmb3IodmFyIGU9MTtjO2M9Yy5sYSlkLnB1c2goYykscCgrK2U8MUUzLCJpbmZpbml0ZSBsb29wIil9YT1hLllhO2M9Yi50eXBlfHxiO3R5cGVvZiBiPT09InN0cmluZyI/Yj1uZXcgeShiLGEpOmIgaW5zdGFuY2VvZiB5P2IudGFyZ2V0PWIudGFyZ2V0fHxhOihlPWIsYj1uZXcgeShjLGEpLEdhKGIsZSkpO2U9ITA7dmFyIGY7aWYoZClmb3IoZj1kLmxlbmd0aC0xOyFiLkEmJmY+PTA7Zi0tKXt2YXIgaD1iLnU9ZFtmXTtlPUliKGgsYywhMCxiKSYmZX1iLkF8fChoPWIudT1hLGU9SWIoaCxjLCEwLGIpJiZlLGIuQXx8KGU9SWIoaCxjLCExLGIpJiZlKSk7aWYoZClmb3IoZj0wOyFiLkEmJmY8ZC5sZW5ndGg7ZisrKWg9Yi51PWRbZl0sZT1JYihoLGMsITEsYikmJmU7cmV0dXJuIGV9OwpELnByb3RvdHlwZS5DPWZ1bmN0aW9uKCl7RC5sLkMuY2FsbCh0aGlzKTtpZih0aGlzLkEpe3ZhciBhPXRoaXMuQSxiPTAsYztmb3IoYyBpbiBhLmcpe2Zvcih2YXIgZD1hLmdbY10sZT0wO2U8ZC5sZW5ndGg7ZSsrKSsrYixsYihkW2VdKTtkZWxldGUgYS5nW2NdO2EuaC0tfX10aGlzLmxhPW51bGx9O3ZhciB3Yj1mdW5jdGlvbihhLGIsYyxkLGUpe0hiKGEpO3JldHVybiBhLkEuYWRkKFN0cmluZyhiKSxjLCExLGQsZSl9LEliPWZ1bmN0aW9uKGEsYixjLGQpe2I9YS5BLmdbU3RyaW5nKGIpXTtpZighYilyZXR1cm4hMDtiPWIuY29uY2F0KCk7Zm9yKHZhciBlPSEwLGY9MDtmPGIubGVuZ3RoOysrZil7dmFyIGg9YltmXTtpZihoJiYhaC5qYSYmaC5jYXB0dXJlPT1jKXt2YXIgaz1oLmxpc3RlbmVyLHE9aC5wYXx8aC5zcmM7aC5vYSYmb2IoYS5BLGgpO2U9ay5jYWxsKHEsZCkhPT0hMSYmZX19cmV0dXJuIGUmJiFkLmRlZmF1bHRQcmV2ZW50ZWR9LEhiPWZ1bmN0aW9uKGEpe3AoYS5BLCJFdmVudCB0YXJnZXQgaXMgbm90IGluaXRpYWxpemVkLiBEaWQgeW91IGNhbGwgdGhlIHN1cGVyY2xhc3MgKGdvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0KSBjb25zdHJ1Y3Rvcj8iKX07dmFyIEpiPXQ/Ik1velVzZXJTZWxlY3QiOnV8fFZhPyJXZWJraXRVc2VyU2VsZWN0IjpudWxsLEtiPWZ1bmN0aW9uKGEsYil7Yj1iP251bGw6YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpO2lmKEpiJiYoYS5zdHlsZSYmKGEuc3R5bGVbSmJdPSJub25lIiksYikpZm9yKHZhciBjPTA7YT1iW2NdO2MrKylhLnN0eWxlJiYoYS5zdHlsZVtKYl09Im5vbmUiKX07dmFyIExiPWZ1bmN0aW9uKCl7fTtpYShMYik7TGIucHJvdG90eXBlLmc9MDt2YXIgRj1mdW5jdGlvbihhKXtELmNhbGwodGhpcyk7dGhpcy5HPWF8fHBhfHwocGE9bmV3IGZiKTt0aGlzLnphPU1iO3RoaXMuWT1udWxsO3RoaXMucz0hMTt0aGlzLmc9bnVsbDt0aGlzLk09dm9pZCAwO3RoaXMudT10aGlzLmo9dGhpcy5oPW51bGw7dGhpcy5TYT0hMX07bihGLEQpO0YucHJvdG90eXBlLlphPUxiLlYoKTsKdmFyIE1iPW51bGwsTmI9ZnVuY3Rpb24oYSxiKXtzd2l0Y2goYSl7Y2FzZSAxOnJldHVybiBiPyJkaXNhYmxlIjoiZW5hYmxlIjtjYXNlIDI6cmV0dXJuIGI/ImhpZ2hsaWdodCI6InVuaGlnaGxpZ2h0IjtjYXNlIDQ6cmV0dXJuIGI/ImFjdGl2YXRlIjoiZGVhY3RpdmF0ZSI7Y2FzZSA4OnJldHVybiBiPyJzZWxlY3QiOiJ1bnNlbGVjdCI7Y2FzZSAxNjpyZXR1cm4gYj8iY2hlY2siOiJ1bmNoZWNrIjtjYXNlIDMyOnJldHVybiBiPyJmb2N1cyI6ImJsdXIiO2Nhc2UgNjQ6cmV0dXJuIGI/Im9wZW4iOiJjbG9zZSJ9dGhyb3cgRXJyb3IoIkludmFsaWQgY29tcG9uZW50IHN0YXRlIik7fSxPYj1mdW5jdGlvbihhKXtyZXR1cm4gYS5ZfHwoYS5ZPSI6IisoYS5aYS5nKyspLnRvU3RyaW5nKDM2KSl9LFBiPWZ1bmN0aW9uKGEsYil7aWYoYS5oJiZhLmgudSl7dmFyIGM9YS5oLnUsZD1hLlk7ZCBpbiBjJiZkZWxldGUgY1tkXTtEYShhLmgudSxiLGEpfWEuWT1ifTtGLnByb3RvdHlwZS5pPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ307CnZhciBRYj1mdW5jdGlvbihhKXthLk18fChhLk09bmV3IEViKGEpKTtyZXR1cm4gcChhLk0pfTtGLnByb3RvdHlwZS5BYT1mdW5jdGlvbihhKXtpZih0aGlzLmgmJnRoaXMuaCE9YSl0aHJvdyBFcnJvcigiTWV0aG9kIG5vdCBzdXBwb3J0ZWQiKTtGLmwuQWEuY2FsbCh0aGlzLGEpfTtGLnByb3RvdHlwZS5tYT1mdW5jdGlvbigpe3RoaXMuZz1aYSh0aGlzLkcuZywiRElWIil9O0YucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbihhKXtSYih0aGlzLGEpfTsKdmFyIFJiPWZ1bmN0aW9uKGEsYixjKXtpZihhLnMpdGhyb3cgRXJyb3IoIkNvbXBvbmVudCBhbHJlYWR5IHJlbmRlcmVkIik7YS5nfHxhLm1hKCk7Yj9iLmluc2VydEJlZm9yZShhLmcsY3x8bnVsbCk6YS5HLmcuYm9keS5hcHBlbmRDaGlsZChhLmcpO2EuaCYmIWEuaC5zfHxhLkkoKX0sU2I9ZnVuY3Rpb24oYSxiKXtpZihhLnMpdGhyb3cgRXJyb3IoIkNvbXBvbmVudCBhbHJlYWR5IHJlbmRlcmVkIik7aWYoYiYmYS53YShiKSl7YS5TYT0hMDt2YXIgYz1iYihiKTthLkcmJmEuRy5nPT1jfHwoYS5HPWI/bmV3IGZiKGJiKGIpKTpwYXx8KHBhPW5ldyBmYikpO2EuRWEoYik7YS5JKCl9ZWxzZSB0aHJvdyBFcnJvcigiSW52YWxpZCBlbGVtZW50IHRvIGRlY29yYXRlIik7fTtnPUYucHJvdG90eXBlO2cud2E9ZnVuY3Rpb24oKXtyZXR1cm4hMH07Zy5FYT1mdW5jdGlvbihhKXt0aGlzLmc9YX07CmcuST1mdW5jdGlvbigpe3RoaXMucz0hMDtUYih0aGlzLGZ1bmN0aW9uKGEpeyFhLnMmJmEuaSgpJiZhLkkoKX0pfTtnLlU9ZnVuY3Rpb24oKXtUYih0aGlzLGZ1bmN0aW9uKGEpe2EucyYmYS5VKCl9KTt0aGlzLk0mJkdiKHRoaXMuTSk7dGhpcy5zPSExfTtnLkM9ZnVuY3Rpb24oKXt0aGlzLnMmJnRoaXMuVSgpO3RoaXMuTSYmKHRoaXMuTS5kaXNwb3NlKCksZGVsZXRlIHRoaXMuTSk7VGIodGhpcyxmdW5jdGlvbihhKXthLmRpc3Bvc2UoKX0pOyF0aGlzLlNhJiZ0aGlzLmcmJiRhKHRoaXMuZyk7dGhpcy5oPXRoaXMuZz10aGlzLnU9dGhpcy5qPW51bGw7Ri5sLkMuY2FsbCh0aGlzKX07Zy5CYT1mdW5jdGlvbihhLGIpe3RoaXMuQ2EoYSxIKHRoaXMpLGIpfTsKZy5DYT1mdW5jdGlvbihhLGIsYyl7cCghIWEsIlByb3ZpZGVkIGVsZW1lbnQgbXVzdCBub3QgYmUgbnVsbC4iKTtpZihhLnMmJihjfHwhdGhpcy5zKSl0aHJvdyBFcnJvcigiQ29tcG9uZW50IGFscmVhZHkgcmVuZGVyZWQiKTtpZihiPDB8fGI+SCh0aGlzKSl0aHJvdyBFcnJvcigiQ2hpbGQgY29tcG9uZW50IGluZGV4IG91dCBvZiBib3VuZHMiKTt0aGlzLnUmJnRoaXMuanx8KHRoaXMudT17fSx0aGlzLmo9W10pO2lmKGEuaD09dGhpcyl7dmFyIGQ9dGhpcy51LGU9T2IoYSk7ZFtlXT1hO3hhKHRoaXMuaixhKX1lbHNlIERhKHRoaXMudSxPYihhKSxhKTtpZihhPT10aGlzKXRocm93IEVycm9yKCJVbmFibGUgdG8gc2V0IHBhcmVudCBjb21wb25lbnQiKTtpZihkPXRoaXMmJmEuaCYmYS5ZKWU9YS5oLGQ9YS5ZLGUudSYmZD8oZT1lLnUsZD0oZSE9PW51bGwmJmQgaW4gZT9lW2RdOnZvaWQgMCl8fG51bGwpOmQ9bnVsbDtpZihkJiZhLmghPXRoaXMpdGhyb3cgRXJyb3IoIlVuYWJsZSB0byBzZXQgcGFyZW50IGNvbXBvbmVudCIpOwphLmg9dGhpcztGLmwuQWEuY2FsbChhLHRoaXMpO3phKHRoaXMuaixiLDAsYSk7YS5zJiZ0aGlzLnMmJmEuaD09dGhpcz8oYz10aGlzLm5hKCksKGMuY2hpbGROb2Rlc1tiXXx8bnVsbCkhPWEuaSgpJiYoYS5pKCkucGFyZW50RWxlbWVudD09YyYmYy5yZW1vdmVDaGlsZChhLmkoKSksYj1jLmNoaWxkTm9kZXNbYl18fG51bGwsYy5pbnNlcnRCZWZvcmUoYS5pKCksYikpKTpjPyh0aGlzLmd8fHRoaXMubWEoKSxiPUkodGhpcyxiKzEpLFJiKGEsdGhpcy5uYSgpLGI/Yi5nOm51bGwpKTp0aGlzLnMmJiFhLnMmJmEuZyYmYS5nLnBhcmVudE5vZGUmJmEuZy5wYXJlbnROb2RlLm5vZGVUeXBlPT0xJiZhLkkoKX07Zy5uYT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmd9Owp2YXIgVWI9ZnVuY3Rpb24oYSl7aWYoYS56YT09bnVsbCl7dmFyIGI9YS5zP2EuZzphLkcuZy5ib2R5O2E6e3ZhciBjPWJiKGIpO2lmKGMuZGVmYXVsdFZpZXcmJmMuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSYmKGM9Yy5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKGIsbnVsbCkpKXtjPWMuZGlyZWN0aW9ufHxjLmdldFByb3BlcnR5VmFsdWUoImRpcmVjdGlvbiIpfHwiIjticmVhayBhfWM9IiJ9YS56YT0icnRsIj09KGN8fChiLmN1cnJlbnRTdHlsZT9iLmN1cnJlbnRTdHlsZS5kaXJlY3Rpb246bnVsbCl8fGIuc3R5bGUmJmIuc3R5bGUuZGlyZWN0aW9uKX1yZXR1cm4gYS56YX0sSD1mdW5jdGlvbihhKXtyZXR1cm4gYS5qP2Euai5sZW5ndGg6MH0sST1mdW5jdGlvbihhLGIpe3JldHVybiBhLmo/YS5qW2JdfHxudWxsOm51bGx9LFRiPWZ1bmN0aW9uKGEsYixjKXthLmomJmEuai5mb3JFYWNoKGIsYyl9LFZiPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuaiYmYj9hLmouaW5kZXhPZihiKToKLTF9O3ZhciBXYj17bWI6ImFjdGl2ZWRlc2NlbmRhbnQiLHJiOiJhdG9taWMiLHNiOiJhdXRvY29tcGxldGUiLHViOiJidXN5Iix4YjoiY2hlY2tlZCIseWI6ImNvbGluZGV4IixEYjoiY29udHJvbHMiLEViOiJjdXJyZW50IixHYjoiZGVzY3JpYmVkYnkiLEpiOiJkaXNhYmxlZCIsTGI6ImRyb3BlZmZlY3QiLE1iOiJleHBhbmRlZCIsTmI6ImZsb3d0byIsUGI6ImdyYWJiZWQiLFRiOiJoYXNwb3B1cCIsVmI6ImhpZGRlbiIsWGI6ImludmFsaWQiLFliOiJsYWJlbCIsWmI6ImxhYmVsbGVkYnkiLGFjOiJsZXZlbCIsZmM6ImxpdmUiLHZjOiJtdWx0aWxpbmUiLHdjOiJtdWx0aXNlbGVjdGFibGUiLEFjOiJvcmllbnRhdGlvbiIsQmM6Im93bnMiLENjOiJwb3NpbnNldCIsRWM6InByZXNzZWQiLEljOiJyZWFkb25seSIsS2M6InJlbGV2YW50IixMYzoicmVxdWlyZWQiLFBjOiJyb3dpbmRleCIsU2M6InNlbGVjdGVkIixVYzoic2V0c2l6ZSIsV2M6InNvcnQiLG1kOiJ2YWx1ZW1heCIsbmQ6InZhbHVlbWluIiwKb2Q6InZhbHVlbm93IixwZDoidmFsdWV0ZXh0In07dmFyIFhiO3ZhciBZYj17bmI6ImFsZXJ0IixvYjoiYWxlcnRkaWFsb2ciLHBiOiJhcHBsaWNhdGlvbiIscWI6ImFydGljbGUiLHRiOiJiYW5uZXIiLHZiOiJidXR0b24iLHdiOiJjaGVja2JveCIsemI6ImNvbHVtbmhlYWRlciIsQWI6ImNvbWJvYm94IixCYjoiY29tcGxlbWVudGFyeSIsQ2I6ImNvbnRlbnRpbmZvIixGYjoiZGVmaW5pdGlvbiIsSGI6ImRpYWxvZyIsSWI6ImRpcmVjdG9yeSIsS2I6ImRvY3VtZW50IixPYjoiZm9ybSIsUWI6ImdyaWQiLFJiOiJncmlkY2VsbCIsU2I6Imdyb3VwIixVYjoiaGVhZGluZyIsV2I6ImltZyIsYmM6ImxpbmsiLGNjOiJsaXN0IixkYzoibGlzdGJveCIsZWM6Imxpc3RpdGVtIixoYzoibG9nIixpYzoibWFpbiIsamM6Im1hcnF1ZWUiLGtjOiJtYXRoIixsYzoibWVudSIsbWM6Im1lbnViYXIiLG5jOiJtZW51aXRlbSIsb2M6Im1lbnVpdGVtY2hlY2tib3giLHBjOiJtZW51aXRlbXJhZGlvIix4YzoibmF2aWdhdGlvbiIseWM6Im5vdGUiLHpjOiJvcHRpb24iLApEYzoicHJlc2VudGF0aW9uIixGYzoicHJvZ3Jlc3NiYXIiLEdjOiJyYWRpbyIsSGM6InJhZGlvZ3JvdXAiLEpjOiJyZWdpb24iLE1jOiJyb3ciLE5jOiJyb3dncm91cCIsT2M6InJvd2hlYWRlciIsUWM6InNjcm9sbGJhciIsUmM6InNlYXJjaCIsVGM6InNlcGFyYXRvciIsVmM6InNsaWRlciIsWGM6InNwaW5idXR0b24iLFljOiJzdGF0dXMiLFpjOiJzd2l0Y2giLGFkOiJ0YWIiLGJkOiJ0YWJsaXN0IixjZDoidGFicGFuZWwiLGRkOiJ0ZXh0Ym94IixlZDoidGV4dGluZm8iLGZkOiJ0aW1lciIsZ2Q6InRvb2xiYXIiLGhkOiJ0b29sdGlwIixqZDoidHJlZSIsa2Q6InRyZWVncmlkIixsZDoidHJlZWl0ZW0ifTt2YXIgWmI9ZnVuY3Rpb24oYSxiKXtiPyhwKENhKFliLGIpLCJObyBzdWNoIEFSSUEgcm9sZSAiK2IpLGEuc2V0QXR0cmlidXRlKCJyb2xlIixiKSk6YS5yZW1vdmVBdHRyaWJ1dGUoInJvbGUiKX0sYWM9ZnVuY3Rpb24oYSxiLGMpe0FycmF5LmlzQXJyYXkoYykmJihjPWMuam9pbigiICIpKTt2YXIgZD0kYihiKTtjPT09IiJ8fGM9PXZvaWQgMD8oWGJ8fChjPXt9LFhiPShjLmF0b21pYz0hMSxjLmF1dG9jb21wbGV0ZT0ibm9uZSIsYy5kcm9wZWZmZWN0PSJub25lIixjLmhhc3BvcHVwPSExLGMubGl2ZT0ib2ZmIixjLm11bHRpbGluZT0hMSxjLm11bHRpc2VsZWN0YWJsZT0hMSxjLm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIsYy5yZWFkb25seT0hMSxjLnJlbGV2YW50PSJhZGRpdGlvbnMgdGV4dCIsYy5yZXF1aXJlZD0hMSxjLnNvcnQ9Im5vbmUiLGMuYnVzeT0hMSxjLmRpc2FibGVkPSExLGMuaGlkZGVuPSExLGMuaW52YWxpZD0iZmFsc2UiLGMpKSxjPVhiLGIgaW4gYz9hLnNldEF0dHJpYnV0ZShkLApjW2JdKTphLnJlbW92ZUF0dHJpYnV0ZShkKSk6YS5zZXRBdHRyaWJ1dGUoZCxjKX0sJGI9ZnVuY3Rpb24oYSl7cChhLCJBUklBIGF0dHJpYnV0ZSBjYW5ub3QgYmUgZW1wdHkuIik7cChDYShXYixhKSwiTm8gc3VjaCBBUklBIGF0dHJpYnV0ZSAiK2EpO3JldHVybiJhcmlhLSIrYX07dmFyIGRjPWZ1bmN0aW9uKGEsYixjLGQsZSxmKXtpZih2JiZlKXJldHVybiBiYyhhKTtpZihlJiYhZClyZXR1cm4hMTtpZighdCl7dHlwZW9mIGI9PT0ibnVtYmVyIiYmKGI9Y2MoYikpO3ZhciBoPWI9PTE3fHxiPT0xOHx8diYmYj09OTE7aWYoKCFjfHx2KSYmaHx8diYmYj09MTYmJihkfHxmKSlyZXR1cm4hMX1pZih1JiZkJiZjKXN3aXRjaChhKXtjYXNlIDIyMDpjYXNlIDIxOTpjYXNlIDIyMTpjYXNlIDE5MjpjYXNlIDE4NjpjYXNlIDE4OTpjYXNlIDE4NzpjYXNlIDE4ODpjYXNlIDE5MDpjYXNlIDE5MTpjYXNlIDE5MjpjYXNlIDIyMjpyZXR1cm4hMX1zd2l0Y2goYSl7Y2FzZSAxMzpyZXR1cm4gdD9mfHxlPyExOiEoYyYmZCk6ITA7Y2FzZSAyNzpyZXR1cm4hdSYmIXR9cmV0dXJuIHQmJihkfHxlfHxmKT8hMTpiYyhhKX0sYmM9ZnVuY3Rpb24oYSl7aWYoYT49NDgmJmE8PTU3fHxhPj05NiYmYTw9MTA2fHxhPj02NSYmYTw9OTB8fHUmJmE9PTApcmV0dXJuITA7c3dpdGNoKGEpe2Nhc2UgMzI6Y2FzZSA0MzpjYXNlIDYzOmNhc2UgNjQ6Y2FzZSAxMDc6Y2FzZSAxMDk6Y2FzZSAxMTA6Y2FzZSAxMTE6Y2FzZSAxODY6Y2FzZSA1OTpjYXNlIDE4OTpjYXNlIDE4NzpjYXNlIDYxOmNhc2UgMTg4OmNhc2UgMTkwOmNhc2UgMTkxOmNhc2UgMTkyOmNhc2UgMjIyOmNhc2UgMjE5OmNhc2UgMjIwOmNhc2UgMjIxOmNhc2UgMTYzOmNhc2UgNTg6cmV0dXJuITA7CmNhc2UgMTczOmNhc2UgMTcxOnJldHVybiB0O2RlZmF1bHQ6cmV0dXJuITF9fSxjYz1mdW5jdGlvbihhKXtpZih0KWE9ZWMoYSk7ZWxzZSBpZih2JiZ1KXN3aXRjaChhKXtjYXNlIDkzOmE9OTF9cmV0dXJuIGF9LGVjPWZ1bmN0aW9uKGEpe3N3aXRjaChhKXtjYXNlIDYxOnJldHVybiAxODc7Y2FzZSA1OTpyZXR1cm4gMTg2O2Nhc2UgMTczOnJldHVybiAxODk7Y2FzZSAyMjQ6cmV0dXJuIDkxO2Nhc2UgMDpyZXR1cm4gMjI0O2RlZmF1bHQ6cmV0dXJuIGF9fTt2YXIgZmM9ZnVuY3Rpb24oYSxiLGMsZCl7ei5jYWxsKHRoaXMsZCk7dGhpcy50eXBlPSJrZXkiO3RoaXMuZz1hO3RoaXMucmVwZWF0PWN9O24oZmMseik7dmFyIEo9ZnVuY3Rpb24oYSxiKXtELmNhbGwodGhpcyk7YSYmZ2ModGhpcyxhLGIpfTtuKEosRCk7Zz1KLnByb3RvdHlwZTtnLlI9bnVsbDtnLnFhPW51bGw7Zy5KYT1udWxsO2cucmE9bnVsbDtnLkY9LTE7Zy5LPS0xO2cuRGE9ITE7CnZhciBoYz17MzoxMywxMjoxNDQsNjMyMzI6MzgsNjMyMzM6NDAsNjMyMzQ6MzcsNjMyMzU6MzksNjMyMzY6MTEyLDYzMjM3OjExMyw2MzIzODoxMTQsNjMyMzk6MTE1LDYzMjQwOjExNiw2MzI0MToxMTcsNjMyNDI6MTE4LDYzMjQzOjExOSw2MzI0NDoxMjAsNjMyNDU6MTIxLDYzMjQ2OjEyMiw2MzI0NzoxMjMsNjMyNDg6NDQsNjMyNzI6NDYsNjMyNzM6MzYsNjMyNzU6MzUsNjMyNzY6MzMsNjMyNzc6MzQsNjMyODk6MTQ0LDYzMzAyOjQ1fSxpYz17VXA6MzgsRG93bjo0MCxMZWZ0OjM3LFJpZ2h0OjM5LEVudGVyOjEzLEYxOjExMixGMjoxMTMsRjM6MTE0LEY0OjExNSxGNToxMTYsRjY6MTE3LEY3OjExOCxGODoxMTksRjk6MTIwLEYxMDoxMjEsRjExOjEyMixGMTI6MTIzLCJVKzAwN0YiOjQ2LEhvbWU6MzYsRW5kOjM1LFBhZ2VVcDozMyxQYWdlRG93bjozNCxJbnNlcnQ6NDV9LGpjPXYmJnQ7CkoucHJvdG90eXBlLmc9ZnVuY3Rpb24oYSl7dSYmKHRoaXMuRj09MTcmJiFhLmN0cmxLZXl8fHRoaXMuRj09MTgmJiFhLmFsdEtleXx8diYmdGhpcy5GPT05MSYmIWEubWV0YUtleSkmJih0aGlzLks9dGhpcy5GPS0xKTt0aGlzLkY9PS0xJiYoYS5jdHJsS2V5JiZhLmchPTE3P3RoaXMuRj0xNzphLmFsdEtleSYmYS5nIT0xOD90aGlzLkY9MTg6YS5tZXRhS2V5JiZhLmchPTkxJiYodGhpcy5GPTkxKSk7ZGMoYS5nLHRoaXMuRixhLnNoaWZ0S2V5LGEuY3RybEtleSxhLmFsdEtleSxhLm1ldGFLZXkpPyh0aGlzLks9Y2MoYS5nKSxqYyYmKHRoaXMuRGE9YS5hbHRLZXkpKTp0aGlzLmhhbmRsZUV2ZW50KGEpfTtKLnByb3RvdHlwZS5oPWZ1bmN0aW9uKGEpe3RoaXMuSz10aGlzLkY9LTE7dGhpcy5EYT1hLmFsdEtleX07CkoucHJvdG90eXBlLmhhbmRsZUV2ZW50PWZ1bmN0aW9uKGEpe3ZhciBiPWEuaCxjPWIuYWx0S2V5O2lmKHUmJmEudHlwZT09ImtleXByZXNzIil7dmFyIGQ9dGhpcy5LO3ZhciBlPWIuY2hhckNvZGU+PTAmJmIuY2hhckNvZGU8NjMyMzImJmJjKGQpP2IuY2hhckNvZGU6MH1lbHNlIGEudHlwZT09ImtleXByZXNzIj8oamMmJihjPXRoaXMuRGEpLGIua2V5Q29kZT09Yi5jaGFyQ29kZT9iLmtleUNvZGU8MzI/KGQ9Yi5rZXlDb2RlLGU9MCk6KGQ9dGhpcy5LLGU9Yi5jaGFyQ29kZSk6KGQ9Yi5rZXlDb2RlfHx0aGlzLkssZT1iLmNoYXJDb2RlfHwwKSk6KGQ9Yi5rZXlDb2RlfHx0aGlzLkssZT1iLmNoYXJDb2RlfHwwKSx2JiZlPT02MyYmZD09MjI0JiYoZD0xOTEpO3ZhciBmPWQ9Y2MoZCk7ZD9kPj02MzIzMiYmZCBpbiBoYz9mPWhjW2RdOmQ9PTI1JiZhLnNoaWZ0S2V5JiYoZj05KTpiLmtleUlkZW50aWZpZXImJmIua2V5SWRlbnRpZmllciBpbiBpYyYmKGY9aWNbYi5rZXlJZGVudGlmaWVyXSk7CmlmKCF0fHxhLnR5cGUhPSJrZXlwcmVzcyJ8fGRjKGYsdGhpcy5GLGEuc2hpZnRLZXksYS5jdHJsS2V5LGMsYS5tZXRhS2V5KSlhPWY9PXRoaXMuRix0aGlzLkY9ZixiPW5ldyBmYyhmLGUsYSxiKSxiLmFsdEtleT1jLEUodGhpcyxiKX07Si5wcm90b3R5cGUuaT1mdW5jdGlvbigpe3JldHVybiB0aGlzLlJ9O3ZhciBnYz1mdW5jdGlvbihhLGIsYyl7YS5yYSYma2MoYSk7YS5SPWI7YS5xYT11YihhLlIsImtleXByZXNzIixhLGMpO2EuSmE9dWIoYS5SLCJrZXlkb3duIixhLmcsYyxhKTthLnJhPXViKGEuUiwia2V5dXAiLGEuaCxjLGEpfSxrYz1mdW5jdGlvbihhKXthLnFhJiYoQShhLnFhKSxBKGEuSmEpLEEoYS5yYSksYS5xYT1udWxsLGEuSmE9bnVsbCxhLnJhPW51bGwpO2EuUj1udWxsO2EuRj0tMTthLks9LTF9O0oucHJvdG90eXBlLkM9ZnVuY3Rpb24oKXtKLmwuQy5jYWxsKHRoaXMpO2tjKHRoaXMpfTt2YXIgSz17Z2E6Im1vdXNlZG93biIsaGE6Im1vdXNldXAiLGZhOiJtb3VzZWNhbmNlbCIsc2M6Im1vdXNlbW92ZSIsdWM6Im1vdXNlb3ZlciIsdGM6Im1vdXNlb3V0IixxYzoibW91c2VlbnRlciIscmM6Im1vdXNlbGVhdmUifTt2YXIgbGM9ZnVuY3Rpb24oYSl7cmV0dXJuIHR5cGVvZiBhLmNsYXNzTmFtZT09InN0cmluZyI/YS5jbGFzc05hbWU6YS5nZXRBdHRyaWJ1dGUmJmEuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIn0sTD1mdW5jdGlvbihhKXtyZXR1cm4gYS5jbGFzc0xpc3Q/YS5jbGFzc0xpc3Q6bGMoYSkubWF0Y2goL1xTKy9nKXx8W119LG1jPWZ1bmN0aW9uKGEsYil7dHlwZW9mIGEuY2xhc3NOYW1lPT0ic3RyaW5nIj9hLmNsYXNzTmFtZT1iOmEuc2V0QXR0cmlidXRlJiZhLnNldEF0dHJpYnV0ZSgiY2xhc3MiLGIpfSxuYz1mdW5jdGlvbihhLGIpe2EuY2xhc3NMaXN0P2I9YS5jbGFzc0xpc3QuY29udGFpbnMoYik6KGE9TChhKSxiPXZhKGEsYik+PTApO3JldHVybiBifSxvYz1mdW5jdGlvbihhLGIpe2lmKGEuY2xhc3NMaXN0KWEuY2xhc3NMaXN0LmFkZChiKTtlbHNlIGlmKCFuYyhhLGIpKXt2YXIgYz1sYyhhKTttYyhhLGMrKGMubGVuZ3RoPjA/IiAiK2I6YikpfX0scGM9ZnVuY3Rpb24oYSxiKXtpZihhLmNsYXNzTGlzdClBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGIsCmZ1bmN0aW9uKGUpe29jKGEsZSl9KTtlbHNle3ZhciBjPXt9O0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoTChhKSxmdW5jdGlvbihlKXtjW2VdPSEwfSk7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChiLGZ1bmN0aW9uKGUpe2NbZV09ITB9KTtiPSIiO2Zvcih2YXIgZCBpbiBjKWIrPWIubGVuZ3RoPjA/IiAiK2Q6ZDttYyhhLGIpfX0scWM9ZnVuY3Rpb24oYSxiKXthLmNsYXNzTGlzdD9hLmNsYXNzTGlzdC5yZW1vdmUoYik6bmMoYSxiKSYmbWMoYSxBcnJheS5wcm90b3R5cGUuZmlsdGVyLmNhbGwoTChhKSxmdW5jdGlvbihjKXtyZXR1cm4gYyE9Yn0pLmpvaW4oIiAiKSl9LHJjPWZ1bmN0aW9uKGEsYil7YS5jbGFzc0xpc3Q/QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChiLGZ1bmN0aW9uKGMpe3FjKGEsYyl9KTptYyhhLEFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbChMKGEpLGZ1bmN0aW9uKGMpe3JldHVybiEodmEoYixjKT49MCl9KS5qb2luKCIgIikpfTt2YXIgdGM9ZnVuY3Rpb24oYSxiKXtpZighYSl0aHJvdyBFcnJvcigiSW52YWxpZCBjbGFzcyBuYW1lICIrYSk7aWYodHlwZW9mIGIhPT0iZnVuY3Rpb24iKXRocm93IEVycm9yKCJJbnZhbGlkIGRlY29yYXRvciBmdW5jdGlvbiAiK2IpO3NjW2FdPWJ9LHVjPXt9LHNjPXt9O3ZhciB2Yz1mdW5jdGlvbihhKXt0aGlzLkE9YX07aWEodmMpO3ZhciB3Yz1mdW5jdGlvbihhLGIpe2EmJihhLnRhYkluZGV4PWI/MDotMSl9LHljPWZ1bmN0aW9uKGEsYixjKXtjLmlkJiZQYihiLGMuaWQpO3ZhciBkPWEuZygpLGU9ITEsZj1MKGMpO2YmJkFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoZixmdW5jdGlvbihoKXtoPT1kP2U9ITA6aCYmdGhpcy51KGIsaCxkKX0sYSk7ZXx8b2MoYyxkKTt4YyhiLGMpO3JldHVybiBjfTt2Yy5wcm90b3R5cGUudT1mdW5jdGlvbihhLGIsYyl7Yj09YysiLWRpc2FibGVkIj9hLlgoITEpOmI9PWMrIi1ob3Jpem9udGFsIj96YyhhLCJob3Jpem9udGFsIik6Yj09YysiLXZlcnRpY2FsIiYmemMoYSwidmVydGljYWwiKX07CnZhciB4Yz1mdW5jdGlvbihhLGIpe2lmKGIpZm9yKHZhciBjPWIuZmlyc3RDaGlsZCxkO2MmJmMucGFyZW50Tm9kZT09Yjspe2Q9Yy5uZXh0U2libGluZztpZihjLm5vZGVUeXBlPT0xKXthOnt2YXIgZT1jO3AoZSk7ZT1MKGUpO2Zvcih2YXIgZj1lLmxlbmd0aCxoPTA7aDxmO2grKyl7dmFyIGs9ZVtoXTtpZihrPWsgaW4gc2M/c2Nba10oKTpudWxsKXtlPWs7YnJlYWsgYX19ZT1udWxsfWUmJihlLmc9YyxhLmlzRW5hYmxlZCgpfHxlLlgoITEpLGEuQmEoZSksU2IoZSxjKSl9ZWxzZSBjLm5vZGVWYWx1ZSYmSGEoYy5ub2RlVmFsdWUpIT0iInx8Yi5yZW1vdmVDaGlsZChjKTtjPWR9fSxBYz1mdW5jdGlvbihhLGIpe2I9Yi5pKCk7cChiLCJUaGUgY29udGFpbmVyIERPTSBlbGVtZW50IGNhbm5vdCBiZSBudWxsLiIpO0tiKGIsdCk7KGE9YS5BKSYmWmIoYixhKX07dmMucHJvdG90eXBlLmc9ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy1jb250YWluZXIifTsKdmMucHJvdG90eXBlLmo9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nKCksYz1bYixhLkw9PSJob3Jpem9udGFsIj9iKyItaG9yaXpvbnRhbCI6YisiLXZlcnRpY2FsIl07YS5pc0VuYWJsZWQoKXx8Yy5wdXNoKGIrIi1kaXNhYmxlZCIpO3JldHVybiBjfTt2YXIgQmM9ZnVuY3Rpb24oKXt9O3ZhciBNPWZ1bmN0aW9uKCl7fSxDYztpYShNKTt2YXIgRGM9e2J1dHRvbjoicHJlc3NlZCIsY2hlY2tib3g6ImNoZWNrZWQiLG1lbnVpdGVtOiJzZWxlY3RlZCIsbWVudWl0ZW1jaGVja2JveDoiY2hlY2tlZCIsbWVudWl0ZW1yYWRpbzoiY2hlY2tlZCIscmFkaW86ImNoZWNrZWQiLHRhYjoic2VsZWN0ZWQiLHRyZWVpdGVtOiJzZWxlY3RlZCJ9O00ucHJvdG90eXBlLk5hPWZ1bmN0aW9uKCl7fTtNLnByb3RvdHlwZS54YT1mdW5jdGlvbihhKXt2YXIgYj1hLkcsYz1iLmgsZD10aGlzLk4oKSxlPVtkXSxmPXRoaXMuTigpO2YhPWQmJmUucHVzaChmKTtkPWEubTtmb3IoZj1bXTtkOyl7dmFyIGg9ZCYtZDtmLnB1c2goRWModGhpcyxoKSk7ZCY9fmh9ZS5wdXNoLmFwcGx5KGUsZik7KGQ9YS5GYSkmJmUucHVzaC5hcHBseShlLGQpO3JldHVybiBjLmNhbGwoYiwiRElWIixlLmpvaW4oIiAiKSxhLmlhKX07Ck0ucHJvdG90eXBlLnlhPWZ1bmN0aW9uKGEsYil7Yi5pZCYmUGIoYSxiLmlkKTtiJiZiLmZpcnN0Q2hpbGQ/RmMoYSxiLmZpcnN0Q2hpbGQubmV4dFNpYmxpbmc/eWEoYi5jaGlsZE5vZGVzKTpiLmZpcnN0Q2hpbGQpOmEuaWE9bnVsbDt2YXIgYz0wLGQ9dGhpcy5OKCksZT10aGlzLk4oKSxmPSExLGg9ITEsaz15YShMKGIpKTtrLmZvckVhY2goZnVuY3Rpb24ocSl7Znx8cSE9ZD9ofHxxIT1lP2N8PUdjKHRoaXMscSk6aD0hMDooZj0hMCxlPT1kJiYoaD0hMCkpO0djKHRoaXMscSk9PTEmJihzYShiKSxkYihiKSYmZWIoYikmJmNiKGIsITEpKX0sdGhpcyk7YS5tPWM7Znx8KGsucHVzaChkKSxlPT1kJiYoaD0hMCkpO2h8fGsucHVzaChlKTsoYT1hLkZhKSYmay5wdXNoLmFwcGx5KGssYSk7ZiYmaCYmIWF8fG1jKGIsay5qb2luKCIgIikpO3JldHVybiBifTsKdmFyIEhjPWZ1bmN0aW9uKGEsYil7aWYoYT1hLk5hKCkpe3AoYiwiVGhlIGVsZW1lbnQgcGFzc2VkIGFzIGEgZmlyc3QgcGFyYW1ldGVyIGNhbm5vdCBiZSBudWxsLiIpO3ZhciBjPWIuZ2V0QXR0cmlidXRlKCJyb2xlIil8fG51bGw7YSE9YyYmWmIoYixhKX19LEljPWZ1bmN0aW9uKGEsYil7dmFyIGM7aWYoYS5EJjMyJiYoYz1hLmkoKSkpe2lmKCFiJiZhLm0mMzIpe3RyeXtjLmJsdXIoKX1jYXRjaChkKXt9YS5tJjMyJiZhLlFhKG51bGwpfShkYihjKSYmZWIoYykpIT1iJiZjYihjLGIpfX0sSmM9ZnVuY3Rpb24oYSxiLGMpe0NjfHwoQ2M9ezE6ImRpc2FibGVkIiw4OiJzZWxlY3RlZCIsMTY6ImNoZWNrZWQiLDY0OiJleHBhbmRlZCJ9KTtwKGEsIlRoZSBlbGVtZW50IHBhc3NlZCBhcyBhIGZpcnN0IHBhcmFtZXRlciBjYW5ub3QgYmUgbnVsbC4iKTtiPUNjW2JdO3ZhciBkPWEuZ2V0QXR0cmlidXRlKCJyb2xlIil8fG51bGw7ZCYmKGQ9RGNbZF18fGIsYj1iPT0iY2hlY2tlZCJ8fGI9PQoic2VsZWN0ZWQiP2Q6Yik7YiYmYWMoYSxiLGMpfTtNLnByb3RvdHlwZS5OPWZ1bmN0aW9uKCl7cmV0dXJuImdvb2ctY29udHJvbCJ9O3ZhciBFYz1mdW5jdGlvbihhLGIpe2EuZ3x8S2MoYSk7cmV0dXJuIGEuZ1tiXX0sR2M9ZnVuY3Rpb24oYSxiKXthLmh8fChhLmd8fEtjKGEpLGEuaD1FYShhLmcpKTthPXBhcnNlSW50KGEuaFtiXSwxMCk7cmV0dXJuIGlzTmFOKGEpPzA6YX0sS2M9ZnVuY3Rpb24oYSl7dmFyIGI9YS5OKCk7dmFyIGM9Yi5yZXBsYWNlKC9ceGEwfFxzL2csIiAiKS5pbmRleE9mKCIgIikhPS0xO3AoIWMsIkNvbnRyb2xSZW5kZXJlciBoYXMgYW4gaW52YWxpZCBjc3MgY2xhc3M6ICciK2IrIiciKTthLmc9ezE6YisiLWRpc2FibGVkIiwyOmIrIi1ob3ZlciIsNDpiKyItYWN0aXZlIiw4OmIrIi1zZWxlY3RlZCIsMTY6YisiLWNoZWNrZWQiLDMyOmIrIi1mb2N1c2VkIiw2NDpiKyItb3BlbiJ9fTt2YXIgTj1mdW5jdGlvbihhLGIsYyl7Ri5jYWxsKHRoaXMsYyk7aWYoIWIpe2ZvcihiPXRoaXMuY29uc3RydWN0b3I7Yjspe3ZhciBkPW5hKGIpO2lmKGQ9dWNbZF0pYnJlYWs7Yj0oYj1PYmplY3QuZ2V0UHJvdG90eXBlT2YoYi5wcm90b3R5cGUpKSYmYi5jb25zdHJ1Y3Rvcn1iPWQ/dHlwZW9mIGQuVj09PSJmdW5jdGlvbiI/ZC5WKCk6bmV3IGQ6bnVsbH10aGlzLnY9Yjt0aGlzLmlhPWEhPT12b2lkIDA/YTpudWxsfTtuKE4sRik7Zz1OLnByb3RvdHlwZTtnLmlhPW51bGw7Zy5tPTA7Zy5EPTM5O2cuUD0wO2cuT2E9ITA7Zy5GYT1udWxsO2cuSGE9ITA7Zy5tYT1mdW5jdGlvbigpe3ZhciBhPXRoaXMudi54YSh0aGlzKTt0aGlzLmc9YTtIYyh0aGlzLnYsYSk7S2IoYSwhMCk7dGhpcy5pc1Zpc2libGUoKXx8KGEuc3R5bGUuZGlzcGxheT0ibm9uZSIsYSYmYWMoYSwiaGlkZGVuIiwhMCkpfTtnLm5hPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaSgpfTtnLndhPWZ1bmN0aW9uKCl7cmV0dXJuITB9OwpnLkVhPWZ1bmN0aW9uKGEpe3RoaXMuZz1hPXRoaXMudi55YSh0aGlzLGEpO0hjKHRoaXMudixhKTtLYihhLCEwKTt0aGlzLk9hPWEuc3R5bGUuZGlzcGxheSE9Im5vbmUifTsKZy5JPWZ1bmN0aW9uKCl7Ti5sLkkuY2FsbCh0aGlzKTt2YXIgYT10aGlzLmc7cChhLCJDYW4gbm90IGNhbGwgZ2V0RWxlbWVudFN0cmljdCBiZWZvcmUgcmVuZGVyaW5nL2RlY29yYXRpbmcuIik7cCh0aGlzKTtwKGEpO3RoaXMuaXNWaXNpYmxlKCl8fGFjKGEsImhpZGRlbiIsIXRoaXMuaXNWaXNpYmxlKCkpO3RoaXMuaXNFbmFibGVkKCl8fEpjKGEsMSwhdGhpcy5pc0VuYWJsZWQoKSk7dGhpcy5EJjgmJkpjKGEsOCwhISh0aGlzLm0mOCkpO3RoaXMuRCYxNiYmSmMoYSwxNiwhISh0aGlzLm0mMTYpKTt0aGlzLkQmNjQmJkpjKGEsNjQsISEodGhpcy5tJjY0KSk7dmFyIGI9dGhpcy52O1ViKHRoaXMpJiYoYT10aGlzLmkoKSxiPWIuTigpKyItcnRsIiwoYT1hLmk/YS5pKCk6YSkmJnBjKGEsW2JdKSk7dGhpcy5pc0VuYWJsZWQoKSYmSWModGhpcyx0aGlzLmlzVmlzaWJsZSgpKTt0aGlzLkQmLTImJih0aGlzLkhhJiZMYyh0aGlzLCEwKSx0aGlzLkQmMzImJihhPXRoaXMuaSgpKSkmJihiPQp0aGlzLlp8fCh0aGlzLlo9bmV3IEopLGdjKGIsYSksQihCKEIoUWIodGhpcyksYiwia2V5Iix0aGlzLmFhKSxhLCJmb2N1cyIsdGhpcy5YYSksYSwiYmx1ciIsdGhpcy5RYSkpfTt2YXIgTGM9ZnVuY3Rpb24oYSxiKXt2YXIgYz1RYihhKSxkPWEuaSgpO2I/KEIoQihCKEIoYyxkLEsuZ2EsYS5zYSksZCxbSy5oYSxLLmZhXSxhLnZhKSxkLCJtb3VzZW92ZXIiLGEudWEpLGQsIm1vdXNlb3V0IixhLnRhKSxhLmNhIT1CYyYmQihjLGQsImNvbnRleHRtZW51IixhLmNhKSk6KEMoQyhDKEMoYyxkLEsuZ2EsYS5zYSksZCxbSy5oYSxLLmZhXSxhLnZhKSxkLCJtb3VzZW92ZXIiLGEudWEpLGQsIm1vdXNlb3V0IixhLnRhKSxhLmNhIT1CYyYmQyhjLGQsImNvbnRleHRtZW51IixhLmNhKSl9O04ucHJvdG90eXBlLlU9ZnVuY3Rpb24oKXtOLmwuVS5jYWxsKHRoaXMpO3RoaXMuWiYma2ModGhpcy5aKTt0aGlzLmlzVmlzaWJsZSgpJiZ0aGlzLmlzRW5hYmxlZCgpJiZJYyh0aGlzLCExKX07Ck4ucHJvdG90eXBlLkM9ZnVuY3Rpb24oKXtOLmwuQy5jYWxsKHRoaXMpO3RoaXMuWiYmKHRoaXMuWi5kaXNwb3NlKCksZGVsZXRlIHRoaXMuWik7ZGVsZXRlIHRoaXMudjt0aGlzLkZhPXRoaXMuaWE9bnVsbH07dmFyIEZjPWZ1bmN0aW9uKGEsYil7YS5pYT1ifTtOLnByb3RvdHlwZS5pc1Zpc2libGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5PYX07Ti5wcm90b3R5cGUuaXNFbmFibGVkPWZ1bmN0aW9uKCl7cmV0dXJuISh0aGlzLm0mMSl9O04ucHJvdG90eXBlLlg9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5oO2ImJnR5cGVvZiBiLmlzRW5hYmxlZD09ImZ1bmN0aW9uIiYmIWIuaXNFbmFibGVkKCl8fCFPKHRoaXMsMSwhYSl8fChhfHwoTWModGhpcywhMSksUCh0aGlzLCExKSksdGhpcy5pc1Zpc2libGUoKSYmSWModGhpcyxhKSxUKHRoaXMsMSwhYSwhMCkpfTt2YXIgUD1mdW5jdGlvbihhLGIpe08oYSwyLGIpJiZUKGEsMixiKX07Ck4ucHJvdG90eXBlLmlzQWN0aXZlPWZ1bmN0aW9uKCl7cmV0dXJuISEodGhpcy5tJjQpfTsKdmFyIE1jPWZ1bmN0aW9uKGEsYil7TyhhLDQsYikmJlQoYSw0LGIpfSxOYz1mdW5jdGlvbihhLGIpe08oYSw4LGIpJiZUKGEsOCxiKX0sT2M9ZnVuY3Rpb24oYSxiKXtPKGEsNjQsYikmJlQoYSw2NCxiKX0sVD1mdW5jdGlvbihhLGIsYyxkKXtpZighZCYmYj09MSlhLlgoIWMpO2Vsc2UgaWYoYS5EJmImJmMhPSEhKGEubSZiKSl7dmFyIGU9YS52O2lmKGQ9YS5pKCkpe2lmKGU9RWMoZSxiKSl7dmFyIGY9YS5pP2EuaSgpOmE7ZiYmKGM/cGM6cmMpKGYsW2VdKX1KYyhkLGIsYyl9YS5tPWM/YS5tfGI6YS5tJn5ifX0sUGM9ZnVuY3Rpb24oYSxiLGMpe2lmKGEucyYmYS5tJmImJiFjKXRocm93IEVycm9yKCJDb21wb25lbnQgYWxyZWFkeSByZW5kZXJlZCIpOyFjJiZhLm0mYiYmVChhLGIsITEpO2EuRD1jP2EuRHxiOmEuRCZ+Yn0sVT1mdW5jdGlvbihhLGIpe3JldHVybiEhKDI1NSZiKSYmISEoYS5EJmIpfSxPPWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4hIShhLkQmYikmJiEhKGEubSZiKSE9CmMmJighKGEuUCZiKXx8RShhLE5iKGIsYykpKSYmIWEuYmF9O04ucHJvdG90eXBlLnVhPWZ1bmN0aW9uKGEpeyFRYyhhLHRoaXMuaSgpKSYmRSh0aGlzLCJlbnRlciIpJiZ0aGlzLmlzRW5hYmxlZCgpJiZVKHRoaXMsMikmJlAodGhpcywhMCl9O04ucHJvdG90eXBlLnRhPWZ1bmN0aW9uKGEpeyFRYyhhLHRoaXMuaSgpKSYmRSh0aGlzLCJsZWF2ZSIpJiYoVSh0aGlzLDQpJiZNYyh0aGlzLCExKSxVKHRoaXMsMikmJlAodGhpcywhMSkpfTtOLnByb3RvdHlwZS5jYT1CYzt2YXIgUWM9ZnVuY3Rpb24oYSxiKXtyZXR1cm4hIWEucmVsYXRlZFRhcmdldCYmYWIoYixhLnJlbGF0ZWRUYXJnZXQpfTsKTi5wcm90b3R5cGUuc2E9ZnVuY3Rpb24oYSl7aWYodGhpcy5pc0VuYWJsZWQoKSYmKFUodGhpcywyKSYmUCh0aGlzLCEwKSwhKGEuaC5idXR0b24hPTB8fHYmJmEuY3RybEtleSkpKXtVKHRoaXMsNCkmJk1jKHRoaXMsITApO3ZhciBiO2lmKGI9dGhpcy52KXt2YXIgYztiPXRoaXMuRCYzMiYmKGM9dGhpcy5pKCkpP2RiKGMpJiZlYihjKTohMX1iJiZ0aGlzLmkoKS5mb2N1cygpfWEuaC5idXR0b24hPTB8fHYmJmEuY3RybEtleXx8YS5qKCl9O04ucHJvdG90eXBlLnZhPWZ1bmN0aW9uKGEpe3RoaXMuaXNFbmFibGVkKCkmJihVKHRoaXMsMikmJlAodGhpcywhMCksdGhpcy5pc0FjdGl2ZSgpJiZSYyh0aGlzLGEpJiZVKHRoaXMsNCkmJk1jKHRoaXMsITEpKX07CnZhciBSYz1mdW5jdGlvbihhLGIpe2lmKFUoYSwxNikpe3ZhciBjPSEoYS5tJjE2KTtPKGEsMTYsYykmJlQoYSwxNixjKX1VKGEsOCkmJk5jKGEsITApO1UoYSw2NCkmJk9jKGEsIShhLm0mNjQpKTtjPW5ldyB5KCJhY3Rpb24iLGEpO2ImJihjLmFsdEtleT1iLmFsdEtleSxjLmN0cmxLZXk9Yi5jdHJsS2V5LGMubWV0YUtleT1iLm1ldGFLZXksYy5zaGlmdEtleT1iLnNoaWZ0S2V5LGMuRz1iLkcsYy50aW1lU3RhbXA9Yi50aW1lU3RhbXApO3JldHVybiBFKGEsYyl9O04ucHJvdG90eXBlLlhhPWZ1bmN0aW9uKCl7VSh0aGlzLDMyKSYmTyh0aGlzLDMyLCEwKSYmVCh0aGlzLDMyLCEwKX07Ti5wcm90b3R5cGUuUWE9ZnVuY3Rpb24oKXtVKHRoaXMsNCkmJk1jKHRoaXMsITEpO1UodGhpcywzMikmJk8odGhpcywzMiwhMSkmJlQodGhpcywzMiwhMSl9OwpOLnByb3RvdHlwZS5hYT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5pc1Zpc2libGUoKSYmdGhpcy5pc0VuYWJsZWQoKSYmYS5nPT0xMyYmUmModGhpcyxhKT8oYS5qKCksYS52KCksITApOiExfTtpZih0eXBlb2YgTiE9PSJmdW5jdGlvbiIpdGhyb3cgRXJyb3IoIkludmFsaWQgY29tcG9uZW50IGNsYXNzICIrTik7aWYodHlwZW9mIE0hPT0iZnVuY3Rpb24iKXRocm93IEVycm9yKCJJbnZhbGlkIHJlbmRlcmVyIGNsYXNzICIrTSk7dmFyIFNjPW5hKE4pO3VjW1NjXT1NO3RjKCJnb29nLWNvbnRyb2wiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBOKG51bGwpfSk7dmFyIFY9ZnVuY3Rpb24oYSxiLGMpe0YuY2FsbCh0aGlzLGMpO3RoaXMuZWE9Ynx8dmMuVigpO3RoaXMuTD1hfHwidmVydGljYWwifTtuKFYsRik7Zz1WLnByb3RvdHlwZTtnLkthPW51bGw7Zy5kYT1udWxsO2cuZWE9bnVsbDtnLkw9bnVsbDtnLlM9ITA7Zy5UPSEwO2cubz0tMTtnLkI9bnVsbDtnLlc9ITE7Zy5PPW51bGw7dmFyIFRjPWZ1bmN0aW9uKGEpe3JldHVybiBhLkthfHxhLmkoKX07Zz1WLnByb3RvdHlwZTtnLm1hPWZ1bmN0aW9uKCl7dGhpcy5nPXRoaXMuRy5oKCJESVYiLHRoaXMuZWEuaih0aGlzKS5qb2luKCIgIikpfTtnLm5hPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaSgpfTtnLndhPWZ1bmN0aW9uKGEpe3JldHVybiBhLnRhZ05hbWU9PSJESVYifTtnLkVhPWZ1bmN0aW9uKGEpe3RoaXMuZz15Yyh0aGlzLmVhLHRoaXMsYSk7YS5zdHlsZS5kaXNwbGF5PT0ibm9uZSImJih0aGlzLlM9ITEpfTsKZy5JPWZ1bmN0aW9uKCl7Vi5sLkkuY2FsbCh0aGlzKTtUYih0aGlzLGZ1bmN0aW9uKGIpe2IucyYmVWModGhpcyxiKX0sdGhpcyk7dmFyIGE9dGhpcy5pKCk7QWModGhpcy5lYSx0aGlzKTtWYyh0aGlzLHRoaXMuUyk7QihCKEIoQihCKEIoQihCKFFiKHRoaXMpLHRoaXMsImVudGVyIix0aGlzLmViKSx0aGlzLCJoaWdobGlnaHQiLHRoaXMuZmIpLHRoaXMsInVuaGlnaGxpZ2h0Iix0aGlzLmxiKSx0aGlzLCJvcGVuIix0aGlzLmdiKSx0aGlzLCJjbG9zZSIsdGhpcy5iYiksYSxLLmdhLHRoaXMuV2EpLGJiKGEpLFtLLmhhLEsuZmFdLHRoaXMuY2IpLGEsW0suZ2EsSy5oYSxLLmZhLCJtb3VzZW92ZXIiLCJtb3VzZW91dCIsImNvbnRleHRtZW51Il0sdGhpcy5hYik7V2ModGhpcyl9O3ZhciBXYz1mdW5jdGlvbihhKXt2YXIgYj1RYihhKSxjPVRjKGEpO0IoQihCKGIsYywiZm9jdXMiLGEuUGEpLGMsImJsdXIiLGEuVWEpLGEuZGF8fChhLmRhPW5ldyBKKFRjKGEpKSksImtleSIsYS5WYSl9OwpnPVYucHJvdG90eXBlO2cuVT1mdW5jdGlvbigpe1hjKHRoaXMsLTEpO3RoaXMuQiYmT2ModGhpcy5CLCExKTt0aGlzLlc9ITE7Vi5sLlUuY2FsbCh0aGlzKX07Zy5DPWZ1bmN0aW9uKCl7Vi5sLkMuY2FsbCh0aGlzKTt0aGlzLmRhJiYodGhpcy5kYS5kaXNwb3NlKCksdGhpcy5kYT1udWxsKTt0aGlzLmVhPXRoaXMuQj10aGlzLk89dGhpcy5LYT1udWxsfTtnLmViPWZ1bmN0aW9uKCl7cmV0dXJuITB9OwpnLmZiPWZ1bmN0aW9uKGEpe3ZhciBiPVZiKHRoaXMsYS50YXJnZXQpO2lmKGI+LTEmJmIhPXRoaXMubyl7dmFyIGM9SSh0aGlzLHRoaXMubyk7YyYmUChjLCExKTt0aGlzLm89YjtjPUkodGhpcyx0aGlzLm8pO3RoaXMuVyYmTWMoYywhMCk7dGhpcy5CJiZjIT10aGlzLkImJihjLkQmNjQ/T2MoYywhMCk6T2ModGhpcy5CLCExKSl9Yj10aGlzLmkoKTtwKGIsIlRoZSBET00gZWxlbWVudCBmb3IgdGhlIGNvbnRhaW5lciBjYW5ub3QgYmUgbnVsbC4iKTthLnRhcmdldC5pKCkhPW51bGwmJmFjKGIsImFjdGl2ZWRlc2NlbmRhbnQiLGEudGFyZ2V0LmkoKS5pZCl9O2cubGI9ZnVuY3Rpb24oYSl7YS50YXJnZXQ9PUkodGhpcyx0aGlzLm8pJiYodGhpcy5vPS0xKTthPXRoaXMuaSgpO3AoYSwiVGhlIERPTSBlbGVtZW50IGZvciB0aGUgY29udGFpbmVyIGNhbm5vdCBiZSBudWxsLiIpO2EucmVtb3ZlQXR0cmlidXRlKCRiKCJhY3RpdmVkZXNjZW5kYW50IikpfTsKZy5nYj1mdW5jdGlvbihhKXsoYT1hLnRhcmdldCkmJmEhPXRoaXMuQiYmYS5oPT10aGlzJiYodGhpcy5CJiZPYyh0aGlzLkIsITEpLHRoaXMuQj1hKX07Zy5iYj1mdW5jdGlvbihhKXthLnRhcmdldD09dGhpcy5CJiYodGhpcy5CPW51bGwpO3ZhciBiPXRoaXMuaSgpLGM9YS50YXJnZXQuaSgpO2ImJmEudGFyZ2V0Lm0mMiYmYyYmKGE9IiIsYyYmKGE9Yy5pZCxwKGEsIlRoZSBhY3RpdmUgZWxlbWVudCBzaG91bGQgaGF2ZSBhbiBpZC4iKSksYWMoYiwiYWN0aXZlZGVzY2VuZGFudCIsYSkpfTtnLldhPWZ1bmN0aW9uKGEpe3RoaXMuVCYmKHRoaXMuVz0hMCk7dmFyIGI9VGModGhpcyk7YiYmZGIoYikmJmViKGIpP2IuZm9jdXMoKTphLmooKX07Zy5jYj1mdW5jdGlvbigpe3RoaXMuVz0hMX07CmcuYWI9ZnVuY3Rpb24oYSl7YTp7dmFyIGI9YS50YXJnZXQ7aWYodGhpcy5PKWZvcih2YXIgYz10aGlzLmkoKTtiJiZiIT09Yzspe3ZhciBkPWIuaWQ7aWYoZCBpbiB0aGlzLk8pe2I9dGhpcy5PW2RdO2JyZWFrIGF9Yj1iLnBhcmVudE5vZGV9Yj1udWxsfWlmKGIpc3dpdGNoKGEudHlwZSl7Y2FzZSBLLmdhOmIuc2EoYSk7YnJlYWs7Y2FzZSBLLmhhOmNhc2UgSy5mYTpiLnZhKGEpO2JyZWFrO2Nhc2UgIm1vdXNlb3ZlciI6Yi51YShhKTticmVhaztjYXNlICJtb3VzZW91dCI6Yi50YShhKTticmVhaztjYXNlICJjb250ZXh0bWVudSI6Yi5jYShhKX19O2cuUGE9ZnVuY3Rpb24oKXt9O2cuVWE9ZnVuY3Rpb24oKXtYYyh0aGlzLC0xKTt0aGlzLlc9ITE7dGhpcy5CJiZPYyh0aGlzLkIsITEpfTsKZy5WYT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5pc0VuYWJsZWQoKSYmdGhpcy5pc1Zpc2libGUoKSYmKEgodGhpcykhPTB8fHRoaXMuS2EpJiZZYyh0aGlzLGEpPyhhLmooKSxhLnYoKSwhMCk6ITF9Owp2YXIgWWM9ZnVuY3Rpb24oYSxiKXt2YXIgYz1JKGEsYS5vKTtpZihjJiZ0eXBlb2YgYy5hYT09ImZ1bmN0aW9uIiYmYy5hYShiKXx8YS5CJiZhLkIhPWMmJnR5cGVvZiBhLkIuYWE9PSJmdW5jdGlvbiImJmEuQi5hYShiKSlyZXR1cm4hMDtpZihiLnNoaWZ0S2V5fHxiLmN0cmxLZXl8fGIubWV0YUtleXx8Yi5hbHRLZXkpcmV0dXJuITE7c3dpdGNoKGIuZyl7Y2FzZSAyNzpUYyhhKS5ibHVyKCk7YnJlYWs7Y2FzZSAzNjpaYyhhKTticmVhaztjYXNlIDM1OiRjKGEpO2JyZWFrO2Nhc2UgMzg6aWYoYS5MPT0idmVydGljYWwiKWFkKGEpO2Vsc2UgcmV0dXJuITE7YnJlYWs7Y2FzZSAzNzppZihhLkw9PSJob3Jpem9udGFsIilVYihhKT9iZChhKTphZChhKTtlbHNlIHJldHVybiExO2JyZWFrO2Nhc2UgNDA6aWYoYS5MPT0idmVydGljYWwiKWJkKGEpO2Vsc2UgcmV0dXJuITE7YnJlYWs7Y2FzZSAzOTppZihhLkw9PSJob3Jpem9udGFsIilVYihhKT9hZChhKTpiZChhKTtlbHNlIHJldHVybiExOwpicmVhaztkZWZhdWx0OnJldHVybiExfXJldHVybiEwfSxVYz1mdW5jdGlvbihhLGIpe3ZhciBjPWIuaSgpO2M9Yy5pZHx8KGMuaWQ9T2IoYikpO2EuT3x8KGEuTz17fSk7YS5PW2NdPWJ9O1YucHJvdG90eXBlLkJhPWZ1bmN0aW9uKGEsYil7dWEoYSxOLCJUaGUgY2hpbGQgb2YgYSBjb250YWluZXIgbXVzdCBiZSBhIGNvbnRyb2wiKTtWLmwuQmEuY2FsbCh0aGlzLGEsYil9O1YucHJvdG90eXBlLkNhPWZ1bmN0aW9uKGEsYixjKXt1YShhLE4pO2EuUHw9MjthLlB8PTY0O1BjKGEsMzIsITEpO2EucyYmMCE9YS5IYSYmTGMoYSwhMSk7YS5IYT0hMTt2YXIgZD1hLmg9PXRoaXM/VmIodGhpcyxhKTotMTtWLmwuQ2EuY2FsbCh0aGlzLGEsYixjKTthLnMmJnRoaXMucyYmVWModGhpcyxhKTthPWQ7YT09LTEmJihhPUgodGhpcykpO2E9PXRoaXMubz90aGlzLm89TWF0aC5taW4oSCh0aGlzKS0xLGIpOmE+dGhpcy5vJiZiPD10aGlzLm8/dGhpcy5vKys6YTx0aGlzLm8mJmI+dGhpcy5vJiZ0aGlzLm8tLX07CnZhciB6Yz1mdW5jdGlvbihhLGIpe2lmKGEuaSgpKXRocm93IEVycm9yKCJDb21wb25lbnQgYWxyZWFkeSByZW5kZXJlZCIpO2EuTD1ifTtWLnByb3RvdHlwZS5pc1Zpc2libGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5TfTt2YXIgVmM9ZnVuY3Rpb24oYSxiKXthLlM9Yjt2YXIgYz1hLmkoKTtjJiYoYy5zdHlsZS5kaXNwbGF5PWI/IiI6Im5vbmUiLHdjKFRjKGEpLGEuVCYmYS5TKSl9O1YucHJvdG90eXBlLmlzRW5hYmxlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLlR9O1YucHJvdG90eXBlLlg9ZnVuY3Rpb24oYSl7dGhpcy5UIT1hJiZFKHRoaXMsYT8iZW5hYmxlIjoiZGlzYWJsZSIpJiYoYT8odGhpcy5UPSEwLFRiKHRoaXMsZnVuY3Rpb24oYil7Yi5UYT9kZWxldGUgYi5UYTpiLlgoITApfSkpOihUYih0aGlzLGZ1bmN0aW9uKGIpe2IuaXNFbmFibGVkKCk/Yi5YKCExKTpiLlRhPSEwfSksdGhpcy5XPXRoaXMuVD0hMSksd2MoVGModGhpcyksYSYmdGhpcy5TKSl9Owp2YXIgWGM9ZnVuY3Rpb24oYSxiKXsoYj1JKGEsYikpP1AoYiwhMCk6YS5vPi0xJiZQKEkoYSxhLm8pLCExKX0sWmM9ZnVuY3Rpb24oYSl7Y2QoYSxmdW5jdGlvbihiLGMpe3JldHVybihiKzEpJWN9LEgoYSktMSl9LCRjPWZ1bmN0aW9uKGEpe2NkKGEsZnVuY3Rpb24oYixjKXtiLS07cmV0dXJuIGI8MD9jLTE6Yn0sMCl9LGJkPWZ1bmN0aW9uKGEpe2NkKGEsZnVuY3Rpb24oYixjKXtyZXR1cm4oYisxKSVjfSxhLm8pfSxhZD1mdW5jdGlvbihhKXtjZChhLGZ1bmN0aW9uKGIsYyl7Yi0tO3JldHVybiBiPDA/Yy0xOmJ9LGEubyl9LGNkPWZ1bmN0aW9uKGEsYixjKXtjPWM8MD9WYihhLGEuQik6Yzt2YXIgZD1IKGEpO2M9Yi5jYWxsKGEsYyxkKTtmb3IodmFyIGU9MDtlPD1kOyl7dmFyIGY9SShhLGMpO2lmKGYmJmYuaXNWaXNpYmxlKCkmJmYuaXNFbmFibGVkKCkmJmYuRCYyKXthLkxhKGMpO2JyZWFrfWUrKztjPWIuY2FsbChhLGMsZCl9fTsKVi5wcm90b3R5cGUuTGE9ZnVuY3Rpb24oYSl7WGModGhpcyxhKX07dmFyIGRkPWZ1bmN0aW9uKCl7fTtuKGRkLE0pO2lhKGRkKTtnPWRkLnByb3RvdHlwZTtnLk49ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy10YWIifTtnLk5hPWZ1bmN0aW9uKCl7cmV0dXJuInRhYiJ9O2cueGE9ZnVuY3Rpb24oYSl7dmFyIGI9ZGQubC54YS5jYWxsKHRoaXMsYSk7KGE9YS5HYSgpKSYmdGhpcy5NYShiLGEpO3JldHVybiBifTtnLnlhPWZ1bmN0aW9uKGEsYil7Yj1kZC5sLnlhLmNhbGwodGhpcyxhLGIpO3ZhciBjPXRoaXMuR2EoYik7YyYmKGEuUmE9Yyk7YS5tJjgmJihjPWEuaCkmJnR5cGVvZiBjLko9PT0iZnVuY3Rpb24iJiYoVChhLDgsITEpLGMuSihhKSk7cmV0dXJuIGJ9O2cuR2E9ZnVuY3Rpb24oYSl7cmV0dXJuIGEudGl0bGV8fCIifTtnLk1hPWZ1bmN0aW9uKGEsYil7YSYmKGEudGl0bGU9Ynx8IiIpfTt2YXIgZWQ9ZnVuY3Rpb24oYSxiLGMpe04uY2FsbCh0aGlzLGEsYnx8ZGQuVigpLGMpO1BjKHRoaXMsOCwhMCk7dGhpcy5QfD05fTtuKGVkLE4pO2VkLnByb3RvdHlwZS5HYT1mdW5jdGlvbigpe3JldHVybiB0aGlzLlJhfTtlZC5wcm90b3R5cGUuTWE9ZnVuY3Rpb24oYSl7dGhpcy52Lk1hKHRoaXMuaSgpLGEpO3RoaXMuUmE9YX07dGMoImdvb2ctdGFiIixmdW5jdGlvbigpe3JldHVybiBuZXcgZWQobnVsbCl9KTt2YXIgVz1mdW5jdGlvbigpe3RoaXMuQT0idGFibGlzdCJ9O24oVyx2Yyk7aWEoVyk7Vy5wcm90b3R5cGUuZz1mdW5jdGlvbigpe3JldHVybiJnb29nLXRhYi1iYXIifTtXLnByb3RvdHlwZS51PWZ1bmN0aW9uKGEsYixjKXt0aGlzLnZ8fCh0aGlzLmh8fGZkKHRoaXMpLHRoaXMudj1FYSh0aGlzLmgpKTt2YXIgZD10aGlzLnZbYl07ZD8oemMoYSxnZChkKSksYS52PWQpOlcubC51LmNhbGwodGhpcyxhLGIsYyl9O1cucHJvdG90eXBlLmo9ZnVuY3Rpb24oYSl7dmFyIGI9Vy5sLmouY2FsbCh0aGlzLGEpO3RoaXMuaHx8ZmQodGhpcyk7Yi5wdXNoKHRoaXMuaFthLnZdKTtyZXR1cm4gYn07dmFyIGZkPWZ1bmN0aW9uKGEpe3ZhciBiPWEuZygpO2EuaD17dG9wOmIrIi10b3AiLGJvdHRvbTpiKyItYm90dG9tIixzdGFydDpiKyItc3RhcnQiLGVuZDpiKyItZW5kIn19O3ZhciBYPWZ1bmN0aW9uKGEsYixjKXthPWF8fCJ0b3AiO3pjKHRoaXMsZ2QoYSkpO3RoaXMudj1hO1YuY2FsbCh0aGlzLHRoaXMuTCxifHxXLlYoKSxjKTtoZCh0aGlzKX07bihYLFYpO2c9WC5wcm90b3R5cGU7Zy5IPW51bGw7Zy5JPWZ1bmN0aW9uKCl7WC5sLkkuY2FsbCh0aGlzKTtoZCh0aGlzKX07Zy5DPWZ1bmN0aW9uKCl7WC5sLkMuY2FsbCh0aGlzKTt0aGlzLkg9bnVsbH07Zy5MYT1mdW5jdGlvbihhKXtYLmwuTGEuY2FsbCh0aGlzLGEpO3RoaXMuSihJKHRoaXMsYSkpfTtnLko9ZnVuY3Rpb24oYSl7YT9OYyhhLCEwKTp0aGlzLkgmJk5jKHRoaXMuSCwhMSl9Owp2YXIgaWQ9ZnVuY3Rpb24oYSxiKXtpZihiJiZiPT1hLkgpe2Zvcih2YXIgYz1WYihhLGIpLGQ9Yy0xO2I9SShhLGQpO2QtLSl7dmFyIGU9YjtpZihlLmlzVmlzaWJsZSgpJiZlLmlzRW5hYmxlZCgpKXthLkooYik7cmV0dXJufX1mb3IoYys9MTtiPUkoYSxjKTtjKyspaWYoZD1iLGQuaXNWaXNpYmxlKCkmJmQuaXNFbmFibGVkKCkpe2EuSihiKTtyZXR1cm59YS5KKG51bGwpfX07Zz1YLnByb3RvdHlwZTtnLmpiPWZ1bmN0aW9uKGEpe3RoaXMuSCYmdGhpcy5IIT1hLnRhcmdldCYmTmModGhpcy5ILCExKTt0aGlzLkg9YS50YXJnZXR9O2cua2I9ZnVuY3Rpb24oYSl7YS50YXJnZXQ9PXRoaXMuSCYmKHRoaXMuSD1udWxsKX07Zy5oYj1mdW5jdGlvbihhKXtpZCh0aGlzLGEudGFyZ2V0KX07Zy5pYj1mdW5jdGlvbihhKXtpZCh0aGlzLGEudGFyZ2V0KX07Zy5QYT1mdW5jdGlvbigpe0kodGhpcyx0aGlzLm8pfHxYYyh0aGlzLFZiKHRoaXMsdGhpcy5IfHxJKHRoaXMsMCkpKX07CnZhciBoZD1mdW5jdGlvbihhKXtCKEIoQihCKFFiKGEpLGEsInNlbGVjdCIsYS5qYiksYSwidW5zZWxlY3QiLGEua2IpLGEsImRpc2FibGUiLGEuaGIpLGEsImhpZGUiLGEuaWIpfSxnZD1mdW5jdGlvbihhKXtyZXR1cm4gYT09InN0YXJ0Inx8YT09ImVuZCI/InZlcnRpY2FsIjoiaG9yaXpvbnRhbCJ9O3RjKCJnb29nLXRhYi1iYXIiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBYfSk7ZnVuY3Rpb24gamQoYSl7dmFyIGI9e3RvcDoiYm90dG9tIixib3R0b206InRvcCIsc3RhcnQ6InJpZ2h0IixlbmQ6ImxlZnQifVthLmxvY2F0aW9uXSxjPWEuZWxlbWVudElkLGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTtkLnRleHRDb250ZW50PSJcbiAgICBmaWVsZHNldCB7XG4gICAgICBwYWRkaW5nOiAxMHB4O1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgIzM2OTtcbiAgICB9XG5cbiAgICAjIitjKyIgLmdvb2ctdGFiLWNvbnRlbnQge1xuICAgICAgbWluLWhlaWdodDogM2VtO1xuICAgICAgbWFyZ2luOiAwO1xuICAgICAgYm9yZGVyOiAiK2EuYm9yZGVyKyIgc29saWQgIithLmJvcmRlckNvbG9yKyI7XG4gICAgICBib3JkZXItdG9wOiAwO1xuICAgICAgaGVpZ2h0OiAiK2EuY29udGVudEhlaWdodCsiO1xuICAgICAgcGFkZGluZzogNHB4IDhweDtcbiAgICAgIG1hcmdpbi1yaWdodDogNHB4O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgIG92ZXJmbG93OiBhdXRvO1xuICAgIH1cblxuICAgICMiKwpjKyIgLmdvb2ctdGFiLWJhci0iK2EubG9jYXRpb24rIiAuZ29vZy10YWItc2VsZWN0ZWQge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICIrYS5ib3JkZXJDb2xvcisiO1xuICAgICAgYm9yZGVyLSIrYisiOiAwcHg7XG4gICAgfVxuXG4gICAgIyIrYysiIC5nb29nLXRhYi1iYXItIithLmxvY2F0aW9uKyIge1xuICAgICAgcGFkZGluZy0iK2EubG9jYXRpb24rIjogNXB4ICFpbXBvcnRhbnQ7XG4gICAgICBib3JkZXItIitiKyI6IDFweCBzb2xpZCAiK2EuYm9yZGVyQ29sb3IrIiAhaW1wb3J0YW50O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICB9XG5cbiAgICAjIitjKyIgLmdvb2ctdGFiLWJhciB7XG4gICAgICAgbWFyZ2luOiAwO1xuICAgICAgIGJvcmRlcjogMDtcbiAgICAgICBwYWRkaW5nOiAwO1xuICAgICAgIGxpc3Qtc3R5bGU6IG5vbmU7XG4gICAgICAgY3Vyc29yOiBkZWZhdWx0O1xuICAgICAgIG91dGxpbmU6IG5vbmU7XG4gICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgICBtYXJnaW4tcmlnaHQ6IDRweDtcbiAgICAgIH1cblxuICAgICAjIisKYysiIC5nb29nLXRhYiB7XG4gICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgIHBhZGRpbmc6IDRweCA4cHg7XG4gICAgICAgY29sb3I6IHZhcigtLWNvbGFiLXByaW1hcnktdGV4dC1jb2xvcik7XG4gICAgICAgdGV4dC1kZWNvcmF0aW9uOiBpbml0aWFsO1xuICAgICAgIGN1cnNvcjogZGVmYXVsdDtcbiAgICAgIH1cblxuICAgICAgIyIrYysiIC5nb29nLXRhYi1ob3ZlciB7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWNvbGFiLWhpZ2hsaWdodGVkLXN1cmZhY2UtY29sb3IpO1xuICAgICAgfVxuICAgICAgIjtyZXR1cm4gZH0KdmFyIGtkPWZ1bmN0aW9uKGEpe3ZhciBiPWEuZWxlbWVudElkLGM9YS50YWJOYW1lcyxkPWEuc2VsZWN0ZWRJbmRleDsiY29udGVudEJvcmRlciJpbiBhfHwoYS5jb250ZW50Qm9yZGVyPSIwcHgiKTsiY29udGVudEhlaWdodCJpbiBhfHwoYS5jb250ZW50SGVpZ2h0PSJpbml0aWFsIik7ImJvcmRlckNvbG9yImluIGF8fChhLmJvcmRlckNvbG9yPSJ2YXIoLS1jb2xhYi1ib3JkZXItY29sb3IpIik7YS5sb2NhdGlvbnx8KGEubG9jYXRpb249InRvcCIpO3ZhciBlPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiMiK2IpLGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zi5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYi1iYXIiKTt2YXIgaD1hLmxvY2F0aW9uO2YuY2xhc3NMaXN0LmFkZCgiZ29vZy10YWItYmFyLSIraCk7Zm9yKHZhciBrPVtdLHE9ZmEoYyksRz1xLm5leHQoKTshRy5kb25lO0c9cS5uZXh0KCkpe0c9Ry52YWx1ZTt2YXIgeD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKeC5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYiIpO3gudGV4dENvbnRlbnQ9RztmLmFwcGVuZENoaWxkKHgpO2sucHVzaCh4KX1oIT0iYm90dG9tIiYmZS5hcHBlbmRDaGlsZChmKTtxPW51bGw7aWYoaD09InRvcCJ8fGg9PSJib3R0b20iKXE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikscS5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYi1iYXItY2xlYXIiKTtoPT0idG9wIiYmcSYmZS5hcHBlbmRDaGlsZChxKTtHPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO0cuY2xhc3NMaXN0LmFkZCgiZ29vZy10YWItY29udGVudCIpO3ZhciBoYT1bXTtjPWZhKGMpO2Zvcih4PWMubmV4dCgpOyF4LmRvbmU7eD1jLm5leHQoKSl4PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHguaWQ9ZS5pZCsiX2NvbnRlbnRfIitoYS5sZW5ndGgseC5zdHlsZS5kaXNwbGF5PSJub25lIixHLmFwcGVuZENoaWxkKHgpLGhhLnB1c2goeCk7ZS5hcHBlbmRDaGlsZChHKTtoPT0iYm90dG9tIiYmKHEmJgplLmFwcGVuZENoaWxkKHEpLGUuYXBwZW5kQ2hpbGQoZikpO3ZhciBRPW5ldyBYKGgpO1NiKFEsZik7dmFyIFI9LTE7d2IoUSwic2VsZWN0IixmdW5jdGlvbihTKXtTPWsuaW5kZXhPZihTLnRhcmdldC5pKCkpO1MhPVImJihSPj0wJiZSPGhhLmxlbmd0aCYmKGhhW1JdLnN0eWxlLmRpc3BsYXk9Im5vbmUiLFI9LTEpLFM+PTAmJlM8aGEubGVuZ3RoJiYoUj1TLGhhW1JdLnN0eWxlLmRpc3BsYXk9ImlubGluZSIsd2luZG93LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCJyZXNpemUiKSksZ29vZ2xlLmNvbGFiLm91dHB1dC5yZXNpemVJZnJhbWVUb0NvbnRlbnQoKSksUS5KKEkoUSxSKSkpfSk7US5KKEkoUSxkKSk7d2luZG93W2JdPXtzZXRTZWxlY3RlZFRhYkluZGV4OmZ1bmN0aW9uKFMpe1EuSihJKFEsUykpfX07ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChqZChhKSl9LGxkPVsiY29sYWJfbGliIiwiY3JlYXRlVGFiQmFyIl0sWT1sOwpsZFswXWluIFl8fHR5cGVvZiBZLmV4ZWNTY3JpcHQ9PSJ1bmRlZmluZWQifHxZLmV4ZWNTY3JpcHQoInZhciAiK2xkWzBdKTtmb3IodmFyIFo7bGQubGVuZ3RoJiYoWj1sZC5zaGlmdCgpKTspbGQubGVuZ3RofHxrZD09PXZvaWQgMD9ZW1pdJiZZW1pdIT09T2JqZWN0LnByb3RvdHlwZVtaXT9ZPVlbWl06WT1ZW1pdPXt9OllbWl09a2Q7fSkuY2FsbCh0aGlzKTsKLy8gY2xhbmctZm9ybWF0IG9uCg==", + "ok": true, + "headers": [ + [ + "content-length", + "41785" + ], + [ + "content-type", + "application/javascript" + ] + ], + "status": 200, + "status_text": "" + } + }, + "base_uri": "https://localhost:8080/", + "height": 479 + }, + "id": "jGaY6ql0d10K", + "outputId": "3afebbce-748e-495c-964a-c6db10fcdfe4" + }, + "source": [ + "%%logica NumberKind\n", + "\n", + "NumberKind(number:, kind:) :-\n", + " number in Range(10),\n", + " kind == (\n", + " if number % 6 == 0 then\n", + " \"divisible by 6\"\n", + " else if number % 2 == 0 then\n", + " \"divisible by 2 only\"\n", + " else if number % 3 == 0 then\n", + " \"divisible by 3 only\"\n", + " else\n", + " \"not divisible by 2 nor 3\"\n", + " );" + ], + "execution_count": 45, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"981ba04c-d22d-11ef-a7c0-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id103\", \"tabNames\": [\"NumberKind\", \"(Log)\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_d83691a08d" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"981c0b5e-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id103\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_9c6ee3e75c" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"981dfffe-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_7490b6de98" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"981e5706-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id103_content_1\");\n", + "//# sourceURL=js_60374bde20" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"981ef4d6-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"981e5706-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_c14408bb2a" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"981f4f9e-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id103\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_4c3180f986" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"98232ac4-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"981dfffe-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_ed1a854f4f" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"9825a984-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_1f0938cddc" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"9826169e-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id103_content_0\");\n", + "//# sourceURL=js_01f6e0a46d" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"982679fe-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"9826169e-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_2e20e89af7" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"9826e65a-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id103\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_ca87c9f1b2" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"98294c10-d22d-11ef-a7c0-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id104\", \"tabNames\": [\"SQL\", \"Result\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_505910488c" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"9829beca-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id104\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_b2f25679c6" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"982b81d8-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_0b1271e6fe" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"982c591e-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id104_content_0\");\n", + "//# sourceURL=js_e0fdd49878" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"982cc502-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"982c591e-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_2a735e8800" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"982d44dc-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id104\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_7b6f117afd" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The following query is stored at \u001b[1mNumberKind_sql\u001b[0m variable.\n", + "-- Initializing DuckDB environment.\n", + "create schema if not exists logica_home;\n", + "-- Empty record, has to have a field by DuckDB syntax.\n", + "drop type if exists logicarecord893574736 cascade; create type logicarecord893574736 as struct(nirvana numeric);\n", + "create sequence if not exists eternal_logical_sequence;\n", + "\n", + "\n", + "-- Logica type: logicarecord481217614\n", + "drop type if exists logicarecord481217614 cascade; create type logicarecord481217614 as struct(r logicarecord893574736);\n", + "\n", + "-- Logica type: logicarecord383307722\n", + "drop type if exists logicarecord383307722 cascade; create type logicarecord383307722 as struct(a timestamp);\n", + "SELECT\n", + " x_2.unnested_pod AS number,\n", + " CASE WHEN (((x_2.unnested_pod) % (6)) = 0) THEN 'divisible by 6' WHEN (((x_2.unnested_pod) % (2)) = 0) THEN 'divisible by 2 only' WHEN (((x_2.unnested_pod) % (3)) = 0) THEN 'divisible by 3 only' ELSE 'not divisible by 2 nor 3' END AS kind\n", + "FROM\n", + " (select unnest(Range(10)) as unnested_pod) as x_2;\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"982fc25c-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"982b81d8-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_99f0a69c38" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"9831f5ae-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_7c3d79e5ef" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"98325eea-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id104_content_1\");\n", + "//# sourceURL=js_a7b19f9412" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"9832c29a-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"98325eea-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_2121e36c5f" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"9833230c-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id104\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_6917b1fcdc" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The following table is stored at \u001b[1mNumberKind\u001b[0m variable.\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
numberkind
00divisible by 6
11not divisible by 2 nor 3
22divisible by 2 only
33divisible by 3 only
44divisible by 2 only
55not divisible by 2 nor 3
66divisible by 6
77not divisible by 2 nor 3
88divisible by 2 only
99divisible by 3 only
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"9836694a-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"9831f5ae-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_65c4fef1e1" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"983985d0-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"9825a984-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_b68003c9c3" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"983b8614-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_9f15b03e4c" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"983bd8a8-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id103_content_1\");\n", + "//# sourceURL=js_e9f9444bf5" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"983c29c0-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"983bd8a8-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_6967ea6e59" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"983c74f2-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id103\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_cc664693e7" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "image/svg+xml": "\n\n\n\n\n\nConcertina\n\n\n\nNumberKind\n\nNumberKind\n\n\n\n", + "text/plain": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Running predicate: NumberKind (6 ms)\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"984e125c-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"983b8614-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_3322782aaf" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"985036fe-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_338705865d" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"9850a86e-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id103_content_0\");\n", + "//# sourceURL=js_288c8f0059" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"9851251e-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"9850a86e-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_9577a5f215" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"9851992c-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id103\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_08d839b462" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"98553212-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_7db23a507d" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"98558366-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id104_content_1\");\n", + "//# sourceURL=js_c8ba21efb4" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"985623d4-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"98558366-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_cda54e8cf0" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"9856be7a-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id104\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_0c79e88ba1" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"9859868c-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"98553212-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_56a693daf4" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + " \n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"985b8284-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"985036fe-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_6266690128" + ] + }, + "metadata": {} + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "vg6yj3WOekxL" + }, + "source": [ + "### Ordered list accumulation\n", + "\n", + "`Array` aggregate function lets us accumulate lists sorted by an arbitrary comparable key. It takes an argument of the form ` -> `.\n", + "\n", + "Here is an example of accumulating employees by role and ordering them by the office.\n", + "\n", + "As you can observe whenever list has both SEA and LAX employees we have LAX employees listed before SEA." + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "resources": { + "http://localhost:8080/nbextensions/google.colab/tabbar.css": { + "data": "Lmdvb2ctdGFie3Bvc2l0aW9uOnJlbGF0aXZlO3BhZGRpbmc6NHB4IDhweDtjb2xvcjojMDBjO3RleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7Y3Vyc29yOmRlZmF1bHR9Lmdvb2ctdGFiLWJhci10b3AgLmdvb2ctdGFie21hcmdpbjoxcHggNHB4IDAgMDtib3JkZXItYm90dG9tOjA7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLXRvcDphZnRlciwuZ29vZy10YWItYmFyLWJvdHRvbTphZnRlcntjb250ZW50OiIgIjtkaXNwbGF5OmJsb2NrO2hlaWdodDowO2NsZWFyOmJvdGg7dmlzaWJpbGl0eTpoaWRkZW59Lmdvb2ctdGFiLWJhci1ib3R0b20gLmdvb2ctdGFie21hcmdpbjowIDRweCAxcHggMDtib3JkZXItdG9wOjA7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLXN0YXJ0IC5nb29nLXRhYnttYXJnaW46MCAwIDRweCAxcHg7Ym9yZGVyLXJpZ2h0OjB9Lmdvb2ctdGFiLWJhci1lbmQgLmdvb2ctdGFie21hcmdpbjowIDFweCA0cHggMDtib3JkZXItbGVmdDowfS5nb29nLXRhYi1ob3ZlcntiYWNrZ3JvdW5kOiNlZWV9Lmdvb2ctdGFiLWRpc2FibGVke2NvbG9yOiM2NjZ9Lmdvb2ctdGFiLXNlbGVjdGVke2NvbG9yOiMwMDA7YmFja2dyb3VuZDojZmZmO3RleHQtZGVjb3JhdGlvbjpub25lO2ZvbnQtd2VpZ2h0OmJvbGQ7Ym9yZGVyOjFweCBzb2xpZCAjNmI5MGRhfS5nb29nLXRhYi1iYXItdG9we3BhZGRpbmctdG9wOjVweCFpbXBvcnRhbnQ7cGFkZGluZy1sZWZ0OjVweCFpbXBvcnRhbnQ7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgIzZiOTBkYSFpbXBvcnRhbnR9Lmdvb2ctdGFiLWJhci10b3AgLmdvb2ctdGFiLXNlbGVjdGVke3RvcDoxcHg7bWFyZ2luLXRvcDowO3BhZGRpbmctYm90dG9tOjVweH0uZ29vZy10YWItYmFyLWJvdHRvbSAuZ29vZy10YWItc2VsZWN0ZWR7dG9wOi0xcHg7bWFyZ2luLWJvdHRvbTowO3BhZGRpbmctdG9wOjVweH0uZ29vZy10YWItYmFyLXN0YXJ0IC5nb29nLXRhYi1zZWxlY3RlZHtsZWZ0OjFweDttYXJnaW4tbGVmdDowO3BhZGRpbmctcmlnaHQ6OXB4fS5nb29nLXRhYi1iYXItZW5kIC5nb29nLXRhYi1zZWxlY3RlZHtsZWZ0Oi0xcHg7bWFyZ2luLXJpZ2h0OjA7cGFkZGluZy1sZWZ0OjlweH0uZ29vZy10YWItYmFye21hcmdpbjowO2JvcmRlcjowO3BhZGRpbmc6MDtsaXN0LXN0eWxlOm5vbmU7Y3Vyc29yOmRlZmF1bHQ7b3V0bGluZTpub25lO2JhY2tncm91bmQ6I2ViZWZmOX0uZ29vZy10YWItYmFyLWNsZWFye2NsZWFyOmJvdGg7aGVpZ2h0OjA7b3ZlcmZsb3c6aGlkZGVufS5nb29nLXRhYi1iYXItc3RhcnR7ZmxvYXQ6bGVmdH0uZ29vZy10YWItYmFyLWVuZHtmbG9hdDpyaWdodH0qIGh0bWwgLmdvb2ctdGFiLWJhci1zdGFydHttYXJnaW4tcmlnaHQ6LTNweH0qIGh0bWwgLmdvb2ctdGFiLWJhci1lbmR7bWFyZ2luLWxlZnQ6LTNweH1zZW50aW5lbHt9", + "ok": true, + "headers": [ + [ + "content-length", + "1404" + ], + [ + "content-type", + "text/css" + ] + ], + "status": 200, + "status_text": "" + }, + "http://localhost:8080/nbextensions/google.colab/tabbar_main.min.js": { + "data": "Ly8gY2xhbmctZm9ybWF0IG9mZgooZnVuY3Rpb24oKXt2YXIgZyxhYT1mdW5jdGlvbihhKXt2YXIgYj0wO3JldHVybiBmdW5jdGlvbigpe3JldHVybiBiPGEubGVuZ3RoP3tkb25lOiExLHZhbHVlOmFbYisrXX06e2RvbmU6ITB9fX0sYmE9dHlwZW9mIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzPT0iZnVuY3Rpb24iP09iamVjdC5kZWZpbmVQcm9wZXJ0eTpmdW5jdGlvbihhLGIsYyl7aWYoYT09QXJyYXkucHJvdG90eXBlfHxhPT1PYmplY3QucHJvdG90eXBlKXJldHVybiBhO2FbYl09Yy52YWx1ZTtyZXR1cm4gYX0sY2E9ZnVuY3Rpb24oYSl7YT1bIm9iamVjdCI9PXR5cGVvZiBnbG9iYWxUaGlzJiZnbG9iYWxUaGlzLGEsIm9iamVjdCI9PXR5cGVvZiB3aW5kb3cmJndpbmRvdywib2JqZWN0Ij09dHlwZW9mIHNlbGYmJnNlbGYsIm9iamVjdCI9PXR5cGVvZiBnbG9iYWwmJmdsb2JhbF07Zm9yKHZhciBiPTA7YjxhLmxlbmd0aDsrK2Ipe3ZhciBjPWFbYl07aWYoYyYmYy5NYXRoPT1NYXRoKXJldHVybiBjfXRocm93IEVycm9yKCJDYW5ub3QgZmluZCBnbG9iYWwgb2JqZWN0Iik7Cn0sZGE9Y2EodGhpcyksZWE9ZnVuY3Rpb24oYSxiKXtpZihiKWE6e3ZhciBjPWRhO2E9YS5zcGxpdCgiLiIpO2Zvcih2YXIgZD0wO2Q8YS5sZW5ndGgtMTtkKyspe3ZhciBlPWFbZF07aWYoIShlIGluIGMpKWJyZWFrIGE7Yz1jW2VdfWE9YVthLmxlbmd0aC0xXTtkPWNbYV07Yj1iKGQpO2IhPWQmJmIhPW51bGwmJmJhKGMsYSx7Y29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOmJ9KX19OwplYSgiU3ltYm9sIixmdW5jdGlvbihhKXtpZihhKXJldHVybiBhO3ZhciBiPWZ1bmN0aW9uKGYsaCl7dGhpcy5nPWY7YmEodGhpcywiZGVzY3JpcHRpb24iLHtjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6aH0pfTtiLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmd9O3ZhciBjPSJqc2NvbXBfc3ltYm9sXyIrKE1hdGgucmFuZG9tKCkqMUU5Pj4+MCkrIl8iLGQ9MCxlPWZ1bmN0aW9uKGYpe2lmKHRoaXMgaW5zdGFuY2VvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoIlN5bWJvbCBpcyBub3QgYSBjb25zdHJ1Y3RvciIpO3JldHVybiBuZXcgYihjKyhmfHwiIikrIl8iK2QrKyxmKX07cmV0dXJuIGV9KTsKdmFyIGZhPWZ1bmN0aW9uKGEpe3ZhciBiPXR5cGVvZiBTeW1ib2whPSJ1bmRlZmluZWQiJiZTeW1ib2wuaXRlcmF0b3ImJmFbU3ltYm9sLml0ZXJhdG9yXTtpZihiKXJldHVybiBiLmNhbGwoYSk7aWYodHlwZW9mIGEubGVuZ3RoPT0ibnVtYmVyIilyZXR1cm57bmV4dDphYShhKX07dGhyb3cgRXJyb3IoU3RyaW5nKGEpKyIgaXMgbm90IGFuIGl0ZXJhYmxlIG9yIEFycmF5TGlrZSIpO307ZWEoIlN5bWJvbC5kaXNwb3NlIixmdW5jdGlvbihhKXtyZXR1cm4gYT9hOlN5bWJvbCgiU3ltYm9sLmRpc3Bvc2UiKX0pOy8qCgogQ29weXJpZ2h0IFRoZSBDbG9zdXJlIExpYnJhcnkgQXV0aG9ycy4KIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wCiovCnZhciBsPXRoaXN8fHNlbGYsaWE9ZnVuY3Rpb24oYSl7YS5JYT12b2lkIDA7YS5WPWZ1bmN0aW9uKCl7cmV0dXJuIGEuSWE/YS5JYTphLklhPW5ldyBhfX0samE9ZnVuY3Rpb24oYSl7dmFyIGI9dHlwZW9mIGE7cmV0dXJuIGIhPSJvYmplY3QiP2I6YT9BcnJheS5pc0FycmF5KGEpPyJhcnJheSI6YjoibnVsbCJ9LGthPWZ1bmN0aW9uKGEpe3ZhciBiPWphKGEpO3JldHVybiBiPT0iYXJyYXkifHxiPT0ib2JqZWN0IiYmdHlwZW9mIGEubGVuZ3RoPT0ibnVtYmVyIn0sbT1mdW5jdGlvbihhKXt2YXIgYj10eXBlb2YgYTtyZXR1cm4gYj09Im9iamVjdCImJmEhPW51bGx8fGI9PSJmdW5jdGlvbiJ9LG5hPWZ1bmN0aW9uKGEpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYSxsYSkmJmFbbGFdfHwoYVtsYV09KyttYSl9LGxhPSJjbG9zdXJlX3VpZF8iKyhNYXRoLnJhbmRvbSgpKjFFOT4+PjApLG1hPTAsbj1mdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoKXt9Yy5wcm90b3R5cGU9CmIucHJvdG90eXBlO2EubD1iLnByb3RvdHlwZTthLnByb3RvdHlwZT1uZXcgYzthLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1hO2EucWQ9ZnVuY3Rpb24oZCxlLGYpe2Zvcih2YXIgaD1BcnJheShhcmd1bWVudHMubGVuZ3RoLTIpLGs9MjtrPGFyZ3VtZW50cy5sZW5ndGg7aysrKWhbay0yXT1hcmd1bWVudHNba107cmV0dXJuIGIucHJvdG90eXBlW2VdLmFwcGx5KGQsaCl9fTtmdW5jdGlvbiBvYShhLGIpe2lmKEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKUVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsb2EpO2Vsc2V7dmFyIGM9RXJyb3IoKS5zdGFjaztjJiYodGhpcy5zdGFjaz1jKX1hJiYodGhpcy5tZXNzYWdlPVN0cmluZyhhKSk7YiE9PXZvaWQgMCYmKHRoaXMuY2F1c2U9Yil9bihvYSxFcnJvcik7b2EucHJvdG90eXBlLm5hbWU9IkN1c3RvbUVycm9yIjt2YXIgcGE7ZnVuY3Rpb24gcWEoYSxiKXthPWEuc3BsaXQoIiVzIik7Zm9yKHZhciBjPSIiLGQ9YS5sZW5ndGgtMSxlPTA7ZTxkO2UrKyljKz1hW2VdKyhlPGIubGVuZ3RoP2JbZV06IiVzIik7b2EuY2FsbCh0aGlzLGMrYVtkXSl9bihxYSxvYSk7cWEucHJvdG90eXBlLm5hbWU9IkFzc2VydGlvbkVycm9yIjtmdW5jdGlvbiByYShhLGIsYyxkKXt2YXIgZT0iQXNzZXJ0aW9uIGZhaWxlZCI7aWYoYyl7ZSs9IjogIitjO3ZhciBmPWR9ZWxzZSBhJiYoZSs9IjogIithLGY9Yik7dGhyb3cgbmV3IHFhKCIiK2UsZnx8W10pO30KdmFyIHA9ZnVuY3Rpb24oYSxiLGMpe2F8fHJhKCIiLG51bGwsYixBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMikpO3JldHVybiBhfSxzYT1mdW5jdGlvbihhLGIsYyl7bShhKSYmYS5ub2RlVHlwZT09MXx8cmEoIkV4cGVjdGVkIEVsZW1lbnQgYnV0IGdvdCAlczogJXMuIixbamEoYSksYV0sYixBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMikpfSx1YT1mdW5jdGlvbihhLGIsYyxkKXthIGluc3RhbmNlb2YgYnx8cmEoIkV4cGVjdGVkIGluc3RhbmNlb2YgJXMgYnV0IGdvdCAlcy4iLFt0YShiKSx0YShhKV0sYyxBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMykpfTsKZnVuY3Rpb24gdGEoYSl7cmV0dXJuIGEgaW5zdGFuY2VvZiBGdW5jdGlvbj9hLmRpc3BsYXlOYW1lfHxhLm5hbWV8fCJ1bmtub3duIHR5cGUgbmFtZSI6YSBpbnN0YW5jZW9mIE9iamVjdD9hLmNvbnN0cnVjdG9yLmRpc3BsYXlOYW1lfHxhLmNvbnN0cnVjdG9yLm5hbWV8fE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhKTphPT09bnVsbD8ibnVsbCI6dHlwZW9mIGF9O3ZhciB2YT1BcnJheS5wcm90b3R5cGUuaW5kZXhPZj9mdW5jdGlvbihhLGIpe3AoYS5sZW5ndGghPW51bGwpO3JldHVybiBBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKGEsYix2b2lkIDApfTpmdW5jdGlvbihhLGIpe2lmKHR5cGVvZiBhPT09InN0cmluZyIpcmV0dXJuIHR5cGVvZiBiIT09InN0cmluZyJ8fGIubGVuZ3RoIT0xPy0xOmEuaW5kZXhPZihiLDApO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWlmKGMgaW4gYSYmYVtjXT09PWIpcmV0dXJuIGM7cmV0dXJuLTF9LHdhPUFycmF5LnByb3RvdHlwZS5mb3JFYWNoP2Z1bmN0aW9uKGEsYil7cChhLmxlbmd0aCE9bnVsbCk7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChhLGIsdm9pZCAwKX06ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9YS5sZW5ndGgsZD10eXBlb2YgYT09PSJzdHJpbmciP2Euc3BsaXQoIiIpOmEsZT0wO2U8YztlKyspZSBpbiBkJiZiLmNhbGwodm9pZCAwLGRbZV0sZSxhKX07CmZ1bmN0aW9uIHhhKGEsYil7Yj12YShhLGIpO3ZhciBjO2lmKGM9Yj49MClwKGEubGVuZ3RoIT1udWxsKSxBcnJheS5wcm90b3R5cGUuc3BsaWNlLmNhbGwoYSxiLDEpO3JldHVybiBjfWZ1bmN0aW9uIHlhKGEpe3ZhciBiPWEubGVuZ3RoO2lmKGI+MCl7Zm9yKHZhciBjPUFycmF5KGIpLGQ9MDtkPGI7ZCsrKWNbZF09YVtkXTtyZXR1cm4gY31yZXR1cm5bXX1mdW5jdGlvbiB6YShhLGIsYyxkKXtwKGEubGVuZ3RoIT1udWxsKTtBcnJheS5wcm90b3R5cGUuc3BsaWNlLmFwcGx5KGEsQWEoYXJndW1lbnRzLDEpKX1mdW5jdGlvbiBBYShhLGIsYyl7cChhLmxlbmd0aCE9bnVsbCk7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg8PTI/QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYSxiKTpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhLGIsYyl9O2Z1bmN0aW9uIEJhKGEsYixjKXtmb3IodmFyIGQgaW4gYSliLmNhbGwoYyxhW2RdLGQsYSl9ZnVuY3Rpb24gQ2EoYSxiKXtmb3IodmFyIGMgaW4gYSlpZihhW2NdPT1iKXJldHVybiEwO3JldHVybiExfWZ1bmN0aW9uIERhKGEsYixjKXtpZihhIT09bnVsbCYmYiBpbiBhKXRocm93IEVycm9yKCdUaGUgb2JqZWN0IGFscmVhZHkgY29udGFpbnMgdGhlIGtleSAiJytiKyciJyk7YVtiXT1jfWZ1bmN0aW9uIEVhKGEpe3ZhciBiPXt9LGM7Zm9yKGMgaW4gYSliW2FbY11dPWM7cmV0dXJuIGJ9dmFyIEZhPSJjb25zdHJ1Y3RvciBoYXNPd25Qcm9wZXJ0eSBpc1Byb3RvdHlwZU9mIHByb3BlcnR5SXNFbnVtZXJhYmxlIHRvTG9jYWxlU3RyaW5nIHRvU3RyaW5nIHZhbHVlT2YiLnNwbGl0KCIgIik7CmZ1bmN0aW9uIEdhKGEsYil7Zm9yKHZhciBjLGQsZT0xO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspe2Q9YXJndW1lbnRzW2VdO2ZvcihjIGluIGQpYVtjXT1kW2NdO2Zvcih2YXIgZj0wO2Y8RmEubGVuZ3RoO2YrKyljPUZhW2ZdLE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChkLGMpJiYoYVtjXT1kW2NdKX19O3ZhciBIYT1TdHJpbmcucHJvdG90eXBlLnRyaW0/ZnVuY3Rpb24oYSl7cmV0dXJuIGEudHJpbSgpfTpmdW5jdGlvbihhKXtyZXR1cm4vXltcc1x4YTBdKihbXHNcU10qPylbXHNceGEwXSokLy5leGVjKGEpWzFdfTsvKgoKIENvcHlyaWdodCBHb29nbGUgTExDCiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMAoqLwp2YXIgSWE9e307dmFyIEphPWZ1bmN0aW9uKGEpe2lmKElhIT09SWEpdGhyb3cgRXJyb3IoIkJhZCBzZWNyZXQiKTt0aGlzLmc9YX07SmEucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ307bmV3IEphKCJhYm91dDpibGFuayIpO25ldyBKYSgiYWJvdXQ6aW52YWxpZCN6Q2xvc3VyZXoiKTt2YXIgS2E9W10sTGE9ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJBIFVSTCB3aXRoIGNvbnRlbnQgJyIrYSsiJyB3YXMgc2FuaXRpemVkIGF3YXkuIil9O0thLmluZGV4T2YoTGEpPT09LTEmJkthLnB1c2goTGEpO3ZhciBNYSxOYTthOntmb3IodmFyIE9hPVsiQ0xPU1VSRV9GTEFHUyJdLFBhPWwsUWE9MDtRYTxPYS5sZW5ndGg7UWErKylpZihQYT1QYVtPYVtRYV1dLFBhPT1udWxsKXtOYT1udWxsO2JyZWFrIGF9TmE9UGF9dmFyIFJhPU5hJiZOYVs2MTA0MDEzMDFdO01hPVJhIT1udWxsP1JhOiExO2Z1bmN0aW9uIFNhKCl7dmFyIGE9bC5uYXZpZ2F0b3I7cmV0dXJuIGEmJihhPWEudXNlckFnZW50KT9hOiIifXZhciBUYSxVYT1sLm5hdmlnYXRvcjtUYT1VYT9VYS51c2VyQWdlbnREYXRhfHxudWxsOm51bGw7ZnVuY3Rpb24gcihhKXtyZXR1cm4gU2EoKS5pbmRleE9mKGEpIT0tMX07dmFyIFZhPXIoIkVkZ2UiKSx0PXIoIkdlY2tvIikmJiEoU2EoKS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoIndlYmtpdCIpIT0tMSYmIXIoIkVkZ2UiKSkmJiEocigiVHJpZGVudCIpfHxyKCJNU0lFIikpJiYhcigiRWRnZSIpLHU9U2EoKS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoIndlYmtpdCIpIT0tMSYmIXIoIkVkZ2UiKSx2PU1hJiZUYSYmVGEucGxhdGZvcm0/VGEucGxhdGZvcm09PT0ibWFjT1MiOnIoIk1hY2ludG9zaCIpO3ZhciBYYT1mdW5jdGlvbihhLGIpe0JhKGIsZnVuY3Rpb24oYyxkKXtkPT0ic3R5bGUiP2Euc3R5bGUuY3NzVGV4dD1jOmQ9PSJjbGFzcyI/YS5jbGFzc05hbWU9YzpkPT0iZm9yIj9hLmh0bWxGb3I9YzpXYS5oYXNPd25Qcm9wZXJ0eShkKT9hLnNldEF0dHJpYnV0ZShXYVtkXSxjKTpkLmxhc3RJbmRleE9mKCJhcmlhLSIsMCk9PTB8fGQubGFzdEluZGV4T2YoImRhdGEtIiwwKT09MD9hLnNldEF0dHJpYnV0ZShkLGMpOmFbZF09Y30pfSxXYT17Y2VsbHBhZGRpbmc6ImNlbGxQYWRkaW5nIixjZWxsc3BhY2luZzoiY2VsbFNwYWNpbmciLGNvbHNwYW46ImNvbFNwYW4iLGZyYW1lYm9yZGVyOiJmcmFtZUJvcmRlciIsaGVpZ2h0OiJoZWlnaHQiLG1heGxlbmd0aDoibWF4TGVuZ3RoIixub25jZToibm9uY2UiLHJvbGU6InJvbGUiLHJvd3NwYW46InJvd1NwYW4iLHR5cGU6InR5cGUiLHVzZW1hcDoidXNlTWFwIix2YWxpZ246InZBbGlnbiIsd2lkdGg6IndpZHRoIn0sWWE9ZnVuY3Rpb24oYSwKYixjKXtmdW5jdGlvbiBkKGspe2smJmIuYXBwZW5kQ2hpbGQodHlwZW9mIGs9PT0ic3RyaW5nIj9hLmNyZWF0ZVRleHROb2RlKGspOmspfWZvcih2YXIgZT0yO2U8Yy5sZW5ndGg7ZSsrKXt2YXIgZj1jW2VdO2lmKCFrYShmKXx8bShmKSYmZi5ub2RlVHlwZT4wKWQoZik7ZWxzZXthOntpZihmJiZ0eXBlb2YgZi5sZW5ndGg9PSJudW1iZXIiKXtpZihtKGYpKXt2YXIgaD10eXBlb2YgZi5pdGVtPT0iZnVuY3Rpb24ifHx0eXBlb2YgZi5pdGVtPT0ic3RyaW5nIjticmVhayBhfWlmKHR5cGVvZiBmPT09ImZ1bmN0aW9uIil7aD10eXBlb2YgZi5pdGVtPT0iZnVuY3Rpb24iO2JyZWFrIGF9fWg9ITF9d2EoaD95YShmKTpmLGQpfX19LFphPWZ1bmN0aW9uKGEsYil7Yj1TdHJpbmcoYik7YS5jb250ZW50VHlwZT09PSJhcHBsaWNhdGlvbi94aHRtbCt4bWwiJiYoYj1iLnRvTG93ZXJDYXNlKCkpO3JldHVybiBhLmNyZWF0ZUVsZW1lbnQoYil9LCRhPWZ1bmN0aW9uKGEpe2EmJmEucGFyZW50Tm9kZSYmCmEucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhKX0sYWI9ZnVuY3Rpb24oYSxiKXtpZighYXx8IWIpcmV0dXJuITE7aWYoYS5jb250YWlucyYmYi5ub2RlVHlwZT09MSlyZXR1cm4gYT09Ynx8YS5jb250YWlucyhiKTtpZih0eXBlb2YgYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiE9InVuZGVmaW5lZCIpcmV0dXJuIGE9PWJ8fCEhKGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24oYikmMTYpO2Zvcig7YiYmYSE9YjspYj1iLnBhcmVudE5vZGU7cmV0dXJuIGI9PWF9LGJiPWZ1bmN0aW9uKGEpe3AoYSwiTm9kZSBjYW5ub3QgYmUgbnVsbCBvciB1bmRlZmluZWQuIik7cmV0dXJuIGEubm9kZVR5cGU9PTk/YTphLm93bmVyRG9jdW1lbnR8fGEuZG9jdW1lbnR9LGNiPWZ1bmN0aW9uKGEsYil7Yj9hLnRhYkluZGV4PTA6KGEudGFiSW5kZXg9LTEsYS5yZW1vdmVBdHRyaWJ1dGUoInRhYkluZGV4IikpfSxkYj1mdW5jdGlvbihhKXtyZXR1cm4gYS5oYXNBdHRyaWJ1dGUoInRhYmluZGV4Iil9LGViPQpmdW5jdGlvbihhKXthPWEudGFiSW5kZXg7cmV0dXJuIHR5cGVvZiBhPT09Im51bWJlciImJmE+PTAmJmE8MzI3Njh9LGZiPWZ1bmN0aW9uKGEpe3RoaXMuZz1hfHxsLmRvY3VtZW50fHxkb2N1bWVudH07ZmIucHJvdG90eXBlLmk9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nO3JldHVybiB0eXBlb2YgYT09PSJzdHJpbmciP2IuZ2V0RWxlbWVudEJ5SWQoYSk6YX07ZmIucHJvdG90eXBlLmg9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXMuZyxlPWFyZ3VtZW50cyxmPWVbMV0saD1aYShkLFN0cmluZyhlWzBdKSk7ZiYmKHR5cGVvZiBmPT09InN0cmluZyI/aC5jbGFzc05hbWU9ZjpBcnJheS5pc0FycmF5KGYpP2guY2xhc3NOYW1lPWYuam9pbigiICIpOlhhKGgsZikpO2UubGVuZ3RoPjImJllhKGQsaCxlKTtyZXR1cm4gaH07dmFyIHc9ZnVuY3Rpb24oKXt0aGlzLmJhPXRoaXMuYmE7dGhpcy5rYT10aGlzLmthfTt3LnByb3RvdHlwZS5iYT0hMTt3LnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7dGhpcy5iYXx8KHRoaXMuYmE9ITAsdGhpcy5DKCkpfTt3LnByb3RvdHlwZVtTeW1ib2wuZGlzcG9zZV09ZnVuY3Rpb24oKXt0aGlzLmRpc3Bvc2UoKX07dy5wcm90b3R5cGUuQz1mdW5jdGlvbigpe2lmKHRoaXMua2EpZm9yKDt0aGlzLmthLmxlbmd0aDspdGhpcy5rYS5zaGlmdCgpKCl9O3ZhciB5PWZ1bmN0aW9uKGEsYil7dGhpcy50eXBlPWE7dGhpcy51PXRoaXMudGFyZ2V0PWI7dGhpcy5kZWZhdWx0UHJldmVudGVkPXRoaXMuQT0hMX07eS5wcm90b3R5cGUudj1mdW5jdGlvbigpe3RoaXMuQT0hMH07eS5wcm90b3R5cGUuaj1mdW5jdGlvbigpe3RoaXMuZGVmYXVsdFByZXZlbnRlZD0hMH07dmFyIGdiPWZ1bmN0aW9uKCl7aWYoIWwuYWRkRXZlbnRMaXN0ZW5lcnx8IU9iamVjdC5kZWZpbmVQcm9wZXJ0eSlyZXR1cm4hMTt2YXIgYT0hMSxiPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwicGFzc2l2ZSIse2dldDpmdW5jdGlvbigpe2E9ITB9fSk7dHJ5e3ZhciBjPWZ1bmN0aW9uKCl7fTtsLmFkZEV2ZW50TGlzdGVuZXIoInRlc3QiLGMsYik7bC5yZW1vdmVFdmVudExpc3RlbmVyKCJ0ZXN0IixjLGIpfWNhdGNoKGQpe31yZXR1cm4gYX0oKTt2YXIgej1mdW5jdGlvbihhLGIpe3kuY2FsbCh0aGlzLGE/YS50eXBlOiIiKTt0aGlzLnJlbGF0ZWRUYXJnZXQ9dGhpcy51PXRoaXMudGFyZ2V0PW51bGw7dGhpcy5idXR0b249dGhpcy5zY3JlZW5ZPXRoaXMuc2NyZWVuWD10aGlzLmNsaWVudFk9dGhpcy5jbGllbnRYPTA7dGhpcy5rZXk9IiI7dGhpcy5nPTA7dGhpcy5tZXRhS2V5PXRoaXMuc2hpZnRLZXk9dGhpcy5hbHRLZXk9dGhpcy5jdHJsS2V5PSExO3RoaXMuc3RhdGU9bnVsbDt0aGlzLkc9ITE7dGhpcy5wb2ludGVySWQ9MDt0aGlzLnBvaW50ZXJUeXBlPSIiO3RoaXMudGltZVN0YW1wPTA7dGhpcy5oPW51bGw7aWYoYSl7dmFyIGM9dGhpcy50eXBlPWEudHlwZSxkPWEuY2hhbmdlZFRvdWNoZXMmJmEuY2hhbmdlZFRvdWNoZXMubGVuZ3RoP2EuY2hhbmdlZFRvdWNoZXNbMF06bnVsbDt0aGlzLnRhcmdldD1hLnRhcmdldHx8YS5zcmNFbGVtZW50O3RoaXMudT1iO2I9YS5yZWxhdGVkVGFyZ2V0O2J8fChjPT0ibW91c2VvdmVyIj8KYj1hLmZyb21FbGVtZW50OmM9PSJtb3VzZW91dCImJihiPWEudG9FbGVtZW50KSk7dGhpcy5yZWxhdGVkVGFyZ2V0PWI7ZD8odGhpcy5jbGllbnRYPWQuY2xpZW50WCE9PXZvaWQgMD9kLmNsaWVudFg6ZC5wYWdlWCx0aGlzLmNsaWVudFk9ZC5jbGllbnRZIT09dm9pZCAwP2QuY2xpZW50WTpkLnBhZ2VZLHRoaXMuc2NyZWVuWD1kLnNjcmVlblh8fDAsdGhpcy5zY3JlZW5ZPWQuc2NyZWVuWXx8MCk6KHRoaXMuY2xpZW50WD1hLmNsaWVudFghPT12b2lkIDA/YS5jbGllbnRYOmEucGFnZVgsdGhpcy5jbGllbnRZPWEuY2xpZW50WSE9PXZvaWQgMD9hLmNsaWVudFk6YS5wYWdlWSx0aGlzLnNjcmVlblg9YS5zY3JlZW5YfHwwLHRoaXMuc2NyZWVuWT1hLnNjcmVlbll8fDApO3RoaXMuYnV0dG9uPWEuYnV0dG9uO3RoaXMuZz1hLmtleUNvZGV8fDA7dGhpcy5rZXk9YS5rZXl8fCIiO3RoaXMuY3RybEtleT1hLmN0cmxLZXk7dGhpcy5hbHRLZXk9YS5hbHRLZXk7dGhpcy5zaGlmdEtleT1hLnNoaWZ0S2V5Owp0aGlzLm1ldGFLZXk9YS5tZXRhS2V5O3RoaXMuRz12P2EubWV0YUtleTphLmN0cmxLZXk7dGhpcy5wb2ludGVySWQ9YS5wb2ludGVySWR8fDA7dGhpcy5wb2ludGVyVHlwZT1hLnBvaW50ZXJUeXBlO3RoaXMuc3RhdGU9YS5zdGF0ZTt0aGlzLnRpbWVTdGFtcD1hLnRpbWVTdGFtcDt0aGlzLmg9YTthLmRlZmF1bHRQcmV2ZW50ZWQmJnoubC5qLmNhbGwodGhpcyl9fTtuKHoseSk7ei5wcm90b3R5cGUudj1mdW5jdGlvbigpe3oubC52LmNhbGwodGhpcyk7dGhpcy5oLnN0b3BQcm9wYWdhdGlvbj90aGlzLmguc3RvcFByb3BhZ2F0aW9uKCk6dGhpcy5oLmNhbmNlbEJ1YmJsZT0hMH07ei5wcm90b3R5cGUuaj1mdW5jdGlvbigpe3oubC5qLmNhbGwodGhpcyk7dmFyIGE9dGhpcy5oO2EucHJldmVudERlZmF1bHQ/YS5wcmV2ZW50RGVmYXVsdCgpOmEucmV0dXJuVmFsdWU9ITF9O3ZhciBoYj0iY2xvc3VyZV9saXN0ZW5hYmxlXyIrKE1hdGgucmFuZG9tKCkqMUU2fDApLGliPWZ1bmN0aW9uKGEpe3JldHVybiEoIWF8fCFhW2hiXSl9O3ZhciBqYj0wO3ZhciBrYj1mdW5jdGlvbihhLGIsYyxkLGUpe3RoaXMubGlzdGVuZXI9YTt0aGlzLnByb3h5PW51bGw7dGhpcy5zcmM9Yjt0aGlzLnR5cGU9Yzt0aGlzLmNhcHR1cmU9ISFkO3RoaXMucGE9ZTt0aGlzLmtleT0rK2piO3RoaXMuamE9dGhpcy5vYT0hMX0sbGI9ZnVuY3Rpb24oYSl7YS5qYT0hMDthLmxpc3RlbmVyPW51bGw7YS5wcm94eT1udWxsO2Euc3JjPW51bGw7YS5wYT1udWxsfTt2YXIgbWI9ZnVuY3Rpb24oYSl7dGhpcy5zcmM9YTt0aGlzLmc9e307dGhpcy5oPTB9O21iLnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZj1hLnRvU3RyaW5nKCk7YT10aGlzLmdbZl07YXx8KGE9dGhpcy5nW2ZdPVtdLHRoaXMuaCsrKTt2YXIgaD1uYihhLGIsZCxlKTtoPi0xPyhiPWFbaF0sY3x8KGIub2E9ITEpKTooYj1uZXcga2IoYix0aGlzLnNyYyxmLCEhZCxlKSxiLm9hPWMsYS5wdXNoKGIpKTtyZXR1cm4gYn07CnZhciBvYj1mdW5jdGlvbihhLGIpe3ZhciBjPWIudHlwZTtjIGluIGEuZyYmeGEoYS5nW2NdLGIpJiYobGIoYiksYS5nW2NdLmxlbmd0aD09MCYmKGRlbGV0ZSBhLmdbY10sYS5oLS0pKX0scGI9ZnVuY3Rpb24oYSxiLGMsZCxlKXthPWEuZ1tiLnRvU3RyaW5nKCldO2I9LTE7YSYmKGI9bmIoYSxjLGQsZSkpO3JldHVybiBiPi0xP2FbYl06bnVsbH0sbmI9ZnVuY3Rpb24oYSxiLGMsZCl7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDsrK2Upe3ZhciBmPWFbZV07aWYoIWYuamEmJmYubGlzdGVuZXI9PWImJmYuY2FwdHVyZT09ISFjJiZmLnBhPT1kKXJldHVybiBlfXJldHVybi0xfTt2YXIgcWI9ImNsb3N1cmVfbG1fIisoTWF0aC5yYW5kb20oKSoxRTZ8MCkscmI9e30sc2I9MCx1Yj1mdW5jdGlvbihhLGIsYyxkLGUpe2lmKGQmJmQub25jZSlyZXR1cm4gdGIoYSxiLGMsZCxlKTtpZihBcnJheS5pc0FycmF5KGIpKXtmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKyl1YihhLGJbZl0sYyxkLGUpO3JldHVybiBudWxsfWM9dmIoYyk7cmV0dXJuIGliKGEpP3diKGEsYixjLG0oZCk/ISFkLmNhcHR1cmU6ISFkLGUpOnhiKGEsYixjLCExLGQsZSl9LHhiPWZ1bmN0aW9uKGEsYixjLGQsZSxmKXtpZighYil0aHJvdyBFcnJvcigiSW52YWxpZCBldmVudCB0eXBlIik7dmFyIGg9bShlKT8hIWUuY2FwdHVyZTohIWUsaz15YihhKTtrfHwoYVtxYl09az1uZXcgbWIoYSkpO2M9ay5hZGQoYixjLGQsaCxmKTtpZihjLnByb3h5KXJldHVybiBjO2Q9emIoKTtjLnByb3h5PWQ7ZC5zcmM9YTtkLmxpc3RlbmVyPWM7aWYoYS5hZGRFdmVudExpc3RlbmVyKWdifHwoZT1oKSxlPT09dm9pZCAwJiYKKGU9ITEpLGEuYWRkRXZlbnRMaXN0ZW5lcihiLnRvU3RyaW5nKCksZCxlKTtlbHNlIGlmKGEuYXR0YWNoRXZlbnQpYS5hdHRhY2hFdmVudChBYihiLnRvU3RyaW5nKCkpLGQpO2Vsc2UgaWYoYS5hZGRMaXN0ZW5lciYmYS5yZW1vdmVMaXN0ZW5lcilwKGI9PT0iY2hhbmdlIiwiTWVkaWFRdWVyeUxpc3Qgb25seSBoYXMgYSBjaGFuZ2UgZXZlbnQiKSxhLmFkZExpc3RlbmVyKGQpO2Vsc2UgdGhyb3cgRXJyb3IoImFkZEV2ZW50TGlzdGVuZXIgYW5kIGF0dGFjaEV2ZW50IGFyZSB1bmF2YWlsYWJsZS4iKTtzYisrO3JldHVybiBjfSx6Yj1mdW5jdGlvbigpe3ZhciBhPUJiLGI9ZnVuY3Rpb24oYyl7cmV0dXJuIGEuY2FsbChiLnNyYyxiLmxpc3RlbmVyLGMpfTtyZXR1cm4gYn0sdGI9ZnVuY3Rpb24oYSxiLGMsZCxlKXtpZihBcnJheS5pc0FycmF5KGIpKXtmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKyl0YihhLGJbZl0sYyxkLGUpO3JldHVybiBudWxsfWM9dmIoYyk7cmV0dXJuIGliKGEpPwphLkEuYWRkKFN0cmluZyhiKSxjLCEwLG0oZCk/ISFkLmNhcHR1cmU6ISFkLGUpOnhiKGEsYixjLCEwLGQsZSl9LENiPWZ1bmN0aW9uKGEsYixjLGQsZSl7aWYoQXJyYXkuaXNBcnJheShiKSlmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKylDYihhLGJbZl0sYyxkLGUpO2Vsc2UgZD1tKGQpPyEhZC5jYXB0dXJlOiEhZCxjPXZiKGMpLGliKGEpPyhhPWEuQSxiPVN0cmluZyhiKS50b1N0cmluZygpLGIgaW4gYS5nJiYoZj1hLmdbYl0sYz1uYihmLGMsZCxlKSxjPi0xJiYobGIoZltjXSkscChmLmxlbmd0aCE9bnVsbCksQXJyYXkucHJvdG90eXBlLnNwbGljZS5jYWxsKGYsYywxKSxmLmxlbmd0aD09MCYmKGRlbGV0ZSBhLmdbYl0sYS5oLS0pKSkpOmEmJihhPXliKGEpKSYmKGM9cGIoYSxiLGMsZCxlKSkmJkEoYyl9LEE9ZnVuY3Rpb24oYSl7aWYodHlwZW9mIGEhPT0ibnVtYmVyIiYmYSYmIWEuamEpe3ZhciBiPWEuc3JjO2lmKGliKGIpKW9iKGIuQSxhKTtlbHNle3ZhciBjPWEudHlwZSwKZD1hLnByb3h5O2IucmVtb3ZlRXZlbnRMaXN0ZW5lcj9iLnJlbW92ZUV2ZW50TGlzdGVuZXIoYyxkLGEuY2FwdHVyZSk6Yi5kZXRhY2hFdmVudD9iLmRldGFjaEV2ZW50KEFiKGMpLGQpOmIuYWRkTGlzdGVuZXImJmIucmVtb3ZlTGlzdGVuZXImJmIucmVtb3ZlTGlzdGVuZXIoZCk7c2ItLTsoYz15YihiKSk/KG9iKGMsYSksYy5oPT0wJiYoYy5zcmM9bnVsbCxiW3FiXT1udWxsKSk6bGIoYSl9fX0sQWI9ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW4gcmI/cmJbYV06cmJbYV09Im9uIithfSxCYj1mdW5jdGlvbihhLGIpe2lmKGEuamEpYT0hMDtlbHNle2I9bmV3IHooYix0aGlzKTt2YXIgYz1hLmxpc3RlbmVyLGQ9YS5wYXx8YS5zcmM7YS5vYSYmQShhKTthPWMuY2FsbChkLGIpfXJldHVybiBhfSx5Yj1mdW5jdGlvbihhKXthPWFbcWJdO3JldHVybiBhIGluc3RhbmNlb2YgbWI/YTpudWxsfSxEYj0iX19jbG9zdXJlX2V2ZW50c19mbl8iKyhNYXRoLnJhbmRvbSgpKjFFOT4+PjApLHZiPWZ1bmN0aW9uKGEpe3AoYSwKIkxpc3RlbmVyIGNhbiBub3QgYmUgbnVsbC4iKTtpZih0eXBlb2YgYT09PSJmdW5jdGlvbiIpcmV0dXJuIGE7cChhLmhhbmRsZUV2ZW50LCJBbiBvYmplY3QgbGlzdGVuZXIgbXVzdCBoYXZlIGhhbmRsZUV2ZW50IG1ldGhvZC4iKTthW0RiXXx8KGFbRGJdPWZ1bmN0aW9uKGIpe3JldHVybiBhLmhhbmRsZUV2ZW50KGIpfSk7cmV0dXJuIGFbRGJdfTt2YXIgRWI9ZnVuY3Rpb24oYSl7dy5jYWxsKHRoaXMpO3RoaXMuaD1hO3RoaXMuZz17fX07bihFYix3KTsKdmFyIEZiPVtdLEI9ZnVuY3Rpb24oYSxiLGMsZCl7QXJyYXkuaXNBcnJheShjKXx8KGMmJihGYlswXT1jLnRvU3RyaW5nKCkpLGM9RmIpO2Zvcih2YXIgZT0wO2U8Yy5sZW5ndGg7ZSsrKXt2YXIgZj11YihiLGNbZV0sZHx8YS5oYW5kbGVFdmVudCwhMSxhLmh8fGEpO2lmKCFmKWJyZWFrO2EuZ1tmLmtleV09Zn1yZXR1cm4gYX0sQz1mdW5jdGlvbihhLGIsYyxkLGUsZil7aWYoQXJyYXkuaXNBcnJheShjKSlmb3IodmFyIGg9MDtoPGMubGVuZ3RoO2grKylDKGEsYixjW2hdLGQsZSxmKTtlbHNlIGQ9ZHx8YS5oYW5kbGVFdmVudCxlPW0oZSk/ISFlLmNhcHR1cmU6ISFlLGY9Znx8YS5ofHxhLGQ9dmIoZCksZT0hIWUsYz1pYihiKT9wYihiLkEsU3RyaW5nKGMpLGQsZSxmKTpiPyhiPXliKGIpKT9wYihiLGMsZCxlLGYpOm51bGw6bnVsbCxjJiYoQShjKSxkZWxldGUgYS5nW2Mua2V5XSk7cmV0dXJuIGF9LEdiPWZ1bmN0aW9uKGEpe0JhKGEuZyxmdW5jdGlvbihiLGMpe3RoaXMuZy5oYXNPd25Qcm9wZXJ0eShjKSYmCkEoYil9LGEpO2EuZz17fX07RWIucHJvdG90eXBlLkM9ZnVuY3Rpb24oKXtFYi5sLkMuY2FsbCh0aGlzKTtHYih0aGlzKX07RWIucHJvdG90eXBlLmhhbmRsZUV2ZW50PWZ1bmN0aW9uKCl7dGhyb3cgRXJyb3IoIkV2ZW50SGFuZGxlci5oYW5kbGVFdmVudCBub3QgaW1wbGVtZW50ZWQiKTt9O3ZhciBEPWZ1bmN0aW9uKCl7dy5jYWxsKHRoaXMpO3RoaXMuQT1uZXcgbWIodGhpcyk7dGhpcy5ZYT10aGlzO3RoaXMubGE9bnVsbH07bihELHcpO0QucHJvdG90eXBlW2hiXT0hMDtELnByb3RvdHlwZS5BYT1mdW5jdGlvbihhKXt0aGlzLmxhPWF9O0QucHJvdG90eXBlLnJlbW92ZUV2ZW50TGlzdGVuZXI9ZnVuY3Rpb24oYSxiLGMsZCl7Q2IodGhpcyxhLGIsYyxkKX07CnZhciBFPWZ1bmN0aW9uKGEsYil7SGIoYSk7dmFyIGM9YS5sYTtpZihjKXt2YXIgZD1bXTtmb3IodmFyIGU9MTtjO2M9Yy5sYSlkLnB1c2goYykscCgrK2U8MUUzLCJpbmZpbml0ZSBsb29wIil9YT1hLllhO2M9Yi50eXBlfHxiO3R5cGVvZiBiPT09InN0cmluZyI/Yj1uZXcgeShiLGEpOmIgaW5zdGFuY2VvZiB5P2IudGFyZ2V0PWIudGFyZ2V0fHxhOihlPWIsYj1uZXcgeShjLGEpLEdhKGIsZSkpO2U9ITA7dmFyIGY7aWYoZClmb3IoZj1kLmxlbmd0aC0xOyFiLkEmJmY+PTA7Zi0tKXt2YXIgaD1iLnU9ZFtmXTtlPUliKGgsYywhMCxiKSYmZX1iLkF8fChoPWIudT1hLGU9SWIoaCxjLCEwLGIpJiZlLGIuQXx8KGU9SWIoaCxjLCExLGIpJiZlKSk7aWYoZClmb3IoZj0wOyFiLkEmJmY8ZC5sZW5ndGg7ZisrKWg9Yi51PWRbZl0sZT1JYihoLGMsITEsYikmJmU7cmV0dXJuIGV9OwpELnByb3RvdHlwZS5DPWZ1bmN0aW9uKCl7RC5sLkMuY2FsbCh0aGlzKTtpZih0aGlzLkEpe3ZhciBhPXRoaXMuQSxiPTAsYztmb3IoYyBpbiBhLmcpe2Zvcih2YXIgZD1hLmdbY10sZT0wO2U8ZC5sZW5ndGg7ZSsrKSsrYixsYihkW2VdKTtkZWxldGUgYS5nW2NdO2EuaC0tfX10aGlzLmxhPW51bGx9O3ZhciB3Yj1mdW5jdGlvbihhLGIsYyxkLGUpe0hiKGEpO3JldHVybiBhLkEuYWRkKFN0cmluZyhiKSxjLCExLGQsZSl9LEliPWZ1bmN0aW9uKGEsYixjLGQpe2I9YS5BLmdbU3RyaW5nKGIpXTtpZighYilyZXR1cm4hMDtiPWIuY29uY2F0KCk7Zm9yKHZhciBlPSEwLGY9MDtmPGIubGVuZ3RoOysrZil7dmFyIGg9YltmXTtpZihoJiYhaC5qYSYmaC5jYXB0dXJlPT1jKXt2YXIgaz1oLmxpc3RlbmVyLHE9aC5wYXx8aC5zcmM7aC5vYSYmb2IoYS5BLGgpO2U9ay5jYWxsKHEsZCkhPT0hMSYmZX19cmV0dXJuIGUmJiFkLmRlZmF1bHRQcmV2ZW50ZWR9LEhiPWZ1bmN0aW9uKGEpe3AoYS5BLCJFdmVudCB0YXJnZXQgaXMgbm90IGluaXRpYWxpemVkLiBEaWQgeW91IGNhbGwgdGhlIHN1cGVyY2xhc3MgKGdvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0KSBjb25zdHJ1Y3Rvcj8iKX07dmFyIEpiPXQ/Ik1velVzZXJTZWxlY3QiOnV8fFZhPyJXZWJraXRVc2VyU2VsZWN0IjpudWxsLEtiPWZ1bmN0aW9uKGEsYil7Yj1iP251bGw6YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpO2lmKEpiJiYoYS5zdHlsZSYmKGEuc3R5bGVbSmJdPSJub25lIiksYikpZm9yKHZhciBjPTA7YT1iW2NdO2MrKylhLnN0eWxlJiYoYS5zdHlsZVtKYl09Im5vbmUiKX07dmFyIExiPWZ1bmN0aW9uKCl7fTtpYShMYik7TGIucHJvdG90eXBlLmc9MDt2YXIgRj1mdW5jdGlvbihhKXtELmNhbGwodGhpcyk7dGhpcy5HPWF8fHBhfHwocGE9bmV3IGZiKTt0aGlzLnphPU1iO3RoaXMuWT1udWxsO3RoaXMucz0hMTt0aGlzLmc9bnVsbDt0aGlzLk09dm9pZCAwO3RoaXMudT10aGlzLmo9dGhpcy5oPW51bGw7dGhpcy5TYT0hMX07bihGLEQpO0YucHJvdG90eXBlLlphPUxiLlYoKTsKdmFyIE1iPW51bGwsTmI9ZnVuY3Rpb24oYSxiKXtzd2l0Y2goYSl7Y2FzZSAxOnJldHVybiBiPyJkaXNhYmxlIjoiZW5hYmxlIjtjYXNlIDI6cmV0dXJuIGI/ImhpZ2hsaWdodCI6InVuaGlnaGxpZ2h0IjtjYXNlIDQ6cmV0dXJuIGI/ImFjdGl2YXRlIjoiZGVhY3RpdmF0ZSI7Y2FzZSA4OnJldHVybiBiPyJzZWxlY3QiOiJ1bnNlbGVjdCI7Y2FzZSAxNjpyZXR1cm4gYj8iY2hlY2siOiJ1bmNoZWNrIjtjYXNlIDMyOnJldHVybiBiPyJmb2N1cyI6ImJsdXIiO2Nhc2UgNjQ6cmV0dXJuIGI/Im9wZW4iOiJjbG9zZSJ9dGhyb3cgRXJyb3IoIkludmFsaWQgY29tcG9uZW50IHN0YXRlIik7fSxPYj1mdW5jdGlvbihhKXtyZXR1cm4gYS5ZfHwoYS5ZPSI6IisoYS5aYS5nKyspLnRvU3RyaW5nKDM2KSl9LFBiPWZ1bmN0aW9uKGEsYil7aWYoYS5oJiZhLmgudSl7dmFyIGM9YS5oLnUsZD1hLlk7ZCBpbiBjJiZkZWxldGUgY1tkXTtEYShhLmgudSxiLGEpfWEuWT1ifTtGLnByb3RvdHlwZS5pPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ307CnZhciBRYj1mdW5jdGlvbihhKXthLk18fChhLk09bmV3IEViKGEpKTtyZXR1cm4gcChhLk0pfTtGLnByb3RvdHlwZS5BYT1mdW5jdGlvbihhKXtpZih0aGlzLmgmJnRoaXMuaCE9YSl0aHJvdyBFcnJvcigiTWV0aG9kIG5vdCBzdXBwb3J0ZWQiKTtGLmwuQWEuY2FsbCh0aGlzLGEpfTtGLnByb3RvdHlwZS5tYT1mdW5jdGlvbigpe3RoaXMuZz1aYSh0aGlzLkcuZywiRElWIil9O0YucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbihhKXtSYih0aGlzLGEpfTsKdmFyIFJiPWZ1bmN0aW9uKGEsYixjKXtpZihhLnMpdGhyb3cgRXJyb3IoIkNvbXBvbmVudCBhbHJlYWR5IHJlbmRlcmVkIik7YS5nfHxhLm1hKCk7Yj9iLmluc2VydEJlZm9yZShhLmcsY3x8bnVsbCk6YS5HLmcuYm9keS5hcHBlbmRDaGlsZChhLmcpO2EuaCYmIWEuaC5zfHxhLkkoKX0sU2I9ZnVuY3Rpb24oYSxiKXtpZihhLnMpdGhyb3cgRXJyb3IoIkNvbXBvbmVudCBhbHJlYWR5IHJlbmRlcmVkIik7aWYoYiYmYS53YShiKSl7YS5TYT0hMDt2YXIgYz1iYihiKTthLkcmJmEuRy5nPT1jfHwoYS5HPWI/bmV3IGZiKGJiKGIpKTpwYXx8KHBhPW5ldyBmYikpO2EuRWEoYik7YS5JKCl9ZWxzZSB0aHJvdyBFcnJvcigiSW52YWxpZCBlbGVtZW50IHRvIGRlY29yYXRlIik7fTtnPUYucHJvdG90eXBlO2cud2E9ZnVuY3Rpb24oKXtyZXR1cm4hMH07Zy5FYT1mdW5jdGlvbihhKXt0aGlzLmc9YX07CmcuST1mdW5jdGlvbigpe3RoaXMucz0hMDtUYih0aGlzLGZ1bmN0aW9uKGEpeyFhLnMmJmEuaSgpJiZhLkkoKX0pfTtnLlU9ZnVuY3Rpb24oKXtUYih0aGlzLGZ1bmN0aW9uKGEpe2EucyYmYS5VKCl9KTt0aGlzLk0mJkdiKHRoaXMuTSk7dGhpcy5zPSExfTtnLkM9ZnVuY3Rpb24oKXt0aGlzLnMmJnRoaXMuVSgpO3RoaXMuTSYmKHRoaXMuTS5kaXNwb3NlKCksZGVsZXRlIHRoaXMuTSk7VGIodGhpcyxmdW5jdGlvbihhKXthLmRpc3Bvc2UoKX0pOyF0aGlzLlNhJiZ0aGlzLmcmJiRhKHRoaXMuZyk7dGhpcy5oPXRoaXMuZz10aGlzLnU9dGhpcy5qPW51bGw7Ri5sLkMuY2FsbCh0aGlzKX07Zy5CYT1mdW5jdGlvbihhLGIpe3RoaXMuQ2EoYSxIKHRoaXMpLGIpfTsKZy5DYT1mdW5jdGlvbihhLGIsYyl7cCghIWEsIlByb3ZpZGVkIGVsZW1lbnQgbXVzdCBub3QgYmUgbnVsbC4iKTtpZihhLnMmJihjfHwhdGhpcy5zKSl0aHJvdyBFcnJvcigiQ29tcG9uZW50IGFscmVhZHkgcmVuZGVyZWQiKTtpZihiPDB8fGI+SCh0aGlzKSl0aHJvdyBFcnJvcigiQ2hpbGQgY29tcG9uZW50IGluZGV4IG91dCBvZiBib3VuZHMiKTt0aGlzLnUmJnRoaXMuanx8KHRoaXMudT17fSx0aGlzLmo9W10pO2lmKGEuaD09dGhpcyl7dmFyIGQ9dGhpcy51LGU9T2IoYSk7ZFtlXT1hO3hhKHRoaXMuaixhKX1lbHNlIERhKHRoaXMudSxPYihhKSxhKTtpZihhPT10aGlzKXRocm93IEVycm9yKCJVbmFibGUgdG8gc2V0IHBhcmVudCBjb21wb25lbnQiKTtpZihkPXRoaXMmJmEuaCYmYS5ZKWU9YS5oLGQ9YS5ZLGUudSYmZD8oZT1lLnUsZD0oZSE9PW51bGwmJmQgaW4gZT9lW2RdOnZvaWQgMCl8fG51bGwpOmQ9bnVsbDtpZihkJiZhLmghPXRoaXMpdGhyb3cgRXJyb3IoIlVuYWJsZSB0byBzZXQgcGFyZW50IGNvbXBvbmVudCIpOwphLmg9dGhpcztGLmwuQWEuY2FsbChhLHRoaXMpO3phKHRoaXMuaixiLDAsYSk7YS5zJiZ0aGlzLnMmJmEuaD09dGhpcz8oYz10aGlzLm5hKCksKGMuY2hpbGROb2Rlc1tiXXx8bnVsbCkhPWEuaSgpJiYoYS5pKCkucGFyZW50RWxlbWVudD09YyYmYy5yZW1vdmVDaGlsZChhLmkoKSksYj1jLmNoaWxkTm9kZXNbYl18fG51bGwsYy5pbnNlcnRCZWZvcmUoYS5pKCksYikpKTpjPyh0aGlzLmd8fHRoaXMubWEoKSxiPUkodGhpcyxiKzEpLFJiKGEsdGhpcy5uYSgpLGI/Yi5nOm51bGwpKTp0aGlzLnMmJiFhLnMmJmEuZyYmYS5nLnBhcmVudE5vZGUmJmEuZy5wYXJlbnROb2RlLm5vZGVUeXBlPT0xJiZhLkkoKX07Zy5uYT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmd9Owp2YXIgVWI9ZnVuY3Rpb24oYSl7aWYoYS56YT09bnVsbCl7dmFyIGI9YS5zP2EuZzphLkcuZy5ib2R5O2E6e3ZhciBjPWJiKGIpO2lmKGMuZGVmYXVsdFZpZXcmJmMuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSYmKGM9Yy5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKGIsbnVsbCkpKXtjPWMuZGlyZWN0aW9ufHxjLmdldFByb3BlcnR5VmFsdWUoImRpcmVjdGlvbiIpfHwiIjticmVhayBhfWM9IiJ9YS56YT0icnRsIj09KGN8fChiLmN1cnJlbnRTdHlsZT9iLmN1cnJlbnRTdHlsZS5kaXJlY3Rpb246bnVsbCl8fGIuc3R5bGUmJmIuc3R5bGUuZGlyZWN0aW9uKX1yZXR1cm4gYS56YX0sSD1mdW5jdGlvbihhKXtyZXR1cm4gYS5qP2Euai5sZW5ndGg6MH0sST1mdW5jdGlvbihhLGIpe3JldHVybiBhLmo/YS5qW2JdfHxudWxsOm51bGx9LFRiPWZ1bmN0aW9uKGEsYixjKXthLmomJmEuai5mb3JFYWNoKGIsYyl9LFZiPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuaiYmYj9hLmouaW5kZXhPZihiKToKLTF9O3ZhciBXYj17bWI6ImFjdGl2ZWRlc2NlbmRhbnQiLHJiOiJhdG9taWMiLHNiOiJhdXRvY29tcGxldGUiLHViOiJidXN5Iix4YjoiY2hlY2tlZCIseWI6ImNvbGluZGV4IixEYjoiY29udHJvbHMiLEViOiJjdXJyZW50IixHYjoiZGVzY3JpYmVkYnkiLEpiOiJkaXNhYmxlZCIsTGI6ImRyb3BlZmZlY3QiLE1iOiJleHBhbmRlZCIsTmI6ImZsb3d0byIsUGI6ImdyYWJiZWQiLFRiOiJoYXNwb3B1cCIsVmI6ImhpZGRlbiIsWGI6ImludmFsaWQiLFliOiJsYWJlbCIsWmI6ImxhYmVsbGVkYnkiLGFjOiJsZXZlbCIsZmM6ImxpdmUiLHZjOiJtdWx0aWxpbmUiLHdjOiJtdWx0aXNlbGVjdGFibGUiLEFjOiJvcmllbnRhdGlvbiIsQmM6Im93bnMiLENjOiJwb3NpbnNldCIsRWM6InByZXNzZWQiLEljOiJyZWFkb25seSIsS2M6InJlbGV2YW50IixMYzoicmVxdWlyZWQiLFBjOiJyb3dpbmRleCIsU2M6InNlbGVjdGVkIixVYzoic2V0c2l6ZSIsV2M6InNvcnQiLG1kOiJ2YWx1ZW1heCIsbmQ6InZhbHVlbWluIiwKb2Q6InZhbHVlbm93IixwZDoidmFsdWV0ZXh0In07dmFyIFhiO3ZhciBZYj17bmI6ImFsZXJ0IixvYjoiYWxlcnRkaWFsb2ciLHBiOiJhcHBsaWNhdGlvbiIscWI6ImFydGljbGUiLHRiOiJiYW5uZXIiLHZiOiJidXR0b24iLHdiOiJjaGVja2JveCIsemI6ImNvbHVtbmhlYWRlciIsQWI6ImNvbWJvYm94IixCYjoiY29tcGxlbWVudGFyeSIsQ2I6ImNvbnRlbnRpbmZvIixGYjoiZGVmaW5pdGlvbiIsSGI6ImRpYWxvZyIsSWI6ImRpcmVjdG9yeSIsS2I6ImRvY3VtZW50IixPYjoiZm9ybSIsUWI6ImdyaWQiLFJiOiJncmlkY2VsbCIsU2I6Imdyb3VwIixVYjoiaGVhZGluZyIsV2I6ImltZyIsYmM6ImxpbmsiLGNjOiJsaXN0IixkYzoibGlzdGJveCIsZWM6Imxpc3RpdGVtIixoYzoibG9nIixpYzoibWFpbiIsamM6Im1hcnF1ZWUiLGtjOiJtYXRoIixsYzoibWVudSIsbWM6Im1lbnViYXIiLG5jOiJtZW51aXRlbSIsb2M6Im1lbnVpdGVtY2hlY2tib3giLHBjOiJtZW51aXRlbXJhZGlvIix4YzoibmF2aWdhdGlvbiIseWM6Im5vdGUiLHpjOiJvcHRpb24iLApEYzoicHJlc2VudGF0aW9uIixGYzoicHJvZ3Jlc3NiYXIiLEdjOiJyYWRpbyIsSGM6InJhZGlvZ3JvdXAiLEpjOiJyZWdpb24iLE1jOiJyb3ciLE5jOiJyb3dncm91cCIsT2M6InJvd2hlYWRlciIsUWM6InNjcm9sbGJhciIsUmM6InNlYXJjaCIsVGM6InNlcGFyYXRvciIsVmM6InNsaWRlciIsWGM6InNwaW5idXR0b24iLFljOiJzdGF0dXMiLFpjOiJzd2l0Y2giLGFkOiJ0YWIiLGJkOiJ0YWJsaXN0IixjZDoidGFicGFuZWwiLGRkOiJ0ZXh0Ym94IixlZDoidGV4dGluZm8iLGZkOiJ0aW1lciIsZ2Q6InRvb2xiYXIiLGhkOiJ0b29sdGlwIixqZDoidHJlZSIsa2Q6InRyZWVncmlkIixsZDoidHJlZWl0ZW0ifTt2YXIgWmI9ZnVuY3Rpb24oYSxiKXtiPyhwKENhKFliLGIpLCJObyBzdWNoIEFSSUEgcm9sZSAiK2IpLGEuc2V0QXR0cmlidXRlKCJyb2xlIixiKSk6YS5yZW1vdmVBdHRyaWJ1dGUoInJvbGUiKX0sYWM9ZnVuY3Rpb24oYSxiLGMpe0FycmF5LmlzQXJyYXkoYykmJihjPWMuam9pbigiICIpKTt2YXIgZD0kYihiKTtjPT09IiJ8fGM9PXZvaWQgMD8oWGJ8fChjPXt9LFhiPShjLmF0b21pYz0hMSxjLmF1dG9jb21wbGV0ZT0ibm9uZSIsYy5kcm9wZWZmZWN0PSJub25lIixjLmhhc3BvcHVwPSExLGMubGl2ZT0ib2ZmIixjLm11bHRpbGluZT0hMSxjLm11bHRpc2VsZWN0YWJsZT0hMSxjLm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIsYy5yZWFkb25seT0hMSxjLnJlbGV2YW50PSJhZGRpdGlvbnMgdGV4dCIsYy5yZXF1aXJlZD0hMSxjLnNvcnQ9Im5vbmUiLGMuYnVzeT0hMSxjLmRpc2FibGVkPSExLGMuaGlkZGVuPSExLGMuaW52YWxpZD0iZmFsc2UiLGMpKSxjPVhiLGIgaW4gYz9hLnNldEF0dHJpYnV0ZShkLApjW2JdKTphLnJlbW92ZUF0dHJpYnV0ZShkKSk6YS5zZXRBdHRyaWJ1dGUoZCxjKX0sJGI9ZnVuY3Rpb24oYSl7cChhLCJBUklBIGF0dHJpYnV0ZSBjYW5ub3QgYmUgZW1wdHkuIik7cChDYShXYixhKSwiTm8gc3VjaCBBUklBIGF0dHJpYnV0ZSAiK2EpO3JldHVybiJhcmlhLSIrYX07dmFyIGRjPWZ1bmN0aW9uKGEsYixjLGQsZSxmKXtpZih2JiZlKXJldHVybiBiYyhhKTtpZihlJiYhZClyZXR1cm4hMTtpZighdCl7dHlwZW9mIGI9PT0ibnVtYmVyIiYmKGI9Y2MoYikpO3ZhciBoPWI9PTE3fHxiPT0xOHx8diYmYj09OTE7aWYoKCFjfHx2KSYmaHx8diYmYj09MTYmJihkfHxmKSlyZXR1cm4hMX1pZih1JiZkJiZjKXN3aXRjaChhKXtjYXNlIDIyMDpjYXNlIDIxOTpjYXNlIDIyMTpjYXNlIDE5MjpjYXNlIDE4NjpjYXNlIDE4OTpjYXNlIDE4NzpjYXNlIDE4ODpjYXNlIDE5MDpjYXNlIDE5MTpjYXNlIDE5MjpjYXNlIDIyMjpyZXR1cm4hMX1zd2l0Y2goYSl7Y2FzZSAxMzpyZXR1cm4gdD9mfHxlPyExOiEoYyYmZCk6ITA7Y2FzZSAyNzpyZXR1cm4hdSYmIXR9cmV0dXJuIHQmJihkfHxlfHxmKT8hMTpiYyhhKX0sYmM9ZnVuY3Rpb24oYSl7aWYoYT49NDgmJmE8PTU3fHxhPj05NiYmYTw9MTA2fHxhPj02NSYmYTw9OTB8fHUmJmE9PTApcmV0dXJuITA7c3dpdGNoKGEpe2Nhc2UgMzI6Y2FzZSA0MzpjYXNlIDYzOmNhc2UgNjQ6Y2FzZSAxMDc6Y2FzZSAxMDk6Y2FzZSAxMTA6Y2FzZSAxMTE6Y2FzZSAxODY6Y2FzZSA1OTpjYXNlIDE4OTpjYXNlIDE4NzpjYXNlIDYxOmNhc2UgMTg4OmNhc2UgMTkwOmNhc2UgMTkxOmNhc2UgMTkyOmNhc2UgMjIyOmNhc2UgMjE5OmNhc2UgMjIwOmNhc2UgMjIxOmNhc2UgMTYzOmNhc2UgNTg6cmV0dXJuITA7CmNhc2UgMTczOmNhc2UgMTcxOnJldHVybiB0O2RlZmF1bHQ6cmV0dXJuITF9fSxjYz1mdW5jdGlvbihhKXtpZih0KWE9ZWMoYSk7ZWxzZSBpZih2JiZ1KXN3aXRjaChhKXtjYXNlIDkzOmE9OTF9cmV0dXJuIGF9LGVjPWZ1bmN0aW9uKGEpe3N3aXRjaChhKXtjYXNlIDYxOnJldHVybiAxODc7Y2FzZSA1OTpyZXR1cm4gMTg2O2Nhc2UgMTczOnJldHVybiAxODk7Y2FzZSAyMjQ6cmV0dXJuIDkxO2Nhc2UgMDpyZXR1cm4gMjI0O2RlZmF1bHQ6cmV0dXJuIGF9fTt2YXIgZmM9ZnVuY3Rpb24oYSxiLGMsZCl7ei5jYWxsKHRoaXMsZCk7dGhpcy50eXBlPSJrZXkiO3RoaXMuZz1hO3RoaXMucmVwZWF0PWN9O24oZmMseik7dmFyIEo9ZnVuY3Rpb24oYSxiKXtELmNhbGwodGhpcyk7YSYmZ2ModGhpcyxhLGIpfTtuKEosRCk7Zz1KLnByb3RvdHlwZTtnLlI9bnVsbDtnLnFhPW51bGw7Zy5KYT1udWxsO2cucmE9bnVsbDtnLkY9LTE7Zy5LPS0xO2cuRGE9ITE7CnZhciBoYz17MzoxMywxMjoxNDQsNjMyMzI6MzgsNjMyMzM6NDAsNjMyMzQ6MzcsNjMyMzU6MzksNjMyMzY6MTEyLDYzMjM3OjExMyw2MzIzODoxMTQsNjMyMzk6MTE1LDYzMjQwOjExNiw2MzI0MToxMTcsNjMyNDI6MTE4LDYzMjQzOjExOSw2MzI0NDoxMjAsNjMyNDU6MTIxLDYzMjQ2OjEyMiw2MzI0NzoxMjMsNjMyNDg6NDQsNjMyNzI6NDYsNjMyNzM6MzYsNjMyNzU6MzUsNjMyNzY6MzMsNjMyNzc6MzQsNjMyODk6MTQ0LDYzMzAyOjQ1fSxpYz17VXA6MzgsRG93bjo0MCxMZWZ0OjM3LFJpZ2h0OjM5LEVudGVyOjEzLEYxOjExMixGMjoxMTMsRjM6MTE0LEY0OjExNSxGNToxMTYsRjY6MTE3LEY3OjExOCxGODoxMTksRjk6MTIwLEYxMDoxMjEsRjExOjEyMixGMTI6MTIzLCJVKzAwN0YiOjQ2LEhvbWU6MzYsRW5kOjM1LFBhZ2VVcDozMyxQYWdlRG93bjozNCxJbnNlcnQ6NDV9LGpjPXYmJnQ7CkoucHJvdG90eXBlLmc9ZnVuY3Rpb24oYSl7dSYmKHRoaXMuRj09MTcmJiFhLmN0cmxLZXl8fHRoaXMuRj09MTgmJiFhLmFsdEtleXx8diYmdGhpcy5GPT05MSYmIWEubWV0YUtleSkmJih0aGlzLks9dGhpcy5GPS0xKTt0aGlzLkY9PS0xJiYoYS5jdHJsS2V5JiZhLmchPTE3P3RoaXMuRj0xNzphLmFsdEtleSYmYS5nIT0xOD90aGlzLkY9MTg6YS5tZXRhS2V5JiZhLmchPTkxJiYodGhpcy5GPTkxKSk7ZGMoYS5nLHRoaXMuRixhLnNoaWZ0S2V5LGEuY3RybEtleSxhLmFsdEtleSxhLm1ldGFLZXkpPyh0aGlzLks9Y2MoYS5nKSxqYyYmKHRoaXMuRGE9YS5hbHRLZXkpKTp0aGlzLmhhbmRsZUV2ZW50KGEpfTtKLnByb3RvdHlwZS5oPWZ1bmN0aW9uKGEpe3RoaXMuSz10aGlzLkY9LTE7dGhpcy5EYT1hLmFsdEtleX07CkoucHJvdG90eXBlLmhhbmRsZUV2ZW50PWZ1bmN0aW9uKGEpe3ZhciBiPWEuaCxjPWIuYWx0S2V5O2lmKHUmJmEudHlwZT09ImtleXByZXNzIil7dmFyIGQ9dGhpcy5LO3ZhciBlPWIuY2hhckNvZGU+PTAmJmIuY2hhckNvZGU8NjMyMzImJmJjKGQpP2IuY2hhckNvZGU6MH1lbHNlIGEudHlwZT09ImtleXByZXNzIj8oamMmJihjPXRoaXMuRGEpLGIua2V5Q29kZT09Yi5jaGFyQ29kZT9iLmtleUNvZGU8MzI/KGQ9Yi5rZXlDb2RlLGU9MCk6KGQ9dGhpcy5LLGU9Yi5jaGFyQ29kZSk6KGQ9Yi5rZXlDb2RlfHx0aGlzLkssZT1iLmNoYXJDb2RlfHwwKSk6KGQ9Yi5rZXlDb2RlfHx0aGlzLkssZT1iLmNoYXJDb2RlfHwwKSx2JiZlPT02MyYmZD09MjI0JiYoZD0xOTEpO3ZhciBmPWQ9Y2MoZCk7ZD9kPj02MzIzMiYmZCBpbiBoYz9mPWhjW2RdOmQ9PTI1JiZhLnNoaWZ0S2V5JiYoZj05KTpiLmtleUlkZW50aWZpZXImJmIua2V5SWRlbnRpZmllciBpbiBpYyYmKGY9aWNbYi5rZXlJZGVudGlmaWVyXSk7CmlmKCF0fHxhLnR5cGUhPSJrZXlwcmVzcyJ8fGRjKGYsdGhpcy5GLGEuc2hpZnRLZXksYS5jdHJsS2V5LGMsYS5tZXRhS2V5KSlhPWY9PXRoaXMuRix0aGlzLkY9ZixiPW5ldyBmYyhmLGUsYSxiKSxiLmFsdEtleT1jLEUodGhpcyxiKX07Si5wcm90b3R5cGUuaT1mdW5jdGlvbigpe3JldHVybiB0aGlzLlJ9O3ZhciBnYz1mdW5jdGlvbihhLGIsYyl7YS5yYSYma2MoYSk7YS5SPWI7YS5xYT11YihhLlIsImtleXByZXNzIixhLGMpO2EuSmE9dWIoYS5SLCJrZXlkb3duIixhLmcsYyxhKTthLnJhPXViKGEuUiwia2V5dXAiLGEuaCxjLGEpfSxrYz1mdW5jdGlvbihhKXthLnFhJiYoQShhLnFhKSxBKGEuSmEpLEEoYS5yYSksYS5xYT1udWxsLGEuSmE9bnVsbCxhLnJhPW51bGwpO2EuUj1udWxsO2EuRj0tMTthLks9LTF9O0oucHJvdG90eXBlLkM9ZnVuY3Rpb24oKXtKLmwuQy5jYWxsKHRoaXMpO2tjKHRoaXMpfTt2YXIgSz17Z2E6Im1vdXNlZG93biIsaGE6Im1vdXNldXAiLGZhOiJtb3VzZWNhbmNlbCIsc2M6Im1vdXNlbW92ZSIsdWM6Im1vdXNlb3ZlciIsdGM6Im1vdXNlb3V0IixxYzoibW91c2VlbnRlciIscmM6Im1vdXNlbGVhdmUifTt2YXIgbGM9ZnVuY3Rpb24oYSl7cmV0dXJuIHR5cGVvZiBhLmNsYXNzTmFtZT09InN0cmluZyI/YS5jbGFzc05hbWU6YS5nZXRBdHRyaWJ1dGUmJmEuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIn0sTD1mdW5jdGlvbihhKXtyZXR1cm4gYS5jbGFzc0xpc3Q/YS5jbGFzc0xpc3Q6bGMoYSkubWF0Y2goL1xTKy9nKXx8W119LG1jPWZ1bmN0aW9uKGEsYil7dHlwZW9mIGEuY2xhc3NOYW1lPT0ic3RyaW5nIj9hLmNsYXNzTmFtZT1iOmEuc2V0QXR0cmlidXRlJiZhLnNldEF0dHJpYnV0ZSgiY2xhc3MiLGIpfSxuYz1mdW5jdGlvbihhLGIpe2EuY2xhc3NMaXN0P2I9YS5jbGFzc0xpc3QuY29udGFpbnMoYik6KGE9TChhKSxiPXZhKGEsYik+PTApO3JldHVybiBifSxvYz1mdW5jdGlvbihhLGIpe2lmKGEuY2xhc3NMaXN0KWEuY2xhc3NMaXN0LmFkZChiKTtlbHNlIGlmKCFuYyhhLGIpKXt2YXIgYz1sYyhhKTttYyhhLGMrKGMubGVuZ3RoPjA/IiAiK2I6YikpfX0scGM9ZnVuY3Rpb24oYSxiKXtpZihhLmNsYXNzTGlzdClBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGIsCmZ1bmN0aW9uKGUpe29jKGEsZSl9KTtlbHNle3ZhciBjPXt9O0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoTChhKSxmdW5jdGlvbihlKXtjW2VdPSEwfSk7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChiLGZ1bmN0aW9uKGUpe2NbZV09ITB9KTtiPSIiO2Zvcih2YXIgZCBpbiBjKWIrPWIubGVuZ3RoPjA/IiAiK2Q6ZDttYyhhLGIpfX0scWM9ZnVuY3Rpb24oYSxiKXthLmNsYXNzTGlzdD9hLmNsYXNzTGlzdC5yZW1vdmUoYik6bmMoYSxiKSYmbWMoYSxBcnJheS5wcm90b3R5cGUuZmlsdGVyLmNhbGwoTChhKSxmdW5jdGlvbihjKXtyZXR1cm4gYyE9Yn0pLmpvaW4oIiAiKSl9LHJjPWZ1bmN0aW9uKGEsYil7YS5jbGFzc0xpc3Q/QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChiLGZ1bmN0aW9uKGMpe3FjKGEsYyl9KTptYyhhLEFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbChMKGEpLGZ1bmN0aW9uKGMpe3JldHVybiEodmEoYixjKT49MCl9KS5qb2luKCIgIikpfTt2YXIgdGM9ZnVuY3Rpb24oYSxiKXtpZighYSl0aHJvdyBFcnJvcigiSW52YWxpZCBjbGFzcyBuYW1lICIrYSk7aWYodHlwZW9mIGIhPT0iZnVuY3Rpb24iKXRocm93IEVycm9yKCJJbnZhbGlkIGRlY29yYXRvciBmdW5jdGlvbiAiK2IpO3NjW2FdPWJ9LHVjPXt9LHNjPXt9O3ZhciB2Yz1mdW5jdGlvbihhKXt0aGlzLkE9YX07aWEodmMpO3ZhciB3Yz1mdW5jdGlvbihhLGIpe2EmJihhLnRhYkluZGV4PWI/MDotMSl9LHljPWZ1bmN0aW9uKGEsYixjKXtjLmlkJiZQYihiLGMuaWQpO3ZhciBkPWEuZygpLGU9ITEsZj1MKGMpO2YmJkFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoZixmdW5jdGlvbihoKXtoPT1kP2U9ITA6aCYmdGhpcy51KGIsaCxkKX0sYSk7ZXx8b2MoYyxkKTt4YyhiLGMpO3JldHVybiBjfTt2Yy5wcm90b3R5cGUudT1mdW5jdGlvbihhLGIsYyl7Yj09YysiLWRpc2FibGVkIj9hLlgoITEpOmI9PWMrIi1ob3Jpem9udGFsIj96YyhhLCJob3Jpem9udGFsIik6Yj09YysiLXZlcnRpY2FsIiYmemMoYSwidmVydGljYWwiKX07CnZhciB4Yz1mdW5jdGlvbihhLGIpe2lmKGIpZm9yKHZhciBjPWIuZmlyc3RDaGlsZCxkO2MmJmMucGFyZW50Tm9kZT09Yjspe2Q9Yy5uZXh0U2libGluZztpZihjLm5vZGVUeXBlPT0xKXthOnt2YXIgZT1jO3AoZSk7ZT1MKGUpO2Zvcih2YXIgZj1lLmxlbmd0aCxoPTA7aDxmO2grKyl7dmFyIGs9ZVtoXTtpZihrPWsgaW4gc2M/c2Nba10oKTpudWxsKXtlPWs7YnJlYWsgYX19ZT1udWxsfWUmJihlLmc9YyxhLmlzRW5hYmxlZCgpfHxlLlgoITEpLGEuQmEoZSksU2IoZSxjKSl9ZWxzZSBjLm5vZGVWYWx1ZSYmSGEoYy5ub2RlVmFsdWUpIT0iInx8Yi5yZW1vdmVDaGlsZChjKTtjPWR9fSxBYz1mdW5jdGlvbihhLGIpe2I9Yi5pKCk7cChiLCJUaGUgY29udGFpbmVyIERPTSBlbGVtZW50IGNhbm5vdCBiZSBudWxsLiIpO0tiKGIsdCk7KGE9YS5BKSYmWmIoYixhKX07dmMucHJvdG90eXBlLmc9ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy1jb250YWluZXIifTsKdmMucHJvdG90eXBlLmo9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nKCksYz1bYixhLkw9PSJob3Jpem9udGFsIj9iKyItaG9yaXpvbnRhbCI6YisiLXZlcnRpY2FsIl07YS5pc0VuYWJsZWQoKXx8Yy5wdXNoKGIrIi1kaXNhYmxlZCIpO3JldHVybiBjfTt2YXIgQmM9ZnVuY3Rpb24oKXt9O3ZhciBNPWZ1bmN0aW9uKCl7fSxDYztpYShNKTt2YXIgRGM9e2J1dHRvbjoicHJlc3NlZCIsY2hlY2tib3g6ImNoZWNrZWQiLG1lbnVpdGVtOiJzZWxlY3RlZCIsbWVudWl0ZW1jaGVja2JveDoiY2hlY2tlZCIsbWVudWl0ZW1yYWRpbzoiY2hlY2tlZCIscmFkaW86ImNoZWNrZWQiLHRhYjoic2VsZWN0ZWQiLHRyZWVpdGVtOiJzZWxlY3RlZCJ9O00ucHJvdG90eXBlLk5hPWZ1bmN0aW9uKCl7fTtNLnByb3RvdHlwZS54YT1mdW5jdGlvbihhKXt2YXIgYj1hLkcsYz1iLmgsZD10aGlzLk4oKSxlPVtkXSxmPXRoaXMuTigpO2YhPWQmJmUucHVzaChmKTtkPWEubTtmb3IoZj1bXTtkOyl7dmFyIGg9ZCYtZDtmLnB1c2goRWModGhpcyxoKSk7ZCY9fmh9ZS5wdXNoLmFwcGx5KGUsZik7KGQ9YS5GYSkmJmUucHVzaC5hcHBseShlLGQpO3JldHVybiBjLmNhbGwoYiwiRElWIixlLmpvaW4oIiAiKSxhLmlhKX07Ck0ucHJvdG90eXBlLnlhPWZ1bmN0aW9uKGEsYil7Yi5pZCYmUGIoYSxiLmlkKTtiJiZiLmZpcnN0Q2hpbGQ/RmMoYSxiLmZpcnN0Q2hpbGQubmV4dFNpYmxpbmc/eWEoYi5jaGlsZE5vZGVzKTpiLmZpcnN0Q2hpbGQpOmEuaWE9bnVsbDt2YXIgYz0wLGQ9dGhpcy5OKCksZT10aGlzLk4oKSxmPSExLGg9ITEsaz15YShMKGIpKTtrLmZvckVhY2goZnVuY3Rpb24ocSl7Znx8cSE9ZD9ofHxxIT1lP2N8PUdjKHRoaXMscSk6aD0hMDooZj0hMCxlPT1kJiYoaD0hMCkpO0djKHRoaXMscSk9PTEmJihzYShiKSxkYihiKSYmZWIoYikmJmNiKGIsITEpKX0sdGhpcyk7YS5tPWM7Znx8KGsucHVzaChkKSxlPT1kJiYoaD0hMCkpO2h8fGsucHVzaChlKTsoYT1hLkZhKSYmay5wdXNoLmFwcGx5KGssYSk7ZiYmaCYmIWF8fG1jKGIsay5qb2luKCIgIikpO3JldHVybiBifTsKdmFyIEhjPWZ1bmN0aW9uKGEsYil7aWYoYT1hLk5hKCkpe3AoYiwiVGhlIGVsZW1lbnQgcGFzc2VkIGFzIGEgZmlyc3QgcGFyYW1ldGVyIGNhbm5vdCBiZSBudWxsLiIpO3ZhciBjPWIuZ2V0QXR0cmlidXRlKCJyb2xlIil8fG51bGw7YSE9YyYmWmIoYixhKX19LEljPWZ1bmN0aW9uKGEsYil7dmFyIGM7aWYoYS5EJjMyJiYoYz1hLmkoKSkpe2lmKCFiJiZhLm0mMzIpe3RyeXtjLmJsdXIoKX1jYXRjaChkKXt9YS5tJjMyJiZhLlFhKG51bGwpfShkYihjKSYmZWIoYykpIT1iJiZjYihjLGIpfX0sSmM9ZnVuY3Rpb24oYSxiLGMpe0NjfHwoQ2M9ezE6ImRpc2FibGVkIiw4OiJzZWxlY3RlZCIsMTY6ImNoZWNrZWQiLDY0OiJleHBhbmRlZCJ9KTtwKGEsIlRoZSBlbGVtZW50IHBhc3NlZCBhcyBhIGZpcnN0IHBhcmFtZXRlciBjYW5ub3QgYmUgbnVsbC4iKTtiPUNjW2JdO3ZhciBkPWEuZ2V0QXR0cmlidXRlKCJyb2xlIil8fG51bGw7ZCYmKGQ9RGNbZF18fGIsYj1iPT0iY2hlY2tlZCJ8fGI9PQoic2VsZWN0ZWQiP2Q6Yik7YiYmYWMoYSxiLGMpfTtNLnByb3RvdHlwZS5OPWZ1bmN0aW9uKCl7cmV0dXJuImdvb2ctY29udHJvbCJ9O3ZhciBFYz1mdW5jdGlvbihhLGIpe2EuZ3x8S2MoYSk7cmV0dXJuIGEuZ1tiXX0sR2M9ZnVuY3Rpb24oYSxiKXthLmh8fChhLmd8fEtjKGEpLGEuaD1FYShhLmcpKTthPXBhcnNlSW50KGEuaFtiXSwxMCk7cmV0dXJuIGlzTmFOKGEpPzA6YX0sS2M9ZnVuY3Rpb24oYSl7dmFyIGI9YS5OKCk7dmFyIGM9Yi5yZXBsYWNlKC9ceGEwfFxzL2csIiAiKS5pbmRleE9mKCIgIikhPS0xO3AoIWMsIkNvbnRyb2xSZW5kZXJlciBoYXMgYW4gaW52YWxpZCBjc3MgY2xhc3M6ICciK2IrIiciKTthLmc9ezE6YisiLWRpc2FibGVkIiwyOmIrIi1ob3ZlciIsNDpiKyItYWN0aXZlIiw4OmIrIi1zZWxlY3RlZCIsMTY6YisiLWNoZWNrZWQiLDMyOmIrIi1mb2N1c2VkIiw2NDpiKyItb3BlbiJ9fTt2YXIgTj1mdW5jdGlvbihhLGIsYyl7Ri5jYWxsKHRoaXMsYyk7aWYoIWIpe2ZvcihiPXRoaXMuY29uc3RydWN0b3I7Yjspe3ZhciBkPW5hKGIpO2lmKGQ9dWNbZF0pYnJlYWs7Yj0oYj1PYmplY3QuZ2V0UHJvdG90eXBlT2YoYi5wcm90b3R5cGUpKSYmYi5jb25zdHJ1Y3Rvcn1iPWQ/dHlwZW9mIGQuVj09PSJmdW5jdGlvbiI/ZC5WKCk6bmV3IGQ6bnVsbH10aGlzLnY9Yjt0aGlzLmlhPWEhPT12b2lkIDA/YTpudWxsfTtuKE4sRik7Zz1OLnByb3RvdHlwZTtnLmlhPW51bGw7Zy5tPTA7Zy5EPTM5O2cuUD0wO2cuT2E9ITA7Zy5GYT1udWxsO2cuSGE9ITA7Zy5tYT1mdW5jdGlvbigpe3ZhciBhPXRoaXMudi54YSh0aGlzKTt0aGlzLmc9YTtIYyh0aGlzLnYsYSk7S2IoYSwhMCk7dGhpcy5pc1Zpc2libGUoKXx8KGEuc3R5bGUuZGlzcGxheT0ibm9uZSIsYSYmYWMoYSwiaGlkZGVuIiwhMCkpfTtnLm5hPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaSgpfTtnLndhPWZ1bmN0aW9uKCl7cmV0dXJuITB9OwpnLkVhPWZ1bmN0aW9uKGEpe3RoaXMuZz1hPXRoaXMudi55YSh0aGlzLGEpO0hjKHRoaXMudixhKTtLYihhLCEwKTt0aGlzLk9hPWEuc3R5bGUuZGlzcGxheSE9Im5vbmUifTsKZy5JPWZ1bmN0aW9uKCl7Ti5sLkkuY2FsbCh0aGlzKTt2YXIgYT10aGlzLmc7cChhLCJDYW4gbm90IGNhbGwgZ2V0RWxlbWVudFN0cmljdCBiZWZvcmUgcmVuZGVyaW5nL2RlY29yYXRpbmcuIik7cCh0aGlzKTtwKGEpO3RoaXMuaXNWaXNpYmxlKCl8fGFjKGEsImhpZGRlbiIsIXRoaXMuaXNWaXNpYmxlKCkpO3RoaXMuaXNFbmFibGVkKCl8fEpjKGEsMSwhdGhpcy5pc0VuYWJsZWQoKSk7dGhpcy5EJjgmJkpjKGEsOCwhISh0aGlzLm0mOCkpO3RoaXMuRCYxNiYmSmMoYSwxNiwhISh0aGlzLm0mMTYpKTt0aGlzLkQmNjQmJkpjKGEsNjQsISEodGhpcy5tJjY0KSk7dmFyIGI9dGhpcy52O1ViKHRoaXMpJiYoYT10aGlzLmkoKSxiPWIuTigpKyItcnRsIiwoYT1hLmk/YS5pKCk6YSkmJnBjKGEsW2JdKSk7dGhpcy5pc0VuYWJsZWQoKSYmSWModGhpcyx0aGlzLmlzVmlzaWJsZSgpKTt0aGlzLkQmLTImJih0aGlzLkhhJiZMYyh0aGlzLCEwKSx0aGlzLkQmMzImJihhPXRoaXMuaSgpKSkmJihiPQp0aGlzLlp8fCh0aGlzLlo9bmV3IEopLGdjKGIsYSksQihCKEIoUWIodGhpcyksYiwia2V5Iix0aGlzLmFhKSxhLCJmb2N1cyIsdGhpcy5YYSksYSwiYmx1ciIsdGhpcy5RYSkpfTt2YXIgTGM9ZnVuY3Rpb24oYSxiKXt2YXIgYz1RYihhKSxkPWEuaSgpO2I/KEIoQihCKEIoYyxkLEsuZ2EsYS5zYSksZCxbSy5oYSxLLmZhXSxhLnZhKSxkLCJtb3VzZW92ZXIiLGEudWEpLGQsIm1vdXNlb3V0IixhLnRhKSxhLmNhIT1CYyYmQihjLGQsImNvbnRleHRtZW51IixhLmNhKSk6KEMoQyhDKEMoYyxkLEsuZ2EsYS5zYSksZCxbSy5oYSxLLmZhXSxhLnZhKSxkLCJtb3VzZW92ZXIiLGEudWEpLGQsIm1vdXNlb3V0IixhLnRhKSxhLmNhIT1CYyYmQyhjLGQsImNvbnRleHRtZW51IixhLmNhKSl9O04ucHJvdG90eXBlLlU9ZnVuY3Rpb24oKXtOLmwuVS5jYWxsKHRoaXMpO3RoaXMuWiYma2ModGhpcy5aKTt0aGlzLmlzVmlzaWJsZSgpJiZ0aGlzLmlzRW5hYmxlZCgpJiZJYyh0aGlzLCExKX07Ck4ucHJvdG90eXBlLkM9ZnVuY3Rpb24oKXtOLmwuQy5jYWxsKHRoaXMpO3RoaXMuWiYmKHRoaXMuWi5kaXNwb3NlKCksZGVsZXRlIHRoaXMuWik7ZGVsZXRlIHRoaXMudjt0aGlzLkZhPXRoaXMuaWE9bnVsbH07dmFyIEZjPWZ1bmN0aW9uKGEsYil7YS5pYT1ifTtOLnByb3RvdHlwZS5pc1Zpc2libGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5PYX07Ti5wcm90b3R5cGUuaXNFbmFibGVkPWZ1bmN0aW9uKCl7cmV0dXJuISh0aGlzLm0mMSl9O04ucHJvdG90eXBlLlg9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5oO2ImJnR5cGVvZiBiLmlzRW5hYmxlZD09ImZ1bmN0aW9uIiYmIWIuaXNFbmFibGVkKCl8fCFPKHRoaXMsMSwhYSl8fChhfHwoTWModGhpcywhMSksUCh0aGlzLCExKSksdGhpcy5pc1Zpc2libGUoKSYmSWModGhpcyxhKSxUKHRoaXMsMSwhYSwhMCkpfTt2YXIgUD1mdW5jdGlvbihhLGIpe08oYSwyLGIpJiZUKGEsMixiKX07Ck4ucHJvdG90eXBlLmlzQWN0aXZlPWZ1bmN0aW9uKCl7cmV0dXJuISEodGhpcy5tJjQpfTsKdmFyIE1jPWZ1bmN0aW9uKGEsYil7TyhhLDQsYikmJlQoYSw0LGIpfSxOYz1mdW5jdGlvbihhLGIpe08oYSw4LGIpJiZUKGEsOCxiKX0sT2M9ZnVuY3Rpb24oYSxiKXtPKGEsNjQsYikmJlQoYSw2NCxiKX0sVD1mdW5jdGlvbihhLGIsYyxkKXtpZighZCYmYj09MSlhLlgoIWMpO2Vsc2UgaWYoYS5EJmImJmMhPSEhKGEubSZiKSl7dmFyIGU9YS52O2lmKGQ9YS5pKCkpe2lmKGU9RWMoZSxiKSl7dmFyIGY9YS5pP2EuaSgpOmE7ZiYmKGM/cGM6cmMpKGYsW2VdKX1KYyhkLGIsYyl9YS5tPWM/YS5tfGI6YS5tJn5ifX0sUGM9ZnVuY3Rpb24oYSxiLGMpe2lmKGEucyYmYS5tJmImJiFjKXRocm93IEVycm9yKCJDb21wb25lbnQgYWxyZWFkeSByZW5kZXJlZCIpOyFjJiZhLm0mYiYmVChhLGIsITEpO2EuRD1jP2EuRHxiOmEuRCZ+Yn0sVT1mdW5jdGlvbihhLGIpe3JldHVybiEhKDI1NSZiKSYmISEoYS5EJmIpfSxPPWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4hIShhLkQmYikmJiEhKGEubSZiKSE9CmMmJighKGEuUCZiKXx8RShhLE5iKGIsYykpKSYmIWEuYmF9O04ucHJvdG90eXBlLnVhPWZ1bmN0aW9uKGEpeyFRYyhhLHRoaXMuaSgpKSYmRSh0aGlzLCJlbnRlciIpJiZ0aGlzLmlzRW5hYmxlZCgpJiZVKHRoaXMsMikmJlAodGhpcywhMCl9O04ucHJvdG90eXBlLnRhPWZ1bmN0aW9uKGEpeyFRYyhhLHRoaXMuaSgpKSYmRSh0aGlzLCJsZWF2ZSIpJiYoVSh0aGlzLDQpJiZNYyh0aGlzLCExKSxVKHRoaXMsMikmJlAodGhpcywhMSkpfTtOLnByb3RvdHlwZS5jYT1CYzt2YXIgUWM9ZnVuY3Rpb24oYSxiKXtyZXR1cm4hIWEucmVsYXRlZFRhcmdldCYmYWIoYixhLnJlbGF0ZWRUYXJnZXQpfTsKTi5wcm90b3R5cGUuc2E9ZnVuY3Rpb24oYSl7aWYodGhpcy5pc0VuYWJsZWQoKSYmKFUodGhpcywyKSYmUCh0aGlzLCEwKSwhKGEuaC5idXR0b24hPTB8fHYmJmEuY3RybEtleSkpKXtVKHRoaXMsNCkmJk1jKHRoaXMsITApO3ZhciBiO2lmKGI9dGhpcy52KXt2YXIgYztiPXRoaXMuRCYzMiYmKGM9dGhpcy5pKCkpP2RiKGMpJiZlYihjKTohMX1iJiZ0aGlzLmkoKS5mb2N1cygpfWEuaC5idXR0b24hPTB8fHYmJmEuY3RybEtleXx8YS5qKCl9O04ucHJvdG90eXBlLnZhPWZ1bmN0aW9uKGEpe3RoaXMuaXNFbmFibGVkKCkmJihVKHRoaXMsMikmJlAodGhpcywhMCksdGhpcy5pc0FjdGl2ZSgpJiZSYyh0aGlzLGEpJiZVKHRoaXMsNCkmJk1jKHRoaXMsITEpKX07CnZhciBSYz1mdW5jdGlvbihhLGIpe2lmKFUoYSwxNikpe3ZhciBjPSEoYS5tJjE2KTtPKGEsMTYsYykmJlQoYSwxNixjKX1VKGEsOCkmJk5jKGEsITApO1UoYSw2NCkmJk9jKGEsIShhLm0mNjQpKTtjPW5ldyB5KCJhY3Rpb24iLGEpO2ImJihjLmFsdEtleT1iLmFsdEtleSxjLmN0cmxLZXk9Yi5jdHJsS2V5LGMubWV0YUtleT1iLm1ldGFLZXksYy5zaGlmdEtleT1iLnNoaWZ0S2V5LGMuRz1iLkcsYy50aW1lU3RhbXA9Yi50aW1lU3RhbXApO3JldHVybiBFKGEsYyl9O04ucHJvdG90eXBlLlhhPWZ1bmN0aW9uKCl7VSh0aGlzLDMyKSYmTyh0aGlzLDMyLCEwKSYmVCh0aGlzLDMyLCEwKX07Ti5wcm90b3R5cGUuUWE9ZnVuY3Rpb24oKXtVKHRoaXMsNCkmJk1jKHRoaXMsITEpO1UodGhpcywzMikmJk8odGhpcywzMiwhMSkmJlQodGhpcywzMiwhMSl9OwpOLnByb3RvdHlwZS5hYT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5pc1Zpc2libGUoKSYmdGhpcy5pc0VuYWJsZWQoKSYmYS5nPT0xMyYmUmModGhpcyxhKT8oYS5qKCksYS52KCksITApOiExfTtpZih0eXBlb2YgTiE9PSJmdW5jdGlvbiIpdGhyb3cgRXJyb3IoIkludmFsaWQgY29tcG9uZW50IGNsYXNzICIrTik7aWYodHlwZW9mIE0hPT0iZnVuY3Rpb24iKXRocm93IEVycm9yKCJJbnZhbGlkIHJlbmRlcmVyIGNsYXNzICIrTSk7dmFyIFNjPW5hKE4pO3VjW1NjXT1NO3RjKCJnb29nLWNvbnRyb2wiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBOKG51bGwpfSk7dmFyIFY9ZnVuY3Rpb24oYSxiLGMpe0YuY2FsbCh0aGlzLGMpO3RoaXMuZWE9Ynx8dmMuVigpO3RoaXMuTD1hfHwidmVydGljYWwifTtuKFYsRik7Zz1WLnByb3RvdHlwZTtnLkthPW51bGw7Zy5kYT1udWxsO2cuZWE9bnVsbDtnLkw9bnVsbDtnLlM9ITA7Zy5UPSEwO2cubz0tMTtnLkI9bnVsbDtnLlc9ITE7Zy5PPW51bGw7dmFyIFRjPWZ1bmN0aW9uKGEpe3JldHVybiBhLkthfHxhLmkoKX07Zz1WLnByb3RvdHlwZTtnLm1hPWZ1bmN0aW9uKCl7dGhpcy5nPXRoaXMuRy5oKCJESVYiLHRoaXMuZWEuaih0aGlzKS5qb2luKCIgIikpfTtnLm5hPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaSgpfTtnLndhPWZ1bmN0aW9uKGEpe3JldHVybiBhLnRhZ05hbWU9PSJESVYifTtnLkVhPWZ1bmN0aW9uKGEpe3RoaXMuZz15Yyh0aGlzLmVhLHRoaXMsYSk7YS5zdHlsZS5kaXNwbGF5PT0ibm9uZSImJih0aGlzLlM9ITEpfTsKZy5JPWZ1bmN0aW9uKCl7Vi5sLkkuY2FsbCh0aGlzKTtUYih0aGlzLGZ1bmN0aW9uKGIpe2IucyYmVWModGhpcyxiKX0sdGhpcyk7dmFyIGE9dGhpcy5pKCk7QWModGhpcy5lYSx0aGlzKTtWYyh0aGlzLHRoaXMuUyk7QihCKEIoQihCKEIoQihCKFFiKHRoaXMpLHRoaXMsImVudGVyIix0aGlzLmViKSx0aGlzLCJoaWdobGlnaHQiLHRoaXMuZmIpLHRoaXMsInVuaGlnaGxpZ2h0Iix0aGlzLmxiKSx0aGlzLCJvcGVuIix0aGlzLmdiKSx0aGlzLCJjbG9zZSIsdGhpcy5iYiksYSxLLmdhLHRoaXMuV2EpLGJiKGEpLFtLLmhhLEsuZmFdLHRoaXMuY2IpLGEsW0suZ2EsSy5oYSxLLmZhLCJtb3VzZW92ZXIiLCJtb3VzZW91dCIsImNvbnRleHRtZW51Il0sdGhpcy5hYik7V2ModGhpcyl9O3ZhciBXYz1mdW5jdGlvbihhKXt2YXIgYj1RYihhKSxjPVRjKGEpO0IoQihCKGIsYywiZm9jdXMiLGEuUGEpLGMsImJsdXIiLGEuVWEpLGEuZGF8fChhLmRhPW5ldyBKKFRjKGEpKSksImtleSIsYS5WYSl9OwpnPVYucHJvdG90eXBlO2cuVT1mdW5jdGlvbigpe1hjKHRoaXMsLTEpO3RoaXMuQiYmT2ModGhpcy5CLCExKTt0aGlzLlc9ITE7Vi5sLlUuY2FsbCh0aGlzKX07Zy5DPWZ1bmN0aW9uKCl7Vi5sLkMuY2FsbCh0aGlzKTt0aGlzLmRhJiYodGhpcy5kYS5kaXNwb3NlKCksdGhpcy5kYT1udWxsKTt0aGlzLmVhPXRoaXMuQj10aGlzLk89dGhpcy5LYT1udWxsfTtnLmViPWZ1bmN0aW9uKCl7cmV0dXJuITB9OwpnLmZiPWZ1bmN0aW9uKGEpe3ZhciBiPVZiKHRoaXMsYS50YXJnZXQpO2lmKGI+LTEmJmIhPXRoaXMubyl7dmFyIGM9SSh0aGlzLHRoaXMubyk7YyYmUChjLCExKTt0aGlzLm89YjtjPUkodGhpcyx0aGlzLm8pO3RoaXMuVyYmTWMoYywhMCk7dGhpcy5CJiZjIT10aGlzLkImJihjLkQmNjQ/T2MoYywhMCk6T2ModGhpcy5CLCExKSl9Yj10aGlzLmkoKTtwKGIsIlRoZSBET00gZWxlbWVudCBmb3IgdGhlIGNvbnRhaW5lciBjYW5ub3QgYmUgbnVsbC4iKTthLnRhcmdldC5pKCkhPW51bGwmJmFjKGIsImFjdGl2ZWRlc2NlbmRhbnQiLGEudGFyZ2V0LmkoKS5pZCl9O2cubGI9ZnVuY3Rpb24oYSl7YS50YXJnZXQ9PUkodGhpcyx0aGlzLm8pJiYodGhpcy5vPS0xKTthPXRoaXMuaSgpO3AoYSwiVGhlIERPTSBlbGVtZW50IGZvciB0aGUgY29udGFpbmVyIGNhbm5vdCBiZSBudWxsLiIpO2EucmVtb3ZlQXR0cmlidXRlKCRiKCJhY3RpdmVkZXNjZW5kYW50IikpfTsKZy5nYj1mdW5jdGlvbihhKXsoYT1hLnRhcmdldCkmJmEhPXRoaXMuQiYmYS5oPT10aGlzJiYodGhpcy5CJiZPYyh0aGlzLkIsITEpLHRoaXMuQj1hKX07Zy5iYj1mdW5jdGlvbihhKXthLnRhcmdldD09dGhpcy5CJiYodGhpcy5CPW51bGwpO3ZhciBiPXRoaXMuaSgpLGM9YS50YXJnZXQuaSgpO2ImJmEudGFyZ2V0Lm0mMiYmYyYmKGE9IiIsYyYmKGE9Yy5pZCxwKGEsIlRoZSBhY3RpdmUgZWxlbWVudCBzaG91bGQgaGF2ZSBhbiBpZC4iKSksYWMoYiwiYWN0aXZlZGVzY2VuZGFudCIsYSkpfTtnLldhPWZ1bmN0aW9uKGEpe3RoaXMuVCYmKHRoaXMuVz0hMCk7dmFyIGI9VGModGhpcyk7YiYmZGIoYikmJmViKGIpP2IuZm9jdXMoKTphLmooKX07Zy5jYj1mdW5jdGlvbigpe3RoaXMuVz0hMX07CmcuYWI9ZnVuY3Rpb24oYSl7YTp7dmFyIGI9YS50YXJnZXQ7aWYodGhpcy5PKWZvcih2YXIgYz10aGlzLmkoKTtiJiZiIT09Yzspe3ZhciBkPWIuaWQ7aWYoZCBpbiB0aGlzLk8pe2I9dGhpcy5PW2RdO2JyZWFrIGF9Yj1iLnBhcmVudE5vZGV9Yj1udWxsfWlmKGIpc3dpdGNoKGEudHlwZSl7Y2FzZSBLLmdhOmIuc2EoYSk7YnJlYWs7Y2FzZSBLLmhhOmNhc2UgSy5mYTpiLnZhKGEpO2JyZWFrO2Nhc2UgIm1vdXNlb3ZlciI6Yi51YShhKTticmVhaztjYXNlICJtb3VzZW91dCI6Yi50YShhKTticmVhaztjYXNlICJjb250ZXh0bWVudSI6Yi5jYShhKX19O2cuUGE9ZnVuY3Rpb24oKXt9O2cuVWE9ZnVuY3Rpb24oKXtYYyh0aGlzLC0xKTt0aGlzLlc9ITE7dGhpcy5CJiZPYyh0aGlzLkIsITEpfTsKZy5WYT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5pc0VuYWJsZWQoKSYmdGhpcy5pc1Zpc2libGUoKSYmKEgodGhpcykhPTB8fHRoaXMuS2EpJiZZYyh0aGlzLGEpPyhhLmooKSxhLnYoKSwhMCk6ITF9Owp2YXIgWWM9ZnVuY3Rpb24oYSxiKXt2YXIgYz1JKGEsYS5vKTtpZihjJiZ0eXBlb2YgYy5hYT09ImZ1bmN0aW9uIiYmYy5hYShiKXx8YS5CJiZhLkIhPWMmJnR5cGVvZiBhLkIuYWE9PSJmdW5jdGlvbiImJmEuQi5hYShiKSlyZXR1cm4hMDtpZihiLnNoaWZ0S2V5fHxiLmN0cmxLZXl8fGIubWV0YUtleXx8Yi5hbHRLZXkpcmV0dXJuITE7c3dpdGNoKGIuZyl7Y2FzZSAyNzpUYyhhKS5ibHVyKCk7YnJlYWs7Y2FzZSAzNjpaYyhhKTticmVhaztjYXNlIDM1OiRjKGEpO2JyZWFrO2Nhc2UgMzg6aWYoYS5MPT0idmVydGljYWwiKWFkKGEpO2Vsc2UgcmV0dXJuITE7YnJlYWs7Y2FzZSAzNzppZihhLkw9PSJob3Jpem9udGFsIilVYihhKT9iZChhKTphZChhKTtlbHNlIHJldHVybiExO2JyZWFrO2Nhc2UgNDA6aWYoYS5MPT0idmVydGljYWwiKWJkKGEpO2Vsc2UgcmV0dXJuITE7YnJlYWs7Y2FzZSAzOTppZihhLkw9PSJob3Jpem9udGFsIilVYihhKT9hZChhKTpiZChhKTtlbHNlIHJldHVybiExOwpicmVhaztkZWZhdWx0OnJldHVybiExfXJldHVybiEwfSxVYz1mdW5jdGlvbihhLGIpe3ZhciBjPWIuaSgpO2M9Yy5pZHx8KGMuaWQ9T2IoYikpO2EuT3x8KGEuTz17fSk7YS5PW2NdPWJ9O1YucHJvdG90eXBlLkJhPWZ1bmN0aW9uKGEsYil7dWEoYSxOLCJUaGUgY2hpbGQgb2YgYSBjb250YWluZXIgbXVzdCBiZSBhIGNvbnRyb2wiKTtWLmwuQmEuY2FsbCh0aGlzLGEsYil9O1YucHJvdG90eXBlLkNhPWZ1bmN0aW9uKGEsYixjKXt1YShhLE4pO2EuUHw9MjthLlB8PTY0O1BjKGEsMzIsITEpO2EucyYmMCE9YS5IYSYmTGMoYSwhMSk7YS5IYT0hMTt2YXIgZD1hLmg9PXRoaXM/VmIodGhpcyxhKTotMTtWLmwuQ2EuY2FsbCh0aGlzLGEsYixjKTthLnMmJnRoaXMucyYmVWModGhpcyxhKTthPWQ7YT09LTEmJihhPUgodGhpcykpO2E9PXRoaXMubz90aGlzLm89TWF0aC5taW4oSCh0aGlzKS0xLGIpOmE+dGhpcy5vJiZiPD10aGlzLm8/dGhpcy5vKys6YTx0aGlzLm8mJmI+dGhpcy5vJiZ0aGlzLm8tLX07CnZhciB6Yz1mdW5jdGlvbihhLGIpe2lmKGEuaSgpKXRocm93IEVycm9yKCJDb21wb25lbnQgYWxyZWFkeSByZW5kZXJlZCIpO2EuTD1ifTtWLnByb3RvdHlwZS5pc1Zpc2libGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5TfTt2YXIgVmM9ZnVuY3Rpb24oYSxiKXthLlM9Yjt2YXIgYz1hLmkoKTtjJiYoYy5zdHlsZS5kaXNwbGF5PWI/IiI6Im5vbmUiLHdjKFRjKGEpLGEuVCYmYS5TKSl9O1YucHJvdG90eXBlLmlzRW5hYmxlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLlR9O1YucHJvdG90eXBlLlg9ZnVuY3Rpb24oYSl7dGhpcy5UIT1hJiZFKHRoaXMsYT8iZW5hYmxlIjoiZGlzYWJsZSIpJiYoYT8odGhpcy5UPSEwLFRiKHRoaXMsZnVuY3Rpb24oYil7Yi5UYT9kZWxldGUgYi5UYTpiLlgoITApfSkpOihUYih0aGlzLGZ1bmN0aW9uKGIpe2IuaXNFbmFibGVkKCk/Yi5YKCExKTpiLlRhPSEwfSksdGhpcy5XPXRoaXMuVD0hMSksd2MoVGModGhpcyksYSYmdGhpcy5TKSl9Owp2YXIgWGM9ZnVuY3Rpb24oYSxiKXsoYj1JKGEsYikpP1AoYiwhMCk6YS5vPi0xJiZQKEkoYSxhLm8pLCExKX0sWmM9ZnVuY3Rpb24oYSl7Y2QoYSxmdW5jdGlvbihiLGMpe3JldHVybihiKzEpJWN9LEgoYSktMSl9LCRjPWZ1bmN0aW9uKGEpe2NkKGEsZnVuY3Rpb24oYixjKXtiLS07cmV0dXJuIGI8MD9jLTE6Yn0sMCl9LGJkPWZ1bmN0aW9uKGEpe2NkKGEsZnVuY3Rpb24oYixjKXtyZXR1cm4oYisxKSVjfSxhLm8pfSxhZD1mdW5jdGlvbihhKXtjZChhLGZ1bmN0aW9uKGIsYyl7Yi0tO3JldHVybiBiPDA/Yy0xOmJ9LGEubyl9LGNkPWZ1bmN0aW9uKGEsYixjKXtjPWM8MD9WYihhLGEuQik6Yzt2YXIgZD1IKGEpO2M9Yi5jYWxsKGEsYyxkKTtmb3IodmFyIGU9MDtlPD1kOyl7dmFyIGY9SShhLGMpO2lmKGYmJmYuaXNWaXNpYmxlKCkmJmYuaXNFbmFibGVkKCkmJmYuRCYyKXthLkxhKGMpO2JyZWFrfWUrKztjPWIuY2FsbChhLGMsZCl9fTsKVi5wcm90b3R5cGUuTGE9ZnVuY3Rpb24oYSl7WGModGhpcyxhKX07dmFyIGRkPWZ1bmN0aW9uKCl7fTtuKGRkLE0pO2lhKGRkKTtnPWRkLnByb3RvdHlwZTtnLk49ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZy10YWIifTtnLk5hPWZ1bmN0aW9uKCl7cmV0dXJuInRhYiJ9O2cueGE9ZnVuY3Rpb24oYSl7dmFyIGI9ZGQubC54YS5jYWxsKHRoaXMsYSk7KGE9YS5HYSgpKSYmdGhpcy5NYShiLGEpO3JldHVybiBifTtnLnlhPWZ1bmN0aW9uKGEsYil7Yj1kZC5sLnlhLmNhbGwodGhpcyxhLGIpO3ZhciBjPXRoaXMuR2EoYik7YyYmKGEuUmE9Yyk7YS5tJjgmJihjPWEuaCkmJnR5cGVvZiBjLko9PT0iZnVuY3Rpb24iJiYoVChhLDgsITEpLGMuSihhKSk7cmV0dXJuIGJ9O2cuR2E9ZnVuY3Rpb24oYSl7cmV0dXJuIGEudGl0bGV8fCIifTtnLk1hPWZ1bmN0aW9uKGEsYil7YSYmKGEudGl0bGU9Ynx8IiIpfTt2YXIgZWQ9ZnVuY3Rpb24oYSxiLGMpe04uY2FsbCh0aGlzLGEsYnx8ZGQuVigpLGMpO1BjKHRoaXMsOCwhMCk7dGhpcy5QfD05fTtuKGVkLE4pO2VkLnByb3RvdHlwZS5HYT1mdW5jdGlvbigpe3JldHVybiB0aGlzLlJhfTtlZC5wcm90b3R5cGUuTWE9ZnVuY3Rpb24oYSl7dGhpcy52Lk1hKHRoaXMuaSgpLGEpO3RoaXMuUmE9YX07dGMoImdvb2ctdGFiIixmdW5jdGlvbigpe3JldHVybiBuZXcgZWQobnVsbCl9KTt2YXIgVz1mdW5jdGlvbigpe3RoaXMuQT0idGFibGlzdCJ9O24oVyx2Yyk7aWEoVyk7Vy5wcm90b3R5cGUuZz1mdW5jdGlvbigpe3JldHVybiJnb29nLXRhYi1iYXIifTtXLnByb3RvdHlwZS51PWZ1bmN0aW9uKGEsYixjKXt0aGlzLnZ8fCh0aGlzLmh8fGZkKHRoaXMpLHRoaXMudj1FYSh0aGlzLmgpKTt2YXIgZD10aGlzLnZbYl07ZD8oemMoYSxnZChkKSksYS52PWQpOlcubC51LmNhbGwodGhpcyxhLGIsYyl9O1cucHJvdG90eXBlLmo9ZnVuY3Rpb24oYSl7dmFyIGI9Vy5sLmouY2FsbCh0aGlzLGEpO3RoaXMuaHx8ZmQodGhpcyk7Yi5wdXNoKHRoaXMuaFthLnZdKTtyZXR1cm4gYn07dmFyIGZkPWZ1bmN0aW9uKGEpe3ZhciBiPWEuZygpO2EuaD17dG9wOmIrIi10b3AiLGJvdHRvbTpiKyItYm90dG9tIixzdGFydDpiKyItc3RhcnQiLGVuZDpiKyItZW5kIn19O3ZhciBYPWZ1bmN0aW9uKGEsYixjKXthPWF8fCJ0b3AiO3pjKHRoaXMsZ2QoYSkpO3RoaXMudj1hO1YuY2FsbCh0aGlzLHRoaXMuTCxifHxXLlYoKSxjKTtoZCh0aGlzKX07bihYLFYpO2c9WC5wcm90b3R5cGU7Zy5IPW51bGw7Zy5JPWZ1bmN0aW9uKCl7WC5sLkkuY2FsbCh0aGlzKTtoZCh0aGlzKX07Zy5DPWZ1bmN0aW9uKCl7WC5sLkMuY2FsbCh0aGlzKTt0aGlzLkg9bnVsbH07Zy5MYT1mdW5jdGlvbihhKXtYLmwuTGEuY2FsbCh0aGlzLGEpO3RoaXMuSihJKHRoaXMsYSkpfTtnLko9ZnVuY3Rpb24oYSl7YT9OYyhhLCEwKTp0aGlzLkgmJk5jKHRoaXMuSCwhMSl9Owp2YXIgaWQ9ZnVuY3Rpb24oYSxiKXtpZihiJiZiPT1hLkgpe2Zvcih2YXIgYz1WYihhLGIpLGQ9Yy0xO2I9SShhLGQpO2QtLSl7dmFyIGU9YjtpZihlLmlzVmlzaWJsZSgpJiZlLmlzRW5hYmxlZCgpKXthLkooYik7cmV0dXJufX1mb3IoYys9MTtiPUkoYSxjKTtjKyspaWYoZD1iLGQuaXNWaXNpYmxlKCkmJmQuaXNFbmFibGVkKCkpe2EuSihiKTtyZXR1cm59YS5KKG51bGwpfX07Zz1YLnByb3RvdHlwZTtnLmpiPWZ1bmN0aW9uKGEpe3RoaXMuSCYmdGhpcy5IIT1hLnRhcmdldCYmTmModGhpcy5ILCExKTt0aGlzLkg9YS50YXJnZXR9O2cua2I9ZnVuY3Rpb24oYSl7YS50YXJnZXQ9PXRoaXMuSCYmKHRoaXMuSD1udWxsKX07Zy5oYj1mdW5jdGlvbihhKXtpZCh0aGlzLGEudGFyZ2V0KX07Zy5pYj1mdW5jdGlvbihhKXtpZCh0aGlzLGEudGFyZ2V0KX07Zy5QYT1mdW5jdGlvbigpe0kodGhpcyx0aGlzLm8pfHxYYyh0aGlzLFZiKHRoaXMsdGhpcy5IfHxJKHRoaXMsMCkpKX07CnZhciBoZD1mdW5jdGlvbihhKXtCKEIoQihCKFFiKGEpLGEsInNlbGVjdCIsYS5qYiksYSwidW5zZWxlY3QiLGEua2IpLGEsImRpc2FibGUiLGEuaGIpLGEsImhpZGUiLGEuaWIpfSxnZD1mdW5jdGlvbihhKXtyZXR1cm4gYT09InN0YXJ0Inx8YT09ImVuZCI/InZlcnRpY2FsIjoiaG9yaXpvbnRhbCJ9O3RjKCJnb29nLXRhYi1iYXIiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBYfSk7ZnVuY3Rpb24gamQoYSl7dmFyIGI9e3RvcDoiYm90dG9tIixib3R0b206InRvcCIsc3RhcnQ6InJpZ2h0IixlbmQ6ImxlZnQifVthLmxvY2F0aW9uXSxjPWEuZWxlbWVudElkLGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTtkLnRleHRDb250ZW50PSJcbiAgICBmaWVsZHNldCB7XG4gICAgICBwYWRkaW5nOiAxMHB4O1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgIzM2OTtcbiAgICB9XG5cbiAgICAjIitjKyIgLmdvb2ctdGFiLWNvbnRlbnQge1xuICAgICAgbWluLWhlaWdodDogM2VtO1xuICAgICAgbWFyZ2luOiAwO1xuICAgICAgYm9yZGVyOiAiK2EuYm9yZGVyKyIgc29saWQgIithLmJvcmRlckNvbG9yKyI7XG4gICAgICBib3JkZXItdG9wOiAwO1xuICAgICAgaGVpZ2h0OiAiK2EuY29udGVudEhlaWdodCsiO1xuICAgICAgcGFkZGluZzogNHB4IDhweDtcbiAgICAgIG1hcmdpbi1yaWdodDogNHB4O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgIG92ZXJmbG93OiBhdXRvO1xuICAgIH1cblxuICAgICMiKwpjKyIgLmdvb2ctdGFiLWJhci0iK2EubG9jYXRpb24rIiAuZ29vZy10YWItc2VsZWN0ZWQge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICIrYS5ib3JkZXJDb2xvcisiO1xuICAgICAgYm9yZGVyLSIrYisiOiAwcHg7XG4gICAgfVxuXG4gICAgIyIrYysiIC5nb29nLXRhYi1iYXItIithLmxvY2F0aW9uKyIge1xuICAgICAgcGFkZGluZy0iK2EubG9jYXRpb24rIjogNXB4ICFpbXBvcnRhbnQ7XG4gICAgICBib3JkZXItIitiKyI6IDFweCBzb2xpZCAiK2EuYm9yZGVyQ29sb3IrIiAhaW1wb3J0YW50O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICB9XG5cbiAgICAjIitjKyIgLmdvb2ctdGFiLWJhciB7XG4gICAgICAgbWFyZ2luOiAwO1xuICAgICAgIGJvcmRlcjogMDtcbiAgICAgICBwYWRkaW5nOiAwO1xuICAgICAgIGxpc3Qtc3R5bGU6IG5vbmU7XG4gICAgICAgY3Vyc29yOiBkZWZhdWx0O1xuICAgICAgIG91dGxpbmU6IG5vbmU7XG4gICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sYWItcHJpbWFyeS1zdXJmYWNlLWNvbG9yKTtcbiAgICAgICBtYXJnaW4tcmlnaHQ6IDRweDtcbiAgICAgIH1cblxuICAgICAjIisKYysiIC5nb29nLXRhYiB7XG4gICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgIHBhZGRpbmc6IDRweCA4cHg7XG4gICAgICAgY29sb3I6IHZhcigtLWNvbGFiLXByaW1hcnktdGV4dC1jb2xvcik7XG4gICAgICAgdGV4dC1kZWNvcmF0aW9uOiBpbml0aWFsO1xuICAgICAgIGN1cnNvcjogZGVmYXVsdDtcbiAgICAgIH1cblxuICAgICAgIyIrYysiIC5nb29nLXRhYi1ob3ZlciB7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWNvbGFiLWhpZ2hsaWdodGVkLXN1cmZhY2UtY29sb3IpO1xuICAgICAgfVxuICAgICAgIjtyZXR1cm4gZH0KdmFyIGtkPWZ1bmN0aW9uKGEpe3ZhciBiPWEuZWxlbWVudElkLGM9YS50YWJOYW1lcyxkPWEuc2VsZWN0ZWRJbmRleDsiY29udGVudEJvcmRlciJpbiBhfHwoYS5jb250ZW50Qm9yZGVyPSIwcHgiKTsiY29udGVudEhlaWdodCJpbiBhfHwoYS5jb250ZW50SGVpZ2h0PSJpbml0aWFsIik7ImJvcmRlckNvbG9yImluIGF8fChhLmJvcmRlckNvbG9yPSJ2YXIoLS1jb2xhYi1ib3JkZXItY29sb3IpIik7YS5sb2NhdGlvbnx8KGEubG9jYXRpb249InRvcCIpO3ZhciBlPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiMiK2IpLGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zi5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYi1iYXIiKTt2YXIgaD1hLmxvY2F0aW9uO2YuY2xhc3NMaXN0LmFkZCgiZ29vZy10YWItYmFyLSIraCk7Zm9yKHZhciBrPVtdLHE9ZmEoYyksRz1xLm5leHQoKTshRy5kb25lO0c9cS5uZXh0KCkpe0c9Ry52YWx1ZTt2YXIgeD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKeC5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYiIpO3gudGV4dENvbnRlbnQ9RztmLmFwcGVuZENoaWxkKHgpO2sucHVzaCh4KX1oIT0iYm90dG9tIiYmZS5hcHBlbmRDaGlsZChmKTtxPW51bGw7aWYoaD09InRvcCJ8fGg9PSJib3R0b20iKXE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikscS5jbGFzc0xpc3QuYWRkKCJnb29nLXRhYi1iYXItY2xlYXIiKTtoPT0idG9wIiYmcSYmZS5hcHBlbmRDaGlsZChxKTtHPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO0cuY2xhc3NMaXN0LmFkZCgiZ29vZy10YWItY29udGVudCIpO3ZhciBoYT1bXTtjPWZhKGMpO2Zvcih4PWMubmV4dCgpOyF4LmRvbmU7eD1jLm5leHQoKSl4PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHguaWQ9ZS5pZCsiX2NvbnRlbnRfIitoYS5sZW5ndGgseC5zdHlsZS5kaXNwbGF5PSJub25lIixHLmFwcGVuZENoaWxkKHgpLGhhLnB1c2goeCk7ZS5hcHBlbmRDaGlsZChHKTtoPT0iYm90dG9tIiYmKHEmJgplLmFwcGVuZENoaWxkKHEpLGUuYXBwZW5kQ2hpbGQoZikpO3ZhciBRPW5ldyBYKGgpO1NiKFEsZik7dmFyIFI9LTE7d2IoUSwic2VsZWN0IixmdW5jdGlvbihTKXtTPWsuaW5kZXhPZihTLnRhcmdldC5pKCkpO1MhPVImJihSPj0wJiZSPGhhLmxlbmd0aCYmKGhhW1JdLnN0eWxlLmRpc3BsYXk9Im5vbmUiLFI9LTEpLFM+PTAmJlM8aGEubGVuZ3RoJiYoUj1TLGhhW1JdLnN0eWxlLmRpc3BsYXk9ImlubGluZSIsd2luZG93LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCJyZXNpemUiKSksZ29vZ2xlLmNvbGFiLm91dHB1dC5yZXNpemVJZnJhbWVUb0NvbnRlbnQoKSksUS5KKEkoUSxSKSkpfSk7US5KKEkoUSxkKSk7d2luZG93W2JdPXtzZXRTZWxlY3RlZFRhYkluZGV4OmZ1bmN0aW9uKFMpe1EuSihJKFEsUykpfX07ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChqZChhKSl9LGxkPVsiY29sYWJfbGliIiwiY3JlYXRlVGFiQmFyIl0sWT1sOwpsZFswXWluIFl8fHR5cGVvZiBZLmV4ZWNTY3JpcHQ9PSJ1bmRlZmluZWQifHxZLmV4ZWNTY3JpcHQoInZhciAiK2xkWzBdKTtmb3IodmFyIFo7bGQubGVuZ3RoJiYoWj1sZC5zaGlmdCgpKTspbGQubGVuZ3RofHxrZD09PXZvaWQgMD9ZW1pdJiZZW1pdIT09T2JqZWN0LnByb3RvdHlwZVtaXT9ZPVlbWl06WT1ZW1pdPXt9OllbWl09a2Q7fSkuY2FsbCh0aGlzKTsKLy8gY2xhbmctZm9ybWF0IG9uCg==", + "ok": true, + "headers": [ + [ + "content-length", + "41785" + ], + [ + "content-type", + "application/javascript" + ] + ], + "status": 200, + "status_text": "" + } + }, + "base_uri": "https://localhost:8080/", + "height": 260 + }, + "id": "d4WTPHumea8r", + "outputId": "7c18f2ca-cbcf-4276-9297-a60bad24c502" + }, + "source": [ + "%%logica EmployeesOfRole\n", + "\n", + "Employee(name: \"Alice\", role: \"Product Manager\", office: \"SEA\");\n", + "Employee(name: \"Bob\", role: \"Engineer\", office: \"SEA\");\n", + "Employee(name: \"Caroline\", role: \"Engineer\", office: \"LAX\");\n", + "Employee(name: \"David\", role: \"Data Scientist\", office: \"LAX\");\n", + "Employee(name: \"Eve\", role: \"Data Scientist\", office: \"SEA\");\n", + "\n", + "EmployeesOfRole(role:, employees? Array= office -> name) distinct :-\n", + " Employee(name:, role:, office:)" + ], + "execution_count": 46, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"9a1df0a2-d22d-11ef-a7c0-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id105\", \"tabNames\": [\"EmployeesOfRole\", \"(Log)\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_9aafc1c35a" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"9a1e4dc2-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id105\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_214df0a0a2" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"9a1fdfde-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_8a958c855a" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"9a2032a4-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id105_content_1\");\n", + "//# sourceURL=js_7b4f184f8f" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"9a2084de-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"9a2032a4-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_d2b130ec5b" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"9a2140fe-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id105\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_9aedb622c3" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"9a2659c2-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"9a1fdfde-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_042946e2c1" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"9a2873b0-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_46e894349b" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"9a28c748-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id105_content_0\");\n", + "//# sourceURL=js_57ed420bc8" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"9a2990ce-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"9a28c748-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_c6f021dca2" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"9a2a0914-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id105\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_a09d91dc5e" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"9a2c4008-d22d-11ef-a7c0-0242ac1c0002\"] = colab_lib.createTabBar({\"location\": \"top\", \"elementId\": \"id106\", \"tabNames\": [\"SQL\", \"Result\"], \"initialSelection\": 0, \"contentBorder\": [\"0px\"], \"contentHeight\": [\"initial\"], \"borderColor\": [\"#a7a7a7\"]});\n", + "//# sourceURL=js_37ea8a74c5" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"9a2ce468-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id106\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_017f11126d" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"9a2ed11a-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_7aef28e9df" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"9a2f6364-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id106_content_0\");\n", + "//# sourceURL=js_2946c69dff" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"9a301598-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"9a2f6364-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_badc9b71de" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"9a30c51a-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id106\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_dfd41cc3df" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The following query is stored at \u001b[1mEmployeesOfRole_sql\u001b[0m variable.\n", + "-- Initializing DuckDB environment.\n", + "create schema if not exists logica_home;\n", + "-- Empty record, has to have a field by DuckDB syntax.\n", + "drop type if exists logicarecord893574736 cascade; create type logicarecord893574736 as struct(nirvana numeric);\n", + "create sequence if not exists eternal_logical_sequence;\n", + "\n", + "\n", + "-- Logica type: logicarecord481217614\n", + "drop type if exists logicarecord481217614 cascade; create type logicarecord481217614 as struct(r logicarecord893574736);\n", + "\n", + "-- Logica type: logicarecord383307722\n", + "drop type if exists logicarecord383307722 cascade; create type logicarecord383307722 as struct(a timestamp);\n", + "\n", + "-- Logica type: logicarecord625776357\n", + "drop type if exists logicarecord625776357 cascade; create type logicarecord625776357 as struct(arg text, value text);\n", + "WITH t_1_Employee AS (SELECT * FROM (\n", + " \n", + " SELECT\n", + " 'Alice' AS name,\n", + " 'Product Manager' AS role,\n", + " 'SEA' AS office\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " 'Bob' AS name,\n", + " 'Engineer' AS role,\n", + " 'SEA' AS office\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " 'Caroline' AS name,\n", + " 'Engineer' AS role,\n", + " 'LAX' AS office\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " 'David' AS name,\n", + " 'Data Scientist' AS role,\n", + " 'LAX' AS office\n", + " UNION ALL\n", + " \n", + " SELECT\n", + " 'Eve' AS name,\n", + " 'Data Scientist' AS role,\n", + " 'SEA' AS office\n", + " \n", + ") AS UNUSED_TABLE_NAME )\n", + "SELECT\n", + " Employee.role AS role,\n", + " ARRAY_AGG(Employee.name order by Employee.office) AS employees\n", + "FROM\n", + " t_1_Employee AS Employee\n", + "GROUP BY Employee.role;\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"9a329886-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"9a2ed11a-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_accdeba204" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"9a350e7c-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_7c864faae9" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"9a35600c-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id106_content_1\");\n", + "//# sourceURL=js_2da5963ecc" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"9a35bdb8-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"9a35600c-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_d5a5af238d" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"9a360dcc-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id106\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_5f55dfa278" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "The following table is stored at \u001b[1mEmployeesOfRole\u001b[0m variable.\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
roleemployees
0Data Scientist[David, Eve]
1Product Manager[Alice]
2Engineer[Caroline, Bob]
" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"9a37c16c-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"9a350e7c-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_2cd5ff7d91" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"9a39203e-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"9a2873b0-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_28c843ed11" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"9a3ac4ac-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_ede5c1e56e" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"9a3b111e-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id105_content_1\");\n", + "//# sourceURL=js_4a35ac9129" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"9a3b5b1a-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"9a3b111e-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_463c963c27" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"9a3ba098-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id105\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_de922f1678" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "image/svg+xml": "\n\n\n\n\n\nConcertina\n\n\n\nEmployeesOfRole\n\nEmployeesOfRole\n\n\n\n", + "text/plain": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Running predicate: EmployeesOfRole (12 ms)\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"9a4fd086-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"9a3ac4ac-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_6b9b21412d" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"9a52a2b6-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_9235bfbd7d" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"9a530922-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id105_content_0\");\n", + "//# sourceURL=js_a8f606d583" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"9a535ada-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"9a530922-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_3cd22c2a49" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"9a543b26-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id105\"].setSelectedTabIndex(0);\n", + "//# sourceURL=js_4560c3b745" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"9a55b6f4-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", + "//# sourceURL=js_819d068296" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"9a561b58-d22d-11ef-a7c0-0242ac1c0002\"] = document.querySelector(\"#id106_content_1\");\n", + "//# sourceURL=js_e030d25856" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"9a56759e-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"9a561b58-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_3b2771016d" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"9a577322-d22d-11ef-a7c0-0242ac1c0002\"] = window[\"id106\"].setSelectedTabIndex(1);\n", + "//# sourceURL=js_6abc19e3f6" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"9a597794-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"9a55b6f4-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_2a47978302" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + " \n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "window[\"9a5b609a-d22d-11ef-a7c0-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"9a52a2b6-d22d-11ef-a7c0-0242ac1c0002\"]);\n", + "//# sourceURL=js_ac7215d6f8" + ] + }, + "metadata": {} + } + ] + }, + { + "cell_type": "markdown", + "source": [ + "### Injectible and Concrete predicates\n", + "\n", + "A predicate denoted with `distinct` keyword is called _aggregating_. Note that `distinct` can be implicit if aggregated value.\n", + "\n", + "```\n", + "# Example 1 of aggregating predicate.\n", + "\n", + "EmployeesOfRole(role:, employees? Array= office -> name) distinct :-\n", + " Employee(name:, role:, office:)\n", + "\n", + "# Example 2 of aggregating predicate.\n", + "\n", + "EmployeesOfRoleF(role:) Array= office -> name :-\n", + " Employee(name:, role:, office:)\n", + "```\n", + "\n", + "A predicate in Logica is called _injectable_ if it is defined by a single, non-aggregating rule. Injectable predicates may contain aggregating expressions.\n", + "\n", + "A predicate is called _concrete_ if it can be computed as a table, i.e. itself compiled as a SQL query.\n", + "\n", + "Any predicate in Logica must be _injectible_ or _concrete_ or both.\n", + "\n", + "Only _concrete_ predicates can be compiled to SQL. When a predicate Q is compiled and it uses a sub-predicate P then:\n", + "\n", + "* if P is injectible, then it's substituted into the formula of Q,\n", + "\n", + "* otherwise P must be concrete, and it is compiled as a sub-query.\n", + "\n", + "Aggregating expressions are always compiled into sub-queries." + ], + "metadata": { + "id": "q55qN2URLwu-" + } + }, + { + "cell_type": "markdown", + "source": [ + "### Functors\n", + "\n", + "Consider `MostExpensiveTicket` predicate.\n", + "```\n", + "Threshold() = 100;\n", + "ExpensiveTickets(purchase_id:, expensive_tickets:) :-\n", + " Purchase(purchase_id:, tickets:),\n", + " expensive_tickets List= (\n", + " ticket.price :- ticket in tickets,\n", + " ticket.price > Threshold());\n", + "```\n", + "\n", + "What if we want to re-use the implemented logic to find expensives tickets in table `PurchaseOfZooTickets`.\n", + "\n", + "Using predicate `ExpensiveTickets` in _functor call_ we can replace the table `Purchase` with `PurchaseOfZooTickets` obtaining the desired predicate as so\n", + "\n", + "```\n", + "ExpensiveZooTickets := ExpensiveTickets(Purchase: PurchaseOfZooTickets);\n", + "```\n", + "\n", + "In general functors are acting as second order functions. Any predicate `P` can be used in a functor call with, where named arguments in the call need to be predicates that are involved in definition of `P`. Resulting predicate is obtained by replacing the arguments in definition of `P` with the passed values." + ], + "metadata": { + "id": "80nzV8_mbXFA" + } + } + ] +} \ No newline at end of file