{"js":"PGRpdiBpZD0ic2NoZW1hQXBwIiBzdHlsZT0ibWF4LXdpZHRoOjExMDBweDttYXJnaW46MCBhdXRvO3BhZGRpbmc6MjJweDtmb250LWZhbWlseTpzeXN0ZW0tdWksLWFwcGxlLXN5c3RlbSxTZWdvZSBVSSxSb2JvdG8sQXJpYWwsc2Fucy1zZXJpZjtjb2xvcjojZThlZWZjOyI+CiAgPGRpdiBzdHlsZT0ibWFyZ2luLWJvdHRvbToyMnB4OyI+CiAgICA8ZGl2IHN0eWxlPSJmb250LXNpemU6MjhweDtmb250LXdlaWdodDo5MDA7bGluZS1oZWlnaHQ6MS4yO2NvbG9yOiM0MTY5ZTEiPgogICAgICBTY2hlbWEub3JnIEpTT04tTEQgR2VuZXJhdG9yCjwvZGl2Pgo8L2Rpdj4KICA8ZGl2IHN0eWxlPSJiYWNrZ3JvdW5kOiMxMjFhMmE7Ym9yZGVyOjFweCBzb2xpZCAjMjQzMTRmO2JvcmRlci1yYWRpdXM6MTRweDtwYWRkaW5nOjE2cHg7Ym94LXNoYWRvdzowIDEycHggMjhweCByZ2JhKDAsMCwwLC4yNSk7Ij4KICAgIDxkaXYgc3R5bGU9ImRpc3BsYXk6ZmxleDtnYXA6MTRweDtmbGV4LXdyYXA6d3JhcDthbGlnbi1pdGVtczpmbGV4LWVuZDsiPgogICAgICA8ZGl2IHN0eWxlPSJmbGV4OjEgMSAyNjBweDttaW4td2lkdGg6MjQwcHg7Ij4KICAgICAgICA8bGFiZWwgZm9yPSJzY2hlbWFUeXBlIiBzdHlsZT0iZGlzcGxheTpibG9jaztmb250LXNpemU6MTJweDtjb2xvcjojYTliN2Q2O21hcmdpbjoxMHB4IDAgNnB4OyI+U2NoZW1hIFR5cGU8L2xhYmVsPgogICAgICAgIDxzZWxlY3QgaWQ9InNjaGVtYVR5cGUiIHN0eWxlPSJ3aWR0aDoxMDAlO3BhZGRpbmc6MTBweDtib3JkZXItcmFkaXVzOjEwcHg7Ym9yZGVyOjFweCBzb2xpZCAjMjQzMTRmO2JhY2tncm91bmQ6IzBlMTUyNDtjb2xvcjojZThlZWZjOyI+PC9zZWxlY3Q+CiAgICAgIDwvZGl2PgoKICAgICAgPGRpdiBzdHlsZT0iZmxleDoxIDEgMjYwcHg7bWluLXdpZHRoOjI0MHB4OyI+CiAgICAgICAgPGxhYmVsIGZvcj0iYmFzZVVybCIgc3R5bGU9ImRpc3BsYXk6YmxvY2s7Zm9udC1zaXplOjEycHg7Y29sb3I6I2E5YjdkNjttYXJnaW46MTBweCAwIDZweDsiPlBhZ2UgVVJMIChyZWNvbW1lbmRlZCk8L2xhYmVsPgogICAgICAgIDxpbnB1dCBpZD0iYmFzZVVybCIgdHlwZT0idXJsIiBwbGFjZWhvbGRlcj0iaHR0cHM6Ly9leGFtcGxlLmNvbS9wYWdlIgogICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6MTAwJTtwYWRkaW5nOjEwcHg7Ym9yZGVyLXJhZGl1czoxMHB4O2JvcmRlcjoxcHggc29saWQgIzI0MzE0ZjtiYWNrZ3JvdW5kOiMwZTE1MjQ7Y29sb3I6I2U4ZWVmYzsiIC8+CiAgICAgIDwvZGl2PgoKICAgICAgPGRpdiBzdHlsZT0iZmxleDoxIDEgMjYwcHg7bWluLXdpZHRoOjI0MHB4OyI+CiAgICAgICAgPGJ1dHRvbiBpZD0iYWRkU2NoZW1hQnRuIiB0eXBlPSJidXR0b24iCiAgICAgICAgICAgICAgICBzdHlsZT0id2lkdGg6MTAwJTtwYWRkaW5nOjEwcHggMTJweDtib3JkZXItcmFkaXVzOjEwcHg7Ym9yZGVyOjFweCBzb2xpZCAjMzU1MThmO2JhY2tncm91bmQ6IzFiMmE0YTtjb2xvcjojZThlZWZjO2N1cnNvcjpwb2ludGVyOyI+CiAgICAgICAgICBBZGQgU2NoZW1hIEJsb2NrCiAgICAgICAgPC9idXR0b24+CiAgICAgICAgPGRpdiBzdHlsZT0iY29sb3I6I2E5YjdkNjtmb250LXNpemU6MTJweDtsaW5lLWhlaWdodDoxLjM1O21hcmdpbi10b3A6OHB4OyI+CiAgICAgICAgICBDaG9vc2UgYSB0eXBlLCB0aGVuIGNsaWNrIDxiPkFkZCBTY2hlbWEgQmxvY2s8L2I+LgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgoKICAgIDxkaXYgc3R5bGU9ImRpc3BsYXk6ZmxleDtnYXA6MTBweDtmbGV4LXdyYXA6d3JhcDttYXJnaW4tdG9wOjEycHg7Ij4KICAgICAgPGJ1dHRvbiBpZD0iYXV0b2ZpbGxCdG4iIHR5cGU9ImJ1dHRvbiIKICAgICAgICAgICAgICBzdHlsZT0icGFkZGluZzoxMHB4IDEycHg7Ym9yZGVyLXJhZGl1czoxMHB4O2JvcmRlcjoxcHggc29saWQgIzI0MzE0ZjtiYWNrZ3JvdW5kOiMwZTE1MjQ7Y29sb3I6I2U4ZWVmYztjdXJzb3I6cG9pbnRlcjsiPgogICAgICAgIEF1dG8tZmlsbCBGcm9tIFBhZ2UKICAgICAgPC9idXR0b24+CiAgICAgIDxidXR0b24gaWQ9ImNsZWFyQWxsQnRuIiB0eXBlPSJidXR0b24iCiAgICAgICAgICAgICAgc3R5bGU9InBhZGRpbmc6MTBweCAxMnB4O2JvcmRlci1yYWRpdXM6MTBweDtib3JkZXI6MXB4IHNvbGlkICM2YjJiM2Y7YmFja2dyb3VuZDojMmExMjIwO2NvbG9yOiNlOGVlZmM7Y3Vyc29yOnBvaW50ZXI7Ij4KICAgICAgICBDbGVhciBBbGwgQmxvY2tzCiAgICAgIDwvYnV0dG9uPgogICAgPC9kaXY+CgogICAgPGRpdiBpZD0ic2NoZW1hc0hvc3QiIHN0eWxlPSJtYXJnaW4tdG9wOjE0cHg7Ij48L2Rpdj4KCiAgICA8ZGl2IHN0eWxlPSJoZWlnaHQ6MXB4O2JhY2tncm91bmQ6IzI0MzE0ZjttYXJnaW46MTRweCAwOyI+PC9kaXY+CgogICAgPGRpdiBzdHlsZT0iZGlzcGxheTpmbGV4O2dhcDoxMHB4O2ZsZXgtd3JhcDp3cmFwO21hcmdpbi10b3A6MTJweDsiPgogICAgICA8YnV0dG9uIGlkPSJnZW5lcmF0ZUJ0biIgdHlwZT0iYnV0dG9uIgogICAgICAgICAgICAgIHN0eWxlPSJwYWRkaW5nOjEwcHggMTJweDtib3JkZXItcmFkaXVzOjEwcHg7Ym9yZGVyOjFweCBzb2xpZCAjMzU1MThmO2JhY2tncm91bmQ6IzFiMmE0YTtjb2xvcjojZThlZWZjO2N1cnNvcjpwb2ludGVyOyI+CiAgICAgICAgR2VuZXJhdGUgSlNPTi1MRAogICAgICA8L2J1dHRvbj4KICAgICAgPGJ1dHRvbiBpZD0iY29weUJ0biIgdHlwZT0iYnV0dG9uIiBkaXNhYmxlZAogICAgICAgICAgICAgIHN0eWxlPSJwYWRkaW5nOjEwcHggMTJweDtib3JkZXItcmFkaXVzOjEwcHg7Ym9yZGVyOjFweCBzb2xpZCAjMjQzMTRmO2JhY2tncm91bmQ6IzBlMTUyNDtjb2xvcjojZThlZWZjO2N1cnNvcjpub3QtYWxsb3dlZDtvcGFjaXR5Oi41NTsiPgogICAgICAgIENvcHkgdG8gQ2xpcGJvYXJkCiAgICAgIDwvYnV0dG9uPgogICAgICA8YnV0dG9uIGlkPSJkb3dubG9hZEJ0biIgdHlwZT0iYnV0dG9uIiBkaXNhYmxlZAogICAgICAgICAgICAgIHN0eWxlPSJwYWRkaW5nOjEwcHggMTJweDtib3JkZXItcmFkaXVzOjEwcHg7Ym9yZGVyOjFweCBzb2xpZCAjMjQzMTRmO2JhY2tncm91bmQ6IzBlMTUyNDtjb2xvcjojZThlZWZjO2N1cnNvcjpub3QtYWxsb3dlZDtvcGFjaXR5Oi41NTsiPgogICAgICAgIERvd25sb2FkIC5qc29uCiAgICAgIDwvYnV0dG9uPgogICAgPC9kaXY+CgogICAgPGRpdiBpZD0ic3RhdHVzIiBzdHlsZT0ibWFyZ2luLXRvcDoxMHB4O2ZvbnQtc2l6ZToxM3B4O2NvbG9yOiNhOWI3ZDY7d2hpdGUtc3BhY2U6cHJlLXdyYXA7Ij48L2Rpdj4KCiAgICA8cHJlIGlkPSJvdXRwdXQiIHN0eWxlPSJtYXJnaW4tdG9wOjEycHg7YmFja2dyb3VuZDojMDYwYTEyO2JvcmRlcjoxcHggc29saWQgIzI0MzE0Zjtib3JkZXItcmFkaXVzOjE0cHg7cGFkZGluZzoxNHB4O292ZXJmbG93OmF1dG87bWF4LWhlaWdodDo1MjBweDt3aGl0ZS1zcGFjZTpwcmU7bGluZS1oZWlnaHQ6MS4zNTsiPjwvcHJlPgoKICAgIDxkaXYgc3R5bGU9ImNvbG9yOiNhOWI3ZDY7Zm9udC1zaXplOjEycHg7bGluZS1oZWlnaHQ6MS4zNTttYXJnaW4tdG9wOjEwcHg7Ij4KICAgICAgQ2xpcGJvYXJkIG5vdGU6IGJlc3Qgb24gPGI+aHR0cHM6Ly88L2I+IG9yIDxiPmxvY2FsaG9zdDwvYj4uIEZhbGxiYWNrIGNvcHkgbWV0aG9kIGluY2x1ZGVkLgogICAgPC9kaXY+CiAgPC9kaXY+CjwvZGl2PgoKPHNjcmlwdD4KKGZ1bmN0aW9uKCl7CiAgY29uc3QgJCA9IChzZWwsIHJvb3Q9ZG9jdW1lbnQpID0+IHJvb3QucXVlcnlTZWxlY3RvcihzZWwpOwogIGNvbnN0ICQkID0gKHNlbCwgcm9vdD1kb2N1bWVudCkgPT4gQXJyYXkuZnJvbShyb290LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsKSk7CiAgY29uc3QgdWlkID0gKCgpID0+IHsgbGV0IG49MDsgcmV0dXJuICgpID0+ICgrK24pLnRvU3RyaW5nKDM2KSArICJfIiArIE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnNsaWNlKDIsNyk7IH0pKCk7CgogIGZ1bmN0aW9uIHNhZmVUcmltKHYpeyByZXR1cm4gKHYgPz8gIiIpLnRvU3RyaW5nKCkudHJpbSgpOyB9CiAgZnVuY3Rpb24gcGFyc2VMaXN0KHYpeyByZXR1cm4gc2FmZVRyaW0odikuc3BsaXQoIiwiKS5tYXAocz0+cy50cmltKCkpLmZpbHRlcihCb29sZWFuKTsgfQogIGZ1bmN0aW9uIG1heWJlTnVtYmVyKHYpewogICAgY29uc3QgdCA9IHNhZmVUcmltKHYpOyBpZighdCkgcmV0dXJuIG51bGw7CiAgICBjb25zdCBuID0gTnVtYmVyKHQpOyByZXR1cm4gTnVtYmVyLmlzRmluaXRlKG4pID8gbiA6IG51bGw7CiAgfQoKICBjb25zdCBzdHlsZXMgPSB7CiAgICBsYWJlbDogImRpc3BsYXk6YmxvY2s7Zm9udC1zaXplOjEycHg7Y29sb3I6I2E5YjdkNjttYXJnaW46MTBweCAwIDZweDsiLAogICAgaW5wdXQ6ICJ3aWR0aDoxMDAlO3BhZGRpbmc6MTBweDtib3JkZXItcmFkaXVzOjEwcHg7Ym9yZGVyOjFweCBzb2xpZCAjMjQzMTRmO2JhY2tncm91bmQ6IzBlMTUyNDtjb2xvcjojZThlZWZjOyIsCiAgICB0ZXh0YXJlYTogIndpZHRoOjEwMCU7cGFkZGluZzoxMHB4O2JvcmRlci1yYWRpdXM6MTBweDtib3JkZXI6MXB4IHNvbGlkICMyNDMxNGY7YmFja2dyb3VuZDojMGUxNTI0O2NvbG9yOiNlOGVlZmM7bWluLWhlaWdodDo4OHB4O3Jlc2l6ZTp2ZXJ0aWNhbDsiLAogICAgYnRuOiAicGFkZGluZzoxMHB4IDEycHg7Ym9yZGVyLXJhZGl1czoxMHB4O2JvcmRlcjoxcHggc29saWQgIzI0MzE0ZjtiYWNrZ3JvdW5kOiMwZTE1MjQ7Y29sb3I6I2U4ZWVmYztjdXJzb3I6cG9pbnRlcjsiLAogICAgYnRuRGFuZ2VyOiAicGFkZGluZzoxMHB4IDEycHg7Ym9yZGVyLXJhZGl1czoxMHB4O2JvcmRlcjoxcHggc29saWQgIzZiMmIzZjtiYWNrZ3JvdW5kOiMyYTEyMjA7Y29sb3I6I2U4ZWVmYztjdXJzb3I6cG9pbnRlcjsiLAogICAgZGl2aWRlcjogImhlaWdodDoxcHg7YmFja2dyb3VuZDojMjQzMTRmO21hcmdpbjoxNHB4IDA7IiwKICAgIHNjaGVtYUNhcmQ6ICJib3JkZXI6MXB4IHNvbGlkICMyNDMxNGY7Ym9yZGVyLXJhZGl1czoxNHB4O3BhZGRpbmc6MTRweDtiYWNrZ3JvdW5kOiMwZTE1MjQ7bWFyZ2luLXRvcDoxNHB4OyIsCiAgICByZXBlYXQ6ICJib3JkZXI6MXB4IGRhc2hlZCAjMjQzMTRmO2JvcmRlci1yYWRpdXM6MTJweDtwYWRkaW5nOjEwcHg7bWFyZ2luLXRvcDoxMHB4O2JhY2tncm91bmQ6IzBiMTEyMDsiLAogICAgc21hbGw6ICJmb250LXNpemU6MTJweDtjb2xvcjojYTliN2Q2OyIKICB9OwoKICBmdW5jdGlvbiBzZXRTdGF0dXMobXNnLCBraW5kKXsKICAgIGNvbnN0IGVsID0gJCgiI3N0YXR1cyIpOwogICAgZWwudGV4dENvbnRlbnQgPSBtc2cgfHwgIiI7CiAgICBlbC5zdHlsZS5jb2xvciA9CiAgICAgIGtpbmQgPT09ICJvayIgPyAiIzM5ZDk4YSIgOgogICAgICBraW5kID09PSAid2FybiIgPyAiI2ZmY2M2NiIgOgogICAgICBraW5kID09PSAiYmFkIiA/ICIjZmY1YzdhIiA6ICIjYTliN2Q2IjsKICB9CgogIGZ1bmN0aW9uIHNldEJ0bkVuYWJsZWQoYnRuLCBlbmFibGVkKXsKICAgIGJ0bi5kaXNhYmxlZCA9ICFlbmFibGVkOwogICAgYnRuLnN0eWxlLm9wYWNpdHkgPSBlbmFibGVkID8gIjEiIDogIi41NSI7CiAgICBidG4uc3R5bGUuY3Vyc29yID0gZW5hYmxlZCA/ICJwb2ludGVyIiA6ICJub3QtYWxsb3dlZCI7CiAgfQoKICBmdW5jdGlvbiBqc29uTGRTY3JpcHQob2JqKXsKICAgIGNvbnN0IGpzb24gPSBKU09OLnN0cmluZ2lmeShvYmosIG51bGwsIDIpOwogICAgcmV0dXJuIGA8c2NyaXB0IHR5cGU9ImFwcGxpY2F0aW9uL2xkK2pzb24iPlxuJHtqc29ufVxuPFwvc2NyaXB0PmA7CiAgfQoKICAvLyBFdmVudCBuYW1lcyBsb3dlcmNhc2VkIChzbyBvbmNsaWNrIC8gb25DbGljayBib3RoIHdvcmspCiAgZnVuY3Rpb24gZWwodGFnLCBhdHRycz17fSwgY2hpbGRyZW49W10pewogICAgY29uc3QgbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGFnKTsKICAgIGZvcihjb25zdCBbayx2XSBvZiBPYmplY3QuZW50cmllcyhhdHRycykpewogICAgICBpZihrID09PSAic3R5bGUiKSBuLnNldEF0dHJpYnV0ZSgic3R5bGUiLCB2KTsKICAgICAgZWxzZSBpZihrID09PSAiY2xhc3MiKSBuLmNsYXNzTmFtZSA9IHY7CiAgICAgIGVsc2UgaWYoayA9PT0gImh0bWwiKSBuLmlubmVySFRNTCA9IHY7CiAgICAgIGVsc2UgaWYoay5zdGFydHNXaXRoKCJvbiIpICYmIHR5cGVvZiB2ID09PSAiZnVuY3Rpb24iKXsKICAgICAgICBuLmFkZEV2ZW50TGlzdGVuZXIoay5zbGljZSgyKS50b0xvd2VyQ2FzZSgpLCB2KTsKICAgICAgfSBlbHNlIG4uc2V0QXR0cmlidXRlKGssIHYpOwogICAgfQogICAgKEFycmF5LmlzQXJyYXkoY2hpbGRyZW4pID8gY2hpbGRyZW4gOiBbY2hpbGRyZW5dKS5mb3JFYWNoKGM9PnsKICAgICAgaWYoYyA9PSBudWxsKSByZXR1cm47CiAgICAgIGlmKHR5cGVvZiBjID09PSAic3RyaW5nIikgbi5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShjKSk7CiAgICAgIGVsc2Ugbi5hcHBlbmRDaGlsZChjKTsKICAgIH0pOwogICAgcmV0dXJuIG47CiAgfQoKICBmdW5jdGlvbiBncmlkMihjaGlsZHJlbil7CiAgICByZXR1cm4gZWwoImRpdiIsIHsgc3R5bGU6ImRpc3BsYXk6Z3JpZDtncmlkLXRlbXBsYXRlLWNvbHVtbnM6cmVwZWF0KDIsbWlubWF4KDAsMWZyKSk7Z2FwOjEycHg7IiB9LCBjaGlsZHJlbik7CiAgfQoKICAvLyA9PT09PSBNaXNzaW5nLWZpZWxkIGhpZ2hsaWdodGluZyA9PT09PQogIGZ1bmN0aW9uIGNsZWFySW52YWxpZChpbnApewogICAgaWYoIWlucCB8fCAhaW5wLnN0eWxlKSByZXR1cm47CiAgICBpZihpbnAuZGF0YXNldC5pbnZhbGlkID09PSAiMSIpewogICAgICBpbnAuZGF0YXNldC5pbnZhbGlkID0gIjAiOwogICAgICBpbnAuc3R5bGUuYm9yZGVyQ29sb3IgPSAiIzI0MzE0ZiI7CiAgICAgIGlucC5zdHlsZS5ib3hTaGFkb3cgPSAibm9uZSI7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBtYXJrSW52YWxpZChpbnApewogICAgaWYoIWlucCB8fCAhaW5wLnN0eWxlKSByZXR1cm47CiAgICBpbnAuZGF0YXNldC5pbnZhbGlkID0gIjEiOwogICAgaW5wLnN0eWxlLmJvcmRlckNvbG9yID0gIiNmZjVjN2EiOwogICAgaW5wLnN0eWxlLmJveFNoYWRvdyA9ICIwIDAgMCAzcHggcmdiYSgyNTUsOTIsMTIyLC4xNikiOwogIH0KCiAgZnVuY3Rpb24gYXR0YWNoQXV0b0NsZWFySW52YWxpZChyb290KXsKICAgIC8vIENhcHR1cmUgaW5wdXQgY2hhbmdlcyBhbnl3aGVyZSBpbnNpZGUgYSBibG9jawogICAgcm9vdC5hZGRFdmVudExpc3RlbmVyKCJpbnB1dCIsIChlKSA9PiB7CiAgICAgIGNvbnN0IHQgPSBlLnRhcmdldDsKICAgICAgaWYodCAmJiAodC50YWdOYW1lID09PSAiSU5QVVQiIHx8IHQudGFnTmFtZSA9PT0gIlRFWFRBUkVBIiB8fCB0LnRhZ05hbWUgPT09ICJTRUxFQ1QiKSl7CiAgICAgICAgaWYoc2FmZVRyaW0odC52YWx1ZSkpIGNsZWFySW52YWxpZCh0KTsKICAgICAgfQogICAgfSwgdHJ1ZSk7CgogICAgcm9vdC5hZGRFdmVudExpc3RlbmVyKCJibHVyIiwgKGUpID0+IHsKICAgICAgY29uc3QgdCA9IGUudGFyZ2V0OwogICAgICBpZih0ICYmICh0LnRhZ05hbWUgPT09ICJJTlBVVCIgfHwgdC50YWdOYW1lID09PSAiVEVYVEFSRUEiIHx8IHQudGFnTmFtZSA9PT0gIlNFTEVDVCIpKXsKICAgICAgICBpZihzYWZlVHJpbSh0LnZhbHVlKSkgY2xlYXJJbnZhbGlkKHQpOwogICAgICB9CiAgICB9LCB0cnVlKTsKICB9CgogIGZ1bmN0aW9uIGNsZWFyQWxsSW52YWxpZCgpewogICAgJCQoJ2lucHV0W2RhdGEtaW52YWxpZD0iMSJdLHRleHRhcmVhW2RhdGEtaW52YWxpZD0iMSJdLHNlbGVjdFtkYXRhLWludmFsaWQ9IjEiXScpLmZvckVhY2goY2xlYXJJbnZhbGlkKTsKICB9CgogIGZ1bmN0aW9uIGZpZWxkSW5wdXQoZmllbGQsIHByZWZpeCl7CiAgICBjb25zdCBpZCA9IGAke3ByZWZpeH1fJHtmaWVsZC5rZXl9YDsKICAgIGNvbnN0IGxhYiA9IGVsKCJsYWJlbCIsIHsgZm9yOmlkLCBzdHlsZTogc3R5bGVzLmxhYmVsICsgKGZpZWxkLnJlcXVpcmVkID8gImZvbnQtd2VpZ2h0OjY1MDsiIDogIiIpIH0sCiAgICAgIGZpZWxkLmxhYmVsICsgKGZpZWxkLnJlcXVpcmVkID8gIiAqIiA6ICIiKQogICAgKTsKICAgIGxldCBpbnB1dDsKICAgIGlmKGZpZWxkLnR5cGUgPT09ICJ0ZXh0YXJlYSIpewogICAgICBpbnB1dCA9IGVsKCJ0ZXh0YXJlYSIsIHsgaWQsIG5hbWU6IGZpZWxkLmtleSwgcGxhY2Vob2xkZXI6IGZpZWxkLnBsYWNlaG9sZGVyIHx8ICIiLCBzdHlsZTogc3R5bGVzLnRleHRhcmVhIH0pOwogICAgfSBlbHNlIHsKICAgICAgaW5wdXQgPSBlbCgiaW5wdXQiLCB7IGlkLCBuYW1lOiBmaWVsZC5rZXksIHR5cGU6IGZpZWxkLnR5cGUgfHwgInRleHQiLCBwbGFjZWhvbGRlcjogZmllbGQucGxhY2Vob2xkZXIgfHwgIiIsIHN0eWxlOiBzdHlsZXMuaW5wdXQgfSk7CiAgICB9CiAgICBpZihmaWVsZC5yZXF1aXJlZCkgaW5wdXQuZGF0YXNldC5yZXF1aXJlZCA9ICIxIjsKICAgIHJldHVybiBlbCgiZGl2Iiwge30sIFtsYWIsIGlucHV0XSk7CiAgfQoKICBmdW5jdGlvbiBhZGRSZXBlYXRCbG9jayhjb250YWluZXIsIHRpdGxlLCBidWlsZEJvZHlGbil7CiAgICBjb25zdCByaWQgPSB1aWQoKTsKICAgIGNvbnN0IGJvZHkgPSBlbCgiZGl2Iiwge30pOwogICAgYnVpbGRCb2R5Rm4oYm9keSwgcmlkKTsKICAgIGNvbnN0IHdyYXAgPSBlbCgiZGl2IiwgeyBzdHlsZTogc3R5bGVzLnJlcGVhdCwgImRhdGEtcmlkIjogcmlkIH0sIFsKICAgICAgZWwoImRpdiIsIHsgc3R5bGU6ImRpc3BsYXk6ZmxleDtqdXN0aWZ5LWNvbnRlbnQ6c3BhY2UtYmV0d2VlbjtnYXA6MTBweDthbGlnbi1pdGVtczpjZW50ZXI7ZmxleC13cmFwOndyYXA7IiB9LCBbCiAgICAgICAgZWwoImRpdiIsIHt9LCBbIGVsKCJkaXYiLCB7IHN0eWxlOiJmb250LXdlaWdodDo2NTA7IiB9LCB0aXRsZSksIGVsKCJkaXYiLCB7IHN0eWxlOiBzdHlsZXMuc21hbGwgfSwgIlJlcGVhdGFibGUgaXRlbSIpIF0pLAogICAgICAgIGVsKCJidXR0b24iLCB7IHR5cGU6ImJ1dHRvbiIsIHN0eWxlOiBzdHlsZXMuYnRuRGFuZ2VyLCBvbmNsaWNrOiAoKSA9PiBjb250YWluZXIucXVlcnlTZWxlY3RvcihgW2RhdGEtcmlkPSIke3JpZH0iXWApPy5yZW1vdmUoKSB9LCAiUmVtb3ZlIikKICAgICAgXSksCiAgICAgIGJvZHkKICAgIF0pOwogICAgY29udGFpbmVyLmFwcGVuZENoaWxkKHdyYXApOwogICAgcmV0dXJuIHdyYXA7CiAgfQoKICAvLyA9PT09PT09PT0gVHlwZXMgPT09PT09PT09CiAgY29uc3QgVFlQRV9PUFRJT05TID0gWwogICAgIkFydGljbGUiLCJCcmVhZGNydW1iIiwiRXZlbnQiLCJGQVEgUGFnZSIsIkhvdyBUbyIsIkpvYiBQb3N0aW5nIiwiTG9jYWwgQnVzaW5lc3MiLAogICAgIkxvZ28iLCJPcmdhbml6YXRpb24iLCJQZXJzb24iLCJQcm9kdWN0IiwiUmF0aW5nIiwiUmVjaXBlIiwiUmV2aWV3IiwiVmlkZW8iLCJZb3V0dWJlIFZpZGVvIiwiV2Vic2l0ZSIKICBdOwoKICBjb25zdCBGSUVMRFNFVFMgPSB7CiAgICAiQXJ0aWNsZSI6IFsKICAgICAgeyBrZXk6ImhlYWRsaW5lIiwgbGFiZWw6IkhlYWRsaW5lIiwgdHlwZToidGV4dCIsIHJlcXVpcmVkOnRydWUgfSwKICAgICAgeyBrZXk6ImRlc2NyaXB0aW9uIiwgbGFiZWw6IkRlc2NyaXB0aW9uIiwgdHlwZToidGV4dGFyZWEiLCByZXF1aXJlZDpmYWxzZSB9LAogICAgICB7IGtleToiYXV0aG9yTmFtZSIsIGxhYmVsOiJBdXRob3IgTmFtZSIsIHR5cGU6InRleHQiLCByZXF1aXJlZDpmYWxzZSwgcGxhY2Vob2xkZXI6IkphbmUgRG9lIiB9LAogICAgICB7IGtleToiZGF0ZVB1Ymxpc2hlZCIsIGxhYmVsOiJEYXRlIFB1Ymxpc2hlZCAoWVlZWS1NTS1ERCkiLCB0eXBlOiJ0ZXh0IiwgcmVxdWlyZWQ6ZmFsc2UsIHBsYWNlaG9sZGVyOiIyMDI2LTAyLTAyIiB9LAogICAgICB7IGtleToiZGF0ZU1vZGlmaWVkIiwgbGFiZWw6IkRhdGUgTW9kaWZpZWQgKFlZWVktTU0tREQpIiwgdHlwZToidGV4dCIsIHJlcXVpcmVkOmZhbHNlLCBwbGFjZWhvbGRlcjoiMjAyNi0wMi0wMiIgfSwKICAgICAgeyBrZXk6ImltYWdlIiwgbGFiZWw6IkltYWdlIFVSTCIsIHR5cGU6InVybCIsIHJlcXVpcmVkOmZhbHNlLCBwbGFjZWhvbGRlcjoiaHR0cHM6Ly9leGFtcGxlLmNvbS9pbWFnZS5qcGciIH0sCiAgICAgIHsga2V5OiJwdWJsaXNoZXJOYW1lIiwgbGFiZWw6IlB1Ymxpc2hlciAvIE9yZ2FuaXphdGlvbiBOYW1lIiwgdHlwZToidGV4dCIsIHJlcXVpcmVkOmZhbHNlIH0sCiAgICAgIHsga2V5OiJwdWJsaXNoZXJMb2dvIiwgbGFiZWw6IlB1Ymxpc2hlciBMb2dvIFVSTCIsIHR5cGU6InVybCIsIHJlcXVpcmVkOmZhbHNlLCBwbGFjZWhvbGRlcjoiaHR0cHM6Ly9leGFtcGxlLmNvbS9sb2dvLnBuZyIgfQogICAgXSwKICAgICJFdmVudCI6IFsKICAgICAgeyBrZXk6Im5hbWUiLCBsYWJlbDoiRXZlbnQgTmFtZSIsIHR5cGU6InRleHQiLCByZXF1aXJlZDp0cnVlIH0sCiAgICAgIHsga2V5OiJzdGFydERhdGUiLCBsYWJlbDoiU3RhcnQgRGF0ZS9UaW1lIChZWVlZLU1NLUREVEhIOk1NKSIsIHR5cGU6InRleHQiLCByZXF1aXJlZDp0cnVlLCBwbGFjZWhvbGRlcjoiMjAyNi0wMy0xMFQxOTowMCIgfSwKICAgICAgeyBrZXk6ImVuZERhdGUiLCBsYWJlbDoiRW5kIERhdGUvVGltZSAob3B0aW9uYWwpIiwgdHlwZToidGV4dCIsIHJlcXVpcmVkOmZhbHNlLCBwbGFjZWhvbGRlcjoiMjAyNi0wMy0xMFQyMTowMCIgfSwKICAgICAgeyBrZXk6InVybCIsIGxhYmVsOiJFdmVudCBVUkwgKG9wdGlvbmFsKSIsIHR5cGU6InVybCIsIHJlcXVpcmVkOmZhbHNlIH0sCiAgICAgIHsga2V5OiJpbWFnZSIsIGxhYmVsOiJJbWFnZSBVUkwgKG9wdGlvbmFsKSIsIHR5cGU6InVybCIsIHJlcXVpcmVkOmZhbHNlIH0sCiAgICAgIHsga2V5OiJkZXNjcmlwdGlvbiIsIGxhYmVsOiJEZXNjcmlwdGlvbiAob3B0aW9uYWwpIiwgdHlwZToidGV4dGFyZWEiLCByZXF1aXJlZDpmYWxzZSB9LAogICAgICB7IGtleToiZXZlbnRBdHRlbmRhbmNlTW9kZSIsIGxhYmVsOiJBdHRlbmRhbmNlIE1vZGUgVVJMIChvcHRpb25hbCkiLCB0eXBlOiJ0ZXh0IiwgcmVxdWlyZWQ6ZmFsc2UsIHBsYWNlaG9sZGVyOiJodHRwczovL3NjaGVtYS5vcmcvT2ZmbGluZUV2ZW50QXR0ZW5kYW5jZU1vZGUiIH0sCiAgICAgIHsga2V5OiJldmVudFN0YXR1cyIsIGxhYmVsOiJFdmVudCBTdGF0dXMgVVJMIChvcHRpb25hbCkiLCB0eXBlOiJ0ZXh0IiwgcmVxdWlyZWQ6ZmFsc2UsIHBsYWNlaG9sZGVyOiJodHRwczovL3NjaGVtYS5vcmcvRXZlbnRTY2hlZHVsZWQiIH0sCiAgICAgIHsga2V5OiJsb2NhdGlvbk5hbWUiLCBsYWJlbDoiTG9jYXRpb24gTmFtZSAob3B0aW9uYWwpIiwgdHlwZToidGV4dCIsIHJlcXVpcmVkOmZhbHNlIH0sCiAgICAgIHsga2V5OiJzdHJlZXRBZGRyZXNzIiwgbGFiZWw6IlN0cmVldCBBZGRyZXNzIChvcHRpb25hbCkiLCB0eXBlOiJ0ZXh0IiwgcmVxdWlyZWQ6ZmFsc2UgfSwKICAgICAgeyBrZXk6ImFkZHJlc3NMb2NhbGl0eSIsIGxhYmVsOiJDaXR5IChvcHRpb25hbCkiLCB0eXBlOiJ0ZXh0IiwgcmVxdWlyZWQ6ZmFsc2UgfSwKICAgICAgeyBrZXk6ImFkZHJlc3NSZWdpb24iLCBsYWJlbDoiU3RhdGUvUmVnaW9uIChvcHRpb25hbCkiLCB0eXBlOiJ0ZXh0IiwgcmVxdWlyZWQ6ZmFsc2UgfSwKICAgICAgeyBrZXk6InBvc3RhbENvZGUiLCBsYWJlbDoiUG9zdGFsIENvZGUgKG9wdGlvbmFsKSIsIHR5cGU6InRleHQiLCByZXF1aXJlZDpmYWxzZSB9LAogICAgICB7IGtleToiYWRkcmVzc0NvdW50cnkiLCBsYWJlbDoiQ291bnRyeSAob3B0aW9uYWwpIiwgdHlwZToidGV4dCIsIHJlcXVpcmVkOmZhbHNlLCBwbGFjZWhvbGRlcjoiVVMiIH0KICAgIF0sCiAgICAiSm9iIFBvc3RpbmciOiBbCiAgICAgIHsga2V5OiJ0aXRsZSIsIGxhYmVsOiJKb2IgVGl0bGUiLCB0eXBlOiJ0ZXh0IiwgcmVxdWlyZWQ6dHJ1ZSB9LAogICAgICB7IGtleToiZGVzY3JpcHRpb24iLCBsYWJlbDoiSm9iIERlc2NyaXB0aW9uIChIVE1MIG9rKSIsIHR5cGU6InRleHRhcmVhIiwgcmVxdWlyZWQ6dHJ1ZSB9LAogICAgICB7IGtleToiaGlyaW5nT3JnIiwgbGFiZWw6IkhpcmluZyBPcmdhbml6YXRpb24gTmFtZSIsIHR5cGU6InRleHQiLCByZXF1aXJlZDp0cnVlIH0sCiAgICAgIHsga2V5OiJoaXJpbmdPcmdVcmwiLCBsYWJlbDoiSGlyaW5nIE9yZ2FuaXphdGlvbiBVUkwgKG9wdGlvbmFsKSIsIHR5cGU6InVybCIsIHJlcXVpcmVkOmZhbHNlIH0sCiAgICAgIHsga2V5OiJkYXRlUG9zdGVkIiwgbGFiZWw6IkRhdGUgUG9zdGVkIChZWVlZLU1NLURELCBvcHRpb25hbCkiLCB0eXBlOiJ0ZXh0IiwgcmVxdWlyZWQ6ZmFsc2UsIHBsYWNlaG9sZGVyOiIyMDI2LTAyLTAyIiB9LAogICAgICB7IGtleToidmFsaWRUaHJvdWdoIiwgbGFiZWw6IlZhbGlkIFRocm91Z2ggKFlZWVktTU0tREQsIG9wdGlvbmFsKSIsIHR5cGU6InRleHQiLCByZXF1aXJlZDpmYWxzZSwgcGxhY2Vob2xkZXI6IjIwMjYtMDMtMzEiIH0sCiAgICAgIHsga2V5OiJlbXBsb3ltZW50VHlwZSIsIGxhYmVsOiJFbXBsb3ltZW50IFR5cGUgKG9wdGlvbmFsKSIsIHR5cGU6InRleHQiLCByZXF1aXJlZDpmYWxzZSwgcGxhY2Vob2xkZXI6IkZVTExfVElNRSIgfSwKICAgICAgeyBrZXk6ImpvYkxvY2F0aW9uVHlwZSIsIGxhYmVsOiJKb2IgTG9jYXRpb24gVHlwZSAob3B0aW9uYWwpIiwgdHlwZToidGV4dCIsIHJlcXVpcmVkOmZhbHNlLCBwbGFjZWhvbGRlcjoiVEVMRUNPTU1VVEUiIH0sCiAgICAgIHsga2V5OiJzdHJlZXRBZGRyZXNzIiwgbGFiZWw6IlN0cmVldCBBZGRyZXNzIChvcHRpb25hbCkiLCB0eXBlOiJ0ZXh0IiwgcmVxdWlyZWQ6ZmFsc2UgfSwKICAgICAgeyBrZXk6ImFkZHJlc3NMb2NhbGl0eSIsIGxhYmVsOiJDaXR5IChvcHRpb25hbCkiLCB0eXBlOiJ0ZXh0IiwgcmVxdWlyZWQ6ZmFsc2UgfSwKICAgICAgeyBrZXk6ImFkZHJlc3NSZWdpb24iLCBsYWJlbDoiU3RhdGUvUmVnaW9uIChvcHRpb25hbCkiLCB0eXBlOiJ0ZXh0IiwgcmVxdWlyZWQ6ZmFsc2UgfSwKICAgICAgeyBrZXk6InBvc3RhbENvZGUiLCBsYWJlbDoiUG9zdGFsIENvZGUgKG9wdGlvbmFsKSIsIHR5cGU6InRleHQiLCByZXF1aXJlZDpmYWxzZSB9LAogICAgICB7IGtleToiYWRkcmVzc0NvdW50cnkiLCBsYWJlbDoiQ291bnRyeSAob3B0aW9uYWwpIiwgdHlwZToidGV4dCIsIHJlcXVpcmVkOmZhbHNlLCBwbGFjZWhvbGRlcjoiVVMiIH0sCiAgICAgIHsga2V5OiJiYXNlU2FsYXJ5IiwgbGFiZWw6IkJhc2UgU2FsYXJ5IChudW1iZXIsIG9wdGlvbmFsKSIsIHR5cGU6InRleHQiLCByZXF1aXJlZDpmYWxzZSwgcGxhY2Vob2xkZXI6IjkwMDAwIiB9LAogICAgICB7IGtleToic2FsYXJ5Q3VycmVuY3kiLCBsYWJlbDoiU2FsYXJ5IEN1cnJlbmN5IChvcHRpb25hbCkiLCB0eXBlOiJ0ZXh0IiwgcmVxdWlyZWQ6ZmFsc2UsIHBsYWNlaG9sZGVyOiJVU0QiIH0sCiAgICAgIHsga2V5OiJzYWxhcnlVbml0IiwgbGFiZWw6IlNhbGFyeSBVbml0IChvcHRpb25hbCkiLCB0eXBlOiJ0ZXh0IiwgcmVxdWlyZWQ6ZmFsc2UsIHBsYWNlaG9sZGVyOiJZRUFSIiB9CiAgICBdLAogICAgIkxvY2FsIEJ1c2luZXNzIjogWwogICAgICB7IGtleToibmFtZSIsIGxhYmVsOiJCdXNpbmVzcyBOYW1lIiwgdHlwZToidGV4dCIsIHJlcXVpcmVkOnRydWUgfSwKICAgICAgeyBrZXk6InVybCIsIGxhYmVsOiJCdXNpbmVzcyBVUkwgKG9wdGlvbmFsKSIsIHR5cGU6InVybCIsIHJlcXVpcmVkOmZhbHNlIH0sCiAgICAgIHsga2V5OiJpbWFnZSIsIGxhYmVsOiJJbWFnZSBVUkwgKG9wdGlvbmFsKSIsIHR5cGU6InVybCIsIHJlcXVpcmVkOmZhbHNlIH0sCiAgICAgIHsga2V5OiJ0ZWxlcGhvbmUiLCBsYWJlbDoiVGVsZXBob25lIChvcHRpb25hbCkiLCB0eXBlOiJ0ZXh0IiwgcmVxdWlyZWQ6ZmFsc2UsIHBsYWNlaG9sZGVyOiIrMS01NTUtNTU1LTU1NTUiIH0sCiAgICAgIHsga2V5OiJwcmljZVJhbmdlIiwgbGFiZWw6IlByaWNlIFJhbmdlIChvcHRpb25hbCkiLCB0eXBlOiJ0ZXh0IiwgcmVxdWlyZWQ6ZmFsc2UsIHBsYWNlaG9sZGVyOiIkJCIgfSwKICAgICAgeyBrZXk6InN0cmVldEFkZHJlc3MiLCBsYWJlbDoiU3RyZWV0IEFkZHJlc3MgKG9wdGlvbmFsKSIsIHR5cGU6InRleHQiLCByZXF1aXJlZDpmYWxzZSB9LAogICAgICB7IGtleToiYWRkcmVzc0xvY2FsaXR5IiwgbGFiZWw6IkNpdHkgKG9wdGlvbmFsKSIsIHR5cGU6InRleHQiLCByZXF1aXJlZDpmYWxzZSB9LAogICAgICB7IGtleToiYWRkcmVzc1JlZ2lvbiIsIGxhYmVsOiJTdGF0ZS9SZWdpb24gKG9wdGlvbmFsKSIsIHR5cGU6InRleHQiLCByZXF1aXJlZDpmYWxzZSB9LAogICAgICB7IGtleToicG9zdGFsQ29kZSIsIGxhYmVsOiJQb3N0YWwgQ29kZSAob3B0aW9uYWwpIiwgdHlwZToidGV4dCIsIHJlcXVpcmVkOmZhbHNlIH0sCiAgICAgIHsga2V5OiJhZGRyZXNzQ291bnRyeSIsIGxhYmVsOiJDb3VudHJ5IChvcHRpb25hbCkiLCB0eXBlOiJ0ZXh0IiwgcmVxdWlyZWQ6ZmFsc2UsIHBsYWNlaG9sZGVyOiJVUyIgfSwKICAgICAgeyBrZXk6ImxhdGl0dWRlIiwgbGFiZWw6IkxhdGl0dWRlIChvcHRpb25hbCkiLCB0eXBlOiJ0ZXh0IiwgcmVxdWlyZWQ6ZmFsc2UsIHBsYWNlaG9sZGVyOiI0MC43MTI4IiB9LAogICAgICB7IGtleToibG9uZ2l0dWRlIiwgbGFiZWw6IkxvbmdpdHVkZSAob3B0aW9uYWwpIiwgdHlwZToidGV4dCIsIHJlcXVpcmVkOmZhbHNlLCBwbGFjZWhvbGRlcjoiLTc0LjAwNjAiIH0sCiAgICAgIHsga2V5OiJvcGVuaW5nSG91cnMiLCBsYWJlbDoiT3BlbmluZyBIb3VycyAob3B0aW9uYWwsIGNvbW1hLXNlcGFyYXRlZCkiLCB0eXBlOiJ0ZXh0IiwgcmVxdWlyZWQ6ZmFsc2UsIHBsYWNlaG9sZGVyOiJNby1GciAwOTowMC0xNzowMCIgfQogICAgXSwKICAgICJMb2dvIjogWwogICAgICB7IGtleToib3JnTmFtZSIsIGxhYmVsOiJPcmdhbml6YXRpb24gTmFtZSIsIHR5cGU6InRleHQiLCByZXF1aXJlZDp0cnVlIH0sCiAgICAgIHsga2V5OiJ1cmwiLCBsYWJlbDoiT3JnYW5pemF0aW9uIFVSTCAob3B0aW9uYWwpIiwgdHlwZToidXJsIiwgcmVxdWlyZWQ6ZmFsc2UgfSwKICAgICAgeyBrZXk6ImxvZ28iLCBsYWJlbDoiTG9nbyBVUkwiLCB0eXBlOiJ1cmwiLCByZXF1aXJlZDp0cnVlLCBwbGFjZWhvbGRlcjoiaHR0cHM6Ly9leGFtcGxlLmNvbS9sb2dvLnBuZyIgfQogICAgXSwKICAgICJPcmdhbml6YXRpb24iOiBbCiAgICAgIHsga2V5OiJuYW1lIiwgbGFiZWw6Ik9yZ2FuaXphdGlvbiBOYW1lIiwgdHlwZToidGV4dCIsIHJlcXVpcmVkOnRydWUgfSwKICAgICAgeyBrZXk6InVybCIsIGxhYmVsOiJPcmdhbml6YXRpb24gVVJMIChvcHRpb25hbCkiLCB0eXBlOiJ1cmwiLCByZXF1aXJlZDpmYWxzZSB9LAogICAgICB7IGtleToibG9nbyIsIGxhYmVsOiJMb2dvIFVSTCAob3B0aW9uYWwpIiwgdHlwZToidXJsIiwgcmVxdWlyZWQ6ZmFsc2UgfSwKICAgICAgeyBrZXk6InNhbWVBcyIsIGxhYmVsOiJTb2NpYWwvUHJvZmlsZSBVUkxzIChjb21tYS1zZXBhcmF0ZWQsIG9wdGlvbmFsKSIsIHR5cGU6InRleHQiLCByZXF1aXJlZDpmYWxzZSB9CiAgICBdLAogICAgIlBlcnNvbiI6IFsKICAgICAgeyBrZXk6Im5hbWUiLCBsYWJlbDoiRnVsbCBOYW1lIiwgdHlwZToidGV4dCIsIHJlcXVpcmVkOnRydWUgfSwKICAgICAgeyBrZXk6ImpvYlRpdGxlIiwgbGFiZWw6IkpvYiBUaXRsZSAob3B0aW9uYWwpIiwgdHlwZToidGV4dCIsIHJlcXVpcmVkOmZhbHNlIH0sCiAgICAgIHsga2V5OiJ1cmwiLCBsYWJlbDoiUHJvZmlsZSBVUkwgKG9wdGlvbmFsKSIsIHR5cGU6InVybCIsIHJlcXVpcmVkOmZhbHNlIH0sCiAgICAgIHsga2V5OiJpbWFnZSIsIGxhYmVsOiJJbWFnZSBVUkwgKG9wdGlvbmFsKSIsIHR5cGU6InVybCIsIHJlcXVpcmVkOmZhbHNlIH0sCiAgICAgIHsga2V5OiJzYW1lQXMiLCBsYWJlbDoiUHJvZmlsZS9Tb2NpYWwgVVJMcyAoY29tbWEtc2VwYXJhdGVkLCBvcHRpb25hbCkiLCB0eXBlOiJ0ZXh0IiwgcmVxdWlyZWQ6ZmFsc2UgfQogICAgXSwKICAgICJSYXRpbmciOiBbCiAgICAgIHsga2V5OiJyYXRpbmdWYWx1ZSIsIGxhYmVsOiJSYXRpbmcgVmFsdWUgKG51bWJlcikiLCB0eXBlOiJ0ZXh0IiwgcmVxdWlyZWQ6dHJ1ZSwgcGxhY2Vob2xkZXI6IjQuNiIgfSwKICAgICAgeyBrZXk6ImJlc3RSYXRpbmciLCBsYWJlbDoiQmVzdCBSYXRpbmcgKG9wdGlvbmFsKSIsIHR5cGU6InRleHQiLCByZXF1aXJlZDpmYWxzZSwgcGxhY2Vob2xkZXI6IjUiIH0sCiAgICAgIHsga2V5OiJ3b3JzdFJhdGluZyIsIGxhYmVsOiJXb3JzdCBSYXRpbmcgKG9wdGlvbmFsKSIsIHR5cGU6InRleHQiLCByZXF1aXJlZDpmYWxzZSwgcGxhY2Vob2xkZXI6IjEiIH0sCiAgICAgIHsga2V5OiJyYXRpbmdDb3VudCIsIGxhYmVsOiJSYXRpbmcgQ291bnQgKG9wdGlvbmFsKSIsIHR5cGU6InRleHQiLCByZXF1aXJlZDpmYWxzZSwgcGxhY2Vob2xkZXI6IjEzNCIgfQogICAgXSwKICAgICJSZXZpZXciOiBbCiAgICAgIHsga2V5OiJpdGVtTmFtZSIsIGxhYmVsOiJJdGVtIEJlaW5nIFJldmlld2VkIChuYW1lKSIsIHR5cGU6InRleHQiLCByZXF1aXJlZDp0cnVlIH0sCiAgICAgIHsga2V5OiJpdGVtVHlwZSIsIGxhYmVsOiJJdGVtIFR5cGUgKG9wdGlvbmFsKSIsIHR5cGU6InRleHQiLCByZXF1aXJlZDpmYWxzZSwgcGxhY2Vob2xkZXI6IlByb2R1Y3QiIH0sCiAgICAgIHsga2V5OiJhdXRob3JOYW1lIiwgbGFiZWw6IkF1dGhvciBOYW1lIChvcHRpb25hbCkiLCB0eXBlOiJ0ZXh0IiwgcmVxdWlyZWQ6ZmFsc2UgfSwKICAgICAgeyBrZXk6InJldmlld0JvZHkiLCBsYWJlbDoiUmV2aWV3IFRleHQiLCB0eXBlOiJ0ZXh0YXJlYSIsIHJlcXVpcmVkOnRydWUgfSwKICAgICAgeyBrZXk6InJhdGluZ1ZhbHVlIiwgbGFiZWw6IlJhdGluZyBWYWx1ZSAobnVtYmVyKSIsIHR5cGU6InRleHQiLCByZXF1aXJlZDp0cnVlLCBwbGFjZWhvbGRlcjoiNSIgfSwKICAgICAgeyBrZXk6ImJlc3RSYXRpbmciLCBsYWJlbDoiQmVzdCBSYXRpbmcgKG9wdGlvbmFsKSIsIHR5cGU6InRleHQiLCByZXF1aXJlZDpmYWxzZSwgcGxhY2Vob2xkZXI6IjUiIH0sCiAgICAgIHsga2V5OiJkYXRlUHVibGlzaGVkIiwgbGFiZWw6IkRhdGUgUHVibGlzaGVkIChvcHRpb25hbCkiLCB0eXBlOiJ0ZXh0IiwgcmVxdWlyZWQ6ZmFsc2UsIHBsYWNlaG9sZGVyOiIyMDI2LTAyLTAyIiB9CiAgICBdLAogICAgIlZpZGVvIjogWwogICAgICB7IGtleToibmFtZSIsIGxhYmVsOiJWaWRlbyBOYW1lIiwgdHlwZToidGV4dCIsIHJlcXVpcmVkOnRydWUgfSwKICAgICAgeyBrZXk6ImRlc2NyaXB0aW9uIiwgbGFiZWw6IkRlc2NyaXB0aW9uIChvcHRpb25hbCkiLCB0eXBlOiJ0ZXh0YXJlYSIsIHJlcXVpcmVkOmZhbHNlIH0sCiAgICAgIHsga2V5OiJ0aHVtYm5haWxVcmwiLCBsYWJlbDoiVGh1bWJuYWlsIFVSTCAob3B0aW9uYWwpIiwgdHlwZToidXJsIiwgcmVxdWlyZWQ6ZmFsc2UgfSwKICAgICAgeyBrZXk6InVwbG9hZERhdGUiLCBsYWJlbDoiVXBsb2FkIERhdGUgKG9wdGlvbmFsLCBZWVlZLU1NLUREKSIsIHR5cGU6InRleHQiLCByZXF1aXJlZDpmYWxzZSwgcGxhY2Vob2xkZXI6IjIwMjYtMDItMDIiIH0sCiAgICAgIHsga2V5OiJkdXJhdGlvbiIsIGxhYmVsOiJEdXJhdGlvbiAob3B0aW9uYWwsIElTTyA4NjAxKSIsIHR5cGU6InRleHQiLCByZXF1aXJlZDpmYWxzZSwgcGxhY2Vob2xkZXI6IlBUMk0zMFMiIH0sCiAgICAgIHsga2V5OiJjb250ZW50VXJsIiwgbGFiZWw6IkNvbnRlbnQgVVJMIChvcHRpb25hbCkiLCB0eXBlOiJ1cmwiLCByZXF1aXJlZDpmYWxzZSB9LAogICAgICB7IGtleToiZW1iZWRVcmwiLCBsYWJlbDoiRW1iZWQgVVJMIChvcHRpb25hbCkiLCB0eXBlOiJ1cmwiLCByZXF1aXJlZDpmYWxzZSB9CiAgICBdLAogICAgIllvdXR1YmUgVmlkZW8iOiBbCiAgICAgIHsga2V5OiJuYW1lIiwgbGFiZWw6IlZpZGVvIE5hbWUiLCB0eXBlOiJ0ZXh0IiwgcmVxdWlyZWQ6dHJ1ZSB9LAogICAgICB7IGtleToiZGVzY3JpcHRpb24iLCBsYWJlbDoiRGVzY3JpcHRpb24gKG9wdGlvbmFsKSIsIHR5cGU6InRleHRhcmVhIiwgcmVxdWlyZWQ6ZmFsc2UgfSwKICAgICAgeyBrZXk6InlvdXR1YmVVcmwiLCBsYWJlbDoiWW91VHViZSBVUkwiLCB0eXBlOiJ1cmwiLCByZXF1aXJlZDp0cnVlLCBwbGFjZWhvbGRlcjoiaHR0cHM6Ly93d3cueW91dHViZS5jb20vd2F0Y2g/dj1YWFhYWFhYWFhYWCIgfSwKICAgICAgeyBrZXk6InRodW1ibmFpbFVybCIsIGxhYmVsOiJUaHVtYm5haWwgVVJMIChvcHRpb25hbCkiLCB0eXBlOiJ1cmwiLCByZXF1aXJlZDpmYWxzZSB9LAogICAgICB7IGtleToidXBsb2FkRGF0ZSIsIGxhYmVsOiJVcGxvYWQgRGF0ZSAob3B0aW9uYWwsIFlZWVktTU0tREQpIiwgdHlwZToidGV4dCIsIHJlcXVpcmVkOmZhbHNlLCBwbGFjZWhvbGRlcjoiMjAyNi0wMi0wMiIgfSwKICAgICAgeyBrZXk6ImR1cmF0aW9uIiwgbGFiZWw6IkR1cmF0aW9uIChvcHRpb25hbCwgSVNPIDg2MDEpIiwgdHlwZToidGV4dCIsIHJlcXVpcmVkOmZhbHNlLCBwbGFjZWhvbGRlcjoiUFQyTTMwUyIgfQogICAgXSwKICAgICJXZWJzaXRlIjogWwogICAgICB7IGtleToibmFtZSIsIGxhYmVsOiJXZWJzaXRlIE5hbWUiLCB0eXBlOiJ0ZXh0IiwgcmVxdWlyZWQ6dHJ1ZSB9LAogICAgICB7IGtleToidXJsIiwgbGFiZWw6IldlYnNpdGUgVVJMIiwgdHlwZToidXJsIiwgcmVxdWlyZWQ6dHJ1ZSwgcGxhY2Vob2xkZXI6Imh0dHBzOi8vZXhhbXBsZS5jb20iIH0sCiAgICAgIHsga2V5OiJkZXNjcmlwdGlvbiIsIGxhYmVsOiJEZXNjcmlwdGlvbiAob3B0aW9uYWwpIiwgdHlwZToidGV4dGFyZWEiLCByZXF1aXJlZDpmYWxzZSB9LAogICAgICB7IGtleToicHVibGlzaGVyTmFtZSIsIGxhYmVsOiJQdWJsaXNoZXIgLyBPcmdhbml6YXRpb24gTmFtZSAob3B0aW9uYWwpIiwgdHlwZToidGV4dCIsIHJlcXVpcmVkOmZhbHNlIH0sCiAgICAgIHsga2V5OiJzZWFyY2hUYXJnZXQiLCBsYWJlbDoiU2l0ZWxpbmtzIFNlYXJjaCBUYXJnZXQgKG9wdGlvbmFsKSIsIHR5cGU6InRleHQiLCByZXF1aXJlZDpmYWxzZSwgcGxhY2Vob2xkZXI6Imh0dHBzOi8vZXhhbXBsZS5jb20vc2VhcmNoP3E9e3NlYXJjaF90ZXJtX3N0cmluZ30iIH0KICAgIF0KICB9OwoKICAvLyA9PT09PT09PT0gUmVwZWF0YWJsZS1oZWF2eSBVSXMgPT09PT09PT09CiAgZnVuY3Rpb24gYnVpbGRCcmVhZGNydW1iVUkoYm9keSl7CiAgICBib2R5LmFwcGVuZENoaWxkKGVsKCJkaXYiLCB7IHN0eWxlOiBzdHlsZXMuc21hbGwgfSwgIkJyZWFkY3J1bWIgaXRlbXMgYXJlIHJlcXVpcmVkLiBBZGQgdGhlbSBpbiBvcmRlci4iKSk7CiAgICBjb25zdCBsaXN0ID0gZWwoImRpdiIsIHt9KTsKICAgIGNvbnN0IGFkZEJ0biA9IGVsKCJidXR0b24iLCB7IHR5cGU6ImJ1dHRvbiIsIHN0eWxlOiBzdHlsZXMuYnRuLCBvbmNsaWNrOiAoKSA9PiB7CiAgICAgIGFkZFJlcGVhdEJsb2NrKGxpc3QsICJCcmVhZGNydW1iIEl0ZW0iLCAoYik9PnsKICAgICAgICBiLmFwcGVuZENoaWxkKGdyaWQyKFsKICAgICAgICAgIGVsKCJkaXYiLCB7fSwgWwogICAgICAgICAgICBlbCgibGFiZWwiLCB7IHN0eWxlOiBzdHlsZXMubGFiZWwgKyAiZm9udC13ZWlnaHQ6NjUwOyIgfSwgIk5hbWUgKiIpLAogICAgICAgICAgICBlbCgiaW5wdXQiLCB7IHR5cGU6InRleHQiLCAiZGF0YS1rIjoibmFtZSIsICJkYXRhLXJlcXVpcmVkIjoiMSIsIHBsYWNlaG9sZGVyOiJIb21lIiwgc3R5bGU6IHN0eWxlcy5pbnB1dCB9KQogICAgICAgICAgXSksCiAgICAgICAgICBlbCgiZGl2Iiwge30sIFsKICAgICAgICAgICAgZWwoImxhYmVsIiwgeyBzdHlsZTogc3R5bGVzLmxhYmVsICsgImZvbnQtd2VpZ2h0OjY1MDsiIH0sICJVUkwgKiIpLAogICAgICAgICAgICBlbCgiaW5wdXQiLCB7IHR5cGU6InVybCIsICJkYXRhLWsiOiJpdGVtIiwgImRhdGEtcmVxdWlyZWQiOiIxIiwgcGxhY2Vob2xkZXI6Imh0dHBzOi8vZXhhbXBsZS5jb20vIiwgc3R5bGU6IHN0eWxlcy5pbnB1dCB9KQogICAgICAgICAgXSkKICAgICAgICBdKSk7CiAgICAgIH0pOwogICAgfX0sICJBZGQgQnJlYWRjcnVtYiBJdGVtIik7CiAgICBhZGRCdG4uY2xpY2soKTsgYWRkQnRuLmNsaWNrKCk7CiAgICBib2R5LmFwcGVuZENoaWxkKGFkZEJ0bik7CiAgICBib2R5LmFwcGVuZENoaWxkKGxpc3QpOwogIH0KCiAgZnVuY3Rpb24gYnVpbGRGYXFVSShib2R5KXsKICAgIGJvZHkuYXBwZW5kQ2hpbGQoZWwoImRpdiIsIHsgc3R5bGU6IHN0eWxlcy5zbWFsbCB9LCAiRkFRIGl0ZW1zIGFyZSByZXF1aXJlZC4gRWFjaCBiZWNvbWVzIGEgUXVlc3Rpb24gKyBhY2NlcHRlZEFuc3dlci4iKSk7CiAgICBjb25zdCBsaXN0ID0gZWwoImRpdiIsIHt9KTsKICAgIGNvbnN0IGFkZEJ0biA9IGVsKCJidXR0b24iLCB7IHR5cGU6ImJ1dHRvbiIsIHN0eWxlOiBzdHlsZXMuYnRuLCBvbmNsaWNrOiAoKSA9PiB7CiAgICAgIGFkZFJlcGVhdEJsb2NrKGxpc3QsICJGQVEgSXRlbSIsIChiKT0+ewogICAgICAgIGIuYXBwZW5kQ2hpbGQoZWwoImRpdiIsIHt9LCBbCiAgICAgICAgICBlbCgibGFiZWwiLCB7IHN0eWxlOiBzdHlsZXMubGFiZWwgKyAiZm9udC13ZWlnaHQ6NjUwOyIgfSwgIlF1ZXN0aW9uICoiKSwKICAgICAgICAgIGVsKCJpbnB1dCIsIHsgdHlwZToidGV4dCIsICJkYXRhLWsiOiJxIiwgImRhdGEtcmVxdWlyZWQiOiIxIiwgcGxhY2Vob2xkZXI6IldoYXQgaXMgeW91ciByZXR1cm4gcG9saWN5PyIsIHN0eWxlOiBzdHlsZXMuaW5wdXQgfSksCiAgICAgICAgICBlbCgibGFiZWwiLCB7IHN0eWxlOiBzdHlsZXMubGFiZWwgKyAiZm9udC13ZWlnaHQ6NjUwOyIgfSwgIkFuc3dlciAqIiksCiAgICAgICAgICBlbCgidGV4dGFyZWEiLCB7ICJkYXRhLWsiOiJhIiwgImRhdGEtcmVxdWlyZWQiOiIxIiwgcGxhY2Vob2xkZXI6IlJldHVybnMgYWNjZXB0ZWQgd2l0aGluIDMwIGRheXMuIiwgc3R5bGU6IHN0eWxlcy50ZXh0YXJlYSB9KQogICAgICAgIF0pKTsKICAgICAgfSk7CiAgICB9fSwgIkFkZCBGQVEgUSZBIik7CiAgICBhZGRCdG4uY2xpY2soKTsKICAgIGJvZHkuYXBwZW5kQ2hpbGQoYWRkQnRuKTsKICAgIGJvZHkuYXBwZW5kQ2hpbGQobGlzdCk7CiAgfQoKICBmdW5jdGlvbiBidWlsZEhvd1RvVUkoYm9keSwgYmxvY2tJZCl7CiAgICBjb25zdCB0b3BGaWVsZHMgPSBbCiAgICAgIHsga2V5OiJuYW1lIiwgbGFiZWw6Ikhvd1RvIE5hbWUiLCB0eXBlOiJ0ZXh0IiwgcmVxdWlyZWQ6dHJ1ZSB9LAogICAgICB7IGtleToiZGVzY3JpcHRpb24iLCBsYWJlbDoiRGVzY3JpcHRpb24gKG9wdGlvbmFsKSIsIHR5cGU6InRleHRhcmVhIiwgcmVxdWlyZWQ6ZmFsc2UgfSwKICAgICAgeyBrZXk6InRvdGFsVGltZSIsIGxhYmVsOiJUb3RhbCBUaW1lIChvcHRpb25hbCwgSVNPIDg2MDEgZS5nLiBQVDMwTSkiLCB0eXBlOiJ0ZXh0IiwgcmVxdWlyZWQ6ZmFsc2UsIHBsYWNlaG9sZGVyOiJQVDMwTSIgfSwKICAgICAgeyBrZXk6ImltYWdlIiwgbGFiZWw6IkltYWdlIFVSTCAob3B0aW9uYWwpIiwgdHlwZToidXJsIiwgcmVxdWlyZWQ6ZmFsc2UgfQogICAgXTsKICAgIGJvZHkuYXBwZW5kQ2hpbGQoZ3JpZDIodG9wRmllbGRzLm1hcChmID0+IGZpZWxkSW5wdXQoZiwgYmxvY2tJZCkpKSk7CgogICAgY29uc3Qgc3VwcGx5TGlzdCA9IGVsKCJkaXYiLCB7fSk7CiAgICBjb25zdCB0b29sTGlzdCA9IGVsKCJkaXYiLCB7fSk7CiAgICBjb25zdCBzdGVwTGlzdCA9IGVsKCJkaXYiLCB7fSk7CgogICAgY29uc3QgYWRkU3VwcGx5ID0gZWwoImJ1dHRvbiIsIHsgdHlwZToiYnV0dG9uIiwgc3R5bGU6IHN0eWxlcy5idG4sIG9uY2xpY2s6ICgpID0+IHsKICAgICAgYWRkUmVwZWF0QmxvY2soc3VwcGx5TGlzdCwgIlN1cHBseSIsIChiKT0+ewogICAgICAgIGIuYXBwZW5kQ2hpbGQoZWwoImRpdiIsIHt9LCBbCiAgICAgICAgICBlbCgibGFiZWwiLCB7IHN0eWxlOiBzdHlsZXMubGFiZWwgKyAiZm9udC13ZWlnaHQ6NjUwOyIgfSwgIlN1cHBseSBuYW1lICoiKSwKICAgICAgICAgIGVsKCJpbnB1dCIsIHsgdHlwZToidGV4dCIsICJkYXRhLWsiOiJzdXBwbHkiLCAiZGF0YS1yZXF1aXJlZCI6IjEiLCBwbGFjZWhvbGRlcjoiRmxvdXIiLCBzdHlsZTogc3R5bGVzLmlucHV0IH0pCiAgICAgICAgXSkpOwogICAgICB9KTsKICAgIH19LCAiQWRkIFN1cHBseSIpOwoKICAgIGNvbnN0IGFkZFRvb2wgPSBlbCgiYnV0dG9uIiwgeyB0eXBlOiJidXR0b24iLCBzdHlsZTogc3R5bGVzLmJ0biwgb25jbGljazogKCkgPT4gewogICAgICBhZGRSZXBlYXRCbG9jayh0b29sTGlzdCwgIlRvb2wiLCAoYik9PnsKICAgICAgICBiLmFwcGVuZENoaWxkKGVsKCJkaXYiLCB7fSwgWwogICAgICAgICAgZWwoImxhYmVsIiwgeyBzdHlsZTogc3R5bGVzLmxhYmVsICsgImZvbnQtd2VpZ2h0OjY1MDsiIH0sICJUb29sIG5hbWUgKiIpLAogICAgICAgICAgZWwoImlucHV0IiwgeyB0eXBlOiJ0ZXh0IiwgImRhdGEtayI6InRvb2wiLCAiZGF0YS1yZXF1aXJlZCI6IjEiLCBwbGFjZWhvbGRlcjoiTWl4aW5nIGJvd2wiLCBzdHlsZTogc3R5bGVzLmlucHV0IH0pCiAgICAgICAgXSkpOwogICAgICB9KTsKICAgIH19LCAiQWRkIFRvb2wiKTsKCiAgICBjb25zdCBhZGRTdGVwID0gZWwoImJ1dHRvbiIsIHsgdHlwZToiYnV0dG9uIiwgc3R5bGU6IHN0eWxlcy5idG4sIG9uY2xpY2s6ICgpID0+IHsKICAgICAgYWRkUmVwZWF0QmxvY2soc3RlcExpc3QsICJTdGVwIiwgKGIpPT57CiAgICAgICAgYi5hcHBlbmRDaGlsZChlbCgiZGl2Iiwge30sIFsKICAgICAgICAgIGVsKCJsYWJlbCIsIHsgc3R5bGU6IHN0eWxlcy5sYWJlbCArICJmb250LXdlaWdodDo2NTA7IiB9LCAiU3RlcCB0ZXh0ICoiKSwKICAgICAgICAgIGVsKCJ0ZXh0YXJlYSIsIHsgImRhdGEtayI6InN0ZXBUZXh0IiwgImRhdGEtcmVxdWlyZWQiOiIxIiwgcGxhY2Vob2xkZXI6IlByZWhlYXQgdGhlIG92ZW4gdG8gMzUwRi4iLCBzdHlsZTogc3R5bGVzLnRleHRhcmVhIH0pCiAgICAgICAgXSkpOwogICAgICB9KTsKICAgIH19LCAiQWRkIFN0ZXAiKTsKCiAgICBhZGRTdGVwLmNsaWNrKCk7IGFkZFN0ZXAuY2xpY2soKTsKCiAgICBib2R5LmFwcGVuZENoaWxkKGVsKCJkaXYiLCB7IHN0eWxlOiBzdHlsZXMuZGl2aWRlciB9KSk7CiAgICBib2R5LmFwcGVuZENoaWxkKGVsKCJkaXYiLCB7IHN0eWxlOiJkaXNwbGF5OmZsZXg7Z2FwOjEwcHg7ZmxleC13cmFwOndyYXA7IiB9LCBbCiAgICAgIGVsKCJkaXYiLCB7IHN0eWxlOiJmbGV4OjEgMSAzMjBweDttaW4td2lkdGg6MjYwcHg7IiB9LCBbCiAgICAgICAgZWwoImRpdiIsIHsgc3R5bGU6IHN0eWxlcy5zbWFsbCB9LCAiU3VwcGxpZXMgKG9wdGlvbmFsKSIpLAogICAgICAgIGFkZFN1cHBseSwKICAgICAgICBzdXBwbHlMaXN0CiAgICAgIF0pLAogICAgICBlbCgiZGl2IiwgeyBzdHlsZToiZmxleDoxIDEgMzIwcHg7bWluLXdpZHRoOjI2MHB4OyIgfSwgWwogICAgICAgIGVsKCJkaXYiLCB7IHN0eWxlOiBzdHlsZXMuc21hbGwgfSwgIlRvb2xzIChvcHRpb25hbCkiKSwKICAgICAgICBhZGRUb29sLAogICAgICAgIHRvb2xMaXN0CiAgICAgIF0pCiAgICBdKSk7CiAgICBib2R5LmFwcGVuZENoaWxkKGVsKCJkaXYiLCB7IHN0eWxlOiBzdHlsZXMuZGl2aWRlciB9KSk7CiAgICBib2R5LmFwcGVuZENoaWxkKGVsKCJkaXYiLCB7IHN0eWxlOiBzdHlsZXMuc21hbGwgfSwgIlN0ZXBzIChyZXF1aXJlZCkiKSk7CiAgICBib2R5LmFwcGVuZENoaWxkKGFkZFN0ZXApOwogICAgYm9keS5hcHBlbmRDaGlsZChzdGVwTGlzdCk7CiAgfQoKICBmdW5jdGlvbiBidWlsZFByb2R1Y3RVSShib2R5LCBibG9ja0lkKXsKICAgIGNvbnN0IGZpZWxkcyA9IFsKICAgICAgeyBrZXk6Im5hbWUiLCBsYWJlbDoiUHJvZHVjdCBOYW1lIiwgdHlwZToidGV4dCIsIHJlcXVpcmVkOnRydWUgfSwKICAgICAgeyBrZXk6ImRlc2NyaXB0aW9uIiwgbGFiZWw6IkRlc2NyaXB0aW9uIChvcHRpb25hbCkiLCB0eXBlOiJ0ZXh0YXJlYSIsIHJlcXVpcmVkOmZhbHNlIH0sCiAgICAgIHsga2V5OiJpbWFnZSIsIGxhYmVsOiJJbWFnZSBVUkwgKG9wdGlvbmFsKSIsIHR5cGU6InVybCIsIHJlcXVpcmVkOmZhbHNlIH0sCiAgICAgIHsga2V5OiJza3UiLCBsYWJlbDoiU0tVIChvcHRpb25hbCkiLCB0eXBlOiJ0ZXh0IiwgcmVxdWlyZWQ6ZmFsc2UgfSwKICAgICAgeyBrZXk6ImJyYW5kIiwgbGFiZWw6IkJyYW5kIChvcHRpb25hbCkiLCB0eXBlOiJ0ZXh0IiwgcmVxdWlyZWQ6ZmFsc2UgfSwKICAgICAgeyBrZXk6InVybCIsIGxhYmVsOiJQcm9kdWN0IFBhZ2UgVVJMIChvcHRpb25hbCkiLCB0eXBlOiJ1cmwiLCByZXF1aXJlZDpmYWxzZSB9CiAgICBdOwogICAgYm9keS5hcHBlbmRDaGlsZChncmlkMihmaWVsZHMubWFwKGYgPT4gZmllbGRJbnB1dChmLCBibG9ja0lkKSkpKTsKCiAgICBib2R5LmFwcGVuZENoaWxkKGVsKCJkaXYiLCB7IHN0eWxlOiBzdHlsZXMuZGl2aWRlciB9KSk7CiAgICBib2R5LmFwcGVuZENoaWxkKGVsKCJkaXYiLCB7IHN0eWxlOiBzdHlsZXMuc21hbGwgfSwgIkFnZ3JlZ2F0ZVJhdGluZyAob3B0aW9uYWw7IHVzZSBvbmx5IGlmIHlvdSBoYXZlIHJlYWwgcmF0aW5nIGNvdW50cykuIikpOwoKICAgIGNvbnN0IGFyUHJlZml4ID0gYmxvY2tJZCArICJfYXIiOwogICAgY29uc3QgYXJGaWVsZHMgPSBbCiAgICAgIHsga2V5OiJyYXRpbmdWYWx1ZSIsIGxhYmVsOiJSYXRpbmcgVmFsdWUgKG51bWJlcikiLCB0eXBlOiJ0ZXh0IiwgcmVxdWlyZWQ6ZmFsc2UsIHBsYWNlaG9sZGVyOiI0LjYiIH0sCiAgICAgIHsga2V5OiJyZXZpZXdDb3VudCIsIGxhYmVsOiJSZXZpZXcgQ291bnQgKG51bWJlciwgb3B0aW9uYWwpIiwgdHlwZToidGV4dCIsIHJlcXVpcmVkOmZhbHNlLCBwbGFjZWhvbGRlcjoiMTM0IiB9LAogICAgICB7IGtleToicmF0aW5nQ291bnQiLCBsYWJlbDoiUmF0aW5nIENvdW50IChudW1iZXIsIG9wdGlvbmFsKSIsIHR5cGU6InRleHQiLCByZXF1aXJlZDpmYWxzZSwgcGxhY2Vob2xkZXI6IjEzNCIgfSwKICAgICAgeyBrZXk6ImJlc3RSYXRpbmciLCBsYWJlbDoiQmVzdCBSYXRpbmcgKG51bWJlciwgb3B0aW9uYWwpIiwgdHlwZToidGV4dCIsIHJlcXVpcmVkOmZhbHNlLCBwbGFjZWhvbGRlcjoiNSIgfQogICAgXTsKICAgIGJvZHkuYXBwZW5kQ2hpbGQoZ3JpZDIoYXJGaWVsZHMubWFwKGYgPT4gZmllbGRJbnB1dChmLCBhclByZWZpeCkpKSk7CgogICAgYm9keS5hcHBlbmRDaGlsZChlbCgiZGl2IiwgeyBzdHlsZTogc3R5bGVzLmRpdmlkZXIgfSkpOwogICAgYm9keS5hcHBlbmRDaGlsZChlbCgiZGl2IiwgeyBzdHlsZTogc3R5bGVzLnNtYWxsIH0sICJPZmZlcnMgKHJlcXVpcmVkKTogYWRkIGF0IGxlYXN0IG9uZSBwcmljZSArIGN1cnJlbmN5LiIpKTsKCiAgICBjb25zdCBvZmZlckxpc3QgPSBlbCgiZGl2Iiwge30pOwogICAgY29uc3QgYWRkT2ZmZXIgPSBlbCgiYnV0dG9uIiwgeyB0eXBlOiJidXR0b24iLCBzdHlsZTogc3R5bGVzLmJ0biwgb25jbGljazogKCkgPT4gewogICAgICBhZGRSZXBlYXRCbG9jayhvZmZlckxpc3QsICJPZmZlciIsIChiKT0+ewogICAgICAgIGIuYXBwZW5kQ2hpbGQoZ3JpZDIoWwogICAgICAgICAgZWwoImRpdiIsIHt9LCBbCiAgICAgICAgICAgIGVsKCJsYWJlbCIsIHsgc3R5bGU6IHN0eWxlcy5sYWJlbCArICJmb250LXdlaWdodDo2NTA7IiB9LCAiUHJpY2UgKiIpLAogICAgICAgICAgICBlbCgiaW5wdXQiLCB7IHR5cGU6InRleHQiLCAiZGF0YS1rIjoicHJpY2UiLCAiZGF0YS1yZXF1aXJlZCI6IjEiLCBwbGFjZWhvbGRlcjoiMTkuOTkiLCBzdHlsZTogc3R5bGVzLmlucHV0IH0pCiAgICAgICAgICBdKSwKICAgICAgICAgIGVsKCJkaXYiLCB7fSwgWwogICAgICAgICAgICBlbCgibGFiZWwiLCB7IHN0eWxlOiBzdHlsZXMubGFiZWwgKyAiZm9udC13ZWlnaHQ6NjUwOyIgfSwgIkN1cnJlbmN5ICoiKSwKICAgICAgICAgICAgZWwoImlucHV0IiwgeyB0eXBlOiJ0ZXh0IiwgImRhdGEtayI6InByaWNlQ3VycmVuY3kiLCAiZGF0YS1yZXF1aXJlZCI6IjEiLCBwbGFjZWhvbGRlcjoiVVNEIiwgc3R5bGU6IHN0eWxlcy5pbnB1dCB9KQogICAgICAgICAgXSksCiAgICAgICAgICBlbCgiZGl2Iiwge30sIFsKICAgICAgICAgICAgZWwoImxhYmVsIiwgeyBzdHlsZTogc3R5bGVzLmxhYmVsIH0sICJBdmFpbGFiaWxpdHkgVVJMIChvcHRpb25hbCkiKSwKICAgICAgICAgICAgZWwoImlucHV0IiwgeyB0eXBlOiJ0ZXh0IiwgImRhdGEtayI6ImF2YWlsYWJpbGl0eSIsIHBsYWNlaG9sZGVyOiJodHRwczovL3NjaGVtYS5vcmcvSW5TdG9jayIsIHN0eWxlOiBzdHlsZXMuaW5wdXQgfSkKICAgICAgICAgIF0pLAogICAgICAgICAgZWwoImRpdiIsIHt9LCBbCiAgICAgICAgICAgIGVsKCJsYWJlbCIsIHsgc3R5bGU6IHN0eWxlcy5sYWJlbCB9LCAiT2ZmZXIgVVJMIChvcHRpb25hbCkiKSwKICAgICAgICAgICAgZWwoImlucHV0IiwgeyB0eXBlOiJ1cmwiLCAiZGF0YS1rIjoib2ZmZXJVcmwiLCBwbGFjZWhvbGRlcjoiaHR0cHM6Ly9leGFtcGxlLmNvbS9wcm9kdWN0Iiwgc3R5bGU6IHN0eWxlcy5pbnB1dCB9KQogICAgICAgICAgXSkKICAgICAgICBdKSk7CiAgICAgIH0pOwogICAgfX0sICJBZGQgT2ZmZXIiKTsKCiAgICBhZGRPZmZlci5jbGljaygpOwogICAgYm9keS5hcHBlbmRDaGlsZChhZGRPZmZlcik7CiAgICBib2R5LmFwcGVuZENoaWxkKG9mZmVyTGlzdCk7CiAgfQoKICBmdW5jdGlvbiBidWlsZFJlY2lwZVVJKGJvZHksIGJsb2NrSWQpewogICAgY29uc3QgZmllbGRzID0gWwogICAgICB7IGtleToibmFtZSIsIGxhYmVsOiJSZWNpcGUgTmFtZSIsIHR5cGU6InRleHQiLCByZXF1aXJlZDp0cnVlIH0sCiAgICAgIHsga2V5OiJkZXNjcmlwdGlvbiIsIGxhYmVsOiJEZXNjcmlwdGlvbiAob3B0aW9uYWwpIiwgdHlwZToidGV4dGFyZWEiLCByZXF1aXJlZDpmYWxzZSB9LAogICAgICB7IGtleToiaW1hZ2UiLCBsYWJlbDoiSW1hZ2UgVVJMIChvcHRpb25hbCkiLCB0eXBlOiJ1cmwiLCByZXF1aXJlZDpmYWxzZSB9LAogICAgICB7IGtleToicHJlcFRpbWUiLCBsYWJlbDoiUHJlcCBUaW1lIChvcHRpb25hbCwgSVNPIDg2MDEgZS5nLiBQVDE1TSkiLCB0eXBlOiJ0ZXh0IiwgcmVxdWlyZWQ6ZmFsc2UsIHBsYWNlaG9sZGVyOiJQVDE1TSIgfSwKICAgICAgeyBrZXk6ImNvb2tUaW1lIiwgbGFiZWw6IkNvb2sgVGltZSAob3B0aW9uYWwsIElTTyA4NjAxIGUuZy4gUFQzME0pIiwgdHlwZToidGV4dCIsIHJlcXVpcmVkOmZhbHNlLCBwbGFjZWhvbGRlcjoiUFQzME0iIH0sCiAgICAgIHsga2V5OiJ0b3RhbFRpbWUiLCBsYWJlbDoiVG90YWwgVGltZSAob3B0aW9uYWwsIElTTyA4NjAxKSIsIHR5cGU6InRleHQiLCByZXF1aXJlZDpmYWxzZSwgcGxhY2Vob2xkZXI6IlBUNDVNIiB9LAogICAgICB7IGtleToicmVjaXBlWWllbGQiLCBsYWJlbDoiWWllbGQgKG9wdGlvbmFsKSIsIHR5cGU6InRleHQiLCByZXF1aXJlZDpmYWxzZSwgcGxhY2Vob2xkZXI6IjQgc2VydmluZ3MiIH0KICAgIF07CiAgICBib2R5LmFwcGVuZENoaWxkKGdyaWQyKGZpZWxkcy5tYXAoZiA9PiBmaWVsZElucHV0KGYsIGJsb2NrSWQpKSkpOwoKICAgIGJvZHkuYXBwZW5kQ2hpbGQoZWwoImRpdiIsIHsgc3R5bGU6IHN0eWxlcy5kaXZpZGVyIH0pKTsKCiAgICBjb25zdCBpbmdMaXN0ID0gZWwoImRpdiIsIHt9KTsKICAgIGNvbnN0IHN0ZXBMaXN0ID0gZWwoImRpdiIsIHt9KTsKCiAgICBjb25zdCBhZGRJbmcgPSBlbCgiYnV0dG9uIiwgeyB0eXBlOiJidXR0b24iLCBzdHlsZTogc3R5bGVzLmJ0biwgb25jbGljazogKCkgPT4gewogICAgICBhZGRSZXBlYXRCbG9jayhpbmdMaXN0LCAiSW5ncmVkaWVudCIsIChiKT0+ewogICAgICAgIGIuYXBwZW5kQ2hpbGQoZWwoImRpdiIsIHt9LCBbCiAgICAgICAgICBlbCgibGFiZWwiLCB7IHN0eWxlOiBzdHlsZXMubGFiZWwgKyAiZm9udC13ZWlnaHQ6NjUwOyIgfSwgIkluZ3JlZGllbnQgKiIpLAogICAgICAgICAgZWwoImlucHV0IiwgeyB0eXBlOiJ0ZXh0IiwgImRhdGEtayI6ImluZ3JlZGllbnQiLCAiZGF0YS1yZXF1aXJlZCI6IjEiLCBwbGFjZWhvbGRlcjoiMiBjdXBzIGZsb3VyIiwgc3R5bGU6IHN0eWxlcy5pbnB1dCB9KQogICAgICAgIF0pKTsKICAgICAgfSk7CiAgICB9fSwgIkFkZCBJbmdyZWRpZW50Iik7CgogICAgY29uc3QgYWRkU3RlcCA9IGVsKCJidXR0b24iLCB7IHR5cGU6ImJ1dHRvbiIsIHN0eWxlOiBzdHlsZXMuYnRuLCBvbmNsaWNrOiAoKSA9PiB7CiAgICAgIGFkZFJlcGVhdEJsb2NrKHN0ZXBMaXN0LCAiSW5zdHJ1Y3Rpb24gU3RlcCIsIChiKT0+ewogICAgICAgIGIuYXBwZW5kQ2hpbGQoZWwoImRpdiIsIHt9LCBbCiAgICAgICAgICBlbCgibGFiZWwiLCB7IHN0eWxlOiBzdHlsZXMubGFiZWwgKyAiZm9udC13ZWlnaHQ6NjUwOyIgfSwgIlN0ZXAgdGV4dCAqIiksCiAgICAgICAgICBlbCgidGV4dGFyZWEiLCB7ICJkYXRhLWsiOiJpbnN0cnVjdGlvbiIsICJkYXRhLXJlcXVpcmVkIjoiMSIsIHBsYWNlaG9sZGVyOiJNaXggaW5ncmVkaWVudHMgaW4gYSBib3dsLiIsIHN0eWxlOiBzdHlsZXMudGV4dGFyZWEgfSkKICAgICAgICBdKSk7CiAgICAgIH0pOwogICAgfX0sICJBZGQgSW5zdHJ1Y3Rpb24gU3RlcCIpOwoKICAgIGFkZEluZy5jbGljaygpOyBhZGRJbmcuY2xpY2soKTsKICAgIGFkZFN0ZXAuY2xpY2soKTsgYWRkU3RlcC5jbGljaygpOwoKICAgIGJvZHkuYXBwZW5kQ2hpbGQoZWwoImRpdiIsIHsgc3R5bGU6ImRpc3BsYXk6ZmxleDtnYXA6MTBweDtmbGV4LXdyYXA6d3JhcDsiIH0sIFsKICAgICAgZWwoImRpdiIsIHsgc3R5bGU6ImZsZXg6MSAxIDM2MHB4O21pbi13aWR0aDoyNjBweDsiIH0sIFsKICAgICAgICBlbCgiZGl2IiwgeyBzdHlsZTogc3R5bGVzLnNtYWxsICsgImZvbnQtd2VpZ2h0OjY1MDtjb2xvcjojZmZjYzY2OyIgfSwgIkluZ3JlZGllbnRzIChyZXF1aXJlZCkiKSwKICAgICAgICBhZGRJbmcsIGluZ0xpc3QKICAgICAgXSksCiAgICAgIGVsKCJkaXYiLCB7IHN0eWxlOiJmbGV4OjEgMSAzNjBweDttaW4td2lkdGg6MjYwcHg7IiB9LCBbCiAgICAgICAgZWwoImRpdiIsIHsgc3R5bGU6IHN0eWxlcy5zbWFsbCArICJmb250LXdlaWdodDo2NTA7Y29sb3I6I2ZmY2M2NjsiIH0sICJJbnN0cnVjdGlvbnMgKHJlcXVpcmVkKSIpLAogICAgICAgIGFkZFN0ZXAsIHN0ZXBMaXN0CiAgICAgIF0pCiAgICBdKSk7CiAgfQoKICAvLyA9PT09PT09PT0gQmxvY2tzID09PT09PT09PQogIGNvbnN0IGJsb2NrcyA9IFtdOyAvLyB7aWQsdHlwZSxub2RlfQoKICBmdW5jdGlvbiBidWlsZFNjaGVtYUNhcmQodHlwZSwgaWQpewogICAgY29uc3QgY2FyZCA9IGVsKCJkaXYiLCB7IHN0eWxlOiBzdHlsZXMuc2NoZW1hQ2FyZCwgImRhdGEtYmxvY2staWQiOiBpZCB9KTsKCiAgICBjb25zdCBoZWFkID0gZWwoImRpdiIsIHsgc3R5bGU6ImRpc3BsYXk6ZmxleDtqdXN0aWZ5LWNvbnRlbnQ6c3BhY2UtYmV0d2VlbjtnYXA6MTBweDthbGlnbi1pdGVtczpjZW50ZXI7ZmxleC13cmFwOndyYXA7IiB9LCBbCiAgICAgIGVsKCJkaXYiLCB7fSwgWwogICAgICAgIGVsKCJkaXYiLCB7IHN0eWxlOiJmb250LXdlaWdodDo2NTA7IiB9LCB0eXBlKSwKICAgICAgICBlbCgiZGl2IiwgeyBzdHlsZTogc3R5bGVzLnNtYWxsIH0sICJCbG9jayBJRDogIiArIGlkKQogICAgICBdKSwKICAgICAgZWwoImJ1dHRvbiIsIHsgdHlwZToiYnV0dG9uIiwgc3R5bGU6IHN0eWxlcy5idG5EYW5nZXIsIG9uY2xpY2s6ICgpID0+IHJlbW92ZVNjaGVtYUJsb2NrKGlkKSB9LCAiUmVtb3ZlIEJsb2NrIikKICAgIF0pOwoKICAgIGNvbnN0IGJvZHkgPSBlbCgiZGl2Iiwge30pOwogICAgaWYodHlwZSA9PT0gIkJyZWFkY3J1bWIiKSBidWlsZEJyZWFkY3J1bWJVSShib2R5KTsKICAgIGVsc2UgaWYodHlwZSA9PT0gIkZBUSBQYWdlIikgYnVpbGRGYXFVSShib2R5KTsKICAgIGVsc2UgaWYodHlwZSA9PT0gIkhvdyBUbyIpIGJ1aWxkSG93VG9VSShib2R5LCBpZCk7CiAgICBlbHNlIGlmKHR5cGUgPT09ICJQcm9kdWN0IikgYnVpbGRQcm9kdWN0VUkoYm9keSwgaWQpOwogICAgZWxzZSBpZih0eXBlID09PSAiUmVjaXBlIikgYnVpbGRSZWNpcGVVSShib2R5LCBpZCk7CiAgICBlbHNlIHsKICAgICAgY29uc3QgZmllbGRzID0gRklFTERTRVRTW3R5cGVdIHx8IFtdOwogICAgICBib2R5LmFwcGVuZENoaWxkKGdyaWQyKGZpZWxkcy5tYXAoZiA9PiBmaWVsZElucHV0KGYsIGlkKSkpKTsKICAgICAgaWYodHlwZSA9PT0gIk9yZ2FuaXphdGlvbiIgfHwgdHlwZSA9PT0gIlBlcnNvbiIpewogICAgICAgIGJvZHkuYXBwZW5kQ2hpbGQoZWwoImRpdiIsIHsgc3R5bGU6IHN0eWxlcy5zbWFsbCB9LCAiVGlwOiBQdXQgc29jaWFsL3Byb2ZpbGUgVVJMcyBpbiBzYW1lQXMgYXMgY29tbWEtc2VwYXJhdGVkIFVSTHMuIikpOwogICAgICB9CiAgICB9CgogICAgY2FyZC5hcHBlbmRDaGlsZChoZWFkKTsKICAgIGNhcmQuYXBwZW5kQ2hpbGQoZWwoImRpdiIsIHsgc3R5bGU6IHN0eWxlcy5kaXZpZGVyIH0pKTsKICAgIGNhcmQuYXBwZW5kQ2hpbGQoYm9keSk7CgogICAgLy8gZW5hYmxlIGF1dG8tY2xlYXJpbmcgaW52YWxpZCBoaWdobGlnaHRzIGluc2lkZSB0aGlzIGNhcmQKICAgIGF0dGFjaEF1dG9DbGVhckludmFsaWQoY2FyZCk7CgogICAgcmV0dXJuIGNhcmQ7CiAgfQoKICBmdW5jdGlvbiBhZGRTY2hlbWFCbG9jayh0eXBlKXsKICAgIGNvbnN0IGlkID0gdWlkKCk7CiAgICBjb25zdCBub2RlID0gYnVpbGRTY2hlbWFDYXJkKHR5cGUsIGlkKTsKICAgICQoIiNzY2hlbWFzSG9zdCIpLmFwcGVuZENoaWxkKG5vZGUpOwogICAgYmxvY2tzLnB1c2goeyBpZCwgdHlwZSwgbm9kZSB9KTsKICAgIHNldFN0YXR1cygiQWRkZWQgIiArIHR5cGUgKyAiIGJsb2NrLiIsICJvayIpOwogICAgbm9kZS5zY3JvbGxJbnRvVmlldyh7IGJlaGF2aW9yOiJzbW9vdGgiLCBibG9jazoic3RhcnQiIH0pOwogIH0KCiAgZnVuY3Rpb24gcmVtb3ZlU2NoZW1hQmxvY2soaWQpewogICAgY29uc3QgaWR4ID0gYmxvY2tzLmZpbmRJbmRleChiID0+IGIuaWQgPT09IGlkKTsKICAgIGlmKGlkeCA+PSAwKXsKICAgICAgYmxvY2tzW2lkeF0ubm9kZS5yZW1vdmUoKTsKICAgICAgYmxvY2tzLnNwbGljZShpZHgsIDEpOwogICAgICBzZXRTdGF0dXMoIlJlbW92ZWQgc2NoZW1hIGJsb2NrLiIsICJvayIpOwogICAgfQogIH0KCiAgLy8gPT09PT09PT09IENvbGxlY3QgLyBWYWxpZGF0ZSA9PT09PT09PT0KICBmdW5jdGlvbiBjb2xsZWN0TmFtZWRGaWVsZHMoYmxvY2spewogICAgY29uc3QgdmFsdWVzID0ge307CiAgICAkJCgiaW5wdXRbbmFtZV0sdGV4dGFyZWFbbmFtZV0sc2VsZWN0W25hbWVdIiwgYmxvY2subm9kZSkuZm9yRWFjaChpbnAgPT4gewogICAgICB2YWx1ZXNbaW5wLm5hbWVdID0gaW5wLnZhbHVlOwogICAgfSk7CiAgICByZXR1cm4gdmFsdWVzOwogIH0KCiAgLy8gcmV0dXJuczogeyBtaXNzaW5nOiBzdHJpbmdbXSwgZmlyc3RJbnZhbGlkRWw6IEhUTUxFbGVtZW50fG51bGwgfQogIGZ1bmN0aW9uIHZhbGlkYXRlQmxvY2soYmxvY2spewogICAgY29uc3QgbWlzc2luZyA9IFtdOwogICAgbGV0IGZpcnN0SW52YWxpZEVsID0gbnVsbDsKCiAgICAvLyBSZXF1aXJlZCBmaWVsZHMgKG5hbWVkICsgcmVwZWF0YWJsZXMpCiAgICAkJCgiW2RhdGEtcmVxdWlyZWQ9JzEnXSIsIGJsb2NrLm5vZGUpLmZvckVhY2goaW5wID0+IHsKICAgICAgY29uc3QgZW1wdHkgPSAhc2FmZVRyaW0oaW5wLnZhbHVlKTsKICAgICAgaWYoIWVtcHR5KSB7IGNsZWFySW52YWxpZChpbnApOyByZXR1cm47IH0KCiAgICAgIG1hcmtJbnZhbGlkKGlucCk7CiAgICAgIGlmKCFmaXJzdEludmFsaWRFbCkgZmlyc3RJbnZhbGlkRWwgPSBpbnA7CgogICAgICBpZihpbnAubmFtZSl7CiAgICAgICAgY29uc3QgbGFiID0gYmxvY2subm9kZS5xdWVyeVNlbGVjdG9yKGBsYWJlbFtmb3I9IiR7aW5wLmlkfSJdYCk/LnRleHRDb250ZW50Py5yZXBsYWNlKCIqIiwiIikudHJpbSgpIHx8IGlucC5uYW1lOwogICAgICAgIG1pc3NpbmcucHVzaChgJHtibG9jay50eXBlfTogJHtsYWJ9YCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY29uc3QgbGFiID0gaW5wLmNsb3Nlc3QoImRpdiIpPy5xdWVyeVNlbGVjdG9yKCJsYWJlbCIpPy50ZXh0Q29udGVudD8ucmVwbGFjZSgiKiIsIiIpLnRyaW0oKSB8fCAiUmVxdWlyZWQgZmllbGQiOwogICAgICAgIG1pc3NpbmcucHVzaChgJHtibG9jay50eXBlfTogJHtsYWJ9YCk7CiAgICAgIH0KICAgIH0pOwoKICAgIC8vIFN0cnVjdHVyYWwgcmVxdWlyZW1lbnRzIChtZXNzYWdlLW9ubHk7IHN0aWxsIHVzZWZ1bCkKICAgIGlmKGJsb2NrLnR5cGUgPT09ICJCcmVhZGNydW1iIil7CiAgICAgIGNvbnN0IGl0ZW1zID0gJCQoIi5yZXBlYXQiLCBibG9jay5ub2RlKS5maWx0ZXIociA9PiByLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWs9Im5hbWUiXScpKTsKICAgICAgaWYoaXRlbXMubGVuZ3RoIDwgMSkgbWlzc2luZy5wdXNoKCJCcmVhZGNydW1iOiBhZGQgYXQgbGVhc3QgMSBicmVhZGNydW1iIGl0ZW0iKTsKICAgIH0KICAgIGlmKGJsb2NrLnR5cGUgPT09ICJGQVEgUGFnZSIpewogICAgICBjb25zdCBpdGVtcyA9ICQkKCIucmVwZWF0IiwgYmxvY2subm9kZSkuZmlsdGVyKHIgPT4gci5xdWVyeVNlbGVjdG9yKCdbZGF0YS1rPSJxIl0nKSk7CiAgICAgIGlmKGl0ZW1zLmxlbmd0aCA8IDEpIG1pc3NpbmcucHVzaCgiRkFRIFBhZ2U6IGFkZCBhdCBsZWFzdCAxIFEmQSIpOwogICAgfQogICAgaWYoYmxvY2sudHlwZSA9PT0gIkhvdyBUbyIpewogICAgICBjb25zdCBzdGVwcyA9ICQkKCIucmVwZWF0IiwgYmxvY2subm9kZSkuZmlsdGVyKHIgPT4gci5xdWVyeVNlbGVjdG9yKCd0ZXh0YXJlYVtkYXRhLWs9InN0ZXBUZXh0Il0nKSk7CiAgICAgIGlmKHN0ZXBzLmxlbmd0aCA8IDEpIG1pc3NpbmcucHVzaCgiSG93IFRvOiBhZGQgYXQgbGVhc3QgMSBzdGVwIik7CiAgICB9CiAgICBpZihibG9jay50eXBlID09PSAiUmVjaXBlIil7CiAgICAgIGNvbnN0IGluZ3MgPSAkJCgiLnJlcGVhdCIsIGJsb2NrLm5vZGUpLmZpbHRlcihyID0+IHIucXVlcnlTZWxlY3RvcignaW5wdXRbZGF0YS1rPSJpbmdyZWRpZW50Il0nKSk7CiAgICAgIGNvbnN0IGlucyAgPSAkJCgiLnJlcGVhdCIsIGJsb2NrLm5vZGUpLmZpbHRlcihyID0+IHIucXVlcnlTZWxlY3RvcigndGV4dGFyZWFbZGF0YS1rPSJpbnN0cnVjdGlvbiJdJykpOwogICAgICBpZihpbmdzLmxlbmd0aCA8IDEpIG1pc3NpbmcucHVzaCgiUmVjaXBlOiBhZGQgYXQgbGVhc3QgMSBpbmdyZWRpZW50Iik7CiAgICAgIGlmKGlucy5sZW5ndGggPCAxKSBtaXNzaW5nLnB1c2goIlJlY2lwZTogYWRkIGF0IGxlYXN0IDEgaW5zdHJ1Y3Rpb24gc3RlcCIpOwogICAgfQogICAgaWYoYmxvY2sudHlwZSA9PT0gIlByb2R1Y3QiKXsKICAgICAgY29uc3Qgb2ZmZXJzID0gJCQoIi5yZXBlYXQiLCBibG9jay5ub2RlKS5maWx0ZXIociA9PiByLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWs9InByaWNlIl0nKSk7CiAgICAgIGlmKG9mZmVycy5sZW5ndGggPCAxKSBtaXNzaW5nLnB1c2goIlByb2R1Y3Q6IGFkZCBhdCBsZWFzdCAxIG9mZmVyIik7CiAgICB9CgogICAgcmV0dXJuIHsgbWlzc2luZywgZmlyc3RJbnZhbGlkRWwgfTsKICB9CgogIC8vID09PT09PT09PSBKU09OLUxEIEJ1aWxkZXJzID09PT09PT09PQogIGZ1bmN0aW9uIGJhc2VDb250ZXh0KCl7IHJldHVybiB7fTsgfSAvLyBjb250ZXh0IGFwcGxpZWQgb25jZSBhdCByb290CgogIGZ1bmN0aW9uIGJ1aWxkQWRkcmVzcyh2KXsKICAgIGNvbnN0IGhhcyA9IFsic3RyZWV0QWRkcmVzcyIsImFkZHJlc3NMb2NhbGl0eSIsImFkZHJlc3NSZWdpb24iLCJwb3N0YWxDb2RlIiwiYWRkcmVzc0NvdW50cnkiXS5zb21lKGsgPT4gc2FmZVRyaW0odltrXSkpOwogICAgaWYoIWhhcykgcmV0dXJuIG51bGw7CiAgICByZXR1cm4gewogICAgICAiQHR5cGUiOiJQb3N0YWxBZGRyZXNzIiwKICAgICAgLi4uKHNhZmVUcmltKHYuc3RyZWV0QWRkcmVzcykgPyB7IHN0cmVldEFkZHJlc3M6IHNhZmVUcmltKHYuc3RyZWV0QWRkcmVzcykgfSA6IHt9KSwKICAgICAgLi4uKHNhZmVUcmltKHYuYWRkcmVzc0xvY2FsaXR5KSA/IHsgYWRkcmVzc0xvY2FsaXR5OiBzYWZlVHJpbSh2LmFkZHJlc3NMb2NhbGl0eSkgfSA6IHt9KSwKICAgICAgLi4uKHNhZmVUcmltKHYuYWRkcmVzc1JlZ2lvbikgPyB7IGFkZHJlc3NSZWdpb246IHNhZmVUcmltKHYuYWRkcmVzc1JlZ2lvbikgfSA6IHt9KSwKICAgICAgLi4uKHNhZmVUcmltKHYucG9zdGFsQ29kZSkgPyB7IHBvc3RhbENvZGU6IHNhZmVUcmltKHYucG9zdGFsQ29kZSkgfSA6IHt9KSwKICAgICAgLi4uKHNhZmVUcmltKHYuYWRkcmVzc0NvdW50cnkpID8geyBhZGRyZXNzQ291bnRyeTogc2FmZVRyaW0odi5hZGRyZXNzQ291bnRyeSkgfSA6IHt9KQogICAgfTsKICB9CgogIGZ1bmN0aW9uIGJ1aWxkQnJlYWRjcnVtYihibG9jaywgcGFnZVVybCl7CiAgICBjb25zdCB1cmwgPSBzYWZlVHJpbShwYWdlVXJsKTsKICAgIGNvbnN0IGl0ZW1zID0gJCQoIi5yZXBlYXQiLCBibG9jay5ub2RlKS5tYXAoKHIsIGlkeCkgPT4gewogICAgICBjb25zdCBuYW1lID0gc2FmZVRyaW0oci5xdWVyeVNlbGVjdG9yKCdbZGF0YS1rPSJuYW1lIl0nKT8udmFsdWUpOwogICAgICBjb25zdCBpdGVtID0gc2FmZVRyaW0oci5xdWVyeVNlbGVjdG9yKCdbZGF0YS1rPSJpdGVtIl0nKT8udmFsdWUpOwogICAgICByZXR1cm4gKG5hbWUgJiYgaXRlbSkgPyB7ICJAdHlwZSI6Ikxpc3RJdGVtIiwgcG9zaXRpb246IGlkeCsxLCBuYW1lLCBpdGVtIH0gOiBudWxsOwogICAgfSkuZmlsdGVyKEJvb2xlYW4pOwoKICAgIGNvbnN0IG9iaiA9IHsgLi4uYmFzZUNvbnRleHQoKSwgIkB0eXBlIjoiQnJlYWRjcnVtYkxpc3QiLCBpdGVtTGlzdEVsZW1lbnQ6IGl0ZW1zIH07CiAgICBpZih1cmwpIG9ialsiQGlkIl0gPSB1cmwgKyAiI2JyZWFkY3J1bWIiOwogICAgcmV0dXJuIG9iajsKICB9CgogIGZ1bmN0aW9uIGJ1aWxkRkFRKGJsb2NrLCBwYWdlVXJsKXsKICAgIGNvbnN0IHVybCA9IHNhZmVUcmltKHBhZ2VVcmwpOwogICAgY29uc3QgcWEgPSAkJCgiLnJlcGVhdCIsIGJsb2NrLm5vZGUpLm1hcChyID0+IHsKICAgICAgY29uc3QgcSA9IHNhZmVUcmltKHIucXVlcnlTZWxlY3RvcignW2RhdGEtaz0icSJdJyk/LnZhbHVlKTsKICAgICAgY29uc3QgYSA9IHNhZmVUcmltKHIucXVlcnlTZWxlY3RvcignW2RhdGEtaz0iYSJdJyk/LnZhbHVlKTsKICAgICAgaWYoIXEgfHwgIWEpIHJldHVybiBudWxsOwogICAgICByZXR1cm4geyAiQHR5cGUiOiJRdWVzdGlvbiIsIG5hbWU6cSwgYWNjZXB0ZWRBbnN3ZXI6eyAiQHR5cGUiOiJBbnN3ZXIiLCB0ZXh0OmEgfSB9OwogICAgfSkuZmlsdGVyKEJvb2xlYW4pOwoKICAgIGNvbnN0IG9iaiA9IHsgLi4uYmFzZUNvbnRleHQoKSwgIkB0eXBlIjoiRkFRUGFnZSIsIG1haW5FbnRpdHk6IHFhIH07CiAgICBpZih1cmwpIG9ialsiQGlkIl0gPSB1cmwgKyAiI2ZhcSI7CiAgICByZXR1cm4gb2JqOwogIH0KCiAgZnVuY3Rpb24gYnVpbGRIb3dUbyhibG9jaywgcGFnZVVybCl7CiAgICBjb25zdCB2ID0gY29sbGVjdE5hbWVkRmllbGRzKGJsb2NrKTsKICAgIGNvbnN0IHVybCA9IHNhZmVUcmltKHBhZ2VVcmwpOwoKICAgIGNvbnN0IHN1cHBseSA9ICQkKCIucmVwZWF0IiwgYmxvY2subm9kZSkKICAgICAgLm1hcChyID0+IHNhZmVUcmltKHIucXVlcnlTZWxlY3RvcignaW5wdXRbZGF0YS1rPSJzdXBwbHkiXScpPy52YWx1ZSkpCiAgICAgIC5maWx0ZXIoQm9vbGVhbikKICAgICAgLm1hcChuYW1lID0+ICh7ICJAdHlwZSI6Ikhvd1RvU3VwcGx5IiwgbmFtZSB9KSk7CgogICAgY29uc3QgdG9vbCA9ICQkKCIucmVwZWF0IiwgYmxvY2subm9kZSkKICAgICAgLm1hcChyID0+IHNhZmVUcmltKHIucXVlcnlTZWxlY3RvcignaW5wdXRbZGF0YS1rPSJ0b29sIl0nKT8udmFsdWUpKQogICAgICAuZmlsdGVyKEJvb2xlYW4pCiAgICAgIC5tYXAobmFtZSA9PiAoeyAiQHR5cGUiOiJIb3dUb1Rvb2wiLCBuYW1lIH0pKTsKCiAgICBjb25zdCBzdGVwcyA9ICQkKCIucmVwZWF0IiwgYmxvY2subm9kZSkKICAgICAgLm1hcChyID0+IHNhZmVUcmltKHIucXVlcnlTZWxlY3RvcigndGV4dGFyZWFbZGF0YS1rPSJzdGVwVGV4dCJdJyk/LnZhbHVlKSkKICAgICAgLmZpbHRlcihCb29sZWFuKQogICAgICAubWFwKCh0ZXh0LCBpKSA9PiAoeyAiQHR5cGUiOiJIb3dUb1N0ZXAiLCBwb3NpdGlvbjppKzEsIHRleHQgfSkpOwoKICAgIGNvbnN0IG9iaiA9IHsgLi4uYmFzZUNvbnRleHQoKSwgIkB0eXBlIjoiSG93VG8iLCBuYW1lOiBzYWZlVHJpbSh2Lm5hbWUpLCBzdGVwOiBzdGVwcyB9OwogICAgaWYoc2FmZVRyaW0odi5kZXNjcmlwdGlvbikpIG9iai5kZXNjcmlwdGlvbiA9IHNhZmVUcmltKHYuZGVzY3JpcHRpb24pOwogICAgaWYoc2FmZVRyaW0odi50b3RhbFRpbWUpKSBvYmoudG90YWxUaW1lID0gc2FmZVRyaW0odi50b3RhbFRpbWUpOwogICAgaWYoc2FmZVRyaW0odi5pbWFnZSkpIG9iai5pbWFnZSA9IFtzYWZlVHJpbSh2LmltYWdlKV07CiAgICBpZihzdXBwbHkubGVuZ3RoKSBvYmouc3VwcGx5ID0gc3VwcGx5OwogICAgaWYodG9vbC5sZW5ndGgpIG9iai50b29sID0gdG9vbDsKICAgIGlmKHVybCkgb2JqWyJAaWQiXSA9IHVybCArICIjaG93dG8iOwogICAgcmV0dXJuIG9iajsKICB9CgogIGZ1bmN0aW9uIGJ1aWxkUHJvZHVjdChibG9jaywgcGFnZVVybCl7CiAgICBjb25zdCB2ID0gY29sbGVjdE5hbWVkRmllbGRzKGJsb2NrKTsKICAgIGNvbnN0IHVybCA9IHNhZmVUcmltKHBhZ2VVcmwpOwoKICAgIGNvbnN0IG9iaiA9IHsgLi4uYmFzZUNvbnRleHQoKSwgIkB0eXBlIjoiUHJvZHVjdCIsIG5hbWU6IHNhZmVUcmltKHYubmFtZSkgfTsKICAgIGlmKHNhZmVUcmltKHYuZGVzY3JpcHRpb24pKSBvYmouZGVzY3JpcHRpb24gPSBzYWZlVHJpbSh2LmRlc2NyaXB0aW9uKTsKICAgIGlmKHNhZmVUcmltKHYuaW1hZ2UpKSBvYmouaW1hZ2UgPSBbc2FmZVRyaW0odi5pbWFnZSldOwogICAgaWYoc2FmZVRyaW0odi5za3UpKSBvYmouc2t1ID0gc2FmZVRyaW0odi5za3UpOwogICAgaWYoc2FmZVRyaW0odi5icmFuZCkpIG9iai5icmFuZCA9IHsgIkB0eXBlIjoiQnJhbmQiLCBuYW1lOiBzYWZlVHJpbSh2LmJyYW5kKSB9OwogICAgaWYoc2FmZVRyaW0odi51cmwpKSBvYmoudXJsID0gc2FmZVRyaW0odi51cmwpOwogICAgaWYodXJsKSBvYmpbIkBpZCJdID0gdXJsICsgIiNwcm9kdWN0IjsKCiAgICBjb25zdCBhclByZWZpeCA9IGJsb2NrLmlkICsgIl9hciI7CiAgICBjb25zdCBhckdldCA9IChrKSA9PiBzYWZlVHJpbShibG9jay5ub2RlLnF1ZXJ5U2VsZWN0b3IoYCMke2FyUHJlZml4fV8ke2t9YCk/LnZhbHVlKTsKICAgIGNvbnN0IHJhdGluZ1ZhbHVlID0gbWF5YmVOdW1iZXIoYXJHZXQoInJhdGluZ1ZhbHVlIikpOwogICAgY29uc3QgcmV2aWV3Q291bnQgPSBtYXliZU51bWJlcihhckdldCgicmV2aWV3Q291bnQiKSk7CiAgICBjb25zdCByYXRpbmdDb3VudCA9IG1heWJlTnVtYmVyKGFyR2V0KCJyYXRpbmdDb3VudCIpKTsKICAgIGNvbnN0IGJlc3RSYXRpbmcgID0gbWF5YmVOdW1iZXIoYXJHZXQoImJlc3RSYXRpbmciKSk7CiAgICBpZihyYXRpbmdWYWx1ZSAhPT0gbnVsbCl7CiAgICAgIG9iai5hZ2dyZWdhdGVSYXRpbmcgPSB7CiAgICAgICAgIkB0eXBlIjoiQWdncmVnYXRlUmF0aW5nIiwKICAgICAgICByYXRpbmdWYWx1ZSwKICAgICAgICAuLi4oYmVzdFJhdGluZyAhPT0gbnVsbCA/IHsgYmVzdFJhdGluZyB9IDoge30pLAogICAgICAgIC4uLihyZXZpZXdDb3VudCAhPT0gbnVsbCA/IHsgcmV2aWV3Q291bnQgfSA6IHt9KSwKICAgICAgICAuLi4ocmF0aW5nQ291bnQgIT09IG51bGwgPyB7IHJhdGluZ0NvdW50IH0gOiB7fSkKICAgICAgfTsKICAgIH0KCiAgICBjb25zdCBvZmZlcnMgPSAkJCgiLnJlcGVhdCIsIGJsb2NrLm5vZGUpCiAgICAgIC5maWx0ZXIociA9PiByLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWs9InByaWNlIl0nKSkKICAgICAgLm1hcChyID0+IHsKICAgICAgICBjb25zdCBwcmljZSA9IG1heWJlTnVtYmVyKHIucXVlcnlTZWxlY3RvcignW2RhdGEtaz0icHJpY2UiXScpPy52YWx1ZSk7CiAgICAgICAgY29uc3QgcHJpY2VDdXJyZW5jeSA9IHNhZmVUcmltKHIucXVlcnlTZWxlY3RvcignW2RhdGEtaz0icHJpY2VDdXJyZW5jeSJdJyk/LnZhbHVlKTsKICAgICAgICBjb25zdCBhdmFpbGFiaWxpdHkgPSBzYWZlVHJpbShyLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWs9ImF2YWlsYWJpbGl0eSJdJyk/LnZhbHVlKTsKICAgICAgICBjb25zdCBvZmZlclVybCA9IHNhZmVUcmltKHIucXVlcnlTZWxlY3RvcignW2RhdGEtaz0ib2ZmZXJVcmwiXScpPy52YWx1ZSk7CiAgICAgICAgaWYocHJpY2UgPT09IG51bGwgfHwgIXByaWNlQ3VycmVuY3kpIHJldHVybiBudWxsOwogICAgICAgIHJldHVybiB7CiAgICAgICAgICAiQHR5cGUiOiJPZmZlciIsCiAgICAgICAgICBwcmljZSwKICAgICAgICAgIHByaWNlQ3VycmVuY3ksCiAgICAgICAgICAuLi4oYXZhaWxhYmlsaXR5ID8geyBhdmFpbGFiaWxpdHkgfSA6IHt9KSwKICAgICAgICAgIC4uLihvZmZlclVybCA/IHsgdXJsOiBvZmZlclVybCB9IDoge30pCiAgICAgICAgfTsKICAgICAgfSkuZmlsdGVyKEJvb2xlYW4pOwoKICAgIG9iai5vZmZlcnMgPSBvZmZlcnMubGVuZ3RoID09PSAxID8gb2ZmZXJzWzBdIDogb2ZmZXJzOwogICAgcmV0dXJuIG9iajsKICB9CgogIGZ1bmN0aW9uIGJ1aWxkUmVjaXBlKGJsb2NrLCBwYWdlVXJsKXsKICAgIGNvbnN0IHYgPSBjb2xsZWN0TmFtZWRGaWVsZHMoYmxvY2spOwogICAgY29uc3QgdXJsID0gc2FmZVRyaW0ocGFnZVVybCk7CgogICAgY29uc3QgaW5ncmVkaWVudHMgPSAkJCgiLnJlcGVhdCIsIGJsb2NrLm5vZGUpCiAgICAgIC5tYXAociA9PiBzYWZlVHJpbShyLnF1ZXJ5U2VsZWN0b3IoJ2lucHV0W2RhdGEtaz0iaW5ncmVkaWVudCJdJyk/LnZhbHVlKSkKICAgICAgLmZpbHRlcihCb29sZWFuKTsKCiAgICBjb25zdCBpbnN0cnVjdGlvbnMgPSAkJCgiLnJlcGVhdCIsIGJsb2NrLm5vZGUpCiAgICAgIC5tYXAociA9PiBzYWZlVHJpbShyLnF1ZXJ5U2VsZWN0b3IoJ3RleHRhcmVhW2RhdGEtaz0iaW5zdHJ1Y3Rpb24iXScpPy52YWx1ZSkpCiAgICAgIC5maWx0ZXIoQm9vbGVhbikKICAgICAgLm1hcCgodGV4dCwgaSkgPT4gKHsgIkB0eXBlIjoiSG93VG9TdGVwIiwgcG9zaXRpb246aSsxLCB0ZXh0IH0pKTsKCiAgICBjb25zdCBvYmogPSB7IC4uLmJhc2VDb250ZXh0KCksICJAdHlwZSI6IlJlY2lwZSIsIG5hbWU6IHNhZmVUcmltKHYubmFtZSkgfTsKICAgIGlmKHNhZmVUcmltKHYuZGVzY3JpcHRpb24pKSBvYmouZGVzY3JpcHRpb24gPSBzYWZlVHJpbSh2LmRlc2NyaXB0aW9uKTsKICAgIGlmKHNhZmVUcmltKHYuaW1hZ2UpKSBvYmouaW1hZ2UgPSBbc2FmZVRyaW0odi5pbWFnZSldOwogICAgaWYoc2FmZVRyaW0odi5wcmVwVGltZSkpIG9iai5wcmVwVGltZSA9IHNhZmVUcmltKHYucHJlcFRpbWUpOwogICAgaWYoc2FmZVRyaW0odi5jb29rVGltZSkpIG9iai5jb29rVGltZSA9IHNhZmVUcmltKHYuY29va1RpbWUpOwogICAgaWYoc2FmZVRyaW0odi50b3RhbFRpbWUpKSBvYmoudG90YWxUaW1lID0gc2FmZVRyaW0odi50b3RhbFRpbWUpOwogICAgaWYoc2FmZVRyaW0odi5yZWNpcGVZaWVsZCkpIG9iai5yZWNpcGVZaWVsZCA9IHNhZmVUcmltKHYucmVjaXBlWWllbGQpOwogICAgb2JqLnJlY2lwZUluZ3JlZGllbnQgPSBpbmdyZWRpZW50czsKICAgIG9iai5yZWNpcGVJbnN0cnVjdGlvbnMgPSBpbnN0cnVjdGlvbnM7CiAgICBpZih1cmwpIG9ialsiQGlkIl0gPSB1cmwgKyAiI3JlY2lwZSI7CiAgICByZXR1cm4gb2JqOwogIH0KCiAgZnVuY3Rpb24gYnVpbGRTaW1wbGUoYmxvY2ssIHBhZ2VVcmwpewogICAgY29uc3QgdHlwZSA9IGJsb2NrLnR5cGU7CiAgICBjb25zdCB2ID0gY29sbGVjdE5hbWVkRmllbGRzKGJsb2NrKTsKICAgIGNvbnN0IHVybCA9IHNhZmVUcmltKHBhZ2VVcmwpOwoKICAgIGNvbnN0IHR5cGVNYXAgPSB7CiAgICAgICJGQVEgUGFnZSI6ICJGQVFQYWdlIiwKICAgICAgIkpvYiBQb3N0aW5nIjogIkpvYlBvc3RpbmciLAogICAgICAiTG9jYWwgQnVzaW5lc3MiOiAiTG9jYWxCdXNpbmVzcyIsCiAgICAgICJZb3V0dWJlIFZpZGVvIjogIlZpZGVvT2JqZWN0IgogICAgfTsKICAgIGNvbnN0IHNjaGVtYVR5cGUgPSB0eXBlTWFwW3R5cGVdIHx8IHR5cGU7CiAgICBjb25zdCBvYmogPSB7IC4uLmJhc2VDb250ZXh0KCksICJAdHlwZSI6IHNjaGVtYVR5cGUgfTsKCiAgICBpZih1cmwpewogICAgICBjb25zdCBzdWZmaXggPSB0eXBlLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvXHMrL2csICItIik7CiAgICAgIG9ialsiQGlkIl0gPSB1cmwgKyAiIyIgKyBzdWZmaXg7CiAgICB9CgogICAgaWYodHlwZSA9PT0gIkFydGljbGUiKXsKICAgICAgb2JqLmhlYWRsaW5lID0gc2FmZVRyaW0odi5oZWFkbGluZSk7CiAgICAgIGlmKHNhZmVUcmltKHYuZGVzY3JpcHRpb24pKSBvYmouZGVzY3JpcHRpb24gPSBzYWZlVHJpbSh2LmRlc2NyaXB0aW9uKTsKICAgICAgaWYoc2FmZVRyaW0odi5pbWFnZSkpIG9iai5pbWFnZSA9IFtzYWZlVHJpbSh2LmltYWdlKV07CiAgICAgIGlmKHNhZmVUcmltKHYuZGF0ZVB1Ymxpc2hlZCkpIG9iai5kYXRlUHVibGlzaGVkID0gc2FmZVRyaW0odi5kYXRlUHVibGlzaGVkKTsKICAgICAgaWYoc2FmZVRyaW0odi5kYXRlTW9kaWZpZWQpKSBvYmouZGF0ZU1vZGlmaWVkID0gc2FmZVRyaW0odi5kYXRlTW9kaWZpZWQpOwogICAgICBpZihzYWZlVHJpbSh2LmF1dGhvck5hbWUpKSBvYmouYXV0aG9yID0geyAiQHR5cGUiOiJQZXJzb24iLCBuYW1lOiBzYWZlVHJpbSh2LmF1dGhvck5hbWUpIH07CiAgICAgIGlmKHNhZmVUcmltKHYucHVibGlzaGVyTmFtZSkgfHwgc2FmZVRyaW0odi5wdWJsaXNoZXJMb2dvKSl7CiAgICAgICAgb2JqLnB1Ymxpc2hlciA9IHsKICAgICAgICAgICJAdHlwZSI6Ik9yZ2FuaXphdGlvbiIsCiAgICAgICAgICAuLi4oc2FmZVRyaW0odi5wdWJsaXNoZXJOYW1lKSA/IHsgbmFtZTogc2FmZVRyaW0odi5wdWJsaXNoZXJOYW1lKSB9IDoge30pLAogICAgICAgICAgLi4uKHNhZmVUcmltKHYucHVibGlzaGVyTG9nbykgPyB7IGxvZ286IHsgIkB0eXBlIjoiSW1hZ2VPYmplY3QiLCB1cmw6IHNhZmVUcmltKHYucHVibGlzaGVyTG9nbykgfSB9IDoge30pCiAgICAgICAgfTsKICAgICAgfQogICAgICBpZih1cmwpIG9iai5tYWluRW50aXR5T2ZQYWdlID0gdXJsOwogICAgICByZXR1cm4gb2JqOwogICAgfQoKICAgIGlmKHR5cGUgPT09ICJFdmVudCIpewogICAgICBvYmoubmFtZSA9IHNhZmVUcmltKHYubmFtZSk7CiAgICAgIG9iai5zdGFydERhdGUgPSBzYWZlVHJpbSh2LnN0YXJ0RGF0ZSk7CiAgICAgIGlmKHNhZmVUcmltKHYuZW5kRGF0ZSkpIG9iai5lbmREYXRlID0gc2FmZVRyaW0odi5lbmREYXRlKTsKICAgICAgaWYoc2FmZVRyaW0odi5kZXNjcmlwdGlvbikpIG9iai5kZXNjcmlwdGlvbiA9IHNhZmVUcmltKHYuZGVzY3JpcHRpb24pOwogICAgICBpZihzYWZlVHJpbSh2LmltYWdlKSkgb2JqLmltYWdlID0gW3NhZmVUcmltKHYuaW1hZ2UpXTsKICAgICAgaWYoc2FmZVRyaW0odi51cmwpKSBvYmoudXJsID0gc2FmZVRyaW0odi51cmwpOwogICAgICBpZihzYWZlVHJpbSh2LmV2ZW50QXR0ZW5kYW5jZU1vZGUpKSBvYmouZXZlbnRBdHRlbmRhbmNlTW9kZSA9IHNhZmVUcmltKHYuZXZlbnRBdHRlbmRhbmNlTW9kZSk7CiAgICAgIGlmKHNhZmVUcmltKHYuZXZlbnRTdGF0dXMpKSBvYmouZXZlbnRTdGF0dXMgPSBzYWZlVHJpbSh2LmV2ZW50U3RhdHVzKTsKCiAgICAgIGNvbnN0IGFkZHIgPSBidWlsZEFkZHJlc3Modik7CiAgICAgIGlmKHNhZmVUcmltKHYubG9jYXRpb25OYW1lKSB8fCBhZGRyKXsKICAgICAgICBvYmoubG9jYXRpb24gPSB7CiAgICAgICAgICAiQHR5cGUiOiJQbGFjZSIsCiAgICAgICAgICAuLi4oc2FmZVRyaW0odi5sb2NhdGlvbk5hbWUpID8geyBuYW1lOiBzYWZlVHJpbSh2LmxvY2F0aW9uTmFtZSkgfSA6IHt9KSwKICAgICAgICAgIC4uLihhZGRyID8geyBhZGRyZXNzOiBhZGRyIH0gOiB7fSkKICAgICAgICB9OwogICAgICB9CiAgICAgIHJldHVybiBvYmo7CiAgICB9CgogICAgaWYodHlwZSA9PT0gIkpvYiBQb3N0aW5nIil7CiAgICAgIG9iai50aXRsZSA9IHNhZmVUcmltKHYudGl0bGUpOwogICAgICBvYmouZGVzY3JpcHRpb24gPSBzYWZlVHJpbSh2LmRlc2NyaXB0aW9uKTsKICAgICAgb2JqLmhpcmluZ09yZ2FuaXphdGlvbiA9IHsKICAgICAgICAiQHR5cGUiOiJPcmdhbml6YXRpb24iLAogICAgICAgIG5hbWU6IHNhZmVUcmltKHYuaGlyaW5nT3JnKSwKICAgICAgICAuLi4oc2FmZVRyaW0odi5oaXJpbmdPcmdVcmwpID8geyBzYW1lQXM6IHNhZmVUcmltKHYuaGlyaW5nT3JnVXJsKSB9IDoge30pCiAgICAgIH07CiAgICAgIGlmKHNhZmVUcmltKHYuZGF0ZVBvc3RlZCkpIG9iai5kYXRlUG9zdGVkID0gc2FmZVRyaW0odi5kYXRlUG9zdGVkKTsKICAgICAgaWYoc2FmZVRyaW0odi52YWxpZFRocm91Z2gpKSBvYmoudmFsaWRUaHJvdWdoID0gc2FmZVRyaW0odi52YWxpZFRocm91Z2gpOwogICAgICBpZihzYWZlVHJpbSh2LmVtcGxveW1lbnRUeXBlKSkgb2JqLmVtcGxveW1lbnRUeXBlID0gc2FmZVRyaW0odi5lbXBsb3ltZW50VHlwZSk7CiAgICAgIGlmKHNhZmVUcmltKHYuam9iTG9jYXRpb25UeXBlKSkgb2JqLmpvYkxvY2F0aW9uVHlwZSA9IHNhZmVUcmltKHYuam9iTG9jYXRpb25UeXBlKTsKCiAgICAgIGNvbnN0IGFkZHIgPSBidWlsZEFkZHJlc3Modik7CiAgICAgIGlmKGFkZHIpIG9iai5qb2JMb2NhdGlvbiA9IHsgIkB0eXBlIjoiUGxhY2UiLCBhZGRyZXNzOiBhZGRyIH07CgogICAgICBjb25zdCBzYWxhcnkgPSBtYXliZU51bWJlcih2LmJhc2VTYWxhcnkpOwogICAgICBpZihzYWxhcnkgIT09IG51bGwgJiYgc2FmZVRyaW0odi5zYWxhcnlDdXJyZW5jeSkpewogICAgICAgIG9iai5iYXNlU2FsYXJ5ID0gewogICAgICAgICAgIkB0eXBlIjoiTW9uZXRhcnlBbW91bnQiLAogICAgICAgICAgY3VycmVuY3k6IHNhZmVUcmltKHYuc2FsYXJ5Q3VycmVuY3kpLAogICAgICAgICAgdmFsdWU6IHsgIkB0eXBlIjoiUXVhbnRpdGF0aXZlVmFsdWUiLCB2YWx1ZTogc2FsYXJ5LCB1bml0VGV4dDogc2FmZVRyaW0odi5zYWxhcnlVbml0KSB8fCAiWUVBUiIgfQogICAgICAgIH07CiAgICAgIH0KICAgICAgcmV0dXJuIG9iajsKICAgIH0KCiAgICBpZih0eXBlID09PSAiTG9jYWwgQnVzaW5lc3MiKXsKICAgICAgb2JqLm5hbWUgPSBzYWZlVHJpbSh2Lm5hbWUpOwogICAgICBpZihzYWZlVHJpbSh2LnVybCkpIG9iai51cmwgPSBzYWZlVHJpbSh2LnVybCk7CiAgICAgIGlmKHNhZmVUcmltKHYuaW1hZ2UpKSBvYmouaW1hZ2UgPSBbc2FmZVRyaW0odi5pbWFnZSldOwogICAgICBpZihzYWZlVHJpbSh2LnRlbGVwaG9uZSkpIG9iai50ZWxlcGhvbmUgPSBzYWZlVHJpbSh2LnRlbGVwaG9uZSk7CiAgICAgIGlmKHNhZmVUcmltKHYucHJpY2VSYW5nZSkpIG9iai5wcmljZVJhbmdlID0gc2FmZVRyaW0odi5wcmljZVJhbmdlKTsKCiAgICAgIGNvbnN0IGFkZHIgPSBidWlsZEFkZHJlc3Modik7CiAgICAgIGlmKGFkZHIpIG9iai5hZGRyZXNzID0gYWRkcjsKCiAgICAgIGNvbnN0IGxhdCA9IG1heWJlTnVtYmVyKHYubGF0aXR1ZGUpLCBsbmcgPSBtYXliZU51bWJlcih2LmxvbmdpdHVkZSk7CiAgICAgIGlmKGxhdCAhPT0gbnVsbCAmJiBsbmcgIT09IG51bGwpIG9iai5nZW8gPSB7ICJAdHlwZSI6Ikdlb0Nvb3JkaW5hdGVzIiwgbGF0aXR1ZGU6IGxhdCwgbG9uZ2l0dWRlOiBsbmcgfTsKCiAgICAgIGNvbnN0IG9oID0gcGFyc2VMaXN0KHYub3BlbmluZ0hvdXJzKTsKICAgICAgaWYob2gubGVuZ3RoKSBvYmoub3BlbmluZ0hvdXJzID0gb2g7CgogICAgICByZXR1cm4gb2JqOwogICAgfQoKICAgIGlmKHR5cGUgPT09ICJMb2dvIil7CiAgICAgIG9iai5uYW1lID0gc2FmZVRyaW0odi5vcmdOYW1lKTsKICAgICAgb2JqLmxvZ28gPSBzYWZlVHJpbSh2LmxvZ28pOwogICAgICBpZihzYWZlVHJpbSh2LnVybCkpIG9iai51cmwgPSBzYWZlVHJpbSh2LnVybCk7CiAgICAgIHJldHVybiBvYmo7CiAgICB9CgogICAgaWYodHlwZSA9PT0gIk9yZ2FuaXphdGlvbiIpewogICAgICBvYmoubmFtZSA9IHNhZmVUcmltKHYubmFtZSk7CiAgICAgIGlmKHNhZmVUcmltKHYudXJsKSkgb2JqLnVybCA9IHNhZmVUcmltKHYudXJsKTsKICAgICAgaWYoc2FmZVRyaW0odi5sb2dvKSkgb2JqLmxvZ28gPSBzYWZlVHJpbSh2LmxvZ28pOwogICAgICBjb25zdCBzYW1lQXMgPSBwYXJzZUxpc3Qodi5zYW1lQXMpOwogICAgICBpZihzYW1lQXMubGVuZ3RoKSBvYmouc2FtZUFzID0gc2FtZUFzOwogICAgICByZXR1cm4gb2JqOwogICAgfQoKICAgIGlmKHR5cGUgPT09ICJQZXJzb24iKXsKICAgICAgb2JqLm5hbWUgPSBzYWZlVHJpbSh2Lm5hbWUpOwogICAgICBpZihzYWZlVHJpbSh2LmpvYlRpdGxlKSkgb2JqLmpvYlRpdGxlID0gc2FmZVRyaW0odi5qb2JUaXRsZSk7CiAgICAgIGlmKHNhZmVUcmltKHYudXJsKSkgb2JqLnVybCA9IHNhZmVUcmltKHYudXJsKTsKICAgICAgaWYoc2FmZVRyaW0odi5pbWFnZSkpIG9iai5pbWFnZSA9IHNhZmVUcmltKHYuaW1hZ2UpOwogICAgICBjb25zdCBzYW1lQXMgPSBwYXJzZUxpc3Qodi5zYW1lQXMpOwogICAgICBpZihzYW1lQXMubGVuZ3RoKSBvYmouc2FtZUFzID0gc2FtZUFzOwogICAgICByZXR1cm4gb2JqOwogICAgfQoKICAgIGlmKHR5cGUgPT09ICJSYXRpbmciKXsKICAgICAgb2JqWyJAdHlwZSJdID0gIkFnZ3JlZ2F0ZVJhdGluZyI7CiAgICAgIGNvbnN0IHJ2ID0gbWF5YmVOdW1iZXIodi5yYXRpbmdWYWx1ZSk7IGlmKHJ2ICE9PSBudWxsKSBvYmoucmF0aW5nVmFsdWUgPSBydjsKICAgICAgY29uc3QgYnIgPSBtYXliZU51bWJlcih2LmJlc3RSYXRpbmcpOyBpZihiciAhPT0gbnVsbCkgb2JqLmJlc3RSYXRpbmcgPSBicjsKICAgICAgY29uc3Qgd3IgPSBtYXliZU51bWJlcih2LndvcnN0UmF0aW5nKTsgaWYod3IgIT09IG51bGwpIG9iai53b3JzdFJhdGluZyA9IHdyOwogICAgICBjb25zdCByYyA9IG1heWJlTnVtYmVyKHYucmF0aW5nQ291bnQpOyBpZihyYyAhPT0gbnVsbCkgb2JqLnJhdGluZ0NvdW50ID0gcmM7CiAgICAgIHJldHVybiBvYmo7CiAgICB9CgogICAgaWYodHlwZSA9PT0gIlJldmlldyIpewogICAgICBvYmpbIkB0eXBlIl0gPSAiUmV2aWV3IjsKICAgICAgb2JqLnJldmlld0JvZHkgPSBzYWZlVHJpbSh2LnJldmlld0JvZHkpOwogICAgICBvYmouaXRlbVJldmlld2VkID0geyAiQHR5cGUiOiBzYWZlVHJpbSh2Lml0ZW1UeXBlKSB8fCAiVGhpbmciLCBuYW1lOiBzYWZlVHJpbSh2Lml0ZW1OYW1lKSB9OwogICAgICBvYmoucmV2aWV3UmF0aW5nID0geyAiQHR5cGUiOiJSYXRpbmciLCByYXRpbmdWYWx1ZTogbWF5YmVOdW1iZXIodi5yYXRpbmdWYWx1ZSkgPz8gc2FmZVRyaW0odi5yYXRpbmdWYWx1ZSkgfTsKICAgICAgY29uc3QgYnIgPSBtYXliZU51bWJlcih2LmJlc3RSYXRpbmcpOyBpZihiciAhPT0gbnVsbCkgb2JqLnJldmlld1JhdGluZy5iZXN0UmF0aW5nID0gYnI7CiAgICAgIGlmKHNhZmVUcmltKHYuYXV0aG9yTmFtZSkpIG9iai5hdXRob3IgPSB7ICJAdHlwZSI6IlBlcnNvbiIsIG5hbWU6IHNhZmVUcmltKHYuYXV0aG9yTmFtZSkgfTsKICAgICAgaWYoc2FmZVRyaW0odi5kYXRlUHVibGlzaGVkKSkgb2JqLmRhdGVQdWJsaXNoZWQgPSBzYWZlVHJpbSh2LmRhdGVQdWJsaXNoZWQpOwogICAgICByZXR1cm4gb2JqOwogICAgfQoKICAgIGlmKHR5cGUgPT09ICJWaWRlbyIpewogICAgICBvYmpbIkB0eXBlIl0gPSAiVmlkZW9PYmplY3QiOwogICAgICBvYmoubmFtZSA9IHNhZmVUcmltKHYubmFtZSk7CiAgICAgIGlmKHNhZmVUcmltKHYuZGVzY3JpcHRpb24pKSBvYmouZGVzY3JpcHRpb24gPSBzYWZlVHJpbSh2LmRlc2NyaXB0aW9uKTsKICAgICAgaWYoc2FmZVRyaW0odi50aHVtYm5haWxVcmwpKSBvYmoudGh1bWJuYWlsVXJsID0gW3NhZmVUcmltKHYudGh1bWJuYWlsVXJsKV07CiAgICAgIGlmKHNhZmVUcmltKHYudXBsb2FkRGF0ZSkpIG9iai51cGxvYWREYXRlID0gc2FmZVRyaW0odi51cGxvYWREYXRlKTsKICAgICAgaWYoc2FmZVRyaW0odi5kdXJhdGlvbikpIG9iai5kdXJhdGlvbiA9IHNhZmVUcmltKHYuZHVyYXRpb24pOwogICAgICBpZihzYWZlVHJpbSh2LmNvbnRlbnRVcmwpKSBvYmouY29udGVudFVybCA9IHNhZmVUcmltKHYuY29udGVudFVybCk7CiAgICAgIGlmKHNhZmVUcmltKHYuZW1iZWRVcmwpKSBvYmouZW1iZWRVcmwgPSBzYWZlVHJpbSh2LmVtYmVkVXJsKTsKICAgICAgcmV0dXJuIG9iajsKICAgIH0KCiAgICBpZih0eXBlID09PSAiWW91dHViZSBWaWRlbyIpewogICAgICBvYmpbIkB0eXBlIl0gPSAiVmlkZW9PYmplY3QiOwogICAgICBvYmoubmFtZSA9IHNhZmVUcmltKHYubmFtZSk7CiAgICAgIG9iai51cmwgPSBzYWZlVHJpbSh2LnlvdXR1YmVVcmwpOwogICAgICBpZihzYWZlVHJpbSh2LmRlc2NyaXB0aW9uKSkgb2JqLmRlc2NyaXB0aW9uID0gc2FmZVRyaW0odi5kZXNjcmlwdGlvbik7CiAgICAgIGlmKHNhZmVUcmltKHYudGh1bWJuYWlsVXJsKSkgb2JqLnRodW1ibmFpbFVybCA9IFtzYWZlVHJpbSh2LnRodW1ibmFpbFVybCldOwogICAgICBpZihzYWZlVHJpbSh2LnVwbG9hZERhdGUpKSBvYmoudXBsb2FkRGF0ZSA9IHNhZmVUcmltKHYudXBsb2FkRGF0ZSk7CiAgICAgIGlmKHNhZmVUcmltKHYuZHVyYXRpb24pKSBvYmouZHVyYXRpb24gPSBzYWZlVHJpbSh2LmR1cmF0aW9uKTsKICAgICAgaWYob2JqLnVybCAmJiBvYmoudXJsLmluY2x1ZGVzKCJ3YXRjaD92PSIpKSBvYmouZW1iZWRVcmwgPSBvYmoudXJsLnJlcGxhY2UoIndhdGNoP3Y9IiwgImVtYmVkLyIpOwogICAgICByZXR1cm4gb2JqOwogICAgfQoKICAgIGlmKHR5cGUgPT09ICJXZWJzaXRlIil7CiAgICAgIG9ialsiQHR5cGUiXSA9ICJXZWJTaXRlIjsKICAgICAgb2JqLm5hbWUgPSBzYWZlVHJpbSh2Lm5hbWUpOwogICAgICBvYmoudXJsID0gc2FmZVRyaW0odi51cmwpOwogICAgICBpZihzYWZlVHJpbSh2LmRlc2NyaXB0aW9uKSkgb2JqLmRlc2NyaXB0aW9uID0gc2FmZVRyaW0odi5kZXNjcmlwdGlvbik7CiAgICAgIGlmKHNhZmVUcmltKHYucHVibGlzaGVyTmFtZSkpIG9iai5wdWJsaXNoZXIgPSB7ICJAdHlwZSI6Ik9yZ2FuaXphdGlvbiIsIG5hbWU6IHNhZmVUcmltKHYucHVibGlzaGVyTmFtZSkgfTsKICAgICAgaWYoc2FmZVRyaW0odi5zZWFyY2hUYXJnZXQpKXsKICAgICAgICBvYmoucG90ZW50aWFsQWN0aW9uID0gewogICAgICAgICAgIkB0eXBlIjoiU2VhcmNoQWN0aW9uIiwKICAgICAgICAgIHRhcmdldDogc2FmZVRyaW0odi5zZWFyY2hUYXJnZXQpLAogICAgICAgICAgInF1ZXJ5LWlucHV0IjoicmVxdWlyZWQgbmFtZT1zZWFyY2hfdGVybV9zdHJpbmciCiAgICAgICAgfTsKICAgICAgfQogICAgICByZXR1cm4gb2JqOwogICAgfQoKICAgIHJldHVybiBvYmo7CiAgfQoKICBmdW5jdGlvbiBidWlsZEJsb2NrSnNvbihibG9jaywgcGFnZVVybCl7CiAgICBzd2l0Y2goYmxvY2sudHlwZSl7CiAgICAgIGNhc2UgIkJyZWFkY3J1bWIiOiByZXR1cm4gYnVpbGRCcmVhZGNydW1iKGJsb2NrLCBwYWdlVXJsKTsKICAgICAgY2FzZSAiRkFRIFBhZ2UiOiByZXR1cm4gYnVpbGRGQVEoYmxvY2ssIHBhZ2VVcmwpOwogICAgICBjYXNlICJIb3cgVG8iOiByZXR1cm4gYnVpbGRIb3dUbyhibG9jaywgcGFnZVVybCk7CiAgICAgIGNhc2UgIlByb2R1Y3QiOiByZXR1cm4gYnVpbGRQcm9kdWN0KGJsb2NrLCBwYWdlVXJsKTsKICAgICAgY2FzZSAiUmVjaXBlIjogcmV0dXJuIGJ1aWxkUmVjaXBlKGJsb2NrLCBwYWdlVXJsKTsKICAgICAgZGVmYXVsdDogcmV0dXJuIGJ1aWxkU2ltcGxlKGJsb2NrLCBwYWdlVXJsKTsKICAgIH0KICB9CgogIC8vID09PT09PT09PSBBdXRvLWZpbGwgPT09PT09PT09CiAgZnVuY3Rpb24gZ2V0UGFnZU1ldGEoKXsKICAgIGNvbnN0IGNhbm9uaWNhbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2xpbmtbcmVsPSJjYW5vbmljYWwiXScpPy5ocmVmIHx8ICIiOwogICAgY29uc3Qgb2dUaXRsZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ21ldGFbcHJvcGVydHk9Im9nOnRpdGxlIl0nKT8uY29udGVudCB8fCAiIjsKICAgIGNvbnN0IG9nRGVzYyAgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdtZXRhW3Byb3BlcnR5PSJvZzpkZXNjcmlwdGlvbiJdJyk/LmNvbnRlbnQgfHwgIiI7CiAgICBjb25zdCBvZ0ltYWdlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignbWV0YVtwcm9wZXJ0eT0ib2c6aW1hZ2UiXScpPy5jb250ZW50IHx8ICIiOwogICAgY29uc3QgbWV0YURlc2M9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ21ldGFbbmFtZT0iZGVzY3JpcHRpb24iXScpPy5jb250ZW50IHx8ICIiOwogICAgY29uc3QgdGl0bGUgICA9IGRvY3VtZW50LnRpdGxlIHx8ICIiOwogICAgY29uc3QgdXJsICAgICA9IGNhbm9uaWNhbCB8fCBsb2NhdGlvbi5ocmVmIHx8ICIiOwogICAgY29uc3QgZGVzYyAgICA9IG9nRGVzYyB8fCBtZXRhRGVzYyB8fCAiIjsKICAgIHJldHVybiB7IHVybCwgdGl0bGU6IG9nVGl0bGUgfHwgdGl0bGUsIGRlc2MsIGltYWdlOiBvZ0ltYWdlIH07CiAgfQoKICBmdW5jdGlvbiBhdXRvZmlsbEFsbCgpewogICAgY29uc3QgbWV0YSA9IGdldFBhZ2VNZXRhKCk7CiAgICBpZihtZXRhLnVybCAmJiAhc2FmZVRyaW0oJCgiI2Jhc2VVcmwiKS52YWx1ZSkpICQoIiNiYXNlVXJsIikudmFsdWUgPSBtZXRhLnVybDsKCiAgICBmb3IoY29uc3QgYiBvZiBibG9ja3MpewogICAgICBjb25zdCBmaWxsID0gKG5hbWUsIHZhbCkgPT4gewogICAgICAgIGlmKCF2YWwpIHJldHVybjsKICAgICAgICBjb25zdCBpbnAgPSBiLm5vZGUucXVlcnlTZWxlY3RvcihgW25hbWU9IiR7bmFtZX0iXWApOwogICAgICAgIGlmKGlucCAmJiAhc2FmZVRyaW0oaW5wLnZhbHVlKSkgaW5wLnZhbHVlID0gdmFsOwogICAgICB9OwoKICAgICAgZmlsbCgiaGVhZGxpbmUiLCBtZXRhLnRpdGxlKTsKICAgICAgZmlsbCgibmFtZSIsIG1ldGEudGl0bGUpOwogICAgICBmaWxsKCJkZXNjcmlwdGlvbiIsIG1ldGEuZGVzYyk7CiAgICAgIGZpbGwoInVybCIsIG1ldGEudXJsKTsKICAgICAgZmlsbCgiaW1hZ2UiLCBtZXRhLmltYWdlKTsKICAgICAgZmlsbCgidGh1bWJuYWlsVXJsIiwgbWV0YS5pbWFnZSk7CiAgICB9CgogICAgc2V0U3RhdHVzKCJBdXRvLWZpbGwgYXR0ZW1wdGVkIGZyb20gcGFnZSBtZXRhZGF0YSAodGl0bGUvZGVzY3JpcHRpb24vY2Fub25pY2FsL29nOmltYWdlKS4iLCAib2siKTsKICB9CgogIC8vID09PT09PT09PSBXaXJlIHVwIFVJID09PT09PT09PQogIGNvbnN0IHNjaGVtYVR5cGVFbCA9ICQoIiNzY2hlbWFUeXBlIik7CiAgVFlQRV9PUFRJT05TLmZvckVhY2godCA9PiBzY2hlbWFUeXBlRWwuYXBwZW5kQ2hpbGQoZWwoIm9wdGlvbiIsIHsgdmFsdWU6dCB9LCB0KSkpOwoKICAkKCIjYWRkU2NoZW1hQnRuIikuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCAoKSA9PiBhZGRTY2hlbWFCbG9jayhzY2hlbWFUeXBlRWwudmFsdWUpKTsKICAkKCIjYXV0b2ZpbGxCdG4iKS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIGF1dG9maWxsQWxsKTsKCiAgJCgiI2NsZWFyQWxsQnRuIikuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCAoKSA9PiB7CiAgICBibG9ja3Muc3BsaWNlKDAsIGJsb2Nrcy5sZW5ndGgpOwogICAgJCgiI3NjaGVtYXNIb3N0IikuaW5uZXJIVE1MID0gIiI7CiAgICAkKCIjb3V0cHV0IikudGV4dENvbnRlbnQgPSAiIjsKICAgIGNsZWFyQWxsSW52YWxpZCgpOwogICAgc2V0QnRuRW5hYmxlZCgkKCIjY29weUJ0biIpLCBmYWxzZSk7CiAgICBzZXRCdG5FbmFibGVkKCQoIiNkb3dubG9hZEJ0biIpLCBmYWxzZSk7CiAgICBzZXRTdGF0dXMoIkNsZWFyZWQgYWxsIGJsb2Nrcy4iLCAib2siKTsKICB9KTsKCiAgLy8gPT09PT0gR2VuZXJhdGUgKGRvIGJvdGggcmVxdWVzdGVkIGZlYXR1cmVzKSA9PT09PQogICQoIiNnZW5lcmF0ZUJ0biIpLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgKCkgPT4gewogICAgaWYoYmxvY2tzLmxlbmd0aCA9PT0gMCl7CiAgICAgIHNldFN0YXR1cygiQWRkIGF0IGxlYXN0IG9uZSBzY2hlbWEgYmxvY2sgZmlyc3QuIiwgIndhcm4iKTsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIGNsZWFyQWxsSW52YWxpZCgpOwoKICAgIGNvbnN0IGFsbE1pc3NpbmcgPSBbXTsKICAgIGxldCBmaXJzdEludmFsaWRFbCA9IG51bGw7CgogICAgZm9yKGNvbnN0IGIgb2YgYmxvY2tzKXsKICAgICAgY29uc3QgcmVzID0gdmFsaWRhdGVCbG9jayhiKTsKICAgICAgaWYocmVzLm1pc3NpbmcubGVuZ3RoKSBhbGxNaXNzaW5nLnB1c2goLi4ucmVzLm1pc3NpbmcpOwogICAgICBpZighZmlyc3RJbnZhbGlkRWwgJiYgcmVzLmZpcnN0SW52YWxpZEVsKSBmaXJzdEludmFsaWRFbCA9IHJlcy5maXJzdEludmFsaWRFbDsKICAgIH0KCiAgICBpZihhbGxNaXNzaW5nLmxlbmd0aCl7CiAgICAgIHNldFN0YXR1cygiTWlzc2luZyByZXF1aXJlZCBmaWVsZHM6XG4tICIgKyBhbGxNaXNzaW5nLmpvaW4oIlxuLSAiKSwgIndhcm4iKTsKCiAgICAgIGlmKGZpcnN0SW52YWxpZEVsKXsKICAgICAgICAvLyBzY3JvbGwgdG8gdGhlIGlucHV0LCB0aGVuIGZvY3VzCiAgICAgICAgZmlyc3RJbnZhbGlkRWwuc2Nyb2xsSW50b1ZpZXcoeyBiZWhhdmlvcjoic21vb3RoIiwgYmxvY2s6ImNlbnRlciIgfSk7CiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7IHRyeXsgZmlyc3RJbnZhbGlkRWwuZm9jdXMoKTsgfWNhdGNoKF8pe30gfSwgMjUwKTsKICAgICAgfQoKICAgICAgJCgiI291dHB1dCIpLnRleHRDb250ZW50ID0gIiI7CiAgICAgIHNldEJ0bkVuYWJsZWQoJCgiI2NvcHlCdG4iKSwgZmFsc2UpOwogICAgICBzZXRCdG5FbmFibGVkKCQoIiNkb3dubG9hZEJ0biIpLCBmYWxzZSk7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICB0cnl7CiAgICAgIGNvbnN0IHBhZ2VVcmwgPSAkKCIjYmFzZVVybCIpLnZhbHVlOwogICAgICBjb25zdCBidWlsdCA9IGJsb2Nrcy5tYXAoYiA9PiBidWlsZEJsb2NrSnNvbihiLCBwYWdlVXJsKSk7CgogICAgICAvLyBGZWF0dXJlIDE6IElmIG9ubHkgb25lIGJsb2NrLCBvdXRwdXQgYSBzaW5nbGUgc2NoZW1hIG9iamVjdCAobm8gQGdyYXBoIHdyYXBwZXIpCiAgICAgIGxldCBwYXlsb2FkOwogICAgICBpZihidWlsdC5sZW5ndGggPT09IDEpewogICAgICAgIHBheWxvYWQgPSBidWlsdFswXTsKICAgICAgICBwYXlsb2FkWyJAY29udGV4dCJdID0gImh0dHBzOi8vc2NoZW1hLm9yZyI7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcGF5bG9hZCA9IHsgIkBjb250ZXh0IjoiaHR0cHM6Ly9zY2hlbWEub3JnIiwgIkBncmFwaCI6IGJ1aWx0IH07CiAgICAgIH0KCiAgICAgICQoIiNvdXRwdXQiKS50ZXh0Q29udGVudCA9IGpzb25MZFNjcmlwdChwYXlsb2FkKTsKICAgICAgc2V0QnRuRW5hYmxlZCgkKCIjY29weUJ0biIpLCB0cnVlKTsKICAgICAgc2V0QnRuRW5hYmxlZCgkKCIjZG93bmxvYWRCdG4iKSwgdHJ1ZSk7CiAgICAgIHNldFN0YXR1cygKICAgICAgICBidWlsdC5sZW5ndGggPT09IDEKICAgICAgICAgID8gIkdlbmVyYXRlZCBhIHNpbmdsZSBKU09OLUxEIHNjaGVtYSBvYmplY3QuIgogICAgICAgICAgOiAiR2VuZXJhdGVkIEpTT04tTEQgd2l0aCAiICsgYnVpbHQubGVuZ3RoICsgIiBibG9jayhzKSBpbiBAZ3JhcGguIiwKICAgICAgICAib2siCiAgICAgICk7CiAgICB9Y2F0Y2goZSl7CiAgICAgIGNvbnNvbGUuZXJyb3IoZSk7CiAgICAgIHNldFN0YXR1cygiRXJyb3IgZ2VuZXJhdGluZyBKU09OLUxELiBDaGVjayBpbnB1dHMuIiwgImJhZCIpOwogICAgICAkKCIjb3V0cHV0IikudGV4dENvbnRlbnQgPSAiIjsKICAgICAgc2V0QnRuRW5hYmxlZCgkKCIjY29weUJ0biIpLCBmYWxzZSk7CiAgICAgIHNldEJ0bkVuYWJsZWQoJCgiI2Rvd25sb2FkQnRuIiksIGZhbHNlKTsKICAgIH0KICB9KTsKCiAgJCgiI2NvcHlCdG4iKS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIGFzeW5jICgpID0+IHsKICAgIGNvbnN0IHRleHQgPSAkKCIjb3V0cHV0IikudGV4dENvbnRlbnQgfHwgIiI7CiAgICBpZighdGV4dCkgcmV0dXJuOwogICAgdHJ5ewogICAgICBhd2FpdCBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dCh0ZXh0KTsKICAgICAgc2V0U3RhdHVzKCJDb3BpZWQgdG8gY2xpcGJvYXJkLiBQYXN0ZSB3aXRoIEN0cmwvQ21kK1YuIiwgIm9rIik7CiAgICB9Y2F0Y2goZSl7CiAgICAgIGNvbnN0IHRhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGV4dGFyZWEiKTsKICAgICAgdGEudmFsdWUgPSB0ZXh0OwogICAgICB0YS5zdHlsZS5wb3NpdGlvbiA9ICJmaXhlZCI7CiAgICAgIHRhLnN0eWxlLmxlZnQgPSAiLTk5OTlweCI7CiAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGEpOwogICAgICB0YS5mb2N1cygpOyB0YS5zZWxlY3QoKTsKICAgICAgY29uc3Qgb2sgPSBkb2N1bWVudC5leGVjQ29tbWFuZCgiY29weSIpOwogICAgICB0YS5yZW1vdmUoKTsKICAgICAgc2V0U3RhdHVzKG9rID8gIkNvcGllZCB0byBjbGlwYm9hcmQuIFBhc3RlIHdpdGggQ3RybC9DbWQrVi4iIDogIkNvcHkgZmFpbGVkLiBDb3B5IG1hbnVhbGx5LiIsIG9rID8gIm9rIiA6ICJ3YXJuIik7CiAgICB9CiAgfSk7CgogICQoIiNkb3dubG9hZEJ0biIpLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgKCkgPT4gewogICAgY29uc3QgdHh0ID0gJCgiI291dHB1dCIpLnRleHRDb250ZW50IHx8ICIiOwogICAgaWYoIXR4dCkgcmV0dXJuOwoKICAgIGNvbnN0IG0gPSB0eHQubWF0Y2goLzxzY3JpcHRbXj5dKj5ccyooW1xzXFNdKilccyo8XC9zY3JpcHQ+L2kpOwogICAgY29uc3QganNvbiA9IG0gPyBtWzFdLnRyaW0oKSA6IHR4dC50cmltKCk7CgogICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFtqc29uXSwgeyB0eXBlOiJhcHBsaWNhdGlvbi9qc29uIiB9KTsKICAgIGNvbnN0IGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJhIik7CiAgICBjb25zdCBwYWdlVXJsID0gc2FmZVRyaW0oJCgiI2Jhc2VVcmwiKS52YWx1ZSk7CiAgICBjb25zdCBiYXNlTmFtZSA9IHBhZ2VVcmwgPyBwYWdlVXJsLnJlcGxhY2UoL2h0dHBzPzpcL1wvLywiIikucmVwbGFjZSgvW15cdy4tXSsvZywiXyIpLnNsaWNlKDAsNjApIDogInNjaGVtYSI7CiAgICBhLmRvd25sb2FkID0gKGJhc2VOYW1lIHx8ICJzY2hlbWEiKSArICIuanNvbiI7CiAgICBhLmhyZWYgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpOwogICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKTsKICAgIGEuY2xpY2soKTsKICAgIHNldFRpbWVvdXQoKCk9PnsgVVJMLnJldm9rZU9iamVjdFVSTChhLmhyZWYpOyBhLnJlbW92ZSgpOyB9LCAyNTApOwogICAgc2V0U3RhdHVzKCJEb3dubG9hZGVkIEpTT04gZmlsZS4iLCAib2siKTsKICB9KTsKCiAgLy8gSW5pdGlhbCBzdGF0ZQogIHNldEJ0bkVuYWJsZWQoJCgiI2NvcHlCdG4iKSwgZmFsc2UpOwogIHNldEJ0bkVuYWJsZWQoJCgiI2Rvd25sb2FkQnRuIiksIGZhbHNlKTsKCiAgLy8gU2VlZCBhIGRlZmF1bHQgYmxvY2sKICBhZGRTY2hlbWFCbG9jaygiQXJ0aWNsZSIpOwp9KSgpOwo8L3NjcmlwdD4K","embed":""}
Schema.org JSON-LD Generator
Choose a type, then click Add Schema Block.
Clipboard note: best on https:// or localhost. Fallback copy method included.