GeneralCatalog
5.0.14
OTRS AG
http://otrs.org/
GNU AFFERO GENERAL PUBLIC LICENSE Version 3, November 2007
Build for OTRS::ITSM 5 patch level 14.
Build for OTRS::ITSM 5 patch level 13.
Build for OTRS::ITSM 5 patch level 12.
Build for OTRS::ITSM 5 patch level 11.
Build for OTRS::ITSM 5 patch level 10.
Build for OTRS::ITSM 5 patch level 9.
Build for OTRS::ITSM 5 patch level 8.
Build for OTRS::ITSM 5 patch level 7.
Build for OTRS::ITSM 5 patch level 6.
Build for OTRS::ITSM 5 patch level 4.
Build for OTRS::ITSM 5 patch level 4.
Build for OTRS::ITSM 5 patch level 3.
Build for OTRS::ITSM 5 patch level 2.
Build for OTRS::ITSM 5.
Build for OTRS::ITSM 5 rc1.
Build for OTRS::ITSM 5 beta3.
Build for OTRS::ITSM 5 beta2.
Build for OTRS::ITSM 5 beta1.
The General Catalog package.
Das General Catalog Paket.
El paquete General Catalog.
Az általános katalógus csomag.
5.0.x
<br/>
<strong>ATTENTION</strong>
<br/>
<br/>
If you uninstall this package, all database tables that were created during installation will be deleted.
All data from this table will be irrevocably lost.
<br/>
<br/>
((enjoy))<br/>
<br/>
<br/>
<strong>ACHTUNG</strong>
<br/>
<br/>
Bei der Deinstallation werden die von diesem Paket angelegten Datenbank-Tabellen gelöscht.
Alle darin enthaltenen Daten gehen unwiderruflich verloren!
<br/>
<br/>
((enjoy))<br/>
<br/>
<br/>
<strong>ATENCIÓN</strong>
<br/>
<br/>
Si usted desinstala este paquete, todas las tablas de la base de datos creadas durante la instalación serán borradas.
¡Todos los datos de esas tablas serán irrevocablemente perdidos!.
<br/>
<br/>
((enjoy))<br/>
<br/>
<br/>
<strong>FIGYELEM</strong>
<br/>
<br/>
Ha eltávolítja ezt a csomagot, akkor a telepítés során létrehozott összes adatbázistábla törlésre kerül.
Az ezekben a táblákban lévő összes adat visszavonhatatlanul el fog veszni!
<br/>
<br/>
((enjoy))<br/>
<br/>
# create the package name
my $CodeModule = 'var::packagesetup::' . $Param{Structure}->{Name}->{Content};
# discard internally stored object, so that the next access to object creates them newly
$Kernel::OM->ObjectsDiscard(
Objects => [$CodeModule],
ForcePackageReload => 1,
);
$Kernel::OM->Get($CodeModule)->CodeUpgrade();
# create the package name
my $CodeModule = 'var::packagesetup::' . $Param{Structure}->{Name}->{Content};
$Kernel::OM->Get($CodeModule)->CodeUpgradeFromLowerThan_4_0_91();
2016-10-26 20:17:32
opms.otrs.com
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AOBPYrFYSUlJPB5Og7b8CACILPPXGGq+973vZf4LAL1SUVFRUVER1ujl5eUhplcAMMhOl2u306XOUy1aH1Da2tpeffXVd955p76+/sSJE8OHD6+srDznnHMuueSS7GUI8n/bvve973U6uKSkZMyYMbNnz7788su7fkBMJpPV1dVvvPHGgQMHWltbhw0bVllZedZZZ33oQx+aOHFib8/l7rvvPnLkSP4F5zjMTyoADHmVlZVhlwBAJJw4caK6unr79u319fXHjx8fNmzYuHHj5syZc/HFFw8fPjzs6k65jo6O119//Z133qmrq2tpaSkuLh47duycOXMWLlw4YsSIsKsrXBHKj3bt2vX4448fO3Yss6W5ubm5uXnXrl1r16793Oc+N3369P6P0t7eXl9fX19f/8c//vH2228/44wzMrva2tpWrFixZ8+ezJbjx4/v2bNnz549a9as6W2C8/vf/76pqan/BQMAAFA4tm3btmrVquPHj2e2tLS07Nq1a9euXWvWrLnmmmvmz58fYnmn2nvvvff444+nWzHSOjo66urq6urq1q9ff80111x44YW9ekLdQwMlKvnRnj17HnzwwUQiUVVVdfnll0+fPr2srOz48eO7d+9eu3bt3r17H3zwwVtvvXXKlCnByd74Hn8gMruam5v37Nnz7LPPNjY2vvDCC5/97Gczx7z44ot79uwZMWLExz/+8bPPPruioqK9vb2hoWHHjh1vvPFGb09n48aNF1988auvvtqrB+Y+CwAAAIaw7du3P/zww6lUasaMGQsXLpwyZUp5eXlbW1tDQ8PWrVurq6tXrVo1hPOj995772c/+1lHR0dVVdWll146ffr0ioqKjo6OQ4cOvfPOOxs3bvzVr37V2/yIgRKJ/CiRSPzyl79MJBIXXnjhX/zFXxQV/WlV74qKirlz55577rlPPvnkpk2bfvGLX9x5553FxcX9GWvEiBHnnntueXn5Aw888O6772bvevPNN4MguP7662fNmpXeUlxcPGXKlClTpixevLhXp/Pkk0+OGDHiz/7sz/qQHwEAAFCA2tvbn3jiiVQq9dGPfvTjH/94ZntZWdnUqVOnTp16xRVXPPXUUyFWeEolEolf/OIXHR0dl1xyyTXXXJNJBuLxeFVVVVVV1aJFi4bw6UdfJPKjzZs3Hz58eNy4cddee23mRySjqKjo2muv3bt3b3rS2YBkjenFjFpbW7M3Hj16NAiCqVOn9vPJ16xZU19ff8MNN5yKianp7qR/+Id/qK6ufu211xoaGtrb2//hH/4hCIK9e/du2rRp586djY2NsVhs9OjR55xzzhVXXFFWVtb1Gb73ve9t2rRp48aN9fX1RUVFU6dOXbJkSfplef3119PbU6nU1KlTP/GJT3Rd+6mxsXHdunU1NTVNTU3xeHzSpEmXXnrpueeemzng//yf/3P48OE77rhj0qRJ6S1PPPHE66+/HgTBBRdccN1116U31tXVLV++/Iwzzvjbv/3bzGP37Nmzbt26PXv2HD9+vKysbNq0aYsWLUq3nuXzOnTV2tq6atWqrVu3FhUVXX311QsWLOjlqw4AAHDKbdq0qbm5edq0adnhUbbhw4dff/31Xbf3eIEWZF0Jvv766y+//HL6SnDatGmZK8G+PWF/Lk47SScDEydOzA6PspWWli5dujRzN59RMvN7sif6ZG73rc60fK5bgyDYtm3b2rVr6+rqUqlUZWXlxRdffPHFF5+mU+oikR9t3bo1CIL/9J/+U3e9RcXFxZdeeulvfvObrVu3Dkh+VFdXFwTBqFGjsjeOHDnyyJEj27dvnzt3bp+fub6+fs2aNbNnzz7//PP7W2X3fvvb33btbLr33nuz7zY0NDQ0NGzZsmXZsmXl5eWdDn766adffvnlzN1t27bt2rVr2bJlGzdufOWVVzLba2pq3nvvvTvuuGPs2LHZG1euXNnW1pa+29HRsWPHjh07dnzkIx+58sor0xtnzpz52muv7dixI5Mf7dixo9ONIAjSLWAzZszIbNm4ceNTTz2V/gLjIAiOHTu2ZcuWt95668///M8vvvjifF6HThobGx955JEDBw6Ul5ffeOON2WMBAABEx7Zt24Ig6O0fvPO5QMt49tln169fnz3irl277rjjjjPPPLNvT9j/i9OMTDJw0vCoq76NMiDPkOd164YNG5555pnM3dra2tra2n379uVTWwRFIj+qra0NPhgidJXemz6yP9ILjz377LNBEMybNy971/z589esWbNq1aqamppzzjln8uTJvV3aPZVKPfnkk0VFRZ/+9Kf7WWdu1dXVixYtuuiii8aOHZv51TrrrLMuvvjiadOmVVRUtLW11dbWvvDCC3v37l2zZs2nPvWpTs+wcePGyy+//KKLLho1atT+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P2bMmE7fmNZns2fPrqqqam5u3rRpU48Hv/fee8HJ1jDr5Hsnk72rv0XnlI6BO2Vh69atG/CB5syZEwTB2rVrezxy+PDhkyZNSiQSGzZsCLL6jNJB0oYNGxKJxKRJk4YPH555SDpL6vrkf/jDH4Je9vOXlJTcfPPNs2fPbm1t/fnPf/7OO+/k/1gAClaI+VEsFhs2bJhvewAoZPPnzx81alRdXV36i4DyeUj+F2h56v8T9vniNJ0M7Nu3r7vTb2tr+9WvftXbUdLHtLa2DlSdeV63pm90fcL169f3OEQ0RSI/Ki4uTq9OvWnTpvvuu+/NN988duxYIpFIL0t+//33b9q0KXPMQA16+eWXB0Gwfv36zJTOu++++/nnn9++ffuRI0c6Ojra29sPHTq0bt26xx9/PAiCuXPnDtTQp0J6zabVq1fX19e3t7cfOHBg9erVr7/++oAPtGjRovLy8tdee+2RRx6pqak5evRoMpk8ceJEbW3tunXrli9fnn1wOio6ceJELBbL/BbNmDEjFoulf3s7TV679NJLi4qKtm7d+utf//rQoUOJROLQoUOrV6/etm1bcXFx1yXccovH45///OfnzJnT0dHx6KOP/vGPf+zPiQNQCNKfVn3rAgChiMfjN954Y3Fx8auvvvrTn/70tddeO3jwYHt7ezKZbGlpeffdd1evXt3pIb26QMtH/5+wzxenxcXFN9xwQzwef/XVV++7777NmzcfOXIkkUi0trbW1dX9x3/8x//9v/830wKS/yijR48OguD//b//l71Cdn/qzPO6deHChUVFRVu2bHnqqacaGxsTiURjY+NTTz11mi6eHURk/loQBFOnTv0v/+W/PPbYY7W1tem8JtuIESNuvPHGqVOnDuCI55133hlnnHHw4MGtW7eee+65QRDU19fX19evWbPmpOV97GMfG8DRB9zHPvaxhx9+ePv27enV8tMWLlz4yiuvDOxAI0eOvPnmm1euXLl169b0xLQcZs6cmY5gJ0yYkFmLdMSIEePHj9+/f3/wwcWzgyCYOHHi1Vdf/dRTT1VXV1dXV2e2x2Kxa665Jv3r3SvxePymm256/PHH33777VWrVrW2tub4yjYACLH/CACCIJg6deoXv/jFX/ziF/v27XvyySe7HjBy5Mhrrrkm+27+F2j56P8T9ufidMqUKV/84hcff/zx2traVatW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fOELP/rRj2pqambNmjUwJwCnjP4jAGAoS6VSw4cPHz58eNiFdEv/EUEQ3HfffTNmzKioqPjc5z535MiRTvN0nnzyyUsvvbS8vHzu3LmrVq3KfmD6yGPHji1durS0tLTr3Jkcjw2yJgStWLHivPPOGzVq1F133ZXZe88999x+++1VVVWTJ09etmzZjh07Bup8169ff/XVV48ePbqsrGzx4sXPP//8nDlzehx39uzZ6WpjWTo9c39qfvTRRz/84Q+PGDHioosueuyxxzrtzf0e9ed8c8txRk888URpaWksFisrK7vkkktWrVp1/vnn57k3beHChQsXLsyzkoxOL37X9yL3u5D7p67H12rbtm2LFi2Kx+Ndf9r7M27G8uXLb7/99l69IAcOHOjz3iAIbr311uXLl/dqRAhHCgCAUL3zzjvvvPNOR0dH2IUwwGbMmLF58+bsLSf9+P3YY49dccUV27dvb2tre+ONN77xjW9kH/boo4/efPPN7777bmtr6xtvvLFkyZJnnnmm03P+zd/8zUsvvZRMJletWlVSUpL/Y9MPv+mmm66//vrq6uq2trann346s2v79u3pGw0NDd/97ndnzpzZtfg+XFA8++yz8+bNe+aZZw4ePNjW1rZr166777577NixeY6be8Q+1/zII4/ccMMNzc3NqVSqubn5hhtuWLlyZWZv7veon+eb+7xynFFJScmqVatSqVQikThw4MCKFSvGjRuX5960Sy655JJLLsnzRLItXrx47dq16dtr1679yEc+kmfNad391PX4WgVB8Od//udvvPFG15/2/oybbd68eW+++WZ3J37StykWi+U4puvev/u7v8ve8sc//vH888/vbkSIDvkRAEDIEolEIpEIuwoGXiY/6rpkT1VVVeawCy64IDtmevnll7OvP+fOnfvee+9l7r7zzjuXX3559ihBEDz22GPZd/N/bPr43/72tz2eS0dHx0mvnPuQH82fP3/Dhg15Htx13PxH7FXN55133ttvv525+/bbb5933nmZu7nfo9zyPN98nrDTGZWXl99zzz2HDx8+6cG59/bTgw8+eOutt6Zvf/GLX1yxYkV3R570Xejup67H1yoIgrq6uuy7AzJutrKysnSM2F0BPW7s8W6n/OjYsWPDhw/PXRVEQSylUxoAAE6BmTNnrl69et68eZkt6U6ETodVVFTU19eX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fvvtvXpBDhw40Oe9QRDceuuty5cv79WIAINMfgQADE3mr3G6SM/J+uY3v/n1r3+9tbV15cqVN910U/YBn/rUp+6///7a2trNmzdPmDDhz/7sz7IfuH///gceeOC666577LHH7rvvvuzHrly5cuXKlY8++ujhw4cff/zxe+6559lnn+06eh8mhaVSqcWLF69duzZ9d+3atR/5yEeyn6e7mrMr//znP/+rX/3qoYceOnjw4IIFC9K7nnvuuTvuuOOrX/3qjh07mpqaHnrooa1bt3ZaHuhrX/vavffe297env9r1eO42Z555pmuix/l1tjY2Oe9QRB84hOfePrpp3s1IsAgiw3aFGIAgMFUU1OTTCanT59eWloadi0UqJkzZ65evXrevHmTJ0+ura3N3lVVVbV3797M3Vgs9thjj914442Zu919Sk8kEvF4PLM3Fou1t7fH4/FYLNbS0lJWVpb92A996EPPPffc5MmT03e3bdt26623/uEPfxiQs1uxYsW///u/p2d13XrrrUuWLPnP//k/51NzpvLf/va311xzTaeDL7jggp/+9KeXXnppd+PGYrG6urqJEydm7ub5WuUeN1t5eXlDQ0N5eXl3BXQdsdPGXt0NgqC5ubmysvL48eM5qmJouOuuuxobG//pn/4p7EKg1/QfAQBDUCKRSCaTwWnSf3T8+PFt27bt3Lkz7EI4Vfbu3Ztp80nfyA6P0jLhUScHDhz4xje+MXfu3PLy8srKyk996lOdDshM0iwrK+u0q6amZsqUKZnJZXPmzHnttdcG4HyCIAiCG2644bnnnmtqampqavrd7353ww035F9z2klDnLfffvv888/PPXQmPOqkP+NmG5A/sed+kpMmUP0fFODUkR8BAENQevJacXHxaXFJVlRUFARBOvCCTpYuXXrttddu2bKlpaVl7969P/vZz/J/7Ny5c996661UlpaWloEqrKysbOnSpQ8//PBDDz103XXXDR8+fEBqnjFjxqZNm/pWUn/GzTZr1qz+57mJRCL/vTt27Jg9e3Y/RwQ4peRHAMAQdHotfpTOj6wqwEnt3LmzsbGxtbW1vr5+3bp1P/7xj/N/7A9+8INly5a98sorx48fb25ufu211z772c92OqZv62enLVu27N57773vvvuWLVs2UDV///vf/8pXvrJ9+/YgCJqbm996663ly5ffeuut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Wltbm5OTM2jQIA9LJePGjRs3bpyHN+JswoQJp06dkj6fOnXqoYce8jBmSXs/dR2OlSAIP/3pTy9evNj6p707/TpLTEz83//93/ZuvM3HJIqim2tal968edP5zFdffTVq1Kj2egQAv/fNN998/fXX9fX1cgcCAAC8V3/JH7Xesken0zmuHD16dGFhoePw888/d/79MyEh4dtvv3Ucfv311z/84Q+dOxIEYffu3c6HnteVrv/www87vB3pr4Ktz3chf3Tfffd99tlnHl7cul/Pe+xUzPfee+/ly5cdh5cvX7733nsdh+6fkXse3q8nDbrckVarzcrKcklGeFjaTf/93/+dnp4ufX766adzcnLau7LNp9DeT12HYyUIQk1NjfNhj/TrTKPRSGnE9gLo8GSHhy4Ppbm5OSgoyH1UAODHGhsbv/7664qKCrkDAQAA3ku0+++2we+9994HH3ywd+9e55PSTASXK0NCQm7cuKHRaKRDvV4fEhLiuCwoKMhkMjlfr9FoDAZDe206H3ZYt72QBEGora198803Dx48WFFRodVqx4wZc/To0dZXtlfdjcDAwO+++669xQgd9uumx+7ErFarGxsbHU/BaDQOHDjQMXrun1F37td9VO7v6NChQ4888ojFYlGr1f/2b/82YMCA9957LykpyZPSbjIajXFxcZcuXRIEISEhoaSkJCgoyJOY3dys4MFYuflp706/zjQaTX19vVar9SSA9qKy2WzO6/tcShsaGpzfJKXX6wcNGuTyHyYA9B82m628vNxmsw0fPtzxrwkAAIAz9j8SBEGIjY0tLS11HBYWFjqXJiQkFBUVOWfdPP89szt1U1NTZ8yYcenSJYPBUFVVtXXrVg8rdig6Ovr8+fM91a9zgqw7McfGxlZWVjoOKysrnfczdv+M3HN/v+65v6Np06aZzWaz2VxVVXXixIn58+c//PDDHpZ2k0ajSU1N3bFjx/bt29PS0py/7nfnKfTeWHnunnvuqaio6FpdB/cvonYpLS8vj42N7WaPAOC7FAqF9JeDW7duyR0LAADwUuSPBEEQVqxYsWTJkmvXrlmt1osXL27bts25dPXq1RkZGWfOnDEajXq9/ty5czNnzvSw5e7UraioaGhoMJlMN27cKCgoWLt2befuqn0rV65cvHhxSUmJIAh6vb6oqCg7Ozs9Pd3DflUqlbRrck1N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f/+mTZseeuihW265pZ4KpxP5EeplWZaqqoIg1JiBGY/HvV5vU1MTM9EAAAAAYBaZhv6jERYsWPD444/b08RGMwzjN7/5zcGDB/fv3//kk0/+9re/FUXx0Ucfve666+p9SXXUVk86c9pKKi+ya9eu22+//aqrrrIs67nnntu1a9eXvvSlOm/U39+/cuXKVatWvfjii85PjPwIs4BpmqVSSVEUVVVVVdV1XRCEcDg8f/58t0sDAAAAAEymSy+99Je//OXTTz/9iU98YswBTz/99DXXXHPppZe+8soro4/WP3+tXC4fOXLknnvuefjhhzs6On796193dXXVrs00za1bt377298e8XSzOk0wPzptJZUXyWQy8+fPL5VKgiAEg8GTJ082NTXVeaNPfvKTe/bseeONN84777wzrnDq0CSC3zNNU1GUTCYzNDQ0MDBw+PDhwcHBZDJZKBTs8EiWZRqLAAAAAKDxrF27VhCEBx98sNoA+5A9bCK8Xu/y5ct//OMfX3PNNfF4fOvWrac9RZKkLVu2CIJw8ODBCd59gk5bSSwWu/766y3LsizrhhtusMOjOj355JOapq1YsUKsYB+q3HYL/Udzmq7rmqapqqooiqZpmqaNGODxePx+v9/vDwQCfr+/2jxYAAAAAMCs1t/fv2zZsnK5/PDDD998880jjj788MPr16/3+XzvvffewoULR58+rvWzbe++++7KlSsFQTh48ODy5ctrl/fqq69ecskl1WbP1TaJ/UdjVjLiIn19fR/72Mfsjcsvv7z+G502IXI3wCEOmIsSiYQ9K80wjBGHvF6v/32BQIBlsAEAAABgLli0aNHOnTs3b968fv36vXv33nbbbStXrhRF8eDBgw8++KDdfPTtb397zPDozCxfvnzDhg27d+/eunXrT3/6U3vnypUr161bt2bNmhUrVnR2dlqWdfLkyaeeeuqee+4RBOHaa691Th/vo9bGq/5KRlizZs2ZFTBZCdcUof9oLjp27JjdaiSKot1YZKdFXq/X9Y44AAAAAIBb7rnnnm3btpmmOWK/JEnf/OY3v/a1r1U78Qz6jwRBGBwcXLZsmaIo+/fv/9CHPiTU7ME577zznnvuue7u7hrXHG+odNpDZ1xJ/TeqjfwIU6VcLmezWVEUq62ZLwhCJpMRBMGOjQiMAAAAAACOgwcPfv/733/22WdPnDhh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WMxms6lUKh6Pnzx58vjx4wMDA7VPNE2zxmQ0j8fT09OzcOHCefPmtbe3Nzc3h8Nhv99PeAQAAAAAwLRZu3bt+vXrL7744t27dx85ckTTtFwu984773znO99xxmzfvn3z5s19fX35fL5QKDz77LOf/OQnT3vlcZ11wQUXfOc730kmk+l0+qc//ekXv/jF017/j//4j//kT/7k8ssvf+KJJzKZjKIov/jFL9atW2c/f63GBRctWrRnzx7TNMd1982bN2/atOmFF17I5/MvvPDCV77ylS1bttiHent7N23atHfv3kKhsHfv3k2bNp22+Fnk95P9DMMwDMNZfsjedvbUmLC3bNmyagtU2yd6PB5WsAYAAAAAYIbr6+u7//77X3755Xg87vP5Fi9efPXVV99yyy0f+MAH7AEvvvji9u3b9+/fb5rmZZddtnXr1quuukoYay2hyj31n3X06NE777xz7969iqKce+65d9111/r16+0xtZe7fuqpp+6///79+/dnMpm2trbVq1dv3LjxqquuqnHBn/3sZ5s3b+7v7zcMw95T59137dp13333HTt2bPHixVu2bLntttucMh544IGdO3cODg4uXrz4jjvu6O3ttddRagCiZVn9/f2app12SSdJkpyZZc6kM1mWA4EA8RAAAAAAAIBj3759GzZsePvtt90uZHJ4BEGw168SBEEUxcpgaMR2taWwAAAAAAAAcPPNN2/ZsmXJkiW//vWvv/zlL2/YsMHtiiaNRxCE7u5uURRlWWbVIQAAAAAAgDOzdu3aG2+88fDhw4sXL77tttu+8pWvuF3RpKk1exAAAAAAAABgShoAAAAAAABqIT8CAAAAAABALeRHAAAAAAAAqIX8CAAAAAAAALWQHwEAAAAAgN87duzYwMCAvZ3P548ePWpvq6qaSCScYZlMplQqVZ5YOTiRSPT394+4snMFVVWPHz9+/PjxXC43Ja8Bk03+m7/5G7drAAAAAAAAM8Ljjz/+zDPPPP/88+++++6iRYs2btwYj8f379/f0dGxdevWn/zkJ3/+538uCEIul7viiiu6urpWrFhhn3jy5ElnsCAIO3fuPH78+K9+9atLL73UHvDb3/7WucJLL7309a9/fWhoKBwOL1y40K0Xi/qJlmW5XQMAAAAAAJhBstns7bff/pGPfGTlypVXXHHFpz/96Z/97GeCIKxbt+6xxx4TBGHbtm2tra0LFiy4/vrr7VO+//3vO4PPPffcz372s+eff/7atWv37NlTeWX7Ci+88MK//uu/XnfddVdffbUkMTVqFuCXBAAAAAAAfs+yrN7e3q9+9avxeLyjo2P0gBdeeOGcc85pb28XBOHw4cOvvvpqqVSqHHz55Zf/4Ac/eOihh9577z1nQOUVli9ffsMNNwwODv7FX/zFNLwiTJzH7QIAAAAAAMAMsnnz5htuuOHCCy/cv3//4ODg+eefL4pi5YDnnnsumUy+++67sizHYrFTp04tXbr0rLPOcgZfe+21y5cvVxTl4osvHhwcPHr06NKlS4PBoHOF+fPnz58/XxCE6667brpfHs4I89cAAAAAAMD/27179w9+8IPVq1efffbZN99885e//OV58+ZdcMEF69at27Zt25NPPvnFL37x7rvvFgThn//5nwOBgDN/LZlMOoPXrFnz0EMPDQ4O3nrrrWvWrHEGOFf4wAc+sHfv3sHBwY9//OMbNmxw7dWibuRHAAAAAABgbJZlKYpS2TpU5+BcLhcOh2usbZTJZEKhkNfrnbRaMZX+D8EIbOTPYe07AAAAAElFTkSuQmCC
PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiID8+CjxvdHJzX2NvbmZpZyB2ZXJzaW9uPSIxLjAiIGluaXQ9IkZyYW1ld29yayI+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGcm9udGVuZDo6TW9kdWxlIyMjQWRtaW5HZW5lcmFsQ2F0YWxvZyIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5Gcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgQWRtaW5HZW5lcmFsQ2F0YWxvZyBjb25maWd1cmF0aW9uIGluIHRoZSBhZG1pbiBhcmVhLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPkZyYW1ld29yazwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZG1pbjo6TW9kdWxlUmVnaXN0cmF0aW9uPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEZyb250ZW5kTW9kdWxlUmVnPgogICAgICAgICAgICAgICAgPEdyb3VwPmFkbWluPC9Hcm91cD4KICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkFkbWluLjwvRGVzY3JpcHRpb24+CiAgICAgICAgICAgICAgICA8VGl0bGUgVHJhbnNsYXRhYmxlPSIxIj5HZW5lcmFsIENhdGFsb2c8L1RpdGxlPgogICAgICAgICAgICAgICAgPE5hdkJhck5hbWU+QWRtaW48L05hdkJhck5hbWU+CiAgICAgICAgICAgICAgICA8TmF2QmFyTW9kdWxlPgogICAgICAgICAgICAgICAgICAgIDxNb2R1bGU+S2VybmVsOjpPdXRwdXQ6OkhUTUw6Ok5hdkJhcjo6TW9kdWxlQWRtaW48L01vZHVsZT4KICAgICAgICAgICAgICAgICAgICA8TmFtZSBUcmFuc2xhdGFibGU9IjEiPkdlbmVyYWwgQ2F0YWxvZzwvTmFtZT4KICAgICAgICAgICAgICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5DcmVhdGUgYW5kIG1hbmFnZSB0aGUgR2VuZXJhbCBDYXRhbG9nLjwvRGVzY3JpcHRpb24+CiAgICAgICAgICAgICAgICAgICAgPEJsb2NrPlRpY2tldDwvQmxvY2s+CiAgICAgICAgICAgICAgICAgICAgPFByaW8+NDEwPC9QcmlvPgogICAgICAgICAgICAgICAgPC9OYXZCYXJNb2R1bGU+CiAgICAgICAgICAgIDwvRnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iR2VuZXJhbENhdGFsb2dQcmVmZXJlbmNlcyMjI0NvbW1lbnQyIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlBhcmFtZXRlcnMgZm9yIHRoZSBleGFtcGxlIGNvbW1lbnQgMiBvZiB0aGUgZ2VuZXJhbCBjYXRhbG9nIGF0dHJpYnV0ZXMuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+R2VuZXJhbENhdGFsb2c8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5HZW5lcmFsQ2F0YWxvZzo6UHJlZmVyZW5jZXM8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6Ok91dHB1dDo6SFRNTDo6R2VuZXJhbENhdGFsb2dQcmVmZXJlbmNlczo6R2VuZXJpYzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTGFiZWwiPkNvbW1lbnQyPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZXNjIj5EZWZpbmUgdGhlIGdlbmVyYWwgY2F0YWxvZyBjb21tZW50IDIuPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJCbG9jayI+VGV4dEFyZWE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNvbHMiPjUwPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJSb3dzIj41PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQcmVmS2V5Ij5Db21tZW50MjwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkdlbmVyYWxDYXRhbG9nUHJlZmVyZW5jZXMjIyNQZXJtaXNzaW9ucyIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5QYXJhbWV0ZXJzIGZvciB0aGUgZXhhbXBsZSBwZXJtaXNzaW9uIGdyb3VwcyBvZiB0aGUgZ2VuZXJhbCBjYXRhbG9nIGF0dHJpYnV0ZXMuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+R2VuZXJhbENhdGFsb2c8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5HZW5lcmFsQ2F0YWxvZzo6UHJlZmVyZW5jZXM8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6Ok91dHB1dDo6SFRNTDo6R2VuZXJhbENhdGFsb2dQcmVmZXJlbmNlczo6R2VuZXJpYzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTGFiZWwiPlBlcm1pc3Npb25zPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZXNjIj5EZWZpbmUgdGhlIGdyb3VwIHdpdGggcGVybWlzc2lvbnMuPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJCbG9jayI+UGVybWlzc2lvbjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ2xhc3MiPklUU006OkNvbmZpZ0l0ZW06OkNsYXNzPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQcmVmS2V5Ij5QZXJtaXNzaW9uczwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkxvYWRlcjo6QWdlbnQ6OkNvbW1vbkpTIyMjMTAwLUdlbmVyYWxDYXRhbG9nIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkxpc3Qgb2YgSlMgZmlsZXMgdG8gYWx3YXlzIGJlIGxvYWRlZCBmb3IgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5GcmFtZXdvcms8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpXZWI8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICA8SXRlbT50aGlyZHBhcnR5L2pzY29sb3JfMS40LjEvanNjb2xvci5qczwvSXRlbT4KICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+Cjwvb3Ryc19jb25maWc+Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE2IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6YmdfR2VuZXJhbENhdGFsb2c7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBQUFHZW5lcmFsQ2F0YWxvZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRnVuY3Rpb25hbGl0eSd9ID0gJ9Ck0YPQvdC60YbQuNC+0L3QsNC70L3QvtGB0YInOwoKICAgICMgVGVtcGxhdGU6IEFkbWluR2VuZXJhbENhdGFsb2cKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0dlbmVyYWwgQ2F0YWxvZyBNYW5hZ2VtZW50J30gPSAn0KPQv9GA0LDQstC70LXQvdC40LUg0L3QsCDQvtGB0L3QvtCy0L3QuNGPINC60LDRgtCw0LvQvtCzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBDYXRhbG9nIEl0ZW0nfSA9ICfQlNC+0LHQsNCy0Lgg0LXQu9C10LzQtdC90YIg0LrRitC8INC60LDRgtCw0LvQvtCz0LAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIENhdGFsb2cgQ2xhc3MnfSA9ICfQlNC+0LHQsNCy0Lgg0LrQu9Cw0YEg0LIg0LrQsNGC0LDQu9C+0LPQsCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYXRhbG9nIENsYXNzJ30gPSAn0JrQu9Cw0YHQvtCy0LUg0LIg0LrQsNGC0LDQu9C+0LPQsCc7CgogICAgIyBTeXNDb25maWcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkbWluLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgYW5kIG1hbmFnZSB0aGUgR2VuZXJhbCBDYXRhbG9nLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgQWRtaW5HZW5lcmFsQ2F0YWxvZyBjb25maWd1cmF0aW9uIGluIHRoZSBhZG1pbiBhcmVhLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0dlbmVyYWwgQ2F0YWxvZyd9ID0gJ9Ce0YHQvdC+0LLQtdC9INC60LDRgtCw0LvQvtCzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BhcmFtZXRlcnMgZm9yIHRoZSBleGFtcGxlIGNvbW1lbnQgMiBvZiB0aGUgZ2VuZXJhbCBjYXRhbG9nIGF0dHJpYnV0ZXMuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGFyYW1ldGVycyBmb3IgdGhlIGV4YW1wbGUgcGVybWlzc2lvbiBncm91cHMgb2YgdGhlIGdlbmVyYWwgY2F0YWxvZyBhdHRyaWJ1dGVzLid9ID0KICAgICAgICAnJzsKCn0KCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE2IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6Y3NfR2VuZXJhbENhdGFsb2c7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBQUFHZW5lcmFsQ2F0YWxvZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRnVuY3Rpb25hbGl0eSd9ID0gJ0Z1bmtjaW9uYWxpdGEnOwoKICAgICMgVGVtcGxhdGU6IEFkbWluR2VuZXJhbENhdGFsb2cKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0dlbmVyYWwgQ2F0YWxvZyBNYW5hZ2VtZW50J30gPSAnU3Byw6F2YSBIbGF2bsOtaG8gS2F0YWxvZ3UnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIENhdGFsb2cgSXRlbSd9ID0gJ1DFmWlkYXQgcG9sb8W+a3UgS2F0YWxvZ3UnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIENhdGFsb2cgQ2xhc3MnfSA9ICdQxZlpZGF0IHTFmcOtZHUgS2F0YWxvZ3UnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2F0YWxvZyBDbGFzcyd9ID0gJ1TFmcOtZHkgS2F0YWxvZ3UnOwoKICAgICMgU3lzQ29uZmlnCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZG1pbi4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIGFuZCBtYW5hZ2UgdGhlIEdlbmVyYWwgQ2F0YWxvZy4nfSA9ICdWeXR2b8WZaXQgYSBzcHJhdm92YXQgaGxhdm7DrSBrYXRhbG9nJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Zyb250ZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBBZG1pbkdlbmVyYWxDYXRhbG9nIGNvbmZpZ3VyYXRpb24gaW4gdGhlIGFkbWluIGFyZWEuJ30gPQogICAgICAgICdGcm9udGVuZG92w6EgcmVnaXN0cmFjZSBtb2R1bHUgcHJvIGtvbmZpZ3VyYWNpIGhsYXZuw61obyBrYXRhbG9ndSB2IGFkbWluaXN0cmF0aXZuw60gb2JsYXN0aS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnR2VuZXJhbCBDYXRhbG9nJ30gPSAnSGxhdm7DrSBLYXRhbG9nJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BhcmFtZXRlcnMgZm9yIHRoZSBleGFtcGxlIGNvbW1lbnQgMiBvZiB0aGUgZ2VuZXJhbCBjYXRhbG9nIGF0dHJpYnV0ZXMuJ30gPQogICAgICAgICdQxZnDrWtsYWQgcGFyYW1ldHLFryBwcm8ga29tZW50w6HFmSAyIG9iZWNuw71jaCBhdHJpYnV0xa8ga2F0YWxvZ3UnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGFyYW1ldGVycyBmb3IgdGhlIGV4YW1wbGUgcGVybWlzc2lvbiBncm91cHMgb2YgdGhlIGdlbmVyYWwgY2F0YWxvZyBhdHRyaWJ1dGVzLid9ID0KICAgICAgICAnUGFyYW1ldHJ5IHNrdXBpbnkgcHJvIHDFmcOta2xhZCBvcHLDoXZuxJtuw60gb2JlY27DvWNoIGF0cmlidXTFryBrYXRhbG9ndSc7Cgp9CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE2IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6ZGFfR2VuZXJhbENhdGFsb2c7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBQUFHZW5lcmFsQ2F0YWxvZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRnVuY3Rpb25hbGl0eSd9ID0gJ0Z1bmt0aW9uYWxpdGV0JzsKCiAgICAjIFRlbXBsYXRlOiBBZG1pbkdlbmVyYWxDYXRhbG9nCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydHZW5lcmFsIENhdGFsb2cgTWFuYWdlbWVudCd9ID0gJ0dlbmVyYWwgS2F0YWxvZyBNYW5hZ2VtZW50JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBDYXRhbG9nIEl0ZW0nfSA9ICdUaWxmw7hqIGthdGFsb2cgcG9zdCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgQ2F0YWxvZyBDbGFzcyd9ID0gJ1RpbGbDuGogS2F0YWxvZyBrbGFzc2UnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2F0YWxvZyBDbGFzcyd9ID0gJ0thdGFsb2cgS2xhc3NlJzsKCiAgICAjIFN5c0NvbmZpZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRtaW4uJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZSBhbmQgbWFuYWdlIHRoZSBHZW5lcmFsIENhdGFsb2cuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Zyb250ZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBBZG1pbkdlbmVyYWxDYXRhbG9nIGNvbmZpZ3VyYXRpb24gaW4gdGhlIGFkbWluIGFyZWEuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnR2VuZXJhbCBDYXRhbG9nJ30gPSAnR2VuZXJhbCBLYXRhbG9nJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BhcmFtZXRlcnMgZm9yIHRoZSBleGFtcGxlIGNvbW1lbnQgMiBvZiB0aGUgZ2VuZXJhbCBjYXRhbG9nIGF0dHJpYnV0ZXMuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGFyYW1ldGVycyBmb3IgdGhlIGV4YW1wbGUgcGVybWlzc2lvbiBncm91cHMgb2YgdGhlIGdlbmVyYWwgY2F0YWxvZyBhdHRyaWJ1dGVzLid9ID0KICAgICAgICAnJzsKCn0KCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE2IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6ZGVfR2VuZXJhbENhdGFsb2c7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBQUFHZW5lcmFsQ2F0YWxvZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRnVuY3Rpb25hbGl0eSd9ID0gJ0Z1bmt0aW9uYWxpdMOkdCc7CgogICAgIyBUZW1wbGF0ZTogQWRtaW5HZW5lcmFsQ2F0YWxvZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnR2VuZXJhbCBDYXRhbG9nIE1hbmFnZW1lbnQnfSA9ICdHZW5lcmFsLUthdGFsb2ctVmVyd2FsdHVuZyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgQ2F0YWxvZyBJdGVtJ30gPSAnS2F0YWxvZy1FaW50cmFnIGhpbnp1ZsO8Z2VuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBDYXRhbG9nIENsYXNzJ30gPSAnS2F0YWxvZy1LbGFzc2UgaGluenVmw7xnZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2F0YWxvZyBDbGFzcyd9ID0gJ0thdGFsb2ctS2xhc3NlJzsKCiAgICAjIFN5c0NvbmZpZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRtaW4uJ30gPSAnQWRtaW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZSBhbmQgbWFuYWdlIHRoZSBHZW5lcmFsIENhdGFsb2cuJ30gPSAnR2VuZXJhbC1LYXRhbG9nIGVyc3RlbGxlbiB1bmQgdmVyd2FsdGVuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgQWRtaW5HZW5lcmFsQ2F0YWxvZyBjb25maWd1cmF0aW9uIGluIHRoZSBhZG1pbiBhcmVhLid9ID0KICAgICAgICAnRnJvbnRlbmRtb2R1bC1SZWdpc3RyYXRpb24gZGVyIEFkbWluR2VuZXJhbENhdGFsb2cgS29uZmlndXJhdGlvbiBpbSBBZG1pbi1CZXJlaWNoLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydHZW5lcmFsIENhdGFsb2cnfSA9ICdHZW5lcmFsLUthdGFsb2cnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGFyYW1ldGVycyBmb3IgdGhlIGV4YW1wbGUgY29tbWVudCAyIG9mIHRoZSBnZW5lcmFsIGNhdGFsb2cgYXR0cmlidXRlcy4nfSA9CiAgICAgICAgJ1BhcmFtZXRlciBmw7xyIGRlbiBCZWlzcGllbC1Lb21tZW50YXIgMiBkZXIgR2VuZXJhbC1LYXRhbG9nLUF0dHJpYnV0ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGFyYW1ldGVycyBmb3IgdGhlIGV4YW1wbGUgcGVybWlzc2lvbiBncm91cHMgb2YgdGhlIGdlbmVyYWwgY2F0YWxvZyBhdHRyaWJ1dGVzLid9ID0KICAgICAgICAnUGFyYW1ldGVyIGbDvHIgZGllIHp1Z3JpZmZzYmVyZWNodGlndGUgR3J1cHBlIGRlciBHZW5lcmFsLUthdGFsb2ctQXR0cmlidXRlLic7Cgp9CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE2IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6ZXNfR2VuZXJhbENhdGFsb2c7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBQUFHZW5lcmFsQ2F0YWxvZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRnVuY3Rpb25hbGl0eSd9ID0gJ0Z1bmNpb25hbGlkYWQnOwoKICAgICMgVGVtcGxhdGU6IEFkbWluR2VuZXJhbENhdGFsb2cKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0dlbmVyYWwgQ2F0YWxvZyBNYW5hZ2VtZW50J30gPSAnR2VzdGnDs24gZGVsIENhdMOhbG9nbyBHZW5lcmFsJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBDYXRhbG9nIEl0ZW0nfSA9ICdBw7FhZGlyIEVsZW1lbnRvIGFsIENhdMOhbG9nbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgQ2F0YWxvZyBDbGFzcyd9ID0gJ0HDsWFkaXIgQ2xhc2UgYWwgQ2F0w6Fsb2dvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhdGFsb2cgQ2xhc3MnfSA9ICdDbGFzZSBkZSBDYXTDoWxvZ28nOwoKICAgICMgU3lzQ29uZmlnCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZG1pbi4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIGFuZCBtYW5hZ2UgdGhlIEdlbmVyYWwgQ2F0YWxvZy4nfSA9ICdDcmVhciB5IGFkbWluaXN0cmFyIGVsIENhdMOhbG9nbyBHZW5lcmFsJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Zyb250ZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBBZG1pbkdlbmVyYWxDYXRhbG9nIGNvbmZpZ3VyYXRpb24gaW4gdGhlIGFkbWluIGFyZWEuJ30gPQogICAgICAgICdFbCBGcm9udGVuZCBkZWwgcmVnaXN0cm8gZGVsIG3Ds2R1bG8gcGFyYSBsYSBjb25maWd1cmFjacOzbiBkZWwgQWRtaW5HZW5lcmFsQ2F0YWxvZyBlbiBlbCDDoXJlYSBhZG1pbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydHZW5lcmFsIENhdGFsb2cnfSA9ICdDYXTDoWxvZ28gR2VuZXJhbCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQYXJhbWV0ZXJzIGZvciB0aGUgZXhhbXBsZSBjb21tZW50IDIgb2YgdGhlIGdlbmVyYWwgY2F0YWxvZyBhdHRyaWJ1dGVzLid9ID0KICAgICAgICAnUGFyw6FtZXRyb3MgcGFyYSBlbCBlamVtcGxvIGNvbWVudGFyaW8gMiBkZSBsb3MgYXRyaWJ1dG9zIGRlbCBjYXTDoWxvZ28gZ2VuZXJhbC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGFyYW1ldGVycyBmb3IgdGhlIGV4YW1wbGUgcGVybWlzc2lvbiBncm91cHMgb2YgdGhlIGdlbmVyYWwgY2F0YWxvZyBhdHRyaWJ1dGVzLid9ID0KICAgICAgICAnUGFyw6FtZXRyb3MgcGFyYSBsb3MgcGVybWlzb3MgZGUgZWplbXBsbyBkZSBsb3MgYXRyaWJ1dG9zIGRlbCBjYXTDoWxvZ28gZ2VuZXJhbC4nOwoKfQoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE2IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6ZmFfR2VuZXJhbENhdGFsb2c7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBQUFHZW5lcmFsQ2F0YWxvZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRnVuY3Rpb25hbGl0eSd9ID0gJ9qp2KfYsdqp2LHYr9uMJzsKCiAgICAjIFRlbXBsYXRlOiBBZG1pbkdlbmVyYWxDYXRhbG9nCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydHZW5lcmFsIENhdGFsb2cgTWFuYWdlbWVudCd9ID0gJ9mF2K/bjNix24zYqiDZgdmH2LHYs9iqINi52YXZiNmF24wnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIENhdGFsb2cgSXRlbSd9ID0gJ9in2LbYp9mB2Ycg2qnYsdiv2YYg24zaqSDZgtmE2YUg2YHZh9ix2LPYqic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgQ2F0YWxvZyBDbGFzcyd9ID0gJ9in2LbYp9mB2Ycg2qnYsdiv2YYg2qnZhNin2LMg2YHZh9ix2LPYqtuMJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhdGFsb2cgQ2xhc3MnfSA9ICfZgdmH2LHYs9iqINqp2YTYp9iz24wnOwoKICAgICMgU3lzQ29uZmlnCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZG1pbi4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIGFuZCBtYW5hZ2UgdGhlIEdlbmVyYWwgQ2F0YWxvZy4nfSA9ICfYs9in2K7YqiDZiCDZhdiv24zYsduM2Kog2YHZh9ix2LPYqiDYudmF2YjZhduMJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Zyb250ZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBBZG1pbkdlbmVyYWxDYXRhbG9nIGNvbmZpZ3VyYXRpb24gaW4gdGhlIGFkbWluIGFyZWEuJ30gPQogICAgICAgICfYq9io2Kog2YXYp9qY2YjZhCDYqNix2KfbjCDZvtuM2qnYsdio2YbYr9uMINmB2YfYsdiz2Kog2LnZhdmI2YXbjCDYr9ixINio2K7YtCDZhdiv24zYsduM2KonOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnR2VuZXJhbCBDYXRhbG9nJ30gPSAn2YHZh9ix2LPYqiDYudmF2YjZhduMJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BhcmFtZXRlcnMgZm9yIHRoZSBleGFtcGxlIGNvbW1lbnQgMiBvZiB0aGUgZ2VuZXJhbCBjYXRhbG9nIGF0dHJpYnV0ZXMuJ30gPQogICAgICAgICfZvtin2LHYp9mF2KrYsdmH2KfbjNuMINio2LHYp9uMINiq2YjYttuM2K0g2YbZhdmI2YbZhyDbsiDZhdix2KjZiNi3INio2Ycg2YjbjNqY2q/bjOKAjNmH2KfbjCDZgdmH2LHYs9iqINi52YXZiNmF24wnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGFyYW1ldGVycyBmb3IgdGhlIGV4YW1wbGUgcGVybWlzc2lvbiBncm91cHMgb2YgdGhlIGdlbmVyYWwgY2F0YWxvZyBhdHRyaWJ1dGVzLid9ID0KICAgICAgICAn2b7Yp9ix2KfZhdiq2LHZh9in24zbjCDYqNix2KfbjCDar9ix2YjZh+KAjNmH2KfbjCDYr9iz2KrYsdiz24wg2YbZhdmI2YbZhyDZhdix2KjZiNi3INio2Ycg2YjbjNqY2q/bjOKAjNmH2KfbjCDZgdmH2LHYs9iqINi52YXZiNmF24wnOwoKfQoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE2IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6ZnJfR2VuZXJhbENhdGFsb2c7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBQUFHZW5lcmFsQ2F0YWxvZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRnVuY3Rpb25hbGl0eSd9ID0gJ0ZvbmN0aW9ubmFsaXTDqSc7CgogICAgIyBUZW1wbGF0ZTogQWRtaW5HZW5lcmFsQ2F0YWxvZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnR2VuZXJhbCBDYXRhbG9nIE1hbmFnZW1lbnQnfSA9ICdHZXN0aW9uIGR1IENhdGFsb2d1ZSBHw6luw6lyYWwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIENhdGFsb2cgSXRlbSd9ID0gJ0Fqb3V0ZXIgdW4gRWxlbWVudCBhdSBDYXRhbG9ndWUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIENhdGFsb2cgQ2xhc3MnfSA9ICdBam91dGVyIHVuZSBDbGFzc2UgZGUgQ2F0YWxvZ3VlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhdGFsb2cgQ2xhc3MnfSA9ICdDbGFzc2UgZGUgQ2F0YWxvZ3VlJzsKCiAgICAjIFN5c0NvbmZpZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRtaW4uJ30gPSAnQWRtaW5pc3RyYXRldXIuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZSBhbmQgbWFuYWdlIHRoZSBHZW5lcmFsIENhdGFsb2cuJ30gPSAnQ3LDqWVyIGV0IGfDqXJlciBsZSBDYXRhbG9ndWUgR8OpbsOpcmFsLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgQWRtaW5HZW5lcmFsQ2F0YWxvZyBjb25maWd1cmF0aW9uIGluIHRoZSBhZG1pbiBhcmVhLid9ID0KICAgICAgICAnSW50ZXJmYWNlIGRcJ2VucmVnaXN0cmVtZW50IGRlIG1vZHVsZSBwb3VyIGxhIGNvbmZpZ3VyYXRpb24gZHUgQ2F0YWxvZ3VlIEfDqW7DqXJhbCBBZG1pbiBkYW5zIGxhIHNlY3Rpb24gYWRtaW5pc3RyYXRldXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnR2VuZXJhbCBDYXRhbG9nJ30gPSAnQ2F0YWxvZ3VlIEfDqW7DqXJhbCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQYXJhbWV0ZXJzIGZvciB0aGUgZXhhbXBsZSBjb21tZW50IDIgb2YgdGhlIGdlbmVyYWwgY2F0YWxvZyBhdHRyaWJ1dGVzLid9ID0KICAgICAgICAnUGFyYW3DqHRyZXMgcG91ciBsXCdleGVtcGxlIGR1IGNvbW1lbnRhaXJlIDIgZGVzIGF0dHJpYnV0cyBkdSBDYXRhbG9ndWUgR8OpbsOpcmFsJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BhcmFtZXRlcnMgZm9yIHRoZSBleGFtcGxlIHBlcm1pc3Npb24gZ3JvdXBzIG9mIHRoZSBnZW5lcmFsIGNhdGFsb2cgYXR0cmlidXRlcy4nfSA9CiAgICAgICAgJ1BhcmFtw6h0cmVzIHBvdXIgbFwnZXhlbXBsZSBkZXMgcGVybWlzc2lvbnMgZGUgZ3JvdXBlIGRlcyBhdHRyaWJ1dHMgZHUgQ2F0YWxvZ3VlIEfDqW7DqXJhbCc7Cgp9CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE2IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6aHVfR2VuZXJhbENhdGFsb2c7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBQUFHZW5lcmFsQ2F0YWxvZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRnVuY3Rpb25hbGl0eSd9ID0gJ0Z1bmtjaW9uYWxpdMOhcyc7CgogICAgIyBUZW1wbGF0ZTogQWRtaW5HZW5lcmFsQ2F0YWxvZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnR2VuZXJhbCBDYXRhbG9nIE1hbmFnZW1lbnQnfSA9ICfDgWx0YWzDoW5vcyBrYXRhbMOzZ3VzIGtlemVsw6lzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBDYXRhbG9nIEl0ZW0nfSA9ICdLYXRhbMOzZ3VzZWxlbSBob3p6w6FhZMOhc2EnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIENhdGFsb2cgQ2xhc3MnfSA9ICdLYXRhbMOzZ3Vzb3N6dMOhbHkgaG96esOhYWTDoXNhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhdGFsb2cgQ2xhc3MnfSA9ICdLYXRhbMOzZ3Vzb3N6dMOhbHknOwoKICAgICMgU3lzQ29uZmlnCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZG1pbi4nfSA9ICdBZG1pbmlzenRyw6FjacOzLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgYW5kIG1hbmFnZSB0aGUgR2VuZXJhbCBDYXRhbG9nLid9ID0gJ0F6IMOhbHRhbMOhbm9zIGthdGFsw7NndXMgbMOpdHJlaG96w6FzYSDDqXMga2V6ZWzDqXNlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgQWRtaW5HZW5lcmFsQ2F0YWxvZyBjb25maWd1cmF0aW9uIGluIHRoZSBhZG1pbiBhcmVhLid9ID0KICAgICAgICAnRWzFkXTDqXRwcm9ncmFtIG1vZHVsIHJlZ2lzenRyw6FjacOzIGF6IGFkbWluaXN6dHLDoWNpw7NzIHRlcsO8bGV0ZW4gbMOpdsWRIEFkbWluR2VuZXJhbENhdGFsb2cgYmXDoWxsw610w6FzaG96Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydHZW5lcmFsIENhdGFsb2cnfSA9ICfDgWx0YWzDoW5vcyBrYXRhbMOzZ3VzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BhcmFtZXRlcnMgZm9yIHRoZSBleGFtcGxlIGNvbW1lbnQgMiBvZiB0aGUgZ2VuZXJhbCBjYXRhbG9nIGF0dHJpYnV0ZXMuJ30gPQogICAgICAgICdQYXJhbcOpdGVyZWsgYXogw6FsdGFsw6Fub3Mga2F0YWzDs2d1cyBhdHRyaWLDunR1bWFpbmFrIDIuIHDDqWxkYSBtZWdqZWd5esOpc2VpaGV6Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQYXJhbWV0ZXJzIGZvciB0aGUgZXhhbXBsZSBwZXJtaXNzaW9uIGdyb3VwcyBvZiB0aGUgZ2VuZXJhbCBjYXRhbG9nIGF0dHJpYnV0ZXMuJ30gPQogICAgICAgICdQYXJhbcOpdGVyZWsgYXogw6FsdGFsw6Fub3Mga2F0YWzDs2d1cyBhdHRyaWLDunR1bWFpbmFrIHDDqWxkYSBqb2dvc3VsdHPDoWcgY3NvcG9ydGphaWhvei4nOwoKfQoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE2IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6aXRfR2VuZXJhbENhdGFsb2c7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBQUFHZW5lcmFsQ2F0YWxvZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRnVuY3Rpb25hbGl0eSd9ID0gJ0Z1bnppb25hbGl0w6AnOwoKICAgICMgVGVtcGxhdGU6IEFkbWluR2VuZXJhbENhdGFsb2cKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0dlbmVyYWwgQ2F0YWxvZyBNYW5hZ2VtZW50J30gPSAnR2VzdGlvbmUgZGVsIENhdGFsb2dvIEdlbmVyYWxlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBDYXRhbG9nIEl0ZW0nfSA9ICdBZ2dpdW5naSBFbGVtZW50byBhbCBDYXRhbG9nbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgQ2F0YWxvZyBDbGFzcyd9ID0gJ0FnZ2l1bmdpIENsYXNzZSBhbCBDYXRhbG9nbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYXRhbG9nIENsYXNzJ30gPSAnQ2xhc3NlIGRpIENhdGFsb2dvJzsKCiAgICAjIFN5c0NvbmZpZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRtaW4uJ30gPSAnQWRtaW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZSBhbmQgbWFuYWdlIHRoZSBHZW5lcmFsIENhdGFsb2cuJ30gPSAnQ3JlYSBlIGdlc3Rpc2NpIGlsIENhdGFsb2dvIEdlbmVyYWxlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Zyb250ZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBBZG1pbkdlbmVyYWxDYXRhbG9nIGNvbmZpZ3VyYXRpb24gaW4gdGhlIGFkbWluIGFyZWEuJ30gPQogICAgICAgICdNb2R1bG8gZGkgcmVnaXN0cmF6aW9uZSBwZXIgbGEgY29uZmlndXJhemlvbmUgZGkgQWRtaW5HZW5lcmFsQ2F0YWxvZyBuZWxsXCdhcmVhIGRpIGFkbWluLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydHZW5lcmFsIENhdGFsb2cnfSA9ICdDYXRhbG9nbyBHZW5lcmFsZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQYXJhbWV0ZXJzIGZvciB0aGUgZXhhbXBsZSBjb21tZW50IDIgb2YgdGhlIGdlbmVyYWwgY2F0YWxvZyBhdHRyaWJ1dGVzLid9ID0KICAgICAgICAnUGFyYW1ldHJpIHBlciBpbCBjb21tZW50byBkaSBlc2VtcGlvIDIgZGVnbGkgYXR0cmlidXRpIGRlbCBjYXRhbG9nbyBnZW5lcmFsZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGFyYW1ldGVycyBmb3IgdGhlIGV4YW1wbGUgcGVybWlzc2lvbiBncm91cHMgb2YgdGhlIGdlbmVyYWwgY2F0YWxvZyBhdHRyaWJ1dGVzLid9ID0KICAgICAgICAnUGFyYW1ldHJpIHBlciBpIGdydXBwaSBkaSBwZXJtZXNzaSBkaSBlc2VtcGlvIGRlZ2xpIGF0dHJpYnV0aSBkZWwgY2F0YWxvZ28gZ2VuZXJhbGUuJzsKCn0KCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE2IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6amFfR2VuZXJhbENhdGFsb2c7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBQUFHZW5lcmFsQ2F0YWxvZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRnVuY3Rpb25hbGl0eSd9ID0gJ+apn+iDveaApyc7CgogICAgIyBUZW1wbGF0ZTogQWRtaW5HZW5lcmFsQ2F0YWxvZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnR2VuZXJhbCBDYXRhbG9nIE1hbmFnZW1lbnQnfSA9ICfkuIDoiKzjgqvjgr/jg63jgrDnrqHnkIYnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIENhdGFsb2cgSXRlbSd9ID0gJ+OCq+OCv+ODreOCsOmgheebruOCkui/veWKoCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgQ2F0YWxvZyBDbGFzcyd9ID0gJ+OCq+OCv+ODreOCsOOCr+ODqeOCueOCkui/veWKoCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYXRhbG9nIENsYXNzJ30gPSAn44Kr44K/44Ot44Kw44Kv44Op44K5JzsKCiAgICAjIFN5c0NvbmZpZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRtaW4uJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZSBhbmQgbWFuYWdlIHRoZSBHZW5lcmFsIENhdGFsb2cuJ30gPSAn44K444Kn44ON44Op44Or44Kr44K/44Ot44Kw44Gu5L2c5oiQ44Go566h55CGJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Zyb250ZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBBZG1pbkdlbmVyYWxDYXRhbG9nIGNvbmZpZ3VyYXRpb24gaW4gdGhlIGFkbWluIGFyZWEuJ30gPQogICAgICAgICfnrqHnkIbjgqjjg6rjgqLjgafjga5BZG1pbkdlbmVyYWxDYXRhbG9n44Gu44OV44Ot44Oz44OI44Ko44Oz44OJ44Oi44K444Ol44O844Or44Gu55m76YyyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0dlbmVyYWwgQ2F0YWxvZyd9ID0gJ+OCuOOCp+ODjeODqeODq+OCq+OCv+ODreOCsCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQYXJhbWV0ZXJzIGZvciB0aGUgZXhhbXBsZSBjb21tZW50IDIgb2YgdGhlIGdlbmVyYWwgY2F0YWxvZyBhdHRyaWJ1dGVzLid9ID0KICAgICAgICAn44K444Kn44ON44Op44Or44Kr44K/44Ot44Kw5bGe5oCn44Gu44Kz44Oh44Oz44OI5L6LIDLjgIDjga7oqK3lrprlgKQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGFyYW1ldGVycyBmb3IgdGhlIGV4YW1wbGUgcGVybWlzc2lvbiBncm91cHMgb2YgdGhlIGdlbmVyYWwgY2F0YWxvZyBhdHRyaWJ1dGVzLid9ID0KICAgICAgICAn44K444Kn44ON44Op44Or44Kr44K/44Ot44Kw5bGe5oCn44Gu44OR44O844Of44OD44K344On44Oz44Kw44Or44O844OX44CA44Gu6Kit5a6a5YCkJzsKCn0KCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE2IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6bXNfR2VuZXJhbENhdGFsb2c7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBQUFHZW5lcmFsQ2F0YWxvZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRnVuY3Rpb25hbGl0eSd9ID0gJ0Z1bmdzaSc7CgogICAgIyBUZW1wbGF0ZTogQWRtaW5HZW5lcmFsQ2F0YWxvZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnR2VuZXJhbCBDYXRhbG9nIE1hbmFnZW1lbnQnfSA9ICdLYXRhbG9nIFBlbmd1cnVzYW4gR2VuZXJhbCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgQ2F0YWxvZyBJdGVtJ30gPSAnVGFtYmFoYW4gSXRlbSBLYXRhbG9nJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBDYXRhbG9nIENsYXNzJ30gPSAnVGFtYmFoIEtlbGFzIEthdGFsb2cnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2F0YWxvZyBDbGFzcyd9ID0gJ0tlbGFzIEthdGFsb2cnOwoKICAgICMgU3lzQ29uZmlnCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZG1pbi4nfSA9ICdBZG1pbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIGFuZCBtYW5hZ2UgdGhlIEdlbmVyYWwgQ2F0YWxvZy4nfSA9ICdDaXB0YSBkYW4gdXJ1cyBLYXRhbG9nIEdlbmVyYWwuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Zyb250ZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBBZG1pbkdlbmVyYWxDYXRhbG9nIGNvbmZpZ3VyYXRpb24gaW4gdGhlIGFkbWluIGFyZWEuJ30gPQogICAgICAgICdNb2R1bCBwZW5kYWZ0YXJhbiBtdWthIGhhZGFwYW4gYmFnaSBrb25maWd1cmFzaSBLYXRhbG9nVW11bVRhZGJpciBkYWxhbSBydWFuZ2FuIHBlbnRhZGJpci4gJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0dlbmVyYWwgQ2F0YWxvZyd9ID0gJ0thdGFsb2cgR2VuZXJhbCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQYXJhbWV0ZXJzIGZvciB0aGUgZXhhbXBsZSBjb21tZW50IDIgb2YgdGhlIGdlbmVyYWwgY2F0YWxvZyBhdHRyaWJ1dGVzLid9ID0KICAgICAgICAnUGFyYW1ldGVyIHVudHVrIGNvbnRvaCBrb21lbiAyIHBhZGEgY2lyaS1jaXJpIGthdGFsb2cuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BhcmFtZXRlcnMgZm9yIHRoZSBleGFtcGxlIHBlcm1pc3Npb24gZ3JvdXBzIG9mIHRoZSBnZW5lcmFsIGNhdGFsb2cgYXR0cmlidXRlcy4nfSA9CiAgICAgICAgJ1BhcmFtZXRlciB1bnR1ayBjb250b2gga3VtcHVsYW4geWFuZyBkaWJlbmFya2FuIHBhZGEgY2lyaS1jaXJpIGthdGFsb2cuJzsKCn0KCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE2IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6bmJfTk9fR2VuZXJhbENhdGFsb2c7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBQUFHZW5lcmFsQ2F0YWxvZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRnVuY3Rpb25hbGl0eSd9ID0gJ0Z1bmtzam9uYWxpdGV0JzsKCiAgICAjIFRlbXBsYXRlOiBBZG1pbkdlbmVyYWxDYXRhbG9nCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydHZW5lcmFsIENhdGFsb2cgTWFuYWdlbWVudCd9ID0gJ0FkbWluaXN0cmFzam9uIGF2IEdlbmVyZWxsIEthdGFsb2cnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIENhdGFsb2cgSXRlbSd9ID0gJ0xlZ2cgdGlsIGthdGFsb2dvYmpla3QnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIENhdGFsb2cgQ2xhc3MnfSA9ICdMZWdnIHRpbCBrYXRhbG9nLWtsYXNzZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYXRhbG9nIENsYXNzJ30gPSAnS2F0YWxvZy1rbGFzc2UnOwoKICAgICMgU3lzQ29uZmlnCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZG1pbi4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIGFuZCBtYW5hZ2UgdGhlIEdlbmVyYWwgQ2F0YWxvZy4nfSA9ICdPcHByZXR0IG9nIGFkbWluaXN0csOpciBkZW4gZ2VuZXJlbGxlIGthdGFsb2dlbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgQWRtaW5HZW5lcmFsQ2F0YWxvZyBjb25maWd1cmF0aW9uIGluIHRoZSBhZG1pbiBhcmVhLid9ID0KICAgICAgICAnRm9yc2lkZW1vZHVsLXJlZ2lzdHJlcmluZyBmb3IgQWRtaW5HZW5lcmFsQ2F0YWxvZy1vcHBzZXR0IGkgYWRtaW4tZGVsZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0dlbmVyYWwgQ2F0YWxvZyd9ID0gJ0dlbmVyZWxsIEthdGFsb2cnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGFyYW1ldGVycyBmb3IgdGhlIGV4YW1wbGUgY29tbWVudCAyIG9mIHRoZSBnZW5lcmFsIGNhdGFsb2cgYXR0cmlidXRlcy4nfSA9CiAgICAgICAgJ1BhcmFtZXRyZSBmb3IgZWtzZW1wZWxrb21tZW50YXIgMiBpIGF0dHJpYnV0dGVuZSBmb3IgZ2VuZXJlbGwga2F0YWxvZyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQYXJhbWV0ZXJzIGZvciB0aGUgZXhhbXBsZSBwZXJtaXNzaW9uIGdyb3VwcyBvZiB0aGUgZ2VuZXJhbCBjYXRhbG9nIGF0dHJpYnV0ZXMuJ30gPQogICAgICAgICdQYXJhbWV0ZXJlIGZvciB0aWxnYW5nc2dydXBwZS1la3NlbXBlbCBpIGF0dHJpYnV0dGVuZSBmb3IgZ2VuZXJlbGwga2F0YWxvZy4nOwoKfQoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE2IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6bmxfR2VuZXJhbENhdGFsb2c7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBQUFHZW5lcmFsQ2F0YWxvZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRnVuY3Rpb25hbGl0eSd9ID0gJ0Z1bmN0aW9uYWxpdGVpdCc7CgogICAgIyBUZW1wbGF0ZTogQWRtaW5HZW5lcmFsQ2F0YWxvZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnR2VuZXJhbCBDYXRhbG9nIE1hbmFnZW1lbnQnfSA9ICdDYXRhbG9ndXMgQmVoZWVyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBDYXRhbG9nIEl0ZW0nfSA9ICdDYXRhbG9ndXMtaXRlbSB0b2V2b2VnZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIENhdGFsb2cgQ2xhc3MnfSA9ICdDYXRhbG9ndXMta2xhc3NlIHRvZXZvZWdlbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYXRhbG9nIENsYXNzJ30gPSAnQ2F0YWxvZ3VzIGtsYXNzZSc7CgogICAgIyBTeXNDb25maWcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkbWluLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgYW5kIG1hbmFnZSB0aGUgR2VuZXJhbCBDYXRhbG9nLid9ID0gJ0Fhbm1ha2VuIGVuIGJlaGVyZW4gdmFuIGl0ZW1zIGluIGRlIGNhdGFsb2d1cy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIEFkbWluR2VuZXJhbENhdGFsb2cgY29uZmlndXJhdGlvbiBpbiB0aGUgYWRtaW4gYXJlYS4nfSA9CiAgICAgICAgJ0Zyb250ZW5kIG1vZHVsZSByZWdpc3RyYXRpZSB2b29yIGRlIEFkbWluR2VuZXJhbENhdGFsb2cgY29uZmlndXJhdGllIGluIGhldCBiZWhlZXIgZGVlbC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnR2VuZXJhbCBDYXRhbG9nJ30gPSAnQ2F0YWxvZ3VzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BhcmFtZXRlcnMgZm9yIHRoZSBleGFtcGxlIGNvbW1lbnQgMiBvZiB0aGUgZ2VuZXJhbCBjYXRhbG9nIGF0dHJpYnV0ZXMuJ30gPQogICAgICAgICdQYXJhbWV0ZXJzIHZvb3IgaGV0IHZvb3JiZWVsZCBjb21tZW50YWFyIDIgdmFuIGRlIGFsZ2VtZW5lIGNhdGFsb2cgYXR0cmlidXRlbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQYXJhbWV0ZXJzIGZvciB0aGUgZXhhbXBsZSBwZXJtaXNzaW9uIGdyb3VwcyBvZiB0aGUgZ2VuZXJhbCBjYXRhbG9nIGF0dHJpYnV0ZXMuJ30gPQogICAgICAgICdQYXJhbWV0ZXJzIHZvb3IgZGUgdm9vcmJlZWxkIHBlcmltc3NpZWdyb2VwZW4gdmFuIGRlIGFsZ2VtZW5lIGNhdGFsb2cgYXR0cmlidXRlbi4nOwoKfQoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE2IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6cGxfR2VuZXJhbENhdGFsb2c7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBQUFHZW5lcmFsQ2F0YWxvZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRnVuY3Rpb25hbGl0eSd9ID0gJ0Z1bmtjam9uYWxub8WbxIcnOwoKICAgICMgVGVtcGxhdGU6IEFkbWluR2VuZXJhbENhdGFsb2cKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0dlbmVyYWwgQ2F0YWxvZyBNYW5hZ2VtZW50J30gPSAnWmFyesSFZHphbmllIGthdGFsb2dpZW0gZ8WCw7N3bnltJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBDYXRhbG9nIEl0ZW0nfSA9ICdEb2RhaiBlbGVtZW50IGthdGFsb2d1JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBDYXRhbG9nIENsYXNzJ30gPSAnRG9kYWoga2xhc8SZIGthdGFsb2d1JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhdGFsb2cgQ2xhc3MnfSA9ICdLbGFzYSBrYXRhbG9ndSc7CgogICAgIyBTeXNDb25maWcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkbWluLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgYW5kIG1hbmFnZSB0aGUgR2VuZXJhbCBDYXRhbG9nLid9ID0gJ1V0d8OzcnogaSB6YXJ6xIVkemFqIGthdGFsb2dpZW0gZ8WCw7N3bnltLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgQWRtaW5HZW5lcmFsQ2F0YWxvZyBjb25maWd1cmF0aW9uIGluIHRoZSBhZG1pbiBhcmVhLid9ID0KICAgICAgICAnUmVqZXN0cmFjamEgbW9kdcWCdSBmcm9udGVuZCBkbyBrb25maWd1cmFjamkgbW9kdcWCdSBBZG1pbkdlbmVyYWxDYXRhbG9nIHcgcGFuZWx1IGFkbWluaXN0cmF0b3JhLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydHZW5lcmFsIENhdGFsb2cnfSA9ICdLYXRhbG9nIGfFgsOzd255JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BhcmFtZXRlcnMgZm9yIHRoZSBleGFtcGxlIGNvbW1lbnQgMiBvZiB0aGUgZ2VuZXJhbCBjYXRhbG9nIGF0dHJpYnV0ZXMuJ30gPQogICAgICAgICdQYXJhbWV0cnkgZG8gcHJ6eWvFgmFkb3dlZ28ga29tZW50YXJ6YSAyIGF0cnlidXTDs3cga2F0YWxvZ3UgZ2VuZXJhbG5lZ28uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BhcmFtZXRlcnMgZm9yIHRoZSBleGFtcGxlIHBlcm1pc3Npb24gZ3JvdXBzIG9mIHRoZSBnZW5lcmFsIGNhdGFsb2cgYXR0cmlidXRlcy4nfSA9CiAgICAgICAgJ1BhcmFtZXRyeSBkbGEgcHJ6eWvFgmFkb3d5Y2ggZ3J1cCB1cHJhd25pZcWEIGF0cnlidXTDs3cga2F0YWxvZ3UgZ8WCw7N3bmVnby4nOwoKfQoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE2IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6cHRfQlJfR2VuZXJhbENhdGFsb2c7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBQUFHZW5lcmFsQ2F0YWxvZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRnVuY3Rpb25hbGl0eSd9ID0gJ0Z1bmNpb25hbGlkYWRlJzsKCiAgICAjIFRlbXBsYXRlOiBBZG1pbkdlbmVyYWxDYXRhbG9nCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydHZW5lcmFsIENhdGFsb2cgTWFuYWdlbWVudCd9ID0gJ0dlcmVuY2lhbWVudG8gZG8gQ2F0w6Fsb2dvIEdlcmFsJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBDYXRhbG9nIEl0ZW0nfSA9ICdBZGljaW9uYXIgSXRlbSBhbyBDYXTDoWxvZ28nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIENhdGFsb2cgQ2xhc3MnfSA9ICdBZGljaW9uYXIgQ2xhc3NlIGFvIENhdMOhbG9nbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYXRhbG9nIENsYXNzJ30gPSAnQ2xhc3NlIGRvIENhdMOhbG9nbyc7CgogICAgIyBTeXNDb25maWcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkbWluLid9ID0gJ0FkbWluaXN0cmHDp8Ojby4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIGFuZCBtYW5hZ2UgdGhlIEdlbmVyYWwgQ2F0YWxvZy4nfSA9ICdDcmlhciBlIGdlcmVuY2lhciBvIENhdMOhbG9nbyBHZXJhbC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIEFkbWluR2VuZXJhbENhdGFsb2cgY29uZmlndXJhdGlvbiBpbiB0aGUgYWRtaW4gYXJlYS4nfSA9CiAgICAgICAgJ03Ds2R1bG8gZGUgcmVnaXN0byBkYSBpbnRlcmZhY2UgcGFyYSBhIGNvbmZpZ3VyYcOnw6NvIEFkbWluR2VuZXJhbENhdGFsb2cgbmEgw6FyZWEgYWRtaW5pc3RyYXRpdmEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0dlbmVyYWwgQ2F0YWxvZyd9ID0gJ0NhdMOhbG9nbyBHZXJhbCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQYXJhbWV0ZXJzIGZvciB0aGUgZXhhbXBsZSBjb21tZW50IDIgb2YgdGhlIGdlbmVyYWwgY2F0YWxvZyBhdHRyaWJ1dGVzLid9ID0KICAgICAgICAnUGFyw6JtZXRyb3MgcGFyYSBvIGNvbWVudMOhcmlvIGRlIGV4ZW1wbG8gMiBkb3MgYXRyaWJ1dG9zIGRvIGNhdMOhbG9nbyBnZXJhbC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGFyYW1ldGVycyBmb3IgdGhlIGV4YW1wbGUgcGVybWlzc2lvbiBncm91cHMgb2YgdGhlIGdlbmVyYWwgY2F0YWxvZyBhdHRyaWJ1dGVzLid9ID0KICAgICAgICAnUGFyw6JtZXRyb3MgZG8gZ3J1cG9zIGRlIHBlcm1pc3PDo28gZGUgZXhlbXBsbyBkb3MgYXRyaWJ1dG9zIGRvIGNhdMOhbG9nbyBnZXJhbC4nOwoKfQoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE2IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6cHRfR2VuZXJhbENhdGFsb2c7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBQUFHZW5lcmFsQ2F0YWxvZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRnVuY3Rpb25hbGl0eSd9ID0gJ0Z1bmNpb25hbEFudGlndWlkYWRlJzsKCiAgICAjIFRlbXBsYXRlOiBBZG1pbkdlbmVyYWxDYXRhbG9nCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydHZW5lcmFsIENhdGFsb2cgTWFuYWdlbWVudCd9ID0gJ0dlc3TDo28gZG8gQ2F0w6Fsb2dvIEdlcmFsJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBDYXRhbG9nIEl0ZW0nfSA9ICdBZGljaW9uYXIgSXRlbSBhbyBDYXTDoWxvZ28nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIENhdGFsb2cgQ2xhc3MnfSA9ICdBZGljaW9uYXIgQ2xhc3NlIGFvIENhdMOhbG9nbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYXRhbG9nIENsYXNzJ30gPSAnQ2xhc3NlIGRvIENhdMOhbG9nbyc7CgogICAgIyBTeXNDb25maWcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkbWluLid9ID0gJ0FkbWluaXN0cmHDp8Ojby4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIGFuZCBtYW5hZ2UgdGhlIEdlbmVyYWwgQ2F0YWxvZy4nfSA9ICdDcmlhciBlIGdlcmlyIG8gQ2F0w6Fsb2dvIEdlcmFsLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgQWRtaW5HZW5lcmFsQ2F0YWxvZyBjb25maWd1cmF0aW9uIGluIHRoZSBhZG1pbiBhcmVhLid9ID0KICAgICAgICAnTcOzZHVsbyBkZSByZWdpc3RvIGRhIGludGVyZmFjZSBwYXJhIGEgY29uZmlndXJhw6fDo28gQWRtaW5HZW5lcmFsQ2F0YWxvZyBuYSDDoXJlYSBhZG1pbmlzdHJhdGl2YS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnR2VuZXJhbCBDYXRhbG9nJ30gPSAnQ2F0w6Fsb2dvIEdlcmFsJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BhcmFtZXRlcnMgZm9yIHRoZSBleGFtcGxlIGNvbW1lbnQgMiBvZiB0aGUgZ2VuZXJhbCBjYXRhbG9nIGF0dHJpYnV0ZXMuJ30gPQogICAgICAgICdQYXLDom1ldHJvcyBwYXJhIG8gY29tZW50w6FyaW8gZGUgZXhlbXBsbyAyIGRvcyBhdHJpYnV0b3MgZG8gY2F0w6Fsb2dvIGdlcmFsLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQYXJhbWV0ZXJzIGZvciB0aGUgZXhhbXBsZSBwZXJtaXNzaW9uIGdyb3VwcyBvZiB0aGUgZ2VuZXJhbCBjYXRhbG9nIGF0dHJpYnV0ZXMuJ30gPQogICAgICAgICdQYXLDom1ldHJvcyBwYXJhIG9zIGdydXBvcyBkZSBwZXJtaXNzw6NvIGRlIGV4ZW1wbG8gZG9zIGF0cmlidXRvcyBkbyBjYXTDoWxvZ28gZ2VyYWwuJzsKCn0KCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE2IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6cnVfR2VuZXJhbENhdGFsb2c7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBQUFHZW5lcmFsQ2F0YWxvZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRnVuY3Rpb25hbGl0eSd9ID0gJ9Ck0YPQvdC60YbQuNC+0L3QsNC70YzQvdC+0YHRgtGMJzsKCiAgICAjIFRlbXBsYXRlOiBBZG1pbkdlbmVyYWxDYXRhbG9nCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydHZW5lcmFsIENhdGFsb2cgTWFuYWdlbWVudCd9ID0gJ9Cj0L/RgNCw0LLQu9C10L3QuNC1INCe0LHRidC40Lwg0LrQsNGC0LDQu9C+0LPQvtC8JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBDYXRhbG9nIEl0ZW0nfSA9ICfQlNC+0LHQsNCy0LvQtdC90LjQtSDRjdC70LXQvNC10L3RgtCwINC60LDRgtCw0LvQvtCz0LAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIENhdGFsb2cgQ2xhc3MnfSA9ICfQlNC+0LHQsNCy0LvQtdC90LjQtSDQutC70LDRgdGB0LAg0LrQsNGC0LDQu9C+0LPQsCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYXRhbG9nIENsYXNzJ30gPSAn0JrQu9Cw0YHRgSDQutCw0YLQsNC70L7Qs9CwJzsKCiAgICAjIFN5c0NvbmZpZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRtaW4uJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZSBhbmQgbWFuYWdlIHRoZSBHZW5lcmFsIENhdGFsb2cuJ30gPSAn0KHQvtC30LTQsNC90LjQtSDQuCDRg9C/0YDQsNCy0LvQtdC90LjQtSDQntCx0YnQuNC8INC60LDRgtCw0LvQvtCz0L7QvCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgQWRtaW5HZW5lcmFsQ2F0YWxvZyBjb25maWd1cmF0aW9uIGluIHRoZSBhZG1pbiBhcmVhLid9ID0KICAgICAgICAnTW9kdWxlIHJlZ2lzdHJhdGlvbiDQtNC70Y8g0LrQvtC90YTQuNCz0YPRgNCw0YbQuNC4IEFkbWluR2VuZXJhbENhdGFsb2cg0LIg0L/QsNC90LXQu9C4INCw0LTQvNC40L3QuNGB0YLRgNCw0YLQvtGA0LAuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0dlbmVyYWwgQ2F0YWxvZyd9ID0gJ9Ce0LHRidC40Lkg0LrQsNGC0LDQu9C+0LMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGFyYW1ldGVycyBmb3IgdGhlIGV4YW1wbGUgY29tbWVudCAyIG9mIHRoZSBnZW5lcmFsIGNhdGFsb2cgYXR0cmlidXRlcy4nfSA9CiAgICAgICAgJ9CU0L7QsdCw0LLQu9C10L3QuNC1INC00L7Qv9C+0LvQvdC40YLQtdC70YzQvdC+0LPQviDQutC+0LzQvNC10L3RgtCw0YDQuNGPINC6INCw0YLRgNC40LHRg9GC0LDQvCDQntCx0YnQtdCz0L4g0LrQsNGC0LDQu9C+0LPQsCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQYXJhbWV0ZXJzIGZvciB0aGUgZXhhbXBsZSBwZXJtaXNzaW9uIGdyb3VwcyBvZiB0aGUgZ2VuZXJhbCBjYXRhbG9nIGF0dHJpYnV0ZXMuJ30gPQogICAgICAgICfQn9Cw0YDQsNC80LXRgtGA0Ysg0LTQu9GPINC/0YDQuNC80LXRgNC90YvRhSDQs9GA0YPQv9C/0L7QstGL0YUg0L/RgNCw0LIg0LTQu9GPINCw0YLRgNC40LHRg9GC0L7QsiDQntCx0YnQtdCz0L4g0LrQsNGC0LDQu9C+0LPQsCc7Cgp9CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE2IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6c3ZfR2VuZXJhbENhdGFsb2c7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBQUFHZW5lcmFsQ2F0YWxvZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRnVuY3Rpb25hbGl0eSd9ID0gJ0Z1bmt0aW9uYWxpdGV0JzsKCiAgICAjIFRlbXBsYXRlOiBBZG1pbkdlbmVyYWxDYXRhbG9nCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydHZW5lcmFsIENhdGFsb2cgTWFuYWdlbWVudCd9ID0gJ0hhbnRlcmEgZ3J1bmRrYXRhbG9nJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBDYXRhbG9nIEl0ZW0nfSA9ICdMw6RnZyB0aWxsIGthdGFsb2dwb3N0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBDYXRhbG9nIENsYXNzJ30gPSAnTMOkZ2cgdGlsbCBrbGFzcyBpIGthdGFsb2cnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2F0YWxvZyBDbGFzcyd9ID0gJ0thdGFsb2drbGFzcyc7CgogICAgIyBTeXNDb25maWcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkbWluLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgYW5kIG1hbmFnZSB0aGUgR2VuZXJhbCBDYXRhbG9nLid9ID0gJ1NrYXBhIG9jaCBoYW50ZXJhIGdydW5ka2F0YWxvZ2VuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Zyb250ZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBBZG1pbkdlbmVyYWxDYXRhbG9nIGNvbmZpZ3VyYXRpb24gaW4gdGhlIGFkbWluIGFyZWEuJ30gPQogICAgICAgICdSZWdpc3RyZXJpbmcgYXYgZnJvbnRlbmRtb2R1bCBmw7ZyIEFkbWluR2VuZXJhbENhdGFsb2ctaW5zdMOkbGxuaW5nYXIgaSBhZG1pbmFyZWFuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydHZW5lcmFsIENhdGFsb2cnfSA9ICdHcnVuZGthdGFsb2cnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGFyYW1ldGVycyBmb3IgdGhlIGV4YW1wbGUgY29tbWVudCAyIG9mIHRoZSBnZW5lcmFsIGNhdGFsb2cgYXR0cmlidXRlcy4nfSA9CiAgICAgICAgJ1BhcmFtZXRyYXIgZsO2ciBleGVtcGVsa29tbWVudGFyIDIgaSBhdHRyaWJ1dGVuIGbDtnIgZ3J1bmRrYXRhbG9nZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BhcmFtZXRlcnMgZm9yIHRoZSBleGFtcGxlIHBlcm1pc3Npb24gZ3JvdXBzIG9mIHRoZSBnZW5lcmFsIGNhdGFsb2cgYXR0cmlidXRlcy4nfSA9CiAgICAgICAgJ1BhcmFtZXRyYXIgZsO2ciBleGVtcGVsIHDDpSBiZWjDtnJpZ2hldHNlZ3J1cHBlciBpIGdydW5ka2F0YWxvZ2VucyBhdHRyaWJ1dC4nOwoKfQoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE2IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6c3dfR2VuZXJhbENhdGFsb2c7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBQUFHZW5lcmFsQ2F0YWxvZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRnVuY3Rpb25hbGl0eSd9ID0gJ1V0ZW5kYWppJzsKCiAgICAjIFRlbXBsYXRlOiBBZG1pbkdlbmVyYWxDYXRhbG9nCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydHZW5lcmFsIENhdGFsb2cgTWFuYWdlbWVudCd9ID0gJ1VzaW1hbWl6aSB3YSBrYXRhbG9naSB3YSB1anVtbGEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIENhdGFsb2cgSXRlbSd9ID0gJ09uZ2V6YSBraXBlbmdlbGUgeWEga2F0YWxvZ2knOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIENhdGFsb2cgQ2xhc3MnfSA9ICdPbmdlemEgdGFiYWthIGxhIGthdGFsb2dpJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhdGFsb2cgQ2xhc3MnfSA9ICdUYWJha2EgbGEga2F0YWxvZ2knOwoKICAgICMgU3lzQ29uZmlnCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZG1pbi4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIGFuZCBtYW5hZ2UgdGhlIEdlbmVyYWwgQ2F0YWxvZy4nfSA9ICdUZW5nZW5lemEgbmEgc2ltYW1pYSBLYXRhbG9naSB5YSB1anVtbGEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Zyb250ZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBBZG1pbkdlbmVyYWxDYXRhbG9nIGNvbmZpZ3VyYXRpb24gaW4gdGhlIGFkbWluIGFyZWEuJ30gPQogICAgICAgICdVc2FqaWxpIHdhIG1vZHVsaSB5YSBtYXppbmdpcmEgeWEgbWJlbGUga3dhIHVzYW5pZGkgd2Ega2F0YWxvZ2kgeWEgdWp1bWxhIHlhIG1zaW1hbWl6aSBrYXRpa2EgZW5lbyBsYSB1c2ltYW1pemkuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0dlbmVyYWwgQ2F0YWxvZyd9ID0gJ0thdGFsb2dpIHlhIHVqdW1sYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQYXJhbWV0ZXJzIGZvciB0aGUgZXhhbXBsZSBjb21tZW50IDIgb2YgdGhlIGdlbmVyYWwgY2F0YWxvZyBhdHRyaWJ1dGVzLid9ID0KICAgICAgICAnVmlnZXpvIGt3YSBtZmFubyBNYW9uaSAyIHlhIHNpZmEgemEga2F0YWxvZ2kgemEgdWp1bWxhLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQYXJhbWV0ZXJzIGZvciB0aGUgZXhhbXBsZSBwZXJtaXNzaW9uIGdyb3VwcyBvZiB0aGUgZ2VuZXJhbCBjYXRhbG9nIGF0dHJpYnV0ZXMuJ30gPQogICAgICAgICdWaWdlem8ga3dhIG1mYW5vIHJ1aHVzYSB6YSB2aWt1bmRpIGt3YSBzaWZhIHphIGthdGFsb2dpIHphIHVqdW1sYS4nOwoKfQoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE2IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6emhfQ05fR2VuZXJhbENhdGFsb2c7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBQUFHZW5lcmFsQ2F0YWxvZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRnVuY3Rpb25hbGl0eSd9ID0gJ+WKn+iDvSc7CgogICAgIyBUZW1wbGF0ZTogQWRtaW5HZW5lcmFsQ2F0YWxvZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnR2VuZXJhbCBDYXRhbG9nIE1hbmFnZW1lbnQnfSA9ICfnm67lvZXnrqHnkIYnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIENhdGFsb2cgSXRlbSd9ID0gJ+a3u+WKoOebruW9lemhueebric7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgQ2F0YWxvZyBDbGFzcyd9ID0gJ+a3u+WKoOaWsOebruW9leexuyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYXRhbG9nIENsYXNzJ30gPSAn55uu5b2V57G7JzsKCiAgICAjIFN5c0NvbmZpZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRtaW4uJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZSBhbmQgbWFuYWdlIHRoZSBHZW5lcmFsIENhdGFsb2cuJ30gPSAn5Yib5bu65ZKM566h55CG55uu5b2VJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Zyb250ZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBBZG1pbkdlbmVyYWxDYXRhbG9nIGNvbmZpZ3VyYXRpb24gaW4gdGhlIGFkbWluIGFyZWEuJ30gPQogICAgICAgICflnKjns7vnu5/nrqHnkIbkuK3ms6jlhoznm67lvZXnrqHnkIbmqKHlnZdBZG1pbkdlbmVyYWxDYXRhbG9n55qE5YmN56uv5qih5Z2X44CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0dlbmVyYWwgQ2F0YWxvZyd9ID0gJ+ebruW9lSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQYXJhbWV0ZXJzIGZvciB0aGUgZXhhbXBsZSBjb21tZW50IDIgb2YgdGhlIGdlbmVyYWwgY2F0YWxvZyBhdHRyaWJ1dGVzLid9ID0KICAgICAgICAn55uu5b2V5bGe5oCn5qC35L6LLeazqOmHijLnmoTlj4LmlbDorr7nva7jgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGFyYW1ldGVycyBmb3IgdGhlIGV4YW1wbGUgcGVybWlzc2lvbiBncm91cHMgb2YgdGhlIGdlbmVyYWwgY2F0YWxvZyBhdHRyaWJ1dGVzLid9ID0KICAgICAgICAn55uu5b2V5bGe5oCn5qC35L6LLeadg+mZkOe7hOeahOWPguaVsOOAgic7Cgp9CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE2IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6emhfVFdfR2VuZXJhbENhdGFsb2c7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBQUFHZW5lcmFsQ2F0YWxvZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRnVuY3Rpb25hbGl0eSd9ID0gJ+WKn+iDvSc7CgogICAgIyBUZW1wbGF0ZTogQWRtaW5HZW5lcmFsQ2F0YWxvZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnR2VuZXJhbCBDYXRhbG9nIE1hbmFnZW1lbnQnfSA9ICfnm67pjITnrqHnkIYnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIENhdGFsb2cgSXRlbSd9ID0gJ+a3u+WKoOebrumMhOmgheebric7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgQ2F0YWxvZyBDbGFzcyd9ID0gJ+a3u+WKoOaWsOebrumMhOmhnuWIpSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYXRhbG9nIENsYXNzJ30gPSAn55uu6YyE6aGe5YilJzsKCiAgICAjIFN5c0NvbmZpZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRtaW4uJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZSBhbmQgbWFuYWdlIHRoZSBHZW5lcmFsIENhdGFsb2cuJ30gPSAn5Ym15bu65ZKM566h55CG55uu6YyEJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Zyb250ZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBBZG1pbkdlbmVyYWxDYXRhbG9nIGNvbmZpZ3VyYXRpb24gaW4gdGhlIGFkbWluIGFyZWEuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnR2VuZXJhbCBDYXRhbG9nJ30gPSAn55uu6YyEJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BhcmFtZXRlcnMgZm9yIHRoZSBleGFtcGxlIGNvbW1lbnQgMiBvZiB0aGUgZ2VuZXJhbCBjYXRhbG9nIGF0dHJpYnV0ZXMuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGFyYW1ldGVycyBmb3IgdGhlIGV4YW1wbGUgcGVybWlzc2lvbiBncm91cHMgb2YgdGhlIGdlbmVyYWwgY2F0YWxvZyBhdHRyaWJ1dGVzLid9ID0KICAgICAgICAnJzsKCn0KCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE2IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZG1pbkdlbmVyYWxDYXRhbG9nOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKb3VyICRPYmplY3RNYW5hZ2VyRGlzYWJsZWQgPSAxOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBuZWVkZWQgb2JqZWN0CiAgICBteSAkQ29uZmlnT2JqZWN0ICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwogICAgbXkgJFBhcmFtT2JqZWN0ICAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpOwogICAgbXkgJExheW91dE9iamVjdCAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwogICAgbXkgJFZhbGlkT2JqZWN0ICAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlZhbGlkJyk7CiAgICBteSAkR2VuZXJhbENhdGFsb2dPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2cnKTsKCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIGNhdGFsb2cgaXRlbSBsaXN0CiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnSXRlbUxpc3QnICkgewogICAgICAgIG15ICRDbGFzcyA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJDbGFzcyIgKSB8fCAnJzsKCiAgICAgICAgIyBjaGVjayBuZWVkZWQgY2xhc3MKICAgICAgICBpZiAoICEkQ2xhc3MgKSB7CiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5SZWRpcmVjdCggT1AgPT4gIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn0iICk7CiAgICAgICAgfQoKICAgICAgICAjIG91dHB1dCBvdmVydmlldwogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdPdmVydmlldycsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3SXRlbScsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgQ2xhc3MgPT4gJENsYXNzLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICMgZ2V0IGF2YWlsYWJpbGl0eSBsaXN0CiAgICAgICAgbXkgJVZhbGlkTGlzdCA9ICRWYWxpZE9iamVjdC0+VmFsaWRMaXN0KCk7CgogICAgICAgICMgZ2V0IGNhdGFsb2cgaXRlbSBsaXN0CiAgICAgICAgbXkgJEl0ZW1JRExpc3QgPSAkR2VuZXJhbENhdGFsb2dPYmplY3QtPkl0ZW1MaXN0KAogICAgICAgICAgICBDbGFzcyA9PiAkQ2xhc3MsCiAgICAgICAgICAgIFZhbGlkID0+IDAsCiAgICAgICAgKTsKCiAgICAgICAgIyBjaGVjayBpdGVtIGxpc3QKICAgICAgICBpZiAoICEkSXRlbUlETGlzdCB8fCAhJXskSXRlbUlETGlzdH0gKSB7CiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigpOwogICAgICAgIH0KCiAgICAgICAgZm9yIG15ICRJdGVtSUQgKCBzb3J0IHsgJEl0ZW1JRExpc3QtPnskYX0gY21wICRJdGVtSURMaXN0LT57JGJ9IH0ga2V5cyAleyRJdGVtSURMaXN0fSApIHsKCiAgICAgICAgICAgICMgZ2V0IGl0ZW0gZGF0YQogICAgICAgICAgICBteSAkSXRlbURhdGEgPSAkR2VuZXJhbENhdGFsb2dPYmplY3QtPkl0ZW1HZXQoCiAgICAgICAgICAgICAgICBJdGVtSUQgPT4gJEl0ZW1JRCwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgb3V0cHV0IG92ZXJ2aWV3IGl0ZW0gbGlzdAogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3SXRlbUxpc3QnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgJXskSXRlbURhdGF9LAogICAgICAgICAgICAgICAgICAgIFZhbGlkID0+ICRWYWxpZExpc3R7ICRJdGVtRGF0YS0+e1ZhbGlkSUR9IH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBBY3Rpb25PdmVydmlldwogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdBY3Rpb25BZGRJdGVtJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICBDbGFzcyA9PiAkQ2xhc3MsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBBY3Rpb25PdmVydmlldwogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdBY3Rpb25PdmVydmlldycsCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgaGVhZGVyIGFuZCBuYXZiYXIKICAgICAgICBteSAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+SGVhZGVyKCk7CiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5OYXZpZ2F0aW9uQmFyKCk7CgogICAgICAgICMgY3JlYXRlIG91dHB1dCBzdHJpbmcKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZG1pbkdlbmVyYWxDYXRhbG9nJywKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUGFyYW0sCiAgICAgICAgKTsKCiAgICAgICAgIyBhZGQgZm9vdGVyCiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoKTsKCiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBjYXRhbG9nIGl0ZW0gZWRpdAogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0l0ZW1FZGl0JyApIHsKICAgICAgICBteSAlSXRlbURhdGE7CgogICAgICAgICMgZ2V0IHBhcmFtcwogICAgICAgICRJdGVtRGF0YXtJdGVtSUR9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIkl0ZW1JRCIgKTsKCiAgICAgICAgIyBhZGQgYSBuZXcgY2F0YWxvZyBpdGVtCiAgICAgICAgaWYgKCAkSXRlbURhdGF7SXRlbUlEfSBlcSAnTkVXJyApIHsKCiAgICAgICAgICAgICMgZ2V0IGNsYXNzCiAgICAgICAgICAgICRJdGVtRGF0YXtDbGFzc30gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiQ2xhc3MiICk7CgogICAgICAgICAgICAjIHJlZGlyZWN0IHRvIG92ZXJ2aWV3CiAgICAgICAgICAgIGlmICggISRJdGVtRGF0YXtDbGFzc30gKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+UmVkaXJlY3QoIE9QID0+ICJBY3Rpb249JFNlbGYtPntBY3Rpb259IiApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGVkaXQgYW4gZXhpc3RpbmcgY2F0YWxvZyBpdGVtCiAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAjIGdldCBpdGVtIGRhdGEKICAgICAgICAgICAgbXkgJEl0ZW1EYXRhUmVmID0gJEdlbmVyYWxDYXRhbG9nT2JqZWN0LT5JdGVtR2V0KAogICAgICAgICAgICAgICAgSXRlbUlEID0+ICRJdGVtRGF0YXtJdGVtSUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBjaGVjayBpdGVtIGRhdGEKICAgICAgICAgICAgaWYgKCAhJEl0ZW1EYXRhUmVmICkgewogICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICVJdGVtRGF0YSA9ICV7JEl0ZW1EYXRhUmVmfTsKICAgICAgICB9CgogICAgICAgICMgb3V0cHV0IG92ZXJ2aWV3CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICBDbGFzcyA9PiAkSXRlbURhdGF7Q2xhc3N9LAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICMgZ2VuZXJhdGUgVmFsaWRPcHRpb25TdHJnCiAgICAgICAgbXkgJVZhbGlkTGlzdCAgICAgICAgPSAkVmFsaWRPYmplY3QtPlZhbGlkTGlzdCgpOwogICAgICAgIG15ICVWYWxpZExpc3RSZXZlcnNlID0gcmV2ZXJzZSAlVmFsaWRMaXN0OwogICAgICAgIG15ICRWYWxpZE9wdGlvblN0cmcgID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJ1ZhbGlkSUQnLAogICAgICAgICAgICBEYXRhICAgICAgID0+IFwlVmFsaWRMaXN0LAogICAgICAgICAgICBTZWxlY3RlZElEID0+ICRJdGVtRGF0YXtWYWxpZElEfSB8fCAkVmFsaWRMaXN0UmV2ZXJzZXt2YWxpZH0sCiAgICAgICAgICAgIENsYXNzICAgICAgPT4gJ01vZGVybml6ZScsCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgSXRlbUVkaXQKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnSXRlbUVkaXQnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICVJdGVtRGF0YSwKICAgICAgICAgICAgICAgIFZhbGlkT3B0aW9uU3RyZyA9PiAkVmFsaWRPcHRpb25TdHJnLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICMgc2hvdyBlYWNoIHByZWZlcmVuY2VzIHNldHRpbmcKICAgICAgICBteSAlUHJlZmVyZW5jZXMgPSAoKTsKICAgICAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnR2VuZXJhbENhdGFsb2dQcmVmZXJlbmNlcycpICkgewogICAgICAgICAgICAlUHJlZmVyZW5jZXMgPSAleyAkQ29uZmlnT2JqZWN0LT5HZXQoJ0dlbmVyYWxDYXRhbG9nUHJlZmVyZW5jZXMnKSB9OwogICAgICAgIH0KCiAgICAgICAgSVRFTToKICAgICAgICBmb3IgbXkgJEl0ZW0gKCBzb3J0IGtleXMgJVByZWZlcmVuY2VzICkgewoKICAgICAgICAgICAgIyBza2lwIGl0ZW1zIHRoYXQgZG9uJ3QgYmVsb25nIHRvIHRoZSBjbGFzcwogICAgICAgICAgICBpZiAoICRQcmVmZXJlbmNlc3skSXRlbX0tPntDbGFzc30gJiYgJFByZWZlcmVuY2VzeyRJdGVtfS0+e0NsYXNzfSBuZSAkSXRlbURhdGF7Q2xhc3N9ICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgbmV4dCBJVEVNOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGZpbmQgb3V0cHV0IG1vZHVsZQogICAgICAgICAgICBteSAkTW9kdWxlID0gJFByZWZlcmVuY2VzeyRJdGVtfS0+e01vZHVsZX0KICAgICAgICAgICAgICAgIHx8ICdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6R2VuZXJhbENhdGFsb2dQcmVmZXJlbmNlczo6R2VuZXJpYyc7CgogICAgICAgICAgICAjIGxvYWQgbW9kdWxlCiAgICAgICAgICAgIGlmICggISRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpNYWluJyktPlJlcXVpcmUoJE1vZHVsZSkgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGNyZWF0ZSBvYmplY3QgZm9yIHRoaXMgcHJlZmVyZW5jZXMgaXRlbQogICAgICAgICAgICBteSAkT2JqZWN0ID0gJE1vZHVsZS0+bmV3KAogICAgICAgICAgICAgICAgJXskU2VsZn0sCiAgICAgICAgICAgICAgICBDb25maWdJdGVtID0+ICRQcmVmZXJlbmNlc3skSXRlbX0sCiAgICAgICAgICAgICAgICBEZWJ1ZyAgICAgID0+ICRTZWxmLT57RGVidWd9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBzaG93IGFsbCBwYXJhbWV0ZXJzCiAgICAgICAgICAgIG15IEBQYXJhbXMgPSAkT2JqZWN0LT5QYXJhbSggR2VuZXJhbENhdGFsb2dEYXRhID0+IHsgJUl0ZW1EYXRhLCAlUGFyYW0gfSApOwogICAgICAgICAgICBmb3IgbXkgJFBhcmFtSXRlbSAoQFBhcmFtcykgewoKICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICByZWYoICRQYXJhbUl0ZW0tPntEYXRhfSApIGVxICdIQVNIJwogICAgICAgICAgICAgICAgICAgIHx8IHJlZiggJFByZWZlcmVuY2VzeyRJdGVtfS0+e0RhdGF9ICkgZXEgJ0hBU0gnCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICRQYXJhbUl0ZW0tPnsnT3B0aW9uJ30gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgICAgICAgICAgICAgJXsgJFByZWZlcmVuY2VzeyRJdGVtfSB9LAogICAgICAgICAgICAgICAgICAgICAgICAleyRQYXJhbUl0ZW19LAogICAgICAgICAgICAgICAgICAgICAgICBDbGFzcyA9PiAnTW9kZXJuaXplJywKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJFBhcmFtSXRlbS0+e0Jsb2NrfSB8fCAkUHJlZmVyZW5jZXN7JEl0ZW19LT57QmxvY2t9IHx8ICdPcHRpb24nLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAleyAkUHJlZmVyZW5jZXN7JEl0ZW19IH0sCiAgICAgICAgICAgICAgICAgICAgICAgICV7JFBhcmFtSXRlbX0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICggJEl0ZW1EYXRhe0NsYXNzfSBlcSAnTkVXJyApIHsKCiAgICAgICAgICAgICMgb3V0cHV0IEl0ZW1FZGl0Q2xhc3NBZGQKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdJdGVtRWRpdENsYXNzQWRkJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIENsYXNzID0+ICRJdGVtRGF0YXtDbGFzc30sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICMgb3V0cHV0IEl0ZW1FZGl0Q2xhc3NFeGlzdAogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0l0ZW1FZGl0Q2xhc3NFeGlzdCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBDbGFzcyA9PiAkSXRlbURhdGF7Q2xhc3N9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgQWN0aW9uT3ZlcnZpZXcKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQWN0aW9uT3ZlcnZpZXcnLAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IGhlYWRlcgogICAgICAgIG15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5IZWFkZXIoKTsKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5hdmlnYXRpb25CYXIoKTsKCiAgICAgICAgIyBjcmVhdGUgb3V0cHV0IHN0cmluZwogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FkbWluR2VuZXJhbENhdGFsb2cnLAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbSwKICAgICAgICApOwoKICAgICAgICAjIGFkZCBmb290ZXIKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkZvb3RlcigpOwoKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIGNhdGFsb2cgaXRlbSBzYXZlCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnSXRlbVNhdmUnICkgewogICAgICAgIG15ICVJdGVtRGF0YTsKCiAgICAgICAgIyBnZXQgcGFyYW1zCiAgICAgICAgZm9yIG15ICRQYXJhbSAocXcoQ2xhc3MgSXRlbUlEIFZhbGlkSUQgQ29tbWVudCkpIHsKICAgICAgICAgICAgJEl0ZW1EYXRheyRQYXJhbX0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkUGFyYW0gKSB8fCAnJzsKICAgICAgICB9CgogICAgICAgICMgZ2V0IG5hbWUgcGFyYW0sIG5hbWUgbXVzdCBiZSBub3QgZW1wdHksIGJ1dCBudW1iZXIgemVybyAoMCkgaXMgYWxsb3dlZAogICAgICAgICRJdGVtRGF0YXtOYW1lfSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdOYW1lJyApOwoKICAgICAgICAjIGNoZWNrIGNsYXNzCiAgICAgICAgaWYgKCAkSXRlbURhdGF7Q2xhc3N9IGVxICdORVcnICkgewogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+UmVkaXJlY3QoIE9QID0+ICJBY3Rpb249JFNlbGYtPntBY3Rpb259IiApOwogICAgICAgIH0KCiAgICAgICAgIyBzYXZlIHRvIGRhdGFiYXNlCiAgICAgICAgbXkgJFN1Y2Nlc3M7CiAgICAgICAgbXkgJEl0ZW1JRCA9ICRJdGVtRGF0YXtJdGVtSUR9OwogICAgICAgIGlmICggJEl0ZW1EYXRhe0l0ZW1JRH0gZXEgJ05FVycgKSB7CiAgICAgICAgICAgICRTdWNjZXNzID0gJEdlbmVyYWxDYXRhbG9nT2JqZWN0LT5JdGVtQWRkKAogICAgICAgICAgICAgICAgJUl0ZW1EYXRhLAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJEl0ZW1JRCA9ICRTdWNjZXNzOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFN1Y2Nlc3MgPSAkR2VuZXJhbENhdGFsb2dPYmplY3QtPkl0ZW1VcGRhdGUoCiAgICAgICAgICAgICAgICAlSXRlbURhdGEsCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyB1cGRhdGUgcHJlZmVyZW5jZXMKICAgICAgICBteSAkR0NEYXRhICAgICAgPSAkR2VuZXJhbENhdGFsb2dPYmplY3QtPkl0ZW1HZXQoIEl0ZW1JRCA9PiAkSXRlbUlEICk7CiAgICAgICAgbXkgJVByZWZlcmVuY2VzID0gKCk7CiAgICAgICAgbXkgJE5vdGUgICAgICAgID0gJyc7CgogICAgICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdHZW5lcmFsQ2F0YWxvZ1ByZWZlcmVuY2VzJykgKSB7CiAgICAgICAgICAgICVQcmVmZXJlbmNlcyA9ICV7ICRDb25maWdPYmplY3QtPkdldCgnR2VuZXJhbENhdGFsb2dQcmVmZXJlbmNlcycpIH07CiAgICAgICAgfQoKICAgICAgICBmb3IgbXkgJEl0ZW0gKCBzb3J0IGtleXMgJVByZWZlcmVuY2VzICkgewogICAgICAgICAgICBteSAkTW9kdWxlID0gJFByZWZlcmVuY2VzeyRJdGVtfS0+e01vZHVsZX0KICAgICAgICAgICAgICAgIHx8ICdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6R2VuZXJhbENhdGFsb2dQcmVmZXJlbmNlczo6R2VuZXJpYyc7CgogICAgICAgICAgICAjIGxvYWQgbW9kdWxlCiAgICAgICAgICAgIGlmICggISRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpNYWluJyktPlJlcXVpcmUoJE1vZHVsZSkgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBteSAkT2JqZWN0ID0gJE1vZHVsZS0+bmV3KAogICAgICAgICAgICAgICAgJXskU2VsZn0sCiAgICAgICAgICAgICAgICBDb25maWdJdGVtID0+ICRQcmVmZXJlbmNlc3skSXRlbX0sCiAgICAgICAgICAgICAgICBEZWJ1ZyAgICAgID0+ICRTZWxmLT57RGVidWd9LAogICAgICAgICAgICApOwogICAgICAgICAgICBteSBAUGFyYW1zID0gJE9iamVjdC0+UGFyYW0oIEdlbmVyYWxDYXRhbG9nRGF0YSA9PiAkR0NEYXRhICk7CiAgICAgICAgICAgIGlmIChAUGFyYW1zKSB7CiAgICAgICAgICAgICAgICBteSAlR2V0UGFyYW0gPSAoKTsKICAgICAgICAgICAgICAgIGZvciBteSAkUGFyYW1JdGVtIChAUGFyYW1zKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgQEFycmF5ID0gJFBhcmFtT2JqZWN0LT5HZXRBcnJheSggUGFyYW0gPT4gJFBhcmFtSXRlbS0+e05hbWV9ICk7CiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFteyAkUGFyYW1JdGVtLT57TmFtZX0gfSA9IFxAQXJyYXk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgISRPYmplY3QtPlJ1bigKICAgICAgICAgICAgICAgICAgICAgICAgR2V0UGFyYW0gPT4gXCVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICAgICAgSXRlbUlEICAgPT4gJEdDRGF0YS0+e0l0ZW1JRH0sCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkTm90ZSAuPSAkTGF5b3V0T2JqZWN0LT5Ob3RpZnkoIEluZm8gPT4gJE9iamVjdC0+RXJyb3IoKSApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoICEkU3VjY2VzcyApIHsKICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKCk7CiAgICAgICAgfQoKICAgICAgICAjIHJlZGlyZWN0IHRvIG92ZXJ2aWV3IGNsYXNzIGxpc3QKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+UmVkaXJlY3QoCiAgICAgICAgICAgIE9QID0+ICJBY3Rpb249JFNlbGYtPntBY3Rpb259O1N1YmFjdGlvbj1JdGVtTGlzdDtDbGFzcz0kSXRlbURhdGF7Q2xhc3N9IgogICAgICAgICk7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBvdmVydmlldwogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzZSB7CgogICAgICAgICMgb3V0cHV0IG92ZXJ2aWV3CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXdDbGFzcycsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICMgZ2V0IGNhdGFsb2cgY2xhc3MgbGlzdAogICAgICAgIG15ICRDbGFzc0xpc3QgPSAkR2VuZXJhbENhdGFsb2dPYmplY3QtPkNsYXNzTGlzdCgpOwoKICAgICAgICBmb3IgbXkgJENsYXNzICggQHskQ2xhc3NMaXN0fSApIHsKCiAgICAgICAgICAgICMgb3V0cHV0IG92ZXJ2aWV3IGNsYXNzIGxpc3QKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdPdmVydmlld0NsYXNzTGlzdCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBDbGFzcyA9PiAkQ2xhc3MsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBBY3Rpb25BZGRDbGFzcwogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdBY3Rpb25BZGRDbGFzcycsCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgaGVhZGVyIGFuZCBuYXZiYXIKICAgICAgICBteSAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+SGVhZGVyKCk7CiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5OYXZpZ2F0aW9uQmFyKCk7CgogICAgICAgICMgY3JlYXRlIG91dHB1dCBzdHJpbmcKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZG1pbkdlbmVyYWxDYXRhbG9nJywKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUGFyYW0sCiAgICAgICAgKTsKCiAgICAgICAgIyBhZGQgZm9vdGVyCiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoKTsKCiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9Cn0KCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE2IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkdlbmVyYWxDYXRhbG9nUHJlZmVyZW5jZXM6OkdlbmVyaWM7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CgpvdXIgQE9iamVjdERlcGVuZGVuY2llcyA9ICgKICAgICdLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2cnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcsCik7CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgZ2V0IG5lZWRlZCBwYXJhbXMKICAgIGZvciBteSAkTmVlZGVkIChxdyggVXNlcklEIENvbmZpZ0l0ZW0gKSkgewogICAgICAgIGRpZSAiR290IG5vICROZWVkZWQhIiBpZiAoICEkU2VsZi0+eyROZWVkZWR9ICk7CiAgICB9CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUGFyYW0gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSBAUGFyYW1zID0gKCk7CiAgICBteSAkR2V0UGFyYW0KICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKS0+R2V0UGFyYW0oIFBhcmFtID0+ICRTZWxmLT57Q29uZmlnSXRlbX0tPntQcmVmS2V5fSApOwoKICAgIGlmICggIWRlZmluZWQoJEdldFBhcmFtKSApIHsKICAgICAgICAkR2V0UGFyYW0gPSBkZWZpbmVkKCAkUGFyYW17R2VuZXJhbENhdGFsb2dEYXRhfS0+eyAkU2VsZi0+e0NvbmZpZ0l0ZW19LT57UHJlZktleX0gfSApCiAgICAgICAgICAgID8gJFBhcmFte0dlbmVyYWxDYXRhbG9nRGF0YX0tPnsgJFNlbGYtPntDb25maWdJdGVtfS0+e1ByZWZLZXl9IH0KICAgICAgICAgICAgOiAkU2VsZi0+e0NvbmZpZ0l0ZW19LT57RGF0YVNlbGVjdGVkfTsKICAgIH0KCiAgICBpZiAoICEoIGRlZmluZWQgJFNlbGYtPntDb25maWdJdGVtfS0+e0Jsb2NrfSAmJiAkU2VsZi0+e0NvbmZpZ0l0ZW19LT57QmxvY2t9ICkgKSB7CiAgICAgICAgJFNlbGYtPntDb25maWdJdGVtfS0+e0Jsb2NrfSA9ICdUZXh0JzsKICAgIH0KCiAgICBpZiAoICRTZWxmLT57Q29uZmlnSXRlbX0tPntCbG9ja30gZXEgJ1Blcm1pc3Npb24nICkgewogICAgICAgICRQYXJhbXtEYXRhfSAgICAgICAgID0geyAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnKS0+R3JvdXBMaXN0KCBWYWxpZCA9PiAxICkgfTsKICAgICAgICAkUGFyYW17UG9zc2libGVOb25lfSA9IDE7CiAgICAgICAgJFBhcmFte0Jsb2NrfSAgICAgICAgPSAnT3B0aW9uJzsKICAgIH0KCiAgICBwdXNoKAogICAgICAgIEBQYXJhbXMsCiAgICAgICAgewogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJFNlbGYtPntDb25maWdJdGVtfS0+e1ByZWZLZXl9LAogICAgICAgICAgICBTZWxlY3RlZElEID0+ICRHZXRQYXJhbSwKICAgICAgICB9LAogICAgKTsKCiAgICByZXR1cm4gQFBhcmFtczsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIGZvciBteSAkS2V5ICggc29ydCBrZXlzICV7ICRQYXJhbXtHZXRQYXJhbX0gfSApIHsKICAgICAgICBteSBAQXJyYXkgPSBAeyAkUGFyYW17R2V0UGFyYW19LT57JEtleX0gfTsKICAgICAgICBmb3IgbXkgJFZhbHVlIChAQXJyYXkpIHsKCiAgICAgICAgICAgICMgcHJlZiB1cGRhdGUgZGIKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nJyktPkdlbmVyYWxDYXRhbG9nUHJlZmVyZW5jZXNTZXQoCiAgICAgICAgICAgICAgICBJdGVtSUQgPT4gJFBhcmFte0l0ZW1JRH0sCiAgICAgICAgICAgICAgICBLZXkgICAgPT4gJEtleSwKICAgICAgICAgICAgICAgIFZhbHVlICA9PiAkVmFsdWUsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICRTZWxmLT57TWVzc2FnZX0gPSAnUHJlZmVyZW5jZXMgdXBkYXRlZCBzdWNjZXNzZnVsbHkhJzsKICAgIHJldHVybiAxOwp9CgpzdWIgRXJyb3IgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICByZXR1cm4gJFNlbGYtPntFcnJvcn0gfHwgJyc7Cn0KCnN1YiBNZXNzYWdlIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgcmV0dXJuICRTZWxmLT57TWVzc2FnZX0gfHwgJyc7Cn0KCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE2IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCiMgQ29tbW9uClslIFRyYW5zbGF0ZSgiRnVuY3Rpb25hbGl0eSIpIHwgaHRtbCAlXQo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE2IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KClslIEluc2VydFRlbXBsYXRlKCJDb2xvcnBpY2tlci50dCIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJPdmVydmlldyIpICVdCjxkaXYgY2xhc3M9Ik1haW5Cb3ggQVJJQVJvbGVNYWluIExheW91dEZpeGVkU2lkZWJhciBTaWRlYmFyRmlyc3QiPgogICAgPGgxPlslIFRyYW5zbGF0ZSgiR2VuZXJhbCBDYXRhbG9nIE1hbmFnZW1lbnQiKSB8IGh0bWwgJV08L2gxPgoKICAgIDxkaXYgY2xhc3M9IlNpZGViYXJDb2x1bW4iPgogICAgICAgIDxkaXYgY2xhc3M9IldpZGdldFNpbXBsZSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkhlYWRlciI+CiAgICAgICAgICAgICAgICA8aDI+WyUgVHJhbnNsYXRlKCJBY3Rpb25zIikgfCBodG1sICVdPC9oMj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9J0NvbnRlbnQnPgogICAgICAgICAgICAgICAgPHVsIGNsYXNzPSJBY3Rpb25MaXN0Ij4KWyUgUmVuZGVyQmxvY2tTdGFydCgiQWN0aW9uQWRkSXRlbSIpICVdCiAgICAgICAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgICAgICAgICA8Zm9ybSBhY3Rpb249IlslIEVudigiQ0dJSGFuZGxlIikgJV0iIG1ldGhvZD0iZ2V0Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IlslIEVudigiQWN0aW9uIikgJV0iLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9Ikl0ZW1FZGl0Ii8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJDbGFzcyIgdmFsdWU9IlslIERhdGEuQ2xhc3MgfCBodG1sICVdIi8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJJdGVtSUQiIHZhbHVlPSJORVciLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9IkNhbGxGb3JBY3Rpb24gUGx1cyIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iWyUgVHJhbnNsYXRlKCJBZGQiKSB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPlslIFRyYW5zbGF0ZSgiQWRkIENhdGFsb2cgSXRlbSIpIHwgaHRtbCAlXTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Zvcm0+CiAgICAgICAgICAgICAgICAgICAgPC9saT4KWyUgUmVuZGVyQmxvY2tFbmQoIkFjdGlvbkFkZEl0ZW0iKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJBY3Rpb25BZGRDbGFzcyIpICVdCiAgICAgICAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgICAgICAgICA8Zm9ybSBhY3Rpb249IlslIEVudigiQ0dJSGFuZGxlIikgJV0iIG1ldGhvZD0iZ2V0Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IlslIEVudigiQWN0aW9uIikgJV0iLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9Ikl0ZW1FZGl0Ii8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJJdGVtSUQiIHZhbHVlPSJORVciLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkNsYXNzIiB2YWx1ZT0iTkVXIi8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJDYWxsRm9yQWN0aW9uIFBsdXMiIHR5cGU9InN1Ym1pdCIgdmFsdWU9IlslIFRyYW5zbGF0ZSgiQWRkIikgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5bJSBUcmFuc2xhdGUoIkFkZCBDYXRhbG9nIENsYXNzIikgfCBodG1sICVdPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZm9ybT4KICAgICAgICAgICAgICAgICAgICA8L2xpPgpbJSBSZW5kZXJCbG9ja0VuZCgiQWN0aW9uQWRkQ2xhc3MiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJBY3Rpb25PdmVydmlldyIpICVdCiAgICAgICAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249WyUgRW52KCJBY3Rpb24iKSAlXSIgY2xhc3M9IkNhbGxGb3JBY3Rpb24iPjxzcGFuPlslIFRyYW5zbGF0ZSgiR28gdG8gb3ZlcnZpZXciKSB8IGh0bWwgJV08L3NwYW4+PC9hPgogICAgICAgICAgICAgICAgICAgIDwvbGk+ClslIFJlbmRlckJsb2NrRW5kKCJBY3Rpb25PdmVydmlldyIpICVdCiAgICAgICAgICAgICAgICA8L3VsPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgIDwvZGl2PgoKICAgIDxkaXYgY2xhc3M9IkNvbnRlbnRDb2x1bW4iPgogICAgICAgIDxkaXYgY2xhc3M9IldpZGdldFNpbXBsZSI+ClslIFJlbmRlckJsb2NrU3RhcnQoIk92ZXJ2aWV3Q2xhc3MiKSAlXQogICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgPGgyPlslIFRyYW5zbGF0ZSgiTGlzdCIpIHwgaHRtbCAlXTwvaDI+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iRGF0YVRhYmxlIj4KICAgICAgICAgICAgICAgICAgICA8dGhlYWQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5bJSBUcmFuc2xhdGUoIkNhdGFsb2cgQ2xhc3MiKSB8IGh0bWwgJV08L3RoPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgIDwvdGhlYWQ+CiAgICAgICAgICAgICAgICAgICAgPHRib2R5PgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJPdmVydmlld0NsYXNzTGlzdCIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz0iQXNCbG9jayIgIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1bJSBFbnYoIkFjdGlvbiIpICVdO1N1YmFjdGlvbj1JdGVtTGlzdDtDbGFzcz1bJSBEYXRhLkNsYXNzIHwgdXJpICVdIj5bJSBEYXRhLkNsYXNzIHwgaHRtbCAlXTwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+ClslIFJlbmRlckJsb2NrRW5kKCJPdmVydmlld0NsYXNzTGlzdCIpICVdCiAgICAgICAgICAgICAgICAgICAgPC90Ym9keT4KICAgICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiT3ZlcnZpZXdDbGFzcyIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJPdmVydmlld0l0ZW0iKSAlXQogICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgPGgyPlslIFRyYW5zbGF0ZSgiTGlzdCIpIHwgaHRtbCAlXTwvaDI+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KCiAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9IkRhdGFUYWJsZSI+CiAgICAgICAgICAgICAgICAgICAgPHRoZWFkPgogICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9Ilc2MHBjIj5bJSBEYXRhLkNsYXNzIHwgaHRtbCAlXTwvdGg+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9IkNlbnRlciI+WyUgVHJhbnNsYXRlKCJWYWxpZGl0eSIpIHwgaHRtbCAlXTwvdGg+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgPC90aGVhZD4KICAgICAgICAgICAgICAgICAgICA8dGJvZHk+ClslIFJlbmRlckJsb2NrU3RhcnQoIk92ZXJ2aWV3SXRlbUxpc3QiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8dHIgWyUgSUYgRGF0YS5WYWxpZElEICE9IDElXWNsYXNzPSJJbnZhbGlkIlslIEVORCAlXT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249WyUgRW52KCJBY3Rpb24iKSAlXTtTdWJhY3Rpb249SXRlbUVkaXQ7SXRlbUlEPVslIERhdGEuSXRlbUlEIHwgdXJpICVdIj5bJSBEYXRhLk5hbWUgfCBodG1sICVdPC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iQ2VudGVyIj5bJSBUcmFuc2xhdGUoRGF0YS5WYWxpZCkgfCBodG1sICVdPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KWyUgUmVuZGVyQmxvY2tFbmQoIk92ZXJ2aWV3SXRlbUxpc3QiKSAlXQogICAgICAgICAgICAgICAgICAgIDwvdGJvZHk+CiAgICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIk92ZXJ2aWV3SXRlbSIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJJdGVtRWRpdCIpICVdCiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkhlYWRlciI+CiAgICAgICAgICAgICAgICA8aDI+WyUgVHJhbnNsYXRlKCJJdGVtIikgfCBodG1sICVdIFslIFRyYW5zbGF0ZSgiRWRpdCIpIHwgaHRtbCAlXTo8L2gyPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CgogICAgICAgICAgICAgICAgPGZvcm0gYWN0aW9uPSJbJSBFbnYoIkNHSUhhbmRsZSIpICVdIiBtZXRob2Q9ImdldCIgY2xhc3M9IlZhbGlkYXRlIj4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iIHZhbHVlPSJbJSBFbnYoIkFjdGlvbiIpICVdIi8+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViYWN0aW9uIiB2YWx1ZT0iSXRlbVNhdmUiLz4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJJdGVtSUQiIHZhbHVlPSJbJSBEYXRhLkl0ZW1JRCB8IGh0bWwgJV0iLz4KICAgICAgICAgICAgICAgICAgICA8ZmllbGRzZXQgY2xhc3M9IlRhYmxlTGlrZSI+ClslIFJlbmRlckJsb2NrU3RhcnQoIkl0ZW1FZGl0Q2xhc3NBZGQiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9Ik1hbmRhdG9yeSIgZm9yPSJDbGFzc0RzYyI+PHNwYW4gY2xhc3M9Ik1hcmtlciI+Kjwvc3Bhbj5bJSBUcmFuc2xhdGUoIkNhdGFsb2cgQ2xhc3MiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IkNsYXNzIiBpZD0iQ2xhc3NEc2MiIHZhbHVlPSJbJSBEYXRhLk5hbWUgfCBodG1sICVdIiBjbGFzcz0iVzUwcGMgVmFsaWRhdGVfUmVxdWlyZWQiIG1heGxlbmd0aD0iMTAwIiAvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iQ2xhc3NEc2NFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiID48cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iQ2xhc3NEc2NTZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJJdGVtRWRpdENsYXNzQWRkIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiSXRlbUVkaXRDbGFzc0V4aXN0IikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiQ2F0YWxvZyBDbGFzcyIpIHwgaHRtbCAlXTogPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5DbGFzcyB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkNsYXNzIiB2YWx1ZT0iWyUgRGF0YS5DbGFzcyB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiSXRlbUVkaXRDbGFzc0V4aXN0IikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJNYW5kYXRvcnkiIGZvcj0iTmFtZSI+PHNwYW4gY2xhc3M9Ik1hcmtlciI+Kjwvc3Bhbj5bJSBUcmFuc2xhdGUoIk5hbWUiKSB8IGh0bWwgJV06IDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJOYW1lIiBpZD0iTmFtZSIgdmFsdWU9IlslIERhdGEuTmFtZSB8IGh0bWwgJV0iIGNsYXNzPSJXNTBwYyBWYWxpZGF0ZV9SZXF1aXJlZCIgbWF4bGVuZ3RoPSIxMDAiLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9Ik5hbWVFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiID48cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iTmFtZVNlcnZlckVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiSW5wdXRLZXkiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJbJSBEYXRhLk5hbWUgfCBodG1sICVdIj5bJSBUcmFuc2xhdGUoRGF0YS5MYWJlbCkgfCBodG1sICVdIFslIFRyYW5zbGF0ZShEYXRhLktleSkgfCBodG1sICVdOiA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iWyUgRGF0YS5OYW1lIHwgaHRtbCAlXSIgaWQ9IlslIERhdGEuTmFtZSB8IGh0bWwgJV0iIHZhbHVlPSJbJSBEYXRhLlNlbGVjdGVkSUQgfCBodG1sICVdIiBjbGFzcz0iVzUwcGMiIG1heGxlbmd0aD0iMTAwIi8+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJJbnB1dEtleSIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIklucHV0IikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iWyUgRGF0YS5OYW1lIHwgaHRtbCAlXSI+WyUgVHJhbnNsYXRlKERhdGEuTGFiZWwpIHwgaHRtbCAlXTo8YnIvPjxlbT4oWyUgVHJhbnNsYXRlKERhdGEuRGVzYykgfCBodG1sICVdKTwvZW0+PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IlslIERhdGEuTmFtZSB8IGh0bWwgJV0iIGlkPSJbJSBEYXRhLk5hbWUgfCBodG1sICVdIiB2YWx1ZT0iWyUgRGF0YS5TZWxlY3RlZElEIHwgaHRtbCAlXSIgY2xhc3M9Ilc1MHBjIi8+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJJbnB1dCIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIlRleHRBcmVhIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iWyUgRGF0YS5OYW1lIHwgaHRtbCAlXSI+WyUgVHJhbnNsYXRlKERhdGEuTGFiZWwpIHwgaHRtbCAlXTo8YnIvPjxlbT4oWyUgVHJhbnNsYXRlKERhdGEuRGVzYykgfCBodG1sICVdKTwvZW0+PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIG5hbWU9IlslIERhdGEuTmFtZSB8IGh0bWwgJV0iIGlkPSJbJSBEYXRhLk5hbWUgfCBodG1sICVdIiByb3dzPSJbJSBEYXRhLlJvd3MgfCBodG1sICVdIiBjb2xzPSJbJSBEYXRhLkNvbHMgfCBodG1sICVdIj5bJSBEYXRhLlNlbGVjdGVkSUQgfCBodG1sICVdPC90ZXh0YXJlYT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIlRleHRBcmVhIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiT3B0aW9uIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iWyUgRGF0YS5OYW1lIHwgaHRtbCAlXSI+WyUgVHJhbnNsYXRlKERhdGEuTGFiZWwpIHwgaHRtbCAlXSBbJSBUcmFuc2xhdGUoRGF0YS5LZXkpIHwgaHRtbCAlXTo8YnIvPjxlbT4oWyUgVHJhbnNsYXRlKERhdGEuRGVzYykgfCBodG1sICVdKTwvZW0+PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5PcHRpb24gJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIk9wdGlvbiIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIlVwbG9hZCIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IlslIERhdGEuTmFtZSB8IGh0bWwgJV0iPlslIFRyYW5zbGF0ZShEYXRhLkxhYmVsKSB8IGh0bWwgJV0gWyUgVHJhbnNsYXRlKERhdGEuS2V5KSB8IGh0bWwgJV06IDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBuYW1lPSJbJSBEYXRhLk5hbWUgfCBodG1sICVdIiBpZD0iWyUgRGF0YS5OYW1lIHwgaHRtbCAlXSIgdHlwZT0iZmlsZSIgc2l6ZT0iMzAiIGNsYXNzPSJmaXhlZCIvPjxici8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIiPlslIERhdGEuRmlsZW5hbWUgfCBodG1sICVdPC9hPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiVXBsb2FkIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiUGFzc3dvcmQiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJbJSBEYXRhLk5hbWUgfCBodG1sICVdIj5bJSBUcmFuc2xhdGUoRGF0YS5MYWJlbCkgfCBodG1sICVdIFslIFRyYW5zbGF0ZShEYXRhLktleSkgfCBodG1sICVdOiA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0icGFzc3dvcmQiIG5hbWU9IlslIERhdGEuTmFtZSB8IGh0bWwgJV0iIGlkPSJbJSBEYXRhLk5hbWUgfCBodG1sICVdIiB2YWx1ZT0iIiBjbGFzcz0iVzUwcGMiLz4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIlBhc3N3b3JkIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiQ29sb3JQaWNrZXIiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJbJSBEYXRhLk5hbWUgfCBodG1sICVdIj5bJSBUcmFuc2xhdGUoRGF0YS5MYWJlbCkgfCBodG1sICVdOjxici8+PGVtPihbJSBUcmFuc2xhdGUoRGF0YS5EZXNjKSB8IGh0bWwgJV0pPC9lbT48L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iWyUgRGF0YS5OYW1lIHwgaHRtbCAlXSIgaWQ9IlslIERhdGEuTmFtZSB8IGh0bWwgJV0iIHZhbHVlPSJbJSBEYXRhLlNlbGVjdGVkSUQgfCBodG1sICVdIiBjbGFzcz0iVzUwcGMgSlNDb2xvclBpY2tlciB7cGlja2VyQm9yZGVyQ29sb3I6JyNCQkIgI0JCQiAjQkJCICNCQkInLCBwaWNrZXJJbnNldENvbG9yOicjQkJCICNCQkIgI0JCQiAjQkJCJ30iLz4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIkNvbG9yUGlja2VyIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iVmFsaWRJRCI+WyUgVHJhbnNsYXRlKCJWYWxpZGl0eSIpIHwgaHRtbCAlXTogPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5WYWxpZE9wdGlvblN0cmcgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IkNvbW1lbnQiPlslIFRyYW5zbGF0ZSgiQ29tbWVudCIpIHwgaHRtbCAlXTogPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IkNvbW1lbnQiIGlkPSJDb21tZW50IiB2YWx1ZT0iWyUgRGF0YS5Db21tZW50IHwgaHRtbCAlXSIgY2xhc3M9Ilc1MHBjIiBtYXhsZW5ndGg9IjIwMCIvPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQgU3BhY2luZ1RvcCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJQcmltYXJ5IiB0eXBlPSJzdWJtaXQiIGlkPSJTdWJtaXQiIHZhbHVlPSJbJSBUcmFuc2xhdGUoIlN1Ym1pdCIpIHwgaHRtbCAlXSI+WyUgVHJhbnNsYXRlKCJTdWJtaXQiKSB8IGh0bWwgJV08L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgib3IiKSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1bJSBFbnYoIkFjdGlvbiIpICVdIj5bJSBUcmFuc2xhdGUoIkNhbmNlbCIpIHwgaHRtbCAlXTwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgPC9maWVsZHNldD4KICAgICAgICAgICAgICAgIDwvZm9ybT4KICAgICAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJJdGVtRWRpdCIpICVdCiAgICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJPdmVydmlldyIpICVdCg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE2IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KClslIFdSQVBQRVIgSlNPbkRvY3VtZW50Q29tcGxldGUgJV0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPi8vPCFbQ0RBVEFbCgogICAgLypnbG9iYWwganNjb2xvcjogdHJ1ZSAqLwogICAganNjb2xvci5kaXIgPSAnWyUgQ29uZmlnKCJGcm9udGVuZDo6SmF2YVNjcmlwdFBhdGgiKSAlXScgKyAndGhpcmRwYXJ0eS9qc2NvbG9yXzEuNC4xLyc7CiAgICBqc2NvbG9yLmJpbmRDbGFzcyA9ICdKU0NvbG9yUGlja2VyJzsKICAgIGpzY29sb3IuaW5zdGFsbCgpOwoKLy9dXT48L3NjcmlwdD4KWyUgRU5EICVdCg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE2IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiAgICAnS2VybmVsOjpDb25maWcnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScsCiAgICAnS2VybmVsOjpTeXN0ZW06OkNoZWNrSXRlbScsCiAgICAnS2VybmVsOjpTeXN0ZW06OkRCJywKICAgICdLZXJuZWw6OlN5c3RlbTo6TG9nJywKICAgICdLZXJuZWw6OlN5c3RlbTo6TWFpbicsCik7Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nIC0gZ2VuZXJhbCBjYXRhbG9nIGxpYgoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgZ2VuZXJhbCBjYXRhbG9nIGZ1bmN0aW9ucy4KCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGFuIG9iamVjdAoKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6T2JqZWN0TWFuYWdlcjsKICAgIGxvY2FsICRLZXJuZWw6Ok9NID0gS2VybmVsOjpTeXN0ZW06Ok9iamVjdE1hbmFnZXItPm5ldygpOwogICAgbXkgJEdlbmVyYWxDYXRhbG9nT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nJyk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgbG9hZCBnZW5lcmF0b3IgcHJlZmVyZW5jZXMgbW9kdWxlCiAgICBteSAkR2VuZXJhdG9yTW9kdWxlID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdHZW5lcmFsQ2F0YWxvZzo6UHJlZmVyZW5jZXNNb2R1bGUnKQogICAgICAgIHx8ICdLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2c6OlByZWZlcmVuY2VzREInOwogICAgaWYgKCAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpLT5SZXF1aXJlKCRHZW5lcmF0b3JNb2R1bGUpICkgewogICAgICAgICRTZWxmLT57UHJlZmVyZW5jZXNPYmplY3R9ID0gJEdlbmVyYXRvck1vZHVsZS0+bmV3KCVQYXJhbSk7CiAgICB9CgogICAgIyBkZWZpbmUgY2FjaGUgc2V0dGluZ3MKICAgICRTZWxmLT57Q2FjaGVUeXBlfSA9ICdHZW5lcmFsQ2F0YWxvZyc7CiAgICAkU2VsZi0+e0NhY2hlVFRMfSAgPSA2MCAqIDYwICogMzsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIENsYXNzTGlzdCgpCgpyZXR1cm4gYW4gYXJyYXkgcmVmZXJlbmNlIG9mIGFsbCBnZW5lcmFsIGNhdGFsb2cgY2xhc3NlcwoKICAgIG15ICRBcnJheVJlZiA9ICRHZW5lcmFsQ2F0YWxvZ09iamVjdC0+Q2xhc3NMaXN0KCk7Cgo9Y3V0CgpzdWIgQ2xhc3NMaXN0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBhc2sgZGF0YWJhc2UKICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5QcmVwYXJlKAogICAgICAgIFNRTCA9PiAnU0VMRUNUIERJU1RJTkNUKGdlbmVyYWxfY2F0YWxvZ19jbGFzcykgJwogICAgICAgICAgICAuICdGUk9NIGdlbmVyYWxfY2F0YWxvZyBPUkRFUiBCWSBnZW5lcmFsX2NhdGFsb2dfY2xhc3MnLAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15IEBDbGFzc0xpc3Q7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgIHB1c2ggQENsYXNzTGlzdCwgJFJvd1swXTsKICAgIH0KCiAgICAjIGNhY2hlIHRoZSByZXN1bHQKICAgIG15ICRDYWNoZUtleSA9ICdDbGFzc0xpc3QnOwogICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPlNldCgKICAgICAgICBUeXBlICA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgVFRMICAgPT4gJFNlbGYtPntDYWNoZVRUTH0sCiAgICAgICAgS2V5ICAgPT4gJENhY2hlS2V5LAogICAgICAgIFZhbHVlID0+IFxAQ2xhc3NMaXN0LAogICAgKTsKCiAgICByZXR1cm4gXEBDbGFzc0xpc3Q7Cn0KCj1pdGVtIENsYXNzUmVuYW1lKCkKCnJlbmFtZSBhIGdlbmVyYWwgY2F0YWxvZyBjbGFzcwoKICAgIG15ICRUcnVlID0gJEdlbmVyYWxDYXRhbG9nT2JqZWN0LT5DbGFzc1JlbmFtZSgKICAgICAgICBDbGFzc09sZCA9PiAnSVRTTTo6Q29uZmlnSXRlbTo6U3RhdGUnLAogICAgICAgIENsYXNzTmV3ID0+ICdJVFNNOjpDb25maWdJdGVtOjpEZXBsb3ltZW50U3RhdGUnLAogICAgKTsKCj1jdXQKCnN1YiBDbGFzc1JlbmFtZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhDbGFzc09sZCBDbGFzc05ldykpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBjbGVhbnVwIGdpdmVuIHBhcmFtcwogICAgZm9yIG15ICRBcmd1bWVudCAocXcoQ2xhc3NPbGQgQ2xhc3NOZXcpKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNoZWNrSXRlbScpLT5TdHJpbmdDbGVhbigKICAgICAgICAgICAgU3RyaW5nUmVmICAgICAgICAgPT4gXCRQYXJhbXskQXJndW1lbnR9LAogICAgICAgICAgICBSZW1vdmVBbGxOZXdsaW5lcyA9PiAxLAogICAgICAgICAgICBSZW1vdmVBbGxUYWJzICAgICA9PiAxLAogICAgICAgICAgICBSZW1vdmVBbGxTcGFjZXMgICA9PiAxLAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuIDEgaWYgJFBhcmFte0NsYXNzTmV3fSBlcSAkUGFyYW17Q2xhc3NPbGR9OwoKICAgICMgY2hlY2sgaWYgbmV3IGNsYXNzIG5hbWUgYWxyZWFkeSBleGlzdHMKICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5QcmVwYXJlKAogICAgICAgIFNRTCAgID0+ICdTRUxFQ1QgaWQgRlJPTSBnZW5lcmFsX2NhdGFsb2cgV0hFUkUgZ2VuZXJhbF9jYXRhbG9nX2NsYXNzID0gPycsCiAgICAgICAgQmluZCAgPT4gWyBcJFBhcmFte0NsYXNzTmV3fSBdLAogICAgICAgIExpbWl0ID0+IDEsCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgJEFscmVhZHlFeGlzdHMgPSAwOwogICAgd2hpbGUgKCBteSBAUm93ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkQWxyZWFkeUV4aXN0cyA9IDE7CiAgICB9CgogICAgaWYgKCRBbHJlYWR5RXhpc3RzKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDYW4ndCByZW5hbWUgY2xhc3MgJFBhcmFte0NsYXNzT2xkfSEgTmV3IGNsYXNzbmFtZSBhbHJlYWR5IGV4aXN0cy4iCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyByZXNldCBjYWNoZQogICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPkNsZWFuVXAoCiAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICApOwoKICAgICMgcmVuYW1lIGdlbmVyYWwgY2F0YWxvZyBjbGFzcwogICAgcmV0dXJuICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5EbygKICAgICAgICBTUUwgPT4gJ1VQREFURSBnZW5lcmFsX2NhdGFsb2cgU0VUIGdlbmVyYWxfY2F0YWxvZ19jbGFzcyA9ID8gJwogICAgICAgICAgICAuICdXSEVSRSBnZW5lcmFsX2NhdGFsb2dfY2xhc3MgPSA/JywKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtDbGFzc05ld30sIFwkUGFyYW17Q2xhc3NPbGR9IF0sCiAgICApOwp9Cgo9aXRlbSBJdGVtTGlzdCgpCgpyZXR1cm5zIGEgbGlzdCBhcyBhIGhhc2ggcmVmZXJlbmNlIG9mIG9uZSBnZW5lcmFsIGNhdGFsb2cgY2xhc3MKCiAgICBteSAkSGFzaFJlZiA9ICRHZW5lcmFsQ2F0YWxvZ09iamVjdC0+SXRlbUxpc3QoCiAgICAgICAgQ2xhc3MgICAgICAgICA9PiAnSVRTTTo6U2VydmljZTo6VHlwZScsCiAgICAgICAgVmFsaWQgICAgICAgICA9PiAwLCAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgZGVmYXVsdCAxCiAgICAgICAgUHJlZmVyZW5jZXMgICA9PiB7ICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgZGVmYXVsdCB7fQogICAgICAgICAgICBQZXJtaXNzaW9uID0+IDIsICAgICAgICAgICAgICAgICAgICAgIyBvciB3aGF0ZXZlciBwcmVmZXJlbmNlcyBjYW4gYmUgdXNlZAogICAgICAgIH0sCiAgICApOwoKPWN1dAoKc3ViIEl0ZW1MaXN0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtDbGFzc30gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIENsYXNzIScKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIHNldCBkZWZhdWx0IHZhbHVlCiAgICBpZiAoICFkZWZpbmVkICRQYXJhbXtWYWxpZH0gKSB7CiAgICAgICAgJFBhcmFte1ZhbGlkfSA9IDE7CiAgICB9CgogICAgbXkgJFByZWZlcmVuY2VzQ2FjaGVLZXkgPSAnJzsKICAgIG15ICRQcmVmZXJlbmNlc1RhYmxlICAgID0gJyc7CiAgICBteSAkUHJlZmVyZW5jZXNXaGVyZSAgICA9ICcnOwogICAgbXkgQFByZWZlcmVuY2VzQmluZDsKCiAgICAjIGhhbmRsZSBnaXZlbiBwcmVmZXJlbmNlcwogICAgaWYgKCBleGlzdHMgJFBhcmFte1ByZWZlcmVuY2VzfSAmJiByZWYgJFBhcmFte1ByZWZlcmVuY2VzfSBlcSAnSEFTSCcgKSB7CgogICAgICAgICRQcmVmZXJlbmNlc1RhYmxlID0gJywgZ2VuZXJhbF9jYXRhbG9nX3ByZWZlcmVuY2VzJzsKICAgICAgICBteSBAV2hlcmVzOwoKICAgICAgICAjIGFkZCBhbGwgcHJlZmVyZW5jZXMgZ2l2ZW4gdG8gd2hlcmUtY2xhdXNlCiAgICAgICAgZm9yIG15ICRLZXkgKCBzb3J0IGtleXMgJXsgJFBhcmFte1ByZWZlcmVuY2VzfSB9ICkgewoKICAgICAgICAgICAgaWYgKCByZWYoICRQYXJhbXtQcmVmZXJlbmNlc30tPnskS2V5fSApIG5lICdBUlJBWScgKSB7CiAgICAgICAgICAgICAgICAkUGFyYW17UHJlZmVyZW5jZXN9LT57JEtleX0gPSBbICRQYXJhbXtQcmVmZXJlbmNlc30tPnskS2V5fSBdOwogICAgICAgICAgICB9CgogICAgICAgICAgICBwdXNoIEBXaGVyZXMsICcocHJlZl9rZXkgPSA/IEFORCBwcmVmX3ZhbHVlIElOICgnCiAgICAgICAgICAgICAgICAuIGpvaW4oICcsICcsIG1hcCB7Jz8nfSBAeyAkUGFyYW17UHJlZmVyZW5jZXN9LT57JEtleX0gfSApCiAgICAgICAgICAgICAgICAuICcpKSc7CgogICAgICAgICAgICBwdXNoIEBQcmVmZXJlbmNlc0JpbmQsIFwkS2V5LCBtYXAgeyBcJF8gfSBAeyAkUGFyYW17UHJlZmVyZW5jZXN9LT57JEtleX0gfTsKCiAgICAgICAgICAgICMgYWRkIGZ1bmN0aW9uYWxpdHkgbGlzdCB0byBjYWNoZSBrZXkKICAgICAgICAgICAgJFByZWZlcmVuY2VzQ2FjaGVLZXkgLj0gJyMjIyMnIGlmICRQcmVmZXJlbmNlc0NhY2hlS2V5OwogICAgICAgICAgICAkUHJlZmVyZW5jZXNDYWNoZUtleSAuPSBqb2luIHF7IyMjI30sICRLZXksIG1hcCB7JF99IEB7ICRQYXJhbXtQcmVmZXJlbmNlc30tPnskS2V5fSB9OwogICAgICAgIH0KCiAgICAgICAgJFByZWZlcmVuY2VzV2hlcmUgPSAnQU5EIGdlbmVyYWxfY2F0YWxvZy5pZCA9IGdlbmVyYWxfY2F0YWxvZ19wcmVmZXJlbmNlcy5nZW5lcmFsX2NhdGFsb2dfaWQnOwogICAgICAgICRQcmVmZXJlbmNlc1doZXJlIC49ICcgQU5EICcgLiBqb2luICcgQU5EICcsIEBXaGVyZXM7CiAgICB9CgogICAgIyBjcmVhdGUgc3FsIHN0cmluZwogICAgbXkgJFNRTCA9ICJTRUxFQ1QgaWQsIG5hbWUgRlJPTSBnZW5lcmFsX2NhdGFsb2cgJFByZWZlcmVuY2VzVGFibGUgIgogICAgICAgIC4gIldIRVJFIGdlbmVyYWxfY2F0YWxvZ19jbGFzcyA9ID8gJFByZWZlcmVuY2VzV2hlcmUgIjsKICAgIG15IEBCSU5EID0gKCBcJFBhcmFte0NsYXNzfSwgQFByZWZlcmVuY2VzQmluZCApOwoKICAgICMgYWRkIHZhbGlkIHN0cmluZyB0byBzcWwgc3RyaW5nCiAgICBpZiAoICRQYXJhbXtWYWxpZH0gKSB7CiAgICAgICAgJFNRTCAuPSAnQU5EIHZhbGlkX2lkID0gMSAnOwogICAgfQoKICAgICMgY3JlYXRlIGNhY2hlIGtleQogICAgbXkgJENhY2hlS2V5ID0gJ0l0ZW1MaXN0OjonIC4gJFBhcmFte0NsYXNzfSAuICcjIyMjJyAuICRQYXJhbXtWYWxpZH0gLiAnIyMjIycgLiAkUHJlZmVyZW5jZXNDYWNoZUtleTsKCiAgICAjIGNoZWNrIGlmIHJlc3VsdCBpcyBhbHJlYWR5IGNhY2hlZAogICAgbXkgJENhY2hlID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPkdldCgKICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICBLZXkgID0+ICRDYWNoZUtleSwKICAgICk7CiAgICByZXR1cm4gJENhY2hlIGlmICRDYWNoZTsKCiAgICAjIGFzayBkYXRhYmFzZQogICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPlByZXBhcmUoCiAgICAgICAgU1FMICA9PiAkU1FMLAogICAgICAgIEJpbmQgPT4gXEBCSU5ELAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15ICVEYXRhOwogICAgd2hpbGUgKCBteSBAUm93ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkRGF0YXsgJFJvd1swXSB9ID0gJFJvd1sxXTsKICAgIH0KCiAgICAjIGp1c3QgcmV0dXJuIHdpdGhvdXQgbG9nZ2luZyBhbiBlcnJvciBhbmQgd2l0aG91dCBjYWNoaW5nIHRoZSBlbXB0eSByZXN1bHQKICAgIHJldHVybiBpZiAhJURhdGE7CgogICAgIyBjYWNoZSB0aGUgcmVzdWx0CiAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+U2V0KAogICAgICAgIFR5cGUgID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICBUVEwgICA9PiAkU2VsZi0+e0NhY2hlVFRMfSwKICAgICAgICBLZXkgICA9PiAkQ2FjaGVLZXksCiAgICAgICAgVmFsdWUgPT4gXCVEYXRhLAogICAgKTsKCiAgICByZXR1cm4gXCVEYXRhOwp9Cgo9aXRlbSBJdGVtR2V0KCkKCmdldCBpdGVtIGF0dHJpYnV0ZXMKCiAgICBteSAkSXRlbURhdGFSZWYgPSAkR2VuZXJhbENhdGFsb2dPYmplY3QtPkl0ZW1HZXQoCiAgICAgICAgSXRlbUlEID0+IDMsCiAgICApOwoKICAgIG9yCgogICAgbXkgJEl0ZW1EYXRhUmVmID0gJEdlbmVyYWxDYXRhbG9nT2JqZWN0LT5JdGVtR2V0KAogICAgICAgIENsYXNzID0+ICdJVFNNOjpTZXJ2aWNlOjpUeXBlJywKICAgICAgICBOYW1lICA9PiAnVW5kZXJwaW5uaW5nIENvbnRyYWN0JywKICAgICk7CgpyZXR1cm5zCgogICAgbXkgJEl0ZW0gPSB7CiAgICAgICAgJ0l0ZW1JRCcgICAgID0+ICcyMycsCiAgICAgICAgJ0NsYXNzJyAgICAgID0+ICdJVFNNOjpTZXJ2aWNlOjpUeXBlJywKICAgICAgICAnTmFtZScgICAgICAgPT4gJ1VuZGVycGlubmluZyBDb250cmFjdCcKICAgICAgICAnQ29tbWVudCcgICAgPT4gJ1NvbWUgQ29tbWVudCcsCiAgICAgICAgJ1ZhbGlkSUQnICAgID0+ICcxJywKICAgICAgICAnQ3JlYXRlVGltZScgPT4gJzIwMTItMDEtMTIgMDk6MzY6MjQnLAogICAgICAgICdDcmVhdGVCeScgICA9PiAnMScsCiAgICAgICAgJ0NoYW5nZVRpbWUnID0+ICcyMDEyLTAxLTEyIDA5OjM2OjI0JywKICAgICAgICAnQ2hhbmdlQnknICAgPT4gJzEnLAogICAgfTsKCj1jdXQKCnN1YiBJdGVtR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtJdGVtSUR9ICYmICggISRQYXJhbXtDbGFzc30gfHwgJFBhcmFte05hbWV9IGVxICcnICkgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIEl0ZW1JRCBPUiBDbGFzcyBhbmQgTmFtZSEnCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjcmVhdGUgc3FsIHN0cmluZwogICAgbXkgJFNRTCA9ICdTRUxFQ1QgaWQsIGdlbmVyYWxfY2F0YWxvZ19jbGFzcywgbmFtZSwgdmFsaWRfaWQsIGNvbW1lbnRzLCAnCiAgICAgICAgLiAnY3JlYXRlX3RpbWUsIGNyZWF0ZV9ieSwgY2hhbmdlX3RpbWUsIGNoYW5nZV9ieSBGUk9NIGdlbmVyYWxfY2F0YWxvZyBXSEVSRSAnOwogICAgbXkgQEJJTkQ7CgogICAgIyBhZGQgb3B0aW9ucyB0byBzcWwgc3RyaW5nCiAgICBpZiAoICRQYXJhbXtDbGFzc30gJiYgJFBhcmFte05hbWV9IG5lICcnICkgewoKICAgICAgICAjIGNoZWNrIGlmIHJlc3VsdCBpcyBhbHJlYWR5IGNhY2hlZAogICAgICAgIG15ICRDYWNoZUtleSA9ICdJdGVtR2V0OjpDbGFzczo6JyAuICRQYXJhbXtDbGFzc30gLiAnOjonIC4gJFBhcmFte05hbWV9OwogICAgICAgIG15ICRDYWNoZSAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5HZXQoCiAgICAgICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgICAgICBLZXkgID0+ICRDYWNoZUtleSwKICAgICAgICApOwogICAgICAgIHJldHVybiAkQ2FjaGUgaWYgJENhY2hlOwoKICAgICAgICAjIGFkZCBjbGFzcyBhbmQgbmFtZSB0byBzcWwgc3RyaW5nCiAgICAgICAgJFNRTCAuPSAnZ2VuZXJhbF9jYXRhbG9nX2NsYXNzID0gPyBBTkQgbmFtZSA9ID8nOwogICAgICAgIHB1c2ggQEJJTkQsICggXCRQYXJhbXtDbGFzc30sIFwkUGFyYW17TmFtZX0gKTsKICAgIH0KICAgIGVsc2UgewoKICAgICAgICAjIGNoZWNrIGlmIHJlc3VsdCBpcyBhbHJlYWR5IGNhY2hlZAogICAgICAgIG15ICRDYWNoZUtleSA9ICdJdGVtR2V0OjpJdGVtSUQ6OicgLiAkUGFyYW17SXRlbUlEfTsKICAgICAgICBteSAkQ2FjaGUgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+R2V0KAogICAgICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICAgICAgS2V5ICA9PiAkQ2FjaGVLZXksCiAgICAgICAgKTsKICAgICAgICByZXR1cm4gJENhY2hlIGlmICRDYWNoZTsKCiAgICAgICAgIyBhZGQgaXRlbSBpZCB0byBzcWwgc3RyaW5nCiAgICAgICAgJFNRTCAuPSAnaWQgPSA/JzsKICAgICAgICBwdXNoIEBCSU5ELCBcJFBhcmFte0l0ZW1JRH07CiAgICB9CgogICAgIyBhc2sgZGF0YWJhc2UKICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5QcmVwYXJlKAogICAgICAgIFNRTCAgID0+ICRTUUwsCiAgICAgICAgQmluZCAgPT4gXEBCSU5ELAogICAgICAgIExpbWl0ID0+IDEsCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgJUl0ZW1EYXRhOwogICAgd2hpbGUgKCBteSBAUm93ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkSXRlbURhdGF7SXRlbUlEfSAgICAgPSAkUm93WzBdOwogICAgICAgICRJdGVtRGF0YXtDbGFzc30gICAgICA9ICRSb3dbMV07CiAgICAgICAgJEl0ZW1EYXRhe05hbWV9ICAgICAgID0gJFJvd1syXTsKICAgICAgICAkSXRlbURhdGF7VmFsaWRJRH0gICAgPSAkUm93WzNdOwogICAgICAgICRJdGVtRGF0YXtDb21tZW50fSAgICA9ICRSb3dbNF0gfHwgJyc7CiAgICAgICAgJEl0ZW1EYXRhe0NyZWF0ZVRpbWV9ID0gJFJvd1s1XTsKICAgICAgICAkSXRlbURhdGF7Q3JlYXRlQnl9ICAgPSAkUm93WzZdOwogICAgICAgICRJdGVtRGF0YXtDaGFuZ2VUaW1lfSA9ICRSb3dbN107CiAgICAgICAgJEl0ZW1EYXRhe0NoYW5nZUJ5fSAgID0gJFJvd1s4XTsKICAgIH0KCiAgICAjIGNoZWNrIGl0ZW0KICAgIGlmICggISRJdGVtRGF0YXtJdGVtSUR9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnSXRlbSBub3QgZm91bmQgaW4gZGF0YWJhc2UhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGdldCBnZW5lcmFsIGNhdGFsb2cgcHJlZmVyZW5jZXMKICAgIG15ICVQcmVmZXJlbmNlcyA9ICRTZWxmLT5HZW5lcmFsQ2F0YWxvZ1ByZWZlcmVuY2VzR2V0KCBJdGVtSUQgPT4gJEl0ZW1EYXRhe0l0ZW1JRH0gKTsKCiAgICAjIG1lcmdlIGhhc2gKICAgIGlmICglUHJlZmVyZW5jZXMpIHsKICAgICAgICAlSXRlbURhdGEgPSAoICVJdGVtRGF0YSwgJVByZWZlcmVuY2VzICk7CiAgICB9CgogICAgIyBjYWNoZSB0aGUgcmVzdWx0CiAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+U2V0KAogICAgICAgIFR5cGUgID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICBUVEwgICA9PiAkU2VsZi0+e0NhY2hlVFRMfSwKICAgICAgICBLZXkgICA9PiAnSXRlbUdldDo6Q2xhc3M6OicgLiAkSXRlbURhdGF7Q2xhc3N9IC4gJzo6JyAuICRJdGVtRGF0YXtOYW1lfSwKICAgICAgICBWYWx1ZSA9PiBcJUl0ZW1EYXRhLAogICAgKTsKICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5TZXQoCiAgICAgICAgVHlwZSAgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgIFRUTCAgID0+ICRTZWxmLT57Q2FjaGVUVEx9LAogICAgICAgIEtleSAgID0+ICdJdGVtR2V0OjpJdGVtSUQ6OicgLiAkSXRlbURhdGF7SXRlbUlEfSwKICAgICAgICBWYWx1ZSA9PiBcJUl0ZW1EYXRhLAogICAgKTsKCiAgICByZXR1cm4gXCVJdGVtRGF0YTsKfQoKPWl0ZW0gSXRlbUFkZCgpCgphZGQgYSBuZXcgZ2VuZXJhbCBjYXRhbG9nIGl0ZW0KCiAgICBteSAkSXRlbUlEID0gJEdlbmVyYWxDYXRhbG9nT2JqZWN0LT5JdGVtQWRkKAogICAgICAgIENsYXNzICAgICAgICAgPT4gJ0lUU006OlNlcnZpY2U6OlR5cGUnLAogICAgICAgIE5hbWUgICAgICAgICAgPT4gJ0l0ZW0gTmFtZScsCiAgICAgICAgVmFsaWRJRCAgICAgICA9PiAxLAogICAgICAgIENvbW1lbnQgICAgICAgPT4gJ0NvbW1lbnQnLCAgICAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBJdGVtQWRkIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KENsYXNzIFZhbGlkSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIG5hbWUgbXVzdCBiZSBub3QgZW1wdHksIGJ1dCBudW1iZXIgemVybyAoMCkgaXMgYWxsb3dlZAogICAgaWYgKCAkUGFyYW17TmFtZX0gZXEgJycgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkIE5hbWUhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIHNldCBkZWZhdWx0IHZhbHVlcwogICAgZm9yIG15ICRBcmd1bWVudCAocXcoQ29tbWVudCkpIHsKICAgICAgICAkUGFyYW17JEFyZ3VtZW50fSB8fD0gJyc7CiAgICB9CgogICAgIyBjbGVhbnVwIGdpdmVuIHBhcmFtcwogICAgZm9yIG15ICRBcmd1bWVudCAocXcoQ2xhc3MpKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNoZWNrSXRlbScpLT5TdHJpbmdDbGVhbigKICAgICAgICAgICAgU3RyaW5nUmVmICAgICAgICAgPT4gXCRQYXJhbXskQXJndW1lbnR9LAogICAgICAgICAgICBSZW1vdmVBbGxOZXdsaW5lcyA9PiAxLAogICAgICAgICAgICBSZW1vdmVBbGxUYWJzICAgICA9PiAxLAogICAgICAgICAgICBSZW1vdmVBbGxTcGFjZXMgICA9PiAxLAogICAgICAgICk7CiAgICB9CiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhOYW1lIENvbW1lbnQpKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNoZWNrSXRlbScpLT5TdHJpbmdDbGVhbigKICAgICAgICAgICAgU3RyaW5nUmVmICAgICAgICAgPT4gXCRQYXJhbXskQXJndW1lbnR9LAogICAgICAgICAgICBSZW1vdmVBbGxOZXdsaW5lcyA9PiAxLAogICAgICAgICAgICBSZW1vdmVBbGxUYWJzICAgICA9PiAxLAogICAgICAgICk7CiAgICB9CgogICAgIyBmaW5kIGV4aXRpbmcgaXRlbSB3aXRoIHNhbWUgbmFtZQogICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPlByZXBhcmUoCiAgICAgICAgU1FMID0+ICdTRUxFQ1QgaWQgRlJPTSBnZW5lcmFsX2NhdGFsb2cgJwogICAgICAgICAgICAuICdXSEVSRSBnZW5lcmFsX2NhdGFsb2dfY2xhc3MgPSA/IEFORCBuYW1lID0gPycsCiAgICAgICAgQmluZCAgPT4gWyBcJFBhcmFte0NsYXNzfSwgXCRQYXJhbXtOYW1lfSBdLAogICAgICAgIExpbWl0ID0+IDEsCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgJE5vQWRkOwogICAgd2hpbGUgKCAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICROb0FkZCA9IDE7CiAgICB9CgogICAgIyBhYm9ydCBpbnNlcnQgb2YgbmV3IGl0ZW0sIGlmIGl0ZW0gbmFtZSBhbHJlYWR5IGV4aXN0cwogICAgaWYgKCROb0FkZCkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlID0+CiAgICAgICAgICAgICAgICAiQ2FuJ3QgYWRkIG5ldyBpdGVtISBHZW5lcmFsIGNhdGFsb2cgaXRlbSB3aXRoIHNhbWUgbmFtZSBhbHJlYWR5IGV4aXN0cyBpbiB0aGlzIGNsYXNzLiIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyByZXNldCBjYWNoZQogICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPkNsZWFuVXAoCiAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICApOwoKICAgICMgaW5zZXJ0IG5ldyBpdGVtCiAgICByZXR1cm4gaWYgISRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5EbygKICAgICAgICBTUUwgPT4gJ0lOU0VSVCBJTlRPIGdlbmVyYWxfY2F0YWxvZyAnCiAgICAgICAgICAgIC4gJyhnZW5lcmFsX2NhdGFsb2dfY2xhc3MsIG5hbWUsIHZhbGlkX2lkLCBjb21tZW50cywgJwogICAgICAgICAgICAuICdjcmVhdGVfdGltZSwgY3JlYXRlX2J5LCBjaGFuZ2VfdGltZSwgY2hhbmdlX2J5KSBWQUxVRVMgJwogICAgICAgICAgICAuICcoPywgPywgPywgPywgY3VycmVudF90aW1lc3RhbXAsID8sIGN1cnJlbnRfdGltZXN0YW1wLCA/KScsCiAgICAgICAgQmluZCA9PiBbCiAgICAgICAgICAgIFwkUGFyYW17Q2xhc3N9LCBcJFBhcmFte05hbWV9LAogICAgICAgICAgICBcJFBhcmFte1ZhbGlkSUR9LAogICAgICAgICAgICBcJFBhcmFte0NvbW1lbnR9LCBcJFBhcmFte1VzZXJJRH0sCiAgICAgICAgICAgIFwkUGFyYW17VXNlcklEfSwKICAgICAgICBdLAogICAgKTsKCiAgICAjIGZpbmQgaWQgb2YgbmV3IGl0ZW0KICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5QcmVwYXJlKAogICAgICAgIFNRTCA9PiAnU0VMRUNUIGlkIEZST00gZ2VuZXJhbF9jYXRhbG9nICcKICAgICAgICAgICAgLiAnV0hFUkUgZ2VuZXJhbF9jYXRhbG9nX2NsYXNzID0gPyBBTkQgbmFtZSA9ID8nLAogICAgICAgIEJpbmQgID0+IFsgXCRQYXJhbXtDbGFzc30sIFwkUGFyYW17TmFtZX0gXSwKICAgICAgICBMaW1pdCA9PiAxLAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15ICRJdGVtSUQ7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICRJdGVtSUQgPSAkUm93WzBdOwogICAgfQoKICAgIHJldHVybiAkSXRlbUlEOwp9Cgo9aXRlbSBJdGVtVXBkYXRlKCkKCnVwZGF0ZSBhbiBleGlzdGluZyBnZW5lcmFsIGNhdGFsb2cgaXRlbQoKICAgIG15ICRUcnVlID0gJEdlbmVyYWxDYXRhbG9nT2JqZWN0LT5JdGVtVXBkYXRlKAogICAgICAgIEl0ZW1JRCAgICAgICAgPT4gMTIzLAogICAgICAgIE5hbWUgICAgICAgICAgPT4gJ0l0ZW0gTmFtZScsCiAgICAgICAgVmFsaWRJRCAgICAgICA9PiAxLAogICAgICAgIENvbW1lbnQgICAgICAgPT4gJ0NvbW1lbnQnLCAgICAjIChvcHRpb25hbCkKICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIEl0ZW1VcGRhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoSXRlbUlEIFZhbGlkSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIG5hbWUgbXVzdCBiZSBub3QgZW1wdHksIGJ1dCBudW1iZXIgemVybyAoMCkgaXMgYWxsb3dlZAogICAgaWYgKCAkUGFyYW17TmFtZX0gZXEgJycgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkIE5hbWUhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIHNldCBkZWZhdWx0IHZhbHVlcwogICAgZm9yIG15ICRBcmd1bWVudCAocXcoQ29tbWVudCkpIHsKICAgICAgICAkUGFyYW17JEFyZ3VtZW50fSB8fD0gJyc7CiAgICB9CgogICAgIyBjbGVhbnVwIGdpdmVuIHBhcmFtcwogICAgZm9yIG15ICRBcmd1bWVudCAocXcoQ2xhc3MpKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNoZWNrSXRlbScpLT5TdHJpbmdDbGVhbigKICAgICAgICAgICAgU3RyaW5nUmVmICAgICAgICAgPT4gXCRQYXJhbXskQXJndW1lbnR9LAogICAgICAgICAgICBSZW1vdmVBbGxOZXdsaW5lcyA9PiAxLAogICAgICAgICAgICBSZW1vdmVBbGxUYWJzICAgICA9PiAxLAogICAgICAgICAgICBSZW1vdmVBbGxTcGFjZXMgICA9PiAxLAogICAgICAgICk7CiAgICB9CiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhOYW1lIENvbW1lbnQpKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNoZWNrSXRlbScpLT5TdHJpbmdDbGVhbigKICAgICAgICAgICAgU3RyaW5nUmVmICAgICAgICAgPT4gXCRQYXJhbXskQXJndW1lbnR9LAogICAgICAgICAgICBSZW1vdmVBbGxOZXdsaW5lcyA9PiAxLAogICAgICAgICAgICBSZW1vdmVBbGxUYWJzICAgICA9PiAxLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgY2xhc3Mgb2YgaXRlbQogICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPlByZXBhcmUoCiAgICAgICAgU1FMICAgPT4gJ1NFTEVDVCBnZW5lcmFsX2NhdGFsb2dfY2xhc3MgRlJPTSBnZW5lcmFsX2NhdGFsb2cgV0hFUkUgaWQgPSA/JywKICAgICAgICBCaW5kICA9PiBbIFwkUGFyYW17SXRlbUlEfSBdLAogICAgICAgIExpbWl0ID0+IDEsCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgJENsYXNzOwogICAgd2hpbGUgKCBteSBAUm93ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkQ2xhc3MgPSAkUm93WzBdOwogICAgfQoKICAgIGlmICggISRDbGFzcyApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNhbid0IHVwZGF0ZSBpdGVtISBHZW5lcmFsIGNhdGFsb2cgaXRlbSBub3QgZm91bmQgaW4gdGhpcyBjbGFzcy4iLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZmluZCBleGl0aW5nIGl0ZW0gd2l0aCBzYW1lIG5hbWUKICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5QcmVwYXJlKAogICAgICAgIFNRTCAgID0+ICdTRUxFQ1QgaWQgRlJPTSBnZW5lcmFsX2NhdGFsb2cgV0hFUkUgZ2VuZXJhbF9jYXRhbG9nX2NsYXNzID0gPyBBTkQgbmFtZSA9ID8nLAogICAgICAgIEJpbmQgID0+IFsgXCRDbGFzcywgXCRQYXJhbXtOYW1lfSBdLAogICAgICAgIExpbWl0ID0+IDEsCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgJFVwZGF0ZSA9IDE7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgIGlmICggJFBhcmFte0l0ZW1JRH0gbmUgJFJvd1swXSApIHsKICAgICAgICAgICAgJFVwZGF0ZSA9IDA7CiAgICAgICAgfQogICAgfQoKICAgIGlmICggISRVcGRhdGUgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgPT4KICAgICAgICAgICAgICAgICJDYW4ndCB1cGRhdGUgaXRlbSEgR2VuZXJhbCBjYXRhbG9nIGl0ZW0gd2l0aCBzYW1lIG5hbWUgYWxyZWFkeSBleGlzdHMgaW4gdGhpcyBjbGFzcy4iLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgcmVzZXQgY2FjaGUKICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5DbGVhblVwKAogICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgKTsKCiAgICByZXR1cm4gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkRvKAogICAgICAgIFNRTCA9PiAnVVBEQVRFIGdlbmVyYWxfY2F0YWxvZyBTRVQgJwogICAgICAgICAgICAuICduYW1lID0gPywgdmFsaWRfaWQgPSA/LCBjb21tZW50cyA9ID8sICcKICAgICAgICAgICAgLiAnY2hhbmdlX3RpbWUgPSBjdXJyZW50X3RpbWVzdGFtcCwgY2hhbmdlX2J5ID0gPyAnCiAgICAgICAgICAgIC4gJ1dIRVJFIGlkID0gPycsCiAgICAgICAgQmluZCA9PiBbCiAgICAgICAgICAgIFwkUGFyYW17TmFtZX0sCiAgICAgICAgICAgIFwkUGFyYW17VmFsaWRJRH0sIFwkUGFyYW17Q29tbWVudH0sCiAgICAgICAgICAgIFwkUGFyYW17VXNlcklEfSwgIFwkUGFyYW17SXRlbUlEfSwKICAgICAgICBdLAogICAgKTsKfQoKPWl0ZW0gR2VuZXJhbENhdGFsb2dQcmVmZXJlbmNlc1NldCgpCgpzZXQgR2VuZXJhbENhdGFsb2cgcHJlZmVyZW5jZXMKCiAgICAkR2VuZXJhbENhdGFsb2dPYmplY3QtPkdlbmVyYWxDYXRhbG9nUHJlZmVyZW5jZXNTZXQoCiAgICAgICAgSXRlbUlEID0+IDEyMywKICAgICAgICBLZXkgICAgPT4gJ1VzZXJDb21tZW50JywKICAgICAgICBWYWx1ZSAgPT4gJ3NvbWUgY29tbWVudCcsCiAgICApOwoKPWN1dAoKc3ViIEdlbmVyYWxDYXRhbG9nUHJlZmVyZW5jZXNTZXQgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIGRlbGV0ZSBjYWNoZQogICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPkNsZWFuVXAoCiAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICApOwoKICAgIHJldHVybiAkU2VsZi0+e1ByZWZlcmVuY2VzT2JqZWN0fS0+R2VuZXJhbENhdGFsb2dQcmVmZXJlbmNlc1NldChAXyk7Cn0KCj1pdGVtIEdlbmVyYWxDYXRhbG9nUHJlZmVyZW5jZXNHZXQoKQoKZ2V0IEdlbmVyYWxDYXRhbG9nIHByZWZlcmVuY2VzCgogICAgbXkgJVByZWZlcmVuY2VzID0gJFF1ZXVlT2JqZWN0LT5HZW5lcmFsQ2F0YWxvZ1ByZWZlcmVuY2VzR2V0KAogICAgICAgIEl0ZW1JRCA9PiAxMjMsCiAgICApOwoKPWN1dAoKc3ViIEdlbmVyYWxDYXRhbG9nUHJlZmVyZW5jZXNHZXQgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICByZXR1cm4gJFNlbGYtPntQcmVmZXJlbmNlc09iamVjdH0tPkdlbmVyYWxDYXRhbG9nUHJlZmVyZW5jZXNHZXQoQF8pOwp9CgoxOwoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBTb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKGh0dHA6Ly9vdHJzLm9yZy8pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgTDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQ+LgoKPWN1dAo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE2IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nOjpQcmVmZXJlbmNlc0RCOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiAgICAnS2VybmVsOjpDb25maWcnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpEQicsCiAgICAnS2VybmVsOjpTeXN0ZW06OkxvZycsCik7Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nOjpQcmVmZXJlbmNlc0RCIC0gc29tZSBwcmVmZXJlbmNlcyBmdW5jdGlvbnMgZm9yIGdlbmVyYWwgY2F0YWxvZwoKPWhlYWQxIFNZTk9QU0lTCgpzb21lIHByZWZlcmVuY2VzIGZ1bmN0aW9ucyBmb3IgZ2VuZXJhbCBjYXRhbG9nCgo9aGVhZDEgUFVCTElDIElOVEVSRkFDRQoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhbiBvYmplY3QKCiAgICB1c2UgS2VybmVsOjpTeXN0ZW06Ok9iamVjdE1hbmFnZXI7CiAgICBsb2NhbCAkS2VybmVsOjpPTSA9IEtlcm5lbDo6U3lzdGVtOjpPYmplY3RNYW5hZ2VyLT5uZXcoKTsKICAgIG15ICRHZW5lcmFsQ2F0YWxvZ1ByZWZlcmVuY2VzREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2c6OlByZWZlcmVuY2VzREInKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBwcmVmZXJlbmNlcyB0YWJsZSBkYXRhCiAgICAkU2VsZi0+e1ByZWZlcmVuY2VzVGFibGV9ICAgICAgPSAnZ2VuZXJhbF9jYXRhbG9nX3ByZWZlcmVuY2VzJzsKICAgICRTZWxmLT57UHJlZmVyZW5jZXNUYWJsZUtleX0gICA9ICdwcmVmX2tleSc7CiAgICAkU2VsZi0+e1ByZWZlcmVuY2VzVGFibGVWYWx1ZX0gPSAncHJlZl92YWx1ZSc7CiAgICAkU2VsZi0+e1ByZWZlcmVuY2VzVGFibGVHY0lEfSAgPSAnZ2VuZXJhbF9jYXRhbG9nX2lkJzsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIEdlbmVyYWxDYXRhbG9nUHJlZmVyZW5jZXNTZXQoKQoKU2V0IHByZWZlcmVuY2VzIGZvciBhbiBpdGVtCgogICAgJFByZWZlcmVuY2VzT2JqZWN0LT5HZW5lcmFsQ2F0YWxvZ1ByZWZlcmVuY2VzU2V0KAogICAgICAgIEl0ZW1JRCA9PiAxMjM0LAogICAgICAgIEtleSAgICA9PiAnRnVuY3Rpb25hbGl0eScsCiAgICAgICAgVmFsdWUgID0+ICdvcGVyYXRpb25hbCcsCiAgICApOwoKPWN1dAoKc3ViIEdlbmVyYWxDYXRhbG9nUHJlZmVyZW5jZXNTZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KEl0ZW1JRCBLZXkgVmFsdWUpKSB7CiAgICAgICAgaWYgKCAhZGVmaW5lZCggJFBhcmFteyROZWVkZWR9ICkgKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGRlbGV0ZSBvbGQgZGF0YQogICAgcmV0dXJuIGlmICEkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RG8oCiAgICAgICAgU1FMID0+ICJERUxFVEUgRlJPTSAkU2VsZi0+e1ByZWZlcmVuY2VzVGFibGV9IFdIRVJFICIKICAgICAgICAgICAgLiAiJFNlbGYtPntQcmVmZXJlbmNlc1RhYmxlR2NJRH0gPSA/IEFORCAkU2VsZi0+e1ByZWZlcmVuY2VzVGFibGVLZXl9ID0gPyIsCiAgICAgICAgQmluZCA9PiBbCiAgICAgICAgICAgIFwkUGFyYW17SXRlbUlEfSwKICAgICAgICAgICAgXCRQYXJhbXtLZXl9LAogICAgICAgIF0sCiAgICApOwoKICAgICMgaW5zZXJ0IG5ldyBkYXRhCiAgICByZXR1cm4gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkRvKAogICAgICAgIFNRTCA9PiAiSU5TRVJUIElOVE8gJFNlbGYtPntQcmVmZXJlbmNlc1RhYmxlfSAoJFNlbGYtPntQcmVmZXJlbmNlc1RhYmxlR2NJRH0sICIKICAgICAgICAgICAgLiAiICRTZWxmLT57UHJlZmVyZW5jZXNUYWJsZUtleX0sICRTZWxmLT57UHJlZmVyZW5jZXNUYWJsZVZhbHVlfSkgIgogICAgICAgICAgICAuICIgVkFMVUVTICg/LCA/LCA/KSIsCiAgICAgICAgQmluZCA9PiBbCiAgICAgICAgICAgIFwkUGFyYW17SXRlbUlEfSwKICAgICAgICAgICAgXCRQYXJhbXtLZXl9LAogICAgICAgICAgICBcJFBhcmFte1ZhbHVlfSwKICAgICAgICBdLAogICAgKTsKfQoKPWl0ZW0gR2VuZXJhbENhdGFsb2dQcmVmZXJlbmNlc0dldCgpCgpHZXQgYWxsIFByZWZlcmVuY2VzIGZvciBhbiBpdGVtCgogICAgbXkgJVByZWZlcmVuY2VzID0gJFByZWZlcmVuY2VzT2JqZWN0LT5HZW5lcmFsQ2F0YWxvZ1ByZWZlcmVuY2VzR2V0KAogICAgICAgIEl0ZW1JRCA9PiAxMjMsCiAgICApOwoKPWN1dAoKc3ViIEdlbmVyYWxDYXRhbG9nUHJlZmVyZW5jZXNHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KEl0ZW1JRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNoZWNrIGlmIHF1ZXVlIHByZWZlcmVuY2VzIGFyZSBhdmFpbGFibGUKICAgIGlmICggISRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnR2VuZXJhbENhdGFsb2dQcmVmZXJlbmNlcycpICkgewogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGdldCBwcmVmZXJlbmNlcwogICAgcmV0dXJuIGlmICEkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gIlNFTEVDVCAkU2VsZi0+e1ByZWZlcmVuY2VzVGFibGVLZXl9LCAkU2VsZi0+e1ByZWZlcmVuY2VzVGFibGVWYWx1ZX0gIgogICAgICAgICAgICAuICIgRlJPTSAkU2VsZi0+e1ByZWZlcmVuY2VzVGFibGV9IFdIRVJFICRTZWxmLT57UHJlZmVyZW5jZXNUYWJsZUdjSUR9ID0gPyIsCiAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17SXRlbUlEfSBdLAogICAgKTsKCiAgICBteSAlRGF0YTsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJERhdGF7ICRSb3dbMF0gfSA9ICRSb3dbMV07CiAgICB9CgogICAgIyByZXR1cm4gZGF0YQogICAgcmV0dXJuICVEYXRhOwp9CgoxOwoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKEw8aHR0cDovL290cnMub3JnLz4pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgTDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQ+LgoKPWN1dAo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE2IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7Cgp1c2UgdmFycyBxdygkU2VsZik7CgojIGNyZWF0ZSBsb2NhbCBvYmplY3RzCm15ICRDb25maWdPYmplY3QgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7Cm15ICRHZW5lcmFsQ2F0YWxvZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZycpOwpteSAkVXNlck9iamVjdCAgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpOwoKIyBnZXQgaGVscGVyIG9iamVjdAokS2VybmVsOjpPTS0+T2JqZWN0UGFyYW1BZGQoCiAgICAnS2VybmVsOjpTeXN0ZW06OlVuaXRUZXN0OjpIZWxwZXInID0+IHsKICAgICAgICBSZXN0b3JlRGF0YWJhc2UgPT4gMSwKICAgIH0sCik7Cm15ICRIZWxwZXIgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OkhlbHBlcicpOwoKIyBkZWZpbmUgbmVlZGVkIHZhcmlhYmxlCm15ICRSYW5kb21JRCA9ICRIZWxwZXItPkdldFJhbmRvbUlEKCk7CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgbWFrZSBwcmVwYXJhdGlvbnMKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKIyBjcmVhdGUgbmVlZGVkIHVzZXJzCm15IEBVc2VySURzOwp7CgogICAgIyBkaXNhYmxlIGVtYWlsIGNoZWNrcyB0byBjcmVhdGUgbmV3IHVzZXIKICAgIG15ICRDaGVja0VtYWlsQWRkcmVzc2VzT3JnID0gJENvbmZpZ09iamVjdC0+R2V0KCdDaGVja0VtYWlsQWRkcmVzc2VzJykgfHwgMTsKICAgICRDb25maWdPYmplY3QtPlNldCgKICAgICAgICBLZXkgICA9PiAnQ2hlY2tFbWFpbEFkZHJlc3NlcycsCiAgICAgICAgVmFsdWUgPT4gMCwKICAgICk7CgogICAgZm9yIG15ICRDb3VudGVyICggMSAuLiAyICkgewoKICAgICAgICAjIGNyZWF0ZSBuZXcgdXNlcnMgZm9yIHRoZSB0ZXN0cwogICAgICAgIG15ICRVc2VySUQgPSAkVXNlck9iamVjdC0+VXNlckFkZCgKICAgICAgICAgICAgVXNlckZpcnN0bmFtZSA9PiAnR2VuZXJhbENhdGFsb2cnIC4gJENvdW50ZXIsCiAgICAgICAgICAgIFVzZXJMYXN0bmFtZSAgPT4gJ1VuaXRUZXN0JywKICAgICAgICAgICAgVXNlckxvZ2luICAgICA9PiAnVW5pdFRlc3QtR2VuZXJhbENhdGFsb2ctJyAuICRDb3VudGVyIC4gJFJhbmRvbUlELAogICAgICAgICAgICBVc2VyRW1haWwgICAgID0+ICdVbml0VGVzdC1HZW5lcmFsQ2F0YWxvZy0nIC4gJENvdW50ZXIgLiAnQGxvY2FsaG9zdCcsCiAgICAgICAgICAgIFZhbGlkSUQgICAgICAgPT4gMSwKICAgICAgICAgICAgQ2hhbmdlVXNlcklEICA9PiAxLAogICAgICAgICk7CgogICAgICAgIHB1c2ggQFVzZXJJRHMsICRVc2VySUQ7CiAgICB9CgogICAgIyByZXN0b3JlIG9yaWdpbmFsIGVtYWlsIGNoZWNrIHBhcmFtCiAgICAkQ29uZmlnT2JqZWN0LT5TZXQoCiAgICAgICAgS2V5ICAgPT4gJ0NoZWNrRW1haWxBZGRyZXNzZXMnLAogICAgICAgIFZhbHVlID0+ICRDaGVja0VtYWlsQWRkcmVzc2VzT3JnLAogICAgKTsKfQoKIyBjcmVhdGUgbmVlZGVkIHJhbmRvbSBjbGFzc2VzCm15IEBDbGFzc1JhbmQ7Cgpmb3IgbXkgJENvdW50ZXIgKCAxIC4uIDMgKSB7CgogICAgcHVzaCBAQ2xhc3NSYW5kLCAkSGVscGVyLT5HZXRSYW5kb21OdW1iZXIoKTsKfQoKIyBzdG9yZSBvcmlnaW5hbCBnZW5lcmFsIGNhdGFsb2cgcGVybWlzc2lvbiBwcmVmZXJlbmNlcyBzZXR0aW5nCm15ICRHZW5lcmFsQ2F0YWxvZ1ByZWZlcmVuY2VzUGVybWlzc2lvbnNPcmc7CmlmICggJENvbmZpZ09iamVjdC0+R2V0KCdHZW5lcmFsQ2F0YWxvZ1ByZWZlcmVuY2VzJykgKSB7CiAgICAkR2VuZXJhbENhdGFsb2dQcmVmZXJlbmNlc1Blcm1pc3Npb25zT3JnID0gJENvbmZpZ09iamVjdC0+R2V0KCdHZW5lcmFsQ2F0YWxvZ1ByZWZlcmVuY2VzJyktPntQZXJtaXNzaW9uc307Cn0KCiMgZW5hYmxlIGdlbmVyYWwgY2F0YWxvZyBwZXJtaXNzaW9uIHByZWZlcmVuY2VzIHNldHRpbmcgd2l0aCBhIGR1bW15IHRydWUgdmFsdWUKJENvbmZpZ09iamVjdC0+U2V0KAogICAgS2V5ICAgPT4gJ0dlbmVyYWxDYXRhbG9nUHJlZmVyZW5jZXMjIyNQZXJtaXNzaW9ucycsCiAgICBWYWx1ZSA9PiAxLAopOwoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIGRlZmluZSBnZW5lcmFsIHRlc3RzCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCm15ICRJdGVtRGF0YSA9IFsKCiAgICAjIHRoaXMgaXRlbSBpcyBOT1QgY29tcGxldGUgYW5kIG11c3Qgbm90IGJlIGFkZGVkCiAgICB7CiAgICAgICAgQWRkID0+IHsKICAgICAgICAgICAgTmFtZSAgICA9PiAnVGVzdEl0ZW0xJywKICAgICAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGlzIGl0ZW0gaXMgTk9UIGNvbXBsZXRlIGFuZCBtdXN0IG5vdCBiZSBhZGRlZAogICAgewogICAgICAgIEFkZCA9PiB7CiAgICAgICAgICAgIENsYXNzICAgPT4gJ1VuaXRUZXN0OjpUZXN0Q2xhc3MnIC4gJENsYXNzUmFuZFswXSwKICAgICAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGlzIGl0ZW0gaXMgTk9UIGNvbXBsZXRlIGFuZCBtdXN0IG5vdCBiZSBhZGRlZAogICAgewogICAgICAgIEFkZCA9PiB7CiAgICAgICAgICAgIENsYXNzICA9PiAnVW5pdFRlc3Q6OlRlc3RDbGFzcycgLiAkQ2xhc3NSYW5kWzBdLAogICAgICAgICAgICBOYW1lICAgPT4gJ1Rlc3RJdGVtMicsCiAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhpcyBpdGVtIGlzIE5PVCBjb21wbGV0ZSBhbmQgbXVzdCBub3QgYmUgYWRkZWQKICAgIHsKICAgICAgICBBZGQgPT4gewogICAgICAgICAgICBDbGFzcyAgID0+ICdVbml0VGVzdDo6VGVzdENsYXNzJyAuICRDbGFzc1JhbmRbMF0sCiAgICAgICAgICAgIE5hbWUgICAgPT4gJ1Rlc3RJdGVtMycsCiAgICAgICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoaXMgaXRlbSBtdXN0IGJlIGluc2VydGVkIHN1Y2Nlc3NmdWxseQogICAgewogICAgICAgIEFkZCA9PiB7CiAgICAgICAgICAgIENsYXNzICAgPT4gJ1VuaXRUZXN0OjpUZXN0Q2xhc3MnIC4gJENsYXNzUmFuZFswXSwKICAgICAgICAgICAgTmFtZSAgICA9PiAnVGVzdEl0ZW00JywKICAgICAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgfSwKICAgICAgICBBZGRHZXQgPT4gewogICAgICAgICAgICBDbGFzcyAgICA9PiAnVW5pdFRlc3Q6OlRlc3RDbGFzcycgLiAkQ2xhc3NSYW5kWzBdLAogICAgICAgICAgICBOYW1lICAgICA9PiAnVGVzdEl0ZW00JywKICAgICAgICAgICAgVmFsaWRJRCAgPT4gMSwKICAgICAgICAgICAgQ29tbWVudCAgPT4gJycsCiAgICAgICAgICAgIENyZWF0ZUJ5ID0+IDEsCiAgICAgICAgICAgIENoYW5nZUJ5ID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGUgcHJlZmVyZW5jZXMgb2YgdGhlIGl0ZW0gb25lIGFkZC10ZXN0IGJlZm9yZSBtdXN0IGJlIHNldAogICAgewogICAgICAgIFByZWZlcmVuY2VzU2V0ID0+IHsKICAgICAgICAgICAgSGVsbG8gPT4gJ1dvcmxkJywKICAgICAgICAgICAgQ29sb3IgPT4gJ1JlZCcsCiAgICAgICAgfSwKICAgICAgICBQcmVmZXJlbmNlc0dldCA9PiB7CiAgICAgICAgICAgIEhlbGxvID0+ICdXb3JsZCcsCiAgICAgICAgICAgIENvbG9yID0+ICdSZWQnLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhpcyBpdGVtIGhhdmUgdGhlIHNhbWUgbmFtZSBhcyBvbmUgdGVzdCBiZWZvcmUgYW5kIG11c3Qgbm90IGJlIGFkZGVkCiAgICB7CiAgICAgICAgQWRkID0+IHsKICAgICAgICAgICAgQ2xhc3MgICA9PiAnVW5pdFRlc3Q6OlRlc3RDbGFzcycgLiAkQ2xhc3NSYW5kWzBdLAogICAgICAgICAgICBOYW1lICAgID0+ICdUZXN0SXRlbTQnLAogICAgICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoaXMgaXRlbSBtdXN0IGJlIGluc2VydGVkIHN1Y2Nlc3NmdWxseQogICAgewogICAgICAgIEFkZCA9PiB7CiAgICAgICAgICAgIENsYXNzICAgPT4gJ1VuaXRUZXN0OjpUZXN0Q2xhc3MnIC4gJENsYXNzUmFuZFswXSwKICAgICAgICAgICAgTmFtZSAgICA9PiAnVGVzdEl0ZW01JywKICAgICAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgfSwKICAgICAgICBBZGRHZXQgPT4gewogICAgICAgICAgICBDbGFzcyAgICA9PiAnVW5pdFRlc3Q6OlRlc3RDbGFzcycgLiAkQ2xhc3NSYW5kWzBdLAogICAgICAgICAgICBOYW1lICAgICA9PiAnVGVzdEl0ZW01JywKICAgICAgICAgICAgVmFsaWRJRCAgPT4gMSwKICAgICAgICAgICAgQ29tbWVudCAgPT4gJycsCiAgICAgICAgICAgIENyZWF0ZUJ5ID0+IDEsCiAgICAgICAgICAgIENoYW5nZUJ5ID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGUgcHJlZmVyZW5jZXMgb2YgdGhlIGl0ZW0gb25lIGFkZC10ZXN0IGJlZm9yZSBtdXN0IGJlIHNldAogICAgewogICAgICAgIFByZWZlcmVuY2VzU2V0ID0+IHsKICAgICAgICAgICAgSGVsbG8gPT4gJ05ld1dvcmxkJywKICAgICAgICAgICAgQ29sb3IgPT4gJ0JsdWUnLAogICAgICAgIH0sCiAgICAgICAgUHJlZmVyZW5jZXNHZXQgPT4gewogICAgICAgICAgICBIZWxsbyA9PiAnTmV3V29ybGQnLAogICAgICAgICAgICBDb2xvciA9PiAnQmx1ZScsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGUgaXRlbSBvbmUgYWRkLXRlc3QgYmVmb3JlIG11c3QgYmUgTk9UIHVwZGF0ZWQgKGl0ZW0gdXBkYXRlIGFyZ3VtZW50cyBOT1QgY29tcGxldGUpCiAgICB7CiAgICAgICAgVXBkYXRlID0+IHsKICAgICAgICAgICAgVmFsaWRJRCA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgVXNlcklEICA9PiAkVXNlcklEc1swXSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoZSBpdGVtIG9uZSBhZGQtdGVzdCBiZWZvcmUgbXVzdCBiZSBOT1QgdXBkYXRlZCAoaXRlbSB1cGRhdGUgYXJndW1lbnRzIE5PVCBjb21wbGV0ZSkKICAgIHsKICAgICAgICBVcGRhdGUgPT4gewogICAgICAgICAgICBOYW1lICAgPT4gJ1Rlc3RJdGVtNVVQREFURTEnLAogICAgICAgICAgICBVc2VySUQgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGUgaXRlbSBvbmUgYWRkLXRlc3QgYmVmb3JlIG11c3QgYmUgTk9UIHVwZGF0ZWQgKGl0ZW0gdXBkYXRlIGFyZ3VtZW50cyBOT1QgY29tcGxldGUpCiAgICB7CiAgICAgICAgVXBkYXRlID0+IHsKICAgICAgICAgICAgVmFsaWRJRCA9PiAkVXNlcklEc1swXSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoZSBpdGVtIG9uZSBhZGQtdGVzdCBiZWZvcmUgbXVzdCBiZSB1cGRhdGVkIChpdGVtIHVwZGF0ZSBhcmd1bWVudHMgYXJlIGNvbXBsZXRlKQogICAgewogICAgICAgIFVwZGF0ZSA9PiB7CiAgICAgICAgICAgIE5hbWUgICAgPT4gJ1Rlc3RJdGVtNVVQREFURTInLAogICAgICAgICAgICBWYWxpZElEID0+ICRVc2VySURzWzBdLAogICAgICAgICAgICBVc2VySUQgID0+ICRVc2VySURzWzBdLAogICAgICAgIH0sCiAgICAgICAgVXBkYXRlR2V0ID0+IHsKICAgICAgICAgICAgTmFtZSAgICAgPT4gJ1Rlc3RJdGVtNVVQREFURTInLAogICAgICAgICAgICBWYWxpZElEICA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgQ29tbWVudCAgPT4gJycsCiAgICAgICAgICAgIENyZWF0ZUJ5ID0+IDEsCiAgICAgICAgICAgIENoYW5nZUJ5ID0+ICRVc2VySURzWzBdLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhlIGl0ZW0gb25lIGFkZC10ZXN0IGJlZm9yZSBtdXN0IGJlIHVwZGF0ZWQgKGl0ZW0gdXBkYXRlIGFyZ3VtZW50cyBhcmUgY29tcGxldGUpCiAgICB7CiAgICAgICAgVXBkYXRlID0+IHsKICAgICAgICAgICAgTmFtZSAgICA9PiAnVGVzdEl0ZW01VVBEQVRFMycsCiAgICAgICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgIH0sCiAgICAgICAgVXBkYXRlR2V0ID0+IHsKICAgICAgICAgICAgTmFtZSAgICAgPT4gJ1Rlc3RJdGVtNVVQREFURTMnLAogICAgICAgICAgICBWYWxpZElEICA9PiAxLAogICAgICAgICAgICBDb21tZW50ICA9PiAnJywKICAgICAgICAgICAgQ3JlYXRlQnkgPT4gMSwKICAgICAgICAgICAgQ2hhbmdlQnkgPT4gMSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoaXMgdGVtcGxhdGUgbXVzdCBiZSBpbnNlcnRlZCBzdWNjZXNzZnVsbHkgKGNoZWNrIHN0cmluZyBjbGVhbmVyIGZ1bmN0aW9uKQogICAgewogICAgICAgIEFkZCA9PiB7CiAgICAgICAgICAgIENsYXNzICAgPT4gIiBcdCBcbiBcciBVbml0IFRlc3QgOjogVGVzdCBDbGFzcyBcdCBcbiBcciAiIC4gJENsYXNzUmFuZFswXSwKICAgICAgICAgICAgTmFtZSAgICA9PiAiIFx0IFxuIFxyIFRlc3QgSXRlbSBcdCBcbiBcciAiLAogICAgICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgICAgIENvbW1lbnQgPT4gIiBcdCBcbiBcciBUZXN0IENvbW1lbnQgXHQgXG4gXHIgIiwKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgIH0sCiAgICAgICAgQWRkR2V0ID0+IHsKICAgICAgICAgICAgQ2xhc3MgICAgPT4gJ1VuaXRUZXN0OjpUZXN0Q2xhc3MnIC4gJENsYXNzUmFuZFswXSwKICAgICAgICAgICAgTmFtZSAgICAgPT4gJ1Rlc3QgSXRlbScsCiAgICAgICAgICAgIFZhbGlkSUQgID0+IDEsCiAgICAgICAgICAgIENvbW1lbnQgID0+ICdUZXN0IENvbW1lbnQnLAogICAgICAgICAgICBDcmVhdGVCeSA9PiAxLAogICAgICAgICAgICBDaGFuZ2VCeSA9PiAxLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhlIGl0ZW0gb25lIGFkZC10ZXN0IGJlZm9yZSBtdXN0IGJlIHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5IChjaGVjayBzdHJpbmcgY2xlYW5lciBmdW5jdGlvbikKICAgIHsKICAgICAgICBVcGRhdGUgPT4gewogICAgICAgICAgICBOYW1lICAgID0+ICIgXHQgXG4gXHIgVGVzdCBJdGVtIFVQREFURTEgXHQgXG4gXHIgIiwKICAgICAgICAgICAgVmFsaWRJRCA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgQ29tbWVudCA9PiAiIFx0IFxuIFxyIFRlc3QgQ29tbWVudCBVUERBVEUxIFx0IFxuIFxyICIsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgfSwKICAgICAgICBVcGRhdGVHZXQgPT4gewogICAgICAgICAgICBOYW1lICAgICA9PiAnVGVzdCBJdGVtIFVQREFURTEnLAogICAgICAgICAgICBWYWxpZElEICA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgQ29tbWVudCAgPT4gJ1Rlc3QgQ29tbWVudCBVUERBVEUxJywKICAgICAgICAgICAgQ3JlYXRlQnkgPT4gMSwKICAgICAgICAgICAgQ2hhbmdlQnkgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGlzIGl0ZW0gbXVzdCBiZSBpbnNlcnRlZCBzdWNjZXNzZnVsbHkgKHVuaWNvZGUgY2hlY2tzKQogICAgewogICAgICAgIEFkZCA9PiB7CiAgICAgICAgICAgIENsYXNzICAgPT4gJ1VuaXRUZXN0OjpUZXN0Q2xhc3PCqScgLiAkQ2xhc3NSYW5kWzFdLAogICAgICAgICAgICBOYW1lICAgID0+ICcgz5Igz6EgVGVzdCBJdGVtIMapIM+eICcsCiAgICAgICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICAgICAgQ29tbWVudCA9PiAnIM+gINCvIFRlc3QgQ29tbWVudCDRrCDRoCAnLAogICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgfSwKICAgICAgICBBZGRHZXQgPT4gewogICAgICAgICAgICBDbGFzcyAgICA9PiAnVW5pdFRlc3Q6OlRlc3RDbGFzc8KpJyAuICRDbGFzc1JhbmRbMV0sCiAgICAgICAgICAgIE5hbWUgICAgID0+ICfPkiDPoSBUZXN0IEl0ZW0gxqkgz54nLAogICAgICAgICAgICBWYWxpZElEICA9PiAxLAogICAgICAgICAgICBDb21tZW50ICA9PiAnz6Ag0K8gVGVzdCBDb21tZW50INGsINGgJywKICAgICAgICAgICAgQ3JlYXRlQnkgPT4gMSwKICAgICAgICAgICAgQ2hhbmdlQnkgPT4gMSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoZSBpdGVtIG9uZSBhZGQtdGVzdCBiZWZvcmUgbXVzdCBiZSB1cGRhdGVkIHN1Y2Nlc3NmdWxseSAodW5pY29kZSBjaGVja3MpCiAgICB7CiAgICAgICAgVXBkYXRlID0+IHsKICAgICAgICAgICAgTmFtZSAgICA9PiAnVGVzdCBJdGVtIMapIMmkIFVQREFURTEnLAogICAgICAgICAgICBWYWxpZElEID0+ICRVc2VySURzWzFdLAogICAgICAgICAgICBDb21tZW50ID0+ICcgVGVzdCBDb21tZW50INGZINGSIFVQREFURTEgJywKICAgICAgICAgICAgVXNlcklEICA9PiAkVXNlcklEc1sxXSwKICAgICAgICB9LAogICAgICAgIFVwZGF0ZUdldCA9PiB7CiAgICAgICAgICAgIE5hbWUgICAgID0+ICdUZXN0IEl0ZW0gxqkgyaQgVVBEQVRFMScsCiAgICAgICAgICAgIFZhbGlkSUQgID0+ICRVc2VySURzWzFdLAogICAgICAgICAgICBDb21tZW50ICA9PiAnVGVzdCBDb21tZW50INGZINGSIFVQREFURTEnLAogICAgICAgICAgICBDcmVhdGVCeSA9PiAxLAogICAgICAgICAgICBDaGFuZ2VCeSA9PiAkVXNlcklEc1sxXSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoaXMgaXRlbSBtdXN0IGJlIGluc2VydGVkIHN1Y2Nlc3NmdWxseSAoYSBzZWNvbmQgaXRlbSB3aXRoIEZ1bmN0aW9uYWxpdHkgJ3Rlc3QxJykKICAgIHsKICAgICAgICBBZGQgPT4gewogICAgICAgICAgICBDbGFzcyAgID0+ICdVbml0VGVzdDo6VGVzdENsYXNzJyAuICRDbGFzc1JhbmRbMF0sCiAgICAgICAgICAgIE5hbWUgICAgPT4gJ1Rlc3RJdGVtNicsCiAgICAgICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgIH0sCiAgICAgICAgQWRkR2V0ID0+IHsKICAgICAgICAgICAgQ2xhc3MgICAgPT4gJ1VuaXRUZXN0OjpUZXN0Q2xhc3MnIC4gJENsYXNzUmFuZFswXSwKICAgICAgICAgICAgTmFtZSAgICAgPT4gJ1Rlc3RJdGVtNicsCiAgICAgICAgICAgIFZhbGlkSUQgID0+IDEsCiAgICAgICAgICAgIENvbW1lbnQgID0+ICcnLAogICAgICAgICAgICBDcmVhdGVCeSA9PiAxLAogICAgICAgICAgICBDaGFuZ2VCeSA9PiAxLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhlIGl0ZW0gb25lIGFkZC10ZXN0IGJlZm9yZSBtdXN0IGJlIHVwZGF0ZWQgKHNldCBmdW5jdGlvbmFsaXR5IHRvICcnKQogICAgewogICAgICAgIFVwZGF0ZSA9PiB7CiAgICAgICAgICAgIE5hbWUgICAgPT4gJ1Rlc3RJdGVtNlVQREFURTEnLAogICAgICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICB9LAogICAgICAgIFVwZGF0ZUdldCA9PiB7CiAgICAgICAgICAgIE5hbWUgICAgID0+ICdUZXN0SXRlbTZVUERBVEUxJywKICAgICAgICAgICAgVmFsaWRJRCAgPT4gMSwKICAgICAgICAgICAgQ29tbWVudCAgPT4gJycsCiAgICAgICAgICAgIENyZWF0ZUJ5ID0+IDEsCiAgICAgICAgICAgIENoYW5nZUJ5ID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGlzIGl0ZW0gbXVzdCBiZSBpbnNlcnRlZCBzdWNjZXNzZnVsbHkgKHNwZWNpYWwgY2hhcmFjdGVyIGNoZWNrcykKICAgIHsKICAgICAgICBBZGQgPT4gewogICAgICAgICAgICBDbGFzcyAgID0+ICdVbml0VGVzdDo6VGVzdENsYXNzW3Rlc3RdJSpcXCcgLiAkQ2xhc3NSYW5kWzFdLAogICAgICAgICAgICBOYW1lICAgID0+ICcgW3Rlc3RdJSpcXCBUZXN0IEl0ZW0gW3Rlc3RdJSpcXCAnLAogICAgICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgICAgIENvbW1lbnQgPT4gJyBbdGVzdF0lKlxcIFRlc3QgQ29tbWVudCBbdGVzdF0lKlxcICcsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICB9LAogICAgICAgIEFkZEdldCA9PiB7CiAgICAgICAgICAgIENsYXNzICAgID0+ICdVbml0VGVzdDo6VGVzdENsYXNzW3Rlc3RdJSpcXCcgLiAkQ2xhc3NSYW5kWzFdLAogICAgICAgICAgICBOYW1lICAgICA9PiAnW3Rlc3RdJSpcXCBUZXN0IEl0ZW0gW3Rlc3RdJSpcXCcsCiAgICAgICAgICAgIFZhbGlkSUQgID0+IDEsCiAgICAgICAgICAgIENvbW1lbnQgID0+ICdbdGVzdF0lKlxcIFRlc3QgQ29tbWVudCBbdGVzdF0lKlxcJywKICAgICAgICAgICAgQ3JlYXRlQnkgPT4gMSwKICAgICAgICAgICAgQ2hhbmdlQnkgPT4gMSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoZSBpdGVtIG9uZSBhZGQtdGVzdCBiZWZvcmUgbXVzdCBiZSB1cGRhdGVkIHN1Y2Nlc3NmdWxseSAoc3BlY2lhbCBjaGFyYWN0ZXIgY2hlY2tzKQogICAgewogICAgICAgIFVwZGF0ZSA9PiB7CiAgICAgICAgICAgIE5hbWUgICAgPT4gJyBbdGVzdF0lKlxcIFRlc3QgSXRlbSBVUERBVEUxIFt0ZXN0XSUqXFwgJywKICAgICAgICAgICAgVmFsaWRJRCA9PiAkVXNlcklEc1sxXSwKICAgICAgICAgICAgQ29tbWVudCA9PiAnIFt0ZXN0XSUqXFwgVGVzdCBDb21tZW50IFVQREFURTEgW3Rlc3RdJSpcXCAnLAogICAgICAgICAgICBVc2VySUQgID0+ICRVc2VySURzWzFdLAogICAgICAgIH0sCiAgICAgICAgVXBkYXRlR2V0ID0+IHsKICAgICAgICAgICAgTmFtZSAgICAgPT4gJ1t0ZXN0XSUqXFwgVGVzdCBJdGVtIFVQREFURTEgW3Rlc3RdJSpcXCcsCiAgICAgICAgICAgIFZhbGlkSUQgID0+ICRVc2VySURzWzFdLAogICAgICAgICAgICBDb21tZW50ICA9PiAnW3Rlc3RdJSpcXCBUZXN0IENvbW1lbnQgVVBEQVRFMSBbdGVzdF0lKlxcJywKICAgICAgICAgICAgQ3JlYXRlQnkgPT4gMSwKICAgICAgICAgICAgQ2hhbmdlQnkgPT4gJFVzZXJJRHNbMV0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGlzIGl0ZW0gbXVzdCBiZSBpbnNlcnRlZCBzdWNjZXNzZnVsbHkKICAgIHsKICAgICAgICBBZGQgPT4gewogICAgICAgICAgICBDbGFzcyAgID0+ICdVbml0VGVzdDo6VGVzdENsYXNzJyAuICRDbGFzc1JhbmRbMF0sCiAgICAgICAgICAgIE5hbWUgICAgPT4gJ1Rlc3RJdGVtUHJlZmVyZW5jZXMnLAogICAgICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICB9LAogICAgICAgIEFkZEdldCA9PiB7CiAgICAgICAgICAgIENsYXNzICAgID0+ICdVbml0VGVzdDo6VGVzdENsYXNzJyAuICRDbGFzc1JhbmRbMF0sCiAgICAgICAgICAgIE5hbWUgICAgID0+ICdUZXN0SXRlbVByZWZlcmVuY2VzJywKICAgICAgICAgICAgVmFsaWRJRCAgPT4gMSwKICAgICAgICAgICAgQ29tbWVudCAgPT4gJycsCiAgICAgICAgICAgIENyZWF0ZUJ5ID0+IDEsCiAgICAgICAgICAgIENoYW5nZUJ5ID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGUgcHJlZmVyZW5jZXMgb2YgdGhlIGl0ZW0gb25lIGFkZC10ZXN0IGJlZm9yZSBtdXN0IGJlIHNldAogICAgewogICAgICAgIFByZWZlcmVuY2VzU2V0ID0+IHsKICAgICAgICAgICAgVGVzdCAgPT4gJ2hlbGxvIHdvcmxkJywKICAgICAgICAgICAgR3JvdXAgPT4gMzMsCiAgICAgICAgfSwKICAgICAgICBQcmVmZXJlbmNlc0dldCA9PiB7CiAgICAgICAgICAgIFRlc3QgID0+ICdoZWxsbyB3b3JsZCcsCiAgICAgICAgICAgIEdyb3VwID0+IDMzLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhlIHByZWZlcmVuY2VzIG9mIHRoZSBpdGVtIG9uZSBhZGQtdGVzdCBiZWZvcmUgbXVzdCBiZSBzZXQKICAgIHsKICAgICAgICBQcmVmZXJlbmNlc1NldCA9PiB7CiAgICAgICAgICAgIFRlc3QgPT4gJ2hlbGxvJywKICAgICAgICAgICAgU2l6ZSA9PiAzOCwKICAgICAgICB9LAogICAgICAgIFByZWZlcmVuY2VzR2V0ID0+IHsKICAgICAgICAgICAgVGVzdCA9PiAnaGVsbG8nLAogICAgICAgICAgICBTaXplID0+IDM4LAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhpcyBpdGVtIGhhcyBhbiBlbXB0eSBuYW1lIGFuZCBtdXN0IG5vdCBiZSBhZGRlZAogICAgewogICAgICAgIEFkZCA9PiB7CiAgICAgICAgICAgIENsYXNzICAgPT4gJ1VuaXRUZXN0OjpUZXN0Q2xhc3MnIC4gJENsYXNzUmFuZFswXSwKICAgICAgICAgICAgTmFtZSAgICA9PiAnJywKICAgICAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGlzIGl0ZW0gbXVzdCBiZSBhZGRlZCwgdGhlIG51bWJlciB6ZXJvICgwKSBpcyBhbGxvd2VkIGFzIG5hbWUKICAgIHsKICAgICAgICBBZGQgPT4gewogICAgICAgICAgICBDbGFzcyAgID0+ICdVbml0VGVzdDo6VGVzdENsYXNzJyAuICRDbGFzc1JhbmRbMF0sCiAgICAgICAgICAgIE5hbWUgICAgPT4gJzAnLAogICAgICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICB9LAogICAgICAgIEFkZEdldCA9PiB7CiAgICAgICAgICAgIENsYXNzICAgID0+ICdVbml0VGVzdDo6VGVzdENsYXNzJyAuICRDbGFzc1JhbmRbMF0sCiAgICAgICAgICAgIE5hbWUgICAgID0+ICcwJywKICAgICAgICAgICAgVmFsaWRJRCAgPT4gMSwKICAgICAgICAgICAgQ29tbWVudCAgPT4gJycsCiAgICAgICAgICAgIENyZWF0ZUJ5ID0+IDEsCiAgICAgICAgICAgIENoYW5nZUJ5ID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGUgaXRlbSBvbmUgYWRkLXRlc3QgYmVmb3JlIG11c3QgYmUgdXBkYXRlZCBzdWNjZXNzZnVsbHkgKHVwZGF0aW5nIG5hbWUgdG8gbnVtYmVyIHplcm8gKDApICkKICAgIHsKICAgICAgICBVcGRhdGUgPT4gewogICAgICAgICAgICBOYW1lICAgID0+ICcwJywKICAgICAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgICAgICBDb21tZW50ID0+ICcnLAogICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgfSwKICAgICAgICBVcGRhdGVHZXQgPT4gewogICAgICAgICAgICBOYW1lICAgICA9PiAnMCcsCiAgICAgICAgICAgIFZhbGlkSUQgID0+IDEsCiAgICAgICAgICAgIENvbW1lbnQgID0+ICcnLAogICAgICAgICAgICBDcmVhdGVCeSA9PiAxLAogICAgICAgICAgICBDaGFuZ2VCeSA9PiAxLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhlIGl0ZW0gb25lIGFkZC10ZXN0IGJlZm9yZSBtdXN0IG5vdCBiZSB1cGRhdGVkIHN1Y2Nlc3NmdWxseQogICAgIyAoZW1wdHkgc3RyaW5nIGFzIG5hbWUgaXMgbm90IGFsbG93ZWQgKQogICAgewogICAgICAgIFVwZGF0ZSA9PiB7CiAgICAgICAgICAgIE5hbWUgICAgPT4gJycsCiAgICAgICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICAgICAgQ29tbWVudCA9PiAnJywKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgIH0sCiAgICB9LApdOwoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIHJ1biBnZW5lcmFsIHRlc3RzCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCm15ICRUZXN0Q291bnQgPSAxOwpteSAkTGFzdEFkZGVkSXRlbUlEOwpteSAlQWRkZWRJdGVtQ291bnRlcjsKCmZvciBteSAkSXRlbSAoIEB7JEl0ZW1EYXRhfSApIHsKCiAgICBpZiAoICRJdGVtLT57QWRkfSApIHsKCiAgICAgICAgIyBhZGQgbmV3IGl0ZW0KICAgICAgICBteSAkSXRlbUlEID0gJEdlbmVyYWxDYXRhbG9nT2JqZWN0LT5JdGVtQWRkKAogICAgICAgICAgICAleyAkSXRlbS0+e0FkZH0gfSwKICAgICAgICApOwoKICAgICAgICAjIGNoZWNrIGlmIGl0ZW0gd2FzIGFkZGVkIHN1Y2Nlc3NmdWxseSBvciBub3QKICAgICAgICBpZiAoICRJdGVtLT57QWRkR2V0fSApIHsKCiAgICAgICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAgICAgJEl0ZW1JRCwKICAgICAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IEl0ZW1BZGQoKSAtIEl0ZW1LZXk6ICRJdGVtSUQiLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCRJdGVtSUQpIHsKCiAgICAgICAgICAgICAgICAjIHNldCBsYXN0IGl0ZW0gaWQgdmFyaWFibGUKICAgICAgICAgICAgICAgICRMYXN0QWRkZWRJdGVtSUQgPSAkSXRlbUlEOwoKICAgICAgICAgICAgICAgICMgaW5jcmVtZW50IHRoZSBhZGRlZCBpdGVtIGNvdW50ZXIKICAgICAgICAgICAgICAgICRBZGRlZEl0ZW1Db3VudGVyeyAkSXRlbS0+e0FkZEdldH0tPntDbGFzc30gfSsrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkU2VsZi0+RmFsc2UoCiAgICAgICAgICAgICAgICAkSXRlbUlELAogICAgICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogSXRlbUFkZCgpIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGl0ZW0gZGF0YSB0byBjaGVjayB0aGUgdmFsdWVzIGFmdGVyIGNyZWF0aW9uIG9mIGl0ZW0gdXNpbmcgSXRlbUlkIGFuZCBVc2VySUQKICAgICAgICBteSAkSXRlbUdldCA9ICRHZW5lcmFsQ2F0YWxvZ09iamVjdC0+SXRlbUdldCgKICAgICAgICAgICAgSXRlbUlEID0+ICRJdGVtSUQsCiAgICAgICAgICAgIFVzZXJJRCA9PiAkSXRlbS0+e0FkZH0tPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgY2hlY2sgaXRlbSBkYXRhIGFmdGVyIGNyZWF0aW9uIG9mIGl0ZW0KICAgICAgICBmb3IgbXkgJEl0ZW1BdHRyaWJ1dGUgKCBzb3J0IGtleXMgJXsgJEl0ZW0tPntBZGRHZXR9IH0gKSB7CiAgICAgICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgICAgICRJdGVtR2V0LT57JEl0ZW1BdHRyaWJ1dGV9LAogICAgICAgICAgICAgICAgJEl0ZW0tPntBZGRHZXR9LT57JEl0ZW1BdHRyaWJ1dGV9LAogICAgICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogSXRlbUdldCgpIC0gVXNpbmcgSXRlbUlEIGFuZCBVc2VySUQgLSAkSXRlbUF0dHJpYnV0ZSAiLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgaXRlbSBkYXRhIHRvIGNoZWNrIHRoZSB2YWx1ZXMgYWZ0ZXIgY3JlYXRpb24gb2YgaXRlbSB1c2luZyBDbGFzcyBhbmQgTmFtZQogICAgICAgICRJdGVtR2V0ID0gJEdlbmVyYWxDYXRhbG9nT2JqZWN0LT5JdGVtR2V0KAogICAgICAgICAgICBDbGFzcyA9PiAkSXRlbS0+e0FkZEdldH0tPntDbGFzc30sCiAgICAgICAgICAgIE5hbWUgID0+ICRJdGVtLT57QWRkR2V0fS0+e05hbWV9LAogICAgICAgICk7CgogICAgICAgICMgY2hlY2sgaXRlbSBkYXRhIGFmdGVyIGNyZWF0aW9uIG9mIGl0ZW0KICAgICAgICBmb3IgbXkgJEl0ZW1BdHRyaWJ1dGUgKCBzb3J0IGtleXMgJXsgJEl0ZW0tPntBZGRHZXR9IH0gKSB7CiAgICAgICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgICAgICRJdGVtR2V0LT57JEl0ZW1BdHRyaWJ1dGV9LAogICAgICAgICAgICAgICAgJEl0ZW0tPntBZGRHZXR9LT57JEl0ZW1BdHRyaWJ1dGV9LAogICAgICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogSXRlbUdldCgpIC0gVXNpbmcgQ2xhc3MgYW5kIE5hbWUgLSAkSXRlbUF0dHJpYnV0ZSAiLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoICRJdGVtLT57VXBkYXRlfSApIHsKCiAgICAgICAgIyBjaGVjayBsYXN0IGl0ZW0gaWQgdmFyaWFibGUKICAgICAgICBpZiAoICEkTGFzdEFkZGVkSXRlbUlEICkgewogICAgICAgICAgICAkU2VsZi0+RmFsc2UoCiAgICAgICAgICAgICAgICAxLAogICAgICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogTk8gTEFTVCBJVEVNIElEIEdJVkVOIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgdXBkYXRlIHRoZSBpdGVtCiAgICAgICAgbXkgJFVwZGF0ZVN1Y2VzcyA9ICRHZW5lcmFsQ2F0YWxvZ09iamVjdC0+SXRlbVVwZGF0ZSgKICAgICAgICAgICAgJXsgJEl0ZW0tPntVcGRhdGV9IH0sCiAgICAgICAgICAgIEl0ZW1JRCA9PiAkTGFzdEFkZGVkSXRlbUlELAogICAgICAgICk7CgogICAgICAgICMgY2hlY2sgaWYgaXRlbSB3YXMgdXBkYXRlZCBzdWNjZXNzZnVsbHkgb3Igbm90CiAgICAgICAgaWYgKCAkSXRlbS0+e1VwZGF0ZUdldH0gKSB7CiAgICAgICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAgICAgJFVwZGF0ZVN1Y2VzcywKICAgICAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IEl0ZW1VcGRhdGUoKSAtIEl0ZW1LZXk6ICRMYXN0QWRkZWRJdGVtSUQiLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFNlbGYtPkZhbHNlKAogICAgICAgICAgICAgICAgJFVwZGF0ZVN1Y2VzcywKICAgICAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IEl0ZW1VcGRhdGUoKSIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGdldCBpdGVtIGRhdGEgdG8gY2hlY2sgdGhlIHZhbHVlcyBhZnRlciB0aGUgdXBkYXRlCiAgICAgICAgbXkgJEl0ZW1HZXQyID0gJEdlbmVyYWxDYXRhbG9nT2JqZWN0LT5JdGVtR2V0KAogICAgICAgICAgICBJdGVtSUQgPT4gJExhc3RBZGRlZEl0ZW1JRCwKICAgICAgICAgICAgVXNlcklEID0+ICRJdGVtLT57VXBkYXRlfS0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBjaGVjayBpdGVtIGRhdGEgYWZ0ZXIgdXBkYXRlCiAgICAgICAgZm9yIG15ICRJdGVtQXR0cmlidXRlICggc29ydCBrZXlzICV7ICRJdGVtLT57VXBkYXRlR2V0fSB9ICkgewogICAgICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICAgICAkSXRlbUdldDItPnskSXRlbUF0dHJpYnV0ZX0sCiAgICAgICAgICAgICAgICAkSXRlbS0+e1VwZGF0ZUdldH0tPnskSXRlbUF0dHJpYnV0ZX0sCiAgICAgICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBJdGVtR2V0KCkgLSAkSXRlbUF0dHJpYnV0ZSIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgIGlmICggJEl0ZW0tPntQcmVmZXJlbmNlc1NldH0gKSB7CgogICAgICAgIGZvciBteSAkS2V5ICggc29ydCBrZXlzICV7ICRJdGVtLT57UHJlZmVyZW5jZXNTZXR9IH0gKSB7CgogICAgICAgICAgICAjIHNldCBwcmVmZXJlbmNlcwogICAgICAgICAgICBteSAkU3VjY2VzcyA9ICRHZW5lcmFsQ2F0YWxvZ09iamVjdC0+R2VuZXJhbENhdGFsb2dQcmVmZXJlbmNlc1NldCgKICAgICAgICAgICAgICAgIEtleSAgICA9PiAkS2V5LAogICAgICAgICAgICAgICAgVmFsdWUgID0+ICRJdGVtLT57UHJlZmVyZW5jZXNTZXR9LT57JEtleX0sCiAgICAgICAgICAgICAgICBJdGVtSUQgPT4gJExhc3RBZGRlZEl0ZW1JRCwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAgICAgJFN1Y2Nlc3MsCiAgICAgICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBQcmVmZXJlbmNlc1NldCgpIC0gJEtleSIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgcHJlZmVyZW5jZXMKICAgIGlmICggJEl0ZW0tPntQcmVmZXJlbmNlc0dldH0gKSB7CiAgICAgICAgbXkgJVByZWZlcmVuY2VzID0gJEdlbmVyYWxDYXRhbG9nT2JqZWN0LT5HZW5lcmFsQ2F0YWxvZ1ByZWZlcmVuY2VzR2V0KAogICAgICAgICAgICBJdGVtSUQgPT4gJExhc3RBZGRlZEl0ZW1JRCwKICAgICAgICApOwoKICAgICAgICBmb3IgbXkgJEtleSAoIHNvcnQga2V5cyAleyAkSXRlbS0+e1ByZWZlcmVuY2VzR2V0fSB9ICkgewogICAgICAgICAgICBpZiAoICRJdGVtLT57UHJlZmVyZW5jZXNHZXR9LT57JEtleX0gZXEgJFByZWZlcmVuY2VzeyRLZXl9ICkgewogICAgICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICAgICAgMSwKICAgICAgICAgICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBQcmVmZXJlbmNlc0dldCgpIC0gJEtleSIsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBQcmVmZXJlbmNlc0dldCgpIC0gJEtleSIsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICRUZXN0Q291bnQrKzsKfQoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIG1ha2UgcHJlcGFyYXRpb25zIGZvciBsYXRlciB0ZXN0cwojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgojIGNyZWF0ZSBuZWVkZWQgYXJyYXlzCm15ICVFeGlzdGluZ0NsYXNzZXNUbXA7CklURU06CmZvciBteSAkSXRlbSAoIEB7JEl0ZW1EYXRhfSApIHsKICAgIG5leHQgSVRFTSBpZiAhJEl0ZW0tPntBZGRHZXR9LT57Q2xhc3N9OwogICAgJEV4aXN0aW5nQ2xhc3Nlc1RtcHsgJEl0ZW0tPntBZGRHZXR9LT57Q2xhc3N9IH0gPSAxOwp9Cm15IEBFeGlzdGluZ0NsYXNzZXMgPSBzb3J0IGtleXMgJUV4aXN0aW5nQ2xhc3Nlc1RtcDsKCm15ICVFeGlzdGluZ0Z1bmN0aW9uYWxpdGllc1RtcDsKSVRFTToKZm9yIG15ICRJdGVtICggQHskSXRlbURhdGF9ICkgewogICAgJEl0ZW0tPntVcGRhdGVHZXR9LT57RnVuY3Rpb25hbGl0eX0gfHw9ICcnOwogICAgJEV4aXN0aW5nRnVuY3Rpb25hbGl0aWVzVG1weyAkSXRlbS0+e1VwZGF0ZUdldH0tPntGdW5jdGlvbmFsaXR5fSB9ID0gMTsKfQpteSBARXhpc3RpbmdGdW5jdGlvbmFsaXRpZXMgPSBzb3J0IGtleXMgJUV4aXN0aW5nRnVuY3Rpb25hbGl0aWVzVG1wOwoKbXkgQE5vbkV4aXN0aW5nQ2xhc3NlcyA9ICggJ1VuaXRUZXN0OjpOb0V4aXN0aW5nQ2xhc3MxJywgJ1VuaXRUZXN0OjpOb0V4aXN0aW5nQ2xhc3MyJyApOwoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIENsYXNzTGlzdCB0ZXN0IDEKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKbXkgJENsYXNzTGlzdDEgPSAkR2VuZXJhbENhdGFsb2dPYmplY3QtPkNsYXNzTGlzdCgpOwoKZm9yIG15ICRDbGFzcyAoQEV4aXN0aW5nQ2xhc3NlcykgewoKICAgIG15ICRDbGFzc0NvdW50ID0gMDsKICAgIGlmICggJENsYXNzTGlzdDEgJiYgcmVmICRDbGFzc0xpc3QxIGVxICdBUlJBWScgKSB7CiAgICAgICAgJENsYXNzQ291bnQgPSBncmVwIHsgJF8gZXEgJENsYXNzIH0gQHskQ2xhc3NMaXN0MX07CiAgICB9CgogICAgJFNlbGYtPklzKAogICAgICAgICRDbGFzc0NvdW50LAogICAgICAgIDEsCiAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogQ2xhc3NMaXN0KCkgLSAkQ2xhc3MgbGlzdGVkIiwKICAgICk7CgogICAgJFRlc3RDb3VudCsrOwp9CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgSXRlbUxpc3QgdGVzdCAxCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCmZvciBteSAkQ2xhc3MgKEBOb25FeGlzdGluZ0NsYXNzZXMpIHsKCiAgICBteSAkSXRlbUxpc3QgPSAkR2VuZXJhbENhdGFsb2dPYmplY3QtPkl0ZW1MaXN0KAogICAgICAgIENsYXNzID0+ICRDbGFzcywKICAgICAgICBWYWxpZCA9PiAwLAogICAgKTsKCiAgICAkU2VsZi0+RmFsc2UoCiAgICAgICAgJEl0ZW1MaXN0LAogICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IEl0ZW1MaXN0KCkgLSAkQ2xhc3Mgbm90IGV4aXN0cyIsCiAgICApOwoKICAgICRUZXN0Q291bnQrKzsKfQoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIEl0ZW1MaXN0IHRlc3QgMgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgpmb3IgbXkgJENsYXNzIChARXhpc3RpbmdDbGFzc2VzKSB7CgogICAgbXkgJEl0ZW1MaXN0ID0gJEdlbmVyYWxDYXRhbG9nT2JqZWN0LT5JdGVtTGlzdCgKICAgICAgICBDbGFzcyA9PiAkQ2xhc3MsCiAgICAgICAgVmFsaWQgPT4gMCwKICAgICk7CgogICAgbXkgJExpc3RDb3VudCA9ICdOVUxMJzsKICAgIGlmICggZGVmaW5lZCAkSXRlbUxpc3QgJiYgcmVmICRJdGVtTGlzdCBlcSAnSEFTSCcgKSB7CiAgICAgICAgJExpc3RDb3VudCA9IGtleXMgJXskSXRlbUxpc3R9OwogICAgfQoKICAgICRTZWxmLT5JcygKICAgICAgICAkTGlzdENvdW50LAogICAgICAgICRBZGRlZEl0ZW1Db3VudGVyeyRDbGFzc30sCiAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogSXRlbUxpc3QoKSAtICRDbGFzcyBjb3JyZWN0IG51bWJlciBvZiBpdGVtcyIsCiAgICApOwoKICAgICRUZXN0Q291bnQrKzsKfQoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIEl0ZW1MaXN0IHRlc3QgMyAtIEl0ZW0gTGlzdCB3aXRoIHByZWZlcmVuY2VzIChzaW5nbGUgaGFzaCBlbnRyeSkKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKewoKICAgIG15ICRDbGFzcyAgICA9ICdVbml0VGVzdDo6VGVzdENsYXNzJyAuICRDbGFzc1JhbmRbMF07CiAgICBteSAkSXRlbUxpc3QgPSAkR2VuZXJhbENhdGFsb2dPYmplY3QtPkl0ZW1MaXN0KAogICAgICAgIENsYXNzICAgICAgID0+ICRDbGFzcywKICAgICAgICBWYWxpZCAgICAgICA9PiAxLAogICAgICAgIFByZWZlcmVuY2VzID0+IHsKICAgICAgICAgICAgSGVsbG8gPT4gJ1dvcmxkJywKICAgICAgICB9LAogICAgKTsKCiAgICBteSAkTGlzdENvdW50ID0gJ05VTEwnOwogICAgaWYgKCBkZWZpbmVkICRJdGVtTGlzdCAmJiByZWYgJEl0ZW1MaXN0IGVxICdIQVNIJyApIHsKICAgICAgICAkTGlzdENvdW50ID0ga2V5cyAleyRJdGVtTGlzdH07CiAgICB9CgogICAgJFNlbGYtPklzKAogICAgICAgICRMaXN0Q291bnQsCiAgICAgICAgMSwKICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBJdGVtTGlzdCgpIHByZWZlcmVuY2VzIChzaW5nbGUgaGFzaCBlbnRyeSkgLSAkQ2xhc3MgY29ycmVjdCBudW1iZXIgb2YgaXRlbXMiLAogICAgKTsKCiAgICAkVGVzdENvdW50Kys7Cn0KCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBJdGVtTGlzdCB0ZXN0IDQgLSBJdGVtIExpc3Qgd2l0aCBwcmVmZXJlbmNlcyAoYXJyYXkpCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCnsKCiAgICBteSAkQ2xhc3MgICAgPSAnVW5pdFRlc3Q6OlRlc3RDbGFzcycgLiAkQ2xhc3NSYW5kWzBdOwogICAgbXkgJEl0ZW1MaXN0ID0gJEdlbmVyYWxDYXRhbG9nT2JqZWN0LT5JdGVtTGlzdCgKICAgICAgICBDbGFzcyAgICAgICA9PiAkQ2xhc3MsCiAgICAgICAgVmFsaWQgICAgICAgPT4gMSwKICAgICAgICBQcmVmZXJlbmNlcyA9PiB7CiAgICAgICAgICAgIENvbG9yID0+IFsgJ1JlZCcsICdCbHVlJyBdLAogICAgICAgIH0sCiAgICApOwoKICAgIG15ICRMaXN0Q291bnQgPSAnTlVMTCc7CiAgICBpZiAoIGRlZmluZWQgJEl0ZW1MaXN0ICYmIHJlZiAkSXRlbUxpc3QgZXEgJ0hBU0gnICkgewogICAgICAgICRMaXN0Q291bnQgPSBrZXlzICV7JEl0ZW1MaXN0fTsKICAgIH0KCiAgICAkU2VsZi0+SXMoCiAgICAgICAgJExpc3RDb3VudCwKICAgICAgICAyLAogICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IEl0ZW1MaXN0KCkgcHJlZmVyZW5jZXMgKGFycmF5KSAtICRDbGFzcyBjb3JyZWN0IG51bWJlciBvZiBpdGVtcyIsCiAgICApOwoKICAgICRUZXN0Q291bnQrKzsKfQoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIFByZWZlcmVuY2VzIHRlc3QgMQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCmZvciBteSAkQ2xhc3MgKEBFeGlzdGluZ0NsYXNzZXMpIHsKCiAgICBteSAkSXRlbUlEID0gJEdlbmVyYWxDYXRhbG9nT2JqZWN0LT5JdGVtQWRkKAogICAgICAgIENsYXNzICAgPT4gJENsYXNzLAogICAgICAgIE5hbWUgICAgPT4gJ0l0ZW0gUHJlZmVyZW5jZXMnLAogICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICBVc2VySUQgID0+IDEsCiAgICApOwoKICAgICRHZW5lcmFsQ2F0YWxvZ09iamVjdC0+R2VuZXJhbENhdGFsb2dQcmVmZXJlbmNlc1NldCgKICAgICAgICBJdGVtSUQgPT4gJEl0ZW1JRCwKICAgICAgICBLZXkgICAgPT4gJ1VuaXRUZXN0UHJlZicsCiAgICAgICAgVmFsdWUgID0+ICcxJywKICAgICk7CgogICAgbXkgJEl0ZW1MaXN0ID0gJEdlbmVyYWxDYXRhbG9nT2JqZWN0LT5JdGVtTGlzdCgKICAgICAgICBDbGFzcyAgICAgICA9PiAkQ2xhc3MsCiAgICAgICAgUHJlZmVyZW5jZXMgPT4gewogICAgICAgICAgICBVbml0VGVzdFByZWYgPT4gMSwKICAgICAgICB9LAogICAgKTsKCiAgICAkU2VsZi0+SXMoCiAgICAgICAgJEl0ZW1MaXN0LT57JEl0ZW1JRH0sCiAgICAgICAgJ0l0ZW0gUHJlZmVyZW5jZXMnLAogICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IEl0ZW1MaXN0KCkgLSBDbGFzcyAkQ2xhc3MgUHJlZmVyZW5jZXMgbWF0Y2giLAogICAgKTsKCiAgICAkR2VuZXJhbENhdGFsb2dPYmplY3QtPkdlbmVyYWxDYXRhbG9nUHJlZmVyZW5jZXNTZXQoCiAgICAgICAgSXRlbUlEID0+ICRJdGVtSUQsCiAgICAgICAgS2V5ICAgID0+ICdVbml0VGVzdFByZWYnLAogICAgICAgIFZhbHVlICA9PiAnMicsCiAgICApOwoKICAgICRJdGVtTGlzdCA9ICRHZW5lcmFsQ2F0YWxvZ09iamVjdC0+SXRlbUxpc3QoCiAgICAgICAgQ2xhc3MgICAgICAgPT4gJENsYXNzLAogICAgICAgIFByZWZlcmVuY2VzID0+IHsKICAgICAgICAgICAgVW5pdFRlc3RQcmVmID0+IDEsCiAgICAgICAgfSwKICAgICk7CgogICAgJFNlbGYtPkZhbHNlKAogICAgICAgICRJdGVtTGlzdCwKICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBJdGVtTGlzdCgpIC0gQ2xhc3MgJENsYXNzIFByZWZlcmVuY2VzIG5vdCBtYXRjaCBhZnRlciBQcmVmZXJlbmNlc1NldCBDaGFuZ2UiCiAgICApOwoKICAgICRHZW5lcmFsQ2F0YWxvZ09iamVjdC0+SXRlbVVwZGF0ZSgKICAgICAgICBJdGVtSUQgID0+ICRJdGVtSUQsCiAgICAgICAgTmFtZSAgICA9PiAnSXRlbSBQcmVmZXJlbmNlcycsCiAgICAgICAgVmFsaWRJRCA9PiAyLAogICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICk7CgogICAgJFRlc3RDb3VudCsrOwp9CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgUHJlZmVyZW5jZXMgdGVzdCAyCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCj1wb2QKCm15ICVGdW5jdGlvbmFsaXR5TGlzdDE7Cm1hcCB7ICRGdW5jdGlvbmFsaXR5TGlzdDF7JF99ID0gMSB9IEBFeGlzdGluZ0Z1bmN0aW9uYWxpdGllczsKCmZvciBteSAkQ2xhc3MgKEBFeGlzdGluZ0NsYXNzZXMpIHsKCiAgICBteSAkRnVuY3Rpb25hbGl0eUxpc3QgPSAkR2VuZXJhbENhdGFsb2dPYmplY3QtPkZ1bmN0aW9uYWxpdHlMaXN0KAogICAgICAgIENsYXNzID0+ICRDbGFzcywKICAgICk7CgogICAgJFNlbGYtPlRydWUoCiAgICAgICAgJEZ1bmN0aW9uYWxpdHlMaXN0ICYmIHJlZiAkRnVuY3Rpb25hbGl0eUxpc3QgZXEgJ0FSUkFZJywKICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBGdW5jdGlvbmFsaXR5TGlzdCgpIC0gcmV0dXJuIGEgYXJyYXkgcmVmZXJlbmNlIiwKICAgICk7CgogICAgZm9yIG15ICRGdW5jdGlvbmFsaXR5ICggQHskRnVuY3Rpb25hbGl0eUxpc3R9ICkgewogICAgICAgIGRlbGV0ZSAkRnVuY3Rpb25hbGl0eUxpc3QxeyRGdW5jdGlvbmFsaXR5fTsKICAgIH0KCiAgICAkVGVzdENvdW50Kys7Cn0KCiRTZWxmLT5UcnVlKAogICAgIWtleXMgJUZ1bmN0aW9uYWxpdHlMaXN0MSwKICAgICJUZXN0ICRUZXN0Q291bnQ6IEZ1bmN0aW9uYWxpdHlMaXN0KCkiLAopOwoKJFRlc3RDb3VudCsrOwoKPWN1dAoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIENsYXNzUmVuYW1lIHRlc3QgMSAoY2hlY2sgbm9ybWFsIHJlbmFtZSkKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKQ0xBU1M6CmZvciBteSAkQ2xhc3MgKEBFeGlzdGluZ0NsYXNzZXMpIHsKCiAgICBteSAkT2xkSXRlbUxpc3QgPSAkR2VuZXJhbENhdGFsb2dPYmplY3QtPkl0ZW1MaXN0KAogICAgICAgIENsYXNzID0+ICRDbGFzcywKICAgICAgICBWYWxpZCA9PiAwLAogICAgKTsKCiAgICBteSAkU3VjY2VzcyA9ICRHZW5lcmFsQ2F0YWxvZ09iamVjdC0+Q2xhc3NSZW5hbWUoCiAgICAgICAgQ2xhc3NPbGQgPT4gJENsYXNzLAogICAgICAgIENsYXNzTmV3ID0+ICRDbGFzcyAuICdSRU5BTUUxJywKICAgICk7CgogICAgaWYgKCAhJFN1Y2Nlc3MgKSB7CiAgICAgICAgJFNlbGYtPkZhbHNlKAogICAgICAgICAgICAxLAogICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBDbGFzc1JlbmFtZSgpIC0gUmVuYW1lIGZhaWxlZCIsCiAgICAgICAgKTsKICAgICAgICBuZXh0IENMQVNTOwogICAgfQoKICAgIG15ICROZXdJdGVtTGlzdCA9ICRHZW5lcmFsQ2F0YWxvZ09iamVjdC0+SXRlbUxpc3QoCiAgICAgICAgQ2xhc3MgPT4gJENsYXNzIC4gJ1JFTkFNRTEnLAogICAgICAgIFZhbGlkID0+IDAsCiAgICApOwoKICAgIGlmICgKICAgICAgICAhJE9sZEl0ZW1MaXN0CiAgICAgICAgfHwgISROZXdJdGVtTGlzdAogICAgICAgIHx8IHJlZiAkT2xkSXRlbUxpc3QgbmUgJ0hBU0gnCiAgICAgICAgfHwgcmVmICROZXdJdGVtTGlzdCBuZSAnSEFTSCcKICAgICAgICApCiAgICB7CiAgICAgICAgJFNlbGYtPkZhbHNlKAogICAgICAgICAgICAxLAogICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBDbGFzc1JlbmFtZSgpIC0gSXRlbUxpc3QgZmFpbGVkIiwKICAgICAgICApOwogICAgICAgIG5leHQgQ0xBU1M7CiAgICB9CgogICAgT0xES0VZOgogICAgZm9yIG15ICRPbGRLZXkgKCBzb3J0IGtleXMgJXskT2xkSXRlbUxpc3R9ICkgewoKICAgICAgICBpZiAoICFleGlzdHMgJE5ld0l0ZW1MaXN0LT57JE9sZEtleX0gKSB7CiAgICAgICAgICAgICROZXdJdGVtTGlzdC0+e0ZhaWxlZER1bW15fSA9IDE7CiAgICAgICAgICAgIG5leHQgT0xES0VZOwogICAgICAgIH0KCiAgICAgICAgbmV4dCBPTERLRVkgaWYgJE9sZEl0ZW1MaXN0LT57JE9sZEtleX0gbmUgJE5ld0l0ZW1MaXN0LT57JE9sZEtleX07CgogICAgICAgIGRlbGV0ZSAkTmV3SXRlbUxpc3QtPnskT2xkS2V5fTsKICAgIH0KCiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAha2V5cyAleyROZXdJdGVtTGlzdH0sCiAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogQ2xhc3NSZW5hbWUoKSIsCiAgICApOwoKICAgICRUZXN0Q291bnQrKzsKfQoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIENsYXNzUmVuYW1lIHRlc3QgMiAoY2hlY2sgc3RyaW5nIGNsZWFuZXIgZnVuY3Rpb24pCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCkNMQVNTOgpmb3IgbXkgJENsYXNzIChARXhpc3RpbmdDbGFzc2VzKSB7CgogICAgbXkgJE9sZEl0ZW1MaXN0ID0gJEdlbmVyYWxDYXRhbG9nT2JqZWN0LT5JdGVtTGlzdCgKICAgICAgICBDbGFzcyA9PiAkQ2xhc3MgLiAnUkVOQU1FMScsCiAgICAgICAgVmFsaWQgPT4gMCwKICAgICk7CgogICAgbXkgJFN1Y2Nlc3MgPSAkR2VuZXJhbENhdGFsb2dPYmplY3QtPkNsYXNzUmVuYW1lKAogICAgICAgIENsYXNzT2xkID0+ICRDbGFzcyAuICdSRU5BTUUxJywKICAgICAgICBDbGFzc05ldyA9PiAnICcgLiAkQ2xhc3MgLiAiUkUgTkEgTUUgMiBcbiBcciBcdCAiLAogICAgKTsKCiAgICBpZiAoICEkU3VjY2VzcyApIHsKICAgICAgICAkU2VsZi0+RmFsc2UoCiAgICAgICAgICAgIDEsCiAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IENsYXNzUmVuYW1lKCkgLSBSZW5hbWUgZmFpbGVkIiwKICAgICAgICApOwogICAgICAgIG5leHQgQ0xBU1M7CiAgICB9CgogICAgbXkgJE5ld0l0ZW1MaXN0ID0gJEdlbmVyYWxDYXRhbG9nT2JqZWN0LT5JdGVtTGlzdCgKICAgICAgICBDbGFzcyA9PiAkQ2xhc3MgLiAnUkVOQU1FMicsCiAgICAgICAgVmFsaWQgPT4gMCwKICAgICk7CgogICAgaWYgKAogICAgICAgICEkT2xkSXRlbUxpc3QKICAgICAgICB8fCAhJE5ld0l0ZW1MaXN0CiAgICAgICAgfHwgcmVmICRPbGRJdGVtTGlzdCBuZSAnSEFTSCcKICAgICAgICB8fCByZWYgJE5ld0l0ZW1MaXN0IG5lICdIQVNIJwogICAgICAgICkKICAgIHsKICAgICAgICAkU2VsZi0+RmFsc2UoCiAgICAgICAgICAgIDEsCiAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IENsYXNzUmVuYW1lKCkgLSBJdGVtTGlzdCBmYWlsZWQiLAogICAgICAgICk7CiAgICAgICAgbmV4dCBDTEFTUzsKICAgIH0KCiAgICBPTERLRVk6CiAgICBmb3IgbXkgJE9sZEtleSAoIHNvcnQga2V5cyAleyRPbGRJdGVtTGlzdH0gKSB7CgogICAgICAgIGlmICggIWV4aXN0cyAkTmV3SXRlbUxpc3QtPnskT2xkS2V5fSApIHsKICAgICAgICAgICAgJE5ld0l0ZW1MaXN0LT57RmFpbGVkRHVtbXl9ID0gMTsKICAgICAgICAgICAgbmV4dCBPTERLRVk7CiAgICAgICAgfQoKICAgICAgICBuZXh0IE9MREtFWSBpZiAkT2xkSXRlbUxpc3QtPnskT2xkS2V5fSBuZSAkTmV3SXRlbUxpc3QtPnskT2xkS2V5fTsKCiAgICAgICAgZGVsZXRlICROZXdJdGVtTGlzdC0+eyRPbGRLZXl9OwogICAgfQoKICAgICRTZWxmLT5UcnVlKAogICAgICAgICFrZXlzICV7JE5ld0l0ZW1MaXN0fSwKICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBDbGFzc1JlbmFtZSgpIiwKICAgICk7CgogICAgJFRlc3RDb3VudCsrOwp9CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgQ2xhc3NSZW5hbWUgdGVzdCAyIChpZGVudGljYWwgbmFtZSB0ZXN0KQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgpmb3IgbXkgJENsYXNzIChARXhpc3RpbmdDbGFzc2VzKSB7CgogICAgbXkgJFN1Y2Nlc3MgPSAkR2VuZXJhbENhdGFsb2dPYmplY3QtPkNsYXNzUmVuYW1lKAogICAgICAgIENsYXNzT2xkID0+ICRDbGFzcyAuICdSRU5BTUUyJywKICAgICAgICBDbGFzc05ldyA9PiAkQ2xhc3MgLiAnUkVOQU1FMicsCiAgICApOwoKICAgICRTZWxmLT5UcnVlKAogICAgICAgICRTdWNjZXNzLAogICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IENsYXNzUmVuYW1lKCkgLSBvbGRuYW1lIGFuZCBuZXduYW1lIGlkZW50aWNhbCIsCiAgICApOwoKICAgICRUZXN0Q291bnQrKzsKfQoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIENsYXNzUmVuYW1lIHRlc3QgMyAobmV3IGNsYXNzIG5hbWUgYWxyZWFkeSBleGlzdHMpCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCiRHZW5lcmFsQ2F0YWxvZ09iamVjdC0+SXRlbUFkZCgKICAgIENsYXNzICAgICAgICAgPT4gJ1VuaXRUZXN0OjpUZXN0Q2xhc3MnIC4gJENsYXNzUmFuZFsyXSwKICAgIE5hbWUgICAgICAgICAgPT4gJ0R1bW15JywKICAgIEZ1bmN0aW9uYWxpdHkgPT4gJycsCiAgICBWYWxpZElEICAgICAgID0+IDEsCiAgICBVc2VySUQgICAgICAgID0+IDEsCik7Cgpmb3IgbXkgJENsYXNzIChARXhpc3RpbmdDbGFzc2VzKSB7CgogICAgbXkgJFN1Y2Nlc3MgPSAkR2VuZXJhbENhdGFsb2dPYmplY3QtPkNsYXNzUmVuYW1lKAogICAgICAgIENsYXNzT2xkID0+ICRDbGFzcyAuICdSRU5BTUUyJywKICAgICAgICBDbGFzc05ldyA9PiAnVW5pdFRlc3Q6OlRlc3RDbGFzcycgLiAkQ2xhc3NSYW5kWzJdLAogICAgKTsKCiAgICAkU2VsZi0+RmFsc2UoCiAgICAgICAgJFN1Y2Nlc3MsCiAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogQ2xhc3NSZW5hbWUoKSAtIG5ldyBjbGFzcyBuYW1lIGFscmVhZHkgZXhpc3RzIiwKICAgICk7CgogICAgJFRlc3RDb3VudCsrOwp9CgojIHJlc3RvcmUgb3JpZ2luYWwgZ2VuZXJhbCBjYXRhbG9nIHBlcm1pc3Npb24gcHJlZmVyZW5jZXMgc2V0dGluZwokQ29uZmlnT2JqZWN0LT5TZXQoCiAgICBLZXkgICA9PiAnR2VuZXJhbENhdGFsb2dQcmVmZXJlbmNlcyMjI1Blcm1pc3Npb25zJywKICAgIFZhbHVlID0+ICRHZW5lcmFsQ2F0YWxvZ1ByZWZlcmVuY2VzUGVybWlzc2lvbnNPcmcsCik7CgojIGNsZWFudXAgaXMgZG9uZSBieSBSZXN0b3JlRGF0YWJhc2UKCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE2IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7Cgp1c2UgdmFycyAocXcoJFNlbGYpKTsKCiMgZ2V0IHNlbGVuaXVtIG9iamVjdApteSAkU2VsZW5pdW0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OlNlbGVuaXVtJyk7CgokU2VsZW5pdW0tPlJ1blRlc3QoCiAgICBzdWIgewoKICAgICAgICAjIGdldCBoZWxwZXIgb2JqZWN0CiAgICAgICAgbXkgJEhlbHBlciA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6SGVscGVyJyk7CgogICAgICAgICMgZ2V0IHN5c2NvbmZpZyBvYmplY3QKICAgICAgICBteSAkU3lzQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlN5c0NvbmZpZycpOwoKICAgICAgICAkSGVscGVyLT5Db25maWdTZXR0aW5nQ2hhbmdlKAogICAgICAgICAgICBWYWxpZCA9PiAwLAogICAgICAgICAgICBLZXkgICA9PiAnR2VuZXJhbENhdGFsb2dQcmVmZXJlbmNlcyMjI0NvbW1lbnQyJywKICAgICAgICAgICAgVmFsdWUgPT4gewogICAgICAgICAgICAgICAgTW9kdWxlICA9PiAnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkdlbmVyYWxDYXRhbG9nUHJlZmVyZW5jZXM6OkdlbmVyaWMnLAogICAgICAgICAgICAgICAgTGFiZWwgICA9PiAnQ29tbWVudDInLAogICAgICAgICAgICAgICAgRGVzYyAgICA9PiAnRGVmaW5lIHRoZSBnZW5lcmFsIGNhdGFsb2cgY29tbWVudCAyLicsCiAgICAgICAgICAgICAgICBCbG9jayAgID0+ICdUZXh0QXJlYScsCiAgICAgICAgICAgICAgICBDb2xzICAgID0+ICc1MCcsCiAgICAgICAgICAgICAgICBSb3dzICAgID0+ICc1JywKICAgICAgICAgICAgICAgIFByZWZLZXkgPT4gJ0NvbW1lbnQyJywKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAkSGVscGVyLT5Db25maWdTZXR0aW5nQ2hhbmdlKAogICAgICAgICAgICBWYWxpZCA9PiAwLAogICAgICAgICAgICBLZXkgICA9PiAnR2VuZXJhbENhdGFsb2dQcmVmZXJlbmNlcyMjI1Blcm1pc3Npb25zJywKICAgICAgICAgICAgVmFsdWUgPT4gewogICAgICAgICAgICAgICAgTW9kdWxlICA9PiAnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkdlbmVyYWxDYXRhbG9nUHJlZmVyZW5jZXM6OkdlbmVyaWMnLAogICAgICAgICAgICAgICAgTGFiZWwgICA9PiAnUGVybWlzc2lvbnMnLAogICAgICAgICAgICAgICAgRGVzYyAgICA9PiAnRGVmaW5lIHRoZSBncm91cCB3aXRoIHBlcm1pc3Npb25zLicsCiAgICAgICAgICAgICAgICBCbG9jayAgID0+ICdQZXJtaXNzaW9uJywKICAgICAgICAgICAgICAgIENsYXNzICAgPT4gJ0lUU006OkNvbmZpZ0l0ZW06OkNsYXNzJywKICAgICAgICAgICAgICAgIFByZWZLZXkgPT4gJ1Blcm1pc3Npb25zJywKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAjIGNyZWF0ZSBhbmQgbG9nIGluIHRlc3QgdXNlcgogICAgICAgIG15ICRUZXN0VXNlckxvZ2luID0gJEhlbHBlci0+VGVzdFVzZXJDcmVhdGUoCiAgICAgICAgICAgIEdyb3VwcyA9PiBbJ2FkbWluJ10sCiAgICAgICAgKSB8fCBkaWUgIkRpZCBub3QgZ2V0IHRlc3QgdXNlciI7CgogICAgICAgICRTZWxlbml1bS0+TG9naW4oCiAgICAgICAgICAgIFR5cGUgICAgID0+ICdBZ2VudCcsCiAgICAgICAgICAgIFVzZXIgICAgID0+ICRUZXN0VXNlckxvZ2luLAogICAgICAgICAgICBQYXNzd29yZCA9PiAkVGVzdFVzZXJMb2dpbiwKICAgICAgICApOwoKICAgICAgICAjIGdldCBzY3JpcHQgYWxpYXMKICAgICAgICBteSAkU2NyaXB0QWxpYXMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ1NjcmlwdEFsaWFzJyk7CgogICAgICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAgICAgIyBUZXN0IGNhc2U6IENvbW1lbnQyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMKICAgICAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKICAgICAgICAjIG5hdmlnYXRlIHRvIEFkbWluR2VuZXJhbENhdGFsb2cgc2NyZWVuCiAgICAgICAgJFNlbGVuaXVtLT5WZXJpZmllZEdldCgiJHtTY3JpcHRBbGlhc31pbmRleC5wbD9BY3Rpb249QWRtaW5HZW5lcmFsQ2F0YWxvZyIpOwoKICAgICAgICAjIGNsaWNrICJBZGQgQ2F0YWxvZyBDbGFzcyIKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCgiLy9idXR0b25bXEB2YWx1ZT0nQWRkJ11bXEB0eXBlPSdzdWJtaXQnXSIpLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICMgdmVyaWZ5IHRoYXQgZ2VuZXJhbCBjYXRhbG9nIHByZWZlcmVuY2UgQ29tbWVudDIgaXMgbm90IHByZXNlbnQgd2hpbGUgaW52YWxpZAogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICBpbmRleCggJFNlbGVuaXVtLT5nZXRfcGFnZV9zb3VyY2UoKSwgIiNDb21tZW50MiIgKSA9PSAtMSwKICAgICAgICAgICAgIiNDb21tZW50MiBpcyBub3QgZW5hYmxlZCEiLAogICAgICAgICk7CgogICAgICAgICMgZ2V0IGdlbmVyYWwgY2F0YWxvZyBwcmVmZXJlbmNlIENvbW1lbnQyIGRlZmF1bHQgc3lzY29uZmlnCiAgICAgICAgbXkgJVByZWZlcmVuY2VDb21tZW50MkNvbmZpZyA9ICRTeXNDb25maWdPYmplY3QtPkNvbmZpZ0l0ZW1HZXQoCiAgICAgICAgICAgIE5hbWUgICAgPT4gJ0dlbmVyYWxDYXRhbG9nUHJlZmVyZW5jZXMjIyNDb21tZW50MicsCiAgICAgICAgICAgIERlZmF1bHQgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIHNldCBnZW5lcmFsIGNhdGFsb2cgcHJlZmVyZW5jZSBDb21tZW50MiB0byB2YWxpZAogICAgICAgIG15ICVQcmVmZXJlbmNlQ29tbWVudDJDb25maWdVcGRhdGUgPSBtYXAgeyAkXy0+e0tleX0gPT4gJF8tPntDb250ZW50fSB9CiAgICAgICAgICAgIGdyZXAgeyBkZWZpbmVkICRfLT57S2V5fSB9IEB7ICRQcmVmZXJlbmNlQ29tbWVudDJDb25maWd7U2V0dGluZ30tPlsxXS0+e0hhc2h9LT5bMV0tPntJdGVtfSB9OwoKICAgICAgICAkSGVscGVyLT5Db25maWdTZXR0aW5nQ2hhbmdlKAogICAgICAgICAgICBWYWxpZCA9PiAxLAogICAgICAgICAgICBLZXkgICA9PiAnR2VuZXJhbENhdGFsb2dQcmVmZXJlbmNlcyMjI0NvbW1lbnQyJywKICAgICAgICAgICAgVmFsdWUgPT4gXCVQcmVmZXJlbmNlQ29tbWVudDJDb25maWdVcGRhdGUsCiAgICAgICAgKTsKCiAgICAgICAgIyByZWZyZXNoIHNjcmVlbiBmb3Igc3lzY29uZmlnIHVwZGF0ZSB0byB0YWtlIGVmZmVjdAogICAgICAgICRTZWxlbml1bS0+VmVyaWZpZWRSZWZyZXNoKCk7CgogICAgICAgICMgdmVyaWZ5IHRoYXQgZ2VuZXJhbCBjYXRhbG9nIHByZWZlcmVuY2UgQ29tbWVudDIgaXMgcHJlc2VudCB3aGlsZSB2YWxpZAogICAgICAgIG15ICRTdWNjZXNzID0gJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIjQ29tbWVudDIiLCAnY3NzJyApLT5pc19lbmFibGVkKCk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRTdWNjZXNzLAogICAgICAgICAgICAiI0NvbW1lbnQyIGlzIGVuYWJsZWQhIiwKICAgICAgICApOwoKICAgICAgICAjIGNyZWF0ZSByZWFsIHRlc3QgY2F0YWxvZyBjbGFzcwogICAgICAgIG15ICRDYXRhbG9nQ2xhc3NEc2MgID0gIkNhdGFsb2dDbGFzc0RzYyIgLiAkSGVscGVyLT5HZXRSYW5kb21JRCgpOwogICAgICAgIG15ICRDYXRhbG9nQ2xhc3NOYW1lID0gIkNhdGFsb2dDbGFzc05hbWUiIC4gJEhlbHBlci0+R2V0UmFuZG9tSUQoKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiNDbGFzc0RzYyIsICdjc3MnICktPnNlbmRfa2V5cygkQ2F0YWxvZ0NsYXNzRHNjKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiNOYW1lIiwgICAgICdjc3MnICktPnNlbmRfa2V5cygkQ2F0YWxvZ0NsYXNzTmFtZSk7CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIjQ29tbWVudCIsICAnY3NzJyApLT5zZW5kX2tleXMoIlNlbGVuaXVtIGNhdGFsb2cgY2xhc3MiKTsKICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KCJcJCgnI1ZhbGlkSUQnKS52YWwoJzEnKS50cmlnZ2VyKCdyZWRyYXcuSW5wdXRGaWVsZCcpLnRyaWdnZXIoJ2NoYW5nZScpOyIpOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCIvL2J1dHRvbltcQHZhbHVlPSdTdWJtaXQnXVtcQHR5cGU9J3N1Ym1pdCddIiktPlZlcmlmaWVkQ2xpY2soKTsKCiAgICAgICAgIyBjbGljayAiQWRkIENhdGFsb2cgSXRlbSIKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCgiLy9idXR0b25bXEB2YWx1ZT0nQWRkJ11bXEB0eXBlPSdzdWJtaXQnXSIpLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICMgY3JlYXRlIHJlYWwgdGVzdCBjYXRhbG9nIGl0ZW0KICAgICAgICBteSAkQ2F0YWxvZ0NsYXNzSXRlbSA9ICJDYXRhbG9nQ2xhc3NJdGVtIiAuICRIZWxwZXItPkdldFJhbmRvbUlEKCk7CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIjTmFtZSIsICAgICdjc3MnICktPnNlbmRfa2V5cygkQ2F0YWxvZ0NsYXNzSXRlbSk7CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIjQ29tbWVudCIsICdjc3MnICktPnNlbmRfa2V5cygiU2VsZW5pdW0gY2F0YWxvZyBpdGVtIik7CiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgiXCQoJyNWYWxpZElEJykudmFsKCcxJykudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiKTsKCiAgICAgICAgIyBzZXQgaW5jbHVkZWQgcXVldWUgYXR0cmlidXRlIENvbW1lbnQyCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIjQ29tbWVudDIiLCAnY3NzJyApLT5zZW5kX2tleXMoJ0dlbmVyYWxDYXRhbG9nUHJlZmVyZW5jZXNHZW5lcmljIENvbW1lbnQyJyk7CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoIi8vYnV0dG9uW1xAdmFsdWU9J1N1Ym1pdCddW1xAdHlwZT0nc3VibWl0J10iKS0+VmVyaWZpZWRDbGljaygpOwoKICAgICAgICAjIGdldCB0ZXN0IGNhdGFsb2cgaXRlbXMgSURzCiAgICAgICAgbXkgQENhdGFsb2dJdGVtSURzOwogICAgICAgIGZvciBteSAkQ2F0YWxvZ0l0ZW1zICggJENhdGFsb2dDbGFzc05hbWUsICRDYXRhbG9nQ2xhc3NJdGVtICkgewogICAgICAgICAgICBteSAkQ2F0YWxvZ0NsYXNzSXRlbURhdGEgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2cnKS0+SXRlbUdldCgKICAgICAgICAgICAgICAgIENsYXNzID0+ICRDYXRhbG9nQ2xhc3NEc2MsCiAgICAgICAgICAgICAgICBOYW1lICA9PiAkQ2F0YWxvZ0l0ZW1zLAogICAgICAgICAgICApOwogICAgICAgICAgICBteSAkQ2F0YWxvZ0l0ZW1JRCA9ICRDYXRhbG9nQ2xhc3NJdGVtRGF0YS0+e0l0ZW1JRH07CiAgICAgICAgICAgIHB1c2ggQENhdGFsb2dJdGVtSURzLCAkQ2F0YWxvZ0l0ZW1JRDsKICAgICAgICB9CgogICAgICAgICMgY2hlY2sgbmV3IHRlc3QgY2F0YWxvZyBpdGVtIENvbW1lbnQyIHZhbHVlCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoCiAgICAgICAgICAgICIvL2FbY29udGFpbnMoXEBocmVmLCBcJ0FjdGlvbj1BZG1pbkdlbmVyYWxDYXRhbG9nO1N1YmFjdGlvbj1JdGVtRWRpdDtJdGVtSUQ9JENhdGFsb2dJdGVtSURzWzFdJyApXSIKICAgICAgICApLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICcjQ29tbWVudDInLCAnY3NzJyApLT5nZXRfdmFsdWUoKSwKICAgICAgICAgICAgJ0dlbmVyYWxDYXRhbG9nUHJlZmVyZW5jZXNHZW5lcmljIENvbW1lbnQyJywKICAgICAgICAgICAgIiNDb21tZW50MiBzdG9yZWQgdmFsdWUiLAogICAgICAgICk7CgogICAgICAgICMgdXBkYXRlIENvbW1lbnQyCiAgICAgICAgbXkgJFVwZGF0ZUNvbW1lbnQyID0gIlVwZGF0ZWQgY29tbWVudCBmb3IgR2VuZXJhbENhdGFsb2dQcmVmZXJlbmNlc0dlbmVyaWMgQ29tbWVudDIiOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiI0NvbW1lbnQyIiwgJ2NzcycgKS0+Y2xlYXIoKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiNDb21tZW50MiIsICdjc3MnICktPnNlbmRfa2V5cygkVXBkYXRlQ29tbWVudDIpOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCIvL2J1dHRvbltcQHZhbHVlPSdTdWJtaXQnXVtcQHR5cGU9J3N1Ym1pdCddIiktPlZlcmlmaWVkQ2xpY2soKTsKCiAgICAgICAgIyBjaGVjayB1cGRhdGVkIENvbW1lbnQyIHZhbHVlCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICRDYXRhbG9nQ2xhc3NJdGVtLCAnbGlua190ZXh0JyApLT5WZXJpZmllZENsaWNrKCk7CiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJyNDb21tZW50MicsICdjc3MnICktPmdldF92YWx1ZSgpLAogICAgICAgICAgICAkVXBkYXRlQ29tbWVudDIsCiAgICAgICAgICAgICIjQ29tbWVudDIgdXBkYXRlZCB2YWx1ZSIsCiAgICAgICAgKTsKCiAgICAgICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICAgICAjIFRlc3QgY2FzZTogUGVybWlzc2lvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIwogICAgICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgogICAgICAgICMgbmF2aWdhdGUgdG8gQWRtaW5HZW5lcmFsQ2F0YWxvZyBzY3JlZW4KICAgICAgICAkU2VsZW5pdW0tPlZlcmlmaWVkR2V0KCIke1NjcmlwdEFsaWFzfWluZGV4LnBsP0FjdGlvbj1BZG1pbkdlbmVyYWxDYXRhbG9nIik7CgogICAgICAgICMgY2xpY2sgb24gdGVzdCBDYXRhbG9nQ2xhc3MKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJENhdGFsb2dDbGFzc0RzYywgJ2xpbmtfdGV4dCcgKS0+VmVyaWZpZWRDbGljaygpOwoKICAgICAgICAjIGNsaWNrICJBZGQgQ2F0YWxvZyBJdGVtIgogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCIvL2J1dHRvbltcQHZhbHVlPSdBZGQnXVtcQHR5cGU9J3N1Ym1pdCddIiktPlZlcmlmaWVkQ2xpY2soKTsKCiAgICAgICAgIyB2ZXJpZnkgdGhhdCBnZW5lcmFsIGNhdGFsb2cgcHJlZmVyZW5jZSBQZXJtaXNzaW9ucyBpcyBub3QgcHJlc2VudCB3aGlsZSBpbnZhbGlkCiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgIGluZGV4KCAkU2VsZW5pdW0tPmdldF9wYWdlX3NvdXJjZSgpLCAiI1Blcm1pc3Npb25fU2VhcmNoIiApID09IC0xLAogICAgICAgICAgICAiI1Blcm1pc3Npb25zIGlzIG5vdCBlbmFibGVkISIsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgZ2VuZXJhbCBjYXRhbG9nIHByZWZlcmVuY2UgUGVybWlzc2lvbiBkZWZhdWx0IHN5c2NvbmZpZwogICAgICAgIG15ICVQcmVmZXJlbmNlUGVybWlzc2lvbnNDb25maWcgPSAkU3lzQ29uZmlnT2JqZWN0LT5Db25maWdJdGVtR2V0KAogICAgICAgICAgICBOYW1lICAgID0+ICdHZW5lcmFsQ2F0YWxvZ1ByZWZlcmVuY2VzIyMjUGVybWlzc2lvbnMnLAogICAgICAgICAgICBEZWZhdWx0ID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyBzZXQgQ2xhc3MgZm9yIEdlbmVyYWxDYXRhbG9nUHJlZmVyZW5jZXMjIyNQZXJtaXNzaW9ucyBhcyB0ZXN0IENhdGFsb2dDbGFzcwogICAgICAgICRQcmVmZXJlbmNlUGVybWlzc2lvbnNDb25maWd7U2V0dGluZ30tPlsxXS0+e0hhc2h9LT5bMV0tPntJdGVtfS0+WzVdLT57Q29udGVudH0gPSAkQ2F0YWxvZ0NsYXNzRHNjOwoKICAgICAgICAjIHNldCBnZW5lcmFsIGNhdGFsb2cgcHJlZmVyZW5jZSBQZXJtaXNzaW9uIHRvIHZhbGlkCiAgICAgICAgbXkgJVByZWZlcmVuY2VQZXJtaXNzaW9uc0NvbmZpZ1VwZGF0ZSA9IG1hcCB7ICRfLT57S2V5fSA9PiAkXy0+e0NvbnRlbnR9IH0KICAgICAgICAgICAgZ3JlcCB7IGRlZmluZWQgJF8tPntLZXl9IH0gQHsgJFByZWZlcmVuY2VQZXJtaXNzaW9uc0NvbmZpZ3tTZXR0aW5nfS0+WzFdLT57SGFzaH0tPlsxXS0+e0l0ZW19IH07CgogICAgICAgICRIZWxwZXItPkNvbmZpZ1NldHRpbmdDaGFuZ2UoCiAgICAgICAgICAgIFZhbGlkID0+IDEsCiAgICAgICAgICAgIEtleSAgID0+ICdHZW5lcmFsQ2F0YWxvZ1ByZWZlcmVuY2VzIyMjUGVybWlzc2lvbnMnLAogICAgICAgICAgICBWYWx1ZSA9PiBcJVByZWZlcmVuY2VQZXJtaXNzaW9uc0NvbmZpZ1VwZGF0ZSwKICAgICAgICApOwoKICAgICAgICAjIHJlZnJlc2ggc2NyZWVuIGZvciBzeXNjb25maWcgdXBkYXRlIHRvIHRha2UgZWZmZWN0CiAgICAgICAgJFNlbGVuaXVtLT5WZXJpZmllZFJlZnJlc2goKTsKCiAgICAgICAgIyB2ZXJpZnkgdGhhdCBnZW5lcmFsIGNhdGFsb2cgcHJlZmVyZW5jZSBQZXJtaXNzaW9ucyBpcyBwcmVzZW50IHdoaWxlIHZhbGlkCiAgICAgICAgJFN1Y2Nlc3MgPSAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiNQZXJtaXNzaW9uX1NlYXJjaCIsICdjc3MnICktPmlzX2VuYWJsZWQoKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFN1Y2Nlc3MsCiAgICAgICAgICAgICIjUGVybWlzc2lvbnMgaXMgZW5hYmxlZCEiLAogICAgICAgICk7CgogICAgICAgICMgZ2V0IERCIG9iamVjdAogICAgICAgIG15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwoKICAgICAgICAjIGRlbGV0ZSBjcmVhdGVkIHRlc3QgY2F0YWxvZyBjbGFzcwogICAgICAgIGZvciBteSAkQ2F0YWxvZ0l0ZW0gKEBDYXRhbG9nSXRlbUlEcykgewoKICAgICAgICAgICAgJFN1Y2Nlc3MgPSAkREJPYmplY3QtPkRvKAogICAgICAgICAgICAgICAgU1FMID0+ICJERUxFVEUgRlJPTSBnZW5lcmFsX2NhdGFsb2dfcHJlZmVyZW5jZXMgV0hFUkUgZ2VuZXJhbF9jYXRhbG9nX2lkID0gJENhdGFsb2dJdGVtIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICAkU3VjY2VzcywKICAgICAgICAgICAgICAgICJDYXRhbG9nSXRlbUlEICRDYXRhbG9nSXRlbSBwcmVmZXJlbmNlIC0gZGVsZXRlZCIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTdWNjZXNzID0gJERCT2JqZWN0LT5EbygKICAgICAgICAgICAgICAgIFNRTCA9PiAiREVMRVRFIEZST00gZ2VuZXJhbF9jYXRhbG9nIFdIRVJFIGlkID0gJENhdGFsb2dJdGVtIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICAkU3VjY2VzcywKICAgICAgICAgICAgICAgICJDYXRhbG9nSXRlbUlEICRDYXRhbG9nSXRlbSAtIGRlbGV0ZWQiLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBjbGVhbiB1cCBjYWNoZQogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5DbGVhblVwKCBUeXBlID0+ICdHZW5lcmFsQ2F0YWxvZycgKTsKICAgIH0KKTsKCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE2IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7Cgp1c2UgdmFycyAocXcoJFNlbGYpKTsKCiMgZ2V0IHNlbGVuaXVtIG9iamVjdApteSAkU2VsZW5pdW0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OlNlbGVuaXVtJyk7CgokU2VsZW5pdW0tPlJ1blRlc3QoCiAgICBzdWIgewoKICAgICAgICAjIGdldCBoZWxwZXIgb2JqZWN0CiAgICAgICAgbXkgJEhlbHBlciA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6SGVscGVyJyk7CgogICAgICAgICMgY3JlYXRlIGFuZCBsb2cgaW4gdGVzdCB1c2VyCiAgICAgICAgbXkgJFRlc3RVc2VyTG9naW4gPSAkSGVscGVyLT5UZXN0VXNlckNyZWF0ZSgKICAgICAgICAgICAgR3JvdXBzID0+IFsnYWRtaW4nXSwKICAgICAgICApIHx8IGRpZSAiRGlkIG5vdCBnZXQgdGVzdCB1c2VyIjsKCiAgICAgICAgJFNlbGVuaXVtLT5Mb2dpbigKICAgICAgICAgICAgVHlwZSAgICAgPT4gJ0FnZW50JywKICAgICAgICAgICAgVXNlciAgICAgPT4gJFRlc3RVc2VyTG9naW4sCiAgICAgICAgICAgIFBhc3N3b3JkID0+ICRUZXN0VXNlckxvZ2luLAogICAgICAgICk7CgogICAgICAgICMgZ2V0IHNjcmlwdCBhbGlhcwogICAgICAgIG15ICRTY3JpcHRBbGlhcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnU2NyaXB0QWxpYXMnKTsKCiAgICAgICAgIyBuYXZpZ2F0ZSB0byBBZG1pbkdlbmVyYWxDYXRhbG9nIHNjcmVlbgogICAgICAgICRTZWxlbml1bS0+VmVyaWZpZWRHZXQoIiR7U2NyaXB0QWxpYXN9aW5kZXgucGw/QWN0aW9uPUFkbWluR2VuZXJhbENhdGFsb2ciKTsKCiAgICAgICAgIyBjbGljayAiQWRkIENhdGFsb2cgQ2xhc3MiCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoIi8vYnV0dG9uW1xAdmFsdWU9J0FkZCddW1xAdHlwZT0nc3VibWl0J10iKS0+VmVyaWZpZWRDbGljaygpOwoKICAgICAgICAjIGNoZWNrIGZvciBpbnB1dCBmaWVsZHMKICAgICAgICBmb3IgbXkgJElEICgKICAgICAgICAgICAgcXcoQ2xhc3NEc2MgTmFtZSBWYWxpZElEIENvbW1lbnQpCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgIG15ICRFbGVtZW50ID0gJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIjJElEIiwgJ2NzcycgKTsKICAgICAgICAgICAgJEVsZW1lbnQtPmlzX2VuYWJsZWQoKTsKICAgICAgICAgICAgJEVsZW1lbnQtPmlzX2Rpc3BsYXllZCgpOwogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBjbGllbnQgc2lkZSB2YWxpZGF0aW9uCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIjTmFtZSIsICdjc3MnICktPmNsZWFyKCk7CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIjTmFtZSIsICdjc3MnICktPlZlcmlmaWVkU3VibWl0KCk7CiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAgICAgInJldHVybiBcJCgnI05hbWUnKS5oYXNDbGFzcygnRXJyb3InKSIKICAgICAgICAgICAgKSwKICAgICAgICAgICAgJzEnLAogICAgICAgICAgICAnQ2xpZW50IHNpZGUgdmFsaWRhdGlvbiBjb3JyZWN0bHkgZGV0ZWN0ZWQgbWlzc2luZyBpbnB1dCB2YWx1ZScsCiAgICAgICAgKTsKCiAgICAgICAgIyBjcmVhdGUgcmVhbCB0ZXN0IGNhdGFsb2cgY2xhc3MKICAgICAgICBteSAkQ2F0YWxvZ0NsYXNzRHNjICA9ICJDYXRhbG9nQ2xhc3NEc2MiIC4gJEhlbHBlci0+R2V0UmFuZG9tSUQoKTsKICAgICAgICBteSAkQ2F0YWxvZ0NsYXNzTmFtZSA9ICJDYXRhbG9nQ2xhc3NOYW1lIiAuICRIZWxwZXItPkdldFJhbmRvbUlEKCk7CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIjQ2xhc3NEc2MiLCAnY3NzJyApLT5zZW5kX2tleXMoJENhdGFsb2dDbGFzc0RzYyk7CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIjTmFtZSIsICAgICAnY3NzJyApLT5zZW5kX2tleXMoJENhdGFsb2dDbGFzc05hbWUpOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiI0NvbW1lbnQiLCAgJ2NzcycgKS0+c2VuZF9rZXlzKCJTZWxlbml1bSBjYXRhbG9nIGNsYXNzIik7CiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgiXCQoJyNWYWxpZElEJykudmFsKCcxJykudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCgiLy9idXR0b25bXEB2YWx1ZT0nU3VibWl0J11bXEB0eXBlPSdzdWJtaXQnXSIpLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICMgY2xpY2sgIkdvIHRvIG92ZXJ2aWV3IgogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCIvL2FbY29udGFpbnMoXEBocmVmLCBcJ0FjdGlvbj1BZG1pbkdlbmVyYWxDYXRhbG9nJyApXSIpLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICMgY2hlY2sgZm9yIGNyZWF0ZWQgdGVzdCBjYXRhbG9nIGNsYXNzIGluIEFkbWluR2VuZXJhbENhdGFsb2cgc2NyZWVuIGFuZCBjbGljayBvbiBpdAogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICBpbmRleCggJFNlbGVuaXVtLT5nZXRfcGFnZV9zb3VyY2UoKSwgJENhdGFsb2dDbGFzc0RzYyApID4gLTEsCiAgICAgICAgICAgICJDcmVhdGVkIHRlc3QgY2F0YWxvZyBjbGFzcyAkQ2F0YWxvZ0NsYXNzRHNjIC0gZm91bmQiLAogICAgICAgICk7CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoCiAgICAgICAgICAgICIvL2FbY29udGFpbnMoXEBocmVmLCBcJ0FjdGlvbj1BZG1pbkdlbmVyYWxDYXRhbG9nO1N1YmFjdGlvbj1JdGVtTGlzdDtDbGFzcz0kQ2F0YWxvZ0NsYXNzRHNjJyApXSIKICAgICAgICApLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICMgY2xpY2sgIkFkZCBDYXRhbG9nIEl0ZW0iCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoIi8vYnV0dG9uW1xAdmFsdWU9J0FkZCddW1xAdHlwZT0nc3VibWl0J10iKS0+VmVyaWZpZWRDbGljaygpOwoKICAgICAgICAjIGNoZWNrIGNsaWVudCBzaWRlIHZhbGlkYXRpb24KICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiNOYW1lIiwgJ2NzcycgKS0+Y2xlYXIoKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiNOYW1lIiwgJ2NzcycgKS0+VmVyaWZpZWRTdWJtaXQoKTsKICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICAgICAicmV0dXJuIFwkKCcjTmFtZScpLmhhc0NsYXNzKCdFcnJvcicpIgogICAgICAgICAgICApLAogICAgICAgICAgICAnMScsCiAgICAgICAgICAgICdDbGllbnQgc2lkZSB2YWxpZGF0aW9uIGNvcnJlY3RseSBkZXRlY3RlZCBtaXNzaW5nIGlucHV0IHZhbHVlJywKICAgICAgICApOwoKICAgICAgICAjIHRyeSB0byBjcmVhdGUgY2F0YWxvZyBpdGVtIHRoYXQgYWxyZWFkeSBleGlzdHMKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiNOYW1lIiwgJ2NzcycgKS0+c2VuZF9rZXlzKCRDYXRhbG9nQ2xhc3NOYW1lKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCgiLy9idXR0b25bXEB2YWx1ZT0nU3VibWl0J11bXEB0eXBlPSdzdWJtaXQnXSIpLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICMgdmVyaWZ5IGVycm9yIG1lc3NhZ2UKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgaW5kZXgoICRTZWxlbml1bS0+Z2V0X3BhZ2Vfc291cmNlKCksICdOZWVkIEl0ZW1JRCBPUiBDbGFzcyBhbmQgTmFtZSEnICkgPiAtMSwKICAgICAgICAgICAgIkVycm9yIG1lc3NhZ2UgLSBkaXNwbGF5ZWQiLAogICAgICAgICk7CgogICAgICAgICMgcmV0dXJuIGJhY2sgdG8gdGVzdCBjYXRhbG9nIGNsYXNzIHNjcmVlbiBhbmQgY2xpY2sgb24gIkFkZCBDYXRhbG9nIEl0ZW0iCiAgICAgICAgJFNlbGVuaXVtLT5WZXJpZmllZEdldCgKICAgICAgICAgICAgIiR7U2NyaXB0QWxpYXN9aW5kZXgucGw/QWN0aW9uPUFkbWluR2VuZXJhbENhdGFsb2c7U3ViYWN0aW9uPUl0ZW1MaXN0O0NsYXNzPSRDYXRhbG9nQ2xhc3NEc2MiCiAgICAgICAgKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCgiLy9idXR0b25bXEB2YWx1ZT0nQWRkJ11bXEB0eXBlPSdzdWJtaXQnXSIpLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICMgY3JlYXRlIHJlYWwgdGVzdCBjYXRhbG9nIGl0ZW0KICAgICAgICBteSAkQ2F0YWxvZ0NsYXNzSXRlbSA9ICJDYXRhbG9nQ2xhc3NJdGVtIiAuICRIZWxwZXItPkdldFJhbmRvbUlEKCk7CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIjTmFtZSIsICAgICdjc3MnICktPnNlbmRfa2V5cygkQ2F0YWxvZ0NsYXNzSXRlbSk7CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIjQ29tbWVudCIsICdjc3MnICktPnNlbmRfa2V5cygiU2VsZW5pdW0gY2F0YWxvZyBpdGVtIik7CiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgiXCQoJyNWYWxpZElEJykudmFsKCcxJykudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCgiLy9idXR0b25bXEB2YWx1ZT0nU3VibWl0J11bXEB0eXBlPSdzdWJtaXQnXSIpLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICMgZ2V0IHRlc3QgY2F0YWxvZyBpdGVtcyBJRHMKICAgICAgICBteSBAQ2F0YWxvZ0l0ZW1JRHM7CiAgICAgICAgZm9yIG15ICRDYXRhbG9nSXRlbXMgKCAkQ2F0YWxvZ0NsYXNzTmFtZSwgJENhdGFsb2dDbGFzc0l0ZW0gKSB7CiAgICAgICAgICAgIG15ICRDYXRhbG9nQ2xhc3NJdGVtRGF0YSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZycpLT5JdGVtR2V0KAogICAgICAgICAgICAgICAgQ2xhc3MgPT4gJENhdGFsb2dDbGFzc0RzYywKICAgICAgICAgICAgICAgIE5hbWUgID0+ICRDYXRhbG9nSXRlbXMsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG15ICRDYXRhbG9nSXRlbUlEID0gJENhdGFsb2dDbGFzc0l0ZW1EYXRhLT57SXRlbUlEfTsKICAgICAgICAgICAgcHVzaCBAQ2F0YWxvZ0l0ZW1JRHMsICRDYXRhbG9nSXRlbUlEOwogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBmb3IgY3JlYXRlZCB0ZXN0IGNhdGFsb2cgaXRlbSBhbmQgY2xpY2sgb24gaXQKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgaW5kZXgoICRTZWxlbml1bS0+Z2V0X3BhZ2Vfc291cmNlKCksICRDYXRhbG9nQ2xhc3NJdGVtICkgPiAtMSwKICAgICAgICAgICAgIkNyZWF0ZWQgdGVzdCBjYXRhbG9nIGl0ZW0gJENhdGFsb2dDbGFzc0l0ZW0gLSBmb3VuZCIsCiAgICAgICAgKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCgKICAgICAgICAgICAgIi8vYVtjb250YWlucyhcQGhyZWYsIFwnQWN0aW9uPUFkbWluR2VuZXJhbENhdGFsb2c7U3ViYWN0aW9uPUl0ZW1FZGl0O0l0ZW1JRD0kQ2F0YWxvZ0l0ZW1JRHNbMV0nICldIgogICAgICAgICktPlZlcmlmaWVkQ2xpY2soKTsKCiAgICAgICAgIyBjaGVjayBuZXcgdGVzdCBjYXRhbG9nIGl0ZW0gdmFsdWVzCiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJyNOYW1lJywgJ2NzcycgKS0+Z2V0X3ZhbHVlKCksCiAgICAgICAgICAgICRDYXRhbG9nQ2xhc3NJdGVtLAogICAgICAgICAgICAiI05hbWUgc3RvcmVkIHZhbHVlIiwKICAgICAgICApOwogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICcjQ29tbWVudCcsICdjc3MnICktPmdldF92YWx1ZSgpLAogICAgICAgICAgICAiU2VsZW5pdW0gY2F0YWxvZyBpdGVtIiwKICAgICAgICAgICAgIiNDb21tZW50IHN0b3JlZCB2YWx1ZSIsCiAgICAgICAgKTsKCiAgICAgICAgIyBlZGl0IG5hbWUgYW5kIGNvbW1lbnQKICAgICAgICBteSAkRWRpdENhdGFsb2dDbGFzc0l0ZW0gPSAiRWRpdCIgLiAkQ2F0YWxvZ0NsYXNzSXRlbTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiNOYW1lIiwgICAgJ2NzcycgKS0+Y2xlYXIoKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiNOYW1lIiwgICAgJ2NzcycgKS0+c2VuZF9rZXlzKCRFZGl0Q2F0YWxvZ0NsYXNzSXRlbSk7CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIjQ29tbWVudCIsICdjc3MnICktPnNlbmRfa2V5cygiIGVkaXQiKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCgiLy9idXR0b25bXEB2YWx1ZT0nU3VibWl0J11bXEB0eXBlPSdzdWJtaXQnXSIpLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICMgY2hlY2sgZWRpdGVkIHRlc3QgY2F0YWxvZyBpdGVtIHZhbHVlcwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAkRWRpdENhdGFsb2dDbGFzc0l0ZW0sICdsaW5rX3RleHQnICktPlZlcmlmaWVkQ2xpY2soKTsKICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnI05hbWUnLCAnY3NzJyApLT5nZXRfdmFsdWUoKSwKICAgICAgICAgICAgJEVkaXRDYXRhbG9nQ2xhc3NJdGVtLAogICAgICAgICAgICAiI05hbWUgdXBkYXRlZCB2YWx1ZSIsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnI0NvbW1lbnQnLCAnY3NzJyApLT5nZXRfdmFsdWUoKSwKICAgICAgICAgICAgIlNlbGVuaXVtIGNhdGFsb2cgaXRlbSBlZGl0IiwKICAgICAgICAgICAgIiNDb21tZW50IHVwZGF0ZWQgdmFsdWUiLAogICAgICAgICk7CgogICAgICAgICMgZ2V0IERCIG9iamVjdAogICAgICAgIG15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwoKICAgICAgICAjIGRlbGV0ZSBjcmVhdGVkIHRlc3QgY2F0YWxvZyBjbGFzcwogICAgICAgIGZvciBteSAkQ2F0YWxvZ0l0ZW0gKEBDYXRhbG9nSXRlbUlEcykgewoKICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkREJPYmplY3QtPkRvKAogICAgICAgICAgICAgICAgU1FMID0+ICJERUxFVEUgRlJPTSBnZW5lcmFsX2NhdGFsb2dfcHJlZmVyZW5jZXMgV0hFUkUgZ2VuZXJhbF9jYXRhbG9nX2lkID0gJENhdGFsb2dJdGVtIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICAkU3VjY2VzcywKICAgICAgICAgICAgICAgICJDYXRhbG9nSXRlbUlEICRDYXRhbG9nSXRlbSBwcmVmZXJlbmNlIC0gZGVsZXRlZCIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAkU3VjY2VzcyA9ICREQk9iamVjdC0+RG8oCiAgICAgICAgICAgICAgICBTUUwgPT4gIkRFTEVURSBGUk9NIGdlbmVyYWxfY2F0YWxvZyBXSEVSRSBpZCA9ICRDYXRhbG9nSXRlbSIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAgICAgJFN1Y2Nlc3MsCiAgICAgICAgICAgICAgICAiQ2F0YWxvZ0l0ZW1JRCAkQ2F0YWxvZ0l0ZW0gLSBkZWxldGVkIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgY2xlYW4gdXAgY2FjaGUKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+Q2xlYW5VcCggVHlwZSA9PiAnR2VuZXJhbENhdGFsb2cnICk7CiAgICB9Cik7CgoxOwo=
R0lGODlhBwALAKECAAAAAP///6g8eKg8eCH5BAEKAAIALAAAAAAHAAsAAAITTIQYcLnsgGxvijrxqdQq6DRJAQA7
R0lGODlhDwAPAKEBAAAAAP///////////yH5BAEKAAIALAAAAAAPAA8AAAIklB8Qx53b4otSUWcvyiz4/4AeQJbmKY4p1HHapBlwPL/uVRsFADs=
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Z0DHEEdB0+snd7lfPq9NpH/55K3+aAnpToJ2InbBnUOnf3Vad5r9uHyRSB5vXhwE+pOgY4ijoGf9L2nwgxoXOWtVrAT78okiBDkD2pXYkbUHSf+kipO8zof43OX8aOgY4hDo9A8ef+9KVcz41678F0AnzytR0OnSxFHJ6Xd0oZvTavfnQfsRf9bS/3/9z77+A2DdeCv3ceV0AAAAAElFTkSuQmCC
LyoqDQogKiBqc2NvbG9yLCBKYXZhU2NyaXB0IENvbG9yIFBpY2tlcg0KICoNCiAqIEB2ZXJzaW9uIDEuNC4xDQogKiBAbGljZW5zZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGh0dHA6Ly93d3cuZ251Lm9yZy9jb3B5bGVmdC9sZXNzZXIuaHRtbA0KICogQGF1dGhvciAgSmFuIE9kdmFya28sIGh0dHA6Ly9vZHZhcmtvLmN6DQogKiBAY3JlYXRlZCAyMDA4LTA2LTE1DQogKiBAdXBkYXRlZCAyMDEzLTA0LTA4DQogKiBAbGluayAgICBodHRwOi8vanNjb2xvci5jb20NCiAqLw0KDQoNCnZhciBqc2NvbG9yID0gew0KDQoNCglkaXIgOiAnJywgLy8gbG9jYXRpb24gb2YganNjb2xvciBkaXJlY3RvcnkgKGxlYXZlIGVtcHR5IHRvIGF1dG9kZXRlY3QpDQoJYmluZENsYXNzIDogJ2NvbG9yJywgLy8gY2xhc3MgbmFtZQ0KCWJpbmRpbmcgOiB0cnVlLCAvLyBhdXRvbWF0aWMgYmluZGluZyB2aWEgPGlucHV0IGNsYXNzPSIuLi4iPg0KCXByZWxvYWRpbmcgOiB0cnVlLCAvLyB1c2UgaW1hZ2UgcHJlbG9hZGluZz8NCg0KDQoJaW5zdGFsbCA6IGZ1bmN0aW9uKCkgew0KCQlqc2NvbG9yLmFkZEV2ZW50KHdpbmRvdywgJ2xvYWQnLCBqc2NvbG9yLmluaXQpOw0KCX0sDQoNCg0KCWluaXQgOiBmdW5jdGlvbigpIHsNCgkJaWYoanNjb2xvci5iaW5kaW5nKSB7DQoJCQlqc2NvbG9yLmJpbmQoKTsNCgkJfQ0KCQlpZihqc2NvbG9yLnByZWxvYWRpbmcpIHsNCgkJCWpzY29sb3IucHJlbG9hZCgpOw0KCQl9DQoJfSwNCg0KDQoJZ2V0RGlyIDogZnVuY3Rpb24oKSB7DQoJCWlmKCFqc2NvbG9yLmRpcikgew0KCQkJdmFyIGRldGVjdGVkID0ganNjb2xvci5kZXRlY3REaXIoKTsNCgkJCWpzY29sb3IuZGlyID0gZGV0ZWN0ZWQhPT1mYWxzZSA/IGRldGVjdGVkIDogJ2pzY29sb3IvJzsNCgkJfQ0KCQlyZXR1cm4ganNjb2xvci5kaXI7DQoJfSwNCg0KDQoJZGV0ZWN0RGlyIDogZnVuY3Rpb24oKSB7DQoJCXZhciBiYXNlID0gbG9jYXRpb24uaHJlZjsNCg0KCQl2YXIgZSA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdiYXNlJyk7DQoJCWZvcih2YXIgaT0wOyBpPGUubGVuZ3RoOyBpKz0xKSB7DQoJCQlpZihlW2ldLmhyZWYpIHsgYmFzZSA9IGVbaV0uaHJlZjsgfQ0KCQl9DQoNCgkJdmFyIGUgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnc2NyaXB0Jyk7DQoJCWZvcih2YXIgaT0wOyBpPGUubGVuZ3RoOyBpKz0xKSB7DQoJCQlpZihlW2ldLnNyYyAmJiAvKF58XC8panNjb2xvclwuanMoWz8jXS4qKT8kL2kudGVzdChlW2ldLnNyYykpIHsNCgkJCQl2YXIgc3JjID0gbmV3IGpzY29sb3IuVVJJKGVbaV0uc3JjKTsNCgkJCQl2YXIgc3JjQWJzID0gc3JjLnRvQWJzb2x1dGUoYmFzZSk7DQoJCQkJc3JjQWJzLnBhdGggPSBzcmNBYnMucGF0aC5yZXBsYWNlKC9bXlwvXSskLywgJycpOyAvLyByZW1vdmUgZmlsZW5hbWUNCgkJCQlzcmNBYnMucXVlcnkgPSBudWxsOw0KCQkJCXNyY0Ficy5mcmFnbWVudCA9IG51bGw7DQoJCQkJcmV0dXJuIHNyY0Ficy50b1N0cmluZygpOw0KCQkJfQ0KCQl9DQoJCXJldHVybiBmYWxzZTsNCgl9LA0KDQoNCgliaW5kIDogZnVuY3Rpb24oKSB7DQoJCXZhciBtYXRjaENsYXNzID0gbmV3IFJlZ0V4cCgnKF58XFxzKSgnK2pzY29sb3IuYmluZENsYXNzKycpXFxzKihcXHtbXn1dKlxcfSk/JywgJ2knKTsNCgkJdmFyIGUgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaW5wdXQnKTsNCgkJZm9yKHZhciBpPTA7IGk8ZS5sZW5ndGg7IGkrPTEpIHsNCgkJCXZhciBtOw0KCQkJaWYoIWVbaV0uY29sb3IgJiYgZVtpXS5jbGFzc05hbWUgJiYgKG0gPSBlW2ldLmNsYXNzTmFtZS5tYXRjaChtYXRjaENsYXNzKSkpIHsNCgkJCQl2YXIgcHJvcCA9IHt9Ow0KCQkJCWlmKG1bM10pIHsNCgkJCQkJdHJ5IHsNCgkJCQkJCXByb3AgPSAobmV3IEZ1bmN0aW9uICgncmV0dXJuICgnICsgbVszXSArICcpJykpKCk7DQoJCQkJCX0gY2F0Y2goZUludmFsaWRQcm9wKSB7fQ0KCQkJCX0NCgkJCQllW2ldLmNvbG9yID0gbmV3IGpzY29sb3IuY29sb3IoZVtpXSwgcHJvcCk7DQoJCQl9DQoJCX0NCgl9LA0KDQoNCglwcmVsb2FkIDogZnVuY3Rpb24oKSB7DQoJCWZvcih2YXIgZm4gaW4ganNjb2xvci5pbWdSZXF1aXJlKSB7DQoJCQlpZihqc2NvbG9yLmltZ1JlcXVpcmUuaGFzT3duUHJvcGVydHkoZm4pKSB7DQoJCQkJanNjb2xvci5sb2FkSW1hZ2UoZm4pOw0KCQkJfQ0KCQl9DQoJfSwNCg0KDQoJaW1hZ2VzIDogew0KCQlwYWQgOiBbIDE4MSwgMTAxIF0sDQoJCXNsZCA6IFsgMTYsIDEwMSBdLA0KCQljcm9zcyA6IFsgMTUsIDE1IF0sDQoJCWFycm93IDogWyA3LCAxMSBdDQoJfSwNCg0KDQoJaW1nUmVxdWlyZSA6IHt9LA0KCWltZ0xvYWRlZCA6IHt9LA0KDQoNCglyZXF1aXJlSW1hZ2UgOiBmdW5jdGlvbihmaWxlbmFtZSkgew0KCQlqc2NvbG9yLmltZ1JlcXVpcmVbZmlsZW5hbWVdID0gdHJ1ZTsNCgl9LA0KDQoNCglsb2FkSW1hZ2UgOiBmdW5jdGlvbihmaWxlbmFtZSkgew0KCQlpZighanNjb2xvci5pbWdMb2FkZWRbZmlsZW5hbWVdKSB7DQoJCQlqc2NvbG9yLmltZ0xvYWRlZFtmaWxlbmFtZV0gPSBuZXcgSW1hZ2UoKTsNCgkJCWpzY29sb3IuaW1nTG9hZGVkW2ZpbGVuYW1lXS5zcmMgPSBqc2NvbG9yLmdldERpcigpK2ZpbGVuYW1lOw0KCQl9DQoJfSwNCg0KDQoJZmV0Y2hFbGVtZW50IDogZnVuY3Rpb24obWl4ZWQpIHsNCgkJcmV0dXJuIHR5cGVvZiBtaXhlZCA9PT0gJ3N0cmluZycgPyBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChtaXhlZCkgOiBtaXhlZDsNCgl9LA0KDQoNCglhZGRFdmVudCA6IGZ1bmN0aW9uKGVsLCBldm50LCBmdW5jKSB7DQoJCWlmKGVsLmFkZEV2ZW50TGlzdGVuZXIpIHsNCgkJCWVsLmFkZEV2ZW50TGlzdGVuZXIoZXZudCwgZnVuYywgZmFsc2UpOw0KCQl9IGVsc2UgaWYoZWwuYXR0YWNoRXZlbnQpIHsNCgkJCWVsLmF0dGFjaEV2ZW50KCdvbicrZXZudCwgZnVuYyk7DQoJCX0NCgl9LA0KDQoNCglmaXJlRXZlbnQgOiBmdW5jdGlvbihlbCwgZXZudCkgew0KCQlpZighZWwpIHsNCgkJCXJldHVybjsNCgkJfQ0KCQlpZihkb2N1bWVudC5jcmVhdGVFdmVudCkgew0KCQkJdmFyIGV2ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0hUTUxFdmVudHMnKTsNCgkJCWV2LmluaXRFdmVudChldm50LCB0cnVlLCB0cnVlKTsNCgkJCWVsLmRpc3BhdGNoRXZlbnQoZXYpOw0KCQl9IGVsc2UgaWYoZG9jdW1lbnQuY3JlYXRlRXZlbnRPYmplY3QpIHsNCgkJCXZhciBldiA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50T2JqZWN0KCk7DQoJCQllbC5maXJlRXZlbnQoJ29uJytldm50LCBldik7DQoJCX0gZWxzZSBpZihlbFsnb24nK2V2bnRdKSB7IC8vIGFsdGVybmF0aXZlbHkgdXNlIHRoZSB0cmFkaXRpb25hbCBldmVudCBtb2RlbCAoSUU1KQ0KCQkJZWxbJ29uJytldm50XSgpOw0KCQl9DQoJfSwNCg0KDQoJZ2V0RWxlbWVudFBvcyA6IGZ1bmN0aW9uKGUpIHsNCgkJdmFyIGUxPWUsIGUyPWU7DQoJCXZhciB4PTAsIHk9MDsNCgkJaWYoZTEub2Zmc2V0UGFyZW50KSB7DQoJCQlkbyB7DQoJCQkJeCArPSBlMS5vZmZzZXRMZWZ0Ow0KCQkJCXkgKz0gZTEub2Zmc2V0VG9wOw0KCQkJfSB3aGlsZShlMSA9IGUxLm9mZnNldFBhcmVudCk7DQoJCX0NCgkJd2hpbGUoKGUyID0gZTIucGFyZW50Tm9kZSkgJiYgZTIubm9kZU5hbWUudG9VcHBlckNhc2UoKSAhPT0gJ0JPRFknKSB7DQoJCQl4IC09IGUyLnNjcm9sbExlZnQ7DQoJCQl5IC09IGUyLnNjcm9sbFRvcDsNCgkJfQ0KCQlyZXR1cm4gW3gsIHldOw0KCX0sDQoNCg0KCWdldEVsZW1lbnRTaXplIDogZnVuY3Rpb24oZSkgew0KCQlyZXR1cm4gW2Uub2Zmc2V0V2lkdGgsIGUub2Zmc2V0SGVpZ2h0XTsNCgl9LA0KDQoNCglnZXRSZWxNb3VzZVBvcyA6IGZ1bmN0aW9uKGUpIHsNCgkJdmFyIHggPSAwLCB5ID0gMDsNCgkJaWYgKCFlKSB7IGUgPSB3aW5kb3cuZXZlbnQ7IH0NCgkJaWYgKHR5cGVvZiBlLm9mZnNldFggPT09ICdudW1iZXInKSB7DQoJCQl4ID0gZS5vZmZzZXRYOw0KCQkJeSA9IGUub2Zmc2V0WTsNCgkJfSBlbHNlIGlmICh0eXBlb2YgZS5sYXllclggPT09ICdudW1iZXInKSB7DQoJCQl4ID0gZS5sYXllclg7DQoJCQl5ID0gZS5sYXllclk7DQoJCX0NCgkJcmV0dXJuIHsgeDogeCwgeTogeSB9Ow0KCX0sDQoNCg0KCWdldFZpZXdQb3MgOiBmdW5jdGlvbigpIHsNCgkJaWYodHlwZW9mIHdpbmRvdy5wYWdlWU9mZnNldCA9PT0gJ251bWJlcicpIHsNCgkJCXJldHVybiBbd2luZG93LnBhZ2VYT2Zmc2V0LCB3aW5kb3cucGFnZVlPZmZzZXRdOw0KCQl9IGVsc2UgaWYoZG9jdW1lbnQuYm9keSAmJiAoZG9jdW1lbnQuYm9keS5zY3JvbGxMZWZ0IHx8IGRvY3VtZW50LmJvZHkuc2Nyb2xsVG9wKSkgew0KCQkJcmV0dXJuIFtkb2N1bWVudC5ib2R5LnNjcm9sbExlZnQsIGRvY3VtZW50LmJvZHkuc2Nyb2xsVG9wXTsNCgkJfSBlbHNlIGlmKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCAmJiAoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbExlZnQgfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcCkpIHsNCgkJCXJldHVybiBbZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbExlZnQsIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3BdOw0KCQl9IGVsc2Ugew0KCQkJcmV0dXJuIFswLCAwXTsNCgkJfQ0KCX0sDQoNCg0KCWdldFZpZXdTaXplIDogZnVuY3Rpb24oKSB7DQoJCWlmKHR5cGVvZiB3aW5kb3cuaW5uZXJXaWR0aCA9PT0gJ251bWJlcicpIHsNCgkJCXJldHVybiBbd2luZG93LmlubmVyV2lkdGgsIHdpbmRvdy5pbm5lckhlaWdodF07DQoJCX0gZWxzZSBpZihkb2N1bWVudC5ib2R5ICYmIChkb2N1bWVudC5ib2R5LmNsaWVudFdpZHRoIHx8IGRvY3VtZW50LmJvZHkuY2xpZW50SGVpZ2h0KSkgew0KCQkJcmV0dXJuIFtkb2N1bWVudC5ib2R5LmNsaWVudFdpZHRoLCBkb2N1bWVudC5ib2R5LmNsaWVudEhlaWdodF07DQoJCX0gZWxzZSBpZihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQgJiYgKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSkgew0KCQkJcmV0dXJuIFtkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgsIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHRdOw0KCQl9IGVsc2Ugew0KCQkJcmV0dXJuIFswLCAwXTsNCgkJfQ0KCX0sDQoNCg0KCVVSSSA6IGZ1bmN0aW9uKHVyaSkgeyAvLyBTZWUgUkZDMzk4Ng0KDQoJCXRoaXMuc2NoZW1lID0gbnVsbDsNCgkJdGhpcy5hdXRob3JpdHkgPSBudWxsOw0KCQl0aGlzLnBhdGggPSAnJzsNCgkJdGhpcy5xdWVyeSA9IG51bGw7DQoJCXRoaXMuZnJhZ21lbnQgPSBudWxsOw0KDQoJCXRoaXMucGFyc2UgPSBmdW5jdGlvbih1cmkpIHsNCgkJCXZhciBtID0gdXJpLm1hdGNoKC9eKChbQS1aYS16XVswLTlBLVphLXorLi1dKikoOikpPygoXC9cLykoW15cLz8jXSopKT8oW14/I10qKSgoXD8pKFteI10qKSk/KCgjKSguKikpPy8pOw0KCQkJdGhpcy5zY2hlbWUgPSBtWzNdID8gbVsyXSA6IG51bGw7DQoJCQl0aGlzLmF1dGhvcml0eSA9IG1bNV0gPyBtWzZdIDogbnVsbDsNCgkJCXRoaXMucGF0aCA9IG1bN107DQoJCQl0aGlzLnF1ZXJ5ID0gbVs5XSA/IG1bMTBdIDogbnVsbDsNCgkJCXRoaXMuZnJhZ21lbnQgPSBtWzEyXSA/IG1bMTNdIDogbnVsbDsNCgkJCXJldHVybiB0aGlzOw0KCQl9Ow0KDQoJCXRoaXMudG9TdHJpbmcgPSBmdW5jdGlvbigpIHsNCgkJCXZhciByZXN1bHQgPSAnJzsNCgkJCWlmKHRoaXMuc2NoZW1lICE9PSBudWxsKSB7IHJlc3VsdCA9IHJlc3VsdCArIHRoaXMuc2NoZW1lICsgJzonOyB9DQoJCQlpZih0aGlzLmF1dGhvcml0eSAhPT0gbnVsbCkgeyByZXN1bHQgPSByZXN1bHQgKyAnLy8nICsgdGhpcy5hdXRob3JpdHk7IH0NCgkJCWlmKHRoaXMucGF0aCAhPT0gbnVsbCkgeyByZXN1bHQgPSByZXN1bHQgKyB0aGlzLnBhdGg7IH0NCgkJCWlmKHRoaXMucXVlcnkgIT09IG51bGwpIHsgcmVzdWx0ID0gcmVzdWx0ICsgJz8nICsgdGhpcy5xdWVyeTsgfQ0KCQkJaWYodGhpcy5mcmFnbWVudCAhPT0gbnVsbCkgeyByZXN1bHQgPSByZXN1bHQgKyAnIycgKyB0aGlzLmZyYWdtZW50OyB9DQoJCQlyZXR1cm4gcmVzdWx0Ow0KCQl9Ow0KDQoJCXRoaXMudG9BYnNvbHV0ZSA9IGZ1bmN0aW9uKGJhc2UpIHsNCgkJCXZhciBiYXNlID0gbmV3IGpzY29sb3IuVVJJKGJhc2UpOw0KCQkJdmFyIHIgPSB0aGlzOw0KCQkJdmFyIHQgPSBuZXcganNjb2xvci5VUkk7DQoNCgkJCWlmKGJhc2Uuc2NoZW1lID09PSBudWxsKSB7IHJldHVybiBmYWxzZTsgfQ0KDQoJCQlpZihyLnNjaGVtZSAhPT0gbnVsbCAmJiByLnNjaGVtZS50b0xvd2VyQ2FzZSgpID09PSBiYXNlLnNjaGVtZS50b0xvd2VyQ2FzZSgpKSB7DQoJCQkJci5zY2hlbWUgPSBudWxsOw0KCQkJfQ0KDQoJCQlpZihyLnNjaGVtZSAhPT0gbnVsbCkgew0KCQkJCXQuc2NoZW1lID0gci5zY2hlbWU7DQoJCQkJdC5hdXRob3JpdHkgPSByLmF1dGhvcml0eTsNCgkJCQl0LnBhdGggPSByZW1vdmVEb3RTZWdtZW50cyhyLnBhdGgpOw0KCQkJCXQucXVlcnkgPSByLnF1ZXJ5Ow0KCQkJfSBlbHNlIHsNCgkJCQlpZihyLmF1dGhvcml0eSAhPT0gbnVsbCkgew0KCQkJCQl0LmF1dGhvcml0eSA9IHIuYXV0aG9yaXR5Ow0KCQkJCQl0LnBhdGggPSByZW1vdmVEb3RTZWdtZW50cyhyLnBhdGgpOw0KCQkJCQl0LnF1ZXJ5ID0gci5xdWVyeTsNCgkJCQl9IGVsc2Ugew0KCQkJCQlpZihyLnBhdGggPT09ICcnKSB7DQoJCQkJCQl0LnBhdGggPSBiYXNlLnBhdGg7DQoJCQkJCQlpZihyLnF1ZXJ5ICE9PSBudWxsKSB7DQoJCQkJCQkJdC5xdWVyeSA9IHIucXVlcnk7DQoJCQkJCQl9IGVsc2Ugew0KCQkJCQkJCXQucXVlcnkgPSBiYXNlLnF1ZXJ5Ow0KCQkJCQkJfQ0KCQkJCQl9IGVsc2Ugew0KCQkJCQkJaWYoci5wYXRoLnN1YnN0cigwLDEpID09PSAnLycpIHsNCgkJCQkJCQl0LnBhdGggPSByZW1vdmVEb3RTZWdtZW50cyhyLnBhdGgpOw0KCQkJCQkJfSBlbHNlIHsNCgkJCQkJCQlpZihiYXNlLmF1dGhvcml0eSAhPT0gbnVsbCAmJiBiYXNlLnBhdGggPT09ICcnKSB7DQoJCQkJCQkJCXQucGF0aCA9ICcvJytyLnBhdGg7DQoJCQkJCQkJfSBlbHNlIHsNCgkJCQkJCQkJdC5wYXRoID0gYmFzZS5wYXRoLnJlcGxhY2UoL1teXC9dKyQvLCcnKStyLnBhdGg7DQoJCQkJCQkJfQ0KCQkJCQkJCXQucGF0aCA9IHJlbW92ZURvdFNlZ21lbnRzKHQucGF0aCk7DQoJCQkJCQl9DQoJCQkJCQl0LnF1ZXJ5ID0gci5xdWVyeTsNCgkJCQkJfQ0KCQkJCQl0LmF1dGhvcml0eSA9IGJhc2UuYXV0aG9yaXR5Ow0KCQkJCX0NCgkJCQl0LnNjaGVtZSA9IGJhc2Uuc2NoZW1lOw0KCQkJfQ0KCQkJdC5mcmFnbWVudCA9IHIuZnJhZ21lbnQ7DQoNCgkJCXJldHVybiB0Ow0KCQl9Ow0KDQoJCWZ1bmN0aW9uIHJlbW92ZURvdFNlZ21lbnRzKHBhdGgpIHsNCgkJCXZhciBvdXQgPSAnJzsNCgkJCXdoaWxlKHBhdGgpIHsNCgkJCQlpZihwYXRoLnN1YnN0cigwLDMpPT09Jy4uLycgfHwgcGF0aC5zdWJzdHIoMCwyKT09PScuLycpIHsNCgkJCQkJcGF0aCA9IHBhdGgucmVwbGFjZSgvXlwuKy8sJycpLnN1YnN0cigxKTsNCgkJCQl9IGVsc2UgaWYocGF0aC5zdWJzdHIoMCwzKT09PScvLi8nIHx8IHBhdGg9PT0nLy4nKSB7DQoJCQkJCXBhdGggPSAnLycrcGF0aC5zdWJzdHIoMyk7DQoJCQkJfSBlbHNlIGlmKHBhdGguc3Vic3RyKDAsNCk9PT0nLy4uLycgfHwgcGF0aD09PScvLi4nKSB7DQoJCQkJCXBhdGggPSAnLycrcGF0aC5zdWJzdHIoNCk7DQoJCQkJCW91dCA9IG91dC5yZXBsYWNlKC9cLz9bXlwvXSokLywgJycpOw0KCQkJCX0gZWxzZSBpZihwYXRoPT09Jy4nIHx8IHBhdGg9PT0nLi4nKSB7DQoJCQkJCXBhdGggPSAnJzsNCgkJCQl9IGVsc2Ugew0KCQkJCQl2YXIgcm0gPSBwYXRoLm1hdGNoKC9eXC8/W15cL10qLylbMF07DQoJCQkJCXBhdGggPSBwYXRoLnN1YnN0cihybS5sZW5ndGgpOw0KCQkJCQlvdXQgPSBvdXQgKyBybTsNCgkJCQl9DQoJCQl9DQoJCQlyZXR1cm4gb3V0Ow0KCQl9DQoNCgkJaWYodXJpKSB7DQoJCQl0aGlzLnBhcnNlKHVyaSk7DQoJCX0NCg0KCX0sDQoNCg0KCS8vDQoJLy8gVXNhZ2UgZXhhbXBsZToNCgkvLyB2YXIgbXlDb2xvciA9IG5ldyBqc2NvbG9yLmNvbG9yKG15SW5wdXRFbGVtZW50KQ0KCS8vDQoNCgljb2xvciA6IGZ1bmN0aW9uKHRhcmdldCwgcHJvcCkgew0KDQoNCgkJdGhpcy5yZXF1aXJlZCA9IHRydWU7IC8vIHJlZnVzZSBlbXB0eSB2YWx1ZXM/DQoJCXRoaXMuYWRqdXN0ID0gdHJ1ZTsgLy8gYWRqdXN0IHZhbHVlIHRvIHVuaWZvcm0gbm90YXRpb24/DQoJCXRoaXMuaGFzaCA9IGZhbHNlOyAvLyBwcmVmaXggY29sb3Igd2l0aCAjIHN5bWJvbD8NCgkJdGhpcy5jYXBzID0gdHJ1ZTsgLy8gdXBwZXJjYXNlPw0KCQl0aGlzLnNsaWRlciA9IHRydWU7IC8vIHNob3cgdGhlIHZhbHVlL3NhdHVyYXRpb24gc2xpZGVyPw0KCQl0aGlzLnZhbHVlRWxlbWVudCA9IHRhcmdldDsgLy8gdmFsdWUgaG9sZGVyDQoJCXRoaXMuc3R5bGVFbGVtZW50ID0gdGFyZ2V0OyAvLyB3aGVyZSB0byByZWZsZWN0IGN1cnJlbnQgY29sb3INCgkJdGhpcy5vbkltbWVkaWF0ZUNoYW5nZSA9IG51bGw7IC8vIG9uY2hhbmdlIGNhbGxiYWNrIChjYW4gYmUgZWl0aGVyIHN0cmluZyBvciBmdW5jdGlvbikNCgkJdGhpcy5oc3YgPSBbMCwgMCwgMV07IC8vIHJlYWQtb25seSAgMC02LCAwLTEsIDAtMQ0KCQl0aGlzLnJnYiA9IFsxLCAxLCAxXTsgLy8gcmVhZC1vbmx5ICAwLTEsIDAtMSwgMC0xDQoJCXRoaXMubWluSCA9IDA7IC8vIHJlYWQtb25seSAgMC02DQoJCXRoaXMubWF4SCA9IDY7IC8vIHJlYWQtb25seSAgMC02DQoJCXRoaXMubWluUyA9IDA7IC8vIHJlYWQtb25seSAgMC0xDQoJCXRoaXMubWF4UyA9IDE7IC8vIHJlYWQtb25seSAgMC0xDQoJCXRoaXMubWluViA9IDA7IC8vIHJlYWQtb25seSAgMC0xDQoJCXRoaXMubWF4ViA9IDE7IC8vIHJlYWQtb25seSAgMC0xDQoNCgkJdGhpcy5waWNrZXJPbmZvY3VzID0gdHJ1ZTsgLy8gZGlzcGxheSBwaWNrZXIgb24gZm9jdXM/DQoJCXRoaXMucGlja2VyTW9kZSA9ICdIU1YnOyAvLyBIU1YgfCBIVlMNCgkJdGhpcy5waWNrZXJQb3NpdGlvbiA9ICdib3R0b20nOyAvLyBsZWZ0IHwgcmlnaHQgfCB0b3AgfCBib3R0b20NCgkJdGhpcy5waWNrZXJTbWFydFBvc2l0aW9uID0gdHJ1ZTsgLy8gYXV0b21hdGljYWxseSBhZGp1c3QgcGlja2VyIHBvc2l0aW9uIHdoZW4gbmVjZXNzYXJ5DQoJCXRoaXMucGlja2VyQnV0dG9uSGVpZ2h0ID0gMjA7IC8vIHB4DQoJCXRoaXMucGlja2VyQ2xvc2FibGUgPSBmYWxzZTsNCgkJdGhpcy5waWNrZXJDbG9zZVRleHQgPSAnQ2xvc2UnOw0KCQl0aGlzLnBpY2tlckJ1dHRvbkNvbG9yID0gJ0J1dHRvblRleHQnOyAvLyBweA0KCQl0aGlzLnBpY2tlckZhY2UgPSAxMDsgLy8gcHgNCgkJdGhpcy5waWNrZXJGYWNlQ29sb3IgPSAnVGhyZWVERmFjZSc7IC8vIENTUyBjb2xvcg0KCQl0aGlzLnBpY2tlckJvcmRlciA9IDE7IC8vIHB4DQoJCXRoaXMucGlja2VyQm9yZGVyQ29sb3IgPSAnVGhyZWVESGlnaGxpZ2h0IFRocmVlRFNoYWRvdyBUaHJlZURTaGFkb3cgVGhyZWVESGlnaGxpZ2h0JzsgLy8gQ1NTIGNvbG9yDQoJCXRoaXMucGlja2VySW5zZXQgPSAxOyAvLyBweA0KCQl0aGlzLnBpY2tlckluc2V0Q29sb3IgPSAnVGhyZWVEU2hhZG93IFRocmVlREhpZ2hsaWdodCBUaHJlZURIaWdobGlnaHQgVGhyZWVEU2hhZG93JzsgLy8gQ1NTIGNvbG9yDQoJCXRoaXMucGlja2VyWkluZGV4ID0gMTAwMDA7DQoNCg0KCQlmb3IodmFyIHAgaW4gcHJvcCkgew0KCQkJaWYocHJvcC5oYXNPd25Qcm9wZXJ0eShwKSkgew0KCQkJCXRoaXNbcF0gPSBwcm9wW3BdOw0KCQkJfQ0KCQl9DQoNCg0KCQl0aGlzLmhpZGVQaWNrZXIgPSBmdW5jdGlvbigpIHsNCgkJCWlmKGlzUGlja2VyT3duZXIoKSkgew0KCQkJCXJlbW92ZVBpY2tlcigpOw0KCQkJfQ0KCQl9Ow0KDQoNCgkJdGhpcy5zaG93UGlja2VyID0gZnVuY3Rpb24oKSB7DQoJCQlpZighaXNQaWNrZXJPd25lcigpKSB7DQoJCQkJdmFyIHRwID0ganNjb2xvci5nZXRFbGVtZW50UG9zKHRhcmdldCk7IC8vIHRhcmdldCBwb3MNCgkJCQl2YXIgdHMgPSBqc2NvbG9yLmdldEVsZW1lbnRTaXplKHRhcmdldCk7IC8vIHRhcmdldCBzaXplDQoJCQkJdmFyIHZwID0ganNjb2xvci5nZXRWaWV3UG9zKCk7IC8vIHZpZXcgcG9zDQoJCQkJdmFyIHZzID0ganNjb2xvci5nZXRWaWV3U2l6ZSgpOyAvLyB2aWV3IHNpemUNCgkJCQl2YXIgcHMgPSBnZXRQaWNrZXJEaW1zKHRoaXMpOyAvLyBwaWNrZXIgc2l6ZQ0KCQkJCXZhciBhLCBiLCBjOw0KCQkJCXN3aXRjaCh0aGlzLnBpY2tlclBvc2l0aW9uLnRvTG93ZXJDYXNlKCkpIHsNCgkJCQkJY2FzZSAnbGVmdCc6IGE9MTsgYj0wOyBjPS0xOyBicmVhazsNCgkJCQkJY2FzZSAncmlnaHQnOmE9MTsgYj0wOyBjPTE7IGJyZWFrOw0KCQkJCQljYXNlICd0b3AnOiAgYT0wOyBiPTE7IGM9LTE7IGJyZWFrOw0KCQkJCQlkZWZhdWx0OiAgICAgYT0wOyBiPTE7IGM9MTsgYnJlYWs7DQoJCQkJfQ0KCQkJCXZhciBsID0gKHRzW2JdK3BzW2JdKS8yOw0KDQoJCQkJLy8gcGlja2VyIHBvcw0KCQkJCWlmICghdGhpcy5waWNrZXJTbWFydFBvc2l0aW9uKSB7DQoJCQkJCXZhciBwcCA9IFsNCgkJCQkJCXRwW2FdLA0KCQkJCQkJdHBbYl0rdHNbYl0tbCtsKmMNCgkJCQkJXTsNCgkJCQl9IGVsc2Ugew0KCQkJCQl2YXIgcHAgPSBbDQoJCQkJCQktdnBbYV0rdHBbYV0rcHNbYV0gPiB2c1thXSA/DQoJCQkJCQkJKC12cFthXSt0cFthXSt0c1thXS8yID4gdnNbYV0vMiAmJiB0cFthXSt0c1thXS1wc1thXSA+PSAwID8gdHBbYV0rdHNbYV0tcHNbYV0gOiB0cFthXSkgOg0KCQkJCQkJCXRwW2FdLA0KCQkJCQkJLXZwW2JdK3RwW2JdK3RzW2JdK3BzW2JdLWwrbCpjID4gdnNbYl0gPw0KCQkJCQkJCSgtdnBbYl0rdHBbYl0rdHNbYl0vMiA+IHZzW2JdLzIgJiYgdHBbYl0rdHNbYl0tbC1sKmMgPj0gMCA/IHRwW2JdK3RzW2JdLWwtbCpjIDogdHBbYl0rdHNbYl0tbCtsKmMpIDoNCgkJCQkJCQkodHBbYl0rdHNbYl0tbCtsKmMgPj0gMCA/IHRwW2JdK3RzW2JdLWwrbCpjIDogdHBbYl0rdHNbYl0tbC1sKmMpDQoJCQkJCV07DQoJCQkJfQ0KCQkJCWRyYXdQaWNrZXIocHBbYV0sIHBwW2JdKTsNCgkJCX0NCgkJfTsNCg0KDQoJCXRoaXMuaW1wb3J0Q29sb3IgPSBmdW5jdGlvbigpIHsNCgkJCWlmKCF2YWx1ZUVsZW1lbnQpIHsNCgkJCQl0aGlzLmV4cG9ydENvbG9yKCk7DQoJCQl9IGVsc2Ugew0KCQkJCWlmKCF0aGlzLmFkanVzdCkgew0KCQkJCQlpZighdGhpcy5mcm9tU3RyaW5nKHZhbHVlRWxlbWVudC52YWx1ZSwgbGVhdmVWYWx1ZSkpIHsNCgkJCQkJCXN0eWxlRWxlbWVudC5zdHlsZS5iYWNrZ3JvdW5kSW1hZ2UgPSBzdHlsZUVsZW1lbnQuanNjU3R5bGUuYmFja2dyb3VuZEltYWdlOw0KCQkJCQkJc3R5bGVFbGVtZW50LnN0eWxlLmJhY2tncm91bmRDb2xvciA9IHN0eWxlRWxlbWVudC5qc2NTdHlsZS5iYWNrZ3JvdW5kQ29sb3I7DQoJCQkJCQlzdHlsZUVsZW1lbnQuc3R5bGUuY29sb3IgPSBzdHlsZUVsZW1lbnQuanNjU3R5bGUuY29sb3I7DQoJCQkJCQl0aGlzLmV4cG9ydENvbG9yKGxlYXZlVmFsdWUgfCBsZWF2ZVN0eWxlKTsNCgkJCQkJfQ0KCQkJCX0gZWxzZSBpZighdGhpcy5yZXF1aXJlZCAmJiAvXlxzKiQvLnRlc3QodmFsdWVFbGVtZW50LnZhbHVlKSkgew0KCQkJCQl2YWx1ZUVsZW1lbnQudmFsdWUgPSAnJzsNCgkJCQkJc3R5bGVFbGVtZW50LnN0eWxlLmJhY2tncm91bmRJbWFnZSA9IHN0eWxlRWxlbWVudC5qc2NTdHlsZS5iYWNrZ3JvdW5kSW1hZ2U7DQoJCQkJCXN0eWxlRWxlbWVudC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSBzdHlsZUVsZW1lbnQuanNjU3R5bGUuYmFja2dyb3VuZENvbG9yOw0KCQkJCQlzdHlsZUVsZW1lbnQuc3R5bGUuY29sb3IgPSBzdHlsZUVsZW1lbnQuanNjU3R5bGUuY29sb3I7DQoJCQkJCXRoaXMuZXhwb3J0Q29sb3IobGVhdmVWYWx1ZSB8IGxlYXZlU3R5bGUpOw0KDQoJCQkJfSBlbHNlIGlmKHRoaXMuZnJvbVN0cmluZyh2YWx1ZUVsZW1lbnQudmFsdWUpKSB7DQoJCQkJCS8vIE9LDQoJCQkJfSBlbHNlIHsNCgkJCQkJdGhpcy5leHBvcnRDb2xvcigpOw0KCQkJCX0NCgkJCX0NCgkJfTsNCg0KDQoJCXRoaXMuZXhwb3J0Q29sb3IgPSBmdW5jdGlvbihmbGFncykgew0KCQkJaWYoIShmbGFncyAmIGxlYXZlVmFsdWUpICYmIHZhbHVlRWxlbWVudCkgew0KCQkJCXZhciB2YWx1ZSA9IHRoaXMudG9TdHJpbmcoKTsNCgkJCQlpZih0aGlzLmNhcHMpIHsgdmFsdWUgPSB2YWx1ZS50b1VwcGVyQ2FzZSgpOyB9DQoJCQkJaWYodGhpcy5oYXNoKSB7IHZhbHVlID0gJyMnK3ZhbHVlOyB9DQoJCQkJdmFsdWVFbGVtZW50LnZhbHVlID0gdmFsdWU7DQoJCQl9DQoJCQlpZighKGZsYWdzICYgbGVhdmVTdHlsZSkgJiYgc3R5bGVFbGVtZW50KSB7DQoJCQkJc3R5bGVFbGVtZW50LnN0eWxlLmJhY2tncm91bmRJbWFnZSA9ICJub25lIjsNCgkJCQlzdHlsZUVsZW1lbnQuc3R5bGUuYmFja2dyb3VuZENvbG9yID0NCgkJCQkJJyMnK3RoaXMudG9TdHJpbmcoKTsNCgkJCQlzdHlsZUVsZW1lbnQuc3R5bGUuY29sb3IgPQ0KCQkJCQkwLjIxMyAqIHRoaXMucmdiWzBdICsNCgkJCQkJMC43MTUgKiB0aGlzLnJnYlsxXSArDQoJCQkJCTAuMDcyICogdGhpcy5yZ2JbMl0NCgkJCQkJPCAwLjUgPyAnI0ZGRicgOiAnIzAwMCc7DQoJCQl9DQoJCQlpZighKGZsYWdzICYgbGVhdmVQYWQpICYmIGlzUGlja2VyT3duZXIoKSkgew0KCQkJCXJlZHJhd1BhZCgpOw0KCQkJfQ0KCQkJaWYoIShmbGFncyAmIGxlYXZlU2xkKSAmJiBpc1BpY2tlck93bmVyKCkpIHsNCgkJCQlyZWRyYXdTbGQoKTsNCgkJCX0NCgkJfTsNCg0KDQoJCXRoaXMuZnJvbUhTViA9IGZ1bmN0aW9uKGgsIHMsIHYsIGZsYWdzKSB7IC8vIG51bGwgPSBkb24ndCBjaGFuZ2UNCgkJCWlmKGggIT09IG51bGwpIHsgaCA9IE1hdGgubWF4KDAuMCwgdGhpcy5taW5ILCBNYXRoLm1pbig2LjAsIHRoaXMubWF4SCwgaCkpOyB9DQoJCQlpZihzICE9PSBudWxsKSB7IHMgPSBNYXRoLm1heCgwLjAsIHRoaXMubWluUywgTWF0aC5taW4oMS4wLCB0aGlzLm1heFMsIHMpKTsgfQ0KCQkJaWYodiAhPT0gbnVsbCkgeyB2ID0gTWF0aC5tYXgoMC4wLCB0aGlzLm1pblYsIE1hdGgubWluKDEuMCwgdGhpcy5tYXhWLCB2KSk7IH0NCg0KCQkJdGhpcy5yZ2IgPSBIU1ZfUkdCKA0KCQkJCWg9PT1udWxsID8gdGhpcy5oc3ZbMF0gOiAodGhpcy5oc3ZbMF09aCksDQoJCQkJcz09PW51bGwgPyB0aGlzLmhzdlsxXSA6ICh0aGlzLmhzdlsxXT1zKSwNCgkJCQl2PT09bnVsbCA/IHRoaXMuaHN2WzJdIDogKHRoaXMuaHN2WzJdPXYpDQoJCQkpOw0KDQoJCQl0aGlzLmV4cG9ydENvbG9yKGZsYWdzKTsNCgkJfTsNCg0KDQoJCXRoaXMuZnJvbVJHQiA9IGZ1bmN0aW9uKHIsIGcsIGIsIGZsYWdzKSB7IC8vIG51bGwgPSBkb24ndCBjaGFuZ2UNCgkJCWlmKHIgIT09IG51bGwpIHsgciA9IE1hdGgubWF4KDAuMCwgTWF0aC5taW4oMS4wLCByKSk7IH0NCgkJCWlmKGcgIT09IG51bGwpIHsgZyA9IE1hdGgubWF4KDAuMCwgTWF0aC5taW4oMS4wLCBnKSk7IH0NCgkJCWlmKGIgIT09IG51bGwpIHsgYiA9IE1hdGgubWF4KDAuMCwgTWF0aC5taW4oMS4wLCBiKSk7IH0NCg0KCQkJdmFyIGhzdiA9IFJHQl9IU1YoDQoJCQkJcj09PW51bGwgPyB0aGlzLnJnYlswXSA6IHIsDQoJCQkJZz09PW51bGwgPyB0aGlzLnJnYlsxXSA6IGcsDQoJCQkJYj09PW51bGwgPyB0aGlzLnJnYlsyXSA6IGINCgkJCSk7DQoJCQlpZihoc3ZbMF0gIT09IG51bGwpIHsNCgkJCQl0aGlzLmhzdlswXSA9IE1hdGgubWF4KDAuMCwgdGhpcy5taW5ILCBNYXRoLm1pbig2LjAsIHRoaXMubWF4SCwgaHN2WzBdKSk7DQoJCQl9DQoJCQlpZihoc3ZbMl0gIT09IDApIHsNCgkJCQl0aGlzLmhzdlsxXSA9IGhzdlsxXT09PW51bGwgPyBudWxsIDogTWF0aC5tYXgoMC4wLCB0aGlzLm1pblMsIE1hdGgubWluKDEuMCwgdGhpcy5tYXhTLCBoc3ZbMV0pKTsNCgkJCX0NCgkJCXRoaXMuaHN2WzJdID0gaHN2WzJdPT09bnVsbCA/IG51bGwgOiBNYXRoLm1heCgwLjAsIHRoaXMubWluViwgTWF0aC5taW4oMS4wLCB0aGlzLm1heFYsIGhzdlsyXSkpOw0KDQoJCQkvLyB1cGRhdGUgUkdCIGFjY29yZGluZyB0byBmaW5hbCBIU1YsIGFzIHNvbWUgdmFsdWVzIG1pZ2h0IGJlIHRyaW1tZWQNCgkJCXZhciByZ2IgPSBIU1ZfUkdCKHRoaXMuaHN2WzBdLCB0aGlzLmhzdlsxXSwgdGhpcy5oc3ZbMl0pOw0KCQkJdGhpcy5yZ2JbMF0gPSByZ2JbMF07DQoJCQl0aGlzLnJnYlsxXSA9IHJnYlsxXTsNCgkJCXRoaXMucmdiWzJdID0gcmdiWzJdOw0KDQoJCQl0aGlzLmV4cG9ydENvbG9yKGZsYWdzKTsNCgkJfTsNCg0KDQoJCXRoaXMuZnJvbVN0cmluZyA9IGZ1bmN0aW9uKGhleCwgZmxhZ3MpIHsNCgkJCXZhciBtID0gaGV4Lm1hdGNoKC9eXFcqKFswLTlBLUZdezN9KFswLTlBLUZdezN9KT8pXFcqJC9pKTsNCgkJCWlmKCFtKSB7DQoJCQkJcmV0dXJuIGZhbHNlOw0KCQkJfSBlbHNlIHsNCgkJCQlpZihtWzFdLmxlbmd0aCA9PT0gNikgeyAvLyA2LWNoYXIgbm90YXRpb24NCgkJCQkJdGhpcy5mcm9tUkdCKA0KCQkJCQkJcGFyc2VJbnQobVsxXS5zdWJzdHIoMCwyKSwxNikgLyAyNTUsDQoJCQkJCQlwYXJzZUludChtWzFdLnN1YnN0cigyLDIpLDE2KSAvIDI1NSwNCgkJCQkJCXBhcnNlSW50KG1bMV0uc3Vic3RyKDQsMiksMTYpIC8gMjU1LA0KCQkJCQkJZmxhZ3MNCgkJCQkJKTsNCgkJCQl9IGVsc2UgeyAvLyAzLWNoYXIgbm90YXRpb24NCgkJCQkJdGhpcy5mcm9tUkdCKA0KCQkJCQkJcGFyc2VJbnQobVsxXS5jaGFyQXQoMCkrbVsxXS5jaGFyQXQoMCksMTYpIC8gMjU1LA0KCQkJCQkJcGFyc2VJbnQobVsxXS5jaGFyQXQoMSkrbVsxXS5jaGFyQXQoMSksMTYpIC8gMjU1LA0KCQkJCQkJcGFyc2VJbnQobVsxXS5jaGFyQXQoMikrbVsxXS5jaGFyQXQoMiksMTYpIC8gMjU1LA0KCQkJCQkJZmxhZ3MNCgkJCQkJKTsNCgkJCQl9DQoJCQkJcmV0dXJuIHRydWU7DQoJCQl9DQoJCX07DQoNCg0KCQl0aGlzLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7DQoJCQlyZXR1cm4gKA0KCQkJCSgweDEwMCB8IE1hdGgucm91bmQoMjU1KnRoaXMucmdiWzBdKSkudG9TdHJpbmcoMTYpLnN1YnN0cigxKSArDQoJCQkJKDB4MTAwIHwgTWF0aC5yb3VuZCgyNTUqdGhpcy5yZ2JbMV0pKS50b1N0cmluZygxNikuc3Vic3RyKDEpICsNCgkJCQkoMHgxMDAgfCBNYXRoLnJvdW5kKDI1NSp0aGlzLnJnYlsyXSkpLnRvU3RyaW5nKDE2KS5zdWJzdHIoMSkNCgkJCSk7DQoJCX07DQoNCg0KCQlmdW5jdGlvbiBSR0JfSFNWKHIsIGcsIGIpIHsNCgkJCXZhciBuID0gTWF0aC5taW4oTWF0aC5taW4ocixnKSxiKTsNCgkJCXZhciB2ID0gTWF0aC5tYXgoTWF0aC5tYXgocixnKSxiKTsNCgkJCXZhciBtID0gdiAtIG47DQoJCQlpZihtID09PSAwKSB7IHJldHVybiBbIG51bGwsIDAsIHYgXTsgfQ0KCQkJdmFyIGggPSByPT09biA/IDMrKGItZykvbSA6IChnPT09biA/IDUrKHItYikvbSA6IDErKGctcikvbSk7DQoJCQlyZXR1cm4gWyBoPT09Nj8wOmgsIG0vdiwgdiBdOw0KCQl9DQoNCg0KCQlmdW5jdGlvbiBIU1ZfUkdCKGgsIHMsIHYpIHsNCgkJCWlmKGggPT09IG51bGwpIHsgcmV0dXJuIFsgdiwgdiwgdiBdOyB9DQoJCQl2YXIgaSA9IE1hdGguZmxvb3IoaCk7DQoJCQl2YXIgZiA9IGklMiA/IGgtaSA6IDEtKGgtaSk7DQoJCQl2YXIgbSA9IHYgKiAoMSAtIHMpOw0KCQkJdmFyIG4gPSB2ICogKDEgLSBzKmYpOw0KCQkJc3dpdGNoKGkpIHsNCgkJCQljYXNlIDY6DQoJCQkJY2FzZSAwOiByZXR1cm4gW3YsbixtXTsNCgkJCQljYXNlIDE6IHJldHVybiBbbix2LG1dOw0KCQkJCWNhc2UgMjogcmV0dXJuIFttLHYsbl07DQoJCQkJY2FzZSAzOiByZXR1cm4gW20sbix2XTsNCgkJCQljYXNlIDQ6IHJldHVybiBbbixtLHZdOw0KCQkJCWNhc2UgNTogcmV0dXJuIFt2LG0sbl07DQoJCQl9DQoJCX0NCg0KDQoJCWZ1bmN0aW9uIHJlbW92ZVBpY2tlcigpIHsNCgkJCWRlbGV0ZSBqc2NvbG9yLnBpY2tlci5vd25lcjsNCgkJCWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdib2R5JylbMF0ucmVtb3ZlQ2hpbGQoanNjb2xvci5waWNrZXIuYm94Qik7DQoJCX0NCg0KDQoJCWZ1bmN0aW9uIGRyYXdQaWNrZXIoeCwgeSkgew0KCQkJaWYoIWpzY29sb3IucGlja2VyKSB7DQoJCQkJanNjb2xvci5waWNrZXIgPSB7DQoJCQkJCWJveCA6IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpLA0KCQkJCQlib3hCIDogZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JyksDQoJCQkJCXBhZCA6IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpLA0KCQkJCQlwYWRCIDogZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JyksDQoJCQkJCXBhZE0gOiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSwNCgkJCQkJc2xkIDogZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JyksDQoJCQkJCXNsZEIgOiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSwNCgkJCQkJc2xkTSA6IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpLA0KCQkJCQlidG4gOiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSwNCgkJCQkJYnRuUyA6IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKSwNCgkJCQkJYnRuVCA6IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFRISVMucGlja2VyQ2xvc2VUZXh0KQ0KCQkJCX07DQoJCQkJZm9yKHZhciBpPTAsc2VnU2l6ZT00OyBpPGpzY29sb3IuaW1hZ2VzLnNsZFsxXTsgaSs9c2VnU2l6ZSkgew0KCQkJCQl2YXIgc2VnID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7DQoJCQkJCXNlZy5zdHlsZS5oZWlnaHQgPSBzZWdTaXplKydweCc7DQoJCQkJCXNlZy5zdHlsZS5mb250U2l6ZSA9ICcxcHgnOw0KCQkJCQlzZWcuc3R5bGUubGluZUhlaWdodCA9ICcwJzsNCgkJCQkJanNjb2xvci5waWNrZXIuc2xkLmFwcGVuZENoaWxkKHNlZyk7DQoJCQkJfQ0KCQkJCWpzY29sb3IucGlja2VyLnNsZEIuYXBwZW5kQ2hpbGQoanNjb2xvci5waWNrZXIuc2xkKTsNCgkJCQlqc2NvbG9yLnBpY2tlci5ib3guYXBwZW5kQ2hpbGQoanNjb2xvci5waWNrZXIuc2xkQik7DQoJCQkJanNjb2xvci5waWNrZXIuYm94LmFwcGVuZENoaWxkKGpzY29sb3IucGlja2VyLnNsZE0pOw0KCQkJCWpzY29sb3IucGlja2VyLnBhZEIuYXBwZW5kQ2hpbGQoanNjb2xvci5waWNrZXIucGFkKTsNCgkJCQlqc2NvbG9yLnBpY2tlci5ib3guYXBwZW5kQ2hpbGQoanNjb2xvci5waWNrZXIucGFkQik7DQoJCQkJanNjb2xvci5waWNrZXIuYm94LmFwcGVuZENoaWxkKGpzY29sb3IucGlja2VyLnBhZE0pOw0KCQkJCWpzY29sb3IucGlja2VyLmJ0blMuYXBwZW5kQ2hpbGQoanNjb2xvci5waWNrZXIuYnRuVCk7DQoJCQkJanNjb2xvci5waWNrZXIuYnRuLmFwcGVuZENoaWxkKGpzY29sb3IucGlja2VyLmJ0blMpOw0KCQkJCWpzY29sb3IucGlja2VyLmJveC5hcHBlbmRDaGlsZChqc2NvbG9yLnBpY2tlci5idG4pOw0KCQkJCWpzY29sb3IucGlja2VyLmJveEIuYXBwZW5kQ2hpbGQoanNjb2xvci5waWNrZXIuYm94KTsNCgkJCX0NCg0KCQkJdmFyIHAgPSBqc2NvbG9yLnBpY2tlcjsNCg0KCQkJLy8gY29udHJvbHMgaW50ZXJhY3Rpb24NCgkJCXAuYm94Lm9ubW91c2V1cCA9DQoJCQlwLmJveC5vbm1vdXNlb3V0ID0gZnVuY3Rpb24oKSB7IHRhcmdldC5mb2N1cygpOyB9Ow0KCQkJcC5ib3gub25tb3VzZWRvd24gPSBmdW5jdGlvbigpIHsgYWJvcnRCbHVyPXRydWU7IH07DQoJCQlwLmJveC5vbm1vdXNlbW92ZSA9IGZ1bmN0aW9uKGUpIHsNCgkJCQlpZiAoaG9sZFBhZCB8fCBob2xkU2xkKSB7DQoJCQkJCWhvbGRQYWQgJiYgc2V0UGFkKGUpOw0KCQkJCQlob2xkU2xkICYmIHNldFNsZChlKTsNCgkJCQkJaWYgKGRvY3VtZW50LnNlbGVjdGlvbikgew0KCQkJCQkJZG9jdW1lbnQuc2VsZWN0aW9uLmVtcHR5KCk7DQoJCQkJCX0gZWxzZSBpZiAod2luZG93LmdldFNlbGVjdGlvbikgew0KCQkJCQkJd2luZG93LmdldFNlbGVjdGlvbigpLnJlbW92ZUFsbFJhbmdlcygpOw0KCQkJCQl9DQoJCQkJCWRpc3BhdGNoSW1tZWRpYXRlQ2hhbmdlKCk7DQoJCQkJfQ0KCQkJfTsNCgkJCWlmKCdvbnRvdWNoc3RhcnQnIGluIHdpbmRvdykgeyAvLyBpZiB0b3VjaCBkZXZpY2UNCgkJCQlwLmJveC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCBmdW5jdGlvbihlKSB7DQoJCQkJCXZhciBldmVudD17DQoJCQkJCQknb2Zmc2V0WCc6IGUudG91Y2hlc1swXS5wYWdlWC10b3VjaE9mZnNldC5YLA0KCQkJCQkJJ29mZnNldFknOiBlLnRvdWNoZXNbMF0ucGFnZVktdG91Y2hPZmZzZXQuWQ0KCQkJCQl9Ow0KCQkJCQlpZiAoaG9sZFBhZCB8fCBob2xkU2xkKSB7DQoJCQkJCQlob2xkUGFkICYmIHNldFBhZChldmVudCk7DQoJCQkJCQlob2xkU2xkICYmIHNldFNsZChldmVudCk7DQoJCQkJCQlkaXNwYXRjaEltbWVkaWF0ZUNoYW5nZSgpOw0KCQkJCQl9DQoJCQkJCWUuc3RvcFByb3BhZ2F0aW9uKCk7IC8vIHByZXZlbnQgbW92ZSAidmlldyIgb24gYnJvc3dlcg0KCQkJCQllLnByZXZlbnREZWZhdWx0KCk7IC8vIHByZXZlbnQgRGVmYXVsdCAtIEFuZHJvaWQgRml4IChlbHNlIGFuZHJvaWQgZ2VuZXJhdGVkIG9ubHkgMS0yIHRvdWNobW92ZSBldmVudHMpDQoJCQkJfSwgZmFsc2UpOw0KCQkJfQ0KCQkJcC5wYWRNLm9ubW91c2V1cCA9DQoJCQlwLnBhZE0ub25tb3VzZW91dCA9IGZ1bmN0aW9uKCkgeyBpZihob2xkUGFkKSB7IGhvbGRQYWQ9ZmFsc2U7IGpzY29sb3IuZmlyZUV2ZW50KHZhbHVlRWxlbWVudCwnY2hhbmdlJyk7IH0gfTsNCgkJCXAucGFkTS5vbm1vdXNlZG93biA9IGZ1bmN0aW9uKGUpIHsNCgkJCQkvLyBpZiB0aGUgc2xpZGVyIGlzIGF0IHRoZSBib3R0b20sIG1vdmUgaXQgdXANCgkJCQlzd2l0Y2gobW9kZUlEKSB7DQoJCQkJCWNhc2UgMDogaWYgKFRISVMuaHN2WzJdID09PSAwKSB7IFRISVMuZnJvbUhTVihudWxsLCBudWxsLCAxLjApOyB9OyBicmVhazsNCgkJCQkJY2FzZSAxOiBpZiAoVEhJUy5oc3ZbMV0gPT09IDApIHsgVEhJUy5mcm9tSFNWKG51bGwsIDEuMCwgbnVsbCk7IH07IGJyZWFrOw0KCQkJCX0NCgkJCQlob2xkU2xkPWZhbHNlOw0KCQkJCWhvbGRQYWQ9dHJ1ZTsNCgkJCQlzZXRQYWQoZSk7DQoJCQkJZGlzcGF0Y2hJbW1lZGlhdGVDaGFuZ2UoKTsNCgkJCX07DQoJCQlpZignb250b3VjaHN0YXJ0JyBpbiB3aW5kb3cpIHsNCgkJCQlwLnBhZE0uYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIGZ1bmN0aW9uKGUpIHsNCgkJCQkJdG91Y2hPZmZzZXQ9ew0KCQkJCQkJJ1gnOiBlLnRhcmdldC5vZmZzZXRQYXJlbnQub2Zmc2V0TGVmdCwNCgkJCQkJCSdZJzogZS50YXJnZXQub2Zmc2V0UGFyZW50Lm9mZnNldFRvcA0KCQkJCQl9Ow0KCQkJCQl0aGlzLm9ubW91c2Vkb3duKHsNCgkJCQkJCSdvZmZzZXRYJzplLnRvdWNoZXNbMF0ucGFnZVgtdG91Y2hPZmZzZXQuWCwNCgkJCQkJCSdvZmZzZXRZJzplLnRvdWNoZXNbMF0ucGFnZVktdG91Y2hPZmZzZXQuWQ0KCQkJCQl9KTsNCgkJCQl9KTsNCgkJCX0NCgkJCXAuc2xkTS5vbm1vdXNldXAgPQ0KCQkJcC5zbGRNLm9ubW91c2VvdXQgPSBmdW5jdGlvbigpIHsgaWYoaG9sZFNsZCkgeyBob2xkU2xkPWZhbHNlOyBqc2NvbG9yLmZpcmVFdmVudCh2YWx1ZUVsZW1lbnQsJ2NoYW5nZScpOyB9IH07DQoJCQlwLnNsZE0ub25tb3VzZWRvd24gPSBmdW5jdGlvbihlKSB7DQoJCQkJaG9sZFBhZD1mYWxzZTsNCgkJCQlob2xkU2xkPXRydWU7DQoJCQkJc2V0U2xkKGUpOw0KCQkJCWRpc3BhdGNoSW1tZWRpYXRlQ2hhbmdlKCk7DQoJCQl9Ow0KCQkJaWYoJ29udG91Y2hzdGFydCcgaW4gd2luZG93KSB7DQoJCQkJcC5zbGRNLmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCBmdW5jdGlvbihlKSB7DQoJCQkJCXRvdWNoT2Zmc2V0PXsNCgkJCQkJCSdYJzogZS50YXJnZXQub2Zmc2V0UGFyZW50Lm9mZnNldExlZnQsDQoJCQkJCQknWSc6IGUudGFyZ2V0Lm9mZnNldFBhcmVudC5vZmZzZXRUb3ANCgkJCQkJfTsNCgkJCQkJdGhpcy5vbm1vdXNlZG93bih7DQoJCQkJCQknb2Zmc2V0WCc6ZS50b3VjaGVzWzBdLnBhZ2VYLXRvdWNoT2Zmc2V0LlgsDQoJCQkJCQknb2Zmc2V0WSc6ZS50b3VjaGVzWzBdLnBhZ2VZLXRvdWNoT2Zmc2V0LlkNCgkJCQkJfSk7DQoJCQkJfSk7DQoJCQl9DQoNCgkJCS8vIHBpY2tlcg0KCQkJdmFyIGRpbXMgPSBnZXRQaWNrZXJEaW1zKFRISVMpOw0KCQkJcC5ib3guc3R5bGUud2lkdGggPSBkaW1zWzBdICsgJ3B4JzsNCgkJCXAuYm94LnN0eWxlLmhlaWdodCA9IGRpbXNbMV0gKyAncHgnOw0KDQoJCQkvLyBwaWNrZXIgYm9yZGVyDQoJCQlwLmJveEIuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnOw0KCQkJcC5ib3hCLnN0eWxlLmNsZWFyID0gJ2JvdGgnOw0KCQkJcC5ib3hCLnN0eWxlLmxlZnQgPSB4KydweCc7DQoJCQlwLmJveEIuc3R5bGUudG9wID0geSsncHgnOw0KCQkJcC5ib3hCLnN0eWxlLnpJbmRleCA9IFRISVMucGlja2VyWkluZGV4Ow0KCQkJcC5ib3hCLnN0eWxlLmJvcmRlciA9IFRISVMucGlja2VyQm9yZGVyKydweCBzb2xpZCc7DQoJCQlwLmJveEIuc3R5bGUuYm9yZGVyQ29sb3IgPSBUSElTLnBpY2tlckJvcmRlckNvbG9yOw0KCQkJcC5ib3hCLnN0eWxlLmJhY2tncm91bmQgPSBUSElTLnBpY2tlckZhY2VDb2xvcjsNCg0KCQkJLy8gcGFkIGltYWdlDQoJCQlwLnBhZC5zdHlsZS53aWR0aCA9IGpzY29sb3IuaW1hZ2VzLnBhZFswXSsncHgnOw0KCQkJcC5wYWQuc3R5bGUuaGVpZ2h0ID0ganNjb2xvci5pbWFnZXMucGFkWzFdKydweCc7DQoNCgkJCS8vIHBhZCBib3JkZXINCgkJCXAucGFkQi5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7DQoJCQlwLnBhZEIuc3R5bGUubGVmdCA9IFRISVMucGlja2VyRmFjZSsncHgnOw0KCQkJcC5wYWRCLnN0eWxlLnRvcCA9IFRISVMucGlja2VyRmFjZSsncHgnOw0KCQkJcC5wYWRCLnN0eWxlLmJvcmRlciA9IFRISVMucGlja2VySW5zZXQrJ3B4IHNvbGlkJzsNCgkJCXAucGFkQi5zdHlsZS5ib3JkZXJDb2xvciA9IFRISVMucGlja2VySW5zZXRDb2xvcjsNCg0KCQkJLy8gcGFkIG1vdXNlIGFyZWENCgkJCXAucGFkTS5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7DQoJCQlwLnBhZE0uc3R5bGUubGVmdCA9ICcwJzsNCgkJCXAucGFkTS5zdHlsZS50b3AgPSAnMCc7DQoJCQlwLnBhZE0uc3R5bGUud2lkdGggPSBUSElTLnBpY2tlckZhY2UgKyAyKlRISVMucGlja2VySW5zZXQgKyBqc2NvbG9yLmltYWdlcy5wYWRbMF0gKyBqc2NvbG9yLmltYWdlcy5hcnJvd1swXSArICdweCc7DQoJCQlwLnBhZE0uc3R5bGUuaGVpZ2h0ID0gcC5ib3guc3R5bGUuaGVpZ2h0Ow0KCQkJcC5wYWRNLnN0eWxlLmN1cnNvciA9ICdjcm9zc2hhaXInOw0KDQoJCQkvLyBzbGlkZXIgaW1hZ2UNCgkJCXAuc2xkLnN0eWxlLm92ZXJmbG93ID0gJ2hpZGRlbic7DQoJCQlwLnNsZC5zdHlsZS53aWR0aCA9IGpzY29sb3IuaW1hZ2VzLnNsZFswXSsncHgnOw0KCQkJcC5zbGQuc3R5bGUuaGVpZ2h0ID0ganNjb2xvci5pbWFnZXMuc2xkWzFdKydweCc7DQoNCgkJCS8vIHNsaWRlciBib3JkZXINCgkJCXAuc2xkQi5zdHlsZS5kaXNwbGF5ID0gVEhJUy5zbGlkZXIgPyAnYmxvY2snIDogJ25vbmUnOw0KCQkJcC5zbGRCLnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJzsNCgkJCXAuc2xkQi5zdHlsZS5yaWdodCA9IFRISVMucGlja2VyRmFjZSsncHgnOw0KCQkJcC5zbGRCLnN0eWxlLnRvcCA9IFRISVMucGlja2VyRmFjZSsncHgnOw0KCQkJcC5zbGRCLnN0eWxlLmJvcmRlciA9IFRISVMucGlja2VySW5zZXQrJ3B4IHNvbGlkJzsNCgkJCXAuc2xkQi5zdHlsZS5ib3JkZXJDb2xvciA9IFRISVMucGlja2VySW5zZXRDb2xvcjsNCg0KCQkJLy8gc2xpZGVyIG1vdXNlIGFyZWENCgkJCXAuc2xkTS5zdHlsZS5kaXNwbGF5ID0gVEhJUy5zbGlkZXIgPyAnYmxvY2snIDogJ25vbmUnOw0KCQkJcC5zbGRNLnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJzsNCgkJCXAuc2xkTS5zdHlsZS5yaWdodCA9ICcwJzsNCgkJCXAuc2xkTS5zdHlsZS50b3AgPSAnMCc7DQoJCQlwLnNsZE0uc3R5bGUud2lkdGggPSBqc2NvbG9yLmltYWdlcy5zbGRbMF0gKyBqc2NvbG9yLmltYWdlcy5hcnJvd1swXSArIFRISVMucGlja2VyRmFjZSArIDIqVEhJUy5waWNrZXJJbnNldCArICdweCc7DQoJCQlwLnNsZE0uc3R5bGUuaGVpZ2h0ID0gcC5ib3guc3R5bGUuaGVpZ2h0Ow0KCQkJdHJ5IHsNCgkJCQlwLnNsZE0uc3R5bGUuY3Vyc29yID0gJ3BvaW50ZXInOw0KCQkJfSBjYXRjaChlT2xkSUUpIHsNCgkJCQlwLnNsZE0uc3R5bGUuY3Vyc29yID0gJ2hhbmQnOw0KCQkJfQ0KDQoJCQkvLyAiY2xvc2UiIGJ1dHRvbg0KCQkJZnVuY3Rpb24gc2V0QnRuQm9yZGVyKCkgew0KCQkJCXZhciBpbnNldENvbG9ycyA9IFRISVMucGlja2VySW5zZXRDb2xvci5zcGxpdCgvXHMrLyk7DQoJCQkJdmFyIHBpY2tlck91dHNldENvbG9yID0gaW5zZXRDb2xvcnMubGVuZ3RoIDwgMiA/IGluc2V0Q29sb3JzWzBdIDogaW5zZXRDb2xvcnNbMV0gKyAnICcgKyBpbnNldENvbG9yc1swXSArICcgJyArIGluc2V0Q29sb3JzWzBdICsgJyAnICsgaW5zZXRDb2xvcnNbMV07DQoJCQkJcC5idG4uc3R5bGUuYm9yZGVyQ29sb3IgPSBwaWNrZXJPdXRzZXRDb2xvcjsNCgkJCX0NCgkJCXAuYnRuLnN0eWxlLmRpc3BsYXkgPSBUSElTLnBpY2tlckNsb3NhYmxlID8gJ2Jsb2NrJyA6ICdub25lJzsNCgkJCXAuYnRuLnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJzsNCgkJCXAuYnRuLnN0eWxlLmxlZnQgPSBUSElTLnBpY2tlckZhY2UgKyAncHgnOw0KCQkJcC5idG4uc3R5bGUuYm90dG9tID0gVEhJUy5waWNrZXJGYWNlICsgJ3B4JzsNCgkJCXAuYnRuLnN0eWxlLnBhZGRpbmcgPSAnMCAxNXB4JzsNCgkJCXAuYnRuLnN0eWxlLmhlaWdodCA9ICcxOHB4JzsNCgkJCXAuYnRuLnN0eWxlLmJvcmRlciA9IFRISVMucGlja2VySW5zZXQgKyAncHggc29saWQnOw0KCQkJc2V0QnRuQm9yZGVyKCk7DQoJCQlwLmJ0bi5zdHlsZS5jb2xvciA9IFRISVMucGlja2VyQnV0dG9uQ29sb3I7DQoJCQlwLmJ0bi5zdHlsZS5mb250ID0gJzEycHggc2Fucy1zZXJpZic7DQoJCQlwLmJ0bi5zdHlsZS50ZXh0QWxpZ24gPSAnY2VudGVyJzsNCgkJCXRyeSB7DQoJCQkJcC5idG4uc3R5bGUuY3Vyc29yID0gJ3BvaW50ZXInOw0KCQkJfSBjYXRjaChlT2xkSUUpIHsNCgkJCQlwLmJ0bi5zdHlsZS5jdXJzb3IgPSAnaGFuZCc7DQoJCQl9DQoJCQlwLmJ0bi5vbm1vdXNlZG93biA9IGZ1bmN0aW9uICgpIHsNCgkJCQlUSElTLmhpZGVQaWNrZXIoKTsNCgkJCX07DQoJCQlwLmJ0blMuc3R5bGUubGluZUhlaWdodCA9IHAuYnRuLnN0eWxlLmhlaWdodDsNCg0KCQkJLy8gbG9hZCBpbWFnZXMgaW4gb3B0aW1hbCBvcmRlcg0KCQkJc3dpdGNoKG1vZGVJRCkgew0KCQkJCWNhc2UgMDogdmFyIHBhZEltZyA9ICdocy5wbmcnOyBicmVhazsNCgkJCQljYXNlIDE6IHZhciBwYWRJbWcgPSAnaHYucG5nJzsgYnJlYWs7DQoJCQl9DQoJCQlwLnBhZE0uc3R5bGUuYmFja2dyb3VuZEltYWdlID0gInVybCgnIitqc2NvbG9yLmdldERpcigpKyJjcm9zcy5naWYnKSI7DQoJCQlwLnBhZE0uc3R5bGUuYmFja2dyb3VuZFJlcGVhdCA9ICJuby1yZXBlYXQiOw0KCQkJcC5zbGRNLnN0eWxlLmJhY2tncm91bmRJbWFnZSA9ICJ1cmwoJyIranNjb2xvci5nZXREaXIoKSsiYXJyb3cuZ2lmJykiOw0KCQkJcC5zbGRNLnN0eWxlLmJhY2tncm91bmRSZXBlYXQgPSAibm8tcmVwZWF0IjsNCgkJCXAucGFkLnN0eWxlLmJhY2tncm91bmRJbWFnZSA9ICJ1cmwoJyIranNjb2xvci5nZXREaXIoKStwYWRJbWcrIicpIjsNCgkJCXAucGFkLnN0eWxlLmJhY2tncm91bmRSZXBlYXQgPSAibm8tcmVwZWF0IjsNCgkJCXAucGFkLnN0eWxlLmJhY2tncm91bmRQb3NpdGlvbiA9ICIwIDAiOw0KDQoJCQkvLyBwbGFjZSBwb2ludGVycw0KCQkJcmVkcmF3UGFkKCk7DQoJCQlyZWRyYXdTbGQoKTsNCg0KCQkJanNjb2xvci5waWNrZXIub3duZXIgPSBUSElTOw0KCQkJZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2JvZHknKVswXS5hcHBlbmRDaGlsZChwLmJveEIpOw0KCQl9DQoNCg0KCQlmdW5jdGlvbiBnZXRQaWNrZXJEaW1zKG8pIHsNCgkJCXZhciBkaW1zID0gWw0KCQkJCTIqby5waWNrZXJJbnNldCArIDIqby5waWNrZXJGYWNlICsganNjb2xvci5pbWFnZXMucGFkWzBdICsNCgkJCQkJKG8uc2xpZGVyID8gMipvLnBpY2tlckluc2V0ICsgMipqc2NvbG9yLmltYWdlcy5hcnJvd1swXSArIGpzY29sb3IuaW1hZ2VzLnNsZFswXSA6IDApLA0KCQkJCW8ucGlja2VyQ2xvc2FibGUgPw0KCQkJCQk0Km8ucGlja2VySW5zZXQgKyAzKm8ucGlja2VyRmFjZSArIGpzY29sb3IuaW1hZ2VzLnBhZFsxXSArIG8ucGlja2VyQnV0dG9uSGVpZ2h0IDoNCgkJCQkJMipvLnBpY2tlckluc2V0ICsgMipvLnBpY2tlckZhY2UgKyBqc2NvbG9yLmltYWdlcy5wYWRbMV0NCgkJCV07DQoJCQlyZXR1cm4gZGltczsNCgkJfQ0KDQoNCgkJZnVuY3Rpb24gcmVkcmF3UGFkKCkgew0KCQkJLy8gcmVkcmF3IHRoZSBwYWQgcG9pbnRlcg0KCQkJc3dpdGNoKG1vZGVJRCkgew0KCQkJCWNhc2UgMDogdmFyIHlDb21wb25lbnQgPSAxOyBicmVhazsNCgkJCQljYXNlIDE6IHZhciB5Q29tcG9uZW50ID0gMjsgYnJlYWs7DQoJCQl9DQoJCQl2YXIgeCA9IE1hdGgucm91bmQoKFRISVMuaHN2WzBdLzYpICogKGpzY29sb3IuaW1hZ2VzLnBhZFswXS0xKSk7DQoJCQl2YXIgeSA9IE1hdGgucm91bmQoKDEtVEhJUy5oc3ZbeUNvbXBvbmVudF0pICogKGpzY29sb3IuaW1hZ2VzLnBhZFsxXS0xKSk7DQoJCQlqc2NvbG9yLnBpY2tlci5wYWRNLnN0eWxlLmJhY2tncm91bmRQb3NpdGlvbiA9DQoJCQkJKFRISVMucGlja2VyRmFjZStUSElTLnBpY2tlckluc2V0K3ggLSBNYXRoLmZsb29yKGpzY29sb3IuaW1hZ2VzLmNyb3NzWzBdLzIpKSArICdweCAnICsNCgkJCQkoVEhJUy5waWNrZXJGYWNlK1RISVMucGlja2VySW5zZXQreSAtIE1hdGguZmxvb3IoanNjb2xvci5pbWFnZXMuY3Jvc3NbMV0vMikpICsgJ3B4JzsNCg0KCQkJLy8gcmVkcmF3IHRoZSBzbGlkZXIgaW1hZ2UNCgkJCXZhciBzZWcgPSBqc2NvbG9yLnBpY2tlci5zbGQuY2hpbGROb2RlczsNCg0KCQkJc3dpdGNoKG1vZGVJRCkgew0KCQkJCWNhc2UgMDoNCgkJCQkJdmFyIHJnYiA9IEhTVl9SR0IoVEhJUy5oc3ZbMF0sIFRISVMuaHN2WzFdLCAxKTsNCgkJCQkJZm9yKHZhciBpPTA7IGk8c2VnLmxlbmd0aDsgaSs9MSkgew0KCQkJCQkJc2VnW2ldLnN0eWxlLmJhY2tncm91bmRDb2xvciA9ICdyZ2IoJysNCgkJCQkJCQkocmdiWzBdKigxLWkvc2VnLmxlbmd0aCkqMTAwKSsnJSwnKw0KCQkJCQkJCShyZ2JbMV0qKDEtaS9zZWcubGVuZ3RoKSoxMDApKyclLCcrDQoJCQkJCQkJKHJnYlsyXSooMS1pL3NlZy5sZW5ndGgpKjEwMCkrJyUpJzsNCgkJCQkJfQ0KCQkJCQlicmVhazsNCgkJCQljYXNlIDE6DQoJCQkJCXZhciByZ2IsIHMsIGMgPSBbIFRISVMuaHN2WzJdLCAwLCAwIF07DQoJCQkJCXZhciBpID0gTWF0aC5mbG9vcihUSElTLmhzdlswXSk7DQoJCQkJCXZhciBmID0gaSUyID8gVEhJUy5oc3ZbMF0taSA6IDEtKFRISVMuaHN2WzBdLWkpOw0KCQkJCQlzd2l0Y2goaSkgew0KCQkJCQkJY2FzZSA2Og0KCQkJCQkJY2FzZSAwOiByZ2I9WzAsMSwyXTsgYnJlYWs7DQoJCQkJCQljYXNlIDE6IHJnYj1bMSwwLDJdOyBicmVhazsNCgkJCQkJCWNhc2UgMjogcmdiPVsyLDAsMV07IGJyZWFrOw0KCQkJCQkJY2FzZSAzOiByZ2I9WzIsMSwwXTsgYnJlYWs7DQoJCQkJCQljYXNlIDQ6IHJnYj1bMSwyLDBdOyBicmVhazsNCgkJCQkJCWNhc2UgNTogcmdiPVswLDIsMV07IGJyZWFrOw0KCQkJCQl9DQoJCQkJCWZvcih2YXIgaT0wOyBpPHNlZy5sZW5ndGg7IGkrPTEpIHsNCgkJCQkJCXMgPSAxIC0gMS8oc2VnLmxlbmd0aC0xKSppOw0KCQkJCQkJY1sxXSA9IGNbMF0gKiAoMSAtIHMqZik7DQoJCQkJCQljWzJdID0gY1swXSAqICgxIC0gcyk7DQoJCQkJCQlzZWdbaV0uc3R5bGUuYmFja2dyb3VuZENvbG9yID0gJ3JnYignKw0KCQkJCQkJCShjW3JnYlswXV0qMTAwKSsnJSwnKw0KCQkJCQkJCShjW3JnYlsxXV0qMTAwKSsnJSwnKw0KCQkJCQkJCShjW3JnYlsyXV0qMTAwKSsnJSknOw0KCQkJCQl9DQoJCQkJCWJyZWFrOw0KCQkJfQ0KCQl9DQoNCg0KCQlmdW5jdGlvbiByZWRyYXdTbGQoKSB7DQoJCQkvLyByZWRyYXcgdGhlIHNsaWRlciBwb2ludGVyDQoJCQlzd2l0Y2gobW9kZUlEKSB7DQoJCQkJY2FzZSAwOiB2YXIgeUNvbXBvbmVudCA9IDI7IGJyZWFrOw0KCQkJCWNhc2UgMTogdmFyIHlDb21wb25lbnQgPSAxOyBicmVhazsNCgkJCX0NCgkJCXZhciB5ID0gTWF0aC5yb3VuZCgoMS1USElTLmhzdlt5Q29tcG9uZW50XSkgKiAoanNjb2xvci5pbWFnZXMuc2xkWzFdLTEpKTsNCgkJCWpzY29sb3IucGlja2VyLnNsZE0uc3R5bGUuYmFja2dyb3VuZFBvc2l0aW9uID0NCgkJCQknMCAnICsgKFRISVMucGlja2VyRmFjZStUSElTLnBpY2tlckluc2V0K3kgLSBNYXRoLmZsb29yKGpzY29sb3IuaW1hZ2VzLmFycm93WzFdLzIpKSArICdweCc7DQoJCX0NCg0KDQoJCWZ1bmN0aW9uIGlzUGlja2VyT3duZXIoKSB7DQoJCQlyZXR1cm4ganNjb2xvci5waWNrZXIgJiYganNjb2xvci5waWNrZXIub3duZXIgPT09IFRISVM7DQoJCX0NCg0KDQoJCWZ1bmN0aW9uIGJsdXJUYXJnZXQoKSB7DQoJCQlpZih2YWx1ZUVsZW1lbnQgPT09IHRhcmdldCkgew0KCQkJCVRISVMuaW1wb3J0Q29sb3IoKTsNCgkJCX0NCgkJCWlmKFRISVMucGlja2VyT25mb2N1cykgew0KCQkJCVRISVMuaGlkZVBpY2tlcigpOw0KCQkJfQ0KCQl9DQoNCg0KCQlmdW5jdGlvbiBibHVyVmFsdWUoKSB7DQoJCQlpZih2YWx1ZUVsZW1lbnQgIT09IHRhcmdldCkgew0KCQkJCVRISVMuaW1wb3J0Q29sb3IoKTsNCgkJCX0NCgkJfQ0KDQoNCgkJZnVuY3Rpb24gc2V0UGFkKGUpIHsNCgkJCXZhciBtcG9zID0ganNjb2xvci5nZXRSZWxNb3VzZVBvcyhlKTsNCgkJCXZhciB4ID0gbXBvcy54IC0gVEhJUy5waWNrZXJGYWNlIC0gVEhJUy5waWNrZXJJbnNldDsNCgkJCXZhciB5ID0gbXBvcy55IC0gVEhJUy5waWNrZXJGYWNlIC0gVEhJUy5waWNrZXJJbnNldDsNCgkJCXN3aXRjaChtb2RlSUQpIHsNCgkJCQljYXNlIDA6IFRISVMuZnJvbUhTVih4Kig2Lyhqc2NvbG9yLmltYWdlcy5wYWRbMF0tMSkpLCAxIC0geS8oanNjb2xvci5pbWFnZXMucGFkWzFdLTEpLCBudWxsLCBsZWF2ZVNsZCk7IGJyZWFrOw0KCQkJCWNhc2UgMTogVEhJUy5mcm9tSFNWKHgqKDYvKGpzY29sb3IuaW1hZ2VzLnBhZFswXS0xKSksIG51bGwsIDEgLSB5Lyhqc2NvbG9yLmltYWdlcy5wYWRbMV0tMSksIGxlYXZlU2xkKTsgYnJlYWs7DQoJCQl9DQoJCX0NCg0KDQoJCWZ1bmN0aW9uIHNldFNsZChlKSB7DQoJCQl2YXIgbXBvcyA9IGpzY29sb3IuZ2V0UmVsTW91c2VQb3MoZSk7DQoJCQl2YXIgeSA9IG1wb3MueSAtIFRISVMucGlja2VyRmFjZSAtIFRISVMucGlja2VySW5zZXQ7DQoJCQlzd2l0Y2gobW9kZUlEKSB7DQoJCQkJY2FzZSAwOiBUSElTLmZyb21IU1YobnVsbCwgbnVsbCwgMSAtIHkvKGpzY29sb3IuaW1hZ2VzLnNsZFsxXS0xKSwgbGVhdmVQYWQpOyBicmVhazsNCgkJCQljYXNlIDE6IFRISVMuZnJvbUhTVihudWxsLCAxIC0geS8oanNjb2xvci5pbWFnZXMuc2xkWzFdLTEpLCBudWxsLCBsZWF2ZVBhZCk7IGJyZWFrOw0KCQkJfQ0KCQl9DQoNCg0KCQlmdW5jdGlvbiBkaXNwYXRjaEltbWVkaWF0ZUNoYW5nZSgpIHsNCgkJCWlmIChUSElTLm9uSW1tZWRpYXRlQ2hhbmdlKSB7DQoJCQkJdmFyIGNhbGxiYWNrOw0KCQkJCWlmICh0eXBlb2YgVEhJUy5vbkltbWVkaWF0ZUNoYW5nZSA9PT0gJ3N0cmluZycpIHsNCgkJCQkJY2FsbGJhY2sgPSBuZXcgRnVuY3Rpb24gKFRISVMub25JbW1lZGlhdGVDaGFuZ2UpOw0KCQkJCX0gZWxzZSB7DQoJCQkJCWNhbGxiYWNrID0gVEhJUy5vbkltbWVkaWF0ZUNoYW5nZTsNCgkJCQl9DQoJCQkJY2FsbGJhY2suY2FsbChUSElTKTsNCgkJCX0NCgkJfQ0KDQoNCgkJdmFyIFRISVMgPSB0aGlzOw0KCQl2YXIgbW9kZUlEID0gdGhpcy5waWNrZXJNb2RlLnRvTG93ZXJDYXNlKCk9PT0naHZzJyA/IDEgOiAwOw0KCQl2YXIgYWJvcnRCbHVyID0gZmFsc2U7DQoJCXZhcg0KCQkJdmFsdWVFbGVtZW50ID0ganNjb2xvci5mZXRjaEVsZW1lbnQodGhpcy52YWx1ZUVsZW1lbnQpLA0KCQkJc3R5bGVFbGVtZW50ID0ganNjb2xvci5mZXRjaEVsZW1lbnQodGhpcy5zdHlsZUVsZW1lbnQpOw0KCQl2YXINCgkJCWhvbGRQYWQgPSBmYWxzZSwNCgkJCWhvbGRTbGQgPSBmYWxzZSwNCgkJCXRvdWNoT2Zmc2V0ID0ge307DQoJCXZhcg0KCQkJbGVhdmVWYWx1ZSA9IDE8PDAsDQoJCQlsZWF2ZVN0eWxlID0gMTw8MSwNCgkJCWxlYXZlUGFkID0gMTw8MiwNCgkJCWxlYXZlU2xkID0gMTw8MzsNCg0KCQkvLyB0YXJnZXQNCgkJanNjb2xvci5hZGRFdmVudCh0YXJnZXQsICdmb2N1cycsIGZ1bmN0aW9uKCkgew0KCQkJaWYoVEhJUy5waWNrZXJPbmZvY3VzKSB7IFRISVMuc2hvd1BpY2tlcigpOyB9DQoJCX0pOw0KCQlqc2NvbG9yLmFkZEV2ZW50KHRhcmdldCwgJ2JsdXInLCBmdW5jdGlvbigpIHsNCgkJCWlmKCFhYm9ydEJsdXIpIHsNCgkJCQl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpeyBhYm9ydEJsdXIgfHwgYmx1clRhcmdldCgpOyBhYm9ydEJsdXI9ZmFsc2U7IH0sIDApOw0KCQkJfSBlbHNlIHsNCgkJCQlhYm9ydEJsdXIgPSBmYWxzZTsNCgkJCX0NCgkJfSk7DQoNCgkJLy8gdmFsdWVFbGVtZW50DQoJCWlmKHZhbHVlRWxlbWVudCkgew0KCQkJdmFyIHVwZGF0ZUZpZWxkID0gZnVuY3Rpb24oKSB7DQoJCQkJVEhJUy5mcm9tU3RyaW5nKHZhbHVlRWxlbWVudC52YWx1ZSwgbGVhdmVWYWx1ZSk7DQoJCQkJZGlzcGF0Y2hJbW1lZGlhdGVDaGFuZ2UoKTsNCgkJCX07DQoJCQlqc2NvbG9yLmFkZEV2ZW50KHZhbHVlRWxlbWVudCwgJ2tleXVwJywgdXBkYXRlRmllbGQpOw0KCQkJanNjb2xvci5hZGRFdmVudCh2YWx1ZUVsZW1lbnQsICdpbnB1dCcsIHVwZGF0ZUZpZWxkKTsNCgkJCWpzY29sb3IuYWRkRXZlbnQodmFsdWVFbGVtZW50LCAnYmx1cicsIGJsdXJWYWx1ZSk7DQoJCQl2YWx1ZUVsZW1lbnQuc2V0QXR0cmlidXRlKCdhdXRvY29tcGxldGUnLCAnb2ZmJyk7DQoJCX0NCg0KCQkvLyBzdHlsZUVsZW1lbnQNCgkJaWYoc3R5bGVFbGVtZW50KSB7DQoJCQlzdHlsZUVsZW1lbnQuanNjU3R5bGUgPSB7DQoJCQkJYmFja2dyb3VuZEltYWdlIDogc3R5bGVFbGVtZW50LnN0eWxlLmJhY2tncm91bmRJbWFnZSwNCgkJCQliYWNrZ3JvdW5kQ29sb3IgOiBzdHlsZUVsZW1lbnQuc3R5bGUuYmFja2dyb3VuZENvbG9yLA0KCQkJCWNvbG9yIDogc3R5bGVFbGVtZW50LnN0eWxlLmNvbG9yDQoJCQl9Ow0KCQl9DQoNCgkJLy8gcmVxdWlyZSBpbWFnZXMNCgkJc3dpdGNoKG1vZGVJRCkgew0KCQkJY2FzZSAwOiBqc2NvbG9yLnJlcXVpcmVJbWFnZSgnaHMucG5nJyk7IGJyZWFrOw0KCQkJY2FzZSAxOiBqc2NvbG9yLnJlcXVpcmVJbWFnZSgnaHYucG5nJyk7IGJyZWFrOw0KCQl9DQoJCWpzY29sb3IucmVxdWlyZUltYWdlKCdjcm9zcy5naWYnKTsNCgkJanNjb2xvci5yZXF1aXJlSW1hZ2UoJ2Fycm93LmdpZicpOw0KDQoJCXRoaXMuaW1wb3J0Q29sb3IoKTsNCgl9DQoNCn07DQoNCi8vLS0tIE9UUlNDSURlcGxveW1lbnRTdGF0ZUNvbG9ycw0KLy9qc2NvbG9yLmluc3RhbGwoKTsNCi8vLS0t
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE2IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgdmFyOjpwYWNrYWdlc2V0dXA6OkdlbmVyYWxDYXRhbG9nOyAgICAjIyBubyBjcml0aWMKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6Q29uZmlnJywKICAgICdLZXJuZWw6OlN5c3RlbTo6REInLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpTeXNDb25maWcnLAopOwoKPWhlYWQxIE5BTUUKCkdlbmVyYWxDYXRhbG9nLnBtIC0gY29kZSB0byBleGNlY3V0ZSBkdXJpbmcgcGFja2FnZSBpbnN0YWxsYXRpb24KCj1oZWFkMSBTWU5PUFNJUwoKQWxsIGZ1bmN0aW9ucwoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIG5ldygpCgpjcmVhdGUgYW4gb2JqZWN0CgogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpPYmplY3RNYW5hZ2VyOwogICAgbG9jYWwgJEtlcm5lbDo6T00gPSBLZXJuZWw6OlN5c3RlbTo6T2JqZWN0TWFuYWdlci0+bmV3KCk7CiAgICBteSAkQ29kZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ3Zhcjo6cGFja2FnZXNldHVwOjpHZW5lcmFsQ2F0YWxvZycpOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGFsd2F5cyBkaXNjYXJkIHRoZSBjb25maWcgb2JqZWN0IGJlZm9yZSBwYWNrYWdlIGNvZGUgaXMgZXhlY3V0ZWQsCiAgICAjIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBjb25maWcgb2JqZWN0IHdpbGwgYmUgY3JlYXRlZCBuZXdseSwgc28gdGhhdCBpdAogICAgIyB3aWxsIHVzZSB0aGUgcmVjZW50bHkgd3JpdHRlbiBuZXcgY29uZmlnIGZyb20gdGhlIHBhY2thZ2UKICAgICRLZXJuZWw6Ok9NLT5PYmplY3RzRGlzY2FyZCgKICAgICAgICBPYmplY3RzID0+IFsnS2VybmVsOjpDb25maWcnXSwKICAgICk7CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBDb2RlSW5zdGFsbCgpCgpydW4gdGhlIGNvZGUgaW5zdGFsbCBwYXJ0CgogICAgbXkgJFJlc3VsdCA9ICRDb2RlT2JqZWN0LT5Db2RlSW5zdGFsbCgpOwoKPWN1dAoKc3ViIENvZGVJbnN0YWxsIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIENvZGVSZWluc3RhbGwoKQoKcnVuIHRoZSBjb2RlIHJlaW5zdGFsbCBwYXJ0CgogICAgbXkgJFJlc3VsdCA9ICRDb2RlT2JqZWN0LT5Db2RlUmVpbnN0YWxsKCk7Cgo9Y3V0CgpzdWIgQ29kZVJlaW5zdGFsbCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBDb2RlVXBncmFkZSgpCgpydW4gdGhlIGNvZGUgdXBncmFkZSBwYXJ0CgogICAgbXkgJFJlc3VsdCA9ICRDb2RlT2JqZWN0LT5Db2RlVXBncmFkZSgpOwoKPWN1dAoKc3ViIENvZGVVcGdyYWRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBtaWdyYXRlICdmdW5jdGlvbmFsaXR5JyB0byBleHRlcm5hbCB0YWJsZQogICAgIyB0aGlzIGlzIG9ubHkgbmVjY2VzYXJ5IGluIENvZGVVcGdyYWRlLCBmb3IgbmV3IGluc3RhbGxhdGlvbnMgdGhpcyBpcyBkb25lCiAgICAjIGluIHRoZSBwYWNrYWdlIElUU01Db3JlIGR1cmluZyBDb2RlSW5zdGFsbAogICAgJFNlbGYtPl9NaWdyYXRlRnVuY3Rpb25hbGl0eSgpOwoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBDb2RlVXBncmFkZUZyb21Mb3dlclRoYW5fNF8wXzkxKCkKClRoaXMgZnVuY3Rpb24gaXMgb25seSBleGVjdXRlZCBpZiB0aGUgaW5zdGFsbGVkIG1vZHVsZSB2ZXJzaW9uIGlzIHNtYWxsZXIgdGhhbiA0LjAuOTEuCgpteSAkUmVzdWx0ID0gJENvZGVPYmplY3QtPkNvZGVVcGdyYWRlRnJvbUxvd2VyVGhhbl80XzBfOTEoKTsKCj1jdXQKCnN1YiBDb2RlVXBncmFkZUZyb21Mb3dlclRoYW5fNF8wXzkxIHsgICAgIyMgbm8gY3JpdGljCiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hhbmdlIGNvbmZpZ3VyYXRpb25zIHRvIG1hdGNoIHRoZSBuZXcgbW9kdWxlIGxvY2F0aW9uLgogICAgJFNlbGYtPl9NaWdyYXRlQ29uZmlncygpOwoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBDb2RlVW5pbnN0YWxsKCkKCnJ1biB0aGUgY29kZSB1bmluc3RhbGwgcGFydAoKICAgIG15ICRSZXN1bHQgPSAkQ29kZU9iamVjdC0+Q29kZVVuaW5zdGFsbCgpOwoKPWN1dAoKc3ViIENvZGVVbmluc3RhbGwgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gX01pZ3JhdGVGdW5jdGlvbmFsaXR5KCkKCj1jdXQKCnN1YiBfTWlncmF0ZUZ1bmN0aW9uYWxpdHkgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIFNFTEVDVCBhbGwgZnVuY3Rpb25hbGl0eSB2YWx1ZXMKICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5QcmVwYXJlKAogICAgICAgIFNRTCA9PiAnU0VMRUNUIGlkLCBmdW5jdGlvbmFsaXR5IEZST00gZ2VuZXJhbF9jYXRhbG9nJywKICAgICk7CgogICAgbXkgQExpc3Q7CiAgICBST1c6CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgIG5leHQgUk9XIGlmICEkUm93WzFdOwoKICAgICAgICBwdXNoIEBMaXN0LCBcQFJvdzsKICAgIH0KCiAgICAjIHNhdmUgZW50cmllcyBpbiBuZXcgdGFibGUKICAgIGZvciBteSAkRW50cnkgKEBMaXN0KSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkRvKAogICAgICAgICAgICBTUUwgPT4KICAgICAgICAgICAgICAgICdJTlNFUlQgSU5UTyBnZW5lcmFsX2NhdGFsb2dfcHJlZmVyZW5jZXMoIGdlbmVyYWxfY2F0YWxvZ19pZCwgcHJlZl9rZXksIHByZWZfdmFsdWUgKScKICAgICAgICAgICAgICAgIC4gJyBWQUxVRVMoID8sIFwnRnVuY3Rpb25hbGl0eVwnLCA/ICknLAogICAgICAgICAgICBCaW5kID0+IFsgXCRFbnRyeS0+WzBdLCBcJEVudHJ5LT5bMV0gXSwKICAgICAgICApOwogICAgfQoKICAgICMgZHJvcCBjb2x1bW4gZnVuY3Rpb25hbGl0eQogICAgbXkgKCREcm9wKSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5TUUxQcm9jZXNzb3IoCiAgICAgICAgRGF0YWJhc2UgPT4gWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBUYWcgICAgID0+ICdUYWJsZUFsdGVyJywKICAgICAgICAgICAgICAgIE5hbWUgICAgPT4gJ2dlbmVyYWxfY2F0YWxvZycsCiAgICAgICAgICAgICAgICBUYWdUeXBlID0+ICdTdGFydCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFRhZyAgICAgPT4gJ0NvbHVtbkRyb3AnLAogICAgICAgICAgICAgICAgTmFtZSAgICA9PiAnZnVuY3Rpb25hbGl0eScsCiAgICAgICAgICAgICAgICBUYWdUeXBlID0+ICdTdGFydCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFRhZyAgICAgPT4gJ1RhYmxlQWx0ZXInLAogICAgICAgICAgICAgICAgVGFnVHlwZSA9PiAnRW5kJywKICAgICAgICAgICAgfSwKICAgICAgICBdLAogICAgKTsKCiAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RG8oCiAgICAgICAgU1FMID0+ICREcm9wLAogICAgKTsKCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gX01pZ3JhdGVDb25maWdzKCkKCmNoYW5nZSBjb25maWd1cmF0aW9ucyB0byBtYXRjaCB0aGUgbmV3IG1vZHVsZSBsb2NhdGlvbi4KCiAgICBteSAkUmVzdWx0ID0gJENvZGVPYmplY3QtPl9NaWdyYXRlQ29uZmlncygpOwoKPWN1dAoKc3ViIF9NaWdyYXRlQ29uZmlncyB7CgogICAgIyBjcmVhdGUgbmVlZGVkIG9iamVjdHMKICAgIG15ICRTeXNDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U3lzQ29uZmlnJyk7CiAgICBteSAkQ29uZmlnT2JqZWN0ICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICAjIG1pZ3JhdGUgR2VuZXJhbENhdGFsb2cgUHJlZmVyZW5jZXMKICAgICMgZ2V0IHNldHRpbmcgY29udGVudCBmb3IgR2VuZXJhbENhdGFsb2cgUHJlZmVyZW5jZXMKICAgIG15ICRTZXR0aW5nID0gJENvbmZpZ09iamVjdC0+R2V0KCdHZW5lcmFsQ2F0YWxvZ1ByZWZlcmVuY2VzJyk7CgogICAgQ09ORklHSVRFTToKICAgIGZvciBteSAkTWVudU1vZHVsZSAoIHNvcnQga2V5cyAleyRTZXR0aW5nfSApIHsKCiAgICAgICAgIyB1cGRhdGUgbW9kdWxlIGxvY2F0aW9uCiAgICAgICAgbXkgJE1vZHVsZSA9ICRTZXR0aW5nLT57JE1lbnVNb2R1bGV9LT57J01vZHVsZSd9OwogICAgICAgIGlmICggJE1vZHVsZSAhfiBte0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpHZW5lcmFsQ2F0YWxvZ1ByZWZlcmVuY2VzKFx3Kyl9ICkgewogICAgICAgICAgICBuZXh0IENPTkZJR0lURU07CiAgICAgICAgfQoKICAgICAgICAkU2V0dGluZy0+eyRNZW51TW9kdWxlfS0+e01vZHVsZX0gPSAiS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkdlbmVyYWxDYXRhbG9nUHJlZmVyZW5jZXM6OkdlbmVyaWMiOwoKICAgICAgICAjIHNldCBuZXcgc2V0dGluZywKICAgICAgICBteSAkU3VjY2VzcyA9ICRTeXNDb25maWdPYmplY3QtPkNvbmZpZ0l0ZW1VcGRhdGUoCiAgICAgICAgICAgIFZhbGlkID0+IDEsCiAgICAgICAgICAgIEtleSAgID0+ICdHZW5lcmFsQ2F0YWxvZ1ByZWZlcmVuY2VzIyMjJyAuICRNZW51TW9kdWxlLAogICAgICAgICAgICBWYWx1ZSA9PiAkU2V0dGluZy0+eyRNZW51TW9kdWxlfSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAxOwp9CgoxOwoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBTb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKGh0dHA6Ly9vdHJzLm9yZy8pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgTDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQ+LgoKPWN1dAo=